therion/0000775000175000017500000000000012450020345011241 5ustar userusertherion/makelibrary.pl0000664000175000017500000000017710576400772014122 0ustar useruser$a = 0; open(INP,$ARGV[0]); while() { if (/\/\*\*/) { $a = 1; } if ($a) { print; } } close(INP);therion/thconfig.cxx0000664000175000017500000006120112337637464013612 0ustar useruser/** * @file thconfig.cxx * Configuration module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thconfig.h" #include "therion.h" #include "thparse.h" #include "thlang.h" #include #include #include #include "thchenc.h" #include "thexception.h" #include "thdatabase.h" #include "thdatareader.h" #include "thdataobject.h" #include "thcsdata.h" #include "thproj.h" #include "thlogfile.h" #include "thinit.h" #include "thgeomag.h" #include "thgeomagdata.h" #include "thlayout.h" #include "thcomment.h" #include "thsketch.h" #include "thcs.h" #ifdef THWIN32 #include #endif enum { TT_UNKNOWN_CFG, TT_SOURCE, TT_ENDSOURCE, TT_SELECT, TT_UNSELECT, TT_EXPORT, TT_OUTCS, TT_SETUP3D, TT_AUTO_JOIN, TT_SYSTEM, TT_SKETCH_WARP, TT_SKETCH_COLORS, TT_TEXT, TT_LANG, }; static const thstok thtt_cfg[] = { // {"auto-join", TT_AUTO_JOIN}, {"cs", TT_OUTCS}, {"endsource", TT_ENDSOURCE}, {"export", TT_EXPORT}, {"lang", TT_LANG}, {"language", TT_LANG}, {"select", TT_SELECT}, {"setup3d", TT_SETUP3D}, {"sketch-colors", TT_SKETCH_COLORS}, {"sketch-warp", TT_SKETCH_WARP}, {"source", TT_SOURCE}, {"system", TT_SYSTEM}, {"text", TT_TEXT}, {"unselect", TT_UNSELECT}, {NULL, TT_UNKNOWN_CFG} }; //const char * THCCC_ENCODING = "# Character encoding of this configuration "// "file.\n"; const char * THCCC_ENCODING = ""; const char * THCCC_SOURCE = "# Name of the source file.\n"; thconfig::thconfig() { this->install_path.strcpy(""); this->install_tex = false; this->install_tcltk = false; this->install_im = false; this->lang = THLANG_UNKNOWN; this->auto_join = true; this->outcs = TTCS_LOCAL; this->outcs_sumx = 0.0; this->outcs_sumy = 0.0; this->outcs_sumn = 0.0; this->sketch_colors = 256; this->tmp3dSMP = 1.0; this->tmp3dWALLSMP = 0.1; this->tmp3dMAXDIMD = 5.0; this->sketch_warp = THSKETCH_WARP_IDLINE; #ifdef THWIN32 thbuffer * tmpbf = &(this->bf1); // set search path according to Windows registers tmpbf->guarantee(1024); DWORD type, length = 1024; HKEY key; bool loaded_ok = true; if (RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Therion",&key) != ERROR_SUCCESS) { loaded_ok = false; RegCloseKey(key); } if (!loaded_ok) { loaded_ok = true; if (RegOpenKey(HKEY_CURRENT_USER,"SOFTWARE\\Therion",&key) != ERROR_SUCCESS) { loaded_ok = false; RegCloseKey(key); } } if (loaded_ok) { if (RegQueryValueEx(key,"InstallDir",NULL,&type,(BYTE *)tmpbf->get_buffer(),&length) != ERROR_SUCCESS) { tmpbf->strcpy(""); this->install_path = ""; } else { this->install_path = tmpbf->get_buffer(); if (RegQueryValueEx(key,"TeX",NULL,&type,(BYTE *)tmpbf->get_buffer(),&length) == ERROR_SUCCESS) this->install_tex = true; if (RegQueryValueEx(key,"TclTk",NULL,&type,(BYTE *)tmpbf->get_buffer(),&length) == ERROR_SUCCESS) this->install_tcltk = true; if (RegQueryValueEx(key,"ImageMagick",NULL,&type,(BYTE *)tmpbf->get_buffer(),&length) == ERROR_SUCCESS) this->install_im = true; } RegCloseKey(key); } if (type != REG_SZ) loaded_ok = false; const char * winini = "C:/WINDOWS;C:/WINNT;C:/Program files/Therion"; const char * wincfg = "C:/Program files/Therion"; #else const char * unixini = "/etc:/usr/etc:/usr/local/etc"; const char * unixcfg = "/usr/share/therion:/usr/local/share/therion"; #endif this->fname = "thconfig"; this->skip_comments = false; this->generate_xthcfg = false; this->cfg_fenc = TT_UTF_8; this->fstate = THCFG_READ; char * sp = NULL; if (sp != NULL) this->search_path = sp; else { sp = getenv("HOME"); #ifdef THWIN32 if (sp != NULL) { this->search_path = sp; } else { sp = getenv("HOMEDRIVE"); if (sp != NULL) { this->search_path = sp; sp = getenv("HOMEPATH"); if (sp != NULL) { this->search_path += sp; } } sp = getenv("HOMEDRIVE"); } #endif if (sp != NULL) { #ifdef THWIN32 this->search_path += "\\.therion;"; if (strlen(this->install_path.get_buffer()) > 0) { this->search_path += this->install_path.get_buffer(); } else { this->search_path += wincfg; } #else this->search_path = sp; this->search_path += "/.therion:"; this->search_path += unixcfg; #endif } else { #ifdef THWIN32 if (strlen(this->install_path.get_buffer()) > 0) { this->search_path += this->install_path.get_buffer(); } else { this->search_path += wincfg; } #else this->search_path += unixcfg; #endif } } sp = getenv("THERION"); if (sp != NULL) this->init_path = sp; else { sp = getenv("HOME"); #ifdef THWIN32 if (sp != NULL) { this->init_path = sp; } else { sp = getenv("HOMEDRIVE"); if (sp != NULL) { this->init_path = sp; sp = getenv("HOMEPATH"); if (sp != NULL) { this->init_path += sp; } } sp = getenv("HOMEDRIVE"); } #endif if (sp != NULL) { #ifdef THWIN32 this->init_path += "\\.therion;"; if (strlen(this->install_path.get_buffer()) > 0) { this->init_path += this->install_path.get_buffer(); } else { this->init_path += winini; } #else this->init_path = sp; this->init_path += "/.therion:"; this->init_path += unixini; #endif } else { #ifdef THWIN32 if (strlen(this->install_path.get_buffer()) > 0) { this->init_path += this->install_path.get_buffer(); } else { this->init_path += winini; } #else this->init_path += unixini; #endif } } this->exporter.assign_config(this); this->selector.assign_config(this); } thconfig::~thconfig() { } void thconfig::set_file_name(char * fn) { this->fname = fn; this->cfg_file.report_missing = true; } char * thconfig::get_file_name() { return this->fname; } void thconfig::append_source(char * fname, long startln, long endln) { thconfig_src xsrc; xsrc.fname = this->src_fnames.append(fname); xsrc.startln = startln; xsrc.endln = endln; this->src.push_back(xsrc); } thconfig_src_list * thconfig::get_sources() { return & this->src; } void thconfig::set_comments_skip(bool state) { this->skip_comments = state; } void thconfig::comments_skip_on() { this->skip_comments = true; } void thconfig::comments_skip_off() { this->skip_comments = false; } bool thconfig::get_comments_skip() { return this->skip_comments; } void thconfig::set_file_state(thcfg_fstate fs) { this->fstate = fs; } thcfg_fstate thconfig::get_file_state() { return this->fstate; } void thconfig::set_search_path(char * pth) { this->search_path = pth; } char * thconfig::get_search_path() { return this->search_path; } char * thconfig::get_initialization_path() { return this->init_path; } void thconfig__pifo(char * s) { #ifdef THDEBUG thprintf("\nconfiguration file: %s\nreading\n",s); #else thprintf("configuration file: %s\n",s); thprintf("reading ..."); thtext_inline = true; #endif } static const thstok thtt_sketchwarp[] = { {"line", THSKETCH_WARP_IDLINE}, {"linear", THSKETCH_WARP_LINEAR}, {"plaquette", THSKETCH_WARP_PLAQUETTE}, {"point", THSKETCH_WARP_IDPOINT}, {NULL, THSKETCH_WARP_UNKNOWN}, }; void thconfig::load() { thmbuffer valuemb; int sv; this->lang = thini.get_lang(); long srcstart(0), srcend(-1); bool fstarted = false; bool source_mode = false; if ((this->fstate == THCFG_UPDATE) || (this->fstate == THCFG_READ)) { this->cfg_file.cmd_sensitivity_on(); this->cfg_file.sp_scan_off(); this->cfg_file.set_file_name(this->fname); this->cfg_file.print_if_opened(thconfig__pifo, &fstarted); this->cfg_file.reset(); try { char * cfgln = this->cfg_file.read_line(); while(cfgln != NULL) { this->cfg_fenc = this->cfg_file.get_cif_encoding(); thsplit_args(&valuemb, this->cfg_file.get_value()); sv = thmatch_token(this->cfg_file.get_cmd(),thtt_cfg); if (source_mode) { if (sv == TT_ENDSOURCE) { source_mode = false; srcend = this->cfg_file.get_cif_line_number() - 1; if (srcend >= srcstart) { this->append_source(this->cfg_file.get_cif_name(), srcstart, srcend); } this->cfg_file.set_input_sensitivity(true); } } else switch (sv) { case TT_SOURCE: if (valuemb.get_size() == 0) { source_mode = true; srcstart = this->cfg_file.get_cif_line_number() + 1; this->cfg_file.set_input_sensitivity(false); } else { if (valuemb.get_size() > 1) ththrow(("one file name expected")) this->append_source(valuemb.get_buffer()[0]); #ifdef THWIN32 this->search_path.strcat(";"); #else this->search_path.strcat(":"); #endif this->search_path.strcat(this->cfg_file.get_cif_path()); } break; case TT_SKETCH_WARP: if (valuemb.get_size() != 1) ththrow(("single sketch-warp switch expected")); sv = thmatch_token(valuemb.get_buffer()[0],thtt_sketchwarp); if (sv == THSKETCH_WARP_UNKNOWN) ththrow(("invalid sketch-warp switch -- %s", valuemb.get_buffer()[0])); this->sketch_warp = sv; break; case TT_SKETCH_COLORS: if (valuemb.get_size() != 1) ththrow(("invalid argument - use sketch-colors ")); { double dum; thparse_double(sv, dum, valuemb.get_buffer()[0]); if (sv != TT_SV_NUMBER) ththrow(("number expected -- %s", valuemb.get_buffer()[0])); int dumi; dumi = int(dum); if ((dumi < 2) || (dumi > 65536)) ththrow(("number out of range -- %s", valuemb.get_buffer()[0])); this->sketch_colors = dumi; } break; case TT_SETUP3D: if (valuemb.get_size() > 0) { thparse_double(sv, this->tmp3dSMP, valuemb.get_buffer()[0]); if ((sv != TT_SV_NUMBER) || (this->tmp3dSMP <= 0.0)) ththrow(("invalid number -- %s", valuemb.get_buffer()[0])) this->tmp3dWALLSMP = this->tmp3dSMP; } if (valuemb.get_size() > 1) { thparse_double(sv, this->tmp3dWALLSMP, valuemb.get_buffer()[1]); if ((sv != TT_SV_NUMBER) || (this->tmp3dWALLSMP <= 0.0)) ththrow(("invalid number -- %s", valuemb.get_buffer()[1])) } if (valuemb.get_size() > 2) { thparse_double(sv, this->tmp3dMAXDIMD, valuemb.get_buffer()[2]); if ((sv != TT_SV_NUMBER) || (this->tmp3dMAXDIMD <= 0.0)) ththrow(("invalid number -- %s", valuemb.get_buffer()[2])) } break; case TT_AUTO_JOIN: if (valuemb.get_size() > 0) { sv = thmatch_token(valuemb.get_buffer()[0], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid auto-join sqitch -- %s", valuemb.get_buffer()[0])) this->auto_join = (sv == TT_TRUE); } else { ththrow(("missing auto-join switch")) } break; case TT_SELECT: this->selector.parse_selection(false, valuemb.get_size(), valuemb.get_buffer()); break; case TT_LANG: if (valuemb.get_size() != 1) ththrow(("language specification requires single parameter")) sv = thlang_parse(valuemb.get_buffer()[0]); if (sv == THLANG_UNKNOWN) ththrow(("language not supported -- %s",valuemb.get_buffer()[0])) this->lang = sv; break; case TT_SYSTEM: if (valuemb.get_size() == 0) ththrow(("missing system command")) if (valuemb.get_size() > 1) ththrow(("single system command expected")) this->exporter.parse_system(valuemb.get_buffer()[0]); break; case TT_TEXT: if ((valuemb.get_size() < 3) || (valuemb.get_size() > 3)) ththrow(("invalid text syntax -- should be: text ")) thlang_set_translation(valuemb.get_buffer()[0], valuemb.get_buffer()[1], valuemb.get_buffer()[2]); break; case TT_OUTCS: if (valuemb.get_size() == 1) { sv = thcs_parse(valuemb.get_buffer()[0]); if (sv == TTCS_UNKNOWN) ththrow(("unknown coordinate system -- %s", valuemb.get_buffer()[0])) if (!thcs_get_data(sv)->output) ththrow(("%s coordinate system not supported for output", valuemb.get_buffer()[0])) this->outcs = sv; this->outcs_def.name = this->get_db()->strstore(this->cfg_file.get_cif_name(), true); this->outcs_def.line = this->cfg_file.get_cif_line_number(); } else { ththrow(("output coordinate system specification requires single parameter")) } break; case TT_UNSELECT: this->selector.parse_selection(true, valuemb.get_size(), valuemb.get_buffer()); break; case TT_EXPORT: this->exporter.parse_export(valuemb.get_size(), valuemb.get_buffer()); break; default: // skusi povolene databazove prikazy switch (thmatch_token(this->cfg_file.get_cmd(),thtt_commands)) { case TT_LAYOUT_CMD: case TT_COMMENT_CMD: this->load_dbcommand(&valuemb); break; default: ththrow(("unknown configuration command -- %s", this->cfg_file.get_cmd())); } } cfgln = this->cfg_file.read_line(); } if (source_mode) { ththrow(("endsource expected")); } } catch (...) threthrow(("%s [%d]", this->cfg_file.get_cif_name(), this->cfg_file.get_cif_line_number())); } if (fstarted) { #ifdef THDEBUG thprintf("\n"); #else thprintf(" done\n"); thtext_inline = false; #endif } } void thconfig::load_dbcommand(thmbuffer * valmb) { // vytvori objekt // analyzuje jeho argumenty a prida riadok do dblines // nacita ostatne riadky, ak je to potrebne a analyzuje ich // vlozi ho do databazy // kazdy riadok prida do prikazov na ulozenie thdataobject * objptr; // pointer to the newly created object thcmd_option_desc optd; // option descriptor char * ln, * opt; char ** opts; const char * endlnopt = NULL; int ai, ait, ant; thobjectsrc osrc; bool inside_cmd = false; try { // command source osrc.line = this->cfg_file.get_cif_line_number(); if (strcmp(osrc.name, this->cfg_file.get_cif_name()) != 0) osrc.name = dbptr->strstore(this->cfg_file.get_cif_name(), true); dbptr->csrc.line = osrc.line; dbptr->csrc.name = osrc.name; objptr = dbptr->create(this->cfg_file.get_cmd(), osrc); if (objptr == NULL) ththrow(("unknown command -- %s", this->cfg_file.get_cmd())); if (objptr->get_class_id() == TT_LAYOUT_CMD) { ((thlayout*)objptr)->m_pconfig = this; } thencode(&this->bf1, this->cfg_file.get_line(), this->cfg_file.get_cif_encoding()); this->cfg_dblines.append(this->bf1.get_buffer()); // analyze the commands options // first, let's parse arguments ant = valmb->get_size(); opts = valmb->get_buffer(); if (ant < objptr->get_cmd_nargs()) ththrow(("not enough command arguments -- must be %d", objptr->get_cmd_nargs())); optd.nargs = 1; // set obligatory arguments for (ai = 0; ai < objptr->get_cmd_nargs(); ai++, opts++) { optd.id = ai + 1; objptr->set(optd, opts, this->cfg_file.get_cif_encoding(), thdatareader__get_opos(false,false)); } // set options ait = ai; while (ait < ant) { optd = objptr->get_cmd_option_desc(*opts + 1); if (optd.id == TT_DATAOBJECT_UNKNOWN) { optd.id = ++ai; optd.nargs = 1; } else { if ((ait + optd.nargs) >= ant) ththrow(("not enough option arguments -- %s -- must be %d", *opts, optd.nargs)); opts++; ait++; } objptr->set(optd, opts, this->cfg_file.get_cif_encoding(), thdatareader__get_opos(false,false)); opts += optd.nargs; ait += optd.nargs; } // if multi line, set that we're inside the command // and switch of sensitivity // else insert object into database if ((endlnopt = objptr->get_cmd_end()) != NULL) { inside_cmd = true; this->cfg_file.cmd_sensitivity_off(); while (inside_cmd) { if ((ln = this->cfg_file.read_line()) == NULL) ththrow(("%s [%d] -- %s is missing",this->cfg_file.get_cif_name(), this->cfg_file.get_cif_line_number(),endlnopt)) thencode(&this->bf1, ln, this->cfg_file.get_cif_encoding()); this->cfg_dblines.append(this->bf1.get_buffer()); thsplit_word(&this->bf1, &this->bf2, ln); // if end_command option, set turn off inside_cmd // and insert object into database if (strcmp(this->bf1.get_buffer(), endlnopt) == 0) { inside_cmd = false; this->cfg_file.cmd_sensitivity_on(); continue; } // let's parse if an option line optd = objptr->get_cmd_option_desc(this->bf1.get_buffer()); if (optd.id != TT_DATAOBJECT_UNKNOWN) { thsplit_args(&this->mbf1, this->bf2.get_buffer()); if (this->mbf1.get_size() < optd.nargs) ththrow(("not enough option arguments -- %s -- must be %d", this->bf1.get_buffer(), optd.nargs)); optd.nargs = this->mbf1.get_size(); objptr->set(optd, this->mbf1.get_buffer(), this->cfg_file.get_cif_encoding(), thdatareader__get_opos(inside_cmd,false)); continue; } // if data line (!) set data option optd.id = 0; optd.nargs = 1; opt = ln; while(strcmp(opt,"!") < 0) opt++; if (*opt == '!') opt++; objptr->set(optd, & opt, this->cfg_file.get_cif_encoding(), thdatareader__get_opos(inside_cmd,false)); } } // vlozi objekt do databazy dbptr->insert(objptr); } // put everything into try block and throw exception, if error catch (...) threthrow(("%s [%d]", this->cfg_file.get_cif_name(), this->cfg_file.get_cif_line_number())) } void thconfig::save() { if ((this->fstate == THCFG_UPDATE) || (this->fstate == THCFG_GENERATE)) { #ifdef THDEBUG thprintf("\nwriting configuration file -- %s\n", this->fname.get_buffer()); #else thprintf("writing configuration file ... "); thtext_inline = true; #endif // OK, let's open configuration file for output FILE * cf; cf = fopen(this->fname.get_buffer(),"w"); if (cf == NULL) { thwarning(("can't open configuration file for output -- %s", this->fname.get_buffer())); return; } // first, let's write file encoding if (!this->skip_comments) fprintf(cf,"%s",THCCC_ENCODING); fprintf(cf,"encoding %s\n\n",thmatch_string(this->cfg_fenc, thtt_encoding)); // source file long sid; thconfig_src_list::iterator srcit; bool some_src = false; for(srcit = this->src.begin(); srcit != this->src.end(); srcit++) { if (!some_src) { if (!this->skip_comments) fprintf(cf,"%s",THCCC_SOURCE); } fprintf(cf,"source \"%s\"\n", srcit->fname); some_src = true; } if (some_src) fprintf(cf,"\n"); // layouts etc. char ** srcn = this->cfg_dblines.get_buffer(); bool some_layout = false; for(sid = 0; sid < this->cfg_dblines.get_size(); sid++, srcn++) { thdecode(&(this->bf1), this->cfg_fenc, *srcn); fprintf(cf, "%s\n", this->bf1.get_buffer()); some_layout = true; } if (some_layout) fprintf(cf,"\n"); // selected objects this->selector.dump_selection(cf); // dump readed export this->exporter.dump_export(cf); // dump possibilities objects // this->selector.dump_selection_db(cf, this->dbptr); // close config file fclose(cf); #ifdef THDEBUG thprintf("\n"); #else thprintf("done\n"); thtext_inline = false; #endif } } void thconfig::assign_db(class thdatabase * dp) { this->dbptr = dp; } void thconfig::select_data() { this->selector.select_db(this->dbptr); } void thconfig::export_data() { this->exporter.export_db(this->dbptr); } void thconfig::xth_save() { if (this->generate_xthcfg) { #ifdef THDEBUG thprintf("\nwriting xtherion file -- .xtherion.dat\n"); #else thprintf("writing xtherion file ... "); thtext_inline = true; #endif // OK, let's open configuration file for output FILE * cf; cf = fopen(".xtherion.dat","w"); if (cf == NULL) { thwarning(("can't open xtherion file for output -- %s.xth", this->fname.get_buffer())); return; } // dump possibilities objects if (therion_exit_state > 0) { this->selector.dump_selection_db(cf, this->dbptr); fprintf(cf,"xth_cp_comp_stat %.0f %ld\n", thdb.db1d.nlength, thdb.nscraps); } fprintf(cf,"set xth(th_exit_state) %d\n", therion_exit_state); fprintf(cf,"set xth(th_exit_number) %ld\n\n", time(NULL)); // close config file fclose(cf); #ifdef THDEBUG thprintf("\n"); #else thprintf("done\n"); thtext_inline = false; #endif } } double thconfig::get_outcs_convergence() { double x, y, z; if (this->get_outcs_center(x, y, z)) { return thcsconverg(thcs_get_data(this->outcs)->params, x, y); } else { return 0.0; } } double thconfig::get_cs_convergence(int cs) { double x, y, z, lx, ly, lz; if (this->get_outcs_center(x, y, z)) { thcs2cs(thcs_get_data(this->outcs)->params, thcs_get_data(cs)->params, x, y, z, lx, ly, lz); return thcsconverg(thcs_get_data(cs)->params, lx, ly); } else { return 0.0; } } bool thconfig::get_outcs_mag_decl(double year, double & decl) { double x, y, z, lat, lon, alt; if (!this->get_outcs_center(x, y, z)) return false; if ((year < double(thgeomag_minyear)) || (year > double(thgeomag_minyear + thgeomag_step * (thgeomag_maxmindex + 1)))) return false; thcs2cs(thcs_get_data(this->outcs)->params, "+proj=latlong +datum=WGS84", x, y, z, lon, lat, alt); decl = thgeomag(lat, lon, alt, year); return true; } bool thconfig::get_outcs_center(double & x, double & y, double & z) { if ((this->outcs == TTCS_LOCAL) || (!this->outcs_def.is_valid()) || (this->outcs_sumn < 0.5)) { return false; } else { x = this->outcs_sumx / this->outcs_sumn; y = this->outcs_sumy / this->outcs_sumn; z = this->outcs_sumz / this->outcs_sumn; return true; } } void thconfig::log_outcs(double decsyear, double deceyear) { double x, y, z, dec; bool firstdec = true; if (this->get_outcs_center(x, y, z)) { thlog.printf("output coordinate system: %s\n", thcs_get_name(this->outcs)); thlog.printf("meridian convergence (deg): %.4f\n", this->get_outcs_convergence()); if (!thisnan(decsyear)) { long min = long(decsyear), max = long(deceyear + 1.0), yyy; for(yyy = min; yyy <= max; yyy++) { if (firstdec) { thlog.printf("geomag declinations (deg):\n"); firstdec = false; } if (this->get_outcs_mag_decl(double(yyy), dec)) { thlog.printf(" %4d.1.1 %.4f\n", yyy, dec); } } } } } int thconfig::get_lang() { return thlang_getlang(this->lang); } thconfig thcfg; therion/thtexfonts.h0000664000175000017500000000366112430473673013644 0ustar useruser/* * Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtexfonts_h #define thtexfonts_h #include #include #include #include using namespace std; string select_lang(string s, string lang); struct fontrecord { int id; string rm,it,bf,ss,si; }; extern list FONTS; int get_enc_id(const char* enc); void print_tex_encodings (void); void print_fonts_setup(void); void init_encodings(); string utf2texoctal(string s); string utf2texhex(string s); string utf2tex (string s, bool b=false); int tex2uni(string font, int ch); string replace_all(string s, string f, string r); struct encodings_new { private: vector v_fon; // tex - unicode map m_fon; // unicode - tex int i_fon; // last position public: int NFSS, t1_convert; string otf_file[5]; encodings_new(); int get_enc_pos(int ch); int get_enc_count(); int get_uni (int f, int ch); void write_enc_files(); }; extern encodings_new ENC_NEW; #ifndef NOTHERION const char * utf2tex (const char * s, bool b = false); #endif #endif therion/thendsurvey.cxx0000664000175000017500000000440610721450522014354 0ustar useruser/** * @file thendsurvey.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thendsurvey.h" #include "thexception.h" #include "thchenc.h" thendsurvey::thendsurvey() { } thendsurvey::~thendsurvey() { } int thendsurvey::get_class_id() { return TT_ENDSURVEY_CMD; } bool thendsurvey::is(int class_id) { if (class_id == TT_ENDSURVEY_CMD) return true; else return thdataobject::is(class_id); } int thendsurvey::get_cmd_nargs() { return 0; } const char * thendsurvey::get_cmd_end() { return NULL; } const char * thendsurvey::get_cmd_name() { return "endsurvey"; } thcmd_option_desc thendsurvey::get_cmd_option_desc(const char * opts) { return TT_DATAOBJECT_UNKNOWN; } void thendsurvey::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { if (cod.id == 1) cod.id = TT_DATAOBJECT_NAME; switch (cod.id) { case TT_DATAOBJECT_NAME: if (th_is_keyword(*args)) this->name = this->db->strstore(*args); else ththrow(("invalid keyword -- %s", *args)); break; default: thdataobject::set(cod, args, argenc, indataline); } } void thendsurvey::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"\nthendsurvey:\n"); } void thendsurvey::self_delete() { delete this; } int thendsurvey::get_context() { return THCTX_SURVEY; } therion/thdb2dpt.h0000664000175000017500000000266410625655142013150 0ustar useruser/** * @file thdb2dpt.h * 2D point class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2dpt_h #define thdb2dpt_h #include /** * 2D point class. */ class thdb2dpt { public: double x,y,xt,yt,zt,at,dbgx0,dbgy0,dbgx1,dbgy1; ///< Coordinates. class thscrap * pscrap; ///< Parent scrap pointer. class thdb2dji * join_item; ///< Join item. thdb2dpt(); ///< Default constructor void export_mp(class thexpmapmpxs * out, int dbglevel = -1); }; typedef std::list thdb2dpt_list; ///< Points list. #endif therion/thexpmodel.cxx0000664000175000017500000016422612255647062014167 0ustar useruser/** * @file thexpmodel.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexpmodel.h" #include "thexception.h" #include "thdatabase.h" #include "thdb1d.h" #include "thdata.h" #include "thsurvey.h" #include #include "extern/img.h" #include "thchenc.h" #include "thscrap.h" #include #include "thsurface.h" #include "loch/lxFile.h" #include "thsurface.h" #include "thchenc.h" #include "thconfig.h" #include "thcsdata.h" #include "thproj.h" #include "thcs.h" thexpmodel::thexpmodel() { this->format = TT_EXPMODEL_FMT_UNKNOWN; this->items = TT_EXPMODEL_ITEM_ALL; this->wallsrc = TT_WSRC_ALL; this->encoding = TT_UTF_8; } void thexpmodel::parse_options(int & argx, int nargs, char ** args) { int optid = thmatch_token(args[argx], thtt_expmodel_opt); unsigned utmp; int optx = argx; switch (optid) { case TT_EXPMODEL_OPT_FORMAT: argx++; if (argx >= nargs) ththrow(("missing format -- \"%s\"",args[optx])) this->format = thmatch_token(args[argx], thtt_expmodel_fmt); if (this->format == TT_EXPMODEL_FMT_UNKNOWN) ththrow(("unknown format -- \"%s\"", args[argx])) argx++; break; case TT_EXPMODEL_OPT_ENCODING: argx++; if (argx >= nargs) ththrow(("missing encoding -- \"%s\"",args[optx])) this->encoding = thmatch_token(args[argx], thtt_encoding); if (this->encoding == TT_UNKNOWN_ENCODING) ththrow(("unknown encoding -- \"%s\"", args[argx])) argx++; break; case TT_EXPMODEL_OPT_ENABLE: case TT_EXPMODEL_OPT_DISABLE: argx++; if (argx >= nargs) ththrow(("missing model entity -- \"%s\"",args[optx])) utmp = thmatch_token(args[argx], thtt_expmodel_items); if (utmp == TT_EXPMODEL_ITEM_UNKNOWN) ththrow(("unknown model entity -- \"%s\"", args[argx])) if (optid == TT_EXPMODEL_OPT_ENABLE) { this->items |= utmp; } else { this->items &= (~utmp); } argx++; break; case TT_EXPMODEL_OPT_WALLSRC: argx++; if (argx >= nargs) ththrow(("missing wall source -- \"%s\"",args[optx])) utmp = thmatch_token(args[argx], thtt_expmodel_wallsrc); if (utmp == TT_WSRC_UNKNOWN) ththrow(("unknown wall source -- \"%s\"", args[argx])) this->wallsrc = utmp; argx++; break; default: thexport::parse_options(argx, nargs, args); break; } } void thexpmodel::dump_header(FILE * xf) { thexport::dump_header(xf); //fprintf(xf,"export\tmodel"); } bool thexpmodel::is_leg_exported(thdb1dl * l) { if (!l->survey->is_selected()) return false; if (((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) == 0) && ((l->leg->flags & TT_LEGFLAG_SPLAY) != 0)) return false; if (((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) == 0) && ((l->leg->flags & TT_LEGFLAG_SURFACE) != 0)) return false; if (((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) == 0) && (!((l->leg->flags & TT_LEGFLAG_SURFACE) != 0))) return false; return true; } void thexpmodel::dump_body(FILE * xf) { thexport::dump_body(xf); if (this->format != TT_EXPMODEL_FMT_UNKNOWN) fprintf(xf," -format %s", thmatch_string(this->format, thtt_expmodel_fmt)); } void thexpmodel::process_db(class thdatabase * dbp) { this->db = dbp; if (this->format == TT_EXPMODEL_FMT_UNKNOWN) { this->format = TT_EXPMODEL_FMT_LOCH; thexp_set_ext_fmt(".plt", TT_EXPMODEL_FMT_COMPASS) thexp_set_ext_fmt(".3d", TT_EXPMODEL_FMT_SURVEX) thexp_set_ext_fmt(".wrl", TT_EXPMODEL_FMT_VRML) thexp_set_ext_fmt(".vrml", TT_EXPMODEL_FMT_VRML) thexp_set_ext_fmt(".3dmf", TT_EXPMODEL_FMT_3DMF) thexp_set_ext_fmt(".dxf", TT_EXPMODEL_FMT_DXF) thexp_set_ext_fmt(".lox", TT_EXPMODEL_FMT_LOCH) thexp_set_ext_fmt(".shp", TT_EXPMODEL_FMT_SHP) thexp_set_ext_fmt(".kml", TT_EXPMODEL_FMT_KML) } switch (this->format) { case TT_EXPMODEL_FMT_LOCH: this->export_lox_file(dbp); break; case TT_EXPMODEL_FMT_SURVEX: this->export_3d_file(dbp); break; case TT_EXPMODEL_FMT_COMPASS: this->export_plt_file(dbp); break; //case TT_EXPMODEL_FMT_THERION: // this->export_thm_file(dbp); // break; case TT_EXPMODEL_FMT_3DMF: this->export_3dmf_file(dbp); break; case TT_EXPMODEL_FMT_VRML: this->export_vrml_file(dbp); break; case TT_EXPMODEL_FMT_DXF: this->export_dxf_file(dbp); break; case TT_EXPMODEL_FMT_SHP: this->export_shp_file(dbp); break; case TT_EXPMODEL_FMT_KML: this->export_kml_file(dbp); break; } } void thexpmodel::export_3d_file(class thdatabase * dbp) { unsigned long nlegs = dbp->db1d.get_tree_size(), nstat = (unsigned long)dbp->db1d.station_vec.size(); thdb1dl ** tlegs = dbp->db1d.get_tree_legs(); if (nlegs == 0) return; const char * fnm = this->get_output("cave.3d"); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif unsigned long i; img * pimg; img_output_version = 4; thbuffer fnmb; fnmb.strcpy("cave"); pimg = img_open_write(fnm, fnmb.get_buffer(), 1); if (!pimg) { thwarning(("can't open %s for output",fnm)) return; } unsigned long last_st = nstat, cur_st; int * s_exp = new int [nstat], * cis_exp, leg_flag, x_exp; cis_exp = s_exp; bool is_surface, is_duplicate, is_splay; for(i = 0; i < nstat; i++, *cis_exp = 0, cis_exp++); for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected()) { // thprintf("EXP: %s@%s - %s@%s\n", (*tlegs)->leg->from.name, dbp->db1d.station_vec[(*tlegs)->leg->from.id -1].survey->full_name, (*tlegs)->leg->to.name, dbp->db1d.station_vec[(*tlegs)->leg->to.id -1].survey->full_name); cur_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; is_surface = (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) != 0); is_duplicate = (((*tlegs)->leg->flags & TT_LEGFLAG_DUPLICATE) != 0); is_splay = (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) != 0); if (((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) == 0) && is_splay) continue; if (((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) == 0) && is_surface) continue; if (((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) == 0) && (!is_surface)) continue; if (is_surface) s_exp[cur_st] |= img_SFLAG_SURFACE; else s_exp[cur_st] |= img_SFLAG_UNDERGROUND; if (cur_st != last_st) { img_write_item(pimg, img_MOVE, 0, NULL, dbp->db1d.station_vec[cur_st].x, dbp->db1d.station_vec[cur_st].y, dbp->db1d.station_vec[cur_st].z); //thprintf("move to %d\n",cur_st); } last_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; if (is_surface) s_exp[last_st] |= img_SFLAG_SURFACE; else s_exp[last_st] |= img_SFLAG_UNDERGROUND; leg_flag = 0; if (is_surface) leg_flag |= img_FLAG_SURFACE; if (is_duplicate) leg_flag |= img_FLAG_DUPLICATE; if (is_splay) leg_flag |= img_FLAG_SPLAY; img_write_item(pimg, img_LINE, leg_flag, (*tlegs)->survey->get_reverse_full_name(), dbp->db1d.station_vec[last_st].x, dbp->db1d.station_vec[last_st].y, dbp->db1d.station_vec[last_st].z); //thprintf("line to %d\n",last_st); } } cis_exp = s_exp; thbuffer stnbuf; thdb1ds * tmps; for(i = 0; i < nstat; i++, cis_exp++) { if ((*cis_exp != 0) || (s_exp[dbp->db1d.station_vec[i].uid - 1] != 0) || (((dbp->db1d.station_vec[i].flags & (TT_STATIONFLAG_ENTRANCE | TT_STATIONFLAG_FIXED)) != 0) && (dbp->db1d.station_vec[i].survey->is_selected() || dbp->db1d.station_vec[dbp->db1d.station_vec[i].uid - 1].survey->is_selected()))) { if ((*cis_exp == 0) && (s_exp[dbp->db1d.station_vec[i].uid - 1] != 0)) x_exp = s_exp[dbp->db1d.station_vec[i].uid - 1]; else x_exp = *cis_exp; tmps = &(dbp->db1d.station_vec[i]); if ((tmps->flags & TT_STATIONFLAG_ENTRANCE) != 0) x_exp |= img_SFLAG_ENTRANCE; if (((tmps->flags & TT_STATIONFLAG_FIXED) != 0) && ((tmps->flags & TT_STATIONFLAG_NOTFIXED) == 0)) x_exp |= img_SFLAG_FIXED; stnbuf.strcpy(dbp->db1d.station_vec[i].survey->get_reverse_full_name()); if (strlen(stnbuf.get_buffer()) > 0) stnbuf.strcat("."); stnbuf.strcat(dbp->db1d.station_vec[i].name); if (!tmps->is_temporary()) img_write_item(pimg, img_LABEL, x_exp, stnbuf, dbp->db1d.station_vec[i].x, dbp->db1d.station_vec[i].y, dbp->db1d.station_vec[i].z); } } delete [] s_exp; img_close(pimg); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } // 8 - survey name // 12 - station name // 40 - survey comment // -9.9 - no dimension #define toft(x) ((x)/0.3048) void thexpmodel::export_plt_file(class thdatabase * dbp) { unsigned long nlegs = dbp->db1d.get_tree_size(), nstat = (unsigned long)dbp->db1d.station_vec.size(); thdb1dl ** tlegs = dbp->db1d.get_tree_legs(); if (nlegs == 0) return; const char * fnm = this->get_output("cave.plt"); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif unsigned long i; FILE * pltf; char station_name[14]; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } unsigned long last_st = nstat, cur_st; double xmin = 0.0, xmax = 0.0, ymin = 0.0, ymax = 0.0, zmin = 0.0, zmax = 0.0; #define minmaxvar(min,max,var) \ if (var < min) min = var;\ if (var > max) max = var // OK, let's calculate limits for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected()) { cur_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; if (cur_st != last_st) { if (last_st == nstat) { xmax = dbp->db1d.station_vec[cur_st].x; xmin = xmax; ymax = dbp->db1d.station_vec[cur_st].y; ymin = ymax; zmax = dbp->db1d.station_vec[cur_st].z; zmin = zmax; } else { minmaxvar(xmin,xmax,dbp->db1d.station_vec[cur_st].x); minmaxvar(ymin,ymax,dbp->db1d.station_vec[cur_st].y); minmaxvar(zmin,zmax,dbp->db1d.station_vec[cur_st].z); } } last_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; minmaxvar(xmin,xmax,dbp->db1d.station_vec[last_st].x); minmaxvar(ymin,ymax,dbp->db1d.station_vec[last_st].y); minmaxvar(zmin,zmax,dbp->db1d.station_vec[last_st].z); } } #define copy_station_name(stid) \ strncpy(station_name,dbp->db1d.station_vec[stid].name,8); \ station_name[8] = 0 #define exppltdim(ffd,ttd) (((*tlegs)->reverse ? thisnan((*tlegs)->leg->ffd) : thisnan((*tlegs)->leg->ttd)) ? -9999.0 : toft((*tlegs)->reverse ? (*tlegs)->leg->ffd : (*tlegs)->leg->ttd)) // now let's print header fprintf(pltf,"Z\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n\n",toft(ymin),toft(ymax),toft(xmin),toft(xmax),toft(zmin),toft(zmax)); fprintf(pltf,"STHERION\n"); fprintf(pltf,"NX\tD\t3\t12\t1997\tCtherion export\n"); last_st = nstat; tlegs = dbp->db1d.get_tree_legs(); for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected()) { cur_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; if (cur_st != last_st) { copy_station_name(cur_st); fprintf(pltf,"M\t%.2f\t%.2f\t%.2f\tS%s\tP\t%.2f\t%.2f\t%.2f\t%.2f\n", toft(dbp->db1d.station_vec[cur_st].y), toft(dbp->db1d.station_vec[cur_st].x), toft(dbp->db1d.station_vec[cur_st].z),station_name, exppltdim(to_left, from_left), exppltdim(to_up, from_up), exppltdim(to_down, from_down), exppltdim(to_right, from_right)); // toft(dbp->db1d.station_vec[cur_st].z - avz),station_name); } last_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; copy_station_name(last_st); if (strcmp(station_name,"VA09") == 0) fflush(pltf); fprintf(pltf,"D\t%.2f\t%.2f\t%.2f\tS%s\tP\t%.2f\t%.2f\t%.2f\t%.2f\n", toft(dbp->db1d.station_vec[last_st].y), toft(dbp->db1d.station_vec[last_st].x), toft(dbp->db1d.station_vec[last_st].z),station_name, exppltdim(from_left, to_left), exppltdim(from_up, to_up), exppltdim(from_down, to_down), exppltdim(from_right, to_right)); } } fprintf(pltf,"X\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n\x1A",toft(ymin),toft(ymax),toft(xmin),toft(xmax),toft(zmin),toft(zmax)); fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } /* void thexpmodel::export_thm_file(class thdatabase * dbp) { const char * fnm = this->get_output("cave.thm"); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif FILE * pltf; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } double avx, avy, avz; thdb_object_list_type::iterator obi; thdb3ddata * pgn = dbp->db1d.get_3d(), * surf_pgn = dbp->db1d.get_3d_surface(), * splay_pgn = dbp->db1d.get_3d_splay(), * tmp3d; thdb3dlim pgnlimits, finlim; switch (this->items & TT_EXPMODEL_ITEM_CENTERLINE) { case TT_EXPMODEL_ITEM_SURFACECENTERLINE: pgnlimits.update(&(surf_pgn->limits)); break; case TT_EXPMODEL_ITEM_CENTERLINE: pgnlimits.update(&(surf_pgn->limits)); pgnlimits.update(&(pgn->limits)); break; default: pgnlimits.update(&(pgn->limits)); } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) pgnlimits.update(&(splay_pgn->limits)); finlim.update(&(pgnlimits)); // update limits from surfaces if ((this->items & TT_EXPMODEL_ITEM_SURFACE) != 0) { obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: tmp3d = ((thsurface*)(*obi))->get_3d(); if (tmp3d != NULL) { pgnlimits.update(&(tmp3d->limits)); } break; } obi++; } } avx = (pgnlimits.minx + pgnlimits.maxx) / 2.0; avy = (pgnlimits.miny + pgnlimits.maxy) / 2.0; avz = (pgnlimits.minz + pgnlimits.maxz) / 2.0; pgn->exp_shift_x = avx; pgn->exp_shift_y = avy; pgn->exp_shift_z = avz; surf_pgn->exp_shift_x = avx; surf_pgn->exp_shift_y = avy; surf_pgn->exp_shift_z = avz; // now let's print header // thprintf("\nLIMITS: %10.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n", // finlim.minx, finlim.maxx, // finlim.miny, finlim.maxy, // finlim.minz, finlim.maxz); fprintf(pltf,"glDeleteLists $xthmvv(list,model) 1\n"); fprintf(pltf,"glNewList $xthmvv(list,model) $GL::GL_COMPILE\n"); fprintf(pltf,"xth_mv_gl_wireframe\n"); if ((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) != 0) { fprintf(pltf,"glColor4f 0.3 0.7 1.0 1.0\n"); pgn->export_thm(pltf); } if ((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) != 0) { fprintf(pltf,"glColor4f 0.5 0.5 0.5 1.0\n"); surf_pgn->export_thm(pltf); } // WALLS fprintf(pltf,"\n#WALLS\n\n"); fprintf(pltf,"xth_mv_gl_walls\n"); if ((this->items & TT_EXPMODEL_ITEM_WALLS) != 0) { thdb3ddata * d3d; if ((this->wallsrc & TT_WSRC_CENTERLINE) != 0) { d3d = dbp->db1d.get_3d_walls(); finlim.update(&(d3d->limits)); d3d->exp_shift_x = avx; d3d->exp_shift_y = avy; d3d->exp_shift_z = avz; d3d->export_thm(pltf); } if ((this->wallsrc & TT_WSRC_MAPS) != 0) { thdb2dprjpr prjid = dbp->db2d.parse_projection("plan",false); thscrap * cs; if (!prjid.newprj) { thdb.db2d.process_projection(prjid.prj); cs = prjid.prj->first_scrap; while(cs != NULL) { if (cs->fsptr->is_selected() && (cs->d3 != TT_FALSE)) { d3d = cs->get_3d_outline(); // thprintf("\nLIMITS: %10.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n", // d3d->limits.minx, d3d->limits.maxx, // d3d->limits.miny, d3d->limits.maxy, // d3d->limits.minz, d3d->limits.maxz); finlim.update(&(d3d->limits)); d3d->exp_shift_x = avx; d3d->exp_shift_y = avy; d3d->exp_shift_z = avz; d3d->export_thm(pltf); } cs = cs->proj_next_scrap; } } } } // WALLS fprintf(pltf,"\n#SURFACE\n\n"); fprintf(pltf,"xth_mv_gl_surface\n"); if ((this->items & TT_EXPMODEL_ITEM_SURFACE) != 0) { // prejde secky surfaces a exportuje z nich povrchy obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: tmp3d = ((thsurface*)(*obi))->get_3d(); if (tmp3d != NULL) { tmp3d->exp_shift_x = avx; tmp3d->exp_shift_y = avy; tmp3d->exp_shift_z = avz; tmp3d->export_thm(pltf); finlim.update(&(tmp3d->limits)); } break; } obi++; } } fprintf(pltf,"set xthmvv(model,maxx) %.2f\n",finlim.maxx - avx); fprintf(pltf,"set xthmvv(model,maxy) %.2f\n",finlim.maxy - avy); fprintf(pltf,"set xthmvv(model,maxz) %.2f\n",finlim.maxz - avz); fprintf(pltf,"set xthmvv(model,minx) %.2f\n",finlim.minx - avx); fprintf(pltf,"set xthmvv(model,miny) %.2f\n",finlim.miny - avy); fprintf(pltf,"set xthmvv(model,minz) %.2f\n",finlim.minz - avz); fprintf(pltf,"glEndList\n"); fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } */ void thexpmodel::export_vrml_file(class thdatabase * dbp) { const char * fnm; #ifdef THWIN32 fnm = this->get_output("cave.wrl"); #else fnm = this->get_output("cave.vrml"); #endif #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif FILE * pltf; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } thdb_object_list_type::iterator obi; thdb3ddata * pgn = dbp->db1d.get_3d(), * surf_pgn = dbp->db1d.get_3d_surface(), * splay_pgn = dbp->db1d.get_3d_splay(), * tmp3d; thdb3dlim pgnlimits, finlim; switch (this->items & TT_EXPMODEL_ITEM_CENTERLINE) { case TT_EXPMODEL_ITEM_SURFACECENTERLINE: pgnlimits.update(&(surf_pgn->limits)); break; case TT_EXPMODEL_ITEM_CENTERLINE: pgnlimits.update(&(surf_pgn->limits)); pgnlimits.update(&(pgn->limits)); break; default: pgnlimits.update(&(pgn->limits)); } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) pgnlimits.update(&(splay_pgn->limits)); finlim.update(&(pgnlimits)); // now let's print header fprintf(pltf,"#VRML V2.0 utf8\n\n"); fprintf(pltf,"Transform { children [\n"); if ((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) != 0) { fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\temissiveColor 0.3 0.7 1.0\n\t}" \ "\n}\ngeometry IndexedLineSet {\n"); pgn->export_vrml(pltf); fprintf(pltf,"\n}\n}\n"); } if ((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) != 0) { fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\temissiveColor 0.5 0.5 0.5\n\t}" \ "\n}\ngeometry IndexedLineSet {\n"); surf_pgn->export_vrml(pltf); fprintf(pltf,"\n}\n}\n"); } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) { fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\temissiveColor 0.22 0.22 0.22\n\t}" \ "\n}\ngeometry IndexedLineSet {\n"); splay_pgn->export_vrml(pltf); fprintf(pltf,"\n}\n}\n"); } bool has_texture; int imgn = 0; double txx, txy, tyx, tyy, tinv, tdx, tdy; thsurface * srfc; if ((this->items & TT_EXPMODEL_ITEM_SURFACE) != 0) { // prejde secky surfaces a exportuje z nich povrchy fprintf(pltf, "Group {\n\tchildren[\n"); fprintf(pltf, "DirectionalLight {\n\ton TRUE\n\tintensity 1.0\n\tdirection 0 0 -1\n}"); fprintf(pltf, "DirectionalLight {\n\ton TRUE\n\tintensity 1.0\n\tdirection 0 0 1\n}"); obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: srfc = ((thsurface*)(*obi)); tmp3d = srfc->get_3d(); srfc->calibrate(); tinv = srfc->calib_yy*srfc->calib_xx - srfc->calib_xy*srfc->calib_yx; has_texture = ((srfc->pict_name != NULL) && (srfc->pict_height > 0) && (srfc->pict_width > 0) && (tinv != 0.0)); if (tmp3d != NULL) { fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\tdiffuseColor 0.3 1.0 0.1\n\t\ttransparency 0.5\n\t}\n"); if (has_texture) { thbuffer tifn; tifn.guarantee(2048); sprintf(tifn.get_buffer(), "%s.img%d.%s", fnm, imgn++, srfc->pict_type == TT_IMG_TYPE_JPEG ? "jpg" : "png"); FILE * texf, * xf; texf = fopen(tifn.get_buffer(), "wb"); xf = fopen(srfc->pict_name, "rb"); if (texf != NULL) { if (xf != NULL) { fseek(xf, 0, SEEK_END); size_t fsz = ftell(xf); fseek(xf, 0, SEEK_SET); if (fsz > 0) { char * cdata = new char [fsz]; fread((void *) cdata, 1, fsz, xf); fwrite((void *) cdata, 1, fsz, texf); delete [] cdata; } fclose(xf); } fclose(texf); fprintf(pltf, "\ttexture ImageTexture {\n\t\turl [\"%s\"]\n\t}\n", tifn.get_buffer()); } } fprintf(pltf, "\n}\ngeometry IndexedFaceSet {\n\tsolid FALSE\n\tcreaseAngle 3.0\n"); tmp3d->export_vrml(pltf); if (has_texture) { txx = srfc->calib_yy / tinv; txy = -srfc->calib_xy / tinv; tyx = -srfc->calib_yx / tinv; tyy = srfc->calib_xx / tinv; tdx = -1.0 * (txx * srfc->calib_x + txy * srfc->calib_y); tdy = -1.0 * (tyx * srfc->calib_x + tyy * srfc->calib_y); thdb3dvx * vx; fprintf(pltf,"texCoord TextureCoordinate {\n\tpoint [\n"); for(vx = tmp3d->firstvx; vx != NULL; vx = vx->next) fprintf(pltf,"\t%8.6f %8.6f,\n", (vx->x * txx + vx->y * txy + tdx) / srfc->pict_width, (vx->x * tyx + vx->y * tyy + tdy) / srfc->pict_height); fprintf(pltf,"\t]\n}\n"); } finlim.update(&(tmp3d->limits)); fprintf(pltf,"\n}\n}\n"); } break; } obi++; } fprintf(pltf, "\t]\n}\n"); } if ((this->items & TT_EXPMODEL_ITEM_WALLS) != 0) { thscrap * cs; thdb3ddata * d3d; if ((this->wallsrc & TT_WSRC_CENTERLINE) != 0) { d3d = dbp->db1d.get_3d_walls(); finlim.update(&(d3d->limits)); fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\tdiffuseColor 1.0 1.0 1.0\n\t}" \ "\n}\ngeometry IndexedFaceSet {\n"); d3d->export_vrml(pltf); fprintf(pltf,"creaseAngle 3.0\n}\n}\n"); } // 3D DATA if ((this->wallsrc & TT_WSRC_MAPS) != 0) { thdb2dprjpr prjid = dbp->db2d.parse_projection("plan",false); if (!prjid.newprj) { thdb.db2d.process_projection(prjid.prj); cs = prjid.prj->first_scrap; while(cs != NULL) { if (cs->fsptr->is_selected()) { d3d = cs->get_3d_outline(); finlim.update(&(d3d->limits)); fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\tdiffuseColor 1.0 1.0 1.0\n\t}" \ "\n}\ngeometry IndexedFaceSet {\n"); d3d->export_vrml(pltf); fprintf(pltf,"creaseAngle 3.0\n}\n}\n"); } cs = cs->proj_next_scrap; } } } } // WALLS fprintf(pltf, "Shape {\nappearance Appearance {\n" \ "\tmaterial Material {\n\t\temissiveColor 1.0 0.0 0.0\n\t}" \ "\n}\ngeometry IndexedLineSet {\n"); fprintf(pltf,"coord Coordinate {\n\tpoint [\n"); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.minx , finlim.miny , finlim.minz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.minx , finlim.maxy , finlim.minz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.maxx , finlim.maxy , finlim.minz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.maxx , finlim.miny , finlim.minz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.minx , finlim.miny , finlim.maxz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.minx , finlim.maxy , finlim.maxz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.maxx , finlim.maxy , finlim.maxz ); fprintf(pltf,"%8.2f %8.2f %8.2f,\n",finlim.maxx , finlim.miny , finlim.maxz ); fprintf(pltf,"\t]\n}\n"); fprintf(pltf,"\tcoordIndex [\n"); fprintf(pltf,"0, 1, 2, 3, 0, 4, 5, 6, 7, 4, -1,\n"); fprintf(pltf,"1, 5, -1,\n"); fprintf(pltf,"2, 6, -1,\n"); fprintf(pltf,"3, 7, -1,\n"); fprintf(pltf,"\t]\n"); fprintf(pltf,"\n}\n}\n"); fprintf(pltf,"\n]\ntranslation %8.2f %8.2f %8.2f} # end of transformation to center\n", (finlim.maxx + finlim.minx) / -2.0, (finlim.maxy + finlim.miny) / -2.0, (finlim.maxz + finlim.minz) / -2.0 ); double diamx, diamy, diamz, diamxy, diamxz, diamyz, diam; diamx = (finlim.maxx - finlim.minx) / 2.0; diamy = (finlim.maxy - finlim.miny) / 2.0; diamz = (finlim.maxz - finlim.minz) / 2.0; diamxy = hypot(diamx, diamy); diamxz = hypot(diamx, diamz); diamyz = hypot(diamy, diamz); diam = hypot(diamxy, diamz); fprintf(pltf,"Viewpoint {\n\tfieldOfView 0.42\n\tjump TRUE\n\tposition 0.0 0.0 %8.2f\n\tdescription \"Down\"\n}\n", diamxy / 0.21818181818181 + diamz); fprintf(pltf,"Viewpoint {\n\tfieldOfView 0.42\n\tjump TRUE\n\tposition 0.0 0.0 %8.2f\n\torientation 1 0 0 3.14159\n\tdescription \"Up\"\n}\n", diamxy / -0.21818181818181 - diamz); fprintf(pltf,"Viewpoint {\n\tfieldOfView 0.42\n\tjump TRUE\n\tposition 0.0 %8.2f 0.0\n\torientation 1 0 0 1.570796\n\tdescription \"North\"\n}\n", diamxz / -0.21818181818181 - diamy); fprintf(pltf,"Transform {\n\trotation 0 0 1 1.570796\n\tchildren\nViewpoint {\n\tfieldOfView 0.42\n\tjump TRUE\n\tposition 0.0 %8.2f 0.0\n\torientation 1 0 0 1.570796\n\tdescription \"West\"\n}\n}\n", diamyz / -0.21818181818181 - diamx); fprintf(pltf,"Transform {\n\trotation 0 0 1 -1.570796\n\tchildren\nViewpoint {\n\tfieldOfView 0.42\n\tjump TRUE\n\tposition 0.0 %8.2f 0.0\n\torientation 1 0 0 1.570796\n\tdescription \"East\"\n}\n}\n", diamyz / -0.21818181818181 - diamx); fprintf(pltf,"Transform {\n\trotation 0 0 1 3.1415927\n\tchildren\nViewpoint {\n\tfieldOfView 0.42\n\tjump TRUE\n\tposition 0.0 %8.2f 0.0\n\torientation 1 0 0 1.570796\n\tdescription \"South\"\n}\n}\n", diamxz / -0.21818181818181 - diamy); fprintf(pltf,"\nNavigationInfo {\n\theadlight TRUE\n\tspeed %.1f\n}", diam * 0.1); fprintf(pltf,"\nBackground {\n\tskyColor 0 0 0\n}\n"); fprintf(pltf,"\n"); fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmodel::export_3dmf_file(class thdatabase * dbp) { const char * fnm = this->get_output("cave.3dmf"); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif FILE * pltf; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } double avx, avy, avz; thdb_object_list_type::iterator obi; thdb3ddata * pgn = dbp->db1d.get_3d(), * surf_pgn = dbp->db1d.get_3d_surface(), * splay_pgn = dbp->db1d.get_3d_splay(), * tmp3d; thdb3dlim pgnlimits, finlim; switch (this->items & TT_EXPMODEL_ITEM_CENTERLINE) { case TT_EXPMODEL_ITEM_SURFACECENTERLINE: pgnlimits.update(&(surf_pgn->limits)); break; case TT_EXPMODEL_ITEM_CENTERLINE: pgnlimits.update(&(surf_pgn->limits)); pgnlimits.update(&(pgn->limits)); break; default: pgnlimits.update(&(pgn->limits)); } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) pgnlimits.update(&(splay_pgn->limits)); finlim.update(&(pgnlimits)); avx = (pgnlimits.minx + pgnlimits.maxx) / 2.0; avy = (pgnlimits.miny + pgnlimits.maxy) / 2.0; avz = (pgnlimits.minz + pgnlimits.maxz) / 2.0; pgn->exp_shift_x = avx; pgn->exp_shift_y = avy; pgn->exp_shift_z = avz; surf_pgn->exp_shift_x = avx; surf_pgn->exp_shift_y = avy; surf_pgn->exp_shift_z = avz; // now let's print header fprintf(pltf,"3DMetafile ( 1 0 Stream nextTOC> ) \n"); //pgn->export_thm(pltf); if ((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) != 0) { if (pgn->firstfc != NULL) { fprintf(pltf,"BeginGroup (\n\tDisplayGroup ( ) \n)\n" "Container ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 0.3 0.7 1.0)\n)\n"); pgn->export_3dmf(pltf); fprintf(pltf,"EndGroup ( )\n"); } } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) { if (pgn->firstfc != NULL) { fprintf(pltf,"BeginGroup (\n\tDisplayGroup ( ) \n)\n" "Container ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 0.22 0.22 0.22)\n)\n"); splay_pgn->export_3dmf(pltf); fprintf(pltf,"EndGroup ( )\n"); } } if ((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) != 0) { if (surf_pgn->firstfc != NULL) { fprintf(pltf,"BeginGroup (\n\tDisplayGroup ( ) \n)\n" "Container ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 0.5 0.5 0.5) \n)\n"); surf_pgn->export_3dmf(pltf); fprintf(pltf,"EndGroup ( )\n"); } } if ((this->items & TT_EXPMODEL_ITEM_SURFACE) != 0) { // prejde secky surfaces a exportuje z nich povrchy obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: tmp3d = ((thsurface*)(*obi))->get_3d(); if (tmp3d != NULL) { tmp3d->exp_shift_x = avx; tmp3d->exp_shift_y = avy; tmp3d->exp_shift_z = avz; fprintf(pltf,"BeginGroup ( \n\tDisplayGroup ( ) \n) \n" "Container ( \n\tMesh ( \n"); tmp3d->export_3dmf(pltf); finlim.update(&(tmp3d->limits)); fprintf(pltf,"\t) \nContainer ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 0.3 1.0 0.1 ) \n\tTransparencyColor (0.5 0.5 0.5)\n) \n) \nEndGroup ( ) \n"); } break; } obi++; } } // 3D DATA if ((this->items & TT_EXPMODEL_ITEM_WALLS) != 0) { thscrap * cs; thdb3ddata * d3d; if ((this->wallsrc & TT_WSRC_CENTERLINE) != 0) { d3d = dbp->db1d.get_3d_walls(); finlim.update(&(d3d->limits)); d3d->exp_shift_x = avx; d3d->exp_shift_y = avy; d3d->exp_shift_z = avz; if ((d3d->firstfc != NULL) && (d3d->firstvx != NULL)) { fprintf(pltf,"BeginGroup ( \n\tDisplayGroup ( ) \n) \n" "Container ( \n\tMesh ( \n"); d3d->export_3dmf(pltf); fprintf(pltf,"\t) \nContainer ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 1 1 1 ) \n) \n) \nEndGroup ( ) \n"); } } if ((this->wallsrc & TT_WSRC_MAPS) != 0) { thdb2dprjpr prjid = dbp->db2d.parse_projection("plan",false); if (!prjid.newprj) { thdb.db2d.process_projection(prjid.prj); cs = prjid.prj->first_scrap; while(cs != NULL) { if (cs->fsptr->is_selected()) { d3d = cs->get_3d_outline(); finlim.update(&(d3d->limits)); d3d->exp_shift_x = avx; d3d->exp_shift_y = avy; d3d->exp_shift_z = avz; if ((d3d->firstfc != NULL) && (d3d->firstvx != NULL)) { fprintf(pltf,"BeginGroup ( \n\tDisplayGroup ( ) \n) \n" "Container ( \n\tMesh ( \n"); d3d->export_3dmf(pltf); fprintf(pltf,"\t) \nContainer ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 1 1 1 ) \n) \n) \nEndGroup ( ) \n"); } } cs = cs->proj_next_scrap; } } } } // WALLS fprintf(pltf,"BeginGroup ( \n\tDisplayGroup ( ) \n) \n" "Container ( \n\tAttributeSet ( ) \n" "\tDiffuseColor ( 1 0 0 ) \n)\n"); fprintf(pltf,"\tPolyLine ( 10\n"); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.minz - avz, avy - finlim.miny ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.minz - avz, avy - finlim.maxy ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.minz - avz, avy - finlim.maxy ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.minz - avz, avy - finlim.miny ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.minz - avz, avy - finlim.miny ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.maxz - avz, avy - finlim.miny ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.maxz - avz, avy - finlim.maxy ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.maxz - avz, avy - finlim.maxy ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.maxz - avz, avy - finlim.miny ); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.maxz - avz, avy - finlim.miny ); fprintf(pltf,")\n"); fprintf(pltf,"\tPolyLine ( 2\n"); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.minz - avz, avy - finlim.maxy); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.minx - avx, finlim.maxz - avz, avy - finlim.maxy); fprintf(pltf,")\n"); fprintf(pltf,"\tPolyLine ( 2\n"); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.minz - avz, avy - finlim.maxy); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.maxz - avz, avy - finlim.maxy); fprintf(pltf,")\n"); fprintf(pltf,"\tPolyLine ( 2\n"); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.minz - avz, avy - finlim.miny); fprintf(pltf,"%8.2f %8.2f %8.2f\n",finlim.maxx - avx, finlim.maxz - avz, avy - finlim.miny); fprintf(pltf,")\n"); fprintf(pltf,"EndGroup ( )\n"); fprintf(pltf,"\n"); fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmodel::export_dxf_file(class thdatabase * dbp) { const char * fnm = this->get_output("cave.dxf"); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif FILE * pltf; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } double avx, avy, avz; thdb_object_list_type::iterator obi; thdb3ddata * pgn = dbp->db1d.get_3d(), * surf_pgn = dbp->db1d.get_3d_surface(), * splay_pgn = dbp->db1d.get_3d_splay(), * tmp3d; thdb3dlim pgnlimits, finlim, extlim; switch (this->items & TT_EXPMODEL_ITEM_CENTERLINE) { case TT_EXPMODEL_ITEM_SURFACECENTERLINE: pgnlimits.update(&(surf_pgn->limits)); break; case TT_EXPMODEL_ITEM_CENTERLINE: pgnlimits.update(&(surf_pgn->limits)); pgnlimits.update(&(pgn->limits)); break; default: pgnlimits.update(&(pgn->limits)); } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) pgnlimits.update(&(splay_pgn->limits)); finlim.update(&(pgnlimits)); avx = 0.0; avy = 0.0; avz = 0.0; pgn->exp_shift_x = avx; pgn->exp_shift_y = avy; pgn->exp_shift_z = avz; surf_pgn->exp_shift_x = avx; surf_pgn->exp_shift_y = avy; surf_pgn->exp_shift_z = avz; extlim.update(&(surf_pgn->limits)); extlim.update(&(pgn->limits)); // now let's print header fprintf(pltf,"999\n" \ "Therion DXF export\n" \ "0\n" \ "SECTION\n" \ "2\n" \ "HEADER\n" \ "9\n" \ "$ACADVER\n" \ "1\n" \ "AC1006\n" \ "9\n" \ "$INSBASE\n" \ "10\n" \ "0.0\n" \ "20\n" \ "0.0\n" \ "30\n" \ "0.0\n" \ "9\n" \ "$EXTMIN\n" \ "10\n" \ "%.3f\n" \ "20\n" \ "%.3f\n" \ "30\n" \ "%.3f\n" \ "9\n" \ "$EXTMAX\n" \ "10\n" \ "%.3f\n" \ "20\n" \ "%.3f\n" \ "30\n" \ "%.3f\n" \ "0\n" \ "ENDSEC\n" \ "0\n" \ "SECTION\n" \ "2\n" \ "TABLES\n" \ "0\n" \ "TABLE\n" \ "2\n" \ "LTYPE\n" \ "70\n" \ "1\n" \ "0\n" \ "LTYPE\n" \ "2\n" \ "CONTINUOUS\n" \ "70\n" \ "64\n" \ "3\n" \ "Solid line\n" \ "72\n" \ "65\n" \ "73\n" \ "0\n" \ "40\n" \ "0.000000\n" \ "0\n" \ "ENDTAB\n" \ "0\n" \ "TABLE\n" \ "2\n" \ "LAYER\n" \ "70\n" \ "6\n" \ "0\n" \ "LAYER\n" \ "2\n" \ "CENTERLINE\n" \ "70\n" \ "64\n" \ "62\n" \ "4\n" \ "6\n" \ "CONTINUOUS\n" \ "0\n" \ "LAYER\n" \ "2\n" \ "WALLS\n" \ "70\n" \ "64\n" \ "62\n" \ "7\n" \ "6\n" \ "CONTINUOUS\n" \ "0\n" \ "LAYER\n" \ "2\n" \ "SURFACE\n" \ "70\n" \ "64\n" \ "62\n" \ "3\n" \ "6\n" \ "CONTINUOUS\n" \ "0\n" \ "LAYER\n" \ "2\n" \ "SURFACE_CENTERLINE\n" \ "70\n" \ "64\n" \ "62\n" \ "8\n" \ "6\n" \ "CONTINUOUS\n" \ "0\n" \ "LAYER\n" \ "2\n" \ "BBOX\n" \ "70\n" \ "64\n" \ "62\n" \ "1\n" \ "6\n" \ "CONTINUOUS\n" \ "0\n" \ "ENDTAB\n" \ "0\n" \ "TABLE\n" \ "2\n" \ "STYLE\n" \ "70\n" \ "0\n" \ "0\n" \ "ENDTAB\n" \ "0\n" \ "ENDSEC\n" \ "0\n" \ "SECTION\n" \ "2\n" \ "BLOCKS\n" \ "0\n" \ "ENDSEC\n" \ "0\n" \ "SECTION\n" \ "2\n" \ "ENTITIES\n", extlim.minx, extlim.miny, extlim.minz, extlim.maxx, extlim.maxy, extlim.maxz); // "9\n" // "$LIMMIN\n" // "10\n" // "%.3f\n" // "20\n" // "%.3f\n" // "9\n" // "$LIMMAX\n" // "10\n" // "%.3f\n" // "20\n" // "%.3f\n" if ((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) != 0) { pgn->export_dxf(pltf,"CENTERLINE"); } if ((this->items & TT_EXPMODEL_ITEM_SPLAYSHOTS) != 0) { splay_pgn->export_dxf(pltf,"SPLAY_SHOTS"); } if ((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) != 0) { surf_pgn->export_dxf(pltf,"SURFACE_CENTERLINE"); } if ((this->items & TT_EXPMODEL_ITEM_SURFACE) != 0) { // prejde secky surfaces a exportuje z nich povrchy obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: tmp3d = ((thsurface*)(*obi))->get_3d(); if (tmp3d != NULL) { tmp3d->exp_shift_x = avx; tmp3d->exp_shift_y = avy; tmp3d->exp_shift_z = avz; tmp3d->export_dxf(pltf,"SURFACE"); finlim.update(&(tmp3d->limits)); } break; } obi++; } } if ((this->items & TT_EXPMODEL_ITEM_WALLS) != 0) { // 3D DATA thscrap * cs; thdb3ddata * d3d; if ((this->wallsrc & TT_WSRC_CENTERLINE) != 0) { d3d = dbp->db1d.get_3d_walls(); finlim.update(&(d3d->limits)); d3d->exp_shift_x = avx; d3d->exp_shift_y = avy; d3d->exp_shift_z = avz; d3d->export_dxf(pltf,"WALLS"); } if ((this->wallsrc & TT_WSRC_MAPS) != 0) { thdb2dprjpr prjid = dbp->db2d.parse_projection("plan",false); if (!prjid.newprj) { thdb.db2d.process_projection(prjid.prj); cs = prjid.prj->first_scrap; while(cs != NULL) { if (cs->fsptr->is_selected()) { d3d = cs->get_3d_outline(); finlim.update(&(d3d->limits)); d3d->exp_shift_x = avx; d3d->exp_shift_y = avy; d3d->exp_shift_z = avz; d3d->export_dxf(pltf,"WALLS"); } cs = cs->proj_next_scrap; } } } } // WALLS fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.minx - avx, finlim.miny - avy, finlim.minz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.maxx - avx, finlim.miny - avy, finlim.minz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.minx - avx, finlim.miny - avy, finlim.minz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.minx - avx, finlim.maxy - avy, finlim.minz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.minx - avx, finlim.miny - avy, finlim.minz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.minx - avx, finlim.miny - avy, finlim.maxz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.maxx - avx, finlim.maxy - avy, finlim.maxz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.minx - avx, finlim.maxy - avy, finlim.maxz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.maxx - avx, finlim.maxy - avy, finlim.maxz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.maxx - avx, finlim.miny - avy, finlim.maxz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.maxx - avx, finlim.maxy - avy, finlim.maxz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.maxx - avx, finlim.maxy - avy, finlim.minz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.minx - avx, finlim.miny - avy, finlim.maxz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.maxx - avx, finlim.miny - avy, finlim.maxz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.minx - avx, finlim.miny - avy, finlim.maxz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.minx - avx, finlim.maxy - avy, finlim.maxz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.maxx - avx, finlim.miny - avy, finlim.minz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.maxx - avx, finlim.miny - avy, finlim.maxz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.maxx - avx, finlim.maxy - avy, finlim.minz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.minx - avx, finlim.maxy - avy, finlim.minz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.maxx - avx, finlim.maxy - avy, finlim.minz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.maxx - avx, finlim.miny - avy, finlim.minz - avz); fprintf(pltf,"0\nLINE\n8\nBBOX\n"); fprintf(pltf,"10\n%.3f\n20\n%.3f\n30\n%.3f\n",finlim.minx - avx, finlim.maxy - avy, finlim.maxz - avz); fprintf(pltf,"11\n%.3f\n21\n%.3f\n31\n%.3f\n",finlim.minx - avx, finlim.maxy - avy, finlim.minz - avz); fprintf(pltf,"0\nENDSEC\n0\nEOF\n"); fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmodel::export_lox_file(class thdatabase * dbp) { const char * fnm = this->get_output("cave.lox"); thdb_object_list_type::iterator obi; #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ...", fnm); thtext_inline = true; #endif lxFile expf; thsurvey * sptr, * tsptr; // vsetkym surveyom nastavi num1 na -1 ak nie su, 1 ak // su oznacene obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { if ((*obi)->get_class_id() == TT_SURVEY_CMD) { sptr = (thsurvey*)(*obi); if (sptr->is_selected()) { sptr->num1 = 1; } else { sptr->num1 = -1; } } obi++; } unsigned long nlegs = dbp->db1d.get_tree_size(), nstat = (unsigned long)dbp->db1d.station_vec.size(), i, j; thdb1dl ** tlegs = dbp->db1d.get_tree_legs(); long * stnum = NULL; if (nstat > 0) { stnum = new long[nstat]; for (i = 0; i < nstat; i++) stnum[i] = (dbp->db1d.station_vec[i].survey->is_selected() ? 1 : -1); //;-1 } // prejde vsetky zamery, ktore ideme // exportovat a parent surveyom bodov tychto zamer nastavi num1 na 1 // rovnako aj bodom num1 na 1 bool txsfc, txcav, issfc; txsfc = ((this->items & TT_EXPMODEL_ITEM_SURFACECENTERLINE) != 0); txcav = ((this->items & TT_EXPMODEL_ITEM_CAVECENTERLINE) != 0); for(i = 0; i < nlegs; i++, tlegs++) { issfc = (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) != 0); if ((*tlegs)->survey->is_selected() && ((txsfc && issfc) || (txcav && !issfc))) { stnum[(*tlegs)->leg->from.id - 1] = 1; dbp->db1d.station_vec[(*tlegs)->leg->from.id - 1].survey->num1 = 1; stnum[(*tlegs)->leg->to.id - 1] = 1; dbp->db1d.station_vec[(*tlegs)->leg->to.id - 1].survey->num1 = 1; } } // opat prejde vsetky surveye - doplni medziclanky a nastavi num1 // nastavi od 0 po n - exportuje ich obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { if ((*obi)->get_class_id() == TT_SURVEY_CMD) { sptr = (thsurvey*)(*obi); if ((sptr->num1 > 0) && (sptr->fsptr != NULL)) { tsptr = sptr->fsptr; if (tsptr->num1 > 0) tsptr = NULL; if (tsptr != NULL) tsptr = tsptr->fsptr; while ((tsptr != NULL) && (tsptr->num1 < 0)) tsptr = tsptr->fsptr; if (tsptr != NULL) { sptr = sptr->fsptr; while (sptr->id != tsptr->id) { sptr->num1 = 1; sptr = sptr->fsptr; } } } } obi++; } lxFileSurvey expf_survey; long survnum = 0; obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { if ((*obi)->get_class_id() == TT_SURVEY_CMD) { sptr = (thsurvey*)(*obi); if (sptr->num1 > 0) { sptr->num1 = survnum++; expf_survey.m_id = sptr->num1; expf_survey.m_parent = ((sptr->fsptr == NULL) || (sptr->fsptr->num1 < 0)) ? sptr->num1 : sptr->fsptr->num1; expf_survey.m_namePtr = expf.m_surveysData.AppendStr(sptr->name); expf_survey.m_titlePtr = expf.m_surveysData.AppendStr(sptr->title); expf.m_surveys.push_back(expf_survey); } } obi++; } // prejde vsetky body a nastavi im num od 0 po n a exportuje ich lxFileStation expf_station; survnum = 0; thdb1ds * pst; for (i = 0; i < nstat; i++) { if (stnum[i] > 0) { stnum[i] = survnum; pst = &(dbp->db1d.station_vec[i]); //fprintf(pltf,"T %ld %ld %s %.3f %.3f %.3f G%s%s%s\n", survnum, pst->survey->num1, pst->name, pst->x, pst->y, pst->z, (pst->flags & TT_STATIONFLAG_ENTRANCE) != 0 ? "E" : "", (pst->flags & TT_STATIONFLAG_FIXED) != 0 ? "F" : "", (pst->flags & TT_STATIONFLAG_CONT) != 0 ? "C" : ""); expf_station.m_c[0] = pst->x; expf_station.m_c[1] = pst->y; expf_station.m_c[2] = pst->z; expf_station.m_id = survnum; expf_station.m_surveyId = pst->survey->num1; expf_station.m_namePtr = expf.m_stationsData.AppendStr(pst->name); expf_station.m_commentPtr = expf.m_stationsData.AppendStr(pst->comment); expf_station.m_flags = 0; if ((pst->flags & TT_STATIONFLAG_ENTRANCE) != 0) expf_station.m_flags |= LXFILE_STATION_FLAG_ENTRANCE; if ((pst->flags & TT_STATIONFLAG_FIXED) != 0) expf_station.m_flags |= LXFILE_STATION_FLAG_FIXED; if ((pst->flags & TT_STATIONFLAG_CONT) != 0) expf_station.m_flags |= LXFILE_STATION_FLAG_CONTINUATION; if ((pst->flags & TT_STATIONFLAG_UNDERGROUND) == 0) expf_station.m_flags |= LXFILE_STATION_FLAG_SURFACE; expf.m_stations.push_back(expf_station); survnum++; } } // exportuje vsetky zamery ktorych psurveye su oznacene, ak // walls tak aj dimensions lxFileShot expf_shot; tlegs = dbp->db1d.get_tree_legs(); for(i = 0; i < nlegs; i++, tlegs++) { issfc = (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) != 0); if ((*tlegs)->survey->is_selected() && ((txsfc && issfc) || (txcav && !issfc))) { expf_shot.m_from = stnum[(*tlegs)->leg->from.id - 1]; expf_shot.m_to = stnum[(*tlegs)->leg->to.id - 1]; expf_shot.m_surveyId = (*tlegs)->survey->num1; expf_shot.m_flags = 0; if (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) != 0) expf_shot.m_flags |= LXFILE_SHOT_FLAG_SPLAY; if (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) != 0) expf_shot.m_flags |= LXFILE_SHOT_FLAG_SURFACE; if (((*tlegs)->leg->flags & TT_LEGFLAG_DUPLICATE) != 0) expf_shot.m_flags |= LXFILE_SHOT_FLAG_DUPLICATE; if (((*tlegs)->leg->walls != TT_FALSE) && ((this->wallsrc & TT_WSRC_CENTERLINE) != 0)) { expf_shot.m_sectionType = LXFILE_SHOT_SECTION_OVAL; expf_shot.m_fLRUD[2] = (*tlegs)->leg->from_up; expf_shot.m_fLRUD[3] = (*tlegs)->leg->from_down; expf_shot.m_fLRUD[0] = (*tlegs)->leg->from_left; expf_shot.m_fLRUD[1] = (*tlegs)->leg->from_right; expf_shot.m_tLRUD[2] = (*tlegs)->leg->to_up; expf_shot.m_tLRUD[3] = (*tlegs)->leg->to_down; expf_shot.m_tLRUD[0] = (*tlegs)->leg->to_left; expf_shot.m_tLRUD[1] = (*tlegs)->leg->to_right; expf_shot.m_threshold = (*tlegs)->leg->vtresh; } else expf_shot.m_sectionType = LXFILE_SHOT_SECTION_NONE; expf.m_shots.push_back(expf_shot); } } lxFileSurface expf_sfc; lxFileSurfaceBitmap expf_sfcBmp; // export povrchov (vsetkych - ak chceme) thdb3ddata * tmp3d; thsurface * csrf; survnum = 0; if ((this->items & TT_EXPMODEL_ITEM_SURFACE) != 0) { // prejde secky surfaces a exportuje z nich povrchy obi = dbp->object_list.begin(); while (obi != dbp->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: csrf = ((thsurface*)(*obi)); tmp3d = csrf->get_3d(); if ((tmp3d != NULL) && (tmp3d->nfaces > 0)) { expf_sfc.m_id = survnum; expf_sfc.m_width = csrf->grid_nx; expf_sfc.m_height = csrf->grid_ny; expf_sfc.m_calib[0] = csrf->grid_ox; expf_sfc.m_calib[1] = csrf->grid_oy; expf_sfc.m_calib[2] = csrf->grid_dx; expf_sfc.m_calib[3] = 0.0; expf_sfc.m_calib[4] = 0.0; expf_sfc.m_calib[5] = csrf->grid_dy; lxFileDbl * cdata = new lxFileDbl[csrf->grid_size]; for(i = 0; i < (unsigned long) csrf->grid_size; i++) { cdata[i] = csrf->grid[i]; } expf_sfc.m_dataPtr = expf.m_surfacesData.AppendData((void *) cdata, csrf->grid_size * sizeof(lxFileDbl)); expf.m_surfaces.push_back(expf_sfc); delete [] cdata; if (csrf->pict_name != NULL) { csrf->calibrate(); expf_sfcBmp.m_surfaceId = survnum; switch (csrf->pict_type) { case TT_IMG_TYPE_PNG: expf_sfcBmp.m_type = LXFILE_BITMAP_PNG; default: expf_sfcBmp.m_type = LXFILE_BITMAP_JPEG; } expf_sfcBmp.m_dataPtr = expf.m_surfaceBitmapsData.AppendFile(csrf->pict_name); expf_sfcBmp.m_calib[0] = csrf->calib_x; expf_sfcBmp.m_calib[1] = csrf->calib_y; expf_sfcBmp.m_calib[2] = csrf->calib_xx; expf_sfcBmp.m_calib[3] = csrf->calib_xy; expf_sfcBmp.m_calib[4] = csrf->calib_yx; expf_sfcBmp.m_calib[5] = csrf->calib_yy; expf.m_surfaceBitmaps.push_back(expf_sfcBmp); } survnum++; } break; } obi++; } } lxFileScrap expf_scrap; survnum = 0; // export stien if (((this->items & TT_EXPMODEL_ITEM_WALLS) != 0) && ((this->wallsrc & TT_WSRC_MAPS) != 0)) { // 3D DATA thdb2dprjpr prjid = dbp->db2d.parse_projection("plan",false); thscrap * cs; thdb3ddata * d3d; if (!prjid.newprj) { thdb.db2d.process_projection(prjid.prj); cs = prjid.prj->first_scrap; while(cs != NULL) { if (cs->fsptr->is_selected()) { d3d = cs->get_3d_outline(); if ((d3d != NULL) && (d3d->nfaces > 0)) { expf_scrap.m_id = survnum; expf_scrap.m_surveyId = cs->fsptr->num1; // points & triangles lxFile3Point * pdata = new lxFile3Point [d3d->nvertices]; thdb3dvx * vxp; std::list tlist; lxFile3Angle t3; for(i = 0, vxp = d3d->firstvx; vxp != NULL; vxp = vxp->next, i++) { pdata[i].m_c[0] = vxp->x; pdata[i].m_c[1] = vxp->y; pdata[i].m_c[2] = vxp->z; } expf_scrap.m_numPoints = d3d->nvertices; expf_scrap.m_pointsPtr = expf.m_scrapsData.AppendData(pdata, i * sizeof(lxFile3Point)); thdb3dfc * fcp; thdb3dfx * fxp; for(i = 0, fcp = d3d->firstfc; fcp != NULL; fcp = fcp->next, i++) { switch (fcp->type) { case THDB3DFC_TRIANGLE_STRIP: for(j = 0, fxp = fcp->firstfx; fxp->next->next != NULL; j++, fxp = fxp->next) { t3.m_v[0] = fxp->vertex->id; switch (j % 2) { case 0: t3.m_v[1] = fxp->next->vertex->id; t3.m_v[2] = fxp->next->next->vertex->id; default: t3.m_v[2] = fxp->next->vertex->id; t3.m_v[1] = fxp->next->next->vertex->id; } tlist.insert(tlist.end(), t3); } break; case THDB3DFC_TRIANGLES: for(j = 0, fxp = fcp->firstfx; fxp != NULL; j++, fxp = fxp->next->next->next) { t3.m_v[0] = fxp->vertex->id; t3.m_v[1] = fxp->next->vertex->id; t3.m_v[2] = fxp->next->next->vertex->id; tlist.insert(tlist.end(), t3); } break; } } lxFile3Angle * tdata = new lxFile3Angle[tlist.size()]; std::list::iterator tli; for(i = 0, tli = tlist.begin(); tli != tlist.end(); tli++, i++) { tdata[i] = *tli; } expf_scrap.m_num3Angles = tlist.size(); expf_scrap.m_3AnglesPtr = expf.m_scrapsData.AppendData(tdata, i * sizeof(lxFile3Angle)); delete [] pdata; delete [] tdata; expf.m_scraps.push_back(expf_scrap); survnum++; } } cs = cs->proj_next_scrap; } } } // WALLS if (stnum != NULL) delete [] stnum; expf.ExportLOX(fnm); if (expf.m_error.size() > 0) { thwarning(("error writing %s",fnm)) return; } #ifdef THDEBUG #else thprintf(" done\n"); thtext_inline = false; #endif } void thexpmodel::export_kml_file(class thdatabase * dbp) { unsigned long nlegs = dbp->db1d.get_tree_size(), nstat = (unsigned long)dbp->db1d.station_vec.size(); thdb1dl ** tlegs = dbp->db1d.get_tree_legs(); if (thcfg.outcs == TTCS_LOCAL) { thwarning(("data not georeferenced -- unable to export KML file")); return; } FILE * out; const char * fnm = this->get_output("cave.kml"); out = fopen(fnm, "w"); if (out == NULL) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif fprintf(out,"\n\n\n"); fprintf(out,"Therion KML export\nTherion KML export.\n"); unsigned long last_st = nstat, cur_st, numst, i; double x, y, z; fprintf(out,"\n"); fprintf(out,"\n"); fprintf(out,"\n"); numst = 0; for(i = 0; i < nlegs; i++, tlegs++) { if (this->is_leg_exported(*tlegs) && (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) == 0)) { cur_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; if (cur_st != last_st) { if (numst > 0) fprintf(out,"\n\n"); fprintf(out,"\n\n"); thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, dbp->db1d.station_vec[cur_st].x, dbp->db1d.station_vec[cur_st].y, dbp->db1d.station_vec[cur_st].z, x, y, z); fprintf(out, "\t%.14f,%.14f,%.14f\n", x / THPI * 180.0, y / THPI * 180.0, z); numst = 1; } last_st = dbp->db1d.station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, dbp->db1d.station_vec[last_st].x, dbp->db1d.station_vec[last_st].y, dbp->db1d.station_vec[last_st].z, x, y, z); fprintf(out, "\t%.14f,%.14f,%.14f\n", x / THPI * 180.0, y / THPI * 180.0, z); numst++; } } if (numst > 0) fprintf(out,"\n\n"); fprintf(out,"\n"); fprintf(out,"\n\n\n"); fclose(out); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } therion/thdb3d.cxx0000664000175000017500000003334211450674414013155 0ustar useruser/** * @file thdb3d.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb3d.h" #include void thdb3dlim::update(double x, double y, double z) { if (this->ok) { if (x < this->minx) this->minx = x; if (y < this->miny) this->miny = y; if (z < this->minz) this->minz = z; if (x > this->maxx) this->maxx = x; if (y > this->maxy) this->maxy = y; if (z > this->maxz) this->maxz = z; } else { this->minx = x; this->miny = y; this->minz = z; this->maxx = x; this->maxy = y; this->maxz = z; this->ok = true; } } void thdb3dlim::update(thdb3dlim * limits) { if (limits->ok) { this->update(limits->minx, limits->miny, limits->minz); this->update(limits->maxx, limits->maxy, limits->maxz); } } void thdb3dnm::normalize() { double nl; if (!this->norm) { nl = sqrt(this->x * this->x + this->y * this->y + this->z * this->z); if (nl > 0.0) { this->x /= nl; this->y /= nl; this->z /= nl; } else { this->z = 1.0; } this->norm = true; } } thdb3dfc * thdb3ddata::insert_face(int type) { thdb3dfc * face; face = &(*thdatabase3d.face_list.insert(thdatabase3d.face_list.end(),thdb3dfc())); face->type = type; this->nfaces++; if (this->lastfc == NULL) { this->firstfc = face; this->lastfc = face; } else { this->lastfc->next = face; this->lastfc = face; } return face; } thdb3dvx * thdb3ddata::insert_vertex(lxVec v, void * dt) { return this->insert_vertex(v.x, v.y, v.z, dt); } thdb3dvx * thdb3ddata::insert_vertex(double vxx, double vxy, double vxz, void * dt) { thdb3dvx * vertex; vertex = &(*thdatabase3d.vertex_list.insert(thdatabase3d.vertex_list.end(),thdb3dvx())); vertex->id = this->nvertices; vertex->x = vxx; vertex->y = vxy; vertex->z = vxz; this->limits.update(vxx, vxy, vxz); vertex->data = dt; this->nvertices++; if (this->lastvx == NULL) { this->firstvx = vertex; this->lastvx = vertex; } else { this->lastvx->next = vertex; this->lastvx = vertex; } return vertex; } thdb3dfx * thdb3dfc::insert_vertex(thdb3dvx * vx, void * dt) { thdb3dfx * fx; fx = &(*thdatabase3d.face_vertex_list.insert(thdatabase3d.face_vertex_list.end(),thdb3dfx())); this->nvx++; if (this->lastfx == NULL) { this->firstfx = fx; this->lastfx = fx; } else { this->lastfx->next = fx; this->lastfx = fx; } fx->vertex = vx; fx->data = dt; return fx; } thdb3dnm * thdb3dfx::insert_normal(double nx, double ny, double nz) { if (this->normal == NULL) { this->normal = &(*thdatabase3d.normal_list.insert(thdatabase3d.normal_list.end(),thdb3dnm())); this->normal->x = nx; this->normal->y = ny; this->normal->z = nz; } else { this->normal->x += nx; this->normal->y += ny; this->normal->z += nz; } return this->normal; } thdb3dnm * thdb3dvx::insert_normal(double nx, double ny, double nz) { if (this->normal == NULL) { this->normal = &(*thdatabase3d.normal_list.insert(thdatabase3d.normal_list.end(),thdb3dnm())); this->normal->x = nx; this->normal->y = ny; this->normal->z = nz; } else { this->normal->x += nx; this->normal->y += ny; this->normal->z += nz; } return this->normal; } void thdb3ddata::export_thm(FILE * out) { thdb3dfc * fc; thdb3dfx * fx; const char * typestr; for (fc = this->firstfc; fc != NULL; fc = fc->next) { switch (fc->type) { case THDB3DFC_LINES: typestr = "GL_LINES"; break; case THDB3DFC_LINE_STRIP: typestr = "GL_LINE_STRIP"; break; case THDB3DFC_LINE_LOOP: typestr = "GL_LINE_LOOP"; break; case THDB3DFC_TRIANGLES: typestr = "GL_TRIANGLES"; break; case THDB3DFC_TRIANGLE_STRIP: typestr = "GL_TRIANGLE_STRIP"; break; case THDB3DFC_TRIANGLE_FAN: typestr = "GL_TRIANGLE_FAN"; break; case THDB3DFC_QUADS: typestr = "GL_QUADS"; break; case THDB3DFC_QUAD_STRIP: typestr = "GL_QUAD_STRIP"; break; case THDB3DFC_POLYGON: typestr = "GL_POLYGON"; break; default: typestr = "GL_POINTS"; break; } fprintf(out,"glBegin $GL::%s\n", typestr); for (fx = fc->firstfx; fx != NULL; fx = fx->next) { if (fx->vertex->normal != NULL) { fprintf(out,"glNormal3f %8.4f %8.4f %8.4f\n", fx->vertex->normal->x, fx->vertex->normal->y, fx->vertex->normal->z); } else if (fx->normal != NULL) { fprintf(out,"glNormal3f %8.4f %8.4f %8.4f\n", fx->normal->x, fx->normal->y, fx->normal->z); } fprintf(out,"glVertex3f %8.2f %8.2f %8.2f\n", fx->vertex->x - this->exp_shift_x, fx->vertex->y - this->exp_shift_y, fx->vertex->z - this->exp_shift_z); } fprintf(out,"glEnd\n"); } } void thdb3ddata::export_vrml(FILE * out) { thdb3dfc * fc; thdb3dfx * fx, * fx1, * fx2, * fx3; thdb3dvx * vx; bool reverse; fprintf(out,"coord Coordinate {\n\tpoint [\n"); for(vx = this->firstvx; vx != NULL; vx = vx->next) fprintf(out,"\t%8.2f %8.2f %8.2f,\n", vx->x - this->exp_shift_x, vx->y - this->exp_shift_y, vx->z - this->exp_shift_z); fprintf(out,"\t]\n}\n"); fprintf(out,"\tcoordIndex [\n"); for (fc = this->firstfc; fc != NULL; fc = fc->next) { switch (fc->type) { case THDB3DFC_TRIANGLES: fx = fc->firstfx; while (fx != NULL) { fx1 = fx; fx = fx->next; fx2 = NULL; fx3 = NULL; if (fx != NULL) { fx2 = fx; fx = fx->next; } if (fx != NULL) { fx3 = fx; fx = fx->next; } if (fx3 != NULL) { fprintf(out,"\t%6ld,%6ld,%6ld, -1,\n", fx1->vertex->id, fx2->vertex->id, fx3->vertex->id); } } break; case THDB3DFC_TRIANGLE_STRIP: reverse = true; fx = fc->firstfx; if (fx != NULL) { fx2 = fx; fx = fx->next; } if (fx != NULL) { fx3 = fx; fx = fx->next; } while (fx != NULL) { fx1 = fx2; fx2 = fx3; fx3 = fx; fx = fx->next; fprintf(out, "\t%6ld,%6ld,%6ld, -1,\n", reverse ? fx1->vertex->id : fx2->vertex->id, reverse ? fx2->vertex->id : fx1->vertex->id, fx3->vertex->id); reverse = ! reverse; } break; case THDB3DFC_LINE_STRIP: fx = fc->firstfx; while (fx != NULL) { fprintf(out, "\t%6ld, ", fx->vertex->id); fx = fx->next; } fprintf(out, "-1,\n"); break; case THDB3DFC_TRIANGLE_FAN: case THDB3DFC_QUADS: case THDB3DFC_QUAD_STRIP: case THDB3DFC_POLYGON: case THDB3DFC_LINES: case THDB3DFC_LINE_LOOP: default: break; } } fprintf(out,"\t]\n"); } void thdb3ddata::export_3dmf(FILE * out) { thdb3dfc * fc; thdb3dfx * fx, * fx1, * fx2, * fx3; thdb3dvx * vx; bool reverse; if ((this->firstfc != NULL) && (this->firstfc->type == THDB3DFC_LINE_STRIP)) { for (fc = this->firstfc; fc != NULL; fc = fc->next) { fx = fc->firstfx; nfaces = 0; while (fx != NULL) { nfaces++; fx = fx->next; } if (nfaces > 0) { fprintf(out,"\tPolyLine ( %ld\n", nfaces); fx = fc->firstfx; nfaces = 0; while (fx != NULL) { vx = fx->vertex; fprintf(out,"\t%.2f %.2f %.2f\n", vx->x - this->exp_shift_x, vx->z - this->exp_shift_z, this->exp_shift_y - vx->y); fx = fx->next; } fprintf(out,"\t)\n"); } } return; } fprintf(out,"\t%ld # nVertices\n", this->nvertices); for(vx = this->firstvx; vx != NULL; vx = vx->next) fprintf(out,"\t%.2f %.2f %.2f # %ld\n", vx->x - this->exp_shift_x, vx->z - this->exp_shift_z, this->exp_shift_y - vx->y, vx->id); unsigned long nfaces = 0; for (fc = this->firstfc; fc != NULL; fc = fc->next) { switch (fc->type) { case THDB3DFC_TRIANGLES: nfaces += fc->nvx / 3; break; case THDB3DFC_TRIANGLE_STRIP: nfaces += fc->nvx - 2; break; } } fprintf(out,"\t%ld # nFaces\n\t0 # nContours\n", nfaces); nfaces = 0; for (fc = this->firstfc; fc != NULL; fc = fc->next) { switch (fc->type) { case THDB3DFC_TRIANGLES: fx = fc->firstfx; while (fx != NULL) { fx1 = fx; fx = fx->next; fx2 = NULL; fx3 = NULL; if (fx != NULL) { fx2 = fx; fx = fx->next; } if (fx != NULL) { fx3 = fx; fx = fx->next; } if (fx3 != NULL) { fprintf(out,"\t3 %ld %ld %ld # %ld\n", fx1->vertex->id, fx2->vertex->id, fx3->vertex->id, nfaces++); } } break; case THDB3DFC_TRIANGLE_STRIP: fx = fc->firstfx; reverse = true; if (fx != NULL) { fx2 = fx; fx = fx->next; } if (fx != NULL) { fx3 = fx; fx = fx->next; } while (fx != NULL) { fx1 = fx2; fx2 = fx3; fx3 = fx; fx = fx->next; fprintf(out,"\t3 %ld %ld %ld # %ld\n", reverse ? fx1->vertex->id : fx2->vertex->id, reverse ? fx2->vertex->id : fx1->vertex->id, fx3->vertex->id, nfaces++); reverse = ! reverse; } break; case THDB3DFC_TRIANGLE_FAN: case THDB3DFC_QUADS: case THDB3DFC_QUAD_STRIP: case THDB3DFC_POLYGON: case THDB3DFC_LINES: case THDB3DFC_LINE_STRIP: case THDB3DFC_LINE_LOOP: default: break; } } } void thdb3ddata::postprocess() { // znormalizuje vsetky normaly thdb3dvx * vx; thdb3dfx * fx; thdb3dfc * fc; for(vx = this->firstvx; vx != NULL; vx = vx->next) { if (vx->normal != NULL) vx->normal->normalize(); } for(fc = this->firstfc; fc != NULL; fc = fc->next) { for(fx = fc->firstfx; fx != NULL; fx = fx->next) { if (fx->normal != NULL) fx->normal->normalize(); } } } #define dxfprint0(vertex) fprintf(out, "10\n%.3f\n20\n%.3f\n30\n%.3f\n", (vertex)->x - this->exp_shift_x, (vertex)->y - this->exp_shift_y, (vertex)->z - this->exp_shift_z) #define dxfprint1(vertex) fprintf(out, "11\n%.3f\n21\n%.3f\n31\n%.3f\n", (vertex)->x - this->exp_shift_x, (vertex)->y - this->exp_shift_y, (vertex)->z - this->exp_shift_z) #define dxfprint2(vertex) fprintf(out, "12\n%.3f\n22\n%.3f\n32\n%.3f\n", (vertex)->x - this->exp_shift_x, (vertex)->y - this->exp_shift_y, (vertex)->z - this->exp_shift_z) #define dxfprint3(vertex) fprintf(out, "13\n%.3f\n23\n%.3f\n33\n%.3f\n", (vertex)->x - this->exp_shift_x, (vertex)->y - this->exp_shift_y, (vertex)->z - this->exp_shift_z) void thdb3ddata::export_dxf(FILE * out, const char * LAYER) { thdb3dfc * fc; thdb3dfx * fx, * fx1, * fx2 = NULL, * fx3 = NULL; bool reverse; for (fc = this->firstfc; fc != NULL; fc = fc->next) { switch (fc->type) { case THDB3DFC_TRIANGLES: fx = fc->firstfx; while (fx != NULL) { fx1 = fx; fx = fx->next; fx2 = NULL; fx3 = NULL; if (fx != NULL) { fx2 = fx; fx = fx->next; } if (fx != NULL) { fx3 = fx; fx = fx->next; } if (fx3 != NULL) { fprintf(out,"0\n3DFACE\n8\n%s\n",LAYER); dxfprint0(fx1->vertex); dxfprint1(fx2->vertex); dxfprint2(fx3->vertex); dxfprint3(fx3->vertex); } } break; case THDB3DFC_TRIANGLE_STRIP: reverse = true; fx = fc->firstfx; if (fx != NULL) { fx2 = fx; fx = fx->next; } if (fx != NULL) { fx3 = fx; fx = fx->next; } while (fx != NULL) { fx1 = fx2; fx2 = fx3; fx3 = fx; fx = fx->next; fprintf(out,"0\n3DFACE\n8\n%s\n",LAYER); dxfprint0(reverse ? fx1->vertex : fx2->vertex); dxfprint1(reverse ? fx2->vertex : fx1->vertex); dxfprint2(fx3->vertex); dxfprint3(fx3->vertex); reverse = ! reverse; } break; case THDB3DFC_LINE_STRIP: fx = fc->firstfx; fx2 = fx->next; while (fx2 != NULL) { fprintf(out,"0\nLINE\n8\n%s\n",LAYER); dxfprint0(fx->vertex); dxfprint1(fx2->vertex); fx = fx2; fx2 = fx2->next; } break; case THDB3DFC_TRIANGLE_FAN: case THDB3DFC_QUADS: case THDB3DFC_QUAD_STRIP: case THDB3DFC_POLYGON: case THDB3DFC_LINES: case THDB3DFC_LINE_LOOP: default: break; } } } thdb3d thdatabase3d; therion/th2ddataobject.cxx0000664000175000017500000001261512043471426014664 0ustar useruser/** * @file th2ddataobject.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "th2ddataobject.h" #include "thexception.h" #include "thsymbolset.h" #include "thchenc.h" th2ddataobject::th2ddataobject() { this->pscrapoptr = NULL; this->nscrapoptr = NULL; this->fscrapptr = NULL; this->scale = TT_2DOBJ_SCALE_M; this->tags = TT_2DOBJ_TAG_CLIP_AUTO | TT_2DOBJ_TAG_VISIBILITY_ON; this->place = TT_2DOBJ_PLACE_DEFAULT; this->context = -1; this->m_subtype_str = NULL; } th2ddataobject::~th2ddataobject() { } int th2ddataobject::get_class_id() { return TT_2DDATAOBJECT_CMD; } bool th2ddataobject::is(int class_id) { if (class_id == TT_2DDATAOBJECT_CMD) return true; else return thdataobject::is(class_id); } thcmd_option_desc th2ddataobject::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_2ddataobject_opt); if (id == TT_2DOBJ_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else switch(id) { case TT_2DOBJ_CONTEXT: return thcmd_option_desc(id,2); default: return thcmd_option_desc(id); } } void th2ddataobject::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { int i; switch (cod.id) { case TT_2DOBJ_SCALE: this->scale = thmatch_token(*args, thtt_2dobj_scales); if (this->scale == TT_2DOBJ_SCALE_UNKNOWN) ththrow(("invalid scale -- %s",*args)) if (this->get_class_id() == TT_AREA_CMD) ththrow(("scale specification for area not allowed")) break; case TT_2DOBJ_CLIP: i = thmatch_token(*args, thtt_onoffauto); this->tags &= ~(TT_2DOBJ_TAG_CLIP_ON | TT_2DOBJ_TAG_CLIP_AUTO); switch (i) { case TT_TRUE: this->tags |= TT_2DOBJ_TAG_CLIP_ON; break; case TT_FALSE: break; case TT_AUTO: this->tags |= TT_2DOBJ_TAG_CLIP_AUTO; break; default: ththrow(("invalid clip -- %s",*args)) } break; case TT_2DOBJ_VISIBILITY: i = thmatch_token(*args, thtt_bool); this->tags &= ~TT_2DOBJ_TAG_VISIBILITY_ON; switch (i) { case TT_TRUE: this->tags |= TT_2DOBJ_TAG_VISIBILITY_ON; break; case TT_FALSE: break; default: ththrow(("invalid visibility switch -- %s",*args)) } break; case TT_2DOBJ_PLACE: this->place = thmatch_token(*args, thtt_2ddataobject_place); if (this->place == TT_2DOBJ_PLACE_UNKNOWN) ththrow(("invalid place value -- %s",*args)) break; case TT_2DOBJ_CONTEXT: this->context = thsymbolset__get_id(args[0], args[1]); if (this->context < 0) ththrow(("invalid object context -- %s %s", args[0], args[1])) if ((this->context > SYMP_ZZZ) && (this->context != SYMX_POINT_AIRDRAUGHT) && (this->context != SYMX_POINT_HEIGHT) && (this->context != SYMX_POINT_PASSAGEHEIGHT) && (this->context != SYMX_POINT_STATION) && (this->context != SYMX_POINT_WATERFLOW) && (this->context != SYMX_LINE_BORDER) && (this->context != SYMX_LINE_SURVEY) && (this->context != SYMX_LINE_WALL) && (this->context != SYMX_LINE_WATERFLOW)) ththrow(("object context not allowed -- %s %s", args[0], args[1])) break; default: thdataobject::set(cod, args, argenc, indataline); } } int th2ddataobject::get_context() { return THCTX_SCRAP; } void th2ddataobject::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"th2ddataobject:\n"); fprintf(outf,"\tscale: %d\n",this->scale); fprintf(outf,"\ttags: %d\n",this->tags); // insert intended print of object properties here } thbuffer sTTtype, sTTsubtype; void th2dsplitTT(char * src, char ** type, char ** subtype) { size_t sl, x, tl, stl; char * t, * st; sl = strlen(src); sTTtype.guarantee(sl+1); sTTsubtype.guarantee(sl+1); t = sTTtype.get_buffer(); st = sTTsubtype.get_buffer(); t[0] = 0; st[0] = 0; tl = 0; stl = 0; bool inst = false; for(x = 0; x < sl; x++) { if (src[x] == ':') { inst = true; } else if (inst) { st[stl] = src[x]; stl++; st[stl] = 0; } else { t[tl] = src[x]; tl++; t[tl] = 0; } } *type = t; *subtype = st; } void th2ddataobject::parse_u_subtype(const char * subtype) { if (th_is_keyword(subtype)) { this->m_subtype_str = this->db->strstore(subtype, true); } else ththrow(("invalid subtype name -- %s", subtype)) } therion/thscraplo.h0000664000175000017500000000271111575361532013427 0ustar useruser/** * @file thscraplo.h * Scrap outline line class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thscraplo_h #define thscraplo_h #include #include enum { TT_OUTLINE_NO, TT_OUTLINE_NORMAL, TT_OUTLINE_REVERSED, }; /** * Scrap outline line class. */ class thscraplo { public: bool lfreefirst, lfreelast; thscraplo * next_line, * next_outline, * next_scrap_line; class thline * line; int mode; thscraplo(); ///< Default constructor }; typedef std::list thscraplo_list; ///< Points list. #endif therion/thendscrap.h0000664000175000017500000000531710721450252013556 0ustar useruser/** * @file thendscrap.h * endscrap module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thendscrap_h #define thendscrap_h #include "thdataobject.h" /** * endscrap command options tokens. */ enum { TT_ENDSCRAP_UNKNOWN = 2000, }; /** * endscrap command options parsing table. */ static const thstok thtt_endscrap_opt[] = { {NULL, TT_ENDSCRAP_UNKNOWN}, }; /** * endscrap class. */ class thendscrap : public thdataobject { public: /** * Standard constructor. */ thendscrap(); /** * Standard destructor. */ ~thendscrap(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thendscrap";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * Get context for object. */ virtual int get_context(); }; #endif therion/thdb2dprj.h0000664000175000017500000000566710721225442013317 0ustar useruser/** * @file thdb2dprj.h * 2D projection. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2dprj_h #define thdb2dprj_h #include "thparse.h" #include "thmapstat.h" #include #include /** * Projection types. */ enum { TT_2DPROJ_UNKNOWN = -1, ///< ??? TT_2DPROJ_NONE = 0, ///< None projection, for sections. TT_2DPROJ_PLAN = 1, ///< Basic plan projection TT_2DPROJ_ELEV = 2, ///< Elevation TT_2DPROJ_EXTEND = 3, ///< Extended elevation }; /** * Projection parsing table. */ static const thstok thtt_2dproj[] = { {"elevation", TT_2DPROJ_ELEV}, {"extended", TT_2DPROJ_EXTEND}, {"none", TT_2DPROJ_NONE}, {"plan", TT_2DPROJ_PLAN}, {NULL, TT_2DPROJ_UNKNOWN} }; /** * 2D projection class. */ class thdb2dprj { public: char type; ///< Projection type. int id; ///< ID. const char * index; ///< Projection index. double pp1, ///< Projection parameter 1. amaxdist; bool processed; ///< Check whether projection is processed. class thscrap * first_scrap, ///< First scrap in projection. * last_scrap; ///< Last scrap in projection. class thjoin * first_join, ///< Joins in given projection. * last_join; ///< Joins in given projection. class thdb2dji * first_join_list, ///< 1. Join list. * last_join_list; ///< Last join list. double shift_x, shift_y, shift_z, rshift_x, rshift_y, rshift_z; ///< Shift + reverse shift. thmapstat stat; /** * Standard constructor. */ thdb2dprj(); /** * Constructor with arguments. */ thdb2dprj(char, char *); }; class thdb2dprjid { public: char type; ///< Projetion type. const char * index; ///< Projection index. thdb2dprjid(); ///< Default constructor. thdb2dprjid(thdb2dprj * proj); ///< Constructor from projection. thdb2dprjid(int tt, const char * ii) : type(tt), index(ii) {} ///< ??? }; bool operator < (const thdb2dprjid & p1, const thdb2dprjid & p2); typedef std::list thdb2dprj_list; typedef std::map thdb2dprjid_map; #endif therion/thtrans.cxx0000664000175000017500000005342310625655142013472 0ustar useruser/** * @file thtrans.cxx * Transformation structures. */ /* Copyright (C) 2006 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include "thtrans.h" #include "thdatabase.h" void thvec2::reset() { this->m_x = 0.0; this->m_y = 0.0; } void thmat2::reset() { this->m_xx = 1.0; this->m_xy = 0.0; this->m_yx = 0.0; this->m_yy = 1.0; } thlintrans::thlintrans() { this->reset(); } void thlintrans::reset() { this->m_scale = 1.0; this->m_rot = 0.0; this->m_initpts.clear(); this->m_shift.reset(); this->m_bmat.reset(); this->m_fmat.reset(); } thvec2 thvec2::operator += (const thvec2 & v) { this->m_x += v.m_x; this->m_y += v.m_y; return (*this); } thvec2 thvec2::operator -= (const thvec2 & v) { this->m_x -= v.m_x; this->m_y -= v.m_y; return (*this); } thvec2 thvec2::operator *= (const double & c) { this->m_x *= c; this->m_y *= c; return (*this); } thvec2 thvec2::operator /= (const double & c) { this->m_x /= c; this->m_y /= c; return (*this); } void thvec2::minimize(thvec2 v) { if (this->m_x > v.m_x) this->m_x = v.m_x; if (this->m_y > v.m_y) this->m_y = v.m_y; } void thvec2::maximize(thvec2 v) { if (this->m_x < v.m_x) this->m_x = v.m_x; if (this->m_y < v.m_y) this->m_y = v.m_y; } thmat2 thmat2::operator *= (const double & c) { this->m_xx *= c; this->m_xy *= c; this->m_yx *= c; this->m_yy *= c; return (*this); } thmat2 thmat2::operator /= (const double & c) { this->m_xx /= c; this->m_xy /= c; this->m_yx /= c; this->m_yy /= c; return (*this); } thmat2 thmat2::inverse() { double d; d = (this->m_xx * this->m_yy - this->m_xy * this->m_yx); return thmat2(this->m_yy / d, -1.0 * this->m_xy / d, -1.0 * this->m_yx / d, this->m_xx / d); } thvec2 operator - (const thvec2 & v) { return thvec2( - v.m_x, - v.m_y); } thvec2 operator + (const thvec2 & v1, const thvec2 & v2) { return thvec2(v1.m_x + v2.m_x, v1.m_y + v2.m_y); } thvec2 operator - (const thvec2 & v1, const thvec2 & v2) { return thvec2(v1.m_x - v2.m_x, v1.m_y - v2.m_y); } double operator * (const thvec2 & v1, const thvec2 & v2) { return (v1.m_x * v2.m_x + v1.m_y * v2.m_y); } double operator ^ (const thvec2 & v1, const thvec2 & v2) { return (v1.m_x * v2.m_y - v1.m_y * v2.m_x); } thvec2 operator * (const double & c, const thvec2 & v) { return thvec2(c * v.m_x, c * v.m_y); } thvec2 operator * (const thvec2 & v, const double & c) { return thvec2(v.m_x * c, v.m_y * c); } thvec2 operator / (const thvec2 & v, const double & c) { return thvec2(v.m_x / c, v.m_y / c); } thvec2 operator * (const thmat2 & m, const thvec2 & v) { return thvec2(m.m_xx * v.m_x + m.m_xy * v.m_y, m.m_yx * v.m_x + m.m_yy * v.m_y); } thmat2 operator * (const double & c, const thmat2 & m) { return thmat2(c * m.m_xx, c * m.m_xy, c * m.m_yx, c * m.m_yy); } thmat2 operator * (const thmat2 & m, const double & c) { return thmat2(c * m.m_xx, c * m.m_xy, c * m.m_yx, c * m.m_yy); } thmat2 operator / (const thmat2 & m, const double & c) { return thmat2(m.m_xx / c, m.m_xy / c, m.m_yx / c, m.m_yy / c); } void thvec2::normalize() { double l = this->length(); if (l > 0.0) *this /= this->length(); } thline2::thline2(thvec2 from, thvec2 to) { thvec2 norm; norm = to - from; norm.normalize(); this->m_a = - norm.m_y; this->m_b = norm.m_x; this->m_c = - (this->m_a * from.m_x + this->m_b * from.m_y); } thvec2::thvec2( thline2 & l1, thline2 & l2 ) { // | m_xx m_xy | * | x | = | -c1 | // | m_yx m_yy | | y | | -c2 | thmat2 m( l1.m_a, l1.m_b, l2.m_a, l2.m_b ); thmat2 m_1 = m.inverse(); m_x = - ( m_1.m_xx * l1.m_c + m_1.m_xy * l2.m_c ); m_y = - ( m_1.m_yx * l1.m_c + m_1.m_yy * l2.m_c ); } double thline2::eval(thvec2 p) { return (p.m_x * this->m_a + p.m_y * this->m_b + this->m_c); } void thmat3::reset() { m_xx = 1.0; m_xy = 0.0; m_xz = 0.0; m_yx = 0.0; m_yy = 1.0; m_yz = 0.0; m_zx = 0.0; m_zy = 0.0; m_zz = 1.0; } thmat3 thmat3::inverse() { thmat3 minor; minor.m_xx = m_yy * m_zz - m_yz * m_zy; minor.m_xy = m_yx * m_zz - m_yz * m_zx; minor.m_xz = m_yx * m_zy - m_yy * m_zx; minor.m_yx = m_xy * m_zz - m_xz * m_zy; minor.m_yy = m_xx * m_zz - m_xz * m_zx; minor.m_yz = m_xx * m_zy - m_xy * m_zx; minor.m_zx = m_xy * m_yz - m_xz * m_yy; minor.m_zy = m_xx * m_yz - m_xz * m_yx; minor.m_zz = m_xx * m_yy - m_xy * m_yx; double det = m_xx * minor.m_xx - m_xy * minor.m_xy + m_xz * minor.m_xz; return thmat3( minor.m_xx/det, -minor.m_yx/det, minor.m_zx/det, -minor.m_xy/det, minor.m_yy/det, -minor.m_zy/det, minor.m_xz/det, -minor.m_yz/det, minor.m_zz/det ); } void thlintrans::init(thmat2 A, thvec2 b) { this->m_fmat = A; this->m_shift = b; } void thlintrans::insert_point(thvec2 src, thvec2 dst) { this->m_initpts.push_back(thlintrans_pt(src, dst)); } void thlintrans::init_points() { // Initialize transformation using least squares. this->m_fmat.reset(); this->m_bmat.reset(); this->m_shift.reset(); this->m_scale = 1.0; this->m_rot = 0.0; size_t npt = this->m_initpts.size(); thlintrans_pt_list::iterator ipt; if (npt == 0) return; if (npt == 1) { ipt = this->m_initpts.begin(); this->m_shift = ipt->m_tgt - ipt->m_src; return; } // 1. najdeme transformaciu targetov for (ipt = this->m_initpts.begin(); ipt != this->m_initpts.end(); ipt++) { this->m_shift += ipt->m_tgt; } this->m_shift /= double(npt); double sumXx, sumYy, sumYx, sumXy, sumxx, sumyy, X, Y, a, b; sumXx = 0.0; sumYy = 0.0; sumYx = 0.0; sumXy = 0.0; sumxx = 0.0; sumyy = 0.0; for (ipt = this->m_initpts.begin(); ipt != this->m_initpts.end(); ipt++) { X = ipt->m_tgt.m_x - this->m_shift.m_x; Y = ipt->m_tgt.m_y - this->m_shift.m_y; sumXx += X * ipt->m_src.m_x; sumYy += Y * ipt->m_src.m_y; sumXy += X * ipt->m_src.m_y; sumYx += Y * ipt->m_src.m_x; sumxx += ipt->m_src.m_x * ipt->m_src.m_x; sumyy += ipt->m_src.m_y * ipt->m_src.m_y; } a = (sumXx + sumYy) / (sumxx + sumyy); b = (sumYx - sumXy) / (sumxx + sumyy); if (((sumxx + sumyy) > 0) && (hypot(a,b) > 0.0)) { this->m_fmat.m_xx = a; this->m_fmat.m_xy = -b; this->m_fmat.m_yx = b; this->m_fmat.m_yy = a; this->m_scale = hypot(a,b); this->m_rot = - atan2(b,a) / 3.14159265359 * 180.0; } } double thvec2::orientation() { double o = atan2(this->m_x, this->m_y) / 3.14159265359 * 180.0; if (o < 0.0) o += 360.0; return o; } void thlintrans::init(thvec2 src, thvec2 dst) { this->m_fmat.reset(); this->m_scale = 1.0; this->m_rot = 0.0; this->m_shift = dst - src; } void thlintrans::init(thvec2 srcF, thvec2 srcT, thvec2 dstF, thvec2 dstT) { thvec2 srcV, dstV; srcV = srcT - srcF; dstV = dstT - dstF; double r1, r2, rr, ss; r1 = atan2(srcV.m_y, srcV.m_x); r2 = atan2(dstV.m_y, dstV.m_x); rr = r2 - r1; ss = dstV.length() / srcV.length(); this->m_fmat = ss * thmat2(cos(rr), -sin(rr), sin(rr), cos(rr)); this->m_shift = dstF - this->m_fmat * srcF; this->m_scale = ss; this->m_rot = rr / 3.14159265358 * 180.0; } void thlintrans::init_backward() { this->m_bmat = this->m_fmat.inverse(); } thvec2 thlintrans::forward(thvec2 src) { return (this->m_fmat * src + this->m_shift); } thvec2 thlintrans::backward(thvec2 dst) { return (this->m_bmat * (dst - this->m_shift)); } double thvec2::length() { return hypot(this->m_x, this->m_y); } void thmorphtrans::insert_point(thvec2 src, thvec2 dst) { this->m_initpts.push_back(thlintrans_pt(src, dst - src)); } thvec2 thmorphtrans::forward(thvec2 src) { thlintrans_pt_list::iterator i; thvec2 sumv; double sumw(0.0), d, w; for(i = this->m_initpts.begin(); i != this->m_initpts.end(); i++) { d = (i->m_src - src).length(); if (d > 0.0) { w = 1.0 / (d * d); sumw += w; sumv += w * i->m_tgt; } else { return (src + i->m_tgt); } } sumv /= sumw; sumv += src; return sumv; } thvec2 thmorphtrans::backward(thvec2 dst, thvec2 ini) { #define EPS 0.01 #define FF(v) (dst - this->forward(v)).length() double F, a, b, d; thvec2 x(ini), dd; size_t counter(0); do { F = FF(x); if (F < EPS) break; a = (FF(x + thvec2(EPS, 0.0)) - F) / EPS; b = (FF(x + thvec2(0.0, EPS)) - F) / EPS; d = a * a + b * b; if (d == 0.0) break; dd = thvec2(a * F / d, b * F / d); x -= dd; } while (counter++ < 10); return x; } struct thm2t_point { thvec2 m_src, m_dst; bool m_used; long m_id; thm2t_point() : m_used(false), m_id(-1) {} thm2t_point(thvec2 src, thvec2 dst, long id) : m_src(src), m_dst(dst), m_used(false), m_id(id) {} }; typedef thm2t_point * thm2t_point_ptr; typedef std::map thm2t_point_ptr_map; typedef std::list thm2t_point_list; struct thm2t_line { long m_f, m_t; thm2t_line(long f, long t) { if (f < t) { this->m_f = f; this->m_t = t; } else { this->m_t = f; this->m_f = t; } } }; typedef thm2t_line * thm2t_line_ptr; bool operator < (const struct thm2t_line & l1, const struct thm2t_line & l2) { if (l1.m_f < l2.m_f) return true; if (l1.m_f > l2.m_f) return false; if (l1.m_t < l2.m_t) return true; return false; } typedef std::list thm2t_line_list; typedef std::map thm2t_line_map; struct thm2t_zoom_point { thvec2 m_src; double m_dst; long m_id; thm2t_zoom_point(thvec2 src, double dst, long id) : m_src(src), m_dst(dst), m_id(id) {} }; typedef std::list thm2t_zoom_point_list; struct thm2t_feature { bool m_single; thm2t_point_ptr m_fp, m_tp; thline2 m_ln, m_lnf, m_lnt; thlintrans m_lintrans; thlinzoomtrans m_zoomtrans; double calc_dist(thvec2 src); }; double thm2t_feature::calc_dist(thvec2 src) { double lnfd, lntd; if (this->m_single) { return (src - this->m_fp->m_src).length(); } else { lnfd = this->m_lnf.eval(src); lntd = this->m_lnt.eval(src); if (lnfd < 0) return (src - this->m_fp->m_src).length(); else if (lntd < 0) return (src - this->m_tp->m_src).length(); else return fabs(this->m_ln.eval(src)); } } typedef std::list thm2t_feature_list; struct thmorph2trans_members { thm2t_point_list m_points; thm2t_point_ptr_map m_point_map; thm2t_line_list m_lines; thm2t_line_map m_line_map; thm2t_point_ptr get_point(long id); thm2t_zoom_point_list m_zoom_points; thm2t_feature_list m_features; }; thm2t_point_ptr thmorph2trans_members::get_point(long id) { thm2t_point_ptr_map::iterator ii; ii = this->m_point_map.find(id); if (ii == this->m_point_map.end()) return NULL; else return ii->second; } thmorph2trans::thmorph2trans() { this->m = new thmorph2trans_members; this->reset(); } thmorph2trans::~thmorph2trans() { delete this->m; } void thmorph2trans::reset() { this->m_eps = 0.01; this->m->m_lines.clear(); this->m->m_points.clear(); this->m->m_point_map.clear(); this->m->m_zoom_points.clear(); this->m->m_features.clear(); } void thmorph2trans::insert_point(thvec2 src, thvec2 dst, long id) { thm2t_point_list::iterator i; i = this->m->m_points.insert(this->m->m_points.end(), thm2t_point(src, dst, id)); this->m->m_point_map[id] = &(*i); } void thmorph2trans::insert_zoom_point(thvec2 src, double dst, long id) { this->m->m_zoom_points.push_back(thm2t_zoom_point(src, dst, id)); } void thmorph2trans::insert_line(long from, long to) { thm2t_line tmp(from, to); thm2t_line_map::iterator mi; if (from == to) return; if ((this->m->get_point(from) == NULL) || (this->m->get_point(to) == NULL)) return; mi = this->m->m_line_map.find(tmp); if (mi == this->m->m_line_map.end()) { thm2t_line_ptr lp = &(*this->m->m_lines.insert(this->m->m_lines.end(), thm2t_line(from, to))); this->m->m_line_map[tmp] = lp; } } void thmorph2trans::init(double eps) { this->m->m_features.clear(); this->m_eps = eps; // initialize features thm2t_line_list::iterator iln; for(iln = this->m->m_lines.begin(); iln != this->m->m_lines.end(); iln++) { thm2t_feature tmpf; tmpf.m_fp = this->m->get_point(iln->m_f); tmpf.m_tp = this->m->get_point(iln->m_t); if ((tmpf.m_fp != NULL) && (tmpf.m_tp != NULL)) { if (((tmpf.m_fp->m_src - tmpf.m_tp->m_src).length() > 0.0) && ((tmpf.m_fp->m_dst - tmpf.m_tp->m_dst).length() > 0.0)) { tmpf.m_single = false; tmpf.m_ln = thline2(tmpf.m_fp->m_src, tmpf.m_tp->m_src); tmpf.m_lnf = thline2(tmpf.m_fp->m_src, tmpf.m_fp->m_src + thvec2(-tmpf.m_ln.m_a, -tmpf.m_ln.m_b)); tmpf.m_lnt = thline2(tmpf.m_tp->m_src, tmpf.m_tp->m_src + thvec2(tmpf.m_ln.m_a, tmpf.m_ln.m_b)); tmpf.m_lintrans.init(tmpf.m_fp->m_src, tmpf.m_tp->m_src, tmpf.m_fp->m_dst, tmpf.m_tp->m_dst); tmpf.m_fp->m_used = true; tmpf.m_tp->m_used = true; this->m->m_features.push_back(tmpf); } } } thm2t_point_list::iterator ipt, ipt2; for(ipt = this->m->m_points.begin(); ipt != this->m->m_points.end(); ipt++) { thm2t_feature tmpf; tmpf.m_fp = &(*ipt); tmpf.m_tp = NULL; if (!tmpf.m_fp->m_used) { // find nearest TP double md, cd; md = -1.0; for(ipt2 = this->m->m_points.begin(); ipt2 != this->m->m_points.end(); ipt2++) { if (ipt->m_id != ipt2->m_id) { cd = (ipt->m_dst - ipt2->m_dst).length(); if ((cd > 0.0) && ((ipt->m_src - ipt2->m_src).length() > 0.0)) { if (md < 0.0) { md = cd; tmpf.m_tp = &(*ipt2); } else if (cd < md) { md = cd; tmpf.m_tp = &(*ipt2); } } } } if (tmpf.m_tp == NULL) { tmpf.m_single = true; tmpf.m_lintrans.init(tmpf.m_fp->m_src, tmpf.m_fp->m_dst); } else { tmpf.m_single = false; tmpf.m_ln = thline2(tmpf.m_fp->m_src, tmpf.m_tp->m_src); tmpf.m_lnf = thline2(tmpf.m_fp->m_src, tmpf.m_fp->m_src + thvec2(-tmpf.m_ln.m_a, -tmpf.m_ln.m_b)); tmpf.m_lnt = thline2(tmpf.m_tp->m_src, tmpf.m_tp->m_src + thvec2(tmpf.m_ln.m_a, tmpf.m_ln.m_b)); tmpf.m_lintrans.init(tmpf.m_fp->m_src, tmpf.m_tp->m_src, tmpf.m_fp->m_dst, tmpf.m_tp->m_dst); tmpf.m_fp->m_used = true; tmpf.m_tp->m_used = true; } this->m->m_features.push_back(tmpf); } } // initialize zoom transformations thm2t_feature_list::iterator i; thm2t_zoom_point_list::iterator izp; for(i = this->m->m_features.begin(); i != this->m->m_features.end(); i++) { if (i->m_tp != NULL) i->m_zoomtrans.init_points(i->m_fp->m_dst, i->m_tp->m_dst); else i->m_zoomtrans.init_points(i->m_fp->m_dst, i->m_fp->m_dst); } for(izp = this->m->m_zoom_points.begin(); izp != this->m->m_zoom_points.end(); izp++) { for(i = this->m->m_features.begin(); i != this->m->m_features.end(); i++) { if (izp->m_id == i->m_fp->m_id) i->m_zoomtrans.init_from(this->forward(izp->m_src), izp->m_dst); if (i->m_tp != NULL) { if (izp->m_id == i->m_tp->m_id) i->m_zoomtrans.init_to(this->forward(izp->m_src), izp->m_dst); } } } for(i = this->m->m_features.begin(); i != this->m->m_features.end(); i++) { i->m_zoomtrans.init(); } } thvec2 thmorph2trans::forward(thvec2 src) { thm2t_feature_list::iterator i; thvec2 sumv, cdst; double sumw(0.0), d, w; for(i = this->m->m_features.begin(); i != this->m->m_features.end(); i++) { d = i->calc_dist(src); cdst = i->m_zoomtrans.forward(i->m_lintrans.forward(src)); if (d > 0.0) { w = 1.0 / (d * d * d * d); sumw += w; sumv += w * cdst; } else { return cdst; } } sumv /= sumw; return sumv; } thvec2 thmorph2trans::backward(thvec2 dst, thvec2 ini) { #define EPS 0.01 #define FF(v) (dst - this->forward(v)).length() double F, a, b, d; thvec2 x(ini), dd; size_t counter(0); do { F = FF(x); if (F < EPS) break; a = (FF(x + thvec2(EPS, 0.0)) - F) / EPS; b = (FF(x + thvec2(0.0, EPS)) - F) / EPS; d = a * a + b * b; if (d == 0.0) break; dd = thvec2(a * F / d, b * F / d); x -= dd; } while (counter++ < 10); return x; } void thmorph2trans::insert_lines_from_db() { long nst = (long) thdb.db1d.station_vec.size(); thdb1d_tree_node * nodes = thdb.db1d.get_tree_nodes(), * cnode; thdb1d_tree_arrow * carrow; // station by station and insert shots thm2t_point_list::iterator ipt; thdataleg * lg; long fid, tid; for(ipt = this->m->m_points.begin(); ipt != this->m->m_points.end(); ipt++) { if ((ipt->m_id > 0) && (ipt->m_id < nst)) { cnode = &(nodes[ipt->m_id - 1]); carrow = cnode->first_arrow; while (carrow != NULL) { lg = carrow->leg->leg; fid = thdb.db1d.station_vec[lg->from.id - 1].uid; tid = thdb.db1d.station_vec[lg->to.id - 1].uid; this->insert_line(fid, tid); carrow = carrow->next_arrow; } } } } thlinzoomtrans::thlinzoomtrans() { this->m_valid = false; this->m_single = true; this->m_fl = 0.0; this->m_fr = 0.0; this->m_tl = 0.0; this->m_tr = 0.0; this->m_flc = 0; this->m_frc = 0; this->m_tlc = 0; this->m_trc = 0; } void thlinzoomtrans::init_points(thvec2 from, thvec2 to) { this->m_from = from; this->m_to = to; thvec2 vec; vec = to - from; this->m_line_l = vec.length(); if (this->m_line_l > 0.0) { this->m_line = thline2(from, to); this->m_line_from = thline2(from, from + thvec2(vec.m_y, -vec.m_x)); this->m_orient_from = thvec2(vec.m_y, -vec.m_x).orientation(); this->m_line_to = thline2(to, to + thvec2(-vec.m_y, vec.m_x)); this->m_orient_to = thvec2(-vec.m_y, vec.m_x).orientation(); this->m_single = false; } else { this->m_single = true; } } void thlinzoomtrans::init_from(thvec2 src, double dst) { double l; l = (src - this->m_from).length(); if (l > 0.0) { if (this->m_single) { this->m_flc++; this->m_fl += (dst / l); } else { if (this->m_line.eval(src) > 0) { this->m_flc++; this->m_fl += (dst / l); } else { this->m_frc++; this->m_fr += (dst / l); } } } } void thlinzoomtrans::init_to(thvec2 src, double dst) { double l; l = (src - this->m_to).length(); if (l > 0.0) { if (this->m_single) { this->m_flc++; this->m_fl += (dst / l); } else { if (this->m_line.eval(src) > 0) { this->m_tlc++; this->m_tl += (dst / l); } else { this->m_trc++; this->m_tr += (dst / l); } } } } void thlinzoomtrans::init() { if ((this->m_flc > 0) || (this->m_frc > 0) || (this->m_tlc > 0) || (this->m_trc > 0)) { this->m_valid = true; if (this->m_flc > 0) this->m_fl /= double(this->m_flc); else this->m_fl = 1.0; if (this->m_frc > 0) this->m_fr /= double(this->m_frc); else this->m_fr = 1.0; if (this->m_tlc > 0) this->m_tl /= double(this->m_tlc); else this->m_tl = 1.0; if (this->m_trc > 0) this->m_tr /= double(this->m_trc); else this->m_tr = 1.0; //if ((this->m_flc == 0) && (this->m_frc == 0)) { // this->m_fl = 1.0; // this->m_fr = 1.0; //} else if ((this->m_flc == 0) && (this->m_frc > 0)) { // this->m_fl = this->m_fr; //} else if ((this->m_flc > 0) && (this->m_frc == 0)) { // this->m_fr = this->m_fl; //} //if ((this->m_tlc == 0) && (this->m_trc == 0)) { // this->m_tl = 1.0; // this->m_tr = 1.0; //} else if ((this->m_tlc == 0) && (this->m_trc > 0)) { // this->m_tl = this->m_tr; //} else if ((this->m_tlc > 0) && (this->m_trc == 0)) { // this->m_tr = this->m_tl; //} } } thvec2 thlinzoomtrans::forward(thvec2 src) { if (this->m_valid) { thvec2 vec; double vo; if (this->m_single) { vec = src - this->m_from; vec *= this->m_fl; return (src + vec); } else { double dl, dlf, dlt; dl = this->m_line.eval(src); dlf = this->m_line_from.eval(src); dlt = this->m_line_to.eval(src); if (dlf < 0.0) { vec = src - this->m_from; vo = vec.orientation() - this->m_orient_from; if (vo < 0.0) vo += 360.0; vo /= 180.0; vec *= (vo * this->m_fl + (1.0 - vo) * this->m_fr); return this->m_from + vec; } else if (dlt < 0.0) { vec = src - this->m_to; vo = this->m_orient_to - vec.orientation() - 180.0; if (vo < 0.0) vo += 360.0; vo /= 180.0; vec *= (vo * this->m_tl + (1.0 - vo) * this->m_tr); return this->m_to + vec; } else { thvec2 lp; double ln; ln = this->m_line.m_a * this->m_line.m_a + this->m_line.m_b * this->m_line.m_b; lp = thvec2(src.m_x - this->m_line.m_a * dl / ln, src.m_y - this->m_line.m_b * dl / ln); vo = this->m_line.eval(lp); vec = src - lp; vo = (lp - this->m_from).length() / this->m_line_l; if (dl > 0) { vec *= (vo * this->m_tl + (1.0 - vo) * this->m_fl); } else { vec *= (vo * this->m_tr + (1.0 - vo) * this->m_fr); } return lp + vec; } } } else { return src; } } therion/thattr.cxx0000664000175000017500000005145512065355776013332 0ustar useruser/** * @file thattr.cxx */ /* Copyright (C) 2007 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thattr.h" #include "extern/shapefil.h" #include "thexception.h" #include "thchenc.h" #include #include #include #ifdef THMSVC #define snprintf _snprintf #define strcasecmp _stricmp #endif thattr::thattr() { this->m_num_fields = 0; this->m_num_objects = 0; this->m_obj_last = NULL; } bool thattr_attr::has_flag(unsigned long flag) { return ((this->m_flags & flag) != 0); } void thattr_attr::set_flag(unsigned long flag, bool value) { if (value) this->m_flags |= flag; else this->m_flags &= (~flag); } void thattr_obj::set_tree_level(size_t level) { m_tree_level = level; } thattr_field * thattr::insert_field(const char * name) { thattr_field tmp, * r; tmp.m_id = this->m_num_fields++; tmp.m_name = name; tmp.m_parent = this; r = &(*this->m_field_list.insert(this->m_field_list.end(), tmp)); for(size_t i = 0; i < tmp.m_name.size(); ++i) tmp.m_name[i] = tolower(tmp.m_name[i]); this->m_field_map[tmp.m_name] = r; return r; } thattr_field * thattr::get_field(const char * name, bool ins) { thattr_name2field_map::iterator it; std::string str(name); for(size_t i = 0; i < str.size(); ++i) str[i] = tolower(str[i]); it = this->m_field_map.find(str); if (it == this->m_field_map.end()) { if (!ins) return NULL; else { return this->insert_field(name); } } else return it->second; } thattr_obj * thattr::get_object() { return this->m_obj_last; } thattr_obj * thattr::get_object(long user_id) { if ((this->m_obj_last != NULL) && (this->m_obj_last->m_user_id == user_id)) return this->m_obj_last; thattr_usrid2obj_map::iterator it; it = this->m_obj_usrmap.find(user_id); if (it == this->m_obj_usrmap.end()) return NULL; else return it->second; } thattr_obj * thattr::insert_object(void * data, long user_id) { thattr_obj tmp, * r; r = NULL; if (user_id >= 0) { r = this->get_object(user_id); } if (r == NULL) { tmp.m_id = this->m_num_objects++; tmp.m_data = data; tmp.m_parent = this; r = &(*this->m_obj_list.insert(this->m_obj_list.end(), tmp)); this->m_obj_map[tmp.m_id] = r; if (user_id > -1) { r->m_user_id = user_id; this->m_obj_usrmap[user_id] = r; } } this->m_obj_last = r; return r; } void thattr::insert_attribute(const char * name, thattr_attr & attr, long user_id) { // Find object. thattr_obj * o; if (user_id < 0) o = this->m_obj_last; else o = this->get_object(user_id); if (o == NULL) return; // Find field. thattr_field * f = this->get_field(name, true); // Insert attribute. if ((attr.m_type == THATTR_STRING) && (attr.m_val_string.length() == 0)) { o->m_attributes.erase(f->m_id); } else { attr.m_field = f; attr.m_obj = o; o->m_attributes[f->m_id] = attr; o->m_last_attribute = &(o->m_attributes[f->m_id]); } } thattr_attr * thattr::get_attribute() { thattr_obj * o = this->m_obj_last; if (o == NULL) return NULL; thattr_attr * a = o->m_last_attribute; return a; } void thattr::insert_attribute(const char * name, const char * value, long user_id) { int sv(0); long lv(0); double d(0.0); thattr_attr a; a.m_type = THATTR_STRING; // cast value type if ((value != NULL) && (strlen(value) > 0)) { thparse_double(sv, d, value); if (sv == TT_SV_NUMBER) { a.m_type = THATTR_DOUBLE; lv = long(d); if (double(lv) == d) { a.m_type = THATTR_INTEGER; } } } // insert attribute switch (a.m_type) { case THATTR_INTEGER: a.m_val_long = lv; break; case THATTR_DOUBLE: a.m_val_double = d; break; case THATTR_STRING: if (value != NULL) a.m_val_string = std::string(value); else a.m_val_string = std::string(""); break; } this->insert_attribute(name, a, user_id); } void thattr::insert_attribute(const char * name, double value, long user_id) { thattr_attr a; a.m_type = THATTR_DOUBLE; a.m_val_double = value; this->insert_attribute(name, a, user_id); } void thattr::insert_attribute(const char * name, long value, long user_id) { thattr_attr a; a.m_type = THATTR_INTEGER; a.m_val_long = value; this->insert_attribute(name, a, user_id); } void thattr::copy_attributes(thattr_obj * object, long user_id) { if (object == NULL) return; thattr_id2attr_map::iterator it; it = object->m_attributes.begin(); thattr_attr tmp; while (it != object->m_attributes.end()) { tmp = it->second; this->insert_attribute(it->second.m_field->m_name.c_str(), tmp, user_id); ++it; } } std::string expdbf_field_name(std::string name, std::set & fset) { std::string nn; nn = name; int i; char x[20]; if (nn.length() > 11) { do { i = 0; sprintf(x, "%d", i); nn = name.substr(0, 10 - strlen(x)); nn += "_"; nn += x; i++; } while (fset.find(nn) != fset.end()); } fset.insert(nn); return nn; } void thattr::analyze_fields() { // modify record names to match DBF format size_t i; std::set fnset; thattr_field * cf; thattr_field_list::iterator fli; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); cf->m_type = THATTR_INTEGER; cf->m_present = false; cf->m_xdbf_decimals = 0; cf->m_xdbf_width = 1; cf->m_xdbf_name = expdbf_field_name(cf->m_name, fnset); if (cf->m_double_format.empty()) cf->m_double_format = "%.1f"; cf->m_xmp_name = "ATTR_"; cf->m_xmp_name += cf->m_name; for(i = 5; i < cf->m_xmp_name.size(); ++i) { if (cf->m_xmp_name[i] <= '9') cf->m_xmp_name[i] = cf->m_xmp_name[i] + 8; else if ((cf->m_xmp_name[i] < 'a')) cf->m_xmp_name[i] = tolower(cf->m_xmp_name[i]); } cf->m_maxs = 0; } // check record types and limits long cvall; double cvald; size_t cslen; int ctype; char b[64]; thattr_attr * ca; thattr_obj_list::iterator oi; thattr_id2attr_map::iterator ai; for(oi = this->m_obj_list.begin(); oi != this->m_obj_list.end(); ++oi) { for(ai = oi->m_attributes.begin(); ai != oi->m_attributes.end(); ai++) { ca = &(ai->second); cf = ca->m_field; ctype = ca->m_type; switch (ctype) { case THATTR_INTEGER: cvall = ca->m_val_long; ca->m_val_double = double(cvall); sprintf(b,"%ld", cvall); ca->m_val_string = b; break; case THATTR_DOUBLE: cvald = ai->second.m_val_double; ca->m_val_long = long(cvald); sprintf(b,"%f", cvald); ca->m_val_string = b; if (cf->m_type == THATTR_INTEGER) cf->m_type = THATTR_DOUBLE; break; case THATTR_STRING: if ((cf->m_type == THATTR_INTEGER) || (cf->m_type == THATTR_DOUBLE)) cf->m_type = THATTR_STRING; break; } cslen = ca->m_val_string.length(); if ((!cf->m_present) && ((ctype == THATTR_INTEGER) || (ctype == THATTR_DOUBLE))) { cf->m_maxd = ca->m_val_double; cf->m_mind = ca->m_val_double; cf->m_maxi = ca->m_val_long; cf->m_mini = ca->m_val_long; } cf->m_present = true; if (cslen > cf->m_maxs) cf->m_maxs = cslen; if ((ctype == THATTR_INTEGER) || (ctype == THATTR_DOUBLE)) { if (cf->m_maxd < ca->m_val_double) cf->m_maxd = ca->m_val_double; if (cf->m_mind > ca->m_val_double) cf->m_mind = ca->m_val_double; if (cf->m_maxi < ca->m_val_long) cf->m_maxi = ca->m_val_long; if (cf->m_mini > ca->m_val_long) cf->m_mini = ca->m_val_long; } } } // postprocess fields #define myabs(x) ((x) > 0 ? (x) : ((x) < 0 ? -(x) : 1)) int w2; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); switch (cf->m_type) { case THATTR_INTEGER: cf->m_xdbf_decimals = 0; cf->m_xdbf_width = (int) log10(double(myabs(cf->m_maxi))); w2 = (int) log10(double(myabs(cf->m_mini))); if (cf->m_xdbf_width < w2) cf->m_xdbf_width = w2; ++cf->m_xdbf_width; break; case THATTR_DOUBLE: cf->m_xdbf_width = (int) log10(myabs(cf->m_maxd)); w2 = (int) log10(myabs(cf->m_mind)); if (cf->m_xdbf_width < w2) cf->m_xdbf_width = w2; ++cf->m_xdbf_width; cf->m_xdbf_decimals = 0; if (cf->m_xdbf_width < 12) { cf->m_xdbf_decimals = 12 - cf->m_xdbf_width; cf->m_xdbf_width = 12; } break; case THATTR_STRING: cf->m_xdbf_width = int(cf->m_maxs + 1); break; } } } void thattr::export_dbf(const char * fname, int encoding) { // Create file. DBFHandle h; thattr_attr * ca; thattr_field * cf; thattr_obj_list::iterator oi; thattr_id2attr_map::iterator ai; thattr_field_list::iterator fli; thbuffer enc; this->analyze_fields(); h = DBFCreate(fname); if (h == NULL) { thwarning(("unable to open file for output -- %s", fname)); return; } // Create fields. DBFFieldType ftype(FTInvalid); for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); switch (cf->m_type) { case THATTR_INTEGER: ftype = FTInteger; break; case THATTR_DOUBLE: ftype = FTDouble; break; case THATTR_STRING: ftype = FTString; break; } cf->m_xdbf_field = DBFAddField(h, cf->m_xdbf_name.c_str(), ftype, cf->m_xdbf_width, cf->m_xdbf_decimals); if (cf->m_xdbf_field == -1) { thwarning(("error writing to %s", fname)) goto EXPORT_DBF_EXIT; } } // Insert objects and write fields. for(oi = this->m_obj_list.begin(); oi != this->m_obj_list.end(); ++oi) { for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); ai = oi->m_attributes.find(cf->m_id); if (ai == oi->m_attributes.end()) { DBFWriteNULLAttribute(h, (int) oi->m_id, cf->m_xdbf_field); } else { ca = &(ai->second); switch (cf->m_type) { case THATTR_INTEGER: DBFWriteIntegerAttribute(h, (int) oi->m_id, cf->m_xdbf_field, (int) ca->m_val_long); break; case THATTR_DOUBLE: DBFWriteDoubleAttribute(h, (int) oi->m_id, cf->m_xdbf_field, ca->m_val_double); break; case THATTR_STRING: thdecode(&enc, encoding, ca->m_val_string.c_str()); DBFWriteStringAttribute(h, (int) oi->m_id, cf->m_xdbf_field, enc.get_buffer()); //DBFWriteStringAttribute(h, (int) oi->m_id, cf->m_xdbf_field, ca->m_val_string.c_str()); break; } } } } // Close DBF file. EXPORT_DBF_EXIT: DBFClose(h); } void thattr::export_mp_header(FILE * f) { if (this->m_num_fields == 0) return; this->analyze_fields(); } void thattr::export_mp_object_begin(FILE * f, long user_id) { if (this->m_num_fields == 0) return; thattr_obj * o = this->get_object(user_id); if (o == NULL) return; if (f == NULL) return; thattr_attr * ca; thattr_field * cf; thattr_id2attr_map::iterator ai; thattr_field_list::iterator fli; thbuffer enc; std::string news; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); ai = o->m_attributes.find(cf->m_id); if (ai != o->m_attributes.end()) { ca = &(ai->second); news = ca->m_val_string; thdecode_mp(&enc, news.c_str()); fprintf(f,"string %s;\n", cf->m_xmp_name.c_str()); fprintf(f,"%s := \"%s\";\n", cf->m_xmp_name.c_str(), enc.get_buffer()); } } } void thattr::export_mp_object_end(FILE * f, long user_id) { if (this->m_num_fields == 0) return; thattr_obj * o = this->get_object(user_id); if (o == NULL) return; if (f == NULL) return; thattr_field * cf; thattr_id2attr_map::iterator ai; thattr_field_list::iterator fli; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); ai = o->m_attributes.find(cf->m_id); if (ai != o->m_attributes.end()) { fprintf(f,"save %s;\n", cf->m_xmp_name.c_str()); } } } void thattr::export_txt(const char * fname, int encoding) { // Create file. FILE * f; unsigned i; thattr_attr * ca; thattr_field * cf; thattr_obj_list::iterator oi; thattr_id2attr_map::iterator ai; thattr_field_list::iterator fli; thbuffer enc; this->analyze_fields(); f = fopen(fname, "w"); if (f == NULL) { thwarning(("unable to open file for output -- %s", fname)); return; } // Create fields. bool hasone = false; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); fprintf(f,"%s%s",hasone ? "\t" : "",fli->m_name.c_str()); hasone = true; } fprintf(f,"\n"); // Insert objects and write fields. const char * value; for(oi = this->m_obj_list.begin(); oi != this->m_obj_list.end(); ++oi) { hasone = false; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); ai = oi->m_attributes.find(cf->m_id); if (ai == oi->m_attributes.end()) { value = ""; } else { ca = &(ai->second); value = ca->m_val_string.c_str(); } if (m_tree && (!hasone)) { for(i = 0; i < oi->m_tree_level; i++) fprintf(f," "); } fprintf(f,"%s%s",hasone ? "\t" : "",value); hasone = true; } fprintf(f,"\n"); } fclose(f); } void thattr::export_kml(const char * fname, const char * name_field) { // Create file. FILE * f; thattr_attr * ca; thattr_field * cf; thattr_obj_list::iterator oi, oinext; thattr_id2attr_map::iterator ai; thattr_field_list::iterator fli; thbuffer enc; this->analyze_fields(); thattr_field * lat = get_field("Latitude", false), * lon = get_field("Longitude", false), * alt = get_field("Altitude", false), * namef = get_field(name_field, false); double dlon, dlat, dalt; if ((lat == NULL) || (lon == NULL)) { thwarning(("geographical reference is not associated with table")); return; } f = fopen(fname, "w"); if (f == NULL) { thwarning(("unable to open file for output -- %s", fname)); return; } fprintf(f,"\n\n\n"); fprintf(f,"Therion KML export\nTherion KML export.\n"); // Insert objects and write fields. const char * value; bool hasone; int clevel, nlevel; clevel = 0; for(oi = this->m_obj_list.begin(); oi != this->m_obj_list.end();) { oinext = oi; oinext ++; if ((oinext != this->m_obj_list.end()) && (oinext->m_tree_level > oi->m_tree_level)) { ai = oi->m_attributes.find(namef->m_id); fprintf(f,"\n%s\n",ai->second.m_val_string.c_str()); clevel++; } else { ai = oi->m_attributes.find(lat->m_id); dlat = ai->second.m_val_double; ai = oi->m_attributes.find(lon->m_id); dlon = ai->second.m_val_double; ai = oi->m_attributes.find(alt->m_id); dalt = ai->second.m_val_double; if (namef != NULL) ai = oi->m_attributes.find(namef->m_id); fprintf(f,"\n%s\n\n%.14f,%.14f,%.14f\n\n\n", (namef != NULL) ? ai->second.m_val_string.c_str() : "", dlon, dlat, dalt); } //for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { // cf = &(*fli); // ai = oi->m_attributes.find(cf->m_id); // if (ai == oi->m_attributes.end()) { // value = ""; // } else { // ca = &(ai->second); // value = ca->m_val_string.c_str(); // } // fprintf(f,"%s%s",hasone ? "\t" : "",value); //} oi++; nlevel = 0; if (oi != this->m_obj_list.end()) nlevel = oi->m_tree_level; while (nlevel < clevel) { fprintf(f,"\n"); clevel--; } } fprintf(f,"\n\n"); fclose(f); } void thattr::export_html(const char * fname, int encoding) { // Create file. FILE * f; thattr_attr * ca; thattr_field * cf; thattr_obj_list::iterator oi, oinext; thattr_id2attr_map::iterator ai; thattr_field_list::iterator fli; thbuffer enc; const char * alstr; this->analyze_fields(); f = fopen(fname, "w"); if (f == NULL) { thwarning(("unable to open file for output -- %s", fname)); return; } // Create fields. fprintf(f,"\n\ntherion table output\n" "\n" "\n" "\n" "\n\n"); fprintf(f,"\n"); for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); if ((cf->m_type == THATTR_DOUBLE) || (cf->m_type == THATTR_INTEGER)) { alstr = "right"; } else { alstr = "left"; } fprintf(f,"", alstr, fli->m_name.c_str()); } fprintf(f,"\n"); // Insert objects and write fields. const char * value; bool header_value; thbuffer valb; valb.guarantee(128); std::string value_plus; for(oi = this->m_obj_list.begin(); oi != this->m_obj_list.end(); ++oi) { fprintf(f,"", oi->m_tree_node_id); header_value = true; for(fli = this->m_field_list.begin(); fli != this->m_field_list.end(); ++fli) { cf = &(*fli); if ((cf->m_type == THATTR_DOUBLE) || (cf->m_type == THATTR_INTEGER)) { alstr = "right"; } else { alstr = "left"; } ai = oi->m_attributes.find(cf->m_id); ca = NULL; if (ai == oi->m_attributes.end()) { value = " "; } else { ca = &(ai->second); if (ca->m_type == THATTR_DOUBLE) { snprintf(valb.get_buffer(), 127, cf->m_double_format.c_str(), ca->m_val_double); value = valb.get_buffer(); } else value = ca->m_val_string.c_str(); } fprintf(f,"", value); header_value = false; } fprintf(f,"\n"); } fprintf(f,"
%s
m_tree_level); oinext = oi; oinext++; if ((oinext != this->m_obj_list.end()) && (oinext->m_tree_level > oi->m_tree_level)) { value_plus = "m_tree_node_id; value_plus += "')\">"; value_plus += value; value_plus += ""; value = value_plus.c_str(); } } if ((ca != NULL) && (ca->has_flag(THATTRFLAG_HIDDEN))) fprintf(f," style=\"color:#808080\""); fprintf(f,">%s
\n"); fprintf(f,"\n\n"); fclose(f); } therion/thexpshp.h0000664000175000017500000000475610721230752013275 0ustar useruser/** * @file thexpshp.h * Shapefile export classes. */ /* Copyright (C) 2007 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexpshp_h #define thexpshp_h #include #include "thscrap.h" #include "thpoint.h" #include "thline.h" #include "tharea.h" #include "thattr.h" #include "thdb2d.h" struct thexpshpf_data { double m_x, m_y, m_z, m_m; thexpshpf_data(double x, double y, double z, double m) : m_x(x), m_y(y), m_z(z), m_m(m) {} }; struct thexpshpf_part { int m_type, m_start; }; // Shapefile module struct thexpshpf { const char * m_fnm, * m_fpath; struct thexpshp * m_xshp; bool m_is_open; int m_type; size_t m_num_objects; SHPHandle m_hndl; thattr m_attributes; thexpshpf(); void init(struct thexpshp * xshp, const char * fnm, int type); bool open(); void close(); std::list m_point_list; std::list m_part_list; int m_object_id; void object_clear(); void object_insert(); bool m_ring_outer; std::list m_ring_list; void point_insert(double x, double y, double z, double m = 0.0); void polygon_start_ring(bool outer); void polygon_insert_line(thline * ln, bool reverse); void polygon_close_ring(); void tristrip_start(); }; // Shapefile export structure. struct thexpshp { const char * m_dirname; thdb2dprj * m_xproj; thexpshpf m_fscrap, m_fpoints, m_flines, m_fareas; thexpshpf m_fstations3D, m_fshots3D, m_fwalls3D; class thexpmap * m_expmap; class thexpmodel * m_expmodel; thexpshp(); bool open(const char * dirname); void xscrap2d(thscrap * scrap, thdb2dxm * xmap, thdb2dxs * xbasic); void close(); }; #endif therion/thexporter.cxx0000664000175000017500000001007510751762774014221 0ustar useruser/** * @file thexporter.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexporter.h" #include "thexception.h" #include "thconfig.h" #include "thdatabase.h" #include "thexpmodel.h" #include "thexpmap.h" #include "thexpdb.h" #include "thexpsys.h" #include "thexptable.h" #include thexporter::thexporter() { this->cfgptr = NULL; } thexporter::~thexporter() { thexporter_list::iterator ii; for(ii = this->xlist.begin(); ii != this->xlist.end(); ii++) { delete (*ii); } } void thexporter::assign_config(class thconfig * cptr) { this->cfgptr = cptr; } void thexporter::parse_system(char * system_cmd) { if (strlen(system_cmd) == 0) ththrow(("empty system command not allowed")) thexpsys * xp; xp = new thexpsys; xp->src.name = thdb.strstore(thcfg.get_cfg_file()->get_cif_name(),true); xp->src.line = thcfg.get_cfg_file()->get_cif_line_number(); xp->assign_config(this->cfgptr); xp->cmd = thdb.strstore(system_cmd, false); this->xlist.push_back(xp); } void thexporter::parse_export(int nargs, char ** args) { thexport * xp; int expmode; if (nargs < 1) ththrow(("not enough export arguments")) expmode = thmatch_token(args[0], thtt_exporter); switch (expmode) { case TT_EXP_MODEL: xp = new thexpmodel; xp->export_mode = expmode; break; case TT_EXP_DATABASE: xp = new thexpdb; xp->export_mode = expmode; break; case TT_EXP_CONTLIST: case TT_EXP_SURVEYLIST: case TT_EXP_CAVELIST: xp = new thexptable; xp->export_mode = expmode; break; case TT_EXP_MAP: case TT_EXP_ATLAS: xp = new thexpmap; xp->export_mode = expmode; break; default: ththrow(("unsupported export type -- %s", args[0])) } xp->src.name = thdb.strstore(thcfg.get_cfg_file()->get_cif_name(),true); xp->src.line = thcfg.get_cfg_file()->get_cif_line_number(); // take care of layout revision switch (expmode) { case TT_EXP_MAP: case TT_EXP_ATLAS: thdb.revision_set.insert(threvision(thdb.objid,0,xp->src)); break; } nargs--; args++; xp->assign_config(this->cfgptr); xp->parse(nargs, args); this->xlist.push_back(xp); } void thexporter::dump_export(FILE * xf) { thexporter_list::iterator ii; if ((!this->xlist.empty()) && (!this->cfgptr->get_comments_skip())) fprintf(xf,"# Export settings.\n"); for(ii = this->xlist.begin(); ii != this->xlist.end(); ii++) { (*ii)->dump(xf); } if (!this->xlist.empty()) fprintf(xf,"\n"); } void thexporter::export_db(class thdatabase * dp) { thexporter_list::iterator ii; // najprv spracujeme projekcie for(ii = this->xlist.begin(); ii != this->xlist.end(); ii++) { switch ((*ii)->export_mode) { case TT_EXP_MAP: case TT_EXP_ATLAS: ((thexpmap*)(*ii))->parse_projection(dp); } } // exportujeme for(ii = this->xlist.begin(); ii != this->xlist.end(); ii++) { switch ((*ii)->export_mode) { case TT_EXP_MAP: case TT_EXP_ATLAS: thexporter_quick_map_export = false; (*ii)->process_db(dp); break; default: (*ii)->process_db(dp); break; } } } bool thexporter_quick_map_export; therion/TODO.M0000664000175000017500000001055111465545200012135 0ustar useruser------------------- nastavitelny okraj vyplne pod legendou (0 pre map-image!) metapost: warningy len v debug mode; interaktivny mod pre -d (s vysvetlenim v thbooku, ktore premenne pouzit) do thbooku vysvetlenie o debugovani MP (mail muttonovi 15.1.09 zvacsovanie fontov v suradniciach pri reze grid vpravo pretrca cez mapu (postupne skladanie) v atlase nie je moznost pouzit mierku a sever pred vlozenim map (formdef vkladat uz v data.tex) rozmery zrkadla sadzby zmenit len pre mapy, nie pre uvod a legendu mapy vseobecne: * pri farebnych labeloch stmavit odtien farby thpdf: * zoznam scrapov na danej strane v atlase -> z toho registre * register pouzitych nazvov - z blokov - z vrstiev * zhrnutie udajov o listoch na konci * k vrstve: meno vo vertikalnom smere alebo udaj o vyske * zanorene OCG * cisla stran a odkazov cez utf2tex * skontrolovat ci nezapisujem nadbytocne xobjecty kvoli vrstvam * podmienene nacitavanie scrapov v TeXu * dvojstrankovy mod (Title vzdy na pravej strane), vtedy akceptovat: * vkladanie prazdnych stran (lepsie: atribut prava/lava pre stranu) * exclude pages a vkladanie prazdnych stran: mena namiesto cisel stran (?) * zrusit OwnPages option (jedine spolu s predch. -- problem s funkciou find_excluded_pages) -- namiesto cisla strany makro \getpage{.} zvacsi argument o hodnotu \the\pageno na 1. strane s mapou * 2. sokolie oko * vrstvy pod aktualnou: odlisit hlbku odtienmi sedej (?) * mody pre preview (ziadne, linkovane, vsetky) * vrstva `pri' pre atlas * co s posunom stran v rychlom mode thsvg: * pattern coloring using symbol-color - delete setgray and setrgbcolor when converting pattern body - extend structures to include pattcolor - use "inherit" color * uxivatelsky prefix pre ids * fonty - orezavacie cesty + vkladanie? * layers cez javascript * (priehladnost -> SVG 1.2) thconvert: * (dorobit) CONCAT + konverzia rozdelenych textovych riadkov * optimalizacia zmien fontov + gsave & al. thepsparse: * grid do 2d struktur thtexfonts: * upravit citanie glyphlistu aby podporovalo viac unicode hodnot * prepinanie fontov v makrach definovanych uzivatelom v TeXu a MP (equipment, continuation) aj pre cisla stran v atlase (tie cez utf2tex) * optimalizacia zmien fontov (delenie slov!) * doplnit kvazi HTML znackovanie vstupnych retazcov tex: * sipka na sever je zbytocna pri priecnom a rozvinutom reze. V ich pripade by tam mal byt nejaky identifikator projekcie * northarrow do atlasu? mpost: * konfigurovatelna velkost textu v mierke a velkost sipky na sever * point stalctites,stalagmites, via-ferrata * gradientny prechod pre areas * poriesit odsadenie bodovych znaciek a najma labelov * dorobit aby fungovalo predefinovanie u,v,w - pri presumed wall, patternoch * initialize(Scale) nepomaha na lejble v legende -- prepisovanie mptexpre.tex? * color map-bg do legendboxov (hadam fg; co ak je fg farbene rozne?) thbook: * varovania texu a metapostu * obrazky mapovych znaciek ----- prezitky dob minulych ----- * mod pre _velke_ mapy (>10MB): scrapy vysadzat do samostatneho suboru a z dalsieho na ne odkazovat pomocou Reference XObject forms -> nefunguje v AR5 --------------------------------- hotovo: * point snow * line rope * area snow, ice, clay * opr. area debris, sand, line debris; dopln. ostatne nedef, equipment, sipka na sever * ramik a stvorcova siet (kriziky): vylepsit alebo cez MetaPost (do uvahy aj convergence) * vypnit miesto pod legendou bg farbou * text vo farbe scrapov * suradnice ku gridu * labels ku kladu listov * velkost gridu (suradnic) urcit pred zvacsenim plochy podla page-gridu * --print-symbols: nepodchyti vsetky patterny (nie vsetky znacky v LEGENDLISTE? -- chybaju v ALL_PATTERNS) * systemove farbenie znaciek * fixed bug with missing patterns in symbols.xhtml * fixed inaccurate clipping of coloured scrap background * fixed placement of surface bitmaps with larger offset * added white fill below cave passages in transparent PDFs if background colour is white (needed if the map is included into other map with non-white background) * fixed alignment of some point symbols in AUT symbol set * new layout option 'color map-bg transparent' to omit page background * fixed incorrect line width conversion in some patterns * hide white background of scraps when the PDF layer containing them is invisible therion/thdb2d.cxx0000664000175000017500000033274212046525332013156 0ustar useruser/** * @file thdb2d.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2d.h" #include "thexception.h" #include "thdatabase.h" #include "thparse.h" #include "thtfangle.h" #include "tharea.h" #include "thmap.h" #include "thjoin.h" #include "thpoint.h" #include "thline.h" #include "thscrap.h" #include "thsurvey.h" #include "thlogfile.h" #include #include "thlayout.h" #include "thexpmap.h" #include "thconfig.h" #include "thtrans.h" #include "thtmpdir.h" #include "thinit.h" #include #include #ifndef THMSVC #include #else #include #define getcwd _getcwd #define chdir _chdir #define putenv _putenv #define hypot _hypot #endif #ifdef THMSVC #define hypot _hypot #endif class thprjx_link { public: thdb2dcp * from_cp, * to_cp; class thprjx_scrap * from_scrap, * to_scrap; thprjx_link * next_link, * prev_link, * oposite_link; thprjx_link() : from_cp(NULL), to_cp(NULL), from_scrap(NULL), to_scrap(NULL), next_link(NULL), prev_link(NULL), oposite_link(NULL) {} }; class thprjx_scrap { public: bool is_attached; thscrap * scrap; thprjx_scrap * prev_scrap; thprjx_link * via_link; double viacpx, viacpy, viacpz; thprjx_link * first_link, * last_link; thprjx_scrap() : is_attached(false), scrap(NULL), prev_scrap(NULL), via_link(NULL), first_link(NULL), last_link(NULL) {} }; class thprjx_station { public: unsigned long nstations; class thprjx_station_link * first_link, * last_link; thprjx_station() : nstations(0), first_link(NULL), last_link(NULL) {} }; class thprjx_station_link { public: thdb2dcp * scrapcp; thprjx_scrap * scrap; thprjx_station_link * next_link; thprjx_station_link() : scrapcp(NULL), scrap(NULL), next_link(NULL) {} }; bool operator < (const struct thdb2d_udef & u1, const struct thdb2d_udef & u2) { if (u1.m_command < u2.m_command) return true; if (u1.m_command > u2.m_command) return false; return (strcmp(u1.m_type, u2.m_type) < 0); } bool operator == (const struct thdb2d_udef & u1, const struct thdb2d_udef & u2) { if ((u1.m_command == u2.m_command) && (strcmp(u1.m_type, u2.m_type) == 0)) return true; else return false; } thdb2d::thdb2d() { this->db = NULL; this->processed_area_outlines = false; this->prj_lid = 0; thdb2dprjpr dpr = this->parse_projection("plan"); this->prj_default = dpr.prj; this->m_udef_map.clear(); } thdb2d::~thdb2d() { } void thdb2d::assigndb(thdatabase * dbptr) { this->db = dbptr; } void thdb2d_rot_align(int & align, double rot) { double o; switch (align) { case TT_POINT_ALIGN_T: o = 0.0; break; case TT_POINT_ALIGN_B: o = 180.0; break; case TT_POINT_ALIGN_L: o = 270.0; break; case TT_POINT_ALIGN_R: o = 90.0; break; case TT_POINT_ALIGN_TL: o = 315.0; break; case TT_POINT_ALIGN_BL: o = 225.0; break; case TT_POINT_ALIGN_TR: o = 45.0; break; case TT_POINT_ALIGN_BR: o = 135.0; break; default: return; } o += rot; if (o < 0.0) { o += 360.0; } else if (o >= 360.0) { o -= 360.0; } if ((o >= 337.5) || (o <= 22.5)) align = TT_POINT_ALIGN_T; else if ((o >= 67.5) && (o <= 112.5)) align = TT_POINT_ALIGN_R; else if ((o >= 157.5) && (o <= 202.5)) align = TT_POINT_ALIGN_B; else if ((o >= 247.5) && (o <= 292.5)) align = TT_POINT_ALIGN_L; else if ((o > 22.5) && (o < 67.5)) align = TT_POINT_ALIGN_TR; else if ((o > 112.5) && (o < 157.5)) align = TT_POINT_ALIGN_BR; else if ((o > 202.5) && (o < 247.5)) align = TT_POINT_ALIGN_BL; else if ((o > 292.5) && (o < 337.5)) align = TT_POINT_ALIGN_TL; } void thdb2d_flip_align(int & align, bool horiz) { bool vert = ! horiz; switch (align) { case TT_POINT_ALIGN_T: if (vert) align = TT_POINT_ALIGN_B; break; case TT_POINT_ALIGN_B: if (vert) align = TT_POINT_ALIGN_T; break; case TT_POINT_ALIGN_L: if (horiz) align = TT_POINT_ALIGN_R; break; case TT_POINT_ALIGN_R: if (horiz) align = TT_POINT_ALIGN_L; break; case TT_POINT_ALIGN_TL: if (vert) align = TT_POINT_ALIGN_BL; if (horiz) align = TT_POINT_ALIGN_TR; break; case TT_POINT_ALIGN_BL: if (vert) align = TT_POINT_ALIGN_TL; if (horiz) align = TT_POINT_ALIGN_BR; break; case TT_POINT_ALIGN_TR: if (vert) align = TT_POINT_ALIGN_BR; if (horiz) align = TT_POINT_ALIGN_TL; break; case TT_POINT_ALIGN_BR: if (vert) align = TT_POINT_ALIGN_TR; if (horiz) align = TT_POINT_ALIGN_BL; break; } } int thdb2d_rotate_align(int align, double rot) { thdb2d_rot_align(align, rot); return(align); } thdb2dprjpr thdb2d::parse_projection(const char * prjstr,bool insnew) { // let's split string into type - index - param - units thsplit_words(& this->mbf, prjstr); thdb2dprjpr ret_val; std::string index_str_str(":"); thdb2dprj tp; char ** pars = this->mbf.get_buffer(), ** pars2; const char * type_str, * index_str = ""; double par = tp.pp1; int npar = this->mbf.get_size(), prj_type; if (npar < 1) ththrow(("missing projection type")); thsplit_strings(& this->mbf2, pars[0], ':'); switch (this->mbf2.get_size()) { case 1: type_str = pars[0]; break; case 2: pars2 = this->mbf2.get_buffer(); type_str = pars2[0]; index_str_str += pars2[1]; if (!th_is_keyword(pars2[1])) ththrow(("projection index not a keyword -- %s", pars2[1])) break; default: ththrow(("only one projection index allowed -- %s", pars[0])) } prj_type = thmatch_token(type_str,thtt_2dproj); if (prj_type == TT_2DPROJ_UNKNOWN) ththrow(("unknown projection type -- %s", pars[0])); if ((prj_type == TT_2DPROJ_NONE) && (index_str_str.length() > 1)) ththrow(("no projection index allowed -- %s",prjstr)) //parse rest arguments thtfangle angtf; int asv; switch (prj_type) { case TT_2DPROJ_ELEV: // parse units if necessary if (npar > 3) ththrow(("too many projection arguments")) if (npar > 1) { thparse_double(asv,par,pars[1]); index_str_str += ":"; index_str_str += pars[1]; if (asv != TT_SV_NUMBER) ththrow(("invalid projection parameter -- %s",pars[1])) if (npar > 2) { angtf.parse_units(pars[2]); par = angtf.transform(par); } if ((par < 0.0) || (par >= 360.0)) ththrow(("elevation orientation out of range -- %s", pars[1])) } else { par = 0.0; } break; default: if (npar > 1) ththrow(("too many projection arguments")) break; } // let's find projection in a set or create a new one if (index_str_str.length() > 1) index_str = this->db->strstore(index_str_str.c_str(), true); thdb2dprjid_map::iterator pi; thdb2dprjid tpid(prj_type, index_str); bool prj_found = false; pi = this->prjid_map.find(tpid); if (pi != this->prjid_map.end()) prj_found = true; ret_val.newprj = !prj_found; ret_val.parok = true; thdb2dprj_list::iterator prjli; if (prj_found) { ret_val.prj = pi->second; } else { if (insnew) { this->prj_lid++; tp.type = prj_type; tp.id = this->prj_lid; tp.pp1 = par; prjli = this->prj_list.insert(this->prj_list.end(),tp); ret_val.prj = &(*prjli); this->prjid_map[tpid] = ret_val.prj; } else { ret_val.prj = NULL; } } return ret_val; } void thdb2d::self_print(FILE * outf) { } thdb2dpt * thdb2d::insert_point() { thdb2dpt dumm; return &(* this->pt_list.insert(this->pt_list.end(), dumm)); } thdb2dlp * thdb2d::insert_line_point() { thdb2dlp dumm; return &(* this->lp_list.insert(this->lp_list.end(),dumm)); } thdb2dab * thdb2d::insert_border_line() { thdb2dab dumm; return &(* this->ab_list.insert(this->ab_list.end(),dumm)); } thdb2dji * thdb2d::insert_join_item() { thdb2dji dumm; return &(* this->ji_list.insert(this->ji_list.end(),dumm)); } thdb2dmi * thdb2d::insert_map_item() { thdb2dmi dumm; return &(* this->mi_list.insert(this->mi_list.end(),dumm)); } thdb2dcp * thdb2d::insert_control_point() { thdb2dcp dumm; return &(* this->cp_list.insert(this->cp_list.end(),dumm)); } thdb2dxm * thdb2d::insert_xm() { thdb2dxm dumm; return &(* this->xm_list.insert(this->xm_list.end(),dumm)); } thdb2dxs * thdb2d::insert_xs() { thdb2dxs dumm; return &(* this->xs_list.insert(this->xs_list.end(),dumm)); } thscraplo * thdb2d::insert_scraplo() { thscraplo dumm; return &(* this->scraplo_list.insert(this->scraplo_list.end(),dumm)); } thlayoutln * thdb2d::insert_layoutln() { thlayoutln dumm; return &(* this->layoutln_list.insert(this->layoutln_list.end(),dumm)); } thscrapen * thdb2d::insert_scrapen() { thscrapen dumm; return &(* this->scrapen_list.insert(this->scrapen_list.end(),dumm)); } thscraplp * thdb2d::insert_scraplp() { thscraplp dumm; return &(* this->scraplp_list.insert(this->scraplp_list.end(),dumm)); } void thdb2d::process_references() { #ifdef THDEBUG thprintf("\n\nprocessing references\n"); #else thprintf("processing references ... "); thtext_inline = true; #endif thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_LINE_CMD: ((thline *)(*obi))->preprocess(); break; case TT_LAYOUT_CMD: ((thlayout *)(*obi))->process_copy(); break; } obi++; } obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->fsptr != NULL) { switch ((*obi)->get_class_id()) { case TT_AREA_CMD: this->process_area_references((tharea *) *obi); break; case TT_POINT_CMD: this->process_point_references((thpoint *) *obi); break; case TT_MAP_CMD: this->process_map_references((thmap *) *obi); break; case TT_JOIN_CMD: this->process_join_references((thjoin *) *obi); break; case TT_SCRAP_CMD: this->process_scrap_references((thscrap *) *obi); } } obi++; } obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->fsptr != NULL) { switch ((*obi)->get_class_id()) { case TT_MAP_CMD: this->postprocess_map_references((thmap *) *obi); break; } } obi++; } #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thdb2d::process_area_references(tharea * aptr) { thdb2dab* cbl = aptr->first_line; thdataobject * optr; while (cbl != NULL) { optr = this->db->get_object(cbl->name, aptr->fsptr); if (optr == NULL) { if (cbl->name.survey != NULL) ththrow(("%s [%d] -- object does not exist -- %s@%s", cbl->source.name, cbl->source.line, cbl->name.name,cbl->name.survey)) else ththrow(("%s [%d] -- object does not exist -- %s", cbl->source.name, cbl->source.line, cbl->name.name)) } if (optr->get_class_id() != TT_LINE_CMD) { if (cbl->name.survey != NULL) ththrow(("%s [%d] -- object is not a line -- %s@%s", cbl->source.name, cbl->source.line, cbl->name.name,cbl->name.survey)) else ththrow(("%s [%d] -- object is not a line -- %s", cbl->source.name, cbl->source.line, cbl->name.name)) } cbl->line = (thline *) optr; if (cbl->line->fscrapptr->id != aptr->fscrapptr->id) { if (cbl->name.survey != NULL) ththrow(("%s [%d] -- line outside of current scrap -- %s@%s", cbl->source.name, cbl->source.line, cbl->name.name,cbl->name.survey)) else ththrow(("%s [%d] -- line outside of current scrap -- %s", cbl->source.name, cbl->source.line, cbl->name.name)) } cbl = cbl->next_line; } } void thdb2d::process_map_references(thmap * mptr) { if (!mptr->asoc_survey.is_empty()) { thdataobject * obj = this->db->get_object(mptr->asoc_survey, mptr->asoc_survey.psurvey); if ((obj == NULL) || (obj->get_class_id() != TT_SURVEY_CMD)) { if (mptr->asoc_survey.survey != NULL) ththrow(("%s [%d] -- invalid survey reference -- %s@%s", mptr->source.name, mptr->source.line, mptr->asoc_survey.name, mptr->asoc_survey.survey)) else ththrow(("%s [%d] -- invalid survey reference -- %s", mptr->source.name, mptr->source.line, mptr->asoc_survey.name)) } mptr->asoc_survey.psurvey = (thsurvey *) obj; } if (mptr->projection_id > 0) return; if (mptr->first_item == NULL) { mptr->throw_source(); threthrow2(("empty map not allowed")) } if (mptr->projection_id == -1) ththrow(("recursive map reference")) // let's lock the current map mptr->projection_id = -1; thdb2dmi * citem = mptr->first_item, * xcitem; thdataobject * optr; int proj_id = -1; while (citem != NULL) { if (citem->type != TT_MAPITEM_NORMAL) { citem = citem->next_item; continue; } optr = this->db->get_object(citem->name, citem->psurvey); if (optr == NULL) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- object does not exist -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- object does not exist -- %s", citem->source.name, citem->source.line, citem->name.name)) } thmap * mapp; thscrap * scrapp; thsurvey * survp; switch (optr->get_class_id()) { case TT_SURVEY_CMD: if (proj_id == -1) { if (mptr->expl_projection == NULL) ththrow(("%s [%d] -- no projection for survey", citem->source.name, citem->source.line)) proj_id = mptr->expl_projection->id; mptr->is_basic = false; } else { if (mptr->is_basic) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- not a scrap reference -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- not a scrap reference -- %s", citem->source.name, citem->source.line, citem->name.name)) } } // skontroluje ci nie sme v inej projekcii switch (this->get_projection(proj_id)->type) { case TT_2DPROJ_EXTEND: case TT_2DPROJ_PLAN: case TT_2DPROJ_ELEV: break; default: ththrow(("%s [%d] -- unsupported projection for survey", citem->source.name, citem->source.line)) break; } survp = (thsurvey*) optr; // vytvorime specialnu mapu s jednym scrapom, // ktoremu nastavime centerline io a survey scrapp = new thscrap; scrapp->centerline_io = true; scrapp->centerline_survey = survp; scrapp->z = thnan; if ((survp->stat.station_top != NULL) && (survp->stat.station_bottom != NULL)) { scrapp->z = (survp->stat.station_top->z + survp->stat.station_bottom->z) / 2.0; } scrapp->fsptr = NULL; scrapp->db = this->db; scrapp->proj = this->get_projection(proj_id); thdb.object_list.push_back(scrapp); mapp = new thmap; mapp->projection_id = proj_id; mapp->id = ++this->db->objid; mapp->db = this->db; mapp->z = scrapp->z; mapp->fsptr = NULL; thdb.object_list.push_back(mapp); xcitem = this->db->db2d.insert_map_item(); xcitem->itm_level = mapp->last_level; xcitem->source = thdb.csrc; xcitem->psurvey = NULL; xcitem->type = TT_MAPITEM_NORMAL; xcitem->object = scrapp; mapp->first_item = xcitem; mapp->last_item = xcitem; citem->object = mapp; break; case TT_MAP_CMD: mapp = (thmap *) optr; // if not defined - process recursively if (mapp->projection_id == 0) { try { this->process_map_references(mapp); } catch (...) { if (citem->name.survey != NULL) threthrow(("%s [%d] -- error processing map reference -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else threthrow(("%s [%d] -- error processing map reference -- %s", citem->source.name, citem->source.line, citem->name.name)) } } if (proj_id == -1) { proj_id = mapp->projection_id; mptr->is_basic = false; } else { // check projection if (mapp->projection_id != proj_id) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- incompatible map projection -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- incompatible map projection -- %s", citem->source.name, citem->source.line, citem->name.name)) } // check basic if (mptr->is_basic) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- not a scrap reference -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- not a scrap reference -- %s", citem->source.name, citem->source.line, citem->name.name)) } } if ((mptr->expl_projection != NULL) && (mptr->expl_projection->id != proj_id)) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- incompatible map projection -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- incompatible map projection -- %s", citem->source.name, citem->source.line, citem->name.name)) } citem->object = mapp; break; case TT_SCRAP_CMD: scrapp = (thscrap *) optr; if (proj_id == -1) { proj_id = scrapp->proj->id; mptr->is_basic = true; } else { // check projection if (scrapp->proj->id != proj_id) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- incompatible scrap projection -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- incompatible scrap projection -- %s", citem->source.name, citem->source.line, citem->name.name)) } // check basic if (!mptr->is_basic) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- not a map reference -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- not a map reference -- %s", citem->source.name, citem->source.line, citem->name.name)) } if (citem->m_shift.is_active()) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- shift is not allowed for scrap -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- shift is not allowed for scrap -- %s", citem->source.name, citem->source.line, citem->name.name)) } } if ((mptr->expl_projection != NULL) && (mptr->expl_projection->id != proj_id)) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- incompatible scrap projection -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- incompatible scrap projection -- %s", citem->source.name, citem->source.line, citem->name.name)) } citem->object = scrapp; break; default: mptr->throw_source(); if (citem->name.survey != NULL) ththrow(("%s [%d] -- invalid map object -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- invalid map object -- %s", citem->source.name, citem->source.line, citem->name.name)) } citem = citem->next_item; } #ifdef THDEBUG thprintf("\nmap projection %s -> %d\n",mptr->name,proj_id); #endif mptr->projection_id = proj_id; } void thdb2d::postprocess_map_references(thmap * mptr) { thdb2dmi * citem = mptr->first_item; thdataobject * optr; while (citem != NULL) { if (citem->type == TT_MAPITEM_NORMAL) { citem = citem->next_item; continue; } optr = this->db->get_object(citem->name, citem->psurvey); if (optr == NULL) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- object does not exist -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- object does not exist -- %s", citem->source.name, citem->source.line, citem->name.name)) } thmap * mapp; thscrap * scrapp; switch (optr->get_class_id()) { case TT_MAP_CMD: mapp = (thmap *) optr; if (mapp->projection_id != mptr->projection_id) { if (citem->name.survey != NULL) ththrow(("%s [%d] -- incompatible map projection -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- incompatible map projection -- %s", citem->source.name, citem->source.line, citem->name.name)) } citem->object = optr; break; case TT_SCRAP_CMD: scrapp = (thscrap *) optr; if (citem->name.survey != NULL) ththrow(("%s [%d] -- not a map reference -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- not a map reference -- %s", citem->source.name, citem->source.line, citem->name.name)) break; default: mptr->throw_source(); if (citem->name.survey != NULL) ththrow(("%s [%d] -- invalid map object -- %s@%s", citem->source.name, citem->source.line, citem->name.name,citem->name.survey)) else ththrow(("%s [%d] -- invalid map object -- %s", citem->source.name, citem->source.line, citem->name.name)) } citem = citem->next_item; } } void thdb2d::process_join_references(thjoin * jptr) { thdataobject * optr; thdb2dji * citem = jptr->first_item, * prev_item; thpoint * pointp; thline * linep; thscrap * scrapp; thdb2dprj * cprj; int otype; while (citem != NULL) { optr = this->db->get_object(citem->name, jptr->fsptr); if (optr == NULL) { jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("object does not exist -- %s@%s", citem->name.name,citem->name.survey)) else threthrow2(("object does not exist -- %s", citem->name.name)) } otype = optr->get_class_id(); if (optr->is(TT_2DDATAOBJECT_CMD) || optr->is(TT_SCRAP_CMD)) { if (jptr->proj != NULL) { if (optr->is(TT_SCRAP_CMD)) cprj = ((thscrap*)optr)->proj; else cprj = ((th2ddataobject *)optr)->fscrapptr->proj; if (cprj->id != jptr->proj->id) { jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("projection mishmash -- %s@%s", citem->name.name,citem->name.survey)) else threthrow2(("projection mishmash -- %s", citem->name.name)) } } else { if (optr->is(TT_SCRAP_CMD)) jptr->proj = ((thscrap*)optr)->proj; else jptr->proj = ((th2ddataobject *)optr)->fscrapptr->proj; } } switch (otype) { case TT_SCRAP_CMD: scrapp = (thscrap*) optr; prev_item = citem->prev_item; if (prev_item != NULL) { if (!(prev_item->object->is(TT_SCRAP_CMD))) { jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("scrap can not follow not scrap -- %s@%s:%s", citem->name.name,citem->name.survey,citem->mark)) else threthrow2(("scrap can not follow not scrap -- %s:%s", citem->name.name,citem->mark)) } prev_item = prev_item->prev_item; if (prev_item != NULL) { jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("join of more than 2 scraps not supported -- %s@%s:%s", citem->name.name,citem->name.survey,citem->mark)) else threthrow2(("join of more than 2 scraps not supported -- %s:%s", citem->name.name,citem->mark)) } } citem->object = optr; break; case TT_POINT_CMD: pointp = (thpoint*) optr; if (citem->mark != NULL) { jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("mark reference with point -- %s@%s:%s", citem->name.name,citem->name.survey,citem->mark)) else threthrow2(("mark reference with point -- %s:%s", citem->name.name,citem->mark)) } citem->point = pointp->point; citem->line_point = NULL; citem->object = optr; break; case TT_LINE_CMD: linep = (thline *) optr; if (citem->mark != NULL) { citem->line_point = linep->get_marked_station(citem->mark); if (citem->line_point == NULL) { jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("marked station not found -- %s@%s:%s", citem->name.name,citem->name.survey,citem->mark)) else threthrow2(("marked station not found -- %s:%s", citem->name.name,citem->mark)) } citem->point = citem->line_point->point; } citem->object = optr; break; default: jptr->throw_source(); if (citem->name.survey != NULL) threthrow2(("invalid join object -- %s@%s", citem->name.name,citem->name.survey)) else threthrow2(("invalid join object -- %s", citem->name.name)) } citem = citem->next_item; } } void thdb2d::process_point_references(thpoint * pp) { thdataobject * optr; bool extend_error = false; const char * err_code = "invalid station or point reference"; switch (pp->type) { case TT_POINT_TYPE_STATION: case TT_POINT_TYPE_CONTINUATION: if (! pp->station_name.is_empty()) { try { pp->station_name.id = this->db->db1d.get_station_id(pp->station_name,pp->fsptr); } catch (...) { pp->station_name.id = 0; } if (pp->station_name.id == 0) { pp->throw_source(); if (pp->station_name.survey != NULL) threthrow2(("station does not exist -- %s@%s", pp->station_name.name,pp->station_name.survey)) else threthrow2(("station does not exist -- %s", pp->station_name.name)) } if (pp->type == TT_POINT_TYPE_STATION) pp->fscrapptr->insert_adata(&(this->db->db1d.station_vec[pp->station_name.id - 1])); } if (pp->type == TT_POINT_TYPE_CONTINUATION) break; case TT_POINT_TYPE_EXTRA: if (! pp->from_name.is_empty()) { try { pp->from_name.id = this->db->db1d.get_station_id(pp->from_name,pp->fsptr); } catch (...) { pp->from_name.id = 0; } if (pp->from_name.id == 0) { pp->throw_source(); if (pp->station_name.survey != NULL) threthrow2(("station does not exist -- %s@%s", pp->from_name.name,pp->from_name.survey)) else threthrow2(("station does not exist -- %s", pp->from_name.name)) } } break; case TT_POINT_TYPE_SECTION: extend_error = false; err_code = "object does not exist"; if (! pp->station_name.is_empty()) { optr = this->db->get_object(pp->station_name,pp->fsptr); if (optr != NULL) { if (optr->get_class_id() == TT_SCRAP_CMD) { if (((thscrap *)optr)->proj->type == TT_2DPROJ_NONE) { pp->text = (char *) optr; } else { extend_error = true; err_code = "not a none scrap projection"; } } else { extend_error = true; err_code = "object not a scrap"; } } else { extend_error = true; } if (extend_error) { pp->throw_source(); if (pp->station_name.survey != NULL) threthrow2(("%s -- %s@%s",err_code, pp->station_name.name,pp->station_name.survey)) else threthrow2(("%s -- %s",err_code, pp->station_name.name)) } } break; default: break; } } void thdb2d::process_scrap_references(thscrap * sptr) { thscraplp * lp = sptr->polygon_first; while (lp != NULL) { if (!(lp->station_name.is_empty())) { try { lp->station_name.id = this->db->db1d.get_station_id(lp->station_name,lp->station_name.psurvey); //sptr->fsptr); } catch (...) { lp->station_name.id = 0; } if (lp->station_name.id == 0) { sptr->throw_source(); if (lp->station_name.survey != NULL) threthrow2(("invalid station reference -- %s@%s", lp->station_name.name,lp->station_name.survey)) else threthrow2(("invalid station reference -- %s", lp->station_name.name)) } lp->station = &(this->db->db1d.station_vec[lp->station_name.id - 1]); sptr->insert_adata(lp->station); if (lp->station->uid > 0) lp->ustation = &(this->db->db1d.station_vec[lp->station->uid - 1]); else lp->ustation = lp->station; } lp = lp->next_item; } } int comp_dist(const void * s1, const void * s2) { if ((*((thscrap**)s1))->maxdist > (*((thscrap**)s2))->maxdist) return -1; else if ((*((thscrap**)s1))->maxdist < (*((thscrap**)s2))->maxdist) return 1; else return 0; } void thdb2d::log_distortions() { thdb2dprj * prj; thdb2dprj_list::iterator prjli; prjli = this->prj_list.begin(); thscrap ** ss; thscrap * ps; unsigned long ns = 0, i; while (prjli != this->prj_list.end()) { prj = &(*prjli); ns = 0; ps = prj->first_scrap; while(ps != NULL) { ps = ps->proj_next_scrap; ns++; } if ((ns > 0) && (prj->processed) && (prj->type != TT_2DPROJ_NONE)) { ss = new thscrap* [ns]; ps = prj->first_scrap; i = 0; while(ps != NULL) { ss[i] = ps; ps = ps->proj_next_scrap; i++; } qsort(ss,ns,sizeof(thscrap*),comp_dist); thlog.printf("\n\n###################### scrap distortions #######################\n"); thlog.printf(" PROJECTION: %s%s%s\n", thmatch_string(prj->type,thtt_2dproj), strlen(prj->index) > 0 ? ":" : "", strlen(prj->index) > 0 ? prj->index : ""); thlog.printf(" AVERAGE MAXIMAL SCRAP\n"); for(i = 0; i < ns; i++) thlog.printf(" %6.2f%% %6.2f%% %s@%s\n",ss[i]->avdist, ss[i]->maxdist, ss[i]->name, ss[i]->fsptr->full_name); thlog.printf("################### end of scrap distortions ###################\n"); delete [] ss; } prjli++; } } void thdb2d::process_projection(thdb2dprj * prj) { if (prj->processed) return; // make sure that 1D tree is processed thdb.db1d.get_tree_size(); const char * prjstr; switch (prj->type) { case TT_2DPROJ_EXTEND: prjstr = "extended"; break; case TT_2DPROJ_PLAN: prjstr = "plan"; break; case TT_2DPROJ_ELEV: prjstr = "elevation"; break; case TT_2DPROJ_NONE: prjstr = "none"; break; default: prjstr = "unknown"; break; } bool old_thtext_inline = thtext_inline; if (strlen(prj->index) > 0) { #ifdef THDEBUG thprintf("\n\nprocessing projection %s:%s\n",prjstr,prj->index); #else thprintf("%sprocessing projection %s:%s ... ", thtext_inline ? "\n": "", prjstr,prj->index); thtext_inline = true; #endif } else { #ifdef THDEBUG thprintf("\n\nprocessing projection %s\n",prjstr); #else thprintf("%sprocessing projection %s ... ", thtext_inline ? "\n": "", prjstr); thtext_inline = true; #endif } prj->processed = true; this->pp_find_scraps_and_joins(prj); this->pp_scale_points(prj); if (prj->type != TT_2DPROJ_NONE) { this->pp_calc_stations(prj); this->pp_adjust_points(prj); //this->pp_shift_points(prj, true); this->pp_morph_points(prj); this->pp_calc_points_z(prj); } this->pp_process_joins(prj); this->pp_shift_points(prj); if (this->pp_process_adjustments(prj)) this->pp_shift_points(prj); this->pp_smooth_lines(prj); this->pp_smooth_joins(prj); this->pp_calc_limits(prj); this->pp_calc_distortion(prj); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = old_thtext_inline; #endif if (prj->amaxdist > 0.0) { thprintf("average distortion: %.2f%%\n", prj->amaxdist); } } void thdb2d::pp_calc_stations(thdb2dprj * prj) { double minx = 0.0, miny = 0.0, minz = 0.0, maxx = 0.0, maxy = 0.0, maxz = 0.0, shift_x, shift_y, shift_z; minx = thnan; // prejde vsetky objekty a urobi nasledovne veci thscrap * pps; thpoint * ppp; thdb2dcp * cp, * scancp; //, * rootcp; int max_mark; // bool has_root = false, some_attached; unsigned long // nattached, numcps = 0, numscraps = 0; thdb_object_list_type::iterator obi = this->db->object_list.begin(); // unsigned long searchid; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_POINT_CMD) { ppp = (thpoint *)(*obi); if ((ppp->fscrapptr->proj->id == prj->id) && (ppp->type == TT_POINT_TYPE_STATION) && (ppp->station_name.id != 0)) { // let's add control point to given scrap cp = ppp->fscrapptr->insert_control_point(); cp->point = ppp; cp->point->cpoint = cp; cp->pt = ppp->point; thdb1ds * st = & (this->db->db1d.station_vec[ppp->station_name.id - 1]); thdb1ds * uidst = & (this->db->db1d.station_vec[st->uid - 1]); numcps++; cp->st = st; // let's update station type switch (ppp->subtype) { case TT_POINT_SUBTYPE_FIXED: if (uidst->mark < TT_DATAMARK_FIXED) { st->mark = TT_DATAMARK_FIXED; uidst->mark = TT_DATAMARK_FIXED; } break; case TT_POINT_SUBTYPE_PAINTED: if (uidst->mark < TT_DATAMARK_PAINTED) { st->mark = TT_DATAMARK_PAINTED; uidst->mark = TT_DATAMARK_PAINTED; } break; case TT_POINT_SUBTYPE_NATURAL: if (uidst->mark < TT_DATAMARK_NATURAL) { st->mark = TT_DATAMARK_NATURAL; uidst->mark = TT_DATAMARK_NATURAL; } break; case TT_POINT_SUBTYPE_UNKNOWN: max_mark = st->mark; if (st->mark > uidst->mark) { max_mark = st->mark; } switch (max_mark) { case TT_DATAMARK_FIXED: ppp->subtype = TT_POINT_SUBTYPE_FIXED; break; case TT_DATAMARK_PAINTED: ppp->subtype = TT_POINT_SUBTYPE_PAINTED; break; case TT_DATAMARK_NATURAL: ppp->subtype = TT_POINT_SUBTYPE_NATURAL; break; } break; } // let's check projection station limits if (thisnan(minx)) { minx = st->x; maxx = st->x; miny = st->y; maxy = st->y; minz = st->z; maxz = st->z; } else { if (st->x < minx) minx = st->x; if (st->x > maxx) maxx = st->x; if (st->y < miny) miny = st->y; if (st->y > maxy) maxy = st->y; if (st->z < minz) minz = st->z; if (st->z > maxz) maxz = st->z; } } } obi++; } // now let's calculate projection coordinates for all points // first scrap by scrap double sina = 0.0, cosa = 0.0, dxy, mindxy = 1e99; thdb1d_tree_node * nodes = this->db->db1d.get_tree_nodes(), * cnode; thdb1d_tree_arrow * arrow, * tarrow; switch (prj->type) { case TT_2DPROJ_ELEV: sina = sin(prj->pp1 / 180.0 * 3.14159265358); cosa = cos(prj->pp1 / 180.0 * 3.14159265358); break; } if (thisnan(minx)) minx = 0.0; pps = prj->first_scrap; while (pps != NULL) { // // no scraps without stations // if (pps->ncp < 1) { // pps->throw_source(); // threthrow(("no reference station found in scrap -- %s@%s", // pps->name,pps->fsptr->get_full_name())) // } switch (prj->type) { case TT_2DPROJ_PLAN: cp = pps->fcpp; prj->shift_x = shift_x = minx; //(minx + maxx) / 2.0; prj->shift_y = shift_y = maxy; //(miny + maxy) / 2.0; prj->shift_z = shift_z = maxz; //(minz + maxz) / 2.0; prj->rshift_x = shift_x; prj->rshift_y = shift_y; prj->rshift_z = shift_z; while (cp != NULL) { cp->tx = cp->st->x - shift_x; cp->ty = cp->st->y - shift_y; cp->tz = cp->st->z - shift_z; cp->ta = cp->st->z; cp = cp->nextcp; } break; case TT_2DPROJ_ELEV: cp = pps->fcpp; prj->shift_x = shift_x = minx; //(minx + maxx) / 2.0; prj->shift_y = shift_y = maxy; //(miny + maxy) / 2.0; prj->shift_z = shift_z = maxz; //(minz + maxz) / 2.0; prj->rshift_x = shift_x; prj->rshift_y = shift_y; prj->rshift_z = shift_z; while (cp != NULL) { cp->tx = cosa * (cp->st->x - shift_x) - sina * (cp->st->y - shift_y); cp->tz = sina * (cp->st->x - shift_x) + cosa * (cp->st->y - shift_y); cp->ty = cp->st->z - shift_z; cp->ta = cp->st->z; cp = cp->nextcp; } break; case TT_2DPROJ_EXTEND: cp = pps->fcpp; prj->shift_x = shift_x = 0; prj->shift_y = shift_y = maxy; //(miny + maxy) / 2.0; prj->shift_z = shift_z = maxz; //(minz + maxz) / 2.0; prj->rshift_x = shift_x; prj->rshift_y = shift_y; prj->rshift_z = shift_z; while (cp != NULL) { cnode = &(nodes[cp->st->uid - 1]); cp->tx = cnode->extendx - shift_x; // if prev station specified - try to find this arrow arrow = NULL; if (!cp->point->from_name.is_empty()) { arrow = cnode->first_arrow; while (arrow != NULL) { if (arrow->end_node->uid == this->db->db1d.station_vec[cp->point->from_name.id - 1].uid) break; arrow = arrow->next_arrow; } } // if not find, find arrow with minimal dx where oposite // is valid cp if (arrow == NULL) { tarrow = cnode->first_arrow; while (tarrow != NULL) { scancp = pps->fcpp; while (scancp != NULL) { if (tarrow->end_node->uid == scancp->st->uid) { if (arrow == NULL) { arrow = tarrow; mindxy = hypot(cp->pt->x - scancp->pt->x, cp->pt->y - scancp->pt->y); } else { dxy = hypot(cp->pt->x - scancp->pt->x, cp->pt->y - scancp->pt->y); if (dxy < mindxy) { mindxy = dxy; arrow = tarrow; } } } scancp = scancp->nextcp; } tarrow = tarrow->next_arrow; } } if (arrow != NULL) { cp->tx = (arrow->is_reversed ? arrow->leg->leg->txx : arrow->leg->leg->fxx) - shift_x; } cp->tz = 0.0; cp->ty = cp->st->z - shift_z; cp->ta = cp->st->z; cp = cp->nextcp; } break; } // END of projection switch pps = pps->proj_next_scrap; numscraps++; } // shift all points in scraps without control points thdb2dpt_list::iterator ii = this->pt_list.begin(); while (ii != this->pt_list.end()) { pps = ii->pscrap; if ((pps->proj->id == prj->id) && (pps->fcpp == NULL)) { ii->xt -= prj->shift_x; ii->yt -= prj->shift_y; ii->zt -= prj->shift_z; } ii++; } // postprocess if necessary // if (prj->type == TT_2DPROJ_EXTEND) { // // std::list xscrap_links; // thprjx_link * xscrap_link, * xscrap_link2; // // std::list xstation_links; // thprjx_station_link * xstation_link, * xstation_link2; // // thprjx_scrap * xscraps = new thprjx_scrap [numscraps], // * xscrap; // // unsigned long numstations = this->db->db1d.station_vec.size(); // thprjx_station * xstations = new thprjx_station [numstations], // * xstation = NULL; // // thprjx_station_link dummxs; // //// unsigned long cuid; // // pps = prj->first_scrap; // xscrap = xscraps; // while (pps != NULL) { // xscrap->scrap = pps; // pps->xscrap = xscrap; // cp = pps->fcpp; // while (cp != NULL) { // if (cp->is_sticky != TT_POINT_EXTEND_STICKYOFF) { // xstation = &(xstations[cp->st->uid - 1]); // xstation_link = &(*(xstation_links.insert(xstation_links.end(),dummxs))); // xstation_link->scrap = xscrap; // xstation_link->scrapcp = cp; // if (xstation->nstations == 0) { // xstation->first_link = xstation_link; // xstation->last_link = xstation_link; // } else { // xstation->last_link->next_link = xstation_link; // xstation->last_link = xstation_link; // } // } // xstation->nstations++; // // cp = cp->nextcp; // } // pps = pps->proj_next_scrap; // xscrap++; // } // // // let's add scrap links from UID // unsigned long station_id; // thprjx_link dummxl; // station_id = 0; // xstation = xstations; // while (station_id < numstations) { // if (xstation->nstations > 1) { // xstation_link = xstation->first_link; // while (xstation_link != NULL) { // xstation_link2 = xstation_link->next_link; // while (xstation_link2 != NULL) { // if (xstation_link2->scrap->scrap->id != xstation_link->scrap->scrap->id) { // // // pridaj -> // xscrap_link = &(*(xscrap_links.insert(xscrap_links.end(),dummxl))); // xscrap_link->from_cp = xstation_link->scrapcp; // xscrap_link->from_scrap = xstation_link->scrap; // xscrap_link->to_cp = xstation_link2->scrapcp; // xscrap_link->to_scrap = xstation_link2->scrap; // if (xscrap_link->from_scrap->last_link == NULL) { // xscrap_link->from_scrap->last_link = xscrap_link; // xscrap_link->from_scrap->first_link = xscrap_link; // } else { // if ((xscrap_link->from_cp->is_sticky == TT_POINT_EXTEND_STICKYON) || // (xscrap_link->to_cp->is_sticky == TT_POINT_EXTEND_STICKYON)) { // xscrap_link->from_scrap->first_link->prev_link = xscrap_link; // xscrap_link->next_link = xscrap_link->from_scrap->first_link; // xscrap_link->from_scrap->first_link = xscrap_link; // } else { // xscrap_link->prev_link = xscrap_link->from_scrap->last_link; // xscrap_link->from_scrap->last_link->next_link = xscrap_link; // xscrap_link->from_scrap->last_link = xscrap_link; // } // } // // xscrap_link2 = xscrap_link; // // // pridaj <- // xscrap_link = &(*(xscrap_links.insert(xscrap_links.end(),dummxl))); // xscrap_link->from_cp = xstation_link2->scrapcp; // xscrap_link->from_scrap = xstation_link2->scrap; // xscrap_link->to_cp = xstation_link->scrapcp; // xscrap_link->to_scrap = xstation_link->scrap; // if (xscrap_link->from_scrap->last_link == NULL) { // xscrap_link->from_scrap->last_link = xscrap_link; // xscrap_link->from_scrap->first_link = xscrap_link; // } else { // if ((xscrap_link->from_cp->is_sticky == TT_POINT_EXTEND_STICKYON) || // (xscrap_link->to_cp->is_sticky == TT_POINT_EXTEND_STICKYON)) { // xscrap_link->from_scrap->first_link->prev_link = xscrap_link; // xscrap_link->next_link = xscrap_link->from_scrap->first_link; // xscrap_link->from_scrap->first_link = xscrap_link; // } else { // xscrap_link->prev_link = xscrap_link->from_scrap->last_link; // xscrap_link->from_scrap->last_link->next_link = xscrap_link; // xscrap_link->from_scrap->last_link = xscrap_link; // } // } // // xscrap_link2->oposite_link = xscrap_link; // xscrap_link->oposite_link = xscrap_link2; // // } // xstation_link2 = xstation_link2->next_link; // } // xstation_link = xstation_link->next_link; // } // } // station_id++; // xstation++; // } // // // // // let's run TREMAUX on scraps // unsigned long num_scrap_att = 0; // double movex, movey; // xscrap = xscraps; // while(1) { // // // 1 ak nie je xscrap pripojeny, pripoji ho // if (!xscrap->is_attached) { // if (xscrap->via_link != NULL) { // movex = xscrap->via_link->from_cp->tx - xscrap->via_link->to_cp->tx; // movey = xscrap->via_link->from_cp->ty - xscrap->via_link->to_cp->ty; // cp = xscrap->scrap->fcpp; // while (cp != NULL) { // cp->tx = cp->tx + movex; // cp->ty = cp->ty + movey; // cp->tz = double(num_scrap_att); // cp = cp->nextcp; // } // } // xscrap->is_attached = true; // num_scrap_att++; // } // // // skontroluje ci mooze ist dalej // while ((xscrap->first_link != NULL) && (xscrap->first_link->to_scrap->is_attached)) // xscrap->first_link = xscrap->first_link->next_link; // // // ak nie ide spat ak mooze inak break. // if (xscrap->first_link != NULL) { // xscrap->first_link->to_scrap->via_link = xscrap->first_link; // xscrap = xscrap->first_link->to_scrap; // xscrap->via_link->from_scrap->first_link = xscrap->via_link->from_scrap->first_link->next_link; // } else { // if (xscrap->via_link != NULL) // xscrap = xscrap->via_link->from_scrap; // else // break; // } // } // if (num_scrap_att < numscraps) { // xscrap = xscraps; // unsigned nxscrap = 0; // thlog.printf("error info -- scraps not attached to extended"); // if (strlen(prj->index) == 0) // thlog.printf(":%s",prj->index); // thlog.printf("projection:\n"); // while(nxscrap < numscraps) { // if (!xscrap->is_attached) // thlog.printf("\t%s@%s\n",xscrap->scrap->name,xscrap->scrap->fsptr->get_full_name()); // xscrap++; // nxscrap++; // } // if (strlen(prj->index) == 0) // ththrow(("can not connect all scraps in exteded projection")) // else // ththrow(("can not connect all scraps in exteded:%s projection", prj->index)) // } // // delete [] xscraps; // delete [] xstations; // } // END of extended projection post processing } void thdb2d::pp_scale_points(thdb2dprj * prj) { thscrap * ps = prj->first_scrap; double maxdist,cdist,scale,ang,tang; // prejde scrapy a nastavy matice ps = prj->first_scrap; while (ps != NULL) { ps->reset_transformation(); if (ps->scale_p9) { cdist = hypot(ps->scale_p2y - ps->scale_p1y,ps->scale_p2x - ps->scale_p1x); maxdist = hypot(ps->scale_r2y - ps->scale_r1y,ps->scale_r2x - ps->scale_r1x); ang = atan2(ps->scale_p2y - ps->scale_p1y,ps->scale_p2x - ps->scale_p1x); tang = atan2(ps->scale_r2y - ps->scale_r1y,ps->scale_r2x - ps->scale_r1x); tang -= ang; ps->mxx = cos(tang); ps->mxy = -sin(tang); ps->myx = sin(tang); ps->myy = cos(tang); scale = maxdist / cdist; ps->ms = scale; ps->mr = - tang / 3.14159265358 * 180.0; ps->mxx *= scale; ps->myy *= scale; ps->mxy *= scale; ps->myx *= scale; ps->mx = ps->scale_r1x - ps->mxx * ps->scale_p1x - ps->mxy * ps->scale_p1y; ps->my = ps->scale_r1y - ps->myx * ps->scale_p1x - ps->myy * ps->scale_p1y; } ps = ps->proj_next_scrap; } // podla nastavenia scale v scrape modifikuje suradnice bodov thdb2dpt_list::iterator ii = this->pt_list.begin(); while (ii != this->pt_list.end()) { ps = ii->pscrap; if (ps->proj->id == prj->id) { if (ps->scale_p9) { ii->xt = ps->mxx * ii->x + ps->mxy * ii->y + ps->mx; ii->yt = ps->myx * ii->x + ps->myy * ii->y + ps->my; } else { ii->xt = ii->x * ps->scale; ii->yt = ii->y * ps->scale; } // flipne ak treba if (ps->flip != TT_SCRAP_FLIP_NONE) { switch (ps->flip) { case TT_SCRAP_FLIP_VERT: ii->yt *= -1.0; break; case TT_SCRAP_FLIP_HORIZ: ii->xt *= -1.0; break; } } ii->dbgx0 = ii->xt; ii->dbgy0 = ii->yt; ii->dbgx1 = ii->xt; ii->dbgy1 = ii->yt; } ii++; } // transformuje rotacie a scales ps = prj->first_scrap; thline * pline; thpoint * ppoint; thdb2dlp * plp; th2ddataobject * p2dobj; while (ps != NULL) { p2dobj = ps->fs2doptr; while (p2dobj != NULL) { switch (p2dobj->get_class_id()) { case TT_POINT_CMD: ppoint = (thpoint *) p2dobj; if (!thisnan(ppoint->orient)) { ppoint->orient += ps->mr; if (ppoint->orient < 0) { ppoint->orient += 360.0; } else if (ppoint->orient >= 360.0) { ppoint->orient -= 360.0; } // flip if needed if (ps->flip != TT_SCRAP_FLIP_NONE) { switch (ps->flip) { case TT_SCRAP_FLIP_VERT: ppoint->orient -= 90.0; ppoint->orient = 360.0 - ppoint->orient; ppoint->orient += 90.0; break; case TT_SCRAP_FLIP_HORIZ: ppoint->orient = 360.0 - ppoint->orient; break; } if (ppoint->orient < 0) { ppoint->orient += 360.0; } else if (ppoint->orient >= 360.0) { ppoint->orient -= 360.0; } } // flip } else if (ppoint->align != TT_POINT_ALIGN_C) { thdb2d_rot_align(ppoint->align,ps->mr); if (ps->flip != TT_SCRAP_FLIP_NONE) { thdb2d_flip_align(ppoint->align, ps->flip == TT_SCRAP_FLIP_HORIZ); } } //ppoint->xsize *= ps->ms; //ppoint->ysize *= ps->ms; break; case TT_LINE_CMD: pline = (thline *) p2dobj; plp = pline->first_point; while (plp != NULL) { if (!thisnan(plp->orient)) { plp->orient += ps->mr; if (plp->orient < 0) { plp->orient += 360.0; } else if (plp->orient >= 360.0) { plp->orient -= 360.0; } // flip if needed if (ps->flip != TT_SCRAP_FLIP_NONE) { switch (ps->flip) { case TT_SCRAP_FLIP_VERT: plp->orient -= 90.0; plp->orient = 360.0 - plp->orient; plp->orient += 90.0; break; case TT_SCRAP_FLIP_HORIZ: plp->orient = 360.0 - plp->orient; break; } if (plp->orient < 0) { plp->orient += 360.0; } else if (plp->orient >= 360.0) { plp->orient -= 360.0; } } // flip } // plp->rsize *= ps->ms; // plp->lsize *= ps->ms; switch (pline->type) { case TT_LINE_TYPE_SLOPE: if ((plp->tags & TT_LINEPT_TAG_SIZE) > 0) plp->lsize *= ps->ms; break; } plp = plp->nextlp; } break; } p2dobj = p2dobj->nscrapoptr; } ps = ps->proj_next_scrap; } } void thdb2d::pp_find_scraps_and_joins(thdb2dprj * prj) { thscrap * pscrap = NULL, * cscrap; thjoin * pjoin = NULL, * cjoin; thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if (((*obi)->fsptr != NULL) && ((*obi)->get_class_id() == TT_SCRAP_CMD)) { if (((thscrap *)(*obi))->proj->id == prj->id) { cscrap = (thscrap *)(*obi); if (pscrap != NULL) pscrap->proj_next_scrap = cscrap; else { prj->first_scrap = cscrap; prj->last_scrap = cscrap; } cscrap->proj_prev_scrap = pscrap; prj->last_scrap = cscrap; pscrap = cscrap; } } if (((*obi)->get_class_id() == TT_JOIN_CMD) && (((thjoin *)(*obi))->proj != NULL) && (((thjoin *)(*obi))->proj->id == prj->id)) { cjoin = (thjoin *)(*obi); if (pjoin != NULL) pjoin->proj_next_join = cjoin; else { prj->first_join = cjoin; prj->last_join = cjoin; } cjoin->proj_prev_join = pjoin; prj->last_join = cjoin; pjoin = cjoin; } obi++; } } void thdb2d::pp_calc_limits(thdb2dprj * prj) { // vyrusi kazdy scrap thscrap * ps; ps = prj->first_scrap; while (ps != NULL) { ps->reset_limits(); ps->calc_z(); ps = ps->proj_next_scrap; } // prejde bod za bodom a nastavi limity pre dany scrap thdb2dpt_list::iterator ii = this->pt_list.begin(); while (ii != this->pt_list.end()) { if (ii->pscrap->proj->id == prj->id) { if (thisnan(ii->pscrap->lxmin)) { ii->pscrap->lxmin = ii->xt; ii->pscrap->lxmax = ii->xt; ii->pscrap->lymin = ii->yt; ii->pscrap->lymax = ii->yt; } else { if (ii->pscrap->lxmin > ii->xt) ii->pscrap->lxmin = ii->xt; if (ii->pscrap->lxmax < ii->xt) ii->pscrap->lxmax = ii->xt; if (ii->pscrap->lymin > ii->yt) ii->pscrap->lymin = ii->yt; if (ii->pscrap->lymax < ii->yt) ii->pscrap->lymax = ii->yt; } } ii++; } } void thdb2d::pp_adjust_points(thdb2dprj * prj) { // prejde scrap za scrapom, zrata transf. maticu thscrap * pscrap; thdb2dcp * cp; // vycentruje scrapy v projekcii pscrap = prj->first_scrap; while (pscrap != NULL) { pscrap->mx = 0.0; pscrap->my = 0.0; pscrap->ms = 0.0; cp = pscrap->fcpp; while (cp != NULL) { pscrap->mx += cp->pt->xt; pscrap->my += cp->pt->yt; pscrap->ms += 1.0; cp = cp->nextcp; } if (pscrap->ms > 1.0) { pscrap->mx = pscrap->mx / pscrap->ms; pscrap->my = pscrap->my / pscrap->ms; } else { pscrap->mx = 0.0; pscrap->my = 0.0; } pscrap = pscrap->proj_next_scrap; } thdb2dpt_list::iterator ii = this->pt_list.begin(); while (ii != this->pt_list.end()) { pscrap = ii->pscrap; if (pscrap->proj->id == prj->id) { ii->xt -= pscrap->mx; ii->yt -= pscrap->my; } ii++; } #define THADJUSTLS #ifndef THADJUSTLS thdb2dcp * cp2, * acp1, * acp2; double maxdist, cdist, scale, ang, tang; #else double sumXx, sumYy, sumYx, sumXy, sumxx, sumyy, movetx, movety, X, Y, a, b; #endif pscrap = prj->first_scrap; while (pscrap != NULL) { pscrap->reset_transformation(); if (pscrap->ncp == 1) { pscrap->mx = pscrap->fcpp->tx - pscrap->fcpp->pt->xt; pscrap->my = pscrap->fcpp->ty - pscrap->fcpp->pt->yt; } else if (pscrap->ncp > 1) { #ifndef THADJUSTLS acp1 = pscrap->fcpp; acp2 = pscrap->fcpp->nextcp; maxdist = hypot(acp1->tx - acp2->tx, acp1->ty - acp2->ty); cp = pscrap->fcpp; while (cp->nextcp != NULL) { cp2 = cp->nextcp; while (cp2 != NULL) { cdist = hypot(cp->tx - cp2->tx, cp->ty - cp2->ty); if (cdist > maxdist) { maxdist = cdist; acp1 = cp; acp2 = cp2; } cp2 = cp2->nextcp; } cp = cp->nextcp; } cdist = hypot(acp1->pt->xt - acp2->pt->xt, acp1->pt->yt - acp2->pt->yt); if ((maxdist > 0) && (cdist > 0)) { ang = atan2(acp2->pt->yt - acp1->pt->yt, acp2->pt->xt - acp1->pt->xt); tang = atan2(acp2->ty - acp1->ty, acp2->tx - acp1->tx); tang -= ang; pscrap->mxx = cos(tang); pscrap->mxy = -sin(tang); pscrap->myx = sin(tang); pscrap->myy = cos(tang); scale = maxdist / cdist; pscrap->ms = scale; pscrap->mr = - tang / 3.14159265358 * 180.0; pscrap->mxx *= scale; pscrap->myy *= scale; pscrap->mxy *= scale; pscrap->myx *= scale; pscrap->mx = acp1->tx - pscrap->mxx * acp1->pt->xt - pscrap->mxy * acp1->pt->yt; pscrap->my = acp1->ty - pscrap->myx * acp1->pt->xt - pscrap->myy * acp1->pt->yt; #else // 1. najdeme transformaciu targetov // thprintf("\n\n\nscap: %s\n",pscrap->name); movetx = 0.0; movety = 0.0; cp = pscrap->fcpp; while (cp != NULL) { movetx += cp->tx; movety += cp->ty; cp = cp->nextcp; } movetx = movetx / double(pscrap->ncp); movety = movety / double(pscrap->ncp); sumXx = 0.0; sumYy = 0.0; sumYx = 0.0; sumXy = 0.0; sumxx = 0.0; sumyy = 0.0; cp = pscrap->fcpp; while (cp != NULL) { X = cp->tx - movetx; Y = cp->ty - movety; // thprintf("%.4f,%.4f -> %.4f,%.4f\n",X,Y,cp->pt->xt,cp->pt->yt); sumXx += X * cp->pt->xt; sumYy += Y * cp->pt->yt; sumXy += X * cp->pt->yt; sumYx += Y * cp->pt->xt; sumxx += cp->pt->xt * cp->pt->xt; sumyy += cp->pt->yt * cp->pt->yt; cp = cp->nextcp; } a = (sumXx + sumYy) / (sumxx + sumyy); b = (sumYx - sumXy) / (sumxx + sumyy); if (((sumxx + sumyy) > 0) && (hypot(a,b) > 0.0)) { // thprintf("a = %.4f;\nb = %.4f\n",a,b); pscrap->mxx = a; pscrap->mxy = -b; pscrap->myx = b; pscrap->myy = a; pscrap->mx = movetx; pscrap->my = movety; pscrap->ms = hypot(a,b); pscrap->mr = - atan2(b,a) / 3.14159265358 * 180.0; #endif } else { pscrap->mx = pscrap->fcpp->tx - pscrap->fcpp->pt->xt; pscrap->my = pscrap->fcpp->ty - pscrap->fcpp->pt->yt; } } pscrap = pscrap->proj_next_scrap; } // prejde bod za bodom a spocita ich suradnice ii = this->pt_list.begin(); double tmpx, tmpy; while (ii != this->pt_list.end()) { if (ii->pscrap->proj->id == prj->id) { pscrap = ii->pscrap; tmpx = ii->xt; tmpy = ii->yt; ii->xt = pscrap->mxx * tmpx + pscrap->mxy * tmpy + pscrap->mx; ii->yt = pscrap->myx * tmpx + pscrap->myy * tmpy + pscrap->my; ii->dbgx0 = ii->xt; ii->dbgy0 = ii->yt; } ii++; } // transformuje rotacie a scales pscrap = prj->first_scrap; thline * pline; thpoint * ppoint; thdb2dlp * plp; th2ddataobject * p2dobj; thdb1ds * neas; while (pscrap != NULL) { p2dobj = pscrap->fs2doptr; while (p2dobj != NULL) { switch (p2dobj->get_class_id()) { case TT_POINT_CMD: ppoint = (thpoint *) p2dobj; if (!thisnan(ppoint->orient)) { ppoint->orient += pscrap->mr; if (ppoint->orient < 0) { ppoint->orient += 360.0; } else if (ppoint->orient >= 360.0) { ppoint->orient -= 360.0; } } else if (ppoint->align != TT_POINT_ALIGN_C) thdb2d_rot_align(ppoint->align,pscrap->mr); // ppoint->xsize *= pscrap->ms; // ppoint->ysize *= pscrap->ms; switch (ppoint->type) { case TT_POINT_TYPE_STATION_NAME: if (ppoint->text == NULL) { neas = pscrap->get_nearest_station(ppoint->point); if (neas == NULL) { ppoint->throw_source(); threthrow2(("unable to determine station name")) } else { ppoint->station_name.name = neas->name; ppoint->station_name.psurvey = neas->survey; ppoint->text = neas->name; } } break; case TT_POINT_TYPE_ALTITUDE: if (ppoint->ysize > 0.0) { neas = pscrap->get_nearest_station(ppoint->point); if (neas == NULL) { ppoint->throw_source(); threthrow2(("unable to determine altitude")) } else { ppoint->xsize += neas->z; ppoint->ysize = 0.0; } } break; default: break; } break; case TT_LINE_CMD: pline = (thline *) p2dobj; plp = pline->first_point; while (plp != NULL) { if (!thisnan(plp->orient)) { plp->orient += pscrap->mr; if (plp->orient < 0) { plp->orient += 360.0; } else if (plp->orient >= 360.0) { plp->orient -= 360.0; } } // plp->rsize *= pscrap->ms; // plp->lsize *= pscrap->ms; switch (pline->type) { case TT_LINE_TYPE_SLOPE: if ((plp->tags & TT_LINEPT_TAG_SIZE) > 0) plp->lsize *= pscrap->ms; break; case TT_LINE_TYPE_WALL: if (((plp->tags & TT_LINEPT_TAG_ALTITUDE) > 0) && (plp->lsize > 0.0)) { neas = pscrap->get_nearest_station(plp->point); if (neas == NULL) { pline->throw_source(); threthrow2(("unable to determine altitude")) } else { plp->rsize += neas->z; plp->lsize = 0.0; } } break; } plp = plp->nextlp; } break; } p2dobj = p2dobj->nscrapoptr; } pscrap = pscrap->proj_next_scrap; } } void thdb2d::pp_calc_points_z(thdb2dprj * prj) { // let's calculate drifts // prejde scrap za scrapom thscrap * pscrap = prj->first_scrap; thdb2dcp * cp; while (pscrap != NULL) { cp = pscrap->fcpp; while (cp != NULL) { cp->dx = cp->tx - cp->pt->xt; cp->dy = cp->ty - cp->pt->yt; cp->oxt = cp->pt->xt; cp->oyt = cp->pt->yt; cp = cp->nextcp; } pscrap = pscrap->proj_next_scrap; } // prejde bod za bodom a spocita ich suradnice thdb2dpt_list::iterator ii = this->pt_list.begin(); double cpw, totalw, att, ztt, dist; while (ii != this->pt_list.end()) { if ((ii->pscrap->proj->id == prj->id) && (ii->pscrap->ncp > 0)) { cp = ii->pscrap->fcpp; totalw = 0.0; att = 0.0; ztt = 0.0; while (cp != NULL) { dist = hypot(cp->oxt - ii->xt, cp->oyt - ii->yt); if (dist > 0) { cpw = 1.0 / (dist * dist); att += cp->ta * cpw; ztt += cp->tz * cpw; totalw += cpw; } else { att = cp->ta; ztt = cp->tz; totalw = 1.0; break; } cp = cp->nextcp; } if (totalw > 0) { ii->at = att / totalw; ii->zt = ztt / totalw; } } ii++; } } void thdb2d::pp_shift_points(thdb2dprj * prj) { // let's calculate drifts // prejde scrap za scrapom thscrap * pscrap = prj->first_scrap; thdb2dcp * cp; while (pscrap != NULL) { cp = pscrap->fcpp; while (cp != NULL) { cp->dx = cp->tx - cp->pt->xt; cp->dy = cp->ty - cp->pt->yt; cp->oxt = cp->pt->xt; cp->oyt = cp->pt->yt; cp = cp->nextcp; } pscrap = pscrap->proj_next_scrap; } // prejde bod za bodom a spocita ich suradnice thdb2dpt_list::iterator ii = this->pt_list.begin(); double cpw, totalw, cdx, cdy, dist; while (ii != this->pt_list.end()) { if ((ii->pscrap->proj->id == prj->id) && (ii->pscrap->ncp > 0)) { cp = ii->pscrap->fcpp; totalw = 0.0; cdx = 0.0; cdy = 0.0; while (cp != NULL) { dist = hypot(cp->oxt - ii->xt, cp->oyt - ii->yt); if (dist > 0) { cpw = 1.0 / (dist * dist); cdx += cp->dx * cpw; cdy += cp->dy * cpw; totalw += cpw; } else { cdx = cp->dx; cdy = cp->dy; totalw = 1.0; break; } cp = cp->nextcp; } if (totalw > 0.0) { cdx = cdx / totalw; cdy = cdy / totalw; } ii->xt = ii->xt + cdx; ii->yt = ii->yt + cdy; } ii++; } } void thdb2d::pp_morph_points(thdb2dprj * prj) { // initialize morphing function thscrap * pscrap = prj->first_scrap; thdb2dcp * cp; th2ddataobject * pobj; thpoint * pointp; while (pscrap != NULL) { cp = pscrap->fcpp; while (cp != NULL) { pscrap->morph.insert_point(thvec2(cp->pt->xt, cp->pt->yt), thvec2(cp->tx, cp->ty), cp->st->uid); cp = cp->nextcp; } pobj = pscrap->fs2doptr; while (pobj != NULL) { if (pobj->get_class_id() == TT_POINT_CMD) { pointp = (thpoint *) pobj; if (pointp->type == TT_POINT_TYPE_EXTRA) { pointp->check_extra(); if ((pointp->from_name.id > 0) && (!thisnan(pointp->xsize))) { pscrap->morph.insert_zoom_point( thvec2(pointp->point->xt, pointp->point->yt), pointp->xsize, thdb.db1d.station_vec[pointp->from_name.id - 1].uid); } } } pobj = pobj->nscrapoptr; } pscrap->morph.insert_lines_from_db(); pscrap->morph.init(); pscrap = pscrap->proj_next_scrap; } // prejde bod za bodom a spocita ich suradnice thvec2 it; thdb2dpt_list::iterator ii = this->pt_list.begin(); while (ii != this->pt_list.end()) { if ((ii->pscrap->proj->id == prj->id) && (ii->pscrap->ncp > 0)) { it = ii->pscrap->morph.forward(thvec2(ii->xt, ii->yt)); ii->xt = it.m_x; ii->yt = it.m_y; ii->dbgx1 = ii->xt; ii->dbgy1 = ii->yt; } ii++; } } struct joincand { th2ddataobject * obj; thdb2dlp * lp; thdb2dpt * pt; long fileid; }; void thdb2d::pp_process_joins(thdb2dprj * prj) { thjoin * jptr, * tjptr; prj->first_join_list = NULL; prj->last_join_list = NULL; thscrap * sc1 = NULL, * sc2 = NULL; thdb2dji * ji, * tji; thdb2dpt * searchpt; thscrapen * se1, * se2, * fse1, * fse2; thline * l1, * l2; int ccount; double mindst, cdst; unsigned long nactive; // find autojoin candidates std::list joincandlist; std::list::iterator jci, njci; const char * cfile = ""; long fileid = 0; thscrap * scp; th2ddataobject * o2d; thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_SCRAP_CMD) { scp = (thscrap *)(*obi); if ((scp->proj->type != TT_2DPROJ_NONE) && (scp->proj->id == prj->id)) { o2d = scp->fs2doptr; while (o2d != NULL) { // check object source file if (strcmp(cfile, o2d->source.name) != 0) { cfile = o2d->source.name; fileid++; } // insert candidates (not label) thline * pln; switch (o2d->get_class_id()) { case TT_LINE_CMD: pln = (thline*) o2d; switch (pln->type) { case TT_LINE_TYPE_LABEL: case TT_LINE_TYPE_SECTION: case TT_LINE_TYPE_ARROW: case TT_LINE_TYPE_GRADIENT: case TT_LINE_TYPE_SURVEY: break; default: if (pln->first_point != NULL) { joincand jc; jc.obj = pln; jc.fileid = fileid; jc.pt = pln->first_point->point; jc.lp = pln->first_point; joincandlist.insert(joincandlist.end(), jc); if ((pln->first_point->point->x != pln->last_point->point->x) || (pln->first_point->point->y != pln->last_point->point->y)) { jc.obj = pln; jc.fileid = fileid; jc.pt = pln->last_point->point; jc.lp = pln->last_point; joincandlist.insert(joincandlist.end(), jc); } } break; } break; } o2d = o2d->nscrapoptr; } } } obi++; } // prida na koniec automaticke joiny jci = joincandlist.begin(); while (jci != joincandlist.end()) { njci = jci; njci++; while ((njci != joincandlist.end()) && (jci->fileid == njci->fileid)) { if ( (jci->obj->fscrapptr->id != njci->obj->fscrapptr->id) && (jci->obj->fscrapptr->proj->id == njci->obj->fscrapptr->proj->id) && (jci->pt->x == njci->pt->x) && (jci->pt->y == njci->pt->y)) { // add automatic join here tjptr = (thjoin*) thdb.create("join",thobjectsrc()); thdb.insert(tjptr); tjptr->proj = jci->obj->fscrapptr->proj; // TODO: check smoothness??? tjptr->smooth = TT_FALSE; if (prj->last_join == NULL) { prj->first_join = tjptr; prj->last_join = tjptr; } else { tjptr->proj_prev_join = prj->last_join; prj->last_join->proj_next_join = tjptr; prj->last_join = tjptr; } tji = this->insert_join_item(); tji->object = jci->obj; tji->line_point = jci->lp; tji->point = jci->pt; tji->next_item = this->insert_join_item(); tji->next_item->object = njci->obj; tji->next_item->line_point = njci->lp; tji->next_item->point = njci->pt; tji->next_item->prev_item = tji; tjptr->first_item = tji; tjptr->last_item = tji->next_item; } njci++; } jci++; } // prejde join za joinom a vytovori zoznamy jptr = prj->first_join; while (jptr != NULL) { nactive = 0; ji = jptr->first_item; while (ji != NULL) { switch (ji->object->get_class_id()) { case TT_POINT_CMD: if (ji->point != NULL) { ji->is_active = true; nactive++; } else ji->is_active = false; break; case TT_LINE_CMD: if ((((thline *)ji->object)->first_point != NULL) && (((thline *)ji->object)->first_point->point != NULL)) { ji->is_active = true; nactive++; } else ji->is_active = false; break; case TT_SCRAP_CMD: if (ji->next_item == NULL) break; for(ccount = 0; ccount < jptr->count; ccount++) { // z dvoch scrapov urobime body na ciarach if (ccount == 0) { sc1 = (thscrap *) ji->object; ji->is_active = false; ji = ji->next_item; sc2 = (thscrap *) ji->object; ji->is_active = false; } // mame 2 scrapy, najdeme spolocne ciary fse1 = sc1->get_ends(); fse2 = sc2->get_ends(); #ifdef THDEBUG thprintf("\nsearching for join %d of %s and %s:\n\t%% OCTAVE CODE\n\thold on;\n",ccount+1,sc1->name,sc2->name); #endif if (ccount == 0) { se1 = fse1; while (se1 != NULL) { se1->cxt = (se1->lp1->point->xt + se1->lp2->point->xt) / 2.0; se1->cyt = (se1->lp1->point->yt + se1->lp2->point->yt) / 2.0; #ifdef THDEBUG thprintf("\tplot([%.2f,%.2f],[%.2f,%.2f],\"r;;\");hold on;\n",se1->lp1->point->xt,se1->lp2->point->xt,se1->lp1->point->yt,se1->lp2->point->yt); thprintf("\tplot([%.2f],[%.2f],\"xm;;\");hold on;\n",se1->cxt,se1->cyt); #endif se1->active = true; se1 = se1->next_end; } se2 = fse2; while (se2 != NULL) { se2->cxt = (se2->lp1->point->xt + se2->lp2->point->xt) / 2.0; se2->cyt = (se2->lp1->point->yt + se2->lp2->point->yt) / 2.0; #ifdef THDEBUG thprintf("\tplot([%.2f,%.2f],[%.2f,%.2f],\"b;;\");hold on;\n",se2->lp1->point->xt,se2->lp2->point->xt,se2->lp1->point->yt,se2->lp2->point->yt); thprintf("\tplot([%.2f],[%.2f],\"xc;;\");hold on;\n",se2->cxt,se2->cyt); #endif se2->active = true; se2 = se2->next_end; } } se1 = fse1; while ((se1 != NULL) && (!(se1->active))) { se1 = se1->next_end; fse1 = se1; } se2 = fse2; while ((se2 != NULL) && (!(se2->active))) { se2 = se2->next_end; fse2 = se2; } if ((fse1 != NULL) && (fse2 != NULL)) mindst = hypot(fse1->cxt - fse2->cxt, fse1->cyt - fse2->cyt); else { // nenasli sme uz dva konce, skipujeme az na koniec jptr->throw_source(); threwarning2(("unable to join scraps (count %d)", ccount + 1)); ccount = jptr->count; goto UNABLE_TO_JOIN; } se1 = fse1; while (se1 != NULL) { se2 = sc2->get_ends(); while (se2 != NULL) { cdst = hypot(se1->cxt - se2->cxt, se1->cyt - se2->cyt); //#ifdef THDEBUG // thprintf("\ttrying (%.2f,%.2f) - (%.2f,%.2f) = %.2f (MIN: %.2f)\n",se1->cxt,se1->cyt,se2->cxt,se2->cyt,cdst,mindst); //#endif if ((cdst < mindst) && (se1->active) && (se2->active)) { fse1 = se1; fse2 = se2; mindst = cdst; } se2 = se2->next_end; } se1 = se1->next_end; } fse1->active = false; fse2->active = false; // mame dva najblizsie, zistime ci ich netreba otocit if (((fse1->lp1->point->xt - fse1->cxt) * (fse2->lp1->point->xt - fse2->cxt) + (fse1->lp1->point->yt - fse1->cyt) * (fse2->lp1->point->yt - fse2->cyt)) < 0) { thline * tline; thdb2dlp * tlp; tline = fse2->l2; fse2->l2 = fse2->l1; fse2->l1 = tline; tlp = fse2->lp2; fse2->lp2 = fse2->lp1; fse2->lp1 = tlp; } // vytvorime z nich joiny #ifdef THDEBUG thprintf("\ncreating new 2 joins:\n"); thprintf("\tline %ld (%.2f,%.2f) -- line %ld (%.2f,%.2f)\n", fse1->l1->id, fse1->lp1->point->xt, fse1->lp1->point->yt, fse2->l1->id, fse2->lp1->point->xt, fse2->lp1->point->yt); thprintf("\tline %ld (%.2f,%.2f) -- line %ld (%.2f,%.2f)\n", fse1->l2->id, fse1->lp2->point->xt, fse1->lp2->point->yt, fse2->l2->id, fse2->lp2->point->xt, fse2->lp2->point->yt); #endif tjptr = (thjoin*) thdb.create("join",thobjectsrc()); thdb.insert(tjptr); tjptr->proj = jptr->proj; tjptr->smooth = jptr->smooth; tjptr->proj_prev_join = jptr; tjptr->proj_next_join = (thjoin*) thdb.create("join",thobjectsrc()); thdb.insert(tjptr->proj_next_join); tjptr->proj_next_join->proj_prev_join = tjptr; tjptr->proj_next_join->proj_next_join = jptr->proj_next_join; if (jptr->proj_next_join != NULL) jptr->proj_next_join->proj_prev_join = tjptr->proj_next_join; jptr->proj_next_join = tjptr; tji = this->insert_join_item(); tji->object = fse1->l1; tji->line_point = fse1->lp1; tji->point = fse1->lp1->point; tji->next_item = this->insert_join_item(); tji->next_item->object = fse2->l1; tji->next_item->line_point = fse2->lp1; tji->next_item->point = fse2->lp1->point; tji->next_item->prev_item = tji; tjptr->first_item = tji; tjptr->last_item = tji->next_item; tji = this->insert_join_item(); tji->object = fse1->l2; tji->line_point = fse1->lp2; tji->point = fse1->lp2->point; tji->next_item = this->insert_join_item(); tji->next_item->object = fse2->l2; tji->next_item->line_point = fse2->lp2; tji->next_item->point = fse2->lp2->point; tji->next_item->prev_item = tji; tjptr->proj_next_join->first_item = tji; tjptr->proj_next_join->last_item = tji->next_item; UNABLE_TO_JOIN:; } // for count break; default: ji->is_active = false; } ji = ji->next_item; } if (nactive > 1) { ji = jptr->first_item; searchpt = NULL; while ((ji != NULL) && (searchpt == NULL)) { if ((ji->is_active) && (ji->point != NULL)) searchpt = ji->point; ji = ji->next_item; } // let's search first two lines for search point if (searchpt == NULL) { l1 = NULL; l2 = NULL; ji = jptr->first_item; while ((ji != NULL) && (l2 == NULL)) { if (ji->is_active && (ji->object->get_class_id() == TT_LINE_CMD)) { if (l1 == NULL) l1 = ((thline *)ji->object); else l2 = ((thline *)ji->object); } ji = ji->next_item; } if (l2 == NULL) { jptr->throw_source(); ththrow(("can not determine any join point")) } // teraz najde spolocny bod kriviek l1 a l2 double mindist = hypot(l1->first_point->point->xt - l2->first_point->point->xt, l1->first_point->point->yt - l2->first_point->point->yt); searchpt = l1->first_point->point; double dist = hypot(l1->last_point->point->xt - l2->first_point->point->xt, l1->last_point->point->yt - l2->first_point->point->yt); if (dist < mindist) { searchpt = l1->last_point->point; mindist = dist; } dist = hypot(l1->first_point->point->xt - l2->last_point->point->xt, l1->first_point->point->yt - l2->last_point->point->yt); if (dist < mindist) { searchpt = l1->first_point->point; mindist = dist; } dist = hypot(l1->last_point->point->xt - l2->last_point->point->xt, l1->last_point->point->yt - l2->last_point->point->yt); if (dist < mindist) { searchpt = l1->last_point->point; mindist = dist; } } // here we have search point // let's traverse all lines, where no point is define it ji = jptr->first_item; while (ji != NULL) { if (ji->is_active && (ji->point == NULL) && (ji->object->get_class_id() == TT_LINE_CMD)) { if (hypot(((thline*)ji->object)->first_point->point->xt - searchpt->xt, ((thline*)ji->object)->first_point->point->yt - searchpt->yt) < hypot(((thline*)ji->object)->last_point->point->xt - searchpt->xt, ((thline*)ji->object)->last_point->point->yt - searchpt->yt)) { ji->point = ((thline*)ji->object)->first_point->point; ji->line_point = ((thline*)ji->object)->first_point; } else { ji->point = ((thline*)ji->object)->last_point->point; ji->line_point = ((thline*)ji->object)->last_point; } } ji = ji->next_item; } // now let's search for control points if (jptr->smooth == TT_TRUE) { ji = jptr->first_item; while (ji != NULL) { // && (ji->line_point->smooth == TT_TRUE) if ((ji->is_active) && (ji->line_point != NULL)) { if (ji->line_point->cp2 != NULL) ji->cp1 = ji->line_point->cp2; if ((ji->line_point->nextlp != NULL) && (ji->line_point->nextlp->cp1 != NULL)) ji->cp2 = ji->line_point->nextlp->cp1; } ji = ji->next_item; } } // we have at all active positions point defined, // now let's create and insert new list thdb2dji * target_item = NULL, * first_active_item = NULL, * ccitem, * ppitem; ji = jptr->first_item; while ((ji != NULL) && (target_item == NULL)) { if (ji->is_active) { if (ji->point->join_item != NULL) target_item = ji; if (first_active_item == NULL) first_active_item =ji; } ji = ji->next_item; } if (target_item == NULL) { target_item = first_active_item; if (prj->last_join_list == NULL) { prj->last_join_list = target_item; prj->first_join_list = target_item; } else { prj->last_join_list->next_list = target_item; target_item->prev_list = prj->last_join_list; prj->last_join_list = target_item; } target_item->point->join_item = target_item; } // teraz pridame itemy leziace okolo target bool ideme_nahor = true; ppitem = target_item; // add to the end of list while (ppitem->next_list_item != NULL) { ppitem = ppitem->next_list_item; } ccitem = target_item->prev_item; while ((ccitem != NULL) || ideme_nahor) { if ((ccitem != NULL) && (ccitem->is_active)) { if (ccitem->point->join_item == NULL) { ccitem->point->join_item = target_item; ppitem->next_list_item = ccitem; ccitem->prev_list_item = ppitem; ppitem = ccitem; } } if (ideme_nahor && (ccitem != NULL)) ccitem = ccitem->prev_item; if ((ccitem == NULL) && ideme_nahor) { ideme_nahor = false; ccitem = target_item; } if (!ideme_nahor) ccitem = ccitem->next_item; } } // more than one active item, add join list jptr = jptr->proj_next_join; } // zredukuje viacnasobne joiny // vyrovna joiny thdb2dji * jlist = prj->first_join_list; bool has_target; double tx = 0.0, ty = 0.0, tn; while (jlist != NULL) { has_target = false; ji = jlist; while ((!has_target) && (ji != NULL)) { if ((ji->object->get_class_id() == TT_POINT_CMD) && (((thpoint*)ji->object)->cpoint != NULL)) { has_target = true; tx = ((thpoint*)ji->object)->cpoint->tx; ty = ((thpoint*)ji->object)->cpoint->ty; } ji = ji->next_list_item; } if (!has_target) { tx = 0.0; ty = 0.0; tn = 0.0; ji = jlist; while (ji != NULL) { tx += ji->point->xt; ty += ji->point->yt; tn += 1.0; ji = ji->next_list_item; } tx /= tn; ty /= tn; } // now let's add control points ji = jlist; thdb2dcp * cp; while (ji != NULL) { if ((ji->object->get_class_id() != TT_POINT_CMD) || (((thpoint*)ji->object)->cpoint == NULL)) { cp = ji->point->pscrap->insert_control_point(); cp->pt = ji->point; cp->tx = tx; cp->ty = ty; } ji = ji->next_list_item; } jlist = jlist->next_list; } } void thdb2d_pp_adjust_cp(double & xp, double & yp, double x, double y, double & xn, double & yn) { double v1x, v2x, v1y, v2y, vvx, vvy, dv, d1, d2; v1x = x - xp; v1y = y - yp; d1 = hypot(v1x,v1y); v2x = xn - x; v2y = yn - y; d2 = hypot(v2x,v2y); if ((d1 > 0.0) && (d2 > 0.0)) { vvx = v1x + v2x; vvy = v1y + v2y; dv = hypot(vvx,vvy); if (dv > 0.0) { vvx /= dv; vvy /= dv; } else { vvx = -v1y / d1; vvy = v1x / d1; } xp = x - d1 * vvx; yp = y - d1 * vvy; xn = x + d2 * vvx; yn = y + d2 * vvy; } return; } void thdb2d::pp_smooth_lines(thdb2dprj * prj) { // prejde scrap za scrapom, ciaru za ciarov a vyrovna vsetky smooth body thscrap * pscrap; th2ddataobject * optr; thdb2dlp * pt; pscrap = prj->first_scrap; while (pscrap != NULL) { optr = pscrap->fs2doptr; while (optr != NULL) { if ((optr->get_class_id() == TT_LINE_CMD) && (((thline *)optr)->first_point != NULL) && (((thline *)optr)->first_point->nextlp != NULL)) { pt = ((thline *) optr)->first_point->nextlp; while (pt->nextlp != NULL) { if ((pt->smooth == TT_TRUE) && (pt->cp2 != NULL) && (pt->nextlp->cp1 != NULL)) thdb2d_pp_adjust_cp(pt->cp2->xt, pt->cp2->yt, pt->point->xt, pt->point->yt, pt->nextlp->cp1->xt, pt->nextlp->cp1->yt); pt = pt->nextlp; } } optr = optr->nscrapoptr; } pscrap = pscrap->proj_next_scrap; } } void thdb2d::pp_smooth_joins(thdb2dprj * prj) { double x1,x2,y1,y2,d1,d2,tmpx,tmpy,testx = 0.0,testy = 0.0,dt; bool has_test; unsigned long ncp, ncp1, ncp2; thdb2dji * jlist = prj->first_join_list, * ji; thdb2dpt * tcp; while (jlist != NULL) { ji = jlist; has_test = false; // 1. najde testovaci vektor while ((!has_test) && (ji != NULL)) { if (ji->cp1 != NULL) { has_test = true; testx = ji->cp1->xt - ji->point->xt; testy = ji->cp1->yt - ji->point->yt; } else if (ji->cp2 != NULL) { has_test = true; testx = ji->cp2->xt - ji->point->xt; testy = ji->cp2->yt - ji->point->yt; } ji = ji->next_list_item; } // prejde vsetky CP, prislusne ich poprehadzuje do kategorii, // vyrata xy1 a xy2 ncp1 = 0; ncp2 = 0; ncp = 0; if (has_test) { ji = jlist; while (ji != NULL) { if (ji->cp1 != NULL) { tmpx = ji->cp1->xt - ji->point->xt; tmpy = ji->cp1->yt - ji->point->yt; if ((tmpx * testx + tmpy * testy) < 0) { tcp = ji->cp1; ji->cp1 = ji->cp2; ji->cp2 = tcp; } } else if (ji->cp2 != NULL) { tmpx = ji->cp2->xt - ji->point->xt; tmpy = ji->cp2->yt - ji->point->yt; if ((tmpx * testx + tmpy * testy) > 0) { tcp = ji->cp1; ji->cp1 = ji->cp2; ji->cp2 = tcp; } } if (ji->cp1 != NULL) { tmpx = ji->cp1->xt - ji->point->xt; tmpy = ji->cp1->yt - ji->point->yt; ncp++; if (ncp1 > 0) { x1 += tmpx; y1 += tmpy; } else { x1 = tmpx; y1 = tmpy; } ncp1++; } if (ji->cp2 != NULL) { tmpx = ji->cp2->xt - ji->point->xt; tmpy = ji->cp2->yt - ji->point->yt; ncp++; if (ncp2 > 0) { x2 += tmpx; y2 += tmpy; } else { x2 = tmpx; y2 = tmpy; } ncp2++; } ji = ji->next_list_item; } if (ncp1 == 0) { x1 = 0.0; y1 = 0.0; } if (ncp2 == 0) { x2 = 0.0; y2 = 0.0; } // samotne vyrovnanie if (ncp > 1) { thdb2d_pp_adjust_cp(x1,y1,0.0,0.0,x2,y2); // znormuje dlzky cp vektorov d1 = hypot(x1,y1); d2 = hypot(x2,y2); if (d1 > 0) { x1 /= d1; y1 /= d1; } if (d2 > 0) { x2 /= d2; y2 /= d2; } ji = jlist; while (ji != NULL) { if (ji->cp1 != NULL) { tmpx = ji->cp1->xt - ji->point->xt; tmpy = ji->cp1->yt - ji->point->yt; dt = hypot(tmpx,tmpy); ji->cp1->xt = ji->point->xt + x1 * dt; ji->cp1->yt = ji->point->yt + y1 * dt; } if (ji->cp2 != NULL) { tmpx = ji->cp2->xt - ji->point->xt; tmpy = ji->cp2->yt - ji->point->yt; dt = hypot(tmpx,tmpy); ji->cp2->xt = ji->point->xt + x2 * dt; ji->cp2->yt = ji->point->yt + y2 * dt; } ji = ji->next_list_item; } } // koniec samotneho vyrovnania } // koniec has_test jlist = jlist->next_list; } } #define calcdist(p1,p2) { \ tmp = hypot(p1->dbgx0 - p2->dbgx0, p1->dbgy0 - p2->dbgy0); \ if (tmp > 0.0) { \ tmp = hypot(p1->xt - p2->xt, p1->yt - p2->yt) / tmp; \ tmp = 100.0 * (1 - ((tmp > 1.0) ? (1.0 / tmp) : tmp)); \ cavdist += tmp; \ if (cdist < tmp) { \ cdist = tmp; \ ps->maxdistp1 = p1; \ ps->maxdistp2 = p2; \ } \ numcavdist += 1.0; \ } \ } void thdb2d::pp_calc_distortion(thdb2dprj * prj) { prj->amaxdist = 0.0; double nums = 0.0; th2ddataobject * so, * so2; thdb2dlp * lp, * lp2; double cdist, cavdist, numcdist, numcavdist, tmp; if (prj->type == TT_2DPROJ_NONE) return; thscrap * ps = prj->first_scrap; if (ps == NULL) return; while (ps != NULL) { cdist = 0.0; numcdist = 0.0; numcavdist = 0.0; ps->maxdistp1 = NULL; ps->maxdistp2 = NULL; cavdist = 0.0; so = ps->fs2doptr; while (so != NULL) { switch (so->get_class_id()) { case TT_LINE_CMD: lp = ((thline*)so)->first_point; while (lp != NULL) { numcdist += 1.0; if (lp->cp1 != NULL) { calcdist(lp->point, lp->cp1); numcdist += 1.0; } if (lp->cp2 != NULL) { numcdist += 1.0; calcdist(lp->point, lp->cp2); } lp2 = lp->nextlp; while (lp2 != NULL) { calcdist(lp->point, lp2->point); lp2 = lp2->nextlp; } so2 = so->nscrapoptr; while (so2 != NULL) { switch(so2->get_class_id()) { case TT_POINT_CMD: calcdist(((thpoint*)so2)->point,lp->point); break; case TT_LINE_CMD: lp2 = ((thline*)so2)->first_point; while (lp2 != NULL) { calcdist(lp->point, lp2->point); lp2 = lp2->nextlp; } break; } so2 = so2->nscrapoptr; } lp = lp->nextlp; } break; case TT_POINT_CMD: numcdist += 1.0; so2 = so->nscrapoptr; while (so2 != NULL) { switch(so2->get_class_id()) { case TT_POINT_CMD: calcdist(((thpoint*)so)->point,((thpoint*)so2)->point); break; case TT_LINE_CMD: lp2 = ((thline*)so2)->first_point; while (lp2 != NULL) { calcdist(((thpoint*)so)->point, lp2->point); lp2 = lp2->nextlp; } break; } so2 = so2->nscrapoptr; } break; } so = so->nscrapoptr; } ps->maxdist = cdist; if (numcavdist > 0.0) { ps->avdist = cavdist / numcavdist; prj->amaxdist += ps->avdist * numcdist; nums += numcdist; } ps = ps->proj_next_scrap; } if (nums > 0.0) prj->amaxdist = prj->amaxdist / nums; else prj->amaxdist = 0; } bool thdb2d::pp_process_adjustments(thdb2dprj * prj) { bool anycp = false; thscrap * ps; th2ddataobject * so; thline * ln; thdb2dlp * lp, * lastlp; thdb2dcp * cp; int Vadj, Hadj; unsigned nlp; double aver; bool lastlpin = false; // scrap za scrapom ps = prj->first_scrap; while (ps != NULL) { // ciara za ciarou so = ps->fs2doptr; while (so != NULL) { if (so->get_class_id() == TT_LINE_CMD) { ln = (thline*) so; // vertical adjustment // 1. skusi ci je nejaky adjustment Vadj = -1; Hadj = -1; lp = ln->first_point; nlp = 0; while (lp != NULL) { nlp++; switch (lp->adjust) { case TT_LINE_ADJUST_HORIZONTAL: if (Hadj < 0) Hadj = 2; else if (Hadj == 0) Hadj = 1; if (Vadj > 0) Vadj = 1; break; case TT_LINE_ADJUST_VERTICAL: if (Vadj < 0) Vadj = 2; else if (Vadj == 0) Vadj = 1; if (Hadj > 0) Hadj = 1; break; default: if (Vadj > 0) Vadj = 1; if (Hadj > 0) Hadj = 1; break; } if (Vadj < 0) Vadj = 0; if (Hadj < 0) Hadj = 0; lp = lp->nextlp; } // adj mame 0 (ziadny), 1 (nejaky), 2 (vsetky) if (nlp > 1) { // horizontalne switch (Hadj) { case 2: // zratame priemer a vlozime vsetky aver = 0.0; lp = ln->first_point; while (lp != NULL) { aver += lp->point->yt; lp = lp->nextlp; } aver /= (double) nlp; lp = ln->first_point; while (lp != NULL) { cp = ln->fscrapptr->insert_control_point(); cp->pt = lp->point; cp->tx = lp->point->xt; cp->ty = aver; lp = lp->nextlp; } anycp = true; break; case 1: // poojdeme bod za bodom, najdeme najblizsi predchadzajuci // ak nie tak nasledujuci a pouzijeme jeho yt lp = ln->first_point; lastlp = NULL; while (lp != NULL) { if (lp->adjust != TT_LINE_ADJUST_HORIZONTAL) { lastlpin = false; lastlp = lp; break; } lp = lp->nextlp; } if (lastlp == NULL) break; lp = ln->first_point; while (lp != NULL) { if (lp->adjust == TT_LINE_ADJUST_HORIZONTAL) { if (!lastlpin) { lastlpin = true; cp = ln->fscrapptr->insert_control_point(); cp->pt = lastlp->point; cp->tx = lastlp->point->xt; cp->ty = lastlp->point->yt; } cp = ln->fscrapptr->insert_control_point(); cp->pt = lp->point; cp->tx = lp->point->xt; cp->ty = lastlp->point->yt; anycp = true; } else { lastlpin = false; lastlp = lp; } lp = lp->nextlp; } break; } switch (Vadj) { case 2: // zratame priemer a vlozime vsetky aver = 0.0; lp = ln->first_point; while (lp != NULL) { aver += lp->point->xt; lp = lp->nextlp; } aver /= (double) nlp; lp = ln->first_point; while (lp != NULL) { cp = ln->fscrapptr->insert_control_point(); cp->pt = lp->point; cp->ty = lp->point->yt; cp->tx = aver; lp = lp->nextlp; } anycp = true; break; case 1: // poojdeme bod za bodom, najdeme najblizsi predchadzajuci // ak nie tak nasledujuci a pouzijeme jeho yt lp = ln->first_point; lastlp = NULL; while (lp != NULL) { if (lp->adjust != TT_LINE_ADJUST_VERTICAL) { lastlpin = false; lastlp = lp; break; } lp = lp->nextlp; } if (lastlp == NULL) break; lp = ln->first_point; while (lp != NULL) { if (lp->adjust == TT_LINE_ADJUST_VERTICAL) { if (!lastlpin) { lastlpin = true; cp = ln->fscrapptr->insert_control_point(); cp->pt = lastlp->point; cp->tx = lastlp->point->xt; cp->ty = lastlp->point->yt; } cp = ln->fscrapptr->insert_control_point(); cp->pt = lp->point; cp->tx = lastlp->point->xt; cp->ty = lp->point->yt; anycp = true; } else { lastlpin = false; lastlp = lp; } lp = lp->nextlp; } break; } } } so = so->nscrapoptr; } // ciara za ciarou ps = ps->proj_next_scrap; } // scrap za scrapom return anycp; } thdb2dprj * thdb2d::get_projection(int id) { thdb2dprj_list::iterator pi; for(pi = this->prj_list.begin(); pi != this->prj_list.end(); pi++) { if (pi->id == id) return &(*pi); } return NULL; } struct area_proc { tharea * area; double x, y, a, s; }; void thdb2d::process_areas_in_projection(thdb2dprj * prj) { if (this->processed_area_outlines) return; this->process_projection(prj); this->processed_area_outlines = true; std::list todo; double xx(0.0), xy(0.0), nx(0.0), ny(0.0), xa(0.0), na(0.0), dx(0.0), dy(0.0); long cnt(0), cnt2; #define ulim(x,y,a) \ { if (cnt == 0) {xx = x; xy = y; xa = a; nx = x; ny = y; na = a;} \ else { \ if (x > xx) xx = x; if (x < nx) nx = x; \ if (y > xy) xy = y; if (y < ny) ny = y; \ if (a > xa) xa = a; if (a < na) na = a; \ } \ cnt++; } thscrap * cscrap; th2ddataobject * obj; tharea * carea(NULL); thdb2dab * bln; area_proc itm; thline * cln; thdb2dlp * clp; for (cscrap = prj->first_scrap; cscrap != NULL; cscrap = cscrap->proj_next_scrap) { for (obj = cscrap->fs2doptr; obj != NULL; obj = obj->nscrapoptr) { if (obj->get_class_id() == TT_AREA_CMD) { carea = (tharea*) obj; cnt = 0; for (bln = carea->first_line; bln != NULL; bln = bln->next_line) { cln = bln->line; for (clp = cln->first_point; clp != NULL; clp = clp->nextlp) { if (clp->cp1 != NULL) ulim(clp->cp1->xt, clp->cp1->yt, clp->cp1->at); if (clp->cp2 != NULL) ulim(clp->cp2->xt, clp->cp2->yt, clp->cp2->at); ulim(clp->point->xt, clp->point->yt, clp->point->at); } } dx = (xx - nx); dy = (xy - ny); if ((cnt > 0) && (dx > 0.0) && (dy > 0.0)) { itm.area = carea; itm.x = 0.5 * (xx + nx); itm.y = 0.5 * (xy + ny); itm.a = 0.5 * (xa + na); itm.s = dy > dx ? (200.0 / dy) : (200.0 / dx); todo.push_back(itm); } } } } // export mp file FILE * mpf; mpf = fopen(thtmp.get_file_name("data.mp"),"w"); fprintf(mpf, "numeric area_border_errors;\narea_border_errors = 0;\n" "string current_scrap, current_src;\n\n\n" "vardef buildcycle(text ll) =\n" " save ta_, tb_, k_, i_, pp_; path pp_[];\n" " k_=0;\n" " for q=ll: pp_[incr k_]=q; endfor\n" " i_=k_;\n" " for i=1 upto k_:\n" " (ta_[i], length pp_[i_]-tb_[i_]) =\n" " pp_[i] intersectiontimes reverse pp_[i_];\n" " if ta_[i]<0:\n" " message(\"[Error: area borders \"& area_border[i] &\" and \"&\n" " area_border[i_] &\" don't intersect in scrap \" & current_scrap &\n" " \" (file \" & current_src & \")]\");\n" " area_border_errors := area_border_errors + 1;\n" " fi\n" " i_ := i;\n" " endfor\n" " for i=1 upto k_: subpath (ta_[i],tb_[i]) of pp_[i] .. endfor\n" " cycle\n" "enddef;\n" "\n" "\n\nbeginfig(1);\n"); std::list::iterator ti; thdb_revision_set_type::iterator ri; const char * sn; long blnum; for (ti = todo.begin(); ti != todo.end(); ti++) { itm = (*ti); carea = itm.area; ri = this->db->revision_set.find(threvision(carea->id, 0)); fprintf(mpf,"\n\n\ncurrent_scrap := \"%s", carea->fscrapptr->name); sn = carea->fscrapptr->fsptr->get_full_name(); if (strlen(sn) > 0) fprintf(mpf,"@%s", sn); fprintf(mpf,"\";\ncurrent_src := \"%s [%ld]\";\n", ri->srcf.name, ri->srcf.line); fprintf(mpf,"string area_border[];\n"); blnum = 1; for (bln = carea->first_line; bln != NULL; bln = bln->next_line) { fprintf(mpf,"area_border[%ld] := \"%s\";\n", blnum, bln->line->name); blnum++; } #define mpfpt(xx,yy) fprintf(mpf, "(%.6f,%.6f)", \ ((xx) - itm.x) * itm.s, \ ((yy) - itm.y) * itm.s) fprintf(mpf,"\ndraw (buildcycle("); for (cnt = 0, bln = carea->first_line; bln != NULL; bln = bln->next_line, cnt++) { cln = bln->line; if (cnt > 0) fprintf(mpf,",("); else fprintf(mpf,"("); for (clp = cln->first_point, cnt2 = 0; clp != NULL; clp = clp->nextlp, cnt2++) { if (cnt2 > 0) { if ((clp->cp1 != NULL) && (clp->cp2 != NULL)) { fprintf(mpf," .. controls "); mpfpt(clp->cp1->xt, clp->cp1->yt); fprintf(mpf," and "); mpfpt(clp->cp2->xt, clp->cp2->yt); fprintf(mpf," .. "); } else { fprintf(mpf," -- "); } } mpfpt(clp->point->xt, clp->point->yt); fprintf(mpf,"\n"); } fprintf(mpf,")"); } fprintf(mpf,"));\n"); } fprintf(mpf,"endfig;\nend;\n"); fclose(mpf); // run metapost #ifdef THWIN32 if (!thini.tex_env) { putenv("TEXMFCNF="); putenv("DVIPSHEADERS="); putenv("GFFONTS="); putenv("GLYPHFONTS="); putenv("MFBASES="); putenv("MFINPUTS="); putenv("MFPOOL="); #ifdef THMSVC putenv("MPINPUTS=../mpost;."); #else putenv("MPINPUTS="); #endif putenv("MPMEMS="); putenv("MPPOOL="); putenv("MPSUPPORT="); putenv("PKFONTS="); putenv("PSHEADERS="); putenv("T1FONTS="); putenv("T1INPUTS="); putenv("T42FONTS="); putenv("TEXCONFIG="); putenv("TEXDOCS="); putenv("TEXFONTMAPS="); putenv("TEXFONTS="); putenv("TEXFORMATS="); putenv("TEXINPUTS="); putenv("TEXMFDBS="); putenv("TEXMFINI="); putenv("TEXPICTS="); putenv("TEXPKS="); putenv("TEXPOOL="); putenv("TEXPSHEADERS="); putenv("TEXSOURCES="); putenv("TFMFONTS="); putenv("TTFONTS="); putenv("VFFONTS="); putenv("WEB2C="); } #endif thbuffer com, wdir; wdir.guarantee(1024); getcwd(wdir.get_buffer(),1024); chdir(thtmp.get_dir_name()); int retcode; com = "\""; com += thini.get_path_mpost(); com += "\" "; com += thini.get_opt_mpost(); com += " data.mp"; #ifdef THDEBUG thprintf("running metapost\n"); #endif retcode = system(com.get_buffer()); thexpmap_log_log_file("data.log", "####################### metapost log file ########################\n", "#################### end of metapost log file ####################\n",true); if (retcode != EXIT_SUCCESS) { chdir(wdir.get_buffer()); ththrow(("metapost exit code -- %d", retcode)) } // load data back to therion FILE * af; af = fopen("data.1","r"); double n[6]; com.guarantee(256); cln = NULL; char * buff = com.get_buffer(); ti = todo.begin(); while ((fscanf(af,"%32s",buff) > 0) && (ti != todo.end())) { if (cnt < 6) { thparse_double(retcode, n[cnt], buff); if (retcode == TT_SV_NUMBER) { cnt++; } } if ((cnt == 6) && (strcmp(buff,"curveto") == 0) && (cln != NULL)) { cln->insert_line_point(6, NULL, n); cnt = 0; } if ((cnt == 2) && ((strcmp(buff,"lineto") == 0) || (strcmp(buff,"moveto") == 0)) && (cln != NULL)) { cln->insert_line_point(2, NULL, n); cnt = 0; } if (strcmp(buff,"newpath") == 0) { cln = new thline; cln->db = this->db; cnt = 0; } if ((cln != NULL) && (cln->first_point != NULL) && (cln->first_point->nextlp != NULL) && (strcmp(buff,"closepath") == 0)) { // close path if not closed if ((cln->last_point->point->x != cln->first_point->point->x) || (cln->last_point->point->y != cln->first_point->point->y)) { n[0] = cln->first_point->point->x; n[1] = cln->first_point->point->y; cln->insert_line_point(2, NULL, n); } #define mpfptback(pt) if (pt != NULL) { \ pt->xt = pt->x / ti->s + ti->x; \ pt->yt = pt->y / ti->s + ti->y; \ pt->zt = ti->a; \ pt->at = ti->a; \ pt->pscrap = carea->fscrapptr; \ } for (clp = cln->first_point; clp != NULL; clp = clp->nextlp) { mpfptback(clp->cp1); mpfptback(clp->cp2); mpfptback(clp->point); } // add line //cln->reverse = true; cln->is_closed = true; cln->fscrapptr = carea->fscrapptr; cln->fsptr = carea->fsptr; cln->type = TT_LINE_TYPE_BORDER; ti->area->m_outline_line = cln; //cln->preprocess(); cln = NULL; // increase area counter ti++; } } if (cln != NULL) delete cln; chdir(wdir.get_buffer()); } void thdb2d::register_u_symbol(int cmd, const char * type) { thdb2d_udef x(cmd, type); thdb2d_udef_map::iterator it = this->m_udef_map.find(x); if (it == this->m_udef_map.end()) { thdb2d_udef_prop * p; p = &(*this->m_udef_list.insert(this->m_udef_list.end(), thdb2d_udef_prop())); this->m_udef_map[x] = p; } } thdb2d_udef_prop * thdb2d::get_u_symbol_prop(int cmd, const char * type) { thdb2d_udef x(cmd, type); thdb2d_udef_map::iterator it = this->m_udef_map.find(x); if (it == this->m_udef_map.end()) return NULL; else return it->second; } void thdb2d_udef_prop::reset() { this->m_assigned = true; this->m_used = false; } void thdb2d::use_u_symbol(int cmd, const char * type) { thdb2d_udef_prop * p = get_u_symbol_prop(cmd, type); p->m_used = true; } void thdb2d::reset_u_symbols() { thdb2d_udef_map::iterator it; for(it = this->m_udef_map.begin(); it != this->m_udef_map.end(); it++) { it->second->reset(); } } bool thdb2d::is_u_symbol_used(int cmd, const char * type) { thdb2d_udef_prop * p = get_u_symbol_prop(cmd, type); return p->m_used; } void thdb2d::export_mp_header(FILE * f) { thdb2d_udef_map::iterator it; fprintf(f, "\n%% user defined symbols defaults\n"); for(it = this->m_udef_map.begin(); it != this->m_udef_map.end(); it++) { switch (it->first.m_command) { case TT_POINT_CMD: fprintf(f, "let p_u_%s = p_u;\n", it->first.m_type); fprintf(f, "def p_u_%s_legend = p_u_%s((0.5,0.5) inscale,0.0,1.0,(0,0)) enddef;\n", it->first.m_type, it->first.m_type); break; case TT_LINE_CMD: fprintf(f, "let l_u_%s = l_u;\n", it->first.m_type); fprintf(f, "def l_u_%s_legend = l_u_%s(((-.3,0.5) .. (.3,.3) .. (.7,.7) .. (1.3,.5)) inscale) enddef;\n", it->first.m_type, it->first.m_type); break; case TT_AREA_CMD: fprintf(f, "let a_u_%s = a_u;\n", it->first.m_type); fprintf(f, "def a_u_%s_legend = a_u_%s(buildcycle((((-1,0) -- (1,0) -- (1,1) -- (0,1) -- (0,-1)) inscale))) enddef;\n", it->first.m_type, it->first.m_type); break; } } fprintf(f, "%% end of user defined symbols\n\n"); } therion/thscrapen.cxx0000664000175000017500000000217110625655142013770 0ustar useruser/** * @file thscrapen.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thscrapen.h" thscrapen::thscrapen() { this->next_end = NULL; this->l1 = NULL; this->lp1 = NULL; this->l2 = NULL; this->lp2 = NULL; } therion/thwarpp.cxx0000664000175000017500000001454712047265472013503 0ustar useruser/** * @file warpp.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thwarpp.h" #include "thscrap.h" #include "th2ddataobject.h" #include "thpoint.h" #include "thconfig.h" thwarpp::~thwarpp() {} void thwarpp::self_delete() { delete this; } thscrap * thwarpp::get_scrap() { if (this->m_sketch != NULL) return this->m_sketch->m_scrap; return NULL; } void thwarpp::process_station_vector( thwarptrans & tw, double ph ) { thsketchst_list::iterator ii; for (ii = this->stations.begin(); ii != this->stations.end(); ii++) { thdb1ds & st = thdb.db1d.station_vec[ii->station.id - 1]; std::string name( st.name ); tw.insert_point( ii->code, name, thvec2(ii->x, ph - ii->y), thvec2(st.x, - st.y) ); // thprintf("insert %s from %.2f %.2f to %.2f %.2f \n", // st.name, ii->x, ph - ii->y, st.x, - st.y ); } } void thwarpp::process_leg_vector( thwarptrans & tw ) { for ( thsketchlg_list::iterator jj = this->legs.begin(); jj != this->legs.end(); ++jj ) { // thprintf("insert line %s %s\n", jj->from.name, jj->to.name ); std::string f( jj->from.name ); std::string t( jj->to.name ); tw.insert_line( jj->code, f, t ); } } thpic * thwarpp::morph(thsketch * sketch, double scale) { thwarp::morph(sketch, scale); double sf = scale; if (!this->m_sketch->m_pic.exists()) return NULL; const char * fn; size_t fnx, fnl; fn = sketch->m_pic.fname; fnl = strlen(sketch->m_pic.fname); for(fnx = 0; fnx < fnl; fnx++) { if (((sketch->m_pic.fname[fnx] == '/') || (sketch->m_pic.fname[fnx] == '\\')) && (fnx < fnl - 1)) { fn = &(sketch->m_pic.fname[fnx + 1]); } } if (thtext_inline) thprintf("\n"); thprintf("morphing %s ...", fn); thtext_inline = true; this->m_sketch->m_pic.rgba_load(); long pw = this->m_sketch->m_pic.width; long ph = this->m_sketch->m_pic.height; // FIXME could use bounds (defaults 1.5 1.5 2.0) // thwarptrans TW( b2, b3, b4 ); thwarptrans TW; thscrap * scrap = this->get_scrap(); thdb2dcp *ccp; thbuffer n2sb, n2sb2; n2sb.guarantee(128); n2sb2.guarantee(128); std::string s, s2; std::map ssm; //std::map ::iterator ssmi; ccp = scrap->fcpp; while (ccp != NULL) { if ((ccp->point != NULL) && (ccp->st != NULL)) { sprintf(n2sb.get_buffer(),"%ld",ccp->st->uid); s = n2sb.get_buffer(); TW.insert_point( THMORPH_STATION, s, thvec2(ccp->pt->x - sketch->m_x, sketch->m_y + double(sketch->m_pic.height) - ccp->pt->y), thvec2(ccp->tx + sketch->m_scrap->proj->rshift_x,- (ccp->ty + sketch->m_scrap->proj->rshift_y))); ssm[ccp->st->uid] = &(thdb.db1d.station_vec[ccp->st->uid - 1]); } ccp = ccp->nextcp; } thdb1d_leg_vec_type::iterator lg = thdb.db1d.leg_vec.begin(); unsigned long fuid, tuid; while ( lg != thdb.db1d.leg_vec.end() ) { thdataleg * dlg = lg->leg; fuid = thdb.db1d.station_vec[dlg->from.id - 1].uid; tuid = thdb.db1d.station_vec[dlg->to.id - 1].uid; sprintf(n2sb.get_buffer(),"%ld",fuid); sprintf(n2sb2.get_buffer(),"%ld",tuid); s = n2sb.get_buffer(); s2 = n2sb2.get_buffer(); if ((ssm.find(fuid) != ssm.end()) && (ssm.find(tuid) != ssm.end())) { // thprintf("insert leg %s %s\n", dlg->from.name, dlg->to.name ); TW.insert_line( THMORPH_STATION, s, s2); } ++ lg; } th2ddataobject * pobj = scrap->fs2doptr; int n_extra = 0; while (pobj != NULL) { if (pobj->get_class_id() == TT_POINT_CMD) { thpoint * pointp = (thpoint *) pobj; if (pointp->type == TT_POINT_TYPE_EXTRA) { pointp->check_extra(); if ((pointp->from_name.id > 0) && (!thisnan(pointp->xsize))) { unsigned long fuid = thdb.db1d.station_vec[pointp->from_name.id - 1].uid; if ( ssm.find(fuid) == ssm.end() ) { thprintf("warning: extra point from %s but no station\n", pointp->from_name.name ); } else { sprintf(n2sb2.get_buffer(),"%ld",fuid); sprintf(n2sb.get_buffer(),"%ld_E_%d",fuid, ++n_extra); s = n2sb.get_buffer(); s2 = n2sb2.get_buffer(); thdb2dpt * pt = pointp->point; // assert( pt != NULL ); double x = pt->x - sketch->m_x; double y = sketch->m_y + double(sketch->m_pic.height) - pt->y; TW.insert_zoom_point( THMORPH_EXTRA, s, thvec2(x, y), s2, pointp->xsize ); // ssm[ccp->st->uid] = &(thdb.db1d.station_vec[ccp->st->uid - 1]); } } } } pobj = pobj->nscrapoptr; } TW.initialize(); // the factor of 4 is good compromise between quality and speed double myscale = 4.0 * TW.to_unit() / TW.from_unit(); long mw = (long)( pw * myscale * sf / 4.0 ); long mh = (long)( ph * myscale * sf / 4.0 ); this->mpic.rgba_init(mw, mh); thvec2 origin( mw/2.0, mh/2.0 ); double unit = TW.to_unit() * sf; TW.map_image( (const unsigned char*)this->m_sketch->m_pic.rgba, pw, ph, (unsigned char*)this->mpic.rgba, mw, mh, origin, unit, 4 ); this->mpic.rgba_save("PNG","png",thcfg.sketch_colors); this->mpic.rgba_free(); this->m_sketch->m_pic.rgba_free(); #if 0 this->mpic.scale = T3.m_scale; ptmp = T3.forward(mpic_origin); this->mpic.x = ptmp.m_x; this->mpic.y = ptmp.m_y; #else this->mpic.scale = TW.to_unit() / TW.warped_unit(); this->m_origin = TW.to_origin(); this->mpic.x = - origin.m_x * this->mpic.scale; this->mpic.y = - origin.m_y * this->mpic.scale; #endif this->mpic.x += this->m_origin.m_x; this->mpic.y -= this->m_origin.m_y; thprintf(" done\n"); thtext_inline = false; return &(this->mpic); } therion/thtf.cxx0000664000175000017500000000265410625655142012754 0ustar useruser/** * @file thtf.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thtf.h" #include "thexception.h" #include "thparse.h" #include thtf::~thtf() {} void thtf::parse_scale(char * sstr) { int sv; thparse_double(sv,this->sfactor,sstr); if (sv != TT_SV_NUMBER) ththrow(("invalid scale factor -- %s", sstr)) if (this->sfactor == 0.0) ththrow(("invalid scale factor -- 0.0")) } double thtf::transform(double value) { return value * this->sfactor * this->ufactor; } int thtf::get_units() { return this->units; } therion/extern/0000775000175000017500000000000012426431256012560 5ustar userusertherion/extern/img.c0000664000175000017500000021115212337650112013475 0ustar useruser/* img.c * Routines for reading and writing Survex ".3d" image files * Copyright (C) 1993-2004,2005,2006,2010,2011,2013,2014 Olly Betts * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include "img.h" #define TIMENA "?" #ifdef IMG_HOSTED # define INT32_T int32_t # include "debug.h" # include "filelist.h" # include "filename.h" # include "message.h" # include "useful.h" # define TIMEFMT msg(/*%a,%Y.%m.%d %H:%M:%S %Z*/107) #else # ifdef HAVE_STDINT_H # include # define INT32_T int32_t # else # include # if INT_MAX >= 2147483647 # define INT32_T int # else # define INT32_T long # endif # endif # define TIMEFMT "%a,%Y.%m.%d %H:%M:%S %Z" # define EXT_SVX_3D "3d" # define EXT_SVX_POS "pos" # define FNM_SEP_EXT '.' # define METRES_PER_FOOT 0.3048 /* exact value */ # define xosmalloc(L) malloc((L)) # define xosrealloc(L,S) realloc((L),(S)) # define osfree(P) free((P)) # define osnew(T) (T*)malloc(sizeof(T)) /* in IMG_HOSTED mode, this tests if a filename refers to a directory */ # define fDirectory(X) 0 /* open file FNM with mode MODE, maybe using path PTH and/or extension EXT */ /* path isn't used in img.c, but EXT is */ # define fopenWithPthAndExt(PTH,FNM,EXT,MODE,X) \ ((*(X) = NULL), fopen(FNM,MODE)) # ifndef PUTC # define PUTC(C, FH) putc(C, FH) # endif # ifndef GETC # define GETC(FH) getc(FH) # endif # define fputsnl(S, FH) (fputs((S), (FH)) == EOF ? EOF : putc('\n', (FH))) # define SVX_ASSERT(X) #ifdef __cplusplus # include using std::max; using std::min; #else /* Return max/min of two numbers. */ /* May be defined already (e.g. by Borland C in stdlib.h) */ /* NB Bad news if X or Y has side-effects... */ # ifndef max # define max(X, Y) ((X) > (Y) ? (X) : (Y)) # endif # ifndef min # define min(X, Y) ((X) < (Y) ? (X) : (Y)) # endif #endif static INT32_T get32(FILE *fh) { INT32_T w = GETC(fh); w |= (INT32_T)GETC(fh) << 8l; w |= (INT32_T)GETC(fh) << 16l; w |= (INT32_T)GETC(fh) << 24l; return w; } static void put32(long w, FILE *fh) { PUTC((char)(w), fh); PUTC((char)(w >> 8l), fh); PUTC((char)(w >> 16l), fh); PUTC((char)(w >> 24l), fh); } static short get16(FILE *fh) { short w = GETC(fh); w |= (short)GETC(fh) << 8l; return w; } static void put16(short w, FILE *fh) { PUTC((char)(w), fh); PUTC((char)(w >> 8l), fh); } static char * baseleaf_from_fnm(const char *fnm) { const char *p; const char *q; char * res; size_t len; p = fnm; q = strrchr(p, '/'); if (q) p = q + 1; q = strrchr(p, '\\'); if (q) p = q + 1; q = strrchr(p, FNM_SEP_EXT); if (q) len = (const char *)q - p; else len = strlen(p); res = (char *)xosmalloc(len + 1); if (!res) return NULL; memcpy(res, p, len); res[len] = '\0'; return res; } #endif static char * my_strdup(const char *str); static time_t mktime_with_tz(struct tm * tm, const char * tz) { time_t r; char * old_tz = getenv("TZ"); #ifdef _MSC_VER if (old_tz) { old_tz = my_strdup(old_tz); if (!old_tz) return (time_t)-1; } if (_putenv_s("TZ", tz) != 0) { osfree(old_tz); return (time_t)-1; } #elif defined HAVE_SETENV if (old_tz) { old_tz = my_strdup(old_tz); if (!old_tz) return (time_t)-1; } if (setenv("TZ", tz, 1) < 0) { osfree(old_tz); return (time_t)-1; } #else char * p; if (old_tz) { size_t len = strlen(old_tz) + 1; p = (char *)xosmalloc(len + 3); if (!p) return (time_t)-1; memcpy(p, "TZ=", 3); memcpy(p + 3, tz, len); old_tz = p; } p = (char *)xosmalloc(strlen(tz) + 4); if (!p) { osfree(old_tz); return (time_t)-1; } memcpy(p, "TZ=", 3); strcpy(p + 3, tz); if (putenv(p) != 0) { osfree(p); osfree(old_tz); return (time_t)-1; } #define CLEANUP() osfree(p) #endif tzset(); r = mktime(tm); if (old_tz) { #ifdef _MSC_VER _putenv_s("TZ", old_tz); #elif !defined HAVE_SETENV putenv(old_tz); #else setenv("TZ", old_tz, 1); #endif osfree(old_tz); } else { #ifdef _MSC_VER _putenv_s("TZ", ""); #elif !defined HAVE_UNSETENV putenv((char*)"TZ"); #else unsetenv("TZ"); #endif } #ifdef CLEANUP CLEANUP(); #undef CLEANUP #endif return r; } static unsigned short getu16(FILE *fh) { return (unsigned short)get16(fh); } #include #if !defined HAVE_LROUND && !defined HAVE_DECL_LROUND /* The autoconf tests are not in use, but C99 and C++11 both added lround(), * so set HAVE_LROUND and HAVE_DECL_LROUND conservatively based on the language * standard version the compiler claims to support. */ # if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || \ (defined __cplusplus && __cplusplus >= 201103L) # define HAVE_LROUND 1 # define HAVE_DECL_LROUND 1 # endif #endif #ifdef HAVE_LROUND # if defined HAVE_DECL_LROUND && !HAVE_DECL_LROUND /* On older systems, the prototype may be missing. */ extern long lround(double); # endif # define my_lround lround #else static long my_lround(double x) { return (x >= 0.0) ? (long)(x + 0.5) : -(long)(0.5 - x); } #endif /* portable case insensitive string compare */ #if defined(strcasecmp) || defined(HAVE_STRCASECMP) # define my_strcasecmp strcasecmp #else static int my_strcasecmp(const char *s1, const char *s2) { unsigned char c1, c2; do { c1 = *s1++; c2 = *s2++; } while (c1 && toupper(c1) == toupper(c2)); /* now calculate real difference */ return c1 - c2; } #endif unsigned int img_output_version = IMG_VERSION_MAX; static img_errcode img_errno = IMG_NONE; #define FILEID "Survex 3D Image File" #define EXT_PLT "plt" #define EXT_PLF "plf" /* Attempt to string paste to ensure we are passed a literal string */ #define LITLEN(S) (sizeof(S"") - 1) /* Fake "version numbers" for non-3d formats we can read. */ #define VERSION_CMAP_SHOT -4 #define VERSION_CMAP_STATION -3 #define VERSION_COMPASS_PLT -2 #define VERSION_SURVEX_POS -1 static char * my_strdup(const char *str) { char *p; size_t len = strlen(str) + 1; p = (char *)xosmalloc(len); if (p) memcpy(p, str, len); return p; } static char * getline_alloc(FILE *fh) { int ch; size_t i = 0; size_t len = 16; char *buf = (char *)xosmalloc(len); if (!buf) return NULL; ch = GETC(fh); while (ch != '\n' && ch != '\r' && ch != EOF) { buf[i++] = ch; if (i == len - 1) { char *p; len += len; p = (char *)xosrealloc(buf, len); if (!p) { osfree(buf); return NULL; } buf = p; } ch = GETC(fh); } if (ch == '\n' || ch == '\r') { int otherone = ch ^ ('\n' ^ '\r'); ch = GETC(fh); /* if it's not the other eol character, put it back */ if (ch != otherone) ungetc(ch, fh); } buf[i++] = '\0'; return buf; } img_errcode img_error(void) { return img_errno; } static int check_label_space(img *pimg, size_t len) { if (len > pimg->buf_len) { char *b = (char *)xosrealloc(pimg->label_buf, len); if (!b) return 0; pimg->label = (pimg->label - pimg->label_buf) + b; pimg->label_buf = b; pimg->buf_len = len; } return 1; } #define has_ext(F,L,E) ((L) > LITLEN(E) + 1 &&\ (F)[(L) - LITLEN(E) - 1] == FNM_SEP_EXT &&\ my_strcasecmp((F) + (L) - LITLEN(E), E) == 0) img * img_open_survey(const char *fnm, const char *survey) { img *pimg; size_t len; char buf[LITLEN(FILEID) + 9]; int ch; if (fDirectory(fnm)) { img_errno = IMG_DIRECTORY; return NULL; } pimg = osnew(img); if (pimg == NULL) { img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->buf_len = 257; pimg->label_buf = (char *)xosmalloc(pimg->buf_len); if (!pimg->label_buf) { osfree(pimg); img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->fh = fopenWithPthAndExt("", fnm, EXT_SVX_3D, "rb", &(pimg->filename_opened)); if (pimg->fh == NULL) { osfree(pimg->label_buf); osfree(pimg); img_errno = IMG_FILENOTFOUND; return NULL; } pimg->fRead = 1; /* reading from this file */ img_errno = IMG_NONE; pimg->flags = 0; /* for version >= 3 we use label_buf to store the prefix for reuse */ /* for VERSION_COMPASS_PLT, 0 value indicates we haven't * entered a survey yet */ /* for VERSION_CMAP_SHOT, we store the last station here * to detect whether we MOVE or LINE */ pimg->label_len = 0; pimg->label_buf[0] = '\0'; pimg->survey = NULL; pimg->survey_len = 0; pimg->separator = '.'; #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; #endif pimg->is_extended_elevation = 0; pimg->style = pimg->oldstyle = img_STYLE_UNKNOWN; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; pimg->title = pimg->datestamp = NULL; pimg->datestamp_numeric = (time_t)-1; if (survey) { len = strlen(survey); if (len) { if (survey[len - 1] == '.') len--; if (len) { char *p; pimg->survey = (char *)xosmalloc(len + 2); if (!pimg->survey) { img_errno = IMG_OUTOFMEMORY; goto error; } memcpy(pimg->survey, survey, len); /* Set title to leaf survey name */ pimg->survey[len] = '\0'; p = strchr(pimg->survey, '.'); if (p) p++; else p = pimg->survey; pimg->title = my_strdup(p); if (!pimg->title) { img_errno = IMG_OUTOFMEMORY; goto error; } pimg->survey[len] = '.'; pimg->survey[len + 1] = '\0'; } } pimg->survey_len = len; } /* [VERSION_COMPASS_PLT, VERSION_CMAP_STATION, VERSION_CMAP_SHOT] pending * IMG_LINE or IMG_MOVE - both have 4 added. * [VERSION_SURVEX_POS] already skipped heading line, or there wasn't one * [version 0] not in the middle of a 'LINE' command * [version >= 3] not in the middle of turning a LINE into a MOVE */ pimg->pending = 0; len = strlen(fnm); if (has_ext(fnm, len, EXT_SVX_POS)) { pos_file: pimg->version = VERSION_SURVEX_POS; if (!pimg->survey) pimg->title = baseleaf_from_fnm(fnm); pimg->datestamp = my_strdup(TIMENA); if (!pimg->datestamp) { img_errno = IMG_OUTOFMEMORY; goto error; } pimg->start = 0; return pimg; } if (has_ext(fnm, len, EXT_PLT) || has_ext(fnm, len, EXT_PLF)) { long fpos; plt_file: pimg->version = VERSION_COMPASS_PLT; /* Spaces aren't legal in Compass station names, but dots are, so * use space as the level separator */ pimg->separator = ' '; pimg->start = 0; if (!pimg->survey) pimg->title = baseleaf_from_fnm(fnm); pimg->datestamp = my_strdup(TIMENA); if (!pimg->datestamp) { img_errno = IMG_OUTOFMEMORY; goto error; } while (1) { ch = GETC(pimg->fh); switch (ch) { case '\x1a': fseek(pimg->fh, -1, SEEK_CUR); /* FALL THRU */ case EOF: pimg->start = ftell(pimg->fh); return pimg; case 'N': { char *line, *q; fpos = ftell(pimg->fh) - 1; if (!pimg->survey) { /* FIXME : if there's only one survey in the file, it'd be nice * to use its description as the title here... */ ungetc('N', pimg->fh); pimg->start = fpos; return pimg; } line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } len = 0; while (line[len] > 32) ++len; if (pimg->survey_len != len || memcmp(line, pimg->survey, len) != 0) { osfree(line); continue; } q = strchr(line + len, 'C'); if (q && q[1]) { osfree(pimg->title); pimg->title = my_strdup(q + 1); } else if (!pimg->title) { pimg->title = my_strdup(pimg->label); } osfree(line); if (!pimg->title) { img_errno = IMG_OUTOFMEMORY; goto error; } if (!pimg->start) pimg->start = fpos; fseek(pimg->fh, pimg->start, SEEK_SET); return pimg; } case 'M': case 'D': pimg->start = ftell(pimg->fh) - 1; break; } while (ch != '\n' && ch != '\r') { ch = GETC(pimg->fh); } } } /* Although these are often referred to as "CMAP .XYZ files", it seems * that actually, the extension .XYZ isn't used, rather .SHT (shot * variant, produced by CMAP v16 and later), .UNA (unadjusted) and * .ADJ (adjusted) extensions are. Since img has long checked for * .XYZ, we continue to do so in case anyone is relying on it. */ if (has_ext(fnm, len, "sht") || has_ext(fnm, len, "adj") || has_ext(fnm, len, "una") || has_ext(fnm, len, "xyz")) { char *line; xyz_file: /* Spaces aren't legal in CMAP station names, but dots are, so * use space as the level separator. */ pimg->separator = ' '; line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } /* There doesn't seem to be a spec for what happens after 1999 with cmap * files, so this code allows for: * * 21xx -> xx (up to 2150) * * 21xx -> 1xx (up to 2199) * * full year being specified instead of 2 digits */ len = strlen(line); if (len > 59) { /* Don't just truncate at column 59, allow for a > 2 digit year. */ char * p = strstr(line + len, "Page"); if (p) { while (p > line && p[-1] == ' ') --p; *p = '\0'; len = p - line; } else { line[59] = '\0'; } } if (len > 45) { /* YY/MM/DD HH:MM */ struct tm tm; unsigned long v; char * p; pimg->datestamp = my_strdup(line + 45); p = pimg->datestamp; v = strtoul(p, &p, 10); if (v <= 50) { /* In the absence of a spec for cmap files, assume <= 50 means 21st * century. */ v += 2000; } else if (v < 200) { /* Map 100-199 to 21st century. */ v += 1900; } if (v == ULONG_MAX || *p++ != '/') goto bad_cmap_date; tm.tm_year = v - 1900; v = strtoul(p, &p, 10); if (v < 1 || v > 12 || *p++ != '/') goto bad_cmap_date; tm.tm_mon = v - 1; v = strtoul(p, &p, 10); if (v < 1 || v > 31 || *p++ != ' ') goto bad_cmap_date; tm.tm_mday = v; v = strtoul(p, &p, 10); if (v >= 24 || *p++ != ':') goto bad_cmap_date; tm.tm_hour = v; v = strtoul(p, &p, 10); if (v >= 60) goto bad_cmap_date; tm.tm_min = v; if (*p == ':') { v = strtoul(p + 1, &p, 10); if (v > 60) goto bad_cmap_date; tm.tm_sec = v; } else { tm.tm_sec = 0; } tm.tm_isdst = 0; /* We have no indication of what timezone this timestamp is in. It's * probably local time for whoever processed the data, so just assume * UTC, which is at least fairly central in the possibilities. */ pimg->datestamp_numeric = mktime_with_tz(&tm, ""); } else { pimg->datestamp = my_strdup(TIMENA); } bad_cmap_date: if (strncmp(line, " Cave Survey Data Processed by CMAP ", LITLEN(" Cave Survey Data Processed by CMAP ")) == 0) { len = 0; } else { if (len > 45) { line[45] = '\0'; len = 45; } while (len > 2 && line[len - 1] == ' ') --len; if (len > 2) { line[len] = '\0'; pimg->title = my_strdup(line + 2); } } if (len <= 2) pimg->title = baseleaf_from_fnm(fnm); osfree(line); if (!pimg->datestamp || !pimg->title) { img_errno = IMG_OUTOFMEMORY; goto error; } line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } if (line[0] != ' ' || (line[1] != 'S' && line[1] != 'O')) { img_errno = IMG_BADFORMAT; goto error; } if (line[1] == 'S') { pimg->version = VERSION_CMAP_STATION; } else { pimg->version = VERSION_CMAP_SHOT; } osfree(line); line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } if (line[0] != ' ' || line[1] != '-') { img_errno = IMG_BADFORMAT; goto error; } osfree(line); pimg->start = ftell(pimg->fh); return pimg; } if (fread(buf, LITLEN(FILEID) + 1, 1, pimg->fh) != 1 || memcmp(buf, FILEID"\n", LITLEN(FILEID) + 1) != 0) { if (fread(buf + LITLEN(FILEID) + 1, 8, 1, pimg->fh) == 1 && memcmp(buf, FILEID"\r\nv0.01\r\n", LITLEN(FILEID) + 9) == 0) { /* v0 3d file with DOS EOLs */ pimg->version = 0; goto v03d; } rewind(pimg->fh); if (buf[1] == ' ') { if (buf[0] == ' ') { /* Looks like a CMAP .xyz file ... */ goto xyz_file; } else if (strchr("ZSNF", buf[0])) { /* Looks like a Compass .plt file ... */ /* Almost certainly it'll start "Z " */ goto plt_file; } } if (buf[0] == '(') { /* Looks like a Survex .pos file ... */ goto pos_file; } img_errno = IMG_BADFORMAT; goto error; } /* check file format version */ ch = GETC(pimg->fh); pimg->version = 0; if (tolower(ch) == 'b') { /* binary file iff B/b prefix */ pimg->version = 1; ch = GETC(pimg->fh); } if (ch != 'v') { img_errno = IMG_BADFORMAT; goto error; } ch = GETC(pimg->fh); if (ch == '0') { if (fread(buf, 4, 1, pimg->fh) != 1 || memcmp(buf, ".01\n", 4) != 0) { img_errno = IMG_BADFORMAT; goto error; } /* nothing special to do */ } else if (pimg->version == 0) { if (ch < '2' || ch > '0' + IMG_VERSION_MAX || GETC(pimg->fh) != '\n') { img_errno = IMG_TOONEW; goto error; } pimg->version = ch - '0'; } else { img_errno = IMG_BADFORMAT; goto error; } v03d: if (!pimg->title) pimg->title = getline_alloc(pimg->fh); else osfree(getline_alloc(pimg->fh)); pimg->datestamp = getline_alloc(pimg->fh); if (!pimg->title || !pimg->datestamp) { img_errno = IMG_OUTOFMEMORY; error: osfree(pimg->title); osfree(pimg->datestamp); osfree(pimg->filename_opened); fclose(pimg->fh); osfree(pimg); return NULL; } if (pimg->version >= 8) { int flags = GETC(pimg->fh); if (flags & img_FFLAG_EXTENDED) pimg->is_extended_elevation = 1; } else { len = strlen(pimg->title); if (len > 11 && strcmp(pimg->title + len - 11, " (extended)") == 0) { pimg->title[len - 11] = '\0'; pimg->is_extended_elevation = 1; } } if (pimg->datestamp[0] == '@') { unsigned long v; char * p; errno = 0; v = strtoul(pimg->datestamp + 1, &p, 10); if (errno == 0 && *p == '\0') pimg->datestamp_numeric = v; /* FIXME: We're assuming here that the C time_t epoch is 1970, which is * true for Unix-like systems, Mac OS X and Windows, but isn't guaranteed * by ISO C. */ } else { /* %a,%Y.%m.%d %H:%M:%S %Z */ struct tm tm; unsigned long v; char * p = pimg->datestamp; while (isalpha((unsigned char)*p)) ++p; if (*p == ',') ++p; while (isspace((unsigned char)*p)) ++p; v = strtoul(p, &p, 10); if (v == ULONG_MAX || *p++ != '.') goto bad_3d_date; tm.tm_year = v - 1900; v = strtoul(p, &p, 10); if (v < 1 || v > 12 || *p++ != '.') goto bad_3d_date; tm.tm_mon = v - 1; v = strtoul(p, &p, 10); if (v < 1 || v > 31 || *p++ != ' ') goto bad_3d_date; tm.tm_mday = v; v = strtoul(p, &p, 10); if (v >= 24 || *p++ != ':') goto bad_3d_date; tm.tm_hour = v; v = strtoul(p, &p, 10); if (v >= 60 || *p++ != ':') goto bad_3d_date; tm.tm_min = v; v = strtoul(p, &p, 10); if (v > 60) goto bad_3d_date; tm.tm_sec = v; tm.tm_isdst = 0; while (isspace((unsigned char)*p)) ++p; /* p now points to the timezone string. * * However, it's likely to be a string like "BST", and such strings can * be ambiguous (BST could be UTC+1 or UTC+6), so it is impossible to * reliably convert in all cases. Just pass what we have to tzset() - if * it doesn't handle it, UTC will be used. */ pimg->datestamp_numeric = mktime_with_tz(&tm, p); } bad_3d_date: pimg->start = ftell(pimg->fh); return pimg; } int img_rewind(img *pimg) { if (!pimg->fRead) { img_errno = IMG_WRITEERROR; return 0; } if (fseek(pimg->fh, pimg->start, SEEK_SET) != 0) { img_errno = IMG_READERROR; return 0; } clearerr(pimg->fh); /* [VERSION_SURVEX_POS] already skipped heading line, or there wasn't one * [version 0] not in the middle of a 'LINE' command * [version >= 3] not in the middle of turning a LINE into a MOVE */ pimg->pending = 0; img_errno = IMG_NONE; /* for version >= 3 we use label_buf to store the prefix for reuse */ /* for VERSION_COMPASS_PLT, 0 value indicates we haven't entered a survey * yet */ /* for VERSION_CMAP_SHOT, we store the last station here to detect whether * we MOVE or LINE */ pimg->label_len = 0; pimg->style = img_STYLE_UNKNOWN; return 1; } img * img_open_write(const char *fnm, char *title, int flags) { time_t tm; img *pimg; if (fDirectory(fnm)) { img_errno = IMG_DIRECTORY; return NULL; } pimg = osnew(img); if (pimg == NULL) { img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->buf_len = 257; pimg->label_buf = (char *)xosmalloc(pimg->buf_len); if (!pimg->label_buf) { osfree(pimg); img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->fh = fopen(fnm, "wb"); if (!pimg->fh) { osfree(pimg->label_buf); osfree(pimg); img_errno = IMG_CANTOPENOUT; return NULL; } pimg->filename_opened = NULL; /* Output image file header */ fputs("Survex 3D Image File\n", pimg->fh); /* file identifier string */ if (img_output_version < 2) { pimg->version = 1; fputs("Bv0.01\n", pimg->fh); /* binary file format version number */ } else { pimg->version = (img_output_version > IMG_VERSION_MAX) ? IMG_VERSION_MAX : img_output_version; fprintf(pimg->fh, "v%d\n", pimg->version); /* file format version no. */ } fputs(title, pimg->fh); if (pimg->version < 8 && (flags & img_FFLAG_EXTENDED)) { /* Older format versions append " (extended)" to the title to mark * extended elevations. */ size_t len = strlen(title); if (len < 11 || strcmp(title + len - 11, " (extended)") != 0) fputs(" (extended)", pimg->fh); } PUTC('\n', pimg->fh); tm = time(NULL); if (tm == (time_t)-1) { fputsnl(TIMENA, pimg->fh); } else if (pimg->version <= 7) { char date[256]; /* output current date and time in format specified */ strftime(date, 256, TIMEFMT, localtime(&tm)); fputsnl(date, pimg->fh); } else { fprintf(pimg->fh, "@%ld\n", (long)tm); } if (pimg->version >= 8) { /* Clear bit one in case anyone has been passing true for fBinary. */ flags &=~ 1; PUTC(flags, pimg->fh); } #if 0 if (img_output_version >= 5) { static const unsigned char codelengths[32] = { 4, 8, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; fwrite(codelengths, 32, 1, pimg->fh); } #endif pimg->fRead = 0; /* writing to this file */ img_errno = IMG_NONE; /* for version >= 3 we use label_buf to store the prefix for reuse */ pimg->label_buf[0] = '\0'; pimg->label_len = 0; #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; pimg->olddate1 = pimg->olddate2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; pimg->olddays1 = pimg->olddays2 = -1; #endif pimg->style = pimg->oldstyle = img_STYLE_UNKNOWN; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; pimg->n_legs = 0; pimg->length = 0.0; pimg->E = pimg->H = pimg->V = 0.0; /* Don't check for write errors now - let img_close() report them... */ return pimg; } static void read_xyz_station_coords(img_point *pt, const char *line) { char num[12]; memcpy(num, line + 6, 9); num[9] = '\0'; pt->x = atof(num) / METRES_PER_FOOT; memcpy(num, line + 15, 9); pt->y = atof(num) / METRES_PER_FOOT; memcpy(num, line + 24, 8); num[8] = '\0'; pt->z = atof(num) / METRES_PER_FOOT; } static void read_xyz_shot_coords(img_point *pt, const char *line) { char num[12]; memcpy(num, line + 40, 10); num[10] = '\0'; pt->x = atof(num) / METRES_PER_FOOT; memcpy(num, line + 50, 10); pt->y = atof(num) / METRES_PER_FOOT; memcpy(num, line + 60, 9); num[9] = '\0'; pt->z = atof(num) / METRES_PER_FOOT; } static void subtract_xyz_shot_deltas(img_point *pt, const char *line) { char num[12]; memcpy(num, line + 15, 9); num[9] = '\0'; pt->x -= atof(num) / METRES_PER_FOOT; memcpy(num, line + 24, 8); num[8] = '\0'; pt->y -= atof(num) / METRES_PER_FOOT; memcpy(num, line + 32, 8); pt->z -= atof(num) / METRES_PER_FOOT; } static int read_coord(FILE *fh, img_point *pt) { SVX_ASSERT(fh); SVX_ASSERT(pt); pt->x = get32(fh) / 100.0; pt->y = get32(fh) / 100.0; pt->z = get32(fh) / 100.0; if (ferror(fh) || feof(fh)) { img_errno = feof(fh) ? IMG_BADFORMAT : IMG_READERROR; return 0; } return 1; } static int skip_coord(FILE *fh) { return (fseek(fh, 12, SEEK_CUR) == 0); } static int read_v3label(img *pimg) { char *q; long len = GETC(pimg->fh); if (len == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (len == 0xfe) { len += get16(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } } else if (len == 0xff) { len = get32(pimg->fh); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (feof(pimg->fh) || len < 0xfe + 0xffff) { img_errno = IMG_BADFORMAT; return img_BAD; } } if (!check_label_space(pimg, pimg->label_len + len + 1)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } q = pimg->label_buf + pimg->label_len; pimg->label_len += len; if (len && fread(q, len, 1, pimg->fh) != 1) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } q[len] = '\0'; return 0; } static int read_v8label(img *pimg, int common_flag, size_t common_val) { char *q; size_t del, add; if (common_flag) { if (common_val == 0) return 0; add = del = common_val; } else { int ch = GETC(pimg->fh); if (ch == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (ch != 0x00) { del = ch >> 4; add = ch & 0x0f; } else { ch = GETC(pimg->fh); if (ch == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (ch != 0xff) { del = ch; } else { del = get32(pimg->fh); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } } ch = GETC(pimg->fh); if (ch == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (ch != 0xff) { add = ch; } else { add = get32(pimg->fh); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } } } if (add > del && !check_label_space(pimg, pimg->label_len + add - del + 1)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } if (del > pimg->label_len) { img_errno = IMG_BADFORMAT; return img_BAD; } pimg->label_len -= del; q = pimg->label_buf + pimg->label_len; pimg->label_len += add; if (add && fread(q, add, 1, pimg->fh) != 1) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } q[add] = '\0'; return 0; } static int img_read_item_new(img *pimg, img_point *p); static int img_read_item_v3to7(img *pimg, img_point *p); static int img_read_item_ancient(img *pimg, img_point *p); static int img_read_item_ascii_wrapper(img *pimg, img_point *p); static int img_read_item_ascii(img *pimg, img_point *p); int img_read_item(img *pimg, img_point *p) { pimg->flags = 0; if (pimg->version >= 8) { return img_read_item_new(pimg, p); } else if (pimg->version >= 3) { return img_read_item_v3to7(pimg, p); } else if (pimg->version >= 1) { return img_read_item_ancient(pimg, p); } else { return img_read_item_ascii_wrapper(pimg, p); } } static int img_read_item_new(img *pimg, img_point *p) { int result; int opt; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; if (pimg->pending >= 0x40) { if (pimg->pending == 256) { pimg->pending = 0; return img_XSECT_END; } *p = pimg->mv; pimg->flags = (int)(pimg->pending) & 0x3f; pimg->pending = 0; return img_LINE; } again3: /* label to goto if we get a prefix, date, or lrud */ pimg->label = pimg->label_buf; opt = GETC(pimg->fh); if (opt == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (opt >> 6 == 0) { if (opt <= 4) { if (opt == 0 && pimg->style == 0) return img_STOP; /* end of data marker */ /* STYLE */ pimg->style = opt; goto again3; } if (opt >= 0x10) { switch (opt) { case 0x10: { /* No date info */ #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; #endif break; } case 0x11: { /* Single date */ int days1 = (int)getu16(pimg->fh); #if IMG_API_VERSION == 0 pimg->date2 = pimg->date1 = (days1 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days2 = pimg->days1 = days1; #endif break; } case 0x12: { /* Date range (short) */ int days1 = (int)getu16(pimg->fh); int days2 = days1 + GETC(pimg->fh) + 1; #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif break; } case 0x13: { /* Date range (long) */ int days1 = (int)getu16(pimg->fh); int days2 = (int)getu16(pimg->fh); #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif break; } case 0x1f: /* Error info */ pimg->n_legs = get32(pimg->fh); pimg->length = get32(pimg->fh) / 100.0; pimg->E = get32(pimg->fh) / 100.0; pimg->H = get32(pimg->fh) / 100.0; pimg->V = get32(pimg->fh) / 100.0; return img_ERROR_INFO; case 0x30: case 0x31: /* LRUD */ case 0x32: case 0x33: /* Big LRUD! */ if (read_v8label(pimg, 0, 0) == img_BAD) return img_BAD; pimg->flags = (int)opt & 0x01; if (opt < 0x32) { pimg->l = get16(pimg->fh) / 100.0; pimg->r = get16(pimg->fh) / 100.0; pimg->u = get16(pimg->fh) / 100.0; pimg->d = get16(pimg->fh) / 100.0; } else { pimg->l = get32(pimg->fh) / 100.0; pimg->r = get32(pimg->fh) / 100.0; pimg->u = get32(pimg->fh) / 100.0; pimg->d = get32(pimg->fh) / 100.0; } if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { return img_XSECT_END; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } /* If this is the last cross-section in this passage, set * pending so we return img_XSECT_END next time. */ if (pimg->flags & 0x01) { pimg->pending = 256; pimg->flags &= ~0x01; } return img_XSECT; default: /* 0x25 - 0x2f and 0x34 - 0x3f are currently unallocated. */ img_errno = IMG_BADFORMAT; return img_BAD; } goto again3; } if (opt != 15) { /* 1-14 and 16-31 reserved */ img_errno = IMG_BADFORMAT; return img_BAD; } result = img_MOVE; } else if (opt >= 0x80) { if (read_v8label(pimg, 0, 0) == img_BAD) return img_BAD; result = img_LABEL; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { if (!skip_coord(pimg->fh)) return img_BAD; pimg->pending = 0; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } pimg->flags = (int)opt & 0x7f; } else if ((opt >> 6) == 1) { if (read_v8label(pimg, opt & 0x20, 0) == img_BAD) return img_BAD; result = img_LINE; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l) != 0 || !(s[l] == '.' || s[l] == '\0')) { if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = 15; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } if (pimg->pending) { *p = pimg->mv; if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = opt; return img_MOVE; } pimg->flags = (int)opt & 0x1f; } else { img_errno = IMG_BADFORMAT; return img_BAD; } if (!read_coord(pimg->fh, p)) return img_BAD; pimg->pending = 0; return result; } static int img_read_item_v3to7(img *pimg, img_point *p) { int result; int opt; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; if (pimg->pending == 256) { pimg->pending = 0; return img_XSECT_END; } if (pimg->pending >= 0x80) { *p = pimg->mv; pimg->flags = (int)(pimg->pending) & 0x3f; pimg->pending = 0; return img_LINE; } again3: /* label to goto if we get a prefix, date, or lrud */ pimg->label = pimg->label_buf; opt = GETC(pimg->fh); if (opt == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } switch (opt >> 6) { case 0: if (opt == 0) { if (!pimg->label_len) return img_STOP; /* end of data marker */ pimg->label_len = 0; goto again3; } if (opt < 15) { /* 1-14 mean trim that many levels from current prefix */ int c; if (pimg->label_len <= 17) { /* zero prefix using "0" */ img_errno = IMG_BADFORMAT; return img_BAD; } /* extra - 1 because label_len points to one past the end */ c = pimg->label_len - 17 - 1; while (pimg->label_buf[c] != '.' || --opt > 0) { if (--c < 0) { /* zero prefix using "0" */ img_errno = IMG_BADFORMAT; return img_BAD; } } c++; pimg->label_len = c; goto again3; } if (opt == 15) { result = img_MOVE; break; } if (opt >= 0x20) { switch (opt) { case 0x20: /* Single date */ if (pimg->version < 7) { int date1 = get32(pimg->fh); #if IMG_API_VERSION == 0 pimg->date2 = pimg->date1 = date1; #else /* IMG_API_VERSION == 1 */ if (date1 != 0) { pimg->days2 = pimg->days1 = (date1 / 86400) + 25567; } else { pimg->days2 = pimg->days1 = -1; } #endif } else { int days1 = (int)getu16(pimg->fh); #if IMG_API_VERSION == 0 pimg->date2 = pimg->date1 = (days1 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days2 = pimg->days1 = days1; #endif } break; case 0x21: /* Date range (short for v7+) */ if (pimg->version < 7) { INT32_T date1 = get32(pimg->fh); INT32_T date2 = get32(pimg->fh); #if IMG_API_VERSION == 0 pimg->date1 = date1; pimg->date2 = date2; #else /* IMG_API_VERSION == 1 */ pimg->days1 = (date1 / 86400) + 25567; pimg->days2 = (date2 / 86400) + 25567; #endif } else { int days1 = (int)getu16(pimg->fh); int days2 = days1 + GETC(pimg->fh) + 1; #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif } break; case 0x22: /* Error info */ pimg->n_legs = get32(pimg->fh); pimg->length = get32(pimg->fh) / 100.0; pimg->E = get32(pimg->fh) / 100.0; pimg->H = get32(pimg->fh) / 100.0; pimg->V = get32(pimg->fh) / 100.0; if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } return img_ERROR_INFO; case 0x23: { /* v7+: Date range (long) */ int days1; int days2; if (pimg->version < 7) { img_errno = IMG_BADFORMAT; return img_BAD; } days1 = (int)getu16(pimg->fh); days2 = (int)getu16(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif break; } case 0x24: { /* v7+: No date info */ #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; #endif break; } case 0x30: case 0x31: /* LRUD */ case 0x32: case 0x33: /* Big LRUD! */ if (read_v3label(pimg) == img_BAD) return img_BAD; pimg->flags = (int)opt & 0x01; if (opt < 0x32) { pimg->l = get16(pimg->fh) / 100.0; pimg->r = get16(pimg->fh) / 100.0; pimg->u = get16(pimg->fh) / 100.0; pimg->d = get16(pimg->fh) / 100.0; } else { pimg->l = get32(pimg->fh) / 100.0; pimg->r = get32(pimg->fh) / 100.0; pimg->u = get32(pimg->fh) / 100.0; pimg->d = get32(pimg->fh) / 100.0; } if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { return img_XSECT_END; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } /* If this is the last cross-section in this passage, set * pending so we return img_XSECT_END next time. */ if (pimg->flags & 0x01) { pimg->pending = 256; pimg->flags &= ~0x01; } return img_XSECT; default: /* 0x25 - 0x2f and 0x34 - 0x3f are currently unallocated. */ img_errno = IMG_BADFORMAT; return img_BAD; } if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } goto again3; } /* 16-31 mean remove (n - 15) characters from the prefix */ /* zero prefix using 0 */ if (pimg->label_len <= (size_t)(opt - 15)) { img_errno = IMG_BADFORMAT; return img_BAD; } pimg->label_len -= (opt - 15); goto again3; case 1: if (read_v3label(pimg) == img_BAD) return img_BAD; result = img_LABEL; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { if (!skip_coord(pimg->fh)) return img_BAD; pimg->pending = 0; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } pimg->flags = (int)opt & 0x3f; break; case 2: if (read_v3label(pimg) == img_BAD) return img_BAD; result = img_LINE; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l) != 0 || !(s[l] == '.' || s[l] == '\0')) { if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = 15; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } if (pimg->pending) { *p = pimg->mv; if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = opt; return img_MOVE; } pimg->flags = (int)opt & 0x3f; break; default: img_errno = IMG_BADFORMAT; return img_BAD; } if (!read_coord(pimg->fh, p)) return img_BAD; pimg->pending = 0; return result; } static int img_read_item_ancient(img *pimg, img_point *p) { int result; static long opt_lookahead = 0; static img_point pt = { 0.0, 0.0, 0.0 }; long opt; again: /* label to goto if we get a cross */ pimg->label = pimg->label_buf; pimg->label[0] = '\0'; if (pimg->version == 1) { if (opt_lookahead) { opt = opt_lookahead; opt_lookahead = 0; } else { opt = get32(pimg->fh); } } else { opt = GETC(pimg->fh); } if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } switch (opt) { case -1: case 0: return img_STOP; /* end of data marker */ case 1: /* skip coordinates */ if (!skip_coord(pimg->fh)) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } goto again; case 2: case 3: { size_t len; result = img_LABEL; if (!fgets(pimg->label_buf, pimg->buf_len, pimg->fh)) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (pimg->label[0] == '\\') pimg->label++; len = strlen(pimg->label); if (len == 0 || pimg->label[len - 1] != '\n') { img_errno = IMG_BADFORMAT; return img_BAD; } /* Ignore empty labels in some .3d files (caused by a bug) */ if (len == 1) goto again; pimg->label[len - 1] = '\0'; pimg->flags = img_SFLAG_UNDERGROUND; /* no flags given... */ if (opt == 2) goto done; break; } case 6: case 7: { long len; result = img_LABEL; if (opt == 7) pimg->flags = GETC(pimg->fh); else pimg->flags = img_SFLAG_UNDERGROUND; /* no flags given... */ len = get32(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } /* Ignore empty labels in some .3d files (caused by a bug) */ if (len == 0) goto again; if (!check_label_space(pimg, len + 1)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } if (fread(pimg->label_buf, len, 1, pimg->fh) != 1) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } pimg->label_buf[len] = '\0'; break; } case 4: result = img_MOVE; break; case 5: result = img_LINE; break; default: switch ((int)opt & 0xc0) { case 0x80: pimg->flags = (int)opt & 0x3f; result = img_LINE; break; case 0x40: { char *q; pimg->flags = (int)opt & 0x3f; result = img_LABEL; if (!fgets(pimg->label_buf, pimg->buf_len, pimg->fh)) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } q = pimg->label_buf + strlen(pimg->label_buf) - 1; /* Ignore empty-labels in some .3d files (caused by a bug) */ if (q == pimg->label_buf) goto again; if (*q != '\n') { img_errno = IMG_BADFORMAT; return img_BAD; } *q = '\0'; break; } default: img_errno = IMG_BADFORMAT; return img_BAD; } break; } if (!read_coord(pimg->fh, &pt)) return img_BAD; if (result == img_LABEL && pimg->survey_len) { if (strncmp(pimg->label, pimg->survey, pimg->survey_len + 1) != 0) goto again; pimg->label += pimg->survey_len + 1; } done: *p = pt; if (result == img_MOVE && pimg->version == 1) { /* peek at next code and see if it's an old-style label */ opt_lookahead = get32(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (opt_lookahead == 2) return img_read_item_ancient(pimg, p); } return result; } static int img_read_item_ascii_wrapper(img *pimg, img_point *p) { /* We need to set the default locale for fscanf() to work on * numbers with "." as decimal point. */ int result; char * current_locale = my_strdup(setlocale(LC_NUMERIC, NULL)); setlocale(LC_NUMERIC, "C"); result = img_read_item_ascii(pimg, p); setlocale(LC_NUMERIC, current_locale); free(current_locale); return result; } /* Handle all ASCII formats. */ static int img_read_item_ascii(img *pimg, img_point *p) { int result; pimg->label = pimg->label_buf; if (pimg->version == 0) { ascii_again: pimg->label[0] = '\0'; if (feof(pimg->fh)) return img_STOP; if (pimg->pending) { pimg->pending = 0; result = img_LINE; } else { char cmd[7]; /* Stop if nothing found */ if (fscanf(pimg->fh, "%6s", cmd) < 1) return img_STOP; if (strcmp(cmd, "move") == 0) result = img_MOVE; else if (strcmp(cmd, "draw") == 0) result = img_LINE; else if (strcmp(cmd, "line") == 0) { /* set flag to indicate to process second triplet as LINE */ pimg->pending = 1; result = img_MOVE; } else if (strcmp(cmd, "cross") == 0) { if (fscanf(pimg->fh, "%lf%lf%lf", &p->x, &p->y, &p->z) < 3) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } goto ascii_again; } else if (strcmp(cmd, "name") == 0) { size_t off = 0; int ch = GETC(pimg->fh); if (ch == ' ') ch = GETC(pimg->fh); while (ch != ' ') { if (ch == '\n' || ch == EOF) { img_errno = ferror(pimg->fh) ? IMG_READERROR : IMG_BADFORMAT; return img_BAD; } if (off == pimg->buf_len) { if (!check_label_space(pimg, pimg->buf_len * 2)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } pimg->label_buf[off++] = ch; ch = GETC(pimg->fh); } pimg->label_buf[off] = '\0'; pimg->label = pimg->label_buf; if (pimg->label[0] == '\\') pimg->label++; pimg->flags = img_SFLAG_UNDERGROUND; /* default flags */ result = img_LABEL; } else { img_errno = IMG_BADFORMAT; return img_BAD; /* unknown keyword */ } } if (fscanf(pimg->fh, "%lf%lf%lf", &p->x, &p->y, &p->z) < 3) { img_errno = ferror(pimg->fh) ? IMG_READERROR : IMG_BADFORMAT; return img_BAD; } if (result == img_LABEL && pimg->survey_len) { if (strncmp(pimg->label, pimg->survey, pimg->survey_len + 1) != 0) goto ascii_again; pimg->label += pimg->survey_len + 1; } return result; } else if (pimg->version == VERSION_SURVEX_POS) { /* Survex .pos file */ int ch; size_t off; pimg->flags = img_SFLAG_UNDERGROUND; /* default flags */ againpos: off = 0; while (fscanf(pimg->fh, "(%lf,%lf,%lf )", &p->x, &p->y, &p->z) != 3) { if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (feof(pimg->fh)) return img_STOP; if (pimg->pending) { img_errno = IMG_BADFORMAT; return img_BAD; } pimg->pending = 1; /* ignore rest of line */ do { ch = GETC(pimg->fh); } while (ch != '\n' && ch != '\r' && ch != EOF); } pimg->label_buf[0] = '\0'; do { ch = GETC(pimg->fh); } while (ch == ' ' || ch == '\t'); if (ch == '\n' || ch == EOF) { /* If there's no label, set img_SFLAG_ANON. */ pimg->flags |= img_SFLAG_ANON; return img_LABEL; } pimg->label_buf[0] = ch; off = 1; while (!feof(pimg->fh)) { if (!fgets(pimg->label_buf + off, pimg->buf_len - off, pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } off += strlen(pimg->label_buf + off); if (off && pimg->label_buf[off - 1] == '\n') { pimg->label_buf[off - 1] = '\0'; break; } if (!check_label_space(pimg, pimg->buf_len * 2)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } pimg->label = pimg->label_buf; if (pimg->label[0] == '\\') pimg->label++; if (pimg->survey_len) { size_t l = pimg->survey_len + 1; if (strncmp(pimg->survey, pimg->label, l) != 0) goto againpos; pimg->label += l; } return img_LABEL; } else if (pimg->version == VERSION_COMPASS_PLT) { /* Compass .plt file */ if (pimg->pending > 0) { /* -1 signals we've entered the first survey we want to * read, and need to fudge lots if the first action is 'D'... */ /* pending MOVE or LINE */ int r = pimg->pending - 4; pimg->pending = 0; pimg->flags = 0; pimg->label[pimg->label_len] = '\0'; return r; } while (1) { char *line; char *q; size_t len = 0; int ch = GETC(pimg->fh); switch (ch) { case '\x1a': case EOF: /* Don't insist on ^Z at end of file */ return img_STOP; case 'X': case 'F': case 'S': /* bounding boX (marks end of survey), Feature survey, or * new Section - skip to next survey */ if (pimg->survey) return img_STOP; skip_to_N: while (1) { do { ch = GETC(pimg->fh); } while (ch != '\n' && ch != '\r' && ch != EOF); while (ch == '\n' || ch == '\r') ch = GETC(pimg->fh); if (ch == 'N') break; if (ch == '\x1a' || ch == EOF) return img_STOP; } /* FALLTHRU */ case 'N': line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } while (line[len] > 32) ++len; if (pimg->label_len == 0) pimg->pending = -1; if (!check_label_space(pimg, len + 1)) { osfree(line); img_errno = IMG_OUTOFMEMORY; return img_BAD; } pimg->label_len = len; pimg->label = pimg->label_buf; memcpy(pimg->label, line, len); pimg->label[len] = '\0'; osfree(line); break; case 'M': case 'D': { /* Move or Draw */ long fpos = -1; if (pimg->survey && pimg->label_len == 0) { /* We're only holding onto this line in case the first line * of the 'N' is a 'D', so skip it for now... */ goto skip_to_N; } if (ch == 'D' && pimg->pending == -1) { if (pimg->survey) { fpos = ftell(pimg->fh) - 1; fseek(pimg->fh, pimg->start, SEEK_SET); ch = GETC(pimg->fh); pimg->pending = 0; } else { /* If a file actually has a 'D' before any 'M', then * pretend the 'D' is an 'M' - one of the examples * in the docs was like this! */ ch = 'M'; } } line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } /* Compass stores coordinates as North, East, Up = (y,x,z)! */ if (sscanf(line, "%lf%lf%lf", &p->y, &p->x, &p->z) != 3) { osfree(line); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; } else { img_errno = IMG_BADFORMAT; } return img_BAD; } p->x *= METRES_PER_FOOT; p->y *= METRES_PER_FOOT; p->z *= METRES_PER_FOOT; q = strchr(line, 'S'); if (!q) { osfree(line); img_errno = IMG_BADFORMAT; return img_BAD; } ++q; len = 0; while (q[len] > ' ') ++len; q[len] = '\0'; len += 2; /* ' ' and '\0' */ if (!check_label_space(pimg, pimg->label_len + len)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } pimg->label = pimg->label_buf; if (pimg->label_len) { pimg->label[pimg->label_len] = ' '; memcpy(pimg->label + pimg->label_len + 1, q, len - 1); } else { memcpy(pimg->label, q, len - 1); } q += len - 1; /* Now read LRUD. Technically, this is optional but virtually * all PLT files have it (with dummy negative values if no LRUD * was measured) and some versions of Compass can't read PLT * files without it! */ while (*q && *q <= ' ') q++; if (*q == 'P') { if (sscanf(q + 1, "%lf%lf%lf%lf", &pimg->l, &pimg->r, &pimg->u, &pimg->d) != 4) { osfree(line); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; } else { img_errno = IMG_BADFORMAT; } return img_BAD; } pimg->l *= METRES_PER_FOOT; pimg->r *= METRES_PER_FOOT; pimg->u *= METRES_PER_FOOT; pimg->d *= METRES_PER_FOOT; } else { pimg->l = pimg->r = pimg->u = pimg->d = -1; } osfree(line); pimg->flags = img_SFLAG_UNDERGROUND; /* default flags */ if (fpos != -1) { fseek(pimg->fh, fpos, SEEK_SET); } else { pimg->pending = (ch == 'M' ? img_MOVE : img_LINE) + 4; } return img_LABEL; } default: img_errno = IMG_BADFORMAT; return img_BAD; } } } else { /* CMAP .xyz file */ char *line = NULL; char *q; size_t len; if (pimg->pending) { /* pending MOVE or LINE or LABEL or STOP */ int r = pimg->pending - 4; /* Set label to empty - don't use "" as we adjust label relative * to label_buf when label_buf is reallocated. */ pimg->label = pimg->label_buf + strlen(pimg->label_buf); pimg->flags = 0; if (r == img_LABEL) { /* nasty magic */ read_xyz_shot_coords(p, pimg->label_buf + 16); subtract_xyz_shot_deltas(p, pimg->label_buf + 16); pimg->pending = img_STOP + 4; return img_MOVE; } pimg->pending = 0; if (r == img_STOP) { /* nasty magic */ read_xyz_shot_coords(p, pimg->label_buf + 16); return img_LINE; } return r; } pimg->label = pimg->label_buf; do { osfree(line); if (feof(pimg->fh)) return img_STOP; line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } while (line[0] == ' ' || line[0] == '\0'); if (line[0] == '\x1a') return img_STOP; len = strlen(line); if (pimg->version == VERSION_CMAP_STATION) { /* station variant */ if (len < 37) { osfree(line); img_errno = IMG_BADFORMAT; return img_BAD; } memcpy(pimg->label, line, 6); q = (char *)memchr(pimg->label, ' ', 6); if (!q) q = pimg->label + 6; *q = '\0'; read_xyz_station_coords(p, line); /* FIXME: look at prev for lines (line + 32, 5) */ /* FIXME: duplicate stations... */ return img_LABEL; } else { /* Shot variant (VERSION_CMAP_SHOT) */ char old[8], new_[8]; if (len < 61) { osfree(line); img_errno = IMG_BADFORMAT; return img_BAD; } memcpy(old, line, 7); q = (char *)memchr(old, ' ', 7); if (!q) q = old + 7; *q = '\0'; memcpy(new_, line + 7, 7); q = (char *)memchr(new_, ' ', 7); if (!q) q = new_ + 7; *q = '\0'; pimg->flags = img_SFLAG_UNDERGROUND; if (strcmp(old, new_) == 0) { pimg->pending = img_MOVE + 4; read_xyz_shot_coords(p, line); strcpy(pimg->label, new_); osfree(line); return img_LABEL; } if (strcmp(old, pimg->label) == 0) { pimg->pending = img_LINE + 4; read_xyz_shot_coords(p, line); strcpy(pimg->label, new_); osfree(line); return img_LABEL; } pimg->pending = img_LABEL + 4; read_xyz_shot_coords(p, line); strcpy(pimg->label, new_); memcpy(pimg->label + 16, line, 70); osfree(line); return img_LABEL; } } } static void write_coord(FILE *fh, double x, double y, double z) { static INT32_T X_, Y_, Z_; INT32_T X, Y, Z; SVX_ASSERT(fh); /* Output in cm */ X = my_lround(x * 100.0); Y = my_lround(y * 100.0); Z = my_lround(z * 100.0); X_ -= X; Y_ -= Y; Z_ -= Z; put32(X, fh); put32(Y, fh); put32(Z, fh); X_ = X; Y_ = Y; Z_ = Z; } static int write_v3label(img *pimg, int opt, const char *s) { size_t len, n, dot; /* find length of common prefix */ dot = 0; for (len = 0; s[len] == pimg->label_buf[len] && s[len] != '\0'; len++) { if (s[len] == '.') dot = len + 1; } SVX_ASSERT(len <= pimg->label_len); n = pimg->label_len - len; if (len == 0) { if (pimg->label_len) PUTC(0, pimg->fh); } else if (n <= 16) { if (n) PUTC(n + 15, pimg->fh); } else if (dot == 0) { if (pimg->label_len) PUTC(0, pimg->fh); len = 0; } else { const char *p = pimg->label_buf + dot; n = 1; for (len = pimg->label_len - dot - 17; len; len--) { if (*p++ == '.') n++; } if (n <= 14) { PUTC(n, pimg->fh); len = dot; } else { if (pimg->label_len) PUTC(0, pimg->fh); len = 0; } } n = strlen(s + len); PUTC(opt, pimg->fh); if (n < 0xfe) { PUTC(n, pimg->fh); } else if (n < 0xffff + 0xfe) { PUTC(0xfe, pimg->fh); put16((short)(n - 0xfe), pimg->fh); } else { PUTC(0xff, pimg->fh); put32(n, pimg->fh); } fwrite(s + len, n, 1, pimg->fh); n += len; pimg->label_len = n; if (!check_label_space(pimg, n + 1)) return 0; /* FIXME: distinguish out of memory... */ memcpy(pimg->label_buf + len, s + len, n - len + 1); return !ferror(pimg->fh); } static int write_v8label(img *pimg, int opt, int common_flag, size_t common_val, const char *s) { size_t len, del, add; /* find length of common prefix */ for (len = 0; s[len] == pimg->label_buf[len] && s[len] != '\0'; len++) { } SVX_ASSERT(len <= pimg->label_len); del = pimg->label_len - len; add = strlen(s + len); if (add == common_val && del == common_val) { PUTC(opt | common_flag, pimg->fh); } else { PUTC(opt, pimg->fh); if (del <= 15 && add <= 15 && (del || add)) { PUTC((del << 4) | add, pimg->fh); } else { PUTC(0x00, pimg->fh); if (del < 0xff) { PUTC(del, pimg->fh); } else { PUTC(0xff, pimg->fh); put32(del, pimg->fh); } if (add < 0xff) { PUTC(add, pimg->fh); } else { PUTC(0xff, pimg->fh); put32(add, pimg->fh); } } } if (add) fwrite(s + len, add, 1, pimg->fh); pimg->label_len = len + add; if (add > del && !check_label_space(pimg, pimg->label_len + 1)) return 0; /* FIXME: distinguish out of memory... */ memcpy(pimg->label_buf + len, s + len, add + 1); return !ferror(pimg->fh); } static void img_write_item_date_new(img *pimg) { int same, unset; /* Only write dates when they've changed. */ #if IMG_API_VERSION == 0 if (pimg->date1 == pimg->olddate1 && pimg->date2 == pimg->olddate2) return; same = (pimg->date1 == pimg->date2); unset = (pimg->date1 == 0); #else /* IMG_API_VERSION == 1 */ if (pimg->days1 == pimg->olddays1 && pimg->days2 == pimg->olddays2) return; same = (pimg->days1 == pimg->days2); unset = (pimg->days1 == -1); #endif if (same) { if (unset) { PUTC(0x10, pimg->fh); } else { PUTC(0x11, pimg->fh); #if IMG_API_VERSION == 0 put16(pimg->date1 / 86400 + 25567, pimg->fh); #else /* IMG_API_VERSION == 1 */ put16(pimg->days1, pimg->fh); #endif } } else { #if IMG_API_VERSION == 0 int diff = (pimg->date2 - pimg->date1) / 86400; if (diff > 0 && diff <= 256) { PUTC(0x12, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x13, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); put16(pimg->date2 / 86400 + 25567, pimg->fh); } #else /* IMG_API_VERSION == 1 */ int diff = pimg->days2 - pimg->days1; if (diff > 0 && diff <= 256) { PUTC(0x12, pimg->fh); put16(pimg->days1, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x13, pimg->fh); put16(pimg->days1, pimg->fh); put16(pimg->days2, pimg->fh); } #endif } #if IMG_API_VERSION == 0 pimg->olddate1 = pimg->date1; pimg->olddate2 = pimg->date2; #else /* IMG_API_VERSION == 1 */ pimg->olddays1 = pimg->days1; pimg->olddays2 = pimg->days2; #endif } static void img_write_item_date(img *pimg) { int same, unset; /* Only write dates when they've changed. */ #if IMG_API_VERSION == 0 if (pimg->date1 == pimg->olddate1 && pimg->date2 == pimg->olddate2) return; same = (pimg->date1 == pimg->date2); unset = (pimg->date1 == 0); #else /* IMG_API_VERSION == 1 */ if (pimg->days1 == pimg->olddays1 && pimg->days2 == pimg->olddays2) return; same = (pimg->days1 == pimg->days2); unset = (pimg->days1 == -1); #endif if (same) { if (img_output_version < 7) { PUTC(0x20, pimg->fh); #if IMG_API_VERSION == 0 put32(pimg->date1, pimg->fh); #else /* IMG_API_VERSION == 1 */ put32((pimg->days1 - 25567) * 86400, pimg->fh); #endif } else { if (unset) { PUTC(0x24, pimg->fh); } else { PUTC(0x20, pimg->fh); #if IMG_API_VERSION == 0 put16(pimg->date1 / 86400 + 25567, pimg->fh); #else /* IMG_API_VERSION == 1 */ put16(pimg->days1, pimg->fh); #endif } } } else { if (img_output_version < 7) { PUTC(0x21, pimg->fh); #if IMG_API_VERSION == 0 put32(pimg->date1, pimg->fh); put32(pimg->date2, pimg->fh); #else /* IMG_API_VERSION == 1 */ put32((pimg->days1 - 25567) * 86400, pimg->fh); put32((pimg->days2 - 25567) * 86400, pimg->fh); #endif } else { #if IMG_API_VERSION == 0 int diff = (pimg->date2 - pimg->date1) / 86400; if (diff > 0 && diff <= 256) { PUTC(0x21, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x23, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); put16(pimg->date2 / 86400 + 25567, pimg->fh); } #else /* IMG_API_VERSION == 1 */ int diff = pimg->days2 - pimg->days1; if (diff > 0 && diff <= 256) { PUTC(0x21, pimg->fh); put16(pimg->days1, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x23, pimg->fh); put16(pimg->days1, pimg->fh); put16(pimg->days2, pimg->fh); } #endif } } #if IMG_API_VERSION == 0 pimg->olddate1 = pimg->date1; pimg->olddate2 = pimg->date2; #else /* IMG_API_VERSION == 1 */ pimg->olddays1 = pimg->days1; pimg->olddays2 = pimg->days2; #endif } static void img_write_item_new(img *pimg, int code, int flags, const char *s, double x, double y, double z); static void img_write_item_v3to7(img *pimg, int code, int flags, const char *s, double x, double y, double z); static void img_write_item_ancient(img *pimg, int code, int flags, const char *s, double x, double y, double z); void img_write_item(img *pimg, int code, int flags, const char *s, double x, double y, double z) { if (!pimg) return; if (pimg->version >= 8) { img_write_item_new(pimg, code, flags, s, x, y, z); } else if (pimg->version >= 3) { img_write_item_v3to7(pimg, code, flags, s, x, y, z); } else { img_write_item_ancient(pimg, code, flags, s, x, y, z); } } static void img_write_item_new(img *pimg, int code, int flags, const char *s, double x, double y, double z) { switch (code) { case img_LABEL: write_v8label(pimg, 0x80 | flags, 0, -1, s); break; case img_XSECT: { INT32_T l, r, u, d, max_dim; img_write_item_date_new(pimg); l = (INT32_T)my_lround(pimg->l * 100.0); r = (INT32_T)my_lround(pimg->r * 100.0); u = (INT32_T)my_lround(pimg->u * 100.0); d = (INT32_T)my_lround(pimg->d * 100.0); if (l < 0) l = -1; if (r < 0) r = -1; if (u < 0) u = -1; if (d < 0) d = -1; max_dim = max(max(l, r), max(u, d)); flags = (flags & img_XFLAG_END) ? 1 : 0; if (max_dim >= 32768) flags |= 2; write_v8label(pimg, 0x30 | flags, 0, -1, s); if (flags & 2) { /* Big passage! Need to use 4 bytes. */ put32(l, pimg->fh); put32(r, pimg->fh); put32(u, pimg->fh); put32(d, pimg->fh); } else { put16(l, pimg->fh); put16(r, pimg->fh); put16(u, pimg->fh); put16(d, pimg->fh); } return; } case img_MOVE: PUTC(15, pimg->fh); break; case img_LINE: img_write_item_date_new(pimg); if (pimg->style != pimg->oldstyle) { switch (pimg->style) { case img_STYLE_NORMAL: case img_STYLE_DIVING: case img_STYLE_CARTESIAN: case img_STYLE_CYLPOLAR: case img_STYLE_NOSURVEY: PUTC(pimg->style, pimg->fh); break; } pimg->oldstyle = pimg->style; } write_v8label(pimg, 0x40 | flags, 0x20, 0x00, s ? s : ""); break; default: /* ignore for now */ return; } write_coord(pimg->fh, x, y, z); } static void img_write_item_v3to7(img *pimg, int code, int flags, const char *s, double x, double y, double z) { switch (code) { case img_LABEL: write_v3label(pimg, 0x40 | flags, s); break; case img_XSECT: { INT32_T l, r, u, d, max_dim; /* Need at least version 5 for img_XSECT. */ if (pimg->version < 5) return; img_write_item_date(pimg); l = (INT32_T)my_lround(pimg->l * 100.0); r = (INT32_T)my_lround(pimg->r * 100.0); u = (INT32_T)my_lround(pimg->u * 100.0); d = (INT32_T)my_lround(pimg->d * 100.0); if (l < 0) l = -1; if (r < 0) r = -1; if (u < 0) u = -1; if (d < 0) d = -1; max_dim = max(max(l, r), max(u, d)); flags = (flags & img_XFLAG_END) ? 1 : 0; if (max_dim >= 32768) flags |= 2; write_v3label(pimg, 0x30 | flags, s); if (flags & 2) { /* Big passage! Need to use 4 bytes. */ put32(l, pimg->fh); put32(r, pimg->fh); put32(u, pimg->fh); put32(d, pimg->fh); } else { put16(l, pimg->fh); put16(r, pimg->fh); put16(u, pimg->fh); put16(d, pimg->fh); } return; } case img_MOVE: PUTC(15, pimg->fh); break; case img_LINE: if (pimg->version >= 4) { img_write_item_date(pimg); } write_v3label(pimg, 0x80 | flags, s ? s : ""); break; default: /* ignore for now */ return; } write_coord(pimg->fh, x, y, z); } static void img_write_item_ancient(img *pimg, int code, int flags, const char *s, double x, double y, double z) { size_t len; INT32_T opt = 0; SVX_ASSERT(pimg->version > 0); switch (code) { case img_LABEL: if (pimg->version == 1) { /* put a move before each label */ img_write_item_ancient(pimg, img_MOVE, 0, NULL, x, y, z); put32(2, pimg->fh); fputsnl(s, pimg->fh); return; } len = strlen(s); if (len > 255 || strchr(s, '\n')) { /* long label - not in early incarnations of v2 format, but few * 3d files will need these, so better not to force incompatibility * with a new version I think... */ PUTC(7, pimg->fh); PUTC(flags, pimg->fh); put32(len, pimg->fh); fputs(s, pimg->fh); } else { PUTC(0x40 | (flags & 0x3f), pimg->fh); fputsnl(s, pimg->fh); } opt = 0; break; case img_MOVE: opt = 4; break; case img_LINE: if (pimg->version > 1) { opt = 0x80 | (flags & 0x3f); break; } opt = 5; break; default: /* ignore for now */ return; } if (pimg->version == 1) { put32(opt, pimg->fh); } else { if (opt) PUTC(opt, pimg->fh); } write_coord(pimg->fh, x, y, z); } /* Write error information for the current traverse * n_legs is the number of legs in the traverse * length is the traverse length (in m) * E is the ratio of the observed misclosure to the theoretical one * H is the ratio of the observed horizontal misclosure to the theoretical one * V is the ratio of the observed vertical misclosure to the theoretical one */ void img_write_errors(img *pimg, int n_legs, double length, double E, double H, double V) { PUTC((pimg->version >= 8 ? 0x1f : 0x22), pimg->fh); put32(n_legs, pimg->fh); put32((INT32_T)my_lround(length * 100.0), pimg->fh); put32((INT32_T)my_lround(E * 100.0), pimg->fh); put32((INT32_T)my_lround(H * 100.0), pimg->fh); put32((INT32_T)my_lround(V * 100.0), pimg->fh); } int img_close(img *pimg) { int result = 1; if (pimg) { if (pimg->fh) { if (pimg->fRead) { osfree(pimg->survey); osfree(pimg->title); osfree(pimg->datestamp); } else { /* write end of data marker */ switch (pimg->version) { case 1: put32((INT32_T)-1, pimg->fh); break; default: if (pimg->version <= 7 ? (pimg->label_len != 0) : (pimg->style != img_STYLE_NORMAL)) { PUTC(0, pimg->fh); } /* FALL THROUGH */ case 2: PUTC(0, pimg->fh); break; } } if (ferror(pimg->fh)) result = 0; if (fclose(pimg->fh)) result = 0; if (!result) img_errno = pimg->fRead ? IMG_READERROR : IMG_WRITEERROR; } osfree(pimg->label_buf); osfree(pimg->filename_opened); osfree(pimg); } return result; } therion/extern/getopt.h0000664000175000017500000001104610402755572014237 0ustar useruser/* Declarations for getopt. Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifndef __GNU_LIBRARY__ #define __GNU_LIBRARY__ 1 #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if defined (__STDC__) && __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ therion/extern/proj4/0000775000175000017500000000000012447624333013621 5ustar userusertherion/extern/proj4/PJ_aea.c0000664000175000017500000001167111130502664015100 0ustar useruser/****************************************************************************** * $Id: PJ_aea.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of the aea (Albers Equal Area) projection. * Author: Gerald Evenden * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PROJ_PARMS__ \ double ec; \ double n; \ double c; \ double dd; \ double n2; \ double rho0; \ double rho; \ double phi1; \ double phi2; \ double *en; \ int ellips; #define PJ_LIB__ #include PJ_CVSID("$Id: PJ_aea.c 1504 2009-01-06 02:11:57Z warmerdam $"); # define EPS10 1.e-10 # define TOL7 1.e-7 PROJ_HEAD(aea, "Albers Equal Area") "\n\tConic Sph&Ell\n\tlat_1= lat_2="; PROJ_HEAD(leac, "Lambert Equal Area Conic") "\n\tConic, Sph&Ell\n\tlat_1= south"; /* determine latitude angle phi-1 */ # define N_ITER 15 # define EPSILON 1.0e-7 # define TOL 1.0e-10 static double phi1_(double qs, double Te, double Tone_es) { int i; double Phi, sinpi, cospi, con, com, dphi; Phi = asin (.5 * qs); if (Te < EPSILON) return( Phi ); i = N_ITER; do { sinpi = sin (Phi); cospi = cos (Phi); con = Te * sinpi; com = 1. - con * con; dphi = .5 * com * com / cospi * (qs / Tone_es - sinpi / com + .5 / Te * log ((1. - con) / (1. + con))); Phi += dphi; } while (fabs(dphi) > TOL && --i); return( i ? Phi : HUGE_VAL ); } FORWARD(e_forward); /* ellipsoid & spheroid */ if ((P->rho = P->c - (P->ellips ? P->n * pj_qsfn(sin(lp.phi), P->e, P->one_es) : P->n2 * sin(lp.phi))) < 0.) F_ERROR P->rho = P->dd * sqrt(P->rho); xy.x = P->rho * sin( lp.lam *= P->n ); xy.y = P->rho0 - P->rho * cos(lp.lam); return (xy); } INVERSE(e_inverse) /* ellipsoid & spheroid */; if( (P->rho = hypot(xy.x, xy.y = P->rho0 - xy.y)) != 0.0 ) { if (P->n < 0.) { P->rho = -P->rho; xy.x = -xy.x; xy.y = -xy.y; } lp.phi = P->rho / P->dd; if (P->ellips) { lp.phi = (P->c - lp.phi * lp.phi) / P->n; if (fabs(P->ec - fabs(lp.phi)) > TOL7) { if ((lp.phi = phi1_(lp.phi, P->e, P->one_es)) == HUGE_VAL) I_ERROR } else lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; } else if (fabs(lp.phi = (P->c - lp.phi * lp.phi) / P->n2) <= 1.) lp.phi = asin(lp.phi); else lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; lp.lam = atan2(xy.x, xy.y) / P->n; } else { lp.lam = 0.; lp.phi = P->n > 0. ? HALFPI : - HALFPI; } return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } static PJ * setup(PJ *P) { double cosphi, sinphi; int secant; if (fabs(P->phi1 + P->phi2) < EPS10) E_ERROR(-21); P->n = sinphi = sin(P->phi1); cosphi = cos(P->phi1); secant = fabs(P->phi1 - P->phi2) >= EPS10; if( (P->ellips = (P->es > 0.))) { double ml1, m1; if (!(P->en = pj_enfn(P->es))) E_ERROR_0; m1 = pj_msfn(sinphi, cosphi, P->es); ml1 = pj_qsfn(sinphi, P->e, P->one_es); if (secant) { /* secant cone */ double ml2, m2; sinphi = sin(P->phi2); cosphi = cos(P->phi2); m2 = pj_msfn(sinphi, cosphi, P->es); ml2 = pj_qsfn(sinphi, P->e, P->one_es); P->n = (m1 * m1 - m2 * m2) / (ml2 - ml1); } P->ec = 1. - .5 * P->one_es * log((1. - P->e) / (1. + P->e)) / P->e; P->c = m1 * m1 + P->n * ml1; P->dd = 1. / P->n; P->rho0 = P->dd * sqrt(P->c - P->n * pj_qsfn(sin(P->phi0), P->e, P->one_es)); } else { if (secant) P->n = .5 * (P->n + sin(P->phi2)); P->n2 = P->n + P->n; P->c = cosphi * cosphi + P->n2 * sinphi; P->dd = 1. / P->n; P->rho0 = P->dd * sqrt(P->c - P->n2 * sin(P->phi0)); } P->inv = e_inverse; P->fwd = e_forward; return P; } ENTRY1(aea,en) P->phi1 = pj_param(P->params, "rlat_1").f; P->phi2 = pj_param(P->params, "rlat_2").f; ENDENTRY(setup(P)) ENTRY1(leac,en) P->phi2 = pj_param(P->params, "rlat_1").f; P->phi1 = pj_param(P->params, "bsouth").i ? - HALFPI: HALFPI; ENDENTRY(setup(P)) therion/extern/proj4/PJ_cass.c0000664000175000017500000000375711137333514015314 0ustar useruser#define PROJ_PARMS__ \ double m0; \ double n; \ double t; \ double a1; \ double c; \ double r; \ double dd; \ double d2; \ double a2; \ double tn; \ double *en; #define PJ_LIB__ # include PROJ_HEAD(cass, "Cassini") "\n\tCyl, Sph&Ell"; # define EPS10 1e-10 # define C1 .16666666666666666666 # define C2 .00833333333333333333 # define C3 .04166666666666666666 # define C4 .33333333333333333333 # define C5 .06666666666666666666 FORWARD(e_forward); /* ellipsoid */ xy.y = pj_mlfn(lp.phi, P->n = sin(lp.phi), P->c = cos(lp.phi), P->en); P->n = 1./sqrt(1. - P->es * P->n * P->n); P->tn = tan(lp.phi); P->t = P->tn * P->tn; P->a1 = lp.lam * P->c; P->c *= P->es * P->c / (1 - P->es); P->a2 = P->a1 * P->a1; xy.x = P->n * P->a1 * (1. - P->a2 * P->t * (C1 - (8. - P->t + 8. * P->c) * P->a2 * C2)); xy.y -= P->m0 - P->n * P->tn * P->a2 * (.5 + (5. - P->t + 6. * P->c) * P->a2 * C3); return (xy); } FORWARD(s_forward); /* spheroid */ xy.x = asin(cos(lp.phi) * sin(lp.lam)); xy.y = atan2(tan(lp.phi) , cos(lp.lam)) - P->phi0; return (xy); } INVERSE(e_inverse); /* ellipsoid */ double ph1; ph1 = pj_inv_mlfn(P->m0 + xy.y, P->es, P->en); P->tn = tan(ph1); P->t = P->tn * P->tn; P->n = sin(ph1); P->r = 1. / (1. - P->es * P->n * P->n); P->n = sqrt(P->r); P->r *= (1. - P->es) * P->n; P->dd = xy.x / P->n; P->d2 = P->dd * P->dd; lp.phi = ph1 - (P->n * P->tn / P->r) * P->d2 * (.5 - (1. + 3. * P->t) * P->d2 * C3); lp.lam = P->dd * (1. + P->t * P->d2 * (-C4 + (1. + 3. * P->t) * P->d2 * C5)) / cos(ph1); return (lp); } INVERSE(s_inverse); /* spheroid */ lp.phi = asin(sin(P->dd = xy.y + P->phi0) * cos(xy.x)); lp.lam = atan2(tan(xy.x), cos(P->dd)); return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY1(cass, en) if (P->es) { if (!(P->en = pj_enfn(P->es))) E_ERROR_0; P->m0 = pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), P->en); P->inv = e_inverse; P->fwd = e_forward; } else { P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/proj4/PJ_urmfps.c0000664000175000017500000000166211137334042015665 0ustar useruser#define PROJ_PARMS__ \ double n, C_y; #define PJ_LIB__ #include PROJ_HEAD(urmfps, "Urmaev Flat-Polar Sinusoidal") "\n\tPCyl, Sph.\n\tn="; PROJ_HEAD(wag1, "Wagner I (Kavraisky VI)") "\n\tPCyl, Sph."; #define C_x 0.8773826753 #define Cy 1.139753528477 FORWARD(s_forward); /* sphere */ lp.phi = aasin(P->n * sin(lp.phi)); xy.x = C_x * lp.lam * cos(lp.phi); xy.y = P->C_y * lp.phi; return (xy); } INVERSE(s_inverse); /* sphere */ xy.y /= P->C_y; lp.phi = aasin(sin(xy.y) / P->n); lp.lam = xy.x / (C_x * cos(xy.y)); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->C_y = Cy / P->n; P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(urmfps) if (pj_param(P->params, "tn").i) { P->n = pj_param(P->params, "dn").f; if (P->n <= 0. || P->n > 1.) E_ERROR(-40) } else E_ERROR(-40) ENDENTRY(setup(P)) ENTRY0(wag1) P->n = 0.8660254037844386467637231707; ENDENTRY(setup(P)) therion/extern/proj4/PJ_bonne.c0000664000175000017500000000366111137333512015454 0ustar useruser#define PROJ_PARMS__ \ double phi1; \ double cphi1; \ double am1; \ double m1; \ double *en; #define PJ_LIB__ #include PROJ_HEAD(bonne, "Bonne (Werner lat_1=90)") "\n\tConic Sph&Ell\n\tlat_1="; #define EPS10 1e-10 FORWARD(e_forward); /* ellipsoid */ double rh, E, c; rh = P->am1 + P->m1 - pj_mlfn(lp.phi, E = sin(lp.phi), c = cos(lp.phi), P->en); E = c * lp.lam / (rh * sqrt(1. - P->es * E * E)); xy.x = rh * sin(E); xy.y = P->am1 - rh * cos(E); return (xy); } FORWARD(s_forward); /* spheroid */ double E, rh; rh = P->cphi1 + P->phi1 - lp.phi; if (fabs(rh) > EPS10) { xy.x = rh * sin(E = lp.lam * cos(lp.phi) / rh); xy.y = P->cphi1 - rh * cos(E); } else xy.x = xy.y = 0.; return (xy); } INVERSE(s_inverse); /* spheroid */ double rh; rh = hypot(xy.x, xy.y = P->cphi1 - xy.y); lp.phi = P->cphi1 + P->phi1 - rh; if (fabs(lp.phi) > HALFPI) I_ERROR; if (fabs(fabs(lp.phi) - HALFPI) <= EPS10) lp.lam = 0.; else lp.lam = rh * atan2(xy.x, xy.y) / cos(lp.phi); return (lp); } INVERSE(e_inverse); /* ellipsoid */ double s, rh; rh = hypot(xy.x, xy.y = P->am1 - xy.y); lp.phi = pj_inv_mlfn(P->am1 + P->m1 - rh, P->es, P->en); if ((s = fabs(lp.phi)) < HALFPI) { s = sin(lp.phi); lp.lam = rh * atan2(xy.x, xy.y) * sqrt(1. - P->es * s * s) / cos(lp.phi); } else if (fabs(s - HALFPI) <= EPS10) lp.lam = 0.; else I_ERROR; return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY1(bonne, en) double c; P->phi1 = pj_param(P->params, "rlat_1").f; if (fabs(P->phi1) < EPS10) E_ERROR(-23); if (P->es) { P->en = pj_enfn(P->es); P->m1 = pj_mlfn(P->phi1, P->am1 = sin(P->phi1), c = cos(P->phi1), P->en); P->am1 = c / (sqrt(1. - P->es * P->am1 * P->am1) * P->am1); P->inv = e_inverse; P->fwd = e_forward; } else { if (fabs(P->phi1) + EPS10 >= HALFPI) P->cphi1 = 0.; else P->cphi1 = 1. / tan(P->phi1); P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/proj4/PJ_tcc.c0000664000175000017500000000071411137334014015116 0ustar useruser#define PROJ_PARMS__ \ double ap; #define EPS10 1.e-10 #define PJ_LIB__ #include PROJ_HEAD(tcc, "Transverse Central Cylindrical") "\n\tCyl, Sph, no inv."; FORWARD(s_forward); /* spheroid */ double b, bt; b = cos(lp.phi) * sin(lp.lam); if ((bt = 1. - b * b) < EPS10) F_ERROR; xy.x = b / sqrt(bt); xy.y = atan2(tan(lp.phi) , cos(lp.lam)); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(tcc) P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_denoy.c0000664000175000017500000000103511137333532015464 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(denoy, "Denoyer Semi-Elliptical") "\n\tPCyl., no inv., Sph."; #define C0 0.95 #define C1 -.08333333333333333333 #define C3 .00166666666666666666 #define D1 0.9 #define D5 0.03 FORWARD(s_forward); /* spheroid */ xy.y = lp.phi; xy.x = lp.lam; lp.lam = fabs(lp.lam); xy.x *= cos((C0 + lp.lam * (C1 + lp.lam * lp.lam * C3)) * (lp.phi * (D1 + D5 * lp.phi * lp.phi * lp.phi * lp.phi))); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(denoy) P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/proj_rouss.c0000664000175000017500000001037011130502664016161 0ustar useruser/* ** libproj -- library of cartographic projections ** ** Copyright (c) 2003, 2006 Gerald I. Evenden */ static const char LIBPROJ_ID[] = "$Id: proj_rouss.c 1504 2009-01-06 02:11:57Z warmerdam $"; /* ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define PROJ_PARMS__ \ double s0; \ double A1, A2, A3, A4, A5, A6; \ double B1, B2, B3, B4, B5, B6, B7, B8; \ double C1, C2, C3, C4, C5, C6, C7, C8; \ double D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11; \ void *en; #define PJ_LIB__ # include PROJ_HEAD(rouss, "Roussilhe Stereographic") "\n\tAzi., Ellps."; FORWARD(e_forward); /* ellipsoid */ double s, al, cp, sp, al2, s2; cp = cos(lp.phi); sp = sin(lp.phi); s = proj_mdist(lp.phi, sp, cp, P->en) - P->s0; s2 = s * s; al = lp.lam * cp / sqrt(1. - P->es * sp * sp); al2 = al * al; xy.x = P->k0 * al*(1.+s2*(P->A1+s2*P->A4)-al2*(P->A2+s*P->A3+s2*P->A5 +al2*P->A6)); xy.y = P->k0 * (al2*(P->B1+al2*P->B4)+ s*(1.+al2*(P->B3-al2*P->B6)+s2*(P->B2+s2*P->B8)+ s*al2*(P->B5+s*P->B7))); return (xy); } INVERSE(e_inverse); /* ellipsoid */ double s, al, x = xy.x / P->k0, y = xy.y / P->k0, x2, y2;; x2 = x * x; y2 = y * y; al = x*(1.-P->C1*y2+x2*(P->C2+P->C3*y-P->C4*x2+P->C5*y2-P->C7*x2*y) +y2*(P->C6*y2-P->C8*x2*y)); s = P->s0 + y*(1.+y2*(-P->D2+P->D8*y2))+ x2*(-P->D1+y*(-P->D3+y*(-P->D5+y*(-P->D7+y*P->D11)))+ x2*(P->D4+y*(P->D6+y*P->D10)-x2*P->D9)); lp.phi=proj_inv_mdist(s, P->en); s = sin(lp.phi); lp.lam=al * sqrt(1. - P->es * s * s)/cos(lp.phi); return (lp); } FREEUP; if (P) { if (P->en) free(P->en); free(P); } } ENTRY1(rouss, en) double N0, es2, t, t2, R_R0_2, R_R0_4; if (!((P->en = proj_mdist_ini(P->es)))) E_ERROR_0; es2 = sin(P->phi0); P->s0 = proj_mdist(P->phi0, es2, cos(P->phi0), P->en); t = 1. - (es2 = P->es * es2 * es2); N0 = 1./sqrt(t); R_R0_2 = t * t / P->one_es; R_R0_4 = R_R0_2 * R_R0_2; t = tan(P->phi0); t2 = t * t; P->C1 = P->A1 = R_R0_2 / 4.; P->C2 = P->A2 = R_R0_2 * (2 * t2 - 1. - 2. * es2) / 12.; P->A3 = R_R0_2 * t * (1. + 4. * t2)/ ( 12. * N0); P->A4 = R_R0_4 / 24.; P->A5 = R_R0_4 * ( -1. + t2 * (11. + 12. * t2))/24.; P->A6 = R_R0_4 * ( -2. + t2 * (11. - 2. * t2))/240.; P->B1 = t / (2. * N0); P->B2 = R_R0_2 / 12.; P->B3 = R_R0_2 * (1. + 2. * t2 - 2. * es2)/4.; P->B4 = R_R0_2 * t * (2. - t2)/(24. * N0); P->B5 = R_R0_2 * t * (5. + 4.* t2)/(8. * N0); P->B6 = R_R0_4 * (-2. + t2 * (-5. + 6. * t2))/48.; P->B7 = R_R0_4 * (5. + t2 * (19. + 12. * t2))/24.; P->B8 = R_R0_4 / 120.; P->C3 = R_R0_2 * t * (1. + t2)/(3. * N0); P->C4 = R_R0_4 * (-3. + t2 * (34. + 22. * t2))/240.; P->C5 = R_R0_4 * (4. + t2 * (13. + 12. * t2))/24.; P->C6 = R_R0_4 / 16.; P->C7 = R_R0_4 * t * (11. + t2 * (33. + t2 * 16.))/(48. * N0); P->C8 = R_R0_4 * t * (1. + t2 * 4.)/(36. * N0); P->D1 = t / (2. * N0); P->D2 = R_R0_2 / 12.; P->D3 = R_R0_2 * (2 * t2 + 1. - 2. * es2) / 4.; P->D4 = R_R0_2 * t * (1. + t2)/(8. * N0); P->D5 = R_R0_2 * t * (1. + t2 * 2.)/(4. * N0); P->D6 = R_R0_4 * (1. + t2 * (6. + t2 * 6.))/16.; P->D7 = R_R0_4 * t2 * (3. + t2 * 4.)/8.; P->D8 = R_R0_4 / 80.; P->D9 = R_R0_4 * t * (-21. + t2 * (178. - t2 * 26.))/720.; P->D10 = R_R0_4 * t * (29. + t2 * (86. + t2 * 48.))/(96. * N0); P->D11 = R_R0_4 * t * (37. + t2 * 44.)/(96. * N0); P->fwd = e_forward; P->inv = e_inverse; ENDENTRY(P) therion/extern/proj4/pj_tsfn.c0000664000175000017500000000040011137334032015407 0ustar useruser/* determine small t */ #include #include #define HALFPI 1.5707963267948966 double pj_tsfn(double phi, double sinphi, double e) { sinphi *= e; return (tan (.5 * (HALFPI - phi)) / pow((1. - sinphi) / (1. + sinphi), .5 * e)); } therion/extern/proj4/pj_list.h0000664000175000017500000001224111076404756015440 0ustar useruser#ifdef DO_PJ_LIST_ID static const char PJ_LIST_H_ID[] = "@(#)pj_list.h 4.5 95/08/09 GIE REL"; #endif /* Full list of current projections for Tue Jan 11 12:27:04 EST 1994 ** ** Copy this file and retain only appropriate lines for subset list */ PROJ_HEAD(aea, "Albers Equal Area") PROJ_HEAD(aeqd, "Azimuthal Equidistant") PROJ_HEAD(airy, "Airy") PROJ_HEAD(aitoff, "Aitoff") PROJ_HEAD(alsk, "Mod. Stererographics of Alaska") PROJ_HEAD(apian, "Apian Globular I") PROJ_HEAD(august, "August Epicycloidal") PROJ_HEAD(bacon, "Bacon Globular") PROJ_HEAD(bipc, "Bipolar conic of western hemisphere") PROJ_HEAD(boggs, "Boggs Eumorphic") PROJ_HEAD(bonne, "Bonne (Werner lat_1=90)") PROJ_HEAD(cass, "Cassini") PROJ_HEAD(cc, "Central Cylindrical") PROJ_HEAD(cea, "Equal Area Cylindrical") PROJ_HEAD(chamb, "Chamberlin Trimetric") PROJ_HEAD(collg, "Collignon") PROJ_HEAD(crast, "Craster Parabolic (Putnins P4)") PROJ_HEAD(denoy, "Denoyer Semi-Elliptical") PROJ_HEAD(eck1, "Eckert I") PROJ_HEAD(eck2, "Eckert II") PROJ_HEAD(eck3, "Eckert III") PROJ_HEAD(eck4, "Eckert IV") PROJ_HEAD(eck5, "Eckert V") PROJ_HEAD(eck6, "Eckert VI") PROJ_HEAD(eqc, "Equidistant Cylindrical (Plate Caree)") PROJ_HEAD(eqdc, "Equidistant Conic") PROJ_HEAD(euler, "Euler") PROJ_HEAD(fahey, "Fahey") PROJ_HEAD(fouc, "Foucaut") PROJ_HEAD(fouc_s, "Foucaut Sinusoidal") PROJ_HEAD(gall, "Gall (Gall Stereographic)") PROJ_HEAD(geocent, "Geocentric") PROJ_HEAD(geos, "Geostationary Satellite View") PROJ_HEAD(gins8, "Ginsburg VIII (TsNIIGAiK)") PROJ_HEAD(gn_sinu, "General Sinusoidal Series") PROJ_HEAD(gnom, "Gnomonic") PROJ_HEAD(goode, "Goode Homolosine") PROJ_HEAD(gs48, "Mod. Stererographics of 48 U.S.") PROJ_HEAD(gs50, "Mod. Stererographics of 50 U.S.") PROJ_HEAD(hammer, "Hammer & Eckert-Greifendorff") PROJ_HEAD(hatano, "Hatano Asymmetrical Equal Area") PROJ_HEAD(imw_p, "Internation Map of the World Polyconic") PROJ_HEAD(kav5, "Kavraisky V") PROJ_HEAD(kav7, "Kavraisky VII") PROJ_HEAD(krovak, "Krovak") PROJ_HEAD(labrd, "Laborde") PROJ_HEAD(laea, "Lambert Azimuthal Equal Area") PROJ_HEAD(lagrng, "Lagrange") PROJ_HEAD(larr, "Larrivee") PROJ_HEAD(lask, "Laskowski") PROJ_HEAD(lonlat, "Lat/long (Geodetic)") PROJ_HEAD(latlon, "Lat/long (Geodetic alias)") PROJ_HEAD(latlong, "Lat/long (Geodetic alias)") PROJ_HEAD(longlat, "Lat/long (Geodetic alias)") PROJ_HEAD(lcc, "Lambert Conformal Conic") PROJ_HEAD(lcca, "Lambert Conformal Conic Alternative") PROJ_HEAD(leac, "Lambert Equal Area Conic") PROJ_HEAD(lee_os, "Lee Oblated Stereographic") PROJ_HEAD(loxim, "Loximuthal") PROJ_HEAD(lsat, "Space oblique for LANDSAT") PROJ_HEAD(mbt_s, "McBryde-Thomas Flat-Polar Sine") PROJ_HEAD(mbt_fps, "McBryde-Thomas Flat-Pole Sine (No. 2)") PROJ_HEAD(mbtfpp, "McBride-Thomas Flat-Polar Parabolic") PROJ_HEAD(mbtfpq, "McBryde-Thomas Flat-Polar Quartic") PROJ_HEAD(mbtfps, "McBryde-Thomas Flat-Polar Sinusoidal") PROJ_HEAD(merc, "Mercator") PROJ_HEAD(mil_os, "Miller Oblated Stereographic") PROJ_HEAD(mill, "Miller Cylindrical") PROJ_HEAD(moll, "Mollweide") PROJ_HEAD(murd1, "Murdoch I") PROJ_HEAD(murd2, "Murdoch II") PROJ_HEAD(murd3, "Murdoch III") PROJ_HEAD(nell, "Nell") PROJ_HEAD(nell_h, "Nell-Hammer") PROJ_HEAD(nicol, "Nicolosi Globular") PROJ_HEAD(nsper, "Near-sided perspective") PROJ_HEAD(nzmg, "New Zealand Map Grid") PROJ_HEAD(ob_tran, "General Oblique Transformation") PROJ_HEAD(ocea, "Oblique Cylindrical Equal Area") PROJ_HEAD(oea, "Oblated Equal Area") PROJ_HEAD(omerc, "Oblique Mercator") PROJ_HEAD(ortel, "Ortelius Oval") PROJ_HEAD(ortho, "Orthographic") PROJ_HEAD(pconic, "Perspective Conic") PROJ_HEAD(poly, "Polyconic (American)") PROJ_HEAD(putp1, "Putnins P1") PROJ_HEAD(putp2, "Putnins P2") PROJ_HEAD(putp3, "Putnins P3") PROJ_HEAD(putp3p, "Putnins P3'") PROJ_HEAD(putp4p, "Putnins P4'") PROJ_HEAD(putp5, "Putnins P5") PROJ_HEAD(putp5p, "Putnins P5'") PROJ_HEAD(putp6, "Putnins P6") PROJ_HEAD(putp6p, "Putnins P6'") PROJ_HEAD(qua_aut, "Quartic Authalic") PROJ_HEAD(robin, "Robinson") PROJ_HEAD(rouss, "Roussilhe Stereographic") PROJ_HEAD(rpoly, "Rectangular Polyconic") PROJ_HEAD(sinu, "Sinusoidal (Sanson-Flamsteed)") PROJ_HEAD(somerc, "Swiss. Obl. Mercator") PROJ_HEAD(stere, "Stereographic") PROJ_HEAD(sterea, "Oblique Stereographic Alternative") PROJ_HEAD(gstmerc, "Gauss-Schreiber Transverse Mercator (aka Gauss-Laborde Reunion)") PROJ_HEAD(tcc, "Transverse Central Cylindrical") PROJ_HEAD(tcea, "Transverse Cylindrical Equal Area") PROJ_HEAD(tissot, "Tissot Conic") PROJ_HEAD(tmerc, "Transverse Mercator") PROJ_HEAD(tpeqd, "Two Point Equidistant") PROJ_HEAD(tpers, "Tilted perspective") PROJ_HEAD(ups, "Universal Polar Stereographic") PROJ_HEAD(urm5, "Urmaev V") PROJ_HEAD(urmfps, "Urmaev Flat-Polar Sinusoidal") PROJ_HEAD(utm, "Universal Transverse Mercator (UTM)") PROJ_HEAD(vandg, "van der Grinten (I)") PROJ_HEAD(vandg2, "van der Grinten II") PROJ_HEAD(vandg3, "van der Grinten III") PROJ_HEAD(vandg4, "van der Grinten IV") PROJ_HEAD(vitk1, "Vitkovsky I") PROJ_HEAD(wag1, "Wagner I (Kavraisky VI)") PROJ_HEAD(wag2, "Wagner II") PROJ_HEAD(wag3, "Wagner III") PROJ_HEAD(wag4, "Wagner IV") PROJ_HEAD(wag5, "Wagner V") PROJ_HEAD(wag6, "Wagner VI") PROJ_HEAD(wag7, "Wagner VII") PROJ_HEAD(weren, "Werenskiold I") PROJ_HEAD(wink1, "Winkel I") PROJ_HEAD(wink2, "Winkel II") PROJ_HEAD(wintri, "Winkel Tripel") therion/extern/proj4/PJ_larr.c0000664000175000017500000000062411137333642015313 0ustar useruser#define PROJ_PARMS__ #define PJ_LIB__ #include PROJ_HEAD(larr, "Larrivee") "\n\tMisc Sph, no inv."; #define SIXTH .16666666666666666 FORWARD(s_forward); /* sphere */ xy.x = 0.5 * lp.lam * (1. + sqrt(cos(lp.phi))); xy.y = lp.phi / (cos(0.5 * lp.phi) * cos(SIXTH * lp.lam)); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(larr) P->fwd = s_forward; P->inv = 0; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_putp2.c0000664000175000017500000000200711137333752015424 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(putp2, "Putnins P2") "\n\tPCyl., Sph."; #define C_x 1.89490 #define C_y 1.71848 #define C_p 0.6141848493043784 #define EPS 1e-10 #define NITER 10 #define PI_DIV_3 1.0471975511965977 FORWARD(s_forward); /* spheroid */ double p, c, s, V; int i; p = C_p * sin(lp.phi); s = lp.phi * lp.phi; lp.phi *= 0.615709 + s * ( 0.00909953 + s * 0.0046292 ); for (i = NITER; i ; --i) { c = cos(lp.phi); s = sin(lp.phi); lp.phi -= V = (lp.phi + s * (c - 1.) - p) / (1. + c * (c - 1.) - s * s); if (fabs(V) < EPS) break; } if (!i) lp.phi = lp.phi < 0 ? - PI_DIV_3 : PI_DIV_3; xy.x = C_x * lp.lam * (cos(lp.phi) - 0.5); xy.y = C_y * sin(lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ double c; lp.phi = aasin(xy.y / C_y); lp.lam = xy.x / (C_x * ((c = cos(lp.phi)) - 0.5)); lp.phi = aasin((lp.phi + sin(lp.phi) * (c - 1.)) / C_p); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(putp2) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_bacon.c0000664000175000017500000000175411137333502015435 0ustar useruser# define HLFPI2 2.46740110027233965467 # define EPS 1e-10 #define PROJ_PARMS__ \ int bacn; \ int ortl; #define PJ_LIB__ #include PROJ_HEAD(apian, "Apian Globular I") "\n\tMisc Sph, no inv."; PROJ_HEAD(ortel, "Ortelius Oval") "\n\tMisc Sph, no inv."; PROJ_HEAD(bacon, "Bacon Globular") "\n\tMisc Sph, no inv."; FORWARD(s_forward); /* spheroid */ double ax, f; xy.y = P->bacn ? HALFPI * sin(lp.phi) : lp.phi; if ((ax = fabs(lp.lam)) >= EPS) { if (P->ortl && ax >= HALFPI) xy.x = sqrt(HLFPI2 - lp.phi * lp.phi + EPS) + ax - HALFPI; else { f = 0.5 * (HLFPI2 / ax + ax); xy.x = ax - f + sqrt(f * f - xy.y * xy.y); } if (lp.lam < 0.) xy.x = - xy.x; } else xy.x = 0.; return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(bacon) P->bacn = 1; P->ortl = 0; P->es = 0.; P->fwd = s_forward; ENDENTRY(P) ENTRY0(apian) P->bacn = P->ortl = 0; P->es = 0.; P->fwd = s_forward; ENDENTRY(P) ENTRY0(ortel) P->bacn = 0; P->ortl = 1; P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_release.c0000664000175000017500000000026411256553360016076 0ustar useruser/* <<< Release Notice for library >>> */ #include char const pj_release[]="Rel. 4.7.1, 23 September 2009"; const char *pj_get_release() { return pj_release; } therion/extern/proj4/pj_gridinfo.c0000664000175000017500000005626411130502664016262 0ustar useruser/****************************************************************************** * $Id: pj_gridinfo.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Functions for handling individual PJ_GRIDINFO's. Includes * loaders for all formats but CTABLE (in nad_init.c). * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include #include #ifdef _WIN32_WCE /* assert.h includes all Windows API headers and causes 'LP' name clash. * Here assert we disable assert() for Windows CE. * TODO - mloskot: re-implement porting friendly assert */ # define assert(exp) ((void)0) #else # include #endif /* _WIN32_WCE */ /************************************************************************/ /* swap_words() */ /* */ /* Convert the byte order of the given word(s) in place. */ /************************************************************************/ static int byte_order_test = 1; #define IS_LSB (((unsigned char *) (&byte_order_test))[0] == 1) static void swap_words( unsigned char *data, int word_size, int word_count ) { int word; for( word = 0; word < word_count; word++ ) { int i; for( i = 0; i < word_size/2; i++ ) { int t; t = data[i]; data[i] = data[word_size-i-1]; data[word_size-i-1] = t; } data += word_size; } } /************************************************************************/ /* pj_gridinfo_free() */ /************************************************************************/ void pj_gridinfo_free( PJ_GRIDINFO *gi ) { if( gi == NULL ) return; if( gi->child != NULL ) { PJ_GRIDINFO *child, *next; for( child = gi->child; child != NULL; child=next) { next=child->next; pj_gridinfo_free( child ); } } if( gi->ct != NULL ) nad_free( gi->ct ); free( gi->gridname ); if( gi->filename != NULL ) free( gi->filename ); pj_dalloc( gi ); } /************************************************************************/ /* pj_gridinfo_load() */ /* */ /* This function is intended to implement delayed loading of */ /* the data contents of a grid file. The header and related */ /* stuff are loaded by pj_gridinfo_init(). */ /************************************************************************/ int pj_gridinfo_load( PJ_GRIDINFO *gi ) { if( gi == NULL || gi->ct == NULL ) return 0; /* -------------------------------------------------------------------- */ /* ctable is currently loaded on initialization though there is */ /* no real reason not to support delayed loading for it as well. */ /* -------------------------------------------------------------------- */ if( strcmp(gi->format,"ctable") == 0 ) { FILE *fid; int result; fid = pj_open_lib( gi->filename, "rb" ); if( fid == NULL ) { pj_errno = -38; return 0; } result = nad_ctable_load( gi->ct, fid ); fclose( fid ); return result; } /* -------------------------------------------------------------------- */ /* NTv1 format. */ /* We process one line at a time. Note that the array storage */ /* direction (e-w) is different in the NTv1 file and what */ /* the CTABLE is supposed to have. The phi/lam are also */ /* reversed, and we have to be aware of byte swapping. */ /* -------------------------------------------------------------------- */ else if( strcmp(gi->format,"ntv1") == 0 ) { double *row_buf; int row; FILE *fid; fid = pj_open_lib( gi->filename, "rb" ); if( fid == NULL ) { pj_errno = -38; return 0; } fseek( fid, gi->grid_offset, SEEK_SET ); row_buf = (double *) pj_malloc(gi->ct->lim.lam * sizeof(double) * 2); gi->ct->cvs = (FLP *) pj_malloc(gi->ct->lim.lam*gi->ct->lim.phi*sizeof(FLP)); if( row_buf == NULL || gi->ct->cvs == NULL ) { pj_errno = -38; return 0; } for( row = 0; row < gi->ct->lim.phi; row++ ) { int i; FLP *cvs; double *diff_seconds; if( fread( row_buf, sizeof(double), gi->ct->lim.lam * 2, fid ) != 2 * gi->ct->lim.lam ) { pj_dalloc( row_buf ); pj_dalloc( gi->ct->cvs ); pj_errno = -38; return 0; } if( IS_LSB ) swap_words( (unsigned char *) row_buf, 8, gi->ct->lim.lam*2 ); /* convert seconds to radians */ diff_seconds = row_buf; for( i = 0; i < gi->ct->lim.lam; i++ ) { cvs = gi->ct->cvs + (row) * gi->ct->lim.lam + (gi->ct->lim.lam - i - 1); cvs->phi = *(diff_seconds++) * ((PI/180.0) / 3600.0); cvs->lam = *(diff_seconds++) * ((PI/180.0) / 3600.0); } } pj_dalloc( row_buf ); fclose( fid ); return 1; } /* -------------------------------------------------------------------- */ /* NTv2 format. */ /* We process one line at a time. Note that the array storage */ /* direction (e-w) is different in the NTv2 file and what */ /* the CTABLE is supposed to have. The phi/lam are also */ /* reversed, and we have to be aware of byte swapping. */ /* -------------------------------------------------------------------- */ else if( strcmp(gi->format,"ntv2") == 0 ) { float *row_buf; int row; FILE *fid; if( getenv("PROJ_DEBUG") != NULL ) { fprintf( stderr, "NTv2 - loading grid %s\n", gi->ct->id ); } fid = pj_open_lib( gi->filename, "rb" ); if( fid == NULL ) { pj_errno = -38; return 0; } fseek( fid, gi->grid_offset, SEEK_SET ); row_buf = (float *) pj_malloc(gi->ct->lim.lam * sizeof(float) * 4); gi->ct->cvs = (FLP *) pj_malloc(gi->ct->lim.lam*gi->ct->lim.phi*sizeof(FLP)); if( row_buf == NULL || gi->ct->cvs == NULL ) { pj_errno = -38; return 0; } for( row = 0; row < gi->ct->lim.phi; row++ ) { int i; FLP *cvs; float *diff_seconds; if( fread( row_buf, sizeof(float), gi->ct->lim.lam*4, fid ) != 4 * gi->ct->lim.lam ) { pj_dalloc( row_buf ); pj_dalloc( gi->ct->cvs ); gi->ct->cvs = NULL; pj_errno = -38; return 0; } if( !IS_LSB ) swap_words( (unsigned char *) row_buf, 4, gi->ct->lim.lam*4 ); /* convert seconds to radians */ diff_seconds = row_buf; for( i = 0; i < gi->ct->lim.lam; i++ ) { cvs = gi->ct->cvs + (row) * gi->ct->lim.lam + (gi->ct->lim.lam - i - 1); cvs->phi = *(diff_seconds++) * ((PI/180.0) / 3600.0); cvs->lam = *(diff_seconds++) * ((PI/180.0) / 3600.0); diff_seconds += 2; /* skip accuracy values */ } } pj_dalloc( row_buf ); fclose( fid ); return 1; } else { return 0; } } /************************************************************************/ /* pj_gridinfo_init_ntv2() */ /* */ /* Load a ntv2 (.gsb) file. */ /************************************************************************/ static int pj_gridinfo_init_ntv2( FILE *fid, PJ_GRIDINFO *gilist ) { unsigned char header[11*16]; int num_subfiles, subfile; assert( sizeof(int) == 4 ); assert( sizeof(double) == 8 ); if( sizeof(int) != 4 || sizeof(double) != 8 ) { fprintf( stderr, "basic types of inappropraiate size in pj_gridinfo_init_ntv2()\n" ); pj_errno = -38; return 0; } /* -------------------------------------------------------------------- */ /* Read the overview header. */ /* -------------------------------------------------------------------- */ if( fread( header, sizeof(header), 1, fid ) != 1 ) { pj_errno = -38; return 0; } /* -------------------------------------------------------------------- */ /* Byte swap interesting fields if needed. */ /* -------------------------------------------------------------------- */ if( !IS_LSB ) { swap_words( header+8, 4, 1 ); swap_words( header+8+16, 4, 1 ); swap_words( header+8+32, 4, 1 ); swap_words( header+8+7*16, 8, 1 ); swap_words( header+8+8*16, 8, 1 ); swap_words( header+8+9*16, 8, 1 ); swap_words( header+8+10*16, 8, 1 ); } /* -------------------------------------------------------------------- */ /* Get the subfile count out ... all we really use for now. */ /* -------------------------------------------------------------------- */ memcpy( &num_subfiles, header+8+32, 4 ); /* ==================================================================== */ /* Step through the subfiles, creating a PJ_GRIDINFO for each. */ /* ==================================================================== */ for( subfile = 0; subfile < num_subfiles; subfile++ ) { struct CTABLE *ct; LP ur; int gs_count; PJ_GRIDINFO *gi; /* -------------------------------------------------------------------- */ /* Read header. */ /* -------------------------------------------------------------------- */ if( fread( header, sizeof(header), 1, fid ) != 1 ) { pj_errno = -38; return 0; } if( strncmp((const char *) header,"SUB_NAME",8) != 0 ) { pj_errno = -38; return 0; } /* -------------------------------------------------------------------- */ /* Byte swap interesting fields if needed. */ /* -------------------------------------------------------------------- */ if( !IS_LSB ) { swap_words( header+8+16*4, 8, 1 ); swap_words( header+8+16*5, 8, 1 ); swap_words( header+8+16*6, 8, 1 ); swap_words( header+8+16*7, 8, 1 ); swap_words( header+8+16*8, 8, 1 ); swap_words( header+8+16*9, 8, 1 ); swap_words( header+8+16*10, 4, 1 ); } /* -------------------------------------------------------------------- */ /* Initialize a corresponding "ct" structure. */ /* -------------------------------------------------------------------- */ ct = (struct CTABLE *) pj_malloc(sizeof(struct CTABLE)); strncpy( ct->id, (const char *) header + 8, 8 ); ct->id[8] = '\0'; ct->ll.lam = - *((double *) (header+7*16+8)); /* W_LONG */ ct->ll.phi = *((double *) (header+4*16+8)); /* S_LAT */ ur.lam = - *((double *) (header+6*16+8)); /* E_LONG */ ur.phi = *((double *) (header+5*16+8)); /* N_LAT */ ct->del.lam = *((double *) (header+9*16+8)); ct->del.phi = *((double *) (header+8*16+8)); ct->lim.lam = (int) (fabs(ur.lam-ct->ll.lam)/ct->del.lam + 0.5) + 1; ct->lim.phi = (int) (fabs(ur.phi-ct->ll.phi)/ct->del.phi + 0.5) + 1; if( getenv("PROJ_DEBUG") != NULL ) fprintf( stderr, "NTv2 %s %dx%d: LL=(%.9g,%.9g) UR=(%.9g,%.9g)\n", ct->id, ct->lim.lam, ct->lim.phi, ct->ll.lam/3600.0, ct->ll.phi/3600.0, ur.lam/3600.0, ur.phi/3600.0 ); ct->ll.lam *= DEG_TO_RAD/3600.0; ct->ll.phi *= DEG_TO_RAD/3600.0; ct->del.lam *= DEG_TO_RAD/3600.0; ct->del.phi *= DEG_TO_RAD/3600.0; memcpy( &gs_count, header + 8 + 16*10, 4 ); if( gs_count != ct->lim.lam * ct->lim.phi ) { fprintf( stderr, "GS_COUNT(%d) does not match expected cells (%dx%d=%d)\n", gs_count, ct->lim.lam, ct->lim.phi, ct->lim.lam * ct->lim.phi ); pj_errno = -38; return 0; } ct->cvs = NULL; /* -------------------------------------------------------------------- */ /* Create a new gridinfo for this if we aren't processing the */ /* 1st subfile, and initialize our grid info. */ /* -------------------------------------------------------------------- */ if( subfile == 0 ) gi = gilist; else { gi = (PJ_GRIDINFO *) pj_malloc(sizeof(PJ_GRIDINFO)); memset( gi, 0, sizeof(PJ_GRIDINFO) ); gi->gridname = strdup( gilist->gridname ); gi->filename = strdup( gilist->filename ); gi->next = NULL; } gi->ct = ct; gi->format = "ntv2"; gi->grid_offset = ftell( fid ); /* -------------------------------------------------------------------- */ /* Attach to the correct list or sublist. */ /* -------------------------------------------------------------------- */ if( strncmp((const char *)header+24,"NONE",4) == 0 ) { if( gi != gilist ) { PJ_GRIDINFO *lnk; for( lnk = gilist; lnk->next != NULL; lnk = lnk->next ) {} lnk->next = gi; } } else { PJ_GRIDINFO *lnk; PJ_GRIDINFO *gp = gilist; while( gp != NULL && strncmp(gp->ct->id,(const char*)header+24,8) != 0 ) gp = gp->next; if( gp == NULL ) { if( getenv("PROJ_DEBUG") != NULL ) fprintf( stderr, "pj_gridinfo_init_ntv2(): " "failed to find parent %8.8s for %s.\n", (const char *) header+24, gi->ct->id ); for( lnk = gp; lnk->next != NULL; lnk = lnk->next ) {} lnk->next = gi; } else if( gp->child == NULL ) { gp->child = gi; } else { for( lnk = gp->child; lnk->next != NULL; lnk = lnk->next ) {} lnk->next = gi; } } /* -------------------------------------------------------------------- */ /* Seek past the data. */ /* -------------------------------------------------------------------- */ fseek( fid, gs_count * 16, SEEK_CUR ); } return 1; } /************************************************************************/ /* pj_gridinfo_init_ntv1() */ /* */ /* Load an NTv1 style Canadian grid shift file. */ /************************************************************************/ static int pj_gridinfo_init_ntv1( FILE * fid, PJ_GRIDINFO *gi ) { unsigned char header[176]; struct CTABLE *ct; LP ur; assert( sizeof(int) == 4 ); assert( sizeof(double) == 8 ); if( sizeof(int) != 4 || sizeof(double) != 8 ) { fprintf( stderr, "basic types of inappropraiate size in nad_load_ntv1()\n" ); pj_errno = -38; return 0; } /* -------------------------------------------------------------------- */ /* Read the header. */ /* -------------------------------------------------------------------- */ if( fread( header, sizeof(header), 1, fid ) != 1 ) { pj_errno = -38; return 0; } /* -------------------------------------------------------------------- */ /* Regularize fields of interest. */ /* -------------------------------------------------------------------- */ if( IS_LSB ) { swap_words( header+8, 4, 1 ); swap_words( header+24, 8, 1 ); swap_words( header+40, 8, 1 ); swap_words( header+56, 8, 1 ); swap_words( header+72, 8, 1 ); swap_words( header+88, 8, 1 ); swap_words( header+104, 8, 1 ); } if( *((int *) (header+8)) != 12 ) { pj_errno = -38; printf("NTv1 grid shift file has wrong record count, corrupt?\n"); return 0; } /* -------------------------------------------------------------------- */ /* Fill in CTABLE structure. */ /* -------------------------------------------------------------------- */ ct = (struct CTABLE *) pj_malloc(sizeof(struct CTABLE)); strcpy( ct->id, "NTv1 Grid Shift File" ); ct->ll.lam = - *((double *) (header+72)); ct->ll.phi = *((double *) (header+24)); ur.lam = - *((double *) (header+56)); ur.phi = *((double *) (header+40)); ct->del.lam = *((double *) (header+104)); ct->del.phi = *((double *) (header+88)); ct->lim.lam = (int) (fabs(ur.lam-ct->ll.lam)/ct->del.lam + 0.5) + 1; ct->lim.phi = (int) (fabs(ur.phi-ct->ll.phi)/ct->del.phi + 0.5) + 1; if( getenv("PROJ_DEBUG") != NULL ) fprintf( stderr, "NTv1 %dx%d: LL=(%.9g,%.9g) UR=(%.9g,%.9g)\n", ct->lim.lam, ct->lim.phi, ct->ll.lam, ct->ll.phi, ur.lam, ur.phi ); ct->ll.lam *= DEG_TO_RAD; ct->ll.phi *= DEG_TO_RAD; ct->del.lam *= DEG_TO_RAD; ct->del.phi *= DEG_TO_RAD; ct->cvs = NULL; gi->ct = ct; gi->grid_offset = ftell( fid ); gi->format = "ntv1"; return 1; } /************************************************************************/ /* pj_gridinfo_init() */ /* */ /* Open and parse header details from a datum gridshift file */ /* returning a list of PJ_GRIDINFOs for the grids in that */ /* file. This superceeds use of nad_init() for modern */ /* applications. */ /************************************************************************/ PJ_GRIDINFO *pj_gridinfo_init( const char *gridname ) { char fname[MAX_PATH_FILENAME+1]; PJ_GRIDINFO *gilist; FILE *fp; char header[160]; errno = pj_errno = 0; /* -------------------------------------------------------------------- */ /* Initialize a GRIDINFO with stub info we would use if it */ /* cannot be loaded. */ /* -------------------------------------------------------------------- */ gilist = (PJ_GRIDINFO *) pj_malloc(sizeof(PJ_GRIDINFO)); memset( gilist, 0, sizeof(PJ_GRIDINFO) ); gilist->gridname = strdup( gridname ); gilist->filename = NULL; gilist->format = "missing"; gilist->grid_offset = 0; gilist->ct = NULL; gilist->next = NULL; /* -------------------------------------------------------------------- */ /* Open the file using the usual search rules. */ /* -------------------------------------------------------------------- */ strcpy(fname, gridname); if (!(fp = pj_open_lib(fname, "rb"))) { pj_errno = errno; return gilist; } gilist->filename = strdup(fname); /* -------------------------------------------------------------------- */ /* Load a header, to determine the file type. */ /* -------------------------------------------------------------------- */ if( fread( header, sizeof(header), 1, fp ) != 1 ) { fclose( fp ); pj_errno = -38; return gilist; } fseek( fp, SEEK_SET, 0 ); /* -------------------------------------------------------------------- */ /* Determine file type. */ /* -------------------------------------------------------------------- */ if( strncmp(header + 0, "HEADER", 6) == 0 && strncmp(header + 96, "W GRID", 6) == 0 && strncmp(header + 144, "TO NAD83 ", 16) == 0 ) { pj_gridinfo_init_ntv1( fp, gilist ); } else if( strncmp(header + 0, "NUM_OREC", 8) == 0 && strncmp(header + 48, "GS_TYPE", 7) == 0 ) { pj_gridinfo_init_ntv2( fp, gilist ); } else { struct CTABLE *ct = nad_ctable_init( fp ); gilist->format = "ctable"; gilist->ct = ct; if( getenv("PROJ_DEBUG") != NULL ) fprintf( stderr, "Ctable %s %dx%d: LL=(%.9g,%.9g) UR=(%.9g,%.9g)\n", ct->id, ct->lim.lam, ct->lim.phi, ct->ll.lam * RAD_TO_DEG, ct->ll.phi * RAD_TO_DEG, (ct->ll.lam + (ct->lim.lam-1)*ct->del.lam) * RAD_TO_DEG, (ct->ll.phi + (ct->lim.phi-1)*ct->del.phi) * RAD_TO_DEG ); } fclose(fp); return gilist; } therion/extern/proj4/PJ_eqdc.c0000664000175000017500000000425711137333564015300 0ustar useruser#define PROJ_PARMS__ \ double phi1; \ double phi2; \ double n; \ double rho; \ double rho0; \ double c; \ double *en; \ int ellips; #define PJ_LIB__ #include PROJ_HEAD(eqdc, "Equidistant Conic") "\n\tConic, Sph&Ell\n\tlat_1= lat_2="; # define EPS10 1.e-10 FORWARD(e_forward); /* sphere & ellipsoid */ P->rho = P->c - (P->ellips ? pj_mlfn(lp.phi, sin(lp.phi), cos(lp.phi), P->en) : lp.phi); xy.x = P->rho * sin( lp.lam *= P->n ); xy.y = P->rho0 - P->rho * cos(lp.lam); return (xy); } INVERSE(e_inverse); /* sphere & ellipsoid */ if ((P->rho = hypot(xy.x, xy.y = P->rho0 - xy.y)) != 0.0 ) { if (P->n < 0.) { P->rho = -P->rho; xy.x = -xy.x; xy.y = -xy.y; } lp.phi = P->c - P->rho; if (P->ellips) lp.phi = pj_inv_mlfn(lp.phi, P->es, P->en); lp.lam = atan2(xy.x, xy.y) / P->n; } else { lp.lam = 0.; lp.phi = P->n > 0. ? HALFPI : - HALFPI; } return (lp); } SPECIAL(fac) { double sinphi, cosphi; sinphi = sin(lp.phi); cosphi = cos(lp.phi); fac->code |= IS_ANAL_HK; fac->h = 1.; fac->k = P->n * (P->c - (P->ellips ? pj_mlfn(lp.phi, sinphi, cosphi, P->en) : lp.phi)) / pj_msfn(sinphi, cosphi, P->es); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY1(eqdc, en) double cosphi, sinphi; int secant; P->phi1 = pj_param(P->params, "rlat_1").f; P->phi2 = pj_param(P->params, "rlat_2").f; if (fabs(P->phi1 + P->phi2) < EPS10) E_ERROR(-21); if (!(P->en = pj_enfn(P->es))) E_ERROR_0; P->n = sinphi = sin(P->phi1); cosphi = cos(P->phi1); secant = fabs(P->phi1 - P->phi2) >= EPS10; if( (P->ellips = (P->es > 0.)) ) { double ml1, m1; m1 = pj_msfn(sinphi, cosphi, P->es); ml1 = pj_mlfn(P->phi1, sinphi, cosphi, P->en); if (secant) { /* secant cone */ sinphi = sin(P->phi2); cosphi = cos(P->phi2); P->n = (m1 - pj_msfn(sinphi, cosphi, P->es)) / (pj_mlfn(P->phi2, sinphi, cosphi, P->en) - ml1); } P->c = ml1 + m1 / P->n; P->rho0 = P->c - pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), P->en); } else { if (secant) P->n = (cosphi - cos(P->phi2)) / (P->phi2 - P->phi1); P->c = P->phi1 + cos(P->phi1) / P->n; P->rho0 = P->c - P->phi0; } P->inv = e_inverse; P->fwd = e_forward; P->spc = fac; ENDENTRY(P) therion/extern/proj4/pj_initcache.c0000664000175000017500000001301611156465424016406 0ustar useruser/****************************************************************************** * $Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: init file definition cache. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2009, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include PJ_CVSID("$Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $"); static int cache_count = 0; static int cache_alloc = 0; static char **cache_key = NULL; static paralist **cache_paralist = NULL; /************************************************************************/ /* pj_clone_paralist() */ /* */ /* Allocate a copy of a parameter list. */ /************************************************************************/ paralist *pj_clone_paralist( const paralist *list) { paralist *list_copy = NULL, *next_copy = NULL; for( ; list != NULL; list = list->next ) { paralist *newitem = (paralist *) pj_malloc(sizeof(paralist) + strlen(list->param)); newitem->used = 0; newitem->next = 0; strcpy( newitem->param, list->param ); if( list_copy == NULL ) list_copy = newitem; else next_copy->next = newitem; next_copy = newitem; } return list_copy; } /************************************************************************/ /* pj_clear_initcache() */ /* */ /* Clear out all memory held in the init file cache. */ /************************************************************************/ void pj_clear_initcache() { if( cache_alloc > 0 ) { int i; pj_acquire_lock(); for( i = 0; i < cache_count; i++ ) { paralist *n, *t = cache_paralist[i]; pj_dalloc( cache_key[i] ); /* free parameter list elements */ for (; t != NULL; t = n) { n = t->next; pj_dalloc(t); } } pj_dalloc( cache_key ); pj_dalloc( cache_paralist ); cache_count = 0; cache_alloc= 0; cache_key = NULL; cache_paralist = NULL; pj_release_lock(); } } /************************************************************************/ /* pj_search_initcache() */ /* */ /* Search for a matching definition in the init cache. */ /************************************************************************/ paralist *pj_search_initcache( const char *filekey ) { int i; paralist *result = NULL; pj_acquire_lock(); for( i = 0; result == NULL && i < cache_count; i++) { if( strcmp(filekey,cache_key[i]) == 0 ) { result = pj_clone_paralist( cache_paralist[i] ); } } pj_release_lock(); return result; } /************************************************************************/ /* pj_insert_initcache() */ /* */ /* Insert a paralist definition in the init file cache. */ /************************************************************************/ void pj_insert_initcache( const char *filekey, const paralist *list ) { pj_acquire_lock(); /* ** Grow list if required. */ if( cache_count == cache_alloc ) { char **cache_key_new; paralist **cache_paralist_new; cache_alloc = cache_alloc * 2 + 15; cache_key_new = (char **) pj_malloc(sizeof(char*) * cache_alloc); memcpy( cache_key, cache_key_new, sizeof(char*) * cache_count); pj_dalloc( cache_key ); cache_key = cache_key_new; cache_paralist_new = (paralist **) pj_malloc(sizeof(paralist*) * cache_alloc); memcpy( cache_paralist_new, cache_paralist, sizeof(paralist*) * cache_count ); pj_dalloc( cache_paralist ); cache_paralist = cache_paralist_new; } /* ** Duplicate the filekey and paralist, and insert in cache. */ cache_key[cache_count] = (char *) pj_malloc(strlen(filekey)+1); strcpy( cache_key[cache_count], filekey ); cache_paralist[cache_count] = pj_clone_paralist( list ); cache_count++; pj_release_lock(); } therion/extern/proj4/PJ_wag3.c0000664000175000017500000000114311137334056015211 0ustar useruser#define PROJ_PARMS__ \ double C_x; #define PJ_LIB__ # include PROJ_HEAD(wag3, "Wagner III") "\n\tPCyl., Sph.\n\tlat_ts="; #define TWOTHIRD 0.6666666666666666666667 FORWARD(s_forward); /* spheroid */ xy.x = P->C_x * lp.lam * cos(TWOTHIRD * lp.phi); xy.y = lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y; lp.lam = xy.x / (P->C_x * cos(TWOTHIRD * lp.phi)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(wag3) double ts; ts = pj_param(P->params, "rlat_ts").f; P->C_x = cos(ts) / cos(2.*ts/3.); P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_loxim.c0000664000175000017500000000203411137333654015503 0ustar useruser#define PROJ_PARMS__ \ double phi1; \ double cosphi1; \ double tanphi1; #define PJ_LIB__ #include PROJ_HEAD(loxim, "Loximuthal") "\n\tPCyl Sph"; #define EPS 1e-8 FORWARD(s_forward); /* spheroid */ xy.y = lp.phi - P->phi1; if (fabs(xy.y) < EPS) xy.x = lp.lam * P->cosphi1; else { xy.x = FORTPI + 0.5 * lp.phi; if (fabs(xy.x) < EPS || fabs(fabs(xy.x) - HALFPI) < EPS) xy.x = 0.; else xy.x = lp.lam * xy.y / log( tan(xy.x) / P->tanphi1 ); } return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y + P->phi1; if (fabs(xy.y) < EPS) lp.lam = xy.x / P->cosphi1; else if (fabs( lp.lam = FORTPI + 0.5 * lp.phi ) < EPS || fabs(fabs(lp.lam) - HALFPI) < EPS) lp.lam = 0.; else lp.lam = xy.x * log( tan(lp.lam) / P->tanphi1 ) / xy.y ; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(loxim); P->phi1 = pj_param(P->params, "rlat_1").f; if ((P->cosphi1 = cos(P->phi1)) < EPS) E_ERROR(-22); P->tanphi1 = tan(FORTPI + 0.5 * P->phi1); P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_tcea.c0000664000175000017500000000120211137334016015254 0ustar useruser#define PROJ_PARMS__ \ double rk0; #define PJ_LIB__ #include PROJ_HEAD(tcea, "Transverse Cylindrical Equal Area") "\n\tCyl, Sph"; FORWARD(s_forward); /* spheroid */ xy.x = P->rk0 * cos(lp.phi) * sin(lp.lam); xy.y = P->k0 * (atan2(tan(lp.phi), cos(lp.lam)) - P->phi0); return (xy); } INVERSE(s_inverse); /* spheroid */ double t; xy.y = xy.y * P->rk0 + P->phi0; xy.x *= P->k0; t = sqrt(1. - xy.x * xy.x); lp.phi = asin(t * sin(xy.y)); lp.lam = atan2(xy.x, t * cos(xy.y)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(tcea) P->rk0 = 1 / P->k0; P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_labrd.c0000664000175000017500000000615011137333632015436 0ustar useruser#define PROJ_PARMS__ \ double Az, kRg, p0s, A, C, Ca, Cb, Cc, Cd; \ int rot; #define PJ_LIB__ #include PROJ_HEAD(labrd, "Laborde") "\n\tCyl, Sph\n\tSpecial for Madagascar"; #define EPS 1.e-10 FORWARD(e_forward); double V1, V2, ps, sinps, cosps, sinps2, cosps2, I1, I2, I3, I4, I5, I6, x2, y2, t; V1 = P->A * log( tan(FORTPI + .5 * lp.phi) ); t = P->e * sin(lp.phi); V2 = .5 * P->e * P->A * log ((1. + t)/(1. - t)); ps = 2. * (atan(exp(V1 - V2 + P->C)) - FORTPI); I1 = ps - P->p0s; cosps = cos(ps); cosps2 = cosps * cosps; sinps = sin(ps); sinps2 = sinps * sinps; I4 = P->A * cosps; I2 = .5 * P->A * I4 * sinps; I3 = I2 * P->A * P->A * (5. * cosps2 - sinps2) / 12.; I6 = I4 * P->A * P->A; I5 = I6 * (cosps2 - sinps2) / 6.; I6 *= P->A * P->A * (5. * cosps2 * cosps2 + sinps2 * (sinps2 - 18. * cosps2)) / 120.; t = lp.lam * lp.lam; xy.x = P->kRg * lp.lam * (I4 + t * (I5 + t * I6)); xy.y = P->kRg * (I1 + t * (I2 + t * I3)); x2 = xy.x * xy.x; y2 = xy.y * xy.y; V1 = 3. * xy.x * y2 - xy.x * x2; V2 = xy.y * y2 - 3. * x2 * xy.y; xy.x += P->Ca * V1 + P->Cb * V2; xy.y += P->Ca * V2 - P->Cb * V1; return (xy); } INVERSE(e_inverse); /* ellipsoid & spheroid */ double x2, y2, V1, V2, V3, V4, t, t2, ps, pe, tpe, s, I7, I8, I9, I10, I11, d, Re; int i; x2 = xy.x * xy.x; y2 = xy.y * xy.y; V1 = 3. * xy.x * y2 - xy.x * x2; V2 = xy.y * y2 - 3. * x2 * xy.y; V3 = xy.x * (5. * y2 * y2 + x2 * (-10. * y2 + x2 )); V4 = xy.y * (5. * x2 * x2 + y2 * (-10. * x2 + y2 )); xy.x += - P->Ca * V1 - P->Cb * V2 + P->Cc * V3 + P->Cd * V4; xy.y += P->Cb * V1 - P->Ca * V2 - P->Cd * V3 + P->Cc * V4; ps = P->p0s + xy.y / P->kRg; pe = ps + P->phi0 - P->p0s; for ( i = 20; i; --i) { V1 = P->A * log(tan(FORTPI + .5 * pe)); tpe = P->e * sin(pe); V2 = .5 * P->e * P->A * log((1. + tpe)/(1. - tpe)); t = ps - 2. * (atan(exp(V1 - V2 + P->C)) - FORTPI); pe += t; if (fabs(t) < EPS) break; } /* if (!i) { } else { } */ t = P->e * sin(pe); t = 1. - t * t; Re = P->one_es / ( t * sqrt(t) ); t = tan(ps); t2 = t * t; s = P->kRg * P->kRg; d = Re * P->k0 * P->kRg; I7 = t / (2. * d); I8 = t * (5. + 3. * t2) / (24. * d * s); d = cos(ps) * P->kRg * P->A; I9 = 1. / d; d *= s; I10 = (1. + 2. * t2) / (6. * d); I11 = (5. + t2 * (28. + 24. * t2)) / (120. * d * s); x2 = xy.x * xy.x; lp.phi = pe + x2 * (-I7 + I8 * x2); lp.lam = xy.x * (I9 + x2 * (-I10 + x2 * I11)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(labrd) double Az, sinp, R, N, t; P->rot = pj_param(P->params, "bno_rot").i == 0; Az = pj_param(P->params, "razi").f; sinp = sin(P->phi0); t = 1. - P->es * sinp * sinp; N = 1. / sqrt(t); R = P->one_es * N / t; P->kRg = P->k0 * sqrt( N * R ); P->p0s = atan( sqrt(R / N) * tan(P->phi0) ); P->A = sinp / sin(P->p0s); t = P->e * sinp; P->C = .5 * P->e * P->A * log((1. + t)/(1. - t)) + - P->A * log( tan(FORTPI + .5 * P->phi0)) + log( tan(FORTPI + .5 * P->p0s)); t = Az + Az; P->Ca = (1. - cos(t)) * ( P->Cb = 1. / (12. * P->kRg * P->kRg) ); P->Cb *= sin(t); P->Cc = 3. * (P->Ca * P->Ca - P->Cb * P->Cb); P->Cd = 6. * P->Ca * P->Cb; P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/org_proj4_Projections.h0000664000175000017500000000175111076404756020264 0ustar useruser/* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class org_proj4_Projections */ #ifndef _Included_org_proj4_Projections #define _Included_org_proj4_Projections #ifdef __cplusplus extern "C" { #endif /* * Class: org_proj4_Projections * Method: getProjInfo * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_proj4_Projections_getProjInfo (JNIEnv *, jobject, jstring); /* * Class: org_proj4_Projections * Method: getEllipsInfo * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_org_proj4_Projections_getEllipsInfo (JNIEnv *, jobject, jstring); /* * Class: org_proj4_Projections * Method: transform * Signature: ([D[D[DLjava/lang/String;Ljava/lang/String;JI)V */ JNIEXPORT void JNICALL Java_org_proj4_Projections_transform (JNIEnv *, jobject, jdoubleArray, jdoubleArray, jdoubleArray, jstring, jstring, jlong, jint); #ifdef __cplusplus } #endif #endif therion/extern/proj4/vector1.c0000664000175000017500000000123311137334102015332 0ustar useruser/* make storage for one and two dimensional matricies */ #include #include void * /* one dimension array */ vector1(int nvals, int size) { return((void *)pj_malloc(size * nvals)); } void /* free 2D array */ freev2(void **v, int nrows) { if (v) { for (v += nrows; nrows > 0; --nrows) pj_dalloc(*--v); pj_dalloc(v); } } void ** /* two dimension array */ vector2(int nrows, int ncols, int size) { void **s; if (s = (void **)pj_malloc(sizeof(void *) * nrows)) { int rsize, i; rsize = size * ncols; for (i = 0; i < nrows; ++i) if (!(s[i] = pj_malloc(rsize))) { freev2(s, i); return (void **)0; } } return s; } therion/extern/proj4/pj_msfn.c0000664000175000017500000000027311137333710015412 0ustar useruser/* determine constant small m */ #include #include double pj_msfn(double sinphi, double cosphi, double es) { return (cosphi / sqrt (1. - es * sinphi * sinphi)); } therion/extern/proj4/PJ_nocol.c0000664000175000017500000000207611137333720015465 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(nicol, "Nicolosi Globular") "\n\tMisc Sph, no inv."; #define EPS 1e-10 FORWARD(s_forward); /* spheroid */ if (fabs(lp.lam) < EPS) { xy.x = 0; xy.y = lp.phi; } else if (fabs(lp.phi) < EPS) { xy.x = lp.lam; xy.y = 0.; } else if (fabs(fabs(lp.lam) - HALFPI) < EPS) { xy.x = lp.lam * cos(lp.phi); xy.y = HALFPI * sin(lp.phi); } else if (fabs(fabs(lp.phi) - HALFPI) < EPS) { xy.x = 0; xy.y = lp.phi; } else { double tb, c, d, m, n, r2, sp; tb = HALFPI / lp.lam - lp.lam / HALFPI; c = lp.phi / HALFPI; d = (1 - c * c)/((sp = sin(lp.phi)) - c); r2 = tb / d; r2 *= r2; m = (tb * sp / d - 0.5 * tb)/(1. + r2); n = (sp / r2 + 0.5 * d)/(1. + 1./r2); xy.x = cos(lp.phi); xy.x = sqrt(m * m + xy.x * xy.x / (1. + r2)); xy.x = HALFPI * ( m + (lp.lam < 0. ? -xy.x : xy.x)); xy.y = sqrt(n * n - (sp * sp / r2 + d * sp - 1.) / (1. + 1./r2)); xy.y = HALFPI * ( n + (lp.phi < 0. ? xy.y : -xy.y )); } return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(nicol) P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_lagrng.c0000664000175000017500000000161511137333640015624 0ustar useruser#define PROJ_PARMS__ \ double hrw; \ double rw; \ double a1; #define TOL 1e-10 #define PJ_LIB__ #include PROJ_HEAD(lagrng, "Lagrange") "\n\tMisc Sph, no inv.\n\tW="; FORWARD(s_forward); /* spheroid */ double v, c; if (fabs(fabs(lp.phi) - HALFPI) < TOL) { xy.x = 0; xy.y = lp.phi < 0 ? -2. : 2.; } else { lp.phi = sin(lp.phi); v = P->a1 * pow((1. + lp.phi)/(1. - lp.phi), P->hrw); if ((c = 0.5 * (v + 1./v) + cos(lp.lam *= P->rw)) < TOL) F_ERROR; xy.x = 2. * sin(lp.lam) / c; xy.y = (v - 1./v) / c; } return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(lagrng) double phi1; if ((P->rw = pj_param(P->params, "dW").f) <= 0) E_ERROR(-27); P->hrw = 0.5 * (P->rw = 1. / P->rw); phi1 = pj_param(P->params, "rlat_1").f; if (fabs(fabs(phi1 = sin(phi1)) - 1.) < TOL) E_ERROR(-22); P->a1 = pow((1. - phi1)/(1. + phi1), P->hrw); P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_rpoly.c0000664000175000017500000000143711137333774015531 0ustar useruser#define PROJ_PARMS__ \ double phi1; \ double fxa; \ double fxb; \ int mode; #define EPS 1e-9 #define PJ_LIB__ #include PROJ_HEAD(rpoly, "Rectangular Polyconic") "\n\tConic, Sph., no inv.\n\tlat_ts="; FORWARD(s_forward); /* spheroid */ double fa; if (P->mode) fa = tan(lp.lam * P->fxb) * P->fxa; else fa = 0.5 * lp.lam; if (fabs(lp.phi) < EPS) { xy.x = fa + fa; xy.y = - P->phi0; } else { xy.y = 1. / tan(lp.phi); xy.x = sin(fa = 2. * atan(fa * sin(lp.phi))) * xy.y; xy.y = lp.phi - P->phi0 + (1. - cos(fa)) * xy.y; } return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(rpoly) if ((P->mode = (P->phi1 = fabs(pj_param(P->params, "rlat_ts").f)) > EPS)) { P->fxb = 0.5 * sin(P->phi1); P->fxa = 0.5 / P->fxb; } P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_putp3.c0000664000175000017500000000131011137333756015425 0ustar useruser#define PROJ_PARMS__ \ double A; #define PJ_LIB__ # include PROJ_HEAD(putp3, "Putnins P3") "\n\tPCyl., Sph."; PROJ_HEAD(putp3p, "Putnins P3'") "\n\tPCyl., no inv., Sph."; #define C 0.79788456 #define RPISQ 0.1013211836 FORWARD(s_forward); /* spheroid */ xy.x = C * lp.lam * (1. - P->A * lp.phi * lp.phi); xy.y = C * lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / C; lp.lam = xy.x / (C * (1. - P->A * lp.phi * lp.phi)); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(putp3) P->A = 4. * RPISQ; ENDENTRY(setup(P)) ENTRY0(putp3p) P->A = 2. * RPISQ; ENDENTRY(setup(P)) therion/extern/proj4/PJ_putp6.c0000664000175000017500000000244111137333764015435 0ustar useruser#define PROJ_PARMS__ \ double C_x, C_y, A, B, D; #define PJ_LIB__ #include PROJ_HEAD(putp6, "Putnins P6") "\n\tPCyl., Sph."; PROJ_HEAD(putp6p, "Putnins P6'") "\n\tPCyl., Sph."; #define EPS 1e-10 #define NITER 10 #define CON_POLE 1.732050807568877 FORWARD(s_forward); /* spheroid */ double p, r, V; int i; p = P->B * sin(lp.phi); lp.phi *= 1.10265779; for (i = NITER; i ; --i) { r = sqrt(1. + lp.phi * lp.phi); lp.phi -= V = ( (P->A - r) * lp.phi - log(lp.phi + r) - p ) / (P->A - 2. * r); if (fabs(V) < EPS) break; } if (!i) lp.phi = p < 0. ? -CON_POLE : CON_POLE; xy.x = P->C_x * lp.lam * (P->D - sqrt(1. + lp.phi * lp.phi)); xy.y = P->C_y * lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ double r; lp.phi = xy.y / P->C_y; r = sqrt(1. + lp.phi * lp.phi); lp.lam = xy.x / (P->C_x * (P->D - r)); lp.phi = aasin( ( (P->A - r) * lp.phi - log(lp.phi + r) ) / P->B); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(putp6) P->C_x = 1.01346; P->C_y = 0.91910; P->A = 4.; P->B = 2.1471437182129378784; P->D = 2.; ENDENTRY(setup(P)) ENTRY0(putp6p) P->C_x = 0.44329; P->C_y = 0.80404; P->A = 6.; P->B = 5.61125; P->D = 3.; ENDENTRY(setup(P)) therion/extern/proj4/PJ_eck5.c0000664000175000017500000000105311137333552015177 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(eck5, "Eckert V") "\n\tPCyl, Sph."; #define XF 0.44101277172455148219 #define RXF 2.26750802723822639137 #define YF 0.88202554344910296438 #define RYF 1.13375401361911319568 FORWARD(s_forward); /* spheroid */ xy.x = XF * (1. + cos(lp.phi)) * lp.lam; xy.y = YF * lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.lam = RXF * xy.x / (1. + cos( lp.phi = RYF * xy.y)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(eck5); P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_stere.c0000664000175000017500000001324111137334004015465 0ustar useruser#define PROJ_PARMS__ \ double phits; \ double sinX1; \ double cosX1; \ double akm1; \ int mode; #define PJ_LIB__ #include PROJ_HEAD(stere, "Stereographic") "\n\tAzi, Sph&Ell\n\tlat_ts="; PROJ_HEAD(ups, "Universal Polar Stereographic") "\n\tAzi, Sph&Ell\n\tsouth"; #define sinph0 P->sinX1 #define cosph0 P->cosX1 #define EPS10 1.e-10 #define TOL 1.e-8 #define NITER 8 #define CONV 1.e-10 #define S_POLE 0 #define N_POLE 1 #define OBLIQ 2 #define EQUIT 3 static double ssfn_(double phit, double sinphi, double eccen) { sinphi *= eccen; return (tan (.5 * (HALFPI + phit)) * pow((1. - sinphi) / (1. + sinphi), .5 * eccen)); } FORWARD(e_forward); /* ellipsoid */ double coslam, sinlam, sinX=0.0, cosX=0.0, X, A, sinphi; coslam = cos(lp.lam); sinlam = sin(lp.lam); sinphi = sin(lp.phi); if (P->mode == OBLIQ || P->mode == EQUIT) { sinX = sin(X = 2. * atan(ssfn_(lp.phi, sinphi, P->e)) - HALFPI); cosX = cos(X); } switch (P->mode) { case OBLIQ: A = P->akm1 / (P->cosX1 * (1. + P->sinX1 * sinX + P->cosX1 * cosX * coslam)); xy.y = A * (P->cosX1 * sinX - P->sinX1 * cosX * coslam); goto xmul; case EQUIT: A = 2. * P->akm1 / (1. + cosX * coslam); xy.y = A * sinX; xmul: xy.x = A * cosX; break; case S_POLE: lp.phi = -lp.phi; coslam = - coslam; sinphi = -sinphi; case N_POLE: xy.x = P->akm1 * pj_tsfn(lp.phi, sinphi, P->e); xy.y = - xy.x * coslam; break; } xy.x = xy.x * sinlam; return (xy); } FORWARD(s_forward); /* spheroid */ double sinphi, cosphi, coslam, sinlam; sinphi = sin(lp.phi); cosphi = cos(lp.phi); coslam = cos(lp.lam); sinlam = sin(lp.lam); switch (P->mode) { case EQUIT: xy.y = 1. + cosphi * coslam; goto oblcon; case OBLIQ: xy.y = 1. + sinph0 * sinphi + cosph0 * cosphi * coslam; oblcon: if (xy.y <= EPS10) F_ERROR; xy.x = (xy.y = P->akm1 / xy.y) * cosphi * sinlam; xy.y *= (P->mode == EQUIT) ? sinphi : cosph0 * sinphi - sinph0 * cosphi * coslam; break; case N_POLE: coslam = - coslam; lp.phi = - lp.phi; case S_POLE: if (fabs(lp.phi - HALFPI) < TOL) F_ERROR; xy.x = sinlam * ( xy.y = P->akm1 * tan(FORTPI + .5 * lp.phi) ); xy.y *= coslam; break; } return (xy); } INVERSE(e_inverse); /* ellipsoid */ double cosphi, sinphi, tp=0.0, phi_l=0.0, rho, halfe=0.0, halfpi=0.0; int i; rho = hypot(xy.x, xy.y); switch (P->mode) { case OBLIQ: case EQUIT: cosphi = cos( tp = 2. * atan2(rho * P->cosX1 , P->akm1) ); sinphi = sin(tp); if( rho == 0.0 ) phi_l = asin(cosphi * P->sinX1); else phi_l = asin(cosphi * P->sinX1 + (xy.y * sinphi * P->cosX1 / rho)); tp = tan(.5 * (HALFPI + phi_l)); xy.x *= sinphi; xy.y = rho * P->cosX1 * cosphi - xy.y * P->sinX1* sinphi; halfpi = HALFPI; halfe = .5 * P->e; break; case N_POLE: xy.y = -xy.y; case S_POLE: phi_l = HALFPI - 2. * atan(tp = - rho / P->akm1); halfpi = -HALFPI; halfe = -.5 * P->e; break; } for (i = NITER; i--; phi_l = lp.phi) { sinphi = P->e * sin(phi_l); lp.phi = 2. * atan(tp * pow((1.+sinphi)/(1.-sinphi), halfe)) - halfpi; if (fabs(phi_l - lp.phi) < CONV) { if (P->mode == S_POLE) lp.phi = -lp.phi; lp.lam = (xy.x == 0. && xy.y == 0.) ? 0. : atan2(xy.x, xy.y); return (lp); } } I_ERROR; } INVERSE(s_inverse); /* spheroid */ double c, rh, sinc, cosc; sinc = sin(c = 2. * atan((rh = hypot(xy.x, xy.y)) / P->akm1)); cosc = cos(c); lp.lam = 0.; switch (P->mode) { case EQUIT: if (fabs(rh) <= EPS10) lp.phi = 0.; else lp.phi = asin(xy.y * sinc / rh); if (cosc != 0. || xy.x != 0.) lp.lam = atan2(xy.x * sinc, cosc * rh); break; case OBLIQ: if (fabs(rh) <= EPS10) lp.phi = P->phi0; else lp.phi = asin(cosc * sinph0 + xy.y * sinc * cosph0 / rh); if ((c = cosc - sinph0 * sin(lp.phi)) != 0. || xy.x != 0.) lp.lam = atan2(xy.x * sinc * cosph0, c * rh); break; case N_POLE: xy.y = -xy.y; case S_POLE: if (fabs(rh) <= EPS10) lp.phi = P->phi0; else lp.phi = asin(P->mode == S_POLE ? - cosc : cosc); lp.lam = (xy.x == 0. && xy.y == 0.) ? 0. : atan2(xy.x, xy.y); break; } return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { /* general initialization */ double t; if (fabs((t = fabs(P->phi0)) - HALFPI) < EPS10) P->mode = P->phi0 < 0. ? S_POLE : N_POLE; else P->mode = t > EPS10 ? OBLIQ : EQUIT; P->phits = fabs(P->phits); if (P->es) { double X; switch (P->mode) { case N_POLE: case S_POLE: if (fabs(P->phits - HALFPI) < EPS10) P->akm1 = 2. * P->k0 / sqrt(pow(1+P->e,1+P->e)*pow(1-P->e,1-P->e)); else { P->akm1 = cos(P->phits) / pj_tsfn(P->phits, t = sin(P->phits), P->e); t *= P->e; P->akm1 /= sqrt(1. - t * t); } break; case EQUIT: P->akm1 = 2. * P->k0; break; case OBLIQ: t = sin(P->phi0); X = 2. * atan(ssfn_(P->phi0, t, P->e)) - HALFPI; t *= P->e; P->akm1 = 2. * P->k0 * cos(P->phi0) / sqrt(1. - t * t); P->sinX1 = sin(X); P->cosX1 = cos(X); break; } P->inv = e_inverse; P->fwd = e_forward; } else { switch (P->mode) { case OBLIQ: sinph0 = sin(P->phi0); cosph0 = cos(P->phi0); case EQUIT: P->akm1 = 2. * P->k0; break; case S_POLE: case N_POLE: P->akm1 = fabs(P->phits - HALFPI) >= EPS10 ? cos(P->phits) / tan(FORTPI - .5 * P->phits) : 2. * P->k0 ; break; } P->inv = s_inverse; P->fwd = s_forward; } return P; } ENTRY0(stere) P->phits = pj_param(P->params, "tlat_ts").i ? P->phits = pj_param(P->params, "rlat_ts").f : HALFPI; ENDENTRY(setup(P)) ENTRY0(ups) /* International Ellipsoid */ P->phi0 = pj_param(P->params, "bsouth").i ? - HALFPI: HALFPI; if (!P->es) E_ERROR(-34); P->k0 = .994; P->x0 = 2000000.; P->y0 = 2000000.; P->phits = HALFPI; P->lam0 = 0.; ENDENTRY(setup(P)) therion/extern/proj4/PJ_sterea.c0000664000175000017500000000500611130502664015630 0ustar useruser/* ** libproj -- library of cartographic projections ** ** Copyright (c) 2003 Gerald I. Evenden */ static const char LIBPROJ_ID[] = "$Id: PJ_sterea.c 1504 2009-01-06 02:11:57Z warmerdam $"; /* ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define PROJ_PARMS__ \ double phic0; \ double cosc0, sinc0; \ double R2; \ void *en; #define PJ_LIB__ #include PROJ_HEAD(sterea, "Oblique Stereographic Alternative") "\n\tAzimuthal, Sph&Ell"; # define DEL_TOL 1.e-14 # define MAX_ITER 10 FORWARD(e_forward); /* ellipsoid */ double cosc, sinc, cosl, k; lp = pj_gauss(lp, P->en); sinc = sin(lp.phi); cosc = cos(lp.phi); cosl = cos(lp.lam); k = P->k0 * P->R2 / (1. + P->sinc0 * sinc + P->cosc0 * cosc * cosl); xy.x = k * cosc * sin(lp.lam); xy.y = k * (P->cosc0 * sinc - P->sinc0 * cosc * cosl); return (xy); } INVERSE(e_inverse); /* ellipsoid */ double rho, c, sinc, cosc; xy.x /= P->k0; xy.y /= P->k0; if((rho = hypot(xy.x, xy.y))) { c = 2. * atan2(rho, P->R2); sinc = sin(c); cosc = cos(c); lp.phi = asin(cosc * P->sinc0 + xy.y * sinc * P->cosc0 / rho); lp.lam = atan2(xy.x * sinc, rho * P->cosc0 * cosc - xy.y * P->sinc0 * sinc); } else { lp.phi = P->phic0; lp.lam = 0.; } return(pj_inv_gauss(lp, P->en)); } FREEUP; if (P) { if (P->en) free(P->en); free(P); } } ENTRY0(sterea) double R; if (!(P->en = pj_gauss_ini(P->e, P->phi0, &(P->phic0), &R))) E_ERROR_0; P->sinc0 = sin(P->phic0); P->cosc0 = cos(P->phic0); P->R2 = 2. * R; P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/proj_api.h0000664000175000017500000000744611256554266015614 0ustar useruser/****************************************************************************** * $Id: proj_api.h 1631 2009-09-24 02:26:05Z warmerdam $ * * Project: PROJ.4 * Purpose: Public (application) include file for PROJ.4 API, and constants. * Author: Frank Warmerdam, * ****************************************************************************** * Copyright (c) 2001, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* General projections header file */ #ifndef PROJ_API_H #define PROJ_API_H /* standard inclusions */ #include #include #ifdef __cplusplus extern "C" { #endif /* Try to update this every version! */ #define PJ_VERSION 470 extern char const pj_release[]; /* global release id string */ #define RAD_TO_DEG 57.29577951308232 #define DEG_TO_RAD .0174532925199432958 extern int pj_errno; /* global error return code */ #if !defined(PROJECTS_H) typedef struct { double u, v; } projUV; typedef void *projPJ; #define projXY projUV #define projLP projUV #else typedef PJ *projPJ; # define projXY XY # define projLP LP #endif /* procedure prototypes */ projXY pj_fwd(projLP, projPJ); projLP pj_inv(projXY, projPJ); int pj_transform( projPJ src, projPJ dst, long point_count, int point_offset, double *x, double *y, double *z ); int pj_datum_transform( projPJ src, projPJ dst, long point_count, int point_offset, double *x, double *y, double *z ); int pj_geocentric_to_geodetic( double a, double es, long point_count, int point_offset, double *x, double *y, double *z ); int pj_geodetic_to_geocentric( double a, double es, long point_count, int point_offset, double *x, double *y, double *z ); int pj_compare_datums( projPJ srcdefn, projPJ dstdefn ); int pj_apply_gridshift( const char *, int, long point_count, int point_offset, double *x, double *y, double *z ); void pj_deallocate_grids(void); int pj_is_latlong(projPJ); int pj_is_geocent(projPJ); void pj_pr_list(projPJ); void pj_free(projPJ); void pj_set_finder( const char *(*)(const char *) ); void pj_set_searchpath ( int count, const char **path ); projPJ pj_init(int, char **); projPJ pj_init_plus(const char *); char *pj_get_def(projPJ, int); projPJ pj_latlong_from_proj( projPJ ); void *pj_malloc(size_t); void pj_dalloc(void *); char *pj_strerrno(int); int *pj_get_errno_ref(void); const char *pj_get_release(void); void pj_acquire_lock(void); void pj_release_lock(void); void pj_cleanup_lock(void); #ifdef __cplusplus } #endif #endif /* ndef PROJ_API_H */ therion/extern/proj4/PJ_putp5.c0000664000175000017500000000134111137333762015430 0ustar useruser#define PROJ_PARMS__ \ double A, B; #define PJ_LIB__ # include PROJ_HEAD(putp5, "Putnins P5") "\n\tPCyl., Sph."; PROJ_HEAD(putp5p, "Putnins P5'") "\n\tPCyl., Sph."; #define C 1.01346 #define D 1.2158542 FORWARD(s_forward); /* spheroid */ xy.x = C * lp.lam * (P->A - P->B * sqrt(1. + D * lp.phi * lp.phi)); xy.y = C * lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / C; lp.lam = xy.x / (C * (P->A - P->B * sqrt(1. + D * lp.phi * lp.phi))); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(putp5) P->A = 2.; P->B = 1.; ENDENTRY(setup(P)) ENTRY0(putp5p) P->A = 1.5; P->B = 0.5; ENDENTRY(setup(P)) therion/extern/proj4/pj_gauss.c0000664000175000017500000000530111130502664015565 0ustar useruser/* ** libproj -- library of cartographic projections ** ** Copyright (c) 2003 Gerald I. Evenden */ static const char LIBPROJ_ID[] = "$Id: pj_gauss.c 1504 2009-01-06 02:11:57Z warmerdam $"; /* ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define PJ_LIB__ #include #define MAX_ITER 20 struct GAUSS { double C; double K; double e; double ratexp; }; #define EN ((struct GAUSS *)en) #define DEL_TOL 1e-14 static double srat(double esinp, double exp) { return(pow((1.-esinp)/(1.+esinp), exp)); } void * pj_gauss_ini(double e, double phi0, double *chi, double *rc) { double sphi, cphi, es; struct GAUSS *en; if ((en = (struct GAUSS *)malloc(sizeof(struct GAUSS))) == NULL) return (NULL); es = e * e; EN->e = e; sphi = sin(phi0); cphi = cos(phi0); cphi *= cphi; *rc = sqrt(1. - es) / (1. - es * sphi * sphi); EN->C = sqrt(1. + es * cphi * cphi / (1. - es)); *chi = asin(sphi / EN->C); EN->ratexp = 0.5 * EN->C * e; EN->K = tan(.5 * *chi + FORTPI) / ( pow(tan(.5 * phi0 + FORTPI), EN->C) * srat(EN->e * sphi, EN->ratexp) ); return ((void *)en); } LP pj_gauss(LP elp, const void *en) { LP slp; slp.phi = 2. * atan( EN->K * pow(tan(.5 * elp.phi + FORTPI), EN->C) * srat(EN->e * sin(elp.phi), EN->ratexp) ) - HALFPI; slp.lam = EN->C * (elp.lam); return(slp); } LP pj_inv_gauss(LP slp, const void *en) { LP elp; double num; int i; elp.lam = slp.lam / EN->C; num = pow(tan(.5 * slp.phi + FORTPI)/EN->K, 1./EN->C); for (i = MAX_ITER; i; --i) { elp.phi = 2. * atan(num * srat(EN->e * sin(slp.phi), -.5 * EN->e)) - HALFPI; if (fabs(elp.phi - slp.phi) < DEL_TOL) break; slp.phi = elp.phi; } /* convergence failed */ if (!i) pj_errno = -17; return (elp); } therion/extern/proj4/PJ_somerc.c0000664000175000017500000000347411137334002015640 0ustar useruser#define PROJ_PARMS__ \ double K, c, hlf_e, kR, cosp0, sinp0; #define PJ_LIB__ #include PROJ_HEAD(somerc, "Swiss. Obl. Mercator") "\n\tCyl, Ell\n\tFor CH1903"; #define EPS 1.e-10 #define NITER 6 FORWARD(e_forward); double phip, lamp, phipp, lampp, sp, cp; sp = P->e * sin(lp.phi); phip = 2.* atan( exp( P->c * ( log(tan(FORTPI + 0.5 * lp.phi)) - P->hlf_e * log((1. + sp)/(1. - sp))) + P->K)) - HALFPI; lamp = P->c * lp.lam; cp = cos(phip); phipp = aasin(P->cosp0 * sin(phip) - P->sinp0 * cp * cos(lamp)); lampp = aasin(cp * sin(lamp) / cos(phipp)); xy.x = P->kR * lampp; xy.y = P->kR * log(tan(FORTPI + 0.5 * phipp)); return (xy); } INVERSE(e_inverse); /* ellipsoid & spheroid */ double phip, lamp, phipp, lampp, cp, esp, con, delp; int i; phipp = 2. * (atan(exp(xy.y / P->kR)) - FORTPI); lampp = xy.x / P->kR; cp = cos(phipp); phip = aasin(P->cosp0 * sin(phipp) + P->sinp0 * cp * cos(lampp)); lamp = aasin(cp * sin(lampp) / cos(phip)); con = (P->K - log(tan(FORTPI + 0.5 * phip)))/P->c; for (i = NITER; i ; --i) { esp = P->e * sin(phip); delp = (con + log(tan(FORTPI + 0.5 * phip)) - P->hlf_e * log((1. + esp)/(1. - esp)) ) * (1. - esp * esp) * cos(phip) * P->rone_es; phip -= delp; if (fabs(delp) < EPS) break; } if (i) { lp.phi = phip; lp.lam = lamp / P->c; } else I_ERROR return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(somerc) double cp, phip0, sp; P->hlf_e = 0.5 * P->e; cp = cos(P->phi0); cp *= cp; P->c = sqrt(1 + P->es * cp * cp * P->rone_es); sp = sin(P->phi0); P->cosp0 = cos( phip0 = aasin(P->sinp0 = sp / P->c) ); sp *= P->e; P->K = log(tan(FORTPI + 0.5 * phip0)) - P->c * ( log(tan(FORTPI + 0.5 * P->phi0)) - P->hlf_e * log((1. + sp) / (1. - sp))); P->kR = P->k0 * sqrt(P->one_es) / (1. - sp * sp); P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/projects.h0000664000175000017500000003155411256470164015631 0ustar useruser/****************************************************************************** * $Id: projects.h 1625 2009-09-23 18:58:15Z warmerdam $ * * Project: PROJ.4 * Purpose: Primary (private) include file for PROJ.4 library. * Author: Gerald Evenden * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* General projections header file */ #ifndef PROJECTS_H #define PROJECTS_H #ifdef _MSC_VER # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_NONSTDC_NO_DEPRECATE # define _CRT_NONSTDC_NO_DEPRECATE # endif #endif /* standard inclusions */ #include #include #include #ifdef __cplusplus #define C_NAMESPACE extern "C" #define C_NAMESPACE_VAR extern "C" extern "C" { #else #define C_NAMESPACE extern #define C_NAMESPACE_VAR #endif #ifndef NULL # define NULL 0 #endif #ifndef FALSE # define FALSE 0 #endif #ifndef TRUE # define TRUE 1 #endif #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif #ifndef ABS # define ABS(x) ((x<0) ? (-1*(x)) : x) #endif /* maximum path/filename */ #ifndef MAX_PATH_FILENAME #define MAX_PATH_FILENAME 1024 #endif /* prototype hypot for systems where absent */ #ifndef _WIN32 extern double hypot(double, double); #endif #ifdef _WIN32_WCE # include # include # define rewind wceex_rewind # define getenv wceex_getenv # define strdup _strdup # define hypot _hypot #endif /* some useful constants */ #define HALFPI 1.5707963267948966 #define FORTPI 0.78539816339744833 #define PI 3.14159265358979323846 #define TWOPI 6.2831853071795864769 /* environment parameter name */ #ifndef PROJ_LIB #define PROJ_LIB "PROJ_LIB" #endif /* maximum tag id length for +init and default files */ #ifndef ID_TAG_MAX #define ID_TAG_MAX 50 #endif /* Use WIN32 as a standard windows 32 bit declaration */ #if defined(_WIN32) && !defined(WIN32) && !defined(_WIN32_WCE) # define WIN32 #endif #if defined(_WINDOWS) && !defined(WIN32) && !defined(_WIN32_WCE) # define WIN32 #endif /* directory delimiter for DOS support */ #ifdef WIN32 #define DIR_CHAR '\\' #else #define DIR_CHAR '/' #endif /* datum_type values */ #define PJD_UNKNOWN 0 #define PJD_3PARAM 1 #define PJD_7PARAM 2 #define PJD_GRIDSHIFT 3 #define PJD_WGS84 4 /* WGS84 (or anything considered equivelent) */ /* datum system errors */ #define PJD_ERR_GEOCENTRIC -45 #define USE_PROJUV typedef struct { double u, v; } projUV; typedef struct { double r, i; } COMPLEX; #ifndef PJ_LIB__ #define XY projUV #define LP projUV #else typedef struct { double x, y; } XY; typedef struct { double lam, phi; } LP; #endif typedef union { double f; int i; char *s; } PVALUE; struct PJconsts; struct PJ_LIST { char *id; /* projection keyword */ struct PJconsts *(*proj)(struct PJconsts*);/* projection entry point */ char * const *descr; /* description text */ }; struct PJ_ELLPS { char *id; /* ellipse keyword name */ char *major; /* a= value */ char *ell; /* elliptical parameter */ char *name; /* comments */ }; struct PJ_UNITS { char *id; /* units keyword */ char *to_meter; /* multiply by value to get meters */ char *name; /* comments */ }; struct PJ_DATUMS { char *id; /* datum keyword */ char *defn; /* ie. "to_wgs84=..." */ char *ellipse_id; /* ie from ellipse table */ char *comments; /* EPSG code, etc */ }; struct PJ_PRIME_MERIDIANS { char *id; /* prime meridian keyword */ char *defn; /* offset from greenwich in DMS format. */ }; struct DERIVS { double x_l, x_p; /* derivatives of x for lambda-phi */ double y_l, y_p; /* derivatives of y for lambda-phi */ }; struct FACTORS { struct DERIVS der; double h, k; /* meridinal, parallel scales */ double omega, thetap; /* angular distortion, theta prime */ double conv; /* convergence */ double s; /* areal scale factor */ double a, b; /* max-min scale error */ int code; /* info as to analytics, see following */ }; #define IS_ANAL_XL_YL 01 /* derivatives of lon analytic */ #define IS_ANAL_XP_YP 02 /* derivatives of lat analytic */ #define IS_ANAL_HK 04 /* h and k analytic */ #define IS_ANAL_CONV 010 /* convergence analytic */ /* parameter list struct */ typedef struct ARG_list { struct ARG_list *next; char used; char param[1]; } paralist; /* base projection data structure */ typedef struct PJconsts { XY (*fwd)(LP, struct PJconsts *); LP (*inv)(XY, struct PJconsts *); void (*spc)(LP, struct PJconsts *, struct FACTORS *); void (*pfree)(struct PJconsts *); const char *descr; paralist *params; /* parameter list */ int over; /* over-range flag */ int geoc; /* geocentric latitude flag */ int is_latlong; /* proj=latlong ... not really a projection at all */ int is_geocent; /* proj=geocent ... not really a projection at all */ double a, /* major axis or radius if es==0 */ a_orig, /* major axis before any +proj related adjustment */ es, /* e ^ 2 */ es_orig, /* es before any +proj related adjustment */ e, /* eccentricity */ ra, /* 1/A */ one_es, /* 1 - e^2 */ rone_es, /* 1/one_es */ lam0, phi0, /* central longitude, latitude */ x0, y0, /* easting and northing */ k0, /* general scaling factor */ to_meter, fr_meter; /* cartesian scaling */ int datum_type; /* PJD_UNKNOWN/3PARAM/7PARAM/GRIDSHIFT/WGS84 */ double datum_params[7]; double from_greenwich; /* prime meridian offset (in radians) */ double long_wrap_center; /* 0.0 for -180 to 180, actually in radians*/ #ifdef PROJ_PARMS__ PROJ_PARMS__ #endif /* end of optional extensions */ } PJ; /* public API */ #include "proj_api.h" /* Generate pj_list external or make list from include file */ #ifndef PJ_LIST_H extern struct PJ_LIST pj_list[]; #else #define PROJ_HEAD(id, name) \ struct PJconsts *pj_##id(struct PJconsts*); extern char * const pj_s_##id; #ifndef lint #define DO_PJ_LIST_ID #endif #include PJ_LIST_H #ifndef lint #undef DO_PJ_LIST_ID #endif #undef PROJ_HEAD #define PROJ_HEAD(id, name) {#id, pj_##id, &pj_s_##id}, struct PJ_LIST pj_list[] = { #include PJ_LIST_H {0, 0, 0}, }; #undef PROJ_HEAD #endif #ifndef PJ_ELLPS__ extern struct PJ_ELLPS pj_ellps[]; #endif #ifndef PJ_UNITS__ extern struct PJ_UNITS pj_units[]; #endif #ifndef PJ_DATUMS__ extern struct PJ_DATUMS pj_datums[]; extern struct PJ_PRIME_MERIDIANS pj_prime_meridians[]; #endif #ifdef PJ_LIB__ /* repeatative projection code */ #define PROJ_HEAD(id, name) static const char des_##id [] = name #define ENTRYA(name) \ C_NAMESPACE_VAR const char * const pj_s_##name = des_##name; \ C_NAMESPACE PJ *pj_##name(PJ *P) { if (!P) { \ if( (P = (PJ*) pj_malloc(sizeof(PJ))) != NULL) { \ P->pfree = freeup; P->fwd = 0; P->inv = 0; \ P->spc = 0; P->descr = des_##name; #define ENTRYX } return P; } else { #define ENTRY0(name) ENTRYA(name) ENTRYX #define ENTRY1(name, a) ENTRYA(name) P->a = 0; ENTRYX #define ENTRY2(name, a, b) ENTRYA(name) P->a = 0; P->b = 0; ENTRYX #define ENDENTRY(p) } return (p); } #define E_ERROR(err) { pj_errno = err; freeup(P); return(0); } #define E_ERROR_0 { freeup(P); return(0); } #define F_ERROR { pj_errno = -20; return(xy); } #define I_ERROR { pj_errno = -20; return(lp); } #define FORWARD(name) static XY name(LP lp, PJ *P) { XY xy = {0.0,0.0} #define INVERSE(name) static LP name(XY xy, PJ *P) { LP lp = {0.0,0.0} #define FREEUP static void freeup(PJ *P) { #define SPECIAL(name) static void name(LP lp, PJ *P, struct FACTORS *fac) #endif #define MAX_TAB_ID 80 typedef struct { float lam, phi; } FLP; typedef struct { int lam, phi; } ILP; struct CTABLE { char id[MAX_TAB_ID]; /* ascii info */ LP ll; /* lower left corner coordinates */ LP del; /* size of cells */ ILP lim; /* limits of conversion matrix */ FLP *cvs; /* conversion matrix */ }; typedef struct _pj_gi { char *gridname; /* identifying name of grid, eg "conus" or ntv2_0.gsb */ char *filename; /* full path to filename */ const char *format; /* format of this grid, ie "ctable", "ntv1", "ntv2" or "missing". */ int grid_offset; /* offset in file, for delayed loading */ struct CTABLE *ct; struct _pj_gi *next; struct _pj_gi *child; } PJ_GRIDINFO; /* procedure prototypes */ double dmstor(const char *, char **); void set_rtodms(int, int); char *rtodms(char *, double, int, int); double adjlon(double); double aacos(double), aasin(double), asqrt(double), aatan2(double, double); PVALUE pj_param(paralist *, char *); paralist *pj_mkparam(char *); int pj_ell_set(paralist *, double *, double *); int pj_datum_set(paralist *, PJ *); int pj_prime_meridian_set(paralist *, PJ *); int pj_angular_units_set(paralist *, PJ *); paralist *pj_clone_paralist( const paralist* ); void pj_clear_initcache(void); paralist*pj_search_initcache( const char *filekey ); void pj_insert_initcache( const char *filekey, const paralist *list); double *pj_enfn(double); double pj_mlfn(double, double, double, double *); double pj_inv_mlfn(double, double, double *); double pj_qsfn(double, double, double); double pj_tsfn(double, double, double); double pj_msfn(double, double, double); double pj_phi2(double, double); double pj_qsfn_(double, PJ *); double *pj_authset(double); double pj_authlat(double, double *); COMPLEX pj_zpoly1(COMPLEX, COMPLEX *, int); COMPLEX pj_zpolyd1(COMPLEX, COMPLEX *, int, COMPLEX *); FILE *pj_open_lib(char *, char *); int pj_deriv(LP, double, PJ *, struct DERIVS *); int pj_factors(LP, PJ *, double, struct FACTORS *); struct PW_COEF {/* row coefficient structure */ int m; /* number of c coefficients (=0 for none) */ double *c; /* power coefficients */ }; /* Approximation structures and procedures */ typedef struct { /* Chebyshev or Power series structure */ projUV a, b; /* power series range for evaluation */ /* or Chebyshev argument shift/scaling */ struct PW_COEF *cu, *cv; int mu, mv; /* maximum cu and cv index (+1 for count) */ int power; /* != 0 if power series, else Chebyshev */ } Tseries; Tseries *mk_cheby(projUV, projUV, double, projUV *, projUV (*)(projUV), int, int, int); projUV bpseval(projUV, Tseries *); projUV bcheval(projUV, Tseries *); projUV biveval(projUV, Tseries *); void *vector1(int, int); void **vector2(int, int, int); void freev2(void **v, int nrows); int bchgen(projUV, projUV, int, int, projUV **, projUV(*)(projUV)); int bch2bps(projUV, projUV, projUV **, int, int); /* nadcon related protos */ LP nad_intr(LP, struct CTABLE *); LP nad_cvt(LP, int, struct CTABLE *); struct CTABLE *nad_init(char *); struct CTABLE *nad_ctable_init( FILE * fid ); int nad_ctable_load( struct CTABLE *, FILE * fid ); void nad_free(struct CTABLE *); /* higher level handling of datum grid shift files */ PJ_GRIDINFO **pj_gridlist_from_nadgrids( const char *, int * ); void pj_deallocate_grids(); PJ_GRIDINFO *pj_gridinfo_init( const char * ); int pj_gridinfo_load( PJ_GRIDINFO * ); void pj_gridinfo_free( PJ_GRIDINFO * ); void *proj_mdist_ini(double); double proj_mdist(double, double, double, const void *); double proj_inv_mdist(double, const void *); void *pj_gauss_ini(double, double, double *,double *); LP pj_gauss(LP, const void *); LP pj_inv_gauss(LP, const void *); extern char const pj_release[]; struct PJ_ELLPS *pj_get_ellps_ref( void ); struct PJ_DATUMS *pj_get_datums_ref( void ); struct PJ_UNITS *pj_get_units_ref( void ); struct PJ_LIST *pj_get_list_ref( void ); struct PJ_PRIME_MERIDIANS *pj_get_prime_meridians_ref( void ); #ifndef DISABLE_CVSID # define PJ_CVSID(string) static char pj_cvsid[] = string; \ static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : pj_cvsid ); } #else # define PJ_CVSID(string) #endif #ifdef __cplusplus } #endif #endif /* end of basic projections header */ therion/extern/proj4/pj_mlfn.c0000664000175000017500000000303411137333700015400 0ustar useruser#include /* meridinal distance for ellipsoid and inverse ** 8th degree - accurate to < 1e-5 meters when used in conjuction ** with typical major axis values. ** Inverse determines phi to EPS (1e-11) radians, about 1e-6 seconds. */ #define C00 1. #define C02 .25 #define C04 .046875 #define C06 .01953125 #define C08 .01068115234375 #define C22 .75 #define C44 .46875 #define C46 .01302083333333333333 #define C48 .00712076822916666666 #define C66 .36458333333333333333 #define C68 .00569661458333333333 #define C88 .3076171875 #define EPS 1e-11 #define MAX_ITER 10 #define EN_SIZE 5 double * pj_enfn(double es) { double t, *en; if (en = (double *)pj_malloc(EN_SIZE * sizeof(double))) { en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); en[2] = (t = es * es) * (C44 - es * (C46 + es * C48)); en[3] = (t *= es) * (C66 - es * C68); en[4] = t * es * C88; } /* else return NULL if unable to allocate memory */ return en; } double pj_mlfn(double phi, double sphi, double cphi, double *en) { cphi *= sphi; sphi *= sphi; return(en[0] * phi - cphi * (en[1] + sphi*(en[2] + sphi*(en[3] + sphi*en[4])))); } double pj_inv_mlfn(double arg, double es, double *en) { double s, t, phi, k = 1./(1.-es); int i; phi = arg; for (i = MAX_ITER; i ; --i) { /* rarely goes over 2 iterations */ s = sin(phi); t = 1. - es * s * s; phi -= t = (pj_mlfn(phi, s, cos(phi), en) - arg) * (t * sqrt(t)) * k; if (fabs(t) < EPS) return phi; } pj_errno = -17; return phi; } therion/extern/proj4/PJ_august.c0000664000175000017500000000105011137333476015662 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(august, "August Epicycloidal") "\n\tMisc Sph, no inv."; #define M 1.333333333333333 FORWARD(s_forward); /* spheroid */ double t, c1, c, x1, x12, y1, y12; t = tan(.5 * lp.phi); c1 = sqrt(1. - t * t); c = 1. + c1 * cos(lp.lam *= .5); x1 = sin(lp.lam) * c1 / c; y1 = t / c; xy.x = M * x1 * (3. + (x12 = x1 * x1) - 3. * (y12 = y1 * y1)); xy.y = M * y1 * (3. + 3. * x12 - y12); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(august) P->inv = 0; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_mbtfpq.c0000664000175000017500000000251211137333666015650 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(mbtfpq, "McBryde-Thomas Flat-Polar Quartic") "\n\tCyl., Sph."; #define NITER 20 #define EPS 1e-7 #define ONETOL 1.000001 #define C 1.70710678118654752440 #define RC 0.58578643762690495119 #define FYC 1.87475828462269495505 #define RYC 0.53340209679417701685 #define FXC 0.31245971410378249250 #define RXC 3.20041258076506210122 FORWARD(s_forward); /* spheroid */ double th1, c; int i; c = C * sin(lp.phi); for (i = NITER; i; --i) { lp.phi -= th1 = (sin(.5*lp.phi) + sin(lp.phi) - c) / (.5*cos(.5*lp.phi) + cos(lp.phi)); if (fabs(th1) < EPS) break; } xy.x = FXC * lp.lam * (1.0 + 2. * cos(lp.phi)/cos(0.5 * lp.phi)); xy.y = FYC * sin(0.5 * lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ double t; lp.phi = RYC * xy.y; if (fabs(lp.phi) > 1.) { if (fabs(lp.phi) > ONETOL) I_ERROR else if (lp.phi < 0.) { t = -1.; lp.phi = -PI; } else { t = 1.; lp.phi = PI; } } else lp.phi = 2. * asin(t = lp.phi); lp.lam = RXC * xy.x / (1. + 2. * cos(lp.phi)/cos(0.5 * lp.phi)); lp.phi = RC * (t + sin(lp.phi)); if (fabs(lp.phi) > 1.) if (fabs(lp.phi) > ONETOL) I_ERROR else lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; else lp.phi = asin(lp.phi); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(mbtfpq) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_pr_list.c0000664000175000017500000000450511137333750016131 0ustar useruser/* print projection's list of parameters */ #include #include #include #define LINE_LEN 72 static int pr_list(PJ *P, int not_used) { paralist *t; int l, n = 1, flag = 0; (void)putchar('#'); for (t = P->params; t; t = t->next) if ((!not_used && t->used) || (not_used && !t->used)) { l = strlen(t->param) + 1; if (n + l > LINE_LEN) { (void)fputs("\n#", stdout); n = 2; } (void)putchar(' '); if (*(t->param) != '+') (void)putchar('+'); (void)fputs(t->param, stdout); n += l; } else flag = 1; if (n > 1) (void)putchar('\n'); return flag; } void /* print link list of projection parameters */ pj_pr_list(PJ *P) { char const *s; (void)putchar('#'); for (s = P->descr; *s ; ++s) { (void)putchar(*s); if (*s == '\n') (void)putchar('#'); } (void)putchar('\n'); if (pr_list(P, 0)) { (void)fputs("#--- following specified but NOT used\n", stdout); (void)pr_list(P, 1); } } /************************************************************************/ /* pj_get_def() */ /* */ /* Returns the PROJ.4 command string that would produce this */ /* definition expanded as much as possible. For instance, */ /* +init= calls and +datum= defintions would be expanded. */ /************************************************************************/ char *pj_get_def( PJ *P, int options ) { paralist *t; int l; char *definition; int def_max = 10; definition = (char *) pj_malloc(def_max); definition[0] = '\0'; for (t = P->params; t; t = t->next) { /* skip unused parameters ... mostly appended defaults and stuff */ if (!t->used) continue; /* grow the resulting string if needed */ l = strlen(t->param) + 1; if( strlen(definition) + l + 5 > def_max ) { char *def2; def_max = def_max * 2 + l + 5; def2 = (char *) pj_malloc(def_max); strcpy( def2, definition ); pj_dalloc( definition ); definition = def2; } /* append this parameter */ strcat( definition, " +" ); strcat( definition, t->param ); } return definition; } therion/extern/proj4/PJ_wink1.c0000664000175000017500000000103011137334064015373 0ustar useruser#define PROJ_PARMS__ \ double cosphi1; #define PJ_LIB__ # include PROJ_HEAD(wink1, "Winkel I") "\n\tPCyl., Sph.\n\tlat_ts="; FORWARD(s_forward); /* spheroid */ xy.x = .5 * lp.lam * (P->cosphi1 + cos(lp.phi)); xy.y = lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y; lp.lam = 2. * xy.x / (P->cosphi1 + cos(lp.phi)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(wink1) P->cosphi1 = cos(pj_param(P->params, "rlat_ts").f); P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_eck2.c0000664000175000017500000000150711137333542015177 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(eck2, "Eckert II") "\n\tPCyl. Sph."; #define FXC 0.46065886596178063902 #define FYC 1.44720250911653531871 #define C13 0.33333333333333333333 #define ONEEPS 1.0000001 FORWARD(s_forward); /* spheroid */ xy.x = FXC * lp.lam * (xy.y = sqrt(4. - 3. * sin(fabs(lp.phi)))); xy.y = FYC * (2. - xy.y); if ( lp.phi < 0.) xy.y = -xy.y; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.lam = xy.x / (FXC * ( lp.phi = 2. - fabs(xy.y) / FYC) ); lp.phi = (4. - lp.phi * lp.phi) * C13; if (fabs(lp.phi) >= 1.) { if (fabs(lp.phi) > ONEEPS) I_ERROR else lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; } else lp.phi = asin(lp.phi); if (xy.y < 0) lp.phi = -lp.phi; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(eck2); P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_sconics.c0000664000175000017500000000667211137334000016012 0ustar useruser#define PROJ_PARMS__ \ double n; \ double rho_c; \ double rho_0; \ double sig; \ double c1, c2; \ int type; #define PJ_LIB__ #include #define EULER 0 #define MURD1 1 #define MURD2 2 #define MURD3 3 #define PCONIC 4 #define TISSOT 5 #define VITK1 6 #define EPS10 1.e-10 #define EPS 1e-10 #define LINE2 "\n\tConic, Sph\n\tlat_1= and lat_2=" PROJ_HEAD(tissot, "Tissot") LINE2; PROJ_HEAD(murd1, "Murdoch I") LINE2; PROJ_HEAD(murd2, "Murdoch II") LINE2; PROJ_HEAD(murd3, "Murdoch III") LINE2; PROJ_HEAD(euler, "Euler") LINE2; PROJ_HEAD(pconic, "Perspective Conic") LINE2; PROJ_HEAD(vitk1, "Vitkovsky I") LINE2; /* get common factors for simple conics */ static int phi12(PJ *P, double *del) { double p1, p2; int err = 0; if (!pj_param(P->params, "tlat_1").i || !pj_param(P->params, "tlat_2").i) { err = -41; } else { p1 = pj_param(P->params, "rlat_1").f; p2 = pj_param(P->params, "rlat_2").f; *del = 0.5 * (p2 - p1); P->sig = 0.5 * (p2 + p1); err = (fabs(*del) < EPS || fabs(P->sig) < EPS) ? -42 : 0; *del = *del; } return err; } FORWARD(s_forward); /* spheroid */ double rho; switch (P->type) { case MURD2: rho = P->rho_c + tan(P->sig - lp.phi); break; case PCONIC: rho = P->c2 * (P->c1 - tan(lp.phi)); break; default: rho = P->rho_c - lp.phi; break; } xy.x = rho * sin( lp.lam *= P->n ); xy.y = P->rho_0 - rho * cos(lp.lam); return (xy); } INVERSE(s_inverse); /* ellipsoid & spheroid */ double rho; rho = hypot(xy.x, xy.y = P->rho_0 - xy.y); if (P->n < 0.) { rho = - rho; xy.x = - xy.x; xy.y = - xy.y; } lp.lam = atan2(xy.x, xy.y) / P->n; switch (P->type) { case PCONIC: lp.phi = atan(P->c1 - rho / P->c2) + P->sig; break; case MURD2: lp.phi = P->sig - atan(rho - P->rho_c); break; default: lp.phi = P->rho_c - rho; } return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { double del, cs; int i; if( (i = phi12(P, &del)) ) E_ERROR(i); switch (P->type) { case TISSOT: P->n = sin(P->sig); cs = cos(del); P->rho_c = P->n / cs + cs / P->n; P->rho_0 = sqrt((P->rho_c - 2 * sin(P->phi0))/P->n); break; case MURD1: P->rho_c = sin(del)/(del * tan(P->sig)) + P->sig; P->rho_0 = P->rho_c - P->phi0; P->n = sin(P->sig); break; case MURD2: P->rho_c = (cs = sqrt(cos(del))) / tan(P->sig); P->rho_0 = P->rho_c + tan(P->sig - P->phi0); P->n = sin(P->sig) * cs; break; case MURD3: P->rho_c = del / (tan(P->sig) * tan(del)) + P->sig; P->rho_0 = P->rho_c - P->phi0; P->n = sin(P->sig) * sin(del) * tan(del) / (del * del); break; case EULER: P->n = sin(P->sig) * sin(del) / del; del *= 0.5; P->rho_c = del / (tan(del) * tan(P->sig)) + P->sig; P->rho_0 = P->rho_c - P->phi0; break; case PCONIC: P->n = sin(P->sig); P->c2 = cos(del); P->c1 = 1./tan(P->sig); if (fabs(del = P->phi0 - P->sig) - EPS10 >= HALFPI) E_ERROR(-43); P->rho_0 = P->c2 * (P->c1 - tan(del)); break; case VITK1: P->n = (cs = tan(del)) * sin(P->sig) / del; P->rho_c = del / (cs * tan(P->sig)) + P->sig; P->rho_0 = P->rho_c - P->phi0; break; } P->inv = s_inverse; P->fwd = s_forward; P->es = 0; return (P); } ENTRY0(euler) P->type = EULER; ENDENTRY(setup(P)) ENTRY0(tissot) P->type = TISSOT; ENDENTRY(setup(P)) ENTRY0(murd1) P->type = MURD1; ENDENTRY(setup(P)) ENTRY0(murd2) P->type = MURD2; ENDENTRY(setup(P)) ENTRY0(murd3) P->type = MURD3; ENDENTRY(setup(P)) ENTRY0(pconic) P->type = PCONIC; ENDENTRY(setup(P)) ENTRY0(vitk1) P->type = VITK1; ENDENTRY(setup(P)) therion/extern/proj4/PJ_ortho.c0000664000175000017500000000457211137333736015520 0ustar useruser#define PROJ_PARMS__ \ double sinph0; \ double cosph0; \ int mode; #define PJ_LIB__ #include PROJ_HEAD(ortho, "Orthographic") "\n\tAzi, Sph."; #define EPS10 1.e-10 #define N_POLE 0 #define S_POLE 1 #define EQUIT 2 #define OBLIQ 3 FORWARD(s_forward); /* spheroid */ double coslam, cosphi, sinphi; cosphi = cos(lp.phi); coslam = cos(lp.lam); switch (P->mode) { case EQUIT: if (cosphi * coslam < - EPS10) F_ERROR; xy.y = sin(lp.phi); break; case OBLIQ: if (P->sinph0 * (sinphi = sin(lp.phi)) + P->cosph0 * cosphi * coslam < - EPS10) F_ERROR; xy.y = P->cosph0 * sinphi - P->sinph0 * cosphi * coslam; break; case N_POLE: coslam = - coslam; case S_POLE: if (fabs(lp.phi - P->phi0) - EPS10 > HALFPI) F_ERROR; xy.y = cosphi * coslam; break; } xy.x = cosphi * sin(lp.lam); return (xy); } INVERSE(s_inverse); /* spheroid */ double rh, cosc, sinc; if ((sinc = (rh = hypot(xy.x, xy.y))) > 1.) { if ((sinc - 1.) > EPS10) I_ERROR; sinc = 1.; } cosc = sqrt(1. - sinc * sinc); /* in this range OK */ if (fabs(rh) <= EPS10) { lp.phi = P->phi0; lp.lam = 0.0; } else { switch (P->mode) { case N_POLE: xy.y = -xy.y; lp.phi = acos(sinc); break; case S_POLE: lp.phi = - acos(sinc); break; case EQUIT: lp.phi = xy.y * sinc / rh; xy.x *= sinc; xy.y = cosc * rh; goto sinchk; case OBLIQ: lp.phi = cosc * P->sinph0 + xy.y * sinc * P->cosph0 /rh; xy.y = (cosc - P->sinph0 * lp.phi) * rh; xy.x *= sinc * P->cosph0; sinchk: if (fabs(lp.phi) >= 1.) lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; else lp.phi = asin(lp.phi); break; } lp.lam = (xy.y == 0. && (P->mode == OBLIQ || P->mode == EQUIT)) ? (xy.x == 0. ? 0. : xy.x < 0. ? -HALFPI : HALFPI) : atan2(xy.x, xy.y); } return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(ortho) if (fabs(fabs(P->phi0) - HALFPI) <= EPS10) P->mode = P->phi0 < 0. ? S_POLE : N_POLE; else if (fabs(P->phi0) > EPS10) { P->mode = OBLIQ; P->sinph0 = sin(P->phi0); P->cosph0 = cos(P->phi0); } else P->mode = EQUIT; P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_vandg2.c0000664000175000017500000000212611137334044015530 0ustar useruser# define TOL 1e-10 # define TWORPI 0.63661977236758134308 #define PROJ_PARMS__ \ int vdg3; #define PJ_LIB__ #include PROJ_HEAD(vandg2, "van der Grinten II") "\n\tMisc Sph, no inv."; PROJ_HEAD(vandg3, "van der Grinten III") "\n\tMisc Sph, no inv."; FORWARD(s_forward); /* spheroid */ double x1, at, bt, ct; bt = fabs(TWORPI * lp.phi); if ((ct = 1. - bt * bt) < 0.) ct = 0.; else ct = sqrt(ct); if (fabs(lp.lam) < TOL) { xy.x = 0.; xy.y = PI * (lp.phi < 0. ? -bt : bt) / (1. + ct); } else { at = 0.5 * fabs(PI / lp.lam - lp.lam / PI); if (P->vdg3) { x1 = bt / (1. + ct); xy.x = PI * (sqrt(at * at + 1. - x1 * x1) - at); xy.y = PI * x1; } else { x1 = (ct * sqrt(1. + at * at) - at * ct * ct) / (1. + at * at * bt * bt); xy.x = PI * x1; xy.y = PI * sqrt(1. - x1 * (x1 + 2. * at) + TOL); } if ( lp.lam < 0.) xy.x = -xy.x; if ( lp.phi < 0.) xy.y = -xy.y; } return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(vandg2) P->vdg3 = 0; P->inv = 0; P->fwd = s_forward; ENDENTRY(P) ENTRY0(vandg3) P->vdg3 = 1; P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/biveval.c0000664000175000017500000000362011137333432015406 0ustar useruser/* procedures for evaluating Tseries */ # include # define NEAR_ONE 1.00001 static double ceval(struct PW_COEF *C, int n, projUV w, projUV w2) { double d=0, dd=0, vd, vdd, tmp, *c; int j; for (C += n ; n-- ; --C ) { if (j = C->m) { vd = vdd = 0.; for (c = C->c + --j; j ; --j ) { vd = w2.v * (tmp = vd) - vdd + *c--; vdd = tmp; } d = w2.u * (tmp = d) - dd + w.v * vd - vdd + 0.5 * *c; } else d = w2.u * (tmp = d) - dd; dd = tmp; } if (j = C->m) { vd = vdd = 0.; for (c = C->c + --j; j ; --j ) { vd = w2.v * (tmp = vd) - vdd + *c--; vdd = tmp; } return (w.u * d - dd + 0.5 * ( w.v * vd - vdd + 0.5 * *c )); } else return (w.u * d - dd); } projUV /* bivariate Chebyshev polynomial entry point */ bcheval(projUV in, Tseries *T) { projUV w2, w; projUV out; /* scale to +-1 */ w.u = ( in.u + in.u - T->a.u ) * T->b.u; w.v = ( in.v + in.v - T->a.v ) * T->b.v; if (fabs(w.u) > NEAR_ONE || fabs(w.v) > NEAR_ONE) { out.u = out.v = HUGE_VAL; pj_errno = -36; } else { /* double evaluation */ w2.u = w.u + w.u; w2.v = w.v + w.v; out.u = ceval(T->cu, T->mu, w, w2); out.v = ceval(T->cv, T->mv, w, w2); } return out; } projUV /* bivariate power polynomial entry point */ bpseval(projUV in, Tseries *T) { projUV out; double *c, row; int i, m; out.u = out.v = 0.; for (i = T->mu; i >= 0; --i) { row = 0.; if (m = T->cu[i].m) { c = T->cu[i].c + m; while (m--) row = *--c + in.v * row; } out.u = row + in.u * out.u; } for (i = T->mv; i >= 0; --i) { row = 0.; if (m = T->cv[i].m) { c = T->cv[i].c + m; while (m--) row = *--c + in.v * row; } out.v = row + in.u * out.v; } return out; } projUV /* general entry point selecting evaluation mode */ biveval(projUV in, Tseries *T) { if (T->power) { return bpseval(in, T); } else { return bcheval(in, T); } } therion/extern/proj4/pj_gridlist.c0000664000175000017500000002147011256556044016303 0ustar useruser/****************************************************************************** * $Id: pj_gridlist.c 1634 2009-09-24 02:40:46Z warmerdam $ * * Project: PROJ.4 * Purpose: Code to manage the list of currently loaded (cached) PJ_GRIDINFOs * See pj_gridinfo.c for details of loading individual grids. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include #ifdef _WIN32_WCE /* assert.h includes all Windows API headers and causes 'LP' name clash. * Here assert we disable assert() for Windows CE. * TODO - mloskot: re-implement porting friendly assert */ # define assert(exp) ((void)0) #else # include #endif /* _WIN32_WCE */ static PJ_GRIDINFO *grid_list = NULL; /* used only by pj_load_nadgrids() and pj_deallocate_grids() */ static int last_nadgrids_max = 0; static int last_nadgrids_count = 0; static PJ_GRIDINFO **last_nadgrids_list = NULL; static char *last_nadgrids = NULL; /************************************************************************/ /* pj_deallocate_grids() */ /* */ /* Deallocate all loaded grids. */ /************************************************************************/ void pj_deallocate_grids() { while( grid_list != NULL ) { PJ_GRIDINFO *item = grid_list; grid_list = grid_list->next; item->next = NULL; pj_gridinfo_free( item ); } if( last_nadgrids != NULL ) { pj_dalloc( last_nadgrids ); last_nadgrids = NULL; pj_dalloc( last_nadgrids_list ); last_nadgrids_list = NULL; last_nadgrids_count = 0; last_nadgrids_max = 0; } } /************************************************************************/ /* pj_gridlist_merge_grid() */ /* */ /* Find/load the named gridfile and merge it into the */ /* last_nadgrids_list. */ /************************************************************************/ static int pj_gridlist_merge_gridfile( const char *gridname ) { int i, got_match=0; PJ_GRIDINFO *this_grid, *tail = NULL; /* -------------------------------------------------------------------- */ /* Try to find in the existing list of loaded grids. Add all */ /* matching grids as with NTv2 we can get many grids from one */ /* file (one shared gridname). */ /* -------------------------------------------------------------------- */ for( this_grid = grid_list; this_grid != NULL; this_grid = this_grid->next) { if( strcmp(this_grid->gridname,gridname) == 0 ) { got_match = 1; /* dont add to the list if it is invalid. */ if( this_grid->ct == NULL ) return 0; /* do we need to grow the list? */ if( last_nadgrids_count >= last_nadgrids_max - 2 ) { PJ_GRIDINFO **new_list; int new_max = last_nadgrids_max + 20; new_list = (PJ_GRIDINFO **) pj_malloc(sizeof(void*) * new_max); if( last_nadgrids_list != NULL ) { memcpy( new_list, last_nadgrids_list, sizeof(void*) * last_nadgrids_max ); pj_dalloc( last_nadgrids_list ); } last_nadgrids_list = new_list; last_nadgrids_max = new_max; } /* add to the list */ last_nadgrids_list[last_nadgrids_count++] = this_grid; last_nadgrids_list[last_nadgrids_count] = NULL; } tail = this_grid; } if( got_match ) return 1; /* -------------------------------------------------------------------- */ /* Try to load the named grid. */ /* -------------------------------------------------------------------- */ this_grid = pj_gridinfo_init( gridname ); if( this_grid == NULL ) { /* we should get at least a stub grid with a missing "ct" member */ assert( FALSE ); return 0; } if( tail != NULL ) tail->next = this_grid; else grid_list = this_grid; /* -------------------------------------------------------------------- */ /* Recurse to add the grid now that it is loaded. */ /* -------------------------------------------------------------------- */ return pj_gridlist_merge_gridfile( gridname ); } /************************************************************************/ /* pj_gridlist_from_nadgrids() */ /* */ /* This functions loads the list of grids corresponding to a */ /* particular nadgrids string into a list, and returns it. The */ /* list is kept around till a request is made with a different */ /* string in order to cut down on the string parsing cost, and */ /* the cost of building the list of tables each time. */ /************************************************************************/ PJ_GRIDINFO **pj_gridlist_from_nadgrids( const char *nadgrids, int *grid_count) { const char *s; pj_errno = 0; *grid_count = 0; pj_acquire_lock(); if( last_nadgrids != NULL && strcmp(nadgrids,last_nadgrids) == 0 ) { PJ_GRIDINFO **ret = last_nadgrids_list; *grid_count = last_nadgrids_count; if( *grid_count == 0 ) pj_errno = -38; pj_release_lock(); return ret; } /* -------------------------------------------------------------------- */ /* Free old one, if any, and make space for new list. */ /* -------------------------------------------------------------------- */ if( last_nadgrids != NULL ) { pj_dalloc(last_nadgrids); } last_nadgrids = (char *) pj_malloc(strlen(nadgrids)+1); strcpy( last_nadgrids, nadgrids ); last_nadgrids_count = 0; /* -------------------------------------------------------------------- */ /* Loop processing names out of nadgrids one at a time. */ /* -------------------------------------------------------------------- */ for( s = nadgrids; *s != '\0'; ) { int end_char; int required = 1; char name[128]; if( *s == '@' ) { required = 0; s++; } for( end_char = 0; s[end_char] != '\0' && s[end_char] != ','; end_char++ ) {} if( end_char > sizeof(name) ) { pj_errno = -38; pj_release_lock(); return NULL; } strncpy( name, s, end_char ); name[end_char] = '\0'; s += end_char; if( *s == ',' ) s++; if( !pj_gridlist_merge_gridfile( name ) && required ) { pj_errno = -38; pj_release_lock(); return NULL; } else pj_errno = 0; } if( last_nadgrids_count > 0 ) { PJ_GRIDINFO **ret = last_nadgrids_list; *grid_count = last_nadgrids_count; pj_release_lock(); return ret; } else { pj_release_lock(); return NULL; } } therion/extern/proj4/pj_latlong.c0000664000175000017500000000533011130502664016105 0ustar useruser/****************************************************************************** * $Id: pj_latlong.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Stub projection implementation for lat/long coordinates. We * don't actually change the coordinates, but we want proj=latlong * to act sort of like a projection. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* very loosely based upon DMA code by Bradford W. Drew */ #define PJ_LIB__ #include PROJ_HEAD(lonlat, "Lat/long (Geodetic)") "\n\t"; PROJ_HEAD(latlon, "Lat/long (Geodetic alias)") "\n\t"; PROJ_HEAD(latlong, "Lat/long (Geodetic alias)") "\n\t"; PROJ_HEAD(longlat, "Lat/long (Geodetic alias)") "\n\t"; FORWARD(forward); xy.x = lp.lam / P->a; xy.y = lp.phi / P->a; return xy; } INVERSE(inverse); lp.phi = xy.y * P->a; lp.lam = xy.x * P->a; return lp; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(latlong) P->is_latlong = 1; P->x0 = 0.0; P->y0 = 0.0; P->inv = inverse; P->fwd = forward; ENDENTRY(P) ENTRY0(longlat) P->is_latlong = 1; P->x0 = 0.0; P->y0 = 0.0; P->inv = inverse; P->fwd = forward; ENDENTRY(P) ENTRY0(latlon) P->is_latlong = 1; P->x0 = 0.0; P->y0 = 0.0; P->inv = inverse; P->fwd = forward; ENDENTRY(P) ENTRY0(lonlat) P->is_latlong = 1; P->x0 = 0.0; P->y0 = 0.0; P->inv = inverse; P->fwd = forward; ENDENTRY(P) therion/extern/proj4/pj_malloc.c0000664000175000017500000000150411137333660015720 0ustar useruser/* allocate and deallocate memory */ /* These routines are used so that applications can readily replace ** projection system memory allocation/deallocation call with custom ** application procedures. */ #include #include void * pj_malloc(size_t size) { // Currently, pj_malloc is a hack to solve an errno problem. // The problem is described in more details at // https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=86420. // It seems, that pj_init and similar functions incorrectly // (under debian/glibs-2.3.2) assume that pj_malloc resets // errno after success. pj_malloc tries to mimic this. int old_errno = errno; void *res = malloc(size); if ( res && !old_errno ) errno = 0; return res; } void pj_dalloc(void *ptr) { free(ptr); } therion/extern/proj4/pj_open_lib.c0000664000175000017500000001344211130502664016237 0ustar useruser/****************************************************************************** * $Id: pj_open_lib.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of pj_open_lib(), and pj_set_finder(). These * provide a standard interface for opening projections support * data files. * Author: Gerald Evenden, Frank Warmerdam * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * Copyright (c) 2002, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include #include PJ_CVSID("$Id: pj_open_lib.c 1504 2009-01-06 02:11:57Z warmerdam $"); static const char *(*pj_finder)(const char *) = NULL; static int path_count = 0; static char **search_path = NULL; static char * proj_lib_name = #ifdef PROJ_LIB PROJ_LIB; #else 0; #endif /************************************************************************/ /* pj_set_finder() */ /************************************************************************/ void pj_set_finder( const char *(*new_finder)(const char *) ) { pj_finder = new_finder; } /************************************************************************/ /* pj_set_searchpath() */ /* */ /* Path control for callers that can't practically provide */ /* pj_set_finder() style callbacks. Call with (0,NULL) as args */ /* to clear the searchpath set. */ /************************************************************************/ void pj_set_searchpath ( int count, const char **path ) { int i; if (path_count > 0 && search_path != NULL) { for (i = 0; i < path_count; i++) { pj_dalloc(search_path[i]); } pj_dalloc(search_path); path_count = 0; search_path = NULL; } if( count > 0 ) { search_path = pj_malloc(sizeof *search_path * count); for (i = 0; i < count; i++) { search_path[i] = pj_malloc(strlen(path[i]) + 1); strcpy(search_path[i], path[i]); } } path_count = count; } /************************************************************************/ /* pj_open_lib() */ /************************************************************************/ FILE * pj_open_lib(char *name, char *mode) { char fname[MAX_PATH_FILENAME+1]; const char *sysname; FILE *fid; int n = 0; int i; #ifdef WIN32 static const char dir_chars[] = "/\\"; #else static const char dir_chars[] = "/"; #endif #ifndef _WIN32_WCE /* check if ~/name */ if (*name == '~' && strchr(dir_chars,name[1]) ) if (sysname = getenv("HOME")) { (void)strcpy(fname, sysname); fname[n = strlen(fname)] = DIR_CHAR; fname[++n] = '\0'; (void)strcpy(fname+n, name + 1); sysname = fname; } else return NULL; /* or fixed path: /name, ./name or ../name */ else if (strchr(dir_chars,*name) || (*name == '.' && strchr(dir_chars,name[1])) || (!strncmp(name, "..", 2) && strchr(dir_chars,name[2])) || (name[1] == ':' && strchr(dir_chars,name[2])) ) sysname = name; /* or try to use application provided file finder */ else if( pj_finder != NULL && pj_finder( name ) != NULL ) sysname = pj_finder( name ); /* or is environment PROJ_LIB defined */ else if ((sysname = getenv("PROJ_LIB")) || (sysname = proj_lib_name)) { (void)strcpy(fname, sysname); fname[n = strlen(fname)] = DIR_CHAR; fname[++n] = '\0'; (void)strcpy(fname+n, name); sysname = fname; } else /* just try it bare bones */ sysname = name; if (fid = fopen(sysname, mode)) errno = 0; /* If none of those work and we have a search path, try it */ if (!fid && path_count > 0) { for (i = 0; fid == NULL && i < path_count; i++) { sprintf(fname, "%s%c%s", search_path[i], DIR_CHAR, name); sysname = fname; fid = fopen (sysname, mode); } if (fid) errno = 0; } if( getenv( "PROJ_DEBUG" ) != NULL ) fprintf( stderr, "pj_open_lib(%s): call fopen(%s) - %s\n", name, sysname, fid == NULL ? "failed" : "succeeded" ); return(fid); #else return NULL; #endif /* _WIN32_WCE */ } therion/extern/proj4/pj_units.c0000664000175000017500000000242511165201056015610 0ustar useruser/* definition of standard cartesian units */ #define PJ_UNITS__ #include /* Field 2 that contains the multiplier to convert named units to meters ** may be expressed by either a simple floating point constant or a ** numerator/denomenator values (e.g. 1/1000) */ C_NAMESPACE_VAR struct PJ_UNITS pj_units[] = { "km", "1000.", "Kilometer", "m", "1.", "Meter", "dm", "1/10", "Decimeter", "cm", "1/100", "Centimeter", "mm", "1/1000", "Millimeter", "kmi", "1852.0", "International Nautical Mile", "in", "0.0254", "International Inch", "ft", "0.3048", "International Foot", "yd", "0.9144", "International Yard", "mi", "1609.344", "International Statute Mile", "fath", "1.8288", "International Fathom", "ch", "20.1168", "International Chain", "link", "0.201168", "International Link", "us-in", "1./39.37", "U.S. Surveyor's Inch", "us-ft", "0.304800609601219", "U.S. Surveyor's Foot", "us-yd", "0.914401828803658", "U.S. Surveyor's Yard", "us-ch", "20.11684023368047", "U.S. Surveyor's Chain", "us-mi", "1609.347218694437", "U.S. Surveyor's Statute Mile", "ind-yd", "0.91439523", "Indian Yard", "ind-ft", "0.30479841", "Indian Foot", "ind-ch", "20.11669506", "Indian Chain", (char *)0, (char *)0, (char *)0 }; struct PJ_UNITS *pj_get_units_ref() { return pj_units; } therion/extern/proj4/PJ_vandg4.c0000664000175000017500000000220611137334046015533 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(vandg4, "van der Grinten IV") "\n\tMisc Sph, no inv."; #define TOL 1e-10 #define TWORPI 0.63661977236758134308 FORWARD(s_forward); /* spheroid */ double x1, t, bt, ct, ft, bt2, ct2, dt, dt2; if (fabs(lp.phi) < TOL) { xy.x = lp.lam; xy.y = 0.; } else if (fabs(lp.lam) < TOL || fabs(fabs(lp.phi) - HALFPI) < TOL) { xy.x = 0.; xy.y = lp.phi; } else { bt = fabs(TWORPI * lp.phi); bt2 = bt * bt; ct = 0.5 * (bt * (8. - bt * (2. + bt2)) - 5.) / (bt2 * (bt - 1.)); ct2 = ct * ct; dt = TWORPI * lp.lam; dt = dt + 1. / dt; dt = sqrt(dt * dt - 4.); if ((fabs(lp.lam) - HALFPI) < 0.) dt = -dt; dt2 = dt * dt; x1 = bt + ct; x1 *= x1; t = bt + 3.*ct; ft = x1 * (bt2 + ct2 * dt2 - 1.) + (1.-bt2) * ( bt2 * (t * t + 4. * ct2) + ct2 * (12. * bt * ct + 4. * ct2) ); x1 = (dt*(x1 + ct2 - 1.) + 2.*sqrt(ft)) / (4.* x1 + dt2); xy.x = HALFPI * x1; xy.y = HALFPI * sqrt(1. + dt * fabs(x1) - x1 * x1); if (lp.lam < 0.) xy.x = -xy.x; if (lp.phi < 0.) xy.y = -xy.y; } return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(vandg4) P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_cc.c0000664000175000017500000000074311137333516014742 0ustar useruser#define PROJ_PARMS__ \ double ap; #define PJ_LIB__ #include PROJ_HEAD(cc, "Central Cylindrical") "\n\tCyl, Sph"; #define EPS10 1.e-10 FORWARD(s_forward); /* spheroid */ if (fabs(fabs(lp.phi) - HALFPI) <= EPS10) F_ERROR; xy.x = lp.lam; xy.y = tan(lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = atan(xy.y); lp.lam = xy.x; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(cc) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_wag2.c0000664000175000017500000000111211137334054015202 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(wag2, "Wagner II") "\n\tPCyl., Sph."; #define C_x 0.92483 #define C_y 1.38725 #define C_p1 0.88022 #define C_p2 0.88550 FORWARD(s_forward); /* spheroid */ lp.phi = aasin(C_p1 * sin(C_p2 * lp.phi)); xy.x = C_x * lp.lam * cos(lp.phi); xy.y = C_y * lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / C_y; lp.lam = xy.x / (C_x * cos(lp.phi)); lp.phi = aasin(sin(lp.phi) / C_p1) / C_p2; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(wag2) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_sts.c0000664000175000017500000000237511204370140015156 0ustar useruser#define PROJ_PARMS__ \ double C_x, C_y, C_p; \ int tan_mode; #define PJ_LIB__ # include PROJ_HEAD(kav5, "Kavraisky V") "\n\tPCyl., Sph."; PROJ_HEAD(qua_aut, "Quartic Authalic") "\n\tPCyl., Sph."; PROJ_HEAD(mbt_s, "McBryde-Thomas Flat-Polar Sine (No. 1)") "\n\tPCyl., Sph."; PROJ_HEAD(fouc, "Foucaut") "\n\tPCyl., Sph."; FORWARD(s_forward); /* spheroid */ double c; xy.x = P->C_x * lp.lam * cos(lp.phi); xy.y = P->C_y; lp.phi *= P->C_p; c = cos(lp.phi); if (P->tan_mode) { xy.x *= c * c; xy.y *= tan(lp.phi); } else { xy.x /= c; xy.y *= sin(lp.phi); } return (xy); } INVERSE(s_inverse); /* spheroid */ double c; xy.y /= P->C_y; c = cos(lp.phi = P->tan_mode ? atan(xy.y) : aasin(xy.y)); lp.phi /= P->C_p; lp.lam = xy.x / (P->C_x * cos(lp.phi)); if (P->tan_mode) lp.lam /= c * c; else lp.lam *= c; return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P, double p, double q, int mode) { P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; P->C_x = q / p; P->C_y = p; P->C_p = 1/ q; P->tan_mode = mode; return P; } ENTRY0(kav5) ENDENTRY(setup(P, 1.50488, 1.35439, 0)) ENTRY0(qua_aut) ENDENTRY(setup(P, 2., 2., 0)) ENTRY0(mbt_s) ENDENTRY(setup(P, 1.48875, 1.36509, 0)) ENTRY0(fouc) ENDENTRY(setup(P, 2., 2., 1)) therion/extern/proj4/pj_errno.c0000664000175000017500000000061511165201046015571 0ustar useruser/* For full ANSI compliance of global variable */ #include C_NAMESPACE_VAR int pj_errno = 0; /************************************************************************/ /* pj_get_errno_ref() */ /************************************************************************/ int *pj_get_errno_ref() { return &pj_errno; } /* end */ therion/extern/proj4/pj_qsfn.c0000664000175000017500000000052111137333770015420 0ustar useruser/* determine small q */ #include #include # define EPSILON 1.0e-7 double pj_qsfn(double sinphi, double e, double one_es) { double con; if (e >= EPSILON) { con = e * sinphi; return (one_es * (sinphi / (1. - con * con) - (.5 / e) * log ((1. - con) / (1. + con)))); } else return (sinphi + sinphi); } therion/extern/proj4/PJ_vandg.c0000664000175000017500000000442611137334050015450 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(vandg, "van der Grinten (I)") "\n\tMisc Sph"; # define TOL 1.e-10 # define THIRD .33333333333333333333 # define TWO_THRD .66666666666666666666 # define C2_27 .07407407407407407407 # define PI4_3 4.18879020478639098458 # define PISQ 9.86960440108935861869 # define TPISQ 19.73920880217871723738 # define HPISQ 4.93480220054467930934 FORWARD(s_forward); /* spheroid */ double al, al2, g, g2, p2; p2 = fabs(lp.phi / HALFPI); if ((p2 - TOL) > 1.) F_ERROR; if (p2 > 1.) p2 = 1.; if (fabs(lp.phi) <= TOL) { xy.x = lp.lam; xy.y = 0.; } else if (fabs(lp.lam) <= TOL || fabs(p2 - 1.) < TOL) { xy.x = 0.; xy.y = PI * tan(.5 * asin(p2)); if (lp.phi < 0.) xy.y = -xy.y; } else { al = .5 * fabs(PI / lp.lam - lp.lam / PI); al2 = al * al; g = sqrt(1. - p2 * p2); g = g / (p2 + g - 1.); g2 = g * g; p2 = g * (2. / p2 - 1.); p2 = p2 * p2; xy.x = g - p2; g = p2 + al2; xy.x = PI * (al * xy.x + sqrt(al2 * xy.x * xy.x - g * (g2 - p2))) / g; if (lp.lam < 0.) xy.x = -xy.x; xy.y = fabs(xy.x / PI); xy.y = 1. - xy.y * (xy.y + 2. * al); if (xy.y < -TOL) F_ERROR; if (xy.y < 0.) xy.y = 0.; else xy.y = sqrt(xy.y) * (lp.phi < 0. ? -PI : PI); } return (xy); } INVERSE(s_inverse); /* spheroid */ double t, c0, c1, c2, c3, al, r2, r, m, d, ay, x2, y2; x2 = xy.x * xy.x; if ((ay = fabs(xy.y)) < TOL) { lp.phi = 0.; t = x2 * x2 + TPISQ * (x2 + HPISQ); lp.lam = fabs(xy.x) <= TOL ? 0. : .5 * (x2 - PISQ + sqrt(t)) / xy.x; return (lp); } y2 = xy.y * xy.y; r = x2 + y2; r2 = r * r; c1 = - PI * ay * (r + PISQ); c3 = r2 + TWOPI * (ay * r + PI * (y2 + PI * (ay + HALFPI))); c2 = c1 + PISQ * (r - 3. * y2); c0 = PI * ay; c2 /= c3; al = c1 / c3 - THIRD * c2 * c2; m = 2. * sqrt(-THIRD * al); d = C2_27 * c2 * c2 * c2 + (c0 * c0 - THIRD * c2 * c1) / c3; if (((t = fabs(d = 3. * d / (al * m))) - TOL) <= 1.) { d = t > 1. ? (d > 0. ? 0. : PI) : acos(d); lp.phi = PI * (m * cos(d * THIRD + PI4_3) - THIRD * c2); if (xy.y < 0.) lp.phi = -lp.phi; t = r2 + TPISQ * (x2 - y2 + HPISQ); lp.lam = fabs(xy.x) <= TOL ? 0. : .5 * (r - PISQ + (t <= 0. ? 0. : sqrt(t))) / xy.x; } else I_ERROR; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(vandg) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_gn_sinu.c0000664000175000017500000000457411137333612016022 0ustar useruser#define PROJ_PARMS__ \ double *en; \ double m, n, C_x, C_y; #define PJ_LIB__ #include PROJ_HEAD(gn_sinu, "General Sinusoidal Series") "\n\tPCyl, Sph.\n\tm= n="; PROJ_HEAD(sinu, "Sinusoidal (Sanson-Flamsteed)") "\n\tPCyl, Sph&Ell"; PROJ_HEAD(eck6, "Eckert VI") "\n\tPCyl, Sph."; PROJ_HEAD(mbtfps, "McBryde-Thomas Flat-Polar Sinusoidal") "\n\tPCyl, Sph."; #define EPS10 1e-10 #define MAX_ITER 8 #define LOOP_TOL 1e-7 /* Ellipsoidal Sinusoidal only */ FORWARD(e_forward); /* ellipsoid */ double s, c; xy.y = pj_mlfn(lp.phi, s = sin(lp.phi), c = cos(lp.phi), P->en); xy.x = lp.lam * c / sqrt(1. - P->es * s * s); return (xy); } INVERSE(e_inverse); /* ellipsoid */ double s; if ((s = fabs(lp.phi = pj_inv_mlfn(xy.y, P->es, P->en))) < HALFPI) { s = sin(lp.phi); lp.lam = xy.x * sqrt(1. - P->es * s * s) / cos(lp.phi); } else if ((s - EPS10) < HALFPI) lp.lam = 0.; else I_ERROR; return (lp); } /* General spherical sinusoidals */ FORWARD(s_forward); /* sphere */ if (!P->m) lp.phi = P->n != 1. ? aasin(P->n * sin(lp.phi)): lp.phi; else { double k, V; int i; k = P->n * sin(lp.phi); for (i = MAX_ITER; i ; --i) { lp.phi -= V = (P->m * lp.phi + sin(lp.phi) - k) / (P->m + cos(lp.phi)); if (fabs(V) < LOOP_TOL) break; } if (!i) F_ERROR } xy.x = P->C_x * lp.lam * (P->m + cos(lp.phi)); xy.y = P->C_y * lp.phi; return (xy); } INVERSE(s_inverse); /* sphere */ double s; xy.y /= P->C_y; lp.phi = P->m ? aasin((P->m * xy.y + sin(xy.y)) / P->n) : ( P->n != 1. ? aasin(sin(xy.y) / P->n) : xy.y ); lp.lam = xy.x / (P->C_x * (P->m + cos(xy.y))); return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } static void /* for spheres, only */ setup(PJ *P) { P->es = 0; P->C_x = (P->C_y = sqrt((P->m + 1.) / P->n))/(P->m + 1.); P->inv = s_inverse; P->fwd = s_forward; } ENTRY1(sinu, en) if (!(P->en = pj_enfn(P->es))) E_ERROR_0; if (P->es) { P->inv = e_inverse; P->fwd = e_forward; } else { P->n = 1.; P->m = 0.; setup(P); } ENDENTRY(P) ENTRY1(eck6, en) P->m = 1.; P->n = 2.570796326794896619231321691; setup(P); ENDENTRY(P) ENTRY1(mbtfps, en) P->m = 0.5; P->n = 1.785398163397448309615660845; setup(P); ENDENTRY(P) ENTRY1(gn_sinu, en) if (pj_param(P->params, "tn").i && pj_param(P->params, "tm").i) { P->n = pj_param(P->params, "dn").f; P->m = pj_param(P->params, "dm").f; } else E_ERROR(-99) setup(P); ENDENTRY(P) therion/extern/proj4/PJ_tmerc.c0000664000175000017500000001130011137334022015447 0ustar useruser#define PROJ_PARMS__ \ double esp; \ double ml0; \ double *en; #define PJ_LIB__ #include PROJ_HEAD(tmerc, "Transverse Mercator") "\n\tCyl, Sph&Ell"; PROJ_HEAD(utm, "Universal Transverse Mercator (UTM)") "\n\tCyl, Sph\n\tzone= south"; #define EPS10 1.e-10 #define aks0 P->esp #define aks5 P->ml0 #define FC1 1. #define FC2 .5 #define FC3 .16666666666666666666 #define FC4 .08333333333333333333 #define FC5 .05 #define FC6 .03333333333333333333 #define FC7 .02380952380952380952 #define FC8 .01785714285714285714 FORWARD(e_forward); /* ellipse */ double al, als, n, cosphi, sinphi, t; /* * Fail if our longitude is more than 90 degrees from the * central meridian since the results are essentially garbage. * Is error -20 really an appropriate return value? * * http://trac.osgeo.org/proj/ticket/5 */ if( lp.lam < -HALFPI || lp.lam > HALFPI ) { xy.x = HUGE_VAL; xy.y = HUGE_VAL; pj_errno = -14; return xy; } sinphi = sin(lp.phi); cosphi = cos(lp.phi); t = fabs(cosphi) > 1e-10 ? sinphi/cosphi : 0.; t *= t; al = cosphi * lp.lam; als = al * al; al /= sqrt(1. - P->es * sinphi * sinphi); n = P->esp * cosphi * cosphi; xy.x = P->k0 * al * (FC1 + FC3 * als * (1. - t + n + FC5 * als * (5. + t * (t - 18.) + n * (14. - 58. * t) + FC7 * als * (61. + t * ( t * (179. - t) - 479. ) ) ))); xy.y = P->k0 * (pj_mlfn(lp.phi, sinphi, cosphi, P->en) - P->ml0 + sinphi * al * lp.lam * FC2 * ( 1. + FC4 * als * (5. - t + n * (9. + 4. * n) + FC6 * als * (61. + t * (t - 58.) + n * (270. - 330 * t) + FC8 * als * (1385. + t * ( t * (543. - t) - 3111.) ) )))); return (xy); } FORWARD(s_forward); /* sphere */ double b, cosphi; /* * Fail if our longitude is more than 90 degrees from the * central meridian since the results are essentially garbage. * Is error -20 really an appropriate return value? * * http://trac.osgeo.org/proj/ticket/5 */ if( lp.lam < -HALFPI || lp.lam > HALFPI ) { xy.x = HUGE_VAL; xy.y = HUGE_VAL; pj_errno = -14; return xy; } b = (cosphi = cos(lp.phi)) * sin(lp.lam); if (fabs(fabs(b) - 1.) <= EPS10) F_ERROR; xy.x = aks5 * log((1. + b) / (1. - b)); if ((b = fabs( xy.y = cosphi * cos(lp.lam) / sqrt(1. - b * b) )) >= 1.) { if ((b - 1.) > EPS10) F_ERROR else xy.y = 0.; } else xy.y = acos(xy.y); if (lp.phi < 0.) xy.y = -xy.y; xy.y = aks0 * (xy.y - P->phi0); return (xy); } INVERSE(e_inverse); /* ellipsoid */ double n, con, cosphi, d, ds, sinphi, t; lp.phi = pj_inv_mlfn(P->ml0 + xy.y / P->k0, P->es, P->en); if (fabs(lp.phi) >= HALFPI) { lp.phi = xy.y < 0. ? -HALFPI : HALFPI; lp.lam = 0.; } else { sinphi = sin(lp.phi); cosphi = cos(lp.phi); t = fabs(cosphi) > 1e-10 ? sinphi/cosphi : 0.; n = P->esp * cosphi * cosphi; d = xy.x * sqrt(con = 1. - P->es * sinphi * sinphi) / P->k0; con *= t; t *= t; ds = d * d; lp.phi -= (con * ds / (1.-P->es)) * FC2 * (1. - ds * FC4 * (5. + t * (3. - 9. * n) + n * (1. - 4 * n) - ds * FC6 * (61. + t * (90. - 252. * n + 45. * t) + 46. * n - ds * FC8 * (1385. + t * (3633. + t * (4095. + 1574. * t)) ) ))); lp.lam = d*(FC1 - ds*FC3*( 1. + 2.*t + n - ds*FC5*(5. + t*(28. + 24.*t + 8.*n) + 6.*n - ds * FC7 * (61. + t * (662. + t * (1320. + 720. * t)) ) ))) / cosphi; } return (lp); } INVERSE(s_inverse); /* sphere */ double h, g; h = exp(xy.x / aks0); g = .5 * (h - 1. / h); h = cos(P->phi0 + xy.y / aks0); lp.phi = asin(sqrt((1. - h * h) / (1. + g * g))); if (xy.y < 0.) lp.phi = -lp.phi; lp.lam = (g || h) ? atan2(g, h) : 0.; return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } static PJ * setup(PJ *P) { /* general initialization */ if (P->es) { if (!(P->en = pj_enfn(P->es))) E_ERROR_0; P->ml0 = pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), P->en); P->esp = P->es / (1. - P->es); P->inv = e_inverse; P->fwd = e_forward; } else { aks0 = P->k0; aks5 = .5 * aks0; P->inv = s_inverse; P->fwd = s_forward; } return P; } ENTRY1(tmerc, en) ENDENTRY(setup(P)) ENTRY1(utm, en) int zone; if (!P->es) E_ERROR(-34); P->y0 = pj_param(P->params, "bsouth").i ? 10000000. : 0.; P->x0 = 500000.; if (pj_param(P->params, "tzone").i) /* zone input ? */ if ((zone = pj_param(P->params, "izone").i) > 0 && zone <= 60) --zone; else E_ERROR(-35) else /* nearest central meridian input */ if ((zone = floor((adjlon(P->lam0) + PI) * 30. / PI)) < 0) zone = 0; else if (zone >= 60) zone = 59; P->lam0 = (zone + .5) * PI / 30. - PI; P->k0 = 0.9996; P->phi0 = 0.; ENDENTRY(setup(P)) therion/extern/proj4/PJ_geos.c0000664000175000017500000001150111130502664015277 0ustar useruser/* ** libproj -- library of cartographic projections ** ** Copyright (c) 2004 Gerald I. Evenden */ static const char LIBPROJ_ID[] = "$Id: PJ_geos.c 1504 2009-01-06 02:11:57Z warmerdam $"; /* ** See also (section 4.4.3.2): ** http://www.eumetsat.int/en/area4/msg/news/us_doc/cgms_03_26.pdf ** ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define PROJ_PARMS__ \ double h; \ double radius_p; \ double radius_p2; \ double radius_p_inv2; \ double radius_g; \ double radius_g_1; \ double C; #define PJ_LIB__ #include PROJ_HEAD(geos, "Geostationary Satellite View") "\n\tAzi, Sph&Ell\n\th="; FORWARD(s_forward); /* spheroid */ double Vx, Vy, Vz, tmp; /* Calculation of the three components of the vector from satellite to ** position on earth surface (lon,lat).*/ tmp = cos(lp.phi); Vx = cos (lp.lam) * tmp; Vy = sin (lp.lam) * tmp; Vz = sin (lp.phi); /* Check visibility.*/ if (((P->radius_g - Vx) * Vx - Vy * Vy - Vz * Vz) < 0.) F_ERROR; /* Calculation based on view angles from satellite.*/ tmp = P->radius_g - Vx; xy.x = P->radius_g_1 * atan(Vy / tmp); xy.y = P->radius_g_1 * atan(Vz / hypot(Vy, tmp)); return (xy); } FORWARD(e_forward); /* ellipsoid */ double r, Vx, Vy, Vz, tmp; /* Calculation of geocentric latitude. */ lp.phi = atan (P->radius_p2 * tan (lp.phi)); /* Calculation of the three components of the vector from satellite to ** position on earth surface (lon,lat).*/ r = (P->radius_p) / hypot(P->radius_p * cos (lp.phi), sin (lp.phi)); Vx = r * cos (lp.lam) * cos (lp.phi); Vy = r * sin (lp.lam) * cos (lp.phi); Vz = r * sin (lp.phi); /* Check visibility. */ if (((P->radius_g - Vx) * Vx - Vy * Vy - Vz * Vz * P->radius_p_inv2) < 0.) F_ERROR; /* Calculation based on view angles from satellite. */ tmp = P->radius_g - Vx; xy.x = P->radius_g_1 * atan (Vy / tmp); xy.y = P->radius_g_1 * atan (Vz / hypot (Vy, tmp)); return (xy); } INVERSE(s_inverse); /* spheroid */ double Vx, Vy, Vz, a, b, c, det, k; /* Setting three components of vector from satellite to position.*/ Vx = -1.0; Vy = tan (xy.x / (P->radius_g - 1.0)); Vz = tan (xy.y / (P->radius_g - 1.0)) * sqrt (1.0 + Vy * Vy); /* Calculation of terms in cubic equation and determinant.*/ a = Vy * Vy + Vz * Vz + Vx * Vx; b = 2 * P->radius_g * Vx; if ((det = (b * b) - 4 * a * P->C) < 0.) I_ERROR; /* Calculation of three components of vector from satellite to position.*/ k = (-b - sqrt(det)) / (2 * a); Vx = P->radius_g + k * Vx; Vy *= k; Vz *= k; /* Calculation of longitude and latitude.*/ lp.lam = atan2 (Vy, Vx); lp.phi = atan (Vz * cos (lp.lam) / Vx); return (lp); } INVERSE(e_inverse); /* ellipsoid */ double Vx, Vy, Vz, a, b, c, det, k; /* Setting three components of vector from satellite to position.*/ Vx = -1.0; Vy = tan (xy.x / P->radius_g_1); Vz = tan (xy.y / P->radius_g_1) * hypot(1.0, Vy); /* Calculation of terms in cubic equation and determinant.*/ a = Vz / P->radius_p; a = Vy * Vy + a * a + Vx * Vx; b = 2 * P->radius_g * Vx; if ((det = (b * b) - 4 * a * P->C) < 0.) I_ERROR; /* Calculation of three components of vector from satellite to position.*/ k = (-b - sqrt(det)) / (2. * a); Vx = P->radius_g + k * Vx; Vy *= k; Vz *= k; /* Calculation of longitude and latitude.*/ lp.lam = atan2 (Vy, Vx); lp.phi = atan (Vz * cos (lp.lam) / Vx); lp.phi = atan (P->radius_p_inv2 * tan (lp.phi)); return (lp); } FREEUP; if (P) free(P); } ENTRY0(geos) if ((P->h = pj_param(P->params, "dh").f) <= 0.) E_ERROR(-30); if (P->phi0) E_ERROR(-46); P->radius_g = 1. + (P->radius_g_1 = P->h / P->a); P->C = P->radius_g * P->radius_g - 1.0; if (P->es) { P->radius_p = sqrt (P->one_es); P->radius_p2 = P->one_es; P->radius_p_inv2 = P->rone_es; P->inv = e_inverse; P->fwd = e_forward; } else { P->radius_p = P->radius_p2 = P->radius_p_inv2 = 1.0; P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/proj4/rtodms.c0000664000175000017500000000302711137334100015260 0ustar useruser/* Convert radian argument to DMS ascii format */ #include #include #include /* ** RES is fractional second figures ** RES60 = 60 * RES ** CONV = 180 * 3600 * RES / PI (radians to RES seconds) */ static double RES = 1000., RES60 = 60000., CONV = 206264806.24709635515796003417; static char format[50] = "%dd%d'%.3f\"%c"; static int dolong = 0; void set_rtodms(int fract, int con_w) { int i; if (fract >= 0 && fract < 9 ) { RES = 1.; /* following not very elegant, but used infrequently */ for (i = 0; i < fract; ++i) RES *= 10.; RES60 = RES * 60.; CONV = 180. * 3600. * RES / PI; if (! con_w) (void)sprintf(format,"%%dd%%d'%%.%df\"%%c", fract); else (void)sprintf(format,"%%dd%%02d'%%0%d.%df\"%%c", fract+2+(fract?1:0), fract); dolong = con_w; } } char * rtodms(char *s, double r, int pos, int neg) { int deg, min, sign; char *ss = s; double sec; if (r < 0) { r = -r; if (!pos) { *ss++ = '-'; sign = 0; } else sign = neg; } else sign = pos; r = floor(r * CONV + .5); sec = fmod(r / RES, 60.); r = floor(r / RES60); min = fmod(r, 60.); r = floor(r / 60.); deg = r; if (dolong) (void)sprintf(ss,format,deg,min,sec,sign); else if (sec) { char *p, *q; (void)sprintf(ss,format,deg,min,sec,sign); for (q = p = ss + strlen(ss) - (sign ? 3 : 2); *p == '0'; --p) ; if (*p != '.') ++p; if (++q != p) (void)strcpy(p, q); } else if (min) (void)sprintf(ss,"%dd%d'%c",deg,min,sign); else (void)sprintf(ss,"%dd%c",deg, sign); return s; } therion/extern/proj4/Makefile0000664000175000017500000000113112341665643015257 0ustar useruserOUTDIR ?= . ifneq ($(OUTDIR),.) LOUTDIR = $(OUTDIR)/extern/proj4 else LOUTDIR = . endif OBJECTS = $(addprefix $(LOUTDIR)/,$(addsuffix .o,$(basename $(shell ls *.c)))) $(LOUTDIR)/%.o : %.c $(CC) -c $(CCFLAGS) -I. -o $@ $< all: $(LOUTDIR)/libproj.a $(LOUTDIR)/libproj.a: $(OBJECTS) ar cr $(LOUTDIR)/libproj.a $(LOUTDIR)/*.o remove: rm -f proj.c gen_cheb.c p_series.c jniproj.c cs2cs.c \ cs2cs.c gen_cheb.c p_series.c nad2nad.c nad2bin.c \ geod.c geod_set.c geod_for.c geod_inv.c geodesic.h clean: perl ../../makefile.pl rm *.o perl ../../makefile.pl rm *~ perl ../../makefile.pl rm *.a therion/extern/proj4/PJ_imw_p.c0000664000175000017500000000721311202546452015465 0ustar useruser#define PROJ_PARMS__ \ double P, Pp, Q, Qp, R_1, R_2, sphi_1, sphi_2, C2; \ double phi_1, phi_2, lam_1; \ double *en; \ int mode; /* = 0, phi_1 and phi_2 != 0, = 1, phi_1 = 0, = -1 phi_2 = 0 */ #define PJ_LIB__ #include PROJ_HEAD(imw_p, "International Map of the World Polyconic") "\n\tMod. Polyconic, Ell\n\tlat_1= and lat_2= [lon_1=]"; #define TOL 1e-10 #define EPS 1e-10 static int phi12(PJ *P, double *del, double *sig) { int err = 0; if (!pj_param(P->params, "tlat_1").i || !pj_param(P->params, "tlat_2").i) { err = -41; } else { P->phi_1 = pj_param(P->params, "rlat_1").f; P->phi_2 = pj_param(P->params, "rlat_2").f; *del = 0.5 * (P->phi_2 - P->phi_1); *sig = 0.5 * (P->phi_2 + P->phi_1); err = (fabs(*del) < EPS || fabs(*sig) < EPS) ? -42 : 0; } return err; } static XY loc_for(LP lp, PJ *P, double *yc) { XY xy; if (! lp.phi) { xy.x = lp.lam; xy.y = 0.; } else { double xa, ya, xb, yb, xc, D, B, m, sp, t, R, C; sp = sin(lp.phi); m = pj_mlfn(lp.phi, sp, cos(lp.phi), P->en); xa = P->Pp + P->Qp * m; ya = P->P + P->Q * m; R = 1. / (tan(lp.phi) * sqrt(1. - P->es * sp * sp)); C = sqrt(R * R - xa * xa); if (lp.phi < 0.) C = - C; C += ya - R; if (P->mode < 0) { xb = lp.lam; yb = P->C2; } else { t = lp.lam * P->sphi_2; xb = P->R_2 * sin(t); yb = P->C2 + P->R_2 * (1. - cos(t)); } if (P->mode > 0) { xc = lp.lam; *yc = 0.; } else { t = lp.lam * P->sphi_1; xc = P->R_1 * sin(t); *yc = P->R_1 * (1. - cos(t)); } D = (xb - xc)/(yb - *yc); B = xc + D * (C + R - *yc); xy.x = D * sqrt(R * R * (1 + D * D) - B * B); if (lp.phi > 0) xy.x = - xy.x; xy.x = (B + xy.x) / (1. + D * D); xy.y = sqrt(R * R - xy.x * xy.x); if (lp.phi > 0) xy.y = - xy.y; xy.y += C + R; } return (xy); } FORWARD(e_forward); /* ellipsoid */ double yc; xy = loc_for(lp, P, &yc); return (xy); } INVERSE(e_inverse); /* ellipsoid */ XY t; double yc; lp.phi = P->phi_2; lp.lam = xy.x / cos(lp.phi); do { t = loc_for(lp, P, &yc); lp.phi = ((lp.phi - P->phi_1) * (xy.y - yc) / (t.y - yc)) + P->phi_1; lp.lam = lp.lam * xy.x / t.x; } while (fabs(t.x - xy.x) > TOL || fabs(t.y - xy.y) > TOL); return (lp); } static void xy(PJ *P, double phi, double *x, double *y, double *sp, double *R) { double F; *sp = sin(phi); *R = 1./(tan(phi) * sqrt(1. - P->es * *sp * *sp )); F = P->lam_1 * *sp; *y = *R * (1 - cos(F)); *x = *R * sin(F); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY1(imw_p, en) double del, sig, s, t, x1, x2, T2, y1, m1, m2, y2; int i; if (!(P->en = pj_enfn(P->es))) E_ERROR_0; if( (i = phi12(P, &del, &sig)) != 0) E_ERROR(i); if (P->phi_2 < P->phi_1) { /* make sure P->phi_1 most southerly */ del = P->phi_1; P->phi_1 = P->phi_2; P->phi_2 = del; } if (pj_param(P->params, "tlon_1").i) P->lam_1 = pj_param(P->params, "rlon_1").f; else { /* use predefined based upon latitude */ sig = fabs(sig * RAD_TO_DEG); if (sig <= 60) sig = 2.; else if (sig <= 76) sig = 4.; else sig = 8.; P->lam_1 = sig * DEG_TO_RAD; } P->mode = 0; if (P->phi_1) xy(P, P->phi_1, &x1, &y1, &P->sphi_1, &P->R_1); else { P->mode = 1; y1 = 0.; x1 = P->lam_1; } if (P->phi_2) xy(P, P->phi_2, &x2, &T2, &P->sphi_2, &P->R_2); else { P->mode = -1; T2 = 0.; x2 = P->lam_1; } m1 = pj_mlfn(P->phi_1, P->sphi_1, cos(P->phi_1), P->en); m2 = pj_mlfn(P->phi_2, P->sphi_2, cos(P->phi_2), P->en); t = m2 - m1; s = x2 - x1; y2 = sqrt(t * t - s * s) + y1; P->C2 = y2 - T2; t = 1. / t; P->P = (m2 * y1 - m1 * y2) * t; P->Q = (y2 - y1) * t; P->Pp = (m2 * x1 - m1 * x2) * t; P->Qp = (x2 - x1) * t; P->fwd = e_forward; P->inv = e_inverse; ENDENTRY(P) therion/extern/proj4/PJ_mbtfpp.c0000664000175000017500000000202311137333664015642 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(mbtfpp, "McBride-Thomas Flat-Polar Parabolic") "\n\tCyl., Sph."; #define CS .95257934441568037152 #define FXC .92582009977255146156 #define FYC 3.40168025708304504493 #define C23 .66666666666666666666 #define C13 .33333333333333333333 #define ONEEPS 1.0000001 FORWARD(s_forward); /* spheroid */ lp.phi = asin(CS * sin(lp.phi)); xy.x = FXC * lp.lam * (2. * cos(C23 * lp.phi) - 1.); xy.y = FYC * sin(C13 * lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / FYC; if (fabs(lp.phi) >= 1.) { if (fabs(lp.phi) > ONEEPS) I_ERROR else lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI; } else lp.phi = asin(lp.phi); lp.lam = xy.x / ( FXC * (2. * cos(C23 * (lp.phi *= 3.)) - 1.) ); if (fabs(lp.phi = sin(lp.phi) / CS) >= 1.) { if (fabs(lp.phi) > ONEEPS) I_ERROR else lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI; } else lp.phi = asin(lp.phi); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(mbtfpp) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/nad_init.c0000664000175000017500000001324311130502664015543 0ustar useruser/****************************************************************************** * $Id: nad_init.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Load datum shift files into memory. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include #include #ifdef _WIN32_WCE /* assert.h includes all Windows API headers and causes 'LP' name clash. * Here assert we disable assert() for Windows CE. * TODO - mloskot: re-implement porting friendly assert */ # define assert(exp) ((void)0) #else # include #endif /* _WIN32_WCE */ /************************************************************************/ /* nad_ctable_load() */ /* */ /* Load the data portion of a ctable formatted grid. */ /************************************************************************/ int nad_ctable_load( struct CTABLE *ct, FILE *fid ) { int a_size; fseek( fid, sizeof(struct CTABLE), SEEK_SET ); /* read all the actual shift values */ a_size = ct->lim.lam * ct->lim.phi; ct->cvs = (FLP *) pj_malloc(sizeof(FLP) * a_size); if( ct->cvs == NULL || fread(ct->cvs, sizeof(FLP), a_size, fid) != a_size ) { pj_dalloc( ct->cvs ); ct->cvs = NULL; if( getenv("PROJ_DEBUG") != NULL ) { fprintf( stderr, "ctable loading failed on fread() - binary incompatible?\n" ); } pj_errno = -38; return 0; } return 1; } /************************************************************************/ /* nad_ctable_init() */ /* */ /* Read the header portion of a "ctable" format grid. */ /************************************************************************/ struct CTABLE *nad_ctable_init( FILE * fid ) { struct CTABLE *ct; int id_end; /* read the table header */ ct = (struct CTABLE *) pj_malloc(sizeof(struct CTABLE)); if( ct == NULL || fread( ct, sizeof(struct CTABLE), 1, fid ) != 1 ) { pj_errno = -38; return NULL; } /* do some minimal validation to ensure the structure isn't corrupt */ if( ct->lim.lam < 1 || ct->lim.lam > 100000 || ct->lim.phi < 1 || ct->lim.phi > 100000 ) { pj_errno = -38; return NULL; } /* trim white space and newlines off id */ for( id_end = strlen(ct->id)-1; id_end > 0; id_end-- ) { if( ct->id[id_end] == '\n' || ct->id[id_end] == ' ' ) ct->id[id_end] = '\0'; else break; } ct->cvs = NULL; return ct; } /************************************************************************/ /* nad_init() */ /* */ /* Read a datum shift file in any of the supported binary formats. */ /************************************************************************/ struct CTABLE *nad_init(char *name) { char fname[MAX_PATH_FILENAME+1]; struct CTABLE *ct; FILE *fid; char header[512]; errno = pj_errno = 0; /* -------------------------------------------------------------------- */ /* Open the file using the usual search rules. */ /* -------------------------------------------------------------------- */ strcpy(fname, name); if (!(fid = pj_open_lib(fname, "rb"))) { pj_errno = errno; return 0; } ct = nad_ctable_init( fid ); if( ct != NULL ) { if( !nad_ctable_load( ct, fid ) ) { nad_free( ct ); ct = NULL; } } fclose(fid); return ct; } /************************************************************************/ /* nad_free() */ /* */ /* Free a CTABLE grid shift structure produced by nad_init(). */ /************************************************************************/ void nad_free(struct CTABLE *ct) { if (ct) { if( ct->cvs != NULL ) pj_dalloc(ct->cvs); pj_dalloc(ct); } } therion/extern/proj4/geocent.c0000664000175000017500000003527111130501332015376 0ustar useruser/***************************************************************************/ /* RSC IDENTIFIER: GEOCENTRIC * * ABSTRACT * * This component provides conversions between Geodetic coordinates (latitude, * longitude in radians and height in meters) and Geocentric coordinates * (X, Y, Z) in meters. * * ERROR HANDLING * * This component checks parameters for valid values. If an invalid value * is found, the error code is combined with the current error code using * the bitwise or. This combining allows multiple error codes to be * returned. The possible error codes are: * * GEOCENT_NO_ERROR : No errors occurred in function * GEOCENT_LAT_ERROR : Latitude out of valid range * (-90 to 90 degrees) * GEOCENT_LON_ERROR : Longitude out of valid range * (-180 to 360 degrees) * GEOCENT_A_ERROR : Semi-major axis lessthan or equal to zero * GEOCENT_B_ERROR : Semi-minor axis lessthan or equal to zero * GEOCENT_A_LESS_B_ERROR : Semi-major axis less than semi-minor axis * * * REUSE NOTES * * GEOCENTRIC is intended for reuse by any application that performs * coordinate conversions between geodetic coordinates and geocentric * coordinates. * * * REFERENCES * * An Improved Algorithm for Geocentric to Geodetic Coordinate Conversion, * Ralph Toms, February 1996 UCRL-JC-123138. * * Further information on GEOCENTRIC can be found in the Reuse Manual. * * GEOCENTRIC originated from : U.S. Army Topographic Engineering Center * Geospatial Information Division * 7701 Telegraph Road * Alexandria, VA 22310-3864 * * LICENSES * * None apply to this component. * * RESTRICTIONS * * GEOCENTRIC has no restrictions. * * ENVIRONMENT * * GEOCENTRIC was tested and certified in the following environments: * * 1. Solaris 2.5 with GCC version 2.8.1 * 2. Windows 95 with MS Visual C++ version 6 * * MODIFICATIONS * * Date Description * ---- ----------- * 25-02-97 Original Code * */ /***************************************************************************/ /* * INCLUDES */ #include #include "geocent.h" /* * math.h - is needed for calls to sin, cos, tan and sqrt. * geocent.h - is needed for Error codes and prototype error checking. */ /***************************************************************************/ /* * DEFINES */ #define PI 3.14159265358979323e0 #define PI_OVER_2 (PI / 2.0e0) #define FALSE 0 #define TRUE 1 #define COS_67P5 0.38268343236508977 /* cosine of 67.5 degrees */ #define AD_C 1.0026000 /* Toms region 1 constant */ /***************************************************************************/ /* * FUNCTIONS */ long pj_Set_Geocentric_Parameters (GeocentricInfo *gi, double a, double b) { /* BEGIN Set_Geocentric_Parameters */ /* * The function Set_Geocentric_Parameters receives the ellipsoid parameters * as inputs and sets the corresponding state variables. * * a : Semi-major axis, in meters. (input) * b : Semi-minor axis, in meters. (input) */ long Error_Code = GEOCENT_NO_ERROR; if (a <= 0.0) Error_Code |= GEOCENT_A_ERROR; if (b <= 0.0) Error_Code |= GEOCENT_B_ERROR; if (a < b) Error_Code |= GEOCENT_A_LESS_B_ERROR; if (!Error_Code) { gi->Geocent_a = a; gi->Geocent_b = b; gi->Geocent_a2 = a * a; gi->Geocent_b2 = b * b; gi->Geocent_e2 = (gi->Geocent_a2 - gi->Geocent_b2) / gi->Geocent_a2; gi->Geocent_ep2 = (gi->Geocent_a2 - gi->Geocent_b2) / gi->Geocent_b2; } return (Error_Code); } /* END OF Set_Geocentric_Parameters */ void pj_Get_Geocentric_Parameters (GeocentricInfo *gi, double *a, double *b) { /* BEGIN Get_Geocentric_Parameters */ /* * The function Get_Geocentric_Parameters returns the ellipsoid parameters * to be used in geocentric coordinate conversions. * * a : Semi-major axis, in meters. (output) * b : Semi-minor axis, in meters. (output) */ *a = gi->Geocent_a; *b = gi->Geocent_b; } /* END OF Get_Geocentric_Parameters */ long pj_Convert_Geodetic_To_Geocentric (GeocentricInfo *gi, double Latitude, double Longitude, double Height, double *X, double *Y, double *Z) { /* BEGIN Convert_Geodetic_To_Geocentric */ /* * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), * according to the current ellipsoid parameters. * * Latitude : Geodetic latitude in radians (input) * Longitude : Geodetic longitude in radians (input) * Height : Geodetic height, in meters (input) * X : Calculated Geocentric X coordinate, in meters (output) * Y : Calculated Geocentric Y coordinate, in meters (output) * Z : Calculated Geocentric Z coordinate, in meters (output) * */ long Error_Code = GEOCENT_NO_ERROR; double Rn; /* Earth radius at location */ double Sin_Lat; /* sin(Latitude) */ double Sin2_Lat; /* Square of sin(Latitude) */ double Cos_Lat; /* cos(Latitude) */ /* ** Don't blow up if Latitude is just a little out of the value ** range as it may just be a rounding issue. Also removed longitude ** test, it should be wrapped by cos() and sin(). NFW for PROJ.4, Sep/2001. */ if( Latitude < -PI_OVER_2 && Latitude > -1.001 * PI_OVER_2 ) Latitude = -PI_OVER_2; else if( Latitude > PI_OVER_2 && Latitude < 1.001 * PI_OVER_2 ) Latitude = PI_OVER_2; else if ((Latitude < -PI_OVER_2) || (Latitude > PI_OVER_2)) { /* Latitude out of range */ Error_Code |= GEOCENT_LAT_ERROR; } if (!Error_Code) { /* no errors */ if (Longitude > PI) Longitude -= (2*PI); Sin_Lat = sin(Latitude); Cos_Lat = cos(Latitude); Sin2_Lat = Sin_Lat * Sin_Lat; Rn = gi->Geocent_a / (sqrt(1.0e0 - gi->Geocent_e2 * Sin2_Lat)); *X = (Rn + Height) * Cos_Lat * cos(Longitude); *Y = (Rn + Height) * Cos_Lat * sin(Longitude); *Z = ((Rn * (1 - gi->Geocent_e2)) + Height) * Sin_Lat; } return (Error_Code); } /* END OF Convert_Geodetic_To_Geocentric */ /* * The function Convert_Geocentric_To_Geodetic converts geocentric * coordinates (X, Y, Z) to geodetic coordinates (latitude, longitude, * and height), according to the current ellipsoid parameters. * * X : Geocentric X coordinate, in meters. (input) * Y : Geocentric Y coordinate, in meters. (input) * Z : Geocentric Z coordinate, in meters. (input) * Latitude : Calculated latitude value in radians. (output) * Longitude : Calculated longitude value in radians. (output) * Height : Calculated height value, in meters. (output) */ #define USE_ITERATIVE_METHOD void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi, double X, double Y, double Z, double *Latitude, double *Longitude, double *Height) { /* BEGIN Convert_Geocentric_To_Geodetic */ #if !defined(USE_ITERATIVE_METHOD) /* * The method used here is derived from 'An Improved Algorithm for * Geocentric to Geodetic Coordinate Conversion', by Ralph Toms, Feb 1996 */ /* Note: Variable names follow the notation used in Toms, Feb 1996 */ double W; /* distance from Z axis */ double W2; /* square of distance from Z axis */ double T0; /* initial estimate of vertical component */ double T1; /* corrected estimate of vertical component */ double S0; /* initial estimate of horizontal component */ double S1; /* corrected estimate of horizontal component */ double Sin_B0; /* sin(B0), B0 is estimate of Bowring aux variable */ double Sin3_B0; /* cube of sin(B0) */ double Cos_B0; /* cos(B0) */ double Sin_p1; /* sin(phi1), phi1 is estimated latitude */ double Cos_p1; /* cos(phi1) */ double Rn; /* Earth radius at location */ double Sum; /* numerator of cos(phi1) */ int At_Pole; /* indicates location is in polar region */ At_Pole = FALSE; if (X != 0.0) { *Longitude = atan2(Y,X); } else { if (Y > 0) { *Longitude = PI_OVER_2; } else if (Y < 0) { *Longitude = -PI_OVER_2; } else { At_Pole = TRUE; *Longitude = 0.0; if (Z > 0.0) { /* north pole */ *Latitude = PI_OVER_2; } else if (Z < 0.0) { /* south pole */ *Latitude = -PI_OVER_2; } else { /* center of earth */ *Latitude = PI_OVER_2; *Height = -Geocent_b; return; } } } W2 = X*X + Y*Y; W = sqrt(W2); T0 = Z * AD_C; S0 = sqrt(T0 * T0 + W2); Sin_B0 = T0 / S0; Cos_B0 = W / S0; Sin3_B0 = Sin_B0 * Sin_B0 * Sin_B0; T1 = Z + gi->Geocent_b * gi->Geocent_ep2 * Sin3_B0; Sum = W - gi->Geocent_a * gi->Geocent_e2 * Cos_B0 * Cos_B0 * Cos_B0; S1 = sqrt(T1*T1 + Sum * Sum); Sin_p1 = T1 / S1; Cos_p1 = Sum / S1; Rn = gi->Geocent_a / sqrt(1.0 - gi->Geocent_e2 * Sin_p1 * Sin_p1); if (Cos_p1 >= COS_67P5) { *Height = W / Cos_p1 - Rn; } else if (Cos_p1 <= -COS_67P5) { *Height = W / -Cos_p1 - Rn; } else { *Height = Z / Sin_p1 + Rn * (gi->Geocent_e2 - 1.0); } if (At_Pole == FALSE) { *Latitude = atan(Sin_p1 / Cos_p1); } #else /* defined(USE_ITERATIVE_METHOD) */ /* * Reference... * ============ * Wenzel, H.-G.(1985): Hochauflösende Kugelfunktionsmodelle für * das Gravitationspotential der Erde. Wiss. Arb. Univ. Hannover * Nr. 137, p. 130-131. * Programmed by GGA- Leibniz-Institue of Applied Geophysics * Stilleweg 2 * D-30655 Hannover * Federal Republic of Germany * Internet: www.gga-hannover.de * * Hannover, March 1999, April 2004. * see also: comments in statements * remarks: * Mathematically exact and because of symmetry of rotation-ellipsoid, * each point (X,Y,Z) has at least two solutions (Latitude1,Longitude1,Height1) and * (Latitude2,Longitude2,Height2). Is point=(0.,0.,Z) (P=0.), so you get even * four solutions, every two symmetrical to the semi-minor axis. * Here Height1 and Height2 have at least a difference in order of * radius of curvature (e.g. (0,0,b)=> (90.,0.,0.) or (-90.,0.,-2b); * (a+100.)*(sqrt(2.)/2.,sqrt(2.)/2.,0.) => (0.,45.,100.) or * (0.,225.,-(2a+100.))). * The algorithm always computes (Latitude,Longitude) with smallest |Height|. * For normal computations, that means |Height|<10000.m, algorithm normally * converges after to 2-3 steps!!! * But if |Height| has the amount of length of ellipsoid's axis * (e.g. -6300000.m), algorithm needs about 15 steps. */ /* local defintions and variables */ /* end-criterium of loop, accuracy of sin(Latitude) */ #define genau 1.E-12 #define genau2 (genau*genau) #define maxiter 30 double P; /* distance between semi-minor axis and location */ double RR; /* distance between center and location */ double CT; /* sin of geocentric latitude */ double ST; /* cos of geocentric latitude */ double RX; double RK; double RN; /* Earth radius at location */ double CPHI0; /* cos of start or old geodetic latitude in iterations */ double SPHI0; /* sin of start or old geodetic latitude in iterations */ double CPHI; /* cos of searched geodetic latitude */ double SPHI; /* sin of searched geodetic latitude */ double SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ int At_Pole; /* indicates location is in polar region */ int iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ At_Pole = FALSE; P = sqrt(X*X+Y*Y); RR = sqrt(X*X+Y*Y+Z*Z); /* special cases for latitude and longitude */ if (P/gi->Geocent_a < genau) { /* special case, if P=0. (X=0., Y=0.) */ At_Pole = TRUE; *Longitude = 0.; /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis * of ellipsoid (=center of mass), Latitude becomes PI/2 */ if (RR/gi->Geocent_a < genau) { *Latitude = PI_OVER_2; *Height = -gi->Geocent_b; return ; } } else { /* ellipsoidal (geodetic) longitude * interval: -PI < Longitude <= +PI */ *Longitude=atan2(Y,X); } /* -------------------------------------------------------------- * Following iterative algorithm was developped by * "Institut für Erdmessung", University of Hannover, July 1988. * Internet: www.ife.uni-hannover.de * Iterative computation of CPHI,SPHI and Height. * Iteration of CPHI and SPHI to 10**-12 radian resp. * 2*10**-7 arcsec. * -------------------------------------------------------------- */ CT = Z/RR; ST = P/RR; RX = 1.0/sqrt(1.0-gi->Geocent_e2*(2.0-gi->Geocent_e2)*ST*ST); CPHI0 = ST*(1.0-gi->Geocent_e2)*RX; SPHI0 = CT*RX; iter = 0; /* loop to find sin(Latitude) resp. Latitude * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ do { iter++; RN = gi->Geocent_a/sqrt(1.0-gi->Geocent_e2*SPHI0*SPHI0); /* ellipsoidal (geodetic) height */ *Height = P*CPHI0+Z*SPHI0-RN*(1.0-gi->Geocent_e2*SPHI0*SPHI0); RK = gi->Geocent_e2*RN/(RN+*Height); RX = 1.0/sqrt(1.0-RK*(2.0-RK)*ST*ST); CPHI = ST*(1.0-RK)*RX; SPHI = CT*RX; SDPHI = SPHI*CPHI0-CPHI*SPHI0; CPHI0 = CPHI; SPHI0 = SPHI; } while (SDPHI*SDPHI > genau2 && iter < maxiter); /* ellipsoidal (geodetic) latitude */ *Latitude=atan(SPHI/fabs(CPHI)); return; #endif /* defined(USE_ITERATIVE_METHOD) */ } /* END OF Convert_Geocentric_To_Geodetic */ therion/extern/proj4/PJ_goode.c0000664000175000017500000000204011137333614015441 0ustar useruser#define PROJ_PARMS__ \ struct PJconsts *sinu; \ struct PJconsts *moll; #define PJ_LIB__ #include PROJ_HEAD(goode, "Goode Homolosine") "\n\tPCyl, Sph."; C_NAMESPACE PJ *pj_sinu(PJ *), *pj_moll(PJ *); #define Y_COR 0.05280 #define PHI_LIM .71093078197902358062 FORWARD(s_forward); /* spheroid */ if (fabs(lp.phi) <= PHI_LIM) xy = P->sinu->fwd(lp, P->sinu); else { xy = P->moll->fwd(lp, P->moll); xy.y -= lp.phi >= 0.0 ? Y_COR : -Y_COR; } return (xy); } INVERSE(s_inverse); /* spheroid */ if (fabs(xy.y) <= PHI_LIM) lp = P->sinu->inv(xy, P->sinu); else { xy.y += xy.y >= 0.0 ? Y_COR : -Y_COR; lp = P->moll->inv(xy, P->moll); } return (lp); } FREEUP; if (P) { if (P->sinu) (*(P->sinu->pfree))(P->sinu); if (P->moll) (*(P->moll->pfree))(P->moll); pj_dalloc(P); } } ENTRY2(goode, sinu, moll) P->es = 0.; if (!(P->sinu = pj_sinu(0)) || !(P->moll = pj_moll(0))) E_ERROR_0; if (!(P->sinu = pj_sinu(P->sinu)) || !(P->moll = pj_moll(P->moll))) E_ERROR_0; P->fwd = s_forward; P->inv = s_inverse; ENDENTRY(P) therion/extern/proj4/PJ_fahey.c0000664000175000017500000000103311137333572015444 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(fahey, "Fahey") "\n\tPcyl, Sph."; #define TOL 1e-6 FORWARD(s_forward); /* spheroid */ xy.y = 1.819152 * ( xy.x = tan(0.5 * lp.phi) ); xy.x = 0.819152 * lp.lam * asqrt(1 - xy.x * xy.x); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = 2. * atan(xy.y /= 1.819152); lp.lam = fabs(xy.y = 1. - xy.y * xy.y) < TOL ? 0. : xy.x / (0.819152 * sqrt(xy.y)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(fahey) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_eck1.c0000664000175000017500000000076711137333536015210 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(eck1, "Eckert I") "\n\tPCyl., Sph."; #define FC .92131773192356127802 #define RP .31830988618379067154 FORWARD(s_forward); /* spheroid */ xy.x = FC * lp.lam * (1. - RP * fabs(lp.phi)); xy.y = FC * lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / FC; lp.lam = xy.x / (FC * (1. - RP * fabs(lp.phi))); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(eck1) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_inv.c0000664000175000017500000000150111137333630015237 0ustar useruser/* general inverse projection */ #define PJ_LIB__ #include #include # define EPS 1.0e-12 LP /* inverse projection entry */ pj_inv(XY xy, PJ *P) { LP lp; /* can't do as much preliminary checking as with forward */ if (xy.x == HUGE_VAL || xy.y == HUGE_VAL) { lp.lam = lp.phi = HUGE_VAL; pj_errno = -15; } errno = pj_errno = 0; xy.x = (xy.x * P->to_meter - P->x0) * P->ra; /* descale and de-offset */ xy.y = (xy.y * P->to_meter - P->y0) * P->ra; lp = (*P->inv)(xy, P); /* inverse project */ if (pj_errno || (pj_errno = errno)) lp.lam = lp.phi = HUGE_VAL; else { lp.lam += P->lam0; /* reduce from del lp.lam */ if (!P->over) lp.lam = adjlon(lp.lam); /* adjust longitude to CM */ if (P->geoc && fabs(fabs(lp.phi)-HALFPI) > EPS) lp.phi = atan(P->one_es * tan(lp.phi)); } return lp; } therion/extern/proj4/nad/0000775000175000017500000000000012426431332014353 5ustar userusertherion/extern/proj4/nad/esri0000664000175000017500000156547411076405004015263 0ustar useruser# Anguilla 1957 / British West Indies Grid <2000> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs no_defs <> # Antigua 1943 / British West Indies Grid <2001> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-255,-15,71,0,0,0,0 +units=m +no_defs no_defs <> # Dominica 1945 / British West Indies Grid <2002> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +units=m +no_defs no_defs <> # Grenada 1953 / British West Indies Grid <2003> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +units=m +no_defs no_defs <> # Montserrat 58 / British West Indies Grid <2004> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +units=m +no_defs no_defs <> # St Kitts 1955 / British West Indies Grid <2005> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=9,183,236,0,0,0,0 +units=m +no_defs no_defs <> # St Lucia 1955 / British West Indies Grid <2006> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +units=m +no_defs no_defs <> # St Vincent 45 / British West Indies Grid <2007> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 2 <2008> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 3 <2009> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 4 <2010> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 5 <2011> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 6 <2012> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 7 <2013> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 8 <2014> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 9 <2015> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / SCoPQ zone 10 <2016> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 8 <2017> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 9 <2018> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 10 <2019> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 11 <2020> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 12 <2021> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 13 <2022> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 14 <2023> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 15 <2024> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 16 <2025> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / MTM zone 17 <2026> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / UTM zone 15N <2027> +proj=utm +zone=15 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / UTM zone 16N <2028> +proj=utm +zone=16 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / UTM zone 17N <2029> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(76) / UTM zone 18N <2030> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / UTM zone 17N <2031> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / UTM zone 18N <2032> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / UTM zone 19N <2033> +proj=utm +zone=19 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / UTM zone 20N <2034> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD27(CGQ77) / UTM zone 21N <2035> +proj=utm +zone=21 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD83(CSRS98) / New Brunswick Stereo <2036> +proj=stere +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 19N <2037> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 20N <2038> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Israel / Israeli TM Grid <2039> +proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.000007 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +units=m +no_defs no_defs <> # Locodjo 1965 / UTM zone 30N <2040> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs no_defs <> # Abidjan 1987 / UTM zone 30N <2041> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs no_defs <> # Locodjo 1965 / UTM zone 29N <2042> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs no_defs <> # Abidjan 1987 / UTM zone 29N <2043> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs no_defs <> # Hanoi 1972 / Gauss-Kruger zone 18 <2044> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs no_defs <> # Hanoi 1972 / Gauss-Kruger zone 19 <2045> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs no_defs <> # Hartebeesthoek94 / Lo15 # Hartebeesthoek94 / Lo17 # Hartebeesthoek94 / Lo19 # Hartebeesthoek94 / Lo21 # Hartebeesthoek94 / Lo23 # Hartebeesthoek94 / Lo25 # Hartebeesthoek94 / Lo27 # Hartebeesthoek94 / Lo29 # Hartebeesthoek94 / Lo31 # Hartebeesthoek94 / Lo33 # CH1903+ / LV95 <2056> +proj=omerc +lat_0=46.95240555555556 +lonc=7.439583333333333 +alpha=90 +k=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs no_defs <> # Rassadiran / Nakhl e Taqi <2057> +proj=omerc +lat_0=27.51882880555555 +lonc=52.60353916666667 +alpha=0.5716611944444444 +k=0.999895934 +x_0=658377.437 +y_0=3044969.194 +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +units=m +no_defs no_defs <> # ED50(ED77) / UTM zone 38N <2058> +proj=utm +zone=38 +ellps=intl +units=m +no_defs no_defs <> # ED50(ED77) / UTM zone 39N <2059> +proj=utm +zone=39 +ellps=intl +units=m +no_defs no_defs <> # ED50(ED77) / UTM zone 40N <2060> +proj=utm +zone=40 +ellps=intl +units=m +no_defs no_defs <> # ED50(ED77) / UTM zone 41N <2061> +proj=utm +zone=41 +ellps=intl +units=m +no_defs no_defs <> # Madrid 1870 (Madrid) / Spain <2062> +proj=lcc +lat_1=40 +lat_0=40 +lon_0=-3.687938888888889 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669562 +pm=madrid +units=m +no_defs no_defs <> # Dabola 1981 / UTM zone 28N <2063> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs no_defs <> # Dabola 1981 / UTM zone 29N <2064> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs no_defs <> # S-JTSK (Ferro) / Krovak <2065> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # Mount Dillon / Tobago Grid <2066> +proj=cass +lat_0=11.25217861111111 +lon_0=-60.68600888888889 +x_0=37718.66154375 +y_0=36209.915082 +a=6378293.63683822 +b=6356617.979337744 +to_meter=0.2011661949 +no_defs no_defs <> # Naparima 1955 / UTM zone 20N <2067> +proj=utm +zone=20 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 5 <2068> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 6 <2069> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 7 <2070> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 8 <2071> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 9 <2072> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 10 <2073> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 11 <2074> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 12 <2075> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / Libya zone 13 <2076> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.999900 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / UTM zone 32N <2077> +proj=utm +zone=32 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / UTM zone 33N <2078> +proj=utm +zone=33 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / UTM zone 34N <2079> +proj=utm +zone=34 +ellps=intl +units=m +no_defs no_defs <> # ELD79 / UTM zone 35N <2080> +proj=utm +zone=35 +ellps=intl +units=m +no_defs no_defs <> # Chos Malal 1914 / Argentina zone 2 <2081> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Pampa del Castillo / Argentina zone 2 <2082> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Hito XVIII 1963 / Argentina zone 2 <2083> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013 +units=m +no_defs no_defs <> # Hito XVIII 1963 / UTM zone 19S <2084> +proj=utm +zone=19 +south +ellps=intl +towgs84=18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013 +units=m +no_defs no_defs <> # NAD27 / Cuba Norte <2085> +proj=lcc +lat_1=22.35 +lat_0=22.35 +lon_0=-81 +k_0=0.99993602 +x_0=500000 +y_0=280296.016 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / Cuba Sur <2086> +proj=lcc +lat_1=20.71666666666667 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +k_0=0.99994848 +x_0=500000 +y_0=229126.939 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # ELD79 / TM 12 NE <2087> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Carthage / TM 11 NE <2088> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.999600 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Yemen NGN96 / UTM zone 38N <2089> +proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Yemen NGN96 / UTM zone 39N <2090> +proj=utm +zone=39 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # South Yemen / Gauss Kruger zone 8 <2091> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs no_defs <> # South Yemen / Gauss Kruger zone 9 <2092> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs no_defs <> # Hanoi 1972 / GK 106 NE <2093> +proj=tmerc +lat_0=0 +lon_0=106 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs no_defs <> # WGS 72BE / TM 106 NE <2094> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.999600 +x_0=500000 +y_0=0 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # Bissau / UTM zone 28N <2095> +proj=utm +zone=28 +ellps=intl +towgs84=-173,253,27,0,0,0,0 +units=m +no_defs no_defs <> # Korean 1985 / Korea East Belt <2096> +proj=tmerc +lat_0=38 +lon_0=129 +k=1.000000 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs no_defs <> # Korean 1985 / Korea Central Belt <2097> +proj=tmerc +lat_0=38 +lon_0=127 +k=1.000000 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs no_defs <> # Korean 1985 / Korea West Belt <2098> +proj=tmerc +lat_0=38 +lon_0=125 +k=1.000000 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs no_defs <> # Qatar 1948 / Qatar Grid <2099> +proj=cass +lat_0=25.38236111111111 +lon_0=50.76138888888889 +x_0=100000 +y_0=100000 +ellps=helmert +units=m +no_defs no_defs <> # GGRS87 / Greek Grid <2100> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0 +units=m +no_defs no_defs <> # Lake / Maracaibo Grid M1 <2101> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=0 +y_0=-52684.972 +ellps=intl +units=m +no_defs no_defs <> # Lake / Maracaibo Grid <2102> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=200000 +y_0=147315.028 +ellps=intl +units=m +no_defs no_defs <> # Lake / Maracaibo Grid M3 <2103> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=500000 +y_0=447315.028 +ellps=intl +units=m +no_defs no_defs <> # Lake / Maracaibo La Rosa Grid <2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=-17044 +y_0=-23139.97 +ellps=intl +units=m +no_defs no_defs <> # NZGD2000 / Mount Eden Circuit 2000 <2105> +proj=tmerc +lat_0=-36.87972222222222 +lon_0=174.7641666666667 +k=0.999900 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Bay of Plenty Circuit 2000 <2106> +proj=tmerc +lat_0=-37.76111111111111 +lon_0=176.4661111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Poverty Bay Circuit 2000 <2107> +proj=tmerc +lat_0=-38.62444444444444 +lon_0=177.8855555555556 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Hawkes Bay Circuit 2000 <2108> +proj=tmerc +lat_0=-39.65083333333333 +lon_0=176.6736111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Taranaki Circuit 2000 <2109> +proj=tmerc +lat_0=-39.13555555555556 +lon_0=174.2277777777778 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Tuhirangi Circuit 2000 <2110> +proj=tmerc +lat_0=-39.51222222222222 +lon_0=175.64 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Wanganui Circuit 2000 <2111> +proj=tmerc +lat_0=-40.24194444444444 +lon_0=175.4880555555555 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Wairarapa Circuit 2000 <2112> +proj=tmerc +lat_0=-40.92527777777777 +lon_0=175.6472222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Wellington Circuit 2000 <2113> +proj=tmerc +lat_0=-41.3011111111111 +lon_0=174.7763888888889 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Collingwood Circuit 2000 <2114> +proj=tmerc +lat_0=-40.71472222222223 +lon_0=172.6719444444444 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Nelson Circuit 2000 <2115> +proj=tmerc +lat_0=-41.27444444444444 +lon_0=173.2991666666667 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Karamea Circuit 2000 <2116> +proj=tmerc +lat_0=-41.28972222222222 +lon_0=172.1088888888889 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Buller Circuit 2000 <2117> +proj=tmerc +lat_0=-41.81055555555555 +lon_0=171.5811111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Grey Circuit 2000 <2118> +proj=tmerc +lat_0=-42.33361111111111 +lon_0=171.5497222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Amuri Circuit 2000 <2119> +proj=tmerc +lat_0=-42.68888888888888 +lon_0=173.01 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Marlborough Circuit 2000 <2120> +proj=tmerc +lat_0=-41.54444444444444 +lon_0=173.8019444444444 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Hokitika Circuit 2000 <2121> +proj=tmerc +lat_0=-42.88611111111111 +lon_0=170.9797222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Okarito Circuit 2000 <2122> +proj=tmerc +lat_0=-43.11 +lon_0=170.2608333333333 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Jacksons Bay Circuit 2000 <2123> +proj=tmerc +lat_0=-43.97777777777778 +lon_0=168.6061111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Mount Pleasant Circuit 2000 <2124> +proj=tmerc +lat_0=-43.59055555555556 +lon_0=172.7269444444445 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Gawler Circuit 2000 <2125> +proj=tmerc +lat_0=-43.74861111111111 +lon_0=171.3605555555555 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Timaru Circuit 2000 <2126> +proj=tmerc +lat_0=-44.40194444444445 +lon_0=171.0572222222222 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Lindis Peak Circuit 2000 <2127> +proj=tmerc +lat_0=-44.735 +lon_0=169.4675 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Mount Nicholas Circuit 2000 <2128> +proj=tmerc +lat_0=-45.13277777777778 +lon_0=168.3986111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Mount York Circuit 2000 <2129> +proj=tmerc +lat_0=-45.56361111111111 +lon_0=167.7386111111111 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Observation Point Circuit 2000 <2130> +proj=tmerc +lat_0=-45.81611111111111 +lon_0=170.6283333333333 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / North Taieri Circuit 2000 <2131> +proj=tmerc +lat_0=-45.86138888888889 +lon_0=170.2825 +k=0.999960 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / Bluff Circuit 2000 <2132> +proj=tmerc +lat_0=-46.6 +lon_0=168.3427777777778 +k=1.000000 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / UTM zone 58S <2133> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / UTM zone 59S <2134> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NZGD2000 / UTM zone 60S <2135> +proj=utm +zone=60 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Accra / Ghana National Grid <2136> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.999750 +x_0=274319.7391633579 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +to_meter=0.3047997101815088 +no_defs no_defs <> # Accra / TM 1 NW <2137> +proj=tmerc +lat_0=0 +lon_0=-1 +k=0.999600 +x_0=500000 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +units=m +no_defs no_defs <> # NAD27(CGQ77) / Quebec Lambert <2138> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # NAD83(CSRS98) / SCoPQ zone 2 <2139> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 3 <2140> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 4 <2141> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 5 <2142> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 6 <2143> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 7 <2144> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 8 <2145> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 9 <2146> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / MTM zone 10 <2147> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 21N <2148> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 18N <2149> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 17N <2150> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 13N <2151> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 12N <2152> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS98) / UTM zone 11N <2153> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # RGF93 / Lambert-93 <2154> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # American Samoa 1962 / American Samoa Lambert <2155> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / UTM zone 59S <2156> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # IRENET95 / Irish Transverse Mercator <2157> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=0.999820 +x_0=600000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # IRENET95 / UTM zone 29N <2158> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Sierra Leone 1924 / New Colony Grid <2159> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1.000000 +x_0=152399.8550907544 +y_0=0 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs no_defs <> # Sierra Leone 1924 / New War Office Grid <2160> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1.000000 +x_0=243839.7681452071 +y_0=182879.8261089053 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs no_defs <> # Sierra Leone 1968 / UTM zone 28N <2161> +proj=utm +zone=28 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs no_defs <> # Sierra Leone 1968 / UTM zone 29N <2162> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs no_defs <> # US National Atlas Equal Area <2163> +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs no_defs <> # Locodjo 1965 / TM 5 NW <2164> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.999600 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs no_defs <> # Abidjan 1987 / TM 5 NW <2165> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.999600 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs no_defs <> # Pulkovo 1942(83) / Gauss Kruger zone 3 <2166> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs no_defs <> # Pulkovo 1942(83) / Gauss Kruger zone 4 <2167> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs no_defs <> # Pulkovo 1942(83) / Gauss Kruger zone 5 <2168> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs no_defs <> # Luxembourg 1930 / Gauss <2169> +proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1.000000 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +units=m +no_defs no_defs <> # MGI / Slovenia Grid <2170> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999900 +x_0=500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Pulkovo 1942(58) / Poland zone I <2171> +proj=stere +lat_0=50.625 +lon_0=21.08333333333333 +k=0.999800 +x_0=4637000 +y_0=5647000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs no_defs <> # Pulkovo 1942(58) / Poland zone II <2172> +proj=stere +lat_0=53.00194444444445 +lon_0=21.50277777777778 +k=0.999800 +x_0=4603000 +y_0=5806000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs no_defs <> # Pulkovo 1942(58) / Poland zone III <2173> +proj=stere +lat_0=53.58333333333334 +lon_0=17.00833333333333 +k=0.999800 +x_0=3501000 +y_0=5999000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs no_defs <> # Pulkovo 1942(58) / Poland zone IV <2174> +proj=stere +lat_0=51.67083333333333 +lon_0=16.67222222222222 +k=0.999800 +x_0=3703000 +y_0=5627000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs no_defs <> # Pulkovo 1942(58) / Poland zone V <2175> +proj=tmerc +lat_0=0 +lon_0=18.95833333333333 +k=0.999983 +x_0=237000 +y_0=-4700000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs no_defs <> # ETRS89 / Poland CS2000 zone 5 <2176> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999923 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / Poland CS2000 zone 6 <2177> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.999923 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / Poland CS2000 zone 7 <2178> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999923 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / Poland CS2000 zone 8 <2179> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999923 +x_0=8500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / Poland CS92 <2180> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.999300 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs no_defs <> # Azores Occidental 1939 / UTM zone 25N <2188> +proj=utm +zone=25 +ellps=intl +units=m +no_defs no_defs <> # Azores Central 1948 / UTM zone 26N <2189> +proj=utm +zone=26 +ellps=intl +units=m +no_defs no_defs <> # Azores Oriental 1940 / UTM zone 26N <2190> +proj=utm +zone=26 +ellps=intl +units=m +no_defs no_defs <> # Madeira 1936 / UTM zone 28N <2191> +proj=utm +zone=28 +ellps=intl +units=m +no_defs no_defs <> # ED50 / France EuroLambert <2192> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=intl +units=m +no_defs no_defs <> # NZGD2000 / New Zealand Transverse Mercator <2193> +proj=tmerc +lat_0=0 +lon_0=173 +k=0.999600 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # American Samoa 1962 / American Samoa Lambert <2194> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / UTM zone 2S <2195> +proj=utm +zone=2 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # ETRS89 / Kp2000 Jutland <2196> +proj=tmerc +lat_0=0 +lon_0=9.5 +k=0.999950 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / Kp2000 Zealand <2197> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.999950 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / Kp2000 Bornholm <2198> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # Albanian 1987 / Gauss Kruger zone 4 <2199> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # ATS77 / New Brunswick Stereographic (ATS77) <2200> +proj=stere +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=300000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # REGVEN / UTM zone 18N <2201> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # REGVEN / UTM zone 19N <2202> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # REGVEN / UTM zone 20N <2203> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD27 / Tennessee <2204> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=609601.2192024384 +y_0=30480.06096012192 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Kentucky North <2205> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 9 <2206> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 10 <2207> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 11 <2208> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 12 <2209> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 13 <2210> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 14 <2211> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / 3-degree Gauss-Kruger zone 15 <2212> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ETRS89 / TM 30 NE <2213> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # Douala 1948 / AOF west <2214> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs no_defs <> # Manoca 1962 / UTM zone 32N <2215> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +units=m +no_defs no_defs <> # Qornoq 1927 / UTM zone 22N <2216> +proj=utm +zone=22 +ellps=intl +units=m +no_defs no_defs <> # Qornoq 1927 / UTM zone 23N <2217> +proj=utm +zone=23 +ellps=intl +units=m +no_defs no_defs <> # ATS77 / UTM zone 19N <2219> +proj=utm +zone=19 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # ATS77 / UTM zone 20N <2220> +proj=utm +zone=20 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # NAD83 / Arizona East (ft) <2222> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Arizona Central (ft) <2223> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Arizona West (ft) <2224> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / California zone 1 (ftUS) <2225> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / California zone 2 (ftUS) <2226> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / California zone 3 (ftUS) <2227> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / California zone 4 (ftUS) <2228> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / California zone 5 (ftUS) <2229> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / California zone 6 (ftUS) <2230> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Colorado North (ftUS) <2231> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Colorado Central (ftUS) <2232> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Colorado South (ftUS) <2233> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Connecticut (ftUS) <2234> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Delaware (ftUS) <2235> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Florida East (ftUS) <2236> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Florida West (ftUS) <2237> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Florida North (ftUS) <2238> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Georgia East (ftUS) <2239> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Georgia West (ftUS) <2240> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Idaho East (ftUS) <2241> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Idaho Central (ftUS) <2242> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Idaho West (ftUS) <2243> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Indiana East (ftUS) <2244> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Indiana West (ftUS) <2245> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Kentucky North (ftUS) <2246> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Kentucky South (ftUS) <2247> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Maryland (ftUS) <2248> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Massachusetts Mainland (ftUS) <2249> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Massachusetts Island (ftUS) <2250> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Michigan North (ft) <2251> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Michigan Central (ft) <2252> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Michigan South (ft) <2253> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Mississippi East (ftUS) <2254> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Mississippi West (ftUS) <2255> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Montana (ft) <2256> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / New Mexico East (ftUS) <2257> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / New Mexico Central (ftUS) <2258> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / New Mexico West (ftUS) <2259> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / New York East (ftUS) <2260> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / New York Central (ftUS) <2261> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / New York West (ftUS) <2262> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / New York Long Island (ftUS) <2263> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / North Carolina (ftUS) <2264> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / North Dakota North (ft) <2265> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / North Dakota South (ft) <2266> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Oklahoma North (ftUS) <2267> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Oklahoma South (ftUS) <2268> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Oregon North (ft) <2269> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Oregon South (ft) <2270> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Pennsylvania North (ftUS) <2271> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Pennsylvania South (ftUS) <2272> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / South Carolina (ft) <2273> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Tennessee (ftUS) <2274> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Texas North (ftUS) <2275> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Texas North Central (ftUS) <2276> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Texas Central (ftUS) <2277> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Texas South Central (ftUS) <2278> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Texas South (ftUS) <2279> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Utah North (ft) <2280> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Utah Central (ft) <2281> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Utah South (ft) <2282> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048 +no_defs no_defs <> # NAD83 / Virginia North (ftUS) <2283> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Virginia South (ftUS) <2284> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Washington North (ftUS) <2285> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Washington South (ftUS) <2286> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Wisconsin North (ftUS) <2287> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Wisconsin Central (ftUS) <2288> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / Wisconsin South (ftUS) <2289> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs no_defs <> # ATS77 / Prince Edward Isl. Stereographic (ATS77) <2290> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=700000 +y_0=400000 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) <2291> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) <2292> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # ATS77 / MTM Nova Scotia zone 4 <2294> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=4500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # ATS77 / MTM Nova Scotia zone 5 <2295> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=5500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs no_defs <> # Batavia / TM 109 SE <2308> +proj=tmerc +lat_0=0 +lon_0=109 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=bessel +units=m +no_defs no_defs <> # WGS 84 / TM 116 SE <2309> +proj=tmerc +lat_0=0 +lon_0=116 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / TM 132 SE <2310> +proj=tmerc +lat_0=0 +lon_0=132 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / TM 6 NE <2311> +proj=tmerc +lat_0=0 +lon_0=6 +k=0.999600 +x_0=500000 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # Garoua / UTM zone 33N <2312> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs no_defs <> # Kousseri / UTM zone 33N <2313> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs no_defs <> # Trinidad 1903 / Trinidad Grid (ftCla) <2314> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46380699999 +y_0=65379.01334249999 +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0 +to_meter=0.304797265 +no_defs no_defs <> # Campo Inchauspe / UTM zone 19S <2315> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / UTM zone 20S <2316> +proj=utm +zone=20 +south +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / ICN Regional <2317> +proj=lcc +lat_1=9 +lat_2=3 +lat_0=6 +lon_0=-66 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs no_defs <> # Ain el Abd / Aramco Lambert <2318> +proj=lcc +lat_1=17 +lat_2=33 +lat_0=25.08951 +lon_0=48 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM27 <2319> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM30 <2320> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM33 <2321> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM36 <2322> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM39 <2323> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM42 <2324> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM45 <2325> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Hong Kong 1980 Grid System <2326> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1.000000 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 13 <2327> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 14 <2328> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 15 <2329> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 16 <2330> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 17 <2331> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 18 <2332> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 19 <2333> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 20 <2334> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 21 <2335> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 22 <2336> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger zone 23 <2337> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 75E <2338> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 81E <2339> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 87E <2340> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 93E <2341> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 99E <2342> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 105E <2343> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 111E <2344> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 117E <2345> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 123E <2346> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 129E <2347> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / Gauss-Kruger CM 135E <2348> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 25 <2349> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 26 <2350> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 27 <2351> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 28 <2352> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 29 <2353> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 30 <2354> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 31 <2355> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 32 <2356> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 33 <2357> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 34 <2358> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 35 <2359> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 36 <2360> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 37 <2361> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 38 <2362> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 39 <2363> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 40 <2364> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 41 <2365> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 42 <2366> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 43 <2367> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 44 <2368> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 45 <2369> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 75E <2370> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 78E <2371> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 81E <2372> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 84E <2373> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 87E <2374> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 90E <2375> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 93E <2376> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 96E <2377> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 99E <2378> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 102E <2379> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 105E <2380> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 108E <2381> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 111E <2382> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 114E <2383> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 117E <2384> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 120E <2385> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 123E <2386> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 126E <2387> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 129E <2388> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 132E <2389> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 135E <2390> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs no_defs <> # KKJ / Finland zone 1 <2391> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <> # KKJ / Finland zone 2 <2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <> # KKJ / Finland Uniform Coordinate System <2393> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <> # KKJ / Finland zone 4 <2394> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <> # South Yemen / Gauss-Kruger zone 8 <2395> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs no_defs <> # South Yemen / Gauss-Kruger zone 9 <2396> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs no_defs <> # Pulkovo 1942(83) / Gauss-Kruger zone 3 <2397> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs no_defs <> # Pulkovo 1942(83) / Gauss-Kruger zone 4 <2398> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs no_defs <> # Pulkovo 1942(83) / Gauss-Kruger zone 5 <2399> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs no_defs <> # RT90 2.5 gon W <2400> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 25 <2401> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 26 <2402> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 27 <2403> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 28 <2404> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 29 <2405> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 30 <2406> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 31 <2407> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 32 <2408> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 33 <2409> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 34 <2410> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 35 <2411> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 36 <2412> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 37 <2413> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 38 <2414> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 39 <2415> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 40 <2416> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 41 <2417> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 42 <2418> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 43 <2419> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 44 <2420> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 45 <2421> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 75E <2422> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 78E <2423> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 81E <2424> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 84E <2425> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 87E <2426> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 90E <2427> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 93E <2428> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 96E <2429> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 99E <2430> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 102E <2431> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 105E <2432> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 108E <2433> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 111E <2434> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 114E <2435> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 117E <2436> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 120E <2437> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 123E <2438> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 126E <2439> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 129E <2440> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 132E <2441> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 135E <2442> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS I <2443> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS II <2444> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS III <2445> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS IV <2446> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS V <2447> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS VI <2448> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS VII <2449> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS VIII <2450> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS IX <2451> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS X <2452> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XI <2453> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XII <2454> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XIII <2455> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XIV <2456> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XV <2457> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XVI <2458> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XVII <2459> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XVIII <2460> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # JGD2000 / Japan Plane Rectangular CS XIX <2461> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.999900 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Albanian 1987 / Gauss-Kruger zone 4 <2462> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 21E <2463> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 27E <2464> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 33E <2465> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 39E <2466> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 45E <2467> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 51E <2468> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 57E <2469> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 63E <2470> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 69E <2471> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 75E <2472> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 81E <2473> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 87E <2474> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 93E <2475> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 99E <2476> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 105E <2477> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 111E <2478> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 117E <2479> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 123E <2480> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 129E <2481> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 135E <2482> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 141E <2483> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 147E <2484> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 153E <2485> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 159E <2486> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 165E <2487> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 171E <2488> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 177E <2489> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 177W <2490> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 171W <2491> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 9E <2492> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 15E <2493> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 21E <2494> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 27E <2495> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 33E <2496> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 39E <2497> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 45E <2498> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 51E <2499> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 57E <2500> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 63E <2501> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 69E <2502> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 75E <2503> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 81E <2504> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 87E <2505> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 93E <2506> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 99E <2507> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 105E <2508> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 111E <2509> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 117E <2510> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 123E <2511> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 129E <2512> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 135E <2513> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 141E <2514> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 147E <2515> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 153E <2516> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 159E <2517> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 165E <2518> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 171E <2519> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 177E <2520> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 177W <2521> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 171W <2522> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 7 <2523> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 8 <2524> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 9 <2525> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 10 <2526> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 11 <2527> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 12 <2528> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 13 <2529> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 14 <2530> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 15 <2531> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 16 <2532> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 17 <2533> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 18 <2534> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 19 <2535> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 20 <2536> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 21 <2537> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 22 <2538> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 23 <2539> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 24 <2540> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 25 <2541> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 26 <2542> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 27 <2543> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 28 <2544> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 29 <2545> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 30 <2546> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 31 <2547> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 32 <2548> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 33 <2549> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Samboja / UTM zone 50S <2550> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 34 <2551> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 35 <2552> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 36 <2553> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 37 <2554> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 38 <2555> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 39 <2556> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 40 <2557> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 41 <2558> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 42 <2559> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 43 <2560> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 44 <2561> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 45 <2562> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 46 <2563> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=46500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 47 <2564> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=47500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 48 <2565> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=48500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 49 <2566> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=49500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 50 <2567> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=50500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 51 <2568> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=51500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 52 <2569> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=52500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 53 <2570> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=53500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 54 <2571> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=54500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 55 <2572> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=55500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 56 <2573> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=56500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 57 <2574> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=57500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 58 <2575> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=58500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 59 <2576> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=59500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 <2577> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=60000000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 61 <2578> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=61500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 62 <2579> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=62500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 63 <2580> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=63500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 64 <2581> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=64500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E <2582> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E <2583> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E <2584> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E <2585> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E <2586> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E <2587> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E <2588> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E <2589> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E <2590> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E <2591> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E <2592> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E <2593> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E <2594> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E <2595> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E <2596> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E <2597> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E <2598> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E <2599> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Lietuvos Koordinoei Sistema 1994 <2600> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999800 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E <2601> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E <2602> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E <2603> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E <2604> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E <2605> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E <2606> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E <2607> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E <2608> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E <2609> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E <2610> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E <2611> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E <2612> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E <2613> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E <2614> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E <2615> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E <2616> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E <2617> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E <2618> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E <2619> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E <2620> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E <2621> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E <2622> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E <2623> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E <2624> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E <2625> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E <2626> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E <2627> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E <2628> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E <2629> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E <2630> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E <2631> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E <2632> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E <2633> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E <2634> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E <2635> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E <2636> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W <2637> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W <2638> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W <2639> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W <2640> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 7 <2641> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 8 <2642> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 9 <2643> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 10 <2644> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 11 <2645> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 12 <2646> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 13 <2647> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 14 <2648> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 15 <2649> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 16 <2650> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 17 <2651> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 18 <2652> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 19 <2653> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 20 <2654> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 21 <2655> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 22 <2656> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 23 <2657> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 24 <2658> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 25 <2659> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 26 <2660> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 27 <2661> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 28 <2662> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 29 <2663> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 30 <2664> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 31 <2665> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 32 <2666> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 33 <2667> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 34 <2668> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 35 <2669> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 36 <2670> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 37 <2671> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 38 <2672> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 39 <2673> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 40 <2674> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 41 <2675> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 42 <2676> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 43 <2677> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 44 <2678> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 45 <2679> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 46 <2680> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=46500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 47 <2681> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=47500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 48 <2682> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=48500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 49 <2683> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=49500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 50 <2684> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=50500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 51 <2685> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=51500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 52 <2686> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=52500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 53 <2687> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=53500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 54 <2688> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=54500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 55 <2689> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=55500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 56 <2690> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=56500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 57 <2691> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=57500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 58 <2692> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=58500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 59 <2693> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=59500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 <2694> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=60000000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 61 <2695> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=61500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 62 <2696> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=62500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 63 <2697> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=63500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 64 <2698> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=64500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E <2699> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E <2700> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E <2701> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E <2702> +proj=tmerc +lat_0=0 +lon_0=30 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E <2703> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E <2704> +proj=tmerc +lat_0=0 +lon_0=36 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E <2705> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E <2706> +proj=tmerc +lat_0=0 +lon_0=42 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E <2707> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E <2708> +proj=tmerc +lat_0=0 +lon_0=48 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E <2709> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E <2710> +proj=tmerc +lat_0=0 +lon_0=54 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E <2711> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E <2712> +proj=tmerc +lat_0=0 +lon_0=60 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E <2713> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E <2714> +proj=tmerc +lat_0=0 +lon_0=66 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E <2715> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E <2716> +proj=tmerc +lat_0=0 +lon_0=72 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E <2717> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E <2718> +proj=tmerc +lat_0=0 +lon_0=78 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E <2719> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E <2720> +proj=tmerc +lat_0=0 +lon_0=84 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E <2721> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E <2722> +proj=tmerc +lat_0=0 +lon_0=90 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E <2723> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E <2724> +proj=tmerc +lat_0=0 +lon_0=96 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E <2725> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E <2726> +proj=tmerc +lat_0=0 +lon_0=102 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E <2727> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E <2728> +proj=tmerc +lat_0=0 +lon_0=108 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E <2729> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E <2730> +proj=tmerc +lat_0=0 +lon_0=114 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E <2731> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E <2732> +proj=tmerc +lat_0=0 +lon_0=120 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E <2733> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E <2734> +proj=tmerc +lat_0=0 +lon_0=126 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E <2735> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Tete / UTM zone 36S <2736> +proj=utm +zone=36 +south +ellps=clrk66 +units=m +no_defs no_defs <> # Tete / UTM zone 37S <2737> +proj=utm +zone=37 +south +ellps=clrk66 +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E <2738> +proj=tmerc +lat_0=0 +lon_0=132 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E <2739> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E <2740> +proj=tmerc +lat_0=0 +lon_0=138 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E <2741> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E <2742> +proj=tmerc +lat_0=0 +lon_0=144 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E <2743> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E <2744> +proj=tmerc +lat_0=0 +lon_0=150 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E <2745> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E <2746> +proj=tmerc +lat_0=0 +lon_0=156 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E <2747> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E <2748> +proj=tmerc +lat_0=0 +lon_0=162 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E <2749> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E <2750> +proj=tmerc +lat_0=0 +lon_0=168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E <2751> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E <2752> +proj=tmerc +lat_0=0 +lon_0=174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E <2753> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E <2754> +proj=tmerc +lat_0=0 +lon_0=180 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W <2755> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W <2756> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W <2757> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W <2758> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # NAD83(HARN) / Alabama East <2759> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Alabama West <2760> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Arizona East <2761> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Arizona Central <2762> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Arizona West <2763> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Arkansas North <2764> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Arkansas South <2765> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / California zone 1 <2766> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / California zone 2 <2767> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / California zone 3 <2768> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / California zone 4 <2769> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / California zone 5 <2770> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / California zone 6 <2771> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Colorado North <2772> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Colorado Central <2773> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Colorado South <2774> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Connecticut <2775> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Delaware <2776> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Florida East <2777> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Florida West <2778> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Florida North <2779> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Georgia East <2780> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Georgia West <2781> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Hawaii zone 1 <2782> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Hawaii zone 2 <2783> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Hawaii zone 3 <2784> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Hawaii zone 4 <2785> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Hawaii zone 5 <2786> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Idaho East <2787> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Idaho Central <2788> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Idaho West <2789> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Illinois East <2790> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Illinois West <2791> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Indiana East <2792> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Indiana West <2793> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Iowa North <2794> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Iowa South <2795> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Kansas North <2796> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Kansas South <2797> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Kentucky North <2798> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Kentucky South <2799> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Louisiana North <2800> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Louisiana South <2801> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Maine East <2802> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Maine West <2803> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Maryland <2804> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Massachusetts Mainland <2805> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Massachusetts Island <2806> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Michigan North <2807> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Michigan Central <2808> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Michigan South <2809> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Minnesota North <2810> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Minnesota Central <2811> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Minnesota South <2812> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Mississippi East <2813> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Mississippi West <2814> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Missouri East <2815> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Missouri Central <2816> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Missouri West <2817> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Montana <2818> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Nebraska <2819> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Nevada East <2820> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=8000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Nevada Central <2821> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Nevada West <2822> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=800000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New Hampshire <2823> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New Jersey <2824> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New Mexico East <2825> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New Mexico Central <2826> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New Mexico West <2827> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New York East <2828> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New York Central <2829> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New York West <2830> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / New York Long Island <2831> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / North Dakota North <2832> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / North Dakota South <2833> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Ohio North <2834> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Ohio South <2835> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Oklahoma North <2836> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Oklahoma South <2837> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Oregon North <2838> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Oregon South <2839> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Rhode Island <2840> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / South Dakota North <2841> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / South Dakota South <2842> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Tennessee <2843> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Texas North <2844> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Texas North Central <2845> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Texas Central <2846> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Texas South Central <2847> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Texas South <2848> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Utah North <2849> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Utah Central <2850> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Utah South <2851> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Vermont <2852> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Virginia North <2853> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Virginia South <2854> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Washington North <2855> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Washington South <2856> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / West Virginia North <2857> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / West Virginia South <2858> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wisconsin North <2859> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wisconsin Central <2860> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wisconsin South <2861> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wyoming East <2862> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wyoming East Central <2863> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=400000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wyoming West Central <2864> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Wyoming West <2865> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Puerto Rico & Virgin Is. <2866> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(HARN) / Arizona East (ft) <2867> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Arizona Central (ft) <2868> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Arizona West (ft) <2869> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / California zone 1 (ftUS) <2870> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / California zone 2 (ftUS) <2871> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / California zone 3 (ftUS) <2872> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / California zone 4 (ftUS) <2873> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / California zone 5 (ftUS) <2874> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / California zone 6 (ftUS) <2875> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Colorado North (ftUS) <2876> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Colorado Central (ftUS) <2877> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Colorado South (ftUS) <2878> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Connecticut (ftUS) <2879> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Delaware (ftUS) <2880> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Florida East (ftUS) <2881> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Florida West (ftUS) <2882> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Florida North (ftUS) <2883> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Georgia East (ftUS) <2884> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Georgia West (ftUS) <2885> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Idaho East (ftUS) <2886> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Idaho Central (ftUS) <2887> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Idaho West (ftUS) <2888> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Indiana East (ftUS) <2889> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Indiana West (ftUS) <2890> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Kentucky North (ftUS) <2891> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Kentucky South (ftUS) <2892> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Maryland (ftUS) <2893> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Massachusetts Mainland (ftUS) <2894> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Massachusetts Island (ftUS) <2895> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Michigan North (ft) <2896> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Michigan Central (ft) <2897> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Michigan South (ft) <2898> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Mississippi East (ftUS) <2899> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Mississippi West (ftUS) <2900> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Montana (ft) <2901> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / New Mexico East (ftUS) <2902> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / New Mexico Central (ftUS) <2903> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / New Mexico West (ftUS) <2904> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / New York East (ftUS) <2905> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / New York Central (ftUS) <2906> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / New York West (ftUS) <2907> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / New York Long Island (ftUS) <2908> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / North Dakota North (ft) <2909> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / North Dakota South (ft) <2910> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Oklahoma North (ftUS) <2911> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Oklahoma South (ftUS) <2912> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Oregon North (ft) <2913> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Oregon South (ft) <2914> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Tennessee (ftUS) <2915> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Texas North (ftUS) <2916> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Texas North Central (ftUS) <2917> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Texas Central (ftUS) <2918> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Texas South Central (ftUS) <2919> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Texas South (ftUS) <2920> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Utah North (ft) <2921> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Utah Central (ft) <2922> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Utah South (ft) <2923> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048 +no_defs no_defs <> # NAD83(HARN) / Virginia North (ftUS) <2924> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Virginia South (ftUS) <2925> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Washington North (ftUS) <2926> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Washington South (ftUS) <2927> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Wisconsin North (ftUS) <2928> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Wisconsin Central (ftUS) <2929> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83(HARN) / Wisconsin South (ftUS) <2930> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192 +no_defs no_defs <> # Beduaram / TM 13 NE <2931> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.999600 +x_0=500000.0000000001 +y_0=0 +a=6378249.2 +b=6356515 +to_meter=0.3048006096012192 +no_defs no_defs <> # QND95 / Qatar National Grid <2932> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.999990 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +units=m +no_defs no_defs <> # Segara / UTM zone 50S <2933> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs no_defs <> # Segara (Jakarta) / NEIEZ <2934> +proj=merc +lat_ts=0 +lon_0=216.8077194444444 +k=0.997000 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone A1 <2935> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1.000000 +x_0=1300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone A2 <2936> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1.000000 +x_0=2300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone A3 <2937> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1.000000 +x_0=3300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone A4 <2938> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1.000000 +x_0=4300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone K2 <2939> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1.000000 +x_0=2300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone K3 <2940> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1.000000 +x_0=3300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / CS63 zone K4 <2941> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1.000000 +x_0=4300000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Porto Santo / UTM zone 28N <2942> +proj=utm +zone=28 +ellps=intl +units=m +no_defs no_defs <> # Selvagem Grande / UTM zone 28N <2943> +proj=utm +zone=28 +ellps=intl +units=m +no_defs no_defs <> # NAD83(CSRS) / SCoPQ zone 2 <2944> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 3 <2945> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 4 <2946> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 5 <2947> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 6 <2948> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 7 <2949> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 8 <2950> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 9 <2951> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / MTM zone 10 <2952> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / New Brunswick Stereo <2953> +proj=stere +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83) <2954> +proj=stere +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 11N <2955> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 12N <2956> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 13N <2957> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 17N <2958> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 18N <2959> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 19N <2960> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 20N <2961> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD83(CSRS) / UTM zone 21N <2962> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Moznet / UTM zone 36S <3036> +proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs no_defs <> # Moznet / UTM zone 37S <3037> +proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs no_defs <> # Indian 1960 / UTM zone 48N <3148> +proj=utm +zone=48 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Indian 1960 / UTM zone 49N <3149> +proj=utm +zone=49 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Indian 1960 / TM 106 NE <3176> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.999600 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # FD58 / Iraq zone <3200> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m +no_defs no_defs <> # Estonian Coordinate System of 1992 <3300> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +units=m +no_defs no_defs <> # Estonian Coordinate System of 1997 <3301> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # PSD93 / UTM zone 39N <3439> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs no_defs <> # PSD93 / UTM zone 40N <3440> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs no_defs <> # Old Hawaiian / Hawaii zone 1 <3561> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Old Hawaiian / Hawaii zone 2 <3562> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Old Hawaiian / Hawaii zone 3 <3563> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Old Hawaiian / Hawaii zone 4 <3564> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Old Hawaiian / Hawaii zone 5 <3565> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Puerto Rico / UTM zone 20N <3920> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs no_defs <> # Puerto Rico State Plane CS of 1927 <3991> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Puerto Rico / St. Croix <3992> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012192 +ellps=clrk66 +to_meter=0.3048006096012192 +no_defs no_defs <> # Unknown datum based upon the Airy 1830 ellipsoid <4001> +proj=longlat +ellps=airy +no_defs no_defs <> # Unknown datum based upon the Airy Modified 1849 ellipsoid <4002> +proj=longlat +a=6377340.189 +b=6356034.447938534 +no_defs no_defs <> # Unknown datum based upon the Australian National Spheroid <4003> +proj=longlat +ellps=aust_SA +no_defs no_defs <> # Unknown datum based upon the Bessel 1841 ellipsoid <4004> +proj=longlat +ellps=bessel +no_defs no_defs <> # Unknown datum based upon the Bessel Modified ellipsoid <4005> +proj=longlat +a=6377492.018 +b=6356173.508712696 +no_defs no_defs <> # Unknown datum based upon the Bessel Namibia ellipsoid <4006> +proj=longlat +ellps=bess_nam +no_defs no_defs <> # Unknown datum based upon the Clarke 1858 ellipsoid <4007> +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +no_defs no_defs <> # Unknown datum based upon the Clarke 1866 ellipsoid <4008> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Unknown datum based upon the Clarke 1866 Michigan ellipsoid <4009> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs no_defs <> # Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid <4010> +proj=longlat +a=6378300.789 +b=6356566.435 +no_defs no_defs <> # Unknown datum based upon the Clarke 1880 (IGN) ellipsoid <4011> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Unknown datum based upon the Clarke 1880 (RGS) ellipsoid <4012> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Unknown datum based upon the Clarke 1880 (Arc) ellipsoid <4013> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs no_defs <> # Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid <4014> +proj=longlat +a=6378249.2 +b=6356514.996941779 +no_defs no_defs <> # Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid <4015> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs no_defs <> # Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid <4016> +proj=longlat +ellps=evrstSS +no_defs no_defs <> # Unknown datum based upon the Everest 1830 Modified ellipsoid <4018> +proj=longlat +a=6377304.063 +b=6356103.038993155 +no_defs no_defs <> # Unknown datum based upon the GRS 1980 ellipsoid <4019> +proj=longlat +ellps=GRS80 +no_defs no_defs <> # Unknown datum based upon the Helmert 1906 ellipsoid <4020> +proj=longlat +ellps=helmert +no_defs no_defs <> # Unknown datum based upon the Indonesian National Spheroid <4021> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs no_defs <> # Unknown datum based upon the International 1924 ellipsoid <4022> +proj=longlat +ellps=intl +no_defs no_defs <> # Unknown datum based upon the Krassowsky 1940 ellipsoid <4024> +proj=longlat +ellps=krass +no_defs no_defs <> # Unknown datum based upon the NWL 9D ellipsoid <4025> +proj=longlat +ellps=WGS66 +no_defs no_defs <> # Unknown datum based upon the Plessis 1817 ellipsoid <4027> +proj=longlat +a=6376523 +b=6355862.933255573 +no_defs no_defs <> # Unknown datum based upon the Struve 1860 ellipsoid <4028> +proj=longlat +a=6378298.3 +b=6356657.142669562 +no_defs no_defs <> # Unknown datum based upon the War Office ellipsoid <4029> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs no_defs <> # Unknown datum based upon the WGS 84 ellipsoid <4030> +proj=longlat +ellps=WGS84 +no_defs no_defs <> # Unknown datum based upon the GEM 10C ellipsoid <4031> +proj=longlat +ellps=WGS84 +no_defs no_defs <> # Unknown datum based upon the OSU86F ellipsoid <4032> +proj=longlat +a=6378136.2 +b=6356751.516927429 +no_defs no_defs <> # Unknown datum based upon the OSU91A ellipsoid <4033> +proj=longlat +a=6378136.3 +b=6356751.616592146 +no_defs no_defs <> # Unknown datum based upon the Clarke 1880 ellipsoid <4034> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Unknown datum based upon the Authalic Sphere <4035> +proj=longlat +a=6371000 +b=6371000 +no_defs no_defs <> # Unknown datum based upon the GRS 1967 ellipsoid <4036> +proj=longlat +ellps=GRS67 +no_defs no_defs <> # Unknown datum based upon the Average Terrestrial System 1977 ellipsoid <4041> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs no_defs <> # Unknown datum based upon the Everest (1830 Definition) ellipsoid <4042> +proj=longlat +a=6377299.36559538 +b=6356098.357204817 +no_defs no_defs <> # Unknown datum based upon the WGS 72 ellipsoid <4043> +proj=longlat +ellps=WGS72 +no_defs no_defs <> # Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid <4044> +proj=longlat +a=6377301.243 +b=6356100.230165385 +no_defs no_defs <> # Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid <4045> +proj=longlat +a=6377299.151 +b=6356098.145120132 +no_defs no_defs <> # Unspecified based upon the GRS 1980 Authalic Sphere <4047> +proj=longlat +a=6370997 +b=6370997 +no_defs no_defs <> # Greek <4120> +proj=longlat +ellps=bessel +no_defs no_defs <> # GGRS87 <4121> +proj=longlat +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0 +no_defs no_defs <> # ATS77 <4122> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs no_defs <> # KKJ <4123> +proj=longlat +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +no_defs no_defs <> # RT90 <4124> +proj=longlat +ellps=bessel +no_defs no_defs <> # Samboja <4125> +proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +no_defs no_defs <> # LKS94 (ETRS89) <4126> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Tete <4127> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Madzansua <4128> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Observatario <4129> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Moznet <4130> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs no_defs <> # Indian 1960 <4131> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs no_defs <> # FD58 <4132> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # EST92 <4133> +proj=longlat +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +no_defs no_defs <> # PDO Survey Datum 1993 <4134> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Old Hawaiian <4135> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # St. Lawrence Island <4136> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # St. Paul Island <4137> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # St. George Island <4138> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Puerto Rico <4139> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # NAD83(CSRS98) <4140> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Israel <4141> +proj=longlat +ellps=GRS80 +no_defs no_defs <> # Locodjo 1965 <4142> +proj=longlat +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +no_defs no_defs <> # Abidjan 1987 <4143> +proj=longlat +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +no_defs no_defs <> # Kalianpur 1937 <4144> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs no_defs <> # Kalianpur 1962 <4145> +proj=longlat +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +no_defs no_defs <> # Kalianpur 1975 <4146> +proj=longlat +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +no_defs no_defs <> # Hanoi 1972 <4147> +proj=longlat +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +no_defs no_defs <> # Hartebeesthoek94 <4148> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # CH1903 <4149> +proj=longlat +ellps=bessel +no_defs no_defs <> # CH1903+ <4150> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs no_defs <> # CHTRF95 <4151> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # NAD83(HARN) <4152> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Rassadiran <4153> +proj=longlat +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +no_defs no_defs <> # ED50(ED77) <4154> +proj=longlat +ellps=intl +no_defs no_defs <> # Dabola 1981 <4155> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +no_defs no_defs <> # S-JTSK <4156> +proj=longlat +ellps=bessel +no_defs no_defs <> # Mount Dillon <4157> +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +no_defs no_defs <> # Naparima 1955 <4158> +proj=longlat +ellps=intl +no_defs no_defs <> # ELD79 <4159> +proj=longlat +ellps=intl +no_defs no_defs <> # Chos Malal 1914 <4160> +proj=longlat +ellps=intl +no_defs no_defs <> # Pampa del Castillo <4161> +proj=longlat +ellps=intl +no_defs no_defs <> # Korean 1985 <4162> +proj=longlat +ellps=bessel +no_defs no_defs <> # Yemen NGN96 <4163> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # South Yemen <4164> +proj=longlat +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +no_defs no_defs <> # Bissau <4165> +proj=longlat +ellps=intl +towgs84=-173,253,27,0,0,0,0 +no_defs no_defs <> # Korean 1995 <4166> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # NZGD2000 <4167> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Accra <4168> +proj=longlat +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +no_defs no_defs <> # American Samoa 1962 <4169> +proj=longlat +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +no_defs no_defs <> # SIRGAS <4170> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # RGF93 <4171> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # POSGAR <4172> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # IRENET95 <4173> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Sierra Leone 1924 <4174> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs no_defs <> # Sierra Leone 1968 <4175> +proj=longlat +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +no_defs no_defs <> # Australian Antarctic <4176> +proj=longlat +ellps=GRS80 +no_defs no_defs <> # Pulkovo 1942(83) <4178> +proj=longlat +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +no_defs no_defs <> # Pulkovo 1942(58) <4179> +proj=longlat +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +no_defs no_defs <> # EST97 <4180> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Luxembourg 1930 <4181> +proj=longlat +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +no_defs no_defs <> # Azores Occidental 1939 <4182> +proj=longlat +ellps=intl +no_defs no_defs <> # Azores Central 1948 <4183> +proj=longlat +ellps=intl +no_defs no_defs <> # Azores Oriental 1940 <4184> +proj=longlat +ellps=intl +no_defs no_defs <> # Madeira 1936 <4185> +proj=longlat +ellps=intl +no_defs no_defs <> # OSNI 1952 <4188> +proj=longlat +ellps=airy +no_defs no_defs <> # REGVEN <4189> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # POSGAR 98 <4190> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Albanian 1987 <4191> +proj=longlat +ellps=krass +no_defs no_defs <> # Douala 1948 <4192> +proj=longlat +ellps=intl +no_defs no_defs <> # Manoca 1962 <4193> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs no_defs <> # Qornoq 1927 <4194> +proj=longlat +ellps=intl +no_defs no_defs <> # Scoresbysund 1952 <4195> +proj=longlat +ellps=intl +towgs84=105,326,-102.5,0,0,0.814,-0.6 +no_defs no_defs <> # Ammassalik 1958 <4196> +proj=longlat +ellps=intl +towgs84=-45,417,-3.5,0,0,0.814,-0.6 +no_defs no_defs <> # Garoua <4197> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Kousseri <4198> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Egypt 1930 <4199> +proj=longlat +ellps=intl +no_defs no_defs <> # Pulkovo 1995 <4200> +proj=longlat +ellps=krass +no_defs no_defs <> # Adindan <4201> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # AGD66 <4202> +proj=longlat +ellps=aust_SA +no_defs no_defs <> # AGD84 <4203> +proj=longlat +ellps=aust_SA +no_defs no_defs <> # Ain el Abd <4204> +proj=longlat +ellps=intl +no_defs no_defs <> # Afgooye <4205> +proj=longlat +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +no_defs no_defs <> # Agadez <4206> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Lisbon <4207> +proj=longlat +ellps=intl +no_defs no_defs <> # Aratu <4208> +proj=longlat +ellps=intl +no_defs no_defs <> # Arc 1950 <4209> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs no_defs <> # Arc 1960 <4210> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Batavia <4211> +proj=longlat +ellps=bessel +no_defs no_defs <> # Barbados 1938 <4212> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Beduaram <4213> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Beijing 1954 <4214> +proj=longlat +ellps=krass +no_defs no_defs <> # Belge 1950 <4215> +proj=longlat +ellps=intl +no_defs no_defs <> # Bermuda 1957 <4216> +proj=longlat +ellps=clrk66 +towgs84=-73,213,296,0,0,0,0 +no_defs no_defs <> # Bogota 1975 <4218> +proj=longlat +ellps=intl +no_defs no_defs <> # Bukit Rimpah <4219> +proj=longlat +ellps=bessel +towgs84=-384,664,-48,0,0,0,0 +no_defs no_defs <> # Camacupa <4220> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Campo Inchauspe <4221> +proj=longlat +ellps=intl +no_defs no_defs <> # Cape <4222> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs no_defs <> # Carthage <4223> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Chua <4224> +proj=longlat +ellps=intl +towgs84=-134,229,-29,0,0,0,0 +no_defs no_defs <> # Corrego Alegre <4225> +proj=longlat +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +no_defs no_defs <> # Cote d'Ivoire <4226> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Deir ez Zor <4227> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Douala <4228> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Egypt 1907 <4229> +proj=longlat +ellps=helmert +no_defs no_defs <> # ED50 <4230> +proj=longlat +ellps=intl +no_defs no_defs <> # ED87 <4231> +proj=longlat +ellps=intl +towgs84=-82.981,-99.719,-110.709,-0.5076,0.1503,0.3898,-0.3143 +no_defs no_defs <> # Fahud <4232> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Gandajika 1970 <4233> +proj=longlat +ellps=intl +no_defs no_defs <> # Garoua <4234> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Guyane Francaise <4235> +proj=longlat +ellps=intl +no_defs no_defs <> # Hu Tzu Shan <4236> +proj=longlat +ellps=intl +towgs84=-637,-549,-203,0,0,0,0 +no_defs no_defs <> # HD72 <4237> +proj=longlat +ellps=GRS67 +no_defs no_defs <> # ID74 <4238> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs no_defs <> # Indian 1954 <4239> +proj=longlat +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +no_defs no_defs <> # Indian 1975 <4240> +proj=longlat +a=6377276.345 +b=6356075.413140239 +no_defs no_defs <> # Jamaica 1875 <4241> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # JAD69 <4242> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Kalianpur 1880 <4243> +proj=longlat +a=6377299.36559538 +b=6356098.357204817 +no_defs no_defs <> # Kandawala <4244> +proj=longlat +a=6377276.345 +b=6356075.413140239 +towgs84=-97,787,86,0,0,0,0 +no_defs no_defs <> # Kertau <4245> +proj=longlat +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +no_defs no_defs <> # KOC <4246> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # La Canoa <4247> +proj=longlat +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +no_defs no_defs <> # PSAD56 <4248> +proj=longlat +ellps=intl +no_defs no_defs <> # Lake <4249> +proj=longlat +ellps=intl +no_defs no_defs <> # Leigon <4250> +proj=longlat +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +no_defs no_defs <> # Liberia 1964 <4251> +proj=longlat +ellps=clrk80 +towgs84=-90,40,88,0,0,0,0 +no_defs no_defs <> # Lome <4252> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Luzon 1911 <4253> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Hito XVIII 1963 <4254> +proj=longlat +ellps=intl +towgs84=18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013 +no_defs no_defs <> # Herat North <4255> +proj=longlat +ellps=intl +towgs84=-333,-222,114,0,0,0,0 +no_defs no_defs <> # Mahe 1971 <4256> +proj=longlat +ellps=clrk80 +towgs84=41,-220,-134,0,0,0,0 +no_defs no_defs <> # Makassar <4257> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +no_defs no_defs <> # ETRS89 <4258> +proj=longlat +ellps=GRS80 +no_defs no_defs <> # Malongo 1987 <4259> +proj=longlat +ellps=intl +no_defs no_defs <> # Manoca <4260> +proj=longlat +ellps=clrk80 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs no_defs <> # Merchich <4261> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +no_defs no_defs <> # Massawa <4262> +proj=longlat +ellps=bessel +towgs84=639,405,60,0,0,0,0 +no_defs no_defs <> # Minna <4263> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Mhast <4264> +proj=longlat +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +no_defs no_defs <> # Monte Mario <4265> +proj=longlat +ellps=intl +no_defs no_defs <> # M'poraloko <4266> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # NAD27 <4267> +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs no_defs <> # NAD27 Michigan <4268> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs no_defs <> # NAD83 <4269> +proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs no_defs <> # Nahrwan 1967 <4270> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Naparima 1972 <4271> +proj=longlat +ellps=intl +no_defs no_defs <> # NZGD49 <4272> +proj=longlat +ellps=intl +no_defs no_defs <> # NGO 1948 <4273> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +no_defs no_defs <> # Datum 73 <4274> +proj=longlat +ellps=intl +no_defs no_defs <> # NTF <4275> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs no_defs <> # NSWC 9Z-2 <4276> +proj=longlat +ellps=WGS66 +no_defs no_defs <> # OSGB 1936 <4277> +proj=longlat +ellps=airy +no_defs no_defs <> # OSGB70 <4278> +proj=longlat +ellps=airy +no_defs no_defs <> # OS(SN)80 <4279> +proj=longlat +ellps=airy +no_defs no_defs <> # Padang <4280> +proj=longlat +ellps=bessel +no_defs no_defs <> # Palestine 1923 <4281> +proj=longlat +a=6378300.789 +b=6356566.435 +no_defs no_defs <> # Pointe Noire <4282> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # GDA94 <4283> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Pulkovo 1942 <4284> +proj=longlat +ellps=krass +no_defs no_defs <> # Qatar 1974 <4285> +proj=longlat +ellps=intl +no_defs no_defs <> # Qatar 1948 <4286> +proj=longlat +ellps=helmert +no_defs no_defs <> # Qornoq <4287> +proj=longlat +ellps=intl +towgs84=164,138,-189,0,0,0,0 +no_defs no_defs <> # Loma Quintana <4288> +proj=longlat +ellps=intl +no_defs no_defs <> # Amersfoort <4289> +proj=longlat +ellps=bessel +no_defs no_defs <> # SAD69 <4291> +proj=longlat +ellps=GRS67 +no_defs no_defs <> # Sapper Hill 1943 <4292> +proj=longlat +ellps=intl +towgs84=-355,21,72,0,0,0,0 +no_defs no_defs <> # Schwarzeck <4293> +proj=longlat +ellps=bess_nam +no_defs no_defs <> # Segora <4294> +proj=longlat +ellps=bessel +no_defs no_defs <> # Serindung <4295> +proj=longlat +ellps=bessel +no_defs no_defs <> # Sudan <4296> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Tananarive <4297> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +no_defs no_defs <> # Timbalai 1948 <4298> +proj=longlat +ellps=evrstSS +no_defs no_defs <> # TM65 <4299> +proj=longlat +a=6377340.189 +b=6356034.447938534 +no_defs no_defs <> # TM75 <4300> +proj=longlat +a=6377340.189 +b=6356034.447938534 +no_defs no_defs <> # Tokyo <4301> +proj=longlat +ellps=bessel +no_defs no_defs <> # Trinidad 1903 <4302> +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0 +no_defs no_defs <> # TC(1948) <4303> +proj=longlat +ellps=helmert +no_defs no_defs <> # Voirol 1875 <4304> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +no_defs no_defs <> # Bern 1938 <4306> +proj=longlat +ellps=bessel +no_defs no_defs <> # Nord Sahara 1959 <4307> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # RT38 <4308> +proj=longlat +ellps=bessel +no_defs no_defs <> # Yacare <4309> +proj=longlat +ellps=intl +towgs84=-155,171,37,0,0,0,0 +no_defs no_defs <> # Yoff <4310> +proj=longlat +a=6378249.2 +b=6356515 +no_defs no_defs <> # Zanderij <4311> +proj=longlat +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +no_defs no_defs <> # MGI <4312> +proj=longlat +ellps=bessel +no_defs no_defs <> # Belge 1972 <4313> +proj=longlat +ellps=intl +no_defs no_defs <> # DHDN <4314> +proj=longlat +ellps=bessel +no_defs no_defs <> # Conakry 1905 <4315> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +no_defs no_defs <> # Dealul Piscului 1933 <4316> +proj=longlat +ellps=intl +towgs84=103.25,-100.4,-307.19,0,0,0,0 +no_defs no_defs <> # Dealul Piscului 1970 <4317> +proj=longlat +ellps=krass +no_defs no_defs <> # NGN <4318> +proj=longlat +ellps=WGS84 +no_defs no_defs <> # KUDAMS <4319> +proj=longlat +ellps=GRS80 +no_defs no_defs <> # WGS 72 <4322> +proj=longlat +ellps=WGS72 +no_defs no_defs <> # WGS 72BE <4324> +proj=longlat +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +no_defs no_defs <> # WGS 84 <4326> +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs no_defs <> # Anguilla 1957 <4600> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # Antigua 1943 <4601> +proj=longlat +ellps=clrk80 +towgs84=-255,-15,71,0,0,0,0 +no_defs no_defs <> # Dominica 1945 <4602> +proj=longlat +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +no_defs no_defs <> # Grenada 1953 <4603> +proj=longlat +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +no_defs no_defs <> # Montserrat 1958 <4604> +proj=longlat +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +no_defs no_defs <> # St. Kitts 1955 <4605> +proj=longlat +ellps=clrk80 +towgs84=9,183,236,0,0,0,0 +no_defs no_defs <> # St. Lucia 1955 <4606> +proj=longlat +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +no_defs no_defs <> # St. Vincent 1945 <4607> +proj=longlat +ellps=clrk80 +no_defs no_defs <> # NAD27(76) <4608> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # NAD27(CGQ77) <4609> +proj=longlat +ellps=clrk66 +no_defs no_defs <> # Xian 1980 <4610> +proj=longlat +a=6378140 +b=6356755.288157528 +no_defs no_defs <> # Hong Kong 1980 <4611> +proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +no_defs no_defs <> # JGD2000 <4612> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Segara <4613> +proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +no_defs no_defs <> # QND95 <4614> +proj=longlat +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +no_defs no_defs <> # Porto Santo <4615> +proj=longlat +ellps=intl +no_defs no_defs <> # Selvagem Grande <4616> +proj=longlat +ellps=intl +no_defs no_defs <> # NAD83(CSRS) <4617> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs no_defs <> # Bern 1898 (Bern) <4801> +proj=longlat +ellps=bessel +pm=bern +no_defs no_defs <> # Bogota 1975 (Bogota) <4802> +proj=longlat +ellps=intl +pm=bogota +no_defs no_defs <> # Lisbon (Lisbon) <4803> +proj=longlat +ellps=intl +pm=lisbon +no_defs no_defs <> # Makassar (Jakarta) <4804> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +no_defs no_defs <> # MGI (Ferro) <4805> +proj=longlat +ellps=bessel +pm=ferro +no_defs no_defs <> # Monte Mario (Rome) <4806> +proj=longlat +ellps=intl +pm=rome +no_defs no_defs <> # NTF (Paris) <4807> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs no_defs <> # Padang (Jakarta) <4808> +proj=longlat +ellps=bessel +pm=jakarta +no_defs no_defs <> # Belge 1950 (Brussels) <4809> +proj=longlat +ellps=intl +pm=brussels +no_defs no_defs <> # Tananarive (Paris) <4810> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +no_defs no_defs <> # Voirol 1875 (Paris) <4811> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +pm=paris +no_defs no_defs <> # Batavia (Jakarta) <4813> +proj=longlat +ellps=bessel +pm=jakarta +no_defs no_defs <> # RT38 (Stockholm) <4814> +proj=longlat +ellps=bessel +pm=stockholm +no_defs no_defs <> # Greek (Athens) <4815> +proj=longlat +ellps=bessel +pm=athens +no_defs no_defs <> # Carthage (Paris) <4816> +proj=longlat +a=6378249.2 +b=6356515 +pm=paris +no_defs no_defs <> # NGO 1948 (Oslo) <4817> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +no_defs no_defs <> # S-JTSK (Ferro) <4818> +proj=longlat +ellps=bessel +pm=ferro +no_defs no_defs <> # Nord Sahara 1959 (Paris) <4819> +proj=longlat +ellps=clrk80 +pm=paris +no_defs no_defs <> # Segara (Jakarta) <4820> +proj=longlat +ellps=bessel +pm=jakarta +no_defs no_defs <> # ATF (Paris) <4901> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris +no_defs no_defs <> # NDG (Paris) <4902> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris +no_defs no_defs <> # Madrid 1870 (Madrid) <4903> +proj=longlat +a=6378298.3 +b=6356657.142669562 +pm=madrid +no_defs no_defs <> # Lisbon 1890 (Lisbon) <4904> +proj=longlat +ellps=bessel +pm=lisbon +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 4 <20004> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 5 <20005> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 6 <20006> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 7 <20007> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 8 <20008> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 9 <20009> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 10 <20010> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 11 <20011> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 12 <20012> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 13 <20013> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 14 <20014> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 15 <20015> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 16 <20016> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 17 <20017> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 18 <20018> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 19 <20019> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 20 <20020> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 21 <20021> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 22 <20022> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 23 <20023> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 24 <20024> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 25 <20025> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 26 <20026> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 27 <20027> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 28 <20028> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 29 <20029> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 30 <20030> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 31 <20031> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 32 <20032> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 4N <20064> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 5N <20065> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 6N <20066> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 7N <20067> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 8N <20068> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 9N <20069> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 10N <20070> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 11N <20071> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 12N <20072> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 13N <20073> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 14N <20074> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 15N <20075> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 16N <20076> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 17N <20077> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 18N <20078> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 19N <20079> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 20N <20080> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 21N <20081> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 22N <20082> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 23N <20083> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 24N <20084> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 25N <20085> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 26N <20086> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 27N <20087> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 28N <20088> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 29N <20089> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 30N <20090> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 31N <20091> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1995 / Gauss-Kruger 32N <20092> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Adindan / UTM zone 37N <20137> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs no_defs <> # Adindan / UTM zone 38N <20138> +proj=utm +zone=38 +ellps=clrk80 +units=m +no_defs no_defs <> # AGD66 / AMG zone 48 <20248> +proj=utm +zone=48 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 49 <20249> +proj=utm +zone=49 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 50 <20250> +proj=utm +zone=50 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 51 <20251> +proj=utm +zone=51 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 52 <20252> +proj=utm +zone=52 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 53 <20253> +proj=utm +zone=53 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 54 <20254> +proj=utm +zone=54 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 55 <20255> +proj=utm +zone=55 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 56 <20256> +proj=utm +zone=56 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 57 <20257> +proj=utm +zone=57 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD66 / AMG zone 58 <20258> +proj=utm +zone=58 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 48 <20348> +proj=utm +zone=48 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 49 <20349> +proj=utm +zone=49 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 50 <20350> +proj=utm +zone=50 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 51 <20351> +proj=utm +zone=51 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 52 <20352> +proj=utm +zone=52 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 53 <20353> +proj=utm +zone=53 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 54 <20354> +proj=utm +zone=54 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 55 <20355> +proj=utm +zone=55 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 56 <20356> +proj=utm +zone=56 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 57 <20357> +proj=utm +zone=57 +south +ellps=aust_SA +units=m +no_defs no_defs <> # AGD84 / AMG zone 58 <20358> +proj=utm +zone=58 +south +ellps=aust_SA +units=m +no_defs no_defs <> # Ain el Abd / UTM zone 37N <20437> +proj=utm +zone=37 +ellps=intl +units=m +no_defs no_defs <> # Ain el Abd / UTM zone 38N <20438> +proj=utm +zone=38 +ellps=intl +units=m +no_defs no_defs <> # Ain el Abd / UTM zone 39N <20439> +proj=utm +zone=39 +ellps=intl +units=m +no_defs no_defs <> # Ain el Abd / Bahrain Grid <20499> +proj=utm +zone=39 +ellps=intl +units=m +no_defs no_defs <> # Afgooye / UTM zone 38N <20538> +proj=utm +zone=38 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs no_defs <> # Afgooye / UTM zone 39N <20539> +proj=utm +zone=39 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs no_defs <> # Lisbon (Lisbon)/Portuguese National Grid <20790> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=200000 +y_0=300000 +ellps=intl +pm=lisbon +units=m +no_defs no_defs <> # Lisbon (Lisbon)/Portuguese Grid <20791> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=0 +y_0=0 +ellps=intl +pm=lisbon +units=m +no_defs no_defs <> # Aratu / UTM zone 22S <20822> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs no_defs <> # Aratu / UTM zone 23S <20823> +proj=utm +zone=23 +south +ellps=intl +units=m +no_defs no_defs <> # Aratu / UTM zone 24S <20824> +proj=utm +zone=24 +south +ellps=intl +units=m +no_defs no_defs <> # Arc 1950 / UTM zone 34S <20934> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs no_defs <> # Arc 1950 / UTM zone 35S <20935> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs no_defs <> # Arc 1950 / UTM zone 36S <20936> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs no_defs <> # Arc 1960 / UTM zone 35S <21035> +proj=utm +zone=35 +south +ellps=clrk80 +units=m +no_defs no_defs <> # Arc 1960 / UTM zone 36S <21036> +proj=utm +zone=36 +south +ellps=clrk80 +units=m +no_defs no_defs <> # Arc 1960 / UTM zone 37S <21037> +proj=utm +zone=37 +south +ellps=clrk80 +units=m +no_defs no_defs <> # Arc 1960 / UTM zone 35N <21095> +proj=utm +zone=35 +ellps=clrk80 +units=m +no_defs no_defs <> # Arc 1960 / UTM zone 36N <21096> +proj=utm +zone=36 +ellps=clrk80 +units=m +no_defs no_defs <> # Arc 1960 / UTM zone 37N <21097> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs no_defs <> # Batavia (Jakarta) / NEIEZ <21100> +proj=merc +lat_ts=0 +lon_0=216.8077194444444 +k=0.997000 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m +no_defs no_defs <> # Batavia / UTM zone 48S <21148> +proj=utm +zone=48 +south +ellps=bessel +units=m +no_defs no_defs <> # Batavia / UTM zone 49S <21149> +proj=utm +zone=49 +south +ellps=bessel +units=m +no_defs no_defs <> # Batavia / UTM zone 50S <21150> +proj=utm +zone=50 +south +ellps=bessel +units=m +no_defs no_defs <> # Barbados 1938 / British West Indies Grid <21291> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.999500 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs no_defs <> # Barbados 1938 / Barbados National Grid <21292> +proj=tmerc +lat_0=13.17638888888889 +lon_0=-59.55972222222222 +k=0.999999 +x_0=30000 +y_0=75000 +ellps=clrk80 +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 13 <21413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 14 <21414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 15 <21415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 16 <21416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 17 <21417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 18 <21418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 19 <21419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 20 <21420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 21 <21421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 22 <21422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger zone 23 <21423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 75E <21453> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 81E <21454> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 87E <21455> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 93E <21456> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 99E <21457> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 105E <21458> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 111E <21459> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 117E <21460> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 123E <21461> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 129E <21462> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger CM 135E <21463> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 13N <21473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 14N <21474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 15N <21475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 16N <21476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 17N <21477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 18N <21478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 19N <21479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 20N <21480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 21N <21481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 22N <21482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Beijing 1954 / Gauss-Kruger 23N <21483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Belge 1950 (Brussels) / Belge Lambert 50 <21500> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.367975 +x_0=150000 +y_0=5400000 +ellps=intl +pm=brussels +units=m +no_defs no_defs <> # Bern 1898 (Bern) / LV03C <21780> +proj=omerc +lat_0=46.95240555555556 +lonc=7.439583333333333 +alpha=90 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=bern +units=m +no_defs no_defs <> # CH1903 / LV03 <21781> +proj=omerc +lat_0=46.95240555555556 +lonc=7.439583333333333 +alpha=90 +k=1 +x_0=600000 +y_0=200000 +ellps=bessel +units=m +no_defs no_defs <> # Bogota 1975 / UTM zone 17N <21817> +proj=utm +zone=17 +ellps=intl +units=m +no_defs no_defs <> # Bogota 1975 / UTM zone 18N <21818> +proj=utm +zone=18 +ellps=intl +units=m +no_defs no_defs <> # Bogota 1975 / Colombia West zone <21891> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs no_defs <> # Bogota 1975 / Colombia Bogota zone <21892> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs no_defs <> # Bogota 1975 / Colombia East Central zone <21893> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs no_defs <> # Bogota 1975 / Colombia East <21894> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1.000000 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs no_defs <> # Camacupa / UTM zone 32S <22032> +proj=utm +zone=32 +south +ellps=clrk80 +units=m +no_defs no_defs <> # Camacupa / UTM zone 33S <22033> +proj=utm +zone=33 +south +ellps=clrk80 +units=m +no_defs no_defs <> # Camacupa / TM 11.30 SE <22091> +proj=tmerc +lat_0=0 +lon_0=11.5 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs no_defs <> # Camacupa / TM 12 SE <22092> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 1 <22191> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 2 <22192> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 3 <22193> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 4 <22194> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 5 <22195> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 6 <22196> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Campo Inchauspe / Argentina 7 <22197> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Cape / UTM zone 34S <22234> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs no_defs <> # Cape / UTM zone 35S <22235> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs no_defs <> # Cape / UTM zone 36S <22236> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs no_defs <> # South African Coordinate System zone 15 # South African Coordinate System zone 17 # South African Coordinate System zone 19 # South African Coordinate System zone 21 # South African Coordinate System zone 23 # South African Coordinate System zone 25 # South African Coordinate System zone 27 # South African Coordinate System zone 29 # South African Coordinate System zone 31 # South African Coordinate System zone 33 # Carthage (Paris) / Tunisia Mining Grid # Carthage / UTM zone 32N <22332> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Carthage / Nord Tunisie <22391> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Carthage / Sud Tunisie <22392> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=9.9 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Corrego Alegre / UTM zone 23S <22523> +proj=utm +zone=23 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs no_defs <> # Corrego Alegre / UTM zone 24S <22524> +proj=utm +zone=24 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs no_defs <> # Deir ez Zor / Levant Zone <22700> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Deir ez Zor / Syria Lambert <22770> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Deir ez Zor / Levant Stereographic <22780> +proj=stere +lat_0=34.2 +lon_0=39.15 +k=0.999534 +x_0=0 +y_0=0 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Douala / UTM zone 32N <22832> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Egypt 1907 / Blue Belt <22991> +proj=tmerc +lat_0=30 +lon_0=35 +k=1.000000 +x_0=300000 +y_0=1100000 +ellps=helmert +units=m +no_defs no_defs <> # Egypt 1907 / Red Belt <22992> +proj=tmerc +lat_0=30 +lon_0=31 +k=1.000000 +x_0=615000 +y_0=810000 +ellps=helmert +units=m +no_defs no_defs <> # Egypt 1907 / Purple Belt <22993> +proj=tmerc +lat_0=30 +lon_0=27 +k=1.000000 +x_0=700000 +y_0=200000 +ellps=helmert +units=m +no_defs no_defs <> # Egypt 1907 / Extended Purple Belt <22994> +proj=tmerc +lat_0=30 +lon_0=27 +k=1.000000 +x_0=700000 +y_0=1200000 +ellps=helmert +units=m +no_defs no_defs <> # ED50 / UTM zone 28N <23028> +proj=utm +zone=28 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 29N <23029> +proj=utm +zone=29 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 30N <23030> +proj=utm +zone=30 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 31N <23031> +proj=utm +zone=31 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 32N <23032> +proj=utm +zone=32 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 33N <23033> +proj=utm +zone=33 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 34N <23034> +proj=utm +zone=34 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 35N <23035> +proj=utm +zone=35 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 36N <23036> +proj=utm +zone=36 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 37N <23037> +proj=utm +zone=37 +ellps=intl +units=m +no_defs no_defs <> # ED50 / UTM zone 38N <23038> +proj=utm +zone=38 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM 0 N <23090> +proj=tmerc +lat_0=0 +lon_0=0 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # ED50 / TM 5 NE <23095> +proj=tmerc +lat_0=0 +lon_0=5 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs no_defs <> # Fahud / UTM zone 39N <23239> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs no_defs <> # Fahud / UTM zone 40N <23240> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs no_defs <> # Garoua / UTM zone 33N <23433> +proj=utm +zone=33 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # HD72 / EOV <23700> +proj=omerc +lat_0=47.14439372222222 +lonc=19.04857177777778 +alpha=90 +k=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +units=m +no_defs no_defs <> # ID74 / UTM zone 46N <23846> +proj=utm +zone=46 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 47N <23847> +proj=utm +zone=47 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 48N <23848> +proj=utm +zone=48 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 49N <23849> +proj=utm +zone=49 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 50N <23850> +proj=utm +zone=50 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 51N <23851> +proj=utm +zone=51 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 52N <23852> +proj=utm +zone=52 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 53N <23853> +proj=utm +zone=53 +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 46S <23886> +proj=utm +zone=46 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 47S <23887> +proj=utm +zone=47 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 48S <23888> +proj=utm +zone=48 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 49S <23889> +proj=utm +zone=49 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 50S <23890> +proj=utm +zone=50 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 51S <23891> +proj=utm +zone=51 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 52S <23892> +proj=utm +zone=52 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 53S <23893> +proj=utm +zone=53 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # ID74 / UTM zone 54S <23894> +proj=utm +zone=54 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs no_defs <> # Indian 1954 / UTM zone 46N <23946> +proj=utm +zone=46 +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs no_defs <> # Indian 1954 / UTM zone 47N <23947> +proj=utm +zone=47 +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs no_defs <> # Indian 1954 / UTM zone 48N <23948> +proj=utm +zone=48 +a=6377276.345 +b=6356075.413140239 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs no_defs <> # Indian 1975 / UTM zone 47N <24047> +proj=utm +zone=47 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Indian 1975 / UTM zone 48N <24048> +proj=utm +zone=48 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Jamaica 1875 / Jamaica (Old Grid) <24100> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=167638.49575 +y_0=121918.906 +ellps=clrk80 +to_meter=0.304797265 +no_defs no_defs <> # JAD69 / Jamaica National Grid <24200> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=250000 +y_0=150000 +ellps=clrk66 +units=m +no_defs no_defs <> # Kalianpur 1937 / UTM zone 45N <24305> +proj=utm +zone=45 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Kalianpur 1937 / UTM zone 46N <24306> +proj=utm +zone=46 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Kalianpur 1962 / UTM zone 41N <24311> +proj=utm +zone=41 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1962 / UTM zone 42N <24312> +proj=utm +zone=42 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1962 / UTM zone 43N <24313> +proj=utm +zone=43 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / UTM zone 42N <24342> +proj=utm +zone=42 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / UTM zone 43N <24343> +proj=utm +zone=43 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / UTM zone 44N <24344> +proj=utm +zone=44 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / UTM zone 45N <24345> +proj=utm +zone=45 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / UTM zone 46N <24346> +proj=utm +zone=46 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / UTM zone 47N <24347> +proj=utm +zone=47 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1880 / India zone 0 <24370> +proj=lcc +lat_1=39.5 +lat_0=39.5 +lon_0=68 +k_0=0.99846154 +x_0=2153865.73916853 +y_0=2368292.194628102 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs no_defs <> # Kalianpur 1880 / India zone I <24371> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs no_defs <> # Kalianpur 1880 / India zone IIa <24372> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs no_defs <> # Kalianpur 1880 / India zone III <24373> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs no_defs <> # Kalianpur 1880 / India zone IV <24374> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs no_defs <> # Kalianpur 1937 / India zone IIb <24375> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743185.69 +y_0=914395.23 +a=6377276.345 +b=6356075.413140239 +units=m +no_defs no_defs <> # Kalianpur 1962 / India zone I <24376> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1962 / India zone IIa <24377> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165385 +towgs84=283,682,231,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / India zone I <24378> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / India zone IIa <24379> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / India zone IIb <24380> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1975 / India zone III <24381> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kalianpur 1880 / India zone IIb <24382> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204817 +to_meter=0.9143985307444408 +no_defs no_defs <> # Kalianpur 1975 / India zone IV <24383> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs no_defs <> # Kertau / Singapore Grid <24500> +proj=cass +lat_0=1.287646666666667 +lon_0=103.8530022222222 +x_0=30000 +y_0=30000 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs no_defs <> # Kertau / UTM zone 47N <24547> +proj=utm +zone=47 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs no_defs <> # Kertau / UTM zone 48N <24548> +proj=utm +zone=48 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs no_defs <> # Kertau / R.S.O. Malaya (ch) <24571> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804671.2997750348 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +to_meter=20.11678249437587 +no_defs no_defs <> # KOC Lambert <24600> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m +no_defs no_defs <> # La Canoa / UTM zone 18N <24718> +proj=utm +zone=18 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs no_defs <> # La Canoa / UTM zone 19N <24719> +proj=utm +zone=19 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs no_defs <> # La Canoa / UTM zone 20N <24720> +proj=utm +zone=20 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs no_defs <> # PSAD56 / UTM zone 18N <24818> +proj=utm +zone=18 +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 19N <24819> +proj=utm +zone=19 +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 20N <24820> +proj=utm +zone=20 +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 21N <24821> +proj=utm +zone=21 +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 17S <24877> +proj=utm +zone=17 +south +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 18S <24878> +proj=utm +zone=18 +south +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 19S <24879> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 20S <24880> +proj=utm +zone=20 +south +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / UTM zone 22S <24882> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / Peru west zone <24891> +proj=tmerc +lat_0=-6 +lon_0=-80.5 +k=0.999830 +x_0=222000 +y_0=1426834.743 +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / Peru central zone <24892> +proj=tmerc +lat_0=-9.5 +lon_0=-76 +k=0.999330 +x_0=720000 +y_0=1039979.159 +ellps=intl +units=m +no_defs no_defs <> # PSAD56 / Peru east zone <24893> +proj=tmerc +lat_0=-9.5 +lon_0=-70.5 +k=0.999530 +x_0=1324000 +y_0=1040084.558 +ellps=intl +units=m +no_defs no_defs <> # Leigon / Ghana Metre Grid <25000> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.999750 +x_0=274319.51 +y_0=0 +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +units=m +no_defs no_defs <> # Lome / UTM zone 31N <25231> +proj=utm +zone=31 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Luzon 1911 / Philippines zone I <25391> +proj=tmerc +lat_0=0 +lon_0=117 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # Luzon 1911 / Philippines zone II <25392> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # Luzon 1911 / Philippines zone III <25393> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # Luzon 1911 / Philippines zone IV <25394> +proj=tmerc +lat_0=0 +lon_0=123 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # Luzon 1911 / Philippines zone V <25395> +proj=tmerc +lat_0=0 +lon_0=125 +k=0.999950 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs no_defs <> # Makassar (Jakarta) / NEIEZ <25700> +proj=merc +lat_ts=0 +lon_0=216.8077194444444 +k=0.997000 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +units=m +no_defs no_defs <> # ETRS89 / UTM zone 28N <25828> +proj=utm +zone=28 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 29N <25829> +proj=utm +zone=29 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 30N <25830> +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 31N <25831> +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 32N <25832> +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 33N <25833> +proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 34N <25834> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 35N <25835> +proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 36N <25836> +proj=utm +zone=36 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 37N <25837> +proj=utm +zone=37 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / UTM zone 38N <25838> +proj=utm +zone=38 +ellps=GRS80 +units=m +no_defs no_defs <> # ETRS89 / TM Baltic93 <25884> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # Malongo 1987 / UTM zone 32S <25932> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs no_defs <> # Merchich / Nord Maroc <26191> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs no_defs <> # Merchich / Sud Maroc <26192> +proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs no_defs <> # Merchich / Sahara <26193> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs no_defs <> # Massawa / UTM zone 37N <26237> +proj=utm +zone=37 +ellps=bessel +towgs84=639,405,60,0,0,0,0 +units=m +no_defs no_defs <> # Minna / UTM zone 31N <26331> +proj=utm +zone=31 +ellps=clrk80 +units=m +no_defs no_defs <> # Minna / UTM zone 32N <26332> +proj=utm +zone=32 +ellps=clrk80 +units=m +no_defs no_defs <> # Minna / Nigeria West Belt <26391> +proj=tmerc +lat_0=4 +lon_0=4.5 +k=0.999750 +x_0=230738.26 +y_0=0 +ellps=clrk80 +units=m +no_defs no_defs <> # Minna / Nigeria Mid Belt <26392> +proj=tmerc +lat_0=4 +lon_0=8.5 +k=0.999750 +x_0=670553.98 +y_0=0 +ellps=clrk80 +units=m +no_defs no_defs <> # Minna / Nigeria East Belt <26393> +proj=tmerc +lat_0=4 +lon_0=12.5 +k=0.999750 +x_0=1110369.7 +y_0=0 +ellps=clrk80 +units=m +no_defs no_defs <> # Mhast / UTM zone 32S <26432> +proj=utm +zone=32 +south +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +units=m +no_defs no_defs <> # Monte Mario (Rome) / Italy zone 1 <26591> +proj=tmerc +lat_0=0 +lon_0=21.45233333333333 +k=0.999600 +x_0=1500000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs no_defs <> # Monte Mario (Rome) / Italy zone 2 <26592> +proj=tmerc +lat_0=0 +lon_0=27.45233333333333 +k=0.999600 +x_0=2520000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs no_defs <> # M'poraloko / UTM zone 32N <26632> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # M'poraloko / UTM zone 32S <26692> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # NAD27 / UTM zone 3N <26703> +proj=utm +zone=3 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 4N <26704> +proj=utm +zone=4 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 5N <26705> +proj=utm +zone=5 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 6N <26706> +proj=utm +zone=6 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 7N <26707> +proj=utm +zone=7 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 8N <26708> +proj=utm +zone=8 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 9N <26709> +proj=utm +zone=9 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 10N <26710> +proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 11N <26711> +proj=utm +zone=11 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 12N <26712> +proj=utm +zone=12 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 13N <26713> +proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 14N <26714> +proj=utm +zone=14 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 15N <26715> +proj=utm +zone=15 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 16N <26716> +proj=utm +zone=16 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 17N <26717> +proj=utm +zone=17 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 18N <26718> +proj=utm +zone=18 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 19N <26719> +proj=utm +zone=19 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 20N <26720> +proj=utm +zone=20 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 21N <26721> +proj=utm +zone=21 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / UTM zone 22N <26722> +proj=utm +zone=22 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / Alabama East <26729> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alabama West <26730> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 1 <26731> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000.001016002 +y_0=-5000000.001016002 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 2 <26732> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 3 <26733> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 4 <26734> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 5 <26735> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 6 <26736> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 7 <26737> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.999900 +x_0=213360.4267208534 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 8 <26738> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 9 <26739> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.999900 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Alaska zone 10 <26740> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=914401.8288036576 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone I <26741> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone II <26742> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone III <26743> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone IV <26744> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone V <26745> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone VI <26746> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / California zone VII <26747> +proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=127079.524511049 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Arizona East <26748> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Arizona Central <26749> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Arizona West <26750> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Arkansas North <26751> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Arkansas South <26752> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Colorado North <26753> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Colorado Central <26754> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Colorado South <26755> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Connecticut <26756> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Delaware <26757> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Florida East <26758> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Florida West <26759> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Florida North <26760> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Georgia East <26766> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Georgia West <26767> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Idaho East <26768> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Idaho Central <26769> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Idaho West <26770> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Illinois East <26771> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Illinois West <26772> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Indiana East <26773> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Indiana West <26774> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Iowa North <26775> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Iowa South <26776> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Kansas North <26777> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Kansas South <26778> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Kentucky North <26779> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Kentucky South <26780> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Louisiana North <26781> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.66666666666667 +lon_0=-92.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Louisiana South <26782> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Maine East <26783> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-68.5 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Maine West <26784> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Maryland <26785> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.83333333333334 +lon_0=-77 +x_0=243840.4876809754 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Massachusetts Mainland <26786> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Massachusetts Island <26787> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=60960.12192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Minnesota North <26791> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Minnesota Central <26792> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Minnesota South <26793> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Mississippi East <26794> +proj=tmerc +lat_0=29.66666666666667 +lon_0=-88.83333333333333 +k=0.999960 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Mississippi West <26795> +proj=tmerc +lat_0=30.5 +lon_0=-90.33333333333333 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Missouri East <26796> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Missouri Central <26797> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Missouri West <26798> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD Michigan / Michigan East <26801> +proj=tmerc +lat_0=41.5 +lon_0=-83.66666666666667 +k=0.999943 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD Michigan / Michigan Old Central <26802> +proj=tmerc +lat_0=41.5 +lon_0=-85.75 +k=0.999909 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD Michigan / Michigan West <26803> +proj=tmerc +lat_0=41.5 +lon_0=-88.75 +k=0.999909 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD Michigan / Michigan North <26811> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD Michigan / Michigan Central <26812> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD Michigan / Michigan South <26813> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD83 / UTM zone 3N <26903> +proj=utm +zone=3 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 4N <26904> +proj=utm +zone=4 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 5N <26905> +proj=utm +zone=5 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 6N <26906> +proj=utm +zone=6 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 7N <26907> +proj=utm +zone=7 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 8N <26908> +proj=utm +zone=8 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 9N <26909> +proj=utm +zone=9 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 10N <26910> +proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 11N <26911> +proj=utm +zone=11 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 12N <26912> +proj=utm +zone=12 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 13N <26913> +proj=utm +zone=13 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 14N <26914> +proj=utm +zone=14 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 15N <26915> +proj=utm +zone=15 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 16N <26916> +proj=utm +zone=16 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 17N <26917> +proj=utm +zone=17 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 18N <26918> +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 19N <26919> +proj=utm +zone=19 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 20N <26920> +proj=utm +zone=20 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 21N <26921> +proj=utm +zone=21 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 22N <26922> +proj=utm +zone=22 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / UTM zone 23N <26923> +proj=utm +zone=23 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alabama East <26929> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alabama West <26930> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 1 <26931> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 2 <26932> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 3 <26933> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 4 <26934> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 5 <26935> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 6 <26936> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 7 <26937> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 8 <26938> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 9 <26939> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Alaska zone 10 <26940> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / California zone 1 <26941> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / California zone 2 <26942> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / California zone 3 <26943> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / California zone 4 <26944> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / California zone 5 <26945> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / California zone 6 <26946> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Arizona East <26948> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Arizona Central <26949> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Arizona West <26950> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Arkansas North <26951> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Arkansas South <26952> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Colorado North <26953> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Colorado Central <26954> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Colorado South <26955> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Connecticut <26956> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Delaware <26957> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Florida East <26958> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Florida West <26959> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Florida North <26960> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Hawaii zone 1 <26961> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Hawaii zone 2 <26962> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Hawaii zone 3 <26963> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Hawaii zone 4 <26964> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Hawaii zone 5 <26965> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Georgia East <26966> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Georgia West <26967> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Idaho East <26968> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Idaho Central <26969> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Idaho West <26970> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Illinois East <26971> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Illinois West <26972> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Indiana East <26973> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Indiana West <26974> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Iowa North <26975> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Iowa South <26976> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Kansas North <26977> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Kansas South <26978> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Kentucky North <26979> +proj=lcc +lat_1=37.96666666666667 +lat_2=37.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Kentucky South <26980> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Louisiana North <26981> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Louisiana South <26982> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Maine East <26983> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Maine West <26984> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Maryland <26985> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Massachusetts Mainland <26986> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Massachusetts Island <26987> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Michigan North <26988> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Michigan Central <26989> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Michigan South <26990> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Minnesota North <26991> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Minnesota Central <26992> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Minnesota South <26993> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Mississippi East <26994> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Mississippi West <26995> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Missouri East <26996> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Missouri Central <26997> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Missouri West <26998> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # Nahrwan 1967 / UTM zone 38N <27038> +proj=utm +zone=38 +ellps=clrk80 +units=m +no_defs no_defs <> # Nahrwan 1967 / UTM zone 39N <27039> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs no_defs <> # Nahrwan 1967 / UTM zone 40N <27040> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs no_defs <> # Naparima 1972 / UTM zone 20N <27120> +proj=utm +zone=20 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / New Zealand Map Grid <27200> +proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Mount Eden Circuit <27205> +proj=tmerc +lat_0=-36.87986527777778 +lon_0=174.7643393611111 +k=0.999900 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Bay of Plenty Circuit <27206> +proj=tmerc +lat_0=-37.76124980555556 +lon_0=176.46619725 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Poverty Bay Circuit <27207> +proj=tmerc +lat_0=-38.62470277777778 +lon_0=177.8856362777778 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Hawkes Bay Circuit <27208> +proj=tmerc +lat_0=-39.65092930555556 +lon_0=176.6736805277778 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Taranaki Circuit <27209> +proj=tmerc +lat_0=-39.13575830555556 +lon_0=174.22801175 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Tuhirangi Circuit <27210> +proj=tmerc +lat_0=-39.51247038888889 +lon_0=175.6400368055556 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Wanganui Circuit <27211> +proj=tmerc +lat_0=-40.24194713888889 +lon_0=175.4880996111111 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Wairarapa Circuit <27212> +proj=tmerc +lat_0=-40.92553263888889 +lon_0=175.6473496666667 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Wellington Circuit <27213> +proj=tmerc +lat_0=-41.30131963888888 +lon_0=174.7766231111111 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Collingwood Circuit <27214> +proj=tmerc +lat_0=-40.71475905555556 +lon_0=172.6720465 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Nelson Circuit <27215> +proj=tmerc +lat_0=-41.27454472222222 +lon_0=173.2993168055555 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Karamea Circuit <27216> +proj=tmerc +lat_0=-41.28991152777778 +lon_0=172.1090281944444 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Buller Circuit <27217> +proj=tmerc +lat_0=-41.81080286111111 +lon_0=171.5812600555556 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Grey Circuit <27218> +proj=tmerc +lat_0=-42.33369427777778 +lon_0=171.5497713055556 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Amuri Circuit <27219> +proj=tmerc +lat_0=-42.68911658333333 +lon_0=173.0101333888889 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Marlborough Circuit <27220> +proj=tmerc +lat_0=-41.54448666666666 +lon_0=173.8020741111111 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Hokitika Circuit <27221> +proj=tmerc +lat_0=-42.88632236111111 +lon_0=170.9799935 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Okarito Circuit <27222> +proj=tmerc +lat_0=-43.11012813888889 +lon_0=170.2609258333333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Jacksons Bay Circuit <27223> +proj=tmerc +lat_0=-43.97780288888889 +lon_0=168.606267 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Mount Pleasant Circuit <27224> +proj=tmerc +lat_0=-43.59063758333333 +lon_0=172.7271935833333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Gawler Circuit <27225> +proj=tmerc +lat_0=-43.74871155555556 +lon_0=171.3607484722222 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Timaru Circuit <27226> +proj=tmerc +lat_0=-44.40222036111111 +lon_0=171.0572508333333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Lindis Peak Circuit <27227> +proj=tmerc +lat_0=-44.73526797222222 +lon_0=169.4677550833333 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Mount Nicholas Circuit <27228> +proj=tmerc +lat_0=-45.13290258333333 +lon_0=168.3986411944444 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Mount York Circuit <27229> +proj=tmerc +lat_0=-45.56372616666666 +lon_0=167.7388617777778 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Observation Point Circuit <27230> +proj=tmerc +lat_0=-45.81619661111111 +lon_0=170.6285951666667 +k=1.000000 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / North Taieri Circuit <27231> +proj=tmerc +lat_0=-45.86151336111111 +lon_0=170.2825891111111 +k=0.999960 +x_0=300000 +y_0=700000 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / Bluff Circuit <27232> +proj=tmerc +lat_0=-46.60000961111111 +lon_0=168.342872 +k=1.000000 +x_0=300002.66 +y_0=699999.58 +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / UTM zone 58S <27258> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / UTM zone 59S <27259> +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / UTM zone 60S <27260> +proj=utm +zone=60 +south +ellps=intl +units=m +no_defs no_defs <> # NZGD49 / North Island Grid <27291> +proj=tmerc +lat_0=-39 +lon_0=175.5 +k=1.000000 +x_0=274319.5243848086 +y_0=365759.3658464114 +ellps=intl +to_meter=0.9143984146160287 +no_defs no_defs <> # NZGD49 / South Island Grid <27292> +proj=tmerc +lat_0=-44 +lon_0=171.5 +k=1.000000 +x_0=457199.2073080143 +y_0=457199.2073080143 +ellps=intl +to_meter=0.9143984146160287 +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone I <27391> +proj=tmerc +lat_0=58 +lon_0=6.056250000000003 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone II <27392> +proj=tmerc +lat_0=58 +lon_0=8.389583333333336 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone III <27393> +proj=tmerc +lat_0=58 +lon_0=10.72291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone IV <27394> +proj=tmerc +lat_0=58 +lon_0=13.22291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone V <27395> +proj=tmerc +lat_0=58 +lon_0=16.88958333333334 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone VI <27396> +proj=tmerc +lat_0=58 +lon_0=20.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone VII <27397> +proj=tmerc +lat_0=58 +lon_0=24.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # NGO 1948 (Oslo) / NGO zone VIII <27398> +proj=tmerc +lat_0=58 +lon_0=29.05625 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs no_defs <> # Datum 73 / UTM zone 29N <27429> +proj=utm +zone=29 +ellps=intl +units=m +no_defs no_defs <> # Datum 73 / Modified Portuguese Grid <27492> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m +no_defs no_defs <> # ATF (Paris) / Nord de Guerre <27500> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=7.737229170000001 +k_0=0.99950908 +x_0=500000 +y_0=300000 +a=6376523 +b=6355862.933255573 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert Nord France <27561> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert Centre France <27562> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert Sud France <27563> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert Corse <27564> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert zone I <27571> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert zone II <27572> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert zone III <27573> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Lambert zone IV <27574> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / France I <27581> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / France II <27582> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / France III <27583> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / France IV <27584> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Nord France <27591> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=2.33722917 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Centre France <27592> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.33722917 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Sud France <27593> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=2.33722917 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # NTF (Paris) / Corse <27594> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=2.33722917 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # OSGB 1936 / British National Grid <27700> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.999601 +x_0=400000 +y_0=-100000 +ellps=airy +units=m +no_defs no_defs <> # Palestine 1923 / Palestine Grid <28191> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +units=m +no_defs no_defs <> # Palestine 1923 / Palestine Belt <28192> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1.000000 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +units=m +no_defs no_defs <> # Palestine 1923 / Israeli CS Grid <28193> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +units=m +no_defs no_defs <> # Pointe Noire / UTM zone 32S <28232> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # GDA94 / MGA zone 48 <28348> +proj=utm +zone=48 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 49 <28349> +proj=utm +zone=49 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 50 <28350> +proj=utm +zone=50 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 51 <28351> +proj=utm +zone=51 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 52 <28352> +proj=utm +zone=52 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 53 <28353> +proj=utm +zone=53 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 54 <28354> +proj=utm +zone=54 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 55 <28355> +proj=utm +zone=55 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 56 <28356> +proj=utm +zone=56 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 57 <28357> +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # GDA94 / MGA zone 58 <28358> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 2 <28402> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 3 <28403> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 4 <28404> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 5 <28405> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 6 <28406> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 7 <28407> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 8 <28408> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 9 <28409> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 10 <28410> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 11 <28411> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 12 <28412> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 13 <28413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 14 <28414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 15 <28415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 16 <28416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 17 <28417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 18 <28418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 19 <28419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 20 <28420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 21 <28421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 22 <28422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 23 <28423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 24 <28424> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 25 <28425> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 26 <28426> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 27 <28427> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 28 <28428> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 29 <28429> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 30 <28430> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 31 <28431> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 32 <28432> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 2N <28462> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 3N <28463> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 4N <28464> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 5N <28465> +proj=tmerc +lat_0=0 +lon_0=27 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 6N <28466> +proj=tmerc +lat_0=0 +lon_0=33 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 7N <28467> +proj=tmerc +lat_0=0 +lon_0=39 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 8N <28468> +proj=tmerc +lat_0=0 +lon_0=45 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 9N <28469> +proj=tmerc +lat_0=0 +lon_0=51 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 10N <28470> +proj=tmerc +lat_0=0 +lon_0=57 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 11N <28471> +proj=tmerc +lat_0=0 +lon_0=63 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 12N <28472> +proj=tmerc +lat_0=0 +lon_0=69 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 13N <28473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 14N <28474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 15N <28475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 16N <28476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 17N <28477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 18N <28478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 19N <28479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 20N <28480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 21N <28481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 22N <28482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 23N <28483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 24N <28484> +proj=tmerc +lat_0=0 +lon_0=141 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 25N <28485> +proj=tmerc +lat_0=0 +lon_0=147 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 26N <28486> +proj=tmerc +lat_0=0 +lon_0=153 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 27N <28487> +proj=tmerc +lat_0=0 +lon_0=159 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 28N <28488> +proj=tmerc +lat_0=0 +lon_0=165 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 29N <28489> +proj=tmerc +lat_0=0 +lon_0=171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 30N <28490> +proj=tmerc +lat_0=0 +lon_0=177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 31N <28491> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Pulkovo 1942 / Gauss-Kruger 32N <28492> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs no_defs <> # Qatar 1974 / Qatar National Grid <28600> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.999990 +x_0=200000 +y_0=300000 +ellps=intl +units=m +no_defs no_defs <> # Amersfoort / RD Old <28991> +proj=stere +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.999908 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Amersfoort / RD New <28992> +proj=stere +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.999908 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs no_defs <> # SAD69 / Brazil Polyconic <29100> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 18N <29118> +proj=utm +zone=18 +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 19N <29119> +proj=utm +zone=19 +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 20N <29120> +proj=utm +zone=20 +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 21N <29121> +proj=utm +zone=21 +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 22N <29122> +proj=utm +zone=22 +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 17S <29177> +proj=utm +zone=17 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 18S <29178> +proj=utm +zone=18 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 19S <29179> +proj=utm +zone=19 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 20S <29180> +proj=utm +zone=20 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 21S <29181> +proj=utm +zone=21 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 22S <29182> +proj=utm +zone=22 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 23S <29183> +proj=utm +zone=23 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 24S <29184> +proj=utm +zone=24 +south +ellps=GRS67 +units=m +no_defs no_defs <> # SAD69 / UTM zone 25S <29185> +proj=utm +zone=25 +south +ellps=GRS67 +units=m +no_defs no_defs <> # Sapper Hill 1943 / UTM zone 20S <29220> +proj=utm +zone=20 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs no_defs <> # Sapper Hill 1943 / UTM zone 21S <29221> +proj=utm +zone=21 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs no_defs <> # Schwarzeck / UTM zone 33S <29333> +proj=utm +zone=33 +south +ellps=bess_nam +units=m +no_defs no_defs <> # South West African Coord. System zone 11 # South West African Coord. System zone 13 # South West African Coord. System zone 15 # South West African Coord. System zone 17 # South West African Coord. System zone 19 # South West African Coord. System zone 21 # South West African Coord. System zone 23 # South West African Coord. System zone 25 # Sudan / UTM zone 35N <29635> +proj=utm +zone=35 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Sudan / UTM zone 36N <29636> +proj=utm +zone=36 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Tananarive (Paris) / Laborde Grid <29700> +proj=omerc +lat_0=-18.9 +lonc=46.43722917000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m +no_defs no_defs <> # Tananarive / UTM zone 38S <29738> +proj=utm +zone=38 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs no_defs <> # Tananarive / UTM zone 39S <29739> +proj=utm +zone=39 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs no_defs <> # Timbalai 1948 / UTM zone 49N <29849> +proj=utm +zone=49 +ellps=evrstSS +units=m +no_defs no_defs <> # Timbalai 1948 / UTM zone 50N <29850> +proj=utm +zone=50 +ellps=evrstSS +units=m +no_defs no_defs <> # Timbalai 1948 / R.S.O. Borneo (ch) <29871> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8714630401 +y_0=442857.653094361 +ellps=evrstSS +to_meter=20.11676512155263 +no_defs no_defs <> # Timbalai 1948 / R.S.O. Borneo (ft) <29872> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8727431979 +y_0=442857.6545573985 +ellps=evrstSS +to_meter=0.3047994715386762 +no_defs no_defs <> # Timbalai 1948 / R.S.O. Borneo (m) <29873> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.87 +y_0=442857.65 +ellps=evrstSS +units=m +no_defs no_defs <> # TM65 / Irish National Grid <29900> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m +no_defs no_defs <> # OSNI 1952 / Irish National Grid <29901> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000000 +x_0=200000 +y_0=250000 +ellps=airy +units=m +no_defs no_defs <> # TM65 / Irish Grid <29902> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m +no_defs no_defs <> # TM75 / Irish Grid <29903> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS I <30161> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS II <30162> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS III <30163> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS IV <30164> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS V <30165> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS VI <30166> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS VII <30167> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS VIII <30168> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS IX <30169> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS X <30170> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XI <30171> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XII <30172> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XIII <30173> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XIV <30174> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XV <30175> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XVI <30176> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XVII <30177> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XVIII <30178> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Tokyo / Japan Plane Rectangular CS XIX <30179> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.999900 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Trinidad 1903 / Trinidad Grid <30200> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46380700001 +y_0=65379.0133425 +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0 +to_meter=0.2011661949 +no_defs no_defs <> # TC(1948) / UTM zone 39N <30339> +proj=utm +zone=39 +ellps=helmert +units=m +no_defs no_defs <> # TC(1948) / UTM zone 40N <30340> +proj=utm +zone=40 +ellps=helmert +units=m +no_defs no_defs <> # Voirol 1875 / Nord Algerie (ancienne) <30491> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs no_defs <> # Voirol 1875 / Sud Algerie (ancienne) <30492> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs no_defs <> # Nord Sahara 1959 / UTM zone 29N <30729> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs no_defs <> # Nord Sahara 1959 / UTM zone 30N <30730> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs no_defs <> # Nord Sahara 1959 / UTM zone 31N <30731> +proj=utm +zone=31 +ellps=clrk80 +units=m +no_defs no_defs <> # Nord Sahara 1959 / UTM zone 32N <30732> +proj=utm +zone=32 +ellps=clrk80 +units=m +no_defs no_defs <> # Nord Sahara 1959 / Voirol Unifie Nord <30791> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs no_defs <> # Nord Sahara 1959 / Voirol Unifie Sud <30792> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs no_defs <> # RT38 2.5 gon W <30800> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Yoff / UTM zone 28N <31028> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +units=m +no_defs no_defs <> # Zanderij / UTM zone 21N <31121> +proj=utm +zone=21 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs no_defs <> # Zanderij / TM 54 NW <31154> +proj=tmerc +lat_0=0 +lon_0=-54 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs no_defs <> # Zanderij / Suriname Old TM <31170> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.999600 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs no_defs <> # Zanderij / Suriname TM <31171> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.999900 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs no_defs <> # MGI / 3-degree Gauss zone 5 <31265> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / 3-degree Gauss zone 6 <31266> +proj=tmerc +lat_0=0 +lon_0=18 +k=1.000000 +x_0=6500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / 3-degree Gauss zone 7 <31267> +proj=tmerc +lat_0=0 +lon_0=21 +k=1.000000 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / 3-degree Gauss zone 8 <31268> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=8500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Balkans zone 5 <31275> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999900 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Balkans zone 6 <31276> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.999900 +x_0=6500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Balkans zone 7 <31277> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999900 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Balkans zone 8 <31278> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999900 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Balkans zone 8 <31279> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999900 +x_0=8500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI (Ferro) / Austria West Zone <31281> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # MGI (Ferro) / Austria Central Zone <31282> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # MGI (Ferro) / Austria East Zone <31283> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # MGI / M28 <31284> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=150000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / M31 <31285> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=450000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / M34 <31286> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=750000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Austria Lambert <31287> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +units=m +no_defs no_defs <> # MGI (Ferro) / Austria West Zone <31291> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # MGI (Ferro) / Austria Central Zone <31292> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # MGI (Ferro) / Austria East Zone <31293> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs no_defs <> # MGI / M28 <31294> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1.000000 +x_0=150000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / M31 <31295> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1.000000 +x_0=450000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / M34 <31296> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1.000000 +x_0=750000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # MGI / Austria Lambert <31297> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +units=m +no_defs no_defs <> # Belge 1972 / Belge Lambert 72 <31300> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +units=m +no_defs no_defs <> # Belge 1972 / Belgian Lambert 72 <31370> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +units=m +no_defs no_defs <> # DHDN / 3-degree Gauss zone 1 <31461> +proj=tmerc +lat_0=0 +lon_0=3 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / 3-degree Gauss zone 2 <31462> +proj=tmerc +lat_0=0 +lon_0=6 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / 3-degree Gauss zone 3 <31463> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / 3-degree Gauss zone 4 <31464> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / 3-degree Gauss zone 5 <31465> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / Gauss-Kruger zone 2 <31466> +proj=tmerc +lat_0=0 +lon_0=6 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / Gauss-Kruger zone 3 <31467> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / Gauss-Kruger zone 4 <31468> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # DHDN / Gauss-Kruger zone 5 <31469> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs no_defs <> # Conakry 1905 / UTM zone 28N <31528> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs no_defs <> # Conakry 1905 / UTM zone 29N <31529> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs no_defs <> # Dealul Piscului 1933/ Stereo 33 <31600> +proj=stere +lat_0=45.9 +lon_0=25.39246588888889 +k=0.999667 +x_0=500000 +y_0=500000 +ellps=intl +towgs84=103.25,-100.4,-307.19,0,0,0,0 +units=m +no_defs no_defs <> # Dealul Piscului 1970/ Stereo 70 <31700> +proj=stere +lat_0=46 +lon_0=25 +k=0.999750 +x_0=500000 +y_0=500000 +ellps=krass +units=m +no_defs no_defs <> # NGN / UTM zone 38N <31838> +proj=utm +zone=38 +ellps=WGS84 +units=m +no_defs no_defs <> # NGN / UTM zone 39N <31839> +proj=utm +zone=39 +ellps=WGS84 +units=m +no_defs no_defs <> # KUDAMS / KTM <31900> +proj=tmerc +lat_0=0 +lon_0=48 +k=0.999600 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 17N <31986> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 18N <31987> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 19N <31988> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 20N <31989> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 21N <31990> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 22N <31991> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 17S <31992> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 18S <31993> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 19S <31994> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 20S <31995> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 21S <31996> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 22S <31997> +proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 23S <31998> +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 24S <31999> +proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # SIRGAS / UTM zone 25S <32000> +proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs no_defs <> # NAD27 / Montana North <32001> +proj=lcc +lat_1=48.71666666666667 +lat_2=47.85 +lat_0=47 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Montana Central <32002> +proj=lcc +lat_1=47.88333333333333 +lat_2=46.45 +lat_0=45.83333333333334 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Montana South <32003> +proj=lcc +lat_1=46.4 +lat_2=44.86666666666667 +lat_0=44 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Nebraska North <32005> +proj=lcc +lat_1=41.85 +lat_2=42.81666666666667 +lat_0=41.33333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Nebraska South <32006> +proj=lcc +lat_1=40.28333333333333 +lat_2=41.71666666666667 +lat_0=39.66666666666666 +lon_0=-99.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Nevada East <32007> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Nevada Central <32008> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Nevada West <32009> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New Hampshire <32010> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New Jersey <32011> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.66666666666667 +k=0.999975 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New Mexico East <32012> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New Mexico Central <32013> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New Mexico West <32014> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New York East <32015> +proj=tmerc +lat_0=40 +lon_0=-74.33333333333333 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New York Central <32016> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New York West <32017> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / New York Long Island <32018> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.5 +lon_0=-74 +x_0=304800.6096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / North Carolina <32019> +proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / North Dakota North <32020> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / North Dakota South <32021> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Ohio North <32022> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Ohio South <32023> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Oklahoma North <32024> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Oklahoma South <32025> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Oregon North <32026> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Oregon South <32027> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Pennsylvania North <32028> +proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Pennsylvania South <32029> +proj=lcc +lat_1=39.93333333333333 +lat_2=40.8 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Rhode Island <32030> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / South Carolina North <32031> +proj=lcc +lat_1=33.76666666666667 +lat_2=34.96666666666667 +lat_0=33 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / South Carolina South <32033> +proj=lcc +lat_1=32.33333333333334 +lat_2=33.66666666666666 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / South Dakota North <32034> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / South Dakota South <32035> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Tennessee <32036> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=30480.06096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Texas North <32037> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Texas North Central <32038> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-97.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Texas Central <32039> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Texas South Central <32040> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Texas South <32041> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Utah North <32042> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Utah Central <32043> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Utah South <32044> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Vermont <32045> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Virginia North <32046> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Virginia South <32047> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Washington North <32048> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Washington South <32049> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / West Virginia North <32050> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / West Virginia South <32051> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wisconsin North <32052> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wisconsin Central <32053> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wisconsin South <32054> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wyoming East <32055> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-105.1666666666667 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wyoming East Central <32056> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-107.3333333333333 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wyoming West Central <32057> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-108.75 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Wyoming West <32058> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-110.0833333333333 +k=0.999941 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / Guatemala Norte <32061> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / Guatemala Sur <32062> +proj=lcc +lat_1=14.9 +lat_0=14.9 +lon_0=-90.33333333333333 +k_0=0.99989906 +x_0=500000 +y_0=325992.681 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / BLM 14N (ftUS) <32064> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 15N (ftUS) <32065> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 16N (ftUS) <32066> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 17N (ftUS) <32067> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 14N (feet) <32074> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 15N (feet) <32075> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 16N (feet) <32076> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / BLM 17N (feet) <32077> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999600 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs no_defs <> # NAD27 / MTM zone 1 <32081> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / MTM zone 2 <32082> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / MTM zone 3 <32083> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / MTM zone 4 <32084> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / MTM zone 5 <32085> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / MTM zone 6 <32086> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD27 / Quebec Lambert <32098> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs no_defs <> # NAD83 / Montana <32100> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Nebraska <32104> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Nevada East <32107> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=8000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Nevada Central <32108> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Nevada West <32109> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=800000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New Hampshire <32110> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New Jersey <32111> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New Mexico East <32112> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New Mexico Central <32113> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New Mexico West <32114> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New York East <32115> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New York Central <32116> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New York West <32117> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / New York Long Island <32118> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / North Carolina <32119> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / North Dakota North <32120> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / North Dakota South <32121> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Ohio North <32122> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Ohio South <32123> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Oklahoma North <32124> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Oklahoma South <32125> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Oregon North <32126> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Oregon South <32127> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Pennsylvania North <32128> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Pennsylvania South <32129> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Rhode Island <32130> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / South Carolina <32133> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / South Dakota North <32134> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / South Dakota South <32135> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Tennessee <32136> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Texas North <32137> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Texas North Central <32138> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Texas Central <32139> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Texas South Central <32140> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Texas South <32141> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Utah North <32142> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Utah Central <32143> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Utah South <32144> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Vermont <32145> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Virginia North <32146> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Virginia South <32147> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Washington North <32148> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Washington South <32149> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / West Virginia North <32150> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / West Virginia South <32151> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wisconsin North <32152> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wisconsin Central <32153> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wisconsin South <32154> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wyoming East <32155> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wyoming East Central <32156> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=400000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wyoming West Central <32157> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Wyoming West <32158> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Puerto Rico & Virgin Is. <32161> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / SCoPQ zone 2 <32180> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 1 <32181> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 2 <32182> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 3 <32183> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 4 <32184> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 5 <32185> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 6 <32186> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 7 <32187> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 8 <32188> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 9 <32189> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 10 <32190> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 11 <32191> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 12 <32192> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 13 <32193> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 14 <32194> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 15 <32195> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 16 <32196> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / MTM zone 17 <32197> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.999900 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # NAD83 / Quebec Lambert <32198> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 1N <32201> +proj=utm +zone=1 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 2N <32202> +proj=utm +zone=2 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 3N <32203> +proj=utm +zone=3 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 4N <32204> +proj=utm +zone=4 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 5N <32205> +proj=utm +zone=5 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 6N <32206> +proj=utm +zone=6 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 7N <32207> +proj=utm +zone=7 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 8N <32208> +proj=utm +zone=8 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 9N <32209> +proj=utm +zone=9 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 10N <32210> +proj=utm +zone=10 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 11N <32211> +proj=utm +zone=11 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 12N <32212> +proj=utm +zone=12 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 13N <32213> +proj=utm +zone=13 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 14N <32214> +proj=utm +zone=14 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 15N <32215> +proj=utm +zone=15 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 16N <32216> +proj=utm +zone=16 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 17N <32217> +proj=utm +zone=17 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 18N <32218> +proj=utm +zone=18 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 19N <32219> +proj=utm +zone=19 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 20N <32220> +proj=utm +zone=20 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 21N <32221> +proj=utm +zone=21 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 22N <32222> +proj=utm +zone=22 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 23N <32223> +proj=utm +zone=23 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 24N <32224> +proj=utm +zone=24 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 25N <32225> +proj=utm +zone=25 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 26N <32226> +proj=utm +zone=26 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 27N <32227> +proj=utm +zone=27 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 28N <32228> +proj=utm +zone=28 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 29N <32229> +proj=utm +zone=29 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 30N <32230> +proj=utm +zone=30 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 31N <32231> +proj=utm +zone=31 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 32N <32232> +proj=utm +zone=32 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 33N <32233> +proj=utm +zone=33 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 34N <32234> +proj=utm +zone=34 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 35N <32235> +proj=utm +zone=35 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 36N <32236> +proj=utm +zone=36 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 37N <32237> +proj=utm +zone=37 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 38N <32238> +proj=utm +zone=38 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 39N <32239> +proj=utm +zone=39 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 40N <32240> +proj=utm +zone=40 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 41N <32241> +proj=utm +zone=41 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 42N <32242> +proj=utm +zone=42 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 43N <32243> +proj=utm +zone=43 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 44N <32244> +proj=utm +zone=44 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 45N <32245> +proj=utm +zone=45 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 46N <32246> +proj=utm +zone=46 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 47N <32247> +proj=utm +zone=47 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 48N <32248> +proj=utm +zone=48 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 49N <32249> +proj=utm +zone=49 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 50N <32250> +proj=utm +zone=50 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 51N <32251> +proj=utm +zone=51 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 52N <32252> +proj=utm +zone=52 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 53N <32253> +proj=utm +zone=53 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 54N <32254> +proj=utm +zone=54 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 55N <32255> +proj=utm +zone=55 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 56N <32256> +proj=utm +zone=56 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 57N <32257> +proj=utm +zone=57 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 58N <32258> +proj=utm +zone=58 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 59N <32259> +proj=utm +zone=59 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 60N <32260> +proj=utm +zone=60 +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 1S <32301> +proj=utm +zone=1 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 2S <32302> +proj=utm +zone=2 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 3S <32303> +proj=utm +zone=3 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 4S <32304> +proj=utm +zone=4 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 5S <32305> +proj=utm +zone=5 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 6S <32306> +proj=utm +zone=6 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 7S <32307> +proj=utm +zone=7 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 8S <32308> +proj=utm +zone=8 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 9S <32309> +proj=utm +zone=9 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 10S <32310> +proj=utm +zone=10 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 11S <32311> +proj=utm +zone=11 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 12S <32312> +proj=utm +zone=12 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 13S <32313> +proj=utm +zone=13 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 14S <32314> +proj=utm +zone=14 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 15S <32315> +proj=utm +zone=15 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 16S <32316> +proj=utm +zone=16 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 17S <32317> +proj=utm +zone=17 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 18S <32318> +proj=utm +zone=18 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 19S <32319> +proj=utm +zone=19 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 20S <32320> +proj=utm +zone=20 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 21S <32321> +proj=utm +zone=21 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 22S <32322> +proj=utm +zone=22 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 23S <32323> +proj=utm +zone=23 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 24S <32324> +proj=utm +zone=24 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 25S <32325> +proj=utm +zone=25 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 26S <32326> +proj=utm +zone=26 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 27S <32327> +proj=utm +zone=27 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 28S <32328> +proj=utm +zone=28 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 29S <32329> +proj=utm +zone=29 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 30S <32330> +proj=utm +zone=30 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 31S <32331> +proj=utm +zone=31 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 32S <32332> +proj=utm +zone=32 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 33S <32333> +proj=utm +zone=33 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 34S <32334> +proj=utm +zone=34 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 35S <32335> +proj=utm +zone=35 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 36S <32336> +proj=utm +zone=36 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 37S <32337> +proj=utm +zone=37 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 38S <32338> +proj=utm +zone=38 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 39S <32339> +proj=utm +zone=39 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 40S <32340> +proj=utm +zone=40 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 41S <32341> +proj=utm +zone=41 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 42S <32342> +proj=utm +zone=42 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 43S <32343> +proj=utm +zone=43 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 44S <32344> +proj=utm +zone=44 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 45S <32345> +proj=utm +zone=45 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 46S <32346> +proj=utm +zone=46 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 47S <32347> +proj=utm +zone=47 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 48S <32348> +proj=utm +zone=48 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 49S <32349> +proj=utm +zone=49 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 50S <32350> +proj=utm +zone=50 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 51S <32351> +proj=utm +zone=51 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 52S <32352> +proj=utm +zone=52 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 53S <32353> +proj=utm +zone=53 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 54S <32354> +proj=utm +zone=54 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 55S <32355> +proj=utm +zone=55 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 56S <32356> +proj=utm +zone=56 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 57S <32357> +proj=utm +zone=57 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 58S <32358> +proj=utm +zone=58 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 59S <32359> +proj=utm +zone=59 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72 / UTM zone 60S <32360> +proj=utm +zone=60 +south +ellps=WGS72 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 1N <32401> +proj=utm +zone=1 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 2N <32402> +proj=utm +zone=2 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 3N <32403> +proj=utm +zone=3 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 4N <32404> +proj=utm +zone=4 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 5N <32405> +proj=utm +zone=5 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 6N <32406> +proj=utm +zone=6 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 7N <32407> +proj=utm +zone=7 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 8N <32408> +proj=utm +zone=8 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 9N <32409> +proj=utm +zone=9 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 10N <32410> +proj=utm +zone=10 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 11N <32411> +proj=utm +zone=11 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 12N <32412> +proj=utm +zone=12 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 13N <32413> +proj=utm +zone=13 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 14N <32414> +proj=utm +zone=14 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 15N <32415> +proj=utm +zone=15 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 16N <32416> +proj=utm +zone=16 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 17N <32417> +proj=utm +zone=17 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 18N <32418> +proj=utm +zone=18 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 19N <32419> +proj=utm +zone=19 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 20N <32420> +proj=utm +zone=20 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 21N <32421> +proj=utm +zone=21 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 22N <32422> +proj=utm +zone=22 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 23N <32423> +proj=utm +zone=23 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 24N <32424> +proj=utm +zone=24 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 25N <32425> +proj=utm +zone=25 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 26N <32426> +proj=utm +zone=26 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 27N <32427> +proj=utm +zone=27 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 28N <32428> +proj=utm +zone=28 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 29N <32429> +proj=utm +zone=29 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 30N <32430> +proj=utm +zone=30 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 31N <32431> +proj=utm +zone=31 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 32N <32432> +proj=utm +zone=32 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 33N <32433> +proj=utm +zone=33 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 34N <32434> +proj=utm +zone=34 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 35N <32435> +proj=utm +zone=35 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 36N <32436> +proj=utm +zone=36 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 37N <32437> +proj=utm +zone=37 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 38N <32438> +proj=utm +zone=38 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 39N <32439> +proj=utm +zone=39 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 40N <32440> +proj=utm +zone=40 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 41N <32441> +proj=utm +zone=41 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 42N <32442> +proj=utm +zone=42 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 43N <32443> +proj=utm +zone=43 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 44N <32444> +proj=utm +zone=44 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 45N <32445> +proj=utm +zone=45 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 46N <32446> +proj=utm +zone=46 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 47N <32447> +proj=utm +zone=47 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 48N <32448> +proj=utm +zone=48 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 49N <32449> +proj=utm +zone=49 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 50N <32450> +proj=utm +zone=50 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 51N <32451> +proj=utm +zone=51 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 52N <32452> +proj=utm +zone=52 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 53N <32453> +proj=utm +zone=53 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 54N <32454> +proj=utm +zone=54 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 55N <32455> +proj=utm +zone=55 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 56N <32456> +proj=utm +zone=56 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 57N <32457> +proj=utm +zone=57 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 58N <32458> +proj=utm +zone=58 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 59N <32459> +proj=utm +zone=59 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 60N <32460> +proj=utm +zone=60 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 1S <32501> +proj=utm +zone=1 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 2S <32502> +proj=utm +zone=2 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 3S <32503> +proj=utm +zone=3 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 4S <32504> +proj=utm +zone=4 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 5S <32505> +proj=utm +zone=5 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 6S <32506> +proj=utm +zone=6 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 7S <32507> +proj=utm +zone=7 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 8S <32508> +proj=utm +zone=8 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 9S <32509> +proj=utm +zone=9 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 10S <32510> +proj=utm +zone=10 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 11S <32511> +proj=utm +zone=11 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 12S <32512> +proj=utm +zone=12 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 13S <32513> +proj=utm +zone=13 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 14S <32514> +proj=utm +zone=14 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 15S <32515> +proj=utm +zone=15 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 16S <32516> +proj=utm +zone=16 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 17S <32517> +proj=utm +zone=17 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 18S <32518> +proj=utm +zone=18 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 19S <32519> +proj=utm +zone=19 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 20S <32520> +proj=utm +zone=20 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 21S <32521> +proj=utm +zone=21 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 22S <32522> +proj=utm +zone=22 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 23S <32523> +proj=utm +zone=23 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 24S <32524> +proj=utm +zone=24 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 25S <32525> +proj=utm +zone=25 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 26S <32526> +proj=utm +zone=26 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 27S <32527> +proj=utm +zone=27 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 28S <32528> +proj=utm +zone=28 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 29S <32529> +proj=utm +zone=29 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 30S <32530> +proj=utm +zone=30 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 31S <32531> +proj=utm +zone=31 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 32S <32532> +proj=utm +zone=32 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 33S <32533> +proj=utm +zone=33 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 34S <32534> +proj=utm +zone=34 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 35S <32535> +proj=utm +zone=35 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 36S <32536> +proj=utm +zone=36 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 37S <32537> +proj=utm +zone=37 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 38S <32538> +proj=utm +zone=38 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 39S <32539> +proj=utm +zone=39 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 40S <32540> +proj=utm +zone=40 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 41S <32541> +proj=utm +zone=41 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 42S <32542> +proj=utm +zone=42 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 43S <32543> +proj=utm +zone=43 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 44S <32544> +proj=utm +zone=44 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 45S <32545> +proj=utm +zone=45 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 46S <32546> +proj=utm +zone=46 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 47S <32547> +proj=utm +zone=47 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 48S <32548> +proj=utm +zone=48 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 49S <32549> +proj=utm +zone=49 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 50S <32550> +proj=utm +zone=50 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 51S <32551> +proj=utm +zone=51 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 52S <32552> +proj=utm +zone=52 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 53S <32553> +proj=utm +zone=53 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 54S <32554> +proj=utm +zone=54 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 55S <32555> +proj=utm +zone=55 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 56S <32556> +proj=utm +zone=56 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 57S <32557> +proj=utm +zone=57 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 58S <32558> +proj=utm +zone=58 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 59S <32559> +proj=utm +zone=59 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 72BE / UTM zone 60S <32560> +proj=utm +zone=60 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 1N <32601> +proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 2N <32602> +proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 3N <32603> +proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 4N <32604> +proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 5N <32605> +proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 6N <32606> +proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 7N <32607> +proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 8N <32608> +proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 9N <32609> +proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 10N <32610> +proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 11N <32611> +proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 12N <32612> +proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 13N <32613> +proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 14N <32614> +proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 15N <32615> +proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 16N <32616> +proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 17N <32617> +proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 18N <32618> +proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 19N <32619> +proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 20N <32620> +proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 21N <32621> +proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 22N <32622> +proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 23N <32623> +proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 24N <32624> +proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 25N <32625> +proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 26N <32626> +proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 27N <32627> +proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 28N <32628> +proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 29N <32629> +proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 30N <32630> +proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 31N <32631> +proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 32N <32632> +proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 33N <32633> +proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 34N <32634> +proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 35N <32635> +proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 36N <32636> +proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 37N <32637> +proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 38N <32638> +proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 39N <32639> +proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 40N <32640> +proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 41N <32641> +proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 42N <32642> +proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 43N <32643> +proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 44N <32644> +proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 45N <32645> +proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 46N <32646> +proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 47N <32647> +proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 48N <32648> +proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 49N <32649> +proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 50N <32650> +proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 51N <32651> +proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 52N <32652> +proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 53N <32653> +proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 54N <32654> +proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 55N <32655> +proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 56N <32656> +proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 57N <32657> +proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 58N <32658> +proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 59N <32659> +proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 60N <32660> +proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UPS North <32661> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 1S <32701> +proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 2S <32702> +proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 3S <32703> +proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 4S <32704> +proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 5S <32705> +proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 6S <32706> +proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 7S <32707> +proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 8S <32708> +proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 9S <32709> +proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 10S <32710> +proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 11S <32711> +proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 12S <32712> +proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 13S <32713> +proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 14S <32714> +proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 15S <32715> +proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 16S <32716> +proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 17S <32717> +proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 18S <32718> +proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 19S <32719> +proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 20S <32720> +proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 21S <32721> +proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 22S <32722> +proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 23S <32723> +proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 24S <32724> +proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 25S <32725> +proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 26S <32726> +proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 27S <32727> +proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 28S <32728> +proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 29S <32729> +proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 30S <32730> +proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 31S <32731> +proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 32S <32732> +proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 33S <32733> +proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 34S <32734> +proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 35S <32735> +proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 36S <32736> +proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 37S <32737> +proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 38S <32738> +proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 39S <32739> +proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 40S <32740> +proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 41S <32741> +proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 42S <32742> +proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 43S <32743> +proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 44S <32744> +proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 45S <32745> +proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 46S <32746> +proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 47S <32747> +proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 48S <32748> +proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 49S <32749> +proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 50S <32750> +proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 51S <32751> +proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 52S <32752> +proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 53S <32753> +proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 54S <32754> +proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 55S <32755> +proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 56S <32756> +proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 57S <32757> +proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 58S <32758> +proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 59S <32759> +proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UTM zone 60S <32760> +proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / UPS South <32761> +proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # WGS 84 / TM 36 SE <32766> +proj=tmerc +lat_0=0 +lon_0=36 +k=0.999600 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs no_defs <> # Pulkovo 1995 GK Zone 2 <20002> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=krass +units=m no_defs <> # Pulkovo 1995 GK Zone 3 <20003> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=krass +units=m no_defs <> # Pulkovo 1995 GK Zone 2N <20062> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m no_defs <> # Pulkovo 1995 GK Zone 3N <20063> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=500000 +y_0=0 +ellps=krass +units=m no_defs <> # La Canoa UTM Zone 21N <24721> +proj=utm +zone=21 +ellps=intl +units=m no_defs <> # NAD 1927 StatePlane Hawaii 1 FIPS 5101 <26761> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Hawaii 2 FIPS 5102 <26762> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Hawaii 3 FIPS 5103 <26763> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Hawaii 4 FIPS 5104 <26764> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Hawaii 5 FIPS 5105 <26765> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Michigan North FIPS 2111 <26788> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024385 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Michigan Central FIPS 2112 <26789> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024385 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Michigan South FIPS 2113 <26790> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024385 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # Nord Algerie <30591> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m no_defs <> # Sud Algerie <30592> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m no_defs <> # Germany Zone 1 <31491> +proj=tmerc +lat_0=0 +lon_0=3 +k=1.000000 +x_0=1500000 +y_0=0 +ellps=bessel +units=m no_defs <> # Germany Zone 2 <31492> +proj=tmerc +lat_0=0 +lon_0=6 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=bessel +units=m no_defs <> # Germany Zone 3 <31493> +proj=tmerc +lat_0=0 +lon_0=9 +k=1.000000 +x_0=3500000 +y_0=0 +ellps=bessel +units=m no_defs <> # Germany Zone 4 <31494> +proj=tmerc +lat_0=0 +lon_0=12 +k=1.000000 +x_0=4500000 +y_0=0 +ellps=bessel +units=m no_defs <> # Germany Zone 5 <31495> +proj=tmerc +lat_0=0 +lon_0=15 +k=1.000000 +x_0=5500000 +y_0=0 +ellps=bessel +units=m no_defs <> # NAD 1927 StatePlane Puerto Rico FIPS 5201 <32059> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 StatePlane Virgin Islands St Croix FIPS 5202 <32060> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012193 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # Sphere Plate Carree <53001> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Equidistant Cylindrical <53002> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Miller Cylindrical <53003> +proj=mill +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R_A +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Mercator <53004> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Sinusoidal <53008> +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Mollweide <53009> +proj=moll +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Eckert VI <53010> +proj=eck6 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Eckert V <53011> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Eckert IV <53012> +proj=eck4 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Eckert III <53013> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Eckert II <53014> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Eckert I <53015> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Gall Stereographic <53016> +proj=gall +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Behrmann <53017> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Winkel I <53018> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Winkel II <53019> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Polyconic <53021> +proj=poly +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Quartic Authalic <53022> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Loximuthal <53023> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Bonne <53024> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Hotine <53025> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Stereographic <53026> +proj=stere +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Equidistant Conic <53027> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=60 +lat_2=60 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Cassini <53028> +proj=cass +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Van der Grinten I <53029> +proj=vandg +lon_0=0 +x_0=0 +y_0=0 +R_A +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Robinson <53030> +proj=robin +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Two Point Equidistant <53031> +a=6371000 +b=6371000 +units=m no_defs <> # Sphere Azimuthal Equidistant <53032> +proj=aeqd +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371000 +b=6371000 +units=m no_defs <> # World Plate Carree <54001> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Equidistant Cylindrical <54002> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Miller Cylindrical <54003> +proj=mill +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +R_A +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Mercator <54004> +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Sinusoidal <54008> +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Mollweide <54009> +proj=moll +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Eckert VI <54010> +proj=eck6 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Eckert V <54011> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Eckert IV <54012> +proj=eck4 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Eckert III <54013> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Eckert II <54014> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Eckert I <54015> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Gall Stereographic <54016> +proj=gall +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Behrmann <54017> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Winkel I <54018> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Winkel II <54019> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Polyconic <54021> +proj=poly +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Quartic Authalic <54022> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Loximuthal <54023> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Bonne <54024> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Hotine <54025> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Stereographic <54026> +proj=stere +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Equidistant Conic <54027> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=60 +lat_2=60 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Cassini <54028> +proj=cass +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Van der Grinten I <54029> +proj=vandg +lon_0=0 +x_0=0 +y_0=0 +R_A +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Robinson <54030> +proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Two Point Equidistant <54031> +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # World Azimuthal Equidistant <54032> +proj=aeqd +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # NAD 1927 StatePlane Guam FIPS 5400 <65061> +proj=poly +lat_0=13.47246635277778 +lon_0=-144.7487507055556 +x_0=50000.00000000001 +y_0=50000.00000000001 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Guam FIPS 5400 <65161> +proj=poly +lat_0=13.47246635277778 +lon_0=-144.7487507055556 +x_0=50000 +y_0=50000 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # Canada Albers Equal Area Conic <102001> +proj=aea +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # Canada Lambert Conformal Conic <102002> +proj=lcc +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # USA Contiguous Albers Equal Area Conic <102003> +proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # USA Contiguous Lambert Conformal Conic <102004> +proj=lcc +lat_1=33 +lat_2=45 +lat_0=39 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # USA Contiguous Equidistant Conic <102005> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # Alaska Albers Equal Area Conic <102006> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # Hawaii Albers Equal Area Conic <102007> +proj=aea +lat_1=8 +lat_2=18 +lat_0=13 +lon_0=-157 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # North America Albers Equal Area Conic <102008> +proj=aea +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # North America Lambert Conformal Conic <102009> +proj=lcc +lat_1=20 +lat_2=60 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # North America Equidistant Conic <102010> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=20 +lat_2=60 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # Africa Sinusoidal <102011> +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia Lambert Conformal Conic <102012> +proj=lcc +lat_1=30 +lat_2=62 +lat_0=0 +lon_0=105 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Europe Albers Equal Area Conic <102013> +proj=aea +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m no_defs <> # Europe Lambert Conformal Conic <102014> +proj=lcc +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m no_defs <> # South America Lambert Conformal Conic <102015> +proj=lcc +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m no_defs <> # North Pole Azimuthal Equidistant <102016> +proj=aeqd +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # North Pole Lambert Azimuthal Equal Area <102017> +proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # North Pole Stereographic <102018> +proj=stere +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # South Pole Azimuthal Equidistant <102019> +proj=aeqd +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # South Pole Lambert Azimuthal Equal Area <102020> +proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # South Pole Stereographic <102021> +proj=stere +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Africa Albers Equal Area Conic <102022> +proj=aea +lat_1=20 +lat_2=-23 +lat_0=0 +lon_0=25 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Africa Equidistant Conic <102023> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=20 +lat_2=-23 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Africa Lambert Conformal Conic <102024> +proj=lcc +lat_1=20 +lat_2=-23 +lat_0=0 +lon_0=25 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia North Albers Equal Area Conic <102025> +proj=aea +lat_1=15 +lat_2=65 +lat_0=30 +lon_0=95 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia North Equidistant Conic <102026> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=15 +lat_2=65 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia North Lambert Conformal Conic <102027> +proj=lcc +lat_1=15 +lat_2=65 +lat_0=30 +lon_0=95 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia South Albers Equal Area Conic <102028> +proj=aea +lat_1=7 +lat_2=-32 +lat_0=-15 +lon_0=125 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia South Equidistant Conic <102029> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=7 +lat_2=-32 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Asia South Lambert Conformal Conic <102030> +proj=lcc +lat_1=7 +lat_2=-32 +lat_0=-15 +lon_0=125 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m no_defs <> # Europe Equidistant Conic <102031> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=43 +lat_2=62 +x_0=0 +y_0=0 +ellps=intl +units=m no_defs <> # South America Equidistant Conic <102032> +proj=eqdc +lat_0=0 +lon_0=0 +lat_1=-5 +lat_2=-42 +x_0=0 +y_0=0 +ellps=aust_SA +units=m no_defs <> # South America Albers Equal Area Conic <102033> +proj=aea +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m no_defs <> # S-JTSK Krovak <102065> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m no_defs <> # S-JTSK Ferro Krovak East North <102066> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=-17.66666666666667 +units=m no_defs <> # S-JTSK Krovak East North <102067> +proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m no_defs <> # Monte Mario Italy 1 <102091> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.999600 +x_0=1500000 +y_0=0 +ellps=intl +units=m no_defs <> # Monte Mario Italy 2 <102092> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999600 +x_0=2520000 +y_0=0 +ellps=intl +units=m no_defs <> # NGO 1948 Norway Zone 1 <102101> +proj=tmerc +lat_0=58 +lon_0=6.05625 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 2 <102102> +proj=tmerc +lat_0=58 +lon_0=8.389583333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 3 <102103> +proj=tmerc +lat_0=58 +lon_0=10.72291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 4 <102104> +proj=tmerc +lat_0=58 +lon_0=13.22291666666667 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 5 <102105> +proj=tmerc +lat_0=58 +lon_0=16.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 6 <102106> +proj=tmerc +lat_0=58 +lon_0=20.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 7 <102107> +proj=tmerc +lat_0=58 +lon_0=24.88958333333333 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 Norway Zone 8 <102108> +proj=tmerc +lat_0=58 +lon_0=29.05625 +k=1.000000 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # RGF 1993 Lambert 93 <102110> +proj=lcc +lat_1=44 +lat_2=49 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +units=m no_defs <> # Old Hawaiian UTM Zone 4N <102114> +proj=utm +zone=4 +ellps=clrk66 +units=m no_defs <> # Old Hawaiian UTM Zone 5N <102115> +proj=utm +zone=5 +ellps=clrk66 +units=m no_defs <> # NAD 1927 Michigan GeoRef Feet US <102120> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.495961392 +y_0=-4354009.816002033 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 Michigan GeoRef Feet US <102121> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.495961392 +y_0=-4354009.816002033 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1927 Michigan GeoRef Meters <102122> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=clrk66 +datum=NAD27 +units=m no_defs <> # NAD 1983 Michigan GeoRef Meters <102123> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.255555555556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +datum=NAD83 +units=m no_defs <> # NGO 1948 UTM Zone 32N <102132> +proj=utm +zone=32 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 UTM Zone 33N <102133> +proj=utm +zone=33 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 UTM Zone 34N <102134> +proj=utm +zone=34 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # NGO 1948 UTM Zone 35N <102135> +proj=utm +zone=35 +a=6377492.018 +b=6356173.508712696 +units=m no_defs <> # Hong Kong 1980 Grid <102140> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1.000000 +x_0=836694.05 +y_0=819069.8 +ellps=intl +units=m no_defs <> # Hong Kong 1980 UTM Zone 49N <102141> +proj=utm +zone=49 +ellps=intl +units=m no_defs <> # Hong Kong 1980 UTM Zone 50N <102142> +proj=utm +zone=50 +ellps=intl +units=m no_defs <> # Tokyo UTM Zone 51N <102151> +proj=utm +zone=51 +ellps=bessel +units=m no_defs <> # Tokyo UTM Zone 52N <102152> +proj=utm +zone=52 +ellps=bessel +units=m no_defs <> # Tokyo UTM Zone 53N <102153> +proj=utm +zone=53 +ellps=bessel +units=m no_defs <> # Tokyo UTM Zone 54N <102154> +proj=utm +zone=54 +ellps=bessel +units=m no_defs <> # Tokyo UTM Zone 55N <102155> +proj=utm +zone=55 +ellps=bessel +units=m no_defs <> # Tokyo UTM Zone 56N <102156> +proj=utm +zone=56 +ellps=bessel +units=m no_defs <> # Datum 73 Hayford Gauss IGeoE <102160> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=200180.598 +y_0=299913.01 +ellps=intl +units=m no_defs <> # Datum 73 Hayford Gauss IPCC <102161> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m no_defs <> # Graciosa Base SW 1948 UTM Zone 26N <102162> +proj=utm +zone=26 +ellps=intl +units=m no_defs <> # Lisboa Bessel Bonne <102163> +ellps=bessel +units=m no_defs <> # Lisboa Hayford Gauss IGeoE <102164> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=200000 +y_0=300000 +ellps=intl +units=m no_defs <> # Lisboa Hayford Gauss IPCC <102165> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1.000000 +x_0=0 +y_0=0 +ellps=intl +units=m no_defs <> # Observ Meteorologico 1939 UTM Zone 25N <102166> +proj=utm +zone=25 +ellps=intl +units=m no_defs <> # Porto Santo 1936 UTM Zone 28N <102167> +proj=utm +zone=28 +ellps=intl +units=m no_defs <> # Sao Braz UTM Zone 26N <102168> +proj=utm +zone=26 +ellps=intl +units=m no_defs <> # Selvagem Grande 1938 UTM Zone 28N <102169> +proj=utm +zone=28 +ellps=intl +units=m no_defs <> # Nord Maroc Degree <102191> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # Sud Maroc Degree <102192> +proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # Sahara Degree <102193> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # NAD 1983 HARN StatePlane Alabama East FIPS 0101 <102229> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Alabama West FIPS 0102 <102230> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane California I FIPS 0401 <102241> +proj=lcc +lat_1=40 +lat_2=41.66666666666666 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane California II FIPS 0402 <102242> +proj=lcc +lat_1=38.33333333333334 +lat_2=39.83333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane California III FIPS 0403 <102243> +proj=lcc +lat_1=37.06666666666667 +lat_2=38.43333333333333 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane California IV FIPS 0404 <102244> +proj=lcc +lat_1=36 +lat_2=37.25 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane California V FIPS 0405 <102245> +proj=lcc +lat_1=34.03333333333333 +lat_2=35.46666666666667 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane California VI FIPS 0406 <102246> +proj=lcc +lat_1=32.78333333333333 +lat_2=33.88333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Arizona East FIPS 0201 <102248> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Arizona Central FIPS 0202 <102249> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Arizona West FIPS 0203 <102250> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Arkansas North FIPS 0301 <102251> +proj=lcc +lat_1=34.93333333333333 +lat_2=36.23333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Arkansas South FIPS 0302 <102252> +proj=lcc +lat_1=33.3 +lat_2=34.76666666666667 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Colorado North FIPS 0501 <102253> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Colorado Central FIPS 0502 <102254> +proj=lcc +lat_1=38.45 +lat_2=39.75 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Colorado South FIPS 0503 <102255> +proj=lcc +lat_1=37.23333333333333 +lat_2=38.43333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Connecticut FIPS 0600 <102256> +proj=lcc +lat_1=41.2 +lat_2=41.86666666666667 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Delaware FIPS 0700 <102257> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Florida East FIPS 0901 <102258> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Florida West FIPS 0902 <102259> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Florida North FIPS 0903 <102260> +proj=lcc +lat_1=29.58333333333333 +lat_2=30.75 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Hawaii 1 FIPS 5101 <102261> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Hawaii 2 FIPS 5102 <102262> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Hawaii 3 FIPS 5103 <102263> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Hawaii 4 FIPS 5104 <102264> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Hawaii 5 FIPS 5105 <102265> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Georgia East FIPS 1001 <102266> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Georgia West FIPS 1002 <102267> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Idaho East FIPS 1101 <102268> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Idaho Central FIPS 1102 <102269> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Idaho West FIPS 1103 <102270> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=800000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Illinois East FIPS 1201 <102271> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Illinois West FIPS 1202 <102272> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Indiana East FIPS 1301 <102273> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Indiana West FIPS 1302 <102274> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000 +y_0=250000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Kansas North FIPS 1501 <102277> +proj=lcc +lat_1=38.71666666666667 +lat_2=39.78333333333333 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Kansas South FIPS 1502 <102278> +proj=lcc +lat_1=37.26666666666667 +lat_2=38.56666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Kentucky North FIPS 1601 <102279> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Kentucky South FIPS 1602 <102280> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Louisiana North FIPS 1701 <102281> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Louisiana South FIPS 1702 <102282> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Maine East FIPS 1801 <102283> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Maine West FIPS 1802 <102284> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Maryland FIPS 1900 <102285> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Massachusetts Mainland FIPS 2001 <102286> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Massachusetts Island FIPS 2002 <102287> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Michigan North FIPS 2111 <102288> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Michigan Central FIPS 2112 <102289> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Michigan South FIPS 2113 <102290> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Minnesota North FIPS 2201 <102291> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Minnesota Central FIPS 2202 <102292> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Minnesota South FIPS 2203 <102293> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Mississippi East FIPS 2301 <102294> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Mississippi West FIPS 2302 <102295> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Missouri East FIPS 2401 <102296> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Missouri Central FIPS 2402 <102297> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Missouri West FIPS 2403 <102298> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Montana FIPS 2500 <102300> +proj=lcc +lat_1=45 +lat_2=49 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Nebraska FIPS 2600 <102304> +proj=lcc +lat_1=40 +lat_2=43 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Nevada East FIPS 2701 <102307> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=8000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Nevada Central FIPS 2702 <102308> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000 +y_0=6000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Nevada West FIPS 2703 <102309> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=800000 +y_0=4000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New Hampshire FIPS 2800 <102310> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New Jersey FIPS 2900 <102311> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New Mexico East FIPS 3001 <102312> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New Mexico Central FIPS 3002 <102313> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New Mexico West FIPS 3003 <102314> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=830000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New York East FIPS 3101 <102315> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New York Central FIPS 3102 <102316> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New York West FIPS 3103 <102317> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane New York Long Island FIPS 3104 <102318> +proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane North Dakota North FIPS 3301 <102320> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane North Dakota South FIPS 3302 <102321> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Ohio North FIPS 3401 <102322> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Ohio South FIPS 3402 <102323> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Oklahoma North FIPS 3501 <102324> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Oklahoma South FIPS 3502 <102325> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Oregon North FIPS 3601 <102326> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Oregon South FIPS 3602 <102327> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Rhode Island FIPS 3800 <102330> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane South Dakota North FIPS 4001 <102334> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane South Dakota South FIPS 4002 <102335> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Tennessee FIPS 4100 <102336> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Texas North FIPS 4201 <102337> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Texas North Central FIPS 4202 <102338> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Texas Central FIPS 4203 <102339> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Texas South Central FIPS 4204 <102340> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Texas South FIPS 4205 <102341> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Utah North FIPS 4301 <102342> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Utah Central FIPS 4302 <102343> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Utah South FIPS 4303 <102344> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Vermont FIPS 4400 <102345> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Virginia North FIPS 4501 <102346> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Virginia South FIPS 4502 <102347> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Washington North FIPS 4601 <102348> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Washington South FIPS 4602 <102349> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane West Virginia North FIPS 4701 <102350> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane West Virginia South FIPS 4702 <102351> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wisconsin North FIPS 4801 <102352> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wisconsin Central FIPS 4802 <102353> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wisconsin South FIPS 4803 <102354> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wyoming East FIPS 4901 <102355> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wyoming East Central FIPS 4902 <102356> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=400000 +y_0=100000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wyoming West Central FIPS 4903 <102357> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Wyoming West FIPS 4904 <102358> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m no_defs <> # NAD 1983 HARN StatePlane Puerto Rico Virgin Islands FIPS 5200 <102361> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +units=m no_defs <> # Nord Algerie Ancienne Degree <102491> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # Sud Algerie Ancienne Degree <102492> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # NTF France I degrees <102581> +proj=lcc +lat_1=49.5 +lat_0=49.5 +lon_0=2.337229166666667 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # NTF France II degrees <102582> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # NTF France III degrees <102583> +proj=lcc +lat_1=44.1 +lat_0=44.1 +lon_0=2.337229166666667 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # NTF France IV degrees <102584> +proj=lcc +lat_1=42.165 +lat_0=42.165 +lon_0=2.337229166666667 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356514.999904194 +units=m no_defs <> # Nord Algerie Degree <102591> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m no_defs <> # Sud Algerie Degree <102592> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m no_defs <> # NAD 1983 StatePlane Alabama East FIPS 0101 Feet <102629> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.999960 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alabama West FIPS 0102 Feet <102630> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 1 FIPS 5001 Feet <102631> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=-36.86989764583333 +k=0.9999 +x_0=4999999.999999999 +y_0=-4999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 2 FIPS 5002 Feet <102632> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 3 FIPS 5003 Feet <102633> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 4 FIPS 5004 Feet <102634> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 5 FIPS 5005 Feet <102635> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 6 FIPS 5006 Feet <102636> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 7 FIPS 5007 Feet <102637> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 8 FIPS 5008 Feet <102638> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 9 FIPS 5009 Feet <102639> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Alaska 10 FIPS 5010 Feet <102640> +proj=lcc +lat_1=51.83333333333334 +lat_2=53.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane California I FIPS 0401 Feet <102641> +proj=lcc +lat_1=40 +lat_2=41.66666666666666 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane California II FIPS 0402 Feet <102642> +proj=lcc +lat_1=38.33333333333334 +lat_2=39.83333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane California III FIPS 0403 Feet <102643> +proj=lcc +lat_1=37.06666666666667 +lat_2=38.43333333333333 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane California IV FIPS 0404 Feet <102644> +proj=lcc +lat_1=36 +lat_2=37.25 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane California V FIPS 0405 Feet <102645> +proj=lcc +lat_1=34.03333333333333 +lat_2=35.46666666666667 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane California VI FIPS 0406 Feet <102646> +proj=lcc +lat_1=32.78333333333333 +lat_2=33.88333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Arizona East FIPS 0201 Feet <102648> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Arizona Central FIPS 0202 Feet <102649> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.999900 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Arizona West FIPS 0203 Feet <102650> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Arkansas North FIPS 0301 Feet <102651> +proj=lcc +lat_1=34.93333333333333 +lat_2=36.23333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Arkansas South FIPS 0302 Feet <102652> +proj=lcc +lat_1=33.3 +lat_2=34.76666666666667 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.9999999999 +y_0=399999.9999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Colorado North FIPS 0501 Feet <102653> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Colorado Central FIPS 0502 Feet <102654> +proj=lcc +lat_1=38.45 +lat_2=39.75 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Colorado South FIPS 0503 Feet <102655> +proj=lcc +lat_1=37.23333333333333 +lat_2=38.43333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Connecticut FIPS 0600 Feet <102656> +proj=lcc +lat_1=41.2 +lat_2=41.86666666666667 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Delaware FIPS 0700 Feet <102657> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Florida East FIPS 0901 Feet <102658> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Florida West FIPS 0902 Feet <102659> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Florida North FIPS 0903 Feet <102660> +proj=lcc +lat_1=29.58333333333333 +lat_2=30.75 +lat_0=29 +lon_0=-84.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Hawaii 1 FIPS 5101 Feet <102661> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999967 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Hawaii 2 FIPS 5102 Feet <102662> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999967 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Hawaii 3 FIPS 5103 Feet <102663> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.999990 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Hawaii 4 FIPS 5104 Feet <102664> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.999990 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Hawaii 5 FIPS 5105 Feet <102665> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1.000000 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Georgia East FIPS 1001 Feet <102666> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.999900 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Georgia West FIPS 1002 Feet <102667> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.999900 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Idaho East FIPS 1101 Feet <102668> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.999947 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Idaho Central FIPS 1102 Feet <102669> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.999947 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Idaho West FIPS 1103 Feet <102670> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933 +x_0=799999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Illinois East FIPS 1201 Feet <102671> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.999975 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Illinois West FIPS 1202 Feet <102672> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Indiana East FIPS 1301 Feet <102673> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999967 +x_0=100000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Indiana West FIPS 1302 Feet <102674> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999967 +x_0=900000.0000000001 +y_0=250000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Iowa North FIPS 1401 Feet <102675> +proj=lcc +lat_1=42.06666666666667 +lat_2=43.26666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Iowa South FIPS 1402 Feet <102676> +proj=lcc +lat_1=40.61666666666667 +lat_2=41.78333333333333 +lat_0=40 +lon_0=-93.5 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Kansas North FIPS 1501 Feet <102677> +proj=lcc +lat_1=38.71666666666667 +lat_2=39.78333333333333 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Kansas South FIPS 1502 Feet <102678> +proj=lcc +lat_1=37.26666666666667 +lat_2=38.56666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.9999999999 +y_0=399999.9999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Kentucky North FIPS 1601 Feet <102679> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Kentucky South FIPS 1602 Feet <102680> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0000000002 +y_0=500000.0000000002 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Louisiana North FIPS 1701 Feet <102681> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Louisiana South FIPS 1702 Feet <102682> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Maine East FIPS 1801 Feet <102683> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.999900 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Maine West FIPS 1802 Feet <102684> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999967 +x_0=900000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Maryland FIPS 1900 Feet <102685> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Massachusetts Mainland FIPS 2001 Feet <102686> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000.0000000001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Massachusetts Island FIPS 2002 Feet <102687> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Michigan North FIPS 2111 Feet <102688> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Michigan Central FIPS 2112 Feet <102689> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000.000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Michigan South FIPS 2113 Feet <102690> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Minnesota North FIPS 2201 Feet <102691> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Minnesota Central FIPS 2202 Feet <102692> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Minnesota South FIPS 2203 Feet <102693> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Mississippi East FIPS 2301 Feet <102694> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.999950 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Mississippi West FIPS 2302 Feet <102695> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.999950 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Missouri East FIPS 2401 Feet <102696> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Missouri Central FIPS 2402 Feet <102697> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Missouri West FIPS 2403 Feet <102698> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941 +x_0=850000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Montana FIPS 2500 Feet <102700> +proj=lcc +lat_1=45 +lat_2=49 +lat_0=44.25 +lon_0=-109.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Nebraska FIPS 2600 Feet <102704> +proj=lcc +lat_1=40 +lat_2=43 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Nevada East FIPS 2701 Feet <102707> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.999900 +x_0=200000 +y_0=7999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Nevada Central FIPS 2702 Feet <102708> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.999900 +x_0=500000.0000000002 +y_0=6000000.000000001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Nevada West FIPS 2703 Feet <102709> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.999900 +x_0=799999.9999999999 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New Hampshire FIPS 2800 Feet <102710> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999967 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New Jersey FIPS 2900 Feet <102711> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New Mexico East FIPS 3001 Feet <102712> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New Mexico Central FIPS 3002 Feet <102713> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.999900 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New Mexico West FIPS 3003 Feet <102714> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999917 +x_0=829999.9999999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New York East FIPS 3101 Feet <102715> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.999900 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New York Central FIPS 3102 Feet <102716> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.999938 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New York West FIPS 3103 Feet <102717> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.999938 +x_0=350000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane New York Long Island FIPS 3104 Feet <102718> +proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane North Carolina FIPS 3200 Feet <102719> +proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2199999999 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane North Dakota North FIPS 3301 Feet <102720> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane North Dakota South FIPS 3302 Feet <102721> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Ohio North FIPS 3401 Feet <102722> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Ohio South FIPS 3402 Feet <102723> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Oklahoma North FIPS 3501 Feet <102724> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Oklahoma South FIPS 3502 Feet <102725> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Oregon North FIPS 3601 Feet <102726> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Oregon South FIPS 3602 Feet <102727> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Pennsylvania North FIPS 3701 Feet <102728> +proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Pennsylvania South FIPS 3702 Feet <102729> +proj=lcc +lat_1=39.93333333333333 +lat_2=40.96666666666667 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Rhode Island FIPS 3800 Feet <102730> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.999994 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane South Carolina FIPS 3900 Feet <102733> +proj=lcc +lat_1=32.5 +lat_2=34.83333333333334 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane South Dakota North FIPS 4001 Feet <102734> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane South Dakota South FIPS 4002 Feet <102735> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Tennessee FIPS 4100 Feet <102736> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Texas North FIPS 4201 Feet <102737> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Texas North Central FIPS 4202 Feet <102738> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000.0000000001 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Texas Central FIPS 4203 Feet <102739> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Texas South Central FIPS 4204 Feet <102740> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333334 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000.0000000001 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Texas South FIPS 4205 Feet <102741> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=4999999.999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Utah North FIPS 4301 Feet <102742> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0000000002 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Utah Central FIPS 4302 Feet <102743> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0000000002 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Utah South FIPS 4303 Feet <102744> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0000000002 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Vermont FIPS 4400 Feet <102745> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Virginia North FIPS 4501 Feet <102746> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3499999.999999999 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Virginia South FIPS 4502 Feet <102747> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3499999.999999999 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Washington North FIPS 4601 Feet <102748> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Washington South FIPS 4602 Feet <102749> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0000000002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane West Virginia North FIPS 4701 Feet <102750> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane West Virginia South FIPS 4702 Feet <102751> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wisconsin North FIPS 4801 Feet <102752> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wisconsin Central FIPS 4802 Feet <102753> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wisconsin South FIPS 4803 Feet <102754> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wyoming East FIPS 4901 Feet <102755> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.999938 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wyoming East Central FIPS 4902 Feet <102756> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.999938 +x_0=399999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wyoming West Central FIPS 4903 Feet <102757> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.999938 +x_0=600000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Wyoming West FIPS 4904 Feet <102758> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.999938 +x_0=799999.9999999999 +y_0=100000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Puerto Rico Virgin Islands FIPS 5200 Feet <102761> +proj=lcc +lat_1=18.03333333333334 +lat_2=18.43333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # NAD 1983 StatePlane Guam FIPS 5400 Feet <102766> +proj=poly +lat_0=13.47246635277778 +lon_0=-144.7487507055556 +x_0=49999.99999999999 +y_0=49999.99999999999 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 no_defs <> # Belge Lambert 1972 <103300> +proj=lcc +lat_1=49.8333339 +lat_2=51.16666733333333 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +units=m no_defs <> # GCS International 1967 <4023> +proj=longlat +ellps=aust_SA no_defs <> # GCS Bern 1898 <4217> +proj=longlat +ellps=bessel no_defs <> # GCS Voirol Unifie 1960 <4305> +proj=longlat +ellps=clrk80 no_defs <> # GCS Montserrat 1958 <4404> +proj=longlat +ellps=clrk80 no_defs <> # GCS Voirol Unifie 1960 Paris <4812> +proj=longlat +ellps=clrk80 +pm=2.337229166666667 no_defs <> # GCS WGS 1966 <37001> +proj=longlat +ellps=WGS66 no_defs <> # GCS Fischer 1960 <37002> +proj=longlat +a=6378166 +b=6356784.283607107 no_defs <> # GCS Fischer 1968 <37003> +proj=longlat +a=6378150 +b=6356768.337244385 no_defs <> # GCS Fischer Modified <37004> +proj=longlat +ellps=fschr60m no_defs <> # GCS Hough 1960 <37005> +proj=longlat +a=6378270 +b=6356794.343434343 no_defs <> # GCS Everest Modified 1969 <37006> +proj=longlat +a=6377295.664 +b=6356094.667915204 no_defs <> # GCS Walbeck <37007> +proj=longlat +a=6376896 +b=6355834.846687363 no_defs <> # GCS Sphere ARC INFO <37008> +proj=longlat +a=6370997 +b=6370997 no_defs <> # GCS European 1979 <37201> +proj=longlat +ellps=intl no_defs <> # GCS Everest Bangladesh <37202> +proj=longlat +a=6377276.345 +b=6356075.413140239 no_defs <> # GCS Everest India Nepal <37203> +proj=longlat +a=6377301.243 +b=6356100.230165385 no_defs <> # GCS Hjorsey 1955 <37204> +proj=longlat +ellps=intl no_defs <> # GCS Hong Kong 1963 <37205> +proj=longlat +ellps=intl no_defs <> # GCS Oman <37206> +proj=longlat +ellps=clrk80 no_defs <> # GCS South Asia Singapore <37207> +proj=longlat +ellps=fschr60m no_defs <> # GCS Ayabelle <37208> +proj=longlat +ellps=clrk80 no_defs <> # GCS Point 58 <37211> +proj=longlat +ellps=clrk80 no_defs <> # GCS Beacon E 1945 <37212> +proj=longlat +ellps=intl no_defs <> # GCS Tern Island 1961 <37213> +proj=longlat +ellps=intl no_defs <> # GCS Astro 1952 <37214> +proj=longlat +ellps=intl no_defs <> # GCS Bellevue IGN <37215> +proj=longlat +ellps=intl no_defs <> # GCS Canton 1966 <37216> +proj=longlat +ellps=intl no_defs <> # GCS Chatham Island 1971 <37217> +proj=longlat +ellps=intl no_defs <> # GCS DOS 1968 <37218> +proj=longlat +ellps=intl no_defs <> # GCS Easter Island 1967 <37219> +proj=longlat +ellps=intl no_defs <> # GCS Guam 1963 <37220> +proj=longlat +ellps=clrk66 no_defs <> # GCS GUX 1 <37221> +proj=longlat +ellps=intl no_defs <> # GCS Johnston Island 1961 <37222> +proj=longlat +ellps=intl no_defs <> # GCS Carthage Degree <37223> +proj=longlat +a=6378249.2 +b=6356514.999904194 no_defs <> # GCS Midway 1961 <37224> +proj=longlat +ellps=intl no_defs <> # GCS Pitcairn 1967 <37226> +proj=longlat +ellps=intl no_defs <> # GCS Santo DOS 1965 <37227> +proj=longlat +ellps=intl no_defs <> # GCS Viti Levu 1916 <37228> +proj=longlat +ellps=clrk80 no_defs <> # GCS Wake Eniwetok 1960 <37229> +proj=longlat +a=6378270 +b=6356794.343434343 no_defs <> # GCS Wake Island 1952 <37230> +proj=longlat +ellps=intl no_defs <> # GCS Anna 1 1965 <37231> +proj=longlat +ellps=aust_SA no_defs <> # GCS Gan 1970 <37232> +proj=longlat +ellps=intl no_defs <> # GCS ISTS 073 1969 <37233> +proj=longlat +ellps=intl no_defs <> # GCS Kerguelen Island 1949 <37234> +proj=longlat +ellps=intl no_defs <> # GCS Reunion <37235> +proj=longlat +ellps=intl no_defs <> # GCS Ascension Island 1958 <37237> +proj=longlat +ellps=intl no_defs <> # GCS DOS 71 4 <37238> +proj=longlat +ellps=intl no_defs <> # GCS Cape Canaveral <37239> +proj=longlat +ellps=clrk66 no_defs <> # GCS Fort Thomas 1955 <37240> +proj=longlat +ellps=clrk80 no_defs <> # GCS Graciosa Base SW 1948 <37241> +proj=longlat +ellps=intl no_defs <> # GCS ISTS 061 1968 <37242> +proj=longlat +ellps=intl no_defs <> # GCS LC5 1961 <37243> +proj=longlat +ellps=clrk66 no_defs <> # GCS Observ Meteorologico 1939 <37245> +proj=longlat +ellps=intl no_defs <> # GCS Pico de Las Nieves <37246> +proj=longlat +ellps=intl no_defs <> # GCS Porto Santo 1936 <37247> +proj=longlat +ellps=intl no_defs <> # GCS Sao Braz <37249> +proj=longlat +ellps=intl no_defs <> # GCS Selvagem Grande 1938 <37250> +proj=longlat +ellps=intl no_defs <> # GCS Tristan 1968 <37251> +proj=longlat +ellps=intl no_defs <> # GCS Samoa 1962 <37252> +proj=longlat +ellps=clrk66 no_defs <> # GCS Camp Area <37253> +proj=longlat +ellps=intl no_defs <> # GCS Deception Island <37254> +proj=longlat +ellps=clrk80 no_defs <> # GCS Gunung Segara <37255> +proj=longlat +ellps=bessel no_defs <> # GCS S42 Hungary <37257> +proj=longlat +ellps=krass no_defs <> # GCS Kusaie 1951 <37259> +proj=longlat +ellps=intl no_defs <> # GCS Alaskan Islands <37260> +proj=longlat +ellps=clrk66 no_defs <> # GCS Assumed Geographic 1 <104000> +proj=longlat +ellps=clrk66 +datum=NAD27 no_defs <> # GCS Estonia 1937 <104101> +proj=longlat +ellps=bessel no_defs <> # GCS Hermannskogel <104102> +proj=longlat +ellps=bessel no_defs <> # GCS Sierra Leone 1960 <104103> +proj=longlat +ellps=clrk80 no_defs <> # GCS Hong Kong 1980 <104104> +proj=longlat +ellps=intl no_defs <> # GCS Datum Lisboa Bessel <104105> +proj=longlat +ellps=bessel no_defs <> # GCS Datum Lisboa Hayford <104106> +proj=longlat +ellps=intl no_defs <> # GCS RGF 1993 <104107> +proj=longlat +ellps=GRS80 no_defs <> # GCS NZGD 2000 <104108> +proj=longlat +ellps=GRS80 no_defs <> # GCS Merchich Degree <104261> +proj=longlat +a=6378249.2 +b=6356514.999904194 no_defs <> # GCS Voirol 1875 Degree <104304> +proj=longlat +a=6378249.2 +b=6356514.999904194 no_defs <> # GCS Voirol Unifie 1960 Degree <104305> +proj=longlat +ellps=clrk80 no_defs <> therion/extern/proj4/nad/epsg0000664000175000017500000206414411256477230015256 0ustar useruser# HD1909 <3819> +proj=longlat +ellps=bessel +towgs84=595.48,121.69,515.35,4.115,-2.9383,0.853,-3.408 +no_defs <> # TWD67 <3821> +proj=longlat +ellps=aust_SA +no_defs <> # TWD97 <3824> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # IGRS <3889> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # MGI 1901 <3906> +proj=longlat +ellps=bessel +no_defs <> # Unknown datum based upon the Airy 1830 ellipsoid <4001> +proj=longlat +ellps=airy +no_defs <> # Unknown datum based upon the Airy Modified 1849 ellipsoid <4002> +proj=longlat +ellps=mod_airy +no_defs <> # Unknown datum based upon the Australian National Spheroid <4003> +proj=longlat +ellps=aust_SA +no_defs <> # Unknown datum based upon the Bessel 1841 ellipsoid <4004> +proj=longlat +ellps=bessel +no_defs <> # Unknown datum based upon the Bessel Modified ellipsoid <4005> +proj=longlat +a=6377492.018 +b=6356173.508712696 +no_defs <> # Unknown datum based upon the Bessel Namibia ellipsoid <4006> +proj=longlat +ellps=bess_nam +no_defs <> # Unknown datum based upon the Clarke 1858 ellipsoid <4007> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> # Unknown datum based upon the Clarke 1866 ellipsoid <4008> +proj=longlat +ellps=clrk66 +no_defs <> # Unknown datum based upon the Clarke 1866 Michigan ellipsoid <4009> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs <> # Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid <4010> +proj=longlat +a=6378300.789 +b=6356566.435 +no_defs <> # Unknown datum based upon the Clarke 1880 (IGN) ellipsoid <4011> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Unknown datum based upon the Clarke 1880 (RGS) ellipsoid <4012> +proj=longlat +ellps=clrk80 +no_defs <> # Unknown datum based upon the Clarke 1880 (Arc) ellipsoid <4013> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> # Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid <4014> +proj=longlat +a=6378249.2 +b=6356514.996941779 +no_defs <> # Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid <4015> +proj=longlat +a=6377276.345 +b=6356075.41314024 +no_defs <> # Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid <4016> +proj=longlat +ellps=evrstSS +no_defs <> # Unknown datum based upon the Everest 1830 Modified ellipsoid <4018> +proj=longlat +a=6377304.063 +b=6356103.038993155 +no_defs <> # Unknown datum based upon the GRS 1980 ellipsoid <4019> +proj=longlat +ellps=GRS80 +no_defs <> # Unknown datum based upon the Helmert 1906 ellipsoid <4020> +proj=longlat +ellps=helmert +no_defs <> # Unknown datum based upon the Indonesian National Spheroid <4021> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs <> # Unknown datum based upon the International 1924 ellipsoid <4022> +proj=longlat +ellps=intl +no_defs <> # MOLDREF99 <4023> +proj=longlat +ellps=GRS80 +no_defs <> # Unknown datum based upon the Krassowsky 1940 ellipsoid <4024> +proj=longlat +ellps=krass +no_defs <> # Unknown datum based upon the NWL 9D ellipsoid <4025> +proj=longlat +ellps=WGS66 +no_defs <> # Unknown datum based upon the Plessis 1817 ellipsoid <4027> +proj=longlat +a=6376523 +b=6355862.933255573 +no_defs <> # Unknown datum based upon the Struve 1860 ellipsoid <4028> +proj=longlat +a=6378298.3 +b=6356657.142669561 +no_defs <> # Unknown datum based upon the War Office ellipsoid <4029> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> # Unknown datum based upon the WGS 84 ellipsoid <4030> +proj=longlat +ellps=WGS84 +no_defs <> # Unknown datum based upon the GEM 10C ellipsoid <4031> +proj=longlat +ellps=WGS84 +no_defs <> # Unknown datum based upon the OSU86F ellipsoid <4032> +proj=longlat +a=6378136.2 +b=6356751.516927429 +no_defs <> # Unknown datum based upon the OSU91A ellipsoid <4033> +proj=longlat +a=6378136.3 +b=6356751.616592146 +no_defs <> # Unknown datum based upon the Clarke 1880 ellipsoid <4034> +proj=longlat +a=6378249.144808011 +b=6356514.966204134 +no_defs <> # Unknown datum based upon the Authalic Sphere <4035> +proj=longlat +a=6371000 +b=6371000 +no_defs <> # Unknown datum based upon the GRS 1967 ellipsoid <4036> +proj=longlat +ellps=GRS67 +no_defs <> # Unknown datum based upon the Average Terrestrial System 1977 ellipsoid <4041> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs <> # Unknown datum based upon the Everest (1830 Definition) ellipsoid <4042> +proj=longlat +a=6377299.36559538 +b=6356098.359005156 +no_defs <> # Unknown datum based upon the WGS 72 ellipsoid <4043> +proj=longlat +ellps=WGS72 +no_defs <> # Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid <4044> +proj=longlat +a=6377301.243 +b=6356100.230165384 +no_defs <> # Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid <4045> +proj=longlat +a=6377299.151 +b=6356098.145120132 +no_defs <> # RGRDC 2005 <4046> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Unspecified datum based upon the GRS 1980 Authalic Sphere <4047> +proj=longlat +a=6371007 +b=6371007 +no_defs <> # Unspecified datum based upon the Clarke 1866 Authalic Sphere <4052> +proj=longlat +a=6370997 +b=6370997 +no_defs <> # Unspecified datum based upon the International 1924 Authalic Sphere <4053> +proj=longlat +a=6371228 +b=6371228 +no_defs <> # Unspecified datum based upon the Hughes 1980 ellipsoid <4054> +proj=longlat +a=6378273 +b=6356889.449 +no_defs <> # Popular Visualisation CRS <4055> +proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs <> # SREF98 <4075> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # REGCAN95 <4081> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Greek <4120> +proj=longlat +ellps=bessel +no_defs <> # GGRS87 <4121> +proj=longlat +ellps=GRS80 +datum=GGRS87 +no_defs <> # ATS77 <4122> +proj=longlat +a=6378135 +b=6356750.304921594 +no_defs <> # KKJ <4123> +proj=longlat +ellps=intl +no_defs <> # RT90 <4124> +proj=longlat +ellps=bessel +no_defs <> # Samboja <4125> +proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +no_defs <> # LKS94 (ETRS89) <4126> +proj=longlat +ellps=GRS80 +no_defs <> # Tete <4127> +proj=longlat +ellps=clrk66 +no_defs <> # Madzansua <4128> +proj=longlat +ellps=clrk66 +no_defs <> # Observatario <4129> +proj=longlat +ellps=clrk66 +no_defs <> # Moznet <4130> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs <> # Indian 1960 <4131> +proj=longlat +a=6377276.345 +b=6356075.41314024 +no_defs <> # FD58 <4132> +proj=longlat +ellps=clrk80 +no_defs <> # EST92 <4133> +proj=longlat +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +no_defs <> # PSD93 <4134> +proj=longlat +ellps=clrk80 +no_defs <> # Old Hawaiian <4135> +proj=longlat +ellps=clrk66 +no_defs <> # St. Lawrence Island <4136> +proj=longlat +ellps=clrk66 +no_defs <> # St. Paul Island <4137> +proj=longlat +ellps=clrk66 +no_defs <> # St. George Island <4138> +proj=longlat +ellps=clrk66 +no_defs <> # Puerto Rico <4139> +proj=longlat +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +no_defs <> # NAD83(CSRS98) <4140> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Israel <4141> +proj=longlat +ellps=GRS80 +towgs84=-48,55,52,0,0,0,0 +no_defs <> # Locodjo 1965 <4142> +proj=longlat +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +no_defs <> # Abidjan 1987 <4143> +proj=longlat +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +no_defs <> # Kalianpur 1937 <4144> +proj=longlat +a=6377276.345 +b=6356075.41314024 +no_defs <> # Kalianpur 1962 <4145> +proj=longlat +a=6377301.243 +b=6356100.230165384 +no_defs <> # Kalianpur 1975 <4146> +proj=longlat +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +no_defs <> # Hanoi 1972 <4147> +proj=longlat +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +no_defs <> # Hartebeesthoek94 <4148> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # CH1903 <4149> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <> # CH1903+ <4150> +proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +no_defs <> # CHTRF95 <4151> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # NAD83(HARN) <4152> +proj=longlat +ellps=GRS80 +no_defs <> # Rassadiran <4153> +proj=longlat +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +no_defs <> # ED50(ED77) <4154> +proj=longlat +ellps=intl +no_defs <> # Dabola 1981 <4155> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +no_defs <> # S-JTSK <4156> +proj=longlat +ellps=bessel +no_defs <> # Mount Dillon <4157> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> # Naparima 1955 <4158> +proj=longlat +ellps=intl +no_defs <> # ELD79 <4159> +proj=longlat +ellps=intl +no_defs <> # Chos Malal 1914 <4160> +proj=longlat +ellps=intl +no_defs <> # Pampa del Castillo <4161> +proj=longlat +ellps=intl +towgs84=27.5,14,186.4,0,0,0,0 +no_defs <> # Korean 1985 <4162> +proj=longlat +ellps=bessel +no_defs <> # Yemen NGN96 <4163> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # South Yemen <4164> +proj=longlat +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +no_defs <> # Bissau <4165> +proj=longlat +ellps=intl +towgs84=-173,253,27,0,0,0,0 +no_defs <> # Korean 1995 <4166> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # NZGD2000 <4167> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Accra <4168> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> # American Samoa 1962 <4169> +proj=longlat +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +no_defs <> # SIRGAS 1995 <4170> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # RGF93 <4171> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # POSGAR <4172> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # IRENET95 <4173> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Sierra Leone 1924 <4174> +proj=longlat +a=6378300 +b=6356751.689189189 +no_defs <> # Sierra Leone 1968 <4175> +proj=longlat +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +no_defs <> # Australian Antarctic <4176> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Pulkovo 1942(83) <4178> +proj=longlat +ellps=krass +no_defs <> # Pulkovo 1942(58) <4179> +proj=longlat +ellps=krass +no_defs <> # EST97 <4180> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Luxembourg 1930 <4181> +proj=longlat +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +no_defs <> # Azores Occidental 1939 <4182> +proj=longlat +ellps=intl +no_defs <> # Azores Central 1948 <4183> +proj=longlat +ellps=intl +towgs84=-104,167,-38,0,0,0,0 +no_defs <> # Azores Oriental 1940 <4184> +proj=longlat +ellps=intl +towgs84=-203,141,53,0,0,0,0 +no_defs <> # Madeira 1936 <4185> +proj=longlat +ellps=intl +no_defs <> # OSNI 1952 <4188> +proj=longlat +ellps=airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +no_defs <> # REGVEN <4189> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # POSGAR 98 <4190> +proj=longlat +ellps=GRS80 +no_defs <> # Albanian 1987 <4191> +proj=longlat +ellps=krass +no_defs <> # Douala 1948 <4192> +proj=longlat +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +no_defs <> # Manoca 1962 <4193> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs <> # Qornoq 1927 <4194> +proj=longlat +ellps=intl +no_defs <> # Scoresbysund 1952 <4195> +proj=longlat +ellps=intl +towgs84=105,326,-102.5,0,0,0.814,-0.6 +no_defs <> # Ammassalik 1958 <4196> +proj=longlat +ellps=intl +towgs84=-45,417,-3.5,0,0,0.814,-0.6 +no_defs <> # Garoua <4197> +proj=longlat +ellps=clrk80 +no_defs <> # Kousseri <4198> +proj=longlat +ellps=clrk80 +no_defs <> # Egypt 1930 <4199> +proj=longlat +ellps=intl +no_defs <> # Pulkovo 1995 <4200> +proj=longlat +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +no_defs <> # Adindan <4201> +proj=longlat +ellps=clrk80 +no_defs <> # AGD66 <4202> +proj=longlat +ellps=aust_SA +no_defs <> # AGD84 <4203> +proj=longlat +ellps=aust_SA +no_defs <> # Ain el Abd <4204> +proj=longlat +ellps=intl +no_defs <> # Afgooye <4205> +proj=longlat +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +no_defs <> # Agadez <4206> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Lisbon <4207> +proj=longlat +ellps=intl +no_defs <> # Aratu <4208> +proj=longlat +ellps=intl +no_defs <> # Arc 1950 <4209> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> # Arc 1960 <4210> +proj=longlat +ellps=clrk80 +no_defs <> # Batavia <4211> +proj=longlat +ellps=bessel +no_defs <> # Barbados 1938 <4212> +proj=longlat +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +no_defs <> # Beduaram <4213> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0 +no_defs <> # Beijing 1954 <4214> +proj=longlat +ellps=krass +no_defs <> # Belge 1950 <4215> +proj=longlat +ellps=intl +no_defs <> # Bermuda 1957 <4216> +proj=longlat +ellps=clrk66 +no_defs <> # Bogota 1975 <4218> +proj=longlat +ellps=intl +towgs84=307,304,-318,0,0,0,0 +no_defs <> # Bukit Rimpah <4219> +proj=longlat +ellps=bessel +towgs84=-384,664,-48,0,0,0,0 +no_defs <> # Camacupa <4220> +proj=longlat +ellps=clrk80 +no_defs <> # Campo Inchauspe <4221> +proj=longlat +ellps=intl +no_defs <> # Cape <4222> +proj=longlat +a=6378249.145 +b=6356514.966398753 +no_defs <> # Carthage <4223> +proj=longlat +a=6378249.2 +b=6356515 +datum=carthage +no_defs <> # Chua <4224> +proj=longlat +ellps=intl +no_defs <> # Corrego Alegre <4225> +proj=longlat +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +no_defs <> # Cote d'Ivoire <4226> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Deir ez Zor <4227> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Douala <4228> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Egypt 1907 <4229> +proj=longlat +ellps=helmert +no_defs <> # ED50 <4230> +proj=longlat +ellps=intl +no_defs <> # ED87 <4231> +proj=longlat +ellps=intl +no_defs <> # Fahud <4232> +proj=longlat +ellps=clrk80 +no_defs <> # Gandajika 1970 <4233> +proj=longlat +ellps=intl +towgs84=-133,-321,50,0,0,0,0 +no_defs <> # Garoua <4234> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Guyane Francaise <4235> +proj=longlat +ellps=intl +no_defs <> # Hu Tzu Shan 1950 <4236> +proj=longlat +ellps=intl +towgs84=-637,-549,-203,0,0,0,0 +no_defs <> # HD72 <4237> +proj=longlat +ellps=GRS67 +no_defs <> # ID74 <4238> +proj=longlat +a=6378160 +b=6356774.50408554 +no_defs <> # Indian 1954 <4239> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +no_defs <> # Indian 1975 <4240> +proj=longlat +a=6377276.345 +b=6356075.41314024 +no_defs <> # Jamaica 1875 <4241> +proj=longlat +a=6378249.144808011 +b=6356514.966204134 +no_defs <> # JAD69 <4242> +proj=longlat +ellps=clrk66 +no_defs <> # Kalianpur 1880 <4243> +proj=longlat +a=6377299.36559538 +b=6356098.359005156 +no_defs <> # Kandawala <4244> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=-97,787,86,0,0,0,0 +no_defs <> # Kertau 1968 <4245> +proj=longlat +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +no_defs <> # KOC <4246> +proj=longlat +ellps=clrk80 +towgs84=-294.7,-200.1,525.5,0,0,0,0 +no_defs <> # La Canoa <4247> +proj=longlat +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +no_defs <> # PSAD56 <4248> +proj=longlat +ellps=intl +no_defs <> # Lake <4249> +proj=longlat +ellps=intl +no_defs <> # Leigon <4250> +proj=longlat +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +no_defs <> # Liberia 1964 <4251> +proj=longlat +ellps=clrk80 +towgs84=-90,40,88,0,0,0,0 +no_defs <> # Lome <4252> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Luzon 1911 <4253> +proj=longlat +ellps=clrk66 +no_defs <> # Hito XVIII 1963 <4254> +proj=longlat +ellps=intl +no_defs <> # Herat North <4255> +proj=longlat +ellps=intl +towgs84=-333,-222,114,0,0,0,0 +no_defs <> # Mahe 1971 <4256> +proj=longlat +ellps=clrk80 +towgs84=41,-220,-134,0,0,0,0 +no_defs <> # Makassar <4257> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +no_defs <> # ETRS89 <4258> +proj=longlat +ellps=GRS80 +no_defs <> # Malongo 1987 <4259> +proj=longlat +ellps=intl +no_defs <> # Manoca <4260> +proj=longlat +ellps=clrk80 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +no_defs <> # Merchich <4261> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +no_defs <> # Massawa <4262> +proj=longlat +ellps=bessel +towgs84=639,405,60,0,0,0,0 +no_defs <> # Minna <4263> +proj=longlat +ellps=clrk80 +no_defs <> # Mhast <4264> +proj=longlat +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +no_defs <> # Monte Mario <4265> +proj=longlat +ellps=intl +no_defs <> # M'poraloko <4266> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # NAD27 <4267> +proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs <> # NAD27 Michigan <4268> +proj=longlat +a=6378450.047548896 +b=6356826.621488444 +no_defs <> # NAD83 <4269> +proj=longlat +ellps=GRS80 +datum=NAD83 +no_defs <> # Nahrwan 1967 <4270> +proj=longlat +ellps=clrk80 +no_defs <> # Naparima 1972 <4271> +proj=longlat +ellps=intl +no_defs <> # NZGD49 <4272> +proj=longlat +ellps=intl +datum=nzgd49 +no_defs <> # NGO 1948 <4273> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +no_defs <> # Datum 73 <4274> +proj=longlat +ellps=intl +no_defs <> # NTF <4275> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +no_defs <> # NSWC 9Z-2 <4276> +proj=longlat +ellps=WGS66 +no_defs <> # OSGB 1936 <4277> +proj=longlat +ellps=airy +datum=OSGB36 +no_defs <> # OSGB70 <4278> +proj=longlat +ellps=airy +no_defs <> # OS(SN)80 <4279> +proj=longlat +ellps=airy +no_defs <> # Padang <4280> +proj=longlat +ellps=bessel +no_defs <> # Palestine 1923 <4281> +proj=longlat +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +no_defs <> # Pointe Noire <4282> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # GDA94 <4283> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Pulkovo 1942 <4284> +proj=longlat +ellps=krass +no_defs <> # Qatar 1974 <4285> +proj=longlat +ellps=intl +no_defs <> # Qatar 1948 <4286> +proj=longlat +ellps=helmert +no_defs <> # Qornoq <4287> +proj=longlat +ellps=intl +towgs84=164,138,-189,0,0,0,0 +no_defs <> # Loma Quintana <4288> +proj=longlat +ellps=intl +no_defs <> # Amersfoort <4289> +proj=longlat +ellps=bessel +no_defs <> # SAD69 <4291> +proj=longlat +ellps=GRS67 +no_defs <> # Sapper Hill 1943 <4292> +proj=longlat +ellps=intl +towgs84=-355,21,72,0,0,0,0 +no_defs <> # Schwarzeck <4293> +proj=longlat +ellps=bess_nam +no_defs <> # Segora <4294> +proj=longlat +ellps=bessel +no_defs <> # Serindung <4295> +proj=longlat +ellps=bessel +no_defs <> # Sudan <4296> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Tananarive <4297> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +no_defs <> # Timbalai 1948 <4298> +proj=longlat +ellps=evrstSS +no_defs <> # TM65 <4299> +proj=longlat +ellps=mod_airy +datum=ire65 +no_defs <> # TM75 <4300> +proj=longlat +ellps=mod_airy +no_defs <> # Tokyo <4301> +proj=longlat +ellps=bessel +no_defs <> # Trinidad 1903 <4302> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> # TC(1948) <4303> +proj=longlat +ellps=helmert +no_defs <> # Voirol 1875 <4304> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +no_defs <> # Bern 1938 <4306> +proj=longlat +ellps=bessel +no_defs <> # Nord Sahara 1959 <4307> +proj=longlat +ellps=clrk80 +no_defs <> # RT38 <4308> +proj=longlat +ellps=bessel +no_defs <> # Yacare <4309> +proj=longlat +ellps=intl +towgs84=-155,171,37,0,0,0,0 +no_defs <> # Yoff <4310> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Zanderij <4311> +proj=longlat +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +no_defs <> # MGI <4312> +proj=longlat +ellps=bessel +datum=hermannskogel +no_defs <> # Belge 1972 <4313> +proj=longlat +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1 +no_defs <> # DHDN <4314> +proj=longlat +ellps=bessel +datum=potsdam +no_defs <> # Conakry 1905 <4315> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +no_defs <> # Dealul Piscului 1930 <4316> +proj=longlat +ellps=intl +no_defs <> # Dealul Piscului 1970 <4317> +proj=longlat +ellps=krass +no_defs <> # NGN <4318> +proj=longlat +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +no_defs <> # KUDAMS <4319> +proj=longlat +ellps=GRS80 +no_defs <> # WGS 72 <4322> +proj=longlat +ellps=WGS72 +no_defs <> # WGS 72BE <4324> +proj=longlat +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +no_defs <> # WGS 84 <4326> +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs <> # Anguilla 1957 <4600> +proj=longlat +ellps=clrk80 +no_defs <> # Antigua 1943 <4601> +proj=longlat +ellps=clrk80 +no_defs <> # Dominica 1945 <4602> +proj=longlat +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +no_defs <> # Grenada 1953 <4603> +proj=longlat +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +no_defs <> # Montserrat 1958 <4604> +proj=longlat +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +no_defs <> # St. Kitts 1955 <4605> +proj=longlat +ellps=clrk80 +no_defs <> # St. Lucia 1955 <4606> +proj=longlat +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +no_defs <> # St. Vincent 1945 <4607> +proj=longlat +ellps=clrk80 +towgs84=195.671,332.517,274.607,0,0,0,0 +no_defs <> # NAD27(76) <4608> +proj=longlat +ellps=clrk66 +no_defs <> # NAD27(CGQ77) <4609> +proj=longlat +ellps=clrk66 +no_defs <> # Xian 1980 <4610> +proj=longlat +a=6378140 +b=6356755.288157528 +no_defs <> # Hong Kong 1980 <4611> +proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +no_defs <> # JGD2000 <4612> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Segara <4613> +proj=longlat +ellps=bessel +no_defs <> # QND95 <4614> +proj=longlat +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +no_defs <> # Porto Santo <4615> +proj=longlat +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +no_defs <> # Selvagem Grande <4616> +proj=longlat +ellps=intl +no_defs <> # NAD83(CSRS) <4617> +proj=longlat +ellps=GRS80 +no_defs <> # SAD69 <4618> +proj=longlat +ellps=aust_SA +no_defs <> # SWEREF99 <4619> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Point 58 <4620> +proj=longlat +ellps=clrk80 +towgs84=-106,-129,165,0,0,0,0 +no_defs <> # Fort Marigot <4621> +proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0 +no_defs <> # Guadeloupe 1948 <4622> +proj=longlat +ellps=intl +no_defs <> # CSG67 <4623> +proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0 +no_defs <> # RGFG95 <4624> +proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +no_defs <> # Martinique 1938 <4625> +proj=longlat +ellps=intl +no_defs <> # Reunion 1947 <4626> +proj=longlat +ellps=intl +no_defs <> # RGR92 <4627> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Tahiti 52 <4628> +proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0 +no_defs <> # Tahaa 54 <4629> +proj=longlat +ellps=intl +no_defs <> # IGN72 Nuku Hiva <4630> +proj=longlat +ellps=intl +no_defs <> # K0 1949 <4631> +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs <> # Combani 1950 <4632> +proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +no_defs <> # IGN56 Lifou <4633> +proj=longlat +ellps=intl +no_defs <> # IGN72 Grand Terre <4634> +proj=longlat +ellps=intl +no_defs <> # ST87 Ouvea <4635> +proj=longlat +ellps=intl +towgs84=-122.383,-188.696,103.344,3.5107,-4.9668,-5.7047,4.4798 +no_defs <> # Petrels 1972 <4636> +proj=longlat +ellps=intl +towgs84=365,194,166,0,0,0,0 +no_defs <> # Perroud 1950 <4637> +proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0 +no_defs <> # Saint Pierre et Miquelon 1950 <4638> +proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +no_defs <> # MOP78 <4639> +proj=longlat +ellps=intl +no_defs <> # RRAF 1991 <4640> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # IGN53 Mare <4641> +proj=longlat +ellps=intl +no_defs <> # ST84 Ile des Pins <4642> +proj=longlat +ellps=intl +no_defs <> # ST71 Belep <4643> +proj=longlat +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7 +no_defs <> # NEA74 Noumea <4644> +proj=longlat +ellps=intl +no_defs <> # RGNC 1991 <4645> +proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0 +no_defs <> # Grand Comoros <4646> +proj=longlat +ellps=intl +no_defs <> # Reykjavik 1900 <4657> +proj=longlat +a=6377019.27 +b=6355762.5391 +towgs84=-28,199,5,0,0,0,0 +no_defs <> # Hjorsey 1955 <4658> +proj=longlat +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +no_defs <> # ISN93 <4659> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Helle 1954 <4660> +proj=longlat +ellps=intl +towgs84=982.609,552.753,-540.873,32.3934,-153.257,-96.2266,16.805 +no_defs <> # LKS92 <4661> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # IGN72 Grande Terre <4662> +proj=longlat +ellps=intl +no_defs <> # Porto Santo 1995 <4663> +proj=longlat +ellps=intl +no_defs <> # Azores Oriental 1995 <4664> +proj=longlat +ellps=intl +no_defs <> # Azores Central 1995 <4665> +proj=longlat +ellps=intl +no_defs <> # Lisbon 1890 <4666> +proj=longlat +ellps=bessel +no_defs <> # IKBD-92 <4667> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # ED79 <4668> +proj=longlat +ellps=intl +towgs84=-86,-98,-119,0,0,0,0 +no_defs <> # LKS94 <4669> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # IGM95 <4670> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Voirol 1879 <4671> +proj=longlat +a=6378249.2 +b=6356515 +no_defs <> # Chatham Islands 1971 <4672> +proj=longlat +ellps=intl +towgs84=175,-38,113,0,0,0,0 +no_defs <> # Chatham Islands 1979 <4673> +proj=longlat +ellps=intl +towgs84=174.05,-25.49,112.57,-0,-0,0.554,0.2263 +no_defs <> # SIRGAS 2000 <4674> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Guam 1963 <4675> +proj=longlat +ellps=clrk66 +towgs84=-100,-248,259,0,0,0,0 +no_defs <> # Vientiane 1982 <4676> +proj=longlat +ellps=krass +no_defs <> # Lao 1993 <4677> +proj=longlat +ellps=krass +no_defs <> # Lao 1997 <4678> +proj=longlat +ellps=krass +towgs84=44.585,-131.212,-39.544,0,0,0,0 +no_defs <> # Jouik 1961 <4679> +proj=longlat +ellps=clrk80 +towgs84=-80.01,253.26,291.19,0,0,0,0 +no_defs <> # Nouakchott 1965 <4680> +proj=longlat +ellps=clrk80 +towgs84=124.5,-63.5,-281,0,0,0,0 +no_defs <> # Mauritania 1999 <4681> +proj=longlat +ellps=clrk80 +no_defs <> # Gulshan 303 <4682> +proj=longlat +a=6377276.345 +b=6356075.41314024 +no_defs <> # PRS92 <4683> +proj=longlat +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +no_defs <> # Gan 1970 <4684> +proj=longlat +ellps=intl +towgs84=-133,-321,50,0,0,0,0 +no_defs <> # Gandajika <4685> +proj=longlat +ellps=intl +no_defs <> # MAGNA-SIRGAS <4686> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # RGPF <4687> +proj=longlat +ellps=GRS80 +no_defs <> # Fatu Iva 72 <4688> +proj=longlat +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +no_defs <> # IGN63 Hiva Oa <4689> +proj=longlat +ellps=intl +no_defs <> # Tahiti 79 <4690> +proj=longlat +ellps=intl +no_defs <> # Moorea 87 <4691> +proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +no_defs <> # Maupiti 83 <4692> +proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +no_defs <> # Nakhl-e Ghanem <4693> +proj=longlat +ellps=WGS84 +towgs84=0,-0.15,0.68,0,0,0,0 +no_defs <> # POSGAR 94 <4694> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Katanga 1955 <4695> +proj=longlat +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +no_defs <> # Kasai 1953 <4696> +proj=longlat +ellps=clrk80 +no_defs <> # IGC 1962 6th Parallel South <4697> +proj=longlat +ellps=clrk80 +no_defs <> # IGN 1962 Kerguelen <4698> +proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0 +no_defs <> # Le Pouce 1934 <4699> +proj=longlat +ellps=clrk80 +towgs84=-770.1,158.4,-498.2,0,0,0,0 +no_defs <> # IGN Astro 1960 <4700> +proj=longlat +ellps=clrk80 +no_defs <> # IGCB 1955 <4701> +proj=longlat +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +no_defs <> # Mauritania 1999 <4702> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Mhast 1951 <4703> +proj=longlat +ellps=clrk80 +no_defs <> # Mhast (onshore) <4704> +proj=longlat +ellps=intl +no_defs <> # Mhast (offshore) <4705> +proj=longlat +ellps=intl +no_defs <> # Egypt Gulf of Suez S-650 TL <4706> +proj=longlat +ellps=helmert +towgs84=-146.21,112.63,4.05,0,0,0,0 +no_defs <> # Tern Island 1961 <4707> +proj=longlat +ellps=intl +towgs84=114,-116,-333,0,0,0,0 +no_defs <> # Cocos Islands 1965 <4708> +proj=longlat +ellps=aust_SA +towgs84=-491,-22,435,0,0,0,0 +no_defs <> # Iwo Jima 1945 <4709> +proj=longlat +ellps=intl +towgs84=145,75,-272,0,0,0,0 +no_defs <> # St. Helena 1971 <4710> +proj=longlat +ellps=intl +towgs84=-320,550,-494,0,0,0,0 +no_defs <> # Marcus Island 1952 <4711> +proj=longlat +ellps=intl +towgs84=124,-234,-25,0,0,0,0 +no_defs <> # Ascension Island 1958 <4712> +proj=longlat +ellps=intl +towgs84=-205,107,53,0,0,0,0 +no_defs <> # Ayabelle Lighthouse <4713> +proj=longlat +ellps=clrk80 +towgs84=-79,-129,145,0,0,0,0 +no_defs <> # Bellevue <4714> +proj=longlat +ellps=intl +towgs84=-127,-769,472,0,0,0,0 +no_defs <> # Camp Area Astro <4715> +proj=longlat +ellps=intl +towgs84=-104,-129,239,0,0,0,0 +no_defs <> # Phoenix Islands 1966 <4716> +proj=longlat +ellps=intl +towgs84=298,-304,-375,0,0,0,0 +no_defs <> # Cape Canaveral <4717> +proj=longlat +ellps=clrk66 +towgs84=-2,151,181,0,0,0,0 +no_defs <> # Solomon 1968 <4718> +proj=longlat +ellps=intl +no_defs <> # Easter Island 1967 <4719> +proj=longlat +ellps=intl +towgs84=211,147,111,0,0,0,0 +no_defs <> # Fiji 1986 <4720> +proj=longlat +ellps=WGS72 +no_defs <> # Fiji 1956 <4721> +proj=longlat +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +no_defs <> # South Georgia 1968 <4722> +proj=longlat +ellps=intl +towgs84=-794,119,-298,0,0,0,0 +no_defs <> # Grand Cayman 1959 <4723> +proj=longlat +ellps=clrk66 +towgs84=67.8,106.1,138.8,0,0,0,0 +no_defs <> # Diego Garcia 1969 <4724> +proj=longlat +ellps=intl +towgs84=208,-435,-229,0,0,0,0 +no_defs <> # Johnston Island 1961 <4725> +proj=longlat +ellps=intl +towgs84=189,-79,-202,0,0,0,0 +no_defs <> # Little Cayman 1961 <4726> +proj=longlat +ellps=clrk66 +no_defs <> # Midway 1961 <4727> +proj=longlat +ellps=intl +no_defs <> # Pico de las Nieves 1984 <4728> +proj=longlat +ellps=intl +towgs84=-307,-92,127,0,0,0,0 +no_defs <> # Pitcairn 1967 <4729> +proj=longlat +ellps=intl +towgs84=185,165,42,0,0,0,0 +no_defs <> # Santo 1965 <4730> +proj=longlat +ellps=intl +towgs84=170,42,84,0,0,0,0 +no_defs <> # Viti Levu 1916 <4731> +proj=longlat +ellps=clrk80 +towgs84=51,391,-36,0,0,0,0 +no_defs <> # Marshall Islands 1960 <4732> +proj=longlat +a=6378270 +b=6356794.343434343 +towgs84=102,52,-38,0,0,0,0 +no_defs <> # Wake Island 1952 <4733> +proj=longlat +ellps=intl +towgs84=276,-57,149,0,0,0,0 +no_defs <> # Tristan 1968 <4734> +proj=longlat +ellps=intl +towgs84=-632,438,-609,0,0,0,0 +no_defs <> # Kusaie 1951 <4735> +proj=longlat +ellps=intl +towgs84=647,1777,-1124,0,0,0,0 +no_defs <> # Deception Island <4736> +proj=longlat +ellps=clrk80 +towgs84=260,12,-147,0,0,0,0 +no_defs <> # Korea 2000 <4737> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Hong Kong 1963 <4738> +proj=longlat +a=6378293.645208759 +b=6356617.987679838 +no_defs <> # Hong Kong 1963(67) <4739> +proj=longlat +ellps=intl +towgs84=-156,-271,-189,0,0,0,0 +no_defs <> # PZ-90 <4740> +proj=longlat +a=6378136 +b=6356751.361745712 +no_defs <> # FD54 <4741> +proj=longlat +ellps=intl +no_defs <> # GDM2000 <4742> +proj=longlat +ellps=GRS80 +no_defs <> # Karbala 1979 <4743> +proj=longlat +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +no_defs <> # Nahrwan 1934 <4744> +proj=longlat +ellps=clrk80 +no_defs <> # RD/83 <4745> +proj=longlat +ellps=bessel +no_defs <> # PD/83 <4746> +proj=longlat +ellps=bessel +no_defs <> # GR96 <4747> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Vanua Levu 1915 <4748> +proj=longlat +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0 +no_defs <> # RGNC91-93 <4749> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # ST87 Ouvea <4750> +proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +no_defs <> # Kertau (RSO) <4751> +proj=longlat +a=6377295.664 +b=6356094.667915204 +no_defs <> # Viti Levu 1912 <4752> +proj=longlat +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0 +no_defs <> # fk89 <4753> +proj=longlat +ellps=intl +no_defs <> # LGD2006 <4754> +proj=longlat +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +no_defs <> # DGN95 <4755> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # VN-2000 <4756> +proj=longlat +ellps=WGS84 +no_defs <> # SVY21 <4757> +proj=longlat +ellps=WGS84 +no_defs <> # JAD2001 <4758> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # NAD83(NSRS2007) <4759> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # WGS 66 <4760> +proj=longlat +ellps=WGS66 +no_defs <> # HTRS96 <4761> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # BDA2000 <4762> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Pitcairn 2006 <4763> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs <> # RSRGD2000 <4764> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Slovenia 1996 <4765> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs <> # Bern 1898 (Bern) <4801> +proj=longlat +ellps=bessel +pm=bern +no_defs <> # Bogota 1975 (Bogota) <4802> +proj=longlat +ellps=intl +pm=bogota +no_defs <> # Lisbon (Lisbon) <4803> +proj=longlat +ellps=intl +pm=lisbon +no_defs <> # Makassar (Jakarta) <4804> +proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +no_defs <> # MGI (Ferro) <4805> +proj=longlat +ellps=bessel +pm=ferro +no_defs <> # Monte Mario (Rome) <4806> +proj=longlat +ellps=intl +pm=rome +no_defs <> # NTF (Paris) <4807> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +no_defs <> # Padang (Jakarta) <4808> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> # Belge 1950 (Brussels) <4809> +proj=longlat +ellps=intl +pm=brussels +no_defs <> # Tananarive (Paris) <4810> +proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +no_defs <> # Voirol 1875 (Paris) <4811> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +pm=paris +no_defs <> # Batavia (Jakarta) <4813> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> # RT38 (Stockholm) <4814> +proj=longlat +ellps=bessel +pm=stockholm +no_defs <> # Greek (Athens) <4815> +proj=longlat +ellps=bessel +pm=athens +no_defs <> # Carthage (Paris) <4816> +proj=longlat +a=6378249.2 +b=6356515 +pm=paris +no_defs <> # NGO 1948 (Oslo) <4817> +proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +no_defs <> # S-JTSK (Ferro) <4818> +proj=longlat +ellps=bessel +pm=ferro +no_defs <> # Nord Sahara 1959 (Paris) <4819> +proj=longlat +ellps=clrk80 +pm=paris +no_defs <> # Segara (Jakarta) <4820> +proj=longlat +ellps=bessel +pm=jakarta +no_defs <> # Voirol 1879 (Paris) <4821> +proj=longlat +a=6378249.2 +b=6356515 +pm=paris +no_defs <> # unnamed ellipse <4901> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=2.3372291666985 +no_defs <> # NDG (Paris) <4902> +proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris +no_defs <> # Madrid 1870 (Madrid) <4903> +proj=longlat +a=6378298.3 +b=6356657.142669561 +pm=madrid +no_defs <> # Lisbon 1890 (Lisbon) <4904> +proj=longlat +ellps=bessel +pm=lisbon +no_defs <> # Anguilla 1957 / British West Indies Grid <2000> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> # Antigua 1943 / British West Indies Grid <2001> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> # Dominica 1945 / British West Indies Grid <2002> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +units=m +no_defs <> # Grenada 1953 / British West Indies Grid <2003> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +units=m +no_defs <> # Montserrat 1958 / British West Indies Grid <2004> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +units=m +no_defs <> # St. Kitts 1955 / British West Indies Grid <2005> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m +no_defs <> # St. Lucia 1955 / British West Indies Grid <2006> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +units=m +no_defs <> # St. Vincent 45 / British West Indies Grid <2007> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=195.671,332.517,274.607,0,0,0,0 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 2 <2008> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 3 <2009> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 4 <2010> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 5 <2011> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 6 <2012> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 7 <2013> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 8 <2014> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 9 <2015> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / SCoPQ zone 10 <2016> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 8 <2017> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 9 <2018> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 10 <2019> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 11 <2020> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 12 <2021> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 13 <2022> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 14 <2023> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 15 <2024> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 16 <2025> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / MTM zone 17 <2026> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / UTM zone 15N <2027> +proj=utm +zone=15 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / UTM zone 16N <2028> +proj=utm +zone=16 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / UTM zone 17N <2029> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> # NAD27(76) / UTM zone 18N <2030> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / UTM zone 17N <2031> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / UTM zone 18N <2032> +proj=utm +zone=18 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / UTM zone 19N <2033> +proj=utm +zone=19 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / UTM zone 20N <2034> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs <> # NAD27(CGQ77) / UTM zone 21N <2035> +proj=utm +zone=21 +ellps=clrk66 +units=m +no_defs <> # NAD83(CSRS98) / New Brunswick Stereo (deprecated) <2036> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 19N (deprecated) <2037> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 20N (deprecated) <2038> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Israel / Israeli TM Grid <2039> +proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.0000067 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +towgs84=-48,55,52,0,0,0,0 +units=m +no_defs <> # Locodjo 1965 / UTM zone 30N <2040> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> # Abidjan 1987 / UTM zone 30N <2041> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> # Locodjo 1965 / UTM zone 29N <2042> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> # Abidjan 1987 / UTM zone 29N <2043> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> # Hanoi 1972 / Gauss-Kruger zone 18 <2044> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> # Hanoi 1972 / Gauss-Kruger zone 19 <2045> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> # Hartebeesthoek94 / Lo15 # Unable to translate coordinate system EPSG:2046 into PROJ.4 format. # # Hartebeesthoek94 / Lo17 # Unable to translate coordinate system EPSG:2047 into PROJ.4 format. # # Hartebeesthoek94 / Lo19 # Unable to translate coordinate system EPSG:2048 into PROJ.4 format. # # Hartebeesthoek94 / Lo21 # Unable to translate coordinate system EPSG:2049 into PROJ.4 format. # # Hartebeesthoek94 / Lo23 # Unable to translate coordinate system EPSG:2050 into PROJ.4 format. # # Hartebeesthoek94 / Lo25 # Unable to translate coordinate system EPSG:2051 into PROJ.4 format. # # Hartebeesthoek94 / Lo27 # Unable to translate coordinate system EPSG:2052 into PROJ.4 format. # # Hartebeesthoek94 / Lo29 # Unable to translate coordinate system EPSG:2053 into PROJ.4 format. # # Hartebeesthoek94 / Lo31 # Unable to translate coordinate system EPSG:2054 into PROJ.4 format. # # Hartebeesthoek94 / Lo33 # Unable to translate coordinate system EPSG:2055 into PROJ.4 format. # # CH1903+ / LV95 <2056> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> # Rassadiran / Nakhl e Taqi <2057> +proj=omerc +lat_0=27.51882880555555 +lonc=52.60353916666667 +alpha=0.5716611944444444 +k=0.999895934 +x_0=658377.437 +y_0=3044969.194 +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +units=m +no_defs <> # ED50(ED77) / UTM zone 38N <2058> +proj=utm +zone=38 +ellps=intl +units=m +no_defs <> # ED50(ED77) / UTM zone 39N <2059> +proj=utm +zone=39 +ellps=intl +units=m +no_defs <> # ED50(ED77) / UTM zone 40N <2060> +proj=utm +zone=40 +ellps=intl +units=m +no_defs <> # ED50(ED77) / UTM zone 41N <2061> +proj=utm +zone=41 +ellps=intl +units=m +no_defs <> # Madrid 1870 (Madrid) / Spain <2062> +proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m +no_defs <> # Dabola 1981 / UTM zone 28N (deprecated) <2063> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> # Dabola 1981 / UTM zone 29N (deprecated) <2064> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> # S-JTSK (Ferro) / Krovak <2065> +proj=krovak +lat_0=49.5 +lon_0=42.5 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # Mount Dillon / Tobago Grid <2066> +proj=cass +lat_0=11.25217861111111 +lon_0=-60.68600888888889 +x_0=37718.66159325 +y_0=36209.91512952 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.201166195164 +no_defs <> # Naparima 1955 / UTM zone 20N <2067> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 5 <2068> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 6 <2069> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 7 <2070> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 8 <2071> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 9 <2072> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 10 <2073> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 11 <2074> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 12 <2075> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / Libya zone 13 <2076> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m +no_defs <> # ELD79 / UTM zone 32N <2077> +proj=utm +zone=32 +ellps=intl +units=m +no_defs <> # ELD79 / UTM zone 33N <2078> +proj=utm +zone=33 +ellps=intl +units=m +no_defs <> # ELD79 / UTM zone 34N <2079> +proj=utm +zone=34 +ellps=intl +units=m +no_defs <> # ELD79 / UTM zone 35N <2080> +proj=utm +zone=35 +ellps=intl +units=m +no_defs <> # Chos Malal 1914 / Argentina zone 2 <2081> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Pampa del Castillo / Argentina zone 2 <2082> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=27.5,14,186.4,0,0,0,0 +units=m +no_defs <> # Hito XVIII 1963 / Argentina zone 2 <2083> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Hito XVIII 1963 / UTM zone 19S <2084> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs <> # NAD27 / Cuba Norte (deprecated) <2085> +proj=lcc +lat_1=22.35 +lat_0=22.35 +lon_0=-81 +k_0=0.99993602 +x_0=500000 +y_0=280296.016 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Cuba Sur (deprecated) <2086> +proj=lcc +lat_1=20.71666666666667 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +k_0=0.99994848 +x_0=500000 +y_0=229126.939 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # ELD79 / TM 12 NE <2087> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Carthage / TM 11 NE <2088> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9996 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +datum=carthage +units=m +no_defs <> # Yemen NGN96 / UTM zone 38N <2089> +proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Yemen NGN96 / UTM zone 39N <2090> +proj=utm +zone=39 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # South Yemen / Gauss Kruger zone 8 (deprecated) <2091> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> # South Yemen / Gauss Kruger zone 9 (deprecated) <2092> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> # Hanoi 1972 / GK 106 NE <2093> +proj=tmerc +lat_0=0 +lon_0=106 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m +no_defs <> # WGS 72BE / TM 106 NE <2094> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # Bissau / UTM zone 28N <2095> +proj=utm +zone=28 +ellps=intl +towgs84=-173,253,27,0,0,0,0 +units=m +no_defs <> # Korean 1985 / Korea East Belt <2096> +proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> # Korean 1985 / Korea Central Belt <2097> +proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> # Korean 1985 / Korea West Belt <2098> +proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m +no_defs <> # Qatar 1948 / Qatar Grid <2099> +proj=cass +lat_0=25.38236111111111 +lon_0=50.76138888888889 +x_0=100000 +y_0=100000 +ellps=helmert +units=m +no_defs <> # GGRS87 / Greek Grid <2100> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=GGRS87 +units=m +no_defs <> # Lake / Maracaibo Grid M1 <2101> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=0 +y_0=-52684.972 +ellps=intl +units=m +no_defs <> # Lake / Maracaibo Grid <2102> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=200000 +y_0=147315.028 +ellps=intl +units=m +no_defs <> # Lake / Maracaibo Grid M3 <2103> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=500000 +y_0=447315.028 +ellps=intl +units=m +no_defs <> # Lake / Maracaibo La Rosa Grid <2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=-17044 +y_0=-23139.97 +ellps=intl +units=m +no_defs <> # NZGD2000 / Mount Eden 2000 <2105> +proj=tmerc +lat_0=-36.87972222222222 +lon_0=174.7641666666667 +k=0.9999 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Bay of Plenty 2000 <2106> +proj=tmerc +lat_0=-37.76111111111111 +lon_0=176.4661111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Poverty Bay 2000 <2107> +proj=tmerc +lat_0=-38.62444444444444 +lon_0=177.8855555555556 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Hawkes Bay 2000 <2108> +proj=tmerc +lat_0=-39.65083333333333 +lon_0=176.6736111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Taranaki 2000 <2109> +proj=tmerc +lat_0=-39.13555555555556 +lon_0=174.2277777777778 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Tuhirangi 2000 <2110> +proj=tmerc +lat_0=-39.51222222222222 +lon_0=175.64 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Wanganui 2000 <2111> +proj=tmerc +lat_0=-40.24194444444444 +lon_0=175.4880555555555 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Wairarapa 2000 <2112> +proj=tmerc +lat_0=-40.92527777777777 +lon_0=175.6472222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Wellington 2000 <2113> +proj=tmerc +lat_0=-41.3011111111111 +lon_0=174.7763888888889 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Collingwood 2000 <2114> +proj=tmerc +lat_0=-40.71472222222223 +lon_0=172.6719444444444 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Nelson 2000 <2115> +proj=tmerc +lat_0=-41.27444444444444 +lon_0=173.2991666666667 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Karamea 2000 <2116> +proj=tmerc +lat_0=-41.28972222222222 +lon_0=172.1088888888889 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Buller 2000 <2117> +proj=tmerc +lat_0=-41.81055555555555 +lon_0=171.5811111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Grey 2000 <2118> +proj=tmerc +lat_0=-42.33361111111111 +lon_0=171.5497222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Amuri 2000 <2119> +proj=tmerc +lat_0=-42.68888888888888 +lon_0=173.01 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Marlborough 2000 <2120> +proj=tmerc +lat_0=-41.54444444444444 +lon_0=173.8019444444444 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Hokitika 2000 <2121> +proj=tmerc +lat_0=-42.88611111111111 +lon_0=170.9797222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Okarito 2000 <2122> +proj=tmerc +lat_0=-43.11 +lon_0=170.2608333333333 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Jacksons Bay 2000 <2123> +proj=tmerc +lat_0=-43.97777777777778 +lon_0=168.6061111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Mount Pleasant 2000 <2124> +proj=tmerc +lat_0=-43.59055555555556 +lon_0=172.7269444444445 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Gawler 2000 <2125> +proj=tmerc +lat_0=-43.74861111111111 +lon_0=171.3605555555555 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Timaru 2000 <2126> +proj=tmerc +lat_0=-44.40194444444445 +lon_0=171.0572222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Lindis Peak 2000 <2127> +proj=tmerc +lat_0=-44.735 +lon_0=169.4675 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Mount Nicholas 2000 <2128> +proj=tmerc +lat_0=-45.13277777777778 +lon_0=168.3986111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Mount York 2000 <2129> +proj=tmerc +lat_0=-45.56361111111111 +lon_0=167.7386111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Observation Point 2000 <2130> +proj=tmerc +lat_0=-45.81611111111111 +lon_0=170.6283333333333 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / North Taieri 2000 <2131> +proj=tmerc +lat_0=-45.86138888888889 +lon_0=170.2825 +k=0.99996 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Bluff 2000 <2132> +proj=tmerc +lat_0=-46.6 +lon_0=168.3427777777778 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / UTM zone 58S <2133> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / UTM zone 59S <2134> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / UTM zone 60S <2135> +proj=utm +zone=60 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Accra / Ghana National Grid <2136> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.99975 +x_0=274319.7391633579 +y_0=0 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> # Accra / TM 1 NW <2137> +proj=tmerc +lat_0=0 +lon_0=-1 +k=0.9996 +x_0=500000 +y_0=0 +a=6378300 +b=6356751.689189189 +units=m +no_defs <> # NAD27(CGQ77) / Quebec Lambert <2138> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # NAD83(CSRS98) / SCoPQ zone 2 (deprecated) <2139> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 3 (deprecated) <2140> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 4 (deprecated) <2141> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 5 (deprecated) <2142> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 6 (deprecated) <2143> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 7 (deprecated) <2144> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 8 (deprecated) <2145> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 9 (deprecated) <2146> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / MTM zone 10 (deprecated) <2147> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 21N (deprecated) <2148> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 18N (deprecated) <2149> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 17N (deprecated) <2150> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 13N (deprecated) <2151> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 12N (deprecated) <2152> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS98) / UTM zone 11N (deprecated) <2153> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / Lambert-93 <2154> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # American Samoa 1962 / American Samoa Lambert (deprecated) <2155> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +units=us-ft +no_defs <> # NAD83(HARN) / UTM zone 59S (deprecated) <2156> +proj=utm +zone=59 +south +ellps=GRS80 +units=m +no_defs <> # IRENET95 / Irish Transverse Mercator <2157> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=0.99982 +x_0=600000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IRENET95 / UTM zone 29N <2158> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Sierra Leone 1924 / New Colony Grid <2159> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1 +x_0=152399.8550907544 +y_0=0 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> # Sierra Leone 1924 / New War Office Grid <2160> +proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1 +x_0=243839.7681452071 +y_0=182879.8261089053 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088 +no_defs <> # Sierra Leone 1968 / UTM zone 28N <2161> +proj=utm +zone=28 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs <> # Sierra Leone 1968 / UTM zone 29N <2162> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m +no_defs <> # unnamed <2163> +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs <> # Locodjo 1965 / TM 5 NW <2164> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m +no_defs <> # Abidjan 1987 / TM 5 NW <2165> +proj=tmerc +lat_0=0 +lon_0=-5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m +no_defs <> # Pulkovo 1942(83) / Gauss Kruger zone 3 (deprecated) <2166> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / Gauss Kruger zone 4 (deprecated) <2167> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / Gauss Kruger zone 5 (deprecated) <2168> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Luxembourg 1930 / Gauss <2169> +proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +units=m +no_defs <> # MGI / Slovenia Grid (deprecated) <2170> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # Pulkovo 1942(58) / Poland zone I (deprecated) <2171> +proj=sterea +lat_0=50.625 +lon_0=21.08333333333333 +k=0.9998 +x_0=4637000 +y_0=5647000 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Poland zone II <2172> +proj=sterea +lat_0=53.00194444444445 +lon_0=21.50277777777778 +k=0.9998 +x_0=4603000 +y_0=5806000 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Poland zone III <2173> +proj=sterea +lat_0=53.58333333333334 +lon_0=17.00833333333333 +k=0.9998 +x_0=3501000 +y_0=5999000 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Poland zone IV <2174> +proj=sterea +lat_0=51.67083333333333 +lon_0=16.67222222222222 +k=0.9998 +x_0=3703000 +y_0=5627000 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Poland zone V <2175> +proj=tmerc +lat_0=0 +lon_0=18.95833333333333 +k=0.999983 +x_0=237000 +y_0=-4700000 +ellps=krass +units=m +no_defs <> # ETRS89 / Poland CS2000 zone 5 <2176> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.999923 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Poland CS2000 zone 6 <2177> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.999923 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Poland CS2000 zone 7 <2178> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.999923 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Poland CS2000 zone 8 <2179> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.999923 +x_0=8500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Poland CS92 <2180> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs <> # Azores Occidental 1939 / UTM zone 25N <2188> +proj=utm +zone=25 +ellps=intl +units=m +no_defs <> # Azores Central 1948 / UTM zone 26N <2189> +proj=utm +zone=26 +ellps=intl +towgs84=-104,167,-38,0,0,0,0 +units=m +no_defs <> # Azores Oriental 1940 / UTM zone 26N <2190> +proj=utm +zone=26 +ellps=intl +towgs84=-203,141,53,0,0,0,0 +units=m +no_defs <> # Madeira 1936 / UTM zone 28N (deprecated) <2191> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> # ED50 / France EuroLambert <2192> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=intl +units=m +no_defs <> # NZGD2000 / New Zealand Transverse Mercator 2000 <2193> +proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # American Samoa 1962 / American Samoa Lambert (deprecated) <2194> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +units=us-ft +no_defs <> # NAD83(HARN) / UTM zone 2S <2195> +proj=utm +zone=2 +south +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Kp2000 Jutland <2196> +proj=tmerc +lat_0=0 +lon_0=9.5 +k=0.99995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Kp2000 Zealand <2197> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.99995 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Kp2000 Bornholm <2198> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # Albanian 1987 / Gauss Kruger zone 4 (deprecated) <2199> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # ATS77 / New Brunswick Stereographic (ATS77) <2200> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=300000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # REGVEN / UTM zone 18N <2201> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # REGVEN / UTM zone 19N <2202> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # REGVEN / UTM zone 20N <2203> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD27 / Tennessee <2204> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=609601.2192024384 +y_0=30480.06096012192 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD83 / Kentucky North <2205> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 9 <2206> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 10 <2207> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 11 <2208> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 12 <2209> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 13 <2210> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 14 <2211> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / 3-degree Gauss-Kruger zone 15 <2212> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ETRS89 / TM 30 NE <2213> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # Douala 1948 / AOF west (deprecated) <2214> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +units=m +no_defs <> # Manoca 1962 / UTM zone 32N <2215> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +units=m +no_defs <> # Qornoq 1927 / UTM zone 22N <2216> +proj=utm +zone=22 +ellps=intl +units=m +no_defs <> # Qornoq 1927 / UTM zone 23N <2217> +proj=utm +zone=23 +ellps=intl +units=m +no_defs <> # Scoresbysund 1952 / Greenland zone 5 east # Unable to translate coordinate system EPSG:2218 into PROJ.4 format. # # ATS77 / UTM zone 19N <2219> +proj=utm +zone=19 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # ATS77 / UTM zone 20N <2220> +proj=utm +zone=20 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # Scoresbysund 1952 / Greenland zone 6 east # Unable to translate coordinate system EPSG:2221 into PROJ.4 format. # # NAD83 / Arizona East (ft) <2222> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Arizona Central (ft) <2223> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Arizona West (ft) <2224> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / California zone 1 (ftUS) <2225> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / California zone 2 (ftUS) <2226> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / California zone 3 (ftUS) <2227> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / California zone 4 (ftUS) <2228> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / California zone 5 (ftUS) <2229> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / California zone 6 (ftUS) <2230> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Colorado North (ftUS) <2231> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Colorado Central (ftUS) <2232> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Colorado South (ftUS) <2233> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Connecticut (ftUS) <2234> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Delaware (ftUS) <2235> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Florida East (ftUS) <2236> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Florida West (ftUS) <2237> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Florida North (ftUS) <2238> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Georgia East (ftUS) <2239> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Georgia West (ftUS) <2240> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Idaho East (ftUS) <2241> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Idaho Central (ftUS) <2242> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Idaho West (ftUS) <2243> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Indiana East (ftUS) (deprecated) <2244> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Indiana West (ftUS) (deprecated) <2245> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Kentucky North (ftUS) <2246> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Kentucky South (ftUS) <2247> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Maryland (ftUS) <2248> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Massachusetts Mainland (ftUS) <2249> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Massachusetts Island (ftUS) <2250> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Michigan North (ft) <2251> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Michigan Central (ft) <2252> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Michigan South (ft) <2253> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Mississippi East (ftUS) <2254> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Mississippi West (ftUS) <2255> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Montana (ft) <2256> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / New Mexico East (ftUS) <2257> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New Mexico Central (ftUS) <2258> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New Mexico West (ftUS) <2259> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New York East (ftUS) <2260> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New York Central (ftUS) <2261> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New York West (ftUS) <2262> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New York Long Island (ftUS) <2263> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / North Carolina (ftUS) <2264> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / North Dakota North (ft) <2265> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / North Dakota South (ft) <2266> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Oklahoma North (ftUS) <2267> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Oklahoma South (ftUS) <2268> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Oregon North (ft) <2269> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Oregon South (ft) <2270> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Pennsylvania North (ftUS) <2271> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Pennsylvania South (ftUS) <2272> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / South Carolina (ft) <2273> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Tennessee (ftUS) <2274> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Texas North (ftUS) <2275> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Texas North Central (ftUS) <2276> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Texas Central (ftUS) <2277> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Texas South Central (ftUS) <2278> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Texas South (ftUS) <2279> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Utah North (ft) <2280> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Utah Central (ft) <2281> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Utah South (ft) <2282> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83 / Virginia North (ftUS) <2283> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Virginia South (ftUS) <2284> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Washington North (ftUS) <2285> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Washington South (ftUS) <2286> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wisconsin North (ftUS) <2287> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wisconsin Central (ftUS) <2288> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wisconsin South (ftUS) <2289> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # ATS77 / Prince Edward Isl. Stereographic (ATS77) <2290> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=700000 +y_0=400000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) (deprecated) <2291> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83) (deprecated) <2292> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ATS77 / MTM Nova Scotia zone 4 <2294> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=4500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # ATS77 / MTM Nova Scotia zone 5 <2295> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=5500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m +no_defs <> # Ammassalik 1958 / Greenland zone 7 east # Unable to translate coordinate system EPSG:2296 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 1 east (deprecated) # Unable to translate coordinate system EPSG:2297 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 2 east (deprecated) # Unable to translate coordinate system EPSG:2298 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 2 west # Unable to translate coordinate system EPSG:2299 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 3 east (deprecated) # Unable to translate coordinate system EPSG:2300 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 3 west # Unable to translate coordinate system EPSG:2301 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 4 east (deprecated) # Unable to translate coordinate system EPSG:2302 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 4 west # Unable to translate coordinate system EPSG:2303 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 5 west # Unable to translate coordinate system EPSG:2304 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 6 west # Unable to translate coordinate system EPSG:2305 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 7 west # Unable to translate coordinate system EPSG:2306 into PROJ.4 format. # # Qornoq 1927 / Greenland zone 8 east # Unable to translate coordinate system EPSG:2307 into PROJ.4 format. # # Batavia / TM 109 SE <2308> +proj=tmerc +lat_0=0 +lon_0=109 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=bessel +units=m +no_defs <> # WGS 84 / TM 116 SE <2309> +proj=tmerc +lat_0=0 +lon_0=116 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / TM 132 SE <2310> +proj=tmerc +lat_0=0 +lon_0=132 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / TM 6 NE <2311> +proj=tmerc +lat_0=0 +lon_0=6 +k=0.9996 +x_0=500000 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # Garoua / UTM zone 33N <2312> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs <> # Kousseri / UTM zone 33N <2313> +proj=utm +zone=33 +ellps=clrk80 +units=m +no_defs <> # Trinidad 1903 / Trinidad Grid (ftCla) <2314> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392052001 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.3047972654 +no_defs <> # Campo Inchauspe / UTM zone 19S <2315> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs <> # Campo Inchauspe / UTM zone 20S <2316> +proj=utm +zone=20 +south +ellps=intl +units=m +no_defs <> # PSAD56 / ICN Regional <2317> +proj=lcc +lat_1=9 +lat_2=3 +lat_0=6 +lon_0=-66 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m +no_defs <> # Ain el Abd / Aramco Lambert <2318> +proj=lcc +lat_1=17 +lat_2=33 +lat_0=25.08951 +lon_0=48 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM27 <2319> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM30 <2320> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM33 <2321> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM36 <2322> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM39 <2323> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM42 <2324> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM45 <2325> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Hong Kong 1980 Grid System <2326> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 13 <2327> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 14 <2328> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 15 <2329> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 16 <2330> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 17 <2331> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 18 <2332> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 19 <2333> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 20 <2334> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 21 <2335> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 22 <2336> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger zone 23 <2337> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 75E <2338> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 81E <2339> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 87E <2340> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 93E <2341> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 99E <2342> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 105E <2343> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 111E <2344> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 117E <2345> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 123E <2346> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 129E <2347> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / Gauss-Kruger CM 135E <2348> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 25 <2349> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 26 <2350> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 27 <2351> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 28 <2352> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 29 <2353> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 30 <2354> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 31 <2355> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 32 <2356> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 33 <2357> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 34 <2358> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 35 <2359> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 36 <2360> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 37 <2361> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 38 <2362> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 39 <2363> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 40 <2364> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 41 <2365> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 42 <2366> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 43 <2367> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 44 <2368> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger zone 45 <2369> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 75E <2370> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 78E <2371> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 81E <2372> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 84E <2373> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 87E <2374> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 90E <2375> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 93E <2376> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 96E <2377> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 99E <2378> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 102E <2379> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 105E <2380> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 108E <2381> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 111E <2382> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 114E <2383> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 117E <2384> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 120E <2385> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 123E <2386> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 126E <2387> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 129E <2388> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 132E <2389> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # Xian 1980 / 3-degree Gauss-Kruger CM 135E <2390> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs <> # KKJ / Finland zone 1 <2391> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs <> # KKJ / Finland zone 2 <2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> # KKJ / Finland Uniform Coordinate System <2393> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +units=m +no_defs <> # KKJ / Finland zone 4 <2394> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=4500000 +y_0=0 +ellps=intl +units=m +no_defs <> # South Yemen / Gauss-Kruger zone 8 <2395> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> # South Yemen / Gauss-Kruger zone 9 <2396> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m +no_defs <> # Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3 <2397> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4 <2398> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5 <2399> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> # RT90 2.5 gon W (deprecated) <2400> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 25 <2401> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 26 <2402> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 27 <2403> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 28 <2404> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 29 <2405> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 30 <2406> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 31 <2407> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 32 <2408> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 33 <2409> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 34 <2410> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 35 <2411> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 36 <2412> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 37 <2413> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 38 <2414> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 39 <2415> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 40 <2416> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 41 <2417> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 42 <2418> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 43 <2419> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 44 <2420> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger zone 45 <2421> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 75E <2422> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 78E <2423> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 81E <2424> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 84E <2425> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 87E <2426> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 90E <2427> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 93E <2428> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 96E <2429> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 99E <2430> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 102E <2431> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 105E <2432> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 108E <2433> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 111E <2434> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 114E <2435> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 117E <2436> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 120E <2437> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 123E <2438> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 126E <2439> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 129E <2440> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 132E <2441> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / 3-degree Gauss-Kruger CM 135E <2442> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS I <2443> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS II <2444> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS III <2445> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS IV <2446> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS V <2447> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS VI <2448> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS VII <2449> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS VIII <2450> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS IX <2451> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS X <2452> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XI <2453> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XII <2454> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XIII <2455> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XIV <2456> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XV <2457> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XVI <2458> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XVII <2459> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XVIII <2460> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / Japan Plane Rectangular CS XIX <2461> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Albanian 1987 / Gauss-Kruger zone 4 <2462> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 21E <2463> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 27E <2464> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 33E <2465> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 39E <2466> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 45E <2467> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 51E <2468> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 57E <2469> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 63E <2470> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 69E <2471> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 75E <2472> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 81E <2473> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 87E <2474> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 93E <2475> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 99E <2476> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 105E <2477> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 111E <2478> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 117E <2479> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 123E <2480> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 129E <2481> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 135E <2482> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 141E <2483> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 147E <2484> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 153E <2485> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 159E <2486> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 165E <2487> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 171E <2488> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 177E <2489> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 177W <2490> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger CM 171W <2491> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 9E (deprecated) <2492> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 15E (deprecated) <2493> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 21E <2494> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 27E <2495> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 33E <2496> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 39E <2497> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 45E <2498> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 51E <2499> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 57E <2500> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 63E <2501> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 69E <2502> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 75E <2503> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 81E <2504> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 87E <2505> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 93E <2506> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 99E <2507> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 105E <2508> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 111E <2509> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 117E <2510> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 123E <2511> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 129E <2512> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 135E <2513> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 141E <2514> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 147E <2515> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 153E <2516> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 159E <2517> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 165E <2518> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 171E <2519> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 177E <2520> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 177W <2521> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger CM 171W <2522> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 7 <2523> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 8 <2524> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 9 <2525> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 10 <2526> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 11 <2527> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 12 <2528> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 13 <2529> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 14 <2530> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 15 <2531> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 16 <2532> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 17 <2533> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 18 <2534> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 19 <2535> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 20 <2536> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 21 <2537> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 22 <2538> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 23 <2539> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 24 <2540> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 25 <2541> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 26 <2542> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 27 <2543> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 28 <2544> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 29 <2545> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 30 <2546> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 31 <2547> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 32 <2548> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 33 <2549> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Samboja / UTM zone 50S (deprecated) <2550> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 34 <2551> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 35 <2552> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 36 <2553> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 37 <2554> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 38 <2555> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 39 <2556> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 40 <2557> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 41 <2558> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 42 <2559> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 43 <2560> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 44 <2561> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 45 <2562> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 46 <2563> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 47 <2564> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 48 <2565> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 49 <2566> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 50 <2567> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 51 <2568> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 52 <2569> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 53 <2570> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 54 <2571> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 55 <2572> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 56 <2573> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 57 <2574> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 58 <2575> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 59 <2576> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 (deprecated) <2577> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 61 <2578> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 62 <2579> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 63 <2580> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 64 <2581> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E <2582> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E <2583> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E <2584> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E <2585> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E <2586> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E <2587> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E <2588> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E <2589> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E <2590> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E <2591> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E <2592> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E <2593> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E <2594> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E <2595> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E <2596> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E <2597> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E <2598> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E <2599> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Lietuvos Koordinoei Sistema 1994 (deprecated) <2600> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E <2601> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E <2602> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E <2603> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E <2604> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E <2605> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E <2606> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E <2607> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E <2608> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E <2609> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E <2610> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E <2611> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E <2612> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E <2613> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E <2614> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E <2615> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E <2616> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E <2617> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E <2618> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E <2619> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E <2620> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E <2621> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E <2622> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E <2623> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E <2624> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E <2625> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E <2626> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E <2627> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E <2628> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E <2629> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E <2630> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E <2631> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E <2632> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E <2633> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E <2634> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E <2635> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E <2636> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W <2637> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W <2638> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W <2639> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W <2640> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 7 <2641> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 8 <2642> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 9 <2643> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 10 <2644> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 11 <2645> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 12 <2646> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 13 <2647> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 14 <2648> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 15 <2649> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 16 <2650> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 17 <2651> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 18 <2652> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 19 <2653> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 20 <2654> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 21 <2655> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 22 <2656> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 23 <2657> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 24 <2658> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 25 <2659> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 26 <2660> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 27 <2661> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 28 <2662> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 29 <2663> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 30 <2664> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 31 <2665> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 32 <2666> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 33 <2667> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 34 <2668> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 35 <2669> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 36 <2670> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 37 <2671> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 38 <2672> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 39 <2673> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 40 <2674> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 41 <2675> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 42 <2676> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 43 <2677> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 44 <2678> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 45 <2679> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 46 <2680> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 47 <2681> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 48 <2682> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 49 <2683> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 50 <2684> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 51 <2685> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 52 <2686> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 53 <2687> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 54 <2688> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 55 <2689> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 56 <2690> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 57 <2691> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 58 <2692> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 59 <2693> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 (deprecated) <2694> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 61 <2695> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 62 <2696> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 63 <2697> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 64 <2698> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E <2699> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E <2700> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E <2701> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E <2702> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E <2703> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E <2704> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E <2705> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E <2706> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E <2707> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E <2708> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E <2709> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E <2710> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E <2711> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E <2712> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E <2713> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E <2714> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E <2715> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E <2716> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E <2717> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E <2718> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E <2719> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E <2720> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E <2721> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E <2722> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E <2723> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E <2724> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E <2725> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E <2726> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E <2727> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E <2728> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E <2729> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E <2730> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E <2731> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E <2732> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E <2733> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E <2734> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E <2735> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Tete / UTM zone 36S <2736> +proj=utm +zone=36 +south +ellps=clrk66 +units=m +no_defs <> # Tete / UTM zone 37S <2737> +proj=utm +zone=37 +south +ellps=clrk66 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E <2738> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E <2739> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E <2740> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E <2741> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E <2742> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E <2743> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E <2744> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E <2745> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E <2746> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E <2747> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E <2748> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E <2749> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E <2750> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E <2751> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E <2752> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E <2753> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E <2754> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W <2755> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W <2756> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W <2757> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W <2758> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # NAD83(HARN) / Alabama East <2759> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Alabama West <2760> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Arizona East <2761> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Arizona Central <2762> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Arizona West <2763> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Arkansas North <2764> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Arkansas South <2765> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / California zone 1 <2766> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / California zone 2 <2767> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / California zone 3 <2768> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / California zone 4 <2769> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / California zone 5 <2770> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / California zone 6 <2771> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Colorado North <2772> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Colorado Central <2773> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Colorado South <2774> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Connecticut <2775> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Delaware <2776> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Florida East <2777> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Florida West <2778> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Florida North <2779> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Georgia East <2780> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Georgia West <2781> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Hawaii zone 1 <2782> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Hawaii zone 2 <2783> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Hawaii zone 3 <2784> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Hawaii zone 4 <2785> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Hawaii zone 5 <2786> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Idaho East <2787> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Idaho Central <2788> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Idaho West <2789> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Illinois East <2790> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Illinois West <2791> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Indiana East <2792> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Indiana West <2793> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Iowa North <2794> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Iowa South <2795> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Kansas North <2796> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Kansas South <2797> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Kentucky North <2798> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Kentucky South <2799> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Louisiana North <2800> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Louisiana South <2801> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Maine East <2802> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Maine West <2803> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Maryland <2804> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Massachusetts Mainland <2805> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Massachusetts Island <2806> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Michigan North <2807> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Michigan Central <2808> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Michigan South <2809> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Minnesota North <2810> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Minnesota Central <2811> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Minnesota South <2812> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Mississippi East <2813> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Mississippi West <2814> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Missouri East <2815> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Missouri Central <2816> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Missouri West <2817> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Montana <2818> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Nebraska <2819> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Nevada East <2820> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Nevada Central <2821> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Nevada West <2822> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New Hampshire <2823> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New Jersey <2824> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New Mexico East <2825> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New Mexico Central <2826> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New Mexico West <2827> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New York East <2828> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New York Central <2829> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New York West <2830> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / New York Long Island <2831> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / North Dakota North <2832> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / North Dakota South <2833> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Ohio North <2834> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Ohio South <2835> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Oklahoma North <2836> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Oklahoma South <2837> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Oregon North <2838> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Oregon South <2839> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Rhode Island <2840> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / South Dakota North <2841> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / South Dakota South <2842> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Tennessee <2843> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Texas North <2844> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Texas North Central <2845> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Texas Central <2846> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Texas South Central <2847> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Texas South <2848> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Utah North <2849> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Utah Central <2850> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Utah South <2851> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Vermont <2852> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Virginia North <2853> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Virginia South <2854> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Washington North <2855> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Washington South <2856> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / West Virginia North <2857> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / West Virginia South <2858> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wisconsin North <2859> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wisconsin Central <2860> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wisconsin South <2861> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wyoming East <2862> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wyoming East Central <2863> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wyoming West Central <2864> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Wyoming West <2865> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Puerto Rico and Virgin Is. <2866> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Arizona East (ft) <2867> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Arizona Central (ft) <2868> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Arizona West (ft) <2869> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / California zone 1 (ftUS) <2870> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / California zone 2 (ftUS) <2871> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / California zone 3 (ftUS) <2872> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / California zone 4 (ftUS) <2873> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / California zone 5 (ftUS) <2874> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / California zone 6 (ftUS) <2875> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Colorado North (ftUS) <2876> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Colorado Central (ftUS) <2877> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Colorado South (ftUS) <2878> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Connecticut (ftUS) <2879> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Delaware (ftUS) <2880> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Florida East (ftUS) <2881> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Florida West (ftUS) <2882> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Florida North (ftUS) <2883> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Georgia East (ftUS) <2884> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Georgia West (ftUS) <2885> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Idaho East (ftUS) <2886> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Idaho Central (ftUS) <2887> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Idaho West (ftUS) <2888> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Indiana East (ftUS) (deprecated) <2889> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Indiana West (ftUS) (deprecated) <2890> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Kentucky North (ftUS) <2891> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Kentucky South (ftUS) <2892> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Maryland (ftUS) <2893> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Massachusetts Mainland (ftUS) <2894> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Massachusetts Island (ftUS) <2895> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Michigan North (ft) <2896> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Michigan Central (ft) <2897> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Michigan South (ft) <2898> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Mississippi East (ftUS) <2899> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Mississippi West (ftUS) <2900> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Montana (ft) <2901> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / New Mexico East (ftUS) <2902> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New Mexico Central (ftUS) <2903> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New Mexico West (ftUS) <2904> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New York East (ftUS) <2905> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New York Central (ftUS) <2906> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New York West (ftUS) <2907> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New York Long Island (ftUS) <2908> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / North Dakota North (ft) <2909> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / North Dakota South (ft) <2910> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Oklahoma North (ftUS) <2911> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Oklahoma South (ftUS) <2912> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Oregon North (ft) <2913> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Oregon South (ft) <2914> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Tennessee (ftUS) <2915> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Texas North (ftUS) <2916> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Texas North Central (ftUS) <2917> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Texas Central (ftUS) <2918> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Texas South Central (ftUS) <2919> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Texas South (ftUS) <2920> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Utah North (ft) <2921> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Utah Central (ft) <2922> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Utah South (ft) <2923> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Virginia North (ftUS) <2924> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Virginia South (ftUS) <2925> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Washington North (ftUS) <2926> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Washington South (ftUS) <2927> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wisconsin North (ftUS) <2928> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wisconsin Central (ftUS) <2929> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wisconsin South (ftUS) <2930> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # Beduaram / TM 13 NE <2931> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9996 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0 +units=m +no_defs <> # QND95 / Qatar National Grid <2932> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +units=m +no_defs <> # Segara / UTM zone 50S <2933> +proj=utm +zone=50 +south +ellps=bessel +units=m +no_defs <> # Segara (Jakarta) / NEIEZ (deprecated) <2934> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m +no_defs <> # Pulkovo 1942 / CS63 zone A1 <2935> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1 +x_0=1300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone A2 <2936> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone A3 <2937> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone A4 <2938> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone K2 <2939> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone K3 <2940> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone K4 <2941> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +units=m +no_defs <> # Porto Santo / UTM zone 28N <2942> +proj=utm +zone=28 +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +units=m +no_defs <> # Selvagem Grande / UTM zone 28N <2943> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> # NAD83(CSRS) / SCoPQ zone 2 <2944> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 3 <2945> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 4 <2946> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 5 <2947> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 6 <2948> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 7 <2949> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 8 <2950> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 9 <2951> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 10 <2952> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / New Brunswick Stereographic <2953> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83) <2954> +proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 11N <2955> +proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 12N <2956> +proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 13N <2957> +proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 17N <2958> +proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 18N <2959> +proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 19N <2960> +proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 20N <2961> +proj=utm +zone=20 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 21N <2962> +proj=utm +zone=21 +ellps=GRS80 +units=m +no_defs <> # Lisbon 1890 (Lisbon) / Portugal Bonne # Unable to translate coordinate system EPSG:2963 into PROJ.4 format. # # NAD27 / Alaska Albers <2964> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD83 / Indiana East (ftUS) <2965> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Indiana West (ftUS) <2966> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Indiana East (ftUS) <2967> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Indiana West (ftUS) <2968> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> # Fort Marigot / UTM zone 20N <2969> +proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m +no_defs <> # Guadeloupe 1948 / UTM zone 20N <2970> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> # CSG67 / UTM zone 22N <2971> +proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs <> # RGFG95 / UTM zone 22N <2972> +proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs <> # Martinique 1938 / UTM zone 20N <2973> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> # RGR92 / UTM zone 40S <2975> +proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Tahiti 52 / UTM zone 6S <2976> +proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m +no_defs <> # Tahaa 54 / UTM zone 5S <2977> +proj=utm +zone=5 +south +ellps=intl +units=m +no_defs <> # IGN72 Nuku Hiva / UTM zone 7S <2978> +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs <> # K0 1949 / UTM zone 42S (deprecated) <2979> +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs <> # Combani 1950 / UTM zone 38S <2980> +proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m +no_defs <> # IGN56 Lifou / UTM zone 58S <2981> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> # IGN72 Grand Terre / UTM zone 58S (deprecated) <2982> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> # ST87 Ouvea / UTM zone 58S (deprecated) <2983> +proj=utm +zone=58 +south +ellps=intl +towgs84=-122.383,-188.696,103.344,3.5107,-4.9668,-5.7047,4.4798 +units=m +no_defs <> # RGNC 1991 / Lambert New Caledonia (deprecated) <2984> +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Petrels 1972 / Terre Adelie Polar Stereographic # Unable to translate coordinate system EPSG:2985 into PROJ.4 format. # # Perroud 1950 / Terre Adelie Polar Stereographic # Unable to translate coordinate system EPSG:2986 into PROJ.4 format. # # Saint Pierre et Miquelon 1950 / UTM zone 21N <2987> +proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m +no_defs <> # MOP78 / UTM zone 1S <2988> +proj=utm +zone=1 +south +ellps=intl +units=m +no_defs <> # RRAF 1991 / UTM zone 20N <2989> +proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Reunion 1947 / TM Reunion (deprecated) <2990> +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m +no_defs <> # NAD83 / Oregon Lambert <2991> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Oregon Lambert (ft) <2992> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=ft +no_defs <> # NAD83(HARN) / Oregon Lambert <2993> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Oregon Lambert (ft) <2994> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # IGN53 Mare / UTM zone 58S <2995> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> # ST84 Ile des Pins / UTM zone 58S <2996> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> # ST71 Belep / UTM zone 58S <2997> +proj=utm +zone=58 +south +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7 +units=m +no_defs <> # NEA74 Noumea / UTM zone 58S <2998> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> # Grand Comoros / UTM zone 38S <2999> +proj=utm +zone=38 +south +ellps=intl +units=m +no_defs <> # Segara / NEIEZ <3000> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m +no_defs <> # Batavia / NEIEZ <3001> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m +no_defs <> # Makassar / NEIEZ <3002> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +units=m +no_defs <> # Monte Mario / Italy zone 1 <3003> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Monte Mario / Italy zone 2 <3004> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +units=m +no_defs <> # NAD83 / BC Albers <3005> +proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # SWEREF99 TM <3006> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 12 00 <3007> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 13 30 <3008> +proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 15 00 <3009> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 16 30 <3010> +proj=tmerc +lat_0=0 +lon_0=16.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 18 00 <3011> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 14 15 <3012> +proj=tmerc +lat_0=0 +lon_0=14.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 15 45 <3013> +proj=tmerc +lat_0=0 +lon_0=15.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 17 15 <3014> +proj=tmerc +lat_0=0 +lon_0=17.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 18 45 <3015> +proj=tmerc +lat_0=0 +lon_0=18.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 20 15 <3016> +proj=tmerc +lat_0=0 +lon_0=20.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 21 45 <3017> +proj=tmerc +lat_0=0 +lon_0=21.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 23 15 <3018> +proj=tmerc +lat_0=0 +lon_0=23.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RT90 7.5 gon V <3019> +proj=tmerc +lat_0=0 +lon_0=11.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT90 5 gon V <3020> +proj=tmerc +lat_0=0 +lon_0=13.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT90 2.5 gon V <3021> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT90 0 gon <3022> +proj=tmerc +lat_0=0 +lon_0=18.05827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT90 2.5 gon O <3023> +proj=tmerc +lat_0=0 +lon_0=20.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT90 5 gon O <3024> +proj=tmerc +lat_0=0 +lon_0=22.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT38 7.5 gon V <3025> +proj=tmerc +lat_0=0 +lon_0=11.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT38 5 gon V <3026> +proj=tmerc +lat_0=0 +lon_0=13.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT38 2.5 gon V <3027> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT38 0 gon <3028> +proj=tmerc +lat_0=0 +lon_0=18.05827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT38 2.5 gon O <3029> +proj=tmerc +lat_0=0 +lon_0=20.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RT38 5 gon O <3030> +proj=tmerc +lat_0=0 +lon_0=22.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # WGS 84 / Antarctic Polar Stereographic <3031> +proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / Australian Antarctic Polar Stereographic <3032> +proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=70 +k=1 +x_0=6000000 +y_0=6000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / Australian Antarctic Lambert <3033> +proj=lcc +lat_1=-68.5 +lat_2=-74.5 +lat_0=-50 +lon_0=70 +x_0=6000000 +y_0=6000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # ETRS89 / ETRS-LCC <3034> +proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-LAEA <3035> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs <> # Moznet / UTM zone 36S <3036> +proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs <> # Moznet / UTM zone 37S <3037> +proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs <> # ETRS89 / ETRS-TM26 <3038> +proj=utm +zone=26 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM27 <3039> +proj=utm +zone=27 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM28 <3040> +proj=utm +zone=28 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM29 <3041> +proj=utm +zone=29 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM30 <3042> +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM31 <3043> +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM32 <3044> +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM33 <3045> +proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM34 <3046> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM35 <3047> +proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM36 <3048> +proj=utm +zone=36 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM37 <3049> +proj=utm +zone=37 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM38 <3050> +proj=utm +zone=38 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-TM39 <3051> +proj=utm +zone=39 +ellps=GRS80 +units=m +no_defs <> # Reykjavik 1900 / Lambert 1900 # Unable to translate coordinate system EPSG:3052 into PROJ.4 format. # # Hjorsey 1955 / Lambert 1955 # Unable to translate coordinate system EPSG:3053 into PROJ.4 format. # # Hjorsey 1955 / UTM zone 26N <3054> +proj=utm +zone=26 +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +units=m +no_defs <> # Hjorsey 1955 / UTM zone 27N <3055> +proj=utm +zone=27 +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +units=m +no_defs <> # Hjorsey 1955 / UTM zone 28N <3056> +proj=utm +zone=28 +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +units=m +no_defs <> # ISN93 / Lambert 1993 <3057> +proj=lcc +lat_1=64.25 +lat_2=65.75 +lat_0=65 +lon_0=-19 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Helle 1954 / Jan Mayen Grid <3058> +proj=tmerc +lat_0=0 +lon_0=-8.5 +k=1 +x_0=50000 +y_0=-7800000 +ellps=intl +towgs84=982.609,552.753,-540.873,32.3934,-153.257,-96.2266,16.805 +units=m +no_defs <> # LKS92 / Latvia TM <3059> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=-6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IGN72 Grande Terre / UTM zone 58S <3060> +proj=utm +zone=58 +south +ellps=intl +units=m +no_defs <> # Porto Santo 1995 / UTM zone 28N <3061> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> # Azores Oriental 1995 / UTM zone 26N <3062> +proj=utm +zone=26 +ellps=intl +units=m +no_defs <> # Azores Central 1995 / UTM zone 26N <3063> +proj=utm +zone=26 +ellps=intl +units=m +no_defs <> # IGM95 / UTM zone 32N <3064> +proj=utm +zone=32 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IGM95 / UTM zone 33N <3065> +proj=utm +zone=33 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ED50 / Jordan TM <3066> +proj=tmerc +lat_0=0 +lon_0=37 +k=0.9998 +x_0=500000 +y_0=-3000000 +ellps=intl +units=m +no_defs <> # ETRS89 / ETRS-TM35FIN <3067> +proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs <> # DHDN / Soldner Berlin <3068> +proj=cass +lat_0=52.41864827777778 +lon_0=13.62720366666667 +x_0=40000 +y_0=10000 +ellps=bessel +datum=potsdam +units=m +no_defs <> # NAD27 / Wisconsin Transverse Mercator <3069> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=500000 +y_0=-4500000 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD83 / Wisconsin Transverse Mercator <3070> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Wisconsin Transverse Mercator <3071> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Maine CS2000 East <3072> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Maine CS2000 Central (deprecated) <3073> +proj=tmerc +lat_0=43 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Maine CS2000 West <3074> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Maine CS2000 East <3075> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Maine CS2000 Central (deprecated) <3076> +proj=tmerc +lat_0=43 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Maine CS2000 West <3077> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Michigan Oblique Mercator <3078> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Michigan Oblique Mercator <3079> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +units=m +no_defs <> # NAD27 / Shackleford <3080> +proj=lcc +lat_1=27.41666666666667 +lat_2=34.91666666666666 +lat_0=31.16666666666667 +lon_0=-100 +x_0=914400 +y_0=914400 +ellps=clrk66 +datum=NAD27 +units=ft +no_defs <> # NAD83 / Texas State Mapping System <3081> +proj=lcc +lat_1=27.41666666666667 +lat_2=34.91666666666666 +lat_0=31.16666666666667 +lon_0=-100 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas Centric Lambert Conformal <3082> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas Centric Albers Equal Area <3083> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Texas Centric Lambert Conformal <3084> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Texas Centric Albers Equal Area <3085> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Florida GDL Albers <3086> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Florida GDL Albers <3087> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Kentucky Single Zone <3088> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Kentucky Single Zone (ftUS) <3089> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Kentucky Single Zone <3090> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Kentucky Single Zone (ftUS) <3091> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +units=us-ft +no_defs <> # Tokyo / UTM zone 51N <3092> +proj=utm +zone=51 +ellps=bessel +units=m +no_defs <> # Tokyo / UTM zone 52N <3093> +proj=utm +zone=52 +ellps=bessel +units=m +no_defs <> # Tokyo / UTM zone 53N <3094> +proj=utm +zone=53 +ellps=bessel +units=m +no_defs <> # Tokyo / UTM zone 54N <3095> +proj=utm +zone=54 +ellps=bessel +units=m +no_defs <> # Tokyo / UTM zone 55N <3096> +proj=utm +zone=55 +ellps=bessel +units=m +no_defs <> # JGD2000 / UTM zone 51N <3097> +proj=utm +zone=51 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / UTM zone 52N <3098> +proj=utm +zone=52 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / UTM zone 53N <3099> +proj=utm +zone=53 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / UTM zone 54N <3100> +proj=utm +zone=54 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JGD2000 / UTM zone 55N <3101> +proj=utm +zone=55 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # American Samoa 1962 / American Samoa Lambert <3102> +proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=95169.31165862332 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +units=us-ft +no_defs <> # Mauritania 1999 / UTM zone 28N (deprecated) <3103> +proj=utm +zone=28 +ellps=clrk80 +units=m +no_defs <> # Mauritania 1999 / UTM zone 29N (deprecated) <3104> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs <> # Mauritania 1999 / UTM zone 30N (deprecated) <3105> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs <> # Gulshan 303 / Bangladesh Transverse Mercator <3106> +proj=tmerc +lat_0=0 +lon_0=90 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # GDA94 / SA Lambert <3107> +proj=lcc +lat_1=-28 +lat_2=-36 +lat_0=-32 +lon_0=135 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ETRS89 / Guernsey Grid <3108> +proj=tmerc +lat_0=49.5 +lon_0=-2.416666666666667 +k=0.999997 +x_0=47000 +y_0=50000 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Jersey Transverse Mercator <3109> +proj=tmerc +lat_0=49.225 +lon_0=-2.135 +k=0.9999999000000001 +x_0=40000 +y_0=70000 +ellps=GRS80 +units=m +no_defs <> # AGD66 / Vicgrid66 <3110> +proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=4500000 +ellps=aust_SA +units=m +no_defs <> # GDA94 / Vicgrid94 <3111> +proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / Geoscience Australia Lambert <3112> +proj=lcc +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / BCSG02 <3113> +proj=tmerc +lat_0=-28 +lon_0=153 +k=0.99999 +x_0=50000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # MAGNA-SIRGAS / Colombia Far West zone <3114> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-80.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # MAGNA-SIRGAS / Colombia West zone <3115> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-77.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # MAGNA-SIRGAS / Colombia Bogota zone <3116> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # MAGNA-SIRGAS / Colombia East Central zone <3117> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-71.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # MAGNA-SIRGAS / Colombia East zone <3118> +proj=tmerc +lat_0=4.596200416666666 +lon_0=-68.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Douala 1948 / AEF west <3119> +proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +units=m +no_defs <> # Pulkovo 1942(58) / Poland zone I <3120> +proj=sterea +lat_0=50.625 +lon_0=21.08333333333333 +k=0.9998 +x_0=4637000 +y_0=5467000 +ellps=krass +units=m +no_defs <> # PRS92 / Philippines zone 1 <3121> +proj=tmerc +lat_0=0 +lon_0=117 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> # PRS92 / Philippines zone 2 <3122> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> # PRS92 / Philippines zone 3 <3123> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> # PRS92 / Philippines zone 4 <3124> +proj=tmerc +lat_0=0 +lon_0=123 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> # PRS92 / Philippines zone 5 <3125> +proj=tmerc +lat_0=0 +lon_0=125 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m +no_defs <> # ETRS89 / ETRS-GK19FIN <3126> +proj=tmerc +lat_0=0 +lon_0=19 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK20FIN <3127> +proj=tmerc +lat_0=0 +lon_0=20 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK21FIN <3128> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK22FIN <3129> +proj=tmerc +lat_0=0 +lon_0=22 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK23FIN <3130> +proj=tmerc +lat_0=0 +lon_0=23 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK24FIN <3131> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK25FIN <3132> +proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK26FIN <3133> +proj=tmerc +lat_0=0 +lon_0=26 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK27FIN <3134> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK28FIN <3135> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK29FIN <3136> +proj=tmerc +lat_0=0 +lon_0=29 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK30FIN <3137> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / ETRS-GK31FIN <3138> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # Vanua Levu 1915 / Vanua Levu Grid # Unable to translate coordinate system EPSG:3139 into PROJ.4 format. # # Viti Levu 1912 / Viti Levu Grid <3140> +proj=cass +lat_0=-18 +lon_0=178 +x_0=109435.392 +y_0=141622.272 +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0 +to_meter=0.201168 +no_defs <> # Fiji 1956 / UTM zone 60S <3141> +proj=utm +zone=60 +south +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +units=m +no_defs <> # Fiji 1956 / UTM zone 1S <3142> +proj=utm +zone=1 +south +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +units=m +no_defs <> # Fiji 1986 / Fiji Map Grid (deprecated) <3143> +proj=tmerc +lat_0=-17 +lon_0=178.75 +k=0.99985 +x_0=2000000 +y_0=4000000 +ellps=WGS72 +units=m +no_defs <> # FD54 / Faroe Lambert # Unable to translate coordinate system EPSG:3144 into PROJ.4 format. # # ETRS89 / Faroe Lambert # Unable to translate coordinate system EPSG:3145 into PROJ.4 format. # # Pulkovo 1942 / 3-degree Gauss-Kruger zone 6 <3146> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger CM 18E <3147> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Indian 1960 / UTM zone 48N <3148> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Indian 1960 / UTM zone 49N <3149> +proj=utm +zone=49 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 6 <3150> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger CM 18E <3151> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # ST74 <3152> +proj=tmerc +lat_0=0 +lon_0=18.05779 +k=0.99999425 +x_0=100178.1808 +y_0=-6500614.7836 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(CSRS) / BC Albers <3153> +proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 7N <3154> +proj=utm +zone=7 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 8N <3155> +proj=utm +zone=8 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 9N <3156> +proj=utm +zone=9 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 10N <3157> +proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 14N <3158> +proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 15N <3159> +proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / UTM zone 16N <3160> +proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Ontario MNR Lambert <3161> +proj=lcc +lat_1=44.5 +lat_2=53.5 +lat_0=0 +lon_0=-85 +x_0=930000 +y_0=6430000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Ontario MNR Lambert <3162> +proj=lcc +lat_1=44.5 +lat_2=53.5 +lat_0=0 +lon_0=-85 +x_0=930000 +y_0=6430000 +ellps=GRS80 +units=m +no_defs <> # RGNC91-93 / Lambert New Caledonia <3163> +proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ST87 Ouvea / UTM zone 58S <3164> +proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m +no_defs <> # NEA74 Noumea / Noumea Lambert <3165> +proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m +no_defs <> # NEA74 Noumea / Noumea Lambert 2 <3166> +proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m +no_defs <> # Kertau (RSO) / RSO Malaya (ch) <3167> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=40000 +y_0=0 +a=6377295.664 +b=6356094.667915204 +to_meter=20.116756 +no_defs <> # Kertau (RSO) / RSO Malaya (m) <3168> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804670.24 +y_0=0 +a=6377295.664 +b=6356094.667915204 +units=m +no_defs <> # RGNC91-93 / UTM zone 57S <3169> +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGNC91-93 / UTM zone 58S <3170> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGNC91-93 / UTM zone 59S <3171> +proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IGN53 Mare / UTM zone 59S <3172> +proj=utm +zone=59 +south +ellps=intl +units=m +no_defs <> # fk89 / Faroe Lambert FK89 # Unable to translate coordinate system EPSG:3173 into PROJ.4 format. # # NAD83 / Great Lakes Albers <3174> +proj=aea +lat_1=42.122774 +lat_2=49.01518 +lat_0=45.568977 +lon_0=-84.455955 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Great Lakes and St Lawrence Albers <3175> +proj=aea +lat_1=42.122774 +lat_2=49.01518 +lat_0=45.568977 +lon_0=-83.248627 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # Indian 1960 / TM 106 NE <3176> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # LGD2006 / Libya TM <3177> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9965000000000001 +x_0=1000000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 18N <3178> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 19N <3179> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 20N <3180> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 21N <3181> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 22N <3182> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 23N <3183> +proj=utm +zone=23 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 24N <3184> +proj=utm +zone=24 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 25N <3185> +proj=utm +zone=25 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 26N <3186> +proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 27N <3187> +proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 28N <3188> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GR96 / UTM zone 29N <3189> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 5 <3190> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 6 <3191> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 7 <3192> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 8 <3193> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 9 <3194> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 10 <3195> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 11 <3196> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 12 <3197> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / Libya TM zone 13 <3198> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / UTM zone 32N <3199> +proj=utm +zone=32 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # FD58 / Iraq zone <3200> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m +no_defs <> # LGD2006 / UTM zone 33N <3201> +proj=utm +zone=33 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / UTM zone 34N <3202> +proj=utm +zone=34 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # LGD2006 / UTM zone 35N <3203> +proj=utm +zone=35 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs <> # WGS 84 / SCAR IMW SP19-20 <3204> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SP21-22 <3205> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SP23-24 <3206> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-42 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ01-02 <3207> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-174 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ19-20 <3208> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ21-22 <3209> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ37-38 <3210> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=42 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ39-40 <3211> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ41-42 <3212> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ43-44 <3213> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=78 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ45-46 <3214> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ47-48 <3215> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=102 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ49-50 <3216> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=114 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ51-52 <3217> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=126 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ53-54 <3218> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=138 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ55-56 <3219> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=150 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SQ57-58 <3220> +proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=162 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR13-14 <3221> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-102 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR15-16 <3222> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR17-18 <3223> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-78 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR19-20 <3224> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR27-28 <3225> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-18 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR29-30 <3226> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-6 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR31-32 <3227> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=6 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR33-34 <3228> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=18 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR35-36 <3229> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=30 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR37-38 <3230> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=42 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR39-40 <3231> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR41-42 <3232> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR43-44 <3233> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=78 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR45-46 <3234> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR47-48 <3235> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=102 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR49-50 <3236> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=114 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR51-52 <3237> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=126 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR53-54 <3238> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=138 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR55-56 <3239> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=150 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR57-58 <3240> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=162 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SR59-60 <3241> +proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=174 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS04-06 <3242> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-153 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS07-09 <3243> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-135 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS10-12 <3244> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-117 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS13-15 <3245> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-99 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS16-18 <3246> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-81 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS19-21 <3247> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-63 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS25-27 <3248> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-27 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS28-30 <3249> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-9 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS31-33 <3250> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=9 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS34-36 <3251> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=27 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS37-39 <3252> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=45 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS40-42 <3253> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=63 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS43-45 <3254> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=81 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS46-48 <3255> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=99 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS49-51 <3256> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=117 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS52-54 <3257> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=135 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS55-57 <3258> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=153 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SS58-60 <3259> +proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=171 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST01-04 <3260> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-168 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST05-08 <3261> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-144 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST09-12 <3262> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-120 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST13-16 <3263> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-96 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST17-20 <3264> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-72 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST21-24 <3265> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-48 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST25-28 <3266> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-24 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST29-32 <3267> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST33-36 <3268> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=24 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST37-40 <3269> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=48 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST41-44 <3270> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=72 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST45-48 <3271> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=96 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST49-52 <3272> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=120 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST53-56 <3273> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=144 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW ST57-60 <3274> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=168 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU01-05 <3275> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-165 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU06-10 <3276> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-135 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU11-15 <3277> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-105 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU16-20 <3278> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-75 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU21-25 <3279> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU26-30 <3280> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-15 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU31-35 <3281> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=15 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU36-40 <3282> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU41-45 <3283> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=75 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU46-50 <3284> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=105 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU51-55 <3285> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=135 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SU56-60 <3286> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=165 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SV01-10 <3287> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SV11-20 <3288> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-90 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SV21-30 <3289> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-30 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SV31-40 <3290> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=30 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SV41-50 <3291> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=90 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SV51-60 <3292> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / SCAR IMW SW01-60 <3293> +proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / USGS Transantarctic Mountains <3294> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-78 +lon_0=162 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # Guam 1963 / Yap Islands # Unable to translate coordinate system EPSG:3295 into PROJ.4 format. # # RGPF / UTM zone 5S <3296> +proj=utm +zone=5 +south +ellps=GRS80 +units=m +no_defs <> # RGPF / UTM zone 6S <3297> +proj=utm +zone=6 +south +ellps=GRS80 +units=m +no_defs <> # RGPF / UTM zone 7S <3298> +proj=utm +zone=7 +south +ellps=GRS80 +units=m +no_defs <> # RGPF / UTM zone 8S <3299> +proj=utm +zone=8 +south +ellps=GRS80 +units=m +no_defs <> # Estonian Coordinate System of 1992 <3300> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +units=m +no_defs <> # Estonian Coordinate System of 1997 <3301> +proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IGN63 Hiva Oa / UTM zone 7S <3302> +proj=utm +zone=7 +south +ellps=intl +units=m +no_defs <> # Fatu Iva 72 / UTM zone 7S <3303> +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs <> # Tahiti 79 / UTM zone 6S <3304> +proj=utm +zone=6 +south +ellps=intl +units=m +no_defs <> # Moorea 87 / UTM zone 6S <3305> +proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m +no_defs <> # Maupiti 83 / UTM zone 5S <3306> +proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m +no_defs <> # Nakhl-e Ghanem / UTM zone 39N <3307> +proj=utm +zone=39 +ellps=WGS84 +towgs84=0,-0.15,0.68,0,0,0,0 +units=m +no_defs <> # GDA94 / NSW Lambert <3308> +proj=lcc +lat_1=-30.75 +lat_2=-35.75 +lat_0=-33.25 +lon_0=147 +x_0=9300000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD27 / California Albers <3309> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD83 / California Albers <3310> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / California Albers <3311> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +units=m +no_defs <> # CSG67 / UTM zone 21N <3312> +proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m +no_defs <> # RGFG95 / UTM zone 21N <3313> +proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m +no_defs <> # Katanga 1955 / Katanga Lambert (deprecated) <3314> +proj=lcc +lat_1=-6.5 +lat_2=-11.5 +lat_0=0 +lon_0=26 +x_0=0 +y_0=0 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Katanga 1955 / Katanga TM (deprecated) <3315> +proj=tmerc +lat_0=-9 +lon_0=26 +k=0.9998 +x_0=0 +y_0=0 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Kasai 1953 / Congo TM zone 22 <3316> +proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # Kasai 1953 / Congo TM zone 24 <3317> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 12 <3318> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 14 <3319> +proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 16 <3320> +proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 18 <3321> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 20 <3322> +proj=tmerc +lat_0=0 +lon_0=20 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 22 <3323> +proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 24 <3324> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 26 <3325> +proj=tmerc +lat_0=0 +lon_0=26 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 28 <3326> +proj=tmerc +lat_0=0 +lon_0=28 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # IGC 1962 / Congo TM zone 30 <3327> +proj=tmerc +lat_0=0 +lon_0=30 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # Pulkovo 1942(58) / GUGiK-80 <3328> +proj=sterea +lat_0=52.16666666666666 +lon_0=19.16666666666667 +k=0.999714 +x_0=500000 +y_0=500000 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 5 <3329> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 6 <3330> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 7 <3331> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 8 <3332> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Gauss-Kruger zone 3 <3333> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Gauss-Kruger zone 4 <3334> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Gauss-Kruger zone 5 <3335> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> # IGN 1962 Kerguelen / UTM zone 42S <3336> +proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m +no_defs <> # Le Pouce 1934 / Mauritius Grid <3337> +proj=lcc +lat_1=-20.19506944444445 +lat_0=-20.19506944444445 +lon_0=57.52182777777778 +k_0=1 +x_0=1000000 +y_0=1000000 +ellps=clrk80 +towgs84=-770.1,158.4,-498.2,0,0,0,0 +units=m +no_defs <> # NAD83 / Alaska Albers <3338> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # IGCB 1955 / Congo TM zone 12 <3339> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> # IGCB 1955 / Congo TM zone 14 <3340> +proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> # IGCB 1955 / Congo TM zone 16 <3341> +proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> # IGCB 1955 / UTM zone 33S <3342> +proj=utm +zone=33 +south +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m +no_defs <> # Mauritania 1999 / UTM zone 28N <3343> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Mauritania 1999 / UTM zone 29N <3344> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Mauritania 1999 / UTM zone 30N <3345> +proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # LKS94 / Lithuania TM <3346> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83 / Statistics Canada Lambert <3347> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666666666666 +x_0=6200000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Statistics Canada Lambert <3348> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666666666666 +x_0=6200000 +y_0=3000000 +ellps=GRS80 +units=m +no_defs <> # WGS 84 / PDC Mercator (deprecated) <3349> +proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # Pulkovo 1942 / CS63 zone C0 <3350> +proj=tmerc +lat_0=0.1 +lon_0=21.95 +k=1 +x_0=250000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone C1 <3351> +proj=tmerc +lat_0=0.1 +lon_0=24.95 +k=1 +x_0=1250000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / CS63 zone C2 <3352> +proj=tmerc +lat_0=0.1 +lon_0=27.95 +k=1 +x_0=2250000 +y_0=0 +ellps=krass +units=m +no_defs <> # Mhast (onshore) / UTM zone 32S <3353> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs <> # Mhast (offshore) / UTM zone 32S <3354> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs <> # Egypt Gulf of Suez S-650 TL / Red Belt <3355> +proj=tmerc +lat_0=30 +lon_0=31 +k=1 +x_0=615000 +y_0=810000 +ellps=helmert +towgs84=-146.21,112.63,4.05,0,0,0,0 +units=m +no_defs <> # Grand Cayman 1959 / UTM zone 17N <3356> +proj=utm +zone=17 +ellps=clrk66 +towgs84=67.8,106.1,138.8,0,0,0,0 +units=m +no_defs <> # Little Cayman 1961 / UTM zone 17N <3357> +proj=utm +zone=17 +ellps=clrk66 +units=m +no_defs <> # NAD83(HARN) / North Carolina <3358> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / North Carolina (ftUS) (deprecated) <3359> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024385 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / South Carolina <3360> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / South Carolina (ft) <3361> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +units=ft +no_defs <> # NAD83(HARN) / Pennsylvania North <3362> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Pennsylvania North (ftUS) <3363> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Pennsylvania South <3364> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Pennsylvania South (ftUS) <3365> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # Hong Kong 1963 Grid System (deprecated) <3366> +proj=cass +lat_0=22.31213333333334 +lon_0=114.1785555555556 +x_0=40243.57775604237 +y_0=19069.93351512578 +a=6378293.645208759 +b=6356617.987679838 +units=m +no_defs <> # IGN Astro 1960 / UTM zone 28N <3367> +proj=utm +zone=28 +ellps=clrk80 +units=m +no_defs <> # IGN Astro 1960 / UTM zone 29N <3368> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs <> # IGN Astro 1960 / UTM zone 30N <3369> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs <> # NAD27 / UTM zone 59N <3370> +proj=utm +zone=59 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 60N <3371> +proj=utm +zone=60 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD83 / UTM zone 59N <3372> +proj=utm +zone=59 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 60N <3373> +proj=utm +zone=60 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # FD54 / UTM zone 29N <3374> +proj=utm +zone=29 +ellps=intl +units=m +no_defs <> # GDM2000 / Peninsula RSO <3375> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257964666666 +k=0.99984 +x_0=804671 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / East Malaysia BRSO <3376> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Johor Grid <3377> +proj=cass +lat_0=2.121679744444445 +lon_0=103.4279362361111 +x_0=-14810.562 +y_0=8758.32 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Sembilan and Melaka Grid <3378> +proj=cass +lat_0=2.682347636111111 +lon_0=101.9749050416667 +x_0=3673.785 +y_0=-4240.573 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / PahangGrid <3379> +proj=cass +lat_0=3.769388088888889 +lon_0=102.3682989833333 +x_0=-7368.228 +y_0=6485.858 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Selangor Grid <3380> +proj=cass +lat_0=3.68464905 +lon_0=101.3891079138889 +x_0=-34836.161 +y_0=56464.049 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Terengganu Grid <3381> +proj=cass +lat_0=4.9762852 +lon_0=103.070275625 +x_0=19594.245 +y_0=3371.895 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Pinang Grid <3382> +proj=cass +lat_0=5.421517541666667 +lon_0=100.3443769638889 +x_0=-23.414 +y_0=62.283 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Kedah and Perlis Grid <3383> +proj=cass +lat_0=5.964672713888889 +lon_0=100.6363711111111 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Perak Grid <3384> +proj=cass +lat_0=4.859063022222222 +lon_0=100.8154105861111 +x_0=-1.769 +y_0=133454.779 +ellps=GRS80 +units=m +no_defs <> # GDM2000 / Kelantan Grid <3385> +proj=cass +lat_0=5.972543658333334 +lon_0=102.2952416694444 +x_0=13227.851 +y_0=8739.894 +ellps=GRS80 +units=m +no_defs <> # KKJ / Finland zone 0 <3386> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # KKJ / Finland zone 5 <3387> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Pulkovo 1942 / Caspian Sea Mercator <3388> +proj=merc +lon_0=51 +k=1 +x_0=0 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 <3389> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 <3390> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Karbala 1979 / UTM zone 37N <3391> +proj=utm +zone=37 +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +units=m +no_defs <> # Karbala 1979 / UTM zone 38N <3392> +proj=utm +zone=38 +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +units=m +no_defs <> # Karbala 1979 / UTM zone 39N <3393> +proj=utm +zone=39 +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +units=m +no_defs <> # Nahrwan 1934 / Iraq zone <3394> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m +no_defs <> # WGS 84 / World Mercator <3395> +proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # PD/83 / 3-degree Gauss-Kruger zone 3 <3396> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # PD/83 / 3-degree Gauss-Kruger zone 4 <3397> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RD/83 / 3-degree Gauss-Kruger zone 4 <3398> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # RD/83 / 3-degree Gauss-Kruger zone 5 <3399> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # NAD83 / Alberta 10-TM (Forest) <3400> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alberta 10-TM (Resource) <3401> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Alberta 10-TM (Forest) <3402> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / Alberta 10-TM (Resource) <3403> +proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / North Carolina (ftUS) <3404> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # VN-2000 / UTM zone 48N <3405> +proj=utm +zone=48 +ellps=WGS84 +units=m +no_defs <> # VN-2000 / UTM zone 49N <3406> +proj=utm +zone=49 +ellps=WGS84 +units=m +no_defs <> # Hong Kong 1963 Grid System <3407> +proj=cass +lat_0=22.31213333333334 +lon_0=114.1785555555556 +x_0=40243.57775604237 +y_0=19069.93351512578 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.3047972654 +no_defs <> # unnamed <3408> +proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m +no_defs <> # unnamed <3409> +proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m +no_defs <> # NSIDC EASE-Grid Global <3410> +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m +no_defs <> # NSIDC Sea Ice Polar Stereographic North <3411> +proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m +no_defs <> # NSIDC Sea Ice Polar Stereographic South <3412> +proj=stere +lat_0=-90 +lat_ts=-70 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m +no_defs <> # WGS 84 / NSIDC Sea Ice Polar Stereographic North <3413> +proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # SVY21 / Singapore TM <3414> +proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m +no_defs <> # WGS 72BE / South China Sea Lambert <3415> +proj=lcc +lat_1=18 +lat_2=24 +lat_0=21 +lon_0=114 +x_0=500000 +y_0=500000 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # ETRS89 / Austria Lambert <3416> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Iowa North (ft US) <3417> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Iowa South (ft US) <3418> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Kansas North (ft US) <3419> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Kansas South (ft US) <3420> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Nevada East (ft US) <3421> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Nevada Central (ft US) <3422> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Nevada West (ft US) <3423> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New Jersey (ft US) <3424> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Iowa North (ft US) <3425> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Iowa South (ft US) <3426> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Kansas North (ft US) <3427> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Kansas South (ft US) <3428> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Nevada East (ft US) <3429> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Nevada Central (ft US) <3430> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Nevada West (ft US) <3431> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New Jersey (ft US) <3432> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83 / Arkansas North (ftUS) <3433> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Arkansas South (ftUS) <3434> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Illinois East (ftUS) <3435> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Illinois West (ftUS) <3436> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / New Hampshire (ftUS) <3437> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Rhode Island (ftUS) <3438> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # PSD93 / UTM zone 39N <3439> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs <> # PSD93 / UTM zone 40N <3440> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs <> # NAD83(HARN) / Arkansas North (ftUS) <3441> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Arkansas South (ftUS) <3442> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Illinois East (ftUS) <3443> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Illinois West (ftUS) <3444> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / New Hampshire (ftUS) <3445> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Rhode Island (ftUS) <3446> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # ETRS89 / Belgian Lambert 2005 <3447> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=50.797815 +lon_0=4.359215833333333 +x_0=150328 +y_0=166262 +ellps=GRS80 +units=m +no_defs <> # JAD2001 / Jamaica Metric Grid <3448> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=750000 +y_0=650000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JAD2001 / UTM zone 17N <3449> +proj=utm +zone=17 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # JAD2001 / UTM zone 18N <3450> +proj=utm +zone=18 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83 / Louisiana North (ftUS) <3451> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Louisiana South (ftUS) <3452> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Louisiana Offshore (ftUS) <3453> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / South Dakota North (ftUS) <3454> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / South Dakota South (ftUS) <3455> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Louisiana North (ftUS) <3456> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Louisiana South (ftUS) <3457> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / South Dakota North (ftUS) <3458> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / South Dakota South (ftUS) <3459> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # Fiji 1986 / Fiji Map Grid <3460> +proj=tmerc +lat_0=-17 +lon_0=178.75 +k=0.99985 +x_0=2000000 +y_0=4000000 +ellps=WGS72 +units=m +no_defs <> # Dabola 1981 / UTM zone 28N <3461> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +units=m +no_defs <> # Dabola 1981 / UTM zone 29N <3462> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +units=m +no_defs <> # NAD83 / Maine CS2000 Central <3463> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Maine CS2000 Central <3464> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(NSRS2007) / Alabama East <3465> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alabama West <3466> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska Albers <3467> +proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 1 <3468> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 2 <3469> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 3 <3470> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 4 <3471> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 5 <3472> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 6 <3473> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 7 <3474> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 8 <3475> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 9 <3476> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Alaska zone 10 <3477> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Arizona Central <3478> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Arizona Central (ft) <3479> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Arizona East <3480> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Arizona East (ft) <3481> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Arizona West <3482> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Arizona West (ft) <3483> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Arkansas North <3484> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Arkansas North (ftUS) <3485> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Arkansas South <3486> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Arkansas South (ftUS) <3487> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / California Albers <3488> +proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 1 <3489> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 1 (ftUS) <3490> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / California zone 2 <3491> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 2 (ftUS) <3492> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / California zone 3 <3493> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 3 (ftUS) <3494> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / California zone 4 <3495> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 4 (ftUS) <3496> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / California zone 5 <3497> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 5 (ftUS) <3498> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / California zone 6 <3499> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / California zone 6 (ftUS) <3500> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Colorado Central <3501> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Colorado Central (ftUS) <3502> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Colorado North <3503> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Colorado North (ftUS) <3504> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Colorado South <3505> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Colorado South (ftUS) <3506> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Connecticut <3507> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Connecticut (ftUS) <3508> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Delaware <3509> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Delaware (ftUS) <3510> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Florida East <3511> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Florida East (ftUS) <3512> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Florida GDL Albers <3513> +proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Florida North <3514> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Florida North (ftUS) <3515> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Florida West <3516> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Florida West (ftUS) <3517> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Georgia East <3518> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Georgia East (ftUS) <3519> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Georgia West <3520> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Georgia West (ftUS) <3521> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Idaho Central <3522> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Idaho Central (ftUS) <3523> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Idaho East <3524> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Idaho East (ftUS) <3525> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Idaho West <3526> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Idaho West (ftUS) <3527> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Illinois East <3528> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Illinois East (ftUS) <3529> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Illinois West <3530> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Illinois West (ftUS) <3531> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Indiana East <3532> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Indiana East (ftUS) <3533> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Indiana West <3534> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Indiana West (ftUS) <3535> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Iowa North <3536> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Iowa North (ft US) <3537> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Iowa South <3538> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Iowa South (ft US) <3539> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Kansas North <3540> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Kansas North (ft US) <3541> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Kansas South <3542> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Kansas South (ft US) <3543> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Kentucky North <3544> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Kentucky North (ftUS) <3545> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Kentucky Single Zone <3546> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Kentucky Single Zone (ftUS) <3547> +proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Kentucky South <3548> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Kentucky South (ftUS) <3549> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Louisiana North <3550> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Louisiana North (ftUS) <3551> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Louisiana South <3552> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Louisiana South (ftUS) <3553> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Maine CS2000 Central <3554> +proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Maine CS2000 East <3555> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Maine CS2000 West <3556> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Maine East <3557> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Maine West <3558> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Maryland <3559> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83 / Utah North (ftUS) <3560> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # Old Hawaiian / Hawaii zone 1 <3561> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +units=us-ft +no_defs <> # Old Hawaiian / Hawaii zone 2 <3562> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +units=us-ft +no_defs <> # Old Hawaiian / Hawaii zone 3 <3563> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +units=us-ft +no_defs <> # Old Hawaiian / Hawaii zone 4 <3564> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +units=us-ft +no_defs <> # Old Hawaiian / Hawaii zone 5 <3565> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +units=us-ft +no_defs <> # NAD83 / Utah Central (ftUS) <3566> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Utah South (ftUS) <3567> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Utah North (ftUS) <3568> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Utah Central (ftUS) <3569> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Utah South (ftUS) <3570> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +units=us-ft +no_defs <> # WGS 84 / North Pole LAEA Bering Sea <3571> +proj=laea +lat_0=90 +lon_0=180 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / North Pole LAEA Alaska <3572> +proj=laea +lat_0=90 +lon_0=-150 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / North Pole LAEA Canada <3573> +proj=laea +lat_0=90 +lon_0=-100 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / North Pole LAEA Atlantic <3574> +proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / North Pole LAEA Europe <3575> +proj=laea +lat_0=90 +lon_0=10 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / North Pole LAEA Russia <3576> +proj=laea +lat_0=90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # GDA94 / Australian Albers <3577> +proj=aea +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=132 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83 / Yukon Albers <3578> +proj=aea +lat_1=61.66666666666666 +lat_2=68 +lat_0=59 +lon_0=-132.5 +x_0=500000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Yukon Albers <3579> +proj=aea +lat_1=61.66666666666666 +lat_2=68 +lat_0=59 +lon_0=-132.5 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m +no_defs <> # NAD83 / NWT Lambert <3580> +proj=lcc +lat_1=62 +lat_2=70 +lat_0=0 +lon_0=-112 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / NWT Lambert <3581> +proj=lcc +lat_1=62 +lat_2=70 +lat_0=0 +lon_0=-112 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(NSRS2007) / Maryland (ftUS) <3582> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Massachusetts Island <3583> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Massachusetts Island (ftUS) <3584> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Massachusetts Mainland <3585> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Massachusetts Mainland (ftUS) <3586> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Michigan Central <3587> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Michigan Central (ft) <3588> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Michigan North <3589> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Michigan North (ft) <3590> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Michigan Oblique Mercator <3591> +proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Michigan South <3592> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Michigan South (ft) <3593> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Minnesota Central <3594> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Minnesota North <3595> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Minnesota South <3596> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Mississippi East <3597> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Mississippi East (ftUS) <3598> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Mississippi West <3599> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Mississippi West (ftUS) <3600> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Missouri Central <3601> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Missouri East <3602> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Missouri West <3603> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Montana <3604> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Montana (ft) <3605> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Nebraska <3606> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Nevada Central <3607> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Nevada Central (ft US) <3608> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Nevada East <3609> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Nevada East (ft US) <3610> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Nevada West <3611> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Nevada West (ft US) <3612> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New Hampshire <3613> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New Hampshire (ftUS) <3614> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New Jersey <3615> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New Jersey (ft US) <3616> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New Mexico Central <3617> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New Mexico Central (ftUS) <3618> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New Mexico East <3619> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New Mexico East (ftUS) <3620> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New Mexico West <3621> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New Mexico West (ftUS) <3622> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New York Central <3623> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New York Central (ftUS) <3624> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New York East <3625> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New York East (ftUS) <3626> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New York Long Island <3627> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New York Long Island (ftUS) <3628> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / New York West <3629> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / New York West (ftUS) <3630> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / North Carolina <3631> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / North Carolina (ftUS) <3632> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / North Dakota North <3633> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / North Dakota North (ft) <3634> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / North Dakota South <3635> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / North Dakota South (ft) <3636> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Ohio North <3637> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Ohio South <3638> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Oklahoma North <3639> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Oklahoma North (ftUS) <3640> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Oklahoma South <3641> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Oklahoma South (ftUS) <3642> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Oregon Lambert <3643> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Oregon Lambert (ft) <3644> +proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Oregon North <3645> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Oregon North (ft) <3646> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Oregon South <3647> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Oregon South (ft) <3648> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Pennsylvania North <3649> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Pennsylvania North (ftUS) <3650> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Pennsylvania South <3651> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Pennsylvania South (ftUS) <3652> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Rhode Island <3653> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Rhode Island (ftUS) <3654> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / South Carolina <3655> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / South Carolina (ft) <3656> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / South Dakota North <3657> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / South Dakota North (ftUS) <3658> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / South Dakota South <3659> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / South Dakota South (ftUS) <3660> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Tennessee <3661> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Tennessee (ftUS) <3662> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Texas Central <3663> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas Central (ftUS) <3664> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Texas Centric Albers Equal Area <3665> +proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas Centric Lambert Conformal <3666> +proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas North <3667> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas North (ftUS) <3668> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Texas North Central <3669> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas North Central (ftUS) <3670> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Texas South <3671> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas South (ftUS) <3672> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Texas South Central <3673> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Texas South Central (ftUS) <3674> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Utah Central <3675> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Utah Central (ft) <3676> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Utah Central (ftUS) <3677> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Utah North <3678> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Utah North (ft) <3679> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Utah North (ftUS) <3680> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Utah South <3681> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Utah South (ft) <3682> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs <> # NAD83(NSRS2007) / Utah South (ftUS) <3683> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Vermont <3684> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Virginia North <3685> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Virginia North (ftUS) <3686> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Virginia South <3687> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Virginia South (ftUS) <3688> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Washington North <3689> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Washington North (ftUS) <3690> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Washington South <3691> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Washington South (ftUS) <3692> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / West Virginia North <3693> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / West Virginia South <3694> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wisconsin Central <3695> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wisconsin Central (ftUS) <3696> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wisconsin North <3697> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wisconsin North (ftUS) <3698> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wisconsin South <3699> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wisconsin South (ftUS) <3700> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wisconsin Transverse Mercator <3701> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wyoming East <3702> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wyoming East Central <3703> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wyoming West Central <3704> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Wyoming West <3705> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 59N <3706> +proj=utm +zone=59 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 60N <3707> +proj=utm +zone=60 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 1N <3708> +proj=utm +zone=1 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 2N <3709> +proj=utm +zone=2 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 3N <3710> +proj=utm +zone=3 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 4N <3711> +proj=utm +zone=4 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 5N <3712> +proj=utm +zone=5 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 6N <3713> +proj=utm +zone=6 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 7N <3714> +proj=utm +zone=7 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 8N <3715> +proj=utm +zone=8 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 9N <3716> +proj=utm +zone=9 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 10N <3717> +proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 11N <3718> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 12N <3719> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 13N <3720> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 14N <3721> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 15N <3722> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 16N <3723> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 17N <3724> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 18N <3725> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / UTM zone 19N <3726> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Reunion 1947 / TM Reunion <3727> +proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m +no_defs <> # NAD83(NSRS2007) / Ohio North (ftUS) <3728> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Ohio South (ftUS) <3729> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wyoming East (ftUS) <3730> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wyoming East Central (ftUS) <3731> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wyoming West Central (ftUS) <3732> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Wyoming West (ftUS) <3733> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83 / Ohio North (ftUS) <3734> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Ohio South (ftUS) <3735> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wyoming East (ftUS) <3736> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wyoming East Central (ftUS) <3737> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wyoming West Central (ftUS) <3738> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Wyoming West (ftUS) <3739> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / UTM zone 10N <3740> +proj=utm +zone=10 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 11N <3741> +proj=utm +zone=11 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 12N <3742> +proj=utm +zone=12 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 13N <3743> +proj=utm +zone=13 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 14N <3744> +proj=utm +zone=14 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 15N <3745> +proj=utm +zone=15 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 16N <3746> +proj=utm +zone=16 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 17N <3747> +proj=utm +zone=17 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 18N <3748> +proj=utm +zone=18 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 19N <3749> +proj=utm +zone=19 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 4N <3750> +proj=utm +zone=4 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / UTM zone 5N <3751> +proj=utm +zone=5 +ellps=GRS80 +units=m +no_defs <> # WGS 84 / Mercator 41 (deprecated) <3752> +proj=merc +lon_0=100 +lat_ts=-41 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # NAD83(HARN) / Ohio North (ftUS) <3753> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Ohio South (ftUS) <3754> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wyoming East (ftUS) <3755> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wyoming East Central (ftUS) <3756> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wyoming West Central (ftUS) <3757> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Wyoming West (ftUS) <3758> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83 / Hawaii zone 3 (ftUS) <3759> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Hawaii zone 3 (ftUS) <3760> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(CSRS) / UTM zone 22N <3761> +proj=utm +zone=22 +ellps=GRS80 +units=m +no_defs <> # WGS 84 / South Georgia Lambert <3762> +proj=lcc +lat_1=-54 +lat_2=-54.75 +lat_0=-55 +lon_0=-37 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # ETRS89 / Portugal TM06 <3763> +proj=tmerc +lat_0=39.66825833333333 +lon_0=-8.133108333333334 +k=1 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NZGD2000 / Chatham Island Circuit 2000 <3764> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # HTRS96 / Croatia TM <3765> +proj=tmerc +lat_0=0 +lon_0=16.5 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # HTRS96 / Croatia LCC <3766> +proj=lcc +lat_1=45.91666666666666 +lat_2=43.08333333333334 +lat_0=0 +lon_0=16.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # HTRS96 / UTM zone 33N <3767> +proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # HTRS96 / UTM zone 34N <3768> +proj=utm +zone=34 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Bermuda 1957 / UTM zone 20N <3769> +proj=utm +zone=20 +ellps=clrk66 +units=m +no_defs <> # BDA2000 / Bermuda 2000 National Grid <3770> +proj=tmerc +lat_0=32 +lon_0=-64.75 +k=1 +x_0=550000 +y_0=100000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD27 / Alberta 3TM ref merid 111 W <3771> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9999 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Alberta 3TM ref merid 114 W <3772> +proj=tmerc +lat_0=0 +lon_0=-114 +k=0.9999 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Alberta 3TM ref merid 117 W <3773> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9999 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Alberta 3TM ref merid 120 W (deprecated) <3774> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD83 / Alberta 3TM ref merid 111 W <3775> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alberta 3TM ref merid 114 W <3776> +proj=tmerc +lat_0=0 +lon_0=-114 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alberta 3TM ref merid 117 W <3777> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alberta 3TM ref merid 120 W (deprecated) <3778> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Alberta 3TM ref merid 111 W <3779> +proj=tmerc +lat_0=0 +lon_0=-111 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / Alberta 3TM ref merid 114 W <3780> +proj=tmerc +lat_0=0 +lon_0=-114 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / Alberta 3TM ref merid 117 W <3781> +proj=tmerc +lat_0=0 +lon_0=-117 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / Alberta 3TM ref merid 120 W (deprecated) <3782> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # Pitcairn 2006 / Pitcairn TM 2006 <3783> +proj=tmerc +lat_0=-25.06855261111111 +lon_0=-130.1129671111111 +k=1 +x_0=14200 +y_0=15500 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Pitcairn 1967 / UTM zone 9S <3784> +proj=utm +zone=9 +south +ellps=intl +towgs84=185,165,42,0,0,0,0 +units=m +no_defs <> # Popular Visualisation CRS / Mercator (deprecated) <3785> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs <> # World Equidistant Cylindrical (Sphere) (deprecated) <3786> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +a=6371007 +b=6371007 +units=m +no_defs <> # MGI / Slovene National Grid (deprecated) <3787> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # NZGD2000 / Auckland Islands TM 2000 <3788> +proj=tmerc +lat_0=0 +lon_0=166 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Campbell Island TM 2000 <3789> +proj=tmerc +lat_0=0 +lon_0=169 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Antipodes Islands TM 2000 <3790> +proj=tmerc +lat_0=0 +lon_0=179 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Raoul Island TM 2000 <3791> +proj=tmerc +lat_0=0 +lon_0=-178 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / Chatham Islands TM 2000 <3793> +proj=tmerc +lat_0=0 +lon_0=-176.5 +k=1 +x_0=3500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Slovenia 1996 / Slovene National Grid <3794> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD27 / Cuba Norte <3795> +proj=lcc +lat_1=23 +lat_2=21.7 +lat_0=22.35 +lon_0=-81 +x_0=500000 +y_0=280296.016 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Cuba Sur <3796> +proj=lcc +lat_1=21.3 +lat_2=20.13333333333333 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +x_0=500000 +y_0=229126.939 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / MTQ Lambert <3797> +proj=lcc +lat_1=50 +lat_2=46 +lat_0=44 +lon_0=-70 +x_0=800000 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD83 / MTQ Lambert <3798> +proj=lcc +lat_1=50 +lat_2=46 +lat_0=44 +lon_0=-70 +x_0=800000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / MTQ Lambert <3799> +proj=lcc +lat_1=50 +lat_2=46 +lat_0=44 +lon_0=-70 +x_0=800000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD27 / Alberta 3TM ref merid 120 W <3800> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD83 / Alberta 3TM ref merid 120 W <3801> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Alberta 3TM ref merid 120 W <3802> +proj=tmerc +lat_0=0 +lon_0=-120 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / Belgian Lambert 2008 <3812> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=50.797815 +lon_0=4.359215833333333 +x_0=649328 +y_0=665262 +ellps=GRS80 +units=m +no_defs <> # NAD83 / Mississippi TM <3814> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Mississippi TM <3815> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +ellps=GRS80 +units=m +no_defs <> # NAD83(NSRS2007) / Mississippi TM <3816> +proj=tmerc +lat_0=32.5 +lon_0=-89.75 +k=0.9998335 +x_0=500000 +y_0=1300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # TWD97 / TM2 zone 119 <3825> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # TWD97 / TM2 zone 121 <3826> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # TWD67 / TM2 zone 119 <3827> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.9999 +x_0=250000 +y_0=0 +ellps=aust_SA +units=m +no_defs <> # TWD67 / TM2 zone 121 <3828> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.9999 +x_0=250000 +y_0=0 +ellps=aust_SA +units=m +no_defs <> # Hu Tzu Shan / UTM zone 51N <3829> +proj=utm +zone=51 +ellps=intl +towgs84=-637,-549,-203,0,0,0,0 +units=m +no_defs <> # WGS 84 / PDC Mercator <3832> +proj=merc +lon_0=150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # Pulkovo 1942(58) / Gauss-Kruger zone 2 <3833> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / Gauss-Kruger zone 2 <3834> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / Gauss-Kruger zone 3 <3835> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / Gauss-Kruger zone 4 <3836> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 3 <3837> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 4 <3838> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 9 <3839> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / 3-degree Gauss-Kruger zone 10 <3840> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 6 <3841> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 7 <3842> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 8 <3843> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942(58) / Stereo70 <3844> +proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 +y_0=500000 +ellps=krass +units=m +no_defs <> # SWEREF99 / RT90 7.5 gon V emulation <3845> +proj=tmerc +lat_0=0 +lon_0=11.30625 +k=1.000006 +x_0=1500025.141 +y_0=-667.282 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 / RT90 5 gon V emulation <3846> +proj=tmerc +lat_0=0 +lon_0=13.55626666666667 +k=1.0000058 +x_0=1500044.695 +y_0=-667.13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 / RT90 2.5 gon V emulation <3847> +proj=tmerc +lat_0=0 +lon_0=15.80628452944445 +k=1.00000561024 +x_0=1500064.274 +y_0=-667.711 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 / RT90 0 gon emulation <3848> +proj=tmerc +lat_0=0 +lon_0=18.0563 +k=1.0000054 +x_0=1500083.521 +y_0=-668.8440000000001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 / RT90 2.5 gon O emulation <3849> +proj=tmerc +lat_0=0 +lon_0=20.30631666666667 +k=1.0000052 +x_0=1500102.765 +y_0=-670.706 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SWEREF99 / RT90 5 gon O emulation <3850> +proj=tmerc +lat_0=0 +lon_0=22.55633333333333 +k=1.0000049 +x_0=1500121.846 +y_0=-672.557 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NZGD2000 / NZCS2000 <3851> +proj=lcc +lat_1=-37.5 +lat_2=-44.5 +lat_0=-41 +lon_0=173 +x_0=3000000 +y_0=7000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RSRGD2000 / DGLC2000 <3852> +proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=157 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # County ST74 <3854> +proj=tmerc +lat_0=0 +lon_0=18.05787 +k=0.99999506 +x_0=100182.7406 +y_0=-6500620.1207 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # WGS 84 / Pseudo-Mercator <3857> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs <> # IGRS / UTM zone 37N <3890> +proj=utm +zone=37 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IGRS / UTM zone 38N <3891> +proj=utm +zone=38 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # IGRS / UTM zone 39N <3892> +proj=utm +zone=39 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ED50 / Iraq National Grid <3893> +proj=tmerc +lat_0=29.02626833333333 +lon_0=46.5 +k=0.9994 +x_0=800000 +y_0=0 +ellps=intl +units=m +no_defs <> # MGI 1901 / Balkans zone 5 <3907> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=5500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # MGI 1901 / Balkans zone 6 <3908> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=6500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # MGI 1901 / Balkans zone 7 <3909> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # MGI 1901 / Balkans zone 8 <3910> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=8500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # MGI 1901 / Slovenia Grid <3911> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # MGI 1901 / Slovene National Grid <3912> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=-5000000 +ellps=bessel +units=m +no_defs <> # Puerto Rico / UTM zone 20N <3920> +proj=utm +zone=20 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=m +no_defs <> # RGF93 / CC42 <3942> +proj=lcc +lat_1=41.25 +lat_2=42.75 +lat_0=42 +lon_0=3 +x_0=1700000 +y_0=1200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC43 <3943> +proj=lcc +lat_1=42.25 +lat_2=43.75 +lat_0=43 +lon_0=3 +x_0=1700000 +y_0=2200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC44 <3944> +proj=lcc +lat_1=43.25 +lat_2=44.75 +lat_0=44 +lon_0=3 +x_0=1700000 +y_0=3200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC45 <3945> +proj=lcc +lat_1=44.25 +lat_2=45.75 +lat_0=45 +lon_0=3 +x_0=1700000 +y_0=4200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC46 <3946> +proj=lcc +lat_1=45.25 +lat_2=46.75 +lat_0=46 +lon_0=3 +x_0=1700000 +y_0=5200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC47 <3947> +proj=lcc +lat_1=46.25 +lat_2=47.75 +lat_0=47 +lon_0=3 +x_0=1700000 +y_0=6200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC48 <3948> +proj=lcc +lat_1=47.25 +lat_2=48.75 +lat_0=48 +lon_0=3 +x_0=1700000 +y_0=7200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC49 <3949> +proj=lcc +lat_1=48.25 +lat_2=49.75 +lat_0=49 +lon_0=3 +x_0=1700000 +y_0=8200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGF93 / CC50 <3950> +proj=lcc +lat_1=49.25 +lat_2=50.75 +lat_0=50 +lon_0=3 +x_0=1700000 +y_0=9200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83 / Virginia Lambert <3968> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Virginia Lambert <3969> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(NSRS2007) / Virginia Lambert <3970> +proj=lcc +lat_1=37 +lat_2=39.5 +lat_0=36 +lon_0=-79.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # WGS 84 / NSIDC EASE-Grid North # Unable to translate coordinate system EPSG:3973 into PROJ.4 format. # # WGS 84 / NSIDC EASE-Grid South # Unable to translate coordinate system EPSG:3974 into PROJ.4 format. # # WGS 84 / NSIDC EASE-Grid Global <3975> +proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / NSIDC Sea Ice Polar Stereographic South <3976> +proj=stere +lat_0=-90 +lat_ts=-70 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # NAD83 / Canada Atlas Lambert <3978> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(CSRS) / Canada Atlas Lambert <3979> +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # Katanga 1955 / Katanga Lambert <3985> +proj=lcc +lat_1=-6.5 +lat_2=-11.5 +lat_0=9 +lon_0=26 +x_0=500000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Katanga 1955 / Katanga Gauss zone A <3986> +proj=tmerc +lat_0=-9 +lon_0=30 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Katanga 1955 / Katanga Gauss zone B <3987> +proj=tmerc +lat_0=-9 +lon_0=28 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Katanga 1955 / Katanga Gauss zone C <3988> +proj=tmerc +lat_0=-9 +lon_0=26 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Katanga 1955 / Katanga Gauss zone D <3989> +proj=tmerc +lat_0=-9 +lon_0=24 +k=1 +x_0=200000 +y_0=500000 +ellps=clrk66 +towgs84=-103.746,-9.614,-255.95,0,0,0,0 +units=m +no_defs <> # Puerto Rico State Plane CS of 1927 <3991> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=us-ft +no_defs <> # Puerto Rico / St. Croix <3992> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012192 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=us-ft +no_defs <> # Guam 1963 / Guam SPCS # Unable to translate coordinate system EPSG:3993 into PROJ.4 format. # # WGS 84 / Mercator 41 <3994> +proj=merc +lon_0=100 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / Arctic Polar Stereographic <3995> +proj=stere +lat_0=90 +lat_ts=71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / IBCAO Polar Stereographic <3996> +proj=stere +lat_0=90 +lat_ts=75 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / Dubai Local TM <3997> +proj=tmerc +lat_0=0 +lon_0=55.33333333333334 +k=1 +x_0=500000 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # MOLDREF99 / Moldova TM <4026> +proj=tmerc +lat_0=0 +lon_0=28.4 +k=0.9999400000000001 +x_0=200000 +y_0=-5000000 +ellps=GRS80 +units=m +no_defs <> # WGS 84 / TMzn35N <4037> +proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / TMzn36N <4038> +proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 12 <4048> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 14 <4049> +proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 16 <4050> +proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 18 <4051> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 20 <4056> +proj=tmerc +lat_0=0 +lon_0=20 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 22 <4057> +proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 24 <4058> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 26 <4059> +proj=tmerc +lat_0=0 +lon_0=26 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / Congo TM zone 28 <4060> +proj=tmerc +lat_0=0 +lon_0=28 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / UTM zone 33S <4061> +proj=utm +zone=33 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / UTM zone 34S <4062> +proj=utm +zone=34 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # RGRDC 2005 / UTM zone 35S <4063> +proj=utm +zone=35 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Chua / UTM zone 23S <4071> +proj=utm +zone=23 +south +ellps=intl +units=m +no_defs <> # REGCAN95 / UTM zone 27N <4082> +proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # REGCAN95 / UTM zone 28N <4083> +proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # WGS 84 / World Equidistant Cylindrical # Unable to translate coordinate system EPSG:4087 into PROJ.4 format. # # World Equidistant Cylindrical (Sphere) # Unable to translate coordinate system EPSG:4088 into PROJ.4 format. # # EPSG topocentric example A # Unable to translate coordinate system EPSG:5819 into PROJ.4 format. # # EPSG topocentric example B # Unable to translate coordinate system EPSG:5820 into PROJ.4 format. # # EPSG vertical perspective example # Unable to translate coordinate system EPSG:5821 into PROJ.4 format. # # Pulkovo 1995 / Gauss-Kruger zone 4 <20004> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 5 <20005> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 6 <20006> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 7 <20007> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 8 <20008> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 9 <20009> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 10 <20010> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 11 <20011> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 12 <20012> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 13 <20013> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 14 <20014> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 15 <20015> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 16 <20016> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 17 <20017> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 18 <20018> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 19 <20019> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 20 <20020> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 21 <20021> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 22 <20022> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 23 <20023> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 24 <20024> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 25 <20025> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 26 <20026> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 27 <20027> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 28 <20028> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 29 <20029> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 30 <20030> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 31 <20031> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger zone 32 <20032> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 4N (deprecated) <20064> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 5N (deprecated) <20065> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 6N (deprecated) <20066> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 7N (deprecated) <20067> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 8N (deprecated) <20068> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 9N (deprecated) <20069> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 10N (deprecated) <20070> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 11N (deprecated) <20071> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 12N (deprecated) <20072> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 13N (deprecated) <20073> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 14N (deprecated) <20074> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 15N (deprecated) <20075> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 16N (deprecated) <20076> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 17N (deprecated) <20077> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 18N (deprecated) <20078> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 19N (deprecated) <20079> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 20N (deprecated) <20080> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 21N (deprecated) <20081> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 22N (deprecated) <20082> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 23N (deprecated) <20083> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 24N (deprecated) <20084> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 25N (deprecated) <20085> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 26N (deprecated) <20086> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 27N (deprecated) <20087> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 28N (deprecated) <20088> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 29N (deprecated) <20089> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 30N (deprecated) <20090> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 31N (deprecated) <20091> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Pulkovo 1995 / Gauss-Kruger 32N (deprecated) <20092> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.82,-131.21,-82.66,-0,-0,0.16,-0.12 +units=m +no_defs <> # Adindan / UTM zone 35N <20135> +proj=utm +zone=35 +ellps=clrk80 +units=m +no_defs <> # Adindan / UTM zone 36N <20136> +proj=utm +zone=36 +ellps=clrk80 +units=m +no_defs <> # Adindan / UTM zone 37N <20137> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs <> # Adindan / UTM zone 38N <20138> +proj=utm +zone=38 +ellps=clrk80 +units=m +no_defs <> # AGD66 / AMG zone 48 <20248> +proj=utm +zone=48 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 49 <20249> +proj=utm +zone=49 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 50 <20250> +proj=utm +zone=50 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 51 <20251> +proj=utm +zone=51 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 52 <20252> +proj=utm +zone=52 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 53 <20253> +proj=utm +zone=53 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 54 <20254> +proj=utm +zone=54 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 55 <20255> +proj=utm +zone=55 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 56 <20256> +proj=utm +zone=56 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 57 <20257> +proj=utm +zone=57 +south +ellps=aust_SA +units=m +no_defs <> # AGD66 / AMG zone 58 <20258> +proj=utm +zone=58 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 48 <20348> +proj=utm +zone=48 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 49 <20349> +proj=utm +zone=49 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 50 <20350> +proj=utm +zone=50 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 51 <20351> +proj=utm +zone=51 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 52 <20352> +proj=utm +zone=52 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 53 <20353> +proj=utm +zone=53 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 54 <20354> +proj=utm +zone=54 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 55 <20355> +proj=utm +zone=55 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 56 <20356> +proj=utm +zone=56 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 57 <20357> +proj=utm +zone=57 +south +ellps=aust_SA +units=m +no_defs <> # AGD84 / AMG zone 58 <20358> +proj=utm +zone=58 +south +ellps=aust_SA +units=m +no_defs <> # Ain el Abd / UTM zone 36N <20436> +proj=utm +zone=36 +ellps=intl +units=m +no_defs <> # Ain el Abd / UTM zone 37N <20437> +proj=utm +zone=37 +ellps=intl +units=m +no_defs <> # Ain el Abd / UTM zone 38N <20438> +proj=utm +zone=38 +ellps=intl +units=m +no_defs <> # Ain el Abd / UTM zone 39N <20439> +proj=utm +zone=39 +ellps=intl +units=m +no_defs <> # Ain el Abd / UTM zone 40N <20440> +proj=utm +zone=40 +ellps=intl +units=m +no_defs <> # Ain el Abd / Bahrain Grid <20499> +proj=utm +zone=39 +ellps=intl +units=m +no_defs <> # Afgooye / UTM zone 38N <20538> +proj=utm +zone=38 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs <> # Afgooye / UTM zone 39N <20539> +proj=utm +zone=39 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m +no_defs <> # Lisbon (Lisbon) / Portuguese National Grid <20790> +proj=tmerc +lat_0=39.66666666666666 +lon_0=1 +k=1 +x_0=200000 +y_0=300000 +ellps=intl +pm=lisbon +units=m +no_defs <> # Lisbon (Lisbon) / Portuguese Grid <20791> +proj=tmerc +lat_0=39.66666666666666 +lon_0=1 +k=1 +x_0=0 +y_0=0 +ellps=intl +pm=lisbon +units=m +no_defs <> # Aratu / UTM zone 22S <20822> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs <> # Aratu / UTM zone 23S <20823> +proj=utm +zone=23 +south +ellps=intl +units=m +no_defs <> # Aratu / UTM zone 24S <20824> +proj=utm +zone=24 +south +ellps=intl +units=m +no_defs <> # Arc 1950 / UTM zone 34S <20934> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> # Arc 1950 / UTM zone 35S <20935> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> # Arc 1950 / UTM zone 36S <20936> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> # Arc 1960 / UTM zone 35S <21035> +proj=utm +zone=35 +south +ellps=clrk80 +units=m +no_defs <> # Arc 1960 / UTM zone 36S <21036> +proj=utm +zone=36 +south +ellps=clrk80 +units=m +no_defs <> # Arc 1960 / UTM zone 37S <21037> +proj=utm +zone=37 +south +ellps=clrk80 +units=m +no_defs <> # Arc 1960 / UTM zone 35N <21095> +proj=utm +zone=35 +ellps=clrk80 +units=m +no_defs <> # Arc 1960 / UTM zone 36N <21096> +proj=utm +zone=36 +ellps=clrk80 +units=m +no_defs <> # Arc 1960 / UTM zone 37N <21097> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs <> # Batavia (Jakarta) / NEIEZ (deprecated) <21100> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m +no_defs <> # Batavia / UTM zone 48S <21148> +proj=utm +zone=48 +south +ellps=bessel +units=m +no_defs <> # Batavia / UTM zone 49S <21149> +proj=utm +zone=49 +south +ellps=bessel +units=m +no_defs <> # Batavia / UTM zone 50S <21150> +proj=utm +zone=50 +south +ellps=bessel +units=m +no_defs <> # Barbados 1938 / British West Indies Grid <21291> +proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +units=m +no_defs <> # Barbados 1938 / Barbados National Grid <21292> +proj=tmerc +lat_0=13.17638888888889 +lon_0=-59.55972222222222 +k=0.9999986 +x_0=30000 +y_0=75000 +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 13 <21413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 14 <21414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 15 <21415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 16 <21416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 17 <21417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 18 <21418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 19 <21419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 20 <21420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 21 <21421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 22 <21422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger zone 23 <21423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 75E <21453> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 81E <21454> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 87E <21455> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 93E <21456> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 99E <21457> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 105E <21458> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 111E <21459> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 117E <21460> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 123E <21461> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 129E <21462> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger CM 135E <21463> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 13N (deprecated) <21473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 14N (deprecated) <21474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 15N (deprecated) <21475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 16N (deprecated) <21476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 17N (deprecated) <21477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 18N (deprecated) <21478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 19N (deprecated) <21479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 20N (deprecated) <21480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 21N (deprecated) <21481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 22N (deprecated) <21482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Beijing 1954 / Gauss-Kruger 23N (deprecated) <21483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Belge 1950 (Brussels) / Belge Lambert 50 <21500> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=0 +x_0=150000 +y_0=5400000 +ellps=intl +pm=brussels +units=m +no_defs <> # Bern 1898 (Bern) / LV03C <21780> +proj=somerc +lat_0=46.95240555555556 +lon_0=0 +k_0=1 +x_0=0 +y_0=0 +ellps=bessel +pm=bern +units=m +no_defs <> # CH1903 / LV03 <21781> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> # CH1903 / LV03C-G <21782> +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=0 +y_0=0 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / UTM zone 17N (deprecated) <21817> +proj=utm +zone=17 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / UTM zone 18N <21818> +proj=utm +zone=18 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia West zone (deprecated) <21891> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia Bogota zone (deprecated) <21892> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia East Central zone (deprecated) <21893> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia East (deprecated) <21894> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia West zone <21896> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia Bogota zone <21897> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia East Central zone <21898> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Bogota 1975 / Colombia East <21899> +proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m +no_defs <> # Camacupa / UTM zone 32S <22032> +proj=utm +zone=32 +south +ellps=clrk80 +units=m +no_defs <> # Camacupa / UTM zone 33S <22033> +proj=utm +zone=33 +south +ellps=clrk80 +units=m +no_defs <> # Camacupa / TM 11.30 SE <22091> +proj=tmerc +lat_0=0 +lon_0=11.5 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # Camacupa / TM 12 SE <22092> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m +no_defs <> # POSGAR 98 / Argentina 1 <22171> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 98 / Argentina 2 <22172> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 98 / Argentina 3 <22173> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 98 / Argentina 4 <22174> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 98 / Argentina 5 <22175> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 98 / Argentina 6 <22176> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 98 / Argentina 7 <22177> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # POSGAR 94 / Argentina 1 <22181> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # POSGAR 94 / Argentina 2 <22182> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # POSGAR 94 / Argentina 3 <22183> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # POSGAR 94 / Argentina 4 <22184> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # POSGAR 94 / Argentina 5 <22185> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # POSGAR 94 / Argentina 6 <22186> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # POSGAR 94 / Argentina 7 <22187> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Campo Inchauspe / Argentina 1 <22191> +proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Campo Inchauspe / Argentina 2 <22192> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Campo Inchauspe / Argentina 3 <22193> +proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Campo Inchauspe / Argentina 4 <22194> +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Campo Inchauspe / Argentina 5 <22195> +proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Campo Inchauspe / Argentina 6 <22196> +proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Campo Inchauspe / Argentina 7 <22197> +proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Cape / UTM zone 34S <22234> +proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> # Cape / UTM zone 35S <22235> +proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> # Cape / UTM zone 36S <22236> +proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m +no_defs <> # Cape / Lo15 # Unable to translate coordinate system EPSG:22275 into PROJ.4 format. # # Cape / Lo17 # Unable to translate coordinate system EPSG:22277 into PROJ.4 format. # # Cape / Lo19 # Unable to translate coordinate system EPSG:22279 into PROJ.4 format. # # Cape / Lo21 # Unable to translate coordinate system EPSG:22281 into PROJ.4 format. # # Cape / Lo23 # Unable to translate coordinate system EPSG:22283 into PROJ.4 format. # # Cape / Lo25 # Unable to translate coordinate system EPSG:22285 into PROJ.4 format. # # Cape / Lo27 # Unable to translate coordinate system EPSG:22287 into PROJ.4 format. # # Cape / Lo29 # Unable to translate coordinate system EPSG:22289 into PROJ.4 format. # # Cape / Lo31 # Unable to translate coordinate system EPSG:22291 into PROJ.4 format. # # Cape / Lo33 # Unable to translate coordinate system EPSG:22293 into PROJ.4 format. # # Carthage (Paris) / Tunisia Mining Grid # Unable to translate coordinate system EPSG:22300 into PROJ.4 format. # # Carthage / UTM zone 32N <22332> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +datum=carthage +units=m +no_defs <> # Carthage / Nord Tunisie <22391> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +datum=carthage +units=m +no_defs <> # Carthage / Sud Tunisie <22392> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=9.9 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +datum=carthage +units=m +no_defs <> # Corrego Alegre / UTM zone 21S <22521> +proj=utm +zone=21 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> # Corrego Alegre / UTM zone 22S <22522> +proj=utm +zone=22 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> # Corrego Alegre / UTM zone 23S <22523> +proj=utm +zone=23 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> # Corrego Alegre / UTM zone 24S <22524> +proj=utm +zone=24 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> # Corrego Alegre / UTM zone 25S <22525> +proj=utm +zone=25 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m +no_defs <> # Deir ez Zor / Levant Zone <22700> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Deir ez Zor / Syria Lambert <22770> +proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Deir ez Zor / Levant Stereographic <22780> +proj=sterea +lat_0=34.2 +lon_0=39.15 +k=0.9995341 +x_0=0 +y_0=0 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Douala / UTM zone 32N (deprecated) <22832> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Egypt 1907 / Blue Belt <22991> +proj=tmerc +lat_0=30 +lon_0=35 +k=1 +x_0=300000 +y_0=1100000 +ellps=helmert +units=m +no_defs <> # Egypt 1907 / Red Belt <22992> +proj=tmerc +lat_0=30 +lon_0=31 +k=1 +x_0=615000 +y_0=810000 +ellps=helmert +units=m +no_defs <> # Egypt 1907 / Purple Belt <22993> +proj=tmerc +lat_0=30 +lon_0=27 +k=1 +x_0=700000 +y_0=200000 +ellps=helmert +units=m +no_defs <> # Egypt 1907 / Extended Purple Belt <22994> +proj=tmerc +lat_0=30 +lon_0=27 +k=1 +x_0=700000 +y_0=1200000 +ellps=helmert +units=m +no_defs <> # ED50 / UTM zone 28N <23028> +proj=utm +zone=28 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 29N <23029> +proj=utm +zone=29 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 30N <23030> +proj=utm +zone=30 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 31N <23031> +proj=utm +zone=31 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 32N <23032> +proj=utm +zone=32 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 33N <23033> +proj=utm +zone=33 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 34N <23034> +proj=utm +zone=34 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 35N <23035> +proj=utm +zone=35 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 36N <23036> +proj=utm +zone=36 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 37N <23037> +proj=utm +zone=37 +ellps=intl +units=m +no_defs <> # ED50 / UTM zone 38N <23038> +proj=utm +zone=38 +ellps=intl +units=m +no_defs <> # ED50 / TM 0 N <23090> +proj=tmerc +lat_0=0 +lon_0=0 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # ED50 / TM 5 NE <23095> +proj=tmerc +lat_0=0 +lon_0=5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +units=m +no_defs <> # Fahud / UTM zone 39N <23239> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs <> # Fahud / UTM zone 40N <23240> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs <> # Garoua / UTM zone 33N (deprecated) <23433> +proj=utm +zone=33 +a=6378249.2 +b=6356515 +units=m +no_defs <> # HD72 / EOV <23700> +proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 46.2 <23830> +proj=tmerc +lat_0=0 +lon_0=94.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 47.1 <23831> +proj=tmerc +lat_0=0 +lon_0=97.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 47.2 <23832> +proj=tmerc +lat_0=0 +lon_0=100.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 48.1 <23833> +proj=tmerc +lat_0=0 +lon_0=103.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 48.2 <23834> +proj=tmerc +lat_0=0 +lon_0=106.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 49.1 <23835> +proj=tmerc +lat_0=0 +lon_0=109.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 49.2 <23836> +proj=tmerc +lat_0=0 +lon_0=112.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 50.1 <23837> +proj=tmerc +lat_0=0 +lon_0=115.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 50.2 <23838> +proj=tmerc +lat_0=0 +lon_0=118.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 51.1 <23839> +proj=tmerc +lat_0=0 +lon_0=121.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 51.2 <23840> +proj=tmerc +lat_0=0 +lon_0=124.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 52.1 <23841> +proj=tmerc +lat_0=0 +lon_0=127.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 52.2 <23842> +proj=tmerc +lat_0=0 +lon_0=130.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 53.1 <23843> +proj=tmerc +lat_0=0 +lon_0=133.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 53.2 <23844> +proj=tmerc +lat_0=0 +lon_0=136.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / Indonesia TM-3 zone 54.1 <23845> +proj=tmerc +lat_0=0 +lon_0=139.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ID74 / UTM zone 46N <23846> +proj=utm +zone=46 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 47N <23847> +proj=utm +zone=47 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 48N <23848> +proj=utm +zone=48 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 49N <23849> +proj=utm +zone=49 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 50N <23850> +proj=utm +zone=50 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 51N <23851> +proj=utm +zone=51 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 52N <23852> +proj=utm +zone=52 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 53N (deprecated) <23853> +proj=utm +zone=53 +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # DGN95 / UTM zone 46N <23866> +proj=utm +zone=46 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 47N <23867> +proj=utm +zone=47 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 48N <23868> +proj=utm +zone=48 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 49N <23869> +proj=utm +zone=49 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 50N <23870> +proj=utm +zone=50 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 51N <23871> +proj=utm +zone=51 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 52N <23872> +proj=utm +zone=52 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 47S <23877> +proj=utm +zone=47 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 48S <23878> +proj=utm +zone=48 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 49S <23879> +proj=utm +zone=49 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 50S <23880> +proj=utm +zone=50 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 51S <23881> +proj=utm +zone=51 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 52S <23882> +proj=utm +zone=52 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 53S <23883> +proj=utm +zone=53 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # DGN95 / UTM zone 54S <23884> +proj=utm +zone=54 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # ID74 / UTM zone 46S (deprecated) <23886> +proj=utm +zone=46 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 47S <23887> +proj=utm +zone=47 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 48S <23888> +proj=utm +zone=48 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 49S <23889> +proj=utm +zone=49 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 50S <23890> +proj=utm +zone=50 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 51S <23891> +proj=utm +zone=51 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 52S <23892> +proj=utm +zone=52 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 53S <23893> +proj=utm +zone=53 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # ID74 / UTM zone 54S <23894> +proj=utm +zone=54 +south +a=6378160 +b=6356774.50408554 +units=m +no_defs <> # Indian 1954 / UTM zone 46N <23946> +proj=utm +zone=46 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> # Indian 1954 / UTM zone 47N <23947> +proj=utm +zone=47 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> # Indian 1954 / UTM zone 48N <23948> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m +no_defs <> # Indian 1975 / UTM zone 47N <24047> +proj=utm +zone=47 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Indian 1975 / UTM zone 48N <24048> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Jamaica 1875 / Jamaica (Old Grid) <24100> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=167638.49597 +y_0=121918.90616 +a=6378249.144808011 +b=6356514.966204134 +to_meter=0.3047972654 +no_defs <> # JAD69 / Jamaica National Grid <24200> +proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=250000 +y_0=150000 +ellps=clrk66 +units=m +no_defs <> # Kalianpur 1937 / UTM zone 45N <24305> +proj=utm +zone=45 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Kalianpur 1937 / UTM zone 46N <24306> +proj=utm +zone=46 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Kalianpur 1962 / UTM zone 41N <24311> +proj=utm +zone=41 +a=6377301.243 +b=6356100.230165384 +units=m +no_defs <> # Kalianpur 1962 / UTM zone 42N <24312> +proj=utm +zone=42 +a=6377301.243 +b=6356100.230165384 +units=m +no_defs <> # Kalianpur 1962 / UTM zone 43N <24313> +proj=utm +zone=43 +a=6377301.243 +b=6356100.230165384 +units=m +no_defs <> # Kalianpur 1975 / UTM zone 42N <24342> +proj=utm +zone=42 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / UTM zone 43N <24343> +proj=utm +zone=43 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / UTM zone 44N <24344> +proj=utm +zone=44 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / UTM zone 45N <24345> +proj=utm +zone=45 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / UTM zone 46N <24346> +proj=utm +zone=46 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / UTM zone 47N <24347> +proj=utm +zone=47 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1880 / India zone 0 <24370> +proj=lcc +lat_1=39.5 +lat_0=39.5 +lon_0=68 +k_0=0.99846154 +x_0=2153865.73916853 +y_0=2368292.194628102 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> # Kalianpur 1880 / India zone I <24371> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> # Kalianpur 1880 / India zone IIa <24372> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> # Kalianpur 1880 / India zone III <24373> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> # Kalianpur 1880 / India zone IV <24374> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> # Kalianpur 1937 / India zone IIb <24375> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743185.69 +y_0=914395.23 +a=6377276.345 +b=6356075.41314024 +units=m +no_defs <> # Kalianpur 1962 / India zone I <24376> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165384 +units=m +no_defs <> # Kalianpur 1962 / India zone IIa <24377> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165384 +units=m +no_defs <> # Kalianpur 1975 / India zone I <24378> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / India zone IIa <24379> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / India zone IIb <24380> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1975 / India zone III <24381> +proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kalianpur 1880 / India zone IIb <24382> +proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.359005156 +to_meter=0.9143985307444408 +no_defs <> # Kalianpur 1975 / India zone IV <24383> +proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m +no_defs <> # Kertau 1968 / Singapore Grid <24500> +proj=cass +lat_0=1.287646666666667 +lon_0=103.8530022222222 +x_0=30000 +y_0=30000 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> # Kertau 1968 / UTM zone 47N <24547> +proj=utm +zone=47 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> # Kertau 1968 / UTM zone 48N <24548> +proj=utm +zone=48 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m +no_defs <> # Kertau / R.S.O. Malaya (ch) (deprecated) <24571> +proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804671.2997750348 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +to_meter=20.11678249437587 +no_defs <> # KOC Lambert <24600> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +towgs84=-294.7,-200.1,525.5,0,0,0,0 +units=m +no_defs <> # La Canoa / UTM zone 18N <24718> +proj=utm +zone=18 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> # La Canoa / UTM zone 19N <24719> +proj=utm +zone=19 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> # La Canoa / UTM zone 20N <24720> +proj=utm +zone=20 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m +no_defs <> # PSAD56 / UTM zone 17N <24817> +proj=utm +zone=17 +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 18N <24818> +proj=utm +zone=18 +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 19N <24819> +proj=utm +zone=19 +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 20N <24820> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 21N <24821> +proj=utm +zone=21 +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 17S <24877> +proj=utm +zone=17 +south +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 18S <24878> +proj=utm +zone=18 +south +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 19S <24879> +proj=utm +zone=19 +south +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 20S <24880> +proj=utm +zone=20 +south +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 21S <24881> +proj=utm +zone=21 +south +ellps=intl +units=m +no_defs <> # PSAD56 / UTM zone 22S <24882> +proj=utm +zone=22 +south +ellps=intl +units=m +no_defs <> # PSAD56 / Peru west zone <24891> +proj=tmerc +lat_0=-6 +lon_0=-80.5 +k=0.99983008 +x_0=222000 +y_0=1426834.743 +ellps=intl +units=m +no_defs <> # PSAD56 / Peru central zone <24892> +proj=tmerc +lat_0=-9.5 +lon_0=-76 +k=0.99932994 +x_0=720000 +y_0=1039979.159 +ellps=intl +units=m +no_defs <> # PSAD56 / Peru east zone <24893> +proj=tmerc +lat_0=-9.5 +lon_0=-70.5 +k=0.99952992 +x_0=1324000 +y_0=1040084.558 +ellps=intl +units=m +no_defs <> # Leigon / Ghana Metre Grid <25000> +proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.99975 +x_0=274319.51 +y_0=0 +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +units=m +no_defs <> # Lome / UTM zone 31N <25231> +proj=utm +zone=31 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Luzon 1911 / Philippines zone I <25391> +proj=tmerc +lat_0=0 +lon_0=117 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # Luzon 1911 / Philippines zone II <25392> +proj=tmerc +lat_0=0 +lon_0=119 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # Luzon 1911 / Philippines zone III <25393> +proj=tmerc +lat_0=0 +lon_0=121 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # Luzon 1911 / Philippines zone IV <25394> +proj=tmerc +lat_0=0 +lon_0=123 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # Luzon 1911 / Philippines zone V <25395> +proj=tmerc +lat_0=0 +lon_0=125 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m +no_defs <> # Makassar (Jakarta) / NEIEZ (deprecated) <25700> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +units=m +no_defs <> # ETRS89 / UTM zone 28N <25828> +proj=utm +zone=28 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 29N <25829> +proj=utm +zone=29 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 30N <25830> +proj=utm +zone=30 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 31N <25831> +proj=utm +zone=31 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 32N <25832> +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 33N <25833> +proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 34N <25834> +proj=utm +zone=34 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 35N <25835> +proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 36N <25836> +proj=utm +zone=36 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 37N <25837> +proj=utm +zone=37 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / UTM zone 38N <25838> +proj=utm +zone=38 +ellps=GRS80 +units=m +no_defs <> # ETRS89 / TM Baltic93 <25884> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # Malongo 1987 / UTM zone 32S <25932> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs <> # Merchich / Nord Maroc <26191> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> # Merchich / Sud Maroc <26192> +proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> # Merchich / Sahara (deprecated) <26193> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> # Merchich / Sahara Nord <26194> +proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.999616304 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> # Merchich / Sahara Sud <26195> +proj=lcc +lat_1=22.5 +lat_0=22.5 +lon_0=-5.4 +k_0=0.999616437 +x_0=1500000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m +no_defs <> # Massawa / UTM zone 37N <26237> +proj=utm +zone=37 +ellps=bessel +towgs84=639,405,60,0,0,0,0 +units=m +no_defs <> # Minna / UTM zone 31N <26331> +proj=utm +zone=31 +ellps=clrk80 +units=m +no_defs <> # Minna / UTM zone 32N <26332> +proj=utm +zone=32 +ellps=clrk80 +units=m +no_defs <> # Minna / Nigeria West Belt <26391> +proj=tmerc +lat_0=4 +lon_0=4.5 +k=0.99975 +x_0=230738.26 +y_0=0 +ellps=clrk80 +units=m +no_defs <> # Minna / Nigeria Mid Belt <26392> +proj=tmerc +lat_0=4 +lon_0=8.5 +k=0.99975 +x_0=670553.98 +y_0=0 +ellps=clrk80 +units=m +no_defs <> # Minna / Nigeria East Belt <26393> +proj=tmerc +lat_0=4 +lon_0=12.5 +k=0.99975 +x_0=1110369.7 +y_0=0 +ellps=clrk80 +units=m +no_defs <> # Mhast / UTM zone 32S (deprecated) <26432> +proj=utm +zone=32 +south +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +units=m +no_defs <> # Monte Mario (Rome) / Italy zone 1 (deprecated) <26591> +proj=tmerc +lat_0=0 +lon_0=-3.45233333333333 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs <> # Monte Mario (Rome) / Italy zone 2 (deprecated) <26592> +proj=tmerc +lat_0=0 +lon_0=2.54766666666666 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +pm=rome +units=m +no_defs <> # M'poraloko / UTM zone 32N <26632> +proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m +no_defs <> # M'poraloko / UTM zone 32S <26692> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m +no_defs <> # NAD27 / UTM zone 1N <26701> +proj=utm +zone=1 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 2N <26702> +proj=utm +zone=2 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 3N <26703> +proj=utm +zone=3 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 4N <26704> +proj=utm +zone=4 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 5N <26705> +proj=utm +zone=5 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 6N <26706> +proj=utm +zone=6 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 7N <26707> +proj=utm +zone=7 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 8N <26708> +proj=utm +zone=8 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 9N <26709> +proj=utm +zone=9 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 10N <26710> +proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 11N <26711> +proj=utm +zone=11 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 12N <26712> +proj=utm +zone=12 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 13N <26713> +proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 14N <26714> +proj=utm +zone=14 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 15N <26715> +proj=utm +zone=15 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 16N <26716> +proj=utm +zone=16 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 17N <26717> +proj=utm +zone=17 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 18N <26718> +proj=utm +zone=18 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 19N <26719> +proj=utm +zone=19 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 20N <26720> +proj=utm +zone=20 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 21N <26721> +proj=utm +zone=21 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / UTM zone 22N <26722> +proj=utm +zone=22 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Alabama East <26729> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alabama West <26730> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 1 <26731> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000.001016002 +y_0=-5000000.001016002 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 2 <26732> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 3 <26733> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 4 <26734> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 5 <26735> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 6 <26736> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 7 <26737> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=213360.4267208534 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 8 <26738> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 9 <26739> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Alaska zone 10 <26740> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=914401.8288036576 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone I <26741> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone II <26742> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone III <26743> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone IV <26744> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone V <26745> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone VI <26746> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone VII (deprecated) <26747> +proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=127079.524511049 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Arizona East <26748> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Arizona Central <26749> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Arizona West <26750> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Arkansas North <26751> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Arkansas South <26752> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Colorado North <26753> +proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Colorado Central <26754> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Colorado South <26755> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Connecticut <26756> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Delaware <26757> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Florida East <26758> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Florida West <26759> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Florida North <26760> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Georgia East <26766> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Georgia West <26767> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Idaho East <26768> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Idaho Central <26769> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Idaho West <26770> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Illinois East <26771> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Illinois West <26772> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Indiana East <26773> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Indiana West <26774> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Iowa North <26775> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Iowa South <26776> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Kansas North <26777> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Kansas South <26778> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Kentucky North <26779> +proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Kentucky South <26780> +proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Louisiana North <26781> +proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.66666666666667 +lon_0=-92.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Louisiana South <26782> +proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Maine East <26783> +proj=tmerc +lat_0=43.83333333333334 +lon_0=-68.5 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Maine West <26784> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Maryland <26785> +proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.83333333333334 +lon_0=-77 +x_0=243840.4876809754 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Massachusetts Mainland <26786> +proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Massachusetts Island <26787> +proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=60960.12192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Minnesota North <26791> +proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Minnesota Central <26792> +proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Minnesota South <26793> +proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Mississippi East <26794> +proj=tmerc +lat_0=29.66666666666667 +lon_0=-88.83333333333333 +k=0.99996 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Mississippi West <26795> +proj=tmerc +lat_0=30.5 +lon_0=-90.33333333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Missouri East <26796> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Missouri Central <26797> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Missouri West <26798> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / California zone VII <26799> +proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=1268253.006858014 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD Michigan / Michigan East <26801> +proj=tmerc +lat_0=41.5 +lon_0=-83.66666666666667 +k=0.999942857 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> # NAD Michigan / Michigan Old Central <26802> +proj=tmerc +lat_0=41.5 +lon_0=-85.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> # NAD Michigan / Michigan West <26803> +proj=tmerc +lat_0=41.5 +lon_0=-88.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> # NAD Michigan / Michigan North <26811> +proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> # NAD Michigan / Michigan Central <26812> +proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> # NAD Michigan / Michigan South <26813> +proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +units=us-ft +no_defs <> # NAD83 / Maine East (ftUS) (deprecated) <26814> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Maine West (ftUS) (deprecated) <26815> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Minnesota North (ftUS) (deprecated) <26819> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Minnesota Central (ftUS) (deprecated) <26820> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Minnesota South (ftUS) (deprecated) <26821> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Nebraska (ftUS) (deprecated) <26822> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000101601 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / West Virginia North (ftUS) (deprecated) <26823> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=1968500 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / West Virginia South (ftUS) (deprecated) <26824> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=1968500 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83(HARN) / Maine East (ftUS) (deprecated) <26825> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Maine West (ftUS) (deprecated) <26826> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Minnesota North (ftUS) (deprecated) <26830> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Minnesota Central (ftUS) (deprecated) <26831> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Minnesota South (ftUS) (deprecated) <26832> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / Nebraska (ftUS) (deprecated) <26833> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000101601 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / West Virginia North (ftUS) (deprecated) <26834> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=1968500 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(HARN) / West Virginia South (ftUS) (deprecated) <26835> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=1968500 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(NSRS2007) / Maine East (ftUS) (deprecated) <26836> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Maine West (ftUS) (deprecated) <26837> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Minnesota North (ftUS) (deprecated) <26841> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Minnesota Central (ftUS) (deprecated) <26842> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Minnesota South (ftUS) (deprecated) <26843> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101601 +y_0=99999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / Nebraska (ftUS) (deprecated) <26844> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.0000101601 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / West Virginia North (ftUS) (deprecated) <26845> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=1968500 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83(NSRS2007) / West Virginia South (ftUS) (deprecated) <26846> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=1968500 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD83 / Maine East (ftUS) <26847> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Maine West (ftUS) <26848> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Minnesota North (ftUS) <26849> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Minnesota Central (ftUS) <26850> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Minnesota South (ftUS) <26851> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / Nebraska (ftUS) <26852> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / West Virginia North (ftUS) <26853> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / West Virginia South (ftUS) <26854> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83(HARN) / Maine East (ftUS) <26855> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Maine West (ftUS) <26856> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Minnesota North (ftUS) <26857> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Minnesota Central (ftUS) <26858> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Minnesota South (ftUS) <26859> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / Nebraska (ftUS) <26860> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / West Virginia North (ftUS) <26861> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(HARN) / West Virginia South (ftUS) <26862> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Maine East (ftUS) <26863> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Maine West (ftUS) <26864> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Minnesota North (ftUS) <26865> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Minnesota Central (ftUS) <26866> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Minnesota South (ftUS) <26867> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / Nebraska (ftUS) <26868> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / West Virginia North (ftUS) <26869> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(NSRS2007) / West Virginia South (ftUS) <26870> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs <> # NAD83(CSRS) / MTM zone 11 <26891> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 12 <26892> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 13 <26893> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 14 <26894> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 15 <26895> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 16 <26896> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 17 <26897> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 1 <26898> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83(CSRS) / MTM zone 2 <26899> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # NAD83 / UTM zone 1N <26901> +proj=utm +zone=1 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 2N <26902> +proj=utm +zone=2 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 3N <26903> +proj=utm +zone=3 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 4N <26904> +proj=utm +zone=4 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 5N <26905> +proj=utm +zone=5 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 6N <26906> +proj=utm +zone=6 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 7N <26907> +proj=utm +zone=7 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 8N <26908> +proj=utm +zone=8 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 9N <26909> +proj=utm +zone=9 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 10N <26910> +proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 11N <26911> +proj=utm +zone=11 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 12N <26912> +proj=utm +zone=12 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 13N <26913> +proj=utm +zone=13 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 14N <26914> +proj=utm +zone=14 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 15N <26915> +proj=utm +zone=15 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 16N <26916> +proj=utm +zone=16 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 17N <26917> +proj=utm +zone=17 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 18N <26918> +proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 19N <26919> +proj=utm +zone=19 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 20N <26920> +proj=utm +zone=20 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 21N <26921> +proj=utm +zone=21 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 22N <26922> +proj=utm +zone=22 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / UTM zone 23N <26923> +proj=utm +zone=23 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alabama East <26929> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alabama West <26930> +proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 1 <26931> +proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 2 <26932> +proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 3 <26933> +proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 4 <26934> +proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 5 <26935> +proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 6 <26936> +proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 7 <26937> +proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 8 <26938> +proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 9 <26939> +proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Alaska zone 10 <26940> +proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / California zone 1 <26941> +proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / California zone 2 <26942> +proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / California zone 3 <26943> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / California zone 4 <26944> +proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / California zone 5 <26945> +proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / California zone 6 <26946> +proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Arizona East <26948> +proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Arizona Central <26949> +proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Arizona West <26950> +proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Arkansas North <26951> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Arkansas South <26952> +proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Colorado North <26953> +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Colorado Central <26954> +proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Colorado South <26955> +proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Connecticut <26956> +proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Delaware <26957> +proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Florida East <26958> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Florida West <26959> +proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Florida North <26960> +proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Hawaii zone 1 <26961> +proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Hawaii zone 2 <26962> +proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Hawaii zone 3 <26963> +proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Hawaii zone 4 <26964> +proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Hawaii zone 5 <26965> +proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Georgia East <26966> +proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Georgia West <26967> +proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Idaho East <26968> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Idaho Central <26969> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Idaho West <26970> +proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Illinois East <26971> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Illinois West <26972> +proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Indiana East <26973> +proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Indiana West <26974> +proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Iowa North <26975> +proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Iowa South <26976> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Kansas North <26977> +proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Kansas South <26978> +proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Kentucky North (deprecated) <26979> +proj=lcc +lat_1=37.96666666666667 +lat_2=37.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Kentucky South <26980> +proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Louisiana North <26981> +proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Louisiana South <26982> +proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Maine East <26983> +proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Maine West <26984> +proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Maryland <26985> +proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Massachusetts Mainland <26986> +proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Massachusetts Island <26987> +proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Michigan North <26988> +proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Michigan Central <26989> +proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Michigan South <26990> +proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Minnesota North <26991> +proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Minnesota Central <26992> +proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Minnesota South <26993> +proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Mississippi East <26994> +proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Mississippi West <26995> +proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Missouri East <26996> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Missouri Central <26997> +proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Missouri West <26998> +proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # Nahrwan 1967 / UTM zone 37N <27037> +proj=utm +zone=37 +ellps=clrk80 +units=m +no_defs <> # Nahrwan 1967 / UTM zone 38N <27038> +proj=utm +zone=38 +ellps=clrk80 +units=m +no_defs <> # Nahrwan 1967 / UTM zone 39N <27039> +proj=utm +zone=39 +ellps=clrk80 +units=m +no_defs <> # Nahrwan 1967 / UTM zone 40N <27040> +proj=utm +zone=40 +ellps=clrk80 +units=m +no_defs <> # Naparima 1972 / UTM zone 20N <27120> +proj=utm +zone=20 +ellps=intl +units=m +no_defs <> # NZGD49 / New Zealand Map Grid <27200> +proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Mount Eden Circuit <27205> +proj=tmerc +lat_0=-36.87986527777778 +lon_0=174.7643393611111 +k=0.9999 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Bay of Plenty Circuit <27206> +proj=tmerc +lat_0=-37.76124980555556 +lon_0=176.46619725 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Poverty Bay Circuit <27207> +proj=tmerc +lat_0=-38.62470277777778 +lon_0=177.8856362777778 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Hawkes Bay Circuit <27208> +proj=tmerc +lat_0=-39.65092930555556 +lon_0=176.6736805277778 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Taranaki Circuit <27209> +proj=tmerc +lat_0=-39.13575830555556 +lon_0=174.22801175 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Tuhirangi Circuit <27210> +proj=tmerc +lat_0=-39.51247038888889 +lon_0=175.6400368055556 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Wanganui Circuit <27211> +proj=tmerc +lat_0=-40.24194713888889 +lon_0=175.4880996111111 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Wairarapa Circuit <27212> +proj=tmerc +lat_0=-40.92553263888889 +lon_0=175.6473496666667 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Wellington Circuit <27213> +proj=tmerc +lat_0=-41.30131963888888 +lon_0=174.7766231111111 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Collingwood Circuit <27214> +proj=tmerc +lat_0=-40.71475905555556 +lon_0=172.6720465 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Nelson Circuit <27215> +proj=tmerc +lat_0=-41.27454472222222 +lon_0=173.2993168055555 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Karamea Circuit <27216> +proj=tmerc +lat_0=-41.28991152777778 +lon_0=172.1090281944444 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Buller Circuit <27217> +proj=tmerc +lat_0=-41.81080286111111 +lon_0=171.5812600555556 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Grey Circuit <27218> +proj=tmerc +lat_0=-42.33369427777778 +lon_0=171.5497713055556 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Amuri Circuit <27219> +proj=tmerc +lat_0=-42.68911658333333 +lon_0=173.0101333888889 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Marlborough Circuit <27220> +proj=tmerc +lat_0=-41.54448666666666 +lon_0=173.8020741111111 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Hokitika Circuit <27221> +proj=tmerc +lat_0=-42.88632236111111 +lon_0=170.9799935 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Okarito Circuit <27222> +proj=tmerc +lat_0=-43.11012813888889 +lon_0=170.2609258333333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Jacksons Bay Circuit <27223> +proj=tmerc +lat_0=-43.97780288888889 +lon_0=168.606267 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Mount Pleasant Circuit <27224> +proj=tmerc +lat_0=-43.59063758333333 +lon_0=172.7271935833333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Gawler Circuit <27225> +proj=tmerc +lat_0=-43.74871155555556 +lon_0=171.3607484722222 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Timaru Circuit <27226> +proj=tmerc +lat_0=-44.40222036111111 +lon_0=171.0572508333333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Lindis Peak Circuit <27227> +proj=tmerc +lat_0=-44.73526797222222 +lon_0=169.4677550833333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Mount Nicholas Circuit <27228> +proj=tmerc +lat_0=-45.13290258333333 +lon_0=168.3986411944444 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Mount York Circuit <27229> +proj=tmerc +lat_0=-45.56372616666666 +lon_0=167.7388617777778 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Observation Point Circuit <27230> +proj=tmerc +lat_0=-45.81619661111111 +lon_0=170.6285951666667 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / North Taieri Circuit <27231> +proj=tmerc +lat_0=-45.86151336111111 +lon_0=170.2825891111111 +k=0.99996 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / Bluff Circuit <27232> +proj=tmerc +lat_0=-46.60000961111111 +lon_0=168.342872 +k=1 +x_0=300002.66 +y_0=699999.58 +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / UTM zone 58S <27258> +proj=utm +zone=58 +south +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / UTM zone 59S <27259> +proj=utm +zone=59 +south +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / UTM zone 60S <27260> +proj=utm +zone=60 +south +ellps=intl +datum=nzgd49 +units=m +no_defs <> # NZGD49 / North Island Grid <27291> +proj=tmerc +lat_0=-39 +lon_0=175.5 +k=1 +x_0=274319.5243848086 +y_0=365759.3658464114 +ellps=intl +datum=nzgd49 +to_meter=0.9143984146160287 +no_defs <> # NZGD49 / South Island Grid <27292> +proj=tmerc +lat_0=-44 +lon_0=171.5 +k=1 +x_0=457199.2073080143 +y_0=457199.2073080143 +ellps=intl +datum=nzgd49 +to_meter=0.9143984146160287 +no_defs <> # NGO 1948 (Oslo) / NGO zone I <27391> +proj=tmerc +lat_0=58 +lon_0=-4.666666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone II <27392> +proj=tmerc +lat_0=58 +lon_0=-2.333333333333333 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone III <27393> +proj=tmerc +lat_0=58 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone IV <27394> +proj=tmerc +lat_0=58 +lon_0=2.5 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone V <27395> +proj=tmerc +lat_0=58 +lon_0=6.166666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone VI <27396> +proj=tmerc +lat_0=58 +lon_0=10.16666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone VII <27397> +proj=tmerc +lat_0=58 +lon_0=14.16666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # NGO 1948 (Oslo) / NGO zone VIII <27398> +proj=tmerc +lat_0=58 +lon_0=18.33333333333333 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <> # Datum 73 / UTM zone 29N <27429> +proj=utm +zone=29 +ellps=intl +units=m +no_defs <> # Datum 73 / Modified Portuguese Grid (deprecated) <27492> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m +no_defs <> # Datum 73 / Modified Portuguese Grid <27493> +proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m +no_defs <> # unnamed <27500> +proj=lcc +lat_1=49.5 +lat_0=49.5 +lon_0=5.4 +k_0=0.99950908 +x_0=500000 +y_0=300000 +a=6376523 +b=6355862.933255573 +pm=2.3372291666985 +units=m +no_defs <> # NTF (Paris) / Lambert Nord France <27561> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert Centre France <27562> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert Sud France <27563> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert Corse <27564> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert zone I <27571> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert zone II <27572> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert zone III <27573> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Lambert zone IV <27574> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / France I (deprecated) <27581> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / France II (deprecated) <27582> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / France III (deprecated) <27583> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / France IV (deprecated) <27584> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Nord France (deprecated) <27591> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Centre France (deprecated) <27592> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Sud France (deprecated) <27593> +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # NTF (Paris) / Corse (deprecated) <27594> +proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs <> # OSGB 1936 / British National Grid <27700> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs <> # Palestine 1923 / Palestine Grid <28191> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs <> # Palestine 1923 / Palestine Belt <28192> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs <> # Palestine 1923 / Israeli CS Grid <28193> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs <> # Pointe Noire / UTM zone 32S <28232> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m +no_defs <> # GDA94 / MGA zone 48 <28348> +proj=utm +zone=48 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 49 <28349> +proj=utm +zone=49 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 50 <28350> +proj=utm +zone=50 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 51 <28351> +proj=utm +zone=51 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 52 <28352> +proj=utm +zone=52 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 53 <28353> +proj=utm +zone=53 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 54 <28354> +proj=utm +zone=54 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 55 <28355> +proj=utm +zone=55 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 56 <28356> +proj=utm +zone=56 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 57 <28357> +proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # GDA94 / MGA zone 58 <28358> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 2 (deprecated) <28402> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 3 (deprecated) <28403> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 4 <28404> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 5 <28405> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 6 <28406> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 7 <28407> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 8 <28408> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 9 <28409> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 10 <28410> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 11 <28411> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 12 <28412> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 13 <28413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 14 <28414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 15 <28415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 16 <28416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 17 <28417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 18 <28418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 19 <28419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 20 <28420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 21 <28421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 22 <28422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 23 <28423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 24 <28424> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 25 <28425> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 26 <28426> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 27 <28427> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 28 <28428> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 29 <28429> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 30 <28430> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 31 <28431> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger zone 32 <28432> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 2N (deprecated) <28462> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 3N (deprecated) <28463> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 4N (deprecated) <28464> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 5N (deprecated) <28465> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 6N (deprecated) <28466> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 7N (deprecated) <28467> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 8N (deprecated) <28468> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 9N (deprecated) <28469> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 10N (deprecated) <28470> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 11N (deprecated) <28471> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 12N (deprecated) <28472> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 13N (deprecated) <28473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 14N (deprecated) <28474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 15N (deprecated) <28475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 16N (deprecated) <28476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 17N (deprecated) <28477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 18N (deprecated) <28478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 19N (deprecated) <28479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 20N (deprecated) <28480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 21N (deprecated) <28481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 22N (deprecated) <28482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 23N (deprecated) <28483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 24N (deprecated) <28484> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 25N (deprecated) <28485> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 26N (deprecated) <28486> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 27N (deprecated) <28487> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 28N (deprecated) <28488> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 29N (deprecated) <28489> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 30N (deprecated) <28490> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 31N (deprecated) <28491> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Pulkovo 1942 / Gauss-Kruger 32N (deprecated) <28492> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m +no_defs <> # Qatar 1974 / Qatar National Grid <28600> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +units=m +no_defs <> # Amersfoort / RD Old <28991> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Amersfoort / RD New <28992> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs <> # SAD69 / Brazil Polyconic (deprecated) <29100> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS67 +units=m +no_defs <> # SAD69 / Brazil Polyconic <29101> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 18N (deprecated) <29118> +proj=utm +zone=18 +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 19N (deprecated) <29119> +proj=utm +zone=19 +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 20N (deprecated) <29120> +proj=utm +zone=20 +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 21N (deprecated) <29121> +proj=utm +zone=21 +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 22N (deprecated) <29122> +proj=utm +zone=22 +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 18N <29168> +proj=utm +zone=18 +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 19N <29169> +proj=utm +zone=19 +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 20N <29170> +proj=utm +zone=20 +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 21N <29171> +proj=utm +zone=21 +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 22N <29172> +proj=utm +zone=22 +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 17S (deprecated) <29177> +proj=utm +zone=17 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 18S (deprecated) <29178> +proj=utm +zone=18 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 19S (deprecated) <29179> +proj=utm +zone=19 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 20S (deprecated) <29180> +proj=utm +zone=20 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 21S (deprecated) <29181> +proj=utm +zone=21 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 22S (deprecated) <29182> +proj=utm +zone=22 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 23S (deprecated) <29183> +proj=utm +zone=23 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 24S (deprecated) <29184> +proj=utm +zone=24 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 25S (deprecated) <29185> +proj=utm +zone=25 +south +ellps=GRS67 +units=m +no_defs <> # SAD69 / UTM zone 17S <29187> +proj=utm +zone=17 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 18S <29188> +proj=utm +zone=18 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 19S <29189> +proj=utm +zone=19 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 20S <29190> +proj=utm +zone=20 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 21S <29191> +proj=utm +zone=21 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 22S <29192> +proj=utm +zone=22 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 23S <29193> +proj=utm +zone=23 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 24S <29194> +proj=utm +zone=24 +south +ellps=aust_SA +units=m +no_defs <> # SAD69 / UTM zone 25S <29195> +proj=utm +zone=25 +south +ellps=aust_SA +units=m +no_defs <> # Sapper Hill 1943 / UTM zone 20S <29220> +proj=utm +zone=20 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs <> # Sapper Hill 1943 / UTM zone 21S <29221> +proj=utm +zone=21 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m +no_defs <> # Schwarzeck / UTM zone 33S <29333> +proj=utm +zone=33 +south +ellps=bess_nam +units=m +no_defs <> # Schwarzeck / Lo22/11 # Unable to translate coordinate system EPSG:29371 into PROJ.4 format. # # Schwarzeck / Lo22/13 # Unable to translate coordinate system EPSG:29373 into PROJ.4 format. # # Schwarzeck / Lo22/15 # Unable to translate coordinate system EPSG:29375 into PROJ.4 format. # # Schwarzeck / Lo22/17 # Unable to translate coordinate system EPSG:29377 into PROJ.4 format. # # Schwarzeck / Lo22/19 # Unable to translate coordinate system EPSG:29379 into PROJ.4 format. # # Schwarzeck / Lo22/21 # Unable to translate coordinate system EPSG:29381 into PROJ.4 format. # # Schwarzeck / Lo22/23 # Unable to translate coordinate system EPSG:29383 into PROJ.4 format. # # Schwarzeck / Lo22/25 # Unable to translate coordinate system EPSG:29385 into PROJ.4 format. # # Sudan / UTM zone 35N (deprecated) <29635> +proj=utm +zone=35 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Sudan / UTM zone 36N (deprecated) <29636> +proj=utm +zone=36 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Tananarive (Paris) / Laborde Grid (deprecated) <29700> +proj=omerc +lat_0=-18.9 +lonc=44.10000000000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m +no_defs <> # Tananarive (Paris) / Laborde Grid # Unable to translate coordinate system EPSG:29701 into PROJ.4 format. # # Tananarive (Paris) / Laborde Grid approximation <29702> +proj=omerc +lat_0=-18.9 +lonc=44.10000000000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m +no_defs <> # Tananarive / UTM zone 38S <29738> +proj=utm +zone=38 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs <> # Tananarive / UTM zone 39S <29739> +proj=utm +zone=39 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m +no_defs <> # Timbalai 1948 / UTM zone 49N <29849> +proj=utm +zone=49 +ellps=evrstSS +units=m +no_defs <> # Timbalai 1948 / UTM zone 50N <29850> +proj=utm +zone=50 +ellps=evrstSS +units=m +no_defs <> # Timbalai 1948 / RSO Borneo (ch) <29871> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8714630401 +y_0=442857.653094361 +ellps=evrstSS +to_meter=20.11676512155263 +no_defs <> # Timbalai 1948 / RSO Borneo (ft) <29872> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8727431979 +y_0=442857.6545573985 +ellps=evrstSS +to_meter=0.3047994715386762 +no_defs <> # Timbalai 1948 / RSO Borneo (m) <29873> +proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.87 +y_0=442857.65 +ellps=evrstSS +units=m +no_defs <> # TM65 / Irish National Grid (deprecated) <29900> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +datum=ire65 +units=m +no_defs <> # OSNI 1952 / Irish National Grid <29901> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1 +x_0=200000 +y_0=250000 +ellps=airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m +no_defs <> # TM65 / Irish Grid <29902> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +datum=ire65 +units=m +no_defs <> # TM75 / Irish Grid <29903> +proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS I <30161> +proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS II <30162> +proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS III <30163> +proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS IV <30164> +proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS V <30165> +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS VI <30166> +proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS VII <30167> +proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS VIII <30168> +proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS IX <30169> +proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS X <30170> +proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XI <30171> +proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XII <30172> +proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XIII <30173> +proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XIV <30174> +proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XV <30175> +proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XVI <30176> +proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XVII <30177> +proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XVIII <30178> +proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Tokyo / Japan Plane Rectangular CS XIX <30179> +proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs <> # Trinidad 1903 / Trinidad Grid <30200> +proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392051999 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.201166195164 +no_defs <> # TC(1948) / UTM zone 39N <30339> +proj=utm +zone=39 +ellps=helmert +units=m +no_defs <> # TC(1948) / UTM zone 40N <30340> +proj=utm +zone=40 +ellps=helmert +units=m +no_defs <> # Voirol 1875 / Nord Algerie (ancienne) <30491> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs <> # Voirol 1875 / Sud Algerie (ancienne) <30492> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m +no_defs <> # Voirol 1879 / Nord Algerie (ancienne) <30493> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Voirol 1879 / Sud Algerie (ancienne) <30494> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Nord Sahara 1959 / UTM zone 29N <30729> +proj=utm +zone=29 +ellps=clrk80 +units=m +no_defs <> # Nord Sahara 1959 / UTM zone 30N <30730> +proj=utm +zone=30 +ellps=clrk80 +units=m +no_defs <> # Nord Sahara 1959 / UTM zone 31N <30731> +proj=utm +zone=31 +ellps=clrk80 +units=m +no_defs <> # Nord Sahara 1959 / UTM zone 32N <30732> +proj=utm +zone=32 +ellps=clrk80 +units=m +no_defs <> # Nord Sahara 1959 / Voirol Unifie Nord <30791> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> # Nord Sahara 1959 / Voirol Unifie Sud <30792> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m +no_defs <> # RT38 2.5 gon W (deprecated) <30800> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs <> # Yoff / UTM zone 28N <31028> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +units=m +no_defs <> # Zanderij / UTM zone 21N <31121> +proj=utm +zone=21 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> # Zanderij / TM 54 NW <31154> +proj=tmerc +lat_0=0 +lon_0=-54 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> # Zanderij / Suriname Old TM <31170> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> # Zanderij / Suriname TM <31171> +proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.9999 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m +no_defs <> # MGI (Ferro) / Austria GK West Zone <31251> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria GK Central Zone <31252> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria GK East Zone <31253> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI / Austria GK West <31254> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria GK Central <31255> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria GK East <31256> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria GK M28 <31257> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria GK M31 <31258> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria GK M34 <31259> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=-5000000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / 3-degree Gauss zone 5 (deprecated) <31265> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / 3-degree Gauss zone 6 (deprecated) <31266> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / 3-degree Gauss zone 7 (deprecated) <31267> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / 3-degree Gauss zone 8 (deprecated) <31268> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Balkans zone 5 (deprecated) <31275> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=5500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Balkans zone 6 (deprecated) <31276> +proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=6500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Balkans zone 7 (deprecated) <31277> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Balkans zone 8 (deprecated) <31278> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Balkans zone 8 (deprecated) <31279> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=8500000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI (Ferro) / Austria West Zone <31281> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria Central Zone <31282> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria East Zone <31283> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI / Austria M28 <31284> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria M31 <31285> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria M34 <31286> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria Lambert <31287> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI (Ferro) / M28 <31288> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / M31 <31289> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / M34 <31290> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria West Zone (deprecated) <31291> +proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria Central Zone (deprecated) <31292> +proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI (Ferro) / Austria East Zone (deprecated) <31293> +proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m +no_defs <> # MGI / M28 (deprecated) <31294> +proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / M31 (deprecated) <31295> +proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / M34 (deprecated) <31296> +proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # MGI / Austria Lambert (deprecated) <31297> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +datum=hermannskogel +units=m +no_defs <> # Belge 1972 / Belge Lambert 72 <31300> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1 +units=m +no_defs <> # Belge 1972 / Belgian Lambert 72 <31370> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1 +units=m +no_defs <> # DHDN / 3-degree Gauss zone 1 (deprecated) <31461> +proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss zone 2 (deprecated) <31462> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss zone 3 (deprecated) <31463> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss zone 4 (deprecated) <31464> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss zone 5 (deprecated) <31465> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss-Kruger zone 2 <31466> +proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss-Kruger zone 3 <31467> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss-Kruger zone 4 <31468> +proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # DHDN / 3-degree Gauss-Kruger zone 5 <31469> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs <> # Conakry 1905 / UTM zone 28N <31528> +proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> # Conakry 1905 / UTM zone 29N <31529> +proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m +no_defs <> # Dealul Piscului 1930 / Stereo 33 <31600> +proj=sterea +lat_0=45.9 +lon_0=25.39246588888889 +k=0.9996667 +x_0=500000 +y_0=500000 +ellps=intl +units=m +no_defs <> # Dealul Piscului 1970/ Stereo 70 (deprecated) <31700> +proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 +y_0=500000 +ellps=krass +units=m +no_defs <> # NGN / UTM zone 38N <31838> +proj=utm +zone=38 +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +units=m +no_defs <> # NGN / UTM zone 39N <31839> +proj=utm +zone=39 +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +units=m +no_defs <> # KUDAMS / KTM (deprecated) <31900> +proj=tmerc +lat_0=0 +lon_0=48 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # KUDAMS / KTM <31901> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 11N <31965> +proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 12N <31966> +proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 13N <31967> +proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 14N <31968> +proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 15N <31969> +proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 16N <31970> +proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 17N <31971> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 18N <31972> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 19N <31973> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 20N <31974> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 21N <31975> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 22N <31976> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 17S <31977> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 18S <31978> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 19S <31979> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 20S <31980> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 21S <31981> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 22S <31982> +proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 23S <31983> +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 24S <31984> +proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 2000 / UTM zone 25S <31985> +proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 17N <31986> +proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 18N <31987> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 19N <31988> +proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 20N <31989> +proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 21N <31990> +proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 22N <31991> +proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 17S <31992> +proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 18S <31993> +proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 19S <31994> +proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 20S <31995> +proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 21S <31996> +proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 22S <31997> +proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 23S <31998> +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 24S <31999> +proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # SIRGAS 1995 / UTM zone 25S <32000> +proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs <> # NAD27 / Montana North <32001> +proj=lcc +lat_1=48.71666666666667 +lat_2=47.85 +lat_0=47 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Montana Central <32002> +proj=lcc +lat_1=47.88333333333333 +lat_2=46.45 +lat_0=45.83333333333334 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Montana South <32003> +proj=lcc +lat_1=46.4 +lat_2=44.86666666666667 +lat_0=44 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Nebraska North <32005> +proj=lcc +lat_1=41.85 +lat_2=42.81666666666667 +lat_0=41.33333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Nebraska South <32006> +proj=lcc +lat_1=40.28333333333333 +lat_2=41.71666666666667 +lat_0=39.66666666666666 +lon_0=-99.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Nevada East <32007> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Nevada Central <32008> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Nevada West <32009> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New Hampshire <32010> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New Jersey <32011> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.66666666666667 +k=0.9999749999999999 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New Mexico East <32012> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New Mexico Central <32013> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New Mexico West <32014> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New York East <32015> +proj=tmerc +lat_0=40 +lon_0=-74.33333333333333 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New York Central <32016> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New York West <32017> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / New York Long Island <32018> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.5 +lon_0=-74 +x_0=304800.6096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / North Carolina <32019> +proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / North Dakota North <32020> +proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / North Dakota South <32021> +proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Ohio North <32022> +proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Ohio South <32023> +proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Oklahoma North <32024> +proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Oklahoma South <32025> +proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Oregon North <32026> +proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Oregon South <32027> +proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Pennsylvania North <32028> +proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Pennsylvania South <32029> +proj=lcc +lat_1=39.93333333333333 +lat_2=40.8 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Rhode Island <32030> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.9999938 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / South Carolina North <32031> +proj=lcc +lat_1=33.76666666666667 +lat_2=34.96666666666667 +lat_0=33 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / South Carolina South <32033> +proj=lcc +lat_1=32.33333333333334 +lat_2=33.66666666666666 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / South Dakota North <32034> +proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / South Dakota South <32035> +proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Tennessee (deprecated) <32036> +proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=30480.06096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Texas North <32037> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Texas North Central <32038> +proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-97.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Texas Central <32039> +proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Texas South Central <32040> +proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Texas South <32041> +proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Utah North <32042> +proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Utah Central <32043> +proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Utah South <32044> +proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Vermont <32045> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Virginia North <32046> +proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Virginia South <32047> +proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Washington North <32048> +proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Washington South <32049> +proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / West Virginia North <32050> +proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / West Virginia South <32051> +proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wisconsin North <32052> +proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wisconsin Central <32053> +proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wisconsin South <32054> +proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wyoming East <32055> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-105.1666666666667 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wyoming East Central <32056> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-107.3333333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wyoming West Central <32057> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-108.75 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Wyoming West <32058> +proj=tmerc +lat_0=40.66666666666666 +lon_0=-110.0833333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / Guatemala Norte <32061> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Guatemala Sur <32062> +proj=lcc +lat_1=14.9 +lat_0=14.9 +lon_0=-90.33333333333333 +k_0=0.99989906 +x_0=500000 +y_0=325992.681 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / BLM 14N (ftUS) <32064> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 15N (ftUS) <32065> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 16N (ftUS) <32066> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 17N (ftUS) <32067> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 14N (feet) (deprecated) <32074> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 15N (feet) (deprecated) <32075> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 16N (feet) (deprecated) <32076> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / BLM 17N (feet) (deprecated) <32077> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD27 / MTM zone 1 <32081> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / MTM zone 2 <32082> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / MTM zone 3 <32083> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / MTM zone 4 <32084> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / MTM zone 5 <32085> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / MTM zone 6 <32086> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Quebec Lambert <32098> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m +no_defs <> # NAD27 / Louisiana Offshore <32099> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=us-ft +no_defs <> # NAD83 / Montana <32100> +proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Nebraska <32104> +proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Nevada East <32107> +proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Nevada Central <32108> +proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Nevada West <32109> +proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New Hampshire <32110> +proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New Jersey <32111> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New Mexico East <32112> +proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New Mexico Central <32113> +proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New Mexico West <32114> +proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New York East <32115> +proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New York Central <32116> +proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New York West <32117> +proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / New York Long Island <32118> +proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / North Carolina <32119> +proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / North Dakota North <32120> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / North Dakota South <32121> +proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Ohio North <32122> +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Ohio South <32123> +proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Oklahoma North <32124> +proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Oklahoma South <32125> +proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Oregon North <32126> +proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Oregon South <32127> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Pennsylvania North <32128> +proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Pennsylvania South <32129> +proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Rhode Island <32130> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / South Carolina <32133> +proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / South Dakota North <32134> +proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / South Dakota South <32135> +proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Tennessee <32136> +proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas North <32137> +proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas North Central <32138> +proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas Central <32139> +proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas South Central <32140> +proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Texas South <32141> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Utah North <32142> +proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Utah Central <32143> +proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Utah South <32144> +proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Vermont <32145> +proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Virginia North <32146> +proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Virginia South <32147> +proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Washington North <32148> +proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Washington South <32149> +proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / West Virginia North <32150> +proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / West Virginia South <32151> +proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wisconsin North <32152> +proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wisconsin Central <32153> +proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wisconsin South <32154> +proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wyoming East <32155> +proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wyoming East Central <32156> +proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wyoming West Central <32157> +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Wyoming West <32158> +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Puerto Rico & Virgin Is. <32161> +proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / BLM 14N (ftUS) <32164> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / BLM 15N (ftUS) <32165> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / BLM 16N (ftUS) <32166> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / BLM 17N (ftUS) <32167> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs <> # NAD83 / SCoPQ zone 2 <32180> +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 1 <32181> +proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 2 <32182> +proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 3 <32183> +proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 4 <32184> +proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 5 <32185> +proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 6 <32186> +proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 7 <32187> +proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 8 <32188> +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 9 <32189> +proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 10 <32190> +proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 11 <32191> +proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 12 <32192> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 13 <32193> +proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 14 <32194> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 15 <32195> +proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 16 <32196> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / MTM zone 17 <32197> +proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Quebec Lambert <32198> +proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # NAD83 / Louisiana Offshore <32199> +proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs <> # WGS 72 / UTM zone 1N <32201> +proj=utm +zone=1 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 2N <32202> +proj=utm +zone=2 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 3N <32203> +proj=utm +zone=3 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 4N <32204> +proj=utm +zone=4 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 5N <32205> +proj=utm +zone=5 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 6N <32206> +proj=utm +zone=6 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 7N <32207> +proj=utm +zone=7 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 8N <32208> +proj=utm +zone=8 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 9N <32209> +proj=utm +zone=9 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 10N <32210> +proj=utm +zone=10 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 11N <32211> +proj=utm +zone=11 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 12N <32212> +proj=utm +zone=12 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 13N <32213> +proj=utm +zone=13 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 14N <32214> +proj=utm +zone=14 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 15N <32215> +proj=utm +zone=15 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 16N <32216> +proj=utm +zone=16 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 17N <32217> +proj=utm +zone=17 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 18N <32218> +proj=utm +zone=18 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 19N <32219> +proj=utm +zone=19 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 20N <32220> +proj=utm +zone=20 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 21N <32221> +proj=utm +zone=21 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 22N <32222> +proj=utm +zone=22 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 23N <32223> +proj=utm +zone=23 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 24N <32224> +proj=utm +zone=24 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 25N <32225> +proj=utm +zone=25 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 26N <32226> +proj=utm +zone=26 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 27N <32227> +proj=utm +zone=27 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 28N <32228> +proj=utm +zone=28 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 29N <32229> +proj=utm +zone=29 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 30N <32230> +proj=utm +zone=30 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 31N <32231> +proj=utm +zone=31 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 32N <32232> +proj=utm +zone=32 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 33N <32233> +proj=utm +zone=33 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 34N <32234> +proj=utm +zone=34 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 35N <32235> +proj=utm +zone=35 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 36N <32236> +proj=utm +zone=36 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 37N <32237> +proj=utm +zone=37 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 38N <32238> +proj=utm +zone=38 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 39N <32239> +proj=utm +zone=39 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 40N <32240> +proj=utm +zone=40 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 41N <32241> +proj=utm +zone=41 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 42N <32242> +proj=utm +zone=42 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 43N <32243> +proj=utm +zone=43 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 44N <32244> +proj=utm +zone=44 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 45N <32245> +proj=utm +zone=45 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 46N <32246> +proj=utm +zone=46 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 47N <32247> +proj=utm +zone=47 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 48N <32248> +proj=utm +zone=48 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 49N <32249> +proj=utm +zone=49 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 50N <32250> +proj=utm +zone=50 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 51N <32251> +proj=utm +zone=51 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 52N <32252> +proj=utm +zone=52 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 53N <32253> +proj=utm +zone=53 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 54N <32254> +proj=utm +zone=54 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 55N <32255> +proj=utm +zone=55 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 56N <32256> +proj=utm +zone=56 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 57N <32257> +proj=utm +zone=57 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 58N <32258> +proj=utm +zone=58 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 59N <32259> +proj=utm +zone=59 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 60N <32260> +proj=utm +zone=60 +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 1S <32301> +proj=utm +zone=1 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 2S <32302> +proj=utm +zone=2 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 3S <32303> +proj=utm +zone=3 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 4S <32304> +proj=utm +zone=4 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 5S <32305> +proj=utm +zone=5 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 6S <32306> +proj=utm +zone=6 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 7S <32307> +proj=utm +zone=7 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 8S <32308> +proj=utm +zone=8 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 9S <32309> +proj=utm +zone=9 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 10S <32310> +proj=utm +zone=10 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 11S <32311> +proj=utm +zone=11 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 12S <32312> +proj=utm +zone=12 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 13S <32313> +proj=utm +zone=13 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 14S <32314> +proj=utm +zone=14 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 15S <32315> +proj=utm +zone=15 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 16S <32316> +proj=utm +zone=16 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 17S <32317> +proj=utm +zone=17 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 18S <32318> +proj=utm +zone=18 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 19S <32319> +proj=utm +zone=19 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 20S <32320> +proj=utm +zone=20 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 21S <32321> +proj=utm +zone=21 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 22S <32322> +proj=utm +zone=22 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 23S <32323> +proj=utm +zone=23 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 24S <32324> +proj=utm +zone=24 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 25S <32325> +proj=utm +zone=25 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 26S <32326> +proj=utm +zone=26 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 27S <32327> +proj=utm +zone=27 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 28S <32328> +proj=utm +zone=28 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 29S <32329> +proj=utm +zone=29 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 30S <32330> +proj=utm +zone=30 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 31S <32331> +proj=utm +zone=31 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 32S <32332> +proj=utm +zone=32 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 33S <32333> +proj=utm +zone=33 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 34S <32334> +proj=utm +zone=34 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 35S <32335> +proj=utm +zone=35 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 36S <32336> +proj=utm +zone=36 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 37S <32337> +proj=utm +zone=37 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 38S <32338> +proj=utm +zone=38 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 39S <32339> +proj=utm +zone=39 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 40S <32340> +proj=utm +zone=40 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 41S <32341> +proj=utm +zone=41 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 42S <32342> +proj=utm +zone=42 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 43S <32343> +proj=utm +zone=43 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 44S <32344> +proj=utm +zone=44 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 45S <32345> +proj=utm +zone=45 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 46S <32346> +proj=utm +zone=46 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 47S <32347> +proj=utm +zone=47 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 48S <32348> +proj=utm +zone=48 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 49S <32349> +proj=utm +zone=49 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 50S <32350> +proj=utm +zone=50 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 51S <32351> +proj=utm +zone=51 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 52S <32352> +proj=utm +zone=52 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 53S <32353> +proj=utm +zone=53 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 54S <32354> +proj=utm +zone=54 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 55S <32355> +proj=utm +zone=55 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 56S <32356> +proj=utm +zone=56 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 57S <32357> +proj=utm +zone=57 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 58S <32358> +proj=utm +zone=58 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 59S <32359> +proj=utm +zone=59 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72 / UTM zone 60S <32360> +proj=utm +zone=60 +south +ellps=WGS72 +units=m +no_defs <> # WGS 72BE / UTM zone 1N <32401> +proj=utm +zone=1 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 2N <32402> +proj=utm +zone=2 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 3N <32403> +proj=utm +zone=3 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 4N <32404> +proj=utm +zone=4 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 5N <32405> +proj=utm +zone=5 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 6N <32406> +proj=utm +zone=6 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 7N <32407> +proj=utm +zone=7 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 8N <32408> +proj=utm +zone=8 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 9N <32409> +proj=utm +zone=9 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 10N <32410> +proj=utm +zone=10 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 11N <32411> +proj=utm +zone=11 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 12N <32412> +proj=utm +zone=12 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 13N <32413> +proj=utm +zone=13 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 14N <32414> +proj=utm +zone=14 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 15N <32415> +proj=utm +zone=15 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 16N <32416> +proj=utm +zone=16 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 17N <32417> +proj=utm +zone=17 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 18N <32418> +proj=utm +zone=18 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 19N <32419> +proj=utm +zone=19 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 20N <32420> +proj=utm +zone=20 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 21N <32421> +proj=utm +zone=21 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 22N <32422> +proj=utm +zone=22 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 23N <32423> +proj=utm +zone=23 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 24N <32424> +proj=utm +zone=24 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 25N <32425> +proj=utm +zone=25 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 26N <32426> +proj=utm +zone=26 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 27N <32427> +proj=utm +zone=27 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 28N <32428> +proj=utm +zone=28 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 29N <32429> +proj=utm +zone=29 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 30N <32430> +proj=utm +zone=30 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 31N <32431> +proj=utm +zone=31 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 32N <32432> +proj=utm +zone=32 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 33N <32433> +proj=utm +zone=33 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 34N <32434> +proj=utm +zone=34 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 35N <32435> +proj=utm +zone=35 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 36N <32436> +proj=utm +zone=36 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 37N <32437> +proj=utm +zone=37 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 38N <32438> +proj=utm +zone=38 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 39N <32439> +proj=utm +zone=39 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 40N <32440> +proj=utm +zone=40 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 41N <32441> +proj=utm +zone=41 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 42N <32442> +proj=utm +zone=42 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 43N <32443> +proj=utm +zone=43 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 44N <32444> +proj=utm +zone=44 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 45N <32445> +proj=utm +zone=45 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 46N <32446> +proj=utm +zone=46 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 47N <32447> +proj=utm +zone=47 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 48N <32448> +proj=utm +zone=48 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 49N <32449> +proj=utm +zone=49 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 50N <32450> +proj=utm +zone=50 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 51N <32451> +proj=utm +zone=51 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 52N <32452> +proj=utm +zone=52 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 53N <32453> +proj=utm +zone=53 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 54N <32454> +proj=utm +zone=54 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 55N <32455> +proj=utm +zone=55 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 56N <32456> +proj=utm +zone=56 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 57N <32457> +proj=utm +zone=57 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 58N <32458> +proj=utm +zone=58 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 59N <32459> +proj=utm +zone=59 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 60N <32460> +proj=utm +zone=60 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 1S <32501> +proj=utm +zone=1 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 2S <32502> +proj=utm +zone=2 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 3S <32503> +proj=utm +zone=3 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 4S <32504> +proj=utm +zone=4 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 5S <32505> +proj=utm +zone=5 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 6S <32506> +proj=utm +zone=6 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 7S <32507> +proj=utm +zone=7 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 8S <32508> +proj=utm +zone=8 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 9S <32509> +proj=utm +zone=9 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 10S <32510> +proj=utm +zone=10 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 11S <32511> +proj=utm +zone=11 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 12S <32512> +proj=utm +zone=12 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 13S <32513> +proj=utm +zone=13 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 14S <32514> +proj=utm +zone=14 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 15S <32515> +proj=utm +zone=15 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 16S <32516> +proj=utm +zone=16 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 17S <32517> +proj=utm +zone=17 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 18S <32518> +proj=utm +zone=18 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 19S <32519> +proj=utm +zone=19 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 20S <32520> +proj=utm +zone=20 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 21S <32521> +proj=utm +zone=21 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 22S <32522> +proj=utm +zone=22 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 23S <32523> +proj=utm +zone=23 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 24S <32524> +proj=utm +zone=24 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 25S <32525> +proj=utm +zone=25 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 26S <32526> +proj=utm +zone=26 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 27S <32527> +proj=utm +zone=27 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 28S <32528> +proj=utm +zone=28 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 29S <32529> +proj=utm +zone=29 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 30S <32530> +proj=utm +zone=30 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 31S <32531> +proj=utm +zone=31 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 32S <32532> +proj=utm +zone=32 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 33S <32533> +proj=utm +zone=33 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 34S <32534> +proj=utm +zone=34 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 35S <32535> +proj=utm +zone=35 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 36S <32536> +proj=utm +zone=36 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 37S <32537> +proj=utm +zone=37 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 38S <32538> +proj=utm +zone=38 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 39S <32539> +proj=utm +zone=39 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 40S <32540> +proj=utm +zone=40 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 41S <32541> +proj=utm +zone=41 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 42S <32542> +proj=utm +zone=42 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 43S <32543> +proj=utm +zone=43 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 44S <32544> +proj=utm +zone=44 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 45S <32545> +proj=utm +zone=45 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 46S <32546> +proj=utm +zone=46 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 47S <32547> +proj=utm +zone=47 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 48S <32548> +proj=utm +zone=48 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 49S <32549> +proj=utm +zone=49 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 50S <32550> +proj=utm +zone=50 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 51S <32551> +proj=utm +zone=51 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 52S <32552> +proj=utm +zone=52 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 53S <32553> +proj=utm +zone=53 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 54S <32554> +proj=utm +zone=54 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 55S <32555> +proj=utm +zone=55 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 56S <32556> +proj=utm +zone=56 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 57S <32557> +proj=utm +zone=57 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 58S <32558> +proj=utm +zone=58 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 59S <32559> +proj=utm +zone=59 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 72BE / UTM zone 60S <32560> +proj=utm +zone=60 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m +no_defs <> # WGS 84 / UTM grid system (northern hemisphere) # Unable to translate coordinate system EPSG:32600 into PROJ.4 format. # # WGS 84 / UTM zone 1N <32601> +proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 2N <32602> +proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 3N <32603> +proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 4N <32604> +proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 5N <32605> +proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 6N <32606> +proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 7N <32607> +proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 8N <32608> +proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 9N <32609> +proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 10N <32610> +proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 11N <32611> +proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 12N <32612> +proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 13N <32613> +proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 14N <32614> +proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 15N <32615> +proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 16N <32616> +proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 17N <32617> +proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 18N <32618> +proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 19N <32619> +proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 20N <32620> +proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 21N <32621> +proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 22N <32622> +proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 23N <32623> +proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 24N <32624> +proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 25N <32625> +proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 26N <32626> +proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 27N <32627> +proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 28N <32628> +proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 29N <32629> +proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 30N <32630> +proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 31N <32631> +proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 32N <32632> +proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 33N <32633> +proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 34N <32634> +proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 35N <32635> +proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 36N <32636> +proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 37N <32637> +proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 38N <32638> +proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 39N <32639> +proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 40N <32640> +proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 41N <32641> +proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 42N <32642> +proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 43N <32643> +proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 44N <32644> +proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 45N <32645> +proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 46N <32646> +proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 47N <32647> +proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 48N <32648> +proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 49N <32649> +proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 50N <32650> +proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 51N <32651> +proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 52N <32652> +proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 53N <32653> +proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 54N <32654> +proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 55N <32655> +proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 56N <32656> +proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 57N <32657> +proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 58N <32658> +proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 59N <32659> +proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 60N <32660> +proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UPS North <32661> +proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / Plate Carree (deprecated) <32662> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / World Equidistant Cylindrical (deprecated) # Unable to translate coordinate system EPSG:32663 into PROJ.4 format. # # WGS 84 / BLM 14N (ftUS) <32664> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=us-ft +no_defs <> # WGS 84 / BLM 15N (ftUS) <32665> +proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=us-ft +no_defs <> # WGS 84 / BLM 16N (ftUS) <32666> +proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=us-ft +no_defs <> # WGS 84 / BLM 17N (ftUS) <32667> +proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=us-ft +no_defs <> # WGS 84 / UTM grid system (southern hemisphere) # Unable to translate coordinate system EPSG:32700 into PROJ.4 format. # # WGS 84 / UTM zone 1S <32701> +proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 2S <32702> +proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 3S <32703> +proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 4S <32704> +proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 5S <32705> +proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 6S <32706> +proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 7S <32707> +proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 8S <32708> +proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 9S <32709> +proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 10S <32710> +proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 11S <32711> +proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 12S <32712> +proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 13S <32713> +proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 14S <32714> +proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 15S <32715> +proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 16S <32716> +proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 17S <32717> +proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 18S <32718> +proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 19S <32719> +proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 20S <32720> +proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 21S <32721> +proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 22S <32722> +proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 23S <32723> +proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 24S <32724> +proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 25S <32725> +proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 26S <32726> +proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 27S <32727> +proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 28S <32728> +proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 29S <32729> +proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 30S <32730> +proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 31S <32731> +proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 32S <32732> +proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 33S <32733> +proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 34S <32734> +proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 35S <32735> +proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 36S <32736> +proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 37S <32737> +proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 38S <32738> +proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 39S <32739> +proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 40S <32740> +proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 41S <32741> +proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 42S <32742> +proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 43S <32743> +proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 44S <32744> +proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 45S <32745> +proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 46S <32746> +proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 47S <32747> +proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 48S <32748> +proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 49S <32749> +proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 50S <32750> +proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 51S <32751> +proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 52S <32752> +proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 53S <32753> +proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 54S <32754> +proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 55S <32755> +proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 56S <32756> +proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 57S <32757> +proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 58S <32758> +proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 59S <32759> +proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UTM zone 60S <32760> +proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / UPS South <32761> +proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> # WGS 84 / TM 36 SE <32766> +proj=tmerc +lat_0=0 +lon_0=36 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <> therion/extern/proj4/PJ_lcc.c0000664000175000017500000000556211256547730015131 0ustar useruser#define PROJ_PARMS__ \ double phi1; \ double phi2; \ double n; \ double rho0; \ double c; \ int ellips; #define PJ_LIB__ #include PROJ_HEAD(lcc, "Lambert Conformal Conic") "\n\tConic, Sph&Ell\n\tlat_1= and lat_2= or lat_0"; # define EPS10 1.e-10 FORWARD(e_forward); /* ellipsoid & spheroid */ double rho; if (fabs(fabs(lp.phi) - HALFPI) < EPS10) { if ((lp.phi * P->n) <= 0.) F_ERROR; rho = 0.; } else rho = P->c * (P->ellips ? pow(pj_tsfn(lp.phi, sin(lp.phi), P->e), P->n) : pow(tan(FORTPI + .5 * lp.phi), -P->n)); xy.x = P->k0 * (rho * sin( lp.lam *= P->n ) ); xy.y = P->k0 * (P->rho0 - rho * cos(lp.lam) ); return (xy); } INVERSE(e_inverse); /* ellipsoid & spheroid */ double rho; xy.x /= P->k0; xy.y /= P->k0; if( (rho = hypot(xy.x, xy.y = P->rho0 - xy.y)) != 0.0) { if (P->n < 0.) { rho = -rho; xy.x = -xy.x; xy.y = -xy.y; } if (P->ellips) { if ((lp.phi = pj_phi2(pow(rho / P->c, 1./P->n), P->e)) == HUGE_VAL) I_ERROR; } else lp.phi = 2. * atan(pow(P->c / rho, 1./P->n)) - HALFPI; lp.lam = atan2(xy.x, xy.y) / P->n; } else { lp.lam = 0.; lp.phi = P->n > 0. ? HALFPI : - HALFPI; } return (lp); } SPECIAL(fac) { double rho; if (fabs(fabs(lp.phi) - HALFPI) < EPS10) { if ((lp.phi * P->n) <= 0.) return; rho = 0.; } else rho = P->c * (P->ellips ? pow(pj_tsfn(lp.phi, sin(lp.phi), P->e), P->n) : pow(tan(FORTPI + .5 * lp.phi), -P->n)); fac->code |= IS_ANAL_HK + IS_ANAL_CONV; fac->k = fac->h = P->k0 * P->n * rho / pj_msfn(sin(lp.phi), cos(lp.phi), P->es); fac->conv = - P->n * lp.lam; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(lcc) double cosphi, sinphi; int secant; P->phi1 = pj_param(P->params, "rlat_1").f; if (pj_param(P->params, "tlat_2").i) P->phi2 = pj_param(P->params, "rlat_2").f; else { P->phi2 = P->phi1; if (!pj_param(P->params, "tlat_0").i) P->phi0 = P->phi1; } if (fabs(P->phi1 + P->phi2) < EPS10) E_ERROR(-21); P->n = sinphi = sin(P->phi1); cosphi = cos(P->phi1); secant = fabs(P->phi1 - P->phi2) >= EPS10; if( (P->ellips = (P->es != 0.)) ) { double ml1, m1; P->e = sqrt(P->es); m1 = pj_msfn(sinphi, cosphi, P->es); ml1 = pj_tsfn(P->phi1, sinphi, P->e); if (secant) { /* secant cone */ P->n = log(m1 / pj_msfn(sinphi = sin(P->phi2), cos(P->phi2), P->es)); P->n /= log(ml1 / pj_tsfn(P->phi2, sinphi, P->e)); } P->c = (P->rho0 = m1 * pow(ml1, -P->n) / P->n); P->rho0 *= (fabs(fabs(P->phi0) - HALFPI) < EPS10) ? 0. : pow(pj_tsfn(P->phi0, sin(P->phi0), P->e), P->n); } else { if (secant) P->n = log(cosphi / cos(P->phi2)) / log(tan(FORTPI + .5 * P->phi2) / tan(FORTPI + .5 * P->phi1)); P->c = cosphi * pow(tan(FORTPI + .5 * P->phi1), P->n) / P->n; P->rho0 = (fabs(fabs(P->phi0) - HALFPI) < EPS10) ? 0. : P->c * pow(tan(FORTPI + .5 * P->phi0), -P->n); } P->inv = e_inverse; P->fwd = e_forward; P->spc = fac; ENDENTRY(P) therion/extern/proj4/emess.c0000664000175000017500000000260511137333440015073 0ustar useruser/* Error message processing */ #ifdef _MSC_VER # ifndef _CRT_SECURE_NO_DEPRECATE # define _CRT_SECURE_NO_DEPRECATE # endif # ifndef _CRT_NONSTDC_NO_DEPRECATE # define _CRT_NONSTDC_NO_DEPRECATE # endif #endif #include #include #include #include #include #include #define EMESS_ROUTINE #include "emess.h" void emess(int code, char *fmt, ...) { va_list args; va_start(args, fmt); /* prefix program name, if given */ if (fmt != NULL) (void)fprintf(stderr,"%s\n<%s>: ",pj_get_release(), emess_dat.Prog_name); /* print file name and line, if given */ if (emess_dat.File_name != NULL && *emess_dat.File_name) { (void)fprintf(stderr,"while processing file: %s", emess_dat.File_name); if (emess_dat.File_line > 0) (void)fprintf(stderr,", line %d\n", emess_dat.File_line); else (void)fputc('\n', stderr); } else putc('\n', stderr); /* if |code|==2, print errno code data */ if (code == 2 || code == -2) (void)fprintf(stderr, "Sys errno: %d: %s\n", errno, #ifdef HAVE_STRERROR strerror(errno)); #else ""); #endif /* post remainder of call data */ (void)vfprintf(stderr,fmt,args); va_end(args); /* die if code positive */ if (code > 0) { (void)fputs("\nprogram abnormally terminated\n", stderr); exit(code); } else putc('\n', stderr); } therion/extern/proj4/pj_transform.c0000664000175000017500000005510711130502664016467 0ustar useruser/****************************************************************************** * $Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Perform overall coordinate system to coordinate system * transformations (pj_transform() function) including reprojection * and datum shifting. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #include #include "geocent.h" PJ_CVSID("$Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $"); #ifndef SRS_WGS84_SEMIMAJOR #define SRS_WGS84_SEMIMAJOR 6378137.0 #endif #ifndef SRS_WGS84_ESQUARED #define SRS_WGS84_ESQUARED 0.0066943799901413165 #endif #define Dx_BF (defn->datum_params[0]) #define Dy_BF (defn->datum_params[1]) #define Dz_BF (defn->datum_params[2]) #define Rx_BF (defn->datum_params[3]) #define Ry_BF (defn->datum_params[4]) #define Rz_BF (defn->datum_params[5]) #define M_BF (defn->datum_params[6]) /* ** This table is intended to indicate for any given error code in ** the range 0 to -44, whether that error will occur for all locations (ie. ** it is a problem with the coordinate system as a whole) in which case the ** value would be 0, or if the problem is with the point being transformed ** in which case the value is 1. ** ** At some point we might want to move this array in with the error message ** list or something, but while experimenting with it this should be fine. */ static const int transient_error[45] = { /* 0 1 2 3 4 5 6 7 8 9 */ /* 0 to 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 to 19 */ 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, /* 20 to 29 */ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, /* 30 to 39 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, /* 40 to 44 */ 0, 0, 0, 0, 0 }; /************************************************************************/ /* pj_transform() */ /* */ /* Currently this function doesn't recognise if two projections */ /* are identical (to short circuit reprojection) because it is */ /* difficult to compare PJ structures (since there are some */ /* projection specific components). */ /************************************************************************/ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset, double *x, double *y, double *z ) { long i; int need_datum_shift; pj_errno = 0; if( point_offset == 0 ) point_offset = 1; /* -------------------------------------------------------------------- */ /* Transform geocentric source coordinates to lat/long. */ /* -------------------------------------------------------------------- */ if( srcdefn->is_geocent ) { if( z == NULL ) { pj_errno = PJD_ERR_GEOCENTRIC; return PJD_ERR_GEOCENTRIC; } if( srcdefn->to_meter != 1.0 ) { for( i = 0; i < point_count; i++ ) { if( x[point_offset*i] != HUGE_VAL ) { x[point_offset*i] *= srcdefn->to_meter; y[point_offset*i] *= srcdefn->to_meter; } } } if( pj_geocentric_to_geodetic( srcdefn->a_orig, srcdefn->es_orig, point_count, point_offset, x, y, z ) != 0) return pj_errno; } /* -------------------------------------------------------------------- */ /* Transform source points to lat/long, if they aren't */ /* already. */ /* -------------------------------------------------------------------- */ else if( !srcdefn->is_latlong ) { if( srcdefn->inv == NULL ) { pj_errno = -17; /* this isn't correct, we need a no inverse err */ if( getenv( "PROJ_DEBUG" ) != NULL ) { fprintf( stderr, "pj_transform(): source projection not invertable\n" ); } return pj_errno; } for( i = 0; i < point_count; i++ ) { XY projected_loc; LP geodetic_loc; projected_loc.u = x[point_offset*i]; projected_loc.v = y[point_offset*i]; if( projected_loc.u == HUGE_VAL ) continue; geodetic_loc = pj_inv( projected_loc, srcdefn ); if( pj_errno != 0 ) { if( (pj_errno != 33 /*EDOM*/ && pj_errno != 34 /*ERANGE*/ ) && (pj_errno > 0 || pj_errno < -44 || point_count == 1 || transient_error[-pj_errno] == 0 ) ) return pj_errno; else { geodetic_loc.u = HUGE_VAL; geodetic_loc.v = HUGE_VAL; } } x[point_offset*i] = geodetic_loc.u; y[point_offset*i] = geodetic_loc.v; } } /* -------------------------------------------------------------------- */ /* But if they are already lat long, adjust for the prime */ /* meridian if there is one in effect. */ /* -------------------------------------------------------------------- */ if( srcdefn->from_greenwich != 0.0 ) { for( i = 0; i < point_count; i++ ) { if( x[point_offset*i] != HUGE_VAL ) x[point_offset*i] += srcdefn->from_greenwich; } } /* -------------------------------------------------------------------- */ /* Convert datums if needed, and possible. */ /* -------------------------------------------------------------------- */ if( pj_datum_transform( srcdefn, dstdefn, point_count, point_offset, x, y, z ) != 0 ) return pj_errno; /* -------------------------------------------------------------------- */ /* But if they are staying lat long, adjust for the prime */ /* meridian if there is one in effect. */ /* -------------------------------------------------------------------- */ if( dstdefn->from_greenwich != 0.0 ) { for( i = 0; i < point_count; i++ ) { if( x[point_offset*i] != HUGE_VAL ) x[point_offset*i] -= dstdefn->from_greenwich; } } /* -------------------------------------------------------------------- */ /* Transform destination latlong to geocentric if required. */ /* -------------------------------------------------------------------- */ if( dstdefn->is_geocent ) { if( z == NULL ) { pj_errno = PJD_ERR_GEOCENTRIC; return PJD_ERR_GEOCENTRIC; } pj_geodetic_to_geocentric( dstdefn->a_orig, dstdefn->es_orig, point_count, point_offset, x, y, z ); if( dstdefn->fr_meter != 1.0 ) { for( i = 0; i < point_count; i++ ) { if( x[point_offset*i] != HUGE_VAL ) { x[point_offset*i] *= dstdefn->fr_meter; y[point_offset*i] *= dstdefn->fr_meter; } } } } /* -------------------------------------------------------------------- */ /* Transform destination points to projection coordinates, if */ /* desired. */ /* -------------------------------------------------------------------- */ else if( !dstdefn->is_latlong ) { for( i = 0; i < point_count; i++ ) { XY projected_loc; LP geodetic_loc; geodetic_loc.u = x[point_offset*i]; geodetic_loc.v = y[point_offset*i]; if( geodetic_loc.u == HUGE_VAL ) continue; projected_loc = pj_fwd( geodetic_loc, dstdefn ); if( pj_errno != 0 ) { if( (pj_errno != 33 /*EDOM*/ && pj_errno != 34 /*ERANGE*/ ) && (pj_errno > 0 || pj_errno < -44 || point_count == 1 || transient_error[-pj_errno] == 0 ) ) return pj_errno; else { projected_loc.u = HUGE_VAL; projected_loc.v = HUGE_VAL; } } x[point_offset*i] = projected_loc.u; y[point_offset*i] = projected_loc.v; } } /* -------------------------------------------------------------------- */ /* If a wrapping center other than 0 is provided, rewrap around */ /* the suggested center (for latlong coordinate systems only). */ /* -------------------------------------------------------------------- */ else if( dstdefn->is_latlong && dstdefn->long_wrap_center != 0 ) { for( i = 0; i < point_count; i++ ) { if( x[point_offset*i] == HUGE_VAL ) continue; while( x[point_offset*i] < dstdefn->long_wrap_center - HALFPI ) x[point_offset*i] += PI; while( x[point_offset*i] > dstdefn->long_wrap_center + HALFPI ) x[point_offset*i] -= PI; } } return 0; } /************************************************************************/ /* pj_geodetic_to_geocentric() */ /************************************************************************/ int pj_geodetic_to_geocentric( double a, double es, long point_count, int point_offset, double *x, double *y, double *z ) { double b; int i; GeocentricInfo gi; pj_errno = 0; if( es == 0.0 ) b = a; else b = a * sqrt(1-es); if( pj_Set_Geocentric_Parameters( &gi, a, b ) != 0 ) { pj_errno = PJD_ERR_GEOCENTRIC; return pj_errno; } for( i = 0; i < point_count; i++ ) { long io = i * point_offset; if( x[io] == HUGE_VAL ) continue; if( pj_Convert_Geodetic_To_Geocentric( &gi, y[io], x[io], z[io], x+io, y+io, z+io ) != 0 ) { pj_errno = -14; x[io] = y[io] = HUGE_VAL; /* but keep processing points! */ } } return pj_errno; } /************************************************************************/ /* pj_geodetic_to_geocentric() */ /************************************************************************/ int pj_geocentric_to_geodetic( double a, double es, long point_count, int point_offset, double *x, double *y, double *z ) { double b; int i; GeocentricInfo gi; if( es == 0.0 ) b = a; else b = a * sqrt(1-es); if( pj_Set_Geocentric_Parameters( &gi, a, b ) != 0 ) { pj_errno = PJD_ERR_GEOCENTRIC; return pj_errno; } for( i = 0; i < point_count; i++ ) { long io = i * point_offset; if( x[io] == HUGE_VAL ) continue; pj_Convert_Geocentric_To_Geodetic( &gi, x[io], y[io], z[io], y+io, x+io, z+io ); } return 0; } /************************************************************************/ /* pj_compare_datums() */ /* */ /* Returns TRUE if the two datums are identical, otherwise */ /* FALSE. */ /************************************************************************/ int pj_compare_datums( PJ *srcdefn, PJ *dstdefn ) { if( srcdefn->datum_type != dstdefn->datum_type ) { return 0; } else if( srcdefn->a_orig != dstdefn->a_orig || ABS(srcdefn->es_orig - dstdefn->es_orig) > 0.000000000050 ) { /* the tolerence for es is to ensure that GRS80 and WGS84 are considered identical */ return 0; } else if( srcdefn->datum_type == PJD_3PARAM ) { return (srcdefn->datum_params[0] == dstdefn->datum_params[0] && srcdefn->datum_params[1] == dstdefn->datum_params[1] && srcdefn->datum_params[2] == dstdefn->datum_params[2]); } else if( srcdefn->datum_type == PJD_7PARAM ) { return (srcdefn->datum_params[0] == dstdefn->datum_params[0] && srcdefn->datum_params[1] == dstdefn->datum_params[1] && srcdefn->datum_params[2] == dstdefn->datum_params[2] && srcdefn->datum_params[3] == dstdefn->datum_params[3] && srcdefn->datum_params[4] == dstdefn->datum_params[4] && srcdefn->datum_params[5] == dstdefn->datum_params[5] && srcdefn->datum_params[6] == dstdefn->datum_params[6]); } else if( srcdefn->datum_type == PJD_GRIDSHIFT ) { return strcmp( pj_param(srcdefn->params,"snadgrids").s, pj_param(dstdefn->params,"snadgrids").s ) == 0; } else return 1; } /************************************************************************/ /* pj_geocentic_to_wgs84() */ /************************************************************************/ int pj_geocentric_to_wgs84( PJ *defn, long point_count, int point_offset, double *x, double *y, double *z ) { int i; pj_errno = 0; if( defn->datum_type == PJD_3PARAM ) { for( i = 0; i < point_count; i++ ) { long io = i * point_offset; if( x[io] == HUGE_VAL ) continue; x[io] = x[io] + Dx_BF; y[io] = y[io] + Dy_BF; z[io] = z[io] + Dz_BF; } } else if( defn->datum_type == PJD_7PARAM ) { for( i = 0; i < point_count; i++ ) { long io = i * point_offset; double x_out, y_out, z_out; if( x[io] == HUGE_VAL ) continue; x_out = M_BF*( x[io] - Rz_BF*y[io] + Ry_BF*z[io]) + Dx_BF; y_out = M_BF*( Rz_BF*x[io] + y[io] - Rx_BF*z[io]) + Dy_BF; z_out = M_BF*(-Ry_BF*x[io] + Rx_BF*y[io] + z[io]) + Dz_BF; x[io] = x_out; y[io] = y_out; z[io] = z_out; } } return 0; } /************************************************************************/ /* pj_geocentic_from_wgs84() */ /************************************************************************/ int pj_geocentric_from_wgs84( PJ *defn, long point_count, int point_offset, double *x, double *y, double *z ) { int i; pj_errno = 0; if( defn->datum_type == PJD_3PARAM ) { for( i = 0; i < point_count; i++ ) { long io = i * point_offset; if( x[io] == HUGE_VAL ) continue; x[io] = x[io] - Dx_BF; y[io] = y[io] - Dy_BF; z[io] = z[io] - Dz_BF; } } else if( defn->datum_type == PJD_7PARAM ) { for( i = 0; i < point_count; i++ ) { long io = i * point_offset; double x_tmp, y_tmp, z_tmp; if( x[io] == HUGE_VAL ) continue; x_tmp = (x[io] - Dx_BF) / M_BF; y_tmp = (y[io] - Dy_BF) / M_BF; z_tmp = (z[io] - Dz_BF) / M_BF; x[io] = x_tmp + Rz_BF*y_tmp - Ry_BF*z_tmp; y[io] = -Rz_BF*x_tmp + y_tmp + Rx_BF*z_tmp; z[io] = Ry_BF*x_tmp - Rx_BF*y_tmp + z_tmp; } } return 0; } /************************************************************************/ /* pj_datum_transform() */ /* */ /* The input should be long/lat/z coordinates in radians in the */ /* source datum, and the output should be long/lat/z */ /* coordinates in radians in the destination datum. */ /************************************************************************/ int pj_datum_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset, double *x, double *y, double *z ) { double src_a, src_es, dst_a, dst_es; int z_is_temp = FALSE; pj_errno = 0; /* -------------------------------------------------------------------- */ /* We cannot do any meaningful datum transformation if either */ /* the source or destination are of an unknown datum type */ /* (ie. only a +ellps declaration, no +datum). This is new */ /* behavior for PROJ 4.6.0. */ /* -------------------------------------------------------------------- */ if( srcdefn->datum_type == PJD_UNKNOWN || dstdefn->datum_type == PJD_UNKNOWN ) return 0; /* -------------------------------------------------------------------- */ /* Short cut if the datums are identical. */ /* -------------------------------------------------------------------- */ if( pj_compare_datums( srcdefn, dstdefn ) ) return 0; src_a = srcdefn->a_orig; src_es = srcdefn->es_orig; dst_a = dstdefn->a_orig; dst_es = dstdefn->es_orig; /* -------------------------------------------------------------------- */ /* Create a temporary Z array if one is not provided. */ /* -------------------------------------------------------------------- */ if( z == NULL ) { int bytes = sizeof(double) * point_count * point_offset; z = (double *) pj_malloc(bytes); memset( z, 0, bytes ); z_is_temp = TRUE; } #define CHECK_RETURN {if( pj_errno != 0 && (pj_errno > 0 || transient_error[-pj_errno] == 0) ) { if( z_is_temp ) pj_dalloc(z); return pj_errno; }} /* -------------------------------------------------------------------- */ /* If this datum requires grid shifts, then apply it to geodetic */ /* coordinates. */ /* -------------------------------------------------------------------- */ if( srcdefn->datum_type == PJD_GRIDSHIFT ) { pj_apply_gridshift( pj_param(srcdefn->params,"snadgrids").s, 0, point_count, point_offset, x, y, z ); CHECK_RETURN; src_a = SRS_WGS84_SEMIMAJOR; src_es = SRS_WGS84_ESQUARED; } if( dstdefn->datum_type == PJD_GRIDSHIFT ) { dst_a = SRS_WGS84_SEMIMAJOR; dst_es = SRS_WGS84_ESQUARED; } /* ==================================================================== */ /* Do we need to go through geocentric coordinates? */ /* ==================================================================== */ if( src_es != dst_es || src_a != dst_a || srcdefn->datum_type == PJD_3PARAM || srcdefn->datum_type == PJD_7PARAM || dstdefn->datum_type == PJD_3PARAM || dstdefn->datum_type == PJD_7PARAM) { /* -------------------------------------------------------------------- */ /* Convert to geocentric coordinates. */ /* -------------------------------------------------------------------- */ pj_geodetic_to_geocentric( src_a, src_es, point_count, point_offset, x, y, z ); CHECK_RETURN; /* -------------------------------------------------------------------- */ /* Convert between datums. */ /* -------------------------------------------------------------------- */ if( srcdefn->datum_type == PJD_3PARAM || srcdefn->datum_type == PJD_7PARAM ) { pj_geocentric_to_wgs84( srcdefn, point_count, point_offset,x,y,z); CHECK_RETURN; } if( dstdefn->datum_type == PJD_3PARAM || dstdefn->datum_type == PJD_7PARAM ) { pj_geocentric_from_wgs84( dstdefn, point_count,point_offset,x,y,z); CHECK_RETURN; } /* -------------------------------------------------------------------- */ /* Convert back to geodetic coordinates. */ /* -------------------------------------------------------------------- */ pj_geocentric_to_geodetic( dst_a, dst_es, point_count, point_offset, x, y, z ); CHECK_RETURN; } /* -------------------------------------------------------------------- */ /* Apply grid shift to destination if required. */ /* -------------------------------------------------------------------- */ if( dstdefn->datum_type == PJD_GRIDSHIFT ) { pj_apply_gridshift( pj_param(dstdefn->params,"snadgrids").s, 1, point_count, point_offset, x, y, z ); CHECK_RETURN; } if( z_is_temp ) pj_dalloc( z ); return 0; } therion/extern/proj4/pj_datum_set.c0000664000175000017500000001314211130502664016432 0ustar useruser/****************************************************************************** * $Id: pj_datum_set.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Apply datum definition to PJ structure from initialization string. * Author: Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include /* SEC_TO_RAD = Pi/180/3600 */ #define SEC_TO_RAD 4.84813681109535993589914102357e-6 /************************************************************************/ /* pj_datum_set() */ /************************************************************************/ int pj_datum_set(paralist *pl, PJ *projdef) { const char *name, *towgs84, *nadgrids; projdef->datum_type = PJD_UNKNOWN; /* -------------------------------------------------------------------- */ /* Is there a datum definition in the parameters list? If so, */ /* add the defining values to the parameter list. Note that */ /* this will append the ellipse definition as well as the */ /* towgs84= and related parameters. It should also be pointed */ /* out that the addition is permanent rather than temporary */ /* like most other keyword expansion so that the ellipse */ /* definition will last into the pj_ell_set() function called */ /* after this one. */ /* -------------------------------------------------------------------- */ if( (name = pj_param(pl,"sdatum").s) != NULL ) { paralist *curr; const char *s; int i; /* find the end of the list, so we can add to it */ for (curr = pl; curr && curr->next ; curr = curr->next) {} /* find the datum definition */ for (i = 0; (s = pj_datums[i].id) && strcmp(name, s) ; ++i) {} if (!s) { pj_errno = -9; return 1; } if( pj_datums[i].ellipse_id && strlen(pj_datums[i].ellipse_id) > 0 ) { char entry[100]; strcpy( entry, "ellps=" ); strncat( entry, pj_datums[i].ellipse_id, 80 ); curr = curr->next = pj_mkparam(entry); } if( pj_datums[i].defn && strlen(pj_datums[i].defn) > 0 ) curr = curr->next = pj_mkparam(pj_datums[i].defn); } /* -------------------------------------------------------------------- */ /* Check for nadgrids parameter. */ /* -------------------------------------------------------------------- */ if( (nadgrids = pj_param(pl,"snadgrids").s) != NULL ) { /* We don't actually save the value separately. It will continue to exist int he param list for use in pj_apply_gridshift.c */ projdef->datum_type = PJD_GRIDSHIFT; } /* -------------------------------------------------------------------- */ /* Check for towgs84 parameter. */ /* -------------------------------------------------------------------- */ else if( (towgs84 = pj_param(pl,"stowgs84").s) != NULL ) { int parm_count = 0; const char *s; memset( projdef->datum_params, 0, sizeof(double) * 7); /* parse out the parameters */ s = towgs84; for( s = towgs84; *s != '\0' && parm_count < 7; ) { projdef->datum_params[parm_count++] = atof(s); while( *s != '\0' && *s != ',' ) s++; if( *s == ',' ) s++; } if( projdef->datum_params[3] != 0.0 || projdef->datum_params[4] != 0.0 || projdef->datum_params[5] != 0.0 || projdef->datum_params[6] != 0.0 ) { projdef->datum_type = PJD_7PARAM; /* transform from arc seconds to radians */ projdef->datum_params[3] *= SEC_TO_RAD; projdef->datum_params[4] *= SEC_TO_RAD; projdef->datum_params[5] *= SEC_TO_RAD; /* transform from parts per million to scaling factor */ projdef->datum_params[6] = (projdef->datum_params[6]/1000000.0) + 1; } else projdef->datum_type = PJD_3PARAM; /* Note that pj_init() will later switch datum_type to PJD_WGS84 if shifts are all zero, and ellipsoid is WGS84 or GRS80 */ } return 0; } therion/extern/proj4/pj_datums.c0000664000175000017500000000734011165201474015750 0ustar useruser/****************************************************************************** * $Id: pj_datums.c 1558 2009-04-02 18:25:58Z warmerdam $ * * Project: PROJ.4 * Purpose: Built in datum list. * Author: Frank Warmerdam, warmerda@home.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_DATUMS__ #include /* * The ellipse code must match one from pj_ellps.c. The datum id should * be kept to 12 characters or less if possible. Use the official OGC * datum name for the comments if available. */ C_NAMESPACE_VAR struct PJ_DATUMS pj_datums[] = { /* id definition ellipse comments */ /* -- ---------- ------- -------- */ "WGS84", "towgs84=0,0,0", "WGS84", "", "GGRS87", "towgs84=-199.87,74.79,246.62", "GRS80", "Greek_Geodetic_Reference_System_1987", "NAD83", "towgs84=0,0,0", "GRS80", "North_American_Datum_1983", "NAD27", "nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", "clrk66", "North_American_Datum_1927", "potsdam", "towgs84=606.0,23.0,413.0", "bessel", "Potsdam Rauenberg 1950 DHDN", "carthage", "towgs84=-263.0,6.0,431.0", "clark80", "Carthage 1934 Tunisia", "hermannskogel", "towgs84=653.0,-212.0,449.0", "bessel", "Hermannskogel", "ire65", "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", "mod_airy", "Ireland 1965", "nzgd49", "towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", "intl", "New Zealand Geodetic Datum 1949", "OSGB36", "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", "airy", "Airy 1830", NULL, NULL, NULL, NULL }; struct PJ_DATUMS *pj_get_datums_ref() { return pj_datums; } C_NAMESPACE_VAR struct PJ_PRIME_MERIDIANS pj_prime_meridians[] = { /* id definition */ /* -- ---------- */ "greenwich", "0dE", "lisbon", "9d07'54.862\"W", "paris", "2d20'14.025\"E", "bogota", "74d04'51.3\"W", "madrid", "3d41'16.58\"W", "rome", "12d27'8.4\"E", "bern", "7d26'22.5\"E", "jakarta", "106d48'27.79\"E", "ferro", "17d40'W", "brussels", "4d22'4.71\"E", "stockholm", "18d3'29.8\"E", "athens", "23d42'58.815\"E", "oslo", "10d43'22.5\"E", NULL, NULL }; struct PJ_PRIME_MERIDIANS *pj_get_prime_meridians_ref() { return pj_prime_meridians; } therion/extern/proj4/PJ_aeqd.c0000664000175000017500000001655111130502664015266 0ustar useruser/****************************************************************************** * $Id: PJ_aeqd.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of the aeqd (Azimuthal Equidistant) projection. * Author: Gerald Evenden * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PROJ_PARMS__ \ double sinph0; \ double cosph0; \ double *en; \ double M1; \ double N1; \ double Mp; \ double He; \ double G; \ int mode; #define PJ_LIB__ #include PJ_CVSID("$Id: PJ_aeqd.c 1504 2009-01-06 02:11:57Z warmerdam $"); PROJ_HEAD(aeqd, "Azimuthal Equidistant") "\n\tAzi, Sph&Ell\n\tlat_0 guam"; #define EPS10 1.e-10 #define TOL 1.e-14 #define N_POLE 0 #define S_POLE 1 #define EQUIT 2 #define OBLIQ 3 FORWARD(e_guam_fwd); /* Guam elliptical */ double cosphi, sinphi, t; cosphi = cos(lp.phi); sinphi = sin(lp.phi); t = 1. / sqrt(1. - P->es * sinphi * sinphi); xy.x = lp.lam * cosphi * t; xy.y = pj_mlfn(lp.phi, sinphi, cosphi, P->en) - P->M1 + .5 * lp.lam * lp.lam * cosphi * sinphi * t; return (xy); } FORWARD(e_forward); /* elliptical */ double coslam, cosphi, sinphi, rho, s, H, H2, c, Az, t, ct, st, cA, sA; coslam = cos(lp.lam); cosphi = cos(lp.phi); sinphi = sin(lp.phi); switch (P->mode) { case N_POLE: coslam = - coslam; case S_POLE: xy.x = (rho = fabs(P->Mp - pj_mlfn(lp.phi, sinphi, cosphi, P->en))) * sin(lp.lam); xy.y = rho * coslam; break; case EQUIT: case OBLIQ: if (fabs(lp.lam) < EPS10 && fabs(lp.phi - P->phi0) < EPS10) { xy.x = xy.y = 0.; break; } t = atan2(P->one_es * sinphi + P->es * P->N1 * P->sinph0 * sqrt(1. - P->es * sinphi * sinphi), cosphi); ct = cos(t); st = sin(t); Az = atan2(sin(lp.lam) * ct, P->cosph0 * st - P->sinph0 * coslam * ct); cA = cos(Az); sA = sin(Az); s = aasin( fabs(sA) < TOL ? (P->cosph0 * st - P->sinph0 * coslam * ct) / cA : sin(lp.lam) * ct / sA ); H = P->He * cA; H2 = H * H; c = P->N1 * s * (1. + s * s * (- H2 * (1. - H2)/6. + s * ( P->G * H * (1. - 2. * H2 * H2) / 8. + s * ((H2 * (4. - 7. * H2) - 3. * P->G * P->G * (1. - 7. * H2)) / 120. - s * P->G * H / 48.)))); xy.x = c * sA; xy.y = c * cA; break; } return (xy); } FORWARD(s_forward); /* spherical */ double coslam, cosphi, sinphi; sinphi = sin(lp.phi); cosphi = cos(lp.phi); coslam = cos(lp.lam); switch (P->mode) { case EQUIT: xy.y = cosphi * coslam; goto oblcon; case OBLIQ: xy.y = P->sinph0 * sinphi + P->cosph0 * cosphi * coslam; oblcon: if (fabs(fabs(xy.y) - 1.) < TOL) if (xy.y < 0.) F_ERROR else xy.x = xy.y = 0.; else { xy.y = acos(xy.y); xy.y /= sin(xy.y); xy.x = xy.y * cosphi * sin(lp.lam); xy.y *= (P->mode == EQUIT) ? sinphi : P->cosph0 * sinphi - P->sinph0 * cosphi * coslam; } break; case N_POLE: lp.phi = -lp.phi; coslam = -coslam; case S_POLE: if (fabs(lp.phi - HALFPI) < EPS10) F_ERROR; xy.x = (xy.y = (HALFPI + lp.phi)) * sin(lp.lam); xy.y *= coslam; break; } return (xy); } INVERSE(e_guam_inv); /* Guam elliptical */ double x2, t; int i; x2 = 0.5 * xy.x * xy.x; lp.phi = P->phi0; for (i = 0; i < 3; ++i) { t = P->e * sin(lp.phi); lp.phi = pj_inv_mlfn(P->M1 + xy.y - x2 * tan(lp.phi) * (t = sqrt(1. - t * t)), P->es, P->en); } lp.lam = xy.x * t / cos(lp.phi); return (lp); } INVERSE(e_inverse); /* elliptical */ double c, Az, cosAz, A, B, D, E, F, psi, t; if ((c = hypot(xy.x, xy.y)) < EPS10) { lp.phi = P->phi0; lp.lam = 0.; return (lp); } if (P->mode == OBLIQ || P->mode == EQUIT) { cosAz = cos(Az = atan2(xy.x, xy.y)); t = P->cosph0 * cosAz; B = P->es * t / P->one_es; A = - B * t; B *= 3. * (1. - A) * P->sinph0; D = c / P->N1; E = D * (1. - D * D * (A * (1. + A) / 6. + B * (1. + 3.*A) * D / 24.)); F = 1. - E * E * (A / 2. + B * E / 6.); psi = aasin(P->sinph0 * cos(E) + t * sin(E)); lp.lam = aasin(sin(Az) * sin(E) / cos(psi)); if ((t = fabs(psi)) < EPS10) lp.phi = 0.; else if (fabs(t - HALFPI) < 0.) lp.phi = HALFPI; else lp.phi = atan((1. - P->es * F * P->sinph0 / sin(psi)) * tan(psi) / P->one_es); } else { /* Polar */ lp.phi = pj_inv_mlfn(P->mode == N_POLE ? P->Mp - c : P->Mp + c, P->es, P->en); lp.lam = atan2(xy.x, P->mode == N_POLE ? -xy.y : xy.y); } return (lp); } INVERSE(s_inverse); /* spherical */ double cosc, c_rh, sinc; if ((c_rh = hypot(xy.x, xy.y)) > PI) { if (c_rh - EPS10 > PI) I_ERROR; c_rh = PI; } else if (c_rh < EPS10) { lp.phi = P->phi0; lp.lam = 0.; return (lp); } if (P->mode == OBLIQ || P->mode == EQUIT) { sinc = sin(c_rh); cosc = cos(c_rh); if (P->mode == EQUIT) { lp.phi = aasin(xy.y * sinc / c_rh); xy.x *= sinc; xy.y = cosc * c_rh; } else { lp.phi = aasin(cosc * P->sinph0 + xy.y * sinc * P->cosph0 / c_rh); xy.y = (cosc - P->sinph0 * sin(lp.phi)) * c_rh; xy.x *= sinc * P->cosph0; } lp.lam = xy.y == 0. ? 0. : atan2(xy.x, xy.y); } else if (P->mode == N_POLE) { lp.phi = HALFPI - c_rh; lp.lam = atan2(xy.x, -xy.y); } else { lp.phi = c_rh - HALFPI; lp.lam = atan2(xy.x, xy.y); } return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY1(aeqd, en) P->phi0 = pj_param(P->params, "rlat_0").f; if (fabs(fabs(P->phi0) - HALFPI) < EPS10) { P->mode = P->phi0 < 0. ? S_POLE : N_POLE; P->sinph0 = P->phi0 < 0. ? -1. : 1.; P->cosph0 = 0.; } else if (fabs(P->phi0) < EPS10) { P->mode = EQUIT; P->sinph0 = 0.; P->cosph0 = 1.; } else { P->mode = OBLIQ; P->sinph0 = sin(P->phi0); P->cosph0 = cos(P->phi0); } if (! P->es) { P->inv = s_inverse; P->fwd = s_forward; } else { if (!(P->en = pj_enfn(P->es))) E_ERROR_0; if (pj_param(P->params, "bguam").i) { P->M1 = pj_mlfn(P->phi0, P->sinph0, P->cosph0, P->en); P->inv = e_guam_inv; P->fwd = e_guam_fwd; } else { switch (P->mode) { case N_POLE: P->Mp = pj_mlfn(HALFPI, 1., 0., P->en); break; case S_POLE: P->Mp = pj_mlfn(-HALFPI, -1., 0., P->en); break; case EQUIT: case OBLIQ: P->inv = e_inverse; P->fwd = e_forward; P->N1 = 1. / sqrt(1. - P->es * P->sinph0 * P->sinph0); P->G = P->sinph0 * (P->He = P->e / sqrt(P->one_es)); P->He *= P->cosph0; break; } P->inv = e_inverse; P->fwd = e_forward; } } ENDENTRY(P) therion/extern/proj4/pj_list.c0000664000175000017500000000032711137333652015427 0ustar useruser/* Projection System: default list of projections ** Use local definition of PJ_LIST_H for subset. */ #define PJ_LIST_H "pj_list.h" #include "projects.h" struct PJ_LIST *pj_get_list_ref() { return pj_list; } therion/extern/proj4/PJ_urm5.c0000664000175000017500000000124611137334036015242 0ustar useruser#define PROJ_PARMS__ \ double m, rmn, q3, n; #define PJ_LIB__ # include PROJ_HEAD(urm5, "Urmaev V") "\n\tPCyl., Sph.\n\tn= q= alphi="; FORWARD(s_forward); /* spheroid */ double t; t = lp.phi = aasin(P->n * sin(lp.phi)); xy.x = P->m * lp.lam * cos(lp.phi); t *= t; xy.y = lp.phi * (1. + t * P->q3) * P->rmn; return xy; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(urm5) double alpha, t; P->n = pj_param(P->params, "dn").f; P->q3 = pj_param(P->params, "dq").f / 3.; alpha = pj_param(P->params, "ralpha").f; t = P->n * sin(alpha); P->m = cos(alpha) / sqrt(1. - t * t); P->rmn = 1. / (P->m * P->n); P->es = 0.; P->inv = 0; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_utils.c0000664000175000017500000001350711130502664015612 0ustar useruser/****************************************************************************** * $Id: pj_utils.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Some utility functions we don't want to bother putting in * their own source files. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2001, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include /************************************************************************/ /* pj_is_latlong() */ /* */ /* Returns TRUE if this coordinate system object is */ /* geographic. */ /************************************************************************/ int pj_is_latlong( PJ *pj ) { return pj == NULL || pj->is_latlong; } /************************************************************************/ /* pj_is_geocent() */ /* */ /* Returns TRUE if this coordinate system object is geocentric. */ /************************************************************************/ int pj_is_geocent( PJ *pj ) { return pj != NULL && pj->is_geocent; } /************************************************************************/ /* pj_latlong_from_proj() */ /* */ /* Return a PJ* definition defining the lat/long coordinate */ /* system on which a projection is based. If the coordinate */ /* system passed in is latlong, a clone of the same will be */ /* returned. */ /************************************************************************/ PJ *pj_latlong_from_proj( PJ *pj_in ) { char defn[512]; int got_datum = FALSE; pj_errno = 0; strcpy( defn, "+proj=latlong" ); if( pj_param(pj_in->params, "tdatum").i ) { got_datum = TRUE; sprintf( defn+strlen(defn), " +datum=%s", pj_param(pj_in->params,"sdatum").s ); } else if( pj_param(pj_in->params, "tellps").i ) { sprintf( defn+strlen(defn), " +ellps=%s", pj_param(pj_in->params,"sellps").s ); } else if( pj_param(pj_in->params, "ta").i ) { sprintf( defn+strlen(defn), " +a=%s", pj_param(pj_in->params,"sa").s ); if( pj_param(pj_in->params, "tb").i ) sprintf( defn+strlen(defn), " +b=%s", pj_param(pj_in->params,"sb").s ); else if( pj_param(pj_in->params, "tes").i ) sprintf( defn+strlen(defn), " +es=%s", pj_param(pj_in->params,"ses").s ); else if( pj_param(pj_in->params, "tf").i ) sprintf( defn+strlen(defn), " +f=%s", pj_param(pj_in->params,"sf").s ); else sprintf( defn+strlen(defn), " +es=%.16g", pj_in->es ); } else { pj_errno = -13; return NULL; } if( !got_datum ) { if( pj_param(pj_in->params, "ttowgs84").i ) sprintf( defn+strlen(defn), " +towgs84=%s", pj_param(pj_in->params,"stowgs84").s ); if( pj_param(pj_in->params, "tnadgrids").i ) sprintf( defn+strlen(defn), " +nadgrids=%s", pj_param(pj_in->params,"snadgrids").s ); } /* copy over some other information related to ellipsoid */ if( pj_param(pj_in->params, "tR").i ) sprintf( defn+strlen(defn), " +R=%s", pj_param(pj_in->params,"sR").s ); if( pj_param(pj_in->params, "tR_A").i ) sprintf( defn+strlen(defn), " +R_A" ); if( pj_param(pj_in->params, "tR_V").i ) sprintf( defn+strlen(defn), " +R_V" ); if( pj_param(pj_in->params, "tR_a").i ) sprintf( defn+strlen(defn), " +R_a" ); if( pj_param(pj_in->params, "tR_lat_a").i ) sprintf( defn+strlen(defn), " +R_lat_a=%s", pj_param(pj_in->params,"sR_lat_a").s ); if( pj_param(pj_in->params, "tR_lat_g").i ) sprintf( defn+strlen(defn), " +R_lat_g=%s", pj_param(pj_in->params,"sR_lat_g").s ); /* copy over prime meridian */ if( pj_param(pj_in->params, "tpm").i ) sprintf( defn+strlen(defn), " +pm=%s", pj_param(pj_in->params,"spm").s ); return pj_init_plus( defn ); } therion/extern/proj4/geocent.h0000664000175000017500000001421311076404756015421 0ustar useruser#ifndef GEOCENT_H #define GEOCENT_H /***************************************************************************/ /* RSC IDENTIFIER: GEOCENTRIC * * ABSTRACT * * This component provides conversions between Geodetic coordinates (latitude, * longitude in radians and height in meters) and Geocentric coordinates * (X, Y, Z) in meters. * * ERROR HANDLING * * This component checks parameters for valid values. If an invalid value * is found, the error code is combined with the current error code using * the bitwise or. This combining allows multiple error codes to be * returned. The possible error codes are: * * GEOCENT_NO_ERROR : No errors occurred in function * GEOCENT_LAT_ERROR : Latitude out of valid range * (-90 to 90 degrees) * GEOCENT_LON_ERROR : Longitude out of valid range * (-180 to 360 degrees) * GEOCENT_A_ERROR : Semi-major axis less than or equal to zero * GEOCENT_B_ERROR : Semi-minor axis less than or equal to zero * GEOCENT_A_LESS_B_ERROR : Semi-major axis less than semi-minor axis * * * REUSE NOTES * * GEOCENTRIC is intended for reuse by any application that performs * coordinate conversions between geodetic coordinates and geocentric * coordinates. * * * REFERENCES * * An Improved Algorithm for Geocentric to Geodetic Coordinate Conversion, * Ralph Toms, February 1996 UCRL-JC-123138. * * Further information on GEOCENTRIC can be found in the Reuse Manual. * * GEOCENTRIC originated from : U.S. Army Topographic Engineering Center * Geospatial Information Division * 7701 Telegraph Road * Alexandria, VA 22310-3864 * * LICENSES * * None apply to this component. * * RESTRICTIONS * * GEOCENTRIC has no restrictions. * * ENVIRONMENT * * GEOCENTRIC was tested and certified in the following environments: * * 1. Solaris 2.5 with GCC version 2.8.1 * 2. Windows 95 with MS Visual C++ version 6 * * MODIFICATIONS * * Date Description * ---- ----------- * * */ /***************************************************************************/ /* * DEFINES */ #define GEOCENT_NO_ERROR 0x0000 #define GEOCENT_LAT_ERROR 0x0001 #define GEOCENT_LON_ERROR 0x0002 #define GEOCENT_A_ERROR 0x0004 #define GEOCENT_B_ERROR 0x0008 #define GEOCENT_A_LESS_B_ERROR 0x0010 /***************************************************************************/ /* * FUNCTION PROTOTYPES */ /* ensure proper linkage to c++ programs */ #ifdef __cplusplus extern "C" { #endif typedef struct { double Geocent_a; /* Semi-major axis of ellipsoid in meters */ double Geocent_b; /* Semi-minor axis of ellipsoid */ double Geocent_a2; /* Square of semi-major axis */ double Geocent_b2; /* Square of semi-minor axis */ double Geocent_e2; /* Eccentricity squared */ double Geocent_ep2; /* 2nd eccentricity squared */ } GeocentricInfo; void pj_Init_Geocentric( GeocentricInfo *gi ); long pj_Set_Geocentric_Parameters( GeocentricInfo *gi, double a, double b); /* * The function Set_Geocentric_Parameters receives the ellipsoid parameters * as inputs and sets the corresponding state variables. * * a : Semi-major axis, in meters. (input) * b : Semi-minor axis, in meters. (input) */ void pj_Get_Geocentric_Parameters ( GeocentricInfo *gi, double *a, double *b); /* * The function Get_Geocentric_Parameters returns the ellipsoid parameters * to be used in geocentric coordinate conversions. * * a : Semi-major axis, in meters. (output) * b : Semi-minor axis, in meters. (output) */ long pj_Convert_Geodetic_To_Geocentric ( GeocentricInfo *gi, double Latitude, double Longitude, double Height, double *X, double *Y, double *Z); /* * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), * according to the current ellipsoid parameters. * * Latitude : Geodetic latitude in radians (input) * Longitude : Geodetic longitude in radians (input) * Height : Geodetic height, in meters (input) * X : Calculated Geocentric X coordinate, in meters. (output) * Y : Calculated Geocentric Y coordinate, in meters. (output) * Z : Calculated Geocentric Z coordinate, in meters. (output) * */ void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi, double X, double Y, double Z, double *Latitude, double *Longitude, double *Height); /* * The function Convert_Geocentric_To_Geodetic converts geocentric * coordinates (X, Y, Z) to geodetic coordinates (latitude, longitude, * and height), according to the current ellipsoid parameters. * * X : Geocentric X coordinate, in meters. (input) * Y : Geocentric Y coordinate, in meters. (input) * Z : Geocentric Z coordinate, in meters. (input) * Latitude : Calculated latitude value in radians. (output) * Longitude : Calculated longitude value in radians. (output) * Height : Calculated height value, in meters. (output) */ #ifdef __cplusplus } #endif #endif /* GEOCENT_H */ therion/extern/proj4/PJ_nell.c0000664000175000017500000000136011137333712015301 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(nell, "Nell") "\n\tPCyl., Sph."; #define MAX_ITER 10 #define LOOP_TOL 1e-7 FORWARD(s_forward); /* spheroid */ double k, V; int i; k = 2. * sin(lp.phi); V = lp.phi * lp.phi; lp.phi *= 1.00371 + V * (-0.0935382 + V * -0.011412); for (i = MAX_ITER; i ; --i) { lp.phi -= V = (lp.phi + sin(lp.phi) - k) / (1. + cos(lp.phi)); if (fabs(V) < LOOP_TOL) break; } xy.x = 0.5 * lp.lam * (1. + cos(lp.phi)); xy.y = lp.phi; return (xy); } INVERSE(s_inverse); /* spheroid */ double th, s; lp.lam = 2. * xy.x / (1. + cos(xy.y)); lp.phi = aasin(0.5 * (xy.y + sin(xy.y))); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(nell) P->es = 0; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_nzmg.c0000664000175000017500000000672011130502664015324 0ustar useruser/****************************************************************************** * $Id: PJ_nzmg.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of the nzmg (New Zealand Map Grid) projection. * Very loosely based upon DMA code by Bradford W. Drew * Author: Gerald Evenden * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include PJ_CVSID("$Id: PJ_nzmg.c 1504 2009-01-06 02:11:57Z warmerdam $"); PROJ_HEAD(nzmg, "New Zealand Map Grid") "\n\tfixed Earth"; #define EPSLN 1e-10 #define SEC5_TO_RAD 0.4848136811095359935899141023 #define RAD_TO_SEC5 2.062648062470963551564733573 static COMPLEX bf[] = { {.7557853228, 0.0}, {.249204646, .003371507}, {-.001541739, .041058560}, {-.10162907, .01727609}, {-.26623489, -.36249218}, {-.6870983, -1.1651967} }; static double tphi[] = { 1.5627014243, .5185406398, -.03333098, -.1052906, -.0368594, .007317, .01220, .00394, -.0013 }, tpsi[] = { .6399175073, -.1358797613, .063294409, -.02526853, .0117879, -.0055161, .0026906, -.001333, .00067, -.00034 }; #define Nbf 5 #define Ntpsi 9 #define Ntphi 8 FORWARD(e_forward); /* ellipsoid */ COMPLEX p; double *C; int i; lp.phi = (lp.phi - P->phi0) * RAD_TO_SEC5; for (p.r = *(C = tpsi + (i = Ntpsi)); i ; --i) p.r = *--C + lp.phi * p.r; p.r *= lp.phi; p.i = lp.lam; p = pj_zpoly1(p, bf, Nbf); xy.x = p.i; xy.y = p.r; return xy; } INVERSE(e_inverse); /* ellipsoid */ int nn, i; COMPLEX p, f, fp, dp; double den, *C; p.r = xy.y; p.i = xy.x; for (nn = 20; nn ;--nn) { f = pj_zpolyd1(p, bf, Nbf, &fp); f.r -= xy.y; f.i -= xy.x; den = fp.r * fp.r + fp.i * fp.i; p.r += dp.r = -(f.r * fp.r + f.i * fp.i) / den; p.i += dp.i = -(f.i * fp.r - f.r * fp.i) / den; if ((fabs(dp.r) + fabs(dp.i)) <= EPSLN) break; } if (nn) { lp.lam = p.i; for (lp.phi = *(C = tphi + (i = Ntphi)); i ; --i) lp.phi = *--C + p.r * lp.phi; lp.phi = P->phi0 + p.r * lp.phi * SEC5_TO_RAD; } else lp.lam = lp.phi = HUGE_VAL; return lp; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(nzmg) /* force to International major axis */ P->ra = 1. / (P->a = 6378388.0); P->lam0 = DEG_TO_RAD * 173.; P->phi0 = DEG_TO_RAD * -41.; P->x0 = 2510000.; P->y0 = 6023150.; P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/PJ_ob_tran.c0000664000175000017500000001002511137333724015774 0ustar useruser#define PROJ_PARMS__ \ struct PJconsts *link; \ double lamp; \ double cphip, sphip; #define PJ_LIB__ #include #include PROJ_HEAD(ob_tran, "General Oblique Transformation") "\n\tMisc Sph" "\n\to_proj= plus parameters for projection" "\n\to_lat_p= o_lon_p= (new pole) or" "\n\to_alpha= o_lon_c= o_lat_c= or" "\n\to_lon_1= o_lat_1= o_lon_2= o_lat_2="; #define TOL 1e-10 FORWARD(o_forward); /* spheroid */ double coslam, sinphi, cosphi; (void) xy; coslam = cos(lp.lam); sinphi = sin(lp.phi); cosphi = cos(lp.phi); lp.lam = adjlon(aatan2(cosphi * sin(lp.lam), P->sphip * cosphi * coslam + P->cphip * sinphi) + P->lamp); lp.phi = aasin(P->sphip * sinphi - P->cphip * cosphi * coslam); return (P->link->fwd(lp, P->link)); } FORWARD(t_forward); /* spheroid */ double cosphi, coslam; (void) xy; cosphi = cos(lp.phi); coslam = cos(lp.lam); lp.lam = adjlon(aatan2(cosphi * sin(lp.lam), sin(lp.phi)) + P->lamp); lp.phi = aasin(- cosphi * coslam); return (P->link->fwd(lp, P->link)); } INVERSE(o_inverse); /* spheroid */ double coslam, sinphi, cosphi; lp = P->link->inv(xy, P->link); if (lp.lam != HUGE_VAL) { coslam = cos(lp.lam -= P->lamp); sinphi = sin(lp.phi); cosphi = cos(lp.phi); lp.phi = aasin(P->sphip * sinphi + P->cphip * cosphi * coslam); lp.lam = aatan2(cosphi * sin(lp.lam), P->sphip * cosphi * coslam - P->cphip * sinphi); } return (lp); } INVERSE(t_inverse); /* spheroid */ double cosphi, t; lp = P->link->inv(xy, P->link); if (lp.lam != HUGE_VAL) { cosphi = cos(lp.phi); t = lp.lam - P->lamp; lp.lam = aatan2(cosphi * sin(t), - sin(lp.phi)); lp.phi = aasin(cosphi * cos(t)); } return (lp); } FREEUP; if (P) { if (P->link) (*(P->link->pfree))(P->link); pj_dalloc(P); } } ENTRY1(ob_tran, link) int i; double phip; char *name, *s; /* get name of projection to be translated */ if (!(name = pj_param(P->params, "so_proj").s)) E_ERROR(-26); for (i = 0; (s = pj_list[i].id) && strcmp(name, s) ; ++i) ; if (!s || !(P->link = (*pj_list[i].proj)(0))) E_ERROR(-37); /* copy existing header into new */ P->es = 0.; /* force to spherical */ P->link->params = P->params; P->link->over = P->over; P->link->geoc = P->geoc; P->link->a = P->a; P->link->es = P->es; P->link->ra = P->ra; P->link->lam0 = P->lam0; P->link->phi0 = P->phi0; P->link->x0 = P->x0; P->link->y0 = P->y0; P->link->k0 = P->k0; /* force spherical earth */ P->link->one_es = P->link->rone_es = 1.; P->link->es = P->link->e = 0.; if (!(P->link = pj_list[i].proj(P->link))) { freeup(P); return 0; } if (pj_param(P->params, "to_alpha").i) { double lamc, phic, alpha; lamc = pj_param(P->params, "ro_lon_c").f; phic = pj_param(P->params, "ro_lat_c").f; alpha = pj_param(P->params, "ro_alpha").f; /* if (fabs(phic) <= TOL || fabs(fabs(phic) - HALFPI) <= TOL || fabs(fabs(alpha) - HALFPI) <= TOL) */ if (fabs(fabs(phic) - HALFPI) <= TOL) E_ERROR(-32); P->lamp = lamc + aatan2(-cos(alpha), -sin(alpha) * sin(phic)); phip = aasin(cos(phic) * sin(alpha)); } else if (pj_param(P->params, "to_lat_p").i) { /* specified new pole */ P->lamp = pj_param(P->params, "ro_lon_p").f; phip = pj_param(P->params, "ro_lat_p").f; } else { /* specified new "equator" points */ double lam1, lam2, phi1, phi2, con; lam1 = pj_param(P->params, "ro_lon_1").f; phi1 = pj_param(P->params, "ro_lat_1").f; lam2 = pj_param(P->params, "ro_lon_2").f; phi2 = pj_param(P->params, "ro_lat_2").f; if (fabs(phi1 - phi2) <= TOL || (con = fabs(phi1)) <= TOL || fabs(con - HALFPI) <= TOL || fabs(fabs(phi2) - HALFPI) <= TOL) E_ERROR(-33); P->lamp = atan2(cos(phi1) * sin(phi2) * cos(lam1) - sin(phi1) * cos(phi2) * cos(lam2), sin(phi1) * cos(phi2) * sin(lam2) - cos(phi1) * sin(phi2) * sin(lam1)); phip = atan(-cos(P->lamp - lam1) / tan(phi1)); } if (fabs(phip) > TOL) { /* oblique */ P->cphip = cos(phip); P->sphip = sin(phip); P->fwd = o_forward; P->inv = P->link->inv ? o_inverse : 0; } else { /* transverse */ P->fwd = t_forward; P->inv = P->link->inv ? t_inverse : 0; } ENDENTRY(P) therion/extern/proj4/PJ_wink2.c0000664000175000017500000000150111137334066015401 0ustar useruser#define PROJ_PARMS__ \ double cosphi1; #define PJ_LIB__ # include PROJ_HEAD(wink2, "Winkel II") "\n\tPCyl., Sph., no inv.\n\tlat_1="; #define MAX_ITER 10 #define LOOP_TOL 1e-7 #define TWO_D_PI 0.636619772367581343 FORWARD(s_forward); /* spheroid */ double k, V; int i; xy.y = lp.phi * TWO_D_PI; k = PI * sin(lp.phi); lp.phi *= 1.8; for (i = MAX_ITER; i ; --i) { lp.phi -= V = (lp.phi + sin(lp.phi) - k) / (1. + cos(lp.phi)); if (fabs(V) < LOOP_TOL) break; } if (!i) lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI; else lp.phi *= 0.5; xy.x = 0.5 * lp.lam * (cos(lp.phi) + P->cosphi1); xy.y = FORTPI * (sin(lp.phi) + xy.y); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(wink2) P->cosphi1 = cos(pj_param(P->params, "rlat_1").f); P->es = 0.; P->inv = 0; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_deriv.c0000664000175000017500000000156011137333534015564 0ustar useruser/* dervative of (*P->fwd) projection */ #define PJ_LIB__ #include "projects.h" int pj_deriv(LP lp, double h, PJ *P, struct DERIVS *der) { XY t; lp.lam += h; lp.phi += h; if (fabs(lp.phi) > HALFPI) return 1; h += h; t = (*P->fwd)(lp, P); if (t.x == HUGE_VAL) return 1; der->x_l = t.x; der->y_p = t.y; der->x_p = -t.x; der->y_l = -t.y; lp.phi -= h; if (fabs(lp.phi) > HALFPI) return 1; t = (*P->fwd)(lp, P); if (t.x == HUGE_VAL) return 1; der->x_l += t.x; der->y_p -= t.y; der->x_p += t.x; der->y_l -= t.y; lp.lam -= h; t = (*P->fwd)(lp, P); if (t.x == HUGE_VAL) return 1; der->x_l -= t.x; der->y_p -= t.y; der->x_p += t.x; der->y_l += t.y; lp.phi += h; t = (*P->fwd)(lp, P); if (t.x == HUGE_VAL) return 1; der->x_l -= t.x; der->y_p += t.y; der->x_p -= t.x; der->y_l += t.y; der->x_l /= (h += h); der->y_p /= h; der->x_p /= h; der->y_l /= h; return 0; } therion/extern/proj4/PJ_wag7.c0000664000175000017500000000071111137334060015210 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(wag7, "Wagner VII") "\n\tMisc Sph, no inv."; FORWARD(s_forward); /* sphere */ double theta, ct, D; theta = asin(xy.y = 0.90630778703664996 * sin(lp.phi)); xy.x = 2.66723 * (ct = cos(theta)) * sin(lp.lam /= 3.); xy.y *= 1.24104 * (D = 1/(sqrt(0.5 * (1 + ct * cos(lp.lam))))); xy.x *= D; return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(wag7) P->fwd = s_forward; P->inv = 0; P->es = 0.; ENDENTRY(P) therion/extern/proj4/pj_fwd.c0000664000175000017500000000166311137333600015231 0ustar useruser/* general forward projection */ #define PJ_LIB__ #include #include # define EPS 1.0e-12 XY /* forward projection entry */ pj_fwd(LP lp, PJ *P) { XY xy; double t; /* check for forward and latitude or longitude overange */ if ((t = fabs(lp.phi)-HALFPI) > EPS || fabs(lp.lam) > 10.) { xy.x = xy.y = HUGE_VAL; pj_errno = -14; } else { /* proceed with projection */ errno = pj_errno = 0; if (fabs(t) <= EPS) lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; else if (P->geoc) lp.phi = atan(P->rone_es * tan(lp.phi)); lp.lam -= P->lam0; /* compute del lp.lam */ if (!P->over) lp.lam = adjlon(lp.lam); /* adjust del longitude */ xy = (*P->fwd)(lp, P); /* project */ if (pj_errno || (pj_errno = errno)) xy.x = xy.y = HUGE_VAL; /* adjust for major axis and easting/northings */ else { xy.x = P->fr_meter * (P->a * xy.x + P->x0); xy.y = P->fr_meter * (P->a * xy.y + P->y0); } } return xy; } therion/extern/proj4/PJ_airy.c0000664000175000017500000000705511130502664015317 0ustar useruser/****************************************************************************** * $Id: PJ_airy.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of the airy (Airy) projection. * Author: Gerald Evenden * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PROJ_PARMS__ \ double p_halfpi; \ double sinph0; \ double cosph0; \ double Cb; \ int mode; \ int no_cut; /* do not cut at hemisphere limit */ #define PJ_LIB__ #include PJ_CVSID("$Id: PJ_airy.c 1504 2009-01-06 02:11:57Z warmerdam $"); PROJ_HEAD(airy, "Airy") "\n\tMisc Sph, no inv.\n\tno_cut lat_b="; # define EPS 1.e-10 # define N_POLE 0 # define S_POLE 1 # define EQUIT 2 # define OBLIQ 3 FORWARD(s_forward); /* spheroid */ double sinlam, coslam, cosphi, sinphi, t, s, Krho, cosz; sinlam = sin(lp.lam); coslam = cos(lp.lam); switch (P->mode) { case EQUIT: case OBLIQ: sinphi = sin(lp.phi); cosphi = cos(lp.phi); cosz = cosphi * coslam; if (P->mode == OBLIQ) cosz = P->sinph0 * sinphi + P->cosph0 * cosz; if (!P->no_cut && cosz < -EPS) F_ERROR; if (fabs(s = 1. - cosz) > EPS) { t = 0.5 * (1. + cosz); Krho = -log(t)/s - P->Cb / t; } else Krho = 0.5 - P->Cb; xy.x = Krho * cosphi * sinlam; if (P->mode == OBLIQ) xy.y = Krho * (P->cosph0 * sinphi - P->sinph0 * cosphi * coslam); else xy.y = Krho * sinphi; break; case S_POLE: case N_POLE: lp.phi = fabs(P->p_halfpi - lp.phi); if (!P->no_cut && (lp.phi - EPS) > HALFPI) F_ERROR; if ((lp.phi *= 0.5) > EPS) { t = tan(lp.phi); Krho = -2.*(log(cos(lp.phi)) / t + t * P->Cb); xy.x = Krho * sinlam; xy.y = Krho * coslam; if (P->mode == N_POLE) xy.y = -xy.y; } else xy.x = xy.y = 0.; } return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(airy) double beta; P->no_cut = pj_param(P->params, "bno_cut").i; beta = 0.5 * (HALFPI - pj_param(P->params, "rlat_b").f); if (fabs(beta) < EPS) P->Cb = -0.5; else { P->Cb = 1./tan(beta); P->Cb *= P->Cb * log(cos(beta)); } if (fabs(fabs(P->phi0) - HALFPI) < EPS) if (P->phi0 < 0.) { P->p_halfpi = -HALFPI; P->mode = S_POLE; } else { P->p_halfpi = HALFPI; P->mode = N_POLE; } else { if (fabs(P->phi0) < EPS) P->mode = EQUIT; else { P->mode = OBLIQ; P->sinph0 = sin(P->phi0); P->cosph0 = cos(P->phi0); } } P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_aitoff.c0000664000175000017500000000511311130502664015614 0ustar useruser/****************************************************************************** * $Id: PJ_aitoff.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of the aitoff (Aitoff) and wintri (Winkel Tripel) * projections. * Author: Gerald Evenden * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PROJ_PARMS__ \ double cosphi1; \ int mode; #define PJ_LIB__ #include PJ_CVSID("$Id: PJ_aitoff.c 1504 2009-01-06 02:11:57Z warmerdam $"); PROJ_HEAD(aitoff, "Aitoff") "\n\tMisc Sph"; PROJ_HEAD(wintri, "Winkel Tripel") "\n\tMisc Sph\n\tlat_1"; FORWARD(s_forward); /* spheroid */ double c, d; if((d = acos(cos(lp.phi) * cos(c = 0.5 * lp.lam)))) {/* basic Aitoff */ xy.x = 2. * d * cos(lp.phi) * sin(c) * (xy.y = 1. / sin(d)); xy.y *= d * sin(lp.phi); } else xy.x = xy.y = 0.; if (P->mode) { /* Winkel Tripel */ xy.x = (xy.x + lp.lam * P->cosphi1) * 0.5; xy.y = (xy.y + lp.phi) * 0.5; } return (xy); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->inv = 0; P->fwd = s_forward; P->es = 0.; return P; } ENTRY0(aitoff) P->mode = 0; ENDENTRY(setup(P)) ENTRY0(wintri) P->mode = 1; if (pj_param(P->params, "tlat_1").i) { if ((P->cosphi1 = cos(pj_param(P->params, "rlat_1").f)) == 0.) E_ERROR(-22) } else /* 50d28' or acos(2/pi) */ P->cosphi1 = 0.636619772367581343; ENDENTRY(setup(P)) therion/extern/proj4/PJ_tpeqd.c0000664000175000017500000000463211137334026015470 0ustar useruser#define PROJ_PARMS__ \ double cp1, sp1, cp2, sp2, ccs, cs, sc, r2z0, z02, dlam2; \ double hz0, thz0, rhshz0, ca, sa, lp, lamc; #define PJ_LIB__ #include PROJ_HEAD(tpeqd, "Two Point Equidistant") "\n\tMisc Sph\n\tlat_1= lon_1= lat_2= lon_2="; FORWARD(s_forward); /* sphere */ double t, z1, z2, dl1, dl2, sp, cp; sp = sin(lp.phi); cp = cos(lp.phi); z1 = aacos(P->sp1 * sp + P->cp1 * cp * cos(dl1 = lp.lam + P->dlam2)); z2 = aacos(P->sp2 * sp + P->cp2 * cp * cos(dl2 = lp.lam - P->dlam2)); z1 *= z1; z2 *= z2; xy.x = P->r2z0 * (t = z1 - z2); t = P->z02 - t; xy.y = P->r2z0 * asqrt(4. * P->z02 * z2 - t * t); if ((P->ccs * sp - cp * (P->cs * sin(dl1) - P->sc * sin(dl2))) < 0.) xy.y = -xy.y; return xy; } INVERSE(s_inverse); /* sphere */ double cz1, cz2, s, d, cp, sp; cz1 = cos(hypot(xy.y, xy.x + P->hz0)); cz2 = cos(hypot(xy.y, xy.x - P->hz0)); s = cz1 + cz2; d = cz1 - cz2; lp.lam = - atan2(d, (s * P->thz0)); lp.phi = aacos(hypot(P->thz0 * s, d) * P->rhshz0); if ( xy.y < 0. ) lp.phi = - lp.phi; /* lam--phi now in system relative to P1--P2 base equator */ sp = sin(lp.phi); cp = cos(lp.phi); lp.phi = aasin(P->sa * sp + P->ca * cp * (s = cos(lp.lam -= P->lp))); lp.lam = atan2(cp * sin(lp.lam), P->sa * cp * s - P->ca * sp) + P->lamc; return lp; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(tpeqd) double lam_1, lam_2, phi_1, phi_2, A12, pp; /* get control point locations */ phi_1 = pj_param(P->params, "rlat_1").f; lam_1 = pj_param(P->params, "rlon_1").f; phi_2 = pj_param(P->params, "rlat_2").f; lam_2 = pj_param(P->params, "rlon_2").f; if (phi_1 == phi_2 && lam_1 == lam_2) E_ERROR(-25); P->lam0 = adjlon(0.5 * (lam_1 + lam_2)); P->dlam2 = adjlon(lam_2 - lam_1); P->cp1 = cos(phi_1); P->cp2 = cos(phi_2); P->sp1 = sin(phi_1); P->sp2 = sin(phi_2); P->cs = P->cp1 * P->sp2; P->sc = P->sp1 * P->cp2; P->ccs = P->cp1 * P->cp2 * sin(P->dlam2); P->z02 = aacos(P->sp1 * P->sp2 + P->cp1 * P->cp2 * cos(P->dlam2)); P->hz0 = .5 * P->z02; A12 = atan2(P->cp2 * sin(P->dlam2), P->cp1 * P->sp2 - P->sp1 * P->cp2 * cos(P->dlam2)); P->ca = cos(pp = aasin(P->cp1 * sin(A12))); P->sa = sin(pp); P->lp = adjlon(atan2(P->cp1 * cos(A12), P->sp1) - P->hz0); P->dlam2 *= .5; P->lamc = HALFPI - atan2(sin(A12) * P->sp1, cos(A12)) - P->dlam2; P->thz0 = tan(P->hz0); P->rhshz0 = .5 / sin(P->hz0); P->r2z0 = 0.5 / P->z02; P->z02 *= P->z02; P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/pj_phi2.c0000664000175000017500000000075011137333742015316 0ustar useruser/* determine latitude angle phi-2 */ #include #define HALFPI 1.5707963267948966 #define TOL 1.0e-10 #define N_ITER 15 double pj_phi2(double ts, double e) { double eccnth, Phi, con, dphi; int i; eccnth = .5 * e; Phi = HALFPI - 2. * atan (ts); i = N_ITER; do { con = e * sin (Phi); dphi = HALFPI - 2. * atan (ts * pow((1. - con) / (1. + con), eccnth)) - Phi; Phi += dphi; } while ( fabs(dphi) > TOL && --i); if (i <= 0) pj_errno = -18; return Phi; } therion/extern/proj4/PJ_gnom.c0000664000175000017500000000415711137333606015320 0ustar useruser#define PROJ_PARMS__ \ double sinph0; \ double cosph0; \ int mode; #define PJ_LIB__ #include PROJ_HEAD(gnom, "Gnomonic") "\n\tAzi, Sph."; #define EPS10 1.e-10 #define N_POLE 0 #define S_POLE 1 #define EQUIT 2 #define OBLIQ 3 FORWARD(s_forward); /* spheroid */ double coslam, cosphi, sinphi; sinphi = sin(lp.phi); cosphi = cos(lp.phi); coslam = cos(lp.lam); switch (P->mode) { case EQUIT: xy.y = cosphi * coslam; break; case OBLIQ: xy.y = P->sinph0 * sinphi + P->cosph0 * cosphi * coslam; break; case S_POLE: xy.y = - sinphi; break; case N_POLE: xy.y = sinphi; break; } if (xy.y <= EPS10) F_ERROR; xy.x = (xy.y = 1. / xy.y) * cosphi * sin(lp.lam); switch (P->mode) { case EQUIT: xy.y *= sinphi; break; case OBLIQ: xy.y *= P->cosph0 * sinphi - P->sinph0 * cosphi * coslam; break; case N_POLE: coslam = - coslam; case S_POLE: xy.y *= cosphi * coslam; break; } return (xy); } INVERSE(s_inverse); /* spheroid */ double rh, cosz, sinz; rh = hypot(xy.x, xy.y); sinz = sin(lp.phi = atan(rh)); cosz = sqrt(1. - sinz * sinz); if (fabs(rh) <= EPS10) { lp.phi = P->phi0; lp.lam = 0.; } else { switch (P->mode) { case OBLIQ: lp.phi = cosz * P->sinph0 + xy.y * sinz * P->cosph0 / rh; if (fabs(lp.phi) >= 1.) lp.phi = lp.phi > 0. ? HALFPI : - HALFPI; else lp.phi = asin(lp.phi); xy.y = (cosz - P->sinph0 * sin(lp.phi)) * rh; xy.x *= sinz * P->cosph0; break; case EQUIT: lp.phi = xy.y * sinz / rh; if (fabs(lp.phi) >= 1.) lp.phi = lp.phi > 0. ? HALFPI : - HALFPI; else lp.phi = asin(lp.phi); xy.y = cosz * rh; xy.x *= sinz; break; case S_POLE: lp.phi -= HALFPI; break; case N_POLE: lp.phi = HALFPI - lp.phi; xy.y = -xy.y; break; } lp.lam = atan2(xy.x, xy.y); } return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(gnom) if (fabs(fabs(P->phi0) - HALFPI) < EPS10) P->mode = P->phi0 < 0. ? S_POLE : N_POLE; else if (fabs(P->phi0) < EPS10) P->mode = EQUIT; else { P->mode = OBLIQ; P->sinph0 = sin(P->phi0); P->cosph0 = cos(P->phi0); } P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/pj_auth.c0000664000175000017500000000132711137333500015406 0ustar useruser/* determine latitude from authalic latitude */ #include # define P00 .33333333333333333333 # define P01 .17222222222222222222 # define P02 .10257936507936507936 # define P10 .06388888888888888888 # define P11 .06640211640211640211 # define P20 .01641501294219154443 #define APA_SIZE 3 double * pj_authset(double es) { double t, *APA; if (APA = (double *)pj_malloc(APA_SIZE * sizeof(double))) { APA[0] = es * P00; t = es * es; APA[0] += t * P01; APA[1] = t * P10; t *= es; APA[0] += t * P02; APA[1] += t * P11; APA[2] = t * P20; } return APA; } double pj_authlat(double beta, double *APA) { double t = beta+beta; return(beta + APA[0] * sin(t) + APA[1] * sin(t+t) + APA[2] * sin(t+t+t)); } therion/extern/proj4/PJ_lsat.c0000664000175000017500000001216411137333656015325 0ustar useruser/* based upon Snyder and Linck, USGS-NMD */ #define PROJ_PARMS__ \ double a2, a4, b, c1, c3; \ double q, t, u, w, p22, sa, ca, xj, rlm, rlm2; #define PJ_LIB__ #include PROJ_HEAD(lsat, "Space oblique for LANDSAT") "\n\tCyl, Sph&Ell\n\tlsat= path="; #define TOL 1e-7 #define PI_HALFPI 4.71238898038468985766 #define TWOPI_HALFPI 7.85398163397448309610 static void seraz0(double lam, double mult, PJ *P) { double sdsq, h, s, fc, sd, sq, d__1; lam *= DEG_TO_RAD; sd = sin(lam); sdsq = sd * sd; s = P->p22 * P->sa * cos(lam) * sqrt((1. + P->t * sdsq) / (( 1. + P->w * sdsq) * (1. + P->q * sdsq))); d__1 = 1. + P->q * sdsq; h = sqrt((1. + P->q * sdsq) / (1. + P->w * sdsq)) * ((1. + P->w * sdsq) / (d__1 * d__1) - P->p22 * P->ca); sq = sqrt(P->xj * P->xj + s * s); P->b += fc = mult * (h * P->xj - s * s) / sq; P->a2 += fc * cos(lam + lam); P->a4 += fc * cos(lam * 4.); fc = mult * s * (h + P->xj) / sq; P->c1 += fc * cos(lam); P->c3 += fc * cos(lam * 3.); } FORWARD(e_forward); /* ellipsoid */ int l, nn; double lamt, xlam, sdsq, c, d, s, lamdp, phidp, lampp, tanph, lamtp, cl, sd, sp, fac, sav, tanphi; if (lp.phi > HALFPI) lp.phi = HALFPI; else if (lp.phi < -HALFPI) lp.phi = -HALFPI; lampp = lp.phi >= 0. ? HALFPI : PI_HALFPI; tanphi = tan(lp.phi); for (nn = 0;;) { sav = lampp; lamtp = lp.lam + P->p22 * lampp; cl = cos(lamtp); if (fabs(cl) < TOL) lamtp -= TOL; fac = lampp - sin(lampp) * (cl < 0. ? -HALFPI : HALFPI); for (l = 50; l; --l) { lamt = lp.lam + P->p22 * sav; if (fabs(c = cos(lamt)) < TOL) lamt -= TOL; xlam = (P->one_es * tanphi * P->sa + sin(lamt) * P->ca) / c; lamdp = atan(xlam) + fac; if (fabs(fabs(sav) - fabs(lamdp)) < TOL) break; sav = lamdp; } if (!l || ++nn >= 3 || (lamdp > P->rlm && lamdp < P->rlm2)) break; if (lamdp <= P->rlm) lampp = TWOPI_HALFPI; else if (lamdp >= P->rlm2) lampp = HALFPI; } if (l) { sp = sin(lp.phi); phidp = aasin((P->one_es * P->ca * sp - P->sa * cos(lp.phi) * sin(lamt)) / sqrt(1. - P->es * sp * sp)); tanph = log(tan(FORTPI + .5 * phidp)); sd = sin(lamdp); sdsq = sd * sd; s = P->p22 * P->sa * cos(lamdp) * sqrt((1. + P->t * sdsq) / ((1. + P->w * sdsq) * (1. + P->q * sdsq))); d = sqrt(P->xj * P->xj + s * s); xy.x = P->b * lamdp + P->a2 * sin(2. * lamdp) + P->a4 * sin(lamdp * 4.) - tanph * s / d; xy.y = P->c1 * sd + P->c3 * sin(lamdp * 3.) + tanph * P->xj / d; } else xy.x = xy.y = HUGE_VAL; return xy; } INVERSE(e_inverse); /* ellipsoid */ int nn; double lamt, sdsq, s, lamdp, phidp, sppsq, dd, sd, sl, fac, scl, sav, spp; lamdp = xy.x / P->b; nn = 50; do { sav = lamdp; sd = sin(lamdp); sdsq = sd * sd; s = P->p22 * P->sa * cos(lamdp) * sqrt((1. + P->t * sdsq) / ((1. + P->w * sdsq) * (1. + P->q * sdsq))); lamdp = xy.x + xy.y * s / P->xj - P->a2 * sin( 2. * lamdp) - P->a4 * sin(lamdp * 4.) - s / P->xj * ( P->c1 * sin(lamdp) + P->c3 * sin(lamdp * 3.)); lamdp /= P->b; } while (fabs(lamdp - sav) >= TOL && --nn); sl = sin(lamdp); fac = exp(sqrt(1. + s * s / P->xj / P->xj) * (xy.y - P->c1 * sl - P->c3 * sin(lamdp * 3.))); phidp = 2. * (atan(fac) - FORTPI); dd = sl * sl; if (fabs(cos(lamdp)) < TOL) lamdp -= TOL; spp = sin(phidp); sppsq = spp * spp; lamt = atan(((1. - sppsq * P->rone_es) * tan(lamdp) * P->ca - spp * P->sa * sqrt((1. + P->q * dd) * ( 1. - sppsq) - sppsq * P->u) / cos(lamdp)) / (1. - sppsq * (1. + P->u))); sl = lamt >= 0. ? 1. : -1.; scl = cos(lamdp) >= 0. ? 1. : -1; lamt -= HALFPI * (1. - scl) * sl; lp.lam = lamt - P->p22 * lamdp; if (fabs(P->sa) < TOL) lp.phi = aasin(spp / sqrt(P->one_es * P->one_es + P->es * sppsq)); else lp.phi = atan((tan(lamdp) * cos(lamt) - P->ca * sin(lamt)) / (P->one_es * P->sa)); return lp; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(lsat) int land, path; double lam, alf, esc, ess; land = pj_param(P->params, "ilsat").i; if (land <= 0 || land > 5) E_ERROR(-28); path = pj_param(P->params, "ipath").i; if (path <= 0 || path > (land <= 3 ? 251 : 233)) E_ERROR(-29); if (land <= 3) { P->lam0 = DEG_TO_RAD * 128.87 - TWOPI / 251. * path; P->p22 = 103.2669323; alf = DEG_TO_RAD * 99.092; } else { P->lam0 = DEG_TO_RAD * 129.3 - TWOPI / 233. * path; P->p22 = 98.8841202; alf = DEG_TO_RAD * 98.2; } P->p22 /= 1440.; P->sa = sin(alf); P->ca = cos(alf); if (fabs(P->ca) < 1e-9) P->ca = 1e-9; esc = P->es * P->ca * P->ca; ess = P->es * P->sa * P->sa; P->w = (1. - esc) * P->rone_es; P->w = P->w * P->w - 1.; P->q = ess * P->rone_es; P->t = ess * (2. - P->es) * P->rone_es * P->rone_es; P->u = esc * P->rone_es; P->xj = P->one_es * P->one_es * P->one_es; P->rlm = PI * (1. / 248. + .5161290322580645); P->rlm2 = P->rlm + TWOPI; P->a2 = P->a4 = P->b = P->c1 = P->c3 = 0.; seraz0(0., 1., P); for (lam = 9.; lam <= 81.0001; lam += 18.) seraz0(lam, 4., P); for (lam = 18; lam <= 72.0001; lam += 18.) seraz0(lam, 2., P); seraz0(90., 1., P); P->a2 /= 30.; P->a4 /= 60.; P->b /= 30.; P->c1 /= 15.; P->c3 /= 45.; P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/PJ_eck3.c0000664000175000017500000000231011137333544015173 0ustar useruser#define PROJ_PARMS__ \ double C_x, C_y, A, B; #define PJ_LIB__ #include PROJ_HEAD(eck3, "Eckert III") "\n\tPCyl, Sph."; PROJ_HEAD(putp1, "Putnins P1") "\n\tPCyl, Sph."; PROJ_HEAD(wag6, "Wagner VI") "\n\tPCyl, Sph."; PROJ_HEAD(kav7, "Kavraisky VII") "\n\tPCyl, Sph."; FORWARD(s_forward); /* spheroid */ xy.y = P->C_y * lp.phi; xy.x = P->C_x * lp.lam * (P->A + asqrt(1. - P->B * lp.phi * lp.phi)); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / P->C_y; lp.lam = xy.x / (P->C_x * (P->A + asqrt(1. - P->B * lp.phi * lp.phi))); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(eck3) P->C_x = .42223820031577120149; P->C_y = .84447640063154240298; P->A = 1.; P->B = 0.4052847345693510857755; ENDENTRY(setup(P)) ENTRY0(kav7) P->C_x = 0.2632401569273184856851; P->C_x = 0.8660254037844; P->C_y = 1.; P->A = 0.; P->B = 0.30396355092701331433; ENDENTRY(setup(P)) ENTRY0(wag6); P->C_x = P->C_y = 0.94745; P->A = 0.; P->B = 0.30396355092701331433; ENDENTRY(setup(P)) ENTRY0(putp1); P->C_x = 1.89490; P->C_y = 0.94745; P->A = -0.5; P->B = 0.30396355092701331433; ENDENTRY(setup(P)) therion/extern/proj4/PJ_crast.c0000664000175000017500000000126511137333530015465 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(crast, "Craster Parabolic (Putnins P4)") "\n\tPCyl., Sph."; #define XM 0.97720502380583984317 #define RXM 1.02332670794648848847 #define YM 3.06998012383946546542 #define RYM 0.32573500793527994772 #define THIRD 0.333333333333333333 FORWARD(s_forward); /* spheroid */ lp.phi *= THIRD; xy.x = XM * lp.lam * (2. * cos(lp.phi + lp.phi) - 1.); xy.y = YM * sin(lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = 3. * asin(xy.y * RYM); lp.lam = xy.x * RXM / (2. * cos((lp.phi + lp.phi) * THIRD) - 1); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(crast) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_ell_set.c0000664000175000017500000000621111137333556016104 0ustar useruser/* set ellipsoid parameters a and es */ #include #include #define SIXTH .1666666666666666667 /* 1/6 */ #define RA4 .04722222222222222222 /* 17/360 */ #define RA6 .02215608465608465608 /* 67/3024 */ #define RV4 .06944444444444444444 /* 5/72 */ #define RV6 .04243827160493827160 /* 55/1296 */ int /* initialize geographic shape parameters */ pj_ell_set(paralist *pl, double *a, double *es) { int i; double b=0.0, e; char *name; paralist *start = 0, *curr; /* check for varying forms of ellipsoid input */ *a = *es = 0.; /* R takes precedence */ if (pj_param(pl, "tR").i) *a = pj_param(pl, "dR").f; else { /* probable elliptical figure */ /* check if ellps present and temporarily append its values to pl */ if (name = pj_param(pl, "sellps").s) { char *s; for (start = pl; start && start->next ; start = start->next) ; curr = start; for (i = 0; (s = pj_ellps[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_errno = -9; return 1; } curr = curr->next = pj_mkparam(pj_ellps[i].major); curr = curr->next = pj_mkparam(pj_ellps[i].ell); } *a = pj_param(pl, "da").f; if (pj_param(pl, "tes").i) /* eccentricity squared */ *es = pj_param(pl, "des").f; else if (pj_param(pl, "te").i) { /* eccentricity */ e = pj_param(pl, "de").f; *es = e * e; } else if (pj_param(pl, "trf").i) { /* recip flattening */ *es = pj_param(pl, "drf").f; if (!*es) { pj_errno = -10; goto bomb; } *es = 1./ *es; *es = *es * (2. - *es); } else if (pj_param(pl, "tf").i) { /* flattening */ *es = pj_param(pl, "df").f; *es = *es * (2. - *es); } else if (pj_param(pl, "tb").i) { /* minor axis */ b = pj_param(pl, "db").f; *es = 1. - (b * b) / (*a * *a); } /* else *es == 0. and sphere of radius *a */ if (!b) b = *a * sqrt(1. - *es); /* following options turn ellipsoid into equivalent sphere */ if (pj_param(pl, "bR_A").i) { /* sphere--area of ellipsoid */ *a *= 1. - *es * (SIXTH + *es * (RA4 + *es * RA6)); *es = 0.; } else if (pj_param(pl, "bR_V").i) { /* sphere--vol. of ellipsoid */ *a *= 1. - *es * (SIXTH + *es * (RV4 + *es * RV6)); *es = 0.; } else if (pj_param(pl, "bR_a").i) { /* sphere--arithmetic mean */ *a = .5 * (*a + b); *es = 0.; } else if (pj_param(pl, "bR_g").i) { /* sphere--geometric mean */ *a = sqrt(*a * b); *es = 0.; } else if (pj_param(pl, "bR_h").i) { /* sphere--harmonic mean */ *a = 2. * *a * b / (*a + b); *es = 0.; } else if ((i = pj_param(pl, "tR_lat_a").i) || /* sphere--arith. */ pj_param(pl, "tR_lat_g").i) { /* or geom. mean at latitude */ double tmp; tmp = sin(pj_param(pl, i ? "rR_lat_a" : "rR_lat_g").f); if (fabs(tmp) > HALFPI) { pj_errno = -11; goto bomb; } tmp = 1. - *es * tmp * tmp; *a *= i ? .5 * (1. - *es + tmp) / ( tmp * sqrt(tmp)) : sqrt(1. - *es) / tmp; *es = 0.; } bomb: if (start) { /* clean up temporary extension of list */ pj_dalloc(start->next->next); pj_dalloc(start->next); start->next = 0; } if (pj_errno) return 1; } /* some remaining checks */ if (*es < 0.) { pj_errno = -12; return 1; } if (*a <= 0.) { pj_errno = -13; return 1; } return 0; } therion/extern/proj4/PJ_bipc.c0000664000175000017500000000620311137333504015264 0ustar useruser#define PROJ_PARMS__ \ int noskew; #define PJ_LIB__ # include PROJ_HEAD(bipc, "Bipolar conic of western hemisphere") "\n\tConic Sph."; # define EPS 1e-10 # define EPS10 1e-10 # define ONEEPS 1.000000001 # define NITER 10 # define lamB -.34894976726250681539 # define n .63055844881274687180 # define F 1.89724742567461030582 # define Azab .81650043674686363166 # define Azba 1.82261843856185925133 # define T 1.27246578267089012270 # define rhoc 1.20709121521568721927 # define cAzc .69691523038678375519 # define sAzc .71715351331143607555 # define C45 .70710678118654752469 # define S45 .70710678118654752410 # define C20 .93969262078590838411 # define S20 -.34202014332566873287 # define R110 1.91986217719376253360 # define R104 1.81514242207410275904 FORWARD(s_forward); /* spheroid */ double cphi, sphi, tphi, t, al, Az, z, Av, cdlam, sdlam, r; int tag; cphi = cos(lp.phi); sphi = sin(lp.phi); cdlam = cos(sdlam = lamB - lp.lam); sdlam = sin(sdlam); if (fabs(fabs(lp.phi) - HALFPI) < EPS10) { Az = lp.phi < 0. ? PI : 0.; tphi = HUGE_VAL; } else { tphi = sphi / cphi; Az = atan2(sdlam , C45 * (tphi - cdlam)); } if( (tag = (Az > Azba)) ) { cdlam = cos(sdlam = lp.lam + R110); sdlam = sin(sdlam); z = S20 * sphi + C20 * cphi * cdlam; if (fabs(z) > 1.) { if (fabs(z) > ONEEPS) F_ERROR else z = z < 0. ? -1. : 1.; } else z = acos(z); if (tphi != HUGE_VAL) Az = atan2(sdlam, (C20 * tphi - S20 * cdlam)); Av = Azab; xy.y = rhoc; } else { z = S45 * (sphi + cphi * cdlam); if (fabs(z) > 1.) { if (fabs(z) > ONEEPS) F_ERROR else z = z < 0. ? -1. : 1.; } else z = acos(z); Av = Azba; xy.y = -rhoc; } if (z < 0.) F_ERROR; r = F * (t = pow(tan(.5 * z), n)); if ((al = .5 * (R104 - z)) < 0.) F_ERROR; al = (t + pow(al, n)) / T; if (fabs(al) > 1.) { if (fabs(al) > ONEEPS) F_ERROR else al = al < 0. ? -1. : 1.; } else al = acos(al); if (fabs(t = n * (Av - Az)) < al) r /= cos(al + (tag ? t : -t)); xy.x = r * sin(t); xy.y += (tag ? -r : r) * cos(t); if (P->noskew) { t = xy.x; xy.x = -xy.x * cAzc - xy.y * sAzc; xy.y = -xy.y * cAzc + t * sAzc; } return (xy); } INVERSE(s_inverse); /* spheroid */ double t, r, rp, rl, al, z, fAz, Az, s, c, Av; int neg, i; if (P->noskew) { t = xy.x; xy.x = -xy.x * cAzc + xy.y * sAzc; xy.y = -xy.y * cAzc - t * sAzc; } if( (neg = (xy.x < 0.)) ) { xy.y = rhoc - xy.y; s = S20; c = C20; Av = Azab; } else { xy.y += rhoc; s = S45; c = C45; Av = Azba; } rl = rp = r = hypot(xy.x, xy.y); fAz = fabs(Az = atan2(xy.x, xy.y)); for (i = NITER; i ; --i) { z = 2. * atan(pow(r / F,1 / n)); al = acos((pow(tan(.5 * z), n) + pow(tan(.5 * (R104 - z)), n)) / T); if (fAz < al) r = rp * cos(al + (neg ? Az : -Az)); if (fabs(rl - r) < EPS) break; rl = r; } if (! i) I_ERROR; Az = Av - Az / n; lp.phi = asin(s * cos(z) + c * sin(z) * cos(Az)); lp.lam = atan2(sin(Az), c / tan(z) - s * cos(Az)); if (neg) lp.lam -= R110; else lp.lam = lamB - lp.lam; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(bipc) P->noskew = pj_param(P->params, "bns").i; P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/PJ_robin.c0000664000175000017500000000657511137333772015503 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(robin, "Robinson") "\n\tPCyl., Sph."; #define V(C,z) (C.c0 + z * (C.c1 + z * (C.c2 + z * C.c3))) #define DV(C,z) (C.c1 + z * (C.c2 + C.c2 + z * 3. * C.c3)) /* note: following terms based upon 5 deg. intervals in degrees. */ static struct COEFS { float c0, c1, c2, c3; } X[] = { 1, -5.67239e-12, -7.15511e-05, 3.11028e-06, 0.9986, -0.000482241, -2.4897e-05, -1.33094e-06, 0.9954, -0.000831031, -4.4861e-05, -9.86588e-07, 0.99, -0.00135363, -5.96598e-05, 3.67749e-06, 0.9822, -0.00167442, -4.4975e-06, -5.72394e-06, 0.973, -0.00214869, -9.03565e-05, 1.88767e-08, 0.96, -0.00305084, -9.00732e-05, 1.64869e-06, 0.9427, -0.00382792, -6.53428e-05, -2.61493e-06, 0.9216, -0.00467747, -0.000104566, 4.8122e-06, 0.8962, -0.00536222, -3.23834e-05, -5.43445e-06, 0.8679, -0.00609364, -0.0001139, 3.32521e-06, 0.835, -0.00698325, -6.40219e-05, 9.34582e-07, 0.7986, -0.00755337, -5.00038e-05, 9.35532e-07, 0.7597, -0.00798325, -3.59716e-05, -2.27604e-06, 0.7186, -0.00851366, -7.0112e-05, -8.63072e-06, 0.6732, -0.00986209, -0.000199572, 1.91978e-05, 0.6213, -0.010418, 8.83948e-05, 6.24031e-06, 0.5722, -0.00906601, 0.000181999, 6.24033e-06, 0.5322, 0.,0.,0. }, Y[] = { 0, 0.0124, 3.72529e-10, 1.15484e-09, 0.062, 0.0124001, 1.76951e-08, -5.92321e-09, 0.124, 0.0123998, -7.09668e-08, 2.25753e-08, 0.186, 0.0124008, 2.66917e-07, -8.44523e-08, 0.248, 0.0123971, -9.99682e-07, 3.15569e-07, 0.31, 0.0124108, 3.73349e-06, -1.1779e-06, 0.372, 0.0123598, -1.3935e-05, 4.39588e-06, 0.434, 0.0125501, 5.20034e-05, -1.00051e-05, 0.4968, 0.0123198, -9.80735e-05, 9.22397e-06, 0.5571, 0.0120308, 4.02857e-05, -5.2901e-06, 0.6176, 0.0120369, -3.90662e-05, 7.36117e-07, 0.6769, 0.0117015, -2.80246e-05, -8.54283e-07, 0.7346, 0.0113572, -4.08389e-05, -5.18524e-07, 0.7903, 0.0109099, -4.86169e-05, -1.0718e-06, 0.8435, 0.0103433, -6.46934e-05, 5.36384e-09, 0.8936, 0.00969679, -6.46129e-05, -8.54894e-06, 0.9394, 0.00840949, -0.000192847, -4.21023e-06, 0.9761, 0.00616525, -0.000256001, -4.21021e-06, 1., 0.,0.,0 }; #define FXC 0.8487 #define FYC 1.3523 #define C1 11.45915590261646417544 #define RC1 0.08726646259971647884 #define NODES 18 #define ONEEPS 1.000001 #define EPS 1e-8 FORWARD(s_forward); /* spheroid */ int i; double dphi; i = floor((dphi = fabs(lp.phi)) * C1); if (i >= NODES) i = NODES - 1; dphi = RAD_TO_DEG * (dphi - RC1 * i); xy.x = V(X[i], dphi) * FXC * lp.lam; xy.y = V(Y[i], dphi) * FYC; if (lp.phi < 0.) xy.y = -xy.y; return (xy); } INVERSE(s_inverse); /* spheroid */ int i; double t, t1; struct COEFS T; lp.lam = xy.x / FXC; lp.phi = fabs(xy.y / FYC); if (lp.phi >= 1.) { /* simple pathologic cases */ if (lp.phi > ONEEPS) I_ERROR else { lp.phi = xy.y < 0. ? -HALFPI : HALFPI; lp.lam /= X[NODES].c0; } } else { /* general problem */ /* in Y space, reduce to table interval */ for (i = floor(lp.phi * NODES);;) { if (Y[i].c0 > lp.phi) --i; else if (Y[i+1].c0 <= lp.phi) ++i; else break; } T = Y[i]; /* first guess, linear interp */ t = 5. * (lp.phi - T.c0)/(Y[i+1].c0 - T.c0); /* make into root */ T.c0 -= lp.phi; for (;;) { /* Newton-Raphson reduction */ t -= t1 = V(T,t) / DV(T,t); if (fabs(t1) < EPS) break; } lp.phi = (5 * i + t) * DEG_TO_RAD; if (xy.y < 0.) lp.phi = -lp.phi; lp.lam /= V(X[i], t); } return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(robin) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_fouc_s.c0000664000175000017500000000172511137333574015640 0ustar useruser#define PROJ_PARMS__ \ double n, n1; #define PJ_LIB__ #include PROJ_HEAD(fouc_s, "Foucaut Sinusoidal") "\n\tPCyl., Sph."; #define MAX_ITER 10 #define LOOP_TOL 1e-7 FORWARD(s_forward); /* spheroid */ double t; t = cos(lp.phi); xy.x = lp.lam * t / (P->n + P->n1 * t); xy.y = P->n * lp.phi + P->n1 * sin(lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ double V; int i; if (P->n) { lp.phi = xy.y; for (i = MAX_ITER; i ; --i) { lp.phi -= V = (P->n * lp.phi + P->n1 * sin(lp.phi) - xy.y ) / (P->n + P->n1 * cos(lp.phi)); if (fabs(V) < LOOP_TOL) break; } if (!i) lp.phi = xy.y < 0. ? -HALFPI : HALFPI; } else lp.phi = aasin(xy.y); V = cos(lp.phi); lp.lam = xy.x * (P->n + P->n1 * V) / V; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(fouc_s) P->n = pj_param(P->params, "dn").f; if (P->n < 0. || P->n > 1.) E_ERROR(-99) P->n1 = 1. - P->n; P->es = 0; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_hatano.c0000664000175000017500000000251111137333624015622 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(hatano, "Hatano Asymmetrical Equal Area") "\n\tPCyl, Sph."; #define NITER 20 #define EPS 1e-7 #define ONETOL 1.000001 #define CN 2.67595 #define CS 2.43763 #define RCN 0.37369906014686373063 #define RCS 0.41023453108141924738 #define FYCN 1.75859 #define FYCS 1.93052 #define RYCN 0.56863737426006061674 #define RYCS 0.51799515156538134803 #define FXC 0.85 #define RXC 1.17647058823529411764 FORWARD(s_forward); /* spheroid */ double th1, c; int i; c = sin(lp.phi) * (lp.phi < 0. ? CS : CN); for (i = NITER; i; --i) { lp.phi -= th1 = (lp.phi + sin(lp.phi) - c) / (1. + cos(lp.phi)); if (fabs(th1) < EPS) break; } xy.x = FXC * lp.lam * cos(lp.phi *= .5); xy.y = sin(lp.phi) * (lp.phi < 0. ? FYCS : FYCN); return (xy); } INVERSE(s_inverse); /* spheroid */ double th; th = xy.y * ( xy.y < 0. ? RYCS : RYCN); if (fabs(th) > 1.) if (fabs(th) > ONETOL) I_ERROR else th = th > 0. ? HALFPI : - HALFPI; else th = asin(th); lp.lam = RXC * xy.x / cos(th); th += th; lp.phi = (th + sin(th)) * (xy.y < 0. ? RCS : RCN); if (fabs(lp.phi) > 1.) if (fabs(lp.phi) > ONETOL) I_ERROR else lp.phi = lp.phi > 0. ? HALFPI : - HALFPI; else lp.phi = asin(lp.phi); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(hatano) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_chamb.c0000664000175000017500000000633411137333524015430 0ustar userusertypedef struct { double r, Az; } VECT; #define PROJ_PARMS__ \ struct { /* control point data */ \ double phi, lam; \ double cosphi, sinphi; \ VECT v; \ XY p; \ double Az; \ } c[3]; \ XY p; \ double beta_0, beta_1, beta_2; #define PJ_LIB__ #include PROJ_HEAD(chamb, "Chamberlin Trimetric") "\n\tMisc Sph, no inv." "\n\tlat_1= lon_1= lat_2= lon_2= lat_3= lon_3="; #include #define THIRD 0.333333333333333333 #define TOL 1e-9 static VECT /* distance and azimuth from point 1 to point 2 */ vect(double dphi, double c1, double s1, double c2, double s2, double dlam) { VECT v; double cdl, dp, dl; cdl = cos(dlam); if (fabs(dphi) > 1. || fabs(dlam) > 1.) v.r = aacos(s1 * s2 + c1 * c2 * cdl); else { /* more accurate for smaller distances */ dp = sin(.5 * dphi); dl = sin(.5 * dlam); v.r = 2. * aasin(sqrt(dp * dp + c1 * c2 * dl * dl)); } if (fabs(v.r) > TOL) v.Az = atan2(c2 * sin(dlam), c1 * s2 - s1 * c2 * cdl); else v.r = v.Az = 0.; return v; } static double /* law of cosines */ lc(double b,double c,double a) { return aacos(.5 * (b * b + c * c - a * a) / (b * c)); } FORWARD(s_forward); /* spheroid */ double sinphi, cosphi, a; VECT v[3]; int i, j; sinphi = sin(lp.phi); cosphi = cos(lp.phi); for (i = 0; i < 3; ++i) { /* dist/azimiths from control */ v[i] = vect(lp.phi - P->c[i].phi, P->c[i].cosphi, P->c[i].sinphi, cosphi, sinphi, lp.lam - P->c[i].lam); if ( ! v[i].r) break; v[i].Az = adjlon(v[i].Az - P->c[i].v.Az); } if (i < 3) /* current point at control point */ xy = P->c[i].p; else { /* point mean of intersepts */ xy = P->p; for (i = 0; i < 3; ++i) { j = i == 2 ? 0 : i + 1; a = lc(P->c[i].v.r, v[i].r, v[j].r); if (v[i].Az < 0.) a = -a; if (! i) { /* coord comp unique to each arc */ xy.x += v[i].r * cos(a); xy.y -= v[i].r * sin(a); } else if (i == 1) { a = P->beta_1 - a; xy.x -= v[i].r * cos(a); xy.y -= v[i].r * sin(a); } else { a = P->beta_2 - a; xy.x += v[i].r * cos(a); xy.y += v[i].r * sin(a); } } xy.x *= THIRD; /* mean of arc intercepts */ xy.y *= THIRD; } return xy; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(chamb) int i, j; char line[10]; for (i = 0; i < 3; ++i) { /* get control point locations */ (void)sprintf(line, "rlat_%d", i+1); P->c[i].phi = pj_param(P->params, line).f; (void)sprintf(line, "rlon_%d", i+1); P->c[i].lam = pj_param(P->params, line).f; P->c[i].lam = adjlon(P->c[i].lam - P->lam0); P->c[i].cosphi = cos(P->c[i].phi); P->c[i].sinphi = sin(P->c[i].phi); } for (i = 0; i < 3; ++i) { /* inter ctl pt. distances and azimuths */ j = i == 2 ? 0 : i + 1; P->c[i].v = vect(P->c[j].phi - P->c[i].phi, P->c[i].cosphi, P->c[i].sinphi, P->c[j].cosphi, P->c[j].sinphi, P->c[j].lam - P->c[i].lam); if (! P->c[i].v.r) E_ERROR(-25); /* co-linearity problem ignored for now */ } P->beta_0 = lc(P->c[0].v.r, P->c[2].v.r, P->c[1].v.r); P->beta_1 = lc(P->c[0].v.r, P->c[1].v.r, P->c[2].v.r); P->beta_2 = PI - P->beta_0; P->p.y = 2. * (P->c[0].p.y = P->c[1].p.y = P->c[2].v.r * sin(P->beta_0)); P->c[2].p.y = 0.; P->c[0].p.x = - (P->c[1].p.x = 0.5 * P->c[0].v.r); P->p.x = P->c[2].p.x = P->c[0].p.x + P->c[2].v.r * cos(P->beta_0); P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_strerrno.c0000664000175000017500000000532411137334010016321 0ustar useruser/* list of projection system pj_errno values */ #include "projects.h" #include #include #include static char * pj_err_list[] = { "no arguments in initialization list", /* -1 */ "no options found in 'init' file", /* -2 */ "no colon in init= string", /* -3 */ "projection not named", /* -4 */ "unknown projection id", /* -5 */ "effective eccentricity = 1.", /* -6 */ "unknown unit conversion id", /* -7 */ "invalid boolean param argument", /* -8 */ "unknown elliptical parameter name", /* -9 */ "reciprocal flattening (1/f) = 0", /* -10 */ "|radius reference latitude| > 90", /* -11 */ "squared eccentricity < 0", /* -12 */ "major axis or radius = 0 or not given", /* -13 */ "latitude or longitude exceeded limits", /* -14 */ "invalid x or y", /* -15 */ "improperly formed DMS value", /* -16 */ "non-convergent inverse meridinal dist", /* -17 */ "non-convergent inverse phi2", /* -18 */ "acos/asin: |arg| >1.+1e-14", /* -19 */ "tolerance condition error", /* -20 */ "conic lat_1 = -lat_2", /* -21 */ "lat_1 >= 90", /* -22 */ "lat_1 = 0", /* -23 */ "lat_ts >= 90", /* -24 */ "no distance between control points", /* -25 */ "projection not selected to be rotated", /* -26 */ "W <= 0 or M <= 0", /* -27 */ "lsat not in 1-5 range", /* -28 */ "path not in range", /* -29 */ "h <= 0", /* -30 */ "k <= 0", /* -31 */ "lat_0 = 0 or 90 or alpha = 90", /* -32 */ "lat_1=lat_2 or lat_1=0 or lat_2=90", /* -33 */ "elliptical usage required", /* -34 */ "invalid UTM zone number", /* -35 */ "arg(s) out of range for Tcheby eval", /* -36 */ "failed to find projection to be rotated", /* -37 */ "failed to load NAD27-83 correction file", /* -38 */ "both n & m must be spec'd and > 0", /* -39 */ "n <= 0, n > 1 or not specified", /* -40 */ "lat_1 or lat_2 not specified", /* -41 */ "|lat_1| == |lat_2|", /* -42 */ "lat_0 is pi/2 from mean lat", /* -43 */ "unparseable coordinate system definition", /* -44 */ "geocentric transformation missing z or ellps", /* -45 */ "unknown prime meridian conversion id", /* -46 */ }; char * pj_strerrno(int err) { static char note[50]; if (err > 0) #ifdef HAVE_STRERROR return strerror(err); #else { sprintf(note,"no system list, errno: %d\n", err); return note; } #endif else if (err < 0) { int adjusted_err = - err - 1; if (adjusted_err < (sizeof(pj_err_list) / sizeof(char *))) return(pj_err_list[adjusted_err]); else { sprintf( note, "invalid projection system error (%d)", err ); return note; } } else return NULL; } therion/extern/proj4/PJ_lask.c0000664000175000017500000000127211137333644015307 0ustar useruser#define PROJ_PARMS__ #define PJ_LIB__ #include PROJ_HEAD(lask, "Laskowski") "\n\tMisc Sph, no inv."; #define a10 0.975534 #define a12 -0.119161 #define a32 -0.0143059 #define a14 -0.0547009 #define b01 1.00384 #define b21 0.0802894 #define b03 0.0998909 #define b41 0.000199025 #define b23 -0.0285500 #define b05 -0.0491032 FORWARD(s_forward); /* sphere */ double l2, p2; l2 = lp.lam * lp.lam; p2 = lp.phi * lp.phi; xy.x = lp.lam * (a10 + p2 * (a12 + l2 * a32 + p2 * a14)); xy.y = lp.phi * (b01 + l2 * (b21 + p2 * b23 + l2 * b41) + p2 * (b03 + p2 * b05)); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(lask) P->fwd = s_forward; P->inv = 0; P->es = 0.; ENDENTRY(P) therion/extern/proj4/pj_factors.c0000664000175000017500000000462511137333570016121 0ustar useruser/* projection scale factors */ #define PJ_LIB__ #include #include #ifndef DEFAULT_H #define DEFAULT_H 1e-5 /* radian default for numeric h */ #endif #define EPS 1.0e-12 int pj_factors(LP lp, PJ *P, double h, struct FACTORS *fac) { struct DERIVS der; double cosphi, t, n, r; /* check for forward and latitude or longitude overange */ if ((t = fabs(lp.phi)-HALFPI) > EPS || fabs(lp.lam) > 10.) { pj_errno = -14; return 1; } else { /* proceed */ errno = pj_errno = 0; if (h < EPS) h = DEFAULT_H; if (fabs(lp.phi) > (HALFPI - h)) /* adjust to value around pi/2 where derived still exists*/ lp.phi = lp.phi < 0. ? (-HALFPI+h) : (HALFPI-h); else if (P->geoc) lp.phi = atan(P->rone_es * tan(lp.phi)); lp.lam -= P->lam0; /* compute del lp.lam */ if (!P->over) lp.lam = adjlon(lp.lam); /* adjust del longitude */ if (P->spc) /* get what projection analytic values */ P->spc(lp, P, fac); if (((fac->code & (IS_ANAL_XL_YL+IS_ANAL_XP_YP)) != (IS_ANAL_XL_YL+IS_ANAL_XP_YP)) && pj_deriv(lp, h, P, &der)) return 1; if (!(fac->code & IS_ANAL_XL_YL)) { fac->der.x_l = der.x_l; fac->der.y_l = der.y_l; } if (!(fac->code & IS_ANAL_XP_YP)) { fac->der.x_p = der.x_p; fac->der.y_p = der.y_p; } cosphi = cos(lp.phi); if (!(fac->code & IS_ANAL_HK)) { fac->h = hypot(fac->der.x_p, fac->der.y_p); fac->k = hypot(fac->der.x_l, fac->der.y_l) / cosphi; if (P->es) { t = sin(lp.phi); t = 1. - P->es * t * t; n = sqrt(t); fac->h *= t * n / P->one_es; fac->k *= n; r = t * t / P->one_es; } else r = 1.; } else if (P->es) { r = sin(lp.phi); r = 1. - P->es * r * r; r = r * r / P->one_es; } else r = 1.; /* convergence */ if (!(fac->code & IS_ANAL_CONV)) { fac->conv = - atan2(fac->der.y_l, fac->der.x_l); if (fac->code & IS_ANAL_XL_YL) fac->code |= IS_ANAL_CONV; } /* areal scale factor */ fac->s = (fac->der.y_p * fac->der.x_l - fac->der.x_p * fac->der.y_l) * r / cosphi; /* meridian-parallel angle theta prime */ fac->thetap = aasin(fac->s / (fac->h * fac->k)); /* Tissot ellips axis */ t = fac->k * fac->k + fac->h * fac->h; fac->a = sqrt(t + 2. * fac->s); t = (t = t - 2. * fac->s) <= 0. ? 0. : sqrt(t); fac->b = 0.5 * (fac->a - t); fac->a = 0.5 * (fac->a + t); /* omega */ fac->omega = 2. * aasin((fac->a - fac->b)/(fac->a + fac->b)); } return 0; } therion/extern/proj4/PJ_nsper.c0000664000175000017500000000625511137333722015507 0ustar useruser#define PROJ_PARMS__ \ double height; \ double sinph0; \ double cosph0; \ double p; \ double rp; \ double pn1; \ double pfact; \ double h; \ double cg; \ double sg; \ double sw; \ double cw; \ int mode; \ int tilt; #define PJ_LIB__ #include PROJ_HEAD(nsper, "Near-sided perspective") "\n\tAzi, Sph\n\th="; PROJ_HEAD(tpers, "Tilted perspective") "\n\tAzi, Sph\n\ttilt= azi= h="; # define EPS10 1.e-10 # define N_POLE 0 # define S_POLE 1 # define EQUIT 2 # define OBLIQ 3 FORWARD(s_forward); /* spheroid */ double coslam, cosphi, sinphi; sinphi = sin(lp.phi); cosphi = cos(lp.phi); coslam = cos(lp.lam); switch (P->mode) { case OBLIQ: xy.y = P->sinph0 * sinphi + P->cosph0 * cosphi * coslam; break; case EQUIT: xy.y = cosphi * coslam; break; case S_POLE: xy.y = - sinphi; break; case N_POLE: xy.y = sinphi; break; } if (xy.y < P->rp) F_ERROR; xy.y = P->pn1 / (P->p - xy.y); xy.x = xy.y * cosphi * sin(lp.lam); switch (P->mode) { case OBLIQ: xy.y *= (P->cosph0 * sinphi - P->sinph0 * cosphi * coslam); break; case EQUIT: xy.y *= sinphi; break; case N_POLE: coslam = - coslam; case S_POLE: xy.y *= cosphi * coslam; break; } if (P->tilt) { double yt, ba; yt = xy.y * P->cg + xy.x * P->sg; ba = 1. / (yt * P->sw * P->h + P->cw); xy.x = (xy.x * P->cg - xy.y * P->sg) * P->cw * ba; xy.y = yt * ba; } return (xy); } INVERSE(s_inverse); /* spheroid */ double rh, cosz, sinz; if (P->tilt) { double bm, bq, yt; yt = 1./(P->pn1 - xy.y * P->sw); bm = P->pn1 * xy.x * yt; bq = P->pn1 * xy.y * P->cw * yt; xy.x = bm * P->cg + bq * P->sg; xy.y = bq * P->cg - bm * P->sg; } rh = hypot(xy.x, xy.y); if ((sinz = 1. - rh * rh * P->pfact) < 0.) I_ERROR; sinz = (P->p - sqrt(sinz)) / (P->pn1 / rh + rh / P->pn1); cosz = sqrt(1. - sinz * sinz); if (fabs(rh) <= EPS10) { lp.lam = 0.; lp.phi = P->phi0; } else { switch (P->mode) { case OBLIQ: lp.phi = asin(cosz * P->sinph0 + xy.y * sinz * P->cosph0 / rh); xy.y = (cosz - P->sinph0 * sin(lp.phi)) * rh; xy.x *= sinz * P->cosph0; break; case EQUIT: lp.phi = asin(xy.y * sinz / rh); xy.y = cosz * rh; xy.x *= sinz; break; case N_POLE: lp.phi = asin(cosz); xy.y = -xy.y; break; case S_POLE: lp.phi = - asin(cosz); break; } lp.lam = atan2(xy.x, xy.y); } return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { if ((P->height = pj_param(P->params, "dh").f) <= 0.) E_ERROR(-30); if (fabs(fabs(P->phi0) - HALFPI) < EPS10) P->mode = P->phi0 < 0. ? S_POLE : N_POLE; else if (fabs(P->phi0) < EPS10) P->mode = EQUIT; else { P->mode = OBLIQ; P->sinph0 = sin(P->phi0); P->cosph0 = cos(P->phi0); } P->pn1 = P->height / P->a; /* normalize by radius */ P->p = 1. + P->pn1; P->rp = 1. / P->p; P->h = 1. / P->pn1; P->pfact = (P->p + 1.) * P->h; P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; return P; } ENTRY0(nsper) P->tilt = 0; ENDENTRY(setup(P)) ENTRY0(tpers) double omega, gamma; omega = pj_param(P->params, "dtilt").f * DEG_TO_RAD; gamma = pj_param(P->params, "dazi").f * DEG_TO_RAD; P->tilt = 1; P->cg = cos(gamma); P->sg = sin(gamma); P->cw = cos(omega); P->sw = sin(omega); ENDENTRY(setup(P)) therion/extern/proj4/nad_cvt.c0000664000175000017500000000430111137333470015373 0ustar useruser#define PJ_LIB__ #include #define MAX_TRY 9 #define TOL 1e-12 LP nad_cvt(LP in, int inverse, struct CTABLE *ct) { LP t, tb; if (in.lam == HUGE_VAL) return in; /* normalize input to ll origin */ tb = in; tb.lam -= ct->ll.lam; tb.phi -= ct->ll.phi; tb.lam = adjlon(tb.lam - PI) + PI; t = nad_intr(tb, ct); if (inverse) { LP del, dif; int i = MAX_TRY; if (t.lam == HUGE_VAL) return t; t.lam = tb.lam + t.lam; t.phi = tb.phi - t.phi; do { del = nad_intr(t, ct); /* This case used to return failure, but I have changed it to return the first order approximation of the inverse shift. This avoids cases where the grid shift *into* this grid came from another grid. While we aren't returning optimally correct results I feel a close result in this case is better than no result. NFW To demonstrate use -112.5839956 49.4914451 against the NTv2 grid shift file from Canada. */ if (del.lam == HUGE_VAL) { if( getenv( "PROJ_DEBUG" ) != NULL ) fprintf( stderr, "Inverse grid shift iteration failed, presumably at grid edge.\n" "Using first approximation.\n" ); /* return del */; break; } t.lam -= dif.lam = t.lam - del.lam - tb.lam; t.phi -= dif.phi = t.phi + del.phi - tb.phi; } while (i-- && fabs(dif.lam) > TOL && fabs(dif.phi) > TOL); if (i < 0) { if( getenv( "PROJ_DEBUG" ) != NULL ) fprintf( stderr, "Inverse grid shift iterator failed to converge.\n" ); t.lam = t.phi = HUGE_VAL; return t; } in.lam = adjlon(t.lam + ct->ll.lam); in.phi = t.phi + ct->ll.phi; } else { if (t.lam == HUGE_VAL) in = t; else { in.lam -= t.lam; in.phi += t.phi; } } return in; } therion/extern/proj4/PJ_mod_ster.c0000664000175000017500000001133511137333702016165 0ustar useruser/* based upon Snyder and Linck, USGS-NMD */ #define PROJ_PARMS__ \ COMPLEX *zcoeff; \ double cchio, schio; \ int n; #define PJ_LIB__ #include PROJ_HEAD(mil_os, "Miller Oblated Stereographic") "\n\tAzi(mod)"; PROJ_HEAD(lee_os, "Lee Oblated Stereographic") "\n\tAzi(mod)"; PROJ_HEAD(gs48, "Mod. Stererographics of 48 U.S.") "\n\tAzi(mod)"; PROJ_HEAD(alsk, "Mod. Stererographics of Alaska") "\n\tAzi(mod)"; PROJ_HEAD(gs50, "Mod. Stererographics of 50 U.S.") "\n\tAzi(mod)"; #define EPSLN 1e-10 FORWARD(e_forward); /* ellipsoid */ double sinlon, coslon, esphi, chi, schi, cchi, s; COMPLEX p; sinlon = sin(lp.lam); coslon = cos(lp.lam); esphi = P->e * sin(lp.phi); chi = 2. * atan(tan((HALFPI + lp.phi) * .5) * pow((1. - esphi) / (1. + esphi), P->e * .5)) - HALFPI; schi = sin(chi); cchi = cos(chi); s = 2. / (1. + P->schio * schi + P->cchio * cchi * coslon); p.r = s * cchi * sinlon; p.i = s * (P->cchio * schi - P->schio * cchi * coslon); p = pj_zpoly1(p, P->zcoeff, P->n); xy.x = p.r; xy.y = p.i; return xy; } INVERSE(e_inverse); /* ellipsoid */ int nn; COMPLEX p, fxy, fpxy, dp; double den, rh, z, sinz, cosz, chi, phi, dphi, esphi; p.r = xy.x; p.i = xy.y; for (nn = 20; nn ;--nn) { fxy = pj_zpolyd1(p, P->zcoeff, P->n, &fpxy); fxy.r -= xy.x; fxy.i -= xy.y; den = fpxy.r * fpxy.r + fpxy.i * fpxy.i; dp.r = -(fxy.r * fpxy.r + fxy.i * fpxy.i) / den; dp.i = -(fxy.i * fpxy.r - fxy.r * fpxy.i) / den; p.r += dp.r; p.i += dp.i; if ((fabs(dp.r) + fabs(dp.i)) <= EPSLN) break; } if (nn) { rh = hypot(p.r, p.i); z = 2. * atan(.5 * rh); sinz = sin(z); cosz = cos(z); lp.lam = P->lam0; if (fabs(rh) <= EPSLN) { lp.phi = P->phi0; return lp; } chi = aasin(cosz * P->schio + p.i * sinz * P->cchio / rh); phi = chi; for (nn = 20; nn ;--nn) { esphi = P->e * sin(phi); dphi = 2. * atan(tan((HALFPI + chi) * .5) * pow((1. + esphi) / (1. - esphi), P->e * .5)) - HALFPI - phi; phi += dphi; if (fabs(dphi) <= EPSLN) break; } } if (nn) { lp.phi = phi; lp.lam = atan2(p.r * sinz, rh * P->cchio * cosz - p.i * P->schio * sinz); } else lp.lam = lp.phi = HUGE_VAL; return lp; } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { /* general initialization */ double esphi, chio; if (P->es) { esphi = P->e * sin(P->phi0); chio = 2. * atan(tan((HALFPI + P->phi0) * .5) * pow((1. - esphi) / (1. + esphi), P->e * .5)) - HALFPI; } else chio = P->phi0; P->schio = sin(chio); P->cchio = cos(chio); P->inv = e_inverse; P->fwd = e_forward; return P; } ENTRY0(mil_os) static COMPLEX /* Miller Oblated Stereographic */ AB[] = { {0.924500, 0.}, {0., 0.}, {0.019430, 0.} }; P->n = 2; P->lam0 = DEG_TO_RAD * 20.; P->phi0 = DEG_TO_RAD * 18.; P->zcoeff = AB; P->es = 0.; ENDENTRY(setup(P)) ENTRY0(lee_os) static COMPLEX /* Lee Oblated Stereographic */ AB[] = { {0.721316, 0.}, {0., 0.}, {-0.0088162, -0.00617325} }; P->n = 2; P->lam0 = DEG_TO_RAD * -165.; P->phi0 = DEG_TO_RAD * -10.; P->zcoeff = AB; P->es = 0.; ENDENTRY(setup(P)) ENTRY0(gs48) static COMPLEX /* 48 United States */ AB[] = { {0.98879, 0.}, {0., 0.}, {-0.050909, 0.}, {0., 0.}, {0.075528, 0.} }; P->n = 4; P->lam0 = DEG_TO_RAD * -96.; P->phi0 = DEG_TO_RAD * -39.; P->zcoeff = AB; P->es = 0.; P->a = 6370997.; ENDENTRY(setup(P)) ENTRY0(alsk) static COMPLEX ABe[] = { /* Alaska ellipsoid */ {.9945303, 0.}, {.0052083, -.0027404}, {.0072721, .0048181}, {-.0151089, -.1932526}, {.0642675, -.1381226}, {.3582802, -.2884586}}, ABs[] = { /* Alaska sphere */ {.9972523, 0.}, {.0052513, -.0041175}, {.0074606, .0048125}, {-.0153783, -.1968253}, {.0636871, -.1408027}, {.3660976, -.2937382} }; P->n = 5; P->lam0 = DEG_TO_RAD * -152.; P->phi0 = DEG_TO_RAD * 64.; if (P->es) { /* fixed ellipsoid/sphere */ P->zcoeff = ABe; P->a = 6378206.4; P->e = sqrt(P->es = 0.00676866); } else { P->zcoeff = ABs; P->a = 6370997.; } ENDENTRY(setup(P)) ENTRY0(gs50) static COMPLEX ABe[] = { /* GS50 ellipsoid */ {.9827497, 0.}, {.0210669, .0053804}, {-.1031415, -.0571664}, {-.0323337, -.0322847}, {.0502303, .1211983}, {.0251805, .0895678}, {-.0012315, -.1416121}, {.0072202, -.1317091}, {-.0194029, .0759677}, {-.0210072, .0834037} }, ABs[] = { /* GS50 sphere */ {.9842990, 0.}, {.0211642, .0037608}, {-.1036018, -.0575102}, {-.0329095, -.0320119}, {.0499471, .1223335}, {.0260460, .0899805}, {.0007388, -.1435792}, {.0075848, -.1334108}, {-.0216473, .0776645}, {-.0225161, .0853673} }; P->n = 9; P->lam0 = DEG_TO_RAD * -120.; P->phi0 = DEG_TO_RAD * 45.; if (P->es) { /* fixed ellipsoid/sphere */ P->zcoeff = ABe; P->a = 6378206.4; P->e = sqrt(P->es = 0.00676866); } else { P->zcoeff = ABs; P->a = 6370997.; } ENDENTRY(setup(P)) therion/extern/proj4/PJ_gstmerc.c0000664000175000017500000000434311156465424016026 0ustar useruser#define PROJ_PARMS__ \ double lamc;\ double phic;\ double c;\ double n1;\ double n2;\ double XS;\ double YS; #define PJ_LIB__ # include PROJ_HEAD(gstmerc, "Gauss-Schreiber Transverse Mercator (aka Gauss-Laborde Reunion)") "\n\tCyl, Sph&Ell\n\tlat_0= lon_0= k_0="; FORWARD(s_forward); /* spheroid */ double L, Ls, sinLs1, Ls1; L= P->n1*lp.lam; Ls= P->c+P->n1*log(pj_tsfn(-1.0*lp.phi,-1.0*sin(lp.phi),P->e)); sinLs1= sin(L)/cosh(Ls); Ls1= log(pj_tsfn(-1.0*asin(sinLs1),0.0,0.0)); xy.x= (P->XS + P->n2*Ls1)*P->ra; xy.y= (P->YS + P->n2*atan(sinh(Ls)/cos(L)))*P->ra; /*fprintf(stderr,"fwd:\nL =%16.13f\nLs =%16.13f\nLs1 =%16.13f\nLP(%16.13f,%16.13f)=XY(%16.4f,%16.4f)\n",L,Ls,Ls1,lp.lam+P->lam0,lp.phi,(xy.x*P->a + P->x0)*P->to_meter,(xy.y*P->a + P->y0)*P->to_meter);*/ return (xy); } INVERSE(s_inverse); /* spheroid */ double L, LC, sinC; L= atan(sinh((xy.x*P->a - P->XS)/P->n2)/cos((xy.y*P->a - P->YS)/P->n2)); sinC= sin((xy.y*P->a - P->YS)/P->n2)/cosh((xy.x*P->a - P->XS)/P->n2); LC= log(pj_tsfn(-1.0*asin(sinC),0.0,0.0)); lp.lam= L/P->n1; lp.phi= -1.0*pj_phi2(exp((LC-P->c)/P->n1),P->e); /*fprintf(stderr,"inv:\nL =%16.13f\nsinC =%16.13f\nLC =%16.13f\nXY(%16.4f,%16.4f)=LP(%16.13f,%16.13f)\n",L,sinC,LC,((xy.x/P->ra)+P->x0)/P->to_meter,((xy.y/P->ra)+P->y0)/P->to_meter,lp.lam+P->lam0,lp.phi);*/ return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(gstmerc) P->lamc= P->lam0; P->n1= sqrt(1.0+P->es*pow(cos(P->phi0),4.0)/(1.0-P->es)); P->phic= asin(sin(P->phi0)/P->n1); P->c= log(pj_tsfn(-1.0*P->phic,0.0,0.0)) -P->n1*log(pj_tsfn(-1.0*P->phi0,-1.0*sin(P->phi0),P->e)); P->n2= P->k0*P->a*sqrt(1.0-P->es)/(1.0-P->es*sin(P->phi0)*sin(P->phi0)); P->XS= 0;/* -P->x0 */ P->YS= -1.0*P->n2*P->phic;/* -P->y0 */ P->inv= s_inverse; P->fwd= s_forward; /*fprintf(stderr,"a (m) =%16.4f\ne =%16.13f\nl0(rad)=%16.13f\np0(rad)=%16.13f\nk0 =%16.4f\nX0 (m)=%16.4f\nY0 (m)=%16.4f\n\nlC(rad)=%16.13f\npC(rad)=%16.13f\nc =%16.13f\nn1 =%16.13f\nn2 (m) =%16.4f\nXS (m) =%16.4f\nYS (m) =%16.4f\n", P->a, P->e, P->lam0, P->phi0, P->k0, P->x0, P->y0, P->lamc, P->phic, P->c, P->n1, P->n2, P->XS +P->x0, P->YS + P->y0);*/ ENDENTRY(P) therion/extern/proj4/pj_zpoly1.c0000664000175000017500000000201411137334070015700 0ustar useruser/* evaluate complex polynomial */ #include /* note: coefficients are always from C_1 to C_n ** i.e. C_0 == (0., 0) ** n should always be >= 1 though no checks are made */ COMPLEX pj_zpoly1(COMPLEX z, COMPLEX *C, int n) { COMPLEX a; double t; a = *(C += n); while (n-- > 0) { a.r = (--C)->r + z.r * (t = a.r) - z.i * a.i; a.i = C->i + z.r * a.i + z.i * t; } a.r = z.r * (t = a.r) - z.i * a.i; a.i = z.r * a.i + z.i * t; return a; } /* evaluate complex polynomial and derivative */ COMPLEX pj_zpolyd1(COMPLEX z, COMPLEX *C, int n, COMPLEX *der) { COMPLEX a, b; double t; int first = 1; a = *(C += n); while (n-- > 0) { if (first) { first = 0; b = a; } else { b.r = a.r + z.r * (t = b.r) - z.i * b.i; b.i = a.i + z.r * b.i + z.i * t; } a.r = (--C)->r + z.r * (t = a.r) - z.i * a.i; a.i = C->i + z.r * a.i + z.i * t; } b.r = a.r + z.r * (t = b.r) - z.i * b.i; b.i = a.i + z.r * b.i + z.i * t; a.r = z.r * (t = a.r) - z.i * a.i; a.i = z.r * a.i + z.i * t; *der = b; return a; } therion/extern/proj4/PJ_collg.c0000664000175000017500000000146011137333526015453 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(collg, "Collignon") "\n\tPCyl, Sph."; #define FXC 1.12837916709551257390 #define FYC 1.77245385090551602729 #define ONEEPS 1.0000001 FORWARD(s_forward); /* spheroid */ if ((xy.y = 1. - sin(lp.phi)) <= 0.) xy.y = 0.; else xy.y = sqrt(xy.y); xy.x = FXC * lp.lam * xy.y; xy.y = FYC * (1. - xy.y); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = xy.y / FYC - 1.; if (fabs(lp.phi = 1. - lp.phi * lp.phi) < 1.) lp.phi = asin(lp.phi); else if (fabs(lp.phi) > ONEEPS) I_ERROR else lp.phi = lp.phi < 0. ? -HALFPI : HALFPI; if ((lp.lam = 1. - sin(lp.phi)) <= 0.) lp.lam = 0.; else lp.lam = xy.x / (FXC * sqrt(lp.lam)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(collg) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/proj_config.h0000664000175000017500000000341411336504536016271 0ustar useruser/* src/proj_config.h. Generated from proj_config.h.in by configure. */ /* src/proj_config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if you have the header file. */ /* #undef HAVE_DLFCN_H */ /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Enabled for Java/JNI Support */ #define JNI_ENABLED 1 /* Name of package */ #define PACKAGE "proj" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "warmerdam@pobox.com" /* Define to the full name of this package. */ #define PACKAGE_NAME "PROJ.4 Projections" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PROJ.4 Projections 4.7.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "proj" /* Define to the version of this package. */ #define PACKAGE_VERSION "4.7.0" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "4.7.0" therion/extern/proj4/aasincos.c0000664000175000017500000000120511137333414015553 0ustar useruser/* arc sin, cosine, tan2 and sqrt that will NOT fail */ #include #define ONE_TOL 1.00000000000001 #define TOL 0.000000001 #define ATOL 1e-50 double aasin(double v) { double av; if ((av = fabs(v)) >= 1.) { if (av > ONE_TOL) pj_errno = -19; return (v < 0. ? -HALFPI : HALFPI); } return asin(v); } double aacos(double v) { double av; if ((av = fabs(v)) >= 1.) { if (av > ONE_TOL) pj_errno = -19; return (v < 0. ? PI : 0.); } return acos(v); } double asqrt(double v) { return ((v <= 0) ? 0. : sqrt(v)); } double aatan2(double n, double d) { return ((fabs(n) < ATOL && fabs(d) < ATOL) ? 0. : atan2(n,d)); } therion/extern/proj4/pj_geocent.c0000664000175000017500000000416411130502664016075 0ustar useruser/****************************************************************************** * $Id: pj_geocent.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Stub projection for geocentric. The transformation isn't * really done here since this code is 2D. The real transformation * is handled by pj_transform.c. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2002, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include PJ_CVSID("$Id: pj_geocent.c 1504 2009-01-06 02:11:57Z warmerdam $"); PROJ_HEAD(geocent, "Geocentric") "\n\t"; FORWARD(forward); xy.x = lp.lam; xy.y = lp.phi; return xy; } INVERSE(inverse); lp.phi = xy.y; lp.lam = xy.x; return lp; } FREEUP; if (P) pj_dalloc(P); } ENTRY0(geocent) P->is_geocent = 1; P->x0 = 0.0; P->y0 = 0.0; P->inv = inverse; P->fwd = forward; ENDENTRY(P) therion/extern/proj4/nad_list.h0000664000175000017500000000037711076404756015600 0ustar useruser/* projection list for program nad2nad */ PROJ_HEAD(lcc, "Lambert Conformal Conic") PROJ_HEAD(omerc, "Oblique Mercator") PROJ_HEAD(poly, "Polyconic (American)") PROJ_HEAD(tmerc, "Transverse Mercator") PROJ_HEAD(utm, "Universal Transverse Mercator (UTM)") therion/extern/proj4/PJ_gins8.c0000664000175000017500000000074711137333604015407 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(gins8, "Ginsburg VIII (TsNIIGAiK)") "\n\tPCyl, Sph., no inv."; #define Cl 0.000952426 #define Cp 0.162388 #define C12 0.08333333333333333 FORWARD(s_forward); /* spheroid */ double t = lp.phi * lp.phi; xy.y = lp.phi * (1. + t * C12); xy.x = lp.lam * (1. - Cp * t); t = lp.lam * lp.lam; xy.x *= (0.87 - Cl * t * t); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(gins8) P->es = 0.; P->inv = 0; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_oea.c0000664000175000017500000000316111137333732015116 0ustar useruser#define PROJ_PARMS__ \ double theta; \ double m, n; \ double two_r_m, two_r_n, rm, rn, hm, hn; \ double cp0, sp0; #define PJ_LIB__ #include PROJ_HEAD(oea, "Oblated Equal Area") "\n\tMisc Sph\n\tn= m= theta="; FORWARD(s_forward); /* sphere */ double Az, M, N, cp, sp, cl, shz; cp = cos(lp.phi); sp = sin(lp.phi); cl = cos(lp.lam); Az = aatan2(cp * sin(lp.lam), P->cp0 * sp - P->sp0 * cp * cl) + P->theta; shz = sin(0.5 * aacos(P->sp0 * sp + P->cp0 * cp * cl)); M = aasin(shz * sin(Az)); N = aasin(shz * cos(Az) * cos(M) / cos(M * P->two_r_m)); xy.y = P->n * sin(N * P->two_r_n); xy.x = P->m * sin(M * P->two_r_m) * cos(N) / cos(N * P->two_r_n); return (xy); } INVERSE(s_inverse); /* sphere */ double N, M, xp, yp, z, Az, cz, sz, cAz; N = P->hn * aasin(xy.y * P->rn); M = P->hm * aasin(xy.x * P->rm * cos(N * P->two_r_n) / cos(N)); xp = 2. * sin(M); yp = 2. * sin(N) * cos(M * P->two_r_m) / cos(M); cAz = cos(Az = aatan2(xp, yp) - P->theta); z = 2. * aasin(0.5 * hypot(xp, yp)); sz = sin(z); cz = cos(z); lp.phi = aasin(P->sp0 * cz + P->cp0 * sz * cAz); lp.lam = aatan2(sz * sin(Az), P->cp0 * cz - P->sp0 * sz * cAz); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(oea) if (((P->n = pj_param(P->params, "dn").f) <= 0.) || ((P->m = pj_param(P->params, "dm").f) <= 0.)) E_ERROR(-39) else { P->theta = pj_param(P->params, "rtheta").f; P->sp0 = sin(P->phi0); P->cp0 = cos(P->phi0); P->rn = 1./ P->n; P->rm = 1./ P->m; P->two_r_n = 2. * P->rn; P->two_r_m = 2. * P->rm; P->hm = 0.5 * P->m; P->hn = 0.5 * P->n; P->fwd = s_forward; P->inv = s_inverse; P->es = 0.; } ENDENTRY(P) therion/extern/proj4/PJ_hammer.c0000664000175000017500000000140011137333620015611 0ustar useruser#define PROJ_PARMS__ \ double w; \ double m, rm; #define PJ_LIB__ # include PROJ_HEAD(hammer, "Hammer & Eckert-Greifendorff") "\n\tMisc Sph, no inv.\n\tW= M="; FORWARD(s_forward); /* spheroid */ double cosphi, d; d = sqrt(2./(1. + (cosphi = cos(lp.phi)) * cos(lp.lam *= P->w))); xy.x = P->m * d * cosphi * sin(lp.lam); xy.y = P->rm * d * sin(lp.phi); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(hammer) if (pj_param(P->params, "tW").i) { if ((P->w = fabs(pj_param(P->params, "dW").f)) <= 0.) E_ERROR(-27); } else P->w = .5; if (pj_param(P->params, "tM").i) { if ((P->m = fabs(pj_param(P->params, "dM").f)) <= 0.) E_ERROR(-27); } else P->m = 1.; P->rm = 1. / P->m; P->m /= P->w; P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_eck4.c0000664000175000017500000000213711137333550015200 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(eck4, "Eckert IV") "\n\tPCyl, Sph."; #define C_x .42223820031577120149 #define C_y 1.32650042817700232218 #define RC_y .75386330736002178205 #define C_p 3.57079632679489661922 #define RC_p .28004957675577868795 #define EPS 1e-7 #define NITER 6 FORWARD(s_forward); /* spheroid */ double p, V, s, c; int i; p = C_p * sin(lp.phi); V = lp.phi * lp.phi; lp.phi *= 0.895168 + V * ( 0.0218849 + V * 0.00826809 ); for (i = NITER; i ; --i) { c = cos(lp.phi); s = sin(lp.phi); lp.phi -= V = (lp.phi + s * (c + 2.) - p) / (1. + c * (c + 2.) - s * s); if (fabs(V) < EPS) break; } if (!i) { xy.x = C_x * lp.lam; xy.y = lp.phi < 0. ? -C_y : C_y; } else { xy.x = C_x * lp.lam * (1. + cos(lp.phi)); xy.y = C_y * sin(lp.phi); } return (xy); } INVERSE(s_inverse); /* spheroid */ double c; lp.phi = aasin(xy.y / C_y); lp.lam = xy.x / (C_x * (1. + (c = cos(lp.phi)))); lp.phi = aasin((lp.phi + sin(lp.phi) * (c + 2.)) / C_p); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(eck4); P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/proj_mdist.c0000664000175000017500000000633411130502664016133 0ustar useruser/* ** libproj -- library of cartographic projections ** ** Copyright (c) 2003, 2006 Gerald I. Evenden */ static const char LIBPROJ_ID[] = "$Id: proj_mdist.c 1504 2009-01-06 02:11:57Z warmerdam $"; /* ** Permission is hereby granted, free of charge, to any person obtaining ** a copy of this software and associated documentation files (the ** "Software"), to deal in the Software without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Software, and to ** permit persons to whom the Software is furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be ** included in all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Computes distance from equator along the meridian to latitude phi ** and inverse on unit ellipsoid. ** Precision commensurate with double precision. */ #define PROJ_LIB__ #include #define MAX_ITER 20 #define TOL 1e-14 struct MDIST { int nb; double es; double E; double b[1]; }; #define B ((struct MDIST *)b) void * proj_mdist_ini(double es) { double numf, numfi, twon1, denf, denfi, ens, T, twon; double den, El, Es; double E[MAX_ITER]; struct MDIST *b; int i, j; /* generate E(e^2) and its terms E[] */ ens = es; numf = twon1 = denfi = 1.; denf = 1.; twon = 4.; Es = El = E[0] = 1.; for (i = 1; i < MAX_ITER ; ++i) { numf *= (twon1 * twon1); den = twon * denf * denf * twon1; T = numf/den; Es -= (E[i] = T * ens); ens *= es; twon *= 4.; denf *= ++denfi; twon1 += 2.; if (Es == El) /* jump out if no change */ break; El = Es; } if ((b = (struct MDIST *)malloc(sizeof(struct MDIST)+ (i*sizeof(double)))) == NULL) return(NULL); b->nb = i - 1; b->es = es; b->E = Es; /* generate b_n coefficients--note: collapse with prefix ratios */ b->b[0] = Es = 1. - Es; numf = denf = 1.; numfi = 2.; denfi = 3.; for (j = 1; j < i; ++j) { Es -= E[j]; numf *= numfi; denf *= denfi; b->b[j] = Es * numf / denf; numfi += 2.; denfi += 2.; } return (b); } double proj_mdist(double phi, double sphi, double cphi, const void *b) { double sc, sum, sphi2, D; int i; sc = sphi * cphi; sphi2 = sphi * sphi; D = phi * B->E - B->es * sc / sqrt(1. - B->es * sphi2); sum = B->b[i = B->nb]; while (i) sum = B->b[--i] + sphi2 * sum; return(D + sc * sum); } double proj_inv_mdist(double dist, const void *b) { double s, t, phi, k; int i; k = 1./(1.- B->es); i = MAX_ITER; phi = dist; while ( i-- ) { s = sin(phi); t = 1. - B->es * s * s; phi -= t = (proj_mdist(phi, s, cos(phi), b) - dist) * (t * sqrt(t)) * k; if (fabs(t) < TOL) /* that is no change */ return phi; } /* convergence failed */ pj_errno = -17; return phi; } therion/extern/proj4/PJ_laea.c0000664000175000017500000001173611137333636015266 0ustar useruser#define PROJ_PARMS__ \ double sinb1; \ double cosb1; \ double xmf; \ double ymf; \ double mmf; \ double qp; \ double dd; \ double rq; \ double *apa; \ int mode; #define PJ_LIB__ #include PROJ_HEAD(laea, "Lambert Azimuthal Equal Area") "\n\tAzi, Sph&Ell"; #define sinph0 P->sinb1 #define cosph0 P->cosb1 #define EPS10 1.e-10 #define NITER 20 #define CONV 1.e-10 #define N_POLE 0 #define S_POLE 1 #define EQUIT 2 #define OBLIQ 3 FORWARD(e_forward); /* ellipsoid */ double coslam, sinlam, sinphi, q, sinb=0.0, cosb=0.0, b=0.0; coslam = cos(lp.lam); sinlam = sin(lp.lam); sinphi = sin(lp.phi); q = pj_qsfn(sinphi, P->e, P->one_es); if (P->mode == OBLIQ || P->mode == EQUIT) { sinb = q / P->qp; cosb = sqrt(1. - sinb * sinb); } switch (P->mode) { case OBLIQ: b = 1. + P->sinb1 * sinb + P->cosb1 * cosb * coslam; break; case EQUIT: b = 1. + cosb * coslam; break; case N_POLE: b = HALFPI + lp.phi; q = P->qp - q; break; case S_POLE: b = lp.phi - HALFPI; q = P->qp + q; break; } if (fabs(b) < EPS10) F_ERROR; switch (P->mode) { case OBLIQ: xy.y = P->ymf * ( b = sqrt(2. / b) ) * (P->cosb1 * sinb - P->sinb1 * cosb * coslam); goto eqcon; break; case EQUIT: xy.y = (b = sqrt(2. / (1. + cosb * coslam))) * sinb * P->ymf; eqcon: xy.x = P->xmf * b * cosb * sinlam; break; case N_POLE: case S_POLE: if (q >= 0.) { xy.x = (b = sqrt(q)) * sinlam; xy.y = coslam * (P->mode == S_POLE ? b : -b); } else xy.x = xy.y = 0.; break; } return (xy); } FORWARD(s_forward); /* spheroid */ double coslam, cosphi, sinphi; sinphi = sin(lp.phi); cosphi = cos(lp.phi); coslam = cos(lp.lam); switch (P->mode) { case EQUIT: xy.y = 1. + cosphi * coslam; goto oblcon; case OBLIQ: xy.y = 1. + sinph0 * sinphi + cosph0 * cosphi * coslam; oblcon: if (xy.y <= EPS10) F_ERROR; xy.x = (xy.y = sqrt(2. / xy.y)) * cosphi * sin(lp.lam); xy.y *= P->mode == EQUIT ? sinphi : cosph0 * sinphi - sinph0 * cosphi * coslam; break; case N_POLE: coslam = -coslam; case S_POLE: if (fabs(lp.phi + P->phi0) < EPS10) F_ERROR; xy.y = FORTPI - lp.phi * .5; xy.y = 2. * (P->mode == S_POLE ? cos(xy.y) : sin(xy.y)); xy.x = xy.y * sin(lp.lam); xy.y *= coslam; break; } return (xy); } INVERSE(e_inverse); /* ellipsoid */ double cCe, sCe, q, rho, ab=0.0; switch (P->mode) { case EQUIT: case OBLIQ: if ((rho = hypot(xy.x /= P->dd, xy.y *= P->dd)) < EPS10) { lp.lam = 0.; lp.phi = P->phi0; return (lp); } cCe = cos(sCe = 2. * asin(.5 * rho / P->rq)); xy.x *= (sCe = sin(sCe)); if (P->mode == OBLIQ) { q = P->qp * (ab = cCe * P->sinb1 + xy.y * sCe * P->cosb1 / rho); xy.y = rho * P->cosb1 * cCe - xy.y * P->sinb1 * sCe; } else { q = P->qp * (ab = xy.y * sCe / rho); xy.y = rho * cCe; } break; case N_POLE: xy.y = -xy.y; case S_POLE: if (!(q = (xy.x * xy.x + xy.y * xy.y)) ) { lp.lam = 0.; lp.phi = P->phi0; return (lp); } /* q = P->qp - q; */ ab = 1. - q / P->qp; if (P->mode == S_POLE) ab = - ab; break; } lp.lam = atan2(xy.x, xy.y); lp.phi = pj_authlat(asin(ab), P->apa); return (lp); } INVERSE(s_inverse); /* spheroid */ double cosz=0.0, rh, sinz=0.0; rh = hypot(xy.x, xy.y); if ((lp.phi = rh * .5 ) > 1.) I_ERROR; lp.phi = 2. * asin(lp.phi); if (P->mode == OBLIQ || P->mode == EQUIT) { sinz = sin(lp.phi); cosz = cos(lp.phi); } switch (P->mode) { case EQUIT: lp.phi = fabs(rh) <= EPS10 ? 0. : asin(xy.y * sinz / rh); xy.x *= sinz; xy.y = cosz * rh; break; case OBLIQ: lp.phi = fabs(rh) <= EPS10 ? P->phi0 : asin(cosz * sinph0 + xy.y * sinz * cosph0 / rh); xy.x *= sinz * cosph0; xy.y = (cosz - sin(lp.phi) * sinph0) * rh; break; case N_POLE: xy.y = -xy.y; lp.phi = HALFPI - lp.phi; break; case S_POLE: lp.phi -= HALFPI; break; } lp.lam = (xy.y == 0. && (P->mode == EQUIT || P->mode == OBLIQ)) ? 0. : atan2(xy.x, xy.y); return (lp); } FREEUP; if (P) { if (P->apa) pj_dalloc(P->apa); pj_dalloc(P); } } ENTRY1(laea,apa) double t; if (fabs((t = fabs(P->phi0)) - HALFPI) < EPS10) P->mode = P->phi0 < 0. ? S_POLE : N_POLE; else if (fabs(t) < EPS10) P->mode = EQUIT; else P->mode = OBLIQ; if (P->es) { double sinphi; P->e = sqrt(P->es); P->qp = pj_qsfn(1., P->e, P->one_es); P->mmf = .5 / (1. - P->es); P->apa = pj_authset(P->es); switch (P->mode) { case N_POLE: case S_POLE: P->dd = 1.; break; case EQUIT: P->dd = 1. / (P->rq = sqrt(.5 * P->qp)); P->xmf = 1.; P->ymf = .5 * P->qp; break; case OBLIQ: P->rq = sqrt(.5 * P->qp); sinphi = sin(P->phi0); P->sinb1 = pj_qsfn(sinphi, P->e, P->one_es) / P->qp; P->cosb1 = sqrt(1. - P->sinb1 * P->sinb1); P->dd = cos(P->phi0) / (sqrt(1. - P->es * sinphi * sinphi) * P->rq * P->cosb1); P->ymf = (P->xmf = P->rq) / P->dd; P->xmf *= P->dd; break; } P->inv = e_inverse; P->fwd = e_forward; } else { if (P->mode == OBLIQ) { sinph0 = sin(P->phi0); cosph0 = cos(P->phi0); } P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/proj4/pj_apply_gridshift.c0000664000175000017500000001256311130502664017643 0ustar useruser/****************************************************************************** * $Id: pj_apply_gridshift.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Apply datum shifts based on grid shift files (normally NAD27 to * NAD83 or the reverse). This module is responsible for keeping * a list of loaded grids, and calling with each one that is * allowed for a given datum (expressed as the nadgrids= parameter). * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2000, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include /************************************************************************/ /* pj_apply_gridshift() */ /************************************************************************/ int pj_apply_gridshift( const char *nadgrids, int inverse, long point_count, int point_offset, double *x, double *y, double *z ) { int grid_count = 0; PJ_GRIDINFO **tables; int i; int debug_flag = getenv( "PROJ_DEBUG" ) != NULL; static int debug_count = 0; pj_errno = 0; tables = pj_gridlist_from_nadgrids( nadgrids, &grid_count); if( tables == NULL || grid_count == 0 ) return pj_errno; for( i = 0; i < point_count; i++ ) { long io = i * point_offset; LP input, output; int itable; input.phi = y[io]; input.lam = x[io]; output.phi = HUGE_VAL; output.lam = HUGE_VAL; /* keep trying till we find a table that works */ for( itable = 0; itable < grid_count; itable++ ) { PJ_GRIDINFO *gi = tables[itable]; struct CTABLE *ct = gi->ct; /* skip tables that don't match our point at all. */ if( ct->ll.phi > input.phi || ct->ll.lam > input.lam || ct->ll.phi + (ct->lim.phi-1) * ct->del.phi < input.phi || ct->ll.lam + (ct->lim.lam-1) * ct->del.lam < input.lam ) continue; /* If we have child nodes, check to see if any of them apply. */ if( gi->child != NULL ) { PJ_GRIDINFO *child; for( child = gi->child; child != NULL; child = child->next ) { struct CTABLE *ct1 = child->ct; if( ct1->ll.phi > input.phi || ct1->ll.lam > input.lam || ct1->ll.phi+(ct1->lim.phi-1)*ct1->del.phi < input.phi || ct1->ll.lam+(ct1->lim.lam-1)*ct1->del.lam < input.lam) continue; break; } /* we found a more refined child node to use */ if( child != NULL ) { gi = child; ct = child->ct; } } /* load the grid shift info if we don't have it. */ if( ct->cvs == NULL && !pj_gridinfo_load( gi ) ) { pj_errno = -38; return pj_errno; } output = nad_cvt( input, inverse, ct ); if( output.lam != HUGE_VAL ) { if( debug_flag && debug_count++ < 20 ) fprintf( stderr, "pj_apply_gridshift(): used %s\n", ct->id ); break; } } if( output.lam == HUGE_VAL ) { if( debug_flag ) { fprintf( stderr, "pj_apply_gridshift(): failed to find a grid shift table for\n" " location (%.7fdW,%.7fdN)\n", x[io] * RAD_TO_DEG, y[io] * RAD_TO_DEG ); fprintf( stderr, " tried: %s\n", nadgrids ); } pj_errno = -38; return pj_errno; } else { y[io] = output.phi; x[io] = output.lam; } } return 0; } therion/extern/proj4/PJ_mill.c0000664000175000017500000000066011137333676015317 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(mill, "Miller Cylindrical") "\n\tCyl, Sph"; FORWARD(s_forward); /* spheroid */ xy.x = lp.lam; xy.y = log(tan(FORTPI + lp.phi * .4)) * 1.25; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.lam = xy.x; lp.phi = 2.5 * (atan(exp(.8 * xy.y)) - FORTPI); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(mill) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_nell_h.c0000664000175000017500000000134211137333716015614 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(nell_h, "Nell-Hammer") "\n\tPCyl., Sph."; #define NITER 9 #define EPS 1e-7 FORWARD(s_forward); /* spheroid */ xy.x = 0.5 * lp.lam * (1. + cos(lp.phi)); xy.y = 2.0 * (lp.phi - tan(0.5 *lp.phi)); return (xy); } INVERSE(s_inverse); /* spheroid */ double V, c, p; int i; p = 0.5 * xy.y; for (i = NITER; i ; --i) { c = cos(0.5 * lp.phi); lp.phi -= V = (lp.phi - tan(lp.phi/2) - p)/(1. - 0.5/(c*c)); if (fabs(V) < EPS) break; } if (!i) { lp.phi = p < 0. ? -HALFPI : HALFPI; lp.lam = 2. * xy.x; } else lp.lam = 2. * xy.x / (1. + cos(lp.phi)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(nell_h) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/pj_mutex.c0000664000175000017500000001707311256470376015633 0ustar useruser/****************************************************************************** * $Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Mutex (thread lock) functions. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2009, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* projects.h and windows.h conflict - avoid this! */ #ifndef _WIN32 #include PJ_CVSID("$Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $"); #else #include #endif #ifdef _WIN32 # define MUTEX_win32 #endif #if !defined(MUTEX_stub) && !defined(MUTEX_pthread) && !defined(MUTEX_win32) # define MUTEX_stub #endif static void pj_init_lock(); /************************************************************************/ /* ==================================================================== */ /* stub mutex implementation */ /* ==================================================================== */ /************************************************************************/ #ifdef MUTEX_stub /************************************************************************/ /* pj_acquire_lock() */ /* */ /* Acquire the PROJ.4 lock. */ /************************************************************************/ void pj_acquire_lock() { } /************************************************************************/ /* pj_release_lock() */ /* */ /* Release the PROJ.4 lock. */ /************************************************************************/ void pj_release_lock() { } /************************************************************************/ /* pj_cleanup_lock() */ /************************************************************************/ void pj_cleanup_lock() { } /************************************************************************/ /* pj_init_lock() */ /************************************************************************/ static void pj_init_lock() { } #endif // def MUTEX_stub /************************************************************************/ /* ==================================================================== */ /* pthread mutex implementation */ /* ==================================================================== */ /************************************************************************/ #ifdef MUTEX_pthread #include "pthread.h" static pthread_mutex_t core_lock = PTHREAD_MUTEX_INITIALIZER; /************************************************************************/ /* pj_acquire_lock() */ /* */ /* Acquire the PROJ.4 lock. */ /************************************************************************/ void pj_acquire_lock() { pthread_mutex_lock( &core_lock); } /************************************************************************/ /* pj_release_lock() */ /* */ /* Release the PROJ.4 lock. */ /************************************************************************/ void pj_release_lock() { pthread_mutex_unlock( &core_lock ); } /************************************************************************/ /* pj_cleanup_lock() */ /************************************************************************/ void pj_cleanup_lock() { } /************************************************************************/ /* pj_init_lock() */ /************************************************************************/ static void pj_init_lock() { } #endif // def MUTEX_pthread /************************************************************************/ /* ==================================================================== */ /* win32 mutex implementation */ /* ==================================================================== */ /************************************************************************/ #ifdef MUTEX_win32 #include static HANDLE mutex_lock = NULL; /************************************************************************/ /* pj_acquire_lock() */ /* */ /* Acquire the PROJ.4 lock. */ /************************************************************************/ void pj_acquire_lock() { if( mutex_lock == NULL ) pj_init_lock(); WaitForSingleObject( mutex_lock, INFINITE ); } /************************************************************************/ /* pj_release_lock() */ /* */ /* Release the PROJ.4 lock. */ /************************************************************************/ void pj_release_lock() { if( mutex_lock == NULL ) pj_init_lock(); ReleaseMutex( mutex_lock ); } /************************************************************************/ /* pj_cleanup_lock() */ /************************************************************************/ void pj_cleanup_lock() { if( mutex_lock != NULL ) { CloseHandle( mutex_lock ); mutex_lock = NULL; } } /************************************************************************/ /* pj_init_lock() */ /************************************************************************/ static void pj_init_lock() { if( mutex_lock == NULL ) mutex_lock = CreateMutex( NULL, TRUE, NULL ); } #endif // def MUTEX_win32 therion/extern/proj4/PJ_cea.c0000664000175000017500000000245111137333520015076 0ustar useruser#define PROJ_PARMS__ \ double qp; \ double *apa; #define PJ_LIB__ # include PROJ_HEAD(cea, "Equal Area Cylindrical") "\n\tCyl, Sph&Ell\n\tlat_ts="; # define EPS 1e-10 FORWARD(e_forward); /* spheroid */ xy.x = P->k0 * lp.lam; xy.y = .5 * pj_qsfn(sin(lp.phi), P->e, P->one_es) / P->k0; return (xy); } FORWARD(s_forward); /* spheroid */ xy.x = P->k0 * lp.lam; xy.y = sin(lp.phi) / P->k0; return (xy); } INVERSE(e_inverse); /* spheroid */ lp.phi = pj_authlat(asin( 2. * xy.y * P->k0 / P->qp), P->apa); lp.lam = xy.x / P->k0; return (lp); } INVERSE(s_inverse); /* spheroid */ double t; if ((t = fabs(xy.y *= P->k0)) - EPS <= 1.) { if (t >= 1.) lp.phi = xy.y < 0. ? -HALFPI : HALFPI; else lp.phi = asin(xy.y); lp.lam = xy.x / P->k0; } else I_ERROR; return (lp); } FREEUP; if (P) { if (P->apa) pj_dalloc(P->apa); pj_dalloc(P); } } ENTRY1(cea, apa) double t; if (pj_param(P->params, "tlat_ts").i && (P->k0 = cos(t = pj_param(P->params, "rlat_ts").f)) < 0.) E_ERROR(-24) else t = 0.; if (P->es) { t = sin(t); P->k0 /= sqrt(1. - P->es * t * t); P->e = sqrt(P->es); if (!(P->apa = pj_authset(P->es))) E_ERROR_0; P->qp = pj_qsfn(1., P->e, P->one_es); P->inv = e_inverse; P->fwd = e_forward; } else { P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/proj4/pj_init.c0000664000175000017500000003136511256552744015434 0ustar useruser/****************************************************************************** * $Id: pj_init.c 1630 2009-09-24 02:14:06Z warmerdam $ * * Project: PROJ.4 * Purpose: Initialize projection object from string definition. Includes * pj_init(), pj_init_plus() and pj_free() function. * Author: Gerald Evenden, Frank Warmerdam * ****************************************************************************** * Copyright (c) 1995, Gerald Evenden * Copyright (c) 2002, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #define PJ_LIB__ #include #include #include #include #include PJ_CVSID("$Id: pj_init.c 1630 2009-09-24 02:14:06Z warmerdam $"); extern FILE *pj_open_lib(char *, char *); /************************************************************************/ /* get_opt() */ /************************************************************************/ static paralist * get_opt(paralist **start, FILE *fid, char *name, paralist *next) { char sword[302], *word = sword+1; int first = 1, len, c; len = strlen(name); *sword = 't'; while (fscanf(fid, "%300s", word) == 1) { if (*word == '#') /* skip comments */ while((c = fgetc(fid)) != EOF && c != '\n') ; else if (*word == '<') { /* control name */ if (first && !strncmp(name, word + 1, len) && word[len + 1] == '>') first = 0; else if (!first && *word == '<') { while((c = fgetc(fid)) != EOF && c != '\n') ; break; } } else if (!first && !pj_param(*start, sword).i) { /* don't default ellipse if datum, ellps or any earth model information is set. */ if( strncmp(word,"ellps=",6) != 0 || (!pj_param(*start, "tdatum").i && !pj_param(*start, "tellps").i && !pj_param(*start, "ta").i && !pj_param(*start, "tb").i && !pj_param(*start, "trf").i && !pj_param(*start, "tf").i) ) { next = next->next = pj_mkparam(word); } } } if (errno == 25) errno = 0; return next; } /************************************************************************/ /* get_defaults() */ /************************************************************************/ static paralist * get_defaults(paralist **start, paralist *next, char *name) { FILE *fid; if (fid = pj_open_lib("proj_def.dat", "rt")) { next = get_opt(start, fid, "general", next); rewind(fid); next = get_opt(start, fid, name, next); (void)fclose(fid); } if (errno) errno = 0; /* don't care if can't open file */ return next; } /************************************************************************/ /* get_init() */ /************************************************************************/ static paralist * get_init(paralist **start, paralist *next, char *name) { char fname[MAX_PATH_FILENAME+ID_TAG_MAX+3], *opt; FILE *fid; paralist *init_items = NULL; const paralist *orig_next = next; (void)strncpy(fname, name, MAX_PATH_FILENAME + ID_TAG_MAX + 1); /* ** Search for file/key pair in cache */ init_items = pj_search_initcache( name ); if( init_items != NULL ) { next->next = init_items; while( next->next != NULL ) next = next->next; return next; } /* ** Otherwise we try to open the file and search for it. */ if (opt = strrchr(fname, ':')) *opt++ = '\0'; else { pj_errno = -3; return(0); } if (fid = pj_open_lib(fname, "rt")) next = get_opt(start, fid, opt, next); else return(0); (void)fclose(fid); if (errno == 25) errno = 0; /* unknown problem with some sys errno<-25 */ /* ** If we seem to have gotten a result, insert it into the ** init file cache. */ if( next != NULL && next != orig_next ) pj_insert_initcache( name, orig_next->next ); return next; } /************************************************************************/ /* pj_init_plus() */ /* */ /* Same as pj_init() except it takes one argument string with */ /* individual arguments preceeded by '+', such as "+proj=utm */ /* +zone=11 +ellps=WGS84". */ /************************************************************************/ PJ * pj_init_plus( const char *definition ) { #define MAX_ARG 200 char *argv[MAX_ARG]; char *defn_copy; int argc = 0, i; PJ *result; /* make a copy that we can manipulate */ defn_copy = (char *) pj_malloc( strlen(definition)+1 ); strcpy( defn_copy, definition ); /* split into arguments based on '+' and trim white space */ for( i = 0; defn_copy[i] != '\0'; i++ ) { switch( defn_copy[i] ) { case '+': if( i == 0 || defn_copy[i-1] == '\0' ) { if( argc+1 == MAX_ARG ) { pj_errno = -44; return NULL; } argv[argc++] = defn_copy + i + 1; } break; case ' ': case '\t': case '\n': defn_copy[i] = '\0'; break; default: /* do nothing */; } } /* perform actual initialization */ result = pj_init( argc, argv ); pj_dalloc( defn_copy ); return result; } /************************************************************************/ /* pj_init() */ /* */ /* Main entry point for initialing a PJ projections */ /* definition. Note that the projection specific function is */ /* called to do the initial allocation so it can be created */ /* large enough to hold projection specific parameters. */ /************************************************************************/ PJ * pj_init(int argc, char **argv) { char *s, *name; paralist *start = NULL; PJ *(*proj)(PJ *); paralist *curr; int i; PJ *PIN = 0; const char *old_locale; errno = pj_errno = 0; start = NULL; old_locale = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC,"C"); /* put arguments into internal linked list */ if (argc <= 0) { pj_errno = -1; goto bum_call; } for (i = 0; i < argc; ++i) if (i) curr = curr->next = pj_mkparam(argv[i]); else start = curr = pj_mkparam(argv[i]); if (pj_errno) goto bum_call; /* check if +init present */ if (pj_param(start, "tinit").i) { paralist *last = curr; if (!(curr = get_init(&start, curr, pj_param(start, "sinit").s))) goto bum_call; if (curr == last) { pj_errno = -2; goto bum_call; } } /* find projection selection */ if (!(name = pj_param(start, "sproj").s)) { pj_errno = -4; goto bum_call; } for (i = 0; (s = pj_list[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_errno = -5; goto bum_call; } /* set defaults, unless inhibited */ if (!pj_param(start, "bno_defs").i) curr = get_defaults(&start, curr, name); proj = (PJ *(*)(PJ *)) pj_list[i].proj; /* allocate projection structure */ if (!(PIN = (*proj)(0))) goto bum_call; PIN->params = start; PIN->is_latlong = 0; PIN->is_geocent = 0; PIN->long_wrap_center = 0.0; /* set datum parameters */ if (pj_datum_set(start, PIN)) goto bum_call; /* set ellipsoid/sphere parameters */ if (pj_ell_set(start, &PIN->a, &PIN->es)) goto bum_call; PIN->a_orig = PIN->a; PIN->es_orig = PIN->es; PIN->e = sqrt(PIN->es); PIN->ra = 1. / PIN->a; PIN->one_es = 1. - PIN->es; if (PIN->one_es == 0.) { pj_errno = -6; goto bum_call; } PIN->rone_es = 1./PIN->one_es; /* Now that we have ellipse information check for WGS84 datum */ if( PIN->datum_type == PJD_3PARAM && PIN->datum_params[0] == 0.0 && PIN->datum_params[1] == 0.0 && PIN->datum_params[2] == 0.0 && PIN->a == 6378137.0 && ABS(PIN->es - 0.006694379990) < 0.000000000050 )/*WGS84/GRS80*/ { PIN->datum_type = PJD_WGS84; } /* set PIN->geoc coordinate system */ PIN->geoc = (PIN->es && pj_param(start, "bgeoc").i); /* over-ranging flag */ PIN->over = pj_param(start, "bover").i; /* longitude center for wrapping */ PIN->long_wrap_center = pj_param(start, "rlon_wrap").f; /* central meridian */ PIN->lam0=pj_param(start, "rlon_0").f; /* central latitude */ PIN->phi0 = pj_param(start, "rlat_0").f; /* false easting and northing */ PIN->x0 = pj_param(start, "dx_0").f; PIN->y0 = pj_param(start, "dy_0").f; /* general scaling factor */ if (pj_param(start, "tk_0").i) PIN->k0 = pj_param(start, "dk_0").f; else if (pj_param(start, "tk").i) PIN->k0 = pj_param(start, "dk").f; else PIN->k0 = 1.; if (PIN->k0 <= 0.) { pj_errno = -31; goto bum_call; } /* set units */ s = 0; if (name = pj_param(start, "sunits").s) { for (i = 0; (s = pj_units[i].id) && strcmp(name, s) ; ++i) ; if (!s) { pj_errno = -7; goto bum_call; } s = pj_units[i].to_meter; } if (s || (s = pj_param(start, "sto_meter").s)) { PIN->to_meter = strtod(s, &s); if (*s == '/') /* ratio number */ PIN->to_meter /= strtod(++s, 0); PIN->fr_meter = 1. / PIN->to_meter; } else PIN->to_meter = PIN->fr_meter = 1.; /* prime meridian */ s = 0; if (name = pj_param(start, "spm").s) { const char *value = NULL; char *next_str = NULL; for (i = 0; pj_prime_meridians[i].id != NULL; ++i ) { if( strcmp(name,pj_prime_meridians[i].id) == 0 ) { value = pj_prime_meridians[i].defn; break; } } if( value == NULL && (dmstor(name,&next_str) != 0.0 || *name == '0') && *next_str == '\0' ) value = name; if (!value) { pj_errno = -46; goto bum_call; } PIN->from_greenwich = dmstor(value,NULL); } else PIN->from_greenwich = 0.0; /* projection specific initialization */ if (!(PIN = (*proj)(PIN)) || errno || pj_errno) { bum_call: /* cleanup error return */ if (!pj_errno) pj_errno = errno; if (PIN) pj_free(PIN); else for ( ; start; start = curr) { curr = start->next; pj_dalloc(start); } PIN = 0; } setlocale(LC_NUMERIC,old_locale); return PIN; } /************************************************************************/ /* pj_free() */ /* */ /* This is the application callable entry point for destroying */ /* a projection definition. It does work generic to all */ /* projection types, and then calls the projection specific */ /* free function (P->pfree()) to do local work. This maps to */ /* the FREEUP code in the individual projection source files. */ /************************************************************************/ void pj_free(PJ *P) { if (P) { paralist *t = P->params, *n; /* free parameter list elements */ for (t = P->params; t; t = n) { n = t->next; pj_dalloc(t); } /* free projection parameters */ P->pfree(P); } } therion/extern/proj4/bchgen.c0000664000175000017500000000254511137333426015214 0ustar useruser/* generate double bivariate Chebychev polynomial */ #include int bchgen(projUV a, projUV b, int nu, int nv, projUV **f, projUV(*func)(projUV)) { int i, j, k; projUV arg, *t, bma, bpa, *c; double d, fac; bma.u = 0.5 * (b.u - a.u); bma.v = 0.5 * (b.v - a.v); bpa.u = 0.5 * (b.u + a.u); bpa.v = 0.5 * (b.v + a.v); for ( i = 0; i < nu; ++i) { arg.u = cos(PI * (i + 0.5) / nu) * bma.u + bpa.u; for ( j = 0; j < nv; ++j) { arg.v = cos(PI * (j + 0.5) / nv) * bma.v + bpa.v; f[i][j] = (*func)(arg); if ((f[i][j]).u == HUGE_VAL) return(1); } } if (!(c = (projUV *) vector1(nu, sizeof(projUV)))) return 1; fac = 2. / nu; for ( j = 0; j < nv ; ++j) { for ( i = 0; i < nu; ++i) { arg.u = arg.v = 0.; for (k = 0; k < nu; ++k) { d = cos(PI * i * (k + .5) / nu); arg.u += f[k][j].u * d; arg.v += f[k][j].v * d; } arg.u *= fac; arg.v *= fac; c[i] = arg; } for (i = 0; i < nu; ++i) f[i][j] = c[i]; } pj_dalloc(c); if (!(c = (projUV*) vector1(nv, sizeof(projUV)))) return 1; fac = 2. / nv; for ( i = 0; i < nu; ++i) { t = f[i]; for (j = 0; j < nv; ++j) { arg.u = arg.v = 0.; for (k = 0; k < nv; ++k) { d = cos(PI * j * (k + .5) / nv); arg.u += t[k].u * d; arg.v += t[k].v * d; } arg.u *= fac; arg.v *= fac; c[j] = arg; } f[i] = c; c = t; } pj_dalloc(c); return(0); } therion/extern/proj4/pj_ellps.c0000664000175000017500000000530111165201032015553 0ustar useruser/* definition of standard geoids */ #define PJ_ELLPS__ #include "projects.h" C_NAMESPACE_VAR struct PJ_ELLPS pj_ellps[] = { "MERIT", "a=6378137.0", "rf=298.257", "MERIT 1983", "SGS85", "a=6378136.0", "rf=298.257", "Soviet Geodetic System 85", "GRS80", "a=6378137.0", "rf=298.257222101", "GRS 1980(IUGG, 1980)", "IAU76", "a=6378140.0", "rf=298.257", "IAU 1976", "airy", "a=6377563.396", "b=6356256.910", "Airy 1830", "APL4.9", "a=6378137.0.", "rf=298.25", "Appl. Physics. 1965", "NWL9D", "a=6378145.0.", "rf=298.25", "Naval Weapons Lab., 1965", "mod_airy", "a=6377340.189", "b=6356034.446", "Modified Airy", "andrae", "a=6377104.43", "rf=300.0", "Andrae 1876 (Den., Iclnd.)", "aust_SA", "a=6378160.0", "rf=298.25", "Australian Natl & S. Amer. 1969", "GRS67", "a=6378160.0", "rf=298.2471674270", "GRS 67(IUGG 1967)", "bessel", "a=6377397.155", "rf=299.1528128", "Bessel 1841", "bess_nam", "a=6377483.865", "rf=299.1528128", "Bessel 1841 (Namibia)", "clrk66", "a=6378206.4", "b=6356583.8", "Clarke 1866", "clrk80", "a=6378249.145", "rf=293.4663", "Clarke 1880 mod.", "CPM", "a=6375738.7", "rf=334.29", "Comm. des Poids et Mesures 1799", "delmbr", "a=6376428.", "rf=311.5", "Delambre 1810 (Belgium)", "engelis", "a=6378136.05", "rf=298.2566", "Engelis 1985", "evrst30", "a=6377276.345", "rf=300.8017", "Everest 1830", "evrst48", "a=6377304.063", "rf=300.8017", "Everest 1948", "evrst56", "a=6377301.243", "rf=300.8017", "Everest 1956", "evrst69", "a=6377295.664", "rf=300.8017", "Everest 1969", "evrstSS", "a=6377298.556", "rf=300.8017", "Everest (Sabah & Sarawak)", "fschr60", "a=6378166.", "rf=298.3", "Fischer (Mercury Datum) 1960", "fschr60m", "a=6378155.", "rf=298.3", "Modified Fischer 1960", "fschr68", "a=6378150.", "rf=298.3", "Fischer 1968", "helmert", "a=6378200.", "rf=298.3", "Helmert 1906", "hough", "a=6378270.0", "rf=297.", "Hough", "intl", "a=6378388.0", "rf=297.", "International 1909 (Hayford)", "krass", "a=6378245.0", "rf=298.3", "Krassovsky, 1942", "kaula", "a=6378163.", "rf=298.24", "Kaula 1961", "lerch", "a=6378139.", "rf=298.257", "Lerch 1979", "mprts", "a=6397300.", "rf=191.", "Maupertius 1738", "new_intl", "a=6378157.5", "b=6356772.2", "New International 1967", "plessis", "a=6376523.", "b=6355863.", "Plessis 1817 (France)", "SEasia", "a=6378155.0", "b=6356773.3205", "Southeast Asia", "walbeck", "a=6376896.0", "b=6355834.8467", "Walbeck", "WGS60", "a=6378165.0", "rf=298.3", "WGS 60", "WGS66", "a=6378145.0", "rf=298.25", "WGS 66", "WGS72", "a=6378135.0", "rf=298.26", "WGS 72", "WGS84", "a=6378137.0", "rf=298.257223563", "WGS 84", "sphere", "a=6370997.0", "b=6370997.0", "Normal Sphere (r=6370997)", 0,0,0,0 }; struct PJ_ELLPS *pj_get_ellps_ref() { return pj_ellps; } therion/extern/proj4/PJ_gall.c0000664000175000017500000000105311137333602015263 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(gall, "Gall (Gall Stereographic)") "\n\tCyl, Sph"; #define YF 1.70710678118654752440 #define XF 0.70710678118654752440 #define RYF 0.58578643762690495119 #define RXF 1.41421356237309504880 FORWARD(s_forward); /* spheroid */ xy.x = XF * lp.lam; xy.y = YF * tan(.5 * lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.lam = RXF * xy.x; lp.phi = 2. * atan(xy.y * RYF); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(gall) P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/PJ_ocea.c0000664000175000017500000000363311137333726015270 0ustar useruser#define PROJ_PARMS__ \ double rok; \ double rtk; \ double sinphi; \ double cosphi; \ double singam; \ double cosgam; #define PJ_LIB__ #include PROJ_HEAD(ocea, "Oblique Cylindrical Equal Area") "\n\tCyl, Sph" "lonc= alpha= or\n\tlat_1= lat_2= lon_1= lon_2="; FORWARD(s_forward); /* spheroid */ double t; xy.y = sin(lp.lam); /* xy.x = atan2((tan(lp.phi) * P->cosphi + P->sinphi * xy.y) , cos(lp.lam)); */ t = cos(lp.lam); xy.x = atan((tan(lp.phi) * P->cosphi + P->sinphi * xy.y) / t); if (t < 0.) xy.x += PI; xy.x *= P->rtk; xy.y = P->rok * (P->sinphi * sin(lp.phi) - P->cosphi * cos(lp.phi) * xy.y); return (xy); } INVERSE(s_inverse); /* spheroid */ double t, s; xy.y /= P->rok; xy.x /= P->rtk; t = sqrt(1. - xy.y * xy.y); lp.phi = asin(xy.y * P->sinphi + t * P->cosphi * (s = sin(xy.x))); lp.lam = atan2(t * P->sinphi * s - xy.y * P->cosphi, t * cos(xy.x)); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(ocea) double phi_0=0.0, phi_1, phi_2, lam_1, lam_2, lonz, alpha; P->rok = P->a / P->k0; P->rtk = P->a * P->k0; if ( pj_param(P->params, "talpha").i) { alpha = pj_param(P->params, "ralpha").f; lonz = pj_param(P->params, "rlonc").f; P->singam = atan(-cos(alpha)/(-sin(phi_0) * sin(alpha))) + lonz; P->sinphi = asin(cos(phi_0) * sin(alpha)); } else { phi_1 = pj_param(P->params, "rlat_1").f; phi_2 = pj_param(P->params, "rlat_2").f; lam_1 = pj_param(P->params, "rlon_1").f; lam_2 = pj_param(P->params, "rlon_2").f; P->singam = atan2(cos(phi_1) * sin(phi_2) * cos(lam_1) - sin(phi_1) * cos(phi_2) * cos(lam_2), sin(phi_1) * cos(phi_2) * sin(lam_2) - cos(phi_1) * sin(phi_2) * sin(lam_1) ); P->sinphi = atan(-cos(P->singam - lam_1) / tan(phi_1)); } P->lam0 = P->singam + HALFPI; P->cosphi = cos(P->sinphi); P->sinphi = sin(P->sinphi); P->cosgam = cos(P->singam); P->singam = sin(P->singam); P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/mk_cheby.c0000664000175000017500000001036111137333460015540 0ustar useruser#include static void /* sum coefficients less than res */ eval(projUV **w, int nu, int nv, double res, projUV *resid) { int i, j; double ab; projUV *s; resid->u = resid->v = 0.; for (i = 0; i < nu; ++i) for (s = w[i], j = 0; j < nv; ++j, ++s) { if ((ab = fabs(s->u)) < res) resid->u += ab; if ((ab = fabs(s->v)) < res) resid->v += ab; } } static Tseries * /* create power series structure */ makeT(int nru, int nrv) { Tseries *T; int i; if ((T = (Tseries *)pj_malloc(sizeof(Tseries))) && (T->cu = (struct PW_COEF *)pj_malloc( sizeof(struct PW_COEF) * nru)) && (T->cv = (struct PW_COEF *)pj_malloc( sizeof(struct PW_COEF) * nrv))) { for (i = 0; i < nru; ++i) T->cu[i].c = 0; for (i = 0; i < nrv; ++i) T->cv[i].c = 0; return T; } else return 0; } Tseries * mk_cheby(projUV a, projUV b, double res, projUV *resid, projUV (*func)(projUV), int nu, int nv, int power) { int j, i, nru, nrv, *ncu, *ncv; Tseries *T; projUV **w; double cutres; if (!(w = (projUV **)vector2(nu, nv, sizeof(projUV))) || !(ncu = (int *)vector1(nu + nv, sizeof(int)))) return 0; ncv = ncu + nu; if (!bchgen(a, b, nu, nv, w, func)) { projUV *s; double ab, *p; /* analyse coefficients and adjust until residual OK */ cutres = res; for (i = 4; i ; --i) { eval(w, nu, nv, cutres, resid); if (resid->u < res && resid->v < res) break; cutres *= 0.5; } if (i <= 0) /* warn of too many tries */ resid->u = - resid->u; /* apply cut resolution and set pointers */ nru = nrv = 0; for (j = 0; j < nu; ++j) { ncu[j] = ncv[j] = 0; /* clear column maxes */ for (s = w[j], i = 0; i < nv; ++i, ++s) { if ((ab = fabs(s->u)) < cutres) /* < resolution ? */ s->u = 0.; /* clear coefficient */ else ncu[j] = i + 1; /* update column max */ if ((ab = fabs(s->v)) < cutres) /* same for v coef's */ s->v = 0.; else ncv[j] = i + 1; } if (ncu[j]) nru = j + 1; /* update row max */ if (ncv[j]) nrv = j + 1; } if (power) { /* convert to bivariate power series */ if (!bch2bps(a, b, w, nu, nv)) goto error; /* possible change in some row counts, so readjust */ nru = nrv = 0; for (j = 0; j < nu; ++j) { ncu[j] = ncv[j] = 0; /* clear column maxes */ for (s = w[j], i = 0; i < nv; ++i, ++s) { if (s->u) ncu[j] = i + 1; /* update column max */ if (s->v) ncv[j] = i + 1; } if (ncu[j]) nru = j + 1; /* update row max */ if (ncv[j]) nrv = j + 1; } if (T = makeT(nru, nrv)) { T->a = a; T->b = b; T->mu = nru - 1; T->mv = nrv - 1; T->power = 1; for (i = 0; i < nru; ++i) /* store coefficient rows for u */ if (T->cu[i].m = ncu[i]) if ((p = T->cu[i].c = (double *)pj_malloc(sizeof(double) * ncu[i]))) for (j = 0; j < ncu[i]; ++j) *p++ = (w[i] + j)->u; else goto error; for (i = 0; i < nrv; ++i) /* same for v */ if (T->cv[i].m = ncv[i]) if ((p = T->cv[i].c = (double *)pj_malloc(sizeof(double) * ncv[i]))) for (j = 0; j < ncv[i]; ++j) *p++ = (w[i] + j)->v; else goto error; } } else if (T = makeT(nru, nrv)) { /* else make returned Chebyshev coefficient structure */ T->mu = nru - 1; /* save row degree */ T->mv = nrv - 1; T->a.u = a.u + b.u; /* set argument scaling */ T->a.v = a.v + b.v; T->b.u = 1. / (b.u - a.u); T->b.v = 1. / (b.v - a.v); T->power = 0; for (i = 0; i < nru; ++i) /* store coefficient rows for u */ if (T->cu[i].m = ncu[i]) if ((p = T->cu[i].c = (double *)pj_malloc(sizeof(double) * ncu[i]))) for (j = 0; j < ncu[i]; ++j) *p++ = (w[i] + j)->u; else goto error; for (i = 0; i < nrv; ++i) /* same for v */ if (T->cv[i].m = ncv[i]) if ((p = T->cv[i].c = (double *)pj_malloc(sizeof(double) * ncv[i]))) for (j = 0; j < ncv[i]; ++j) *p++ = (w[i] + j)->v; else goto error; } else goto error; } goto gohome; error: if (T) { /* pj_dalloc up possible allocations */ for (i = 0; i <= T->mu; ++i) if (T->cu[i].c) pj_dalloc(T->cu[i].c); for (i = 0; i <= T->mv; ++i) if (T->cv[i].c) pj_dalloc(T->cv[i].c); pj_dalloc(T); } T = 0; gohome: freev2((void **) w, nu); pj_dalloc(ncu); return T; } therion/extern/proj4/PJ_eqc.c0000664000175000017500000000105411137333562015122 0ustar useruser#define PROJ_PARMS__ \ double rc; #define PJ_LIB__ # include PROJ_HEAD(eqc, "Equidistant Cylindrical (Plate Caree)") "\n\tCyl, Sph\n\tlat_ts=[, lat_0=0]"; FORWARD(s_forward); /* spheroid */ xy.x = P->rc * lp.lam; xy.y = lp.phi - P->phi0; return (xy); } INVERSE(s_inverse); /* spheroid */ lp.lam = xy.x / P->rc; lp.phi = xy.y + P->phi0; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(eqc) if ((P->rc = cos(pj_param(P->params, "rlat_ts").f)) <= 0.) E_ERROR(-24); P->inv = s_inverse; P->fwd = s_forward; P->es = 0.; ENDENTRY(P) therion/extern/proj4/emess.h0000664000175000017500000000130711076404756015111 0ustar useruser/* Error message processing header file */ #ifndef EMESS_H #define EMESS_H #ifndef lint static char EMESS_H_ID[] = "@(#)emess.h 4.1 93/03/08 GIE REL"; #endif struct EMESS { char *File_name, /* input file name */ *Prog_name; /* name of program */ int File_line; /* approximate line read where error occured */ }; #ifdef EMESS_ROUTINE /* use type */ /* for emess procedure */ struct EMESS emess_dat = { (char *)0, (char *)0, 0 }; #ifdef sun /* Archaic SunOs 4.1.1, etc. */ extern char *sys_errlist[]; #define strerror(n) (sys_errlist[n]) #endif #else /* for for calling procedures */ extern struct EMESS emess_dat; void emess(int, char *, ...); #endif /* use type */ #endif /* end EMESS_H */ therion/extern/proj4/PJ_omerc.c0000664000175000017500000001127211137333734015463 0ustar useruser#define PROJ_PARMS__ \ double alpha, lamc, lam1, phi1, lam2, phi2, Gamma, al, bl, el, \ singam, cosgam, sinrot, cosrot, u_0; \ int ellips, rot; #define PJ_LIB__ #include PROJ_HEAD(omerc, "Oblique Mercator") "\n\tCyl, Sph&Ell\n\t no_rot rot_conv no_uoff and\n\t" "alpha= lonc= or\n\t lon_1= lat_1= lon_2= lat_2="; #define TOL 1.e-7 #define EPS 1.e-10 #define TSFN0(x) tan(.5 * (HALFPI - (x))) FORWARD(e_forward); /* ellipsoid & spheroid */ double con, q, s, ul, us, vl, vs; vl = sin(P->bl * lp.lam); if (fabs(fabs(lp.phi) - HALFPI) <= EPS) { ul = lp.phi < 0. ? -P->singam : P->singam; us = P->al * lp.phi / P->bl; } else { q = P->el / (P->ellips ? pow(pj_tsfn(lp.phi, sin(lp.phi), P->e), P->bl) : TSFN0(lp.phi)); s = .5 * (q - 1. / q); ul = 2. * (s * P->singam - vl * P->cosgam) / (q + 1. / q); con = cos(P->bl * lp.lam); if (fabs(con) >= TOL) { us = P->al * atan((s * P->cosgam + vl * P->singam) / con) / P->bl; if (con < 0.) us += PI * P->al / P->bl; } else us = P->al * P->bl * lp.lam; } if (fabs(fabs(ul) - 1.) <= EPS) F_ERROR; vs = .5 * P->al * log((1. - ul) / (1. + ul)) / P->bl; us -= P->u_0; if (! P->rot) { xy.x = us; xy.y = vs; } else { xy.x = vs * P->cosrot + us * P->sinrot; xy.y = us * P->cosrot - vs * P->sinrot; } return (xy); } INVERSE(e_inverse); /* ellipsoid & spheroid */ double q, s, ul, us, vl, vs; if (! P->rot) { us = xy.x; vs = xy.y; } else { vs = xy.x * P->cosrot - xy.y * P->sinrot; us = xy.y * P->cosrot + xy.x * P->sinrot; } us += P->u_0; q = exp(- P->bl * vs / P->al); s = .5 * (q - 1. / q); vl = sin(P->bl * us / P->al); ul = 2. * (vl * P->cosgam + s * P->singam) / (q + 1. / q); if (fabs(fabs(ul) - 1.) < EPS) { lp.lam = 0.; lp.phi = ul < 0. ? -HALFPI : HALFPI; } else { lp.phi = P->el / sqrt((1. + ul) / (1. - ul)); if (P->ellips) { if ((lp.phi = pj_phi2(pow(lp.phi, 1. / P->bl), P->e)) == HUGE_VAL) I_ERROR; } else lp.phi = HALFPI - 2. * atan(lp.phi); lp.lam = - atan2((s * P->cosgam - vl * P->singam), cos(P->bl * us / P->al)) / P->bl; } return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(omerc) double con, com, cosph0, d, f, h, l, sinph0, p, j; int azi; P->rot = pj_param(P->params, "bno_rot").i == 0; if( (azi = pj_param(P->params, "talpha").i) != 0.0) { P->lamc = pj_param(P->params, "rlonc").f; P->alpha = pj_param(P->params, "ralpha").f; if ( fabs(P->alpha) <= TOL || fabs(fabs(P->phi0) - HALFPI) <= TOL || fabs(fabs(P->alpha) - HALFPI) <= TOL) E_ERROR(-32); } else { P->lam1 = pj_param(P->params, "rlon_1").f; P->phi1 = pj_param(P->params, "rlat_1").f; P->lam2 = pj_param(P->params, "rlon_2").f; P->phi2 = pj_param(P->params, "rlat_2").f; if (fabs(P->phi1 - P->phi2) <= TOL || (con = fabs(P->phi1)) <= TOL || fabs(con - HALFPI) <= TOL || fabs(fabs(P->phi0) - HALFPI) <= TOL || fabs(fabs(P->phi2) - HALFPI) <= TOL) E_ERROR(-33); } com = (P->ellips = P->es > 0.) ? sqrt(P->one_es) : 1.; if (fabs(P->phi0) > EPS) { sinph0 = sin(P->phi0); cosph0 = cos(P->phi0); if (P->ellips) { con = 1. - P->es * sinph0 * sinph0; P->bl = cosph0 * cosph0; P->bl = sqrt(1. + P->es * P->bl * P->bl / P->one_es); P->al = P->bl * P->k0 * com / con; d = P->bl * com / (cosph0 * sqrt(con)); } else { P->bl = 1.; P->al = P->k0; d = 1. / cosph0; } if ((f = d * d - 1.) <= 0.) f = 0.; else { f = sqrt(f); if (P->phi0 < 0.) f = -f; } P->el = f += d; if (P->ellips) P->el *= pow(pj_tsfn(P->phi0, sinph0, P->e), P->bl); else P->el *= TSFN0(P->phi0); } else { P->bl = 1. / com; P->al = P->k0; P->el = d = f = 1.; } if (azi) { P->Gamma = asin(sin(P->alpha) / d); P->lam0 = P->lamc - asin((.5 * (f - 1. / f)) * tan(P->Gamma)) / P->bl; } else { if (P->ellips) { h = pow(pj_tsfn(P->phi1, sin(P->phi1), P->e), P->bl); l = pow(pj_tsfn(P->phi2, sin(P->phi2), P->e), P->bl); } else { h = TSFN0(P->phi1); l = TSFN0(P->phi2); } f = P->el / h; p = (l - h) / (l + h); j = P->el * P->el; j = (j - l * h) / (j + l * h); if ((con = P->lam1 - P->lam2) < -PI) P->lam2 -= TWOPI; else if (con > PI) P->lam2 += TWOPI; P->lam0 = adjlon(.5 * (P->lam1 + P->lam2) - atan( j * tan(.5 * P->bl * (P->lam1 - P->lam2)) / p) / P->bl); P->Gamma = atan(2. * sin(P->bl * adjlon(P->lam1 - P->lam0)) / (f - 1. / f)); P->alpha = asin(d * sin(P->Gamma)); } P->singam = sin(P->Gamma); P->cosgam = cos(P->Gamma); f = pj_param(P->params, "brot_conv").i ? P->Gamma : P->alpha; P->sinrot = sin(f); P->cosrot = cos(f); P->u_0 = pj_param(P->params, "bno_uoff").i ? 0. : fabs(P->al * atan(sqrt(d * d - 1.) / P->cosrot) / P->bl); if (P->phi0 < 0.) P->u_0 = - P->u_0; P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/PJ_lcca.c0000664000175000017500000000341511130502664015251 0ustar useruserstatic const char RCS_ID[] = "$Id: PJ_lcca.c 1504 2009-01-06 02:11:57Z warmerdam $"; /* PROJ.4 Cartographic Projection System */ #define MAX_ITER 10 #define DEL_TOL 1e-12 #define PROJ_PARMS__ \ double *en; \ double r0, l, M0; \ double C; #define PJ_LIB__ #include PROJ_HEAD(lcca, "Lambert Conformal Conic Alternative") "\n\tConic, Sph&Ell\n\tlat_0="; static double /* func to compute dr */ fS(double S, double C) { return(S * ( 1. + S * S * C)); } static double /* deriv of fs */ fSp(double S, double C) { return(1. + 3.* S * S * C); } FORWARD(e_forward); /* ellipsoid */ double S, S3, r, dr; S = pj_mlfn(lp.phi, sin(lp.phi), cos(lp.phi), P->en) - P->M0; dr = fS(S, P->C); r = P->r0 - dr; xy.x = P->k0 * (r * sin( lp.lam *= P->l ) ); xy.y = P->k0 * (P->r0 - r * cos(lp.lam) ); return (xy); } INVERSE(e_inverse); /* ellipsoid & spheroid */ double theta, dr, S, dif; int i; xy.x /= P->k0; xy.y /= P->k0; theta = atan2(xy.x , P->r0 - xy.y); dr = xy.y - xy.x * tan(0.5 * theta); lp.lam = theta / P->l; S = dr; for (i = MAX_ITER; i ; --i) { S -= (dif = (fS(S, P->C) - dr) / fSp(S, P->C)); if (fabs(dif) < DEL_TOL) break; } if (!i) I_ERROR lp.phi = pj_inv_mlfn(S + P->M0, P->es, P->en); return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY0(lcca) double s2p0, N0, R0, tan0, tan20; if (!(P->en = pj_enfn(P->es))) E_ERROR_0; if (!pj_param(P->params, "tlat_0").i) E_ERROR(50); if (P->phi0 == 0.) E_ERROR(51); P->l = sin(P->phi0); P->M0 = pj_mlfn(P->phi0, P->l, cos(P->phi0), P->en); s2p0 = P->l * P->l; R0 = 1. / (1. - P->es * s2p0); N0 = sqrt(R0); R0 *= P->one_es * N0; tan0 = tan(P->phi0); tan20 = tan0 * tan0; P->r0 = N0 / tan0; P->C = 1. / (6. * R0 * N0); P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/PJ_mbt_fps.c0000664000175000017500000000173711137333670016014 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(mbt_fps, "McBryde-Thomas Flat-Pole Sine (No. 2)") "\n\tCyl., Sph."; #define MAX_ITER 10 #define LOOP_TOL 1e-7 #define C1 0.45503 #define C2 1.36509 #define C3 1.41546 #define C_x 0.22248 #define C_y 1.44492 #define C1_2 0.33333333333333333333333333 FORWARD(s_forward); /* spheroid */ double k, V, t; int i; k = C3 * sin(lp.phi); for (i = MAX_ITER; i ; --i) { t = lp.phi / C2; lp.phi -= V = (C1 * sin(t) + sin(lp.phi) - k) / (C1_2 * cos(t) + cos(lp.phi)); if (fabs(V) < LOOP_TOL) break; } t = lp.phi / C2; xy.x = C_x * lp.lam * (1. + 3. * cos(lp.phi)/cos(t) ); xy.y = C_y * sin(t); return (xy); } INVERSE(s_inverse); /* spheroid */ double t, s; lp.phi = C2 * (t = aasin(xy.y / C_y)); lp.lam = xy.x / (C_x * (1. + 3. * cos(lp.phi)/cos(t))); lp.phi = aasin((C1 * sin(t) + sin(lp.phi)) / C3); return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(mbt_fps) P->es = 0; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/bch2bps.c0000664000175000017500000000702011137333424015300 0ustar useruser/* convert bivariate w Chebyshev series to w Power series */ #include /* basic support procedures */ static void /* clear vector to zero */ clear(projUV *p, int n) { static const projUV c = {0., 0.}; while (n--) *p++ = c; } static void /* clear matrix rows to zero */ bclear(projUV **p, int n, int m) { while (n--) clear(*p++, m); } static void /* move vector */ bmove(projUV *a, projUV *b, int n) { while (n--) *a++ = *b++; } static void /* a <- m * b - c */ submop(projUV *a, double m, projUV *b, projUV *c, int n) { while (n--) { a->u = m * b->u - c->u; a++->v = m * b++->v - c++->v; } } static void /* a <- b - c */ subop(projUV *a, projUV *b, projUV *c, int n) { while (n--) { a->u = b->u - c->u; a++->v = b++->v - c++->v; } } static void /* multiply vector a by scalar m */ dmult(projUV *a, double m, int n) { while(n--) { a->u *= m; a->v *= m; ++a; } } static void /* row adjust a[] <- a[] - m * b[] */ dadd(projUV *a, projUV *b, double m, int n) { while(n--) { a->u -= m * b->u; a++->v -= m * b++->v; } } static void /* convert row to pover series */ rows(projUV *c, projUV *d, int n) { projUV sv, *dd; int j, k; dd = (projUV *)vector1(n-1, sizeof(projUV)); sv.u = sv.v = 0.; for (j = 0; j < n; ++j) d[j] = dd[j] = sv; d[0] = c[n-1]; for (j = n-2; j >= 1; --j) { for (k = n-j; k >= 1; --k) { sv = d[k]; d[k].u = 2. * d[k-1].u - dd[k].u; d[k].v = 2. * d[k-1].v - dd[k].v; dd[k] = sv; } sv = d[0]; d[0].u = -dd[0].u + c[j].u; d[0].v = -dd[0].v + c[j].v; dd[0] = sv; } for (j = n-1; j >= 1; --j) { d[j].u = d[j-1].u - dd[j].u; d[j].v = d[j-1].v - dd[j].v; } d[0].u = -dd[0].u + .5 * c[0].u; d[0].v = -dd[0].v + .5 * c[0].v; pj_dalloc(dd); } static void /* convert columns to power series */ cols(projUV **c, projUV **d, int nu, int nv) { projUV *sv, **dd; int j, k; dd = (projUV **)vector2(nu, nv, sizeof(projUV)); sv = (projUV *)vector1(nv, sizeof(projUV)); bclear(d, nu, nv); bclear(dd, nu, nv); bmove(d[0], c[nu-1], nv); for (j = nu-2; j >= 1; --j) { for (k = nu-j; k >= 1; --k) { bmove(sv, d[k], nv); submop(d[k], 2., d[k-1], dd[k], nv); bmove(dd[k], sv, nv); } bmove(sv, d[0], nv); subop(d[0], c[j], dd[0], nv); bmove(dd[0], sv, nv); } for (j = nu-1; j >= 1; --j) subop(d[j], d[j-1], dd[j], nv); submop(d[0], .5, c[0], dd[0], nv); freev2((void **) dd, nu); pj_dalloc(sv); } static void /* row adjust for range -1 to 1 to a to b */ rowshft(double a, double b, projUV *d, int n) { int k, j; double fac, cnst; cnst = 2. / (b - a); fac = cnst; for (j = 1; j < n; ++j) { d[j].u *= fac; d[j].v *= fac; fac *= cnst; } cnst = .5 * (a + b); for (j = 0; j <= n-2; ++j) for (k = n - 2; k >= j; --k) { d[k].u -= cnst * d[k+1].u; d[k].v -= cnst * d[k+1].v; } } static void /* column adjust for range -1 to 1 to a to b */ colshft(double a, double b, projUV **d, int n, int m) { int k, j; double fac, cnst; cnst = 2. / (b - a); fac = cnst; for (j = 1; j < n; ++j) { dmult(d[j], fac, m); fac *= cnst; } cnst = .5 * (a + b); for (j = 0; j <= n-2; ++j) for (k = n - 2; k >= j; --k) dadd(d[k], d[k+1], cnst, m); } int /* entry point */ bch2bps(projUV a, projUV b, projUV **c, int nu, int nv) { projUV **d; int i; if (nu < 1 || nv < 1 || !(d = (projUV **)vector2(nu, nv, sizeof(projUV)))) return 0; /* do rows to power series */ for (i = 0; i < nu; ++i) { rows(c[i], d[i], nv); rowshft(a.v, b.v, d[i], nv); } /* do columns to power series */ cols(d, c, nu, nv); colshft(a.u, b.u, c, nu, nv); freev2((void **) d, nu); return 1; } therion/extern/proj4/PJ_merc.c0000664000175000017500000000233111137333674015303 0ustar useruser#define PJ_LIB__ #include PROJ_HEAD(merc, "Mercator") "\n\tCyl, Sph&Ell\n\tlat_ts="; #define EPS10 1.e-10 FORWARD(e_forward); /* ellipsoid */ if (fabs(fabs(lp.phi) - HALFPI) <= EPS10) F_ERROR; xy.x = P->k0 * lp.lam; xy.y = - P->k0 * log(pj_tsfn(lp.phi, sin(lp.phi), P->e)); return (xy); } FORWARD(s_forward); /* spheroid */ if (fabs(fabs(lp.phi) - HALFPI) <= EPS10) F_ERROR; xy.x = P->k0 * lp.lam; xy.y = P->k0 * log(tan(FORTPI + .5 * lp.phi)); return (xy); } INVERSE(e_inverse); /* ellipsoid */ if ((lp.phi = pj_phi2(exp(- xy.y / P->k0), P->e)) == HUGE_VAL) I_ERROR; lp.lam = xy.x / P->k0; return (lp); } INVERSE(s_inverse); /* spheroid */ lp.phi = HALFPI - 2. * atan(exp(-xy.y / P->k0)); lp.lam = xy.x / P->k0; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(merc) double phits=0.0; int is_phits; if( (is_phits = pj_param(P->params, "tlat_ts").i) ) { phits = fabs(pj_param(P->params, "rlat_ts").f); if (phits >= HALFPI) E_ERROR(-24); } if (P->es) { /* ellipsoid */ if (is_phits) P->k0 = pj_msfn(sin(phits), cos(phits), P->es); P->inv = e_inverse; P->fwd = e_forward; } else { /* sphere */ if (is_phits) P->k0 = cos(phits); P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/proj4/PJ_putp4p.c0000664000175000017500000000154411137333760015612 0ustar useruser#define PROJ_PARMS__ \ double C_x, C_y; #define PJ_LIB__ # include PROJ_HEAD(putp4p, "Putnins P4'") "\n\tPCyl., Sph."; PROJ_HEAD(weren, "Werenskiold I") "\n\tPCyl., Sph."; FORWARD(s_forward); /* spheroid */ lp.phi = aasin(0.883883476 * sin(lp.phi)); xy.x = P->C_x * lp.lam * cos(lp.phi); xy.x /= cos(lp.phi *= 0.333333333333333); xy.y = P->C_y * sin(lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ lp.phi = aasin(xy.y / P->C_y); lp.lam = xy.x * cos(lp.phi) / P->C_x; lp.phi *= 3.; lp.lam /= cos(lp.phi); lp.phi = aasin(1.13137085 * sin(lp.phi)); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P) { P->es = 0.; P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(putp4p) P->C_x = 0.874038744; P->C_y = 3.883251825; ENDENTRY(setup(P)) ENTRY0(weren) P->C_x = 1.; P->C_y = 4.442882938; ENDENTRY(setup(P)) therion/extern/proj4/PJ_krovak.c0000664000175000017500000001666411130502664015656 0ustar useruser/****************************************************************************** * $Id: PJ_krovak.c 1504 2009-01-06 02:11:57Z warmerdam $ * * Project: PROJ.4 * Purpose: Implementation of the krovak (Krovak) projection. * Definition: http://www.ihsenergy.com/epsg/guid7.html#1.4.3 * Author: Thomas Flemming, tf@ttqv.com * ****************************************************************************** * Copyright (c) 2001, Thomas Flemming, tf@ttqv.com * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *****************************************************************************/ #define PROJ_PARMS__ \ double C_x; #define PJ_LIB__ #include #include #include PJ_CVSID("$Id: PJ_krovak.c 1504 2009-01-06 02:11:57Z warmerdam $"); PROJ_HEAD(krovak, "Krovak") "\n\tPCyl., Ellps."; /** NOTES: According to EPSG the full Krovak projection method should have the following parameters. Within PROJ.4 the azimuth, and pseudo standard parallel are hardcoded in the algorithm and can't be altered from outside. The others all have defaults to match the common usage with Krovak projection. lat_0 = latitude of centre of the projection lon_0 = longitude of centre of the projection ** = azimuth (true) of the centre line passing through the centre of the projection ** = latitude of pseudo standard parallel k = scale factor on the pseudo standard parallel x_0 = False Easting of the centre of the projection at the apex of the cone y_0 = False Northing of the centre of the projection at the apex of the cone **/ FORWARD(e_forward); /* ellipsoid */ /* calculate xy from lat/lon */ char errmess[255]; char tmp[16]; /* Constants, identical to inverse transform function */ double s45, s90, e2, e, alfa, uq, u0, g, k, k1, n0, ro0, ad, a, s0, n; double gfi, u, fi0, lon17, lamdd, deltav, s, d, eps, ro; s45 = 0.785398163397448; /* 45° */ s90 = 2 * s45; fi0 = P->phi0; /* Latitude of projection centre 49° 30' */ /* Ellipsoid is used as Parameter in for.c and inv.c, therefore a must be set to 1 here. Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.1528128, e2=0.006674372230614; */ a = 1; /* 6377397.155; */ /* e2 = P->es;*/ /* 0.006674372230614; */ e2 = 0.006674372230614; e = sqrt(e2); alfa = sqrt(1. + (e2 * pow(cos(fi0), 4)) / (1. - e2)); uq = 1.04216856380474; /* DU(2, 59, 42, 42.69689) */ u0 = asin(sin(fi0) / alfa); g = pow( (1. + e * sin(fi0)) / (1. - e * sin(fi0)) , alfa * e / 2. ); k = tan( u0 / 2. + s45) / pow (tan(fi0 / 2. + s45) , alfa) * g; k1 = P->k0; n0 = a * sqrt(1. - e2) / (1. - e2 * pow(sin(fi0), 2)); s0 = 1.37008346281555; /* Latitude of pseudo standard parallel 78° 30'00" N */ n = sin(s0); ro0 = k1 * n0 / tan(s0); ad = s90 - uq; /* Transformation */ gfi =pow ( ((1. + e * sin(lp.phi)) / (1. - e * sin(lp.phi))) , (alfa * e / 2.)); u= 2. * (atan(k * pow( tan(lp.phi / 2. + s45), alfa) / gfi)-s45); deltav = - lp.lam * alfa; s = asin(cos(ad) * sin(u) + sin(ad) * cos(u) * cos(deltav)); d = asin(cos(u) * sin(deltav) / cos(s)); eps = n * d; ro = ro0 * pow(tan(s0 / 2. + s45) , n) / pow(tan(s / 2. + s45) , n) ; /* x and y are reverted! */ xy.y = ro * cos(eps) / a; xy.x = ro * sin(eps) / a; if( !pj_param(P -> params, "tczech").i ) { xy.y *= -1.0; xy.x *= -1.0; } return (xy); } INVERSE(e_inverse); /* ellipsoid */ /* calculate lat/lon from xy */ /* Constants, identisch wie in der Umkehrfunktion */ double s45, s90, fi0, e2, e, alfa, uq, u0, g, k, k1, n0, ro0, ad, a, s0, n; double u, l24, lamdd, deltav, s, d, eps, ro, fi1, xy0, lon17; int ok; s45 = 0.785398163397448; /* 45° */ s90 = 2 * s45; fi0 = P->phi0; /* Latitude of projection centre 49° 30' */ /* Ellipsoid is used as Parameter in for.c and inv.c, therefore a must be set to 1 here. Ellipsoid Bessel 1841 a = 6377397.155m 1/f = 299.1528128, e2=0.006674372230614; */ a = 1; /* 6377397.155; */ /* e2 = P->es; */ /* 0.006674372230614; */ e2 = 0.006674372230614; e = sqrt(e2); alfa = sqrt(1. + (e2 * pow(cos(fi0), 4)) / (1. - e2)); uq = 1.04216856380474; /* DU(2, 59, 42, 42.69689) */ u0 = asin(sin(fi0) / alfa); g = pow( (1. + e * sin(fi0)) / (1. - e * sin(fi0)) , alfa * e / 2. ); k = tan( u0 / 2. + s45) / pow (tan(fi0 / 2. + s45) , alfa) * g; k1 = P->k0; n0 = a * sqrt(1. - e2) / (1. - e2 * pow(sin(fi0), 2)); s0 = 1.37008346281555; /* Latitude of pseudo standard parallel 78° 30'00" N */ n = sin(s0); ro0 = k1 * n0 / tan(s0); ad = s90 - uq; /* Transformation */ /* revert y, x*/ xy0=xy.x; xy.x=xy.y; xy.y=xy0; if( !pj_param(P -> params, "tczech").i ) { xy.x *= -1.0; xy.y *= -1.0; } ro = sqrt(xy.x * xy.x + xy.y * xy.y); eps = atan2(xy.y, xy.x); d = eps / sin(s0); s = 2. * (atan( pow(ro0 / ro, 1. / n) * tan(s0 / 2. + s45)) - s45); u = asin(cos(ad) * sin(s) - sin(ad) * cos(s) * cos(d)); deltav = asin(cos(s) * sin(d) / cos(u)); lp.lam = P->lam0 - deltav / alfa; /* ITERATION FOR lp.phi */ fi1 = u; ok = 0; do { lp.phi = 2. * ( atan( pow( k, -1. / alfa) * pow( tan(u / 2. + s45) , 1. / alfa) * pow( (1. + e * sin(fi1)) / (1. - e * sin(fi1)) , e / 2.) ) - s45); if (fabs(fi1 - lp.phi) < 0.000000000000001) ok=1; fi1 = lp.phi; } while (ok==0); lp.lam -= P->lam0; return (lp); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(krovak) double ts; /* read some Parameters, * here Latitude Truescale */ ts = pj_param(P->params, "rlat_ts").f; P->C_x = ts; /* we want Bessel as fixed ellipsoid */ P->a = 6377397.155; P->e = sqrt(P->es = 0.006674372230614); /* if latitude of projection center is not set, use 49d30'N */ if (!pj_param(P->params, "tlat_0").i) P->phi0 = 0.863937979737193; /* if center long is not set use 42d30'E of Ferro - 17d40' for Ferro */ /* that will correspond to using longitudes relative to greenwich */ /* as input and output, instead of lat/long relative to Ferro */ if (!pj_param(P->params, "tlon_0").i) P->lam0 = 0.7417649320975901 - 0.308341501185665; /* if scale not set default to 0.9999 */ if (!pj_param(P->params, "tk").i) P->k0 = 0.9999; /* always the same */ P->inv = e_inverse; P->fwd = e_forward; ENDENTRY(P) therion/extern/proj4/PJ_boggs.c0000664000175000017500000000143511137333506015454 0ustar useruser#define PJ_LIB__ # include PROJ_HEAD(boggs, "Boggs Eumorphic") "\n\tPCyl., no inv., Sph."; # define NITER 20 # define EPS 1e-7 # define ONETOL 1.000001 # define FXC 2.00276 # define FXC2 1.11072 # define FYC 0.49931 # define FYC2 1.41421356237309504880 FORWARD(s_forward); /* spheroid */ double theta, th1, c; int i; theta = lp.phi; if (fabs(fabs(lp.phi) - HALFPI) < EPS) xy.x = 0.; else { c = sin(theta) * PI; for (i = NITER; i; --i) { theta -= th1 = (theta + sin(theta) - c) / (1. + cos(theta)); if (fabs(th1) < EPS) break; } theta *= 0.5; xy.x = FXC * lp.lam / (1. / cos(lp.phi) + FXC2 / cos(theta)); } xy.y = FYC * (lp.phi + FYC2 * sin(theta)); return (xy); } FREEUP; if (P) pj_dalloc(P); } ENTRY0(boggs) P->es = 0.; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/nad_intr.c0000664000175000017500000000270111137333472015557 0ustar useruser/* Determine nad table correction value */ #define PJ_LIB__ #include LP nad_intr(LP t, struct CTABLE *ct) { LP val, frct; ILP indx; double m00, m10, m01, m11; FLP *f00, *f10, *f01, *f11; long index; int in; indx.lam = floor(t.lam /= ct->del.lam); indx.phi = floor(t.phi /= ct->del.phi); frct.lam = t.lam - indx.lam; frct.phi = t.phi - indx.phi; val.lam = val.phi = HUGE_VAL; if (indx.lam < 0) { if (indx.lam == -1 && frct.lam > 0.99999999999) { ++indx.lam; frct.lam = 0.; } else return val; } else if ((in = indx.lam + 1) >= ct->lim.lam) { if (in == ct->lim.lam && frct.lam < 1e-11) { --indx.lam; frct.lam = 1.; } else return val; } if (indx.phi < 0) { if (indx.phi == -1 && frct.phi > 0.99999999999) { ++indx.phi; frct.phi = 0.; } else return val; } else if ((in = indx.phi + 1) >= ct->lim.phi) { if (in == ct->lim.phi && frct.phi < 1e-11) { --indx.phi; frct.phi = 1.; } else return val; } index = indx.phi * ct->lim.lam + indx.lam; f00 = ct->cvs + index++; f10 = ct->cvs + index; index += ct->lim.lam; f11 = ct->cvs + index--; f01 = ct->cvs + index; m11 = m10 = frct.lam; m00 = m01 = 1. - frct.lam; m11 *= frct.phi; m01 *= frct.phi; frct.phi = 1. - frct.phi; m00 *= frct.phi; m10 *= frct.phi; val.lam = m00 * f00->lam + m10 * f10->lam + m01 * f01->lam + m11 * f11->lam; val.phi = m00 * f00->phi + m10 * f10->phi + m01 * f01->phi + m11 * f11->phi; return val; } therion/extern/proj4/pj_param.c0000664000175000017500000000556511137333740015563 0ustar useruser/* put parameters in linked list and retrieve */ #include #include #include paralist * /* create parameter list entry */ pj_mkparam(char *str) { paralist *newitem; if (newitem = (paralist *)pj_malloc(sizeof(paralist) + strlen(str))) { newitem->used = 0; newitem->next = 0; if (*str == '+') ++str; (void)strcpy(newitem->param, str); } return newitem; } /************************************************************************/ /* pj_param() */ /* */ /* Test for presence or get parameter value. The first */ /* character in `opt' is a parameter type which can take the */ /* values: */ /* */ /* `t' - test for presence, return TRUE/FALSE in PVALUE.i */ /* `i' - integer value returned in PVALUE.i */ /* `d' - simple valued real input returned in PVALUE.f */ /* `r' - degrees (DMS translation applied), returned as */ /* radians in PVALUE.f */ /* `s' - string returned in PVALUE.s */ /* `b' - test for t/T/f/F, return in PVALUE.i */ /* */ /************************************************************************/ PVALUE /* test for presence or get parameter value */ pj_param(paralist *pl, char *opt) { int type; unsigned l; PVALUE value; type = *opt++; /* simple linear lookup */ l = strlen(opt); while (pl && !(!strncmp(pl->param, opt, l) && (!pl->param[l] || pl->param[l] == '='))) pl = pl->next; if (type == 't') value.i = pl != 0; else if (pl) { pl->used |= 1; opt = pl->param + l; if (*opt == '=') ++opt; switch (type) { case 'i': /* integer input */ value.i = atoi(opt); break; case 'd': /* simple real input */ value.f = atof(opt); break; case 'r': /* degrees input */ value.f = dmstor(opt, 0); break; case 's': /* char string */ value.s = opt; break; case 'b': /* boolean */ switch (*opt) { case 'F': case 'f': value.i = 0; break; case '\0': case 'T': case 't': value.i = 1; break; default: pj_errno = -8; value.i = 0; break; } break; default: bum_type: /* note: this is an error in parameter, not a user error */ fprintf(stderr, "invalid request to pj_param, fatal\n"); exit(1); } } else /* not given */ switch (type) { case 'b': case 'i': value.i = 0; break; case 'd': case 'r': value.f = 0.; break; case 's': value.s = 0; break; default: goto bum_type; } return value; } therion/extern/proj4/adjlon.c0000664000175000017500000000070711137333420015225 0ustar useruser/* reduce argument to range +/- PI */ #include #include #define SPI 3.14159265359 #define TWOPI 6.2831853071795864769 #define ONEPI 3.14159265358979323846 double adjlon (double lon) { if (fabs(lon) <= SPI) return( lon ); lon += ONEPI; /* adjust to 0..2pi rad */ lon -= TWOPI * floor(lon / TWOPI); /* remove integral # of 'revolutions'*/ lon -= ONEPI; /* adjust back to -pi..pi rad */ return( lon ); } therion/extern/proj4/PJ_moll.c0000664000175000017500000000252211137333706015316 0ustar useruser#define PROJ_PARMS__ \ double C_x, C_y, C_p; #define PJ_LIB__ #include PROJ_HEAD(moll, "Mollweide") "\n\tPCyl., Sph."; PROJ_HEAD(wag4, "Wagner IV") "\n\tPCyl., Sph."; PROJ_HEAD(wag5, "Wagner V") "\n\tPCyl., Sph."; #define MAX_ITER 10 #define LOOP_TOL 1e-7 FORWARD(s_forward); /* spheroid */ double k, V; int i; k = P->C_p * sin(lp.phi); for (i = MAX_ITER; i ; --i) { lp.phi -= V = (lp.phi + sin(lp.phi) - k) / (1. + cos(lp.phi)); if (fabs(V) < LOOP_TOL) break; } if (!i) lp.phi = (lp.phi < 0.) ? -HALFPI : HALFPI; else lp.phi *= 0.5; xy.x = P->C_x * lp.lam * cos(lp.phi); xy.y = P->C_y * sin(lp.phi); return (xy); } INVERSE(s_inverse); /* spheroid */ double th, s; lp.phi = aasin(xy.y / P->C_y); lp.lam = xy.x / (P->C_x * cos(lp.phi)); lp.phi += lp.phi; lp.phi = aasin((lp.phi + sin(lp.phi)) / P->C_p); return (lp); } FREEUP; if (P) pj_dalloc(P); } static PJ * setup(PJ *P, double p) { double r, sp, p2 = p + p; P->es = 0; sp = sin(p); r = sqrt(TWOPI * sp / (p2 + sin(p2))); P->C_x = 2. * r / PI; P->C_y = r / sp; P->C_p = p2 + sin(p2); P->inv = s_inverse; P->fwd = s_forward; return P; } ENTRY0(moll) ENDENTRY(setup(P, HALFPI)) ENTRY0(wag4) ENDENTRY(setup(P, PI/3.)) ENTRY0(wag5) P->es = 0; P->C_x = 0.90977; P->C_y = 1.65014; P->C_p = 3.00896; P->inv = s_inverse; P->fwd = s_forward; ENDENTRY(P) therion/extern/proj4/dmstor.c0000664000175000017500000000433511137333434015274 0ustar useruser/* Convert DMS string to radians */ #include #include #include static double proj_strtod(char *nptr, char **endptr); /* following should be sufficient for all but the rediculous */ #define MAX_WORK 64 static const char *sym = "NnEeSsWw"; static const double vm[] = { .0174532925199433, .0002908882086657216, .0000048481368110953599 }; double dmstor(const char *is, char **rs) { int sign, n, nl; char *p, *s, work[MAX_WORK]; double v, tv; if (rs) *rs = (char *)is; /* copy sting into work space */ while (isspace(sign = *is)) ++is; for (n = MAX_WORK, s = work, p = (char *)is; isgraph(*p) && --n ; ) *s++ = *p++; *s = '\0'; /* it is possible that a really odd input (like lots of leading zeros) could be truncated in copying into work. But ... */ sign = *(s = work); if (sign == '+' || sign == '-') s++; else sign = '+'; for (v = 0., nl = 0 ; nl < 3 ; nl = n + 1 ) { if (!(isdigit(*s) || *s == '.')) break; if ((tv = proj_strtod(s, &s)) == HUGE_VAL) return tv; switch (*s) { case 'D': case 'd': n = 0; break; case '\'': n = 1; break; case '"': n = 2; break; case 'r': case 'R': if (nl) { pj_errno = -16; return HUGE_VAL; } ++s; v = tv; goto skip; default: v += tv * vm[nl]; skip: n = 4; continue; } if (n < nl) { pj_errno = -16; return HUGE_VAL; } v += tv * vm[n]; ++s; } /* postfix sign */ if (*s && (p = strchr(sym, *s))) { sign = (p - sym) >= 4 ? '-' : '+'; ++s; } if (sign == '-') v = -v; if (rs) /* return point of next char after valid string */ *rs = (char *)is + (s - work); return v; } static double proj_strtod(char *nptr, char **endptr) { char c, *cp = nptr; double result; /* * Scan for characters which cause problems with VC++ strtod() */ while ((c = *cp) != '\0') { if (c == 'd' || c == 'D') { /* * Found one, so NUL it out, call strtod(), * then restore it and return */ *cp = '\0'; result = strtod(nptr, endptr); *cp = c; return result; } ++cp; } /* no offending characters, just handle normally */ return strtod(nptr, endptr); } therion/extern/proj4/PJ_poly.c0000664000175000017500000000500311137333746015337 0ustar useruser#define PROJ_PARMS__ \ double ml0; \ double *en; #define PJ_LIB__ #include PROJ_HEAD(poly, "Polyconic (American)") "\n\tConic, Sph&Ell"; #define TOL 1e-10 #define CONV 1e-10 #define N_ITER 10 #define I_ITER 20 #define ITOL 1.e-12 FORWARD(e_forward); /* ellipsoid */ double ms, sp, cp; if (fabs(lp.phi) <= TOL) { xy.x = lp.lam; xy.y = -P->ml0; } else { sp = sin(lp.phi); ms = fabs(cp = cos(lp.phi)) > TOL ? pj_msfn(sp, cp, P->es) / sp : 0.; xy.x = ms * sin(lp.lam *= sp); xy.y = (pj_mlfn(lp.phi, sp, cp, P->en) - P->ml0) + ms * (1. - cos(lp.lam)); } return (xy); } FORWARD(s_forward); /* spheroid */ double cot, E; if (fabs(lp.phi) <= TOL) { xy.x = lp.lam; xy.y = P->ml0; } else { cot = 1. / tan(lp.phi); xy.x = sin(E = lp.lam * sin(lp.phi)) * cot; xy.y = lp.phi - P->phi0 + cot * (1. - cos(E)); } return (xy); } INVERSE(e_inverse); /* ellipsoid */ xy.y += P->ml0; if (fabs(xy.y) <= TOL) { lp.lam = xy.x; lp.phi = 0.; } else { double r, c, sp, cp, s2ph, ml, mlb, mlp, dPhi; int i; r = xy.y * xy.y + xy.x * xy.x; for (lp.phi = xy.y, i = I_ITER; i ; --i) { sp = sin(lp.phi); s2ph = sp * ( cp = cos(lp.phi)); if (fabs(cp) < ITOL) I_ERROR; c = sp * (mlp = sqrt(1. - P->es * sp * sp)) / cp; ml = pj_mlfn(lp.phi, sp, cp, P->en); mlb = ml * ml + r; mlp = P->one_es / (mlp * mlp * mlp); lp.phi += ( dPhi = ( ml + ml + c * mlb - 2. * xy.y * (c * ml + 1.) ) / ( P->es * s2ph * (mlb - 2. * xy.y * ml) / c + 2.* (xy.y - ml) * (c * mlp - 1. / s2ph) - mlp - mlp )); if (fabs(dPhi) <= ITOL) break; } if (!i) I_ERROR; c = sin(lp.phi); lp.lam = asin(xy.x * tan(lp.phi) * sqrt(1. - P->es * c * c)) / sin(lp.phi); } return (lp); } INVERSE(s_inverse); /* spheroid */ double B, dphi, tp; int i; if (fabs(xy.y = P->phi0 + xy.y) <= TOL) { lp.lam = xy.x; lp.phi = 0.; } else { lp.phi = xy.y; B = xy.x * xy.x + xy.y * xy.y; i = N_ITER; do { tp = tan(lp.phi); lp.phi -= (dphi = (xy.y * (lp.phi * tp + 1.) - lp.phi - .5 * ( lp.phi * lp.phi + B) * tp) / ((lp.phi - xy.y) / tp - 1.)); } while (fabs(dphi) > CONV && --i); if (! i) I_ERROR; lp.lam = asin(xy.x * tan(lp.phi)) / sin(lp.phi); } return (lp); } FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } } ENTRY1(poly, en) if (P->es) { if (!(P->en = pj_enfn(P->es))) E_ERROR_0; P->ml0 = pj_mlfn(P->phi0, sin(P->phi0), cos(P->phi0), P->en); P->inv = e_inverse; P->fwd = e_forward; } else { P->ml0 = -P->phi0; P->inv = s_inverse; P->fwd = s_forward; } ENDENTRY(P) therion/extern/getopt1.c0000664000175000017500000001070406635503600014307 0ustar useruser/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "getopt.h" #if !defined (__STDC__) || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ therion/extern/img.h0000664000175000017500000002121012265325004013473 0ustar useruser/* img.h * Header file for routines to read and write Survex ".3d" image files * Copyright (C) Olly Betts 1993,1994,1997,2001,2002,2003,2004,2005,2006,2010,2011,2012,2013,2014 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef IMG_H # define IMG_H /* Define IMG_API_VERSION if you want more recent versions of the img API. * * 0 (default) The old API. date1 and date2 give the survey date as time_t. * Set to 0 for "unknown". * 1 days1 and days2 give survey dates as days since 1st Jan 1900. * Set to -1 for "unknown". */ #ifndef IMG_API_VERSION # define IMG_API_VERSION 0 #elif IMG_API_VERSION > 1 # error IMG_API_VERSION > 1 too new #endif #ifdef __cplusplus extern "C" { #endif #include #include /* for time_t */ # define img_BAD -2 # define img_STOP -1 # define img_MOVE 0 # define img_LINE 1 /* NB: img_CROSS is never output and ignored on input. * Put crosses where labels are. */ /* # define img_CROSS 2 */ # define img_LABEL 3 # define img_XSECT 4 # define img_XSECT_END 5 # define img_ERROR_INFO 6 /* Leg flags */ # define img_FLAG_SURFACE 0x01 # define img_FLAG_DUPLICATE 0x02 # define img_FLAG_SPLAY 0x04 /* Station flags */ # define img_SFLAG_SURFACE 0x01 # define img_SFLAG_UNDERGROUND 0x02 # define img_SFLAG_ENTRANCE 0x04 # define img_SFLAG_EXPORTED 0x08 # define img_SFLAG_FIXED 0x10 # define img_SFLAG_ANON 0x20 # define img_SFLAG_WALL 0x40 /* File-wide flags */ # define img_FFLAG_EXTENDED 0x80 /* When writing img_XSECT, img_XFLAG_END in pimg->flags means this is the last * img_XSECT in this tube: */ # define img_XFLAG_END 0x01 # define img_STYLE_UNKNOWN -1 # define img_STYLE_NORMAL 0 # define img_STYLE_DIVING 1 # define img_STYLE_CARTESIAN 2 # define img_STYLE_CYLPOLAR 3 # define img_STYLE_NOSURVEY 4 /* 3D coordinates (in metres) */ typedef struct { double x, y, z; } img_point; typedef struct { /* members you can access when reading (don't touch when writing) */ char *label; int flags; char *title; /* Older .3d format versions stored a human readable datestamp string. * Format versions >= 8 versions store a string consisting of "@" followed * by the number of seconds since midnight UTC on 1/1/1970. Some foreign * formats contain a human readable string, others no date information * (which results in "?" being returned). */ char *datestamp; /* The datestamp as a time_t (or (time_t)-1 if not available). * * For 3d format versions >= 8, this is a reliable value and in UTC. Older * 3d format versions store a human readable time, which img will attempt * to decode, but it may fail, particularly with handling timezones. Even * if it does work, beware that times in local time where DST applies are * inherently ambiguous around when the clocks go back. * * CMAP XYZ files contain a timestamp. It's probably in localtime (but * without any timezone information) and the example files are all pre-2000 * and have two digit years. We do our best to turn these into a useful * time_t value. */ time_t datestamp_numeric; char separator; /* character used to separate survey levels ('.' usually) */ #if IMG_API_VERSION == 0 time_t date1, date2; #else /* IMG_API_VERSION == 1 */ int days1, days2; #endif double l, r, u, d; /* Error information - valid when IMG_ERROR is returned: */ int n_legs; double length; double E, H, V; /* The filename actually opened (e.g. may have ".3d" added). */ char * filename_opened; int is_extended_elevation; /* The style of the data - one of the img_STYLE_* constants above */ int style; /* all other members are for internal use only */ FILE *fh; /* file handle of image file */ char *label_buf; size_t buf_len; size_t label_len; int fRead; /* 1 for reading, 0 for writing */ long start; /* version of file format: * -4 => CMAP .xyz file, shot format * -3 => CMAP .xyz file, station format * -2 => Compass .plt file * -1 => .pos file * 0 => 0.01 ascii * 1 => 0.01 binary, * 2 => byte actions and flags * 3 => prefixes for legs; compressed prefixes * 4 => survey date * 5 => LRUD info * 6 => error info * 7 => more compact dates with wider range * 8 => lots of changes */ int version; char *survey; size_t survey_len; int pending; /* for old style text format files and survey filtering */ img_point mv; #if IMG_API_VERSION == 0 time_t olddate1, olddate2; #else /* IMG_API_VERSION == 1 */ int olddays1, olddays2; #endif int oldstyle; } img; /* Which version of the file format to output (defaults to newest) */ extern unsigned int img_output_version; /* Minimum supported value for img_output_version: */ #define IMG_VERSION_MIN 1 /* Maximum supported value for img_output_version: */ #define IMG_VERSION_MAX 8 /* Open a .3d file for reading * fnm is the filename * Returns pointer to an img struct or NULL */ #define img_open(F) img_open_survey((F), NULL) /* Open a .3d file for reading * fnm is the filename * Returns pointer to an img struct or NULL * survey points to a survey name to restrict reading to (or NULL for all * survey data in the file) */ img *img_open_survey(const char *fnm, const char *survey); /* Open a .3d file for output * fnm is the filename * title is the title * flags contains a bitwise-or of any file-wide flags - currently only one * is available: img_FFLAG_EXTENDED. (The third parameter used to be * 'fBinary', but has been ignored for many years, so the parameter has * been repurposed for flags - for this reason, img.c deliberately ignores bit * 1 being set, but callers should be written/updated not to set it). * * Returns pointer to an img struct or NULL for error (check img_error() * for details) */ img *img_open_write(const char *fnm, char *title, int flags); /* Read an item from a .3d file * pimg is a pointer to an img struct returned by img_open() * coordinates are returned in p * flags and label name are returned in fields in pimg * Returns img_XXXX as #define-d above */ int img_read_item(img *pimg, img_point *p); /* Write a item to a .3d file * pimg is a pointer to an img struct returned by img_open_write() * code is one of the img_XXXX #define-d above * flags is the leg, station, or xsect flags * (meaningful for img_LINE, img_LABEL, and img_XSECT respectively) * s is the label (only meaningful for img_LABEL) * x, y, z are the coordinates */ void img_write_item(img *pimg, int code, int flags, const char *s, double x, double y, double z); /* Write error information for the current traverse * n_legs is the number of legs in the traverse * length is the traverse length (in m) * E is the ratio of the observed misclosure to the theoretical one * H is the ratio of the observed horizontal misclosure to the theoretical one * V is the ratio of the observed vertical misclosure to the theoretical one */ void img_write_errors(img *pimg, int n_legs, double length, double E, double H, double V); /* rewind a .3d file opened for reading so the data can be read in * several passes * pimg is a pointer to an img struct returned by img_open() * Returns: non-zero for success, zero for error (check img_error() for * details) */ int img_rewind(img *pimg); /* Close a .3d file * pimg is a pointer to an img struct returned by img_open() or * img_open_write() * Returns: non-zero for success, zero for error (check img_error() for * details) */ int img_close(img *pimg); /* Codes returned by img_error */ typedef enum { IMG_NONE = 0, IMG_FILENOTFOUND, IMG_OUTOFMEMORY, IMG_CANTOPENOUT, IMG_BADFORMAT, IMG_DIRECTORY, IMG_READERROR, IMG_WRITEERROR, IMG_TOONEW } img_errcode; /* Read the error code * If img_open(), img_open_survey() or img_open_write() returns NULL, or * img_rewind() or img_close() returns 0, or img_read_item() returns img_BAD * then you can call this function to discover why. */ img_errcode img_error(void); #ifdef __cplusplus } #endif #endif therion/extern/getopt.c0000664000175000017500000007301510402755572014236 0ustar useruser/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #ifndef __GNU_LIBRARY__ #define __GNU_LIBRARY__ 1 #endif #ifdef HAVE_CONFIG_H #include #endif #if !defined (__STDC__) || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #ifndef THMSVC #include #endif #endif /* GNU C library. */ #ifdef VMS #include #if HAVE_STRING_H - 0 #include #endif #endif #if defined (WIN32) && !defined (__CYGWIN32__) /* It's not Unix, really. See? Capital letters. */ #include #define getpid() GetCurrentProcessId() #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ #ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) #else # define _(msgid) (msgid) #endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = NULL; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #else /* Avoid depending on library functions or files whose names are inconsistent. */ char *getenv (); static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ #if !defined (__STDC__) || !__STDC__ /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); #endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; extern pid_t __libc_pid; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } text_set_element (__libc_subinit, store_args_and_env); # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined (__STDC__) && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len); memset (&new_str[nonoption_flags_max_len], '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined (__STDC__) && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else { memcpy (__getopt_nonoption_flags, orig_str, len); memset (&__getopt_nonoption_flags[len], '\0', nonoption_flags_max_len - len); } } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ therion/extern/shpopen.c0000664000175000017500000020670110557554414014413 0ustar useruser/****************************************************************************** * $Id: shpopen.c,v 1.39 2002/08/26 06:46:56 warmerda Exp $ * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, 2001, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shpopen.c,v $ * Revision 1.39 2002/08/26 06:46:56 warmerda * avoid c++ comments * * Revision 1.38 2002/05/07 16:43:39 warmerda * Removed debugging printf. * * Revision 1.37 2002/04/10 17:35:22 warmerda * fixed bug in ring reversal code * * Revision 1.36 2002/04/10 16:59:54 warmerda * added SHPRewindObject * * Revision 1.35 2001/12/07 15:10:44 warmerda * fix if .shx fails to open * * Revision 1.34 2001/11/01 16:29:55 warmerda * move pabyRec into SHPInfo for thread safety * * Revision 1.33 2001/07/03 12:18:15 warmerda * Improved cleanup if SHX not found, provied by Riccardo Cohen. * * Revision 1.32 2001/06/22 01:58:07 warmerda * be more careful about establishing initial bounds in face of NULL shapes * * Revision 1.31 2001/05/31 19:35:29 warmerda * added support for writing null shapes * * Revision 1.30 2001/05/28 12:46:29 warmerda * Add some checking on reasonableness of record count when opening. * * Revision 1.29 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.28 2001/02/06 22:25:06 warmerda * fixed memory leaks when SHPOpen() fails * * Revision 1.27 2000/07/18 15:21:33 warmerda * added better enforcement of -1 for append in SHPWriteObject * * Revision 1.26 2000/02/16 16:03:51 warmerda * added null shape support * * Revision 1.25 1999/12/15 13:47:07 warmerda * Fixed record size settings in .shp file (was 4 words too long) * Added stdlib.h. * * Revision 1.24 1999/11/05 14:12:04 warmerda * updated license terms * * Revision 1.23 1999/07/27 00:53:46 warmerda * added support for rewriting shapes * * Revision 1.22 1999/06/11 19:19:11 warmerda * Cleanup pabyRec static buffer on SHPClose(). * * Revision 1.21 1999/06/02 14:57:56 kshih * Remove unused variables * * Revision 1.20 1999/04/19 21:04:17 warmerda * Fixed syntax error. * * Revision 1.19 1999/04/19 21:01:57 warmerda * Force access string to binary in SHPOpen(). * * Revision 1.18 1999/04/01 18:48:07 warmerda * Try upper case extensions if lower case doesn't work. * * Revision 1.17 1998/12/31 15:29:39 warmerda * Disable writing measure values to multipatch objects if * DISABLE_MULTIPATCH_MEASURE is defined. * * Revision 1.16 1998/12/16 05:14:33 warmerda * Added support to write MULTIPATCH. Fixed reading Z coordinate of * MULTIPATCH. Fixed record size written for all feature types. * * Revision 1.15 1998/12/03 16:35:29 warmerda * r+b is proper binary access string, not rb+. * * Revision 1.14 1998/12/03 15:47:56 warmerda * Fixed setting of nVertices in SHPCreateObject(). * * Revision 1.13 1998/12/03 15:33:54 warmerda * Made SHPCalculateExtents() separately callable. * * Revision 1.12 1998/11/11 20:01:50 warmerda * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. * * Revision 1.11 1998/11/09 20:56:44 warmerda * Fixed up handling of file wide bounds. * * Revision 1.10 1998/11/09 20:18:51 warmerda * Converted to support 3D shapefiles, and use of SHPObject. * * Revision 1.9 1998/02/24 15:09:05 warmerda * Fixed memory leak. * * Revision 1.8 1997/12/04 15:40:29 warmerda * Fixed byte swapping of record number, and record length fields in the * .shp file. * * Revision 1.7 1995/10/21 03:15:58 warmerda * Added support for binary file access, the magic cookie 9997 * and tried to improve the int32 selection logic for 16bit systems. * * Revision 1.6 1995/09/04 04:19:41 warmerda * Added fix for file bounds. * * Revision 1.5 1995/08/25 15:16:44 warmerda * Fixed a couple of problems with big endian systems ... one with bounds * and the other with multipart polygons. * * Revision 1.4 1995/08/24 18:10:17 warmerda * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() * functions (such as on the Sun). * * Revision 1.3 1995/08/23 02:23:15 warmerda * Added support for reading bounds, and fixed up problems in setting the * file wide bounds. * * Revision 1.2 1995/08/04 03:16:57 warmerda * Added header. * */ /* * static char rcsid[] = * "$Id: shpopen.c,v 1.39 2002/08/26 06:46:56 warmerda Exp $"; */ #include "shapefil.h" #include #include #include #include #include typedef unsigned char uchar; #if UINT_MAX == 65535 typedef long int32; #else typedef int int32; #endif #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #define ByteCopy( a, b, c ) memcpy( b, a, c ) #ifndef MAX # define MIN(a,b) ((ab) ? a : b) #endif static int bBigEndian; /************************************************************************/ /* SwapWord() */ /* */ /* Swap a 2, 4 or 8 byte word. */ /************************************************************************/ static void SwapWord( int length, void * wordP ) { int i; uchar temp; for( i=0; i < length/2; i++ ) { temp = ((uchar *) wordP)[i]; ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; ((uchar *) wordP)[length-i-1] = temp; } } /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* SHPWriteHeader() */ /* */ /* Write out a header for the .shp and .shx files as well as the */ /* contents of the index (.shx) file. */ /************************************************************************/ static void SHPWriteHeader( SHPHandle psSHP ) { uchar abyHeader[100]; int i; int32 i32; double dValue; int32 *panSHX; /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = psSHP->nFileSize/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = psSHP->nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = psSHP->adBoundsMin[0]; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+36 ); dValue = psSHP->adBoundsMin[1]; ByteCopy( &dValue, abyHeader+44, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+44 ); dValue = psSHP->adBoundsMax[0]; ByteCopy( &dValue, abyHeader+52, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+52 ); dValue = psSHP->adBoundsMax[1]; ByteCopy( &dValue, abyHeader+60, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+60 ); dValue = psSHP->adBoundsMin[2]; /* z */ ByteCopy( &dValue, abyHeader+68, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+68 ); dValue = psSHP->adBoundsMax[2]; ByteCopy( &dValue, abyHeader+76, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+76 ); dValue = psSHP->adBoundsMin[3]; /* m */ ByteCopy( &dValue, abyHeader+84, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+84 ); dValue = psSHP->adBoundsMax[3]; ByteCopy( &dValue, abyHeader+92, 8 ); if( bBigEndian ) SwapWord( 8, abyHeader+92 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ fseek( psSHP->fpSHP, 0, 0 ); fwrite( abyHeader, 100, 1, psSHP->fpSHP ); /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); fseek( psSHP->fpSHX, 0, 0 ); fwrite( abyHeader, 100, 1, psSHP->fpSHX ); /* -------------------------------------------------------------------- */ /* Write out the .shx contents. */ /* -------------------------------------------------------------------- */ panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); for( i = 0; i < psSHP->nRecords; i++ ) { panSHX[i*2 ] = psSHP->panRecOffset[i]/2; panSHX[i*2+1] = psSHP->panRecSize[i]/2; if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); } fwrite( panSHX, sizeof(int32) * 2, psSHP->nRecords, psSHP->fpSHX ); free( panSHX ); } /************************************************************************/ /* SHPOpen() */ /* */ /* Open the .shp and .shx files based on the basename of the */ /* files or either file name. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPOpen( const char * pszLayer, const char * pszAccess ) { char *pszFullname, *pszBasename; SHPHandle psSHP; uchar *pabyBuf; int i; double dValue; /* -------------------------------------------------------------------- */ /* Ensure the access string is one of the legal ones. We */ /* ensure the result string indicates binary to avoid common */ /* problems on Windows. */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 || strcmp(pszAccess,"r+") == 0 ) pszAccess = "r+b"; else pszAccess = "rb"; /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Initialize the info structure. */ /* -------------------------------------------------------------------- */ psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1); psSHP->bUpdated = FALSE; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ); psSHP->fpSHP = fopen(pszFullname, pszAccess ); if( psSHP->fpSHP == NULL ) { sprintf( pszFullname, "%s.SHP", pszBasename ); psSHP->fpSHP = fopen(pszFullname, pszAccess ); } if( psSHP->fpSHP == NULL ) { free( psSHP ); free( pszBasename ); free( pszFullname ); return( NULL ); } sprintf( pszFullname, "%s.shx", pszBasename ); psSHP->fpSHX = fopen(pszFullname, pszAccess ); if( psSHP->fpSHX == NULL ) { sprintf( pszFullname, "%s.SHX", pszBasename ); psSHP->fpSHX = fopen(pszFullname, pszAccess ); } if( psSHP->fpSHX == NULL ) { fclose( psSHP->fpSHP ); free( psSHP ); free( pszBasename ); free( pszFullname ); return( NULL ); } free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Read the file size from the SHP file. */ /* -------------------------------------------------------------------- */ pabyBuf = (uchar *) malloc(100); fread( pabyBuf, 100, 1, psSHP->fpSHP ); psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[26] * 256 + pabyBuf[27]) * 2; /* -------------------------------------------------------------------- */ /* Read SHX file Header info */ /* -------------------------------------------------------------------- */ fread( pabyBuf, 100, 1, psSHP->fpSHX ); if( pabyBuf[0] != 0 || pabyBuf[1] != 0 || pabyBuf[2] != 0x27 || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) { fclose( psSHP->fpSHP ); fclose( psSHP->fpSHX ); free( psSHP ); return( NULL ); } psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256 + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256; psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8; psSHP->nShapeType = pabyBuf[32]; if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) { /* this header appears to be corrupt. Give up. */ fclose( psSHP->fpSHP ); fclose( psSHP->fpSHX ); free( psSHP ); return( NULL ); } /* -------------------------------------------------------------------- */ /* Read the bounds. */ /* -------------------------------------------------------------------- */ if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); memcpy( &dValue, pabyBuf+36, 8 ); psSHP->adBoundsMin[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); memcpy( &dValue, pabyBuf+44, 8 ); psSHP->adBoundsMin[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); memcpy( &dValue, pabyBuf+52, 8 ); psSHP->adBoundsMax[0] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); memcpy( &dValue, pabyBuf+60, 8 ); psSHP->adBoundsMax[1] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ memcpy( &dValue, pabyBuf+68, 8 ); psSHP->adBoundsMin[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); memcpy( &dValue, pabyBuf+76, 8 ); psSHP->adBoundsMax[2] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ memcpy( &dValue, pabyBuf+84, 8 ); psSHP->adBoundsMin[3] = dValue; if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); memcpy( &dValue, pabyBuf+92, 8 ); psSHP->adBoundsMax[3] = dValue; free( pabyBuf ); /* -------------------------------------------------------------------- */ /* Read the .shx file to get the offsets to each record in */ /* the .shp file. */ /* -------------------------------------------------------------------- */ psSHP->nMaxRecords = psSHP->nRecords; psSHP->panRecOffset = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); psSHP->panRecSize = (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) ); pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); fread( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ); for( i = 0; i < psSHP->nRecords; i++ ) { int32 nOffset, nLength; memcpy( &nOffset, pabyBuf + i * 8, 4 ); if( !bBigEndian ) SwapWord( 4, &nOffset ); memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); if( !bBigEndian ) SwapWord( 4, &nLength ); psSHP->panRecOffset[i] = nOffset*2; psSHP->panRecSize[i] = nLength*2; } free( pabyBuf ); return( psSHP ); } /************************************************************************/ /* SHPClose() */ /* */ /* Close the .shp and .shx files. */ /************************************************************************/ void SHPAPI_CALL SHPClose(SHPHandle psSHP ) { /* -------------------------------------------------------------------- */ /* Update the header if we have modified anything. */ /* -------------------------------------------------------------------- */ if( psSHP->bUpdated ) { SHPWriteHeader( psSHP ); } /* -------------------------------------------------------------------- */ /* Free all resources, and close files. */ /* -------------------------------------------------------------------- */ free( psSHP->panRecOffset ); free( psSHP->panRecSize ); fclose( psSHP->fpSHX ); fclose( psSHP->fpSHP ); if( psSHP->pabyRec != NULL ) { free( psSHP->pabyRec ); } free( psSHP ); } /************************************************************************/ /* SHPGetInfo() */ /* */ /* Fetch general information about the shape file. */ /************************************************************************/ void SHPAPI_CALL SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ) { int i; if( pnEntities != NULL ) *pnEntities = psSHP->nRecords; if( pnShapeType != NULL ) *pnShapeType = psSHP->nShapeType; for( i = 0; i < 4; i++ ) { if( padfMinBound != NULL ) padfMinBound[i] = psSHP->adBoundsMin[i]; if( padfMaxBound != NULL ) padfMaxBound[i] = psSHP->adBoundsMax[i]; } } /************************************************************************/ /* SHPCreate() */ /* */ /* Create a new shape file and return a handle to the open */ /* shape file with read/write access. */ /************************************************************************/ SHPHandle SHPAPI_CALL SHPCreate( const char * pszLayer, int nShapeType ) { char *pszBasename, *pszFullname; int i; FILE *fpSHP, *fpSHX; uchar abyHeader[100]; int32 i32; double dValue; /* -------------------------------------------------------------------- */ /* Establish the byte order on this system. */ /* -------------------------------------------------------------------- */ i = 1; if( *((uchar *) &i) == 1 ) bBigEndian = FALSE; else bBigEndian = TRUE; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the two files so we can write their headers. */ /* -------------------------------------------------------------------- */ pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.shp", pszBasename ); fpSHP = fopen(pszFullname, "wb" ); if( fpSHP == NULL ) return( NULL ); sprintf( pszFullname, "%s.shx", pszBasename ); fpSHX = fopen(pszFullname, "wb" ); if( fpSHX == NULL ) return( NULL ); free( pszFullname ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Prepare header block for .shp file. */ /* -------------------------------------------------------------------- */ for( i = 0; i < 100; i++ ) abyHeader[i] = 0; abyHeader[2] = 0x27; /* magic cookie */ abyHeader[3] = 0x0a; i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); i32 = 1000; /* version */ ByteCopy( &i32, abyHeader+28, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+28 ); i32 = nShapeType; /* shape type */ ByteCopy( &i32, abyHeader+32, 4 ); if( bBigEndian ) SwapWord( 4, abyHeader+32 ); dValue = 0.0; /* set bounds */ ByteCopy( &dValue, abyHeader+36, 8 ); ByteCopy( &dValue, abyHeader+44, 8 ); ByteCopy( &dValue, abyHeader+52, 8 ); ByteCopy( &dValue, abyHeader+60, 8 ); /* -------------------------------------------------------------------- */ /* Write .shp file header. */ /* -------------------------------------------------------------------- */ fwrite( abyHeader, 100, 1, fpSHP ); /* -------------------------------------------------------------------- */ /* Prepare, and write .shx file header. */ /* -------------------------------------------------------------------- */ i32 = 50; /* file size */ ByteCopy( &i32, abyHeader+24, 4 ); if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); fwrite( abyHeader, 100, 1, fpSHX ); /* -------------------------------------------------------------------- */ /* Close the files, and then open them as regular existing files. */ /* -------------------------------------------------------------------- */ fclose( fpSHP ); fclose( fpSHX ); return( SHPOpen( pszLayer, "r+b" ) ); } /************************************************************************/ /* _SHPSetBounds() */ /* */ /* Compute a bounds rectangle for a shape, and set it into the */ /* indicated location in the record. */ /************************************************************************/ static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) { ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); if( bBigEndian ) { SwapWord( 8, pabyRec + 0 ); SwapWord( 8, pabyRec + 8 ); SwapWord( 8, pabyRec + 16 ); SwapWord( 8, pabyRec + 24 ); } } /************************************************************************/ /* SHPComputeExtents() */ /* */ /* Recompute the extents of a shape. Automatically done by */ /* SHPCreateObject(). */ /************************************************************************/ void SHPAPI_CALL SHPComputeExtents( SHPObject * psObject ) { int i; /* -------------------------------------------------------------------- */ /* Build extents for this object. */ /* -------------------------------------------------------------------- */ if( psObject->nVertices > 0 ) { psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; } for( i = 0; i < psObject->nVertices; i++ ) { psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); } } /************************************************************************/ /* SHPCreateObject() */ /* */ /* Create a shape object. It should be freed with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPCreateObject( int nSHPType, int nShapeId, int nParts, int * panPartStart, int * panPartType, int nVertices, double * padfX, double * padfY, double * padfZ, double * padfM ) { SHPObject *psObject; int i, bHasM, bHasZ; psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); psObject->nSHPType = nSHPType; psObject->nShapeId = nShapeId; /* -------------------------------------------------------------------- */ /* Establish whether this shape type has M, and Z values. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARCM || nSHPType == SHPT_POINTM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_MULTIPOINTM ) { bHasM = TRUE; bHasZ = FALSE; } else if( nSHPType == SHPT_ARCZ || nSHPType == SHPT_POINTZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPOINTZ || nSHPType == SHPT_MULTIPATCH ) { bHasM = TRUE; bHasZ = TRUE; } else { bHasM = FALSE; bHasZ = FALSE; } /* -------------------------------------------------------------------- */ /* Capture parts. Note that part type is optional, and */ /* defaults to ring. */ /* -------------------------------------------------------------------- */ if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ || nSHPType == SHPT_MULTIPATCH ) { psObject->nParts = MAX(1,nParts); psObject->panPartStart = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartType = (int *) malloc(sizeof(int) * psObject->nParts); psObject->panPartStart[0] = 0; psObject->panPartType[0] = SHPP_RING; for( i = 0; i < nParts; i++ ) { psObject->panPartStart[i] = panPartStart[i]; if( panPartType != NULL ) psObject->panPartType[i] = panPartType[i]; else psObject->panPartType[i] = SHPP_RING; } } /* -------------------------------------------------------------------- */ /* Capture vertices. Note that Z and M are optional, but X and */ /* Y are not. */ /* -------------------------------------------------------------------- */ if( nVertices > 0 ) { psObject->padfX = (double *) calloc(sizeof(double),nVertices); psObject->padfY = (double *) calloc(sizeof(double),nVertices); psObject->padfZ = (double *) calloc(sizeof(double),nVertices); psObject->padfM = (double *) calloc(sizeof(double),nVertices); assert( padfX != NULL ); assert( padfY != NULL ); for( i = 0; i < nVertices; i++ ) { psObject->padfX[i] = padfX[i]; psObject->padfY[i] = padfY[i]; if( padfZ != NULL && bHasZ ) psObject->padfZ[i] = padfZ[i]; if( padfM != NULL && bHasM ) psObject->padfM[i] = padfM[i]; } } /* -------------------------------------------------------------------- */ /* Compute the extents. */ /* -------------------------------------------------------------------- */ psObject->nVertices = nVertices; SHPComputeExtents( psObject ); return( psObject ); } /************************************************************************/ /* SHPCreateSimpleObject() */ /* */ /* Create a simple (common) shape object. Destroy with */ /* SHPDestroyObject(). */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject( int nSHPType, int nVertices, double * padfX, double * padfY, double * padfZ ) { return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, nVertices, padfX, padfY, padfZ, NULL ) ); } /************************************************************************/ /* SHPWriteObject() */ /* */ /* Write out the vertices of a new structure. Note that it is */ /* only possible to write vertices at the end of the file. */ /************************************************************************/ int SHPAPI_CALL SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) { int nRecordOffset, i, nRecordSize; uchar *pabyRec; int32 i32; psSHP->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Ensure that shape object matches the type of the file it is */ /* being written to. */ /* -------------------------------------------------------------------- */ assert( psObject->nSHPType == psSHP->nShapeType || psObject->nSHPType == SHPT_NULL ); /* -------------------------------------------------------------------- */ /* Ensure that -1 is used for appends. Either blow an */ /* assertion, or if they are disabled, set the shapeid to -1 */ /* for appends. */ /* -------------------------------------------------------------------- */ assert( nShapeId == -1 || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) nShapeId = -1; /* -------------------------------------------------------------------- */ /* Add the new entity to the in memory index. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) { psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100); psSHP->panRecOffset = (int *) SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords ); psSHP->panRecSize = (int *) SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords ); } /* -------------------------------------------------------------------- */ /* Initialize record. */ /* -------------------------------------------------------------------- */ pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + psObject->nParts * 8 + 128); /* -------------------------------------------------------------------- */ /* Extract vertices for a Polygon or Arc. */ /* -------------------------------------------------------------------- */ if( psObject->nSHPType == SHPT_POLYGON || psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARC || psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_ARCM || psObject->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i; nPoints = psObject->nVertices; nParts = psObject->nParts; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); nRecordSize = 52; /* * Write part start positions. */ ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, 4 * psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); nRecordSize += 4; } /* * Write multipatch part types if needed. */ if( psObject->nSHPType == SHPT_MULTIPATCH ) { memcpy( pabyRec + nRecordSize, psObject->panPartType, 4*psObject->nParts ); for( i = 0; i < psObject->nParts; i++ ) { if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); nRecordSize += 4; } } /* * Write the (x,y) vertex values. */ for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize + 8 ); nRecordSize += 2 * 8; } /* * Write the Z coordinates (if any). */ if( psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_ARCZ || psObject->nSHPType == SHPT_MULTIPATCH ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* * Write the M values, if any. */ if( psObject->nSHPType == SHPT_POLYGONM || psObject->nSHPType == SHPT_ARCM #ifndef DISABLE_MULTIPATCH_MEASURE || psObject->nSHPType == SHPT_MULTIPATCH #endif || psObject->nSHPType == SHPT_POLYGONZ || psObject->nSHPType == SHPT_ARCZ ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Extract vertices for a MultiPoint. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_MULTIPOINT || psObject->nSHPType == SHPT_MULTIPOINTZ || psObject->nSHPType == SHPT_MULTIPOINTM ) { int32 nPoints; int i; nPoints = psObject->nVertices; _SHPSetBounds( pabyRec + 12, psObject ); if( bBigEndian ) SwapWord( 4, &nPoints ); ByteCopy( &nPoints, pabyRec + 44, 4 ); for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); } nRecordSize = 48 + 16 * psObject->nVertices; if( psObject->nSHPType == SHPT_MULTIPOINTZ ) { ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } if( psObject->nSHPType == SHPT_MULTIPOINTZ || psObject->nSHPType == SHPT_MULTIPOINTM ) { ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; for( i = 0; i < psObject->nVertices; i++ ) { ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } } /* -------------------------------------------------------------------- */ /* Write point. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_POINT || psObject->nSHPType == SHPT_POINTZ || psObject->nSHPType == SHPT_POINTM ) { ByteCopy( psObject->padfX, pabyRec + 12, 8 ); ByteCopy( psObject->padfY, pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); nRecordSize = 28; if( psObject->nSHPType == SHPT_POINTZ ) { ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } if( psObject->nSHPType == SHPT_POINTZ || psObject->nSHPType == SHPT_POINTM ) { ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); nRecordSize += 8; } } /* -------------------------------------------------------------------- */ /* Not much to do for null geometries. */ /* -------------------------------------------------------------------- */ else if( psObject->nSHPType == SHPT_NULL ) { nRecordSize = 12; } else { /* unknown type */ assert( FALSE ); } /* -------------------------------------------------------------------- */ /* Establish where we are going to put this record. If we are */ /* rewriting and existing record, and it will fit, then put it */ /* back where the original came from. Otherwise write at the end. */ /* -------------------------------------------------------------------- */ if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) { if( nShapeId == -1 ) nShapeId = psSHP->nRecords++; psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize; psSHP->panRecSize[nShapeId] = nRecordSize-8; psSHP->nFileSize += nRecordSize; } else { nRecordOffset = psSHP->panRecOffset[nShapeId]; } /* -------------------------------------------------------------------- */ /* Set the shape type, record number, and record size. */ /* -------------------------------------------------------------------- */ i32 = nShapeId+1; /* record # */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec, 4 ); i32 = (nRecordSize-8)/2; /* record size */ if( !bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 4, 4 ); i32 = psObject->nSHPType; /* shape type */ if( bBigEndian ) SwapWord( 4, &i32 ); ByteCopy( &i32, pabyRec + 8, 4 ); /* -------------------------------------------------------------------- */ /* Write out record. */ /* -------------------------------------------------------------------- */ if( fseek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 || fwrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) { printf( "Error in fseek() or fwrite().\n" ); free( pabyRec ); return -1; } free( pabyRec ); /* -------------------------------------------------------------------- */ /* Expand file wide bounds based on this shape. */ /* -------------------------------------------------------------------- */ if( psSHP->adBoundsMin[0] == 0.0 && psSHP->adBoundsMax[0] == 0.0 && psSHP->adBoundsMin[1] == 0.0 && psSHP->adBoundsMax[1] == 0.0 && psObject->nSHPType != SHPT_NULL ) { psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0]; psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0]; } for( i = 0; i < psObject->nVertices; i++ ) { psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); } return( nShapeId ); } /************************************************************************/ /* SHPReadObject() */ /* */ /* Read the vertices, parts, and other non-attribute information */ /* for one shape. */ /************************************************************************/ SHPObject SHPAPI_CALL1(*) SHPReadObject( SHPHandle psSHP, int hEntity ) { SHPObject *psShape; /* -------------------------------------------------------------------- */ /* Validate the record/entity number. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psSHP->nRecords ) return( NULL ); /* -------------------------------------------------------------------- */ /* Ensure our record buffer is large enough. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 > psSHP->nBufSize ) { psSHP->nBufSize = psSHP->panRecSize[hEntity]+8; psSHP->pabyRec = (uchar *) SfRealloc(psSHP->pabyRec,psSHP->nBufSize); } /* -------------------------------------------------------------------- */ /* Read the record. */ /* -------------------------------------------------------------------- */ fseek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ); fread( psSHP->pabyRec, psSHP->panRecSize[hEntity]+8, 1, psSHP->fpSHP ); /* -------------------------------------------------------------------- */ /* Allocate and minimally initialize the object. */ /* -------------------------------------------------------------------- */ psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); psShape->nShapeId = hEntity; memcpy( &psShape->nSHPType, psSHP->pabyRec + 8, 4 ); if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) ); /* ==================================================================== */ /* Extract vertices for a Polygon or Arc. */ /* ==================================================================== */ if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC || psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_POLYGONM || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_ARCM || psShape->nSHPType == SHPT_MULTIPATCH ) { int32 nPoints, nParts; int i, nOffset; /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* Extract part/point count, and build vertex and part arrays */ /* to proper size. */ /* -------------------------------------------------------------------- */ memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); if( bBigEndian ) SwapWord( 4, &nParts ); psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); psShape->nParts = nParts; psShape->panPartStart = (int *) calloc(nParts,sizeof(int)); psShape->panPartType = (int *) calloc(nParts,sizeof(int)); for( i = 0; i < nParts; i++ ) psShape->panPartType[i] = SHPP_RING; /* -------------------------------------------------------------------- */ /* Copy out the part array from the record. */ /* -------------------------------------------------------------------- */ memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); } nOffset = 44 + 8 + 4*nParts; /* -------------------------------------------------------------------- */ /* If this is a multipatch, we will also have parts types. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); for( i = 0; i < nParts; i++ ) { if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); } nOffset += 4*nParts; } /* -------------------------------------------------------------------- */ /* Copy out the vertices from the record. */ /* -------------------------------------------------------------------- */ for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX + i, psSHP->pabyRec + nOffset + i * 16, 8 ); memcpy(psShape->padfY + i, psSHP->pabyRec + nOffset + i * 16 + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset += 16*nPoints; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POLYGONZ || psShape->nSHPType == SHPT_ARCZ || psShape->nSHPType == SHPT_MULTIPATCH ) { memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } } } /* ==================================================================== */ /* Extract vertices for a MultiPoint. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_MULTIPOINT || psShape->nSHPType == SHPT_MULTIPOINTM || psShape->nSHPType == SHPT_MULTIPOINTZ ) { int32 nPoints; int i, nOffset; memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); if( bBigEndian ) SwapWord( 4, &nPoints ); psShape->nVertices = nPoints; psShape->padfX = (double *) calloc(nPoints,sizeof(double)); psShape->padfY = (double *) calloc(nPoints,sizeof(double)); psShape->padfZ = (double *) calloc(nPoints,sizeof(double)); psShape->padfM = (double *) calloc(nPoints,sizeof(double)); for( i = 0; i < nPoints; i++ ) { memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); } nOffset = 48 + 16*nPoints; /* -------------------------------------------------------------------- */ /* Get the X/Y bounds. */ /* -------------------------------------------------------------------- */ memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_MULTIPOINTZ ) { memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfZ + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); } nOffset += 16 + 8*nPoints; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints ) { memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); for( i = 0; i < nPoints; i++ ) { memcpy( psShape->padfM + i, psSHP->pabyRec + nOffset + 16 + i*8, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); } } } /* ==================================================================== */ /* Extract vertices for a point. */ /* ==================================================================== */ else if( psShape->nSHPType == SHPT_POINT || psShape->nSHPType == SHPT_POINTM || psShape->nSHPType == SHPT_POINTZ ) { int nOffset; psShape->nVertices = 1; psShape->padfX = (double *) calloc(1,sizeof(double)); psShape->padfY = (double *) calloc(1,sizeof(double)); psShape->padfZ = (double *) calloc(1,sizeof(double)); psShape->padfM = (double *) calloc(1,sizeof(double)); memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfX ); if( bBigEndian ) SwapWord( 8, psShape->padfY ); nOffset = 20 + 8; /* -------------------------------------------------------------------- */ /* If we have a Z coordinate, collect that now. */ /* -------------------------------------------------------------------- */ if( psShape->nSHPType == SHPT_POINTZ ) { memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfZ ); nOffset += 8; } /* -------------------------------------------------------------------- */ /* If we have a M measure value, then read it now. We assume */ /* that the measure can be present for any shape if the size is */ /* big enough, but really it will only occur for the Z shapes */ /* (options), and the M shapes. */ /* -------------------------------------------------------------------- */ if( psSHP->panRecSize[hEntity]+8 >= nOffset + 8 ) { memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); if( bBigEndian ) SwapWord( 8, psShape->padfM ); } /* -------------------------------------------------------------------- */ /* Since no extents are supplied in the record, we will apply */ /* them from the single vertex. */ /* -------------------------------------------------------------------- */ psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; } return( psShape ); } /************************************************************************/ /* SHPTypeName() */ /************************************************************************/ const char SHPAPI_CALL1(*) SHPTypeName( int nSHPType ) { switch( nSHPType ) { case SHPT_NULL: return "NullShape"; case SHPT_POINT: return "Point"; case SHPT_ARC: return "Arc"; case SHPT_POLYGON: return "Polygon"; case SHPT_MULTIPOINT: return "MultiPoint"; case SHPT_POINTZ: return "PointZ"; case SHPT_ARCZ: return "ArcZ"; case SHPT_POLYGONZ: return "PolygonZ"; case SHPT_MULTIPOINTZ: return "MultiPointZ"; case SHPT_POINTM: return "PointM"; case SHPT_ARCM: return "ArcM"; case SHPT_POLYGONM: return "PolygonM"; case SHPT_MULTIPOINTM: return "MultiPointM"; case SHPT_MULTIPATCH: return "MultiPatch"; default: return "UnknownShapeType"; } } /************************************************************************/ /* SHPPartTypeName() */ /************************************************************************/ const char SHPAPI_CALL1(*) SHPPartTypeName( int nPartType ) { switch( nPartType ) { case SHPP_TRISTRIP: return "TriangleStrip"; case SHPP_TRIFAN: return "TriangleFan"; case SHPP_OUTERRING: return "OuterRing"; case SHPP_INNERRING: return "InnerRing"; case SHPP_FIRSTRING: return "FirstRing"; case SHPP_RING: return "Ring"; default: return "UnknownPartType"; } } /************************************************************************/ /* SHPDestroyObject() */ /************************************************************************/ void SHPAPI_CALL SHPDestroyObject( SHPObject * psShape ) { if( psShape == NULL ) return; if( psShape->padfX != NULL ) free( psShape->padfX ); if( psShape->padfY != NULL ) free( psShape->padfY ); if( psShape->padfZ != NULL ) free( psShape->padfZ ); if( psShape->padfM != NULL ) free( psShape->padfM ); if( psShape->panPartStart != NULL ) free( psShape->panPartStart ); if( psShape->panPartType != NULL ) free( psShape->panPartType ); free( psShape ); } /************************************************************************/ /* SHPRewindObject() */ /* */ /* Reset the winding of polygon objects to adhere to the */ /* specification. */ /************************************************************************/ int SHPAPI_CALL SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ) { int iOpRing, bAltered = 0; /* -------------------------------------------------------------------- */ /* Do nothing if this is not a polygon object. */ /* -------------------------------------------------------------------- */ if( psObject->nSHPType != SHPT_POLYGON && psObject->nSHPType != SHPT_POLYGONZ && psObject->nSHPType != SHPT_POLYGONM ) return 0; /* -------------------------------------------------------------------- */ /* Process each of the rings. */ /* -------------------------------------------------------------------- */ for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) { int bInner, iVert, nVertCount, nVertStart, iCheckRing; double dfSum, dfTestX, dfTestY; /* -------------------------------------------------------------------- */ /* Determine if this ring is an inner ring or an outer ring */ /* relative to all the other rings. For now we assume the */ /* first ring is outer and all others are inner, but eventually */ /* we need to fix this to handle multiple island polygons and */ /* unordered sets of rings. */ /* -------------------------------------------------------------------- */ dfTestX = psObject->padfX[psObject->panPartStart[iOpRing]]; dfTestY = psObject->padfY[psObject->panPartStart[iOpRing]]; bInner = FALSE; for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) { int iEdge; if( iCheckRing == iOpRing ) continue; nVertStart = psObject->panPartStart[iCheckRing]; if( iCheckRing == psObject->nParts-1 ) nVertCount = psObject->nVertices - psObject->panPartStart[iCheckRing]; else nVertCount = psObject->panPartStart[iCheckRing+1] - psObject->panPartStart[iCheckRing]; for( iEdge = 0; iEdge < nVertCount; iEdge++ ) { int iNext; if( iEdge < nVertCount-1 ) iNext = iEdge+1; else iNext = 0; if( (psObject->padfY[iEdge+nVertStart] < dfTestY && psObject->padfY[iNext+nVertStart] >= dfTestY) || (psObject->padfY[iNext+nVertStart] < dfTestY && psObject->padfY[iEdge+nVertStart] >= dfTestY) ) { if( psObject->padfX[iEdge+nVertStart] + (dfTestY - psObject->padfY[iEdge+nVertStart]) / (psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart]) * (psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart]) < dfTestX ) bInner = !bInner; } } } /* -------------------------------------------------------------------- */ /* Determine the current order of this ring so we will know if */ /* it has to be reversed. */ /* -------------------------------------------------------------------- */ nVertStart = psObject->panPartStart[iOpRing]; if( iOpRing == psObject->nParts-1 ) nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; else nVertCount = psObject->panPartStart[iOpRing+1] - psObject->panPartStart[iOpRing]; dfSum = 0.0; for( iVert = nVertStart; iVert < nVertStart+nVertCount-1; iVert++ ) { dfSum += psObject->padfX[iVert] * psObject->padfY[iVert+1] - psObject->padfY[iVert] * psObject->padfX[iVert+1]; } dfSum += psObject->padfX[iVert] * psObject->padfY[nVertStart] - psObject->padfY[iVert] * psObject->padfX[nVertStart]; /* -------------------------------------------------------------------- */ /* Reverse if necessary. */ /* -------------------------------------------------------------------- */ if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) { int i; bAltered++; for( i = 0; i < nVertCount/2; i++ ) { double dfSaved; /* Swap X */ dfSaved = psObject->padfX[nVertStart+i]; psObject->padfX[nVertStart+i] = psObject->padfX[nVertStart+nVertCount-i-1]; psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; /* Swap Y */ dfSaved = psObject->padfY[nVertStart+i]; psObject->padfY[nVertStart+i] = psObject->padfY[nVertStart+nVertCount-i-1]; psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; /* Swap Z */ if( psObject->padfZ ) { dfSaved = psObject->padfZ[nVertStart+i]; psObject->padfZ[nVertStart+i] = psObject->padfZ[nVertStart+nVertCount-i-1]; psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; } /* Swap M */ if( psObject->padfM ) { dfSaved = psObject->padfM[nVertStart+i]; psObject->padfM[nVertStart+i] = psObject->padfM[nVertStart+nVertCount-i-1]; psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; } } } } return bAltered; } therion/extern/dbfopen.c0000664000175000017500000014551510557554444014364 0ustar useruser/****************************************************************************** * $Id: dbfopen.c,v 1.48 2003/03/10 14:51:27 warmerda Exp $ * * Project: Shapelib * Purpose: Implementation of .dbf access API documented in dbf_api.html. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: dbfopen.c,v $ * Revision 1.48 2003/03/10 14:51:27 warmerda * DBFWrite* calls now return FALSE if they have to truncate * * Revision 1.47 2002/11/20 03:32:22 warmerda * Ensure field name in DBFGetFieldIndex() is properly terminated. * * Revision 1.46 2002/10/09 13:10:21 warmerda * Added check that width is positive. * * Revision 1.45 2002/09/29 00:00:08 warmerda * added FTLogical and logical attribute read/write calls * * Revision 1.44 2002/05/07 13:46:11 warmerda * Added DBFWriteAttributeDirectly(). * * Revision 1.43 2002/02/13 19:39:21 warmerda * Fix casting issues in DBFCloneEmpty(). * * Revision 1.42 2002/01/15 14:36:07 warmerda * updated email address * * Revision 1.41 2002/01/15 14:31:49 warmerda * compute rather than copying nHeaderLength in DBFCloneEmpty() * * Revision 1.40 2002/01/09 04:32:35 warmerda * fixed to read correct amount of header * * Revision 1.39 2001/12/11 22:41:03 warmerda * improve io related error checking when reading header * * Revision 1.38 2001/11/28 16:07:31 warmerda * Cleanup to avoid compiler warnings as suggested by Richard Hash. * * Revision 1.37 2001/07/04 05:18:09 warmerda * do last fix properly * * Revision 1.36 2001/07/04 05:16:09 warmerda * fixed fieldname comparison in DBFGetFieldIndex * * Revision 1.35 2001/06/22 02:10:06 warmerda * fixed NULL shape support with help from Jim Matthews * * Revision 1.33 2001/05/31 19:20:13 warmerda * added DBFGetFieldIndex() * * Revision 1.32 2001/05/31 18:15:40 warmerda * Added support for NULL fields in DBF files * * Revision 1.31 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.30 2000/12/05 14:43:38 warmerda * DBReadAttribute() white space trimming bug fix * * Revision 1.29 2000/10/05 14:36:44 warmerda * fix bug with writing very wide numeric fields * * Revision 1.28 2000/09/25 14:18:07 warmerda * Added some casts of strlen() return result to fix warnings on some * systems, as submitted by Daniel. * * Revision 1.27 2000/09/25 14:15:51 warmerda * added DBFGetNativeFieldType() * * Revision 1.26 2000/07/07 13:39:45 warmerda * removed unused variables, and added system include files * * Revision 1.25 2000/05/29 18:19:13 warmerda * avoid use of uchar, and adding casting fix * * Revision 1.24 2000/05/23 13:38:27 warmerda * Added error checks on return results of fread() and fseek(). * * Revision 1.23 2000/05/23 13:25:49 warmerda * Avoid crashing if field or record are out of range in dbfread*attribute(). * * Revision 1.22 1999/12/15 13:47:24 warmerda * Added stdlib.h to ensure that atof() is prototyped. * * Revision 1.21 1999/12/13 17:25:46 warmerda * Added support for upper case .DBF extention. * * Revision 1.20 1999/11/30 16:32:11 warmerda * Use atof() instead of sscanf(). * * Revision 1.19 1999/11/05 14:12:04 warmerda * updated license terms * * Revision 1.18 1999/07/27 00:53:28 warmerda * ensure that whole old field value clear on write of string * * Revision 1.1 1999/07/05 18:58:07 warmerda * New * * Revision 1.17 1999/06/11 19:14:12 warmerda * Fixed some memory leaks. * * Revision 1.16 1999/06/11 19:04:11 warmerda * Remoted some unused variables. * * Revision 1.15 1999/05/11 03:19:28 warmerda * added new Tuple api, and improved extension handling - add from candrsn * * Revision 1.14 1999/05/04 15:01:48 warmerda * Added 'F' support. * * Revision 1.13 1999/03/23 17:38:59 warmerda * DBFAddField() now actually does return the new field number, or -1 if * it fails. * * Revision 1.12 1999/03/06 02:54:46 warmerda * Added logic to convert shapefile name to dbf filename in DBFOpen() * for convenience. * * Revision 1.11 1998/12/31 15:30:34 warmerda * Improved the interchangability of numeric and string attributes. Add * white space trimming option for attributes. * * Revision 1.10 1998/12/03 16:36:44 warmerda * Use r+b instead of rb+ for binary access. * * Revision 1.9 1998/12/03 15:34:23 warmerda * Updated copyright message. * * Revision 1.8 1997/12/04 15:40:15 warmerda * Added newline character after field definitions. * * Revision 1.7 1997/03/06 14:02:10 warmerda * Ensure bUpdated is initialized. * * Revision 1.6 1996/02/12 04:54:41 warmerda * Ensure that DBFWriteAttribute() returns TRUE if it succeeds. * * Revision 1.5 1995/10/21 03:15:12 warmerda * Changed to use binary file access, and ensure that the * field name field is zero filled, and limited to 10 chars. * * Revision 1.4 1995/08/24 18:10:42 warmerda * Added use of SfRealloc() to avoid pre-ANSI realloc() functions such * as on the Sun. * * Revision 1.3 1995/08/04 03:15:16 warmerda * Fixed up header. * * Revision 1.2 1995/08/04 03:14:43 warmerda * Added header. */ /* * static char rcsid[] = * "$Id: dbfopen.c,v 1.48 2003/03/10 14:51:27 warmerda Exp $"; */ #include "shapefil.h" #include #include #include #include #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif static int nStringFieldLen = 0; static char * pszStringField = NULL; /************************************************************************/ /* SfRealloc() */ /* */ /* A realloc cover function that will access a NULL pointer as */ /* a valid input. */ /************************************************************************/ static void * SfRealloc( void * pMem, int nNewSize ) { if( pMem == NULL ) return( (void *) malloc(nNewSize) ); else return( (void *) realloc(pMem,nNewSize) ); } /************************************************************************/ /* DBFWriteHeader() */ /* */ /* This is called to write out the file header, and field */ /* descriptions before writing any actual data records. This */ /* also computes all the DBFDataSet field offset/size/decimals */ /* and so forth values. */ /************************************************************************/ static void DBFWriteHeader(DBFHandle psDBF) { unsigned char abyHeader[XBASE_FLDHDR_SZ]; int i; if( !psDBF->bNoHeader ) return; psDBF->bNoHeader = FALSE; /* -------------------------------------------------------------------- */ /* Initialize the file header information. */ /* -------------------------------------------------------------------- */ for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) abyHeader[i] = 0; abyHeader[0] = 0x03; /* memo field? - just copying */ /* date updated on close, record count preset at zero */ abyHeader[8] = psDBF->nHeaderLength % 256; abyHeader[9] = psDBF->nHeaderLength / 256; abyHeader[10] = psDBF->nRecordLength % 256; abyHeader[11] = psDBF->nRecordLength / 256; /* -------------------------------------------------------------------- */ /* Write the initial 32 byte file header, and all the field */ /* descriptions. */ /* -------------------------------------------------------------------- */ fseek( psDBF->fp, 0, 0 ); fwrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp ); fwrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, psDBF->fp ); /* -------------------------------------------------------------------- */ /* Write out the newline character if there is room for it. */ /* -------------------------------------------------------------------- */ if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 ) { char cNewline; cNewline = 0x0d; fwrite( &cNewline, 1, 1, psDBF->fp ); } } /************************************************************************/ /* DBFFlushRecord() */ /* */ /* Write out the current record if there is one. */ /************************************************************************/ static void DBFFlushRecord( DBFHandle psDBF ) { int nRecordOffset; if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) { psDBF->bCurrentRecordModified = FALSE; nRecordOffset = psDBF->nRecordLength * psDBF->nCurrentRecord + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); fwrite( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); } } /************************************************************************/ /* DBFOpen() */ /* */ /* Open a .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFOpen( const char * pszFilename, const char * pszAccess ) { DBFHandle psDBF; unsigned char *pabyBuf; int nFields, nHeadLen, nRecLen, iField, i; char *pszBasename, *pszFullname; /* -------------------------------------------------------------------- */ /* We only allow the access strings "rb" and "r+". */ /* -------------------------------------------------------------------- */ if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 && strcmp(pszAccess,"r+b") != 0 ) return( NULL ); if( strcmp(pszAccess,"r") == 0 ) pszAccess = "rb"; if( strcmp(pszAccess,"r+") == 0 ) pszAccess = "rb+"; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); psDBF->fp = fopen( pszFullname, pszAccess ); if( psDBF->fp == NULL ) { sprintf( pszFullname, "%s.DBF", pszBasename ); psDBF->fp = fopen(pszFullname, pszAccess ); } free( pszBasename ); free( pszFullname ); if( psDBF->fp == NULL ) { free( psDBF ); return( NULL ); } psDBF->bNoHeader = FALSE; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; /* -------------------------------------------------------------------- */ /* Read Table Header info */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) malloc(500); if( fread( pabyBuf, 32, 1, psDBF->fp ) != 1 ) { fclose( psDBF->fp ); free( pabyBuf ); free( psDBF ); return NULL; } psDBF->nRecords = pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256; psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256; psDBF->nRecordLength = nRecLen = pabyBuf[10] + pabyBuf[11]*256; psDBF->nFields = nFields = (nHeadLen - 32) / 32; psDBF->pszCurrentRecord = (char *) malloc(nRecLen); /* -------------------------------------------------------------------- */ /* Read in Field Definitions */ /* -------------------------------------------------------------------- */ pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); psDBF->pszHeader = (char *) pabyBuf; fseek( psDBF->fp, 32, 0 ); if( fread( pabyBuf, nHeadLen-32, 1, psDBF->fp ) != 1 ) { fclose( psDBF->fp ); free( pabyBuf ); free( psDBF ); return NULL; } psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); for( iField = 0; iField < nFields; iField++ ) { unsigned char *pabyFInfo; pabyFInfo = pabyBuf+iField*32; if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) { psDBF->panFieldSize[iField] = pabyFInfo[16]; psDBF->panFieldDecimals[iField] = pabyFInfo[17]; } else { psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; psDBF->panFieldDecimals[iField] = 0; } psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; if( iField == 0 ) psDBF->panFieldOffset[iField] = 1; else psDBF->panFieldOffset[iField] = psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; } return( psDBF ); } /************************************************************************/ /* DBFClose() */ /************************************************************************/ void SHPAPI_CALL DBFClose(DBFHandle psDBF) { /* -------------------------------------------------------------------- */ /* Write out header if not already written. */ /* -------------------------------------------------------------------- */ if( psDBF->bNoHeader ) DBFWriteHeader( psDBF ); DBFFlushRecord( psDBF ); /* -------------------------------------------------------------------- */ /* Update last access date, and number of records if we have */ /* write access. */ /* -------------------------------------------------------------------- */ if( psDBF->bUpdated ) { unsigned char abyFileHeader[32]; fseek( psDBF->fp, 0, 0 ); fread( abyFileHeader, 32, 1, psDBF->fp ); abyFileHeader[1] = 95; /* YY */ abyFileHeader[2] = 7; /* MM */ abyFileHeader[3] = 26; /* DD */ abyFileHeader[4] = psDBF->nRecords % 256; abyFileHeader[5] = (psDBF->nRecords/256) % 256; abyFileHeader[6] = (psDBF->nRecords/(256*256)) % 256; abyFileHeader[7] = (psDBF->nRecords/(256*256*256)) % 256; fseek( psDBF->fp, 0, 0 ); fwrite( abyFileHeader, 32, 1, psDBF->fp ); } /* -------------------------------------------------------------------- */ /* Close, and free resources. */ /* -------------------------------------------------------------------- */ fclose( psDBF->fp ); if( psDBF->panFieldOffset != NULL ) { free( psDBF->panFieldOffset ); free( psDBF->panFieldSize ); free( psDBF->panFieldDecimals ); free( psDBF->pachFieldType ); } free( psDBF->pszHeader ); free( psDBF->pszCurrentRecord ); free( psDBF ); if( pszStringField != NULL ) { free( pszStringField ); pszStringField = NULL; nStringFieldLen = 0; } } /************************************************************************/ /* DBFCreate() */ /* */ /* Create a new .dbf file. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCreate( const char * pszFilename ) { DBFHandle psDBF; FILE *fp; char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = strlen(pszBasename)-1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i-- ) {} if( pszBasename[i] == '.' ) pszBasename[i] = '\0'; pszFullname = (char *) malloc(strlen(pszBasename) + 5); sprintf( pszFullname, "%s.dbf", pszBasename ); free( pszBasename ); /* -------------------------------------------------------------------- */ /* Create the file. */ /* -------------------------------------------------------------------- */ fp = fopen( pszFullname, "wb" ); if( fp == NULL ) return( NULL ); fputc( 0, fp ); fclose( fp ); fp = fopen( pszFullname, "rb+" ); if( fp == NULL ) return( NULL ); free( pszFullname ); /* -------------------------------------------------------------------- */ /* Create the info structure. */ /* -------------------------------------------------------------------- */ psDBF = (DBFHandle) malloc(sizeof(DBFInfo)); psDBF->fp = fp; psDBF->nRecords = 0; psDBF->nFields = 0; psDBF->nRecordLength = 1; psDBF->nHeaderLength = 33; psDBF->panFieldOffset = NULL; psDBF->panFieldSize = NULL; psDBF->panFieldDecimals = NULL; psDBF->pachFieldType = NULL; psDBF->pszHeader = NULL; psDBF->nCurrentRecord = -1; psDBF->bCurrentRecordModified = FALSE; psDBF->pszCurrentRecord = NULL; psDBF->bNoHeader = TRUE; return( psDBF ); } /************************************************************************/ /* DBFAddField() */ /* */ /* Add a field to a newly created .dbf file before any records */ /* are written. */ /************************************************************************/ int SHPAPI_CALL DBFAddField(DBFHandle psDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ) { char *pszFInfo; int i; /* -------------------------------------------------------------------- */ /* Do some checking to ensure we can add records to this file. */ /* -------------------------------------------------------------------- */ if( psDBF->nRecords > 0 ) return( -1 ); if( !psDBF->bNoHeader ) return( -1 ); if( eType != FTDouble && nDecimals != 0 ) return( -1 ); if( nWidth < 1 ) return -1; /* -------------------------------------------------------------------- */ /* SfRealloc all the arrays larger to hold the additional field */ /* information. */ /* -------------------------------------------------------------------- */ psDBF->nFields++; psDBF->panFieldOffset = (int *) SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); psDBF->panFieldSize = (int *) SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); psDBF->panFieldDecimals = (int *) SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); psDBF->pachFieldType = (char *) SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); /* -------------------------------------------------------------------- */ /* Assign the new field information fields. */ /* -------------------------------------------------------------------- */ psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; psDBF->nRecordLength += nWidth; psDBF->panFieldSize[psDBF->nFields-1] = nWidth; psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; if( eType == FTLogical ) psDBF->pachFieldType[psDBF->nFields-1] = 'L'; else if( eType == FTString ) psDBF->pachFieldType[psDBF->nFields-1] = 'C'; else psDBF->pachFieldType[psDBF->nFields-1] = 'N'; /* -------------------------------------------------------------------- */ /* Extend the required header information. */ /* -------------------------------------------------------------------- */ psDBF->nHeaderLength += 32; psDBF->bUpdated = FALSE; psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32); pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1); for( i = 0; i < 32; i++ ) pszFInfo[i] = '\0'; if( (int) strlen(pszFieldName) < 10 ) strncpy( pszFInfo, pszFieldName, strlen(pszFieldName)); else strncpy( pszFInfo, pszFieldName, 10); pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; if( eType == FTString ) { pszFInfo[16] = nWidth % 256; pszFInfo[17] = nWidth / 256; } else { pszFInfo[16] = nWidth; pszFInfo[17] = nDecimals; } /* -------------------------------------------------------------------- */ /* Make the current record buffer appropriately larger. */ /* -------------------------------------------------------------------- */ psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, psDBF->nRecordLength); return( psDBF->nFields-1 ); } /************************************************************************/ /* DBFReadAttribute() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, char chReqType ) { int nRecordOffset; unsigned char *pabyRec; void *pReturnField = NULL; static double dDoubleField; /* -------------------------------------------------------------------- */ /* Verify selection. */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( iField < 0 || iField >= psDBF->nFields ) return( NULL ); /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; if( fseek( psDBF->fp, nRecordOffset, 0 ) != 0 ) { fprintf( stderr, "fseek(%d) failed on DBF file.\n", nRecordOffset ); return NULL; } if( fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) { fprintf( stderr, "fread(%d) failed on DBF file.\n", psDBF->nRecordLength ); return NULL; } psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Ensure our field buffer is large enough to hold this buffer. */ /* -------------------------------------------------------------------- */ if( psDBF->panFieldSize[iField]+1 > nStringFieldLen ) { nStringFieldLen = psDBF->panFieldSize[iField]*2 + 10; pszStringField = (char *) SfRealloc(pszStringField,nStringFieldLen); } /* -------------------------------------------------------------------- */ /* Extract the requested field. */ /* -------------------------------------------------------------------- */ strncpy( pszStringField, ((const char *) pabyRec) + psDBF->panFieldOffset[iField], psDBF->panFieldSize[iField] ); pszStringField[psDBF->panFieldSize[iField]] = '\0'; pReturnField = pszStringField; /* -------------------------------------------------------------------- */ /* Decode the field. */ /* -------------------------------------------------------------------- */ if( chReqType == 'N' ) { dDoubleField = atof(pszStringField); pReturnField = &dDoubleField; } /* -------------------------------------------------------------------- */ /* Should we trim white space off the string attribute value? */ /* -------------------------------------------------------------------- */ #ifdef TRIM_DBF_WHITESPACE else { char *pchSrc, *pchDst; pchDst = pchSrc = pszStringField; while( *pchSrc == ' ' ) pchSrc++; while( *pchSrc != '\0' ) *(pchDst++) = *(pchSrc++); *pchDst = '\0'; while( pchDst != pszStringField && *(--pchDst) == ' ' ) *pchDst = '\0'; } #endif return( pReturnField ); } /************************************************************************/ /* DBFReadIntAttribute() */ /* */ /* Read an integer attribute. */ /************************************************************************/ int SHPAPI_CALL DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0; else return( (int) *pdValue ); } /************************************************************************/ /* DBFReadDoubleAttribute() */ /* */ /* Read a double attribute. */ /************************************************************************/ double SHPAPI_CALL DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) { double *pdValue; pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); if( pdValue == NULL ) return 0.0; else return( *pdValue ); } /************************************************************************/ /* DBFReadStringAttribute() */ /* */ /* Read a string attribute. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); } /************************************************************************/ /* DBFReadLogicalAttribute() */ /* */ /* Read a logical attribute. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); } /************************************************************************/ /* DBFIsAttributeNULL() */ /* */ /* Return TRUE if value for field is NULL. */ /* */ /* Contributed by Jim Matthews. */ /************************************************************************/ int SHPAPI_CALL DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) { const char *pszValue; pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); switch(psDBF->pachFieldType[iField]) { case 'N': case 'F': /* NULL numeric fields have value "****************" */ return pszValue[0] == '*'; case 'D': /* NULL date fields have value "00000000" */ return strncmp(pszValue,"00000000",8) == 0; case 'L': /* NULL boolean fields have value "?" */ return pszValue[0] == '?'; default: /* empty string fields are considered NULL */ return strlen(pszValue) == 0; } } /************************************************************************/ /* DBFGetFieldCount() */ /* */ /* Return the number of fields in this table. */ /************************************************************************/ int SHPAPI_CALL DBFGetFieldCount( DBFHandle psDBF ) { return( psDBF->nFields ); } /************************************************************************/ /* DBFGetRecordCount() */ /* */ /* Return the number of records in this table. */ /************************************************************************/ int SHPAPI_CALL DBFGetRecordCount( DBFHandle psDBF ) { return( psDBF->nRecords ); } /************************************************************************/ /* DBFGetFieldInfo() */ /* */ /* Return any requested information about the field. */ /************************************************************************/ DBFFieldType SHPAPI_CALL DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ) { if( iField < 0 || iField >= psDBF->nFields ) return( FTInvalid ); if( pnWidth != NULL ) *pnWidth = psDBF->panFieldSize[iField]; if( pnDecimals != NULL ) *pnDecimals = psDBF->panFieldDecimals[iField]; if( pszFieldName != NULL ) { int i; strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 ); pszFieldName[11] = '\0'; for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- ) pszFieldName[i] = '\0'; } if ( psDBF->pachFieldType[iField] == 'L' ) return( FTLogical); else if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F' || psDBF->pachFieldType[iField] == 'D' ) { if( psDBF->panFieldDecimals[iField] > 0 ) return( FTDouble ); else return( FTInteger ); } else { return( FTString ); } } /************************************************************************/ /* DBFWriteAttribute() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int nRecordOffset, i, j, nRetResult = TRUE; unsigned char *pabyRec; char szSField[400], szFormat[20]; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { DBFFlushRecord( psDBF ); psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; /* -------------------------------------------------------------------- */ /* Translate NULL value to valid DBF file representation. */ /* */ /* Contributed by Jim Matthews. */ /* -------------------------------------------------------------------- */ if( pValue == NULL ) { switch(psDBF->pachFieldType[iField]) { case 'N': case 'F': /* NULL numeric fields have value "****************" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*', psDBF->panFieldSize[iField] ); break; case 'D': /* NULL date fields have value "00000000" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0', psDBF->panFieldSize[iField] ); break; case 'L': /* NULL boolean fields have value "?" */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?', psDBF->panFieldSize[iField] ); break; default: /* empty string fields are considered NULL */ memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '\0', psDBF->panFieldSize[iField] ); break; } return TRUE; } /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ switch( psDBF->pachFieldType[iField] ) { case 'D': case 'N': case 'F': if( psDBF->panFieldDecimals[iField] == 0 ) { int nWidth = psDBF->panFieldSize[iField]; if( sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%dd", nWidth ); sprintf(szSField, szFormat, (int) *((double *) pValue) ); if( (int)strlen(szSField) > psDBF->panFieldSize[iField] ) { szSField[psDBF->panFieldSize[iField]] = '\0'; nRetResult = FALSE; } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } else { int nWidth = psDBF->panFieldSize[iField]; if( sizeof(szSField)-2 < nWidth ) nWidth = sizeof(szSField)-2; sprintf( szFormat, "%%%d.%df", nWidth, psDBF->panFieldDecimals[iField] ); sprintf(szSField, szFormat, *((double *) pValue) ); if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) { szSField[psDBF->panFieldSize[iField]] = '\0'; nRetResult = FALSE; } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), szSField, strlen(szSField) ); } break; case 'L': if (psDBF->panFieldSize[iField] >= 1 && (*(char*)pValue == 'F' || *(char*)pValue == 'T')) *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue; break; default: if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) { j = psDBF->panFieldSize[iField]; nRetResult = FALSE; } else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); break; } return( nRetResult ); } /************************************************************************/ /* DBFWriteAttributeDirectly() */ /* */ /* Write an attribute record to the file, but without any */ /* reformatting based on type. The provided buffer is written */ /* as is to the field position in the record. */ /************************************************************************/ int DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void * pValue ) { int nRecordOffset, i, j; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { DBFFlushRecord( psDBF ); psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; /* -------------------------------------------------------------------- */ /* Assign all the record fields. */ /* -------------------------------------------------------------------- */ if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] ) j = psDBF->panFieldSize[iField]; else { memset( pabyRec+psDBF->panFieldOffset[iField], ' ', psDBF->panFieldSize[iField] ); j = strlen((char *) pValue); } strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), (char *) pValue, j ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFWriteDoubleAttribute() */ /* */ /* Write a double attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, double dValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteIntegerAttribute() */ /* */ /* Write a integer attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, int nValue ) { double dValue = nValue; return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); } /************************************************************************/ /* DBFWriteStringAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, const char * pszValue ) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); } /************************************************************************/ /* DBFWriteNULLAttribute() */ /* */ /* Write a string attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) { return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) ); } /************************************************************************/ /* DBFWriteLogicalAttribute() */ /* */ /* Write a logical attribute. */ /************************************************************************/ int SHPAPI_CALL DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, const char lValue) { return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) ); } /************************************************************************/ /* DBFWriteTuple() */ /* */ /* Write an attribute record to the file. */ /************************************************************************/ int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) { int nRecordOffset, i; unsigned char *pabyRec; /* -------------------------------------------------------------------- */ /* Is this a valid record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity > psDBF->nRecords ) return( FALSE ); if( psDBF->bNoHeader ) DBFWriteHeader(psDBF); /* -------------------------------------------------------------------- */ /* Is this a brand new record? */ /* -------------------------------------------------------------------- */ if( hEntity == psDBF->nRecords ) { DBFFlushRecord( psDBF ); psDBF->nRecords++; for( i = 0; i < psDBF->nRecordLength; i++ ) psDBF->pszCurrentRecord[i] = ' '; psDBF->nCurrentRecord = hEntity; } /* -------------------------------------------------------------------- */ /* Is this an existing record, but different than the last one */ /* we accessed? */ /* -------------------------------------------------------------------- */ if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); psDBF->bCurrentRecordModified = TRUE; psDBF->bUpdated = TRUE; return( TRUE ); } /************************************************************************/ /* DBFReadTuple() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity ) { int nRecordOffset; unsigned char *pabyRec; static char *pReturnTuple = NULL; static int nTupleLen = 0; /* -------------------------------------------------------------------- */ /* Have we read the record? */ /* -------------------------------------------------------------------- */ if( hEntity < 0 || hEntity >= psDBF->nRecords ) return( NULL ); if( psDBF->nCurrentRecord != hEntity ) { DBFFlushRecord( psDBF ); nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength; fseek( psDBF->fp, nRecordOffset, 0 ); fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp ); psDBF->nCurrentRecord = hEntity; } pabyRec = (unsigned char *) psDBF->pszCurrentRecord; if ( nTupleLen < psDBF->nRecordLength) { nTupleLen = psDBF->nRecordLength; pReturnTuple = (char *) SfRealloc(pReturnTuple, psDBF->nRecordLength); } memcpy ( pReturnTuple, pabyRec, psDBF->nRecordLength ); return( pReturnTuple ); } /************************************************************************/ /* DBFCloneEmpty() */ /* */ /* Read one of the attribute fields of a record. */ /************************************************************************/ DBFHandle SHPAPI_CALL DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) { DBFHandle newDBF; newDBF = DBFCreate ( pszFilename ); if ( newDBF == NULL ) return ( NULL ); newDBF->pszHeader = (char *) malloc ( 32 * psDBF->nFields ); memcpy ( newDBF->pszHeader, psDBF->pszHeader, 32 * psDBF->nFields ); newDBF->nFields = psDBF->nFields; newDBF->nRecordLength = psDBF->nRecordLength; newDBF->nHeaderLength = 32 * (psDBF->nFields+1); newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); newDBF->pachFieldType = (char *) malloc ( sizeof(int) * psDBF->nFields ); memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(int) * psDBF->nFields ); newDBF->bNoHeader = TRUE; newDBF->bUpdated = TRUE; DBFWriteHeader ( newDBF ); DBFClose ( newDBF ); newDBF = DBFOpen ( pszFilename, "rb+" ); return ( newDBF ); } /************************************************************************/ /* DBFGetNativeFieldType() */ /* */ /* Return the DBase field type for the specified field. */ /* */ /* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ /* 'N' (Numeric, with or without decimal), */ /* 'L' (Logical), */ /* 'M' (Memo: 10 digits .DBT block ptr) */ /************************************************************************/ char SHPAPI_CALL DBFGetNativeFieldType( DBFHandle psDBF, int iField ) { if( iField >=0 && iField < psDBF->nFields ) return psDBF->pachFieldType[iField]; return ' '; } /************************************************************************/ /* str_to_upper() */ /************************************************************************/ static void str_to_upper (char *string) { int len; short i = -1; len = strlen (string); while (++i < len) if (isalpha(string[i]) && islower(string[i])) string[i] = toupper ((int)string[i]); } /************************************************************************/ /* DBFGetFieldIndex() */ /* */ /* Get the index number for a field in a .dbf file. */ /* */ /* Contributed by Jim Matthews. */ /************************************************************************/ int SHPAPI_CALL DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) { char name[12], name1[12], name2[12]; int i; strncpy(name1, pszFieldName,11); name1[11] = '\0'; str_to_upper(name1); for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) { DBFGetFieldInfo( psDBF, i, name, NULL, NULL ); strncpy(name2,name,11); str_to_upper(name2); if(!strncmp(name1,name2,10)) return(i); } return(-1); } therion/extern/getline.c0000664000175000017500000000713412047263476014366 0ustar useruser/* getline.c -- Replacement for GNU C library function getline Copyright (C) 1993, 1996, 1997 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Jan Brittenson, bson@gnu.ai.mit.edu. */ #if HAVE_CONFIG_H # include #endif /* The `getdelim' function is only declared if the following symbol is defined. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #include #include #if defined __GNU_LIBRARY__ && HAVE_GETDELIM int getline (lineptr, n, stream) char **lineptr; size_t *n; FILE *stream; { return getdelim (lineptr, n, '\n', stream); } #else /* ! have getdelim */ # define NDEBUG # include # include /* Always add at least this many bytes when extending the buffer. */ # define MIN_CHUNK 64 /* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR + OFFSET (and null-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Return the number of characters read (not including the null terminator), or -1 on error or EOF. */ int getstr (lineptr, n, stream, terminator, offset) char **lineptr; size_t *n; FILE *stream; char terminator; size_t offset; { int nchars_avail; /* Allocated but unused chars in *LINEPTR. */ char *read_pos; /* Where we're reading into *LINEPTR. */ int ret; if (!lineptr || !n || !stream) return -1; if (!*lineptr) { *n = MIN_CHUNK; *lineptr = malloc (*n); if (!*lineptr) return -1; } nchars_avail = *n - offset; read_pos = *lineptr + offset; for (;;) { register int c = getc (stream); /* We always want at least one char left in the buffer, since we always (unless we get an error while reading the first char) NUL-terminate the line buffer. */ assert(*n - nchars_avail == read_pos - *lineptr); if (nchars_avail < 2) { if (*n > MIN_CHUNK) *n *= 2; else *n += MIN_CHUNK; nchars_avail = *n + *lineptr - read_pos; *lineptr = realloc (*lineptr, *n); if (!*lineptr) return -1; read_pos = *n - nchars_avail + *lineptr; assert(*n - nchars_avail == read_pos - *lineptr); } if (c == EOF || ferror (stream)) { /* Return partial line, if any. */ if (read_pos == *lineptr) return -1; else break; } *read_pos++ = c; nchars_avail--; if (c == terminator) /* Return the line. */ break; } /* Done - NUL terminate and return the number of chars read. */ *read_pos = '\0'; ret = read_pos - (*lineptr + offset); return ret; } #ifndef __APPLE__ int getline (lineptr, n, stream) char **lineptr; size_t *n; FILE *stream; { return getstr (lineptr, n, stream, '\n', 0); } int getdelim (lineptr, n, delimiter, stream) char **lineptr; size_t *n; int delimiter; FILE *stream; { return getstr (lineptr, n, stream, delimiter, 0); } #endif #endiftherion/extern/shapefil.h0000664000175000017500000004003207644336552014534 0ustar useruser#ifndef _SHAPEFILE_H_INCLUDED #define _SHAPEFILE_H_INCLUDED /****************************************************************************** * $Id: shapefil.h,v 1.26 2002/09/29 00:00:08 warmerda Exp $ * * Project: Shapelib * Purpose: Primary include file for Shapelib. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * This software is available under the following "MIT Style" license, * or at the option of the licensee under the LGPL (see LICENSE.LGPL). This * option is discussed in more detail in shapelib.html. * * -- * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: shapefil.h,v $ * Revision 1.26 2002/09/29 00:00:08 warmerda * added FTLogical and logical attribute read/write calls * * Revision 1.25 2002/05/07 13:46:30 warmerda * added DBFWriteAttributeDirectly(). * * Revision 1.24 2002/04/10 16:59:54 warmerda * added SHPRewindObject * * Revision 1.23 2002/01/15 14:36:07 warmerda * updated email address * * Revision 1.22 2002/01/15 14:32:00 warmerda * try to improve SHPAPI_CALL docs * * Revision 1.21 2001/11/01 16:29:55 warmerda * move pabyRec into SHPInfo for thread safety * * Revision 1.20 2001/07/20 13:06:02 warmerda * fixed SHPAPI attribute for SHPTreeFindLikelyShapes * * Revision 1.19 2001/05/31 19:20:13 warmerda * added DBFGetFieldIndex() * * Revision 1.18 2001/05/31 18:15:40 warmerda * Added support for NULL fields in DBF files * * Revision 1.17 2001/05/23 13:36:52 warmerda * added use of SHPAPI_CALL * * Revision 1.16 2000/09/25 14:15:59 warmerda * added DBFGetNativeFieldType() * * Revision 1.15 2000/02/16 16:03:51 warmerda * added null shape support * * Revision 1.14 1999/11/05 14:12:05 warmerda * updated license terms * * Revision 1.13 1999/06/02 18:24:21 warmerda * added trimming code * * Revision 1.12 1999/06/02 17:56:12 warmerda * added quad'' subnode support for trees * * Revision 1.11 1999/05/18 19:11:11 warmerda * Added example searching capability * * Revision 1.10 1999/05/18 17:49:38 warmerda * added initial quadtree support * * Revision 1.9 1999/05/11 03:19:28 warmerda * added new Tuple api, and improved extension handling - add from candrsn * * Revision 1.8 1999/03/23 17:22:27 warmerda * Added extern "C" protection for C++ users of shapefil.h. * * Revision 1.7 1998/12/31 15:31:07 warmerda * Added the TRIM_DBF_WHITESPACE and DISABLE_MULTIPATCH_MEASURE options. * * Revision 1.6 1998/12/03 15:48:15 warmerda * Added SHPCalculateExtents(). * * Revision 1.5 1998/11/09 20:57:16 warmerda * Altered SHPGetInfo() call. * * Revision 1.4 1998/11/09 20:19:33 warmerda * Added 3D support, and use of SHPObject. * * Revision 1.3 1995/08/23 02:24:05 warmerda * Added support for reading bounds. * * Revision 1.2 1995/08/04 03:17:39 warmerda * Added header. * */ #include #ifdef USE_DBMALLOC #include #endif #ifdef __cplusplus extern "C" { #endif /************************************************************************/ /* Configuration options. */ /************************************************************************/ /* -------------------------------------------------------------------- */ /* Should the DBFReadStringAttribute() strip leading and */ /* trailing white space? */ /* -------------------------------------------------------------------- */ #define TRIM_DBF_WHITESPACE /* -------------------------------------------------------------------- */ /* Should we write measure values to the Multipatch object? */ /* Reportedly ArcView crashes if we do write it, so for now it */ /* is disabled. */ /* -------------------------------------------------------------------- */ #define DISABLE_MULTIPATCH_MEASURE /* -------------------------------------------------------------------- */ /* SHPAPI_CALL */ /* */ /* The following two macros are present to allow forcing */ /* various calling conventions on the Shapelib API. */ /* */ /* To force __stdcall conventions (needed to call Shapelib */ /* from Visual Basic and/or Dephi I believe) the makefile could */ /* be modified to define: */ /* */ /* /DSHPAPI_CALL=__stdcall */ /* */ /* If it is desired to force export of the Shapelib API without */ /* using the shapelib.def file, use the following definition. */ /* */ /* /DSHAPELIB_DLLEXPORT */ /* */ /* To get both at once it will be necessary to hack this */ /* include file to define: */ /* */ /* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ /* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ /* */ /* The complexity of the situtation is partly caused by the */ /* peculiar requirement of Visual C++ that __stdcall appear */ /* after any "*"'s in the return value of a function while the */ /* __declspec(dllexport) must appear before them. */ /* -------------------------------------------------------------------- */ #ifdef SHAPELIB_DLLEXPORT # define SHPAPI_CALL __declspec(dllexport) # define SHPAPI_CALL1(x) __declspec(dllexport) x #endif #ifndef SHPAPI_CALL # define SHPAPI_CALL #endif #ifndef SHPAPI_CALL1 # define SHPAPI_CALL1(x) x SHPAPI_CALL #endif /************************************************************************/ /* SHP Support. */ /************************************************************************/ typedef struct { FILE *fpSHP; FILE *fpSHX; int nShapeType; /* SHPT_* */ int nFileSize; /* SHP file */ int nRecords; int nMaxRecords; int *panRecOffset; int *panRecSize; double adBoundsMin[4]; double adBoundsMax[4]; int bUpdated; unsigned char *pabyRec; int nBufSize; } SHPInfo; typedef SHPInfo * SHPHandle; /* -------------------------------------------------------------------- */ /* Shape types (nSHPType) */ /* -------------------------------------------------------------------- */ #define SHPT_NULL 0 #define SHPT_POINT 1 #define SHPT_ARC 3 #define SHPT_POLYGON 5 #define SHPT_MULTIPOINT 8 #define SHPT_POINTZ 11 #define SHPT_ARCZ 13 #define SHPT_POLYGONZ 15 #define SHPT_MULTIPOINTZ 18 #define SHPT_POINTM 21 #define SHPT_ARCM 23 #define SHPT_POLYGONM 25 #define SHPT_MULTIPOINTM 28 #define SHPT_MULTIPATCH 31 /* -------------------------------------------------------------------- */ /* Part types - everything but SHPT_MULTIPATCH just uses */ /* SHPP_RING. */ /* -------------------------------------------------------------------- */ #define SHPP_TRISTRIP 0 #define SHPP_TRIFAN 1 #define SHPP_OUTERRING 2 #define SHPP_INNERRING 3 #define SHPP_FIRSTRING 4 #define SHPP_RING 5 /* -------------------------------------------------------------------- */ /* SHPObject - represents on shape (without attributes) read */ /* from the .shp file. */ /* -------------------------------------------------------------------- */ typedef struct { int nSHPType; int nShapeId; /* -1 is unknown/unassigned */ int nParts; int *panPartStart; int *panPartType; int nVertices; double *padfX; double *padfY; double *padfZ; double *padfM; double dfXMin; double dfYMin; double dfZMin; double dfMMin; double dfXMax; double dfYMax; double dfZMax; double dfMMax; } SHPObject; /* -------------------------------------------------------------------- */ /* SHP API Prototypes */ /* -------------------------------------------------------------------- */ SHPHandle SHPAPI_CALL SHPOpen( const char * pszShapeFile, const char * pszAccess ); SHPHandle SHPAPI_CALL SHPCreate( const char * pszShapeFile, int nShapeType ); void SHPAPI_CALL SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, double * padfMinBound, double * padfMaxBound ); SHPObject SHPAPI_CALL1(*) SHPReadObject( SHPHandle hSHP, int iShape ); int SHPAPI_CALL SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); void SHPAPI_CALL SHPDestroyObject( SHPObject * psObject ); void SHPAPI_CALL SHPComputeExtents( SHPObject * psObject ); SHPObject SHPAPI_CALL1(*) SHPCreateObject( int nSHPType, int nShapeId, int nParts, int * panPartStart, int * panPartType, int nVertices, double * padfX, double * padfY, double * padfZ, double * padfM ); SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject( int nSHPType, int nVertices, double * padfX, double * padfY, double * padfZ ); int SHPAPI_CALL SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); void SHPAPI_CALL SHPClose( SHPHandle hSHP ); const char SHPAPI_CALL1(*) SHPTypeName( int nSHPType ); const char SHPAPI_CALL1(*) SHPPartTypeName( int nPartType ); /* -------------------------------------------------------------------- */ /* Shape quadtree indexing API. */ /* -------------------------------------------------------------------- */ /* this can be two or four for binary or quad tree */ #define MAX_SUBNODE 4 typedef struct shape_tree_node { /* region covered by this node */ double adfBoundsMin[4]; double adfBoundsMax[4]; /* list of shapes stored at this node. The papsShapeObj pointers or the whole list can be NULL */ int nShapeCount; int *panShapeIds; SHPObject **papsShapeObj; int nSubNodes; struct shape_tree_node *apsSubNode[MAX_SUBNODE]; } SHPTreeNode; typedef struct { SHPHandle hSHP; int nMaxDepth; int nDimension; SHPTreeNode *psRoot; } SHPTree; SHPTree SHPAPI_CALL1(*) SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, double *padfBoundsMin, double *padfBoundsMax ); void SHPAPI_CALL SHPDestroyTree( SHPTree * hTree ); int SHPAPI_CALL SHPWriteTree( SHPTree *hTree, const char * pszFilename ); SHPTree SHPAPI_CALL SHPReadTree( const char * pszFilename ); int SHPAPI_CALL SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject ); int SHPAPI_CALL SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); int SHPAPI_CALL SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); void SHPAPI_CALL SHPTreeTrimExtraNodes( SHPTree * hTree ); int SHPAPI_CALL1(*) SHPTreeFindLikelyShapes( SHPTree * hTree, double * padfBoundsMin, double * padfBoundsMax, int * ); int SHPAPI_CALL SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); /************************************************************************/ /* DBF Support. */ /************************************************************************/ typedef struct { FILE *fp; int nRecords; int nRecordLength; int nHeaderLength; int nFields; int *panFieldOffset; int *panFieldSize; int *panFieldDecimals; char *pachFieldType; char *pszHeader; int nCurrentRecord; int bCurrentRecordModified; char *pszCurrentRecord; int bNoHeader; int bUpdated; } DBFInfo; typedef DBFInfo * DBFHandle; typedef enum { FTString, FTInteger, FTDouble, FTLogical, FTInvalid } DBFFieldType; #define XBASE_FLDHDR_SZ 32 DBFHandle SHPAPI_CALL DBFOpen( const char * pszDBFFile, const char * pszAccess ); DBFHandle SHPAPI_CALL DBFCreate( const char * pszDBFFile ); int SHPAPI_CALL DBFGetFieldCount( DBFHandle psDBF ); int SHPAPI_CALL DBFGetRecordCount( DBFHandle psDBF ); int SHPAPI_CALL DBFAddField( DBFHandle hDBF, const char * pszFieldName, DBFFieldType eType, int nWidth, int nDecimals ); DBFFieldType SHPAPI_CALL DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, int * pnWidth, int * pnDecimals ); int SHPAPI_CALL DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); int SHPAPI_CALL DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); double SHPAPI_CALL DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); const char SHPAPI_CALL1(*) DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); const char SHPAPI_CALL1(*) DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, int nFieldValue ); int SHPAPI_CALL DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, double dFieldValue ); int SHPAPI_CALL DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, const char * pszFieldValue ); int SHPAPI_CALL DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); int SHPAPI_CALL DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, const char lFieldValue); int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void * pValue ); const char SHPAPI_CALL1(*) DBFReadTuple(DBFHandle psDBF, int hEntity ); int SHPAPI_CALL DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); DBFHandle SHPAPI_CALL DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); void SHPAPI_CALL DBFClose( DBFHandle hDBF ); char SHPAPI_CALL DBFGetNativeFieldType( DBFHandle hDBF, int iField ); #ifdef __cplusplus } #endif #endif /* ndef _SHAPEFILE_H_INCLUDED */ therion/extern/poly2tri/0000775000175000017500000000000012426432002014332 5ustar userusertherion/extern/poly2tri/sweep/0000775000175000017500000000000012447663066015500 5ustar userusertherion/extern/poly2tri/sweep/cdt.h0000664000175000017500000000421011447322660016407 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CDT_H #define CDT_H #include "advancing_front.h" #include "sweep_context.h" #include "sweep.h" namespace p2t { class CDT { public: /// Constructor CDT(std::vector polyline); /// Destructor ~CDT(); /// Add a hole void AddHole(std::vector polyline); /// Add a single point void AddPoint(Point* point); /// Triangulate points void Triangulate(); /// Get Delaunay triangles std::vector GetTriangles(); /// Get triangle map std::list GetMap(); private: SweepContext* sweep_context_; Sweep* sweep_; }; } #endif therion/extern/poly2tri/sweep/sweep_context.cc0000664000175000017500000001211611447322660020666 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "sweep_context.h" #include #include "advancing_front.h" namespace p2t { SweepContext::SweepContext(std::vector polyline) { basin = Basin(); edge_event = EdgeEvent(); points_ = polyline; InitEdges(points_); } void SweepContext::AddHole(std::vector polyline) { InitEdges(polyline); for(int i = 0; i < polyline.size(); i++) { points_.push_back(polyline[i]); } } void SweepContext::AddPoint(Point* point) { points_.push_back(point); } std::vector SweepContext::GetTriangles() { return triangles_; } std::list SweepContext::GetMap() { return map_; } void SweepContext::InitTriangulation() { double xmax(points_[0]->x), xmin(points_[0]->x); double ymax(points_[0]->y), ymin(points_[0]->y); // Calculate bounds. for (int i = 0; i < points_.size(); i++) { Point& p = *points_[i]; if (p.x > xmax) xmax = p.x; if (p.x < xmin) xmin = p.x; if (p.y > ymax) ymax = p.y; if (p.y < ymin) ymin = p.y; } double dx = kAlpha * (xmax - xmin); double dy = kAlpha * (ymax - ymin); head_ = new Point(xmax + dx, ymin - dy); tail_ = new Point(xmin - dx, ymin - dy); // Sort points along y-axis std::sort(points_.begin(), points_.end(), cmp); } void SweepContext::InitEdges(std::vector polyline) { int num_points = polyline.size(); for (int i = 0; i < num_points; i++) { int j = i < num_points - 1 ? i + 1 : 0; edge_list.push_back(new Edge(*polyline[i], *polyline[j])); } } Point* SweepContext::GetPoint(const int& index) { return points_[index]; } void SweepContext::AddToMap(Triangle* triangle) { map_.push_back(triangle); } Node& SweepContext::LocateNode(Point& point) { // TODO implement search tree return *front_->LocateNode(point.x); } void SweepContext::CreateAdvancingFront(std::vector nodes) { // Initial triangle Triangle* triangle = new Triangle(*points_[0], *tail_, *head_); map_.push_back(triangle); af_head_ = new Node(*triangle->GetPoint(1), *triangle); af_middle_ = new Node(*triangle->GetPoint(0), *triangle); af_tail_ = new Node(*triangle->GetPoint(2)); front_ = new AdvancingFront(*af_head_, *af_tail_); // TODO: More intuitive if head is middles next and not previous? // so swap head and tail af_head_->next = af_middle_; af_middle_->next = af_tail_; af_middle_->prev = af_head_; af_tail_->prev = af_middle_; } void SweepContext::RemoveNode(Node* node) { delete node; } void SweepContext::MapTriangleToNodes(Triangle& t) { for (int i = 0; i < 3; i++) { if (!t.GetNeighbor(i)) { Node* n = front_->LocatePoint(t.PointCW(*t.GetPoint(i))); if (n) n->triangle = &t; } } } void SweepContext::RemoveFromMap(Triangle* triangle) { map_.remove(triangle); } void SweepContext::MeshClean(Triangle& triangle) { if (&triangle != NULL && !triangle.IsInterior()) { triangle.IsInterior(true); triangles_.push_back(&triangle); for (int i = 0; i < 3; i++) { if (!triangle.constrained_edge[i]) MeshClean(*triangle.GetNeighbor(i)); } } } SweepContext::~SweepContext() { // Clean up memory delete head_; delete tail_; delete front_; delete af_head_; delete af_middle_; delete af_tail_; typedef std::list type_list; for(type_list::iterator iter = map_.begin(); iter != map_.end(); ++iter) { Triangle* ptr = *iter; delete ptr; } for(int i = 0; i < edge_list.size(); i++) { delete edge_list[i]; } } } therion/extern/poly2tri/sweep/sweep.cc0000664000175000017500000005573011712224760017130 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "sweep.h" #include "sweep_context.h" #include "advancing_front.h" #include "../common/utils.h" namespace p2t { // Triangulate simple polygon with holes void Sweep::Triangulate(SweepContext& tcx) { tcx.InitTriangulation(); tcx.CreateAdvancingFront(nodes_); // Sweep points; build mesh SweepPoints(tcx); // Clean up FinalizationPolygon(tcx); } void Sweep::SweepPoints(SweepContext& tcx) { for (int i = 1; i < tcx.point_count(); i++) { Point& point = *tcx.GetPoint(i); Node* node = &PointEvent(tcx, point); for (int i = 0; i < point.edge_list.size(); i++) { EdgeEvent(tcx, point.edge_list[i], node); } } } void Sweep::FinalizationPolygon(SweepContext& tcx) { // Get an Internal triangle to start with Triangle* t = tcx.front()->head()->next->triangle; Point* p = tcx.front()->head()->next->point; while (!t->GetConstrainedEdgeCW(*p)) { t = t->NeighborCCW(*p); // TU TO PADLO! if (t == NULL) return; } // Collect interior triangles constrained by edges tcx.MeshClean(*t); } /** * Find closes node to the left of the new point and * create a new triangle. If needed new holes and basins * will be filled to. * * @param tcx * @param point * @return */ Node& Sweep::PointEvent(SweepContext& tcx, Point& point) { Node& node = tcx.LocateNode(point); Node& new_node = NewFrontTriangle(tcx, point, node); // Only need to check +epsilon since point never have smaller // x value than node due to how we fetch nodes from the front if (point.x <= node.point->x + EPSILON) { Fill(tcx, node); } //tcx.AddNode(new_node); FillAdvancingFront(tcx, new_node); return new_node; } void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node* node) { tcx.edge_event.constrained_edge = edge; tcx.edge_event.right = (edge->p->x > edge->q->x); if (IsEdgeSideOfTriangle(*node->triangle, *edge->p, *edge->q)) { return; } // For now we will do all needed filling // TODO: integrate with flip process might give some better performance // but for now this avoid the issue with cases that needs both flips and fills FillEdgeEvent(tcx, edge, node); EdgeEvent(tcx, *edge->p, *edge->q, node->triangle, *edge->q); } void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point) { if (IsEdgeSideOfTriangle(*triangle, ep, eq)) { return; } Point* p1 = triangle->PointCCW(point); Orientation o1 = Orient2d(eq, *p1, ep); if (o1 == COLLINEAR) { //throw new RuntimeException( "EdgeEvent - Collinear not supported" ); throw(false); //assert(false); } Point* p2 = triangle->PointCW(point); Orientation o2 = Orient2d(eq, *p2, ep); if (o2 == COLLINEAR) { //throw new RuntimeException( "EdgeEvent - Collinear not supported" ); throw(false); //assert(false); } if (o1 == o2) { // Need to decide if we are rotating CW or CCW to get to a triangle // that will cross edge if (o1 == CW) { triangle = triangle->NeighborCCW(point); } else{ triangle = triangle->NeighborCW(point); } EdgeEvent(tcx, ep, eq, triangle, point); } else { // This triangle crosses constraint so lets flippin start! FlipEdgeEvent(tcx, ep, eq, triangle, point); } } bool Sweep::IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq) { int index = triangle.EdgeIndex(&ep, &eq); if (index != -1) { triangle.MarkConstrainedEdge(index); Triangle* t = triangle.GetNeighbor(index); if (t) { t->MarkConstrainedEdge(&ep, &eq); } return true; } return false; } Node& Sweep::NewFrontTriangle(SweepContext& tcx, Point& point, Node& node) { Triangle* triangle = new Triangle(point, *node.point, *node.next->point); triangle->MarkNeighbor(*node.triangle); tcx.AddToMap(triangle); Node* new_node = new Node(point); nodes_.push_back(new_node); new_node->next = node.next; new_node->prev = &node; node.next->prev = new_node; node.next = new_node; if (!Legalize(tcx, *triangle)) { tcx.MapTriangleToNodes(*triangle); } return *new_node; } /** * Adds a triangle to the advancing front to fill a hole. * @param tcx * @param node - middle node, that is the bottom of the hole */ void Sweep::Fill(SweepContext& tcx, Node& node) { Triangle* triangle = new Triangle(*node.prev->point, *node.point, *node.next->point); // TODO: should copy the constrained_edge value from neighbor triangles // for now constrained_edge values are copied during the legalize triangle->MarkNeighbor(*node.prev->triangle); triangle->MarkNeighbor(*node.triangle); tcx.AddToMap(triangle); // Update the advancing front node.prev->next = node.next; node.next->prev = node.prev; // If it was legalized the triangle has already been mapped if (!Legalize(tcx, *triangle)) { tcx.MapTriangleToNodes(*triangle); } } /** * Fills holes in the Advancing Front * * * @param tcx * @param n */ void Sweep::FillAdvancingFront(SweepContext& tcx, Node& n) { // Fill right holes Node* node = n.next; while (node->next) { double angle = HoleAngle(*node); if (angle > M_PI_2 || angle < -M_PI_2) break; Fill(tcx, *node); node = node->next; } // Fill left holes node = n.prev; while (node->prev) { double angle = HoleAngle(*node); if (angle > M_PI_2 || angle < -M_PI_2) break; Fill(tcx, *node); node = node->prev; } // Fill right basins if (n.next && n.next->next) { double angle = BasinAngle(n); if (angle < PI_3div4) { FillBasin(tcx, n); } } } double Sweep::BasinAngle(Node& node) { double ax = node.point->x - node.next->next->point->x; double ay = node.point->y - node.next->next->point->y; return atan2(ay, ax); } /** * * @param node - middle node * @return the angle between 3 front nodes */ double Sweep::HoleAngle(Node& node) { /* Complex plane * ab = cosA +i*sinA * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx) * atan2(y,x) computes the principal value of the argument function * applied to the complex number x+iy * Where x = ax*bx + ay*by * y = ax*by - ay*bx */ double ax = node.next->point->x - node.point->x; double ay = node.next->point->y - node.point->y; double bx = node.prev->point->x - node.point->x; double by = node.prev->point->y - node.point->y; return atan2(ax * by - ay * bx, ax * bx + ay * by); } /** * Returns true if triangle was legalized */ bool Sweep::Legalize(SweepContext& tcx, Triangle& t) { // To legalize a triangle we start by finding if any of the three edges // violate the Delaunay condition for (int i = 0; i < 3; i++) { if (t.delaunay_edge[i]) continue; Triangle* ot = t.GetNeighbor(i); if (ot) { Point* p = t.GetPoint(i); Point* op = ot->OppositePoint(t, *p); int oi = ot->Index(op); // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization) // then we should not try to legalize if (ot->constrained_edge[oi] || ot->delaunay_edge[oi]) { t.constrained_edge[i] = ot->constrained_edge[oi]; continue; } bool inside = Incircle(*p, *t.PointCCW(*p), *t.PointCW(*p), *op); if (inside) { // Lets mark this shared edge as Delaunay t.delaunay_edge[i] = true; ot->delaunay_edge[oi] = true; // Lets rotate shared edge one vertex CW to legalize it RotateTrianglePair(t, *p, *ot, *op); // We now got one valid Delaunay Edge shared by two triangles // This gives us 4 new edges to check for Delaunay // Make sure that triangle to node mapping is done only one time for a specific triangle bool not_legalized = !Legalize(tcx, t); if (not_legalized) { tcx.MapTriangleToNodes(t); } not_legalized = !Legalize(tcx, *ot); if (not_legalized) tcx.MapTriangleToNodes(*ot); // Reset the Delaunay edges, since they only are valid Delaunay edges // until we add a new triangle or point. // XXX: need to think about this. Can these edges be tried after we // return to previous recursive level? t.delaunay_edge[i] = false; ot->delaunay_edge[oi] = false; // If triangle have been legalized no need to check the other edges since // the recursive legalization will handles those so we can end here. return true; } } } return false; } /** * Requirement:
* 1. a,b and c form a triangle.
* 2. a and d is know to be on opposite side of bc
*
 *                a
 *                +
 *               / \
 *              /   \
 *            b/     \c
 *            +-------+
 *           /    d    \
 *          /           \
 * 
* Fact: d has to be in area B to have a chance to be inside the circle formed by * a,b and c
* d is outside B if orient2d(a,b,d) or orient2d(c,a,d) is CW
* This preknowledge gives us a way to optimize the incircle test * @param a - triangle point, opposite d * @param b - triangle point * @param c - triangle point * @param d - point opposite a * @return true if d is inside circle, false if on circle edge */ bool Sweep::Incircle(Point& pa, Point& pb, Point& pc, Point& pd) { double adx = pa.x - pd.x; double ady = pa.y - pd.y; double bdx = pb.x - pd.x; double bdy = pb.y - pd.y; double adxbdy = adx * bdy; double bdxady = bdx * ady; double oabd = adxbdy - bdxady; if (oabd <= 0) return false; double cdx = pc.x - pd.x; double cdy = pc.y - pd.y; double cdxady = cdx * ady; double adxcdy = adx * cdy; double ocad = cdxady - adxcdy; if (ocad <= 0) return false; double bdxcdy = bdx * cdy; double cdxbdy = cdx * bdy; double alift = adx * adx + ady * ady; double blift = bdx * bdx + bdy * bdy; double clift = cdx * cdx + cdy * cdy; double det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd; return det > 0; } /** * Rotates a triangle pair one vertex CW *
 *       n2                    n2
 *  P +-----+             P +-----+
 *    | t  /|               |\  t |
 *    |   / |               | \   |
 *  n1|  /  |n3           n1|  \  |n3
 *    | /   |    after CW   |   \ |
 *    |/ oT |               | oT \|
 *    +-----+ oP            +-----+
 *       n4                    n4
 * 
*/ void Sweep::RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op) { Triangle* n1, *n2, *n3, *n4; n1 = t.NeighborCCW(p); n2 = t.NeighborCW(p); n3 = ot.NeighborCCW(op); n4 = ot.NeighborCW(op); bool ce1, ce2, ce3, ce4; ce1 = t.GetConstrainedEdgeCCW(p); ce2 = t.GetConstrainedEdgeCW(p); ce3 = ot.GetConstrainedEdgeCCW(op); ce4 = ot.GetConstrainedEdgeCW(op); bool de1, de2, de3, de4; de1 = t.GetDelunayEdgeCCW(p); de2 = t.GetDelunayEdgeCW(p); de3 = ot.GetDelunayEdgeCCW(op); de4 = ot.GetDelunayEdgeCW(op); t.Legalize(p, op); ot.Legalize(op, p); // Remap delaunay_edge ot.SetDelunayEdgeCCW(p, de1); t.SetDelunayEdgeCW(p, de2); t.SetDelunayEdgeCCW(op, de3); ot.SetDelunayEdgeCW(op, de4); // Remap constrained_edge ot.SetConstrainedEdgeCCW(p, ce1); t.SetConstrainedEdgeCW(p, ce2); t.SetConstrainedEdgeCCW(op, ce3); ot.SetConstrainedEdgeCW(op, ce4); // Remap neighbors // XXX: might optimize the markNeighbor by keeping track of // what side should be assigned to what neighbor after the // rotation. Now mark neighbor does lots of testing to find // the right side. t.ClearNeighbors(); ot.ClearNeighbors(); if (n1) ot.MarkNeighbor(*n1); if (n2) t.MarkNeighbor(*n2); if (n3) t.MarkNeighbor(*n3); if (n4) ot.MarkNeighbor(*n4); t.MarkNeighbor(ot); } /** * Fills a basin that has formed on the Advancing Front to the right * of given node.
* First we decide a left,bottom and right node that forms the * boundaries of the basin. Then we do a reqursive fill. * * @param tcx * @param node - starting node, this or next node will be left node */ void Sweep::FillBasin(SweepContext& tcx, Node& node) { if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { tcx.basin.left_node = node.next->next; } else { tcx.basin.left_node = node.next; } // Find the bottom and right node tcx.basin.bottom_node = tcx.basin.left_node; while (tcx.basin.bottom_node->next && tcx.basin.bottom_node->point->y >= tcx.basin.bottom_node->next->point->y) { tcx.basin.bottom_node = tcx.basin.bottom_node->next; } if (tcx.basin.bottom_node == tcx.basin.left_node) { // No valid basin return; } tcx.basin.right_node = tcx.basin.bottom_node; while (tcx.basin.right_node->next && tcx.basin.right_node->point->y < tcx.basin.right_node->next->point->y) { tcx.basin.right_node = tcx.basin.right_node->next; } if (tcx.basin.right_node == tcx.basin.bottom_node) { // No valid basins return; } tcx.basin.width = tcx.basin.right_node->point->x - tcx.basin.left_node->point->x; tcx.basin.left_highest = tcx.basin.left_node->point->y > tcx.basin.right_node->point->y; FillBasinReq(tcx, tcx.basin.bottom_node); } /** * Recursive algorithm to fill a Basin with triangles * * @param tcx * @param node - bottom_node * @param cnt - counter used to alternate on even and odd numbers */ void Sweep::FillBasinReq(SweepContext& tcx, Node* node) { // if shallow stop filling if (IsShallow(tcx, *node)) { return; } Fill(tcx, *node); if (node->prev == tcx.basin.left_node && node->next == tcx.basin.right_node) { return; } else if (node->prev == tcx.basin.left_node) { Orientation o = Orient2d(*node->point, *node->next->point, *node->next->next->point); if (o == CW) { return; } node = node->next; } else if (node->next == tcx.basin.right_node) { Orientation o = Orient2d(*node->point, *node->prev->point, *node->prev->prev->point); if (o == CCW) { return; } node = node->prev; } else { // Continue with the neighbor node with lowest Y value if (node->prev->point->y < node->next->point->y) { node = node->prev; } else { node = node->next; } } FillBasinReq(tcx, node); } bool Sweep::IsShallow(SweepContext& tcx, Node& node) { double height; if (tcx.basin.left_highest) { height = tcx.basin.left_node->point->y - node.point->y; } else { height = tcx.basin.right_node->point->y - node.point->y; } // if shallow stop filling if (tcx.basin.width > height) { return true; } return false; } void Sweep::FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node) { if (tcx.edge_event.right) { FillRightAboveEdgeEvent(tcx, edge, node); } else { FillLeftAboveEdgeEvent(tcx, edge, node); } } void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node) { while (node->next->point->x < edge->p->x) { // Check if next node is below the edge if (Orient2d(*edge->q, *node->next->point, *edge->p) == CCW) { FillRightBelowEdgeEvent(tcx, edge, *node); } else { node = node->next; } } } void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { if (node.point->x < edge->p->x) { if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { // Concave FillRightConcaveEdgeEvent(tcx, edge, node); } else{ // Convex FillRightConvexEdgeEvent(tcx, edge, node); // Retry this one FillRightBelowEdgeEvent(tcx, edge, node); } } } void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { Fill(tcx, *node.next); if (node.next->point != edge->p) { // Next above or below edge? if (Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) { // Below if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { // Next is concave FillRightConcaveEdgeEvent(tcx, edge, node); } else { // Next is convex } } } } void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { // Next concave or convex? if (Orient2d(*node.next->point, *node.next->next->point, *node.next->next->next->point) == CCW) { // Concave FillRightConcaveEdgeEvent(tcx, edge, *node.next); } else{ // Convex // Next above or below edge? if (Orient2d(*edge->q, *node.next->next->point, *edge->p) == CCW) { // Below FillRightConvexEdgeEvent(tcx, edge, *node.next); } else{ // Above } } } void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node) { while (node->prev->point->x > edge->p->x) { // Check if next node is below the edge if (Orient2d(*edge->q, *node->prev->point, *edge->p) == CW) { FillLeftBelowEdgeEvent(tcx, edge, *node); } else { node = node->prev; } } } void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { if (node.point->x > edge->p->x) { if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) { // Concave FillLeftConcaveEdgeEvent(tcx, edge, node); } else { // Convex FillLeftConvexEdgeEvent(tcx, edge, node); // Retry this one FillLeftBelowEdgeEvent(tcx, edge, node); } } } void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { // Next concave or convex? if (Orient2d(*node.prev->point, *node.prev->prev->point, *node.prev->prev->prev->point) == CW) { // Concave FillLeftConcaveEdgeEvent(tcx, edge, *node.prev); } else{ // Convex // Next above or below edge? if (Orient2d(*edge->q, *node.prev->prev->point, *edge->p) == CW) { // Below FillLeftConvexEdgeEvent(tcx, edge, *node.prev); } else{ // Above } } } void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) { Fill(tcx, *node.prev); if (node.prev->point != edge->p) { // Next above or below edge? if (Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) { // Below if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) { // Next is concave FillLeftConcaveEdgeEvent(tcx, edge, node); } else{ // Next is convex } } } } void Sweep::FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p) { Triangle& ot = t->NeighborAcross(p); Point& op = *ot.OppositePoint(*t, p); if (&ot == NULL) { // If we want to integrate the fillEdgeEvent do it here // With current implementation we should never get here //throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle"); throw(0); //assert(0); } if (InScanArea(p, *t->PointCCW(p), *t->PointCW(p), op)) { // Lets rotate shared edge one vertex CW RotateTrianglePair(*t, p, ot, op); tcx.MapTriangleToNodes(*t); tcx.MapTriangleToNodes(ot); if (p == eq && op == ep) { if (eq == *tcx.edge_event.constrained_edge->q && ep == *tcx.edge_event.constrained_edge->p) { t->MarkConstrainedEdge(&ep, &eq); ot.MarkConstrainedEdge(&ep, &eq); Legalize(tcx, *t); Legalize(tcx, ot); } else { // XXX: I think one of the triangles should be legalized here? } } else { Orientation o = Orient2d(eq, op, ep); t = &NextFlipTriangle(tcx, (int)o, *t, ot, p, op); FlipEdgeEvent(tcx, ep, eq, t, p); } } else { Point& newP = NextFlipPoint(ep, eq, ot, op); FlipScanEdgeEvent(tcx, ep, eq, *t, ot, newP); EdgeEvent(tcx, ep, eq, t, p); } } Triangle& Sweep::NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op) { if (o == CCW) { // ot is not crossing edge after flip int edge_index = ot.EdgeIndex(&p, &op); ot.delaunay_edge[edge_index] = true; Legalize(tcx, ot); ot.ClearDelunayEdges(); return t; } // t is not crossing edge after flip int edge_index = t.EdgeIndex(&p, &op); t.delaunay_edge[edge_index] = true; Legalize(tcx, t); t.ClearDelunayEdges(); return ot; } Point& Sweep::NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op) { Orientation o2d = Orient2d(eq, op, ep); if (o2d == CW) { // Right return *ot.PointCCW(op); } else if (o2d == CCW) { // Left return *ot.PointCW(op); } else{ //throw new RuntimeException("[Unsupported] Opposing point on constrained edge"); throw(0); //assert(0); } } void Sweep::FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle, Triangle& t, Point& p) { Triangle& ot = t.NeighborAcross(p); Point& op = *ot.OppositePoint(t, p); if (&t.NeighborAcross(p) == NULL) { // If we want to integrate the fillEdgeEvent do it here // With current implementation we should never get here //throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle"); throw(0); //assert(0); } if (InScanArea(eq, *flip_triangle.PointCCW(eq), *flip_triangle.PointCW(eq), op)) { // flip with new edge op->eq FlipEdgeEvent(tcx, eq, op, &ot, op); // TODO: Actually I just figured out that it should be possible to // improve this by getting the next ot and op before the the above // flip and continue the flipScanEdgeEvent here // set new ot and op here and loop back to inScanArea test // also need to set a new flip_triangle first // Turns out at first glance that this is somewhat complicated // so it will have to wait. } else{ Point& newP = NextFlipPoint(ep, eq, ot, op); FlipScanEdgeEvent(tcx, ep, eq, flip_triangle, ot, newP); } } Sweep::~Sweep() { // Clean up memory for(int i = 0; i < nodes_.size(); i++) { delete nodes_[i]; } } } therion/extern/poly2tri/sweep/advancing_front.cc0000664000175000017500000000607711705753624021157 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "advancing_front.h" namespace p2t { AdvancingFront::AdvancingFront(Node& head, Node& tail) { head_ = &head; tail_ = &tail; search_node_ = &head; } Node* AdvancingFront::LocateNode(const double& x) { Node* node = search_node_; if (x < node->value) { while ((node = node->prev) != NULL) { if (x >= node->value) { search_node_ = node; return node; } } } else { while ((node = node->next) != NULL) { if (x < node->value) { search_node_ = node->prev; return node->prev; } } } return NULL; } Node* AdvancingFront::FindSearchNode(const double& x) { // TODO: implement BST index return search_node_; } Node* AdvancingFront::LocatePoint(const Point* point) { const double px = point->x; Node* node = FindSearchNode(px); const double nx = node->point->x; if (px == nx) { if (point != node->point) { // We might have two nodes with same x value for a short time if (point == node->prev->point) { node = node->prev; } else if (point == node->next->point) { node = node->next; } else { // assert(0); throw(0); } } } else if (px < nx) { while ((node = node->prev) != NULL) { if (point == node->point) { break; } } } else { while ((node = node->next) != NULL) { if (point == node->point) break; } } if(node) search_node_ = node; return node; } AdvancingFront::~AdvancingFront() { } } therion/extern/poly2tri/sweep/sweep.h0000664000175000017500000001007211447322660016763 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * Sweep-line, Constrained Delauney Triangulation (CDT) See: Domiter, V. and * Zalik, B.(2008)'Sweep-line algorithm for constrained Delaunay triangulation', * International Journal of Geographical Information Science * * "FlipScan" Constrained Edge Algorithm invented by Thomas Åhlén, thahlen@gmail.com */ #ifndef SWEEP_H #define SWEEP_H #include namespace p2t { class SweepContext; struct Node; struct Point; struct Edge; class Triangle; class Sweep { public: void Triangulate(SweepContext& tcx); ~Sweep(); private: void SweepPoints(SweepContext& tcx); Node& PointEvent(SweepContext& tcx, Point& point); void EdgeEvent(SweepContext& tcx, Edge* edge, Node* node); void EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point); Node& NewFrontTriangle(SweepContext& tcx, Point& point, Node& node); void Fill(SweepContext& tcx, Node& node); bool Legalize(SweepContext& tcx, Triangle& t); bool Incircle(Point& pa, Point& pb, Point& pc, Point& pd); void RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op); void FillAdvancingFront(SweepContext& tcx, Node& n); double HoleAngle(Node& node); double BasinAngle(Node& node); void FillBasin(SweepContext& tcx, Node& node); void FillBasinReq(SweepContext& tcx, Node* node); bool IsShallow(SweepContext& tcx, Node& node); bool IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq); void FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node); void FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node); void FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node); void FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); void FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p); Triangle& NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op); Point& NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op); void FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle, Triangle& t, Point& p); void FinalizationPolygon(SweepContext& tcx); std::vector nodes_; }; } #endif therion/extern/poly2tri/sweep/cdt.cc0000664000175000017500000000440611447322660016554 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "cdt.h" namespace p2t { CDT::CDT(std::vector polyline) { sweep_context_ = new SweepContext(polyline); sweep_ = new Sweep; } void CDT::AddHole(std::vector polyline) { sweep_context_->AddHole(polyline); } void CDT::AddPoint(Point* point) { sweep_context_->AddPoint(point); } void CDT::Triangulate() { sweep_->Triangulate(*sweep_context_); } std::vector CDT::GetTriangles() { return sweep_context_->GetTriangles(); } std::list CDT::GetMap() { return sweep_context_->GetMap(); } CDT::~CDT() { delete sweep_context_; delete sweep_; } } therion/extern/poly2tri/sweep/advancing_front.h0000664000175000017500000000556412447656321021021 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ADVANCED_FRONT_H #define ADVANCED_FRONT_H #include "../common/shapes.h" namespace p2t { struct Node; // Advancing front node struct Node { Point* point; Triangle* triangle; Node* next; Node* prev; double value; Node(Point& p) : point(&p), triangle(NULL), next(NULL), prev(NULL), value(p.x) { } Node(Point& p, Triangle& t) : point(&p), triangle(&t), next(NULL), prev(NULL), value(p.x) { } }; // Advancing front class AdvancingFront { public: AdvancingFront(Node& head, Node& tail); // Destructor ~AdvancingFront(); Node* head(); void set_head(Node* node); Node* tail(); void set_tail(Node* node); Node* search(); void set_search(Node* node); /// Locate insertion point along advancing front Node* LocateNode(const double& x); Node* LocatePoint(const Point* point); private: Node* head_, *tail_, *search_node_; Node* FindSearchNode(const double& x); }; inline Node* AdvancingFront::head() { return head_; } inline void AdvancingFront::set_head(Node* node) { head_ = node; } inline Node* AdvancingFront::tail() { return tail_; } inline void AdvancingFront::set_tail(Node* node) { tail_ = node; } inline Node* AdvancingFront::search() { return search_node_; } inline void AdvancingFront::set_search(Node* node) { search_node_ = node; } } #endif therion/extern/poly2tri/sweep/sweep_context.h0000664000175000017500000000777211575361406020547 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef SWEEP_CONTEXT_H #define SWEEP_CONTEXT_H #include #include #include namespace p2t { // Inital triangle factor, seed triangle will extend 30% of // PointSet width to both left and right. const double kAlpha = 0.3; struct Point; class Triangle; struct Node; struct Edge; class AdvancingFront; class SweepContext { public: /// Constructor SweepContext(std::vector polyline); /// Destructor ~SweepContext(); void set_head(Point* p1); Point* head(); void set_tail(Point* p1); Point* tail(); int point_count(); Node& LocateNode(Point& point); void RemoveNode(Node* node); void CreateAdvancingFront(std::vector nodes); /// Try to map a node to all sides of this triangle that don't have a neighbor void MapTriangleToNodes(Triangle& t); void AddToMap(Triangle* triangle); Point* GetPoint(const int& index); Point* GetPoints(); void RemoveFromMap(Triangle* triangle); void AddHole(std::vector polyline); void AddPoint(Point* point); AdvancingFront* front(); void MeshClean(Triangle& triangle); std::vector GetTriangles(); std::list GetMap(); std::vector edge_list; struct Basin { Node* left_node; Node* bottom_node; Node* right_node; double width; bool left_highest; Basin() : left_node(NULL), bottom_node(NULL), right_node(NULL), width(0.0), left_highest(false) { } void Clear() { left_node = NULL; bottom_node = NULL; right_node = NULL; width = 0.0; left_highest = false; } }; struct EdgeEvent { Edge* constrained_edge; bool right; EdgeEvent() : constrained_edge(NULL), right(false) { } }; Basin basin; EdgeEvent edge_event; private: friend class Sweep; std::vector triangles_; std::list map_; std::vector points_; // Advancing front AdvancingFront* front_; // head point used with advancing front Point* head_; // tail point used with advancing front Point* tail_; Node *af_head_, *af_middle_, *af_tail_; void InitTriangulation(); void InitEdges(std::vector polyline); }; inline AdvancingFront* SweepContext::front() { return front_; } inline int SweepContext::point_count() { return points_.size(); } inline void SweepContext::set_head(Point* p1) { head_ = p1; } inline Point* SweepContext::head() { return head_; } inline void SweepContext::set_tail(Point* p1) { tail_ = p1; } inline Point* SweepContext::tail() { return tail_; } } #endif therion/extern/poly2tri/poly2tri.h0000664000175000017500000000327111447322660016304 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef POLY2TRI_H #define POLY2TRI_H #include "common/shapes.h" #include "sweep/cdt.h" #endif therion/extern/poly2tri/common/0000775000175000017500000000000012426433011015623 5ustar userusertherion/extern/poly2tri/common/utils.h0000664000175000017500000000563711447322660017160 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UTILS_H #define UTILS_H #include #include namespace p2t { const double PI_3div4 = 3 * M_PI / 4; const double EPSILON = 1e-12; enum Orientation { CW, CCW, COLLINEAR }; /** * Forumla to calculate signed area
* Positive if CCW
* Negative if CW
* 0 if collinear
*
 * A[P1,P2,P3]  =  (x1*y2 - y1*x2) + (x2*y3 - y2*x3) + (x3*y1 - y3*x1)
 *              =  (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)
 * 
*/ Orientation Orient2d(Point& pa, Point& pb, Point& pc) { double detleft = (pa.x - pc.x) * (pb.y - pc.y); double detright = (pa.y - pc.y) * (pb.x - pc.x); double val = detleft - detright; if (val > -EPSILON && val < EPSILON) { return COLLINEAR; } else if (val > 0) { return CCW; } return CW; } bool InScanArea(Point& pa, Point& pb, Point& pc, Point& pd) { double pdx = pd.x; double pdy = pd.y; double adx = pa.x - pdx; double ady = pa.y - pdy; double bdx = pb.x - pdx; double bdy = pb.y - pdy; double adxbdy = adx * bdy; double bdxady = bdx * ady; double oabd = adxbdy - bdxady; if (oabd <= EPSILON) { return false; } double cdx = pc.x - pdx; double cdy = pc.y - pdy; double cdxady = cdx * ady; double adxcdy = adx * cdy; double ocad = cdxady - adxcdy; if (ocad <= EPSILON) { return false; } return true; } } #endif therion/extern/poly2tri/common/shapes.cc0000664000175000017500000002065711705753624017445 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "shapes.h" #include namespace p2t { Triangle::Triangle(Point& a, Point& b, Point& c) { points_[0] = &a; points_[1] = &b; points_[2] = &c; neighbors_[0] = NULL; neighbors_[1] = NULL; neighbors_[2] = NULL; constrained_edge[0] = constrained_edge[1] = constrained_edge[2] = false; delaunay_edge[0] = delaunay_edge[1] = delaunay_edge[2] = false; interior_ = false; } // Update neighbor pointers void Triangle::MarkNeighbor(Point* p1, Point* p2, Triangle* t) { if ((p1 == points_[2] && p2 == points_[1]) || (p1 == points_[1] && p2 == points_[2])) neighbors_[0] = t; else if ((p1 == points_[0] && p2 == points_[2]) || (p1 == points_[2] && p2 == points_[0])) neighbors_[1] = t; else if ((p1 == points_[0] && p2 == points_[1]) || (p1 == points_[1] && p2 == points_[0])) neighbors_[2] = t; else throw(0); //assert(0); } // Exhaustive search to update neighbor pointers void Triangle::MarkNeighbor(Triangle& t) { if (t.Contains(points_[1], points_[2])) { neighbors_[0] = &t; t.MarkNeighbor(points_[1], points_[2], this); } else if (t.Contains(points_[0], points_[2])) { neighbors_[1] = &t; t.MarkNeighbor(points_[0], points_[2], this); } else if (t.Contains(points_[0], points_[1])) { neighbors_[2] = &t; t.MarkNeighbor(points_[0], points_[1], this); } } void Triangle::ClearNeighbors() { neighbors_[0] = NULL; neighbors_[1] = NULL; neighbors_[2] = NULL; } void Triangle::ClearDelunayEdges() { delaunay_edge[0] = delaunay_edge[1] = delaunay_edge[2] = false; } Point* Triangle::OppositePoint(Triangle& t, Point& p) { Point *cw = t.PointCW(p); double x = cw->x; double y = cw->y; x = p.x; y = p.y; Point* ham = PointCW(*cw); return PointCW(*cw); } // Legalized triangle by rotating clockwise around point(0) void Triangle::Legalize(Point& point) { points_[1] = points_[0]; points_[0] = points_[2]; points_[2] = &point; } // Legalize triagnle by rotating clockwise around oPoint void Triangle::Legalize(Point& opoint, Point& npoint) { if (&opoint == points_[0]) { points_[1] = points_[0]; points_[0] = points_[2]; points_[2] = &npoint; } else if (&opoint == points_[1]) { points_[2] = points_[1]; points_[1] = points_[0]; points_[0] = &npoint; } else if (&opoint == points_[2]) { points_[0] = points_[2]; points_[2] = points_[1]; points_[1] = &npoint; } else { throw(0); //assert(0); } } int Triangle::Index(const Point* p) { if (p == points_[0]) { return 0; } else if (p == points_[1]) { return 1; } else if (p == points_[2]) { return 2; } throw(0); //assert(0); } int Triangle::EdgeIndex(const Point* p1, const Point* p2) { if (points_[0] == p1) { if (points_[1] == p2) { return 2; } else if (points_[2] == p2) { return 1; } } else if (points_[1] == p1) { if (points_[2] == p2) { return 0; } else if (points_[0] == p2) { return 2; } } else if (points_[2] == p1) { if (points_[0] == p2) { return 1; } else if (points_[1] == p2) { return 0; } } return -1; } void Triangle::MarkConstrainedEdge(const int index) { constrained_edge[index] = true; } void Triangle::MarkConstrainedEdge(Edge& edge) { MarkConstrainedEdge(edge.p, edge.q); } // Mark edge as constrained void Triangle::MarkConstrainedEdge(Point* p, Point* q) { if ((q == points_[0] && p == points_[1]) || (q == points_[1] && p == points_[0])) { constrained_edge[2] = true; } else if ((q == points_[0] && p == points_[2]) || (q == points_[2] && p == points_[0])) { constrained_edge[1] = true; } else if ((q == points_[1] && p == points_[2]) || (q == points_[2] && p == points_[1])) { constrained_edge[0] = true; } } // The point counter-clockwise to given point Point* Triangle::PointCW(Point& point) { if (&point == points_[0]) { return points_[2]; } else if (&point == points_[1]) { return points_[0]; } else if (&point == points_[2]) { return points_[1]; } throw(0); //assert(0); } // The point counter-clockwise to given point Point* Triangle::PointCCW(Point& point) { if (&point == points_[0]) { return points_[1]; } else if (&point == points_[1]) { return points_[2]; } else if (&point == points_[2]) { return points_[0]; } throw(0); //assert(0); } // The neighbor clockwise to given point Triangle* Triangle::NeighborCW(Point& point) { if (&point == points_[0]) { return neighbors_[1]; } else if (&point == points_[1]) { return neighbors_[2]; } return neighbors_[0]; } // The neighbor counter-clockwise to given point Triangle* Triangle::NeighborCCW(Point& point) { if (&point == points_[0]) { return neighbors_[2]; } else if (&point == points_[1]) { return neighbors_[0]; } return neighbors_[1]; } bool Triangle::GetConstrainedEdgeCCW(Point& p) { if (&p == points_[0]) { return constrained_edge[2]; } else if (&p == points_[1]) { return constrained_edge[0]; } return constrained_edge[1]; } bool Triangle::GetConstrainedEdgeCW(Point& p) { if (&p == points_[0]) { return constrained_edge[1]; } else if (&p == points_[1]) { return constrained_edge[2]; } return constrained_edge[0]; } void Triangle::SetConstrainedEdgeCCW(Point& p, bool ce) { if (&p == points_[0]) { constrained_edge[2] = ce; } else if (&p == points_[1]) { constrained_edge[0] = ce; } else { constrained_edge[1] = ce; } } void Triangle::SetConstrainedEdgeCW(Point& p, bool ce) { if (&p == points_[0]) { constrained_edge[1] = ce; } else if (&p == points_[1]) { constrained_edge[2] = ce; } else { constrained_edge[0] = ce; } } bool Triangle::GetDelunayEdgeCCW(Point& p) { if (&p == points_[0]) { return delaunay_edge[2]; } else if (&p == points_[1]) { return delaunay_edge[0]; } return delaunay_edge[1]; } bool Triangle::GetDelunayEdgeCW(Point& p) { if (&p == points_[0]) { return delaunay_edge[1]; } else if (&p == points_[1]) { return delaunay_edge[2]; } return delaunay_edge[0]; } void Triangle::SetDelunayEdgeCCW(Point& p, bool e) { if (&p == points_[0]) { delaunay_edge[2] = e; } else if (&p == points_[1]) { delaunay_edge[0] = e; } else { delaunay_edge[1] = e; } } void Triangle::SetDelunayEdgeCW(Point& p, bool e) { if (&p == points_[0]) { delaunay_edge[1] = e; } else if (&p == points_[1]) { delaunay_edge[2] = e; } else { delaunay_edge[0] = e; } } // The neighbor across to given point Triangle& Triangle::NeighborAcross(Point& opoint) { if (&opoint == points_[0]) { return *neighbors_[0]; } else if (&opoint == points_[1]) { return *neighbors_[1]; } return *neighbors_[2]; } void Triangle::DebugPrint() { using namespace std; cout << points_[0]->x << "," << points_[0]->y << " "; cout << points_[1]->x << "," << points_[1]->y << " "; cout << points_[2]->x << "," << points_[2]->y << endl; } } therion/extern/poly2tri/common/shapes.h0000664000175000017500000001627611705752532017306 0ustar useruser/* * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors * http://code.google.com/p/poly2tri/ * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Poly2Tri nor the names of its contributors may be * used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Include guard #ifndef SHAPES_H #define SHAPES_H #include #include #include #include namespace p2t { struct Edge; struct Point { double x, y; /// Default constructor does nothing (for performance). Point() { x = 0.0; y = 0.0; } /// The edges this point constitutes an upper ending point std::vector edge_list; /// Construct using coordinates. Point(double x, double y) : x(x), y(y) {} /// Set this point to all zeros. void set_zero() { x = 0.0f; y = 0.0f; } /// Set this point to some specified coordinates. void set(double x_, double y_) { x = x_; y = y_; } /// Negate this point. Point operator -() const { Point v; v.set(-x, -y); return v; } /// Add a point to this point. void operator +=(const Point& v) { x += v.x; y += v.y; } /// Subtract a point from this point. void operator -=(const Point& v) { x -= v.x; y -= v.y; } /// Multiply this point by a scalar. void operator *=(double a) { x *= a; y *= a; } /// Get the length of this point (the norm). double Length() const { return sqrt(x * x + y * y); } /// Convert this point into a unit point. Returns the Length. double Normalize() { double len = Length(); x /= len; y /= len; return len; } }; // Represents a simple polygon's edge struct Edge { Point* p, *q; /// Constructor Edge(Point& p1, Point& p2) : p(&p1), q(&p2) { if (p1.y > p2.y) { q = &p1; p = &p2; } else if (p1.y == p2.y) { if (p1.x > p2.x) { q = &p1; p = &p2; } else if (p1.x == p2.x) { // Repeat points // assert(false); throw(false); } } q->edge_list.push_back(this); } }; // Triangle-based data structures are know to have better performance than quad-edge structures // See: J. Shewchuk, "Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangulator" // "Triangulations in CGAL" class Triangle { public: /// Constructor Triangle(Point& a, Point& b, Point& c); /// Flags to determine if an edge is a Constrained edge bool constrained_edge[3]; /// Flags to determine if an edge is a Delauney edge bool delaunay_edge[3]; Point* GetPoint(const int& index); Point* PointCW(Point& point); Point* PointCCW(Point& point); Point* OppositePoint(Triangle& t, Point& p); Triangle* GetNeighbor(const int& index); void MarkNeighbor(Point* p1, Point* p2, Triangle* t); void MarkNeighbor(Triangle& t); void MarkConstrainedEdge(const int index); void MarkConstrainedEdge(Edge& edge); void MarkConstrainedEdge(Point* p, Point* q); int Index(const Point* p); int EdgeIndex(const Point* p1, const Point* p2); Triangle* NeighborCW(Point& point); Triangle* NeighborCCW(Point& point); bool GetConstrainedEdgeCCW(Point& p); bool GetConstrainedEdgeCW(Point& p); void SetConstrainedEdgeCCW(Point& p, bool ce); void SetConstrainedEdgeCW(Point& p, bool ce); bool GetDelunayEdgeCCW(Point& p); bool GetDelunayEdgeCW(Point& p); void SetDelunayEdgeCCW(Point& p, bool e); void SetDelunayEdgeCW(Point& p, bool e); bool Contains(Point* p); bool Contains(const Edge& e); bool Contains(Point* p, Point* q); void Legalize(Point& point); void Legalize(Point& opoint, Point& npoint); void ClearNeighbors(); void ClearDelunayEdges(); inline bool IsInterior(); inline void IsInterior(bool b); Triangle& NeighborAcross(Point& opoint); void DebugPrint(); private: /// Triangle points Point* points_[3]; /// Neighbor list Triangle* neighbors_[3]; /// Has this triangle been marked as an interior triangle? bool interior_; }; inline bool cmp(const Point* a, const Point* b) { if (a->y < b->y) { return true; } else if (a->y == b->y) { // Make sure q is point with greater x value if (a->x < b->x) { return true; } } return false; } /// Add two points_ component-wise. inline Point operator +(const Point& a, const Point& b) { return Point(a.x + b.x, a.y + b.y); } /// Subtract two points_ component-wise. inline Point operator -(const Point& a, const Point& b) { return Point(a.x - b.x, a.y - b.y); } /// Multiply point by scalar inline Point operator *(double s, const Point& a) { return Point(s * a.x, s * a.y); } inline bool operator ==(const Point& a, const Point& b) { return a.x == b.x && a.y == b.y; } inline bool operator !=(const Point& a, const Point& b) { return a.x != b.x && a.y != b.y; } /// Peform the dot product on two vectors. inline double Dot(const Point& a, const Point& b) { return a.x * b.x + a.y * b.y; } /// Perform the cross product on two vectors. In 2D this produces a scalar. inline double Cross(const Point& a, const Point& b) { return a.x * b.y - a.y * b.x; } /// Perform the cross product on a point and a scalar. In 2D this produces /// a point. inline Point Cross(const Point& a, double s) { return Point(s * a.y, -s * a.x); } /// Perform the cross product on a scalar and a point. In 2D this produces /// a point. inline Point Cross(const double s, const Point& a) { return Point(-s * a.y, s * a.x); } inline Point* Triangle::GetPoint(const int& index) { return points_[index]; } inline Triangle* Triangle::GetNeighbor(const int& index) { return neighbors_[index]; } inline bool Triangle::Contains(Point* p) { return p == points_[0] || p == points_[1] || p == points_[2]; } inline bool Triangle::Contains(const Edge& e) { return Contains(e.p) && Contains(e.q); } inline bool Triangle::Contains(Point* p, Point* q) { return Contains(p) && Contains(q); } inline bool Triangle::IsInterior() { return interior_; } inline void Triangle::IsInterior(bool b) { interior_ = b; } } #endif therion/extern/getline.h0000664000175000017500000000177710430102004014347 0ustar useruser/* Copyright (C) 1995, 1997 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GETLINE_H_ # define GETLINE_H_ 1 #ifdef __cplusplus extern "C" { #endif # include int getline (char **_lineptr, size_t *_n, FILE *_stream); int getdelim (char **_lineptr, size_t *_n, int _delimiter, FILE *_stream); #ifdef __cplusplus } #endif #endif /* not GETLINE_H_ */ therion/thcmdline.h0000664000175000017500000000456011575403514013400 0ustar useruser/** * @file thcmdline.h * Command line processing module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thcmdline_h #define thcmdline_h /** * Print states. */ enum { THPS_NONE = 1000, ///< Nothing to query. THPS_ENCODINGS = 1001, ///< Print encodings. THPS_INIT_FILE = 1002, ///< Print init file. THPS_LIB_SRC = 1003, ///< Print library source file THPS_XTHERION_SRC = 1004, ///< Print point types list. THPS_PATHS = 1005, ///< Print setting of all paths THPS_EXTERN_LIBS = 1006, ///< Use extern libraries THPS_TEX_ENCODINGS = 1007, ///< Print tex encodings THPS_SYMBOLS = 1008, ///< Print symbols }; /** * Command line processing class. * * Provides functions for therion command line options analysis. */ class thcmdline { public: bool version_ds, ///< Version information display state. help_ds, ///< Help display state. m_bezier, extern_libs; ///< Use extern libs. int print_state; ///< Query state. /** * Standard constructor. */ thcmdline(); /** * Standard destructor. */ ~thcmdline(); /** * Process given command line. */ void process(int argc, char * argv[]); /** * Return version disp state. */ bool get_version_disp_state(); /** * Return help disp state. */ bool get_help_disp_state(); /** * Return print state. */ int get_print_state(); }; /** * Command line processing module. */ extern thcmdline thcmdln; #endif therion/thtfpwf.cxx0000664000175000017500000001107310625655142013464 0ustar useruser/** * @file thtfpwf.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thtfpwf.h" #include "thexception.h" #include "thinfnan.h" #include "thparse.h" void thtfpwf::clear() { if (this->valn > 0) { delete [] this->valp; this->valn = 0; this->valp = NULL; } } thtfpwf::~thtfpwf() { this->clear(); } int thtfpwfxy_comp(const void * x1, const void * x2) { thtfpwfxy * p1 = (thtfpwfxy *) x1; thtfpwfxy * p2 = (thtfpwfxy *) x2; if (p1->x < p2->x) return -1; if (p1->x == p2->x) return 0; else return 1; } void thtfpwf::set(size_t nv, double * pv) { size_t idx; this->clear(); if (nv > 0) { this->valp = new thtfpwfxy [nv]; this->valn = nv; for(idx = 0; idx < nv; idx++) { this->valp[idx].x = *pv; pv++; this->valp[idx].y = *pv; pv++; } // now let's sort them qsort(this->valp,this->valn,sizeof(thtfpwfxy),thtfpwfxy_comp); // for(idx = 0; idx < nv; idx++) { // printf("PWF SETTING: %f -> %f\n", this->valp[idx].x, this->valp[idx].y); // } } } void thtfpwf::parse(int nfact, char ** sfact) { int sv; switch (nfact) { case 1: thparse_double(sv, this->b, *sfact); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s", *sfact)) break; case 2: thparse_double(sv, this->b, sfact[0]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s", sfact[0])) thparse_double(sv, this->a, sfact[1]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s", sfact[1])) break; default: if ((nfact > 2) && ((nfact % 2) == 0)) { double * coefs = new double [nfact]; int cidx,spv; for(cidx = 0; cidx < nfact; cidx++) { thparse_double(spv,coefs[cidx],sfact[cidx]); if (spv == TT_SV_UNKNOWN) ththrow(("invalid number -- %s", sfact[cidx])) } this->set(nfact / 2, coefs); delete [] coefs; } else ththrow(("invalid number of transformation constants")) } if (this->a == 0.0) ththrow(("invalid scale factor -- %f", this->a)) } double thtfpwf::evaluate(double value) { switch (valn) { case 0: return (value - b) * a; case 1: return this->valp->y; default: // let's do a binary search int a = 0, b = (int) this->valn - 1, c, r, ret = -1; while (a <= b) { c = unsigned((a + b) / 2); if (this->valp[c].x < value) r = -1; else { if (c == 0) r = 0; else { if (this->valp[c - 1].x <= value) r = 0; else r = 1; } } if (r == 0) { ret = c; break; } if (r < 0) a = c + 1; else b = c - 1; } switch (ret) { case -1: return this->valp[this->valn - 1].y; case 0: return this->valp->y; default: double x1 = this->valp[ret - 1].x; double y1 = this->valp[ret - 1].y; double x2 = this->valp[ret].x; double y2 = this->valp[ret].y; if (thisnan(y1) || thisnan(y2)) return thnan; if ((thisinf(y1) != 0) || (thisinf(y2) != 0)) { if ((thisinf(y1) + thisinf(y2)) == 0) return thnan; if ((thisinf(y1) + thisinf(y2)) > 0) return thinf; if ((thisinf(y1) + thisinf(y2)) < 0) return -thinf; } if (x1 == x2) return y1; return (y1 + (value - x1) * (y2 - y1) / (x2 - x1)); } } } thtfpwfxy * thtfpwf::get_values() { return this->valp; } size_t thtfpwf::get_size() { return this->valn; } therion/thinput.cxx0000664000175000017500000002766110750024754013505 0ustar useruser/** * @file thinput.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thinput.h" #include "thparse.h" #include "thchenc.h" #include "therion.h" #include "thexception.h" #define THMAXFREC 64 const long thinput::max_line_size = 8128; enum {TT_UNKNOWN_INPUT, TT_INPUT, TT_ENCODING}; static const thstok thtt_input[] = { {"encoding", TT_ENCODING}, {"input", TT_INPUT}, {NULL, TT_UNKNOWN_INPUT} }; thinput::ifile::ifile(ifile * fp) { this->lnumber = 0; this->encoding = TT_UTF_8; this->prev_ptr = fp; this->next_ptr = NULL; } thinput::ifile::~ifile() { this->close(); if (this->next_ptr != NULL) delete this->next_ptr; } void thinput::ifile::close() { if (this->sh.is_open()) { this->sh.close(); this->sh.clear(); this->lnumber = 0; } } bool thinput::ifile::is_equal( #ifdef THMSVC struct _stat #else struct stat #endif * buf) { if ((this->st.st_ino == buf->st_ino) && \ (this->st.st_dev == buf->st_dev)) return true; else return false; } thinput::thinput() { this->cmd_sensitivity = true; this->input_sensitivity = true; this->scan_search_path = false; this->first_ptr = new ifile(NULL); this->last_ptr = this->first_ptr; this->lnbuffer = new char [thinput::max_line_size]; this->pifo = false; this->pifoid = NULL; this->pifoproc = NULL; this->report_missing = false; } thinput::~thinput() { delete this->first_ptr; delete this->lnbuffer; } void thinput::set_cmd_sensitivity(bool cs) { this->cmd_sensitivity = cs; if (!cs) { this->cmdbf = ""; this->valuebf = ""; } } void thinput::cmd_sensitivity_on() { this->cmd_sensitivity = true; } void thinput::cmd_sensitivity_off() { this->cmd_sensitivity = false; this->cmdbf = ""; this->valuebf = ""; } bool thinput::get_cmd_sensitivity() { return this->cmd_sensitivity; } void thinput::set_sp_scan(bool spss) { this->scan_search_path = spss; } void thinput::sp_scan_on() { this->scan_search_path = true; } void thinput::sp_scan_off() { this->scan_search_path = false; } bool thinput::get_sp_scan() { return this->scan_search_path; } void thinput::set_file_name(const char * fname) { this->file_name = fname; } char * thinput::get_file_name() { return this->file_name; } void thinput::set_search_path(const char * spath) { this->search_path.clear(); #ifdef THWIN32 thsplit_paths(& this->search_path, spath, ';'); #else thsplit_paths(& this->search_path, spath, ':'); #endif } void thinput::set_file_suffix(const char * fsx) { this->file_suffix.clear(); thsplit_strings(& this->file_suffix, fsx, ':'); } void thinput::open_file(char * fname) { char * srcfile = NULL; if (this->last_ptr->sh.is_open()) srcfile = this->last_ptr->name; // as first, let's find appropriate ifile ifile * ifptr; ifptr = this->last_ptr; while (ifptr->sh.is_open() && (ifptr->next_ptr != NULL)) ifptr = ifptr->next_ptr; if (ifptr->sh.is_open() && (ifptr->next_ptr == NULL)) { ifptr->next_ptr = new ifile(ifptr); ifptr = ifptr->next_ptr; } // now, let's open the file // first let's set the path to source file path if (srcfile != NULL) thsplit_fpath(&ifptr->path, srcfile); else ifptr->path = ""; int ix = -1; long paths = this->search_path.get_size(), sfxid, sfxs = this->file_suffix.get_size(); char ** sfx = this->file_suffix.get_buffer(); char ** pths = this->search_path.get_buffer(); size_t ifptr_psz; char ifptr_plc; while ((!ifptr->sh.is_open()) && (ix < paths)) { // let's try the name without suffixes ifptr_psz = strlen(ifptr->path.get_buffer()); ifptr_plc = (ifptr_psz > 0 ? ifptr->path.get_buffer()[ifptr_psz-1] : 0); if (ifptr_psz > 0) { ifptr->name = ifptr->path; if (ifptr_plc != '/') ifptr->name += "/"; ifptr->name += fname; } else ifptr->name = fname; ifptr->sh.clear(); ifptr->sh.open(ifptr->name); //, ios::in | ios::nocreate // if not successful, try with suffixes sfxid = 0; while ((!ifptr->sh.is_open()) && (sfxid < sfxs)) { if (ifptr_psz > 0) { ifptr->name = ifptr->path; if (ifptr_plc != '/') ifptr->name += "/"; ifptr->name += fname; } else ifptr->name = fname; ifptr->name += sfx[sfxid]; ifptr->sh.clear(); ifptr->sh.open(ifptr->name); //, ios::in | ios::nocreate sfxid++; } // if still no success, try with search path ix++; if (ix < paths) ifptr->path = pths[ix]; } // if file was open, now let's try if not recursive inclusion ifile * tmptr; bool is_rec = false; unsigned int n_rec = 0; if (!ifptr->sh.is_open()) { if ((srcfile != NULL) || (this->report_missing)) { ththrow(("can't open file for input -- %s", \ fname)); } } else { #ifdef THMSVC _stat #else stat #endif (ifptr->name.get_buffer(), &ifptr->st); tmptr = ifptr->prev_ptr; #ifdef THWIN32 while ((tmptr != NULL) && (n_rec < THMAXFREC)) { #else while ((tmptr != NULL) && !is_rec) { #endif is_rec = is_rec || tmptr->is_equal(&ifptr->st); tmptr = tmptr->prev_ptr; n_rec++; } #ifdef THWIN32 if (n_rec == THMAXFREC) { therror(("%s [%d] -- too many file inclusions -- probably input recursion -- %s", \ this->get_cif_name(), this->get_cif_line_number(), fname)); } #else if (is_rec) { therror(("%s [%d] -- recursive file inclusion -- %s", \ this->get_cif_name(), this->get_cif_line_number(), fname)); } #endif else { this->last_ptr = ifptr; if (this->pifo) { if (this->pifoproc != NULL) this->pifoproc(ifptr->name.get_buffer()); if (this->pifoid != NULL) *(this->pifoid) = true; this->pifo = false; this->pifoid = NULL; this->pifoproc = NULL; } #ifdef THDEBUG thprintf("open file -- %s\n", this->last_ptr->name.get_buffer()); #endif } } } void thinput::close_file() { if (this->last_ptr->sh.is_open()) { #ifdef THDEBUG thprintf("close file -- %s\n", this->last_ptr->name.get_buffer()); #endif this->last_ptr->close(); if (this->last_ptr->prev_ptr != NULL) { this->last_ptr = this->last_ptr->prev_ptr; // Is next cmd it really like this ????? this->last_ptr->next_ptr = NULL; } } } void thinput::reset() { // first, let's close all open files ifile * iptr = this->first_ptr; while(iptr != NULL) { iptr->close(); iptr = iptr->next_ptr; } // set pointer to the first ifile this->last_ptr = this->first_ptr; this->open_file(this->file_name); } char * thinput::read_line() { int ln_state = 0; bool mline = false; long lnlen; //, idx; char * idxptr; while (ln_state == 0) { // first, check if any input available if (!this->last_ptr->sh.is_open()) { ln_state = -1; break; } // check eof state of last open file if (this->last_ptr->sh.eof()) { this->close_file(); continue; } // OK, we can read the line this->last_ptr->sh.getline(this->lnbuffer, thinput::max_line_size); this->last_ptr->lnumber++; // Check, if reading was OK. if (this->last_ptr->sh.fail() && (!(this->last_ptr->sh.eof()))) { therror(("%s [%d] -- line too long", \ this->get_cif_name(), this->get_cif_line_number())); } // now let's find last non white character lnlen = (long)strlen(this->lnbuffer); idxptr = this->lnbuffer + lnlen - 1; while ((lnlen > 0) && (*idxptr < 33)) { idxptr--; lnlen--; } // empty line read if ((lnlen == 0) && !mline) continue; // join backslash ended lines together if (*idxptr == '\\') { if (mline) { this->linebf.strncat(this->lnbuffer, lnlen - 1); } else { this->linebf.strncpy(this->lnbuffer, lnlen - 1); mline = true; } continue; } else { if (mline) this->linebf.strncat(this->lnbuffer, lnlen); else this->linebf.strncpy(this->lnbuffer, lnlen); } mline = false; // we've something regular in the linebf // split into cmd & value & interpret commands if (this->cmd_sensitivity) { thsplit_word(&this->cmdbf, &this->valuebf, this->linebf.get_buffer()); thsplit_args(&this->tmpmb, this->valuebf.get_buffer()); // check if comment if (*(this->cmdbf.get_buffer()) == '#') continue; // interpret commands switch (thmatch_token(this->cmdbf.get_buffer(), thtt_input)) { case TT_INPUT: if (this->input_sensitivity) { if (this->tmpmb.get_size() != 1) therror(("%s [%d] -- one input file name expected -- %s", \ this->get_cif_name(), this->get_cif_line_number(), \ this->valuebf.get_buffer())) else this->open_file(*(this->tmpmb.get_buffer())); } continue; case TT_ENCODING: if (this->tmpmb.get_size() != 1) therror(("%s [%d] -- encoding name expected -- %s", \ this->get_cif_name(), this->get_cif_line_number(), \ this->valuebf.get_buffer())); this->last_ptr->encoding = \ thmatch_token(*(this->tmpmb.get_buffer()), thtt_encoding); if (this->last_ptr->encoding == TT_UNKNOWN_ENCODING) { therror(("%s [%d] -- unknown encoding -- %s", \ this->get_cif_name(), this->get_cif_line_number(), \ this->valuebf.get_buffer())); this->last_ptr->encoding = TT_UTF_8; } continue; } // interpret commands } // otherwise check if comment else { idxptr = this->linebf.get_buffer(); lnlen = (long)strlen(idxptr); while ((lnlen > 0) && (*idxptr < 33)) { lnlen--; idxptr++; } if (*idxptr == '#') continue; } // no comment, no command ln_state = 1; } if (ln_state == 1) return this->linebf.get_buffer(); else return NULL; } char * thinput::get_cmd() { return this->cmdbf.get_buffer(); } char * thinput::get_line() { return this->linebf.get_buffer(); } char * thinput::get_value() { return this->valuebf.get_buffer(); } char * thinput::get_cif_name() { return this->last_ptr->name.get_buffer(); } char * thinput::get_cif_path() { static thbuffer cifpath; thsplit_fpath(&cifpath, this->last_ptr->name.get_buffer()); return cifpath.get_buffer(); } unsigned long thinput::get_cif_line_number() { return this->last_ptr->lnumber; } int thinput::get_cif_encoding() { return this->last_ptr->encoding; } void thinput::print_if_opened(void (* pifop)(char *), bool * printed) { this->pifo = true; if (printed != NULL) this->pifoid = printed; this->pifoproc = pifop; } void thinput::set_input_sensitivity(bool s) { this->input_sensitivity = s; } bool thinput::get_input_sensitivity() { return this->input_sensitivity; } bool thinput::is_first_file() { return ((this->first_ptr == NULL) || (this->first_ptr->next_ptr == NULL)); } therion/thwarppdef.h0000664000175000017500000000501010644734350013565 0ustar useruser/** @file thwarppdef.h * * @author marco corvi * @date mar 2007 * * @brief warping transformation definitions */ /* Copyright (C) 2007 marco corvi * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thwarppdef_h #define thwarppdef_h #define THERION // #define BOUND_SEGMENT 1.5 #define BOUND_TRIANGLE 1.5 #define BOUND_PLAQUETTE 2.0 #define MORPH_USE_BD #define MORPH_BD 0.5 /** whether or not to use rotation */ #define MORPH_ROTATE 1 /** a multiplicative factor for the angle differences */ #define MORPH_ANGLE_FACTOR 0.5 namespace therion { namespace warp { /** type of the warping control objects * overused for point-pairs and lines */ enum morph_type { THMORPH_STATION, /* station point | centerline shot */ THMORPH_LEFT, /* left point | left shot */ THMORPH_RIGHT, /* right point | right shot */ THMORPH_SEGMENT, /* - | straight end segment */ THMORPH_EXTRA, }; /** warping projection type */ enum warp_proj { THWARP_PLAN, /* plan */ THWARP_EXTENDED, /* extended elevation */ }; /** warping pair types */ enum warp_type { THWARP_NONE = 0, THWARP_POINT = 1, THWARP_SEGMENT = 2, THWARP_TRIANGLE = 3, THWARP_PLAQUETTE = 4 }; } // namespace warp } // namespace therion // ***************************************************************** // backward compatibility // #ifdef THERION typedef therion::warp::morph_type thmorph_type; typedef therion::warp::warp_proj thwarp_proj; using therion::warp::THMORPH_STATION; using therion::warp::THMORPH_EXTRA; #endif #endif // thwarppdef_h therion/thexptable.h0000664000175000017500000000662712042446002013564 0ustar useruser/** * @file thexptable.h * Export class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexptable_h #define thexptable_h #include "thexport.h" #include "thattr.h" #include #include /** * Model export options. */ enum { TT_EXPTABLE_OPT_UNKNOWN = 0, ///< Unknown option TT_EXPTABLE_OPT_FORMAT, ///< Output option. TT_EXPTABLE_OPT_ENCODING, ///< Output option. TT_EXPTABLE_OPT_ATTRIBUTES, ///< Output option. TT_EXPTABLE_OPT_LOCATION, TT_EXPTABLE_OPT_FILTER, TT_EXPTABLE_OPT_SURVEYS, }; /** * Options parsing table. */ static const thstok thtt_exptable_opt[] = { {"-attr", TT_EXPTABLE_OPT_ATTRIBUTES}, {"-attributes", TT_EXPTABLE_OPT_ATTRIBUTES}, {"-enc", TT_EXPTABLE_OPT_ENCODING}, {"-encoding", TT_EXPTABLE_OPT_ENCODING}, {"-filter", TT_EXPTABLE_OPT_FILTER}, {"-fmt", TT_EXPTABLE_OPT_FORMAT}, {"-format", TT_EXPTABLE_OPT_FORMAT}, {"-location", TT_EXPTABLE_OPT_LOCATION}, {"-surveys", TT_EXPTABLE_OPT_SURVEYS}, {NULL, TT_EXPTABLE_OPT_UNKNOWN} }; /** * Model export formats. */ enum { TT_EXPTABLE_FMT_UNKNOWN = 0, ///< Unknown option TT_EXPTABLE_FMT_DBF, TT_EXPTABLE_FMT_TXT, TT_EXPTABLE_FMT_HTML, TT_EXPTABLE_FMT_KML, }; /** * Format parsing table. */ static const thstok thtt_exptable_fmt[] = { {"dbf", TT_EXPTABLE_FMT_DBF}, {"html", TT_EXPTABLE_FMT_HTML}, {"kml", TT_EXPTABLE_FMT_KML}, {"text", TT_EXPTABLE_FMT_TXT}, {"txt", TT_EXPTABLE_FMT_TXT}, {NULL, TT_EXPTABLE_FMT_UNKNOWN} }; /** * Main export class. */ class thexptable : public thexport { public: bool expattr, exploc, filter, surveys; ///< Whether to export user defined attributes. int format, ///< Output format. encoding; thattr m_table; std::list m_str_list; thexptable(); ///< Default constructor. /** * Parse model export options. */ virtual void parse_options(int & argx, int nargs, char ** args); /** * Dump object into file. */ virtual void dump_body(FILE * xf); /** * Dump object into file. */ virtual void dump_header(FILE * xf); /** * Make export. */ virtual void process_db(class thdatabase * dbp); /** * Export entraces from survey. */ void export_survey_entraces(class thsurvey * survey); /** * Return string for temporary use. */ std::string * get_tmp_string(); /** * Add coordinates to table. */ void add_coordinates(double x, double y, double z, const char * xlabel = "", const char * ylabel = "", const char * zlabel = ""); }; #endif therion/thlayoutln.h0000664000175000017500000000261311225631452013625 0ustar useruser/** * @file thlayoutln.h * Scrap outline line class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thlayoutln_h #define thlayoutln_h #include #include "thlayoutclr.h" /** * Layout line class. */ class thlayoutln { public: char code; thlayoutln * next_line; const char * line; thlayout_color sclr; ///< Symbol color. int smid; ///< Symbol macro ID thlayoutln(); ///< Default constructor }; typedef std::list thlayoutln_list; ///< Points list. #endif therion/thwarp.h0000664000175000017500000000434111575361636012743 0ustar useruser/** * @file thwarp.h * Export class. */ /* Copyright (C) 2007 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thwarp_h #define thwarp_h #include #include "thpic.h" #include "thsketch.h" class thwarp { protected: thsketch * m_sketch; public: thwarp() : m_sketch(NULL) {} virtual ~thwarp(); /** * Morph given sketch. */ virtual thpic * morph(thsketch * sketch, double scale); /** * Delete warp object. */ virtual void self_delete(); }; /** * Only linear picture transformation. */ class thwarplin : public thwarp { protected: thpic mpic; bool morphed; int method; public: thwarplin() : morphed(false), method(0) {} virtual thpic * morph(thsketch * sketch, double scale); virtual void self_delete(); }; /** * Inverse distance transformation. */ class thwarpinvdist : public thwarplin { public: thwarpinvdist() { this->method = 1; } virtual void self_delete(); }; /** * Inverse distance line transformation. */ class thwarpinvdistln : public thwarplin { public: thwarpinvdistln() { this->method = 2; } virtual void self_delete(); }; /** * Inverse distance line transformation. */ class thwarpfastinvdistln : public thwarplin { public: thwarpfastinvdistln() { this->method = 3; } virtual void self_delete(); }; #endif therion/thconfig0000664000175000017500000000041012447664117013001 0ustar useruserencoding utf-8 source survey a centerline data normal from to compass backcompass clino tape 0 1 5 175 0 1 endcenterline endsurvey map a1 -proj plan a endmap map a2 -proj elevation a endmap map a3 -proj [elevation 10 deg] a endmap endsource export model therion/thobjectname.cxx0000664000175000017500000001011710721225140014427 0ustar useruser/** * @file thobjectname.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thobjectname.h" #include "thexception.h" #include "thparse.h" #include "thdatabase.h" #include "thdataobject.h" #include "thsurvey.h" thobjectname::thobjectname() { this->clear(); } void thobjectname::clear() { this->name = NULL; this->survey = NULL; this->psurvey = NULL; this->id = 0; } bool thobjectname::is_empty() { return (this->name == NULL); } void thparse_objectname(thobjectname & ds, thmbuffer * sstore, char * src, thdataobject * psobj) { if ((psobj != NULL) && ((psobj->stnsuff != NULL) || (psobj->stnpref != NULL))) { if (psobj->stnpref != NULL) thdb.buff_tmp = psobj->stnpref; else thdb.buff_tmp = ""; thdb.buff_tmp += src; if (psobj->stnsuff != NULL) thdb.buff_tmp += psobj->stnsuff; src = thdb.buff_tmp.get_buffer(); } ds.name = src; size_t snl = strlen(src), sni; for(sni = 0; sni < snl; sni++, src++) if (*src == '@') { *src = 0; ds.survey = src + 1; break; } if (!th_is_extkeyword(ds.name)) ththrow(("invalid object name -- %s", ds.name)) if (ds.survey != NULL) if (!th_is_keyword_list(ds.survey, '.')) ththrow(("invalid survey name -- %s", ds.survey)); ds.name = sstore->append(ds.name); if (ds.survey != NULL) ds.survey = sstore->append(ds.survey); ds.psurvey = thdb.get_current_survey(); } void fprintf(FILE * fh, thobjectname & ds) { if (ds.name != NULL) fprintf(fh, "%s", ds.name); else fprintf(fh, "-"); if (ds.survey != NULL) fprintf(fh, "@%s", ds.survey); if (ds.id > 0) fprintf(fh, ":%ld", ds.id); } char * thobjectname::print_name() { static thbuffer pname; size_t plen, slen; char * rv; plen = (this->name != NULL ? strlen(this->name) : 0); slen = (this->survey != NULL ? strlen(this->survey) : 0); pname.guarantee(plen + slen + 1); rv = pname.get_buffer(); rv[0] = 0; if ((plen > 0) && (slen > 0)) { sprintf(rv, "%s@%s", this->name, this->survey); } else if (plen > 0) { sprintf(rv, "%s", this->name); } else if (slen > 0) { sprintf(rv, "%s", this->survey); } return rv; } char * thobjectname__print_full_name(const char * oname, thsurvey * psrv, int slevel) { static thbuffer pname; size_t plen, slen, start, cx, tx; int clevel; char * rv; const char * sname; sname = NULL; if (psrv != NULL) sname = psrv->get_full_name(); plen = (oname != NULL ? strlen(oname) : 0); slen = (sname != NULL ? strlen(sname) : 0); pname.guarantee(plen + slen + 1); rv = pname.get_buffer(); rv[0] = 0; if ((plen > 0) && (slen > 0) && (slevel != 0)) { sprintf(rv, "%s@%s", oname, sname); } else if (plen > 0) { sprintf(rv, "%s", oname); } else if ((slen > 0) && (slevel != 0)) { sprintf(rv, "%s", sname); } if ((slen > 0) && (slevel > 0)) { start = (plen > 0 ? plen + 1 : 0); clevel = 0; tx = strlen(rv); for(cx = start; cx < tx; cx++) { if (rv[cx] == '.') { clevel++; if (clevel == slevel) { rv[cx] = 0; break; } } } } return rv; } char * thobjectname::print_full_name(int slevel) { return thobjectname__print_full_name(this->name, this->psurvey, slevel); } therion/thexpmap.cxx0000664000175000017500000033237212341065350013631 0ustar useruser/** * @file thexpmap.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexpmap.h" #include "thexporter.h" #include "thexception.h" #include "thdatabase.h" #include "thdb2d.h" #include "thdb2dmi.h" #include "thtmpdir.h" #include "thscrap.h" #include "thpoint.h" #include "thline.h" #include "tharea.h" #include "thlayout.h" #include "thmap.h" #include "thsketch.h" #include "thconfig.h" #include #include "thtmpdir.h" #ifndef THMSVC #include #else #include #define getcwd _getcwd #define chdir _chdir #define putenv _putenv #define hypot _hypot #endif #include "thchenc.h" #include "thdb1d.h" #include "thinit.h" #include "thlogfile.h" #include "thconvert.h" #include "thpdf.h" #include "thpdfdata.h" #include "thmpost.h" #include "thtex.h" #include "thcmdline.h" #include "thtexfonts.h" #include "thsurvey.h" #include "thlegenddata.h" #include #include #include #include "thmapstat.h" #include "thcsdata.h" #include "thproj.h" #include "thsurface.h" #include #include "loch/lxMath.h" #include "thsvg.h" #include "extern/img.h" #include "thcs.h" #ifdef THMSVC #define snprintf _snprintf #define strcasecmp _stricmp #endif thexpmap::thexpmap() { this->format = TT_EXPMAP_FMT_UNKNOWN; this->projstr = "plan"; this->layoutstr = ""; this->layout = new thlayout; this->layout->assigndb(&thdb); this->layout->id = ++thdb.objid; this->projptr = NULL; this->encoding = TT_UTF_8; } thexpmap::~thexpmap() { delete this->layout; } void thexpmap_log_log_file(const char * logfpath, const char * on_title, const char * off_title, bool mpbug) { char * lnbuff = new char [4097]; // unsigned long lnum = 0; thlog.printf("%s",on_title); std::ifstream lf(logfpath); if (!(lf.is_open())) {{ thwarning(("can't open %s file for input", logfpath)); } thlog.printf("can't open %s file for input",logfpath); thlog.printf("%s",off_title); delete [] lnbuff; return; } // let's read line by line and print to log file bool skip_next = false, skip_this = false, peoln = false; while (!(lf.eof())) { lf.getline(lnbuff,4096); if (mpbug && (!skip_this)) { if (strncmp(lnbuff,"write",5) == 0) { skip_next = true; skip_this = true; peoln = false; } } if (!skip_this) { if (!skip_next) { thlog.printf("%s%s", (peoln ? "\n" : ""), lnbuff); peoln = true; } else { skip_next = false; } } else { skip_this = false; } } if (peoln) thlog.printf("\n"); lf.close(); delete [] lnbuff; thlog.printf("%s",off_title); } void thexpmap::parse_options(int & argx, int nargs, char ** args) { int optid, optx; //,sv; // double dv; bool supform; char * fmt; //if (argx == 0) { // optid = TT_EXPMAP_OPT_PROJECTION; // optx = argx; //} //else { optid = thmatch_token(args[argx], thtt_expmap_opt); optx = argx; //} switch (optid) { case TT_EXPMAP_OPT_FORMAT: argx++; if (argx >= nargs) ththrow(("missing format -- \"%s\"",args[optx])) this->format = thmatch_token(args[argx], thtt_expmap_fmt); fmt = args[argx]; if (this->format == TT_EXPMAP_FMT_UNKNOWN) ththrow(("unknown format -- \"%s\"", args[argx])) argx++; supform = false; switch (this->export_mode) { case TT_EXP_MAP: switch (this->format) { case TT_EXPMAP_FMT_PDF: case TT_EXPMAP_FMT_SVG: case TT_EXPMAP_FMT_XHTML: case TT_EXPMAP_FMT_XVI: case TT_EXPMAP_FMT_TH2: case TT_EXPMAP_FMT_3D: case TT_EXPMAP_FMT_KML: case TT_EXPMAP_FMT_DXF: case TT_EXPMAP_FMT_SHP: supform = true; } break; case TT_EXP_ATLAS: switch (this->format) { case TT_EXPMAP_FMT_PDF: supform = true; } break; } if (!supform) ththrow(("format not supported -- %s",fmt)) break; case TT_EXPMAP_OPT_ENCODING: argx++; if (argx >= nargs) ththrow(("missing encoding -- \"%s\"",args[optx])) this->encoding = thmatch_token(args[argx], thtt_encoding); if (this->encoding == TT_UNKNOWN_ENCODING) ththrow(("unknown encoding -- \"%s\"", args[argx])) argx++; break; case TT_EXPMAP_OPT_PROJECTION: argx++; if (argx >= nargs) ththrow(("missing projection specification -- \"%s\"",args[optx])) this->projstr = thdb.strstore(args[argx],true); argx++; break; case TT_EXPMAP_OPT_LAYOUT: argx++; if (argx >= nargs) ththrow(("missing layout -- \"%s\"",args[optx])) this->layout->set(thcmd_option_desc(TT_LAYOUT_COPY), &(args[argx]), this->cfgptr->cfg_file.get_cif_encoding(), 0); // = thdb.strstore(args[argx],true); this->layoutopts += " -layout "; thencode(&(this->cfgptr->bf1), args[argx], this->cfgptr->cfg_file.get_cif_encoding()); thdecode_arg(&(this->cfgptr->bf2), this->cfgptr->bf1.get_buffer()); this->layoutopts += this->cfgptr->bf2.get_buffer(); argx++; break; default: // skusi ci je to -layout-xxx if (strncmp(args[optx],"-layout-",8) == 0) this->parse_layout_option(argx, nargs, args); else thexport::parse_options(argx, nargs, args); break; } } void thexpmap::parse_layout_option(int & argx, int nargs, char ** args) { // ak ano, tak skontroluje ich pocet // pouzije set na nastavenie layoutu // ulozi ich - pozor na dekodovanie int i; char * opts = &((args[argx])[8]); this->layout->m_pconfig = this->cfgptr; thcmd_option_desc o = this->layout->get_cmd_option_desc(opts); if (o.id == TT_DATAOBJECT_UNKNOWN) ththrow(("unknown layout option -- -%s", opts)); if (argx + o.nargs >= nargs) ththrow(("not enough layout option arguments -- -%s", opts)); argx++; this->layout->set(o, &(args[argx]), this->cfgptr->cfg_file.get_cif_encoding(), 0); this->layoutopts += " -layout-"; this->layoutopts += opts; for (i = 0; i < o.nargs; i++) { thencode(&(this->cfgptr->bf1), args[argx], this->cfgptr->cfg_file.get_cif_encoding()); thdecode_arg(&(this->cfgptr->bf2), this->cfgptr->bf1.get_buffer()); this->layoutopts += " "; this->layoutopts += this->cfgptr->bf2.get_buffer(); argx++; } } void thexpmap::dump_header(FILE * xf) { thexport::dump_header(xf); } void thexpmap::dump_body(FILE * xf) { if (strcmp(this->projstr,"plan") != 0) fprintf(xf," -projection %s",this->projstr); thexport::dump_body(xf); if (this->format != TT_EXPMAP_FMT_UNKNOWN) fprintf(xf," -format %s", thmatch_string(this->format, thtt_expmap_fmt)); thdecode(&(this->cfgptr->bf1), this->cfgptr->cfg_fenc, this->layoutopts.get_buffer()); fprintf(xf,"%s",this->cfgptr->bf1.get_buffer()); } void thexpmap::parse_projection(class thdatabase * dbp) { thdb2dprjpr prjid = dbp->db2d.parse_projection(this->projstr,true); /* if (prjid.newprj) { thwarning(("%s [%d] -- no projection data -- %s", this->src.name, this->src.line, this->projstr)) return; }*/ this->projptr = prjid.prj; } void thexpmap::process_db(class thdatabase * dbp) { if (this->projptr == NULL) return; this->db = dbp; if (this->format == TT_EXPMAP_FMT_UNKNOWN) { this->format = TT_EXPMAP_FMT_PDF; thexp_set_ext_fmt(".pdf", TT_EXPMAP_FMT_PDF) if (this->export_mode == TT_EXP_MAP) { thexp_set_ext_fmt(".svg", TT_EXPMAP_FMT_SVG) thexp_set_ext_fmt(".xhtml", TT_EXPMAP_FMT_XHTML) thexp_set_ext_fmt(".xvi", TT_EXPMAP_FMT_XVI) thexp_set_ext_fmt(".th2", TT_EXPMAP_FMT_TH2) thexp_set_ext_fmt(".3d", TT_EXPMAP_FMT_3D) thexp_set_ext_fmt(".shp", TT_EXPMAP_FMT_SHP) thexp_set_ext_fmt(".kml", TT_EXPMAP_FMT_KML) thexp_set_ext_fmt(".dxf", TT_EXPMAP_FMT_DXF) thexp_set_ext_fmt(".bbox", TT_EXPMAP_FMT_BBOX) } } if (this->format != TT_EXPMAP_FMT_XVI) thdb.db2d.process_projection(this->projptr); this->layout->process_copy(); // the export it self switch (this->format) { case TT_EXPMAP_FMT_3D: this->export_uni(thdb.db2d.select_projection(this->projptr),this->projptr); break; case TT_EXPMAP_FMT_PDF: case TT_EXPMAP_FMT_XHTML: case TT_EXPMAP_FMT_SVG: this->export_pdf(thdb.db2d.select_projection(this->projptr),this->projptr); break; case TT_EXPMAP_FMT_SHP: this->export_shp(thdb.db2d.select_projection(this->projptr),this->projptr); break; case TT_EXPMAP_FMT_KML: this->export_kml(thdb.db2d.select_projection(this->projptr),this->projptr); break; case TT_EXPMAP_FMT_BBOX: this->export_bbox(thdb.db2d.select_projection(this->projptr),this->projptr); break; case TT_EXPMAP_FMT_DXF: this->export_dxf(thdb.db2d.select_projection(this->projptr),this->projptr); break; case TT_EXPMAP_FMT_XVI: this->export_xvi(this->projptr); break; case TT_EXPMAP_FMT_TH2: this->export_th2(this->projptr); break; } //if (tmp != NULL) { // tmp->self_delete(); //} } char * thexpmap_u2string(unsigned u) { static char a [8]; a[7] = 0; unsigned v = 1; for(int i = 6; i >= 0; i--) { a[i] = 'a' + ((u / v) % 10); v *= 10; } return (&(a[0])); } #define layoutnan(XXX,VVV) \ if (thisnan(this->layout->XXX)) this->layout->XXX = (VVV) void thexpmap::export_xvi(class thdb2dprj * prj) { const char * fnm = this->get_output("cave.xvi"); switch (prj->type) { case TT_2DPROJ_PLAN: case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: this->db->db2d.process_projection(prj); break; default: thwarning(("projection type not supported in XVI export")); return; } if (thdb.db1d.station_vec.size() == 0) { thwarning(("no data to export")); return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif size_t i, nst = thdb.db1d.station_vec.size(), nsh = thdb.db1d.leg_vec.size(); thdb1ds * cs; thdataleg * cl; lxVec * stvec; bool * isexp; FILE * pltf; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } isexp = new bool [nst]; size_t nstvec, nstvecsize; if (prj->type == TT_2DPROJ_EXTEND) nstvec = 2 * nsh; else nstvec = nst; nstvecsize = 1; if (nstvecsize < nstvec) nstvecsize = nstvec; if (nstvecsize < nst) nstvecsize = nst; stvec = new lxVec [nstvecsize]; layoutnan(gxs, 1.0); layoutnan(gys, 1.0); layoutnan(gzs, 1.0); layoutnan(gox, 0.0); layoutnan(goy, 0.0); layoutnan(goz, 0.0); double xx, yx, zx, xy, yy, zy, xmin = thnan, xmax = thnan, ymin = thnan, ymax = thnan, cx, cy, sf; double shx, shy, gxs, gxo, gyo, gxoo, gyoo, alpha; long gxn, gyn; // scale factor: assume 100dpi sf = 3937.00787402 * this->layout->scale; gxs = this->layout->gxs; fprintf(pltf,"set XVIgrids {%.1f m}\n", gxs); gxs *= sf; switch (prj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: if (thisnan(prj->pp1)) alpha = 0.0; else alpha = prj->pp1; xx = sf * cos(alpha / 180.0 * THPI); xy = 0.0; yx = sf * -sin(alpha / 180.0 * THPI); yy = 0.0; zx = 0.0; zy = sf; gxo = sf * this->layout->gox * xx + this->layout->goy * yx; gyo = sf * this->layout->goz; break; default: xx = sf; xy = 0.0; yx = 0.0; yy = sf; zx = 0.0; zy = 0.0; gxo = sf * this->layout->gox; gyo = sf * this->layout->goy; } // select stations from selected surveys long survid = -1; unsigned long ff, tt; #define check_cxy_minmax() \ if (thisnan(xmin)) { \ xmin = cx; \ ymin = cy; \ xmax = cx; \ ymax = cy; \ } else { \ if (xmin > cx) xmin = cx; \ if (ymin > cy) ymin = cy; \ if (xmax < cx) xmax = cx; \ if (ymax < cy) ymax = cy; \ } for(i = 0; i < nst; i++) { cs = &(thdb.db1d.station_vec[i]); if (cs->survey->is_selected()) { if ((survid > -2) && (long(cs->survey->id) != survid)) { if (survid == -1) survid = (long) cs->survey->id; else survid = -2; } isexp[i] = true; cx = cs->x * xx + cs->y * yx + cs->z * zx; cy = cs->x * xy + cs->y * yy + cs->z * zy; check_cxy_minmax(); stvec[i].x = cx; stvec[i].y = cy; stvec[i].z = 0.0; } else { isexp[i] = false; } } if (prj->type == TT_2DPROJ_EXTEND) { bool first_st = true; for(i = 0; i < nsh; i++) { cl = thdb.db1d.leg_vec[i].leg; ff = cl->from.id - 1; tt = cl->to.id - 1; if (isexp[ff] && isexp[tt] && ((cl->extend & TT_EXTENDFLAG_HIDE) == 0)) { if (first_st) { xmin = thnan; first_st = false; } cs = &(thdb.db1d.station_vec[ff]); cx = sf * cl->fxx; cy = sf * cs->z; check_cxy_minmax(); stvec[2*i].x = cx; stvec[2*i].y = cy; stvec[2*i].z = 0.0; cs = &(thdb.db1d.station_vec[tt]); cy = sf * cs->z; cx = sf * cl->txx; check_cxy_minmax(); stvec[2*i+1].x = cx; stvec[2*i+1].y = cy; stvec[2*i+1].z = 0.0; } } } shx = (xmin + xmax) / 2.0; shy = (ymin + ymax) / 2.0; xmin -= shx; xmax -= shx; gxo -= shx; ymin -= shy; ymax -= shy; gyo -= shy; thbuffer stname; thsurvey * css; fprintf(pltf,"set XVIstations {\n"); for(i = 0; i < nstvec; i++) { # define export_xvi_station(i,j) \ if (isexp[(i)]) { \ cs = &(thdb.db1d.station_vec[(i)]); \ stname = cs->name; \ css = cs->survey; \ if (survid == -2) { \ while ((css != NULL) && (css->id != thdb.fsurveyptr->id) && (css->is_selected())) { \ if (css->id == cs->survey->id) \ stname += "@"; \ else \ stname += "."; \ stname += css->name; \ css = css->fsptr; \ } \ } \ stvec[(j)].x -= shx; \ stvec[(j)].y -= shy; \ if (!cs->is_temporary()) { \ fprintf(pltf," {%12.2f %12.2f %s}\n", stvec[(j)].x, stvec[(j)].y, stname.get_buffer()); \ } \ } if (prj->type == TT_2DPROJ_EXTEND) { if (i % 2 == 0) { cl = thdb.db1d.leg_vec[i / 2].leg; ff = cl->from.id - 1; tt = cl->to.id - 1; export_xvi_station(ff,i); export_xvi_station(tt,i+1); } } else export_xvi_station(i,i); } fprintf(pltf,"}\n"); // export sketches if (this->layout->sketches) { fprintf(pltf,"set XVIimages {\n"); thdb_object_list_type::iterator obi; thsketch_list::iterator skit; thpic * skpic; thscrap * scrap; for (obi = thdb.object_list.begin(); obi != thdb.object_list.end(); obi++) { if (((*obi)->get_class_id() == TT_SCRAP_CMD) && (!((thscrap *)(*obi))->centerline_io) && (*obi)->fsptr->is_selected() && (((thscrap *)(*obi))->proj->id == prj->id)) { scrap = (thscrap *)(*obi); skit = scrap->sketch_list.begin(); while (skit != scrap->sketch_list.end()) { skpic = skit->morph(sf); if (skpic != NULL) { double nx, ny, ns; const char * srcgif; nx = sf * (skpic->x) - shx; ny = sf * (skpic->y + skpic->scale * double(skpic->height)) - shy; ns = skpic->scale * sf; const char * fn; size_t fnx, fnl; fn = skit->m_pic.fname; fnl = strlen(skit->m_pic.fname); for(fnx = 0; fnx < fnl; fnx++) { if (((skit->m_pic.fname[fnx] == '/') || (skit->m_pic.fname[fnx] == '\\')) && (fnx < fnl - 1)) { fn = &(skit->m_pic.fname[fnx + 1]); } } if (thtext_inline) thprintf("\n"); thprintf("converting %s ", fn); thprintf("(%.1f Mpix) ...", double(ns * ns * skpic->width * skpic->height) / 1000000.0); thtext_inline = true; if (fabs(ns - 1.0) < 1e-8) { srcgif = skpic->convert("GIF", "gif", ""); } else { srcgif = skpic->convert("GIF", "gif", "-resize %d", long(ns * double(skpic->width) + 0.5)); } thprintf(" done\n"); thtext_inline = false; if (srcgif != NULL) { fprintf(pltf,"{%.2f %.2f\n{", nx, ny); thbase64_encode(srcgif, pltf); fprintf(pltf,"}\n}\n"); } } skit++; } } } fprintf(pltf,"}\n"); } // export shots fprintf(pltf,"set XVIshots {\n"); lxVec vff, vf1, vf2, vtt, vt1, vt2, rvec; double fl, fr, tl, tr; bool vertical; lxVecLimits vlim; for(i = 0; i < nsh; i++) { cl = thdb.db1d.leg_vec[i].leg; ff = cl->from.id - 1; tt = cl->to.id - 1; if (prj->type == TT_2DPROJ_EXTEND) { vff = stvec[2*i]; vtt = stvec[2*i+1]; } else { vff = stvec[ff]; vtt = stvec[tt]; } if (isexp[ff] && isexp[tt]) { fprintf(pltf," {%12.2f %12.2f %12.2f %12.2f", vff.x, vff.y, vtt.x, vtt.y); // calculate and export LRUD if needed if (cl->walls != TT_FALSE) { if ((vff.x == vtt.x) && (vff.y == vtt.y)) { vlim.valid = false; vlim.Add(-sf * cl->from_left,-sf * cl->from_down,0.0); vlim.Add(sf * cl->from_right, sf * cl->from_up ,0.0); vlim.Add(-sf * cl->to_left,-sf * cl->to_down,0.0); vlim.Add(sf * cl->to_right, sf * cl->to_up ,0.0); vf1 = vff + vlim.min; vf2 = vff + lxVec(vlim.min.x, vlim.max.y, 0.0); vt2 = vff + vlim.max; vt1 = vff + lxVec(vlim.max.x, vlim.min.y, 0.0); } else { vertical = false; switch (prj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: if (fabs(cl->total_gradient) < cl->vtresh) vertical = true; if ((vertical) || (vff.x < vtt.x) || ((vff.x == vtt.x) && (vff.y < vtt.y))) { fl = sf * cl->from_up; fr = sf * cl->from_down; tl = sf * cl->to_up; tr = sf * cl->to_down; } else { fl = sf * cl->from_down; fr = sf * cl->from_up; tl = sf * cl->to_down; tr = sf * cl->to_up; } break; default: fl = sf * cl->from_left; fr = sf * cl->from_right; tl = sf * cl->to_left; tr = sf * cl->to_right; } if (vertical) { rvec = lxVec(0.0, 1.0, 0.0); } else { rvec = vtt - vff; rvec.Normalize(); rvec = rvec.Rotated(90.0,0.0); } vf1 = vff + fl * rvec; vf2 = vff - fr * rvec; vt1 = vtt + tl * rvec; vt2 = vtt - tr * rvec; } cx = vf1.x; cy = vf1.y; check_cxy_minmax(); cx = vt1.x; cy = vt1.y; check_cxy_minmax(); cx = vf2.x; cy = vf2.y; check_cxy_minmax(); cx = vt2.x; cy = vt2.y; check_cxy_minmax(); fprintf(pltf," %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f", vf1.x, vf1.y, vt1.x, vt1.y, vt2.x, vt2.y, vf2.x, vf2.y); } fprintf(pltf,"}\n"); } } fprintf(pltf,"}\n"); // calculate grid double goverlap = 0.1 * hypot(xmax - xmin, ymax - ymin); thset_grid(gxo, gxs, xmin - goverlap, xmax + goverlap, gxoo, gxn); thset_grid(gyo, gxs, ymin - goverlap, ymax + goverlap, gyoo, gyn); fprintf(pltf,"set XVIgrid {%g %g %g 0.0 0.0 %g %ld %ld}\n", gxoo, gyoo, gxs, gxs, gxn+1, gyn+1); delete [] isexp; delete [] stvec; fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmap::export_th2(class thdb2dprj * prj) { const char * fnm = this->get_output("cave.th2"); switch (prj->type) { case TT_2DPROJ_PLAN: case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: this->db->db2d.process_projection(prj); break; default: thwarning(("projection type not supported in TH2 export")); return; } if (thdb.db1d.station_vec.size() == 0) { thwarning(("no data to export")); return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif FILE * pltf; pltf = fopen(fnm,"w"); if (pltf == NULL) { thwarning(("can't open %s for output",fnm)) return; } double xmin = thnan, xmax = thnan, ymin = thnan, ymax = thnan, cx, cy, sf; double shx, shy; // scale factor: assume 100dpi sf = 3937.00787402 * this->layout->scale; #define check_cxy_minmax() \ if (thisnan(xmin)) { \ xmin = cx; \ ymin = cy; \ xmax = cx; \ ymax = cy; \ } else { \ if (xmin > cx) xmin = cx; \ if (ymin > cy) ymin = cy; \ if (xmax < cx) xmax = cx; \ if (ymax < cy) ymax = cy; \ } // check all points from selected scraps thdb2dpt_list::iterator pli; for(pli = this->db->db2d.pt_list.begin(); pli != this->db->db2d.pt_list.end(); pli++) { if ((pli->pscrap != NULL) && (pli->pscrap->fsptr->is_selected())) { cx = sf * pli->xt; cy = sf * pli->yt; check_cxy_minmax(); } } shx = xmin - 2.0; shy = ymin - 2.0; xmin -= shx; xmax -= shx; ymin -= shy; ymax -= shy; thdb_object_list_type::iterator obi; thsketch_list::iterator skit; thpic * skpic; thscrap * scrap; int sknum = 1; fprintf(pltf,"encoding utf-8\n"); fprintf(pltf,"##XTHERION## xth_me_area_adjust %.0f %.0f %0.f %0.f\n",xmin - 0.1 * (xmax - xmin), ymin - 0.1 * (ymax - ymin),xmax + 0.1 * (xmax - xmin), ymax + 0.1 * (ymax - ymin)); fprintf(pltf,"\n\n"); #define tf(x,y) sf * (x) - shx, sf * (y) - shy // export scraps & scrap objects for (obi = thdb.object_list.begin(); obi != thdb.object_list.end(); obi++) { if (((*obi)->get_class_id() == TT_SCRAP_CMD) && (!((thscrap *)(*obi))->centerline_io) && (*obi)->fsptr->is_selected() && (((thscrap *)(*obi))->proj->id == prj->id)) { scrap = (thscrap *)(*obi); // export sketches if (this->layout->sketches) { skit = scrap->sketch_list.begin(); while (skit != scrap->sketch_list.end()) { skpic = skit->morph(sf); if (skpic != NULL) { double nx, ny, ns; const char * srcgif; nx = sf * (skpic->x - prj->shift_x) - shx; ny = sf * (skpic->y - prj->shift_y + skpic->scale * double(skpic->height)) - shy; ns = skpic->scale * sf; const char * fn; size_t fnx, fnl; fn = skit->m_pic.fname; fnl = strlen(skit->m_pic.fname); for(fnx = 0; fnx < fnl; fnx++) { if (((skit->m_pic.fname[fnx] == '/') || (skit->m_pic.fname[fnx] == '\\')) && (fnx < fnl - 1)) { fn = &(skit->m_pic.fname[fnx + 1]); } } if (thtext_inline) thprintf("\n"); thprintf("converting %s ", fn); thprintf("(%.1f Mpix) ...", double(ns * ns * skpic->width * skpic->height) / 1000000.0); thtext_inline = true; if (fabs(ns - 1.0) < 1e-8) { srcgif = skpic->convert("GIF", "gif", ""); } else { srcgif = skpic->convert("GIF", "gif", "-resize %d", long(ns * double(skpic->width) + 0.5)); } if (srcgif != NULL) { size_t cpch, retcode; thbuffer com; char prevbf[10]; snprintf(&(prevbf[0]),10,"%03d",sknum); // Let's copy results and log-file to working directory #ifdef THWIN32 com = "copy \""; #else com = "cp \""; #endif com += srcgif; com += "\" \""; com += fnm; com += "."; com += &(prevbf[0]); com += ".gif\""; #ifdef THWIN32 char * cpcmd; cpcmd = com.get_buffer(); for(cpch = 0; cpch < strlen(cpcmd); cpch++) { if (cpcmd[cpch] == '/') { cpcmd[cpch] = '\\'; } } #endif #ifdef THDEBUG thprintf("copying results\n"); #endif retcode = system(com.get_buffer()); if (retcode != EXIT_SUCCESS) ththrow(("cp exit code -- %d", retcode)) for(cpch = strlen(fnm); cpch > 0; cpch--) { if ((fnm[cpch] == '/') || (fnm[cpch] == '\\')) { cpch++; break; } } fprintf(pltf,"##XTHERION## xth_me_image_insert {%.2f 1 1.0} {%.2f {}} %s.%03d.gif 0 {}\n", nx, ny, &(fnm[cpch]), sknum++); } thprintf(" done\n"); thtext_inline = false; } skit++; } } #define objname(obj) (obj)->get_name(), (strlen((obj)->fsptr->get_full_name()) > 0 ? "." : ""), (obj)->fsptr->get_full_name() // export scrap itself fprintf(pltf,"scrap %s%s%s\n\n", objname(scrap)); // export scrap objects th2ddataobject * so; for (so = scrap->fs2doptr; so != NULL; so = so->nscrapoptr) { switch (so->get_class_id()) { case TT_POINT_CMD: { thpoint * pt = (thpoint *) so; const char * typestr = thmatch_string(pt->type,thtt_point_types); fprintf(pltf," point %.2f %.2f %s", tf(pt->point->xt, pt->point->yt), typestr); if (pt->subtype != TT_POINT_SUBTYPE_UNKNOWN) { switch (pt->type) { case TT_POINT_TYPE_U: fprintf(pltf, ":%s", pt->m_subtype_str); break; default: fprintf(pltf, ":%s", thmatch_string(pt->subtype, thtt_point_subtypes)); } } if (pt->type == TT_POINT_TYPE_STATION) { if (pt->station_name.id != 0) { fprintf(pltf," -name %s", pt->station_name.print_name()); } } if (strlen(pt->name) > 0) { fprintf(pltf," -id %s%s%s", objname(pt)); } fprintf(pltf,"\n\n"); } break; case TT_LINE_CMD: { thline * ln = (thline *) so; const char * typestr = thmatch_string(ln->type,thtt_line_types); fprintf(pltf," line %s", typestr); int lsubtype = TT_LINE_SUBTYPE_UNKNOWN; int loutline = TT_LINE_OUTLINE_NONE; switch (ln->type) { case TT_LINE_TYPE_WALL: lsubtype = TT_LINE_SUBTYPE_BEDROCK; loutline = TT_LINE_OUTLINE_OUT; break; case TT_LINE_TYPE_BORDER: lsubtype = TT_LINE_SUBTYPE_VISIBLE; break; case TT_LINE_TYPE_WATER_FLOW: lsubtype = TT_LINE_SUBTYPE_PERMANENT; break; case TT_LINE_TYPE_SURVEY: lsubtype = TT_LINE_SUBTYPE_CAVE; break; case TT_LINE_TYPE_ARROW: //this->tags |= TT_LINE_TAG_HEAD_END; break; case TT_LINE_TYPE_CHIMNEY: //this->place = TT_2DOBJ_PLACE_DEFAULT_TOP; break; case TT_LINE_TYPE_CEILING_STEP: //this->place = TT_2DOBJ_PLACE_DEFAULT_TOP; break; case TT_LINE_TYPE_CEILING_MEANDER: //this->place = TT_2DOBJ_PLACE_DEFAULT_TOP; break; } if (ln->type == TT_LINE_TYPE_U) fprintf(pltf, ":%s", ln->m_subtype_str); else if ((ln->first_point != NULL) && (ln->first_point->subtype != lsubtype)) { thdb2dlp * nlp = ln->first_point->nextlp; while (nlp != NULL) { if (nlp->subtype != ln->first_point->subtype) break; nlp = nlp->nextlp; } if (nlp == NULL) { fprintf(pltf, ":%s", thmatch_string(ln->first_point->subtype, thtt_line_subtypes)); lsubtype = ln->first_point->subtype; } } if (ln->closed != TT_AUTO) { if (ln->closed == TT_TRUE) { fprintf(pltf," -close on"); } else { fprintf(pltf," -close off"); } } if (ln->outline != loutline) { fprintf(pltf," -outline %s", thmatch_string(ln->outline,thtt_line_outlines)); } if (strlen(ln->name) > 0) { fprintf(pltf," -id %s%s%s", objname(ln)); } fprintf(pltf,"\n"); thdb2dlp * lpt = ln->first_point; while (lpt != NULL) { fprintf(pltf," "); if (lpt->cp1 != NULL) { fprintf(pltf," %.2f %.2f", tf(lpt->cp1->xt, lpt->cp1->yt)); } if (lpt->cp2 != NULL) { fprintf(pltf," %.2f %.2f", tf(lpt->cp2->xt, lpt->cp2->yt)); } fprintf(pltf," %.2f %.2f\n", tf(lpt->point->xt, lpt->point->yt)); // change subtype if (lpt->cp1 != NULL) { if (lpt->smooth_orig != TT_AUTO) { if (lpt->smooth_orig == TT_TRUE) { fprintf(pltf," smooth on\n"); } else { fprintf(pltf," smooth off\n"); } } } if (lpt->subtype != lsubtype) { fprintf(pltf," subtype %s\n", thmatch_string(lpt->subtype, thtt_line_subtypes)); lsubtype = lpt->subtype; } if ((lpt->tags | TT_LINEPT_TAG_ALTITUDE) != 0) { // TODO: altitude tags and others } lpt = lpt->nextlp; } fprintf(pltf," endline\n\n"); } break; case TT_AREA_CMD: { tharea * ar = (tharea *) so; const char * typestr = thmatch_string(ar->type,thtt_area_types); fprintf(pltf," area %s", typestr); if (ar->type == TT_AREA_TYPE_U) fprintf(pltf, ":%s", ar->m_subtype_str); if (strlen(ar->name) > 0) { fprintf(pltf," -id %s%s%s", objname(ar)); } fprintf(pltf,"\n"); fprintf(pltf," endarea\n\n"); } break; } } // export e fprintf(pltf,"endscrap\n\n"); } } fclose(pltf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmap::export_pdf(thdb2dxm * maps, thdb2dprj * prj) { // poojde kapitolu za kapitolou a exportuje scrapy a // vytvori hashe -> layer a scrap // spusti mp - thpdf - pdftex if (maps == NULL) { thwarning(("%s [%d] -- no selected projection data -- %s", this->src.name, this->src.line, this->projstr)) return; } double meridian_conv = thcfg.get_outcs_convergence(); double rotate_plus = 0.0; FILE * mpf, * plf, *tf; unsigned sfig = 1; unsigned sscrap = 0; thexpmap_xmps exps; const char * chtitle; thbuffer tit; bool quick_map_exp = false; double origin_shx, origin_shy, new_shx, new_shy, srot = 0.0, crot = 1.0, rrot = 0.0; thexpmapmpxs out; th2ddataobject * op2; bool export_sections, export_outlines_only; double shx, shy; unsigned long sclevel, bmlevel; legenddata ldata; bool anyprev, anyprevabove = false, anyprevbelow = false; char * prevbf; prevbf = new char [128]; prevbf[127] = 0; thbuffer aboveprev, belowprev; list::iterator SCRAPITEM; scraprecord dummsr; const char * fnm = this->get_output("cave.pdf"); layerrecord L; map::iterator LAYER_ITER; thdb2dxm * cmap = maps; thdb2dxs * cbm; thdb2dmi * cmi; thbuffer encb, texb; texb.guarantee(128); thscrap * cs; thini.copy_fonts(); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ...\n", fnm); // thtext_inline = true; #endif switch (this->layout->north) { case TT_LAYOUT_NORTH_GRID: rotate_plus = meridian_conv; break; } // scalebar length double sblen, sbtestdbl; long sbtest; this->layout->units.lang = this->layout->lang; if (this->layout->scale_bar <= 0.0) { sbtestdbl = log(this->layout->units.convert_length(0.10 / this->layout->scale)) / log(pow(10.0,1.0/3.0)); sbtest = long(sbtestdbl); sblen = pow(10.0,double(sbtest/3)); switch (sbtest % 3) { case 0: sblen *= 1.0; break; case 1: sblen *= 2.5; break; default: sblen *= 5.0; break; } } else sblen = this->layout->units.convert_length(this->layout->scale_bar); layoutnan(gxs, sblen); layoutnan(gys, sblen); layoutnan(gzs, sblen); layoutnan(gox, 0.0); layoutnan(goy, 0.0); layoutnan(goz, 0.0); out.symset = &(this->symset); out.layout = this->layout; out.ms = this->layout->scale * 2834.64566929; // korekcia shiftu na layout origin if (!thisnan(this->layout->ox)) { switch (prj->type) { case TT_2DPROJ_EXTEND: case TT_2DPROJ_ELEV: origin_shx = (prj->shift_x - this->layout->ox) * out.ms; origin_shy = (prj->shift_z - this->layout->oz) * out.ms; break; default: origin_shx = (prj->shift_x - this->layout->ox) * out.ms; origin_shy = (prj->shift_y - this->layout->oy) * out.ms; rrot = this->layout->rotate - meridian_conv + rotate_plus; srot = sin(rrot / 180.0 * THPI); crot = cos(rrot / 180.0 * THPI); new_shx = origin_shx * crot + origin_shy * srot; new_shy = origin_shy * crot - origin_shx * srot; origin_shx = new_shx; origin_shy = new_shy; break; } } else { origin_shx = 0.0; origin_shy = 0.0; } // koniec korekcie shiftu na layout origin if ((this->layout->def_overlap > 0) && (this->layout->def_size == 0)) { double nhs, nvs; nhs = this->layout->hsize + 0.02 - 2.0 * this->layout->overlap; nvs = this->layout->vsize + 0.02 - 2.0 * this->layout->overlap; if (nhs > 0.0) this->layout->hsize = nhs; if (nvs > 0.0) this->layout->vsize = nvs; } else if ((this->layout->def_size > 0) && (this->layout->def_page_setup == 0)) { this->layout->paghs = this->layout->hsize + 2.0 * this->layout->overlap; this->layout->pagvs = this->layout->vsize + 2.0 * this->layout->overlap + 0.065; this->layout->paphs = this->layout->paghs + 2.0 * this->layout->marls; this->layout->papvs = this->layout->pagvs + 2.0 * this->layout->marts; } // tf = fopen(thtmp.get_file_name("Config"),"w"); // this->layout->export_config(tf,prj,out.ms,origin_shx,origin_shy); this->layout->set_thpdf_layout(prj,out.ms,origin_shx,origin_shy); // fclose(tf); tf = fopen(thtmp.get_file_name("data.tex"),"w"); if (thcmdln.extern_libs) fprintf(tf,"\\input therion.tex\n"); else fprintf(tf,"%s\n",thtex_library); this->layout->export_pdftex(tf,prj, (this->export_mode == TT_EXP_MAP ? TT_LAYOUT_CODE_TEX_MAP : TT_LAYOUT_CODE_TEX_ATLAS) ); fprintf(tf,"\\end\n"); fclose(tf); // mooze byt zmena v definovanych symboloch, natoceni atd... :((( //if (thexporter_quick_map_export && // (thexpmap_quick_map_export_scale == this->layout->scale)) { // quick_map_exp = true; // goto QUICK_MAP_EXPORT; //} plf = fopen(thtmp.get_file_name("data.pl"),"w"); SCRAPLIST.clear(); mpf = fopen(thtmp.get_file_name("data.mp"),"w"); out.file = mpf; out.proj = prj; out.attr_last_survey = ""; out.attr_last_id = ""; out.attr_last_scrap = ""; out.attr_last_scrap_centerline = false; double magdec = 0.0, gridconv = 0.0; if (thcfg.outcs != TTCS_LOCAL) { thdate dt; dt.reset_current(); double cy = dt.get_start_year(); gridconv = thcfg.get_outcs_convergence(); thcfg.get_outcs_mag_decl(cy, magdec); } thexpmap_quick_map_export_scale = this->layout->scale; fprintf(mpf,"Scale:=%.2f;\n",0.01 / this->layout->scale); fprintf(mpf,"MagDecl:=%.2f;\n", magdec); fprintf(mpf,"GridConv:=%.2f;\n", gridconv); if (this->layout->def_base_scale > 0) fprintf(mpf,"BaseScale:=%.2f;\n",0.01 / this->layout->base_scale); fprintf(mpf,"color HelpSymbolColor;\nHelpSymbolColor := (0.8, 0.8, 0.8);\n"); fprintf(mpf,"background:=(%.5f,%.5f,%.5f);\n", this->layout->color_map_fg.R, this->layout->color_map_fg.G, this->layout->color_map_fg.B); fprintf(mpf,"verbatimtex \\input th_enc.tex etex;\n"); // fprintf(mpf,"def user_initialize = enddef;\n"); //this->layout->export_mpost(mpf); if (thcmdln.extern_libs) fprintf(mpf,"input therion;\n"); else fprintf(mpf,"%s\n",thmpost_library); fprintf(mpf,"lang:=\"%s\";\n",thlang_getid(this->layout->lang)); fprintf(mpf,"ATTR__elevation:=%s;\n",((prj->type == TT_2DPROJ_ELEV) || (prj->type == TT_2DPROJ_EXTEND) ? "true" : "false")); this->db->attr.export_mp_header(out.file); this->db->db1d.m_station_attr.export_mp_header(out.file); this->db->db2d.export_mp_header(out.file); // fprintf(mpf,"verbatimtex \\def\\updown#1#2{\\vbox{%%\n"); // fprintf(mpf," \\offinterlineskip\n"); // fprintf(mpf," \\setbox100=\\hbox{#1}\n"); // fprintf(mpf," \\setbox101=\\hbox{#2}\n"); // fprintf(mpf," \\ifnum\\wd100>\\wd101\\hsize=\\wd100\\else\\hsize=\\wd101\\fi\n"); // fprintf(mpf," \\centerline{\\box100}\\vskip4pt\n"); // fprintf(mpf," \\centerline{\\box101}}}\n"); // fprintf(mpf," \\def\\thnormalsize{\\size[10]}\n"); // fprintf(mpf," \\def\\thsmallsize{\\size[8]}\n"); // fprintf(mpf," \\def\\thlabel{\\thnormalsize}\n"); // fprintf(mpf," \\def\\thremark{\\thsmallsize\\si}\n"); // fprintf(mpf," \\def\\thaltitude{\\thsmallsize}\n"); // fprintf(mpf," \\def\\thstationname{\\thsmallsize}\n"); // fprintf(mpf," \\def\\thdate{\\thsmallsize}\n"); // fprintf(mpf," \\def\\thheight{\\thsmallsize}\n"); // fprintf(mpf," \\def\\thheightpos{\\thsmallsize+\\ignorespaces}\n"); // fprintf(mpf," \\def\\thheightneg{\\thsmallsize-\\ignorespaces}\n"); // fprintf(mpf," \\def\\thframed{\\thsmallsize}\n"); // fprintf(mpf," \\def\\thwallaltitude{\\thsmallsize}\n"); // fprintf(mpf,"etex;\n"); // fprintf(mpf,"defaultfont:=\"%s\";\n",FONTS.begin()->ss.c_str()); if (ENC_NEW.NFSS==0) fprintf(mpf,"defaultfont:=\"%s\";\n",FONTS.begin()->ss.c_str()); else fprintf(mpf,"defaultfont:=\"thss00\";\n"); //fprintf(mpf,"defaultscale:=0.8;\n\n"); fprintf(mpf,"NorthDir:=\"%s\";\n", this->layout->north == TT_LAYOUT_NORTH_GRID ? "grid" : "true"); this->layout->export_mpost(mpf); this->layout->export_mpost_symbols(mpf, &(this->symset)); fprintf(mpf,"transparency:=%s;\n", (this->layout->transparency ? "true" : "false")); //fprintf(mpf,"write EOF to \"missed.dat\";\n\n"); // prida nultu figure // fprintf(mpf,"beginfig(0);\nendfig;\n"); this->export_pdf_set_colors(maps, prj); double ascR = 1.0, ascG = 1.0, ascB = 1.0, pscR = -1.0, pscG = -1.0, pscB = -1.0; lxVecLimits lim; SURFPICTLIST.clear(); surfpictrecord srfpr; thsurface * surf; double surfscl = this->layout->scale * 11811.023622472446117783; if (COLORLEGENDLIST.size() > 0) { fprintf(plf,"# COLOR LEGEND\n"); for (list::iterator cli = COLORLEGENDLIST.begin(); cli != COLORLEGENDLIST.end(); cli++) { fprintf(plf,"# %4.0f %4.0f %4.0f %s\n", 100.0 * cli->R, 100.0 * cli->G, 100.0 * cli->B, cli->texname.c_str()); } fprintf(plf,"\n\n\n"); } fprintf(plf,"%%SCRAP = (\n"); while (cmap != NULL) { cbm = cmap->first_bm; bmlevel = 0; while (cbm != NULL) { cmi = cbm->bm->last_item; sclevel = 0; // !!! Tu pridat aj ine druhy - teda ABOVE a BELOW export_outlines_only = ((cbm->mode == TT_MAPITEM_ABOVE) || (cbm->mode == TT_MAPITEM_BELOW)) && (!cbm->m_target->previewed) && (cbm->m_target->fmap->output_number != cbm->m_target->preview_output_number); if ((cbm->mode == TT_MAPITEM_NORMAL) || export_outlines_only) { if (export_outlines_only) { cbm->m_target->previewed = true; } while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) { cs = (thscrap *) cmi->object; export_sections = false; op2 = NULL; while ((!export_sections) || (op2 != NULL)) { if (export_sections) { if ((op2->get_class_id() == TT_POINT_CMD) && (((thpoint *)op2)->type == TT_POINT_TYPE_SECTION) && (((((thpoint *)op2)->context < 0) && this->symset.is_assigned(SYMP_SECTION)) || ((((thpoint *)op2)->context > -1) && this->symset.assigned[((thpoint *)op2)->context])) && (((thpoint *)op2)->text != NULL)) { cs = (thscrap *)((thpoint *)op2)->text; thdb.db2d.process_projection(cs->proj); } else cs = NULL; } if (cs != NULL) { cs->get_polygon(); if (export_sections) { if (thisnan(cs->lxmin)) { out.mx = 0.0; out.my = 0.0; } else { out.mx = (cs->lxmax + cs->lxmin) / 2.0; out.my = (cs->lymax + cs->lymin) / 2.0; } out.sr = 0.0; out.cr = 1.0; out.rr = 0.0; shx = ((thpoint *)op2)->point->xt; shy = ((thpoint *)op2)->point->yt; shx *= out.ms; shy *= out.ms; } else { ascR = cs->R; ascG = cs->G; ascB = cs->B; if ((ascR != pscR) || (ascG != pscG) || (ascB != pscB)) { fprintf(mpf,"background:=(%.5f,%.5f,%.5f);\n", ascR, ascG, ascB); fprintf(mpf,"def_transparent_rgb(tr_bg, %.5f, %.5f, %.5f);\n", ascR, ascG, ascB); pscR = ascR; pscG = ascG; pscB = ascB; } if (thisnan(cs->lxmin)) { out.mx = 0.0; out.my = 0.0; } else { out.mx = (cs->lxmax + cs->lxmin) / 2.0; out.my = (cs->lymax + cs->lymin) / 2.0; } switch (prj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: break; default: out.rr = out.layout->rotate - meridian_conv + rotate_plus; out.sr = sin(out.rr / 180.0 * THPI); out.cr = cos(out.rr / 180.0 * THPI); break; } shx = out.mx * out.ms; shy = out.my * out.ms; if (!export_outlines_only) { cs->exported = true; } } shx += cbm->m_shift.m_x * out.ms; shy += cbm->m_shift.m_y * out.ms; out.m_shift_x = cbm->m_shift.m_x - cbm->m_shift.m_prev_x; out.m_shift_y = cbm->m_shift.m_y - cbm->m_shift.m_prev_y; switch (prj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: rrot = 0.0; srot = 0.0; crot = 1.0; break; default: rrot = this->layout->rotate - meridian_conv + rotate_plus; srot = sin(rrot / 180.0 * THPI); crot = cos(rrot / 180.0 * THPI); new_shx = shx * crot + shy * srot; new_shy = shy * crot - shx * srot; shx = new_shx; shy = new_shy; } shx += origin_shx; shy += origin_shy; if (export_sections) { switch (thdb2d_rotate_align(((thpoint *)op2)->align, rrot)) { case TT_POINT_ALIGN_B: shy -= (cs->lymax - cs->lymin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_T: shy += (cs->lymax - cs->lymin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_R: shx += (cs->lxmax - cs->lxmin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_L: shx -= (cs->lxmax - cs->lxmin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_BR: shy -= (cs->lymax - cs->lymin) / 2.0 * out.ms; shx += (cs->lxmax - cs->lxmin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_BL: shy -= (cs->lymax - cs->lymin) / 2.0 * out.ms; shx -= (cs->lxmax - cs->lxmin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_TR: shy += (cs->lymax - cs->lymin) / 2.0 * out.ms; shx += (cs->lxmax - cs->lxmin) / 2.0 * out.ms; break; case TT_POINT_ALIGN_TL: shy += (cs->lymax - cs->lymin) / 2.0 * out.ms; shx -= (cs->lxmax - cs->lxmin) / 2.0 * out.ms; break; } } exps = this->export_mp(& out, cs, sfig, export_outlines_only); // naozaj ho exportujeme if (exps.flags != TT_XMPS_NONE) { fprintf(plf,"\t# scrap: %s\n",cs->name); fprintf(plf,"\t%s => {\n",thexpmap_u2string(sscrap)); if (!export_sections) { lim.Add(cs->lxmin, cs->lymin, cs->z); lim.Add(cs->lxmax, cs->lymax, cs->z); } SCRAPITEM = SCRAPLIST.insert(SCRAPLIST.end(),dummsr); if (this->layout->sketches) { thsketch_list::iterator skit; thpic * skpic; skit = cs->sketch_list.begin(); while (skit != cs->sketch_list.end()) { skpic = skit->morph(out.ms); if (skpic != NULL) { switch (this->format) { case TT_EXPMAP_FMT_SVG: case TT_EXPMAP_FMT_XHTML: srfpr.filename = thdb.strstore(thtmp.get_file_name(skpic->texfname)); break; default: srfpr.filename = skpic->texfname; } srfpr.width = skpic->width / 300.0 * 72.0; srfpr.height = skpic->height / 300.0 * 72.0; srfpr.dx = ( - prj->shift_x + skpic->x ) * out.ms; srfpr.dy = ( - prj->shift_y + skpic->y ) * out.ms; srfpr.xx = skpic->scale * surfscl; srfpr.xy = 0.0; srfpr.yx = 0.0; srfpr.yy = skpic->scale * surfscl; srfpr.type = "png"; // otocenie o rotaciu v layoute double tdx = srfpr.dx, tdy = srfpr.dy, txx = srfpr.xx, txy = srfpr.xy, tyx = srfpr.yx, tyy = srfpr.yy; srfpr.dx = tdx * crot + tdy * srot + origin_shx; srfpr.dy = - tdx * srot + tdy * crot + origin_shy; srfpr.xx = crot * txx + srot * tyx; srfpr.xy = crot * txy + srot * tyy; srfpr.yx = -srot * txx + crot * tyx; srfpr.yy = -srot * txy + crot * tyy; SCRAPITEM->SKETCHLIST.insert(SCRAPITEM->SKETCHLIST.end(), srfpr); //SURFPICTLIST.insert(SURFPICTLIST.end(), srfpr); fprintf(plf,"\n\n# PICTURE: %s\n", srfpr.filename); fprintf(plf, "# origin: %g %g\n", srfpr.dx, srfpr.dy); fprintf(plf, "# matrix: %g %g %g %g\n\n", srfpr.xx, srfpr.xy, srfpr.yx, srfpr.yy); } skit++; } } SCRAPITEM->sect = 0; SCRAPITEM->name = thexpmap_u2string(sscrap); SCRAPITEM->r = ascR; //this->layout->color_map_fg.R; SCRAPITEM->g = ascG; //this->layout->color_map_fg.G; SCRAPITEM->b = ascB; //this->layout->color_map_fg.B; if (export_sections) { fprintf(plf,"\t\t Z => 1,\n"); SCRAPITEM->sect = 1; } // pred orezanim if (exps.F > 0) { fprintf(plf,"\t\t F => \"data.%ld\",\n",exps.F); sprintf(texb.get_buffer(),"data.%ld",exps.F); SCRAPITEM->F = texb.get_buffer(); } // else // fprintf(plf,"\t\t F => \"data.0\",\n"); // orezavacia cesta a outlines if (exps.B > 0) { fprintf(plf,"\t\t B => \"data.%ld\",\n",exps.B); sprintf(texb.get_buffer(),"data.%ld",exps.B); SCRAPITEM->B = texb.get_buffer(); fprintf(plf,"\t\t I => \"data.%ldbg\",\n",exps.B); sprintf(texb.get_buffer(),"data.%ldbg",exps.B); SCRAPITEM->I = texb.get_buffer(); fprintf(plf,"\t\t C => \"data.%ldclip\",\n",exps.B); sprintf(texb.get_buffer(),"data.%ldclip",exps.B); SCRAPITEM->C = texb.get_buffer(); } // else { // fprintf(plf,"\t\t B => \"data.0\",\n"); // fprintf(plf,"\t\t I => \"data.0\",\n"); // fprintf(plf,"\t\t C => \"data.0\",\n"); // } // po orezani if (exps.E > 0) { fprintf(plf,"\t\t E => \"data.%ld\",\n",exps.E); sprintf(texb.get_buffer(),"data.%ld",exps.E); SCRAPITEM->E = texb.get_buffer(); } // else // fprintf(plf,"\t\t E => \"data.0\",\n"); if (exps.X > 0) { fprintf(plf,"\t\t X => \"data.%ld\",\n",exps.X); sprintf(texb.get_buffer(),"data.%ld",exps.X); SCRAPITEM->X = texb.get_buffer(); fprintf(plf,"\t\t P => \"data.%ldbbox\",\n",exps.X); sprintf(texb.get_buffer(),"data.%ldbbox",exps.X); SCRAPITEM->P = texb.get_buffer(); } if (export_outlines_only) { fprintf(plf,"\t\t Y => %ld,\n",cbm->m_target->preview_output_number); SCRAPITEM->layer = (int) cbm->m_target->preview_output_number; fprintf(plf,"\t\t V => -1,\n"); SCRAPITEM->level = -1; } else { fprintf(plf,"\t\t Y => %ld,\n",cmap->output_number); SCRAPITEM->layer = (int) cmap->output_number; fprintf(plf,"\t\t V => -%ld,\n",cmi->itm_level + bmlevel); SCRAPITEM->level = - ((int) (cmi->itm_level + bmlevel)); } fprintf(plf,"\t\t S => \"%.2f %.2f\",\n\t},\n",shx,shy); SCRAPITEM->S1 = shx; SCRAPITEM->S2 = shy; if ((!export_outlines_only) && (!export_sections) && (cbm->m_target->fmap->output_number != cbm->m_target->preview_output_number) && (!cbm->m_target->previewed) && (exps.B > 0)) { fprintf(plf,"\t# scrap: %s\n",cs->name); fprintf(plf,"\t%s => {\n",thexpmap_u2string(sscrap + 1)); SCRAPITEM = SCRAPLIST.insert(SCRAPLIST.end(),dummsr); SCRAPITEM->sect = 0; SCRAPITEM->name = thexpmap_u2string(sscrap + 1); SCRAPITEM->r = ascR; //this->layout->color_map_fg.R; SCRAPITEM->g = ascG; //this->layout->color_map_fg.G; SCRAPITEM->b = ascB; //this->layout->color_map_fg.B; fprintf(plf,"\t\t B => \"data.%ld\",\n",exps.B); sprintf(texb.get_buffer(),"data.%ld",exps.B); SCRAPITEM->B = texb.get_buffer(); fprintf(plf,"\t\t I => \"data.%ldbg\",\n",exps.B); sprintf(texb.get_buffer(),"data.%ldbg",exps.B); SCRAPITEM->I = texb.get_buffer(); fprintf(plf,"\t\t C => \"data.%ldclip\",\n",exps.B); sprintf(texb.get_buffer(),"data.%ldclip",exps.B); SCRAPITEM->C = texb.get_buffer(); //fprintf(plf,"\t\t B => \"data.%ld\",\n",exps.B); //fprintf(plf,"\t\t I => \"data.%ldbg\",\n",exps.B); //fprintf(plf,"\t\t C => \"data.%ldclip\",\n",exps.B); fprintf(plf,"\t\t Y => %ld,\n",cbm->m_target->preview_output_number); SCRAPITEM->layer = (int) cbm->m_target->preview_output_number; fprintf(plf,"\t\t V => -1,\n"); SCRAPITEM->level = -1; fprintf(plf,"\t\t S => \"%.2f %.2f\",\n\t},\n",shx,shy); SCRAPITEM->S1 = shx; SCRAPITEM->S2 = shy; sscrap++; } sscrap++; } } // if cs != NULL if (!export_sections) { export_sections = true; // if ((export_outlines_only) || (!this->symset.assigned[SYMP_SECTION])) if (export_outlines_only) // rezy sa neexportuju op2 = NULL; else op2 = cs->ls2doptr; } else { op2 = op2->pscrapoptr; } } // koniec exportovania priecnych rezov } cmi = cmi->prev_item; } bmlevel += cbm->bm->last_level; } cbm = cbm->next_item; } cmap = cmap->next_item; } sprintf(texb.get_buffer(),"data.%d",sfig); LAYOUT.northarrow = texb.get_buffer(); fprintf(mpf,"beginfig(%d);\ns_northarrow(%g);\nendfig;\n",sfig++,this->layout->rotate + rotate_plus); sprintf(texb.get_buffer(),"data.%d",sfig); LAYOUT.scalebar = texb.get_buffer(); //snprintf(prevbf,127,"%g",sblen); fprintf(mpf,"beginfig(%d);\ns_scalebar(%g, %g, \"%s\");\nendfig;\n", sfig++, sblen, 1.0 / this->layout->units.convert_length(1.0), utf2tex(this->layout->units.format_i18n_length_units())); // sem pride zapisanie legendy do MP suboru if (this->layout->def_base_scale > 0) fprintf(mpf,"Scale:=%.2f;\ninitialize(Scale);\n",0.01 / this->layout->base_scale); fprintf(mpf,"background:=(%.5f,%.5f,%.5f);\n", this->layout->color_map_fg.R, this->layout->color_map_fg.G, this->layout->color_map_fg.B); //fprintf(mpf,"background:=white;\n"); fprintf(mpf,"transparency:=false;\n"); LEGENDLIST.clear(); if ((this->layout->legend != TT_LAYOUT_LEGEND_OFF) && ((this->export_mode == TT_EXP_ATLAS) || (this->layout->map_header != TT_LAYOUT_MAP_HEADER_OFF))) { this->symset.export_pdf(this->layout,mpf,sfig); } // export all surface pictures switch (prj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: rrot = 0.0; srot = 0.0; crot = 1.0; break; default: rrot = this->layout->rotate - meridian_conv + rotate_plus; srot = sin(rrot / 180.0 * THPI); crot = cos(rrot / 180.0 * THPI); } thdb_object_list_type::iterator obi; if ((prj->type == TT_2DPROJ_PLAN) && (this->layout->surface != TT_LAYOUT_SURFACE_OFF)) { // prejde vsetky objekty a exportuje vsetku surveye obi = thdb.object_list.begin(); while (obi != thdb.object_list.end()) { if ((*obi)->get_class_id() == TT_SURFACE_CMD) { surf = (thsurface *)(*obi); if (surf->pict_name != NULL) { surf->calibrate(); srfpr.filename = surf->pict_name; srfpr.dx = (surf->calib_x - prj->shift_x) * out.ms; srfpr.dy = (surf->calib_y - prj->shift_y) * out.ms; srfpr.xx = surf->calib_xx * surfscl * surf->pict_dpi / 300.0; srfpr.xy = surf->calib_xy * surfscl * surf->pict_dpi / 300.0; srfpr.yx = surf->calib_yx * surfscl * surf->pict_dpi / 300.0; srfpr.yy = surf->calib_yy * surfscl * surf->pict_dpi / 300.0; srfpr.width = surf->pict_width / surf->pict_dpi * 72.0; srfpr.height = surf->pict_height / surf->pict_dpi * 72.0; srfpr.type = "unknown"; switch (surf->pict_type) { case TT_IMG_TYPE_JPEG: srfpr.type = "jpeg"; break; case TT_IMG_TYPE_PNG: srfpr.type = "png"; break; } // otocenie o rotaciu v layoute double tdx = srfpr.dx, tdy = srfpr.dy, txx = srfpr.xx, txy = srfpr.xy, tyx = srfpr.yx, tyy = srfpr.yy; srfpr.dx = tdx * crot + tdy * srot + origin_shx; srfpr.dy = - tdx * srot + tdy * crot + origin_shy; srfpr.xx = crot * txx + srot * tyx; srfpr.xy = crot * txy + srot * tyy; srfpr.yx = -srot * txx + crot * tyx; srfpr.yy = -srot * txy + crot * tyy; SURFPICTLIST.insert(SURFPICTLIST.end(), srfpr); fprintf(plf,"\n\n# PICTURE: %s\n", srfpr.filename); fprintf(plf, "# origin: %g %g\n", srfpr.dx, srfpr.dy); //fprintf(plf, "# scale: %g\n", srfpr.ss); //fprintf(plf, "# rotate: %g\n", srfpr.rr); fprintf(plf, "# matrix: %g %g %g %g\n\n", srfpr.xx, srfpr.xy, srfpr.yx, srfpr.yy); } } obi++; } } // export calibration points double ccx, ccy, ccz; // ccx = lim.min.x * out.ms; // ccy = lim.min.y * out.ms; // LAYOUT.calibration_local[0].x = ccx * crot + ccy * srot + origin_shx; //LAYOUT.calibration_local[0].y = - ccx * srot + ccy * crot + origin_shy; // if (prj->type == TT_2DPROJ_PLAN) { // thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, // lim.min.x + prj->rshift_x, lim.min.y + prj->rshift_y, lim.min.z + prj->rshift_z, ccx, ccy, ccz); // } else { // ccx = 0.0; // ccy = 0.0; // } // LAYOUT.calibration_latlong[0].x = ccx / THPI * 180.0; // LAYOUT.calibration_latlong[0].y = ccy / THPI * 180.0; #define calpoint(n,xxx,yyy) \ ccx = (xxx) * out.ms; \ ccy = (yyy) * out.ms; \ LAYOUT.calibration_local[n].x = ccx * crot + ccy * srot + origin_shx; \ LAYOUT.calibration_local[n].y = - ccx * srot + ccy * crot + origin_shy; \ if ((prj->type == TT_2DPROJ_PLAN) && (thcfg.outcs != TTCS_LOCAL)) { \ thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, \ (xxx) + prj->rshift_x, (yyy) + prj->rshift_y, lim.min.z + prj->rshift_z, ccx, ccy, ccz); \ } else { \ ccx = 0.0; \ ccy = 0.0; \ } \ LAYOUT.calibration_latlong[n].x = ccx / THPI * 180.0; \ LAYOUT.calibration_latlong[n].y = ccy / THPI * 180.0; calpoint(0, lim.min.x, lim.min.y); calpoint(1, (lim.min.x + lim.max.x) / 2.0,lim.min.y); calpoint(2, lim.max.x, lim.min.y); calpoint(3, lim.min.x, (lim.min.y + lim.max.y) / 2.0); calpoint(4, lim.max.x, (lim.min.y + lim.max.y) / 2.0); calpoint(5, lim.min.x, lim.max.y); calpoint(6, (lim.min.x + lim.max.x) / 2.0,lim.max.y); calpoint(7, lim.max.x, lim.max.y); calpoint(8, (lim.min.x + lim.max.x) / 2.0, (lim.min.y + lim.max.y) / 2.0); LAYOUT.calibration_hdist = lim.max.x - lim.min.x; // nakoniec grid double ghs, gvs, gox, goy; const char * grid_macro = "s_hgrid"; switch (prj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: ghs = this->layout->gxs * out.ms; gvs = this->layout->gzs * out.ms; gox = 0.0; goy = (this->layout->goz - prj->shift_z) * out.ms; LAYOUT.gridrot = 0.0; LAYOUT.proj = 1; grid_macro = "s_vgrid"; LAYOUT.XS = this->layout->gxs; LAYOUT.YS = this->layout->gzs; LAYOUT.XO = this->layout->gox; LAYOUT.YO = this->layout->goz; break; default: ghs = this->layout->gxs * out.ms; gvs = this->layout->gys * out.ms; gox = (this->layout->gox - prj->shift_x) * out.ms; goy = (this->layout->goy - prj->shift_y) * out.ms; LAYOUT.gridrot = rrot; LAYOUT.proj = 0; LAYOUT.XS = this->layout->gxs; LAYOUT.YS = this->layout->gys; LAYOUT.XO = this->layout->gox; LAYOUT.YO = this->layout->goy; break; } LAYOUT.hgridsize = ghs; LAYOUT.vgridsize = gvs; LAYOUT.hgridorigin = gox * crot + goy * srot + origin_shx; LAYOUT.vgridorigin = - gox * srot + goy * crot + origin_shy; switch (this->layout->grid) { case TT_LAYOUT_GRID_TOP: LAYOUT.grid = 2; break; case TT_LAYOUT_GRID_BOTTOM: LAYOUT.grid = 1; break; default: LAYOUT.grid = 0; break; } if (this->layout->grid != TT_LAYOUT_GRID_OFF) { #define expgridscrap(varname,Xpos,Ypos) \ sprintf(texb.get_buffer(),"data.%d",sfig); \ LAYOUT.varname = texb.get_buffer(); \ fprintf(mpf,"beginfig(%d);\n%s(%d, %d, %.5f, %.5f);\nendfig;\n", \ sfig++, grid_macro, Xpos, Ypos, ghs, gvs); expgridscrap(gridAA, -1, -1); expgridscrap(gridAB, 0, -1); expgridscrap(gridAC, 1, -1); expgridscrap(gridBA, -1, 0); expgridscrap(gridBB, 0, 0); expgridscrap(gridBC, 1, 0); expgridscrap(gridCA, -1, 1); expgridscrap(gridCB, 0, 1); expgridscrap(gridCC, 1, 1); } fprintf(mpf,"end;\n"); fprintf(plf,");\n"); fclose(mpf); cmap = maps; while (cmap != NULL) { if (cmap->expand) { cbm = cmap->first_bm; while (cbm != NULL) { cbm->m_target->previewed = false; cbm = cbm->next_item; } } cmap = cmap->next_item; } cmap = maps; LAYERHASH.clear(); MAP_PREVIEW_UP.clear(); MAP_PREVIEW_DOWN.clear(); chtitle = NULL; fprintf(plf,"\n\n%%LAYER = (\n"); while (cmap != NULL) { if (cmap->title) chtitle = (strlen(cmap->map->title) > 0 ? cmap->map->title : cmap->map->name); if (cmap->expand) { fprintf(plf,"\t# expanded map: %s\n",cmap->map->name); fprintf(plf,"\t%ld => {\n",cmap->output_number); LAYERHASH.insert(make_pair(cmap->output_number,L)); LAYER_ITER = LAYERHASH.find(cmap->output_number); LAYER_ITER->second.Z = 0; anyprev = false; cbm = cmap->first_bm; while (cbm != NULL) { if (cbm->mode == TT_MAPITEM_ABOVE) { LAYER_ITER->second.U.insert(cbm->m_target->preview_output_number); if (!anyprev) { fprintf(plf,"\t\tU => \"%ld",cbm->m_target->preview_output_number); anyprev = true; } else fprintf(plf," %ld",cbm->m_target->preview_output_number); } cbm = cbm->next_item; } if (anyprev) fprintf(plf,"\",\n"); thdecode(& texb,TT_ISO8859_2,(strlen(cmap->map->title) > 0 ? cmap->map->title : cmap->map->name)); thdecode_tex(& encb, texb.get_buffer()); fprintf(plf,"\t\tN => '%s',\n",encb.get_buffer()); LAYER_ITER->second.N = (strlen(cmap->map->title) > 0 ? cmap->map->title : cmap->map->name); if ((chtitle != NULL) && ((cmap->next_item == NULL) || (cmap->next_item->title))) { thdecode(& texb,TT_ISO8859_2,chtitle); thdecode_tex(& encb, texb.get_buffer()); fprintf(plf,"\t\tT => '%s',\n",encb.get_buffer()); LAYER_ITER->second.T = chtitle; chtitle = NULL; } anyprev = false; cbm = cmap->first_bm; while (cbm != NULL) { if (cbm->mode == TT_MAPITEM_BELOW) { LAYER_ITER->second.D.insert(cbm->m_target->preview_output_number); if (!anyprev) { fprintf(plf,"\t\tD => \"%ld",cbm->m_target->preview_output_number); anyprev = true; } else fprintf(plf," %ld",cbm->m_target->preview_output_number); } cbm = cbm->next_item; } if (anyprev) fprintf(plf,"\",\n"); fprintf(plf,"\t},\n"); cbm = cmap->first_bm; while (cbm != NULL) { if ((!cbm->m_target->previewed) && (cbm->m_target->fmap->output_number != cbm->m_target->preview_output_number)) { cbm->m_target->previewed = true; fprintf(plf,"\t# basic map: %s\n",cbm->bm->name); fprintf(plf,"\t%ld => {\n",cbm->m_target->preview_output_number); fprintf(plf,"\t\tZ => 1,\n"); fprintf(plf,"\t\tA => %ld,\n",cbm->m_target->fmap->output_number); fprintf(plf,"\t},\n"); LAYERHASH.insert(make_pair(cbm->m_target->preview_output_number,L)); LAYER_ITER = LAYERHASH.find(cbm->m_target->preview_output_number); LAYER_ITER->second.Z = 1; LAYER_ITER->second.AltJump = cbm->m_target->fmap->output_number; switch (cbm->m_target->mode) { case TT_MAPITEM_BELOW: MAP_PREVIEW_DOWN.insert(cbm->m_target->preview_output_number); if (!anyprevbelow) { snprintf(prevbf,127,"%ld",cbm->m_target->preview_output_number); belowprev += prevbf; anyprevbelow = true; } else { snprintf(prevbf,127," %ld",cbm->m_target->preview_output_number); belowprev += prevbf; } break; case TT_MAPITEM_ABOVE: MAP_PREVIEW_UP.insert(cbm->m_target->preview_output_number); if (!anyprevabove) { snprintf(prevbf,127,"%ld",cbm->m_target->preview_output_number); aboveprev += prevbf; anyprevabove = true; } else { snprintf(prevbf,127," %ld",cbm->m_target->preview_output_number); aboveprev += prevbf; } break; } } cbm = cbm->next_item; } } cmap = cmap->next_item; } fprintf(plf,");\n"); // map preview hash if (anyprevabove) { fprintf(plf,"\n\n$MAP_PREVIEW{U} = \"%s\";",aboveprev.get_buffer()); } if (anyprevbelow) { fprintf(plf,"\n\n$MAP_PREVIEW{D} = \"%s\";",belowprev.get_buffer()); } fprintf(plf,"\n\n\n$PATTERN_DEFS = \"./\";\n"); fclose(plf); delete [] prevbf; //QUICK_MAP_EXPORT: //if (strlen(this->layout->doc_title) == 0) { tit.strcpy(thdb.db2d.get_projection_title(prj)); //LAYOUT.doc_title = tit.get_buffer(); //} else // tit.strcpy(LAYOUT.doc_title.c_str()); tf = fopen(thtmp.get_file_name("th_texts.tex"),"w"); fprintf(tf,"\\legendtitle={%s}\n",utf2tex(thT("title legend",this->layout->lang))); ldata.legendtitle = thT("title legend",this->layout->lang); ldata.colorlegendtitle = ""; if ((this->layout->color_crit != TT_LAYOUT_CCRIT_UNKNOWN) && (this->layout->color_crit != TT_LAYOUT_CCRIT_SCRAP)) { fprintf(tf,"\\colorlegendtitle={"); switch (this->layout->color_crit) { case TT_LAYOUT_CCRIT_ALTITUDE: fprintf(tf,"%s", utf2tex(thT("title color-legend-altitude",this->layout->lang))); ldata.colorlegendtitle = thT("title color-legend-altitude",this->layout->lang); break; default: //TT_LAYOUT_CCRIT_MAP: fprintf(tf,"%s", utf2tex(thT("title color-legend-map",this->layout->lang))); ldata.colorlegendtitle = thT("title color-legend-map",this->layout->lang); } fprintf(tf,"}\n"); } // ak neni atlas, tak nastavi legendcavename fprintf(tf,"\\cavename={%s}\n",ths2tex(tit.get_buffer(), this->layout->lang).c_str()); ldata.cavename = tit.get_buffer(); ldata.comment = ""; if (strlen(this->layout->doc_comment) > 0) { fprintf(tf,"\\comment={%s}\n",ths2tex(this->layout->doc_comment, this->layout->lang).c_str()); ldata.comment = this->layout->doc_comment; } if ((prj->type != TT_2DPROJ_PLAN) || (!this->symset.is_assigned(SYMS_NORTHARROW))) { fprintf(tf,"\\northarrowfalse\n"); ldata.northarrow = false; } else { fprintf(tf,"\\northarrowtrue\n"); ldata.northarrow = true; } if (!this->symset.is_assigned(SYMS_SCALEBAR)) { fprintf(tf,"\\scalebarfalse\n"); ldata.scalebar = false; } else { fprintf(tf,"\\scalebartrue\n"); ldata.scalebar = true; } prj->stat.export_pdftex(tf, this->layout, &ldata); fclose(tf); // teraz sa hodi do temp adresara - spusti metapost, thpdf, a pdftex a skopiruje vysledok thbuffer com, wdir; wdir.guarantee(1024); getcwd(wdir.get_buffer(),1024); chdir(thtmp.get_dir_name()); // vypise kodovania print_fonts_setup(); ENC_NEW.write_enc_files(); int retcode; #ifdef THWIN32 if (!thini.tex_env) { putenv("TEXMFCNF="); putenv("DVIPSHEADERS="); putenv("GFFONTS="); putenv("GLYPHFONTS="); putenv("MFBASES="); putenv("MFINPUTS="); putenv("MFPOOL="); putenv("MPINPUTS="); putenv("MPMEMS="); putenv("MPPOOL="); putenv("MPSUPPORT="); putenv("PKFONTS="); putenv("PSHEADERS="); putenv("T1FONTS="); putenv("T1INPUTS="); putenv("T42FONTS="); putenv("TEXCONFIG="); putenv("TEXDOCS="); putenv("TEXFONTMAPS="); putenv("TEXFONTS="); putenv("TEXFORMATS="); putenv("TEXINPUTS="); putenv("TEXMFDBS="); putenv("TEXMFINI="); putenv("TEXPICTS="); putenv("TEXPKS="); putenv("TEXPOOL="); putenv("TEXPSHEADERS="); putenv("TEXSOURCES="); putenv("TFMFONTS="); putenv("TTFONTS="); putenv("VFFONTS="); putenv("WEB2C="); #ifdef THMSVC putenv("TEXINPUTS=../tex;../../therion.prj/Setup/texmf/tex;."); putenv("MPINPUTS=../mpost;."); if (ENC_NEW.NFSS == 1) { putenv("TEXFONTS=."); putenv("T1FONTS=."); putenv("TTFFONTS=."); } #endif } #endif if (!quick_map_exp) { com = "\""; com += thini.get_path_mpost(); com += "\" "; com += thini.get_opt_mpost(); // com += " --interaction nonstopmode data.mp"; com += " data.mp"; #ifdef THDEBUG thprintf("running metapost\n"); #endif retcode = system(com.get_buffer()); thexpmap_log_log_file("data.log", "####################### metapost log file ########################\n", "#################### end of metapost log file ####################\n",true); if (retcode != EXIT_SUCCESS) { chdir(wdir.get_buffer()); ththrow(("metapost exit code -- %d", retcode)) } } /* if (quick_map_exp) com = "thpdf -q"; else com = "thpdf"; */ #ifdef THWIN32 unsigned long cpch; char * cpcmd; #endif switch (this->format) { case TT_EXPMAP_FMT_PDF: if (!quick_map_exp) thconvert(); thpdf((this->export_mode == TT_EXP_MAP ? 1 : 0)); ENC_NEW.write_enc_files(); com = "\""; com += thini.get_path_pdftex(); com += "\""; // com += " --interaction nonstopmode data.tex"; com += " data.tex"; #ifdef THDEBUG thprintf("running pdftex\n"); #endif retcode = system(com.get_buffer()); thexpmap_log_log_file("data.log", "######################## pdftex log file #########################\n", "##################### end of pdftex log file #####################\n",false); if (retcode != EXIT_SUCCESS) { chdir(wdir.get_buffer()); ththrow(("pdftex exit code -- %d", retcode)) } // Let's copy results and log-file to working directory chdir(wdir.get_buffer()); #ifdef THWIN32 com = "copy \""; #else com = "cp \""; #endif com += thtmp.get_file_name("data.pdf"); com += "\" \""; com += fnm; com += "\""; #ifdef THWIN32 cpcmd = com.get_buffer(); for(cpch = 0; cpch < strlen(cpcmd); cpch++) { if (cpcmd[cpch] == '/') { cpcmd[cpch] = '\\'; } } #endif #ifdef THDEBUG thprintf("copying results\n"); #endif retcode = system(com.get_buffer()); if (retcode != EXIT_SUCCESS) ththrow(("cp exit code -- %d", retcode)) break; // END OF PDF POSTPROCESSING case TT_EXPMAP_FMT_SVG: thconvert_new(); chdir(wdir.get_buffer()); thsvg(fnm, 0, ldata); break; case TT_EXPMAP_FMT_XHTML: thconvert_new(); chdir(wdir.get_buffer()); thsvg(fnm, 1, ldata); break; } #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } struct vec2d { double x; double y; vec2d() : x(0.0), y(0.0) {} vec2d(double xx, double yy) : x(xx), y(yy) {} void set(double xx, double yy); }; void vec2d::set(double xx, double yy) { this->x = xx; this->y = yy; } thexpmap_xmps thexpmap::export_mp(thexpmapmpxs * out, class thscrap * scrap, unsigned & startnum, bool outline_mode) { th2ddataobject * obj; thpoint * ptp; thexpmapmpxs nooutc, * noout; nooutc = *out; noout = &(nooutc); noout->file = NULL; thexpmap_xmps result; bool clip_polygon; clip_polygon = (!scrap->centerline_io) && (scrap->get_outline() != NULL); unsigned from, to; int placeid; thscraplo * lo, * lo2; bool somex, first, vis; thscraplp * slp; thdb2dlp * lp; thexception dbg_stnms; bool map_shift = (hypot(out->m_shift_x, out->m_shift_y) > 1e-2); // check scrap limits bool warncheckchange = false; if (!thisnan(scrap->lxmin)) { vec2d v1, v2; v1.set(thxmmxst(out, scrap->lxmin, scrap->lymin)); v2.set(thxmmxst(out, scrap->lxmax, scrap->lymax)); double max, minscale; max = 0; #define mmmmcx(v) if (fabs(v) > max) max = fabs(v); mmmmcx(v1.x); mmmmcx(v1.y); mmmmcx(v2.x); mmmmcx(v2.y); if (max > 4095.0) { minscale = (1.0 / out->layout->scale) * (max / 4095.0); if (scrap->centerline_io) { fprintf(out->file, "thtmpwarningcheck := warningcheck;\n"); warncheckchange = true; fprintf(out->file, "warningcheck := 0;\n"); if (max > 32767.0) { minscale = (1.0 / out->layout->scale) * (max / 32767.0); ththrow(("scale too large -- maximal scale for this configuration is 1 : %.0f", minscale + 1)); } } else { ththrow(("scrap %s@%s defined at %s [%d] is too large to process in metapost in this scale -- maximal scale for this scrap is 1 : %.0f", scrap->name, scrap->fsptr->full_name, scrap->source.name, scrap->source.line, minscale + 1)); } } } if (scrap->fsptr != NULL) { const char * sfn = "", * div = ""; if (strlen(scrap->fsptr->full_name) > 0) { sfn = scrap->fsptr->full_name; div = "@"; } fprintf(out->file, "current_scrap := \"%s%s%s\";\n", scrap->name, div, sfn); } if (strcmp(out->attr_last_scrap, scrap->name) != 0) { fprintf(out->file, "ATTR__scrap := \"%s\";\n", scrap->name); out->attr_last_scrap = scrap->name; } if (out->attr_last_scrap_centerline != scrap->centerline_io) { fprintf(out->file, "ATTR__scrap_centerline := %s;\n", (scrap->centerline_io ? "true" : "false")); out->attr_last_scrap_centerline = scrap->centerline_io; } scrap->db->attr.export_mp_object_begin(out->file, (long) scrap->id); // preskuma vsetky objekty a ponastavuje im clip tagy obj = scrap->ls2doptr; if (outline_mode) obj = NULL; while (obj != NULL) { if ((obj->tags & TT_2DOBJ_TAG_CLIP_AUTO) > 0) { obj->tags &= ~(TT_2DOBJ_TAG_CLIP_AUTO | TT_2DOBJ_TAG_CLIP_ON); switch (obj->get_class_id()) { case TT_POINT_CMD: switch (((thpoint*)obj)->type) { case TT_POINT_TYPE_DIMENSIONS: obj->tags &= ~TT_2DOBJ_TAG_VISIBILITY_ON; break; case TT_POINT_TYPE_MAP_CONNECTION: if (!map_shift) { obj->tags &= ~TT_2DOBJ_TAG_VISIBILITY_ON; } break; case TT_POINT_TYPE_BEDROCK: case TT_POINT_TYPE_SAND: case TT_POINT_TYPE_RAFT: case TT_POINT_TYPE_CLAY: case TT_POINT_TYPE_PEBBLES: case TT_POINT_TYPE_DEBRIS: case TT_POINT_TYPE_BLOCKS: case TT_POINT_TYPE_WATER: case TT_POINT_TYPE_ICE: case TT_POINT_TYPE_GUANO: obj->tags |= TT_2DOBJ_TAG_CLIP_ON; break; } break; case TT_LINE_CMD: if ((((thline*)obj)->outline == TT_LINE_OUTLINE_NONE)) { switch (((thline*)obj)->type) { case TT_LINE_TYPE_SECTION: case TT_LINE_TYPE_ARROW: case TT_LINE_TYPE_LABEL: case TT_LINE_TYPE_WATER_FLOW: case TT_LINE_TYPE_GRADIENT: case TT_LINE_TYPE_MAP_CONNECTION: break; default: obj->tags |= TT_2DOBJ_TAG_CLIP_ON; break; } } break; case TT_AREA_CMD: obj->tags |= TT_2DOBJ_TAG_CLIP_ON; break; } } obj = obj->pscrapoptr; } // vypise objekty pred orezanim somex = false; #define thexpmap_export_mp_bgif if (!somex) {\ result.F = startnum++;\ fprintf(out->file,"beginfig(%ld);\n",result.F);} \ somex = true #define thxmempiov ((obj->tags & TT_2DOBJ_TAG_VISIBILITY_ON) > 0) // najprv vyplne for (placeid = TT_2DOBJ_PLACE_BOTTOM; placeid <= TT_2DOBJ_PLACE_TOP; placeid++) { obj = scrap->ls2doptr; if (outline_mode) obj = NULL; while (obj != NULL) { if (thxmempiov && ((obj->tags & TT_2DOBJ_TAG_CLIP_ON) > 0) && (obj->place == placeid)) { if (obj->export_mp(noout)) { thexpmap_export_mp_bgif; obj->export_mp(out); } } obj = obj->pscrapoptr; } } // a polygon if (clip_polygon && (!outline_mode)) { slp = scrap->get_polygon(); while (slp != NULL) { if (slp->lnio) { if (out->symset->is_assigned(slp->type)) { thexpmap_export_mp_bgif; slp->export_mp(out, scrap, true); } } slp = slp->next_item; } slp = scrap->get_polygon(); while (slp != NULL) { if (slp->lnio) { if (out->symset->is_assigned(slp->type)) { thexpmap_export_mp_bgif; slp->export_mp(out, scrap, false); } } slp = slp->next_item; } } if (somex) { fprintf(out->file,"endfig;\n"); result.flags |= TT_XMPS_F; } // vypise outline somex = false; #undef thexpmap_export_mp_bgif #define thexpmap_export_mp_bgif if (!somex) {\ result.B = startnum++;\ fprintf(out->file,"beginfig(%ld);\n",result.B);} \ somex = true lo = scrap->get_outline(); //if ((lo != NULL) && (lo->line->outline == TT_LINE_OUTLINE_OUT)) { if (true) { /// ;-) uz mame podporovanych viac vonkajsich a viac vnut. obrysov while (lo != NULL) { thexpmap_export_mp_bgif; fprintf(out->file,"draw_upscrap(%d)(",((lo->line->outline == TT_LINE_OUTLINE_OUT) ? 1 : 0)); // prejde celu krivku a rozlozi ju na viditelne a neviditelne casti first = true; lo2 = lo; while (lo2 != NULL) { if (lo2->mode == TT_OUTLINE_REVERSED) { lp = lo2->line->first_point; from = 0; while (lp != NULL) { lp = lp->nextlp; from++; } from = from - 1; lp = lo2->line->last_point; to = from; } else { lp = lo2->line->first_point; from = 0; to = from; } bool cvis = false; while (lp != NULL) { // najde viditelnost prveho bodu if (lo2->mode == TT_OUTLINE_REVERSED) { if (lp->prevlp != NULL) vis = (lo2->line->type == TT_LINE_TYPE_WALL) && (lp->prevlp->subtype != TT_LINE_SUBTYPE_INVISIBLE); else vis = cvis; } else { vis = (lo2->line->type == TT_LINE_TYPE_WALL) && (lp->subtype != TT_LINE_SUBTYPE_INVISIBLE); } cvis = vis; // pokracuje pokial nemame bod z inou viditelnostou while (lp != NULL) { if (lo2->mode == TT_OUTLINE_REVERSED) { if (lp->prevlp != NULL) vis = (lo2->line->type == TT_LINE_TYPE_WALL) && (lp->prevlp->subtype != TT_LINE_SUBTYPE_INVISIBLE); else vis = cvis; } else { vis = (lo2->line->type == TT_LINE_TYPE_WALL) && (lp->subtype != TT_LINE_SUBTYPE_INVISIBLE); } if (vis != cvis) break; if (lo2->mode == TT_OUTLINE_REVERSED) { lp = lp->prevlp; if (lp != NULL) from--; } else { lp = lp->nextlp; if (lp != NULL) to++; } } if (!first) { fprintf(out->file,",\n"); } first = false; if (cvis) { fprintf(out->file,"1,"); } else { fprintf(out->file,"0,"); } if (lo2->mode == TT_OUTLINE_REVERSED) { fprintf(out->file,"reverse "); lo2->line->export_path_mp(out,from,to); to = from; } else { lo2->line->export_path_mp(out,from,to); from = to; } } lo2 = lo2->next_line; } fprintf(out->file,");\n"); lo = lo->next_outline; } } if (somex) { fprintf(out->file,"draw_downscrap;\n"); fprintf(out->file,"endfig;\n"); result.flags |= TT_XMPS_B; } // vypise objekty po orezani somex = false; #undef thexpmap_export_mp_bgif #define thexpmap_export_mp_bgif if (!somex) {\ result.E = startnum++;\ fprintf(out->file,"beginfig(%ld);\n",result.E);} \ somex = true for (placeid = TT_2DOBJ_PLACE_BOTTOM; placeid <= TT_2DOBJ_PLACE_TOP; placeid++) { obj = scrap->ls2doptr; if (outline_mode) obj = NULL; while (obj != NULL) { if (thxmempiov && ((obj->tags & TT_2DOBJ_TAG_CLIP_ON) == 0) && (obj->place == placeid)) { switch (obj->get_class_id()) { case TT_LINE_CMD: switch (((thline*)obj)->type) { case TT_LINE_TYPE_LABEL: break; default: if (obj->export_mp(noout)) { thexpmap_export_mp_bgif; obj->export_mp(out); } break; } break; case TT_POINT_CMD: ptp = ((thpoint*)obj); switch (ptp->type) { case TT_POINT_TYPE_STATION: case TT_POINT_TYPE_STATION_NAME: case TT_POINT_TYPE_LABEL: case TT_POINT_TYPE_REMARK: case TT_POINT_TYPE_DATE: case TT_POINT_TYPE_ALTITUDE: case TT_POINT_TYPE_HEIGHT: case TT_POINT_TYPE_PASSAGE_HEIGHT: break; case TT_POINT_TYPE_MAP_CONNECTION: if (out->symset->is_assigned(SYML_MAPCONNECTION)) { thexpmap_export_mp_bgif; out->symset->export_mp_symbol_options(out->file, SYML_MAPCONNECTION); fprintf(out->file,"%s(((%.2f,%.2f) -- (%.2f,%.2f)));\n", out->symset->get_mp_macro(SYML_MAPCONNECTION), thxmmxst(out, ptp->point->xt, ptp->point->yt), thxmmxst(out, ptp->point->xt - out->m_shift_x, ptp->point->yt - out->m_shift_y)); } break; default: if (obj->export_mp(noout)) { thexpmap_export_mp_bgif; obj->export_mp(out); } break; } break; case TT_AREA_CMD: if (obj->export_mp(noout)) { thexpmap_export_mp_bgif; obj->export_mp(out); } break; } } obj = obj->pscrapoptr; } } // a polygon if ((!clip_polygon) && (!outline_mode)) { slp = scrap->get_polygon(); while (slp != NULL) { if (slp->lnio) { if (out->symset->is_assigned(slp->type)) { thexpmap_export_mp_bgif; slp->export_mp(out, scrap, true); } } slp = slp->next_item; } slp = scrap->get_polygon(); while (slp != NULL) { if (slp->lnio) { if (out->symset->is_assigned(slp->type)) { thexpmap_export_mp_bgif; slp->export_mp(out, scrap, false); } } slp = slp->next_item; } } // nakoniec meracske body // najprv z polygonu int macroid, typid; thdb1ds * tmps; bool flagexp; slp = scrap->get_polygon(); if (outline_mode) slp = NULL; while (slp != NULL) { if (!slp->lnio) { #define thexpmat_station_type_export_mp(type,mid) case type: \ macroid = mid; \ break; macroid = SYMP_STATION_TEMPORARY; switch(slp->station->mark) { thexpmat_station_type_export_mp(TT_DATAMARK_FIXED,SYMP_STATION_FIXED) thexpmat_station_type_export_mp(TT_DATAMARK_NATURAL,SYMP_STATION_NATURAL) thexpmat_station_type_export_mp(TT_DATAMARK_PAINTED,SYMP_STATION_PAINTED) } flagexp = false; #define thexpmatselected_stationflag(flag,mid) if (((slp->station->flags & flag) == flag) && out->symset->is_assigned(mid)) flagexp = true; thexpmatselected_stationflag(TT_STATIONFLAG_ENTRANCE, SYMP_FLAG_ENTRANCE) thexpmatselected_stationflag(TT_STATIONFLAG_SINK, SYMP_FLAG_SINK) thexpmatselected_stationflag(TT_STATIONFLAG_SPRING, SYMP_FLAG_SPRING) thexpmatselected_stationflag(TT_STATIONFLAG_DOLINE, SYMP_FLAG_DOLINE) thexpmatselected_stationflag(TT_STATIONFLAG_DIG, SYMP_FLAG_DIG) thexpmatselected_stationflag(TT_STATIONFLAG_ARCH, SYMP_FLAG_ARCH) thexpmatselected_stationflag(TT_STATIONFLAG_OVERHANG, SYMP_FLAG_OVERHANG) thexpmatselected_stationflag(TT_STATIONFLAG_CONT, SYMP_FLAG_CONTINUATION) thexpmatselected_stationflag(TT_STATIONFLAG_AIRDRAUGHT, SYMP_FLAG_AIRDRAUGHT) thexpmatselected_stationflag(TT_STATIONFLAG_AIRDRAUGHT_SUMMER, SYMP_FLAG_AIRDRAUGHT) thexpmatselected_stationflag(TT_STATIONFLAG_AIRDRAUGHT_WINTER, SYMP_FLAG_AIRDRAUGHT) if ((slp->station->flags & TT_STATIONFLAG_UNDERGROUND) != 0) typid = SYMP_CAVESTATION; else typid = SYMP_SURFACESTATION; if (out->symset->is_assigned(typid) || flagexp) { thexpmap_export_mp_bgif; std::string commentstr("0"); if ((slp->station->comment != NULL) && (strlen(slp->station->comment) > 0)) { commentstr = "btex \\thcomment "; commentstr += ths2tex(slp->station->comment, out->layout->lang); commentstr += " etex"; } this->db->db1d.m_station_attr.export_mp_object_begin(out->file, slp->station_name.id); slp->station->export_mp_flags(out->file); out->symset->export_mp_symbol_options(out->file, macroid); fprintf(out->file,"p_station((%.2f,%.2f),%d,%s,\"\"", thxmmxst(out, slp->stx, slp->sty), out->symset->is_assigned(macroid) ? slp->station->mark : 0, commentstr.c_str() ); #define thexpmat_stationflag(flag,mid,str) if (((slp->station->flags & flag) == flag) && out->symset->is_assigned(mid)) fprintf(out->file,",\"%s\"", str); thexpmat_stationflag(TT_STATIONFLAG_ENTRANCE, SYMP_FLAG_ENTRANCE, "entrance") thexpmat_stationflag(TT_STATIONFLAG_SINK, SYMP_FLAG_SINK, "sink") thexpmat_stationflag(TT_STATIONFLAG_SPRING, SYMP_FLAG_SPRING, "spring") thexpmat_stationflag(TT_STATIONFLAG_DOLINE, SYMP_FLAG_DOLINE, "doline") thexpmat_stationflag(TT_STATIONFLAG_DIG, SYMP_FLAG_DIG, "dig") thexpmat_stationflag(TT_STATIONFLAG_ARCH, SYMP_FLAG_ARCH, "arch") thexpmat_stationflag(TT_STATIONFLAG_OVERHANG, SYMP_FLAG_OVERHANG, "overhang") thexpmat_stationflag(TT_STATIONFLAG_CONT, SYMP_FLAG_CONTINUATION, "continuation") thexpmat_stationflag(TT_STATIONFLAG_AIRDRAUGHT, SYMP_FLAG_AIRDRAUGHT, "air-draught") thexpmat_stationflag(TT_STATIONFLAG_AIRDRAUGHT_SUMMER, SYMP_FLAG_AIRDRAUGHT, "air-draught:summer") thexpmat_stationflag(TT_STATIONFLAG_AIRDRAUGHT_WINTER, SYMP_FLAG_AIRDRAUGHT, "air-draught:winter") fprintf(out->file,");\n"); this->db->db1d.m_station_attr.export_mp_object_end(out->file, slp->station_name.id); if (out->layout->is_debug_stationnames() && (slp->station_name.id != 0)) { tmps = &(thdb.db1d.station_vec[slp->station_name.id - 1]); out->symset->export_mp_symbol_options(&dbg_stnms, SYMP_STATIONNAME); dbg_stnms.appspf("p_label.urt(btex \\thstationname %s etex, (%.2f, %.2f), 0.0, 7);\n", (const char *) utf2tex(thobjectname__print_full_name(tmps->name, tmps->survey, layout->survey_level)), thxmmxst(out, slp->stx, slp->sty)); } } //// export continuation station //if (out->symset->assigned[SYMP_CONTINUATIONSTATION] && ((slp->station->flags & TT_STATIONFLAG_CONT) != 0 )) { // std::string conttext; // if ((slp->station->comment != NULL) && (strlen(slp->station->comment) > 0)) { // conttext = slp->station->comment; // } // bool stname = (conttext.length() > 0); // thexpmap_export_mp_bgif; // if (stname) { // fprintf(out->file,"ATTR__text_x := true;\n"); // fprintf(out->file,"ATTR__text := btex \\thcomment %s etex;\n", // utf2tex(conttext).c_str()); // } // fprintf(out->file,"p_continuationstation((%.2f,%.2f));\n", // thxmmxst(out, slp->stx, slp->sty)); // if (stname) { // fprintf(out->file,"ATTR__text_x := false;"); // } //} //// export entrance station //if (out->symset->assigned[SYMP_ENTRANCESTATION] && ((slp->station->flags & TT_STATIONFLAG_ENTRANCE) != 0 )) { // bool stname = ((slp->station->comment != NULL) && (strlen(slp->station->comment) > 0)); // thexpmap_export_mp_bgif; // if (stname) { // fprintf(out->file,"ATTR__text_x := true;\n"); // fprintf(out->file,"ATTR__text := btex \\thentrance %s etex;\n", // utf2tex(slp->station->comment)); // } // fprintf(out->file,"p_entrancestation((%.2f,%.2f));\n", // thxmmxst(out, slp->stx, slp->sty)); // if (stname) { // fprintf(out->file,"ATTR__text_x := false;"); // } //} } slp = slp->next_item; } // potom zo scrapu bool expstation; obj = scrap->ls2doptr; thdb1ds * station; if (outline_mode) obj = NULL; while (obj != NULL) { if (thxmempiov && ((obj->tags & TT_2DOBJ_TAG_CLIP_ON) == 0)) { switch (obj->get_class_id()) { case TT_POINT_CMD: if (((thpoint*)obj)->type == TT_POINT_TYPE_STATION) { ptp = (thpoint *) obj; expstation = true; station = NULL; if (ptp->station_name.id != 0) { station = &(thdb.db1d.station_vec[ptp->station_name.id - 1]); if (station->flags & TT_STATIONFLAG_UNDERGROUND) typid = SYMP_CAVESTATION; else typid = SYMP_SURFACESTATION; expstation = out->symset->is_assigned(typid); } if (expstation) { if (obj->export_mp(noout)) { thexpmap_export_mp_bgif; if (ptp->station_name.id != 0) { tmps = &(thdb.db1d.station_vec[ptp->station_name.id - 1]); tmps->export_mp_flags(out->file); this->db->db1d.m_station_attr.export_mp_object_begin(out->file, ptp->station_name.id); } else tmps = NULL; obj->export_mp(out); if (tmps != NULL) { this->db->db1d.m_station_attr.export_mp_object_end(out->file, ptp->station_name.id); } if (out->layout->is_debug_stationnames() && (tmps != NULL)) { out->symset->export_mp_symbol_options(&dbg_stnms, SYMP_STATIONNAME); dbg_stnms.appspf("p_label.urt(btex \\thstationname %s etex, (%.2f, %.2f), 0.0, 7);\n", (const char *) utf2tex(thobjectname__print_full_name(tmps->name, tmps->survey, layout->survey_level)), thxmmxst(out, ptp->point->xt, ptp->point->yt)); } } } } break; } } obj = obj->pscrapoptr; } if ((scrap->maxdistp1 != NULL) && (out->layout->is_debug_stations())) { thexpmap_export_mp_bgif; fprintf(out->file,"p_debug(-1,1,"); scrap->maxdistp1->export_mp(out); fprintf(out->file,");\np_debug(-1,1,"); scrap->maxdistp2->export_mp(out); fprintf(out->file,");\nl_debug(-1,1,("); scrap->maxdistp1->export_mp(out); fprintf(out->file," -- "); scrap->maxdistp2->export_mp(out); fprintf(out->file,"));\np_debug(-2,1,"); scrap->maxdistp1->export_mp(out,0); fprintf(out->file,");\np_debug(-2,1,"); scrap->maxdistp2->export_mp(out,0); fprintf(out->file,");\nl_debug(-2,1,("); scrap->maxdistp1->export_mp(out); fprintf(out->file," -- "); scrap->maxdistp1->export_mp(out,0); fprintf(out->file," -- "); scrap->maxdistp2->export_mp(out,0); fprintf(out->file," -- "); scrap->maxdistp2->export_mp(out); fprintf(out->file,"));\n"); } if (somex) { fprintf(out->file,"endfig;\n"); result.flags |= TT_XMPS_E; } // teraz spracuje labels #undef thexpmap_export_mp_bgif #define thexpmap_export_mp_bgif if (!somex) {\ result.X = startnum++;\ fprintf(out->file,"beginfig(%ld);\n",result.X);} \ somex = true somex = false; obj = scrap->ls2doptr; if (outline_mode) obj = NULL; while (obj != NULL) { if (!thxmempiov) goto DO_NOT_EXPORT_LABEL; switch (obj->get_class_id()) { // altitude labels zo steny case TT_LINE_CMD: switch (((thline*)obj)->type) { case TT_LINE_TYPE_WALL: if (!out->symset->is_assigned(SYMP_WALLALTITUDE)) break; // prescanuje stenu lp = ((thline*)obj)->first_point; while(lp != NULL) { if (((lp->tags | TT_LINEPT_TAG_ALTITUDE) > 0) && (!thisnan(lp->rsize))) { thexpmap_export_mp_bgif; out->symset->export_mp_symbol_options(out->file, SYMP_WALLALTITUDE); fprintf(out->file,"%s(",out->symset->get_mp_macro(SYMP_WALLALTITUDE)); lp->export_prevcp_mp(out); fprintf(out->file,","); lp->point->export_mp(out); fprintf(out->file,","); lp->export_nextcp_mp(out); thdb.buff_enc.guarantee(4096); //sprintf(thdb.buff_enc.get_buffer(),"%.0f",lp->rsize - out->layout->goz); fprintf(out->file,",btex \\thwallaltitude %s etex);\n",utf2tex(out->layout->units.format_length(lp->rsize - out->layout->goz))); // fprintf(out->file,",\"%.0f\");\n",lp->rsize); } lp = lp->nextlp; } break; case TT_LINE_TYPE_LABEL: if (((thline*)obj)->export_mp(noout)) { thexpmap_export_mp_bgif; ((thline*)obj)->export_mp(out); } break; } break; case TT_POINT_CMD: switch (((thpoint*)obj)->type) { case TT_POINT_TYPE_LABEL: case TT_POINT_TYPE_REMARK: case TT_POINT_TYPE_STATION_NAME: case TT_POINT_TYPE_DATE: case TT_POINT_TYPE_ALTITUDE: case TT_POINT_TYPE_HEIGHT: case TT_POINT_TYPE_PASSAGE_HEIGHT: if (((thpoint*)obj)->export_mp(noout)) { thexpmap_export_mp_bgif; ((thpoint*)obj)->export_mp(out); } break; } break; } DO_NOT_EXPORT_LABEL: obj = obj->pscrapoptr; } if (out->layout->is_debug_stationnames() && (strlen(dbg_stnms.get_buffer()) > 0)) { thexpmap_export_mp_bgif; fprintf(out->file, "%s", dbg_stnms.get_buffer()); } // nakoniec scrap name, ak mame zapnuty dany debug mod if (out->layout->is_debug_scrapnames() && (scrap->fsptr != NULL) && (!thisnan(scrap->lxmin))) { thexpmap_export_mp_bgif; thdb2dpt tmppt; tmppt.xt = (scrap->lxmin + scrap->lxmax) / 2.0; tmppt.yt = (scrap->lymin + scrap->lymax) / 2.0; thdb.buff_tmp = utf2tex(thobjectname__print_full_name(scrap->name, scrap->fsptr, layout->survey_level)); fprintf(out->file,"p_label(btex \\thlargesize %s etex,",thdb.buff_tmp.get_buffer()); tmppt.export_mp(out); fprintf(out->file,",0.0,6);\n"); } if (somex) { fprintf(out->file,"endfig;\n"); result.flags |= TT_XMPS_X; } scrap->db->attr.export_mp_object_end(out->file, (long) scrap->id); if (warncheckchange) fprintf(out->file, "warningcheck := thtmpwarningcheck;\n"); return result; } #define alpha_correction(AA,RR,GG,BB) { \ RR = AA * RR + (1 - AA) * 1.0; \ GG = AA * GG + (1 - AA) * 1.0; \ BB = AA * BB + (1 - AA) * 1.0; \ } #define opacity_correction(RR,GG,BB) { \ if (this->layout->transparency) alpha_correction(this->layout->opacity, RR, GG, BB); \ } #define tmp_alpha 0.75 #define tmp_set_color(r,g,b) cR = r; cG = g; cB = b void thexpmap::export_pdf_set_colors(class thdb2dxm * maps, class thdb2dprj * prj) { // prejde vsetky scrapy a nastavi im farbu na color_map_fg // farba priecnych rezov sa nastavuje pri exporte, zrata minz/maxz // a pocet kapitol COLORLEGENDLIST.clear(); thdb2dxm * cmap; thdb2dxs * cbm; thdb2dmi * cmi; thscrap * cs; double minz = 0.0, maxz = -1.0; long cmn = 0, nmap = 0; double curz; bool firstmapscrap; double cR, cG, cB; // najprv to nascanuje cmap = maps; while (cmap != NULL) { cbm = cmap->first_bm; firstmapscrap = true; while (cbm != NULL) { cmi = cbm->bm->last_item; // if ((cbm->mode == TT_MAPITEM_NORMAL) && (strlen(cbm->bm->name) > 0)) while (cmi != NULL) { if (cbm->mode == TT_MAPITEM_NORMAL) while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) { if (firstmapscrap) { nmap++; firstmapscrap = false; } cs = (thscrap *) cmi->object; curz = cs->a; // if ((!thisnan(curz)) && (cs->fsptr != NULL)) // curz += prj->shift_z; if (!thisnan(curz)) { if (minz > maxz) { minz = curz; maxz = curz; } else { // if (minz > curz) // thprintf("new min: %8.2f %s @ %s\n", curz, cs->name, (cs->fsptr != NULL ? cs->fsptr->full_name : "")); // if (maxz < curz) // thprintf("new max: %8.2f %s @ %s\n", curz, cs->name, (cs->fsptr != NULL ? cs->fsptr->full_name : "")); if (minz > curz) minz = curz; if (maxz < curz) maxz = curz; } } cs->R = this->layout->color_map_fg.R; cs->G = this->layout->color_map_fg.G; cs->B = this->layout->color_map_fg.B; } cmi = cmi->prev_item; } cbm = cbm->next_item; } cmap = cmap->next_item; } if (this->layout->color_crit == TT_LAYOUT_CCRIT_UNKNOWN) return; bool addleg = (this->layout->color_legend == TT_TRUE); colorlegendrecord clrec; // urobi altitude legendu long xalt; thbuffer tmpb; tmpb.guarantee(2048); if (addleg && (maxz > minz) && (this->layout->color_crit == TT_LAYOUT_CCRIT_ALTITUDE)) { for (xalt = 5; xalt >= 0; xalt--) { curz = double(xalt) / 5.0 * (maxz - minz) + minz; thset_color(0, double(5 - xalt), 5.0, cR, cG, cB); alpha_correction(tmp_alpha, cR, cG, cB); clrec.R = cR; clrec.G = cG; clrec.B = cB; opacity_correction(clrec.R, clrec.G, clrec.B); //sprintf(tmpb.get_buffer(), "%.0f", curz - this->layout->goz); clrec.texname = utf2tex(this->layout->units.format_length(curz - this->layout->goz)); clrec.texname += "\\thinspace "; clrec.texname += utf2tex(this->layout->units.format_i18n_length_units()); clrec.name = this->layout->units.format_length(curz - this->layout->goz); clrec.name += " "; clrec.name += this->layout->units.format_i18n_length_units(); COLORLEGENDLIST.insert(COLORLEGENDLIST.end(), clrec); } } // potom to nastavi // thprintf("\n"); cmn = 0; nmap = nmap - 1; cmap = maps; while (cmap != NULL) { cbm = cmap->first_bm; firstmapscrap = true; while (cbm != NULL) { cmi = cbm->bm->last_item; // if ((cbm->mode == TT_MAPITEM_NORMAL) && (strlen(cbm->bm->name) > 0)) while (cmi != NULL) { if (cbm->mode == TT_MAPITEM_NORMAL) while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) { cs = (thscrap *) cmi->object; curz = cs->a; // if ((!thisnan(curz)) && (cs->fsptr != NULL)) // curz += prj->shift_z; switch (this->layout->color_crit) { case TT_LAYOUT_CCRIT_MAP: // vsetkym scrapom v kazdej priradi farbu if (firstmapscrap) { thset_color(0, (double) (nmap - cmn), (double) nmap, cR, cG, cB); std::string maptitle(""); if (strlen(cmap->map->title) > 0) { maptitle = ths2txt(cmap->map->title, this->layout->lang); } clrec.texname = ths2tex(maptitle.length() > 0 ? cmap->map->title : cmap->map->name, this->layout->lang); clrec.name = (maptitle.length() > 0 ? maptitle : std::string(cmap->map->name)); alpha_correction(tmp_alpha, cR, cG, cB); clrec.R = cR; clrec.G = cG; clrec.B = cB; opacity_correction(clrec.R, clrec.G, clrec.B); COLORLEGENDLIST.insert(COLORLEGENDLIST.begin(), clrec); firstmapscrap = false; cmn++; } cs->R = cR; cs->G = cG; cs->B = cB; // thprintf("%s@%s->%.2f,%.2f,%.2f\n",cs->name,cs->fsptr->full_name,cs->R,cs->G,cs->B); break; case TT_LAYOUT_CCRIT_SCRAP: // vsetkym scrapom v kazdej priradi farbu switch (cmn % 6) { case 0: tmp_set_color(1.0, 0.5, 0.5); break; case 1: tmp_set_color(0.5, 1.0, 0.5); break; case 2: tmp_set_color(0.5, 0.5, 1.0); break; case 3: tmp_set_color(1.0, 1.0, 0.0); break; case 4: tmp_set_color(0.0, 1.0, 1.0); break; default: tmp_set_color(1.0, 0.0, 1.0); break; } alpha_correction(tmp_alpha, cR, cG, cB); cs->R = cR; cs->G = cG; cs->B = cB; cmn++; break; case TT_LAYOUT_CCRIT_ALTITUDE: // priradi farbu podla (z - min) z (max - min) if (!thisnan(curz)) { thset_color(0, (maxz - curz), (maxz - minz), cs->R, cs->G, cs->B); alpha_correction(tmp_alpha, cs->R, cs->G, cs->B); } else { cs->R = this->layout->color_map_fg.R; cs->G = this->layout->color_map_fg.G; cs->B = this->layout->color_map_fg.B; } break; default: cs->R = this->layout->color_map_fg.R; cs->G = this->layout->color_map_fg.G; cs->B = this->layout->color_map_fg.B; } } cmi = cmi->prev_item; } cbm = cbm->next_item; } cmap = cmap->next_item; } } void thexpmap::export_uni(class thdb2dxm * maps, class thdb2dprj * prj) { if (maps == NULL) { thwarning(("%s [%d] -- no selected projection data -- %s", this->src.name, this->src.line, this->projstr)) return; } const char * fnm = this->get_output("cave.3d"); img * pimg; img_output_version = 4; thbuffer fname; fname = "cave"; pimg = img_open_write(fnm, fname.get_buffer(), 1); if (pimg == NULL) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif thdb2dxm * cmap = maps; thdb2dxs * cbm; thdb2dmi * cmi; while (cmap != NULL) { cbm = cmap->first_bm; while (cbm != NULL) { cmi = cbm->bm->last_item; if (cbm->mode == TT_MAPITEM_NORMAL) { while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) this->export_uni_scrap((FILE *) pimg, (thscrap *) cmi->object); cmi = cmi->prev_item; } } cbm = cbm->next_item; } cmap = cmap->next_item; } img_close(pimg); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmap_line_svx3d(img * pimg, thline * pln) { thdb2dlp * plp = pln->first_point, * lp; if (plp != NULL) lp = plp->nextlp; else return; bool move_to = true; double t, tt, ttt, t_, tt_, ttt_, nx, ny, nz, px(0.0), py(0.0); while (lp != NULL) { if (lp->subtype != TT_LINE_SUBTYPE_INVISIBLE) { if (move_to) { img_write_item(pimg, img_MOVE, 0, NULL, plp->point->xt, plp->point->yt, plp->point->zt); px = plp->point->xt; py = plp->point->yt; move_to = false; } if ((lp->cp1 != NULL) && (lp->cp2 != NULL)) { for(t = 0.05; t < 1.0; t += 0.05) { tt = t * t; ttt = tt * t; t_ = 1.0 - t; tt_ = t_ * t_; ttt_ = tt_ * t_; nx = ttt_ * plp->point->xt + 3.0 * t * tt_ * lp->cp1->xt + 3.0 * tt * t_ * lp->cp2->xt + ttt * lp->point->xt; ny = ttt_ * plp->point->yt + 3.0 * t * tt_ * lp->cp1->yt + 3.0 * tt * t_ * lp->cp2->yt + ttt * lp->point->yt; nz = t_ * plp->point->zt + t * lp->point->zt; if (hypot(nx - px, ny - py) > 0.5) { img_write_item(pimg, img_LINE, 0, NULL, nx, ny, nz); px = nx; py = ny; } } } img_write_item(pimg, img_LINE, 0, NULL, lp->point->xt, lp->point->yt, lp->point->zt); px = lp->point->xt; py = lp->point->yt; } else { move_to = true; } plp = lp; lp = lp->nextlp; } } void thexpmap::export_uni_scrap(FILE * out, class thscrap * scrap) { img * pimg; pimg = (img *) out; thbuffer stnbuff; double avx = 0.0, avy = 0.0, avz = 0.0, avn = 0.0; #define avadd(x,y,z) {avx += x; avy += y; avz += z; avn += 1.0;} // export shots thscraplp * slp; slp = scrap->get_polygon(); while (slp != NULL) { if (slp->lnio) { img_write_item(pimg, img_MOVE, 0, NULL, slp->lnx1, slp->lny1, slp->lnz1); img_write_item(pimg, img_LINE, img_FLAG_SURFACE, NULL, slp->lnx2, slp->lny2, slp->lnz2); } else { stnbuff = slp->station->survey->get_reverse_full_name(); stnbuff += "."; stnbuff += slp->station->name; // img_write_item(pimg, img_LABEL, 0, stnbuff, slp->stx, slp->sty, slp->stz); avadd(slp->stx, slp->sty, slp->stz); } slp = slp->next_item; } // export objects th2ddataobject * obj; thpoint * ppt; thline * pln; obj = scrap->ls2doptr; while (obj != NULL) { switch (obj->get_class_id()) { case TT_POINT_CMD: ppt = ((thpoint*)obj); switch (ppt->type) { case TT_POINT_TYPE_STATION: if ((ppt->cpoint != NULL) && (ppt->cpoint->st != NULL)) { stnbuff = ppt->cpoint->st->survey->get_reverse_full_name(); stnbuff += "."; stnbuff += ppt->cpoint->st->name; // img_write_item(pimg, img_LABEL, img_SFLAG_SURFACE, stnbuff, ppt->point->xt, ppt->point->yt, ppt->point->zt); avadd(ppt->point->xt, ppt->point->yt, ppt->point->zt); } break; } break; case TT_LINE_CMD: pln = ((thline*)obj); switch (pln->type) { case TT_LINE_TYPE_WALL: thexpmap_line_svx3d(pimg, pln); thdb2dlp * lp = pln->first_point; while (lp != NULL) { avadd(lp->point->xt,lp->point->yt,lp->point->zt); lp = lp->nextlp; } break; } break; } obj = obj->pscrapoptr; } if (avn > 0.0) { // stnbuff = "SCRAP."; if (scrap->fsptr != NULL) { stnbuff = scrap->fsptr->get_reverse_full_name(); stnbuff += "."; } else { stnbuff = ""; } stnbuff += scrap->name; img_write_item(pimg, img_LABEL, 0, stnbuff, avx/avn, avy/avn, avz/avn); } } bool th2ddataobject::export_mp(thexpmapmpxs * out) { if (out->file != NULL) { if (strcmp(out->attr_last_id, this->name) != 0) { fprintf(out->file,"ATTR__id := \"%s\";\n",this->name); out->attr_last_id = this->name; } if (strcmp(out->attr_last_survey, this->fsptr->full_name) != 0) { fprintf(out->file,"ATTR__survey := \"%s\";\n",this->fsptr->full_name); out->attr_last_survey = this->fsptr->get_full_name(); } this->db->attr.export_mp_object_begin(out->file, (long) this->id); } return true; } bool th2ddataobject::export_mp_end(thexpmapmpxs * out) { if (out->file != NULL) { this->db->attr.export_mp_object_end(out->file, (long) this->id); } return true; } double thexpmap_quick_map_export_scale; therion/thdb2dxs.h0000664000175000017500000000356010625655142013153 0ustar useruser/** * @file thdb2dxs.h * 2D join item class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2dxs_h #define thdb2dxs_h #include "thdb2dmi.h" #include #include /** * 2D export scrap class. */ class thdb2dxs { public: thdb2dxs * next_item, ///< Next join item. * prev_item; ///< Prev join item. class thmap * bm; class thdb2dxm * fmap; int mode; bool previewed; unsigned long preview_output_number; thdb2dmi_shift m_shift; thdb2dxs * m_target; thdb2dxs(); ///< Default constructor. }; typedef std::list thdb2dxs_list; ///< Joins list. struct thdb2dxs_target_item { long m_proj_id, m_map_id; thdb2dmi_shift m_shift; thdb2dxs_target_item(long proj_id, long map_id, thdb2dmi_shift shift) : m_proj_id(proj_id), m_map_id(map_id), m_shift(shift) {} }; bool operator < (const thdb2dxs_target_item & i1, const thdb2dxs_target_item & i2); typedef std::map thdb2dxs_target_map; #endif therion/thwarppt.h0000664000175000017500000002426710644734366013320 0ustar useruser/** @file thwarppt.h * * @author marco corvi * @date nov 2006 - mar 2007 * * @brief warping plaquette algorithm * * --------------------------------------------------- */ /* Copyright (C) 2006-2007 marco corvi * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thwarppt_h #define thwarppt_h #define THERION #include #include "thtrans.h" #include "thwarppme.h" #include "thwarppdef.h" namespace therion { namespace warp { /** * therion warping transformation. * * The "from" data are in the sketch image reference frame * The "to" data are in the survey reference frame * The "warped image" is scaled/translated with respect to the survey frame * * The X and U centers and units are computed when the mapping is * initialized. The warped image center and units are computed when a * source image is mapped (before that point they have the same values as the * U center and units). Until the map has been initialized the centers and * units have undefined values. */ class plaquette_algo : public inserter { private: bool m_initialized; //!< whether the map has been initialized std::vector< therion::warp::point_pair * > mPairs; //!< vector of point pairs std::vector< therion::warp::line * > mLines; //!< vector of legs (lines) std::vector< therion::warp::basic_pair * > mPlaquettes; //!< vector of 4-plaquettes double m_bound3; //!< bound for triangles double m_bound4; //!< bound for plaquettes public: thvec2 mX0; //!< X-Y center thvec2 mU0; //!< U-V center double mXUnit; //!< X-Y unit double mUUnit; //!< U-V unit thvec2 mUC; //!< U-V center in the warped image double mUCUnit; //!< U-V unit in the warped image public: /** default cstr */ plaquette_algo( ); /** cstr * @param bound3 bound for triangles * @param bound4 bound for plaquettes */ plaquette_algo( double bound3, double bound4 ); /** dstr */ ~plaquette_algo(); /** clear internal mapping data */ void reset( ); /** accessor to the "from" origin * @return origin in the "from" image */ thvec2 from_origin() const { return mX0; } /** accessor to the "to" origin * @return origin in the "to" image */ thvec2 to_origin() const { return mU0; } /** accessor to the "from" unit * @return unit in the "from" image */ double from_unit() const { return mXUnit; } /** accessor to the "to" unit * @return unit in the "to" image */ double to_unit() const { return mUUnit; } /** accessor to the warped image origin * @return origin in the warped image (zero at the upper-left corner) */ thvec2 warped_origin() const { return mUC; } /** accessor to the warped image unit * @return unit in the warped image */ double warped_unit() const { return mUCUnit; } /** insert a point and a line of extra type * @param p1 first line point * @param index index used to make the new point name * @param x3 new point X (sketch frame) * @param u3 new point U (survey frame) */ line * add_extra_line( point_pair * p1, size_t index, thvec2 & x3, thvec2 & u3 ); /** insert a point * @param t point morph type * @param name point name * @param src point coords in the source (from) frame (sketch) * @param dst point coords in the destination (to) frame (survey) * @return pointer to the new point-pair */ point_pair * insert_point( morph_type t, std::string & name, const thvec2 & src, const thvec2 & dst ); point_pair * insert_zoom_point( morph_type t, std::string & name, const thvec2 src, std::string & from, double size ); /** insert a line * @param t line morph type * @param from name of the first line endpoint * @param to name of the second line endpoint */ void insert_line( morph_type t, std::string & from, std::string & to ); /** initialize internal data for the mapping * @param proj projection type * @return true if initialized successfully */ bool initialize( warp_proj proj = THWARP_PLAN ); /** map a 2D point forward * @param src point in the source ("from") frame * @param dst point in the "to" frame * @return true if successful */ bool forward( const thvec2 & src, thvec2 & dst ) { return forward( src, dst, mU0, mUUnit ); } /** map a 2D point backward * @param dst point in the "to" frame * @param src point in the "from" frame * @return true if successful */ bool backward( const thvec2 & dst, thvec2 & src ) { return backward( dst, src, mU0, mUUnit ); } /** map a 2D point backward * @param dst point in the "to" frame (survey) * @param src point in the "from" frame (sketch) * @param origin origin in the "to" frame * @param unit unit in the "to" frame * @return true if successfulA */ bool backward( const thvec2 & dst, thvec2 & src, const thvec2 & origin, double unit ); /** map a 2D point forward * @param src point in the "from" frame * @param dst point in the "to" frame * @param origin origin in the "to" frame * @param unit unit in the "to" frame * @return true if successful */ bool forward( const thvec2 & src, thvec2 & dst, const thvec2 & origin, double unit ); /** map an image. The result is centered in the destination image * @param src source image (RGB) * @param ws source image width * @param hs source image height * @param dst destination image (RGB) must be preallocaed by the caller * @param wd destination image width * @param hd destination image height * @param origin target origin in the warped image frame * @param unit target units * @param depth image depth (bytes per pixel). * @param proj sketch projection type * @return true if successful * * @note this method, as a side effect, sets the warped image origin and units */ bool map_image( const unsigned char * src, unsigned int ws, unsigned int hs, unsigned char * dst, unsigned int wd, unsigned int hd, thvec2 const & origin, double unit, int depth = 3, warp_proj proj = THWARP_PLAN ); /** debug: print the content of this warptrans */ void print(); private: /** update line features - compute the lines' coeffs. */ void update_lines(); /** prepare the plaquettes * @param proj projection type */ void make_plaquettes( warp_proj proj ); /** set up the neighbors */ void make_neighbors( ); /** find the neighbors of a warping pair * @param me warping basic_pair */ void find_neighbors( basic_pair * me ); /** fidn the warping pair with a given oriented side * @param p1 first side point * @param p2 second side point */ basic_pair * find_plaquette( point_pair * p1, point_pair * p2 ); /** map by the plaquette * @param k plaquette index * @param w from point * @param z to point * @return true if successful */ bool map_backward_plaquette( size_t k, const thvec2 & w, thvec2 & z ); #ifdef USE_SEGMENT /** add a segment * @param A first endpoint * @param B second endpoint */ void add_segment( point_pair * A, point_pair * B ); #endif /** add a triangle * @param A first point (left) * @param B second point (vertex) * @param C third point (right) * @param proj warp projection type */ void add_triangle( point_pair * A, point_pair * B, point_pair * C, warp_proj proj = THWARP_PLAN ); /** add a quadrilater * @param A first point * @param B second point * @param C third point * @param D fourth point * @param proj warp projection type */ void add_quadrilater( point_pair * A, point_pair * B, point_pair * C, point_pair * D, warp_proj proj = THWARP_PLAN ); }; } // namespace warp } // name space therion // ******************************************************************* // backward compatibility // #ifdef THERION typedef therion::warp::plaquette_algo thwarptrans; #endif #endif therion/thdate.cxx0000664000175000017500000004240112341065347013251 0ustar useruser/** * @file thdate.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdate.h" #include "thparse.h" #include "thexception.h" #include #include #include #include #ifndef THMSVC #include #endif #include #ifdef THWIN32 #define snprintf _snprintf #endif void thdate::reset() { this->syear = -1; this->smonth = -1; this->sday = -1; this->shour = -1; this->smin = -1; this->eyear = -1; this->emonth = -1; this->eday = -1; this->ehour = -1; this->emin = -1; this->ssec = -1.0; this->esec = -1.0; } void thdate::reset_current() { this->reset(); time_t rawtime; struct tm * tim; time ( &rawtime ); tim = localtime ( &rawtime ); this->syear = 1900 + tim->tm_year; this->smonth = tim->tm_mon + 1; this->sday = tim->tm_mday; this->shour = tim->tm_hour; this->smin = tim->tm_min; this->ssec = double(tim->tm_sec > 59 ? 59 : tim->tm_sec); } thdate::thdate() { this->reset(); } thdate::~thdate() { } void thdate::parse(const char * src) { this->reset(); unsigned const char * osrc = (unsigned const char *)src; unsigned const char * ssrc = (unsigned const char *)src; int ppos = 0; int dd[14]; dd[0] = -1; dd[1] = -1; dd[2] = -1; dd[3] = -1; dd[4] = -1; dd[5] = -1; dd[6] = -1; dd[7] = -1; dd[8] = -1; dd[9] = -1; dd[10] = -1; dd[11] = -1; dd[12] = -1; dd[13] = -1; double ss[2]; ss[0] = -1.0; ss[1] = -1.0; double sm[2]; sm[0] = 1.0; sm[1] = 1.0; bool firstchar = true; while (ppos > -1) { if (*ssrc == 32) { ssrc++; continue; } if (firstchar && (*ssrc == 45)) { if (ssrc[1] == 0) return; } firstchar = false; if (*ssrc == 0) { ppos = -1; ssrc++; continue; } if (*ssrc == 46) { if ((ppos == 0) || (ppos == 1) || (ppos == 5) || (ppos == 7) || (ppos == 8) || (ppos == 12)) ppos++; else ththrow(("invalid date syntax -- \"%s\"", osrc)) ssrc++; continue; } if (*ssrc == 58) { if ((ppos == 3) || (ppos == 4) || (ppos == 10) || (ppos == 11)) ppos++; else ththrow(("invalid date syntax -- \"%s\"", osrc)) ssrc++; continue; } if (*ssrc == 64) { if ((ppos >= 0) && (ppos <= 2)) ppos = 3; else { if ((ppos >= 7) && (ppos <= 9)) ppos = 10; else ththrow(("invalid date syntax -- \"%s\"", osrc)) } ssrc++; continue; } if (*ssrc == 45) { if ((ppos >= 0) && (ppos <= 6)) ppos = 7; else ththrow(("invalid date syntax -- \"%s\"", osrc)) ssrc++; continue; } if ((*ssrc >= 48) && (*ssrc <= 57)) { int digit = *ssrc - 48; if ((ppos == 6) || (ppos == 13)) { int si = (ppos == 6 ? 0 : 1); if (ss[si] < 0.0) { ss[si] = (double) digit; sm[si] = 10; } else { ss[si] = 10 * ss[si] + (double) digit; sm[si] = 10 * sm[si]; } } else { if (dd[ppos] < 0) dd[ppos] = digit; else dd[ppos] = 10 * dd[ppos] + digit; } ssrc++; continue; } else ththrow(("invalid date syntax -- \"%s\"", osrc)) } // while if (dd[0] < 0) ththrow(("invalid date year -- \"%s\"", osrc)) else this->syear = dd[0]; if (dd[1] > 0) { if (dd[1] < 13) this->smonth = dd[1]; else ththrow(("invalid date month -- \"%s\"", osrc)) } if (dd[2] > 0) { if ((dd[2] < 32) && (this->smonth > 0)) this->sday = dd[2]; else ththrow(("invalid date day -- \"%s\"", osrc)) } if (dd[3] >= 0) { if ((dd[3] < 24) && (this->sday > 0)) this->shour = dd[3]; else ththrow(("invalid date hour -- \"%s\"", osrc)) } if (dd[4] >= 0) { if ((dd[4] < 60) && (this->shour >= 0)) this->smin = dd[4]; else ththrow(("invalid date minute -- \"%s\"", osrc)) } if (dd[5] >= 0) { if ((dd[5] < 60) && (this->smin >= 0)) this->ssec = (double) dd[5]; else ththrow(("invalid date second -- \"%s\"", osrc)) } if (ss[0] > 0) { if (this->smin >= 0) { if (this->ssec < 0) this->ssec = 0.0; this->ssec += ss[0] / sm[0]; } else ththrow(("invalid date second -- \"%s\"", osrc)) } if (dd[7] >= 0) { if (this->syear >= 0) this->eyear = dd[7]; else ththrow(("start date must be specified -- \"%s\"", osrc)) } if (dd[8] > 0) { if ((dd[8] < 13) && (this->eyear >= 0)) this->emonth = dd[8]; else ththrow(("invalid date month -- \"%s\"", osrc)) } if (dd[9] > 0) { if ((dd[9] < 32) && (this->emonth > 0)) this->eday = dd[9]; else ththrow(("invalid date day -- \"%s\"", osrc)) } if (dd[10] >= 0) { if ((dd[10] < 24) && (this->eday > 0)) this->ehour = dd[10]; else ththrow(("invalid date hour -- \"%s\"", osrc)) } if (dd[11] >= 0) { if ((dd[11] < 60) && (this->ehour >= 0)) this->emin = dd[11]; else ththrow(("invalid date minute -- \"%s\"", osrc)) } if (dd[12] >= 0) { if ((dd[12] < 60) && (this->emin >= 0)) this->esec = (double) dd[12]; else ththrow(("invalid date second -- \"%s\"", osrc)) } if (ss[1] > 0) { if (this->emin >= 0) { if (this->esec < 0) this->esec = 0.0; this->esec += ss[1] / sm[1]; } else ththrow(("invalid date second -- \"%s\"", osrc)) } } // parse bool thdate::is_interval() { if (this->eyear > -1) return true; else return false; } bool thdate::is_defined() { if (this->syear > -1) return true; else return false; } bool thdate::is_less(int y1, int m1, int d1, int h1, int n1, double s1, int y2, int m2, int d2, int h2, int n2, double s2) { if (y1 < y2) return true; else if (y1 == y2) { if (m1 < m2) return true; else if (m1 == m2) { if (d1 < d2) return true; else if (d1 == d2) { if (h1 < h2) return true; else if (h1 == h2) { if (n1 < n2) return true; else if (n1 == n2) { if (s1 < s2) return true; } } } } } return false; } bool thdate::is_greater(int y1, int m1, int d1, int h1, int n1, double s1, int y2, int m2, int d2, int h2, int n2, double s2) { if (y1 > y2) return true; else if (y1 == y2) { if (m1 > m2) return true; else if (m1 == m2) { if (d1 > d2) return true; else if (d1 == d2) { if (h1 > h2) return true; else if (h1 == h2) { if (n1 > n2) return true; else if (n1 == n2) { if (s1 > s2) return true; } } } } } return false; } bool operator < (const thdate & d1, const thdate & d2) { return thdate::is_less(d1.syear, d1.smonth, d1.sday, d1.shour, d1.smin, d1.ssec, d2.syear, d2.smonth, d2.sday, d2.shour, d2.smin, d2.ssec); } bool operator > (const thdate & d1, const thdate & d2) { return thdate::is_greater(d1.syear, d1.smonth, d1.sday, d1.shour, d1.smin, d1.ssec, d2.syear, d2.smonth, d2.sday, d2.shour, d2.smin, d2.ssec); } bool operator == (const thdate & d1, const thdate & d2) { return !((d1 < d2) || (d1 > d2)); } bool operator <= (const thdate & d1, const thdate & d2) { return !(d1 > d2); } bool operator >= (const thdate & d1, const thdate & d2) { return !(d1 < d2); } bool operator != (const thdate & d1, const thdate & d2) { return ((d1 < d2) || (d1 > d2)); } void thdate::join(thdate & dt) { if (dt.syear <= -1) return; if ((thdate::is_less(dt.syear, dt.smonth, dt.sday, dt.shour, dt.smin, dt.ssec, this->syear, this->smonth, this->sday, this->shour, this->smin, this->ssec)) || (this->syear <= -1)) { if (this->eyear <= -1) { this->eyear = this->syear; this->emonth = this->smonth; this->eday = this->sday; this->ehour = this->shour; this->emin = this->smin; this->esec = this->ssec; } this->syear = dt.syear; this->smonth = dt.smonth; this->sday = dt.sday; this->shour = dt.shour; this->smin = dt.smin; this->ssec = dt.ssec; } if ((thdate::is_greater(dt.syear, dt.smonth, dt.sday, dt.shour, dt.smin, dt.ssec, this->eyear, this->emonth, this->eday, this->ehour, this->emin, this->esec)) && (*this != dt)) { this->eyear = dt.syear; this->emonth = dt.smonth; this->eday = dt.sday; this->ehour = dt.shour; this->emin = dt.smin; this->esec = dt.ssec; } if (thdate::is_greater(dt.eyear, dt.emonth, dt.eday, dt.ehour, dt.emin, dt.esec, this->eyear, this->emonth, this->eday, this->ehour, this->emin, this->esec)) { this->eyear = dt.eyear; this->emonth = dt.emonth; this->eday = dt.eday; this->ehour = dt.ehour; this->emin = dt.emin; this->esec = dt.esec; } } char * thdate::get_str(int fmt) { this->print_str(fmt); return &(this->dstr[0]); } double thdate_d2y(int year, int month, int day, int hour, int min, double sec) { double ret = (double) year; double nmd = 31.0; static const double mdays[12] = {31.0,29.0,31.0,30.0,31.0,30.0, 31.0,31.0,30.0,31.0,30.0,31.0}; if ((month > 0) && (month < 13)) { ret += ((double) month - 1.0) / 12.0; nmd = mdays[month - 1]; if ((month == 2) && (((year % 400) == 0) || (((year % 4) == 0) && ((year % 100) != 0)))) nmd = 28.0; } else return ret; if ((day > 0) && (day < 32)) { ret += (double) (day - 1) / (12.0 * nmd); } else return ret; if (hour >= 0) { ret += (double) hour / (12.0 * nmd * 24.0); } else return ret; if (min >= 0) { ret += (double) min / (12.0 * nmd * 24.0 * 60); } else return ret; if (sec >= 0) { ret += (double) sec / (12.0 * nmd * 24.0 * 3600); } return ret; } void thdate_y2d(double dy, int & year, int & month, int & day, int & hour, int & min, double & sec) { double rest = 0; double nmd = 31.0; static const double mdays[12] = {31.0,29.0,31.0,30.0,31.0,30.0, 31.0,31.0,30.0,31.0,30.0,31.0}; year = int(dy); rest = dy - (double) (year); month = int(rest * 12.0); rest = (rest * 12.0) - (double) month; month = month + 1; nmd = mdays[month - 1]; if ((month == 2) && (((year % 400) == 0) || (((year % 4) == 0) && ((year % 100) != 0)))) nmd = 28.0; day = int(rest * nmd); rest = (rest * nmd) - (double) day; day = day + 1; hour = int(rest * 24); rest = (rest * 24) - (double) hour; min = int(rest * 60); rest = (rest * 60) - (double) hour; sec = rest * 60; if (sec < 0.01) { sec = -1.0; if (min == 0) { min = -1; if (hour == 0) { hour = -1; if (day == 1) { day = -1; if (month == 1) { month = -1; } } } } } } double thdate::get_start_year() { return thdate_d2y(this->syear, this->smonth, this->sday, this->shour, this->smin, this->ssec); } double thdate::get_end_year() { return thdate_d2y(this->eyear, this->emonth, this->eday, this->ehour, this->emin, this->esec); } double thdate::get_average_year() { if (this->is_interval()) { return ((this->get_start_year() + this->get_end_year()) / 2.0); } else { return this->get_start_year(); } } void thdate::set_years(double sy, double ey) { thdate_y2d(sy, this->syear, this->smonth, this->sday, this->shour, this->smin, this->ssec); thdate_y2d(ey, this->eyear, this->emonth, this->eday, this->ehour, this->emin, this->esec); } void date2tm(int y, int m, int d, int hh, int mm, double ss, tm * info) { if (y >= 0) info->tm_year = y - 1900; else info->tm_year = 100; if (m > 0) info->tm_mon = m - 1; else info->tm_mon = 0; if (d > 0) info->tm_mday = d; else info->tm_mday = 1; if (hh >= 0) info->tm_hour = hh; else info->tm_hour = 0; if (mm >= 0) info->tm_min = mm; else info->tm_min = 0; if (ss >= 0.0) info->tm_sec = int(ss); else info->tm_sec = 0; } void thdate::print_str(int fmt) { unsigned int tl = thdate__bufflen - 1; long yyyy, mm, dd; char * dst = &(this->dstr[0]); const char * sep = " - "; switch (fmt) { case TT_DATE_FMT_UTF8_Y: sep = " \xe2\x80\x93 "; case TT_DATE_FMT_Y: if (this->syear >= 0) snprintf(dst,tl,"%d", this->syear); tl -= strlen(dst); dst += strlen(dst); if ((this->eyear >= 0) && (this->syear != this->eyear)) snprintf(dst,tl,"%s%d", sep, this->eyear); break; case TT_DATE_FMT_SQL_SINGLE: if (this->eyear >= 0) { yyyy = this->eyear; mm = this->emonth; dd = this->eday; } else { yyyy = this->syear; mm = this->smonth; dd = this->sday; } if (dd > 0 && ((yyyy >= 1000) && (yyyy <= 9999))) { snprintf(dst,tl,"'%04ld-%02ld-%02ld'",yyyy,mm,dd); } else if ((mm > 0) && ((yyyy >= 1000) && (yyyy <= 9999))) { snprintf(dst,tl,"'%04ld-%02ld-01'",yyyy,mm); } else if ((yyyy >= 1000) && (yyyy <= 9999)) { snprintf(dst,tl,"'%04ld-01-01'",yyyy); } else { snprintf(dst,tl,"NULL"); } break; case TT_DATE_FMT_LOCALE: { struct tm s, e; date2tm(this->syear, this->smonth, this->sday, this->shour, this->smin, this->ssec, &s); date2tm(this->eyear, this->emonth, this->eday, this->ehour, this->emin, this->esec, &e); setlocale (LC_TIME,""); if (this->shour >= 0) strftime(dst, tl, "%c", &s); else strftime(dst, tl, "%x", &s); tl -= strlen(dst); dst += strlen(dst); if (this->eyear > 0) { if (this->ehour >= 0) strftime(dst, tl, " - %c", &e); else strftime(dst, tl, " - %x", &e); } } break; case TT_DATE_FMT_UTF8_ISO: sep = " \xe2\x80\x93 "; default: if (this->ssec >= 0.0) snprintf(dst,tl,"%04d-%02d-%02dT%02d:%02d:%05.2f", this->syear, this->smonth, this->sday, this->shour, this->smin, this->ssec); else if (this->smin >= 0) snprintf(dst,tl,"%04d-%02d-%02dT%02d:%02d", this->syear, this->smonth, this->sday, this->shour, this->smin); else if (this->shour >= 0) snprintf(dst,tl,"%04d-%02d-%02dT%02d:%02d", this->syear, this->smonth, this->sday, this->shour, 0); else if (this->sday > 0) snprintf(dst,tl,"%04d-%02d-%02d", this->syear, this->smonth, this->sday); else if (this->smonth > 0) snprintf(dst,tl,"%04d-%02d", this->syear, this->smonth); else if (this->syear >= 0) snprintf(dst,tl,"%04d", this->syear); tl -= strlen(dst); dst += strlen(dst); if (this->esec >= 0.0) snprintf(dst,tl,"%s%04d-%02d-%02dT%02d:%02d:%05.2f", sep, this->eyear, this->emonth, this->eday, this->ehour, this->emin, this->esec); else if (this->emin >= 0) snprintf(dst,tl,"%s%04d-%02d-%02dT%02d:%02d", sep, this->eyear, this->emonth, this->eday, this->ehour, this->emin); else if (this->ehour >= 0) snprintf(dst,tl,"%s%04d-%02d-%02dT%02d:%02d", sep, this->eyear, this->emonth, this->eday, this->ehour, 0); else if (this->eday > 0) snprintf(dst,tl,"%s%04d-%02d-%02d", sep, this->eyear, this->emonth, this->eday); else if (this->emonth > 0) snprintf(dst,tl,"%s%04d-%02d", sep, this->eyear, this->emonth); else if (this->eyear >= 0) snprintf(dst,tl,"%s%04d", sep, this->eyear); break; } } #ifdef THMSVC #define stat _stat #endif void thdate::set_file_date(char * fname) { struct stat buf; struct tm * tim; if ((fname == NULL) || (strlen(fname) == 0)) return; if (stat(fname, &buf) != 0) return; tim = localtime(&(buf.st_mtime)); this->syear = 1900 + tim->tm_year; this->smonth = tim->tm_mon + 1; this->sday = tim->tm_mday; this->shour = tim->tm_hour; this->smin = tim->tm_min; this->ssec = double(tim->tm_sec > 59 ? 59 : tim->tm_sec); #ifdef THDEBUG thprintf("FILEDATE: %s => %s\n", fname, this->get_str()); #endif } #ifdef THMSVC #undef stat #endif therion/thlookup.cxx0000664000175000017500000000721712346053002013641 0ustar useruser/** * @file thlookup.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thlookup.h" #include "thexception.h" #include "thchenc.h" #include "thdata.h" #include "thparse.h" #include "thinfnan.h" #include "thpdfdata.h" #include "thsymbolset.h" #include "thtflength.h" #include "thlang.h" #include "thcsdata.h" #include "thconfig.h" #include #ifdef THMSVC #include #define getcwd _getcwd #endif enum { TTLDBG_JOINS = 1, TTLDBG_STATIONS = 2, TTLDBG_SCRAPNAMES = 4, TTLDBG_STATIONNAMES = 8, }; thlookup::thlookup() { this->m_type = TT_LOOKUP_TYPE_UNKNOWN; this->m_scale = TT_LOOKUP_SCALE_UNKNOWN; this->m_colorscheme = TT_LOOKUP_COLORSCHEME_UNKNOWN; this->m_title = ""; } thlookup::~thlookup() { } int thlookup::get_class_id() { return TT_LOOKUP_CMD; } bool thlookup::is(int class_id) { if (class_id == TT_LOOKUP_CMD) return true; else return thdataobject::is(class_id); } int thlookup::get_cmd_nargs() { return 1; } const char * thlookup::get_cmd_end() { return "endlookup"; } const char * thlookup::get_cmd_name() { // insert command name here return "lookup"; } thcmd_option_desc thlookup::get_default_cod(int id) { return thcmd_option_desc(id); } thcmd_option_desc thlookup::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_lookup_opt); if (id == TT_LOOKUP_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else return this->get_default_cod(id); } void thlookup::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { double dum; int sv, sv2, dum_int; thcmd_option_desc defcod = this->get_default_cod(cod.id); switch (cod.id) { case TT_DATAOBJECT_AUTHOR: case TT_DATAOBJECT_COPYRIGHT: defcod.nargs = 2; default: if (cod.nargs > defcod.nargs) ththrow(("too many arguments -- %s", args[defcod.nargs])) } switch (cod.id) { case 0: // add table row break; case TT_LOOKUP_TITLE: if (strlen(args[0]) > 0) { thencode(&(this->db->buff_enc), args[0], argenc); this->m_title = this->db->strstore(this->db->buff_enc.get_buffer()); } else this->m_title = ""; break; case 1: cod.id = TT_DATAOBJECT_NAME; default: thdataobject::set(cod, args, argenc, indataline); break; } } void thlookup::self_delete() { delete this; } int thlookup::get_context() { return (THCTX_SURVEY | THCTX_NONE | THCTX_SCRAP); } void thlookup_table_row::parse(char ** args) { } void thlookup::auto_set(double from, double to) { } void thlookup::auto_set(class thdate fromto) { } thlayout_color thlookup::get_color(thdate d) { thlayout_color rv; return rv; } thlayout_color thlookup::get_color(double d) { thlayout_color rv; return rv; } therion/thlayoutclr.cxx0000664000175000017500000000422711656730250014356 0ustar useruser/** * @file thlayoutclr.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thlayoutclr.h" #include "thparse.h" #include "thdatabase.h" #include "thexception.h" void thlayout_color::parse(char * str, bool aalpha) { thsplit_words(&(thdb.mbuff_tmp), str); int nargs = thdb.mbuff_tmp.get_size(), sv; char ** args = thdb.mbuff_tmp.get_buffer(); #define invalid_color_spec ththrow(("invalid color specification -- %s", str)) switch (nargs) { case 3: thparse_double(sv,this->B,args[2]); if ((sv != TT_SV_NUMBER) || (this->B < 0.0) || (this->B > 100.0)) invalid_color_spec; this->B /= 100.0; thparse_double(sv,this->G,args[1]); if ((sv != TT_SV_NUMBER) || (this->G < 0.0) || (this->G > 100.0)) invalid_color_spec; this->G /= 100.0; case 1: if (aalpha && (strcmp(args[0],"transparent") == 0)) { this->A = 0.0; this->defined = 2; break; } thparse_double(sv,this->R,args[0]); if ((sv != TT_SV_NUMBER) || (this->R < 0.0) || (this->R > 100.0)) invalid_color_spec; this->R /= 100.0; if (nargs == 1) { this->B = this->R; this->G = this->R; } this->defined = 2; break; default: invalid_color_spec; } } therion/thtex.cxx0000664000175000017500000005145512340604675013147 0ustar useruser/** * @file thtex.cxx * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #include "thtex.h" #ifndef THMSVC const char * thtex_library = "%% \n" "%% therion.tex\n" "%%\n" "%% Copyright (C) 2001-2004 Martin Budaj\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% -------------------------------------------------------------------- \n" "\n" "\\ifx\\pdfoutput\\undefined\n" " \\newlinechar`\\^^J\n" " \\immediate\\write16{^^J^^JProcess me with pdfTeX, please!^^J^^J}\n" " \\expandafter\\end\n" "\\fi\n" "\n" "\\def\\requiredformat{plain}\n" "\\ifx\\requiredformat\\fmtname\\else\n" " \\newlinechar`\\^^J\n" " \\immediate\\write16{^^J^^JTherion works only with plain TeX format!^^J}\n" " \\immediate\\write16{Your format is: \\fmtname^^J^^J}\n" " \\expandafter\\end\n" "\\fi\n" "\n" "\\def\\wlog#1{}\n" "\n" "\n" "\\parindent=0pt\n" "\\raggedbottom\n" "\\nopagenumbers\n" "\\tracingstats=1\n" "\\pdfimageresolution=300\n" "\n" "%\\pdfinfo{/Creator }%\n" "\n" "\\newbox\\xxx\n" "\\newbox\\mapbox\n" "\\newbox\\navbox\n" "\\newcount\\pointerE\n" "\\newcount\\pointerW\n" "\\newcount\\pointerN\n" "\\newcount\\pointerS\n" "\\newtoks\\pointerU\n" "\\newtoks\\pointerD\n" "\\newcount\\pagenum\n" "\\newtoks\\pagename\n" "\\newtoks\\pagelabel\n" "\\newtoks\\opacity \\opacity{0.7}\n" "\\newtoks\\surfaceopacity \\surfaceopacity{0.7}\n" "\\newif\\ifpagenumbering \\pagenumberingfalse\n" "\\newtoks\\bgcolor\n" "\\newif\\iflegendbgfill\n" "\n" "\\let\\ne\\noexpand\n" "\\def\\notdef{notdef}\n" "\n" "% hyperlinks\n" "\n" "\\def\\flatlink#1#2#3#4#5{%\n" " \\setbox\\xxx=\\hbox{}\\wd\\xxx=#3bp\\ht\\xxx=#4bp%\n" " \\rlap{\\kern#1bp\\raise#2bp\\hbox{%\n" " \\vbox to0bp{\\vss\\hbox to 0bp{%\n" " \\pdfstartlink attr {/Border [0 0 0]} goto name {#5}%\n" " \\box\\xxx\\pdfendlink\\hss}}}}}%\n" "\n" "\\def\\textlink#1#2{%\n" " \\pdfstartlink attr {/Border [0 0 0]} goto name {#2}#1\\pdfendlink}%\n" "\n" "\n" "\\def\\includechars#1:#2\\endinclude{\\pdfincludechars#1{#2}}\n" "\n" "\\newbox\\tmpboxa\n" "\\newbox\\tmpboxb\n" "\n" "\\newdimen\\legendsymbolwd\n" "\\newdimen\\legendsymbolht \\legendsymbolht=12pt\n" "\\newdimen\\tmpdimen\n" "\n" "\\def\\legendsymbolbox#1#2{%\n" " \\setbox\\tmpboxa=\\hbox{\\pdfrefxform#1}%\n" " \\setbox\\tmpboxb=\\hbox{\\the\\legendtextsize(}%\n" " \\legendsymbolwd=\\wd\\tmpboxa\n" " \\legendsymbolht=\\ht\\tmpboxa\n" " \\advance\\legendsymbolht by -\\ht\\tmpboxb\n" " \\advance\\legendsymbolht by -1dd\n" " \\tmpdimen=\\hsize\n" " \\advance\\tmpdimen by 10pt \n" " \\divide\\tmpdimen by\\legendcolumns \n" " \\advance\\tmpdimen by-10pt\n" " \\hbox to \\tmpdimen{%\n" " \\box\\tmpboxa\\kern10pt\\raise\\legendsymbolht\\vtop{%\n" " \\advance\\tmpdimen by -\\legendsymbolwd\n" " \\advance\\tmpdimen by -10pt\n" " \\hsize=\\tmpdimen\\rightskip=0pt plus \\tmpdimen minus 0pt\\relax\\the\\legendtextsize #2\\vskip1dd}\\hss}%\n" "}\n" "\n" "\\def\\colorlegendbox#1#2#3{%\n" " \\setbox\\xxx=\\hbox to 36bp{\\PL{q #1 #2 #3 rg 0 0 36 24 re f Q}\\hfil}%\n" " \\ht\\xxx=25bp\\dp\\xxx=0bp\n" " \\immediate\\pdfxform\\xxx\n" "}\n" "\n" "\n" "\\let\\PL\\pdfliteral\n" "\n" "\\newdimen\\xcorr\n" "\\newdimen\\ycorr\n" "\n" "\\def\\PB#1#2#3{\\rlap{\\kern#1bp\\raise#2bp\\hbox{\\pdfrefxform#3}}} %placebox\n" "\n" "\\def\\gridcoord#1#2{\\hbox to0pt{%\n" " \\ifnum#1=1\\hss\\fi\n" " \\ifnum#1=4\\hss\\fi\n" " \\ifnum#1=7\\hss\\fi\n" " \\ifnum#1=8\\hss\\fi\n" " \\ifnum#1=2\\hss\\fi\n" " \\vbox to0pt{%\n" " \\ifnum#1>3\\vss\\fi\n" " \\kern2pt%\n" " \\hbox{\\kern2pt#2\\kern2pt}%\n" " \\kern2pt%\n" " \\ifnum#1<7\\vss\\fi\n" " }%\n" " \\ifnum#1=3\\hss\\fi\n" " \\ifnum#1=6\\hss\\fi\n" " \\ifnum#1=9\\hss\\fi\n" " \\ifnum#1=8\\hss\\fi\n" " \\ifnum#1=2\\hss\\fi\n" " }%\n" "} \n" "\n" "\\def\\PBcorr#1#2#3{%\n" " \\xcorr=#1bp\\advance\\xcorr by\\extraW\\advance\\xcorr by\\overlap%\n" " \\ycorr=#2bp\\advance\\ycorr by\\extraS\\advance\\ycorr by\\overlap%\n" " \\rlap{\\kern\\xcorr\\raise\\ycorr\\hbox{\\pdfrefxform#3}}} %placebox\n" "\n" "\\def\\bitmap#1#2#3#4#5#6#7{%\n" " \\pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%\n" " \\rlap{\\pdfrefximage#7}%\n" " \\pdfliteral{Q}%\n" "}\n" "\n" "\\def\\bitmapcorr#1#2#3#4#5#6#7{%\n" " \\xcorr=0bp\\advance\\xcorr by\\extraW\\advance\\xcorr by\\overlap\n" " \\ycorr=0bp\\advance\\ycorr by\\extraS\\advance\\ycorr by\\overlap\n" " \\dimtobp{\\xcorr}\\edef\\wdth{\\tmpdef}%\n" " \\dimtobp{\\ycorr}\\edef\\hght{\\tmpdef}%\n" " \\pdfliteral{q 1 0 0 1 \\wdth\\space\\hght\\space cm #1 #2 #3 #4 #5 #6 cm}% two-step transformation to avoid overflow\n" " \\rlap{\\pdfrefximage#7}%\n" " \\pdfliteral{Q}%\n" "}\n" "\n" "\\newdimen\\tmpdimenX\n" "\\newdimen\\tmpdimenY\n" "\\def\\calibrX#1{\\tmpdimen=#1\\advance\\tmpdimen by\\overlap\\advance\\tmpdimen by\\extraW}\n" "\\def\\calibrY#1{\\tmpdimen=#1\\advance\\tmpdimen by\\overlap\\advance\\tmpdimen by\\extraS}\n" "\n" "\\def\\TITLE#1{\\eject\\hbox{}\\vskip5cm\\centerline{\\size[24]#1}\\vfil\\eject}\n" "\n" "% processing of the E-W-N-S references\n" "\n" "\\def\\showpointer#1{\\ifnum\\the#1=0\\else\\the#1\\fi}\n" "\n" "% processing of the up and down references\n" "\n" "\\def\\showpointerlist#1{\\edef\\test{\\the#1}\\ifx\\test\\notdef\\else\n" " \\expandafter\\process\\the#1\\endarg\\fi}\n" "\n" "\\def\\process#1||#2\\endarg{\n" " \\expandafter\\processpointeritem#1\\endarg%\n" " \\if@#2@\\def\\next##1\\endarg{}\n" " \\else\\let\\next=\\process\\fi\n" " \\next#2\\endarg}\n" "\n" "\\def\\processpointeritem#1|#2|#3\\endarg{\\hbox{\\textlink{\\arr\\ #2 (#1)}{#3}}}\n" "\n" "\\def\\arr{} % to be redefined in the \\dopage macro\n" "\n" "\n" "\\def\\pagesetup#1#2#3#4#5#6{\n" " \\pdfpagewidth#1\n" " \\pdfpageheight#2\n" " \\hsize#3\n" " \\vsize#4\n" " \\pdfhorigin#5\n" " \\pdfvorigin#6\n" " \\hoffset0pt\n" " \\voffset0pt\\relax\n" "}\n" "\n" "\\def\\linestyle{1 J 1 j 1.5 w}\n" "\n" "\\def\\framed#1{% \n" " \\dimtobp{\\wd#1}\\edef\\wdth{\\tmpdef}%\n" " \\dimtobp{\\ht#1}\\edef\\hght{\\tmpdef}%\n" " \\hbox to \\wd#1{\\rlap{\\box#1}\\PL{q \\linestyle\\space 0 0 \\wdth\\space\\hght\\space re S Q}\\hfill}%\n" "}\n" "\n" "{\\catcode`\\p=12\\catcode`\\t=12\\gdef\\SKIPPT#1pt{#1}}\n" "\n" "\\def\\dimtobp#1{%\n" " \\tmpdimen=#1%\n" " \\tmpdimen=0.996264\\tmpdimen\n" " \\edef\\tmpdef{\\the\\tmpdimen}%\n" " \\edef\\tmpdef{\\expandafter\\SKIPPT\\tmpdef}%\n" "}\n" "\n" "\\def\\color[#1 #2 #3]{%\n" " \\tmpdimen=#1pt%\n" " \\divide\\tmpdimen100\n" " \\edef\\tmpdef{\\the\\tmpdimen}%\n" " \\edef\\tmpdef{\\expandafter\\SKIPPT\\tmpdef}%\n" " \\pdfliteral{\\tmpdef}%\n" " \\tmpdimen=#2pt%\n" " \\divide\\tmpdimen100\n" " \\edef\\tmpdef{\\the\\tmpdimen}%\n" " \\edef\\tmpdef{\\expandafter\\SKIPPT\\tmpdef}%\n" " \\pdfliteral{\\tmpdef}%\n" " \\tmpdimen=#3pt%\n" " \\divide\\tmpdimen100\n" " \\edef\\tmpdef{\\the\\tmpdimen}%\n" " \\edef\\tmpdef{\\expandafter\\SKIPPT\\tmpdef}%\n" " \\pdfliteral{\\tmpdef}%\n" " \\pdfliteral{rg}\n" "}\n" "\n" "% actual placing of the page elements\n" "\n" "\\def\\dopage{%\n" " \\vbox{\\centerline{\\framed{\\mapbox}}\n" " \\bigskip\n" " \\line{%\n" " \\vbox to \\ht\\navbox{\n" " \\hbox{\\size[20]\\the\\pagelabel\n" " \\ifpagenumbering\\space(\\the\\pagenum)\\fi\n" " \\space\\size[16]\\the\\pagename}\n" " \\ifpagenumbering\n" " \\medskip\n" " \\hbox{\\qquad\\qquad\n" " \\vtop{%\n" " \\hbox to 0pt{\\hss\\showpointer\\pointerN\\hss}\n" " \\hbox to 0pt{\\llap{\\showpointer\\pointerW\\hskip0.7em}%\n" " \\raise1pt\\hbox to 0pt{\\hss$\\updownarrow$\\hss}%\n" " \\raise1pt\\hbox to 0pt{\\hss$\\leftrightarrow$\\hss}%\n" " \\rlap{\\hskip0.7em\\showpointer\\pointerE}}\n" " \\hbox to 0pt{\\hss\\showpointer\\pointerS\\hss}\n" " }\\qquad\\qquad\n" " \\vtop{\n" " \\def\\arr{$\\uparrow$}\n" " \\showpointerlist\\pointerU\n" " \\def\\arr{$\\downarrow$}\n" " \\showpointerlist\\pointerD\n" " }\n" " }\n" " \\fi\n" " \\vss\n" " }\n" " \\hss\n" " \\vbox to \\ht\\navbox{\n" " \\ifnortharrow\\hbox to 0pt{\\hss\\northarrow\\qquad}\\fi\n" " \\vss\n" " \\ifscalebar\\hbox to 0pt{\\hss\\scalebar\\qquad}\\fi\n" " }\n" " \\box\\navbox\n" " }\n" " }\n" "}\n" "\n" "\\newif\\iflegend\n" "\\newif\\ifcolorlegend\n" "\\newtoks\\legendcontent\n" "\n" "\\newtoks\\cavename\n" "\\newtoks\\comment\n" "\\newtoks\\legendtitle\n" "\\newtoks\\colorlegendtitle\n" "\\newif\\ifnortharrow\n" "\\newif\\ifscalebar\n" "\\newtoks\\explotitle\n" "\\newtoks\\explodate\n" "\\newtoks\\exploteam\n" "\\newtoks\\topotitle\n" "\\newtoks\\topodate\n" "\\newtoks\\topoteam\n" "\\newtoks\\cartotitle\n" "\\newtoks\\cartodate\n" "\\newtoks\\cartoteam\n" "\\newtoks\\copyrights\n" "\\newtoks\\cavelength\n" "\\newtoks\\cavedepth\n" "\\newtoks\\cavelengthtitle\n" "\\newtoks\\cavedepthtitle\n" "\\newtoks\\cavemaxx\n" "\\newtoks\\caveminx\n" "\\newtoks\\cavemaxy\n" "\\newtoks\\caveminy\n" "\\newtoks\\cavemaxz\n" "\\newtoks\\caveminz\n" "\\newtoks\\thversion\n" "\\newtoks\\outcscode\n" "\\newtoks\\outcsname\n" "\\newtoks\\northdir\n" "\\newtoks\\magdecl\n" "\\newtoks\\gridconv\n" "\\newtoks\\currentdate\n" "\\newtoks\\legendtextcolor\\legendtextcolor={\\color[0 0 0]}\n" "\\newtoks\\legendtextsize\\legendtextsize={\\size[12]}\n" "\\newtoks\\legendtextheadersize\\legendtextheadersize={\\size[26]}\n" "\\newtoks\\legendtextsectionsize\\legendtextsectionsize={\\size[14]}\n" "\n" "\\def\\scalebar{\\pdfrefxform\\THWscalebar}\n" "\\def\\northarrow{\\pdfrefxform\\THWnortharrow}\n" "\\newdimen\\legendwidth %\\legendwidth=14cm\n" "\\newcount\\legendcolumns \\legendcolumns=2\n" "\n" "\\legendcontent={%\n" " \\hsize=\\legendwidth\n" " \\color[0 0 0]\\the\\legendtextcolor \n" " \\ifnortharrow\\vbox to 0pt{\\line{\\hfil\\northarrow}\\vss}\\fi\n" " \\edef\\tmp{\\the\\cavename} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextheadersize\\the\\cavename}\\vskip1cm\n" " \\fi\n" " \\ifscalebar\\scalebar\\vskip1cm\\fi\n" " {\\rightskip=0pt plus 3em\\parskip=3bp\n" " \\edef\\tmp{\\the\\comment} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\the\\comment} \\par\\medskip\n" " \\fi\n" " \\everypar{\\hangindent=2em\\hangafter=1}\n" " \\edef\\tmp{\\the\\cavelength} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\cavelengthtitle: \\ss\\the\\cavelength\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\cavedepth} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\cavedepthtitle: \\ss\\the\\cavedepth\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\exploteam} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\explotitle: \\ss\\the\\exploteam\\quad\\si\\the\\explodate\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\topoteam} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\topotitle: \\ss\\the\\topoteam\\quad\\si\\the\\topodate\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\cartoteam} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\cartotitle: \\ss\\the\\cartoteam\\quad\\si\\the\\cartodate\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\copyrights} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\ss\\the\\copyrights\\par}\n" " \\fi\n" " }\n" " \\formattedlegend\n" " \\color[0 0 0]\n" "}\n" "\n" "\\def\\maplayout{\n" " \\legendbox{NW}{\\the\\legendcontent}\n" " \\legendbox{NE}{\\northarrow}\n" "}\n" "\n" "\n" "\\def\\formattedlegend{%\n" " \\ifcolorlegend\n" " \\vskip1cm{\\the\\legendtextsectionsize\\the\\colorlegendtitle}\\bigskip\n" " \\insertcolorlegend\n" " \\fi\n" " \\iflegend\n" " \\vskip1cm{\\the\\legendtextsectionsize\\the\\legendtitle}\\bigskip\n" " \\insertlegend\n" " \\fi}\n" "\n" "\\let\\atlaslegend=\\formattedlegend\n" "\n" "\\def\\atlastitlepages{\n" " \\edef\\tmp{\\the\\cavename} \\ifx\\tmp\\empty \\else\n" " \\TITLE{\\the\\cavename}\n" " \\fi\n" " {\\rightskip=0pt plus 3em\\parskip=3bp\n" " \\edef\\tmp{\\the\\comment} \\ifx\\tmp\\empty \\else\n" " {\\size[12]\\the\\comment} \\par\\medskip\n" " \\fi\n" " \\everypar{\\hangindent=2em\\hangafter=1}\n" " \\edef\\tmp{\\the\\exploteam} \\ifx\\tmp\\empty \\else\n" " {\\size[12]\\si\\the\\explotitle: \\ss\\the\\exploteam\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\topoteam} \\ifx\\tmp\\empty \\else\n" " {\\size[12]\\si\\the\\topotitle: \\ss\\the\\topoteam\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\cartoteam} \\ifx\\tmp\\empty \\else\n" " {\\size[12]\\si\\the\\cartotitle: \\ss\\the\\cartoteam\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\copyrights} \\ifx\\tmp\\empty \\else\n" " {\\size[12]\\ss\\the\\copyrights\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\cavelength} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\cavelengthtitle: \\ss\\the\\cavelength\\par}\n" " \\fi\n" " \\edef\\tmp{\\the\\cavedepth} \\ifx\\tmp\\empty \\else\n" " {\\the\\legendtextsize\\si\\the\\cavedepthtitle: \\ss\\the\\cavedepth\\par}\n" " \\fi\n" " }\n" "}\n" "\n" "\\newdimen\\sx\n" "\\newdimen\\sy\n" "\\newdimen\\sxd\n" "\\newdimen\\syd\n" "\n" "\\def\\LEGN{N}\n" "\\def\\LEGE{E}\n" "\\def\\LEGW{W}\n" "\\def\\LEGS{S}\n" "\\def\\LEGNE{NE}\n" "\\def\\LEGNW{NW}\n" "\\def\\LEGSE{SE}\n" "\\def\\LEGSW{SW}\n" "\\def\\LEGC{C}\n" "\n" "\n" "\\newdimen\\extraN \\extraN=0mm\n" "\\newdimen\\extraS \\extraS=0mm\n" "\\newdimen\\extraE \\extraE=0mm\n" "\\newdimen\\extraW \\extraW=0mm\n" "\\newdimen\\adjustedHS\n" "\\newdimen\\adjustedVS\n" "\\newdimen\\adjustedX\n" "\\newdimen\\adjustedY\n" "\\newdimen\\framethickness\\framethickness=0cm\n" "\n" "\\def\\legendbox#1#2#3#4{%\n" " \\unskip\n" " \\setbox\\tmpboxa=\\vbox{#4}%\n" " \\sx=\\wd\\tmpboxa\n" " \\sy=\\ht\\tmpboxa \\advance\\sy by \\dp\\tmpboxa\n" " \\sxd=\\hsize \\divide\\sxd by 100 \\sxd=#1\\sxd\n" " \\syd=\\vsize \\divide\\syd by 100 \\syd=#2\\syd\n" " \\edef\\test{#3}%\n" " \\ifx\\test\\LEGN\n" " \\divide\\sx by 2 \\advance\\sxd by -\\sx\n" " \\advance\\syd by -\\sy\n" " \\else\\ifx\\test\\LEGW\n" " \\divide\\sy by 2 \\advance\\syd by -\\sy \n" " \\else\\ifx\\test\\LEGE\n" " \\advance\\sxd by -\\sx\n" " \\divide\\sy by 2 \\advance\\syd by -\\sy \n" " \\else\\ifx\\test\\LEGS\n" " \\divide\\sx by 2 \\advance\\sxd by -\\sx\n" " \\else\\ifx\\test\\LEGNW\n" " \\advance\\syd by -\\sy \n" " \\else\\ifx\\test\\LEGNE\n" " \\advance\\sxd by -\\sx\n" " \\advance\\syd by -\\sy\n" " \\else\\ifx\\test\\LEGSW\n" " \\else\\ifx\\test\\LEGSE\n" " \\advance\\sxd by -\\sx\n" " \\else\\ifx\\test\\LEGC\n" " \\divide\\sx by 2 \\advance\\sxd by -\\sx\n" " \\divide\\sy by 2 \\advance\\syd by -\\sy \n" " \\fi\\fi\\fi\\fi\\fi\\fi\\fi\\fi\\fi\n" " %\n" " \\ifdim\\sxd<-\\extraW \\global\\extraW=-\\sxd\\fi\n" " \\ifdim\\syd<-\\extraS \\global\\extraS=-\\syd\\fi\n" " \\sx=\\wd\\tmpboxa\n" " \\sy=\\ht\\tmpboxa \\advance\\sy by \\dp\\tmpboxa\n" " \\advance\\sx by \\sxd \\advance\\sx by -\\hsize\n" " \\advance\\sy by \\syd \\advance\\sy by -\\vsize\n" " \\ifdim\\sx>\\extraE \\global\\extraE=\\sx \\fi\n" " \\ifdim\\sy>\\extraN \\global\\extraN=\\sy \\fi\n" " %\n" " \\unskip\n" "% \\advance\\sxd by \\extraW -- presunute do thpdf.cxx\n" "% \\advance\\syd by \\extraS\n" "\n" " % vypln pod legendou\n" " \\iflegendbgfill\n" " \\begingroup\n" " \\advance\\sxd-1cm\n" " \\advance\\syd-1cm\n" " \\sx=\\wd\\tmpboxa \\advance\\sx by 2cm\n" " \\dimtobp{\\sxd}\\edef\\shiftx{\\tmpdef}%\n" " \\dimtobp{\\syd}\\edef\\shifty{\\tmpdef}%\n" "% \\dimtobp{\\wd\\tmpboxa}\\edef\\wdth{\\tmpdef}%\n" " \\dimtobp{\\sx}\\edef\\wdth{\\tmpdef}%\n" " \\sy=\\ht\\tmpboxa \\advance\\sy by \\dp\\tmpboxa\n" " \\advance\\sy by 2 cm\n" " \\dimtobp{\\sy}\\edef\\hght{\\tmpdef}%\n" " \\rlap{\\PL{q \\the\\bgcolor\\space rg \\shiftx\\space \\shifty\\space \\wdth\\space \\hght\\space re f Q}}%\n" " \\endgroup \n" " \\fi\n" " %\n" " \\advance\\syd by \\dp\\tmpboxa\n" "\n" " \\rlap{\\kern\\sxd\\raise\\syd\\box\\tmpboxa}%\n" " \\ignorespaces\n" "}\n" "\n" "\\def\\loadpicture#1{\\pdfximage{#1}\\pdfrefximage\\pdflastximage}\n" "\n" "\\def\\insertmaps{%\n" " \\color[0 0 0]\n" " \\input th_formdef\n" " \\input th_pagedef\n" " \\input th_pages\n" " \\immediate\\write-1{ \\the\\count10 \\space numeric registers used out of \n" " \\ifx\\eTeXversion\\undefined256\\else32768\\fi}\n" "}\n" " \n" "\\def\\insertlegend{%\n" " \\input th_legend\n" "}\n" "\n" "\\def\\insertcolorlegend{%\n" " \\input th_legendcolor\n" "}\n" "\n" "\\def\\insertkeyplan#1#2{%\n" " \\tmpdimen=#1\n" " \\tmpdimen=2\\tmpdimen\n" " \\setbox0=\\hbox{\\pdfximage width \\tmpdimen {#2}\\pdfrefximage\\pdflastximage}\n" "% \\pdfxform0\\keyplan=\\pdflastxform\n" " \\setbox1=\\hbox to #1 {\\copy0\\hss}\n" " \\setbox2=\\hbox to #1 {\\hss\\box0}\n" " \\eject \n" " \\ifodd\\pageno\\hbox{}\\vfil\\eject\\fi\n" " \\line{\\hss\\pdfxform1\\pdfrefxform\\pdflastxform}\n" " \\vfil\n" " \\eject\n" " \\line{\\pdfxform2\\pdfrefxform\\pdflastxform\\hss}\n" " \\vfil\n" " \\eject\n" "}\n" "\n" "\n" "\\newcount\\stopcount\n" "\\newcount\\stoprow\n" "\\newcount\\rows\n" "\\newcount\\rowstmp\n" "\\newcount\\i\n" "\\newcount\\j\n" "\n" "\n" "\\def\\placemaps{\n" " \\message{ [Warning: \\string\\placemaps\\space is deprecated; \n" " use \\string\\insertmaps] }\n" " \\insertmaps\n" "}\n" "\n" "%% Petr Olsak's multicolumn macros (slightly modified)\n" "\n" "\\newdimen\\colsep \\colsep=1em % horiz. mezera mezi sloupci\n" "\\newcount\\tempnum % pracovní promìnná\n" "\\splittopskip=\\baselineskip\n" "\\def\\roundtolines #1{%% zaokrouhlí na celé násobky vel. øádku\n" " \\divide #1 by\\baselineskip \\multiply #1 by\\baselineskip}\n" "\\def\\corrsize #1{%% #1 := #1 + \\splittopskip - \\topskip\n" " \\advance #1 by \\splittopskip \\advance #1 by-\\topskip}\n" "\n" "\\def\\begmulti#1{\\par\\bigskip\\penalty0 \\def\\Ncols{#1}\n" " \\setbox0=\\vbox\\bgroup\\penalty0\n" " %% \\hsize := ¹íøka sloupce = (\\hsize+\\colsep) / n - \\colsep\n" " \\advance\\hsize by\\colsep\n" " \\divide\\hsize by\\Ncols \\advance\\hsize by-\\colsep}\n" "\\def\\endmulti{\\vfil\\egroup \\setbox1=\\vsplit0 to0pt\n" " %% \\dimen1 := velikost zbylého místa na stránce\n" " \\ifdim\\pagegoal=\\maxdimen \\dimen1=\\vsize \\corrsize{\\dimen1}\n" " \\else \\dimen1=\\pagegoal \\advance\\dimen1 by-\\pagetotal \\fi\n" " \\ifdim \\dimen1<2\\baselineskip\n" " \\vfil\\break \\dimen1=\\vsize \\corrsize{\\dimen1} \\fi\n" " %% \\dimen0 := vý¹ka n sloupcové sazby po rozdìlení do sloupcù\n" " %% = (\\ht0 + (n-1)\\baselineskip) / n, zaokruhleno na øádky\n" " \\dimen0=\\Ncols\\baselineskip \\advance\\dimen0 by-\\baselineskip\n" " \\advance\\dimen0 by \\ht0 \\divide\\dimen0 by\\Ncols\n" " \\roundtolines{\\dimen0}\n" " %% Rozdìlit sazbu n sloupcù do stránek nebo nerozdìlit ?\n" " \\ifdim \\dimen0>\\dimen1 \\splitpart\n" " \\else \\makecolumns{\\dimen0} \\fi\n" " \\ifvoid0 \\else \\errmessage{Lost text in multiple columns?} \\fi\n" " \\bigskip}\n" "\\def\\makecolumns#1{\\setbox1=\\hbox{}\\tempnum=0\n" " \\loop \\ifnum\\Ncols>\\tempnum\n" " \\setbox1=\\hbox{\\unhbox1 \\vsplit0 to#1 \\hss}\n" " \\advance\\tempnum by1\n" " \\repeat\n" " \\hbox{}\\nobreak\\vskip-\\splittopskip \\nointerlineskip\n" " \\line{\\unhbox1\\unskip}}\n" "\\def\\splitpart{\\roundtolines{\\dimen1}\n" " \\makecolumns{\\dimen1} \\advance\\dimen0 by-\\dimen1\n" " %% \\dimen0 := vý¹ka _zbylé_ n sloupcové sazby\n" " %% \\dimen1 := prázdné místo na stránce = (cca) \\vsize\n" " \\vfil\\break\n" " \\dimen1=\\vsize \\corrsize{\\dimen1}\n" " %% Rozdìlit zbylou sazbu n sloupcù do více stránek ?\n" " \\ifvoid0 \\else\n" " \\ifdim \\dimen0>\\dimen1 \\splitpart\n" " \\else \\makecolumns{\\dimen0} \\fi \\fi}\n" "\n" "%% end of multicolumn macros\n" "\n" "\\input th_enc\n" "\\input th_texts\n" "\\input th_resources\n" "\\input th_fontdef\n" "\n" "\\nonstopmode\n" "\n"; #else const char * thtex_library = "\\input therion.tex\n"; #endif therion/thmbuffer.cxx0000664000175000017500000000561710721205226013762 0ustar useruser/** * @file thmbuffer.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thmbuffer.h" thmbuffer::mblock::mblock(size_t min_size, size_t last_size) { this->next_ptr = NULL; this->size = 4 * last_size; while (this->size <= min_size) this->size *= 4; this->data = new char [this->size]; } thmbuffer::mblock::~mblock() { if (this->data) delete [] this->data; if (this->next_ptr != NULL) delete this->next_ptr; } thmbuffer::thmbuffer() { this->max_size = 4; this->size = 0; this->buf = new char* [this->max_size]; this->first_ptr = new mblock(1000, 256); this->last_ptr = this->first_ptr; this->free_size = this->last_ptr->size; this->free_ptr = this->last_ptr->data; } thmbuffer::~thmbuffer() { if (this->buf) delete [] this->buf; if (this->first_ptr) delete this->first_ptr; } char * thmbuffer::appendn(const char * src, size_t n) { char * dest; while (this->free_size <= long(n)) { if (this->last_ptr->next_ptr != NULL) this->last_ptr = this->last_ptr->next_ptr; else { this->last_ptr->next_ptr = new mblock(n, this->last_ptr->size); this->last_ptr = this->last_ptr->next_ptr; } this->free_size = this->last_ptr->size; this->free_ptr = this->last_ptr->data; } dest = strncpy(this->free_ptr, src, n); dest[n] = 0; this->free_ptr += n + 1; this->free_size -= n + 1; if (this->size == this->max_size) { char ** new_buf; this->max_size *= 4; new_buf = new char* [this->max_size]; memcpy(new_buf, this->buf, this->size * sizeof(char*)); delete [] this->buf; this->buf = new_buf; } this->buf[this->size] = dest; this->size++; return dest; } char * thmbuffer::append(const char * src) { return this->appendn(src, strlen(src)); } void thmbuffer::clear() { this->last_ptr = this->first_ptr; this->free_size = this->last_ptr->size; this->free_ptr = this->last_ptr->data; this->size = 0; } long thmbuffer::get_size() { return this->size; } char ** thmbuffer::get_buffer() { return this->buf; } therion/thline.cxx0000664000175000017500000012345612047243356013276 0ustar useruser/** * @file thline.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thline.h" #include "thexception.h" #include "thparse.h" #include "thchenc.h" #include "thdb2dlp.h" #include "thexpmap.h" #include "thtflength.h" #include "thtexfonts.h" #include "thscrap.h" #ifdef THMSVC #define hypot _hypot #endif thline::thline() { this->type = TT_LINE_TYPE_UNKNOWN; this->outline = TT_LINE_OUTLINE_NONE; this->closed = TT_AUTO; this->reverse = false; this->is_closed = false; this->csubtype = TT_LINE_SUBTYPE_UNKNOWN; this->first_point = NULL; this->last_point = NULL; this->text = NULL; this->m_height = thnan; } thline::~thline() { } int thline::get_class_id() { return TT_LINE_CMD; } bool thline::is(int class_id) { if (class_id == TT_LINE_CMD) return true; else return th2ddataobject::is(class_id); } int thline::get_cmd_nargs() { return 1; } const char * thline::get_cmd_end() { return "endline"; } const char * thline::get_cmd_name() { return "line"; } thcmd_option_desc thline::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_line_opt); if (id == TT_LINE_UNKNOWN) return th2ddataobject::get_cmd_option_desc(opts); else return thcmd_option_desc(id); } void thline::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { int reversion, csmooth, sv; char * type, * subtype; if (cod.id == 1) cod.id = TT_LINE_TYPE; switch (cod.id) { case 0: thsplit_args(& this->db->db2d.mbf, *args); this->insert_line_point(this->db->db2d.mbf.get_size(), this->db->db2d.mbf.get_buffer()); break; case TT_LINE_TYPE: th2dsplitTT(*args, &type, &subtype); this->parse_type(type); if (strlen(subtype) > 0) this->parse_subtype(subtype); break; case TT_LINE_OUTLINE: this->outline = thmatch_token(*args,thtt_line_outlines); if (this->outline == TT_LINE_OUTLINE_UNKNOWN) ththrow(("unknown line outline -- %s",*args)) break; case TT_LINE_CLOSED: this->closed = thmatch_token(*args,thtt_onoffauto); if (this->closed == TT_UNKNOWN_BOOL) ththrow(("invalid closure switch -- %s",*args)) break; case TT_LINE_REVERSE: reversion = thmatch_token(*args,thtt_bool); if (reversion == TT_UNKNOWN_BOOL) ththrow(("invalid reversion switch -- %s",*args)) this->reverse = (reversion == TT_TRUE); break; case TT_LINE_SUBTYPE: this->parse_subtype(*args); break; case TT_LINE_HEIGHT: this->parse_height(*args); break; case TT_LINE_BORDER: this->parse_border(*args); break; case TT_LINE_GRADIENT: this->parse_gradient(*args); break; case TT_LINE_DIRECTION: this->parse_direction(*args); break; case TT_LINE_HEAD: this->parse_head(*args); break; case TT_LINE_ADJUST: this->parse_adjust(*args); break; case TT_LINE_ALTITUDE: this->parse_altitude(*args); break; case TT_LINE_TEXT: thencode(&(this->db->buff_enc), *args, argenc); this->parse_text(this->db->buff_enc.get_buffer()); break; case TT_LINE_SMOOTH: csmooth = thmatch_token(*args,thtt_onoffauto); if (csmooth == TT_UNKNOWN_BOOL) ththrow(("invalid smooth switch -- %s",*args)) if (this->last_point != NULL) { this->last_point->smooth = csmooth; this->last_point->smooth_orig = csmooth; } else ththrow(("no line point specified")) break; case TT_LINE_ORIENT: if (this->last_point != NULL) { if (this->type != TT_LINE_TYPE_SLOPE) ththrow(("orientation not valid with type %s", thmatch_string(this->type,thtt_line_types))) thparse_double(sv,this->last_point->orient,*args); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid number -- %s",*args)) if ((this->last_point->orient < 0.0) || (this->last_point->orient >= 360.0)) ththrow(("orientation out of range -- %s",*args)) this->last_point->tags |= TT_LINEPT_TAG_ORIENT; } else ththrow(("no line point specified")) break; case TT_LINE_SIZE: case TT_LINE_RSIZE: case TT_LINE_LSIZE: this->parse_size(cod.id,*args); break; case TT_LINE_MARK: this->insert_point_mark(*args); break; // if not found, try to set fathers properties default: th2ddataobject::set(cod, args, argenc, indataline); } } void thline::self_delete() { delete this; } void thline::self_print_properties(FILE * outf) { th2ddataobject::self_print_properties(outf); fprintf(outf,"thline:\n"); fprintf(outf,"\ttype: %d\n", this->type); fprintf(outf,"\toutline: %d\n", this->outline); fprintf(outf,"\tclosed: %d\n", this->closed); fprintf(outf,"\treverse: %d\n", this->reverse); if (this->last_point != NULL) { fprintf(outf,"\tpoints:\n"); thdb2dlp * cpt = this->first_point; while(cpt != NULL) { fprintf(outf,"\t"); if (cpt->cp1 != NULL) fprintf(outf,"\t -- %f,%f (%f,%f,%f,%f)\n\t",cpt->cp1->x, cpt->cp1->y, cpt->cp1->xt, cpt->cp1->yt, cpt->cp1->zt, cpt->cp1->at); if (cpt->cp2 != NULL) fprintf(outf,"\t -- %f,%f (%f,%f,%f,%f)\n\t",cpt->cp2->x, cpt->cp2->y, cpt->cp2->xt, cpt->cp2->yt, cpt->cp2->zt, cpt->cp2->at); fprintf(outf,"\t%f,%f (%f,%f,%f,%f)",cpt->point->x, cpt->point->y, cpt->point->xt, cpt->point->yt, cpt->point->zt, cpt->point->at); fprintf(outf,"\t(subtype:%d smooth:%d orient:%f r-size:%f l-size:%f)\n",cpt->subtype,cpt->smooth, cpt->orient, cpt->rsize, cpt->lsize); cpt = cpt->nextlp; } } // insert intended print of object properties here } void thline::parse_type(char * ss) { this->type = thmatch_token(ss,thtt_line_types); switch (this->type) { case TT_LINE_TYPE_UNKNOWN: ththrow(("unknown line type -- %s",ss)) break; case TT_LINE_TYPE_WALL: this->csubtype = TT_LINE_SUBTYPE_BEDROCK; this->outline = TT_LINE_OUTLINE_OUT; break; case TT_LINE_TYPE_BORDER: this->csubtype = TT_LINE_SUBTYPE_VISIBLE; break; case TT_LINE_TYPE_WATER_FLOW: this->csubtype = TT_LINE_SUBTYPE_PERMANENT; break; case TT_LINE_TYPE_SURVEY: this->csubtype = TT_LINE_SUBTYPE_CAVE; break; case TT_LINE_TYPE_ARROW: this->tags |= TT_LINE_TAG_HEAD_END; break; case TT_LINE_TYPE_CHIMNEY: this->place = TT_2DOBJ_PLACE_DEFAULT_TOP; break; case TT_LINE_TYPE_CEILING_STEP: this->place = TT_2DOBJ_PLACE_DEFAULT_TOP; break; case TT_LINE_TYPE_CEILING_MEANDER: this->place = TT_2DOBJ_PLACE_DEFAULT_TOP; break; } } void thline::parse_subtype(char * ss) { // int prevcsubtype = this->csubtype; if (this->type == TT_LINE_TYPE_U) { if (this->last_point != NULL) ththrow(("subtype specification not allowed here")) this->parse_u_subtype(ss); return; } this->csubtype = thmatch_token(ss,thtt_line_subtypes); if (this->csubtype == TT_LINE_SUBTYPE_UNKNOWN) ththrow(("invalid line subtype -- %s",ss)) // if ((this->last_point != NULL) && (prevcsubtype != TT_LINE_SUBTYPE_UNKNOWN) // && (this->csubtype != prevcsubtype)) { // this->throw_source(); // threwarning2(("multiple subtypes per line are deprecated")) // } bool tsok = false; switch (this->type) { case TT_LINE_TYPE_WALL: switch (this->csubtype) { case TT_LINE_SUBTYPE_INVISIBLE: case TT_LINE_SUBTYPE_BEDROCK: case TT_LINE_SUBTYPE_SAND: case TT_LINE_SUBTYPE_CLAY: case TT_LINE_SUBTYPE_PEBBLES: case TT_LINE_SUBTYPE_DEBRIS: case TT_LINE_SUBTYPE_BLOCKS: case TT_LINE_SUBTYPE_ICE: case TT_LINE_SUBTYPE_UNDERLYING: case TT_LINE_SUBTYPE_UNSURVEYED: case TT_LINE_SUBTYPE_PRESUMED: case TT_LINE_SUBTYPE_OVERLYING: case TT_LINE_SUBTYPE_PIT: case TT_LINE_SUBTYPE_MOONMILK: case TT_LINE_SUBTYPE_FLOWSTONE: tsok = true; } break; case TT_LINE_TYPE_BORDER: switch (this->csubtype) { case TT_LINE_SUBTYPE_INVISIBLE: case TT_LINE_SUBTYPE_TEMPORARY: case TT_LINE_SUBTYPE_VISIBLE: case TT_LINE_SUBTYPE_PRESUMED: tsok = true; } break; case TT_LINE_TYPE_SURVEY: switch (this->csubtype) { case TT_LINE_SUBTYPE_CAVE: case TT_LINE_SUBTYPE_SURFACE: tsok = true; } break; case TT_LINE_TYPE_WATER_FLOW: switch (this->csubtype) { case TT_LINE_SUBTYPE_PERMANENT: case TT_LINE_SUBTYPE_INTERMITTENT: case TT_LINE_SUBTYPE_CONJECTURAL: tsok = true; } break; } if (!tsok) ththrow(("invalid line type - subtype combination")) if (this->last_point != NULL) this->last_point->subtype = this->csubtype; } void thline::insert_line_point(int nargs, char ** args, double * nums) { // check number of parameters if ((nargs != 6) && (nargs != 2)) ththrow(("invalid number of coordinates -- %d", nargs)) double cp1x, cp1y, cp2x, cp2y, x, y; int pidx = 0, sv; char * invs = NULL; bool invnum = false; if (nargs == 6) { pidx = 4; if (args != NULL) { thparse_double(sv, cp1x, args[0]); if (sv != TT_SV_NUMBER) { invs = args[0]; invnum = true; } thparse_double(sv, cp1y, args[1]); if (sv != TT_SV_NUMBER) { invs = args[1]; invnum = true; } thparse_double(sv, cp2x, args[2]); if (sv != TT_SV_NUMBER) { invs = args[2]; invnum = true; } thparse_double(sv, cp2y, args[3]); if (sv != TT_SV_NUMBER) { invs = args[3]; invnum = true; } } else { cp1x = nums[0]; cp1y = nums[1]; cp2x = nums[2]; cp2y = nums[3]; } } if (args != NULL) { thparse_double(sv, x, args[pidx]); if (sv != TT_SV_NUMBER) { invs = args[pidx]; invnum = true; } thparse_double(sv, y, args[pidx+1]); if (sv != TT_SV_NUMBER) { invs = args[pidx+1]; invnum = true; } } else { x = nums[pidx]; y = nums[pidx+1]; } if (invnum) ththrow(("invalid number -- %s",invs)) // let's insert point into database thdb2dlp * plp = this->db->db2d.insert_line_point(); plp->subtype = this->csubtype; plp->smooth = TT_AUTO; plp->smooth_orig = TT_AUTO; if (this->last_point == NULL) { this->last_point = plp; this->first_point = plp; plp->nextlp = NULL; plp->prevlp = NULL; } else { this->last_point->nextlp = plp; plp->prevlp = this->last_point; plp->nextlp = NULL; this->last_point = plp; } thdb2dpt * cp1, * cp2, * pt; pt = this->db->db2d.insert_point(); pt->x = x; pt->y = y; pt->pscrap = this->db->get_current_scrap(); plp->point = pt; if (nargs == 6) { cp1 = this->db->db2d.insert_point(); cp1->x = cp1x; cp1->y = cp1y; cp1->pscrap = this->db->get_current_scrap(); cp2 = this->db->db2d.insert_point(); cp2->x = cp2x; cp2->y = cp2y; cp2->pscrap = this->db->get_current_scrap(); plp->cp1 = cp1; plp->cp2 = cp2; } else { plp->cp1 = NULL; plp->cp2 = NULL; } } void thline::insert_point_mark(char * ss) { if (!th_is_keyword(ss)) ththrow(("mark not a key word -- %s",ss)) if (this->last_point == NULL) ththrow(("no line point specified")) this->last_point->mark = this->db->strstore(ss,true); } thdb2dlp * thline::get_marked_station(const char * mark) { if (strcmp(mark,"end") == 0) { if (this->reverse) return this->first_point; else return this->last_point; } thdb2dlp * cpt = (this->reverse ? this->last_point : this->first_point); if (th_is_index(mark)) { int index = -1, cidx; sscanf(mark,"%d",&index); cidx = 0; while(cpt != NULL) { if (cidx == index) return cpt; cidx++; cpt = (this->reverse ? cpt->prevlp : cpt->nextlp); } } cpt = (this->reverse ? this->last_point : this->first_point); while (cpt != NULL) { if (cpt->mark != NULL) if (strcmp(mark,cpt->mark) == 0) return cpt; cpt = (this->reverse ? cpt->prevlp : cpt->nextlp); } return NULL; } void thline::preprocess() { if (this->first_point == NULL) return; // check closure this->is_closed = ((this->closed == TT_TRUE) || ((this->closed == TT_AUTO) && (this->first_point->point->x == this->last_point->point->x) && (this->first_point->point->y == this->last_point->point->y))); if (this->is_closed) { this->last_point->point->x = this->first_point->point->x; this->last_point->point->y = this->first_point->point->y; } // check reversion thdb2dlp * c_item, * n_item, * t_item; thdb2dpt * t_point; int t_tags, t_subtype, t_smooth, t_smooth_orig; double t_rsize, t_lsize, t_orient; bool tmpreverse = this->reverse; if (this->fscrapptr->flip != TT_SCRAP_FLIP_NONE) tmpreverse = !tmpreverse; if (tmpreverse && (this->first_point->nextlp != NULL)) { // najprv prehodi podtypy c_item = this->first_point; while (c_item != NULL) { n_item = c_item->nextlp; // switch next - prev t_item = c_item->nextlp; c_item->nextlp = c_item->prevlp; c_item->prevlp = t_item; // switch control points t_point = c_item->cp1; c_item->cp1 = c_item->cp2; c_item->cp2 = t_point; c_item = n_item; } t_item = this->first_point; this->first_point = this->last_point; this->last_point = t_item; t_point = this->first_point->point; t_tags = this->first_point->tags; t_rsize = this->first_point->rsize; t_lsize = this->first_point->lsize; t_orient = this->first_point->orient; t_smooth = this->first_point->smooth; t_smooth_orig = this->first_point->smooth_orig; t_subtype = this->last_point->subtype; c_item = this->first_point; while (c_item != NULL) { if (c_item->nextlp != NULL) { c_item->point = c_item->nextlp->point; c_item->tags = c_item->nextlp->tags; c_item->lsize = c_item->nextlp->lsize; c_item->rsize = c_item->nextlp->rsize; c_item->orient = c_item->nextlp->orient; c_item->smooth = c_item->nextlp->smooth; c_item->smooth_orig = c_item->nextlp->smooth_orig; c_item->subtype = c_item->nextlp->subtype; } else { c_item->point = t_point; c_item->tags = t_tags; c_item->lsize = t_lsize; c_item->rsize = t_rsize; c_item->orient = t_orient; c_item->smooth = t_smooth; c_item->smooth_orig = t_smooth_orig; c_item->subtype = t_subtype; } c_item = c_item->nextlp; } t_item = this->last_point; this->last_point = t_item->prevlp; this->last_point->nextlp = NULL; t_item->prevlp = NULL; t_item->nextlp = this->first_point; this->first_point->prevlp = t_item; this->first_point = t_item; t_subtype = this->first_point->subtype; c_item = this->first_point; while (c_item != NULL) { if (c_item->nextlp != NULL) { c_item->subtype = c_item->nextlp->subtype; } else { c_item->subtype = t_subtype; } c_item = c_item->nextlp; } } // check smoothness c_item = this->first_point; double d1, d2, a1, a2; while (c_item != NULL) { if (c_item->smooth == TT_AUTO) { c_item->smooth = TT_TRUE; if ((c_item->nextlp != NULL) && (c_item->cp2 != NULL) && (c_item->nextlp->cp1 != NULL)) { d1 = hypot(c_item->cp2->x - c_item->point->x, c_item->cp2->y - c_item->point->y); d2 = hypot(c_item->nextlp->cp1->x - c_item->point->x, c_item->nextlp->cp1->y - c_item->point->y); if ((d2 > 0) && (d1 > 0)) { a1 = atan2(c_item->cp2->y - c_item->point->y, c_item->cp2->x - c_item->point->x) / 3.14159265358979323338 * 180.0; a2 = atan2(c_item->point->y - c_item->nextlp->cp1->y, c_item->point->x - c_item->nextlp->cp1->x) / 3.14159265358979323338 * 180.0; if (a2 - a1 > 180.0) a2 -= 360; if (a2 - a1 < -180.0) a2 += 360; if ((a2 > a1 + 5.0) || (a2 < a1 - 5.0)) c_item->smooth = TT_FALSE; } } } c_item = c_item->nextlp; } } #define thline_type_export_mp(type,mid) case type: \ macroid = mid; \ break; bool thline::export_mp(class thexpmapmpxs * out) { if (this->first_point == NULL) return(false); bool postprocess = true, todraw, fsize, frot, anypt; //, first int from, to, cs, macroid = -1, omacroid = -1; double s1, r1; thdb2dlp * lp; th2ddataobject::export_mp(out); if (out->file != NULL) { if (thisnan(this->m_height)) { fprintf(out->file,"ATTR__height := -1;\n"); } else { fprintf(out->file,"ATTR__height := %.2f;\n", this->m_height); } } switch (this->type) { case TT_LINE_TYPE_WALL: from = 0; to = 0; lp = this->first_point; while (lp != NULL) { cs = lp->subtype; todraw = (lp->nextlp != NULL); while ((lp != NULL) && (lp->subtype == cs)) { to++; lp = lp->nextlp; } if (todraw) { macroid = SYML_UNDEFINED; switch (cs) { thline_type_export_mp(TT_LINE_SUBTYPE_INVISIBLE, SYML_WALL_INVISIBLE) thline_type_export_mp(TT_LINE_SUBTYPE_BEDROCK, SYML_WALL_BEDROCK) thline_type_export_mp(TT_LINE_SUBTYPE_SAND, SYML_WALL_SAND) thline_type_export_mp(TT_LINE_SUBTYPE_CLAY, SYML_WALL_CLAY) thline_type_export_mp(TT_LINE_SUBTYPE_PEBBLES, SYML_WALL_PEBBLES) thline_type_export_mp(TT_LINE_SUBTYPE_DEBRIS, SYML_WALL_DEBRIS) thline_type_export_mp(TT_LINE_SUBTYPE_BLOCKS, SYML_WALL_BLOCKS) thline_type_export_mp(TT_LINE_SUBTYPE_ICE, SYML_WALL_ICE) thline_type_export_mp(TT_LINE_SUBTYPE_FLOWSTONE, SYML_WALL_FLOWSTONE) thline_type_export_mp(TT_LINE_SUBTYPE_MOONMILK, SYML_WALL_MOONMILK) thline_type_export_mp(TT_LINE_SUBTYPE_UNDERLYING, SYML_WALL_UNDERLYING) thline_type_export_mp(TT_LINE_SUBTYPE_OVERLYING, SYML_WALL_OVERLYING) thline_type_export_mp(TT_LINE_SUBTYPE_UNSURVEYED, SYML_WALL_UNSURVEYED) thline_type_export_mp(TT_LINE_SUBTYPE_PRESUMED, SYML_WALL_PRESUMED) thline_type_export_mp(TT_LINE_SUBTYPE_PIT, SYML_WALL_PIT) } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (out->symset->is_assigned(macroid)) { if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(",out->symset->get_mp_macro(omacroid)); this->export_path_mp(out,from,to); fprintf(out->file,");\n"); if (out->layout->is_debug_joins()) { fprintf(out->file,"l_debug(1,1,"); this->export_path_mp(out,from,to,1); fprintf(out->file,");\n"); } if (out->layout->is_debug_stations()) { fprintf(out->file,"l_debug(0,1,"); this->export_path_mp(out,from,to,0); fprintf(out->file,");\n"); } } } from = to; } postprocess = false; break; case TT_LINE_TYPE_LABEL: macroid = SYML_LABEL; omacroid = macroid; if (this->context >= 0) macroid = this->context; if ((this->text == NULL) || (!out->symset->is_assigned(macroid))) { postprocess = false; break; } if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"l_label(btex "); switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; default: fprintf(out->file,"\\thnormalsize "); } //thdecode(&(this->db->buff_enc),TT_ISO8859_2,this->text); fprintf(out->file,"%s etex,",ths2tex(this->text, out->layout->lang, true).c_str()); this->export_path_mp(out); fprintf(out->file,");\n"); postprocess = false; break; case TT_LINE_TYPE_CONTOUR: macroid = SYML_CONTOUR; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) { postprocess = false; break; } if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, SYML_CONTOUR); fprintf(out->file,"%s(",out->symset->get_mp_macro(SYML_CONTOUR)); this->export_path_mp(out); from = 0; if ((this->tags & TT_LINE_TAG_GRADIENT_NONE) > 0) { fprintf(out->file,",-3"); } else if ((this->tags & TT_LINE_TAG_GRADIENT_CENTER) > 0) { fprintf(out->file,",-2"); } else if ((this->tags & TT_LINE_TAG_GRADIENT_POINT) > 0) { lp = this->first_point; while (lp != NULL) { if ((lp->tags & TT_LINEPT_TAG_GRADIENT) > 0) fprintf(out->file,",%d",from); lp = lp->nextlp; from++; } } else { fprintf(out->file,",-1"); } fprintf(out->file,");\n"); postprocess = false; break; case TT_LINE_TYPE_SLOPE: macroid = SYML_SLOPE; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) { postprocess = false; break; } s1 = 0.0; r1 = -1.0; // najde prvu rotaciu a velkost lp = this->first_point; fsize = true; frot = true; while ((lp != NULL) && (fsize || frot)) { if ((lp->tags & TT_LINEPT_TAG_SIZE) > 0) if (fsize) { s1 = lp->lsize; fsize = false; } if ((lp->tags & TT_LINEPT_TAG_ORIENT) > 0) if (frot) { r1 = lp->orient + out->rr; frot = false; } lp = lp->nextlp; } if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, SYML_SLOPE); fprintf(out->file,"%s(",out->symset->get_mp_macro(SYML_SLOPE)); this->export_path_mp(out); fprintf(out->file,",%d", ((this->tags & TT_LINE_TAG_BORDER) > 0 ? 1 : 0)); // vypise prvy bod fprintf(out->file,",(0,%g,%g)",(r1 < 0.0 ? -1 : r1),s1 * out->ms); // vypise ostatne body lp = this->first_point->nextlp; from = 1; while (lp != NULL) { if ((lp->tags & (TT_LINEPT_TAG_SIZE | TT_LINEPT_TAG_ORIENT)) > 0) { // cislo bodu fprintf(out->file,",(%d,",from); // orientacia if ((lp->tags & TT_LINEPT_TAG_ORIENT) > 0) { r1 = lp->orient + out->rr; fprintf(out->file,"%g,",lp->orient + out->rr); } else { if (lp->nextlp != NULL) fprintf(out->file,"-1,"); else fprintf(out->file,"%g,",(r1 < 0.0 ? -1.0 : r1)); } // velkost if ((lp->tags & TT_LINEPT_TAG_SIZE) > 0) { s1 = lp->lsize; fprintf(out->file,"%g)",lp->lsize * out->ms); } else { if (lp->nextlp != NULL) fprintf(out->file,"-1)"); else fprintf(out->file,"%g)",s1 * out->ms); } } else if (lp->nextlp == NULL) { // vypise posledny bod fprintf(out->file,",(%d,%g,%g)",from,(r1 < 0.0 ? -1.0 : r1),s1 * out->ms); } lp = lp->nextlp; from++; } // vypise prvy bod fprintf(out->file,");\n"); postprocess = false; break; thline_type_export_mp(TT_LINE_TYPE_PIT, SYML_PIT) thline_type_export_mp(TT_LINE_TYPE_MAP_CONNECTION, SYML_MAPCONNECTION) thline_type_export_mp(TT_LINE_TYPE_CEILING_STEP, SYML_CEILINGSTEP) thline_type_export_mp(TT_LINE_TYPE_CEILING_MEANDER, SYML_CEILINGMEANDER) thline_type_export_mp(TT_LINE_TYPE_FLOOR_STEP, SYML_FLOORSTEP) thline_type_export_mp(TT_LINE_TYPE_FLOOR_MEANDER, SYML_FLOORMEANDER) thline_type_export_mp(TT_LINE_TYPE_OVERHANG, SYML_OVERHANG) thline_type_export_mp(TT_LINE_TYPE_CHIMNEY, SYML_CHIMNEY) thline_type_export_mp(TT_LINE_TYPE_FLOWSTONE, SYML_FLOWSTONE) thline_type_export_mp(TT_LINE_TYPE_MOONMILK, SYML_MOONMILK) thline_type_export_mp(TT_LINE_TYPE_ROCK_BORDER, SYML_ROCKBORDER) thline_type_export_mp(TT_LINE_TYPE_ROCK_EDGE, SYML_ROCKEDGE) thline_type_export_mp(TT_LINE_TYPE_GRADIENT, SYML_GRADIENT) thline_type_export_mp(TT_LINE_TYPE_U, SYML_U) thline_type_export_mp(TT_LINE_TYPE_HANDRAIL, SYML_HANDRAIL) thline_type_export_mp(TT_LINE_TYPE_ROPE, SYML_ROPE) thline_type_export_mp(TT_LINE_TYPE_ROPE_LADDER, SYML_ROPELADDER) thline_type_export_mp(TT_LINE_TYPE_FIXED_LADDER, SYML_FIXEDLADDER) thline_type_export_mp(TT_LINE_TYPE_STEPS, SYML_STEPS) thline_type_export_mp(TT_LINE_TYPE_VIA_FERRATA, SYML_VIAFERRATA) case TT_LINE_TYPE_ARROW: macroid = SYML_ARROW; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) { postprocess = false; break; } if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, SYML_ARROW); fprintf(out->file,"%s(",out->symset->get_mp_macro(SYML_ARROW)); this->export_path_mp(out); from = 0; if ((this->tags & TT_LINE_TAG_HEAD_BEGIN) > 0) from += 1; if ((this->tags & TT_LINE_TAG_HEAD_END) > 0) from += 2; fprintf(out->file,",%d);\n",from); postprocess = false; break; case TT_LINE_TYPE_SECTION: macroid = SYML_SECTION; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) { postprocess = false; break; } if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, SYML_SECTION); fprintf(out->file,"%s(",out->symset->get_mp_macro(SYML_SECTION)); this->export_path_mp(out); anypt = false; if ((this->tags & TT_LINE_TAG_DIRECTION_BEGIN) > 0) { fprintf(out->file,",0"); anypt = true; }; from = 0; lp = this->first_point; while (lp != NULL) { if (((lp->tags & TT_LINEPT_TAG_DIRECTION) > 0) && ((this->tags & TT_LINE_TAG_DIRECTION_POINT) > 0)) { fprintf(out->file,",%d",from); anypt = true; } lp = lp->nextlp; from++; } if ((this->tags & TT_LINE_TAG_DIRECTION_END) > 0) { fprintf(out->file,",%d",(from - 1)); anypt = true; }; if (!anypt) fprintf(out->file,","); fprintf(out->file,");\n"); postprocess = false; break; case TT_LINE_TYPE_BORDER: from = 0; to = 0; lp = this->first_point; while (lp != NULL) { cs = lp->subtype; todraw = (lp->nextlp != NULL); while ((lp != NULL) && (lp->subtype == cs)) { to++; lp = lp->nextlp; } if (todraw) { macroid = SYML_BORDER_VISIBLE; switch (cs) { thline_type_export_mp(TT_LINE_SUBTYPE_TEMPORARY, SYML_BORDER_TEMPORARY) thline_type_export_mp(TT_LINE_SUBTYPE_PRESUMED, SYML_BORDER_PRESUMED) thline_type_export_mp(TT_LINE_SUBTYPE_INVISIBLE, SYML_BORDER_INVISIBLE) } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (out->symset->is_assigned(macroid)) { if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(",out->symset->get_mp_macro(omacroid)); this->export_path_mp(out,from,to); fprintf(out->file,");\n"); if (out->layout->is_debug_joins()) { fprintf(out->file,"l_debug(1,0,"); this->export_path_mp(out,from,to,1); fprintf(out->file,");\n"); } if (out->layout->is_debug_stations()) { fprintf(out->file,"l_debug(0,0,"); this->export_path_mp(out,from,to,0); fprintf(out->file,");\n"); } } } from = to; } postprocess = false; break; case TT_LINE_TYPE_WATER_FLOW: from = 0; to = 0; lp = this->first_point; while (lp != NULL) { cs = lp->subtype; todraw = (lp->nextlp != NULL); while ((lp != NULL) && (lp->subtype == cs)) { to++; lp = lp->nextlp; } if (todraw) { macroid = SYML_WATERFLOW_PERMANENT; switch (cs) { thline_type_export_mp(TT_LINE_SUBTYPE_INTERMITTENT, SYML_WATERFLOW_INTERMITTENT) thline_type_export_mp(TT_LINE_SUBTYPE_CONJECTURAL, SYML_WATERFLOW_CONJECTURAL) } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (out->symset->is_assigned(macroid)) { if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(",out->symset->get_mp_macro(omacroid)); this->export_path_mp(out,from,to); fprintf(out->file,");\n"); } } from = to; } postprocess = false; break; case TT_LINE_TYPE_SURVEY: from = 0; to = 0; lp = this->first_point; while (lp != NULL) { cs = lp->subtype; todraw = (lp->nextlp != NULL); while ((lp != NULL) && (lp->subtype == cs)) { to++; lp = lp->nextlp; } if (todraw) { macroid = SYML_SURVEY_CAVE; switch (cs) { thline_type_export_mp(TT_LINE_SUBTYPE_SURFACE, SYML_SURVEY_SURFACE) } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (out->symset->is_assigned(macroid)) { if (out->file == NULL) return(true); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(",out->symset->get_mp_macro(omacroid)); this->export_path_mp(out,from,to); fprintf(out->file,");\n"); } } from = to; } postprocess = false; break; default: macroid = SYML_UNDEFINED; break; } if (postprocess) { if (macroid < 0) { this->export_path_mp(out); fprintf(out->file,");\n"); } else { omacroid = macroid; if (this->context >= 0) macroid = this->context; if (out->symset->is_assigned(macroid)) { if (out->file == NULL) return(true); if (this->type == TT_LINE_TYPE_U) { out->symset->export_mp_symbol_options(out->file, -1); fprintf(out->file,"l_u_%s(", this->m_subtype_str); this->db->db2d.use_u_symbol(this->get_class_id(), this->m_subtype_str); } else { out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(",out->symset->get_mp_macro(omacroid)); } this->export_path_mp(out); fprintf(out->file,");\n"); if (out->layout->is_debug_joins()) { fprintf(out->file,"l_debug(1,0,"); this->export_path_mp(out,0,-1,1); fprintf(out->file,");\n"); } if (out->layout->is_debug_stations()) { fprintf(out->file,"l_debug(0,0,"); this->export_path_mp(out,0,-1,0); fprintf(out->file,");\n"); } } } } th2ddataobject::export_mp_end(out); return(false); } unsigned thline::export_path_mp(class thexpmapmpxs * out, int from, int to, int dbglevel) { thdb2dlp * lp = this->first_point; thdb2dpt * prev_pt = NULL; // double xt, yt, d; unsigned last = 0; bool dnu = false; while ((lp != NULL) && ((long(last) <= long(to)) || (to < 0))) { if (long(last) == long(from)) { dnu = true; fprintf(out->file,"("); lp->point->export_mp(out,dbglevel); fprintf(out->file,"\n"); if (long(last) == long(to)) { fprintf(out->file," -- "); lp->point->export_mp(out,dbglevel); } prev_pt = lp->point; } else if (dnu) { if ((lp->cp1 != NULL) && (lp->cp2 != NULL)) { fprintf(out->file," .. controls "); lp->cp1->export_mp(out,dbglevel); fprintf(out->file," and "); lp->cp2->export_mp(out,dbglevel); fprintf(out->file," .. "); } else { fprintf(out->file," -- "); } if ((from == 0) && (lp->nextlp == NULL) && (this->is_closed)) fprintf(out->file,"cycle"); else lp->point->export_mp(out,dbglevel); fprintf(out->file,"\n"); } prev_pt = lp->point; lp = lp->nextlp; last++; } if (long(last) > long(from)) { fprintf(out->file,")"); return (last - from); } else { return 0; } } void thline::parse_border(char * ss) { int bd; if (this->type != TT_LINE_TYPE_SLOPE) ththrow(("-border not valid with type %s", thmatch_string(this->type,thtt_line_types))) bd = thmatch_token(ss,thtt_bool); if (bd == TT_UNKNOWN_BOOL) ththrow(("logical value expected -- %s",ss)) if (bd == TT_TRUE) this->tags |= TT_LINE_TAG_BORDER; else this->tags &= ~TT_LINE_TAG_BORDER; } enum { TT_LINE_GRADIENT_UNKNOWN, TT_LINE_GRADIENT_BEGIN, TT_LINE_GRADIENT_END, TT_LINE_GRADIENT_NONE, TT_LINE_GRADIENT_CENTER, TT_LINE_GRADIENT_POINT, TT_LINE_GRADIENT_BOTH, }; static const thstok thtt_line_gradient[] = { {"begin", TT_LINE_GRADIENT_BEGIN}, {"both", TT_LINE_GRADIENT_BOTH}, {"center", TT_LINE_GRADIENT_CENTER}, {"end", TT_LINE_GRADIENT_END}, {"none", TT_LINE_GRADIENT_NONE}, {"point", TT_LINE_GRADIENT_POINT}, {NULL, TT_LINE_GRADIENT_UNKNOWN} }; void thline::parse_gradient(char * ss) { int gd; if (this->type != TT_LINE_TYPE_CONTOUR) ththrow(("-gradient not valid with type %s", thmatch_string(this->type,thtt_line_types))) gd = thmatch_token(ss,thtt_line_gradient); switch (gd) { case TT_LINE_GRADIENT_NONE: this->tags &= ~(TT_LINE_TAG_GRADIENT_NONE | TT_LINE_TAG_GRADIENT_CENTER | TT_LINE_TAG_GRADIENT_POINT); this->tags |= TT_LINE_TAG_GRADIENT_NONE; break; case TT_LINE_GRADIENT_CENTER: this->tags &= ~(TT_LINE_TAG_GRADIENT_NONE | TT_LINE_TAG_GRADIENT_CENTER | TT_LINE_TAG_GRADIENT_POINT); this->tags |= TT_LINE_TAG_GRADIENT_CENTER; break; case TT_LINE_GRADIENT_POINT: if (this->last_point == NULL) ththrow(("no line point specified")) this->tags &= ~(TT_LINE_TAG_GRADIENT_NONE | TT_LINE_TAG_GRADIENT_CENTER | TT_LINE_TAG_GRADIENT_POINT); this->tags |= TT_LINE_TAG_GRADIENT_POINT; this->last_point->tags |= TT_LINEPT_TAG_GRADIENT; break; default: ththrow(("invalid gradient specification -- %s",ss)) break; } } void thline::parse_direction(char * ss) { int gd; if (this->type != TT_LINE_TYPE_SECTION) ththrow(("-direction not valid with type %s", thmatch_string(this->type,thtt_line_types))) gd = thmatch_token(ss,thtt_line_gradient); switch (gd) { case TT_LINE_GRADIENT_NONE: this->tags &= ~(TT_LINE_TAG_DIRECTION_BEGIN | TT_LINE_TAG_DIRECTION_END | TT_LINE_TAG_DIRECTION_POINT); break; case TT_LINE_GRADIENT_BEGIN: this->tags &= ~(TT_LINE_TAG_DIRECTION_END | TT_LINE_TAG_DIRECTION_POINT); this->tags |= TT_LINE_TAG_DIRECTION_BEGIN; break; case TT_LINE_GRADIENT_END: this->tags &= ~(TT_LINE_TAG_DIRECTION_BEGIN | TT_LINE_TAG_DIRECTION_POINT); this->tags |= TT_LINE_TAG_DIRECTION_END; break; case TT_LINE_GRADIENT_BOTH: this->tags &= ~TT_LINE_TAG_DIRECTION_POINT; this->tags |= TT_LINE_TAG_DIRECTION_END | TT_LINE_TAG_DIRECTION_BEGIN; break; case TT_LINE_GRADIENT_POINT: if (this->last_point == NULL) ththrow(("no line point specified")) this->tags &= ~(TT_LINE_TAG_DIRECTION_BEGIN | TT_LINE_TAG_DIRECTION_END); this->tags |= TT_LINE_TAG_DIRECTION_POINT; this->last_point->tags |= TT_LINEPT_TAG_DIRECTION; break; default: ththrow(("invalid direction specification -- %s",ss)) break; } } void thline::parse_head(char * ss) { int gd; if (this->type != TT_LINE_TYPE_ARROW) ththrow(("-direction not valid with type %s", thmatch_string(this->type,thtt_line_types))) gd = thmatch_token(ss,thtt_line_gradient); this->tags &= ~(TT_LINE_TAG_HEAD_BEGIN | TT_LINE_TAG_HEAD_END); switch (gd) { case TT_LINE_GRADIENT_NONE: break; case TT_LINE_GRADIENT_BEGIN: this->tags |= TT_LINE_TAG_HEAD_BEGIN; break; case TT_LINE_GRADIENT_END: this->tags |= TT_LINE_TAG_HEAD_END; break; case TT_LINE_GRADIENT_BOTH: this->tags |= TT_LINE_TAG_HEAD_END | TT_LINE_TAG_HEAD_BEGIN; break; default: ththrow(("invalid head specification -- %s",ss)) break; } } void thline::parse_adjust(char * ss) { if (this->last_point != NULL) this->last_point->adjust = thmatch_token(ss,thtt_line_adjusts); else ththrow(("no line point specified")) if (this->last_point->adjust == TT_LINE_ADJUST_UNKNOWN) ththrow(("invalid adjust specification -- %s",ss)) if ((thdb.cscrapptr->proj->type == TT_2DPROJ_PLAN) && (this->last_point->adjust != TT_LINE_ADJUST_NONE)) ththrow(("adjustment and projection not compatible -- %s",ss)) } void thline::parse_size(int w, char * ss) { int sv; double sz; if (this->last_point == NULL) ththrow(("no line point specified")) const char * sizestr = NULL; switch (w) { case TT_LINE_SIZE: sizestr = "size"; break; case TT_LINE_LSIZE: sizestr = "l-size"; break; case TT_LINE_RSIZE: sizestr = "r-size"; break; } bool ok = false; switch (this->type) { case TT_LINE_TYPE_SLOPE: if ((w == TT_LINE_SIZE) || (w == TT_LINE_LSIZE)) ok = true; break; } if (!ok) ththrow(("%s not valid with type %s", sizestr, thmatch_string(this->type,thtt_line_types))) thparse_double(sv,sz,ss); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",ss)) if (sz < 0.0) ththrow(("negative size -- %s",ss)) switch (this->type) { case TT_LINE_TYPE_SLOPE: this->last_point->lsize = sz; this->last_point->tags |= TT_LINEPT_TAG_SIZE; break; } } void thline::parse_altitude(char * ss) { if (this->type != TT_LINE_TYPE_WALL) ththrow(("-altitude not valid with type %s", thmatch_string(this->type,thtt_line_types))) if (this->last_point == NULL) ththrow(("no line point specified")) thparse_altitude(ss, this->last_point->rsize, this->last_point->lsize); this->last_point->tags |= TT_LINEPT_TAG_ALTITUDE; } void thline::parse_text(char * ss) { if (this->type != TT_LINE_TYPE_LABEL) ththrow(("-text not valid with type %s", thmatch_string(this->type,thtt_line_types))) if (strlen(ss) > 0) this->text = this->db->strstore(ss); } void thline::start_insert() { thdb2dlp * lp; bool fsize; switch (this->type) { case TT_LINE_TYPE_U: if (this->m_subtype_str == NULL) ththrow(("missing subtype specification for line of user defined type")) this->db->db2d.register_u_symbol(this->get_class_id(), this->m_subtype_str); break; case TT_LINE_TYPE_SLOPE: lp = this->first_point; fsize = true; while ((lp != NULL) && fsize) { if ((lp->tags & TT_LINEPT_TAG_SIZE) > 0) if (fsize) { fsize = false; } lp = lp->nextlp; } if (fsize) ththrow(("no slope size specification at any line point")) break; } } void thline::parse_height(char * ss) { switch (this->type) { case TT_LINE_TYPE_PIT: break; case TT_LINE_TYPE_WALL: if (this->csubtype == TT_LINE_SUBTYPE_PIT) break; default: ththrow(("-height not valid with type %s", thmatch_string(this->type,thtt_line_types))) break; } thsplit_words(& this->db->db2d.mbf,ss); int npar = this->db->db2d.mbf.get_size(); char ** pars = this->db->db2d.mbf.get_buffer(); int sv, ux; double dv; thtflength lentf; ux = 0; switch (npar) { case 1: break; case 2: ux = 1; break; default: ththrow(("invalid distance -- %s",ss)) } this->m_height = thnan; thparse_double(sv,dv,pars[0]); if (sv != TT_SV_NUMBER) ththrow(("not a number -- %s", pars[0])) if (dv <= 0.0) ththrow(("nor a positivie number -- %s", pars[0])) if (ux > 0) { lentf.parse_units(pars[ux]); dv = lentf.transform(dv); } this->m_height = dv; } therion/thexpdb.h0000664000175000017500000000451010625655142013063 0ustar useruser/** * @file thexpdb.h * Export class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexpdb_h #define thexpdb_h #include "thexport.h" /** * Model export options. */ enum { TT_EXPDB_OPT_UNKNOWN = 0, ///< Unknown option TT_EXPDB_OPT_FORMAT, ///< Output option. TT_EXPDB_OPT_ENCODING, ///< Output option. }; /** * Options parsing table. */ static const thstok thtt_expdb_opt[] = { {"-enc", TT_EXPDB_OPT_ENCODING}, {"-encoding", TT_EXPDB_OPT_ENCODING}, {"-fmt", TT_EXPDB_OPT_FORMAT}, {"-format", TT_EXPDB_OPT_FORMAT}, {NULL, TT_EXPDB_OPT_UNKNOWN} }; /** * Model export formats. */ enum { TT_EXPDB_FMT_UNKNOWN = 0, ///< Unknown option TT_EXPDB_FMT_SQL, ///< sql }; /** * Format parsing table. */ static const thstok thtt_expdb_fmt[] = { {"sql", TT_EXPDB_FMT_SQL}, {NULL, TT_EXPDB_FMT_UNKNOWN} }; /** * Main export class. */ class thexpdb : public thexport { public: int format, ///< Output format. encoding; void export_sql_file(class thdatabase * dbp); public: thexpdb(); ///< Default constructor. /** * Parse model export options. */ virtual void parse_options(int & argx, int nargs, char ** args); /** * Dump object into file. */ virtual void dump_body(FILE * xf); /** * Dump object into file. */ virtual void dump_header(FILE * xf); /** * Make export. */ virtual void process_db(class thdatabase * dbp); }; #endif therion/thobjectsrc.h0000664000175000017500000000277110721175560013744 0ustar useruser/** * @file thobjectsrc.h * Object source class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thobjectsrc_h #define thobjectsrc_h #include /** * Object source class. */ class thobjectsrc { public: const char * name; ///< File name. unsigned long line; ///< File line. class thdataobject * context; ///< Source context. /** * Standard constructor. */ thobjectsrc() : name(""), line(0), context(NULL) {} /** * Parametric constructor. */ thobjectsrc(const char * n, unsigned long ln) : name(n), line(ln), context(NULL) {} bool is_valid(); }; #endif therion/thcsdata.tcl0000775000175000017500000002311012447656352013563 0ustar useruser#! /usr/bin/tclsh proc load_proj_init_file_add {name spec desc} { global proj_specs regsub -all {\+?no\_defs} $spec {} spec regsub -all {\s+\<\>} $spec { } spec regsub -all {\s+\+?} $spec { } spec regsub {\s+$} $spec {} spec regsub -all {(\s+)} $spec { +} spec regsub {^\s+} $spec {} spec regsub {longlat} $spec {latlong} spec if {[regexp {proj\=latlong} $spec]} { set options {dms} } else { set options {output} } lappend proj_specs [list $name $options $spec {} $desc] } proc load_proj_init_file {fn shortcut} { set active_comment {} set active_name {} set active_spec { } set fid [open $fn r] while {![eof $fid]} { gets $fid line regexp {^\s*\#\s*(.*)$} $line dum active_comment regsub {\s*\#.*$} $line {} line if {[string length $active_name] == 0} { if {[regexp {^\s*\<(\S+)\>} $line dum id]} { set active_name [string tolower "$shortcut:$id"] regsub {^\s*\<\S+\>\s*} $line {} line } } if {[string length $active_name] > 0} { append active_spec $line if {[regexp {\s+\<\>} $line]} { load_proj_init_file_add $active_name $active_spec $active_comment set active_name {} set active_spec { } } } } close $fid load_proj_init_file_add $active_name $active_spec $active_comment } # <.PRJ definition> set proj_specs { {{long-lat} {dms} "+proj=latlong +datum=WGS84" {GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]} {}} {{lat-long} {dms swap} "+proj=latlong +datum=WGS84" {} {}} {{jtsk} {} "+proj=krovak +czech +ellps=bessel +towgs84=570.8285,85.6769,462.842,4.9984,1.5867,5.2611,3.5623" {PROJCS["S-JTSK_Krovak",GEOGCS["GCS_S_JTSK",DATUM["D_S_JTSK",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Krovak"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Pseudo_Standard_Parallel_1",78.5],PARAMETER["Scale_Factor",0.9999],PARAMETER["Azimuth",30.28813975277778],PARAMETER["Longitude_Of_Center",24.83333333333333],PARAMETER["Latitude_Of_Center",49.5],PARAMETER["X_Scale",1.0],PARAMETER["Y_Scale",1.0],PARAMETER["XY_Plane_Rotation",0.0],UNIT["Meter",1.0]]} {}} {{jtsk03} {} "+proj=krovak +czech +ellps=bessel +towgs84=485.021,169.465,483.839,7.786342,4.397554,4.102655,0" {} {}} {{ijtsk} {output} "+proj=krovak +ellps=bessel +towgs84=570.8285,85.6769,462.842,4.9984,1.5867,5.2611,3.5623" {PROJCS["S-JTSK_Krovak_East_North",GEOGCS["GCS_S_JTSK",DATUM["D_S_JTSK",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Krovak"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Pseudo_Standard_Parallel_1",78.5],PARAMETER["Scale_Factor",0.9999],PARAMETER["Azimuth",30.28813975277778],PARAMETER["Longitude_Of_Center",24.83333333333333],PARAMETER["Latitude_Of_Center",49.5],PARAMETER["X_Scale",-1.0],PARAMETER["Y_Scale",1.0],PARAMETER["XY_Plane_Rotation",90.0],UNIT["Meter",1.0]]} {}} {{ijtsk03} {output} "+proj=krovak +ellps=bessel +towgs84=485.021,169.465,483.839,7.786342,4.397554,4.102655,0" {PROJCS["S-JTSK_Krovak",GEOGCS["GCS_S_JTSK",DATUM["D_S_JTSK",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Krovak"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Pseudo_Standard_Parallel_1",78.5],PARAMETER["Scale_Factor",0.9999],PARAMETER["Azimuth",30.28813975277778],PARAMETER["Longitude_Of_Center",24.83333333333333],PARAMETER["Latitude_Of_Center",49.5],PARAMETER["X_Scale",1.0],PARAMETER["Y_Scale",1.0],PARAMETER["XY_Plane_Rotation",0.0],UNIT["Meter",1.0]]} {}} {{s-merc} {output} {+proj=merc +latts=0 +lon0=0 +k=1 +x0=0 +y0=0 +a=6378137 +b=6378137 +units=m +nadgrids=\\@null +no_defs} {} {}} {{eur79z30} {output} "+proj=utm +zone=30 +ellps=intl +towgs84=-86,-98,-119,0,0,0,0 +no_defs" {} {}} } # {{OSGB:ST} {output} {+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=100000 +y_0=-200000 +ellps=airy +datum=OSGB36 +units=m +no_defs} {} {}} # {{OSGB:SN} {output} {+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=200000 +y_0=-300000 +ellps=airy +datum=OSGB36 +units=m +no_defs} {} {}} # add UTM projections for {set zone 1} {$zone <= 60} {incr zone} { lappend proj_specs [list [format "utm%dn utm%d" $zone $zone $zone $zone $zone] {output} "+proj=utm +zone=$zone +ellps=WGS84 +datum=WGS84 +units=m" [format {PROJCS["WGS_1984_UTM_Zone_%dN",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",%.1f],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]} $zone [expr double($zone * 6 - 183)]] [format "WGS84 / UTM zone %dN" $zone]] lappend proj_specs [list [format "utm%ds" $zone $zone $zone] {output} "+proj=utm +zone=$zone +south +ellps=WGS84 +datum=WGS84 +units=m" [format {PROJCS["WGS_1984_UTM_Zone_%dS",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",10000000.0],PARAMETER["Central_Meridian",%.1f],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]} $zone [expr double($zone * 6 - 183)]] [format "WGS84 / UTM zone %dS" $zone]] } set osgb1 { {S T} {N O} {H} } set osgb2 { {V W X Y Z} {Q R S T U} {L M N O P} {F G H J K} {A B C D E} } set yy -1 foreach al $osgb1 { set xx 4 foreach a $al { set y $yy foreach bl $osgb2 { set x $xx foreach b $bl { lappend proj_specs [list "OSGB:$a$b" {output} "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=[expr $x * 100000] +y_0=[expr $y * 100000] +ellps=airy +datum=OSGB36 +units=m +no_defs" {} "OSGB:$a$b"] set x [expr $x - 1] } set y [expr $y - 1] } set xx [expr $xx - 5] } set yy [expr $yy - 5] } set osgbspecs {{ST 1 -2} {SN 2 -3} {} {} {} {}} load_proj_init_file extern/proj4/nad/epsg epsg load_proj_init_file extern/proj4/nad/esri esri # join identical projections array set proj_defs {} set new_proj_specs {} foreach prj $proj_specs { if {[info exists proj_defs([lindex $prj 2])]} { set px $proj_defs([lindex $prj 2]) set orig_prj [lindex $new_proj_specs $px] # add identifiers foreach id [lindex $prj 0] { if {[lsearch -exact [lindex $orig_prj 0] $id] == -1} { lset orig_prj 0 "[lindex $orig_prj 0] $id" } } # replace PRJ spec if {[string length [lindex $orig_prj 3]] == 0} { lset orig_prj 3 [lindex $prj 3] } if {[string length [lindex $orig_prj 4]] == 0} { lset orig_prj 4 [lindex $prj 4] } lset new_proj_specs $px $orig_prj } else { set proj_defs([lindex $prj 2]) [llength $new_proj_specs] lappend new_proj_specs $prj } } set proj_specs $new_proj_specs # create parsing table set proj_parse {{local TTCS_LOCAL}} set proj_enum {} foreach prj $proj_specs { set id0 [lindex [lindex $prj 0] 0] set enm [format "TTCS_%s" [string toupper $id0]] regsub -all {[\:\-]} $enm "_" enm lappend proj_enum $enm foreach id [lindex $prj 0] { lappend proj_parse [list [string toupper $id] $enm] } } # write header file and parsing table set fid [open "thcsdata.h" w] puts $fid {/** * @file thcsdata.h * Coordinate systems data. * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #ifndef thcsdata_h #define thcsdata_h #include "thparse.h" /** * CS tokens. */ } puts $fid "enum \{\n TTCS_UNKNOWN = -2,\n TTCS_LOCAL = -1," foreach e $proj_enum { puts $fid " $e," } puts $fid "\};" puts $fid { /** * CS data structure. */ } puts $fid "typedef struct \{\n bool dms, output, swap;\n const char * params; const char * prjspec; const char * prjname;\n\} thcsdata;\n" puts $fid "extern const thstok thtt_cs\[[expr [llength $proj_parse] + 1]\];\n"; puts $fid "extern const thcsdata thcsdata_table\[[llength $proj_specs]\];\n" puts $fid { #endif } close $fid set fid [open "thcsdata.cxx" w] puts $fid {/** * @file thcsdata.cxx * Coordinate systems data. * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #include "thcsdata.h" } puts $fid { /** * CS parsing table. */ } puts $fid "const thstok thtt_cs\[[expr [llength $proj_parse] + 1]\] = \{"; foreach e [lsort -ascii $proj_parse] { puts $fid " \{\"[lindex $e 0]\", [lindex $e 1]\}," } puts $fid " \{NULL, TTCS_UNKNOWN\}\n\};" puts $fid { /** * CS names. */ } puts $fid "const thstok thtt_csnames\[[expr [llength $proj_parse] + 1]\] = \{"; foreach e [lsort -ascii $proj_parse] { puts $fid " \{\"[lindex $e 0]\", [lindex $e 1]\}," } puts $fid " \{NULL, TTCS_UNKNOWN\}\n\};" puts $fid { /** * CS data table. */ } puts $fid "const thcsdata thcsdata_table\[[llength $proj_specs]\] = \{"; foreach p $proj_specs { if {[lsearch -exact [lindex $p 1] output] > -1} {set o_output true} else {set o_output false} if {[lsearch -exact [lindex $p 1] dms] > -1} {set o_dms true; set o_output false} else {set o_dms false} if {[lsearch -exact [lindex $p 1] swap] > -1} {set o_swap true; set o_output false} else {set o_swap false} set prjspec [lindex $p 3] regsub -all {\"} $prjspec {\"} prjspec set prjname [lindex $p 4] regsub -all {\"} $prjname {\"} prjname puts $fid " \{$o_dms, $o_output, $o_swap, \"[lindex $p 2]\", \"$prjspec\"\, \"$prjname\"\}," } puts $fid "\};" close $fid exittherion/thtflength.h0000664000175000017500000000402110754774250013576 0ustar useruser/** * @file thtflength.h * Units transformation class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtflength_h #define thtflength_h #include "thtf.h" #include "thparse.h" enum {TT_TFU_YD, TT_TFU_FT, TT_TFU_IN, TT_TFU_M, TT_TFU_CM, TT_TFU_MM, TT_TFU_UNKNOWN_LENGTH}; static const thstok thtt_tfunits_length[] = { {"centimeter", TT_TFU_CM}, {"centimeters", TT_TFU_CM}, {"centimetre", TT_TFU_CM}, {"centimetres", TT_TFU_CM}, {"cm", TT_TFU_CM}, {"feet", TT_TFU_FT}, {"feets", TT_TFU_FT}, {"ft", TT_TFU_FT}, {"in", TT_TFU_IN}, {"inch", TT_TFU_IN}, {"inches", TT_TFU_IN}, {"m", TT_TFU_M}, {"meter", TT_TFU_M}, {"meters", TT_TFU_M}, {"metres", TT_TFU_M}, {"metric", TT_TFU_M}, {"millimeter", TT_TFU_MM}, {"millimeters", TT_TFU_MM}, {"millimetre", TT_TFU_MM}, {"millimetres", TT_TFU_MM}, {"mm", TT_TFU_MM}, {"yard", TT_TFU_YD}, {"yards", TT_TFU_YD}, {"yd", TT_TFU_YD}, {NULL, TT_TFU_UNKNOWN_LENGTH}, }; /** * Length transformation class. */ class thtflength : public thtf { public: thtflength(); /** * Parse units factor. */ virtual void parse_units(char * ustr); }; #endif therion/thlibrarydata.thcfg0000664000175000017500000000005707777756224015146 0ustar useruserinput lib/layouts.thcfg source lib/therion.th therion/thsketch.cxx0000664000175000017500000000333510625655142013621 0ustar useruser/** * @file thsketch.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "therion.h" #include "thsketch.h" #include "thscrap.h" #include "thwarpp.h" #include "thconfig.h" thsketch::thsketch() { this->m_x = 0.0; this->m_y = 0.0; this->m_warp = NULL; } thsketch::~thsketch() { if (this->m_warp != NULL) this->m_warp->self_delete(); } thpic * thsketch::morph(double scale) { if (this->m_warp == NULL) { switch (thcfg.sketch_warp) { case THSKETCH_WARP_LINEAR: this->m_warp = new thwarplin; break; case THSKETCH_WARP_IDPOINT: this->m_warp = new thwarpinvdist; break; case THSKETCH_WARP_IDLINE: //this->m_warp = new thwarpinvdistln; this->m_warp = new thwarpfastinvdistln; break; default: this->m_warp = new thwarpp; } } return this->m_warp->morph(this, scale); } therion/abisso2th.py0000775000175000017500000000173211222235766013532 0ustar useruser#!/usr/bin/python # # copyright 2009 Martin Budaj import sys,os if len(sys.argv) < 2: print "usage: ss2th " sys.exit() file_in = open(sys.argv[1]); file_out = open(os.path.splitext(sys.argv[1])[0]+'.th', 'w') f_prev = 0 m = 2 print >>file_out, 'centreline' for i,l in enumerate(file_in): if i < 8: continue toks = l.split() if i < 18 and float(toks[0]) < 0 and sum(abs(float(x)) for x in toks[1:4]): print >>file_out, ' fix ', for j in range(4): print >>file_out, toks[j], print >>file_out if i == 18: print >>file_out, ' units clino compass deg' print >>file_out, ' calibrate tape 0 0.01' print >>file_out, ' data normal from to compass clino length' if len(toks) < 9: continue l,s,a,f,t = [float(x) for x in toks[0:5]] if l == s == f == a == t == 0: continue t = m if t==0 else t f = t_prev if f == 0 else f t_prev = t m += 1 print >>file_out, '%8d%8d%8s%8s%8s' % (f,t,a,s,l) print >>file_out, 'endcentreline' therion/thpoint.cxx0000664000175000017500000013033012267532374013472 0ustar useruser/** * @file thpoint.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thpoint.h" #include "thexception.h" #include "thchenc.h" #include "thdatabase.h" #include "thinfnan.h" #include "thexpmap.h" #include "thtflength.h" #include "thtexfonts.h" #include "thdate.h" #include "thscrap.h" #include thpoint::thpoint() { // replace this by setting real properties initialization this->type = TT_POINT_TYPE_UNKNOWN; this->subtype = TT_POINT_SUBTYPE_UNKNOWN; this->point = thdb.db2d.insert_point(); this->cpoint = NULL; this->point->pscrap = thdb.get_current_scrap(); this->station_name.clear(); this->from_name.clear(); this->orient = thnan; this->xsize = thnan; this->ysize = thnan; this->align = TT_POINT_ALIGN_C; this->text = NULL; } thpoint::~thpoint() { if (this->type == TT_POINT_TYPE_DATE) { thdate * dp = (thdate *) this->text; if (dp != NULL) delete dp; this->text = NULL; } } int thpoint::get_class_id() { return TT_POINT_CMD; } bool thpoint::is(int class_id) { if (class_id == TT_POINT_CMD) return true; else return th2ddataobject::is(class_id); } int thpoint::get_cmd_nargs() { // replace by real number of arguments return 3; } const char * thpoint::get_cmd_end() { // insert endcommand if multiline command return NULL; } const char * thpoint::get_cmd_name() { // insert command name here return "point"; } thcmd_option_desc thpoint::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_point_opt); if (id == TT_POINT_UNKNOWN) return th2ddataobject::get_cmd_option_desc(opts); else return thcmd_option_desc(id); } void thpoint::start_insert() { if (this->type == TT_POINT_TYPE_U) { if (this->m_subtype_str == NULL) ththrow(("missing subtype specification for point of user defined type")) this->db->db2d.register_u_symbol(this->get_class_id(), this->m_subtype_str); } } void thpoint::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { double dv; int sv; char * type, * subtype; if (cod.id == 3) cod.id = TT_POINT_TYPE; switch (cod.id) { case 1: case 2: thparse_double(sv,dv,*args); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",*args)) if (cod.id == 1) this->point->x = dv; else this->point->y = dv; break; case TT_POINT_TYPE: th2dsplitTT(*args, &type, &subtype); this->parse_type(type); if (strlen(subtype) > 0) this->parse_subtype(subtype); break; case TT_POINT_VALUE: this->parse_value(*args); break; case TT_POINT_DIST: this->parse_value(*args); break; case TT_POINT_TEXT: thencode(&(this->db->buff_enc), *args, argenc); this->parse_text(this->db->buff_enc.get_buffer()); break; case TT_POINT_EXPLORED: this->parse_explored(*args); break; case TT_POINT_ALIGN: this->parse_align(*args); break; case TT_POINT_SCRAP: if (this->type != TT_POINT_TYPE_SECTION) ththrow(("point not section -- -scrap")) thparse_objectname(this->station_name, & this->db->buff_stations, *args); break; case TT_POINT_XSIZE: ththrow(("-x-size not valid with type %s", thmatch_string(this->type,thtt_point_types))) thparse_double(sv,this->xsize,*args); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",*args)) if (this->xsize <= 0.0) ththrow(("size not positive -- %s",*args)) break; case TT_POINT_SIZE: ththrow(("-size not valid with type %s", thmatch_string(this->type,thtt_point_types))) thparse_double(sv,this->xsize,*args); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",*args)) if (this->xsize <= 0.0) ththrow(("size not positive -- %s",*args)) this->ysize = this->xsize; break; case TT_POINT_YSIZE: ththrow(("-y-size not valid with type %s", thmatch_string(this->type,thtt_point_types))) thparse_double(sv,this->ysize,*args); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",*args)) if (this->ysize <= 0.0) ththrow(("size not positive -- %s",*args)) break; case TT_POINT_ORIENT: switch (this->type) { case TT_POINT_TYPE_STATION: ththrow(("-orientation not valid with type %s", thmatch_string(this->type,thtt_point_types))) } thparse_double(sv,this->orient,*args); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid number -- %s",*args)) if ((this->orient < 0.0) || (this->orient >= 360.0)) ththrow(("orientation out of range -- %s",*args)) break; case TT_POINT_SUBTYPE: this->parse_subtype(*args); break; case TT_POINT_STATION: switch (this->type) { case TT_POINT_TYPE_STATION: case TT_POINT_TYPE_CONTINUATION: thparse_objectname(this->station_name, & this->db->buff_stations, *args, thdb.cscrapptr); break; default: ththrow(("station reference not allowed with this point type")) } break; case TT_POINT_FROM: this->parse_from(*args); break; // if not found, try to set fathers properties default: if (cod.id == TT_2DOBJ_CLIP) { switch (this->type) { case TT_POINT_TYPE_STATION_NAME: case TT_POINT_TYPE_LABEL: case TT_POINT_TYPE_REMARK: case TT_POINT_TYPE_DATE: case TT_POINT_TYPE_ALTITUDE: case TT_POINT_TYPE_HEIGHT: case TT_POINT_TYPE_DIMENSIONS: case TT_POINT_TYPE_MAP_CONNECTION: case TT_POINT_TYPE_PASSAGE_HEIGHT: ththrow(("-clip not valid with type %s", thmatch_string(this->type,thtt_point_types))) break; } } th2ddataobject::set(cod, args, argenc, indataline); } } void thpoint::self_delete() { delete this; } void thpoint::self_print_properties(FILE * outf) { th2ddataobject::self_print_properties(outf); fprintf(outf,"thpoint:\n"); fprintf(outf,"\ttype: %d\n",this->type); fprintf(outf,"\tsubtype: %d\n",this->subtype); fprintf(outf,"\talign: %d\n",this->align); fprintf(outf,"\tpoint: %f,%f (%f,%f,%f,%f)\n",this->point->x, this->point->y, this->point->xt,this->point->yt,this->point->zt,this->point->at); fprintf(outf,"\torientation: %f\n", this->orient); fprintf(outf,"\tx-size: %f\n", this->xsize); fprintf(outf,"\ty-size: %f\n", this->ysize); if (this->type == TT_POINT_TYPE_STATION) { fprintf(outf,"\tstation: "); fprintf(outf,this->station_name); fprintf(outf,"\n\tfrom station: "); fprintf(outf,this->from_name); } // insert intended print of object properties here } void thpoint::parse_type(char * tstr) { this->type = thmatch_token(tstr, thtt_point_types); if (this->type == TT_POINT_TYPE_UNKNOWN) ththrow(("unknown point type -- %s", tstr)) this->xsize = thnan; this->ysize = thnan; switch (this->type) { case TT_POINT_TYPE_DATE: if (this->type == TT_POINT_TYPE_DATE) this->text = (char *) new thdate; break; case TT_POINT_TYPE_ALTITUDE: this->xsize = 0.0; this->ysize = 1.0; break; } } void thpoint::parse_subtype(char * ststr) { if (this->type == TT_POINT_TYPE_UNKNOWN) ththrow(("point type must be specified before subtype")) if (this->type == TT_POINT_TYPE_U) { this->parse_u_subtype(ststr); return; } this->subtype = thmatch_token(ststr, thtt_point_subtypes); if (this->subtype == TT_POINT_SUBTYPE_UNKNOWN) ththrow(("unknown point subtype -- %s", ststr)) // let's check type - subtype bool combok = false; switch (this->type) { case TT_POINT_TYPE_STATION: switch (this->subtype) { case TT_POINT_SUBTYPE_TEMP: case TT_POINT_SUBTYPE_FIXED: case TT_POINT_SUBTYPE_PAINTED: case TT_POINT_SUBTYPE_NATURAL: combok = true; break; } break; case TT_POINT_TYPE_AIR_DRAUGHT: switch (this->subtype) { case TT_POINT_SUBTYPE_UNDEF: case TT_POINT_SUBTYPE_WINTER: case TT_POINT_SUBTYPE_SUMMER: combok = true; break; } break; case TT_POINT_TYPE_WATER_FLOW: switch (this->subtype) { case TT_POINT_SUBTYPE_PERMANENT: case TT_POINT_SUBTYPE_INTERMITTENT: case TT_POINT_SUBTYPE_PALEO: combok = true; break; } break; } if (!combok) ththrow(("invalid point type - subtype combination")) } void thpoint::parse_from(char * estr) { thsplit_words(& this->db->db2d.mbf, estr); int npar = this->db->db2d.mbf.get_size(); char ** pars = this->db->db2d.mbf.get_buffer(); if (npar != 1) ththrow(("invalid from station reference -- %s", estr)) thparse_objectname(this->from_name,& this->db->buff_stations,pars[0],this->fscrapptr); } const char * thpoint_export_mp_align2mp(int a) { switch (a) { case TT_POINT_ALIGN_R: return ".rt"; case TT_POINT_ALIGN_L: return ".lft"; case TT_POINT_ALIGN_T: return ".top"; case TT_POINT_ALIGN_B: return ".bot"; case TT_POINT_ALIGN_BR: return ".lrt"; case TT_POINT_ALIGN_BL: return ".llft"; case TT_POINT_ALIGN_TR: return ".urt"; case TT_POINT_ALIGN_TL: return ".ulft"; default: return ""; } } bool thpoint::export_mp(class thexpmapmpxs * out) { th2ddataobject::export_mp(out); thattr * station_attr = NULL; long station_attr_id = 0; bool postprocess = true, expsym = false; std::string attr_text; int macroid = -1, omacroid = -1, cmark; int postprocess_label = -1; this->db->buff_enc.guarantee(8128); // char * buff = this->db->buff_enc.get_buffer(); double xrr = (thisnan(this->orient) ? out->rr : 0.0); switch(this->type) { case TT_POINT_TYPE_DIMENSIONS: case TT_POINT_TYPE_EXTRA: case TT_POINT_TYPE_MAP_CONNECTION: postprocess = false; break; case TT_POINT_TYPE_LABEL: case TT_POINT_TYPE_REMARK: case TT_POINT_TYPE_STATION_NAME: if (this->text != NULL) { switch (this->type) { case TT_POINT_TYPE_LABEL: macroid = SYMP_LABEL; break; case TT_POINT_TYPE_REMARK: macroid = SYMP_REMARK; break; default: macroid = SYMP_STATIONNAME; break; } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) return(false); if (out->file == NULL) return(true); out->symset->get_mp_macro(omacroid); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"p_label%s(btex ",thpoint_export_mp_align2mp(thdb2d_rotate_align(this->align, xrr))); switch (this->type) { case TT_POINT_TYPE_STATION_NAME: fprintf(out->file,"\\thstationname "); break; case TT_POINT_TYPE_LABEL: fprintf(out->file,"\\thlabel"); break; case TT_POINT_TYPE_REMARK: fprintf(out->file,"\\thremark "); break; } switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; default: fprintf(out->file,"\\thnormalsize "); } fprintf(out->file,"%s etex,", ((this->type == TT_POINT_TYPE_STATION_NAME) && (!this->station_name.is_empty())) ? (const char *) utf2tex(thobjectname__print_full_name(this->station_name.name, this->station_name.psurvey, out->layout->survey_level)) : ths2tex(this->text, out->layout->lang).c_str()); if (this->type == TT_POINT_TYPE_STATION_NAME) postprocess_label = 7; else postprocess_label = 0; } postprocess = false; break; case TT_POINT_TYPE_STATION: switch (this->subtype) { case TT_POINT_SUBTYPE_FIXED: macroid = SYMP_STATION_FIXED; cmark = TT_DATAMARK_FIXED; break; case TT_POINT_SUBTYPE_NATURAL: macroid = SYMP_STATION_NATURAL; cmark = TT_DATAMARK_NATURAL; break; case TT_POINT_SUBTYPE_PAINTED: macroid = SYMP_STATION_PAINTED; cmark = TT_DATAMARK_PAINTED; break; default: macroid = SYMP_STATION_TEMPORARY; cmark = TT_DATAMARK_TEMP; } omacroid = macroid; if (this->context >= 0) macroid = this->context; expsym = out->symset->is_assigned(macroid); if (expsym) out->symset->get_mp_macro(omacroid); { thdb1ds * pst = NULL; std::string commentstr("0"); if (this->station_name.id != 0) { pst = &(this->db->db1d.station_vec[this->station_name.id - 1]); station_attr_id = this->station_name.id; station_attr = &(thdb.db1d.m_station_attr); station_attr->export_mp_object_begin(out->file, station_attr_id); } if (pst != NULL) { #define thexpmatselected_stationflag(flag,mid) if (((pst->flags & flag) == flag) && out->symset->is_assigned(mid)) expsym = true; thexpmatselected_stationflag(TT_STATIONFLAG_ENTRANCE, SYMP_FLAG_ENTRANCE) thexpmatselected_stationflag(TT_STATIONFLAG_SINK, SYMP_FLAG_SINK) thexpmatselected_stationflag(TT_STATIONFLAG_SPRING, SYMP_FLAG_SPRING) thexpmatselected_stationflag(TT_STATIONFLAG_DOLINE, SYMP_FLAG_DOLINE) thexpmatselected_stationflag(TT_STATIONFLAG_DIG, SYMP_FLAG_DIG) thexpmatselected_stationflag(TT_STATIONFLAG_ARCH, SYMP_FLAG_ARCH) thexpmatselected_stationflag(TT_STATIONFLAG_OVERHANG, SYMP_FLAG_OVERHANG) thexpmatselected_stationflag(TT_STATIONFLAG_CONT, SYMP_FLAG_CONTINUATION) thexpmatselected_stationflag(TT_STATIONFLAG_AIRDRAUGHT, SYMP_FLAG_AIRDRAUGHT) thexpmatselected_stationflag(TT_STATIONFLAG_AIRDRAUGHT_SUMMER, SYMP_FLAG_AIRDRAUGHT) thexpmatselected_stationflag(TT_STATIONFLAG_AIRDRAUGHT_WINTER, SYMP_FLAG_AIRDRAUGHT) } if (out->file == NULL) return(expsym); if ((pst != NULL) && (pst->comment != NULL) && (strlen(pst->comment) > 0)) { commentstr = "btex \\thcomment "; commentstr += ths2tex(pst->comment, out->layout->lang); commentstr += " etex"; } if (out->symset->is_assigned(macroid)) out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"p_station("); this->point->export_mp(out); fprintf(out->file,",%d,%s,\"\"", out->symset->is_assigned(macroid) ? cmark : 0, commentstr.c_str() ); #define thexpmat_stationflag(flag,mid,str) if (((pst->flags & flag) == flag) && out->symset->is_assigned(mid)) fprintf(out->file,",\"%s\"", str); if (pst != NULL) { thexpmat_stationflag(TT_STATIONFLAG_ENTRANCE, SYMP_FLAG_ENTRANCE, "entrance") thexpmat_stationflag(TT_STATIONFLAG_SINK, SYMP_FLAG_SINK, "sink") thexpmat_stationflag(TT_STATIONFLAG_SPRING, SYMP_FLAG_SPRING, "spring") thexpmat_stationflag(TT_STATIONFLAG_DOLINE, SYMP_FLAG_DOLINE, "doline") thexpmat_stationflag(TT_STATIONFLAG_DIG, SYMP_FLAG_DIG, "dig") thexpmat_stationflag(TT_STATIONFLAG_ARCH, SYMP_FLAG_ARCH, "arch") thexpmat_stationflag(TT_STATIONFLAG_OVERHANG, SYMP_FLAG_OVERHANG, "overhang") thexpmat_stationflag(TT_STATIONFLAG_CONT, SYMP_FLAG_CONTINUATION, "continuation") thexpmat_stationflag(TT_STATIONFLAG_AIRDRAUGHT, SYMP_FLAG_AIRDRAUGHT, "air-draught") thexpmat_stationflag(TT_STATIONFLAG_AIRDRAUGHT_SUMMER, SYMP_FLAG_AIRDRAUGHT, "air-draught:summer") thexpmat_stationflag(TT_STATIONFLAG_AIRDRAUGHT_WINTER, SYMP_FLAG_AIRDRAUGHT, "air-draught:winter") } fprintf(out->file,");\n"); } if (out->symset->is_assigned(macroid) && out->layout->is_debug_stations()) { fprintf(out->file,"p_debug(0,1,"); this->point->export_mp(out,0); fprintf(out->file,");\n"); } postprocess = false; break; case TT_POINT_TYPE_ALTITUDE: macroid = SYMP_ALTITUDE; if (this->context >= 0) macroid = this->context; if ((!thisnan(this->xsize)) && (out->symset->is_assigned(macroid))) { //sprintf(buff,"%.0f",this->xsize - out->layout->goz); if (out->file == NULL) return(true); out->symset->get_mp_macro(SYMP_ALTITUDE); out->symset->export_mp_symbol_options(out->file, SYMP_ALTITUDE); fprintf(out->file,"p_label%s(btex \\thaltitude ", thpoint_export_mp_align2mp(thdb2d_rotate_align(this->align, xrr))); switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; } fprintf(out->file,"%s etex,", utf2tex(out->layout->units.format_length(this->xsize - out->layout->goz))); postprocess_label = 1; } postprocess = false; break; case TT_POINT_TYPE_HEIGHT: if ((this->tags & (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) != 0) { switch (this->tags & (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) { case TT_POINT_TAG_HEIGHT_P: macroid = SYMP_HEIGHT_POSITIVE; break; case TT_POINT_TAG_HEIGHT_N: macroid = SYMP_HEIGHT_NEGATIVE; break; case TT_POINT_TAG_HEIGHT_U: macroid = SYMP_HEIGHT_UNSIGNED; break; default: return(false); } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) return(false); if (out->file == NULL) return(true); out->symset->get_mp_macro(omacroid); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"p_label%s(btex \\thheight ",thpoint_export_mp_align2mp(thdb2d_rotate_align(this->align, xrr))); switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; } if ((this->tags & TT_POINT_TAG_HEIGHT_P) != 0) fprintf(out->file,"\\thheightpos "); else if ((this->tags & TT_POINT_TAG_HEIGHT_N) != 0) fprintf(out->file,"\\thheightneg "); if (!thisnan(this->xsize)) { //if (double(int(this->xsize)) != this->xsize) // sprintf(buff,"%.1f",this->xsize); //else // sprintf(buff,"%.0f",this->xsize); fprintf(out->file,"%s",utf2tex(out->layout->units.format_human_length(this->xsize))); } this->db->buff_enc.strcpy((this->tags & (TT_POINT_TAG_HEIGHT_PQ | TT_POINT_TAG_HEIGHT_NQ | TT_POINT_TAG_HEIGHT_UQ)) != 0 ? "?" : "" ); fprintf(out->file,"%s etex,",utf2tex(this->db->buff_enc.get_buffer())); postprocess_label = 7; } postprocess = false; break; case TT_POINT_TYPE_DATE: macroid = SYMP_DATE; if (this->context >= 0) macroid = this->context; if ((out->symset->is_assigned(macroid)) && ((this->tags & TT_POINT_TAG_DATE) > 0)) { // ((thdate *)this->text)->print_export_str(); // fprintf(out->file,"Datelabel%s(\"%s\",", // thpoint_export_mp_align2mp(this->align), // ((thdate *)this->text)->get_str()); if (out->file == NULL) return(true); out->symset->get_mp_macro(SYMP_DATE); out->symset->export_mp_symbol_options(out->file, SYMP_DATE); fprintf(out->file,"p_label%s(btex \\thdate ", thpoint_export_mp_align2mp(thdb2d_rotate_align(this->align, xrr))); switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; } fprintf(out->file,"%s etex,", utf2tex(((thdate *)this->text)->get_str(TT_DATE_FMT_LOCALE))); postprocess_label = 0; } postprocess = false; break; case TT_POINT_TYPE_PASSAGE_HEIGHT: if ((this->tags & (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) != 0) { switch (this->tags & (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) { case (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N): macroid = SYMP_PASSAGEHEIGHT_BOTH; break; case TT_POINT_TAG_HEIGHT_P: macroid = SYMP_PASSAGEHEIGHT_POSITIVE; break; case TT_POINT_TAG_HEIGHT_N: macroid = SYMP_PASSAGEHEIGHT_NEGATIVE; break; case TT_POINT_TAG_HEIGHT_U: macroid = SYMP_PASSAGEHEIGHT_UNSIGNED; break; default: return(false); } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) return(false); if (out->file == NULL) return(true); out->symset->get_mp_macro(omacroid); out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"p_label%s(btex ",thpoint_export_mp_align2mp(thdb2d_rotate_align(this->align, xrr))); switch (this->tags & (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N | TT_POINT_TAG_HEIGHT_U)) { case (TT_POINT_TAG_HEIGHT_P | TT_POINT_TAG_HEIGHT_N): fprintf(out->file,"\\thframed \\updown"); postprocess_label = 4; break; case TT_POINT_TAG_HEIGHT_P: fprintf(out->file,"\\thframed "); postprocess_label = 2; break; case TT_POINT_TAG_HEIGHT_N: fprintf(out->file,"\\thframed "); postprocess_label = 3; break; default: fprintf(out->file,"\\thframed "); postprocess_label = 5; break; } if (!thisnan(this->xsize)) { fprintf(out->file,"{"); switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; } fprintf(out->file,"%s}", utf2tex(out->layout->units.format_human_length(this->xsize))); } if (!thisnan(this->ysize)) { fprintf(out->file,"{"); switch (this->scale) { case TT_2DOBJ_SCALE_XL: fprintf(out->file,"\\thhugesize "); break; case TT_2DOBJ_SCALE_L: fprintf(out->file,"\\thlargesize "); break; case TT_2DOBJ_SCALE_S: fprintf(out->file,"\\thsmallsize "); break; case TT_2DOBJ_SCALE_XS: fprintf(out->file,"\\thtinysize "); break; } fprintf(out->file,"%s}", utf2tex(out->layout->units.format_human_length(this->ysize))); } fprintf(out->file," etex,"); } postprocess = false; break; case TT_POINT_TYPE_SECTION: postprocess = false; break; #define thpoint_type_export_mp(type,mid) case type: \ macroid = mid; \ break; // ostatne typy case TT_POINT_TYPE_WATER_FLOW: switch (this->subtype) { thpoint_type_export_mp(TT_POINT_SUBTYPE_PALEO,SYMP_WATERFLOW_PALEO); thpoint_type_export_mp(TT_POINT_SUBTYPE_INTERMITTENT,SYMP_WATERFLOW_INTERMITTENT); default: macroid = SYMP_WATERFLOW_PERMANENT; } break; case TT_POINT_TYPE_AIR_DRAUGHT: switch (this->subtype) { thpoint_type_export_mp(TT_POINT_SUBTYPE_WINTER,SYMP_AIRDRAUGHT_WINTER); thpoint_type_export_mp(TT_POINT_SUBTYPE_SUMMER,SYMP_AIRDRAUGHT_SUMMER); default: macroid = SYMP_AIRDRAUGHT; } break; case TT_POINT_TYPE_CONTINUATION: macroid = SYMP_CONTINUATION; { std::string tmp; if ((this->text != NULL) && (strlen(this->text) > 0)) { if (tmp.length() > 0) tmp += " -- "; tmp += this->text; } if (tmp.length() > 0) { attr_text = "btex \\thcomment "; attr_text += ths2tex(tmp, out->layout->lang); attr_text += "etex"; } } break; // specialne symboly thpoint_type_export_mp(TT_POINT_TYPE_SPRING,SYMP_SPRING) thpoint_type_export_mp(TT_POINT_TYPE_SINK,SYMP_SINK) thpoint_type_export_mp(TT_POINT_TYPE_ENTRANCE,SYMP_ENTRANCE) thpoint_type_export_mp(TT_POINT_TYPE_GRADIENT,SYMP_GRADIENT) // vystroj thpoint_type_export_mp(TT_POINT_TYPE_ROPE,SYMP_ROPE) thpoint_type_export_mp(TT_POINT_TYPE_FIXED_LADDER,SYMP_FIXEDLADDER) thpoint_type_export_mp(TT_POINT_TYPE_ROPE_LADDER,SYMP_ROPELADDER) thpoint_type_export_mp(TT_POINT_TYPE_STEPS,SYMP_STEPS) thpoint_type_export_mp(TT_POINT_TYPE_BRIDGE,SYMP_BRIDGE) thpoint_type_export_mp(TT_POINT_TYPE_TRAVERSE,SYMP_TRAVERSE) thpoint_type_export_mp(TT_POINT_TYPE_NO_EQUIPMENT,SYMP_NOEQUIPMENT) thpoint_type_export_mp(TT_POINT_TYPE_ANCHOR,SYMP_ANCHOR) thpoint_type_export_mp(TT_POINT_TYPE_CAMP,SYMP_CAMP) thpoint_type_export_mp(TT_POINT_TYPE_DIG,SYMP_DIG) thpoint_type_export_mp(TT_POINT_TYPE_HANDRAIL,SYMP_HANDRAIL) thpoint_type_export_mp(TT_POINT_TYPE_VIA_FERRATA,SYMP_VIAFERRATA) // ukoncenia chodby thpoint_type_export_mp(TT_POINT_TYPE_NARROW_END,SYMP_NARROWEND) thpoint_type_export_mp(TT_POINT_TYPE_LOW_END,SYMP_LOWEND) thpoint_type_export_mp(TT_POINT_TYPE_FLOWSTONE_CHOKE,SYMP_FLOWSTONECHOKE) thpoint_type_export_mp(TT_POINT_TYPE_BREAKDOWN_CHOKE,SYMP_BREAKDOWNCHOKE) thpoint_type_export_mp(TT_POINT_TYPE_CLAY_CHOKE,SYMP_CLAYCHOKE) // vypln thpoint_type_export_mp(TT_POINT_TYPE_FLOWSTONE,SYMP_FLOWSTONE) thpoint_type_export_mp(TT_POINT_TYPE_MOONMILK,SYMP_MOONMILK) thpoint_type_export_mp(TT_POINT_TYPE_STALACTITE,SYMP_STALACTITE) thpoint_type_export_mp(TT_POINT_TYPE_STALAGMITE,SYMP_STALAGMITE) thpoint_type_export_mp(TT_POINT_TYPE_PILLAR,SYMP_PILLAR) thpoint_type_export_mp(TT_POINT_TYPE_STALACTITES,SYMP_STALACTITES) thpoint_type_export_mp(TT_POINT_TYPE_STALAGMITES,SYMP_STALAGMITES) thpoint_type_export_mp(TT_POINT_TYPE_PILLARS,SYMP_PILLARS) thpoint_type_export_mp(TT_POINT_TYPE_ICE_STALACTITE,SYMP_ICESTALACTITE) thpoint_type_export_mp(TT_POINT_TYPE_ICE_STALAGMITE,SYMP_ICESTALAGMITE) thpoint_type_export_mp(TT_POINT_TYPE_ICE_PILLAR,SYMP_ICEPILLAR) thpoint_type_export_mp(TT_POINT_TYPE_CURTAIN,SYMP_CURTAIN) thpoint_type_export_mp(TT_POINT_TYPE_HELICTITE,SYMP_HELICTITE) thpoint_type_export_mp(TT_POINT_TYPE_SODA_STRAW,SYMP_SODASTRAW) thpoint_type_export_mp(TT_POINT_TYPE_CRYSTAL,SYMP_CRYSTAL) thpoint_type_export_mp(TT_POINT_TYPE_WALL_CALCITE,SYMP_WALLCALCITE) thpoint_type_export_mp(TT_POINT_TYPE_POPCORN,SYMP_POPCORN) thpoint_type_export_mp(TT_POINT_TYPE_DISK,SYMP_DISK) thpoint_type_export_mp(TT_POINT_TYPE_GYPSUM,SYMP_GYPSUM) thpoint_type_export_mp(TT_POINT_TYPE_GYPSUM_FLOWER,SYMP_GYPSUMFLOWER) thpoint_type_export_mp(TT_POINT_TYPE_ARAGONITE,SYMP_ARAGONITE) thpoint_type_export_mp(TT_POINT_TYPE_CAVE_PEARL,SYMP_CAVEPEARL) thpoint_type_export_mp(TT_POINT_TYPE_RIMSTONE_POOL,SYMP_RIMSTONEPOOL) thpoint_type_export_mp(TT_POINT_TYPE_RIMSTONE_DAM,SYMP_RIMSTONEDAM) thpoint_type_export_mp(TT_POINT_TYPE_ANASTOMOSIS,SYMP_ANASTOMOSIS) thpoint_type_export_mp(TT_POINT_TYPE_KARREN,SYMP_KARREN) thpoint_type_export_mp(TT_POINT_TYPE_SCALLOP,SYMP_SCALLOP) thpoint_type_export_mp(TT_POINT_TYPE_FLUTE,SYMP_FLUTE) thpoint_type_export_mp(TT_POINT_TYPE_RAFT_CONE,SYMP_RAFT) thpoint_type_export_mp(TT_POINT_TYPE_CLAY_TREE,SYMP_CLAYTREE) // plosne vyplne thpoint_type_export_mp(TT_POINT_TYPE_BEDROCK,SYMP_BEDROCK) thpoint_type_export_mp(TT_POINT_TYPE_SAND,SYMP_SAND) thpoint_type_export_mp(TT_POINT_TYPE_RAFT,SYMP_RAFT) thpoint_type_export_mp(TT_POINT_TYPE_CLAY,SYMP_CLAY) thpoint_type_export_mp(TT_POINT_TYPE_PEBBLES,SYMP_PEBBLES) thpoint_type_export_mp(TT_POINT_TYPE_DEBRIS,SYMP_DEBRIS) thpoint_type_export_mp(TT_POINT_TYPE_BLOCKS,SYMP_BLOCKS) thpoint_type_export_mp(TT_POINT_TYPE_WATER,SYMP_WATER) thpoint_type_export_mp(TT_POINT_TYPE_ICE,SYMP_ICE) thpoint_type_export_mp(TT_POINT_TYPE_SNOW,SYMP_SNOW) thpoint_type_export_mp(TT_POINT_TYPE_GUANO,SYMP_GUANO) // ina vypln thpoint_type_export_mp(TT_POINT_TYPE_ARCHEO_MATERIAL,SYMP_ARCHEOMATERIAL) thpoint_type_export_mp(TT_POINT_TYPE_PALEO_MATERIAL,SYMP_PALEOMATERIAL) thpoint_type_export_mp(TT_POINT_TYPE_VEGETABLE_DEBRIS,SYMP_VEGETABLEDEBRIS) thpoint_type_export_mp(TT_POINT_TYPE_ROOT,SYMP_ROOT) thpoint_type_export_mp(TT_POINT_TYPE_U,SYMP_U) default: macroid = SYMP_UNDEFINED; break; } if (postprocess_label >= 0) { this->point->export_mp(out); fprintf(out->file,",%.1f,%d);\n",(thisnan(this->orient) ? 0 : 360.0 - this->orient - out->rr), postprocess_label); } omacroid = macroid; if (this->context >= 0) macroid = this->context; if ((macroid > 0) && postprocess) { if (out->symset->is_assigned(macroid)) { if (out->file == NULL) return(true); if (attr_text.length() > 0) { fprintf(out->file, "picture ATTR__text;\nATTR__text := %s;\n", attr_text.c_str()); } if (this->type == TT_POINT_TYPE_U) { out->symset->export_mp_symbol_options(out->file, -1); fprintf(out->file,"p_u_%s(",this->m_subtype_str); this->db->db2d.use_u_symbol(this->get_class_id(), this->m_subtype_str); } else { out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(",out->symset->get_mp_macro(omacroid)); } } else postprocess = false; } if (postprocess) { this->point->export_mp(out); double scl = 1.0; switch (this->scale) { case TT_2DOBJ_SCALE_L: scl = 1.414; break; case TT_2DOBJ_SCALE_XL: scl = 2.0; break; case TT_2DOBJ_SCALE_S: scl = 0.707; break; case TT_2DOBJ_SCALE_XS: scl = 0.5; break; } const char * al = "(0,0)"; switch (thdb2d_rotate_align(this->align, xrr)) { case TT_POINT_ALIGN_B: al = "(0,-1)"; break; case TT_POINT_ALIGN_T: al = "(0,1)"; break; case TT_POINT_ALIGN_L: al = "(-1,0)"; break; case TT_POINT_ALIGN_R: al = "(1,0)"; break; case TT_POINT_ALIGN_BL: al = "(-1,-1)"; break; case TT_POINT_ALIGN_TL: al = "(-1,1)"; break; case TT_POINT_ALIGN_BR: al = "(1,-1)"; break; case TT_POINT_ALIGN_TR: al = "(1,1)"; break; } fprintf(out->file,",%.1f,%.2f,%s", (thisnan(this->orient) ? 0 : 360 - this->orient - out->rr),scl,al); fprintf(out->file, ");\n"); if (out->layout->is_debug_stations() || out->layout->is_debug_joins()) { fprintf(out->file,"p_debug(-1,0,"); this->point->export_mp(out); fprintf(out->file,");\n"); } if (out->layout->is_debug_joins()) { fprintf(out->file,"p_debug(1,0,"); this->point->export_mp(out,1); fprintf(out->file,");\n"); } if (out->layout->is_debug_stations()) { fprintf(out->file,"p_debug(0,0,"); this->point->export_mp(out,0); fprintf(out->file,");\n"); } if (attr_text.length() > 0) { fprintf(out->file, "save ATTR__text;\n"); } } if (station_attr != NULL) { station_attr->export_mp_object_end(out->file, station_attr_id); } th2ddataobject::export_mp_end(out); return(false); } void thpoint::parse_align(char * tstr) { switch (this->type) { case TT_POINT_TYPE_STATION: ththrow(("-align not valid with type %s", thmatch_string(this->type,thtt_point_types))) break; } this->align = thmatch_token(tstr, thtt_point_aligns); if (this->align == TT_POINT_ALIGN_UNKNOWN) ththrow(("unknown alignment -- %s", tstr)) } void thpoint::parse_text(char * ss) { switch (this->type) { case TT_POINT_TYPE_LABEL: case TT_POINT_TYPE_REMARK: case TT_POINT_TYPE_STATION_NAME: case TT_POINT_TYPE_CONTINUATION: break; default: ththrow(("-text not valid with type %s", thmatch_string(this->type,thtt_point_types))) break; } if (strlen(ss) > 0) this->text = this->db->strstore(ss); else this->text = NULL; } void thpoint::parse_explored(char * ss) { switch (this->type) { case TT_POINT_TYPE_CONTINUATION: break; default: ththrow(("-explored not valid with type %s", thmatch_string(this->type,thtt_point_types))) break; } int sv; thparse_length(sv, this->xsize, ss); if (sv == TT_SV_UNKNOWN) ththrow(("ivalid explored length -- %s", ss)); } void thpoint_parse_value(int & sv, double & dv, bool & qw, int & sign, char * str) { // odstrani znamienka a nastavi sign sign = 0; qw = false; bool error = false; sv = TT_SV_NAN; dv = thnan; if (strlen(str) > 0) { switch (str[0]) { case '+': sign = 1; str++; break; case '-': sign = -1; str++; break; } } else error = true; // skusi odstranit otaznik size_t strl = strlen(str); if ((strl > 0) && (!error)) { if (str[strl-1] == '?') { str[strl-1] = 0; qw = true; } } // parsne cislo if (strlen(str)) { thparse_double(sv,dv,str); if ((sv != TT_SV_NAN) && (sv != TT_SV_NUMBER)) error = true; else if ((sv != TT_SV_NAN) && (dv < 0.0)) error = true; } if ((sv == TT_SV_NAN) && (sign == 0)) error = true; if (error) ththrow(("invalid value -- %s",str)) } void thpoint::parse_value(char * ss) { switch (this->type) { case TT_POINT_TYPE_ALTITUDE: case TT_POINT_TYPE_HEIGHT: case TT_POINT_TYPE_PASSAGE_HEIGHT: case TT_POINT_TYPE_DIMENSIONS: case TT_POINT_TYPE_DATE: case TT_POINT_TYPE_EXTRA: break; default: ththrow(("-value not valid with type %s", thmatch_string(this->type,thtt_point_types))) break; } thsplit_words(& this->db->db2d.mbf,ss); int npar = this->db->db2d.mbf.get_size(); char ** pars = this->db->db2d.mbf.get_buffer(); int sv, ux, vx, sv2; bool parsev, quest, quest2; double dv, dv2; int sign, sign2; thtflength lentf; thdate * dp; switch (this->type) { case TT_POINT_TYPE_EXTRA: ux = 0; parsev = false; switch (npar) { case 1: break; case 2: ux = 1; break; default: ththrow(("invalid distance -- %s",ss)) } this->xsize = thnan; thparse_double(sv,dv,pars[0]); if (sv != TT_SV_NUMBER) ththrow(("not a number -- %s", pars[0])) if (ux > 0) { lentf.parse_units(pars[ux]); dv = lentf.transform(dv); } this->xsize = dv; break; // let's parse altitude case TT_POINT_TYPE_ALTITUDE: thparse_altitude(ss, this->xsize, this->ysize); break; case TT_POINT_TYPE_HEIGHT: ux = 0; parsev = false; switch (npar) { case 1: break; case 2: ux = 1; break; default: ththrow(("invalid value -- %s",ss)) } this->xsize = thnan; this->tags &= ~(TT_POINT_TAG_HEIGHT_ALL); thpoint_parse_value(sv,dv,quest,sign,pars[0]); if ((ux > 0) && (!thisnan(dv))) { lentf.parse_units(pars[ux]); dv = lentf.transform(dv); } if (sign < 0) { this->tags |= TT_POINT_TAG_HEIGHT_N; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_NQ; } else if (sign > 0) { this->tags |= TT_POINT_TAG_HEIGHT_P; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_PQ; } else { this->tags |= TT_POINT_TAG_HEIGHT_U; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_UQ; } this->xsize = dv; break; case TT_POINT_TYPE_DIMENSIONS: this->xsize = thnan; this->ysize = thnan; switch (npar) { case 3: // parse units lentf.parse_units(pars[2]); case 2: thparse_double(sv,dv,pars[0]); if (sv != TT_SV_NUMBER) { ththrow(("invalid above dimension -- %s",pars[0])) } this->xsize = lentf.transform(dv); if (this->xsize < 0.0) ththrow(("negative above dimension -- %s",pars[0])) thparse_double(sv,dv,pars[1]); if (sv != TT_SV_NUMBER) { ththrow(("invalid below dimension -- %s",pars[1])) } this->ysize = lentf.transform(dv); if (this->ysize < 0.0) ththrow(("negative below dimension -- %s",pars[1])) break; default: ththrow(("invalid value -- %s",ss)) } break; case TT_POINT_TYPE_PASSAGE_HEIGHT: ux = 0; vx = 0; parsev = false; switch (npar) { case 1: break; case 2: ux = 1; try { lentf.parse_units(pars[ux]); } catch (...) { ux = 0; vx = 1; } break; case 3: ux = 2; vx = 1; break; default: ththrow(("invalid value -- %s",ss)) } this->xsize = thnan; this->ysize = thnan; this->tags &= ~(TT_POINT_TAG_HEIGHT_ALL); thpoint_parse_value(sv,dv,quest,sign,pars[0]); if (sv != TT_SV_NUMBER) ththrow(("invalid value -- %s",pars[0])) if (vx > 0) { thpoint_parse_value(sv2,dv2,quest2,sign2,pars[vx]); if (sv2 != TT_SV_NUMBER) ththrow(("invalid value -- %s",pars[vx])) if ((sign == 0) || (sign2 == 0) || (sign == sign2)) ththrow(("invalid combination of values -- %s",ss)) } if ((ux > 0) && (!thisnan(dv))) { lentf.parse_units(pars[ux]); dv = lentf.transform(dv); if (vx > 0) dv2 = lentf.transform(dv2); } if (sign < 0) { this->tags |= TT_POINT_TAG_HEIGHT_N; this->ysize = dv; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_NQ; } else if (sign > 0) { this->tags |= TT_POINT_TAG_HEIGHT_P; this->xsize = dv; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_PQ; } else { this->tags |= TT_POINT_TAG_HEIGHT_U; this->xsize = dv; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_UQ; } if (vx > 0) { if (sign2 < 0) { this->tags |= TT_POINT_TAG_HEIGHT_N; this->ysize = dv2; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_NQ; } else if (sign2 > 0) { this->tags |= TT_POINT_TAG_HEIGHT_P; this->xsize = dv2; if (quest) this->tags |= TT_POINT_TAG_HEIGHT_PQ; } } break; case TT_POINT_TYPE_DATE: if (npar != 1) ththrow(("invalid date -- %s",ss)) dp = (thdate *) this->text; dp->parse(pars[0]); this->tags |= TT_POINT_TAG_DATE; break; } } void thpoint::check_extra() { thdb2dcp * cp; if (this->from_name.id == 0) { double mind = -1.0, cd; cp = this->fscrapptr->fcpp; while (cp != NULL) { if (cp->st != NULL) { cd = thvec2(this->point->x - cp->pt->x, this->point->y - cp->pt->y).length(); if (mind < 0.0) { this->from_name.id = cp->st->uid; mind = cd; } else if (cd < mind) { this->from_name.id = cp->st->uid; mind = cd; } } cp = cp->nextcp; } } if (thisnan(this->xsize) && (this->from_name.id > 0)) { size_t myuid; thdb2dcp * mycp; myuid = thdb.db1d.station_vec[this->from_name.id - 1].uid; cp = this->fscrapptr->fcpp; mycp = NULL; double cdist(0.0); size_t ccount(0); while (cp != NULL) { if ((cp->st != NULL) && (cp->st->uid == myuid)) { mycp = cp; break; } cp = cp->nextcp; } if (mycp == NULL) return; thdb1d_tree_node * nodes = thdb.db1d.get_tree_nodes(); thdb1d_tree_arrow * carrow; cp = this->fscrapptr->fcpp; while (cp != NULL) { if ((cp->st != NULL) && (cp->st->uid != myuid)) { carrow = nodes[myuid - 1].first_arrow; while (carrow != NULL) { if (carrow->end_node->uid == cp->st->uid) { bool reverse = false; if (carrow->is_reversed) reverse = !reverse; if (carrow->leg->reverse) reverse = !reverse; thdataleg * cl = carrow->leg->leg; thline2 xl; if (reverse) { xl = thline2( thvec2(mycp->pt->x, mycp->pt->y), thvec2(cp->pt->x, cp->pt->y)); } else { xl = thline2( thvec2(cp->pt->x, cp->pt->y), thvec2(mycp->pt->x, mycp->pt->y)); } ccount++; switch (this->fscrapptr->proj->type) { case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: if (this->point->y > mycp->pt->y) { if (!reverse) cdist += cl->from_up; else cdist += cl->to_up; } else { if (!reverse) cdist += cl->from_down; else cdist += cl->to_down; } break; default: if (xl.eval(thvec2(this->point->x, this->point->y)) < 0.0) { if (!reverse) cdist += cl->from_left; else cdist += cl->to_left; } else { if (!reverse) cdist += cl->from_right; else cdist += cl->to_right; } } } carrow = carrow->next_arrow; } } cp = cp->nextcp; } if (ccount > 0) this->xsize = cdist / double(ccount); } } therion/thlegenddata.cxx0000664000175000017500000000322610625655142014427 0ustar useruser/** * @file thpdfdata.cxx */ /* Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include #include "thlegenddata.h" using namespace std; legenddata::legenddata() { legendtitle = "Legenda"; colorlegendtitle = "Legenda hlbok"; cavename = "Jaskyna MN"; comment = "komentar"; copyrights = "(c) ja"; cavelengthtitle = "Dlzka"; cavelength = "124324"; cavedepthtitle = "Hlbka"; cavedepth = "3243"; explotitle = "Objavili"; explodate = "2004"; exploteam = "A B C"; topotitle = "Zamerali"; topodate = "2005"; topoteam = "D E F"; cartotitle = "Kreslil"; cartodate = "2006"; cartoteam = "G"; northarrow = true; scalebar = true; } //void legenddata::print_tex() { //} //void legenddata::print_svg() { //} therion/thsvxctrl.cxx0000664000175000017500000004673112042433266014050 0ustar useruser/** * @file thsvxctrl.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thsvxctrl.h" #include "thdatabase.h" #include "thdataleg.h" #include "thtmpdir.h" #include "thdata.h" #include "thexception.h" #include "thdatabase.h" #include "thinfnan.h" #include "thinit.h" #include "thconfig.h" #include #include #include "thsurvey.h" #include "thcs.h" #include "thlogfile.h" #include "extern/img.h" #include #ifdef THMSVC #include #define getcwd _getcwd #endif #define THPI 3.1415926535898 thsvxctrl::thsvxctrl() { this->pdl.clear(); this->svxf_ln = 1; } thsvxctrl::~thsvxctrl() { } void thsvxctrl::write_double(double dd) { if (thisnan(dd)) { fprintf(this->svxf,"\t-"); return; } switch (thisinf(dd)) { case -1: fprintf(this->svxf,"\tdown"); break; case 1: fprintf(this->svxf,"\tup"); break; default: fprintf(this->svxf,"\t%f",dd); break; } } void thsvxctrl::write_survey_leg(thdataleg * legp) { // first let's check infer if (this->pdl.infer_plumbs != legp->infer_plumbs) { fprintf(this->svxf,"*infer plumbs %s\n",(legp->infer_plumbs ? "on" : "off")); this->svxf_ln++; } if (this->pdl.infer_equates != legp->infer_equates) { fprintf(this->svxf,"*infer equates %s\n",(legp->infer_equates ? "on" : "off")); this->svxf_ln++; } // let's check standard deviations if ( (((!thisnan(this->pdl.length_sd)) || (!thisnan(legp->length_sd))) && (this->pdl.length_sd != legp->length_sd)) || // (((!thisnan(this->pdl.counter_sd)) || (!thisnan(legp->counter_sd))) && // (this->pdl.counter_sd != legp->counter_sd)) // || (((!thisnan(this->pdl.depth_sd)) || (!thisnan(legp->depth_sd))) && (this->pdl.depth_sd != legp->depth_sd)) || (((!thisnan(this->pdl.bearing_sd)) || (!thisnan(legp->bearing_sd))) && (this->pdl.bearing_sd != legp->bearing_sd)) || (((!thisnan(this->pdl.gradient_sd)) || (!thisnan(legp->gradient_sd))) && (this->pdl.gradient_sd != legp->gradient_sd)) || (((!thisnan(this->pdl.dx_sd)) || (!thisnan(legp->dx_sd))) && (this->pdl.dx_sd != legp->dx_sd)) || (((!thisnan(this->pdl.dy_sd)) || (!thisnan(legp->dy_sd))) && (this->pdl.dy_sd != legp->dy_sd)) || (((!thisnan(this->pdl.dz_sd)) || (!thisnan(legp->dz_sd))) && (this->pdl.dz_sd != legp->dz_sd)) ) { fprintf(this->svxf,"*sd default\n"); this->svxf_ln++; if (!(thisnan(legp->length_sd))) { fprintf(this->svxf,"*sd tape %f metres\n", legp->length_sd); this->svxf_ln++; } // if (!(thisnan(legp->counter_sd))) { // fprintf(this->svxf,"*sd counter %f metres\n", legp->counter_sd); // this->svxf_ln++; // } if (!(thisnan(legp->depth_sd))) { fprintf(this->svxf,"*sd depth %f metres\n", legp->depth_sd); this->svxf_ln++; } if (!(thisnan(legp->bearing_sd))) { fprintf(this->svxf,"*sd compass %f degrees\n", legp->bearing_sd); this->svxf_ln++; } if (!(thisnan(legp->gradient_sd))) { fprintf(this->svxf,"*sd clino %f degrees\n", legp->gradient_sd); this->svxf_ln++; } if (!(thisnan(legp->dx_sd))) { fprintf(this->svxf,"*sd dx %f metres\n", legp->dx_sd); this->svxf_ln++; } if (!(thisnan(legp->dy_sd))) { fprintf(this->svxf,"*sd dy %f metres\n", legp->dy_sd); this->svxf_ln++; } if (!(thisnan(legp->dz_sd))) { fprintf(this->svxf,"*sd dz %f metres\n", legp->dz_sd); this->svxf_ln++; } } if (this->pdl.data_type != legp->data_type) { switch (legp->data_type) { case TT_DATATYPE_NORMAL: fprintf(this->svxf,"*data\tnormal\tfrom\tto\ttape\tcompass\tclino\n"); this->svxf_ln++; break; case TT_DATATYPE_DIVING: fprintf(this->svxf,"*data\tdiving"); case TT_DATATYPE_CYLPOLAR: if (legp->data_type != TT_DATATYPE_DIVING) fprintf(this->svxf,"*data\tcylpolar"); fprintf(this->svxf,"\tfrom\tto\ttape\tcompass\tdepthchange\n"); this->svxf_ln++; break; case TT_DATATYPE_CARTESIAN: fprintf(this->svxf,"*data\tcartesian\tfrom\tto\tnorthing\teasting\taltitude\n"); this->svxf_ln++; break; case TT_DATATYPE_NOSURVEY: fprintf(this->svxf,"*data\tnosurvey\tfrom\tto\n"); this->svxf_ln++; break; } } double leggridmc; leggridmc = 0.0; if (legp->gridcs != TTCS_LOCAL) { if (legp->gridcs != this->lastleggridmccs) { if (legp->gridcs == thcfg.outcs) { this->lastleggridmc = this->meridian_convergence; } else { this->lastleggridmc = thcfg.get_cs_convergence(legp->gridcs); } this->lastleggridmccs = legp->gridcs; } leggridmc = this->lastleggridmc; } // recalculate declination if necessary double legp_bearing = legp->bearing; double legp_dx = legp->dx; double legp_dy = legp->dy; double legp_declin = (this->meridian_convergence - leggridmc + (!thisnan(legp->declination) ? legp->declination : legp->implicit_declination)); if (legp_declin != 0.0) { switch (legp->data_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: if (!thisnan(legp_bearing)) { legp_bearing += legp_declin; if (legp_bearing >= 360.0) legp_bearing -= 360.0; if (legp_bearing < 0.0) legp_bearing += 360.0; } break; case TT_DATATYPE_CARTESIAN: double cosdecl = cos(legp_declin/180*THPI), sindecl = sin(legp_declin/180*THPI); legp_dx = (cosdecl * legp->dx) + (sindecl * legp->dy); legp_dy = (cosdecl * legp->dy) - (sindecl * legp->dx); break; } } // now print the data // first stations if (legp->direction) fprintf(this->svxf, "\t%ld\t%ld", legp->from.id, legp->to.id); else fprintf(this->svxf, "\t%ld\t%ld", legp->to.id, legp->from.id); // then data switch (legp->data_type) { case TT_DATATYPE_NORMAL: this->write_double(legp->length); if (legp->infer_plumbs && ((legp->gradient == 90.0) || (legp->gradient == -90.0)) && (!thisnan(legp_bearing))) fprintf(this->svxf,"\t-"); else this->write_double(legp_bearing); this->write_double(legp->gradient); break; case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: this->write_double(legp->length); this->write_double(legp_bearing); if (!thisnan(legp->depthchange)) this->write_double(legp->depthchange); else this->write_double(legp->todepth - legp->fromdepth); break; case TT_DATATYPE_CARTESIAN: this->write_double(legp_dy); this->write_double(legp_dx); this->write_double(legp->dz); break; } this->src_map[this->svxf_ln] = &(legp->srcf); fprintf(this->svxf, "\n"); this->svxf_ln++; this->pdl = *legp; } void thsvxctrl::write_survey_fix(thdatafix * fixp) { if (!(thisnan(fixp->x))) { fprintf(this->svxf,"*fix\t%ld\t%f\t%f\t%f",fixp->station.id, fixp->x,fixp->y,fixp->z); if (!(thisnan(fixp->sdx))) { fprintf(this->svxf,"\t%f\t%f\t%f",fixp->sdx,fixp->sdy,fixp->sdz); if (!(thisnan(fixp->cxy))) fprintf(this->svxf,"\t%f\t%f\t%f",fixp->cxy,fixp->cyz,fixp->cxz); } this->src_map[this->svxf_ln] = &(fixp->srcf); fprintf(this->svxf,"\n"); this->svxf_ln++; } } void thsvxctrl::process_survey_data(class thdatabase * dbp) { #ifdef THDEBUG thprintf("\n\nprocessing survey data\n"); #else thprintf("processing survey data ... "); thtext_inline = true; #endif // first check if any survey data if (dbp->db1d.station_vec.size() == 0) { #ifdef THDEBUG thprintf("no survey data\n"); #else thprintf("no data.\n"); thtext_inline = false; #endif return; } // first create survex file #ifdef THDEBUG #else // thprintf("writing ... "); #endif const char * svxfn = thtmp.get_file_name("data.svx"); this->svxf = fopen(svxfn,"w"); if (svxf == NULL) ththrow(("can't open survex file for output -- %s", svxfn)) this->meridian_convergence = thcfg.get_outcs_convergence(); this->lastleggridmccs = TTCS_LOCAL; this->lastleggridmc = 0.0; fprintf(this->svxf,"*units declination clino compass degrees\n"); fprintf(this->svxf,"*units tape depth counter northing easting altitude metres\n"); fprintf(this->svxf,"*infer plumbs off\n"); fprintf(this->svxf,"*infer equates off\n"); this->svxf_ln += 4; // write data to file thdb_object_list_type::iterator obi = dbp->object_list.begin(); thdataleg_list::iterator lei; thdatafix_list::iterator fii; //thdatass_list::iterator ssi; thdataequate_list::iterator eqi; thdata * dp; thdataobject * cx1, * cx2; thdb1ds * tmps; while (obi != dbp->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); // scan data shots lei = dp->leg_list.begin(); while(lei != dp->leg_list.end()) { if (lei->is_valid) this->write_survey_leg(&(*lei)); lei++; } // scan data fixes fii = dp->fix_list.begin(); while(fii != dp->fix_list.end()) { tmps = &(dbp->db1d.station_vec[fii->station.id - 1]); cx1 = tmps->fixcontext; cx2 = fii->srcf.context; if (((cx1 == NULL) && (cx2 == NULL)) || ((cx1 != NULL) && (cx2 != NULL) && (cx1->id == cx2->id))) { this->write_survey_fix(&(*fii)); } fii++; } // export data equates int last_e = 0; for(eqi = dp->equate_list.begin(); eqi != dp->equate_list.end(); eqi++) { if (last_e != eqi->eqid) { if (last_e > 0) { fprintf(this->svxf,"\n"); this->svxf_ln++; } fprintf(this->svxf,"*equate"); this->src_map[this->svxf_ln] = &(eqi->srcf); last_e = eqi->eqid; } fprintf(this->svxf,"\t%ld",eqi->station.id); } if (last_e > 0) { fprintf(this->svxf,"\n"); this->svxf_ln++; } } obi++; } fclose(svxf); // run survex thbuffer svxcom, wdir; wdir.guarantee(1024); getcwd(wdir.get_buffer(),1024); int retcode; svxcom = "\""; svxcom += thini.get_path_cavern(); svxcom += "\" --quiet --log --output="; svxcom += thtmp.get_dir_name(); svxcom += " "; svxcom += svxfn; #ifdef THDEBUG thprintf("running cavern\n"); #else // thprintf("processing ... "); #endif retcode = system(svxcom.get_buffer()); this->transcript_log_file(dbp, thtmp.get_file_name("data.log")); if (retcode != EXIT_SUCCESS) ththrow(("cavern exit code -- %d", retcode)) // read coordinates from 3D file img_point imgpt; int result; unsigned long ss; thdb1ds * stp; img* pimg = img_open(thtmp.get_file_name("data.3d")); if (pimg == NULL) ththrow(("can't open cavern output")) do { result = img_read_item(pimg, &imgpt); switch (result) { case img_MOVE: case img_LINE: break; case img_LABEL: if (sscanf(pimg->label,"%lu",&ss) != 0) { stp = & (dbp->db1d.station_vec[ss-1]); stp->x = imgpt.x; stp->y = imgpt.y; stp->z = imgpt.z; } break; case img_BAD: img_close(pimg); ththrow(("error reading cavern output")) break; } } while (result != img_STOP); img_close(pimg); // svxcom = "\""; // svxcom += thini.get_path_3dtopos(); // svxcom += "\" "; // svxcom += thtmp.get_file_name("data.3d"); // svxcom += " "; // svxcom += thtmp.get_file_name("data.pos"); // // #ifdef THDEBUG // thprintf("running 3dtopos\n"); // #endif // retcode = system(svxcom.get_buffer()); // // if (retcode != EXIT_SUCCESS) // ththrow(("3dtopos exit code -- %d", retcode)) // // // Let's copy results and log-file to working directory // // #ifdef THWIN32 // // svxcom = "copy "; // // #else // // svxcom = "cp "; // // #endif // // svxcom += thtmp.get_file_name("data.*"); // // svxcom += " "; // // svxcom += wdir.get_buffer(); // // #ifdef THDEBUG // // thprintf("copying results\n"); // // #endif // // // // retcode = system(svxcom.get_buffer()); // // // // if (retcode != EXIT_SUCCESS) // // ththrow(("cp exit code -- %d", retcode)) // // // #ifdef THDEBUG // #else // // thprintf("reading ... "); // #endif // // import survex export // std::ifstream posf; // thdb1ds * stp; // double sx, sy, sz; // unsigned long ss; // size_t lnsize = 4096, pix = 0, ppx = 0, clns; // svxcom.guarantee(lnsize); // char * lnbuff = svxcom.get_buffer(), // * p[4], * cps = lnbuff; // posf.open(thtmp.get_file_name("data.pos")); // if (!posf.is_open()) // ththrow(("can't open survex output")) // while (!posf.eof()) { // posf.getline(lnbuff, lnsize); // clns = strlen(lnbuff); // ppx = 0; // pix = 0; // cps = lnbuff; // bool scan_num = true; // while ((pix < clns) && (ppx < 4)) { // if (scan_num && // (((((unsigned char) *cps) > 47) && // (((unsigned char) *cps) < 58)) || (*cps == 46) || // (*cps == 45) || (*cps == 43))) { // p[ppx] = cps; // ppx++; // scan_num = false; // } // if (((unsigned char)*cps) < 33) // scan_num = true; // if ((*cps == ',') || (((unsigned char)*cps) < 33)) // *cps = 0; // cps++; // pix++; // } // if (ppx == 4) { // if (sscanf(p[0],"%lf",&sx) == 0) // ppx = 0; // if (sscanf(p[1],"%lf",&sy) == 0) // ppx = 0; // if (sscanf(p[2],"%lf",&sz) == 0) // ppx = 0; // if (sscanf(p[3],"%lu",&ss) == 0) // ppx = 0; // // if inport OK, write coordinates into database // if (ppx == 4) { // stp = & (dbp->db1d.station_vec[ss-1]); // stp->x = sx; // stp->y = sy; // stp->z = sz; // } // } // } // posf.close(); // #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif // FILE * ptsf; // ptsf = fopen("data.pts","w"); // if (ptsf == NULL) // ththrow(("can't open data.pts for output")) // unsigned int sid, lsid; // lsid = dbp->db1d.station_vec.size(); // for (sid = 0; sid < lsid; sid++) { // stp = & (dbp->db1d.station_vec[sid]); // fprintf(ptsf,"%6d -> %s@%s\n",sid+1,stp->name,stp->survey->get_full_name()); // } // fclose(ptsf); } enum {THSVXLOGNUM_NONE, THSVXLOGNUM_LINE, THSVXLOGNUM_STATION}; void thsvxctrl::transcript_log_file(class thdatabase * dbp, const char * lfnm) { thbuffer tsbuff; thdb1ds * stp; char * lnbuff = new char [4097]; char * numbuff = &(lnbuff[2049]); unsigned long lnum = 0; thlog.printf("\n####################### cavern log file ########################\n"); std::ifstream clf(lfnm); if (!(clf.is_open())) ththrow(("can't open cavern log file for input")) // let's read line by line and print to log file size_t chidx, nchs; char * chch; bool onnum, ondig, fonline; long csn; size_t lsid; lsid = dbp->db1d.station_vec.size(); while (!(clf.eof())) { lnum++; clf.getline(lnbuff,2048); thlog.printf("%2d> %s\n",lnum,lnbuff); // let's scan the line chch = lnbuff; nchs = strlen(chch); onnum = false; fonline = true; csn = 0; chidx = 0; char * start_ch = NULL; //, * test_ch; int num_type; thsvxctrl_src_maptype::iterator srcmi; // if (*lnbuff == 13) lnbuff++; // if (strncmp(lnbuff,"There were",10) == 0) // chidx = 2049; // else if (strncmp(lnbuff,"There are",9) == 0) // chidx = 2049; // else if (strncmp(lnbuff,"Survey has",10) == 0) // chidx = 2049; // else if (strncmp(lnbuff,"Survey contains",15) == 0) // chidx = 2049; // else if (nchs > 6) { // if (strcmp(&(lnbuff[nchs-6]),"nodes.") == 0) // chidx = 2049; // else if (strcmp(&(lnbuff[nchs-5]),"node.") == 0) // chidx = 2049; // } while ((chidx <= nchs) && (chidx <= 2048)) { if ((chidx < nchs) && (chidx < 2048) && (((unsigned char) *chch) > 47) && (((unsigned char) *chch) < 58)) { if (!onnum) start_ch = chch; ondig = true; onnum = true; } else ondig = false; if (onnum) { if (ondig) { csn *= 10; csn += ((unsigned char) *chch) - 48; } else { num_type = THSVXLOGNUM_STATION; if ((chidx > 0) && (chidx <= nchs)) { if ((start_ch[-1] == ':') && (*chch == ':')) num_type = THSVXLOGNUM_LINE; } if (num_type == THSVXLOGNUM_STATION) { if ((chidx > 0) && (chidx <= nchs)) { if ((*chch == '.') || (*chch == ',') || (*chch == ')') || (*chch == 'm') || (*chch == '-') || (*chch == '/')) num_type = THSVXLOGNUM_NONE; if ((start_ch[-1] == '.') || (start_ch[-1] == '-')) num_type = THSVXLOGNUM_NONE; } } switch (num_type) { case THSVXLOGNUM_LINE: srcmi = this->src_map.find((unsigned long)csn); if (srcmi != this->src_map.end()) { if (!fonline) { fonline = true; tsbuff.strcat("\n"); } sprintf(numbuff,"%2ld> input:%ld -- %s [%ld]\n",lnum,csn,srcmi->second->name,srcmi->second->line); tsbuff.strcat(numbuff); } break; case THSVXLOGNUM_STATION: csn--; if ((csn >= 0) && (csn < long(lsid))) { if (fonline) { sprintf(numbuff,"%2ld> ",lnum); tsbuff.strcat(numbuff); fonline = false; } else { tsbuff.strcat(" -- "); } sprintf(numbuff,"%ld : ",(csn+1)); stp = & (dbp->db1d.station_vec[(unsigned int)csn]); tsbuff.strcat(numbuff); tsbuff.strcat(stp->name); tsbuff.strcat("@"); tsbuff.strcat(stp->survey->get_full_name()); } break; default: break; } // end of switch onnum = false; csn = 0; } } chch++; chidx++; } if (!fonline) tsbuff.strcat("\n"); } clf.close(); thlog.printf("######################### transcription ########################\n%s",tsbuff.get_buffer()); thlog.printf("#################### end of cavern log file ####################\n"); delete [] lnbuff; } therion/makebinary.pl0000664000175000017500000000206310576400772013736 0ustar useruser$platform = lc($ARGV[0]); #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time); #$year += 1900; #$mon += 1; #$datestr = sprintf("%04d%02d%02d",$year,$mon,$mday); if (open(VFL,"thversion.h")) { @verfl = ; $verfl[0] =~ /(\d+)\.(\d+)\.(\d+)/; ($v1,$v2,$v3) = ($1,$2,$3); close(VFL); } else { $v1 = 0; $v2 = 2; $v3 = 1; } $dd = "therion-temp"; $d = "../$dd"; system("mkdir $d"); system("cp ./therion $d"); system("cp ./install $d"); system("cp ./therion.ini $d"); system("cp ./xtherion/xtherion $d"); system("cp ./xtherion/xtherion.ini $d"); system("cp ./thbook/thbook.pdf $d"); system("cp ./man/therion.1 $d"); system("cp ./man/xtherion.1 $d"); system("cp ./README $d"); system("cp ./COPYING $d"); if ($platform eq "win32") { system("zip -jr ../therion-$platform-$v1.$v2.$v3.zip $d"); } else { system("tar -cvf ../therion-linux.i386-$v1.$v2.$v3.tar -C $d install therion therion.ini xtherion xtherion.ini thbook.pdf therion.1 xtherion.1 README COPYING"); system("gzip -f ../therion-linux.i386-$v1.$v2.$v3.tar"); } system("rm -R $d"); therion/thexporter.h0000664000175000017500000000511310751762772013641 0ustar useruser/** * @file thexporter.h * Exporter class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexporter_h #define thexporter_h #include "thexport.h" #include "thparse.h" #include #include /** * Export types. */ enum { TT_EXP_UNKNOWN = 0, ///< Not match. TT_EXP_MODEL, ///< 3D model. TT_EXP_MAP, ///< 2D map. TT_EXP_ATLAS, ///< 2D atlas. TT_EXP_DATABASE, ///< Database export. TT_EXP_CONTLIST, ///< Table with specified data. TT_EXP_SURVEYLIST, ///< Table with specified data. TT_EXP_CAVELIST, ///< Export entrance list. }; /** * Export token table. */ static const thstok thtt_exporter[] = { {"atlas", TT_EXP_ATLAS}, {"cave-list", TT_EXP_CAVELIST}, {"continuation-list", TT_EXP_CONTLIST}, {"database", TT_EXP_DATABASE}, {"map", TT_EXP_MAP}, {"model", TT_EXP_MODEL}, {"survey-list", TT_EXP_SURVEYLIST}, {NULL, TT_EXP_UNKNOWN} }; /** * Export list. */ typedef std::list thexporter_list; /** * Data exporter class. */ class thexporter { class thconfig * cfgptr; ///< Current config pointer. thexporter_list xlist; ///< Export list. public: thexporter(); ///< Default constructor. ~thexporter(); ///< Default deconstructor. void assign_config(class thconfig * cptr); ///< ?? /** * Parse export option. */ void parse_export(int nargs, char ** args); /** * Parse export option. */ void parse_system(char * system_cmd); /** * Export database. */ void export_db(class thdatabase * dp); /** * Dump export into file. */ void dump_export(FILE * xf); }; /** * Quick map export indicator. */ extern bool thexporter_quick_map_export; #endif therion/thselector.h0000664000175000017500000000502410721175032013572 0ustar useruser/** * @file thselector.h * Database selector class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thselector_h #define thselector_h #include #include /** * Selection. */ class thselector_item { public: const char * name, *src_name; unsigned long src_ln; unsigned long number; bool unselect, recursive; long map_level, chapter_level; class thdataobject * optr; thselector_item () : name(""), src_name(""), src_ln(0), unselect(false), recursive(true), map_level(0), chapter_level(0), optr(NULL) {} }; typedef std::list thselector_list; /** * Selector class. */ class thselector { public: thselector(); ///< Default constructor. class thconfig * cfgptr; ///< Current config pointer. thselector_list data; ///< Selection data. void select_object(thselector_item * pitm, class thdataobject * optr); ///< Select object. void select_all(thselector_item * pitm, class thdatabase * db); ///< Select all objects in db. void select_survey(thselector_item * pitm, class thsurvey * srv); ///< Select survey. unsigned long number; void assign_config(class thconfig * cptr); ///< Assign configuration object. /** * Parse select option from config file. */ void parse_selection (bool usid, int nargs, char ** args); /** * Dump selection into file. */ void dump_selection (FILE * cf); /** * Dump database selection options into file. */ void dump_selection_db (FILE * cf, class thdatabase * db); /** * Select objects in database. */ void select_db(class thdatabase * db); }; #endif therion/thsymbolset.cxx0000664000175000017500000016201612337643377014374 0ustar useruser/** * @file thdb2dxs.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thsymbolset.h" #include "thparse.h" #include "thpoint.h" #include "thline.h" #include "tharea.h" #include "thexception.h" #include "thpdfdata.h" #include "thlayout.h" #include "thtexfonts.h" #include "thdate.h" #include "thlang.h" #include "thtmpdir.h" #include "thcmdline.h" #include "thmpost.h" #include "thinit.h" #include "thsymbolsets.h" #include "thlogfile.h" #include "thepsparse.h" #ifndef THMSVC #include #else #include #define getcwd _getcwd #define chdir _chdir #define putenv _putenv #define hypot _hypot #define mkdir _mkdir #endif thsymbolset::thsymbolset() { for(int i = 0; i < thsymbolset_size; i++) { this->assigned[i] = !(thsymbolset__hidden[i]); this->used[i] = false; } this->group_symbols = true; } void thsymbolset_log_log_file(const char * logfpath, const char * on_title, const char * off_title, bool mpbug = false) { char * lnbuff = new char [4097]; // unsigned long lnum = 0; thlog.printf("%s",on_title); std::ifstream lf(logfpath); if (!(lf.is_open())) {{ thwarning(("can't open %s file for input", logfpath)); } thlog.printf("can't open %s file for input",logfpath); thlog.printf("%s",off_title); delete [] lnbuff; return; } // let's read line by line and print to log file bool skip_next = false, skip_this = false, peoln = false; while (!(lf.eof())) { lf.getline(lnbuff,4096); if (mpbug && (!skip_this)) { if (strncmp(lnbuff,"write",5) == 0) { skip_next = true; skip_this = true; peoln = false; } } if (!skip_this) { if (!skip_next) { thlog.printf("%s%s", (peoln ? "\n" : ""), lnbuff); peoln = true; } else { skip_next = false; } } else { skip_this = false; } } if (peoln) thlog.printf("\n"); lf.close(); delete [] lnbuff; thlog.printf("%s",off_title); } char * thlegend_u2string(unsigned u) { static char a [5]; a[4] = 0; unsigned v = 1; for(int i = 3; i >= 0; i--) { a[i] = 'a' + ((u / v) % 10); v *= 10; } return (&(a[0])); } const char * thsymbolset::get_mp_macro(int id) { this->used[id] = true; return thsymbolset__mp[id]; } enum { TT_SYMBOL_POINT, TT_SYMBOL_LINE, TT_SYMBOL_AREA, TT_SYMBOL_GROUP, TT_SYMBOL_UNKNOWN, TT_SYMBOL_SPECIAL, }; static const thstok thtt_symbol_class[] = { {"area", TT_SYMBOL_AREA}, {"group", TT_SYMBOL_GROUP}, {"line", TT_SYMBOL_LINE}, {"point", TT_SYMBOL_POINT}, {"special", TT_SYMBOL_SPECIAL}, {NULL, TT_SYMBOL_UNKNOWN} }; static const thstok thtt_symbol_group[] = { {"all", SYMX_ALL}, {"cave-centerline", SYMX_CAVECENTERLINE}, {"cave-centreline", SYMX_CAVECENTERLINE}, {"centerline", SYMX_CENTERLINE}, {"centreline", SYMX_CENTERLINE}, {"equipment", SYMX_EQUIPMENT}, {"ice", SYMX_ICE}, {"passage-fills", SYMX_PASSAGEFILLS}, {"sections", SYMX_SECTIONS}, {"sediments", SYMX_SEDIMENTS}, {"speleothems", SYMX_SPELEOTHEMS}, {"surface-centerline", SYMX_SURFACECENTERLINE}, {"surface-centreline", SYMX_SURFACECENTERLINE}, {"text", SYMX_TEXT}, {"water", SYMX_WATER}, {NULL, SYMX_} }; static const thstok thtt_symbol_point_spec[] = { {"cave-station", SYMP_CAVESTATION}, {"flag", SYMX_POINT_FLAG}, {"flag:air-draught", SYMP_FLAG_AIRDRAUGHT}, {"flag:arch", SYMP_FLAG_ARCH}, {"flag:continuation", SYMP_FLAG_CONTINUATION}, {"flag:dig", SYMP_FLAG_DIG}, {"flag:doline", SYMP_FLAG_DOLINE}, {"flag:entrance", SYMP_FLAG_ENTRANCE}, {"flag:overhang", SYMP_FLAG_OVERHANG}, {"flag:sink", SYMP_FLAG_SINK}, {"flag:spring", SYMP_FLAG_SPRING}, {"surface-station", SYMP_SURFACESTATION}, {"wall-altitude", SYMP_WALLALTITUDE}, {NULL, SYMX_} }; static const thstok thtt_symbol_special[] = { {"north-arrow", SYMS_NORTHARROW}, {"scale-bar", SYMS_SCALEBAR}, {NULL, SYMX_} }; #define c2(TH,MP) case TH: rv = MP; break; #define cl3(TH,MP) case TH: \ if (subtype != TT_LINE_SUBTYPE_UNKNOWN) break; \ rv = MP; \ break; #define cp3(TH,MP) case TH: \ if (subtype != TT_POINT_SUBTYPE_UNKNOWN) break; \ rv = MP; \ break; #define sgroup(MP) if (strlen(subtypes) == 0) { \ rv = MP; \ break; \ } int thsymbolset__get_id(const char * symclass, const char * symbol) { int type, subtype, rv; char types[128], subtypes[128]; types[127] = 0; subtypes[127] = 0; int ci = 0, slen = (int)strlen(symbol); while((ci < slen) && (symbol[ci] != ':')) ci++; if (symbol[ci] == ':') { strncpy(&(types[0]),symbol,ci); types[ci] = 0; strncpy(&(subtypes[0]),&(symbol[ci+1]),127); } else { strncpy(&(types[0]),symbol,127); subtypes[0] = 0; } rv = -1; switch (thmatch_token(symclass,thtt_symbol_class)) { case TT_SYMBOL_GROUP: type = thmatch_token(types,thtt_symbol_group); if (strlen(subtypes) > 0) break; if (type != SYMX_) rv = type; break; case TT_SYMBOL_SPECIAL: type = thmatch_token(types,thtt_symbol_special); if (strlen(subtypes) > 0) break; if (type != SYMX_) rv = type; break; case TT_SYMBOL_AREA: type = thmatch_token(types,thtt_area_types); if (strlen(subtypes) > 0) break; switch (type) { c2(TT_AREA_TYPE_DEBRIS, SYMA_DEBRIS); c2(TT_AREA_TYPE_SAND, SYMA_SAND); c2(TT_AREA_TYPE_SUMP, SYMA_SUMP); c2(TT_AREA_TYPE_WATER, SYMA_WATER); c2(TT_AREA_TYPE_ICE, SYMA_ICE); c2(TT_AREA_TYPE_SNOW, SYMA_SNOW); c2(TT_AREA_TYPE_BLOCKS, SYMA_BLOCKS); c2(TT_AREA_TYPE_CLAY, SYMA_CLAY); c2(TT_AREA_TYPE_PEBBLES, SYMA_PEBBLES); c2(TT_AREA_TYPE_DIMENSIONS, SYMA_DIMENSIONS); c2(TT_AREA_TYPE_FLOWSTONE, SYMA_FLOWSTONE); c2(TT_AREA_TYPE_MOONMILK, SYMA_MOONMILK); } break; case TT_SYMBOL_LINE: type = thmatch_token(types,thtt_line_types); subtype = thmatch_token(subtypes,thtt_line_subtypes); switch (type) { case TT_LINE_TYPE_WALL: sgroup(SYMX_LINE_WALL) switch (subtype) { c2(TT_LINE_SUBTYPE_BEDROCK,SYML_WALL_BEDROCK) c2(TT_LINE_SUBTYPE_BLOCKS,SYML_WALL_BLOCKS) c2(TT_LINE_SUBTYPE_CLAY,SYML_WALL_CLAY) c2(TT_LINE_SUBTYPE_DEBRIS,SYML_WALL_DEBRIS) c2(TT_LINE_SUBTYPE_ICE,SYML_WALL_ICE) c2(TT_LINE_SUBTYPE_INVISIBLE,SYML_WALL_INVISIBLE) c2(TT_LINE_SUBTYPE_PEBBLES,SYML_WALL_PEBBLES) c2(TT_LINE_SUBTYPE_PRESUMED,SYML_WALL_PRESUMED) c2(TT_LINE_SUBTYPE_SAND,SYML_WALL_SAND) c2(TT_LINE_SUBTYPE_UNDERLYING,SYML_WALL_UNDERLYING) c2(TT_LINE_SUBTYPE_UNSURVEYED,SYML_WALL_UNSURVEYED) c2(TT_LINE_SUBTYPE_FLOWSTONE,SYML_WALL_FLOWSTONE) c2(TT_LINE_SUBTYPE_MOONMILK,SYML_WALL_MOONMILK) c2(TT_LINE_SUBTYPE_PIT,SYML_WALL_PIT) c2(TT_LINE_SUBTYPE_OVERLYING,SYML_WALL_OVERLYING) } break; case TT_LINE_TYPE_BORDER: sgroup(SYMX_LINE_BORDER) switch (subtype) { c2(TT_LINE_SUBTYPE_TEMPORARY,SYML_BORDER_TEMPORARY) c2(TT_LINE_SUBTYPE_INVISIBLE,SYML_BORDER_INVISIBLE) c2(TT_LINE_SUBTYPE_VISIBLE,SYML_BORDER_VISIBLE) } break; case TT_LINE_TYPE_SURVEY: sgroup(SYMX_LINE_SURVEY) switch (subtype) { c2(TT_LINE_SUBTYPE_CAVE,SYML_SURVEY_CAVE) c2(TT_LINE_SUBTYPE_SURFACE,SYML_SURVEY_SURFACE) } break; case TT_LINE_TYPE_WATER_FLOW: sgroup(SYMX_LINE_WATERFLOW) switch (subtype) { c2(TT_LINE_SUBTYPE_PERMANENT,SYML_WATERFLOW_PERMANENT) c2(TT_LINE_SUBTYPE_INTERMITTENT,SYML_WATERFLOW_INTERMITTENT) c2(TT_LINE_SUBTYPE_CONJECTURAL,SYML_WATERFLOW_CONJECTURAL) } break; cl3(TT_LINE_TYPE_ARROW,SYML_ARROW); cl3(TT_LINE_TYPE_GRADIENT,SYML_GRADIENT); cl3(TT_LINE_TYPE_CEILING_STEP,SYML_CEILINGSTEP); cl3(TT_LINE_TYPE_CEILING_MEANDER,SYML_CEILINGMEANDER); cl3(TT_LINE_TYPE_CHIMNEY,SYML_CHIMNEY); cl3(TT_LINE_TYPE_CONTOUR,SYML_CONTOUR); cl3(TT_LINE_TYPE_FLOOR_STEP,SYML_FLOORSTEP); cl3(TT_LINE_TYPE_FLOOR_MEANDER,SYML_FLOORMEANDER); cl3(TT_LINE_TYPE_FLOWSTONE,SYML_FLOWSTONE); cl3(TT_LINE_TYPE_MOONMILK,SYML_MOONMILK); cl3(TT_LINE_TYPE_LABEL,SYML_LABEL); cl3(TT_LINE_TYPE_MAP_CONNECTION,SYML_MAPCONNECTION); cl3(TT_LINE_TYPE_OVERHANG,SYML_OVERHANG); cl3(TT_LINE_TYPE_PIT,SYML_PIT); cl3(TT_LINE_TYPE_ROCK_BORDER,SYML_ROCKBORDER); cl3(TT_LINE_TYPE_ROCK_EDGE,SYML_ROCKEDGE); cl3(TT_LINE_TYPE_SECTION,SYML_SECTION); cl3(TT_LINE_TYPE_SLOPE,SYML_SLOPE); cl3(TT_LINE_TYPE_HANDRAIL,SYML_HANDRAIL); cl3(TT_LINE_TYPE_STEPS,SYML_STEPS); cl3(TT_LINE_TYPE_ROPE,SYML_ROPE); cl3(TT_LINE_TYPE_ROPE_LADDER,SYML_ROPELADDER); cl3(TT_LINE_TYPE_FIXED_LADDER,SYML_FIXEDLADDER); cl3(TT_LINE_TYPE_VIA_FERRATA,SYML_VIAFERRATA); } break; case TT_SYMBOL_POINT: type = thmatch_token(types,thtt_point_types); subtype = thmatch_token(subtypes,thtt_point_subtypes); if ((type == TT_POINT_TYPE_UNKNOWN) && (strlen(subtypes) == 0)) { type = thmatch_token(types,thtt_symbol_point_spec); if (type != SYMX_) rv = type; type = TT_POINT_TYPE_UNKNOWN; } if ((type == TT_POINT_TYPE_UNKNOWN) && (strlen(subtypes) > 0)) { type = thmatch_token(symbol,thtt_symbol_point_spec); if (type != SYMX_) rv = type; type = TT_POINT_TYPE_UNKNOWN; } switch (type) { case TT_POINT_TYPE_PASSAGE_HEIGHT: sgroup(SYMX_POINT_PASSAGEHEIGHT) switch (subtype) { c2(TT_POINT_SUBTYPE_POSITIVE,SYMP_PASSAGEHEIGHT_POSITIVE); c2(TT_POINT_SUBTYPE_NEGATIVE,SYMP_PASSAGEHEIGHT_NEGATIVE); c2(TT_POINT_SUBTYPE_BOTH,SYMP_PASSAGEHEIGHT_BOTH); c2(TT_POINT_SUBTYPE_UNSIGNED,SYMP_PASSAGEHEIGHT_UNSIGNED); } break; case TT_POINT_TYPE_HEIGHT: sgroup(SYMX_POINT_HEIGHT) switch (subtype) { c2(TT_POINT_SUBTYPE_POSITIVE,SYMP_HEIGHT_POSITIVE); c2(TT_POINT_SUBTYPE_NEGATIVE,SYMP_HEIGHT_NEGATIVE); c2(TT_POINT_SUBTYPE_UNSIGNED,SYMP_HEIGHT_UNSIGNED); } break; case TT_POINT_TYPE_WATER_FLOW: sgroup(SYMX_POINT_WATERFLOW) switch (subtype) { c2(TT_POINT_SUBTYPE_INTERMITTENT,SYMP_WATERFLOW_INTERMITTENT) c2(TT_POINT_SUBTYPE_PERMANENT,SYMP_WATERFLOW_PERMANENT) c2(TT_POINT_SUBTYPE_PALEO,SYMP_WATERFLOW_PALEO) } break; case TT_POINT_TYPE_STATION: sgroup(SYMX_POINT_STATION) switch (subtype) { c2(TT_POINT_SUBTYPE_FIXED,SYMP_STATION_FIXED) c2(TT_POINT_SUBTYPE_PAINTED,SYMP_STATION_PAINTED) c2(TT_POINT_SUBTYPE_NATURAL,SYMP_STATION_NATURAL) c2(TT_POINT_SUBTYPE_TEMP,SYMP_STATION_TEMPORARY) } break; case TT_POINT_TYPE_AIR_DRAUGHT: sgroup(SYMX_POINT_AIRDRAUGHT) switch (subtype) { c2(TT_POINT_SUBTYPE_UNDEF,SYMP_AIRDRAUGHT) c2(TT_POINT_SUBTYPE_SUMMER,SYMP_AIRDRAUGHT_SUMMER) c2(TT_POINT_SUBTYPE_WINTER,SYMP_AIRDRAUGHT_WINTER) } break; cp3(TT_POINT_TYPE_ALTITUDE,SYMP_ALTITUDE); cp3(TT_POINT_TYPE_ANASTOMOSIS,SYMP_ANASTOMOSIS); cp3(TT_POINT_TYPE_ANCHOR,SYMP_ANCHOR); cp3(TT_POINT_TYPE_ARAGONITE,SYMP_ARAGONITE); cp3(TT_POINT_TYPE_ARCHEO_MATERIAL,SYMP_ARCHEOMATERIAL); cp3(TT_POINT_TYPE_BEDROCK,SYMP_BEDROCK); cp3(TT_POINT_TYPE_BLOCKS,SYMP_BLOCKS); cp3(TT_POINT_TYPE_BREAKDOWN_CHOKE,SYMP_BREAKDOWNCHOKE); cp3(TT_POINT_TYPE_BRIDGE,SYMP_BRIDGE); cp3(TT_POINT_TYPE_CAMP,SYMP_CAMP); cp3(TT_POINT_TYPE_CAVE_PEARL,SYMP_CAVEPEARL); cp3(TT_POINT_TYPE_CLAY,SYMP_CLAY); cp3(TT_POINT_TYPE_CONTINUATION,SYMP_CONTINUATION); cp3(TT_POINT_TYPE_CRYSTAL,SYMP_CRYSTAL); cp3(TT_POINT_TYPE_CURTAIN,SYMP_CURTAIN); cp3(TT_POINT_TYPE_DATE,SYMP_DATE); cp3(TT_POINT_TYPE_DEBRIS,SYMP_DEBRIS); cp3(TT_POINT_TYPE_DIG,SYMP_DIG); cp3(TT_POINT_TYPE_DISK,SYMP_DISK); cp3(TT_POINT_TYPE_ENTRANCE,SYMP_ENTRANCE); cp3(TT_POINT_TYPE_FIXED_LADDER,SYMP_FIXEDLADDER); cp3(TT_POINT_TYPE_FLOWSTONE,SYMP_FLOWSTONE); cp3(TT_POINT_TYPE_FLOWSTONE_CHOKE,SYMP_FLOWSTONECHOKE); cp3(TT_POINT_TYPE_CLAY_CHOKE,SYMP_CLAYCHOKE); cp3(TT_POINT_TYPE_FLUTE,SYMP_FLUTE); cp3(TT_POINT_TYPE_GRADIENT,SYMP_GRADIENT); cp3(TT_POINT_TYPE_GUANO,SYMP_GUANO); cp3(TT_POINT_TYPE_GYPSUM,SYMP_GYPSUM); cp3(TT_POINT_TYPE_GYPSUM_FLOWER,SYMP_GYPSUMFLOWER); cp3(TT_POINT_TYPE_HELICTITE,SYMP_HELICTITE); cp3(TT_POINT_TYPE_ICE,SYMP_ICE); cp3(TT_POINT_TYPE_SNOW,SYMP_SNOW); cp3(TT_POINT_TYPE_KARREN,SYMP_KARREN); cp3(TT_POINT_TYPE_LABEL,SYMP_LABEL); cp3(TT_POINT_TYPE_LOW_END,SYMP_LOWEND); cp3(TT_POINT_TYPE_MOONMILK,SYMP_MOONMILK); cp3(TT_POINT_TYPE_NARROW_END,SYMP_NARROWEND); cp3(TT_POINT_TYPE_NO_EQUIPMENT,SYMP_NOEQUIPMENT); cp3(TT_POINT_TYPE_PALEO_MATERIAL,SYMP_PALEOMATERIAL); cp3(TT_POINT_TYPE_PEBBLES,SYMP_PEBBLES); cp3(TT_POINT_TYPE_PILLAR,SYMP_PILLAR); cp3(TT_POINT_TYPE_POPCORN,SYMP_POPCORN); cp3(TT_POINT_TYPE_RAFT,SYMP_RAFT); cp3(TT_POINT_TYPE_RAFT_CONE,SYMP_RAFTCONE); cp3(TT_POINT_TYPE_REMARK,SYMP_REMARK); cp3(TT_POINT_TYPE_RIMSTONE_DAM,SYMP_RIMSTONEDAM); cp3(TT_POINT_TYPE_RIMSTONE_POOL,SYMP_RIMSTONEPOOL); cp3(TT_POINT_TYPE_ROOT,SYMP_ROOT); cp3(TT_POINT_TYPE_ROPE,SYMP_ROPE); cp3(TT_POINT_TYPE_ROPE_LADDER,SYMP_ROPELADDER); cp3(TT_POINT_TYPE_SAND,SYMP_SAND); cp3(TT_POINT_TYPE_SECTION,SYMP_SECTION); cp3(TT_POINT_TYPE_SCALLOP,SYMP_SCALLOP); cp3(TT_POINT_TYPE_SINK,SYMP_SINK); cp3(TT_POINT_TYPE_SODA_STRAW,SYMP_SODASTRAW); cp3(TT_POINT_TYPE_SPRING,SYMP_SPRING); cp3(TT_POINT_TYPE_STALACTITE,SYMP_STALACTITE); cp3(TT_POINT_TYPE_STALAGMITE,SYMP_STALAGMITE); cp3(TT_POINT_TYPE_STATION_NAME,SYMP_STATIONNAME); cp3(TT_POINT_TYPE_STEPS,SYMP_STEPS); cp3(TT_POINT_TYPE_TRAVERSE,SYMP_TRAVERSE); cp3(TT_POINT_TYPE_VEGETABLE_DEBRIS,SYMP_VEGETABLEDEBRIS); cp3(TT_POINT_TYPE_WALL_CALCITE,SYMP_WALLCALCITE); cp3(TT_POINT_TYPE_WATER,SYMP_WATER); cp3(TT_POINT_TYPE_ICE_STALACTITE,SYMP_ICESTALACTITE); cp3(TT_POINT_TYPE_ICE_STALAGMITE,SYMP_ICESTALAGMITE); cp3(TT_POINT_TYPE_ICE_PILLAR,SYMP_ICEPILLAR); cp3(TT_POINT_TYPE_HANDRAIL,SYMP_HANDRAIL); cp3(TT_POINT_TYPE_VIA_FERRATA,SYMP_VIAFERRATA); cp3(TT_POINT_TYPE_STALACTITES,SYMP_STALACTITES); cp3(TT_POINT_TYPE_STALAGMITES,SYMP_STALAGMITES); cp3(TT_POINT_TYPE_PILLARS,SYMP_PILLARS); } break; } return rv; } void thsymbolset::export_symbol_defaults(FILE * mpf, const char * symset) { fprintf(mpf,"\n\n\n%% %s symbol set.\n",symset); for(int id = 0; id < SYMX_; id++) { if (thsymbolset__assign[id]) { this->assigned[id] = true; fprintf(mpf,"mapsymbol(\"%s\",\"%s\",false);\n",thsymbolset__mp[id],symset); } } } void thsymbolset::export_symbol_assign(FILE * mpf, int sym_id, const char * symset) { if (sym_id > SYMX_) export_symbol_assign_group(mpf, sym_id, symset); else if (thsymbolset__assign[sym_id]) { fprintf(mpf,"mapsymbol(\"%s\",\"%s\",true);\n",thsymbolset__mp[sym_id],symset); } } void thsymbolset::export_symbol_hide(FILE * mpf, int sym_id) { if (sym_id > SYMX_) export_symbol_hide_group(mpf, sym_id); else this->assigned[sym_id] = false; } void thsymbolset::export_symbol_show(FILE * mpf, int sym_id) { if (sym_id > SYMX_) export_symbol_show_group(mpf, sym_id); else this->assigned[sym_id] = true; } void thsymbolset::export_symbol_color(FILE * mpf, int sym_id, thlayout_color * clr) { if (sym_id > SYMX_) export_symbol_color_group(mpf, sym_id, clr); else { this->color[sym_id] = *clr; this->color[sym_id].defined = true; } } void thsymbolset::export_symbol_color_group(FILE * mpf, int sym_id, thlayout_color * clr) { int id = 0; int cid = thsymbolset__get_group(sym_id,id++); while (cid >= 0) { this->export_symbol_color(mpf, cid, clr); cid = thsymbolset__get_group(sym_id,id++); } } void thsymbolset::export_symbol_assign_group(FILE * mpf, int sym_id, const char * symset) { int id = 0; int cid = thsymbolset__get_group(sym_id,id++); while (cid >= 0) { this->export_symbol_assign(mpf, cid, symset); cid = thsymbolset__get_group(sym_id,id++); } } void thsymbolset::export_symbol_hide_group(FILE * mpf, int sym_id) { int id = 0; int cid = thsymbolset__get_group(sym_id,id++); while (cid >= 0) { this->export_symbol_hide(mpf, cid); cid = thsymbolset__get_group(sym_id,id++); } } void thsymbolset::export_symbol_show_group(FILE * mpf, int sym_id) { int id = 0; int cid = thsymbolset__get_group(sym_id,id++); while (cid >= 0) { this->export_symbol_show(mpf, cid); cid = thsymbolset__get_group(sym_id,id++); } } #define bgroup(gid) case gid: \ switch (cid) { #define group(id,mid) case id: rv = mid; break; #define egroup } break; int thsymbolset__get_group(int group_id, int cid) { int rv = -1; switch (group_id) { case SYMX_ALL: if (cid < SYMS_) rv = cid; break; bgroup(SYMX_SECTIONS) group(0,SYMP_SECTION) group(1,SYML_SECTION) egroup bgroup(SYMX_CENTERLINE) group(0,SYMX_POINT_STATION) group(1,SYML_SURVEY_SURFACE) group(2,SYML_SURVEY_CAVE) group(3,SYMP_STATIONNAME) egroup bgroup(SYMX_TEXT) group(0,SYMP_LABEL) group(1,SYMP_REMARK) group(2,SYMP_DATE) group(3,SYML_LABEL) egroup bgroup(SYMX_WATER) group(0,SYMX_LINE_WATERFLOW) group(1,SYMX_POINT_WATERFLOW) group(2,SYMP_WATER) group(3,SYMA_WATER) group(4,SYMA_SUMP) group(5,SYMP_SPRING) group(6,SYMP_SINK) egroup bgroup(SYMX_EQUIPMENT) group( 0,SYMP_ANCHOR); group( 1,SYMP_ROPE); group( 2,SYMP_FIXEDLADDER); group( 3,SYMP_ROPELADDER); group( 4,SYMP_STEPS); group( 5,SYMP_BRIDGE); group( 6,SYMP_TRAVERSE); group( 7,SYMP_CAMP); group( 8,SYMP_NOEQUIPMENT); group( 9,SYML_ROPE); group(10,SYML_HANDRAIL); group(11,SYMP_HANDRAIL); group(12,SYML_FIXEDLADDER); group(13,SYML_ROPELADDER); group(14,SYMP_VIAFERRATA); group(15,SYML_VIAFERRATA); group(16,SYML_STEPS); egroup bgroup(SYMX_SPELEOTHEMS) group( 0,SYMP_FLOWSTONE); group( 1,SYMP_MOONMILK); group( 2,SYMP_STALACTITE); group( 3,SYMP_STALAGMITE); group( 4,SYMP_PILLAR); group( 5,SYMP_CURTAIN); group( 6,SYMP_HELICTITE); group( 7,SYMP_SODASTRAW); group( 8,SYMP_CRYSTAL); group( 9,SYMP_WALLCALCITE); group(10,SYMP_POPCORN); group(11,SYMP_DISK); group(12,SYMP_GYPSUM); group(13,SYMP_GYPSUMFLOWER); group(14,SYMP_ARAGONITE); group(15,SYMP_CAVEPEARL); group(16,SYMP_RIMSTONEPOOL); group(17,SYMP_RIMSTONEDAM); group(19,SYML_FLOWSTONE); group(20,SYML_MOONMILK); group(21,SYMA_FLOWSTONE) group(22,SYMA_MOONMILK) egroup bgroup(SYMX_ICE) group(0,SYML_WALL_ICE); group(1,SYMP_ICE); group(2,SYMP_ICESTALACTITE); group(3,SYMP_ICESTALAGMITE); group(4,SYMP_ICEPILLAR); group(5,SYMP_SNOW); group(6,SYMA_ICE); group(7,SYMA_SNOW); egroup bgroup(SYMX_SEDIMENTS) group(0,SYML_WALL_SAND); group(1,SYML_WALL_CLAY); group(2,SYMP_SAND); group(3,SYMP_CLAY); group(4,SYMA_SAND); group(5,SYMA_CLAY); group(6,SYMP_CLAYTREE); group(7,SYMP_RAFT); group(8,SYMP_RAFTCONE); group(9,SYMP_GUANO); egroup bgroup(SYMX_PASSAGEFILLS) group(0,SYMX_POINT_WATERFLOW) group(1,SYMP_BEDROCK); group(2,SYMP_SAND); group(3,SYMP_RAFT); group(4,SYMP_CLAY); group(5,SYMP_PEBBLES); group(6,SYMP_DEBRIS); group(7,SYMP_BLOCKS); group(8,SYMP_WATER); group(9,SYMP_ICE); group(10,SYMP_GUANO); group(11,SYMP_SNOW); group(12,SYML_ROCKBORDER); group(13,SYML_ROCKEDGE); group(14,SYMX_LINE_WATERFLOW) group(15,SYMA_WATER) group(16,SYMA_SUMP) group(17,SYMA_BEDROCK) group(18,SYMA_BLOCKS) group(19,SYMA_CLAY) group(20,SYMA_DEBRIS) group(21,SYMA_ICE) group(22,SYMA_PEBBLES) group(23,SYMA_SAND) group(24,SYMA_SNOW) egroup bgroup(SYMX_SURFACECENTERLINE) group(0,SYMP_SURFACESTATION) group(1,SYML_SURVEY_SURFACE) egroup bgroup(SYMX_POINT_FLAG) group(0,SYMP_FLAG_ENTRANCE) group(1,SYMP_FLAG_CONTINUATION) group(2,SYMP_FLAG_SINK) group(3,SYMP_FLAG_SPRING) group(4,SYMP_FLAG_DOLINE) group(5,SYMP_FLAG_DIG) group(6,SYMP_FLAG_AIRDRAUGHT) group(7,SYMP_FLAG_ARCH) group(8,SYMP_FLAG_OVERHANG) egroup bgroup(SYMX_CAVECENTERLINE) group(0,SYMP_CAVESTATION) group(1,SYML_SURVEY_CAVE) egroup bgroup(SYMX_LINE_WALL) group(0,SYML_WALL_BEDROCK) group(1,SYML_WALL_BLOCKS) group(2,SYML_WALL_CLAY) group(3,SYML_WALL_DEBRIS) group(4,SYML_WALL_ICE) group(5,SYML_WALL_PEBBLES) group(6,SYML_WALL_PRESUMED) group(7,SYML_WALL_SAND) group(8,SYML_WALL_UNDERLYING) group(9,SYML_WALL_UNSURVEYED) group(10,SYML_WALL_PIT) group(11,SYML_WALL_OVERLYING) group(12,SYML_WALL_MOONMILK) group(13,SYML_WALL_FLOWSTONE) egroup bgroup(SYMX_LINE_WATERFLOW) group(0,SYML_WATERFLOW_CONJECTURAL) group(1,SYML_WATERFLOW_INTERMITTENT) group(2,SYML_WATERFLOW_PERMANENT) egroup bgroup(SYMX_LINE_BORDER) group(0,SYML_BORDER_TEMPORARY) group(1,SYML_BORDER_VISIBLE) egroup bgroup(SYMX_LINE_SURVEY) group(0,SYML_SURVEY_CAVE) group(1,SYML_SURVEY_SURFACE) egroup bgroup(SYMX_POINT_STATION) group(0,SYMP_STATION_FIXED) group(1,SYMP_STATION_NATURAL) group(2,SYMP_STATION_PAINTED) group(3,SYMP_STATION_TEMPORARY) group(4,SYMP_SURFACESTATION) group(5,SYMP_CAVESTATION) egroup bgroup(SYMX_POINT_AIRDRAUGHT) group(0,SYMP_AIRDRAUGHT) group(1,SYMP_AIRDRAUGHT_SUMMER) group(2,SYMP_AIRDRAUGHT_WINTER) egroup bgroup(SYMX_POINT_WATERFLOW) group(0,SYMP_WATERFLOW_INTERMITTENT) group(1,SYMP_WATERFLOW_PALEO) group(2,SYMP_WATERFLOW_PERMANENT) egroup bgroup(SYMX_POINT_PASSAGEHEIGHT) group(0,SYMP_PASSAGEHEIGHT_POSITIVE) group(1,SYMP_PASSAGEHEIGHT_NEGATIVE) group(2,SYMP_PASSAGEHEIGHT_BOTH) group(3,SYMP_PASSAGEHEIGHT_UNSIGNED) egroup bgroup(SYMX_POINT_HEIGHT) group(0,SYMP_HEIGHT_POSITIVE) group(1,SYMP_HEIGHT_NEGATIVE) group(2,SYMP_HEIGHT_UNSIGNED) egroup } return rv; } void thsymbolset::export_pdf(class thlayout * layout, FILE * mpf, unsigned & sfig) { list::iterator LEGENDITEM; legendrecord dummlr; LEGENDLIST.clear(); thbuffer texb; texb.guarantee(128); unsigned symn = 0; bool isin[thsymbolset_size]; for(int i = 0; i < thsymbolset_size; i++) isin[i] = true; if (layout->legend == TT_LAYOUT_LEGEND_ALL) { this->export_symbol_show_group(mpf, SYMX_POINT_FLAG); } // TODO: // + section point (rez), line (ciara), arrow (sipocka) // + wall:pebbles, wall:clay, wall:ice // + point: passase-height (p,n,pn,u), height (p,n,u), date, label, remark // + line: label #define helpsymbol fprintf(mpf,"drawoptions(withcolor HelpSymbolColor);\n"); #define endhelpsymbol fprintf(mpf,"drawoptions();\n"); #define isused(mid) \ (this->assigned[mid] && \ (this->used[mid] || (layout->legend == TT_LAYOUT_LEGEND_ALL))) // vlozi figure do metapostu #define insfig(mid,txt) \ if (((mid == 0) || (isused(mid))) && (strlen(txt) > 0)) {\ isin[mid] = false;\ LEGENDITEM = LEGENDLIST.insert(LEGENDLIST.end(),dummlr); \ fprintf(mpf,"beginfig(%d);\n",sfig); \ fprintf(mpf,"clean_legend_box;\n"); \ sprintf(texb.get_buffer(),"data.%d",sfig); \ LEGENDITEM->idfig = (unsigned) sfig; \ LEGENDITEM->idsym = (unsigned) mid; \ LEGENDITEM->idnum = (unsigned) symn; \ LEGENDITEM->fname = texb.get_buffer(); \ LEGENDITEM->name = thlegend_u2string(unsigned(symn++)); \ LEGENDITEM->descr = txt; \ sfig++; #define endfig \ fprintf(mpf,"draw_legend_box;\nendfig;\n"); \ } #define legend_point(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s((0.5,0.5) inscale,0.0,1.0,(0,0));\n",thsymbolset__mp[mid]); \ endfig; #define legend_hpoint(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s((0.5,0.5) inscale,270.0,1.0,(0,0));\n",thsymbolset__mp[mid]); \ endfig; // meracie body + polygon + station-name #define legend_station(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s((0.5,0.5) inscale);\n",thsymbolset__mp[mid]); \ endfig; // thT("point station") legend_station(SYMP_STATION_TEMPORARY,thT("point station:temporary",layout->lang)); legend_station(SYMP_STATION_PAINTED,thT("point station:painted",layout->lang)); legend_station(SYMP_STATION_NATURAL,thT("point station:natural",layout->lang)); legend_station(SYMP_STATION_FIXED,thT("point station:fixed",layout->lang)); #define legend_station_flag(mid,txt,flag) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"p_station((0.5,0.5) inscale, 0, \"\", \"%s\");\n",flag); \ endfig; legend_station_flag(SYMP_FLAG_ENTRANCE,thT("point flag:entrance",layout->lang),"entrance"); legend_station_flag(SYMP_FLAG_SINK,thT("point flag:sink",layout->lang),"sink"); legend_station_flag(SYMP_FLAG_SPRING,thT("point flag:spring",layout->lang),"spring"); legend_station_flag(SYMP_FLAG_DOLINE,thT("point flag:doline",layout->lang),"doline"); legend_station_flag(SYMP_FLAG_DIG,thT("point flag:dig",layout->lang),"dig"); legend_station_flag(SYMP_FLAG_CONTINUATION,thT("point flag:continuation",layout->lang),"continuation"); legend_station_flag(SYMP_FLAG_AIRDRAUGHT,thT("point flag:air-draught",layout->lang),"airdraught"); legend_station_flag(SYMP_FLAG_ARCH,thT("point flag:arch",layout->lang),"arch"); legend_station_flag(SYMP_FLAG_OVERHANG,thT("point flag:overhang",layout->lang),"overhang"); #define insert_station(x,y) \ helpsymbol \ if (true || isused(SYMP_STATION_TEMPORARY)) \ fprintf(mpf,"%s((%g,%g) inscale);\n",thsymbolset__mp[SYMP_STATION_TEMPORARY],x,y); \ else \ if isused(SYMP_STATION_PAINTED) \ fprintf(mpf,"%s((%g,%g) inscale);\n",thsymbolset__mp[SYMP_STATION_PAINTED],x,y); \ else \ if isused(SYMP_STATION_NATURAL) \ fprintf(mpf,"%s((%g,%g) inscale);\n",thsymbolset__mp[SYMP_STATION_NATURAL],x,y); \ else \ if isused(SYMP_STATION_FIXED) \ fprintf(mpf,"%s((%g,%g) inscale);\n",thsymbolset__mp[SYMP_STATION_FIXED],x,y); \ endhelpsymbol; insfig(SYML_SURVEY_CAVE,thT("line survey",layout->lang)); this->export_mp_symbol_options(mpf, SYML_SURVEY_CAVE); fprintf(mpf,"%s(((-1,1) -- (0.8,0.6) -- (0,-1)) inscale);\n", thsymbolset__mp[SYML_SURVEY_CAVE]); insert_station(0.8,0.6); endfig; insfig(SYMP_STATIONNAME,thT("point station-name",layout->lang)); this->export_mp_symbol_options(mpf, SYMP_STATIONNAME); fprintf(mpf,"p_label.urt(btex \\thstationname %s etex,((0.3,0.3) inscale),0,7);\n",utf2tex("173")); insert_station(0.3,0.3); endfig; legend_hpoint(SYMP_ENTRANCE,thT("point entrance",layout->lang)); insfig(SYML_MAPCONNECTION,thT("line map-connection",layout->lang)); this->export_mp_symbol_options(mpf, SYML_MAPCONNECTION); fprintf(mpf,"%s(((0.2,0.8) -- (0.8,0.2)) inscale)",thsymbolset__mp[SYML_MAPCONNECTION]); endfig; // steny + wall-altitude + altitude #define legend_wall(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(((-.3,0.5) .. (.3,.3) .. (.7,.7) .. (1.3,.5)) inscale);\n",thsymbolset__mp[mid]); \ endfig; // thT("line wall") legend_wall(SYML_WALL_BEDROCK,thT("line wall:bedrock",layout->lang)); legend_wall(SYML_WALL_UNDERLYING,thT("line wall:underlying",layout->lang)); legend_wall(SYML_WALL_OVERLYING,thT("line wall:overlying",layout->lang)); legend_wall(SYML_WALL_UNSURVEYED,thT("line wall:unsurveyed",layout->lang)); legend_wall(SYML_WALL_PRESUMED,thT("line wall:presumed",layout->lang)); legend_wall(SYML_WALL_PIT,thT("line wall:pit",layout->lang)); legend_wall(SYML_WALL_BLOCKS,thT("line wall:blocks",layout->lang)); legend_wall(SYML_WALL_DEBRIS,thT("line wall:debris",layout->lang)); legend_wall(SYML_WALL_PEBBLES,thT("line wall:pebbles",layout->lang)); legend_wall(SYML_WALL_SAND,thT("line wall:sand",layout->lang)); legend_wall(SYML_WALL_CLAY,thT("line wall:clay",layout->lang)); legend_wall(SYML_WALL_ICE,thT("line wall:ice",layout->lang)); legend_wall(SYML_WALL_FLOWSTONE,thT("line wall:flowstone",layout->lang)); legend_wall(SYML_WALL_MOONMILK,thT("line wall:moonmilk",layout->lang)); insfig(SYMP_WALLALTITUDE,thT("point wall-altitude",layout->lang)); helpsymbol; if (true || isused(SYML_WALL_BEDROCK)) fprintf(mpf,"%s(((-.3,0.5) .. controls (.2,.6) and (.2,.6) .. (.3,.7) .. controls (.4,.8) and (.4,.8) .. (.5,1.4)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); endhelpsymbol; this->export_mp_symbol_options(mpf, SYMP_WALLALTITUDE); fprintf(mpf,"%s((0.2,0.6) inscale,(0.3,0.7) inscale,(0.4,0.8) inscale,btex \\thwallaltitude %s etex);\n",thsymbolset__mp[SYMP_WALLALTITUDE],utf2tex("1510")); endfig; insfig(SYMP_ALTITUDE,thT("point altitude",layout->lang)); this->export_mp_symbol_options(mpf, SYMP_ALTITUDE); fprintf(mpf,"p_label.rt(btex \\thaltitude %s etex,((0.3,0.5) inscale),0,1);\n",utf2tex("1510")); endfig; // thT("point section") insfig(SYML_SECTION,thT("line section",layout->lang)); helpsymbol; if (true || (true || isused(SYML_WALL_BEDROCK))) { fprintf(mpf,"%s(((.25,1.0) .. (.2,.5){dir 270} .. (.15,0.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); fprintf(mpf,"%s(((.3,0.0) .. (.4,.5){dir 90} .. (.5,1.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); if (true || isused(SYMP_SECTION)) { fprintf(mpf,"%s(((.7,.5){dir 90} .. (.9,.75){dir 270} .. (.8,.15){dir 235} .. cycle) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); } } endhelpsymbol; this->export_mp_symbol_options(mpf, SYML_SECTION); fprintf(mpf,"%s(((0,.5) .. controls (.195,.5) and (.405,.5) .. (.6,.5)) inscale,1);\n",thsymbolset__mp[SYML_SECTION]); endfig; // vysky chodby #define insert_big_passage \ helpsymbol; \ if (true || isused(SYML_WALL_BEDROCK)) { \ fprintf(mpf,"%s(((.35,1.0) .. (.3,.5){dir 270} .. (.25,0.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ fprintf(mpf,"%s(((.6,0.0) .. (.7,.5){dir 90} .. (.8,1.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ } \ endhelpsymbol; #define insert_big_water_passage \ helpsymbol; \ if (true || isused(SYML_WALL_BEDROCK)) { \ fprintf(mpf,"%s(((.35,1.0) .. (.3,.5){dir 270} .. (.25,0.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ fprintf(mpf,"%s(((.6,0.0) .. (.7,.5){dir 90} .. (.8,1.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ } \ endhelpsymbol; // thT("point passage-height") insfig(SYMP_PASSAGEHEIGHT_UNSIGNED,thT("point passage-height:unsigned",layout->lang)); //insert_big_passage this->export_mp_symbol_options(mpf, SYMP_PASSAGEHEIGHT_UNSIGNED); fprintf(mpf,"p_label(btex \\thframed %s etex,((0.5,0.5) inscale),0,5);\n",utf2tex("5")); endfig; insfig(SYMP_PASSAGEHEIGHT_POSITIVE,thT("point passage-height:positive",layout->lang)); //insert_big_water_passage this->export_mp_symbol_options(mpf, SYMP_PASSAGEHEIGHT_POSITIVE); fprintf(mpf,"p_label(btex \\thframed %s etex,((0.5,0.5) inscale),0,2);\n",utf2tex("3")); endfig; insfig(SYMP_PASSAGEHEIGHT_NEGATIVE,thT("point passage-height:negative",layout->lang)); //insert_big_water_passage this->export_mp_symbol_options(mpf, SYMP_PASSAGEHEIGHT_NEGATIVE); fprintf(mpf,"p_label(btex \\thframed %s etex,((0.5,0.5) inscale),0,3);\n",utf2tex("2")); endfig; insfig(SYMP_PASSAGEHEIGHT_BOTH,thT("point passage-height:both",layout->lang)); //insert_big_water_passage this->export_mp_symbol_options(mpf, SYMP_PASSAGEHEIGHT_BOTH); fprintf(mpf,"p_label(btex \\thframed \\updown{%s}",utf2tex("3")); fprintf(mpf,"{%s} etex,((0.5,0.5) inscale),0,4);\n",utf2tex("2")); endfig; legend_hpoint(SYMP_AIRDRAUGHT,thT("point air-draught",layout->lang)); legend_hpoint(SYMP_AIRDRAUGHT_WINTER,thT("point air-draught:winter",layout->lang)); legend_hpoint(SYMP_AIRDRAUGHT_SUMMER,thT("point air-draught:summer",layout->lang)); thdate d; d.parse("1999.12.31"); insfig(SYMP_DATE,thT("point date",layout->lang)); //insert_big_water_passage this->export_mp_symbol_options(mpf, SYMP_DATE); fprintf(mpf,"p_label(btex \\thdate %s etex,((0.5,0.5) inscale),0,0);\n",utf2tex(d.get_str(TT_DATE_FMT_UTF8_ISO))); endfig; // ukoncenia #define legend_end(mid,txt) \ insfig(mid,txt); \ helpsymbol; \ if (true || isused(SYML_WALL_BEDROCK)) {\ fprintf(mpf,"%s(((0,.2){dir 30} .. {dir 0}(.5,.4)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ fprintf(mpf,"%s(((.5,.6){dir 180} .. {dir 210}(0,.8)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ } \ endhelpsymbol; \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s((.6,.5) inscale,270.0,1.0,(0,1));\n",thsymbolset__mp[mid]); \ endfig; legend_point(SYMP_DIG,thT("point dig",layout->lang)) legend_end(SYMP_CONTINUATION,thT("point continuation",layout->lang)) legend_end(SYMP_NARROWEND,thT("point narrow-end",layout->lang)) legend_end(SYMP_LOWEND,thT("point low-end",layout->lang)) legend_end(SYMP_FLOWSTONECHOKE,thT("point flowstone-choke",layout->lang)) legend_end(SYMP_BREAKDOWNCHOKE,thT("point breakdown-choke",layout->lang)) legend_end(SYMP_CLAYCHOKE,thT("point clay-choke",layout->lang)) #define legend_iuline "(((.1,.6) .. (.5,.4) .. (.9,.6)) inscale)" #define legend_cline "(((.85,.5){dir 90} .. (.5,.85){dir 180} .. (.4,.15){dir 0} .. cycle) inscale)" #define legend_scline "(((.5,.5){dir 90} .. (.3,.75){dir 180} .. (.15,.5) .. (.2,.25){dir 0} .. cycle) inscale)" #define legend_step(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(%s);\n",thsymbolset__mp[mid],legend_iuline); \ endfig; #define legend_cycle(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(%s);\n",thsymbolset__mp[mid],legend_cline); \ endfig; #define insert_small_passage \ helpsymbol; \ if (true || isused(SYML_WALL_BEDROCK)) { \ fprintf(mpf,"%s(((.2,1.0) .. (.15,.5){dir 270} .. (.1,0.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ fprintf(mpf,"%s(((.4,0.0) .. (.5,.5){dir 90} .. (.6,1.0)) inscale);\n",thsymbolset__mp[SYML_WALL_BEDROCK]); \ } \ endhelpsymbol; // zrazy + kominy + priepasti + gradient legend_step(SYML_FLOORSTEP,thT("line floor-step",layout->lang)); legend_step(SYML_OVERHANG,thT("line overhang",layout->lang)); legend_step(SYML_FLOORMEANDER,thT("line floor-meander",layout->lang)); legend_cycle(SYML_PIT,thT("line pit",layout->lang)); legend_step(SYML_CEILINGSTEP,thT("line ceiling-step",layout->lang)); legend_step(SYML_CEILINGMEANDER,thT("line ceiling-meander",layout->lang)); legend_cycle(SYML_CHIMNEY,thT("line chimney",layout->lang)); if isused(SYML_GRADIENT) { insfig(SYML_GRADIENT,thT("line gradient",layout->lang)); this->export_mp_symbol_options(mpf, SYML_GRADIENT); fprintf(mpf,"%s(((0.2,0.5) -- (0.8,0.5)) inscale);\n",thsymbolset__mp[SYML_GRADIENT]); endfig; } if ((!(isused(SYML_GRADIENT)) || (!(this->group_symbols)))) { this->export_mp_symbol_options(mpf, SYMP_GRADIENT); legend_hpoint(SYMP_GRADIENT,thT("point gradient",layout->lang)); } // thT("point height") // thT("point dimensions") insfig(SYMP_HEIGHT_UNSIGNED,thT("point height:unsigned",layout->lang)); helpsymbol; if isused(SYML_FLOORSTEP) { fprintf(mpf,"%s(((.15,.5){dir 340} .. (.5,.5)) inscale);\n",thsymbolset__mp[SYML_FLOORSTEP]); insert_small_passage } else if isused(SYML_PIT) { fprintf(mpf,"%s(((.15,.5){dir 340} .. (.5,.5)) inscale);\n",thsymbolset__mp[SYML_PIT]); insert_small_passage } endhelpsymbol; this->export_mp_symbol_options(mpf, SYMP_HEIGHT_UNSIGNED); fprintf(mpf,"p_label.rt(btex \\thheight %s etex,((0.5,0.5) inscale),0,7);\n",utf2tex("4")); endfig; insfig(SYMP_HEIGHT_POSITIVE,thT("point height:positive",layout->lang)); helpsymbol; if isused(SYML_CHIMNEY) fprintf(mpf,"%s(%s);\n",thsymbolset__mp[SYML_CHIMNEY],legend_scline); endhelpsymbol; this->export_mp_symbol_options(mpf, SYMP_HEIGHT_POSITIVE); fprintf(mpf,"p_label.rt(btex \\thheightpos %s etex,((0.5,0.5) inscale),0,7);\n",utf2tex("15")); endfig; insfig(SYMP_HEIGHT_NEGATIVE,thT("point height:negative",layout->lang)); helpsymbol; if isused(SYML_PIT) fprintf(mpf,"%s(%s);\n",thsymbolset__mp[SYML_PIT],legend_scline); endhelpsymbol; this->export_mp_symbol_options(mpf, SYMP_HEIGHT_NEGATIVE); fprintf(mpf,"p_label.rt(btex \\thheightneg %s etex,((0.5,0.5) inscale),0,7);\n",utf2tex("30")); endfig; insfig(SYML_CONTOUR,thT("line contour",layout->lang)); this->export_mp_symbol_options(mpf, SYML_CONTOUR); fprintf(mpf,"%s(%s,-1);\n",thsymbolset__mp[SYML_CONTOUR],legend_iuline); endfig; insfig(SYML_SLOPE,thT("line slope",layout->lang)); this->export_mp_symbol_options(mpf, SYML_SLOPE); fprintf(mpf,"%s((((.1,.35) .. (.5,.25) .. (.9,.35)) inscale),1,(0,-1,1u),(2,-1,1u));\n",thsymbolset__mp[SYML_SLOPE]); endfig; // kamene insfig(SYML_ROCKBORDER,thT("line rock-border",layout->lang)); this->export_mp_symbol_options(mpf, SYML_ROCKBORDER); fprintf(mpf,"%s(((.16,.36) -- (.61,.21) -- (.91,.46) -- (.84,.78) -- (.38,.86) -- (.20,.55) -- cycle) inscale)",thsymbolset__mp[SYML_ROCKBORDER]); endfig; insfig(SYML_ROCKEDGE,thT("line rock-edge",layout->lang)); helpsymbol; if isused(SYML_ROCKBORDER) fprintf(mpf,"%s(((.16,.36) -- (.61,.21) -- (.91,.46) -- (.84,.78) -- (.38,.86) -- (.20,.55) -- cycle) inscale)",thsymbolset__mp[SYML_ROCKBORDER]); endhelpsymbol; this->export_mp_symbol_options(mpf, SYML_ROCKEDGE); fprintf(mpf,"%s(((.16,.36) -- (.42,.62) -- (.38,.86) -- (.42,.62) -- (.6,.55) -- (.61,.21) -- (.6,.55) -- (.84,.78)) inscale)",thsymbolset__mp[SYML_ROCKEDGE]); endfig; // vypln bodova legend_point(SYMP_BEDROCK,thT("point bedrock",layout->lang)); legend_point(SYMP_BLOCKS,thT("point blocks",layout->lang)); legend_point(SYMP_DEBRIS,thT("point debris",layout->lang)); legend_point(SYMP_SAND,thT("point sand",layout->lang)); legend_point(SYMP_CLAY,thT("point clay",layout->lang)); legend_point(SYMP_WATER,thT("point water",layout->lang)); legend_point(SYMP_ICE,thT("point ice",layout->lang)); legend_point(SYMP_SNOW,thT("point snow",layout->lang)); legend_point(SYMP_PEBBLES,thT("point pebbles",layout->lang)); legend_point(SYMP_RAFT,thT("point raft",layout->lang)); legend_point(SYMP_GUANO,thT("point guano",layout->lang)); legend_point(SYMP_CLAYTREE,thT("point clay-tree",layout->lang)); // okraje // thT("line border") legend_cycle(SYML_BORDER_VISIBLE,thT("line border:visible",layout->lang)); legend_cycle(SYML_BORDER_TEMPORARY,thT("line border:temporary",layout->lang)); legend_cycle(SYML_BORDER_PRESUMED,thT("line border:presumed",layout->lang)); // vypln plosna #define legend_area(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(buildcycle((((-1,0) -- (1,0) -- (1,1) -- (0,1) -- (0,-1)) inscale)));\n",thsymbolset__mp[mid]); \ endfig; #define legend_nocliparea(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(buildcycle((((-4,-4) -- (4,-4) -- (4,4) -- (-4,4) -- (-4,-4)) inscale)));\n",thsymbolset__mp[mid]); \ endfig; legend_area(SYMA_WATER,thT("area water",layout->lang)); legend_area(SYMA_SUMP,thT("area sump",layout->lang)); legend_area(SYMA_SNOW,thT("area snow",layout->lang)); legend_area(SYMA_ICE,thT("area ice",layout->lang)); legend_area(SYMA_SAND,thT("area sand",layout->lang)); legend_area(SYMA_CLAY,thT("area clay",layout->lang)); legend_area(SYMA_PEBBLES,thT("area pebbles",layout->lang)); legend_area(SYMA_DEBRIS,thT("area debris",layout->lang)); legend_area(SYMA_FLOWSTONE,thT("area flowstone",layout->lang)); legend_area(SYMA_MOONMILK,thT("area moonmilk",layout->lang)); legend_nocliparea(SYMA_BLOCKS,thT("area blocks",layout->lang)); legend_nocliparea(SYMA_BEDROCK,thT("area bedrock",layout->lang)); // vodne toky (ciary, body) #define legend_waterflow(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(((0.2,0.8) -- (0.8,0.2)) inscale);\n",thsymbolset__mp[mid]); \ endfig; // thT("line water-flow") // thT("point water-flow") if (isused(SYML_WATERFLOW_PERMANENT) && isused(SYMP_WATERFLOW_PERMANENT) && this->group_symbols) { insfig(SYML_WATERFLOW_PERMANENT,thT("line water-flow:permanent",layout->lang)); this->export_mp_symbol_options(mpf, SYML_WATERFLOW_PERMANENT); fprintf(mpf,"%s(((0.1,0.3) -- (0.9,0.3)) inscale);\n",thsymbolset__mp[SYML_WATERFLOW_PERMANENT]); this->export_mp_symbol_options(mpf, SYMP_WATERFLOW_PERMANENT); fprintf(mpf,"%s((0.5,0.7) inscale,270.0,1.0,(0,0));\n",thsymbolset__mp[SYMP_WATERFLOW_PERMANENT]); endfig; } else { legend_waterflow(SYML_WATERFLOW_PERMANENT,thT("line water-flow:permanent",layout->lang)); legend_hpoint(SYMP_WATERFLOW_PERMANENT,thT("point water-flow:permanent",layout->lang)); } if (isused(SYML_WATERFLOW_INTERMITTENT) && isused(SYMP_WATERFLOW_INTERMITTENT) && this->group_symbols) { insfig(SYML_WATERFLOW_INTERMITTENT,thT("line water-flow:intermittent",layout->lang)); this->export_mp_symbol_options(mpf, SYML_WATERFLOW_INTERMITTENT); fprintf(mpf,"%s(((0.1,0.3) -- (0.9,0.3)) inscale);\n",thsymbolset__mp[SYML_WATERFLOW_INTERMITTENT]); this->export_mp_symbol_options(mpf, SYML_WATERFLOW_INTERMITTENT); fprintf(mpf,"%s((0.5,0.7) inscale,270.0,1.0,(0,0));\n",thsymbolset__mp[SYMP_WATERFLOW_INTERMITTENT]); endfig; } else { legend_waterflow(SYML_WATERFLOW_INTERMITTENT,thT("line water-flow:intermittent",layout->lang)); legend_hpoint(SYMP_WATERFLOW_INTERMITTENT,thT("point water-flow:intermittent",layout->lang)); } legend_waterflow(SYML_WATERFLOW_CONJECTURAL,thT("line water-flow:conjectural",layout->lang)); legend_hpoint(SYMP_WATERFLOW_PALEO,thT("point water-flow:paleo",layout->lang)); insfig(SYMP_SPRING,thT("point spring",layout->lang)); helpsymbol; fprintf(mpf,"%s(((0.3,0.5) -- (0.9,0.5)) inscale);\n",thsymbolset__mp[SYML_WATERFLOW_PERMANENT]); endhelpsymbol; this->export_mp_symbol_options(mpf, SYMP_SPRING); fprintf(mpf,"%s((0.3,0.5) inscale,270,1.0,(0,-1));\n",thsymbolset__mp[SYMP_SPRING]); endfig; insfig(SYMP_SINK,thT("point sink",layout->lang)); helpsymbol; fprintf(mpf,"%s(((0.1,0.5) -- (0.7,0.5)) inscale);\n",thsymbolset__mp[SYML_WATERFLOW_PERMANENT]); endhelpsymbol; this->export_mp_symbol_options(mpf, SYMP_SINK); fprintf(mpf,"%s((0.7,0.5) inscale,270,1.0,(0,1));\n",thsymbolset__mp[SYMP_SINK]); endfig; // vyzdoba if (isused(SYMP_FLOWSTONE) && isused(SYML_FLOWSTONE) && this->group_symbols) { insfig(SYMP_FLOWSTONE,thT("point flowstone",layout->lang)); this->export_mp_symbol_options(mpf, SYML_FLOWSTONE); fprintf(mpf,"%s(((.1,.4) .. (.5,.2) .. (.9,.4)) inscale);\n",thsymbolset__mp[SYML_FLOWSTONE]); this->export_mp_symbol_options(mpf, SYMP_FLOWSTONE); fprintf(mpf,"%s((0.5,0.7) inscale,0.0,1.0,(0,0));\n",thsymbolset__mp[SYMP_FLOWSTONE]); endfig; } else { legend_point(SYMP_FLOWSTONE,thT("point flowstone",layout->lang)); legend_step(SYML_FLOWSTONE,thT("line flowstone",layout->lang)); } if (isused(SYMP_MOONMILK) && isused(SYML_MOONMILK) && this->group_symbols) { insfig(SYMP_MOONMILK,thT("point moonmilk",layout->lang)); this->export_mp_symbol_options(mpf, SYML_MOONMILK); fprintf(mpf,"%s(((.1,.4) .. (.5,.2) .. (.9,.4)) inscale);\n",thsymbolset__mp[SYML_MOONMILK]); this->export_mp_symbol_options(mpf, SYMP_MOONMILK); fprintf(mpf,"%s((0.5,0.7) inscale,0.0,1.0,(0,0));\n",thsymbolset__mp[SYMP_MOONMILK]); endfig; } else { legend_point(SYMP_MOONMILK,thT("point moonmilk",layout->lang)); legend_step(SYML_MOONMILK,thT("line moonmilk",layout->lang)); } legend_point(SYMP_STALACTITE,thT("point stalactite",layout->lang)); legend_point(SYMP_STALACTITES,thT("point stalactites",layout->lang)); legend_point(SYMP_STALAGMITE,thT("point stalagmite",layout->lang)); legend_point(SYMP_STALAGMITES,thT("point stalagmites",layout->lang)); legend_point(SYMP_PILLAR,thT("point pillar",layout->lang)); legend_point(SYMP_PILLARS,thT("point pillars",layout->lang)); legend_point(SYMP_ICESTALACTITE,thT("point ice-stalactite",layout->lang)); legend_point(SYMP_ICESTALAGMITE,thT("point ice-stalagmite",layout->lang)); legend_point(SYMP_ICEPILLAR,thT("point ice-pillar",layout->lang)); legend_point(SYMP_CURTAIN,thT("point curtain",layout->lang)); legend_point(SYMP_SODASTRAW,thT("point soda-straw",layout->lang)); legend_point(SYMP_POPCORN,thT("point popcorn",layout->lang)); legend_point(SYMP_CAVEPEARL,thT("point cave-pearl",layout->lang)); legend_point(SYMP_DISK,thT("point disk",layout->lang)); legend_point(SYMP_HELICTITE,thT("point helictite",layout->lang)); legend_point(SYMP_ARAGONITE,thT("point aragonite",layout->lang)); legend_point(SYMP_CRYSTAL,thT("point crystal",layout->lang)); legend_point(SYMP_WALLCALCITE,thT("point wall-calcite",layout->lang)); legend_point(SYMP_GYPSUM,thT("point gypsum",layout->lang)); legend_point(SYMP_GYPSUMFLOWER,thT("point gypsum-flower",layout->lang)); legend_point(SYMP_RIMSTONEDAM,thT("point rimstone-dam",layout->lang)); legend_point(SYMP_RIMSTONEPOOL,thT("point rimstone-pool",layout->lang)); legend_point(SYMP_ANASTOMOSIS,thT("point anastomosis",layout->lang)); legend_point(SYMP_KARREN,thT("point karren",layout->lang)); legend_point(SYMP_SCALLOP,thT("point scallop",layout->lang)); legend_point(SYMP_FLUTE,thT("point flute",layout->lang)); legend_point(SYMP_RAFTCONE,thT("point raft-cone",layout->lang)); // ostatne materialy legend_point(SYMP_ARCHEOMATERIAL,thT("point archeo-material",layout->lang)); legend_point(SYMP_PALEOMATERIAL,thT("point paleo-material",layout->lang)); legend_point(SYMP_VEGETABLEDEBRIS,thT("point vegetable-debris",layout->lang)); legend_point(SYMP_ROOT,thT("point root",layout->lang)); #define legend_eqline(mid,txt) \ insfig(mid,txt); \ this->export_mp_symbol_options(mpf, mid); \ fprintf(mpf,"%s(((0.1,0.5) .. (0.9,.5)) inscale);\n",thsymbolset__mp[mid]); \ endfig; // vystroj legend_point(SYMP_NOEQUIPMENT,thT("point no-equipment",layout->lang)); legend_point(SYMP_ANCHOR,thT("point anchor",layout->lang)); legend_point(SYMP_ROPE,thT("point rope",layout->lang)); legend_eqline(SYML_ROPE,thT("line rope",layout->lang)); legend_point(SYMP_ROPELADDER,thT("point rope-ladder",layout->lang)); legend_eqline(SYML_ROPELADDER,thT("line rope-ladder",layout->lang)); legend_point(SYMP_FIXEDLADDER,thT("point fixed-ladder",layout->lang)); legend_eqline(SYML_FIXEDLADDER,thT("line fixed-ladder",layout->lang)); legend_point(SYMP_STEPS,thT("point steps",layout->lang)); insfig(SYML_STEPS,thT("line steps",layout->lang)); this->export_mp_symbol_options(mpf, SYML_STEPS); fprintf(mpf,"%s(((0.1,0.3) -- (0.9,.3) -- (0.9,0.7) -- (0.1,0.7) -- cycle) inscale);\n",thsymbolset__mp[SYML_STEPS]); endfig; legend_point(SYMP_VIAFERRATA,thT("point via-ferrata",layout->lang)); legend_eqline(SYML_VIAFERRATA,thT("line via-ferrata",layout->lang)); legend_point(SYMP_TRAVERSE,thT("point traverse",layout->lang)); legend_point(SYMP_BRIDGE,thT("point bridge",layout->lang)); legend_point(SYMP_HANDRAIL,thT("point handrail",layout->lang)); legend_eqline(SYML_HANDRAIL,thT("line handrail",layout->lang)); legend_point(SYMP_CAMP,thT("point camp",layout->lang)); // thT("point remark") // thT("point label") // thT("line label") // nakoniec prejde uzivatelsky definovane symboly thdb2d_udef_map::iterator it; std::string udef_desc; int mid = SYMX_; if (layout->db != NULL) { for(it = layout->db->db2d.m_udef_map.begin(); it != layout->db->db2d.m_udef_map.end(); it++) { if (it->second->m_assigned && (it->second->m_used || (layout->legend == TT_LAYOUT_LEGEND_ALL))) { switch (it->first.m_command) { case TT_POINT_CMD: udef_desc = "point"; break; case TT_LINE_CMD: udef_desc = "line"; break; case TT_AREA_CMD: udef_desc = "area"; break; } udef_desc += " u:"; udef_desc += it->first.m_type; if (strlen(thT(udef_desc.c_str(), layout->lang)) > 0) { insfig(0,thsymbolset__mp[0]); switch (it->first.m_command) { case TT_POINT_CMD: fprintf(mpf,"p_u_%s_legend;\n",it->first.m_type); break; case TT_LINE_CMD: fprintf(mpf,"l_u_%s_legend;\n",it->first.m_type); break; case TT_AREA_CMD: fprintf(mpf,"a_u_%s_legend;\n",it->first.m_type); break; } LEGENDITEM->descr = thT(udef_desc.c_str(), layout->lang); LEGENDITEM->idsym = (unsigned) mid++; endfig; } } } } } void export_all_symbols() { // vytvori si temporary MP subor FILE * mpf; thlayout tmplayout; tmplayout.lang = THLANG_SYSTEM; mpf = fopen(thtmp.get_file_name("data.mp"),"w"); // spusti metapost a nasledne pdftex // fprintf(mpf,"Scale:=%.2f;\n",0.01 / tmplayout.scale); // if (tmplayout.def_base_scale || tmplayout.redef_base_scale) // fprintf(mpf,"BaseScale:=%.2f;\n",0.01 / tmplayout.base_scale); fprintf(mpf,"Scale:=0.8;\n"); fprintf(mpf,"BaseScale:=2;\n"); fprintf(mpf,"color HelpSymbolColor;\nHelpSymbolColor := (0.8, 0.8, 0.8);\n"); fprintf(mpf,"background:=(1.0, 1.0, 1.0);\n"); fprintf(mpf,"verbatimtex \\input th_enc.tex etex;\n"); if (thcmdln.extern_libs) fprintf(mpf,"input therion;\n"); else fprintf(mpf,"%s\n",thmpost_library); fprintf(mpf,"lang:=\"%s\";\n",thlang_getid(tmplayout.lang)); if (ENC_NEW.NFSS==0) fprintf(mpf,"defaultfont:=\"%s\";\n",FONTS.begin()->ss.c_str()); else fprintf(mpf,"defaultfont:=\"thss00\";\n"); tmplayout.export_mpost(mpf); fprintf(mpf,"background:=white;\n"); fprintf(mpf,"transparency:=false;\n"); // vyexportuje secky znacky size_t iset, isym; unsigned figi = 1; thsymbolset symset; thsymsets_symbols_init(); list::iterator li; // najprv exportujeme secky defaultne tmplayout.legend = TT_LAYOUT_LEGEND_ALL; LEGENDLIST.clear(); symset.group_symbols = false; symset.export_pdf(&tmplayout, mpf, figi); for(isym = 0; isym < thsymbolset_size; isym++) { thsymsets_figure[isym][thsymsets_size] = 0; thsymsets_order[isym] = 0; } for(li = LEGENDLIST.begin(); li != LEGENDLIST.end(); li++) { thsymsets_figure[li->idsym][thsymsets_size] = li->idfig; thsymsets_comment[li->idsym] = li->descr; thsymsets_order[li->idnum] = li->idsym; } tmplayout.legend = TT_LAYOUT_LEGEND_ON; for (iset = 0; iset < thsymsets_size; iset++) { LEGENDLIST.clear(); symset.export_symbol_defaults(mpf, thsymsets[iset]); for(isym = 0; isym < thsymbolset_size; isym++) { if (thsymsets_symbols[isym][iset] > 0) symset.used[isym] = true; else symset.used[isym] = false; } symset.export_pdf(&tmplayout, mpf, figi); for(isym = 0; isym < thsymbolset_size; isym++) { thsymsets_figure[isym][iset] = 0; } thsymsets_count[iset] = 0; for(li = LEGENDLIST.begin(); li != LEGENDLIST.end(); li++) { thsymsets_figure[li->idsym][iset] = li->idfig; thsymsets_count[iset]++; } } fprintf(mpf,"end;\n"); fclose(mpf); // run MP thbuffer com, wdir; wdir.guarantee(1024); getcwd(wdir.get_buffer(),1024); chdir(thtmp.get_dir_name()); // vypise kodovania print_fonts_setup(); int retcode; #ifdef THWIN32 if (!thini.tex_env) { putenv("TEXMFCNF="); putenv("DVIPSHEADERS="); putenv("GFFONTS="); putenv("GLYPHFONTS="); putenv("MFBASES="); putenv("MFINPUTS="); putenv("MFPOOL="); #ifdef THMSVC putenv("MPINPUTS=../mpost;."); #else putenv("MPINPUTS="); #endif putenv("MPMEMS="); putenv("MPPOOL="); putenv("MPSUPPORT="); putenv("PKFONTS="); putenv("PSHEADERS="); putenv("T1FONTS="); putenv("T1INPUTS="); putenv("T42FONTS="); putenv("TEXCONFIG="); putenv("TEXDOCS="); putenv("TEXFONTMAPS="); putenv("TEXFONTS="); putenv("TEXFORMATS="); putenv("TEXINPUTS="); putenv("TEXMFDBS="); putenv("TEXMFINI="); putenv("TEXPICTS="); putenv("TEXPKS="); putenv("TEXPOOL="); putenv("TEXPSHEADERS="); putenv("TEXSOURCES="); putenv("TFMFONTS="); putenv("TTFONTS="); putenv("VFFONTS="); putenv("WEB2C="); } #endif // exportuje com = "\""; com += thini.get_path_mpost(); com += "\" "; com += thini.get_opt_mpost(); // com += " --interaction nonstopmode data.mp"; com += " data.mp"; #ifdef THDEBUG thprintf("running metapost\n"); #endif retcode = system(com.get_buffer()); thsymbolset_log_log_file("data.log", "####################### metapost log file ########################\n", "#################### end of metapost log file ####################\n",true); if (retcode != EXIT_SUCCESS) { chdir(wdir.get_buffer()); ththrow(("metapost exit code -- %d", retcode)) } thconvert_new(); chdir(wdir.get_buffer()); ofstream hf ("symbols.xhtml"); hf << "\n"; hf << "Therion symbols\n\n"; hf << "\n\n\n"; for(iset = 0; iset < thsymsets_size; iset++) { if (thsymsets_count[iset] > 0) { hf << "\n"; } } hf << "\n"; unsigned sx, fx; char fname[100]; converted_data svgpict; double a,b,c,d; for(isym = 0; isym < thsymbolset_size; isym++) { if(thsymsets_order[isym] > 0) { sx = thsymsets_order[isym]; hf << "\n\n"; fx = 0; for(iset = 0; iset < thsymsets_size; iset++) { fx += thsymsets_figure[sx][iset]; } if (fx > 0) { for(iset = 0; iset < thsymsets_size; iset++) { if (thsymsets_count[iset] > 0) { fx = thsymsets_figure[sx][iset]; if (fx > 0) { sprintf(fname, "%s/data.%d", thtmp.get_dir_name(),fx); parse_eps(fname,"",0,0,a,b,c,d,svgpict); hf << "\n"; } else { hf << "\n"; } } } } else { sprintf(fname, "%s/data.%d", thtmp.get_dir_name(),thsymsets_figure[sx][thsymsets_size]); parse_eps(fname,"",0,0,a,b,c,d,svgpict); hf << "\n"; } hf << "\n"; } } hf << "
Symbol set" << thsymsets[iset] << "
" << thsymsets_comment[sx].c_str() << "\n"; svgpict.print_svg(hf); hf << ""; svgpict.print_svg(hf); hf << "
\n"; hf << "" << endl; hf.close(); } void thsymbolset::export_mp_symbol_options(FILE * mpf, int sym_id) { if ((sym_id >= 0) && (this->color[sym_id].defined)) { fprintf(mpf,"drawoptions(withcolor (%.6f,%.6f,%.6f));\n", this->color[sym_id].R, this->color[sym_id].G, this->color[sym_id].B); } else { fprintf(mpf,"drawoptions();\n"); } } void thsymbolset::export_mp_symbol_options(thexception * x, int sym_id) { if ((sym_id >= 0) && (this->color[sym_id].defined)) { x->appspf("drawoptions(withcolor (%.6f,%.6f,%.6f));\n", this->color[sym_id].R, this->color[sym_id].G, this->color[sym_id].B); } else { x->appspf("drawoptions();\n"); } } bool thsymbolset::is_assigned(int symbol) { if (symbol < SYMX_) return this->assigned[symbol]; if (symbol > SYMX_) { int id = 0; int cid = thsymbolset__get_group(symbol,id++); while (cid >= 0) { if (this->assigned[cid]) return true; cid = thsymbolset__get_group(symbol,id++); } } return false; } therion/thdataleg.cxx0000664000175000017500000001567112255654622013752 0ustar useruser/** * @file thdataleg.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdataleg.h" #include "thcs.h" #ifdef THMSVC #define hypot _hypot #endif thdataleg::thdataleg() { this->clear(); } thdataleg::~thdataleg() { } void thdataleg::clear() { this->is_valid = false; this->data_type = TT_DATATYPE_UNKNOWN; this->psurvey = NULL; this->s_mark = TT_DATAMARK_UNKNOWN; this->flags = TT_LEGFLAG_NONE; this->gridcs = TTCS_LOCAL; this->station.clear(); this->from.clear(); this->to.clear(); this->length = thnan; this->counter = thnan; this->fromcounter = thnan; this->tocounter = thnan; this->depth = thnan; this->fromdepth = thnan; this->todepth = thnan; this->depthchange = thnan; this->bearing = thnan; this->gradient = thnan; this->backbearing = thnan; this->backgradient = thnan; this->dx = thnan; this->dy = thnan; this->dz = thnan; this->total_length = thnan; this->total_bearing = thnan; this->total_gradient = thnan; this->total_dx = thnan; this->total_dy = thnan; this->total_dz = thnan; this->total_sdx = thnan; this->total_sdy = thnan; this->total_sdz = thnan; this->adj_dx = thnan; this->adj_dy = thnan; this->adj_dz = thnan; this->fxx = thnan; this->txx = thnan; this->extend = TT_EXTENDFLAG_NORMAL; this->length_sd = thnan; this->counter_sd = thnan; this->depth_sd = thnan; this->bearing_sd = thnan; this->gradient_sd = thnan; this->dx_sd = thnan; this->dy_sd = thnan; this->dz_sd = thnan; this->x_sd = thnan; this->y_sd = thnan; this->z_sd = thnan; this->declination = thnan; this->implicit_declination = 0.0; this->from_up = thnan; this->from_down = thnan; this->from_left = thnan; this->from_right = thnan; this->to_up = thnan; this->to_down = thnan; this->to_left = thnan; this->to_right = thnan; this->walls = TT_AUTO; this->shape = TT_DATALEG_SHAPE_UNKNOWN; this->vtresh = thnan; this->infer_plumbs = false; this->infer_equates = false; this->direction = true; this->adjusted = false; this->to_be_adjusted = false; this->topofil = false; this->plumbed = false; } thdatafix::thdatafix() { this->station.clear(); this->psurvey = NULL; this->x = thnan; this->y = thnan; this->z = thnan; this->sdx = thnan; this->sdy = thnan; this->sdz = thnan; this->cxy = thnan; this->cyz = thnan; this->cxz = thnan; } thdatass::thdatass() { this->station.clear(); this->comment = NULL; this->flags = TT_STATIONFLAG_NONE; this->psurvey = NULL; this->explored = thnan; } thdataequate::thdataequate() { this->station.clear(); this->eqid = 0; this->psurvey = NULL; } void thdataleg::calc_total_stds() { // this->total_sdx = this->total_length; // this->total_sdy = this->total_length; // this->total_sdz = this->total_length; // // if (this->data_type == TT_DATATYPE_NORMAL) { // if ((thisinf(this->gradient) == -1) || (thisinf(this->gradient) == 1)) { // this->total_sdx = 0.0; // this->total_sdy = 0.0; // } // } double dx, dy, dz, dL, dl, dT, dC, ddx, ddy, ddz, dh, dZ; #define setd(a,b,v) if (thisnan(b)) a = v; else a = b; setd(dx, this->x_sd, 0.057735026919); setd(dy, this->y_sd, 0.057735026919); setd(dz, this->z_sd, 0.057735026919); setd(dL, this->length_sd, 0.1); setd(dh, this->length_sd, 0.1); setd(dl, this->counter_sd, 0.1); setd(dZ, this->depth_sd, 0.1); setd(dT, this->bearing_sd, 1.0); dT = dT / 180.0 * 3.14159265359; setd(dC, this->gradient_sd, 1.0); dC = dC / 180.0 * 3.14159265359; setd(ddx, this->dx_sd, 0.057735026919); setd(ddy, this->dy_sd, 0.057735026919); setd(ddz, this->dz_sd, 0.057735026919); this->total_sdx = 0.003333333333; this->total_sdy = 0.003333333333; this->total_sdz = 0.003333333333; double x,y,z,T,C,L,h; x = this->total_dx; y = this->total_dy; z = this->total_dz; T = this->total_bearing / 180.0 * 3.14159265359; C = this->total_gradient / 180.0 * 3.14159265359; L = this->total_length; h = hypot(this->total_dx, this->total_dy); if (this->topofil) { dL = 1.41421356237 * dl; } #define pow2(x) ((x) * (x)) switch (this->data_type) { case TT_DATATYPE_NORMAL: if ((thisinf(this->gradient) == -1) || (thisinf(this->gradient) == 1)) { this->total_sdx = 0.0; this->total_sdy = 0.0; } else { if (L > 0.0) { this->total_sdx = pow2(dx) + pow2(x * dL / L) + pow2(y * dT) + (0.5 + pow2(sin(T) * cos(C))) * pow2(z * dC); this->total_sdy = pow2(dy) + pow2(y * dL / L) + pow2(x * dT) + (0.5 + pow2(cos(T) * cos(C))) * pow2(z * dC); } } if (L > 0.0) this->total_sdz = pow2(dz) + pow2(z * dL / L) + pow2(L * cos(C) * dC); break; case TT_DATATYPE_DIVING: if (pow2(h) <= (2 * pow2(dZ) + pow2(dL))) { this->total_sdx = 2 * pow2(dZ) + pow2(dL); this->total_sdy = this->total_sdx; } else { if (h > 0.0) { this->total_sdx = pow2(dx) + pow2(x * dL / L) + pow2(y * dT) + pow2(dZ * z * sin(T) / h); this->total_sdy = pow2(dy) + pow2(y * dL / L) + pow2(x * dT) + pow2(dZ * z * cos(T) / h); } } this->total_sdz = 2 * pow2(dZ); break; case TT_DATATYPE_CYLPOLAR: if (h > 0.0) { this->total_sdx = pow2(dx) + pow2(x * dL / h) + pow2(y * dT); this->total_sdy = pow2(dy) + pow2(y * dL / h) + pow2(x * dT); } this->total_sdz = pow2(dz) + pow2(dZ); break; case TT_DATATYPE_CARTESIAN: default: this->total_sdx = pow2(dx) + pow2(ddx); this->total_sdy = pow2(dy) + pow2(ddy); this->total_sdz = pow2(dz) + pow2(ddz); break; } } void thdataleg::export_mp_flags(FILE * out) { fprintf(out, "ATTR__shotflag_splay := %s;\n", (((this->flags & TT_LEGFLAG_SPLAY) != 0) ? "true" : "false")); fprintf(out, "ATTR__shotflag_duplicate := %s;\n", (((this->flags & TT_LEGFLAG_DUPLICATE) != 0) ? "true" : "false")); fprintf(out, "ATTR__shotflag_approx := %s;\n", (((this->flags & TT_LEGFLAG_APPROXIMATE) != 0) ? "true" : "false")); } therion/thmapstat.cxx0000664000175000017500000003641112430721105013777 0ustar useruser/** * @file thmapstat.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thmapstat.h" #include "thscrap.h" #include "thdata.h" #include "thmap.h" #include "thdataobject.h" #include "thlayout.h" #include "thlang.h" #include "thversion.h" #include "thtexfonts.h" #include "thsurvey.h" #include "thdb1d.h" #include "thconfig.h" #include "thcs.h" #include bool operator < (const thmapstat_data & c1, const thmapstat_data & c2) { return (c1.crit < c2.crit); } bool operator < (const thmapstat_copyright & c1, const thmapstat_copyright & c2) { return (strcmp(c1.str,c2.str) < 0); } bool operator < (const thmapstat_dataptr & c1, const thmapstat_dataptr & c2) { return (c1.ptr->id < c2.ptr->id); } thmapstat_data::thmapstat_data() { this->crit = 0.0; } thmapstat_dataptr::thmapstat_dataptr() { this->ptr = NULL; } thmapstat::thmapstat() { scanned = false; } void thmapstat::resetdata() { this->data.clear(); this->surveyed_by.clear(); this->discovered_by.clear(); this->surveyed_date.reset(); this->discovered_date.reset(); } void thmapstat::adddata(thmapstat_datamap * dm) { // prejde vsetky data, prida si ich a ak ich nema, prida // si z nich meracov a objavitelov thmapstat_datamap::iterator ii; #ifdef THDEBUG double sumsum = 0.0; thprintf("\nBEFORE:\n"); for(ii = this->data.begin(); ii != this->data.end(); ii++) { sumsum += ii->first.ptr->stat_length + ii->first.ptr->stat_dlength; thprintf(" %d (+ %.0f = %.0f) [%s]\n",ii->first.ptr->id, ii->first.ptr->stat_length + ii->first.ptr->stat_dlength, sumsum, ii->first.ptr->fsptr->full_name); } thprintf("\n"); #endif ii = dm->begin(); while (ii != dm->end()) { if (this->data.find(ii->first) == this->data.end()) { this->data[ii->first] = 2; #ifdef THDEBUG sumsum += ii->first.ptr->stat_length + ii->first.ptr->stat_dlength; thprintf(" + %d (+ %.0f = %.0f) [%s]\n",ii->first.ptr->id, ii->first.ptr->stat_length + ii->first.ptr->stat_dlength, sumsum, ii->first.ptr->fsptr->full_name); #endif thdata_team_set_type::iterator ti; for(ti = ii->first.ptr->team_set.begin(); ti != ii->first.ptr->team_set.end(); ti++) { this->surveyed_by[*ti].crit += ii->first.ptr->stat_length + ii->first.ptr->stat_dlength; this->surveyed_by[*ti].date.join(ii->first.ptr->date); } this->surveyed_date.join(ii->first.ptr->date); for(ti = ii->first.ptr->discovery_team_set.begin(); ti != ii->first.ptr->discovery_team_set.end(); ti++) { this->discovered_by[*ti].crit += ii->first.ptr->stat_length + ii->first.ptr->stat_dlength; this->discovered_by[*ti].date.join(ii->first.ptr->discovery_date); } this->discovered_date.join(ii->first.ptr->discovery_date); } ii++; } } void thmapstat::addstat(thmapstat * source) { // prejde vsetkych zdrojovych autorov a copyrighty a prida // si ich thmapstat_personmap::iterator aii; for (aii = source->drawn_by.begin(); aii != source->drawn_by.end(); aii++) { this->drawn_by[aii->first].crit += aii->second.crit; this->drawn_by[aii->first].date.join(aii->second.date); } this->drawn_date.join(source->drawn_date); thmapstat_copyrightmap::iterator cii; for (cii = source->copyright.begin(); cii != source->copyright.end(); cii++) { this->copyright[cii->first].crit += cii->second.crit; this->copyright[cii->first].date.join(cii->second.date); } this->adddata(&(source->data)); } void thmapstat::addobj(thdataobject * obj) { // prejde vsetkych zdrojovych autorov a copyrighty a prida // si ich thdo_author_map_type::iterator aii; for (aii = obj->author_map.begin(); aii != obj->author_map.end(); aii++) { this->drawn_by[aii->first.name].crit += 1.0; this->drawn_by[aii->first.name].date.join(aii->second); this->drawn_date.join(aii->second); } thdo_copyright_map_type::iterator cii; thmapstat_copyright tmpc; for (cii = obj->copyright_map.begin(); cii != obj->copyright_map.end(); cii++) { tmpc.str = cii->first.name; this->copyright[tmpc].crit += 1.0; this->copyright[tmpc].date.join(cii->second); } } void thmapstat::scanmap(class thmap * map) { // upravi mape mapstat (rekurzivne), ak nebola scanovana if (map->stat.scanned) return; // prejde najprv podmapy - // ak mapy - tak zavola scanmap z ich statu a prida ich do map->statu // ak scrapy - tak prida do map->statu manualne autorov, copyrighty a // data, ktore maju viac ako 2 body thdb2dmi * mi = map->first_item; thmap * mapp; thscrap * scrapp; while (mi != NULL) { if (mi->type == TT_MAPITEM_NORMAL) { switch (mi->object->get_class_id()) { case TT_MAP_CMD: mapp = (thmap *) mi->object; mapp->stat.scanmap(mapp); map->stat.addstat(&(mapp->stat)); break; case TT_SCRAP_CMD: scrapp = (thscrap *) mi->object; scrapp->get_polygon(); map->stat.addobj(scrapp); map->stat.adddata(&(scrapp->adata)); break; } } mi = mi->next_item; } if (map->asoc_survey.psurvey != NULL) { map->stat.resetdata(); thmapstat_datamap dm; thmapstat_dataptr dp; thdataobject * obj; for(thdb_object_list_type::iterator it = thdb.object_list.begin(); it != thdb.object_list.end(); it++) { obj = *it; if ((obj->get_class_id() == TT_DATA_CMD) && (obj->is_in_survey(map->asoc_survey.psurvey))) { dp.ptr = (thdata*)obj; dm[dp] = 1; } } map->stat.adddata(&dm); } // potom prida do map->statu autorov a copyrighty z map // map->stat.addobj(map); // nakoniec nastavi ze uz bola scanovana map->stat.scanned = true; } struct thmapstat_person_data { thperson person; double crit; }; int thmapstat_person_data_compar(const void * d1, const void * d2) { thmapstat_person_data * p1 = (thmapstat_person_data *) d1, * p2 = (thmapstat_person_data *) d2; if (p1->crit < p2->crit) return 1; else if (p1->crit > p2->crit) return -1; else if (p1->person < p2->person) return -1; else if (p1->person == p2->person) return 0; else return 1; } #define thmapstat_print_team(team_map, team_name, max_items, alphasort, teamstr) \ fprintf(f,"\\" team_name "={"); \ pd = new thmapstat_person_data [team_map.size()]; \ i = 0; \ for (pi = team_map.begin(); \ pi != team_map.end(); pi++) { \ pd[i].person = pi->first; \ if (alphasort) \ pd[i].crit = 0.0; \ else \ pd[i].crit = pi->second.crit; \ i++; \ } \ qsort(pd,cnt,sizeof(thmapstat_person_data),thmapstat_person_data_compar); \ if (max_items >= 0) \ tcnt = (unsigned long)(max_items); \ else \ tcnt = cnt; \ for (i = 0; i < tcnt; i++) { \ b = pd[i].person.get_n1(); \ b += " "; \ b += pd[i].person.get_n2(); \ if (show_lengths) { \ b += " ("; \ b += layout->units.format_length(pd[i].crit); \ b += ""; \ b += layout->units.format_i18n_length_units(); \ b += ")"; \ } \ if (i < (tcnt-1)) \ b += ","; \ fprintf(f,"%s%s",utf2tex(b.get_buffer()),(i < (tcnt-1) ? "\n" : "")); \ teamstr += thutf82xhtml(b.get_buffer()); \ } \ fprintf(f,"}\n"); // snprintf(c.get_buffer(),127,"%.0f",pd[i].crit); // b += c.get_buffer(); // b += thT("units m",layout->lang); double thmapstat::get_length() { double clen = 0.0; thmapstat_datamap::iterator ii; for(ii = this->data.begin(); ii != this->data.end(); ii++) { clen += ii->first.ptr->stat_length; } return clen; } #define check_z(st) { \ if (st != NULL) { \ if (!z_any) { \ z_top = st->z; \ z_bot = st->z; \ z_any = true; \ } else { \ if (z_top < st->z) z_top = st->z; \ if (z_bot > st->z) z_bot = st->z; \ } \ } \ } double thmapstat::get_depth() { double z_top = 0.0, z_bot = 0.0; bool z_any = false; thmapstat_datamap::iterator ii; for(ii = this->data.begin(); ii != this->data.end(); ii++) { check_z(ii->first.ptr->stat_st_top); check_z(ii->first.ptr->stat_st_bottom); } return (z_top - z_bot); } void thmapstat::export_pdftex(FILE * f, class thlayout * layout, legenddata * ldata) { thbuffer b,c; unsigned long i, cnt, tcnt; thmapstat_personmap::iterator pi; thmapstat_copyrightmap::iterator ci; thmapstat_datamap::iterator ii; thmapstat_person_data * pd; bool show_lengths, z_any = false; double clen = 0.0, z_top = 0.0, z_bot = 0.0; c.guarantee(256); b.guarantee(256); fprintf(f,"\\thversion={%s}\n",THVERSION); thdate dt; dt.reset_current(); double cy = dt.get_start_year(); dt.shour = -1; fprintf(f,"\\currentdate={%s}\n",utf2tex(dt.get_str(TT_DATE_FMT_LOCALE))); fprintf(f,"\\northdir={%s}\n",layout->north == TT_LAYOUT_NORTH_GRID ? "grid" : "true"); if (thcfg.outcs == TTCS_LOCAL) { fprintf(f,"\\outcscode={local}\n"); fprintf(f,"\\outcsname={Local coordinate system}\n"); fprintf(f,"\\magdecl={N/A}\n"); fprintf(f,"\\gridconv={N/A}\n"); } else { fprintf(f,"\\outcscode={%s}\n",utf2tex(thcs_get_name(thcfg.outcs))); fprintf(f,"\\outcsname={%s}\n",utf2tex(thcs_get_data(thcfg.outcs)->prjname)); double md; thcfg.get_outcs_mag_decl(cy, md); fprintf(f,"\\magdecl={%.2f}\n", md); fprintf(f,"\\gridconv={%.2f}\n", thcfg.get_outcs_convergence()); } for(ii = this->data.begin(); ii != this->data.end(); ii++) { check_z(ii->first.ptr->stat_st_top); check_z(ii->first.ptr->stat_st_bottom); clen += ii->first.ptr->stat_length; } ldata->cavelength = ""; ldata->cavelengthtitle = ""; if (clen > 0) { //b = ""; //snprintf(b.get_buffer(),255,"%.0f",clen); b = layout->units.format_length(clen); b += ""; //b += thT("units m",layout->lang); b += layout->units.format_i18n_length_units(); fprintf(f,"\\cavelengthtitle={%s}\n",utf2tex(thT("title cave length",layout->lang))); fprintf(f,"\\cavelength={%s}\n",utf2tex(b.get_buffer())); ldata->cavelength = thutf82xhtml(b.get_buffer()); ldata->cavelengthtitle = thT("title cave length",layout->lang); } ldata->cavedepth = ""; ldata->cavedepthtitle = ""; if (z_top > z_bot) { //b = ""; //snprintf(b.get_buffer(),255,"%.0f",z_top-z_bot); b = layout->units.format_length(z_top-z_bot); b += ""; //b += thT("units m",layout->lang); b += layout->units.format_i18n_length_units(); fprintf(f,"\\cavedepthtitle={%s}\n",utf2tex(thT("title cave depth",layout->lang))); fprintf(f,"\\cavedepth={%s}\n",utf2tex(b.get_buffer())); ldata->cavedepth = thutf82xhtml(b.get_buffer()); ldata->cavedepthtitle = thT("title cave depth",layout->lang); b = layout->units.format_length(z_top); //b += ""; //b += layout->units.format_i18n_length_units(); fprintf(f,"\\cavemaxz={%s}\n",utf2tex(b.get_buffer())); b = layout->units.format_length(z_bot); //b += ""; //b += layout->units.format_i18n_length_units(); fprintf(f,"\\caveminz={%s}\n",utf2tex(b.get_buffer())); } show_lengths = (layout->explo_lens == TT_LAYOUT_LENSTAT_ON); ldata->explodate = ""; ldata->exploteam = ""; ldata->explotitle = ""; if ((this->discovered_by.size() > 0) && (layout->max_explos != 0)) { cnt = this->discovered_by.size(); if (cnt > 1) { fprintf(f,"\\explotitle={%s}\n", utf2tex(thT("title explo (plural)",layout->lang))); ldata->explotitle = thT("title explo (plural)",layout->lang); } else { fprintf(f,"\\explotitle={%s}\n", utf2tex(thT("title explo",layout->lang))); ldata->explotitle = thT("title explo",layout->lang); } if (discovered_date.is_defined()) { fprintf(f,"\\explodate={%s}\n", utf2tex(discovered_date.get_str(TT_DATE_FMT_UTF8_Y))); ldata->explodate = discovered_date.get_str(TT_DATE_FMT_UTF8_Y); } thmapstat_print_team(this->discovered_by,"exploteam", layout->max_explos, (layout->explo_lens == TT_LAYOUT_LENSTAT_OFF) ,ldata->exploteam); } ldata->topodate = ""; ldata->topoteam = ""; ldata->topotitle = ""; show_lengths = (layout->topo_lens == TT_LAYOUT_LENSTAT_ON); if ((this->surveyed_by.size() > 0) && (layout->max_topos != 0)) { cnt = this->surveyed_by.size(); if (cnt > 1) { fprintf(f,"\\topotitle={%s}\n", utf2tex(thT("title topo (plural)",layout->lang))); ldata->topotitle = thT("title topo (plural)",layout->lang); } else { fprintf(f,"\\topotitle={%s}\n", utf2tex(thT("title topo",layout->lang))); ldata->topotitle = thT("title topo",layout->lang); } if (surveyed_date.is_defined()) { fprintf(f,"\\topodate={%s}\n", utf2tex(surveyed_date.get_str(TT_DATE_FMT_UTF8_Y))); ldata->topodate = surveyed_date.get_str(TT_DATE_FMT_UTF8_Y); } thmapstat_print_team(this->surveyed_by,"topoteam", layout->max_topos, (layout->topo_lens == TT_LAYOUT_LENSTAT_OFF), ldata->topoteam); } ldata->cartodate = ""; ldata->cartoteam = ""; ldata->cartotitle = ""; show_lengths = false; if ((this->drawn_by.size() > 0) && (layout->max_cartos != 0)) { cnt = this->drawn_by.size(); if (cnt > 1) { fprintf(f,"\\cartotitle={%s}\n", utf2tex(thT("title carto (plural)",layout->lang))); ldata->cartotitle = thT("title carto (plural)",layout->lang); } else { fprintf(f,"\\cartotitle={%s}\n", utf2tex(thT("title carto",layout->lang))); ldata->cartotitle = thT("title carto",layout->lang); } if (drawn_date.is_defined()) { fprintf(f,"\\cartodate={%s}\n", utf2tex(drawn_date.get_str(TT_DATE_FMT_UTF8_Y))); ldata->cartodate = drawn_date.get_str(TT_DATE_FMT_UTF8_Y); } thmapstat_print_team(this->drawn_by,"cartoteam", layout->max_cartos, true, ldata->cartoteam); } ldata->copyrights = ""; if ((this->copyright.size() > 0) && (layout->max_copys != 0)) { cnt = this->copyright.size(); fprintf(f,"\\copyrights={%s",utf2tex("(c) ")); ldata->copyrights = "(c) "; i = 0; for (ci = this->copyright.begin(); (ci != this->copyright.end()) && ((layout->max_copys < 0) || (i < ((unsigned long)layout->max_copys))); ci++) { i++; b = ci->first.str; b += " "; b += ci->second.date.get_str(TT_DATE_FMT_UTF8_Y); if (i < cnt) b += ", "; ldata->copyrights += thutf82xhtml(b.get_buffer()); fprintf(f,"%s%s",utf2tex(b.get_buffer()),(i < cnt ? "\n" : "")); } fprintf(f,"}\n"); } } therion/thsketch.h0000664000175000017500000000306610625655142013247 0ustar useruser/** * @file thsketch.h * sketch module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thsketch_h #define thsketch_h #include #include #include "thpic.h" enum { THSKETCH_WARP_UNKNOWN, THSKETCH_WARP_LINEAR, THSKETCH_WARP_IDPOINT, THSKETCH_WARP_IDLINE, THSKETCH_WARP_PLAQUETTE, }; /** * Sketch class. */ struct thsketch { thpic m_pic; ///< Picture. double m_x; //!< sketch points X offset double m_y; //!< sketch points Y offset class thwarp * m_warp; ///< Warping class. class thscrap * m_scrap; ///< Sketch scrap. thsketch(); ~thsketch(); thpic * morph(double scale); }; typedef std::list thsketch_list; #endif therion/thtf.h0000664000175000017500000000324110625655142012372 0ustar useruser/** * @file thtf.h * Units transformation class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtf_h #define thtf_h /** * Transformation class. * * Parent class for all units transformations. */ class thtf { public: double ufactor, ///< Units factor. sfactor; ///< Scale factor. int units; public: /** * Standard constructor. */ thtf() : ufactor(1.0), sfactor(1.0) {} virtual ~thtf(); /** * Parse units factor. */ virtual void parse_units(char * ustr) = 0; /** * Return units. */ virtual int get_units(); /** * Parse scale factor. */ void parse_scale(char * sstr); /** * Make units transformation on number. */ virtual double transform(double value); }; #endif therion/thepsparse.h0000664000175000017500000000764712427217061013615 0ustar useruser/* * Copyright (C) 2005 Martin Budaj * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thepsparse_h #define thepsparse_h #include #include #include #include #include using namespace std; struct CGS { // current graphics state float color[3]; int linejoin, linecap; float miterlimit, linewidth; list dasharray; float dashoffset; string pattern; map clippathdepth; static int clippathID; CGS(); string svg_color(); }; struct MP_transform { int command; double transf[6]; MP_transform(); void clear(); void set(int, string, string, double, double); void set(int, string, string, string, string, string, string, double, double); }; struct MP_path_segment { int command; double coord[6]; }; struct MP_path { vector segments; bool closed; // bool clip; mp nevie orezat aj vykreslit int fillstroke; MP_transform transformation; // bool transform; MP_path(); void clear(); void add(int, string, string, string, string, string, string, double, double); void add(int, string, string, double, double); void print_svg(ofstream & F, CGS & gstate, string prefix); }; struct MP_index { int vector, idx; }; struct MP_text { string text, font; double size, x, y, xx, xy, yx, yy; double r, g, b; bool transformed; MP_text(); void clear(); void print_svg(ofstream & F, CGS & gstate); }; struct MP_setting { int command; double data[3]; // string str; list dasharray; float dashoffset; string pattern; void print_svg(ofstream & F, CGS & gstate); }; enum {MP_lineto, MP_moveto, MP_curveto, MP_rlineto}; enum {MP_fill, MP_stroke, MP_fillstroke, MP_clip}; enum {MP_linejoin, MP_linecap, MP_miterlimit, MP_gray, MP_rgb, MP_pattern, MP_transp, MP_dash, MP_linewidth}; enum {MP_notransf, MP_scale, MP_translate, MP_concat}; enum {MP_gsave, MP_grestore, MP_transp_on, MP_transp_off}; enum {I_path, I_text, I_setting, I_gsave, I_transform}; enum {MP_mitered = 0, MP_rounded, MP_beveled}; enum {MP_butt=0, MP_squared=2}; struct MP_data { vector index; vector paths; vector texts; vector settings; vector transforms; int idx; CGS gstate; list GSTATE_stack; void add(MP_path); void add(MP_text); void add(MP_transform); void add(int); void add(int,string); void get(); void pop(); MP_data(); void clear(); void print_svg(ofstream & F, string prefix); }; struct converted_data { MP_data MP; set fonts, patterns; bool transparency; // double hsize, vsize; double llx, lly, urx, ury; void clear(); converted_data(); void print_svg(ofstream & F, string prefix=""); }; struct pattern { converted_data data; float llx, lly, urx, ury, xstep, ystep; double llx1,lly1,urx1,ury1; double xx, xy, yx, yy, x, y; string name; bool used; }; int thconvert_new(); void parse_eps(string fname, string cname, double dx, double dy, double & c1, double & c2, double & c3, double & c4, converted_data & data, double = -1, double = -1, double = -1); #endif therion/thchenc.h0000664000175000017500000000330310625655142013040 0ustar useruser/** * @file thinput.h * Therion character encoding module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thchenc_h #define thchenc_h #include "thchencdata.h" #include "thbuffer.h" /** * Encode given string into UTF-8 internal encoding. * * @param dest Destination buffer. * @param src Source string. * @param srcenc Source encoding. */ void thencode(thbuffer * dest, const char * src, int srcenc); /** * Decode give string from internal UTF-8 encoding to some external. * * @param dest Destination buffer. * @param destenc Destination encoding. * @param src Source string. */ void thdecode(thbuffer * dest, int destenc, const char * src); /** * Writes supported encodings into output. */ void thprint_encodings(); /** * Parse encoding. */ int thparse_encoding(char * encstr); #endif therion/SVG.problems0000664000175000017500000000044710231467712013462 0ustar useruserAdobe viewer 3 on Linux: * ignores fractional part of numbers when LC_NUMERIC=sk_SK or others with comma as decimal separator (zero width lines, singular matrices) Sodipodi on Linux: * doesn't inherit linecap &c. from the parent group Batik 1.6 on Linux: * fails to load large filestherion/thepsparse.cxx0000664000175000017500000007221012430720536014154 0ustar useruser/** * @file thconvert.cxx */ /* Copyright (C) 2005 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "thepsparse.h" #include "thpdfdbg.h" #include "thpdfdata.h" #include "thtexfonts.h" #include "thconvert.h" using namespace std; #define IOerr(F) ((string)"Can't open file "+F+"!\n").c_str() extern map RGB, ALL_FONTS, ALL_PATTERNS; typedef set FONTCHARS; extern map USED_CHARS; list PATTERNLIST; list GRIDLIST; converted_data NArrow, ScBar; extern unsigned font_id, patt_id; //////////////////////////////////////////////////////////////////////////////// CGS::CGS () { color[0] = -1; color[1] = -1; color[2] = -1; // clippathID = random(); // clippath = false; } int CGS::clippathID = 0; string CGS::svg_color() { if (color[0] == -1) return "inherit"; // char ch[8]; // sprintf(ch,"#%02x%02x%02x",int(255*color[0]) % 256, // int(255*color[1]) % 256, // int(255*color[2]) % 256); // return (string) ch; return rgb2svg(color[0],color[1],color[2]); } MP_data::MP_data () { idx = 0; } void MP_text::clear() { x = y = 0; xx = yy = 1; xy = yx = 0; size = 0; r = g = b = -1; transformed = false; } void MP_text::print_svg(ofstream & F, CGS & gstate) { F << "=0 && g>=0 && b>=0) F << "fill=\"" << rgb2svg(r,g,b) << "\" " << "stroke=\"black\" stroke-width=\"0.1\" "; else F << "fill=\"black\" stroke=\"none\" "; F << "transform=\"matrix(" << xx << " " << xy << " " << -yx << " " << -yy << " " << x << " " << y << ")\">"; for (unsigned int i = 0; i < text.size(); i++) F << "&#x" << hex << tex2uni(font, int(text[i])) << dec << ";"; F << "" << endl; } MP_text::MP_text() { clear(); } void MP_transform::clear () { command = MP_notransf; transf[0] = 1; transf[1] = 0; transf[2] = 0; transf[3] = 1; transf[4] = 0; transf[5] = 0; } MP_transform::MP_transform () { clear(); } void MP_transform::set(int T, string s1, string s2,double dx, double dy) { command = T; transf[0] = atof(s1.c_str())-dx; transf[1] = atof(s2.c_str())-dy; } void MP_transform::set(int T, string s1, string s2, string s3, string s4, string s5, string s6, double dx, double dy) { command = T; transf[0] = atof(s1.c_str()); transf[1] = atof(s2.c_str()); transf[2] = atof(s3.c_str()); transf[3] = atof(s4.c_str()); transf[4] = atof(s5.c_str())-dx; transf[5] = atof(s6.c_str())-dy; } void MP_path::clear() { segments.clear(); closed=false; fillstroke = -1; transformation.clear(); } MP_path::MP_path() { clear(); } void MP_path::add(int command, string s1, string s2, double dx, double dy) { MP_path_segment seg; seg.command = command; seg.coord[0] = atof(s1.c_str())-dx; seg.coord[1] = atof(s2.c_str())-dy; segments.push_back(seg); } void MP_path::add(int command, string s1, string s2, string s3, string s4, string s5, string s6, double dx, double dy) { MP_path_segment seg; seg.command = command; seg.coord[0] = atof(s1.c_str())-dx; seg.coord[1] = atof(s2.c_str())-dy; seg.coord[2] = atof(s3.c_str())-dx; seg.coord[3] = atof(s4.c_str())-dy; seg.coord[4] = atof(s5.c_str())-dx; seg.coord[5] = atof(s6.c_str())-dy; segments.push_back(seg); } void MP_path::print_svg(ofstream & F, CGS & gstate, string unique_prefix) { if (fillstroke == MP_clip) { CGS::clippathID++; gstate.clippathdepth.insert(make_pair(CGS::clippathID,0)); F << "" << endl << " "; } F << "::iterator I = gstate.dasharray.begin(); I != gstate.dasharray.end(); I++) { F << *I; if (i++ < gstate.dasharray.size()) F << ","; } F << "\" stroke-dashoffset=\"" << gstate.dashoffset << "\" "; } } } F << "d=\""; for (unsigned i=0; i < segments.size(); i++) { switch (segments[i].command) { case MP_moveto: F << "M" << segments[i].coord[0] << " " << segments[i].coord[1]; break; case MP_lineto: F << "L" << segments[i].coord[0] << " " << segments[i].coord[1]; break; case MP_rlineto: if (segments[i].coord[0] == 0 && segments[i].coord[1] == 0) F << "h0.001"; // rlineto 0 0 used for dot rendering doesn't work in SVG else F << "l" << segments[i].coord[0] << " " << segments[i].coord[1]; break; case MP_curveto: F << "C" << segments[i].coord[0] << " " << segments[i].coord[1] << " " << segments[i].coord[2] << " " << segments[i].coord[3] << " " << segments[i].coord[4] << " " << segments[i].coord[5]; break; } } if (closed) F << "Z"; F << "\" />" << endl; if (fillstroke == MP_clip) F << "" << endl << "" << endl; } void MP_data::add(int i) { MP_index ind; ind.vector = I_gsave; ind.idx = i; index.push_back(ind); } void MP_data::add(int i, string s) { MP_index ind; MP_setting set; ind.vector = I_setting; ind.idx = settings.size(); float fl; if (i == MP_dash) { s.replace(s.find("["),1,""); s.replace(s.find("]"),1,""); set.dasharray.clear(); istringstream ss(s); while (ss >> fl) set.dasharray.push_back(fl); set.dasharray.pop_back(); set.dashoffset = fl; //set.str = s; } else if (i == MP_rgb) { istringstream ss(s); // prerobit!!! ss >> set.data[0]; ss >> set.data[1]; ss >> set.data[2]; } else if (i == MP_pattern) { set.pattern = s; } else { set.data[0] = atof(s.c_str()); } set.command = i; settings.push_back(set); index.push_back(ind); } void MP_data::add(MP_path P) { MP_index ind; ind.vector = I_path; ind.idx = paths.size(); paths.push_back(P); index.push_back(ind); } void MP_data::add(MP_transform T) { MP_index ind; ind.vector = I_transform; ind.idx = transforms.size(); transforms.push_back(T); index.push_back(ind); } void MP_data::add(MP_text T) { MP_index ind; ind.vector = I_text; ind.idx = texts.size(); texts.push_back(T); index.push_back(ind); } void MP_data::clear() { index.clear(); paths.clear(); texts.clear(); settings.clear(); transforms.clear(); idx = 0; } void MP_setting::print_svg (ofstream & F, CGS & gstate) { switch (command) { case MP_rgb: for (int i=0; i<3; i++) gstate.color[i] = data[i]; gstate.pattern = ""; break; case MP_gray: for (int i=0; i<3; i++) gstate.color[i] = data[0]; gstate.pattern = ""; break; case MP_pattern: gstate.pattern = pattern; break; case MP_linejoin: gstate.linejoin = int(data[0]); break; case MP_linecap: gstate.linecap = int(data[0]); break; case MP_miterlimit: gstate.miterlimit = data[0]; break; case MP_linewidth: gstate.linewidth = data[0]; break; case MP_dash: gstate.dasharray = dasharray; gstate.dashoffset = dashoffset; break; } } map tmpclip; void MP_data::print_svg (ofstream & F, string unique_prefix) { // F << "" << endl; for (unsigned int i=0; i::iterator I = gstate.clippathdepth.begin(); I!= gstate.clippathdepth.end(); I++) I->second++; F << "" << endl; GSTATE_stack.push_back(gstate); break; case MP_grestore: for (map::iterator I = gstate.clippathdepth.begin(); I!= gstate.clippathdepth.end(); I++) { I->second--; if (I->second < 0) F << "" << endl; } // nemoze ist do predch. cyklu, lebo zmazanie smernika // urobi chaos for (map::iterator I = gstate.clippathdepth.begin(); I!= gstate.clippathdepth.end(); I++) { if (I->second < 0) gstate.clippathdepth.erase(I); } tmpclip = gstate.clippathdepth; gstate = GSTATE_stack.back(); gstate.clippathdepth = tmpclip; GSTATE_stack.pop_back(); F << "" << endl; break; case MP_transp_on: break; case MP_transp_off: break; } break; } } // F << "" << endl; assert(gstate.clippathdepth.empty()); } void converted_data::print_svg (ofstream & F, string unique_prefix) { ostringstream s; static long i_patt_def(10000); s << ++i_patt_def; // i_patt maju byt rozne unique_prefix += "_"; unique_prefix += s.str(); F << "" << endl; F << "" << endl; //patterns if (!patterns.empty()) { for (list::iterator J = PATTERNLIST.begin(); J != PATTERNLIST.end(); J++) { if (patterns.count(J->name) > 0) { F << "name << "_" << unique_prefix << "\" patternUnits=\"userSpaceOnUse\"" << " width=\"" << J->xstep << "\" height=\"" << J->ystep << "\" patternTransform=\"matrix(" << J->xx << " " << J->xy << " " << J->yx << " " << J->yy << " " << J->x << " " << J->y << ")\">" << endl; F << "llx1-J->llx << " " << J->lly1-J->lly << ")\">" << endl; J->data.MP.print_svg(F,unique_prefix); F << "" << endl; F << "" << endl; } } } // clip to initial viewBox F << "" << endl; F << "" << endl; F << "" << endl; F << "" << endl; // --- end of definitions --- F << "" << endl; MP.print_svg(F,unique_prefix); F << "" << endl; F << "" << endl; } void converted_data::clear() { MP.clear(); fonts.clear(); } converted_data::converted_data() { clear(); } string process_pdf_string2(string s, string font) { string r,t; unsigned char c; char *err; unsigned j; map::iterator I; I = USED_CHARS.find(font); assert (I != USED_CHARS.end()); s = s.substr(1,s.length()-3); // delete surrounding parentheses and final space for (unsigned i=0; i=48 && c<=57) { j = i+1; t = c; while((c=s[j])>=48 && c<=57 && j"; return r; } void parse_eps(string fname, string cname, double dx, double dy, double & c1, double & c2, double & c3, double & c4, converted_data & data, double R, double G, double B) { string tok, buffer; string font, patt; string pattcolor = "0 0 0"; bool comment = true, concat = false, already_transp = false, transp_used = false, before_group_transp = false; double llx = 0, lly = 0, urx = 0, ury = 0, HS = 0.0, VS = 0.0; deque thbuffer; set FORM_FONTS, FORM_PATTERNS; bool inpath = false, gsaveinpath = false; MP_path mp_path; MP_transform mp_trans, fntmatr; MP_text text; data.clear(); ifstream F(fname.c_str()); if(!F) therror((IOerr(fname))); while(F >> tok) { if (comment) { // File header if (tok == "%%BoundingBox:") { F >> llx >> lly >> urx >> ury; c1 = llx+dx; // bbox pre absolutnu polohu c2 = lly+dy; c3 = urx+dx; c4 = ury+dy; HS = urx - llx; VS = ury - lly; data.llx = 0; // skutocny bbox data.lly = 0; data.urx = HS; data.ury = VS; if (cname != "") { // beginning of boundary cl.path definition // for F and G scraps data.MP.add(MP_gsave); ifstream G(cname.c_str()); if(!G) therror((IOerr(cname))); mp_path.clear(); while(G >> buffer) { if (buffer == "m") { mp_path.add(MP_moveto, thbuffer[0],thbuffer[1],llx,lly); thbuffer.clear(); } else if (buffer == "c") { mp_path.add(MP_curveto, thbuffer[0], thbuffer[1], thbuffer[2], thbuffer[3], thbuffer[4], thbuffer[5],llx,lly); thbuffer.clear(); } else if (buffer == "l") { mp_path.add(MP_lineto, thbuffer[0],thbuffer[1],llx,lly); thbuffer.clear(); } else { thbuffer.push_back(buffer); } } mp_path.fillstroke = MP_clip; data.MP.add(mp_path); thbuffer.clear(); G.close(); } } else if (tok == "%%Page:") { F >> tok; F >> tok; comment = false; } } else { // PostScript commands if (tok == "showpage") { break; } else if (tok == "moveto") { if (inpath) mp_path.add(MP_moveto, thbuffer[0],thbuffer[1],llx,lly); else if (!concat) { fntmatr.transf[0] = 1; fntmatr.transf[1] = 0; fntmatr.transf[2] = 0; fntmatr.transf[3] = 1; fntmatr.transf[4] = atof(thbuffer[0].c_str())-llx; fntmatr.transf[5] = atof(thbuffer[1].c_str())-lly; } thbuffer.clear(); } else if (tok == "curveto") { mp_path.add(MP_curveto, thbuffer[0], thbuffer[1], thbuffer[2], thbuffer[3], thbuffer[4], thbuffer[5],llx,lly); thbuffer.clear(); } else if (tok == "lineto") { mp_path.add(MP_lineto, thbuffer[0],thbuffer[1],llx,lly); thbuffer.clear(); } else if (tok == "rlineto") { mp_path.add(MP_rlineto, thbuffer[0],thbuffer[1],0,0); thbuffer.clear(); } else if (tok == "newpath") { inpath = true; mp_path.clear(); thbuffer.clear(); } else if (tok == "closepath") { mp_path.closed = true; thbuffer.clear(); } else if (tok == "fill") { if (!gsaveinpath) { mp_path.fillstroke = MP_fill; data.MP.add(mp_path); inpath=false; } thbuffer.clear(); } else if (tok == "stroke") { if (!gsaveinpath) mp_path.fillstroke = MP_stroke; else { mp_path.fillstroke = MP_fillstroke; gsaveinpath = false; } data.MP.add(mp_path); inpath=false; thbuffer.clear(); } else if (tok == "clip") { mp_path.fillstroke = MP_clip; data.MP.add(mp_path); inpath=false; thbuffer.clear(); } else if (tok == "setlinejoin") { data.MP.add(MP_linejoin, thbuffer[0]); thbuffer.clear(); } else if (tok == "setlinecap") { data.MP.add(MP_linecap, thbuffer[0]); thbuffer.clear(); } else if (tok == "setmiterlimit") { data.MP.add(MP_miterlimit, thbuffer[0]); thbuffer.clear(); } else if (tok == "setgray") { if (already_transp) { // transp off data.MP.add(MP_transp_off); already_transp = false; } data.MP.add(MP_gray, thbuffer[0]); thbuffer.clear(); } else if (tok == "setrgbcolor") { if ((!((thbuffer[0] == "0.00002") && (thbuffer[1] == "0.00018"))) && already_transp) { // transp off data.MP.add(MP_transp_off); already_transp = false; }; if (thbuffer[0] == "0.00002") { // special commands if (thbuffer[1] == "0.00015") { // patterns patt = thbuffer[2]; if (FORM_PATTERNS.find(patt) == FORM_PATTERNS.end()) { FORM_PATTERNS.insert(patt); } if (ALL_PATTERNS.find(patt) == ALL_PATTERNS.end()) { ALL_PATTERNS.insert(make_pair(patt,u2str(patt_id))); patt_id++; } data.MP.add(MP_pattern, patt); } else if (thbuffer[1] == "0.00018") { // transparency transp_used = true; if (!already_transp) { data.MP.add(MP_transp_on); already_transp = true; } map::iterator I = RGB.find(thbuffer[2]); if (I != RGB.end()) { data.MP.add(MP_rgb, I->second); } else cerr << "Unknown color!" << endl; } else cerr << "Unknown special!" << endl; } else { // regular RGB color data.MP.add(MP_rgb, thbuffer[0]+" "+thbuffer[1]+" "+thbuffer[2]); } thbuffer.clear(); } else if (tok == "setdash") { buffer = ""; for(unsigned i=0; i> tok; // redundant pop } data.MP.add(MP_linewidth, buffer); thbuffer.clear(); } else if (tok == "gsave") { if (!inpath) data.MP.add(MP_gsave); else gsaveinpath = true; thbuffer.clear(); if (already_transp) before_group_transp = true; else before_group_transp = false; } else if (tok == "grestore") { if (!inpath) data.MP.add(MP_grestore); thbuffer.clear(); if (before_group_transp) already_transp = true; else already_transp = false; } else if (tok == "translate") { mp_trans.set(MP_translate,thbuffer[0],thbuffer[1],llx,lly); data.MP.add(mp_trans); thbuffer.clear(); } else if (tok == "scale") { mp_trans.set(MP_scale,thbuffer[0],thbuffer[1],0,0); if (!inpath) data.MP.add(mp_trans); else mp_path.transformation = mp_trans; thbuffer.clear(); } else if (tok == "concat") { if (thbuffer[0] != "[") { // opening bracket thbuffer[0].erase(0,1); } else { thbuffer.pop_front(); } mp_trans.set(MP_concat,thbuffer[0],thbuffer[1],thbuffer[2], thbuffer[3],thbuffer[4],thbuffer[5],llx,lly); if (!inpath) { fntmatr = mp_trans; concat = true; } else mp_path.transformation = mp_trans; thbuffer.clear(); } // text conversion should be // A B moveto (C) D E fshow // -> // BT /Fiii E Tf 1 0 0 1 A B Tm (C) Tj ET // or // gsave [A1 A2 A3 A4 A5 A6 ] concat 0 0 moveto (C) D E fshow grestore // -> // BT /Fiii E Tf A1 A2 A3 A4 A5 A6 Tm (C) Tj ET // // currently we leave moveto, gsave, grestore unchanged; // path started with moveto is terminated with the `n' operator else if (tok == "fshow") { // font changes should be optimized text.clear(); unsigned i = thbuffer.size(); font = thbuffer[i-2]; text.font = font; text.size = atof(thbuffer[i-1].c_str()); if (FORM_FONTS.count(font) == 0) { FORM_FONTS.insert(font); } if (ALL_FONTS.count(font) == 0) { ALL_FONTS.insert(make_pair(font,u2str(font_id))); font_id++; } // font = tex_Fname(ALL_FONTS[font]); if (USED_CHARS.count(font) == 0) { FONTCHARS FCH; USED_CHARS.insert(make_pair(font,FCH)); } buffer = ""; for (unsigned j=0; j::iterator I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { if (I->F != "") parse_eps(I->F, I->C, I->S1, I->S2, I->F1, I->F2, I->F3, I->F4, I->Fc, I->r, I->g, I->b); if (I->G != "") parse_eps(I->G, I->C, I->S1, I->S2, I->G1, I->G2, I->G3, I->G4, I->Gc); if (I->B != "") parse_eps(I->B, "", I->S1, I->S2, I->B1, I->B2, I->B3, I->B4, I->Bc); if (I->I != "") parse_eps(I->I, "", I->S1, I->S2, I->I1, I->I2, I->I3, I->I4, I->Ic); if (I->E != "") parse_eps(I->E, "", I->S1, I->S2, I->E1, I->E2, I->E3, I->E4, I->Ec, I->r, I->g, I->b); if (I->X != "") parse_eps(I->X, "", I->S1, I->S2, I->X1, I->X2, I->X3, I->X4, I->Xc, I->r, I->g, I->b); } for(list::iterator I = LEGENDLIST.begin(); I != LEGENDLIST.end(); I++) { double a,b,c,d; if (I->fname != "") parse_eps(I->fname, "",0,0,a,b,c,d,I->ldata); } if (LAYOUT.northarrow != "") { double a, b, c, d; parse_eps(LAYOUT.northarrow, "",0,0,a,b,c,d,NArrow); } if (LAYOUT.scalebar != "") { double a, b, c, d; parse_eps(LAYOUT.scalebar, "",0,0,a,b,c,d,ScBar); } GRIDLIST.clear(); if (LAYOUT.grid > 0) { converted_data scr; double a,b,c,d; parse_eps(LAYOUT.gridAA, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[0].x = a; LAYOUT.gridcell[0].y = b; parse_eps(LAYOUT.gridAB, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[1].x = a; LAYOUT.gridcell[1].y = b; parse_eps(LAYOUT.gridAC, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[2].x = a; LAYOUT.gridcell[2].y = b; parse_eps(LAYOUT.gridBA, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[3].x = a; LAYOUT.gridcell[3].y = b; parse_eps(LAYOUT.gridBB, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[4].x = a; LAYOUT.gridcell[4].y = b; parse_eps(LAYOUT.gridBC, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[5].x = a; LAYOUT.gridcell[5].y = b; parse_eps(LAYOUT.gridCA, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[6].x = a; LAYOUT.gridcell[6].y = b; parse_eps(LAYOUT.gridCB, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[7].x = a; LAYOUT.gridcell[7].y = b; parse_eps(LAYOUT.gridCC, "",0,0,a,b,c,d,scr); GRIDLIST.push_back(scr);scr.clear(); LAYOUT.gridcell[8].x = a; LAYOUT.gridcell[8].y = b; } PATTERNLIST.clear(); ifstream P("patterns.dat"); if(!P) therror(("Can't open patterns definition file!")); char buf[500]; char delim[] = ":"; string line,num,pfile,bbox,xstep,ystep,matr; while(P.getline(buf,500,'\n')) { num = strtok(buf,delim); pfile = strtok(NULL,delim); bbox = strtok(NULL,delim); xstep = strtok(NULL,delim); ystep = strtok(NULL,delim); matr = strtok(NULL,delim); // if (ALL_PATTERNS.count(num) > 0) { // changed to patt.used flag // because thsymbolset.cxx // calls eps_parse after // this function is called // and patterns referenced // there would be missing in this list pattern patt; patt.used = (ALL_PATTERNS.count(num) > 0); patt.name = num; matr.replace(matr.find("["),1,""); matr.replace(matr.find("]"),1,""); istringstream s1(matr); s1 >> patt.xx >> patt.xy >> patt.yx >> patt.yy >> patt.x >> patt.y; bbox.replace(bbox.find("["),1,""); bbox.replace(bbox.find("]"),1,""); istringstream s2(bbox); s2 >> patt.llx >> patt.lly >> patt.urx >> patt.ury; // F << "/Matrix " << matr << endl; // F << "/BBox " << bbox << endl; patt.xstep = atof(xstep.c_str()); patt.ystep = atof(ystep.c_str()); parse_eps(pfile , "", 0,0, patt.llx1,patt.lly1,patt.urx1,patt.ury1,patt.data); PATTERNLIST.push_back(patt); // } // patt.used } P.close(); } int thconvert_new() { thprintf("converting scraps* ... "); RGB.clear(); ALL_FONTS.clear(); ALL_PATTERNS.clear(); USED_CHARS.clear(); PATTERNLIST.clear(); GRIDLIST.clear(); font_id = 1; patt_id = 1; read_rgb(); convert_scraps_new(); // thpdfdbg(); // in the debugging mode only thprintf("done\n"); return(0); } therion/thtmpdir.cxx0000664000175000017500000001370612071370274013637 0ustar useruser/** * @file thtmpdir.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thtmpdir.h" #include "therion.h" #include "thinit.h" #include #include #ifndef THMSVC #include #include #else #include #define mkdir _mkdir #define S_ISDIR(v) (((v) | _S_IFDIR) != 0) #endif #include #include #include #include #ifdef THWIN32 #include #define snprintf _snprintf #define getpid _getpid #define THPATHSEPARATOR "\\" #else #define THPATHSEPARATOR "/" #endif thtmpdir::thtmpdir() { this->exist = false; this->tried = false; this->name.strcpy("."); #ifdef THDEBUG this->delete_all = false; this->debug = true; #else this->delete_all = true; this->debug = false; #endif } thtmpdir::~thtmpdir() { this->remove(); } void thtmpdir::create() { if ((!this->exist) && (!this->tried)) { thbuffer dir_path; this->tmp_remove_script = thini.tmp_remove_script.get_buffer(); #ifndef THMSVC #ifdef THDEBUG // the debugging temp directory dir_path = "thTMPDIR"; #else if (strlen(thini.tmp_path.get_buffer()) > 0) { dir_path.strcpy(thini.tmp_path.get_buffer()); } else { char dn[16]; char *envtmp; // release temp directory envtmp = getenv("TEMP"); if (envtmp != NULL) { dir_path = envtmp; } else { envtmp = getenv("TMP"); if (envtmp != NULL) { dir_path = envtmp; } else { #ifdef THWIN32 dir_path = "."; #else dir_path = "/tmp"; #endif } } dir_path += THPATHSEPARATOR; if (this->debug) { thbuffer wdir; wdir.guarantee(1024); getcwd(wdir.get_buffer(),1024); wdir += "/thTMPDIR"; dir_path = wdir; //dir_path += "thTMPDIR"; } else { dir_path += "th"; snprintf(&(dn[0]),16,"%d",getpid()); dir_path += &(dn[0]); } } #endif #else thbuffer wdir; wdir.guarantee(1024); getcwd(wdir.get_buffer(),1024); wdir += "\\thTMPDIR"; dir_path = wdir; #endif this->tried = true; #ifdef THWIN32 if (mkdir(dir_path) != 0) { #else if (mkdir(dir_path,0046750) != 0) { #endif struct #ifdef THMSVC _stat #else stat #endif buf; #ifdef THMSVC _stat #else stat #endif (dir_path,&buf); if ((errno == EEXIST) && (S_ISDIR(buf.st_mode))) { if (!this->debug) { thwarning(("temporary directory already exists")); } this->exist = true; this->name = dir_path; } else { therror(("can't create temporary directory -- %s", dir_path.get_buffer())); } } else { this->exist = true; this->name = dir_path; } } } void thtmpdir::remove() { if (this->exist && this->delete_all) { // remove directory contents if (strlen(this->tmp_remove_script.get_buffer()) > 0) { thbuffer tmpfname; tmpfname = this->tmp_remove_script.get_buffer(); tmpfname += " "; tmpfname += this->name; system(tmpfname.get_buffer()); #ifndef THMSVC DIR *tmpdir = opendir(this->name); if (tmpdir != NULL) { thwarning(("error deleting temporary directory -- %s",this->name.get_buffer())) closedir(tmpdir); } else { this->name = "."; this->tried = false; this->exist = false; } } else { #ifdef THMACOSX thbuffer tmpfname; tmpfname = "rm -f -R "; tmpfname += this->name; system(tmpfname.get_buffer()); DIR *tmpdir = opendir(this->name); if (tmpdir != NULL) { thwarning(("error deleting temporary directory -- %s",this->name.get_buffer())) closedir(tmpdir); } else { this->name = "."; this->tried = false; this->exist = false; } #else DIR *tmpdir = opendir(this->name); struct dirent *tmpf; thbuffer tmpfname; if (tmpdir != NULL) { tmpf = readdir(tmpdir); while (tmpf != NULL) { tmpfname = this->name; tmpfname += THPATHSEPARATOR; tmpfname += tmpf->d_name; unlink(tmpfname); tmpf = readdir(tmpdir); } closedir(tmpdir); } // remove directory if (rmdir(this->name) != 0) thwarning(("error deleting temporary directory -- %s",this->name.get_buffer())) else { this->name = "."; this->tried = false; this->exist = false; } #endif #endif } } } const char* thtmpdir::get_dir_name() { if (!this->exist) this->create(); return(this->name); } const char* thtmpdir::get_file_name(const char *fname) { if (!this->exist) this->create(); this->file_name = this->name; this->file_name += THPATHSEPARATOR; this->file_name += fname; return(this->file_name); } void thtmpdir::set_delete(bool delete_id) { this->delete_all = delete_id; } bool thtmpdir::get_delete() { return(this->delete_all); } void thtmpdir::delete_on() { this->delete_all = true; } void thtmpdir::delete_off() { this->delete_all = false; } thtmpdir thtmp; therion/makearchive.pl0000664000175000017500000000074111046571436014073 0ustar useruserif (open(VFL,"thversion.h")) { @verfl = ; $verfl[0] =~ /(\d+)\.(\d+)(\.(\d+))?/; ($v1,$v2,$v3) = ($1,$2,$4); if (!$v3) { $v3 = 0; } close(VFL); $v3++; } else { $v1 = 0; $v2 = 0; $v3 = 0; } open(VFL,">thversion.h"); print VFL "#define THVERSION \"$v1.$v2.$v3\"\n"; close(VFL); open(VFL,">thbook/version.tex"); print VFL "$v1.$v2.$v3"; close(VFL); system("tar -cvf ../therion-$v1.$v2.$v3.tar -C .. therion"); system("gzip ../therion-$v1.$v2.$v3.tar"); therion/thdataleg.h0000664000175000017500000003055112255654622013371 0ustar useruser/** * @file thdataleg.h * Survey leg class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdataleg_h #define thdataleg_h #include "thparse.h" #include "thobjectname.h" #include "thobjectsrc.h" #include "thinfnan.h" #include #include #include /** * survey leg components. */ enum { TT_DATALEG_UNKNOWN, TT_DATALEG_STATION, TT_DATALEG_FROM, TT_DATALEG_TO, TT_DATALEG_DIRECTION, TT_DATALEG_LENGTH, TT_DATALEG_BEARING, TT_DATALEG_BACKBEARING, TT_DATALEG_GRADIENT, TT_DATALEG_BACKGRADIENT, TT_DATALEG_COUNT, TT_DATALEG_FROMCOUNT, TT_DATALEG_TOCOUNT, TT_DATALEG_DEPTH, TT_DATALEG_FROMDEPTH, TT_DATALEG_TODEPTH, TT_DATALEG_DEPTHCHANGE, TT_DATALEG_NORTHING, TT_DATALEG_EASTING, TT_DATALEG_ALTITUDE, TT_DATALEG_NOTES, TT_DATALEG_PICTURES, TT_DATALEG_POSITION, TT_DATALEG_X, TT_DATALEG_Y, TT_DATALEG_Z, TT_DATALEG_NEWLINE, TT_DATALEG_INSTRUMENTS, TT_DATALEG_ASSISTANT, TT_DATALEG_UP, TT_DATALEG_DOWN, TT_DATALEG_LEFT, TT_DATALEG_RIGHT, TT_DATALEG_DIMS, TT_DATALEG_IGNORE, TT_DATALEG_IGNOREALL, }; /** * survey leg parsing table. */ static const thstok thtt_dataleg_comp[] = { {"altitude", TT_DATALEG_ALTITUDE}, {"assistent", TT_DATALEG_ASSISTANT}, {"backbearing", TT_DATALEG_BACKBEARING}, {"backclino", TT_DATALEG_BACKGRADIENT}, {"backcompass", TT_DATALEG_BACKBEARING}, {"backgradient", TT_DATALEG_BACKGRADIENT}, {"bearing", TT_DATALEG_BEARING}, {"ceiling", TT_DATALEG_UP}, {"clino", TT_DATALEG_GRADIENT}, {"compass", TT_DATALEG_BEARING}, {"count", TT_DATALEG_COUNT}, {"counter", TT_DATALEG_COUNT}, {"depth", TT_DATALEG_DEPTH}, {"depthchange", TT_DATALEG_DEPTHCHANGE}, {"dimensions", TT_DATALEG_DIMS}, {"direction", TT_DATALEG_DIRECTION}, {"dog", TT_DATALEG_ASSISTANT}, {"down", TT_DATALEG_DOWN}, {"dx", TT_DATALEG_EASTING}, {"dy", TT_DATALEG_NORTHING}, {"dz", TT_DATALEG_ALTITUDE}, {"easting", TT_DATALEG_EASTING}, {"floor", TT_DATALEG_DOWN}, {"from", TT_DATALEG_FROM}, {"fromcount", TT_DATALEG_FROMCOUNT}, {"fromcounter", TT_DATALEG_FROMCOUNT}, {"fromdepth", TT_DATALEG_FROMDEPTH}, {"gradient", TT_DATALEG_GRADIENT}, {"ignore", TT_DATALEG_IGNORE}, {"ignoreall", TT_DATALEG_IGNOREALL}, {"instruments", TT_DATALEG_INSTRUMENTS}, {"insts", TT_DATALEG_INSTRUMENTS}, {"left", TT_DATALEG_LEFT}, {"length", TT_DATALEG_LENGTH}, {"newline", TT_DATALEG_NEWLINE}, {"northing", TT_DATALEG_NORTHING}, {"notebook", TT_DATALEG_NOTES}, {"notes", TT_DATALEG_NOTES}, {"pics", TT_DATALEG_PICTURES}, {"pictures", TT_DATALEG_PICTURES}, {"position", TT_DATALEG_POSITION}, {"right", TT_DATALEG_RIGHT}, {"station", TT_DATALEG_STATION}, {"tape", TT_DATALEG_LENGTH}, {"to", TT_DATALEG_TO}, {"tocount", TT_DATALEG_TOCOUNT}, {"tocounter", TT_DATALEG_TOCOUNT}, {"todepth", TT_DATALEG_TODEPTH}, {"up", TT_DATALEG_UP}, {"x", TT_DATALEG_X}, {"y", TT_DATALEG_Y}, {"z", TT_DATALEG_Z}, {NULL, TT_DATALEG_UNKNOWN}, }; /** * Infer components. */ enum { TT_DATALEG_INFER_PLUMBS, TT_DATALEG_INFER_EQUATES, TT_DATALEG_INFER_UNKNOWN, }; /** * Dataleg infer componets. */ static const thstok thtt_dataleg_infer[] = { {"equates", TT_DATALEG_INFER_EQUATES}, {"plumbs", TT_DATALEG_INFER_PLUMBS}, {NULL, TT_DATALEG_INFER_UNKNOWN}, }; /** * Shape components. */ enum { TT_DATALEG_SHAPE_DIAMOND, TT_DATALEG_SHAPE_OCTAGON, TT_DATALEG_SHAPE_RECTANGLE, TT_DATALEG_SHAPE_TRIANGLE, TT_DATALEG_SHAPE_TUNNEL, TT_DATALEG_SHAPE_UNKNOWN, }; static const thstok thtt_dataleg_shape[] = { {"diamond", TT_DATALEG_SHAPE_DIAMOND}, {"octagon", TT_DATALEG_SHAPE_OCTAGON}, {"rect", TT_DATALEG_SHAPE_RECTANGLE}, {"rectangle", TT_DATALEG_SHAPE_RECTANGLE}, {"triangle", TT_DATALEG_SHAPE_TRIANGLE}, {"tunnel", TT_DATALEG_SHAPE_TUNNEL}, {NULL, TT_DATALEG_SHAPE_UNKNOWN}, }; /** * Data types. */ enum { TT_DATATYPE_NORMAL, TT_DATATYPE_DIVING, TT_DATATYPE_CARTESIAN, TT_DATATYPE_CYLPOLAR, TT_DATATYPE_NOSURVEY, TT_DATATYPE_DIMS, TT_DATATYPE_UNKNOWN, }; /** * Data types parsing table. */ static const thstok thtt_datatype[] = { {"cartesian", TT_DATATYPE_CARTESIAN}, {"cylpolar", TT_DATATYPE_CYLPOLAR}, {"dimensions", TT_DATATYPE_DIMS}, {"diving", TT_DATATYPE_DIVING}, {"normal", TT_DATATYPE_NORMAL}, {"nosurvey", TT_DATATYPE_NOSURVEY}, {"topofil", TT_DATATYPE_NORMAL}, {NULL, TT_DATATYPE_UNKNOWN}, }; /** * Mark types. */ enum { TT_DATAMARK_UNKNOWN = 0U, TT_DATAMARK_TEMP = 1U, TT_DATAMARK_PAINTED = 2U, TT_DATAMARK_NATURAL = 3U, TT_DATAMARK_FIXED = 4U, }; /** * Data types parsing table. */ static const thstok thtt_datamark[] = { {"fixed", TT_DATAMARK_FIXED}, {"natural", TT_DATAMARK_NATURAL}, {"painted", TT_DATAMARK_PAINTED}, {"temp", TT_DATAMARK_TEMP}, {"temporary", TT_DATAMARK_TEMP}, {NULL, TT_DATAMARK_UNKNOWN}, }; /** * Data leg flags. */ enum { TT_DATALFLAG_UNKNOWN, TT_DATALFLAG_SURFACE, TT_DATALFLAG_DUPLICATE, TT_DATALFLAG_APPROXIMATE, TT_DATALFLAG_SPLAY, TT_DATALFLAG_NOT, }; enum { TT_EXTENDFLAG_UNKNOWN = 0, TT_EXTENDFLAG_NORMAL = 1, TT_EXTENDFLAG_REVERSE = 2, TT_EXTENDFLAG_LEFT = 4, TT_EXTENDFLAG_RIGHT = 8, TT_EXTENDFLAG_VERTICAL = 16, TT_EXTENDFLAG_DIRECTION = 31, TT_EXTENDFLAG_BREAK = 32, TT_EXTENDFLAG_START = 64, TT_EXTENDFLAG_IGNORE = 128, TT_EXTENDFLAG_HIDE = 256, }; static const thstok thtt_extendflag[] = { //{"break", TT_EXTENDFLAG_BREAK}, {"hide", TT_EXTENDFLAG_HIDE}, {"ignore", TT_EXTENDFLAG_IGNORE}, {"left", TT_EXTENDFLAG_LEFT}, {"normal", TT_EXTENDFLAG_NORMAL}, {"reverse", TT_EXTENDFLAG_REVERSE}, {"right", TT_EXTENDFLAG_RIGHT}, {"start", TT_EXTENDFLAG_START}, {"vertical", TT_EXTENDFLAG_VERTICAL}, {NULL, TT_EXTENDFLAG_UNKNOWN}, }; /** * Data leg flags. */ enum { TT_LEGFLAG_NONE = 0, TT_LEGFLAG_SURFACE = 1, TT_LEGFLAG_DUPLICATE = 2, TT_LEGFLAG_APPROXIMATE = 4, TT_LEGFLAG_SPLAY = 8, }; /** * Data types parsing table. */ static const thstok thtt_datalflag[] = { {"approx", TT_DATALFLAG_APPROXIMATE}, {"approximate", TT_DATALFLAG_APPROXIMATE}, {"duplicate", TT_DATALFLAG_DUPLICATE}, {"not", TT_DATALFLAG_NOT}, {"splay", TT_DATALFLAG_SPLAY}, {"surface", TT_DATALFLAG_SURFACE}, {NULL, TT_DATALFLAG_UNKNOWN}, }; /** * Data station flags. */ enum { TT_DATASFLAG_UNKNOWN, TT_DATASFLAG_ENTRANCE, TT_DATASFLAG_CONT, TT_DATASFLAG_FIXED, TT_DATASFLAG_NOTFIXED, TT_DATASFLAG_ATTR, TT_DATASFLAG_NOT, TT_DATASFLAG_EXPLORED, TT_DATASFLAG_AIRDRAUGHT, TT_DATASFLAG_AIRDRAUGHT_WINTER, TT_DATASFLAG_AIRDRAUGHT_SUMMER, TT_DATASFLAG_SINK, TT_DATASFLAG_SPRING, TT_DATASFLAG_DOLINE, TT_DATASFLAG_DIG, TT_DATASFLAG_OVERHANG, TT_DATASFLAG_ARCH, }; /** * Data leg flags. */ enum { TT_STATIONFLAG_NONE = 0, TT_STATIONFLAG_ENTRANCE = 1, TT_STATIONFLAG_CONT = 2, TT_STATIONFLAG_FIXED = 4, TT_STATIONFLAG_UNDERGROUND = 8, TT_STATIONFLAG_NOTFIXED = 16, TT_STATIONFLAG_SPRING = 32, TT_STATIONFLAG_SINK = 64, TT_STATIONFLAG_DOLINE = 128, TT_STATIONFLAG_DIG = 256, TT_STATIONFLAG_AIRDRAUGHT = 1536, TT_STATIONFLAG_AIRDRAUGHT_WINTER = 512, TT_STATIONFLAG_AIRDRAUGHT_SUMMER = 1024, TT_STATIONFLAG_OVERHANG = 2048, TT_STATIONFLAG_ARCH = 4096, }; /** * Data types parsing table. */ static const thstok thtt_datasflag[] = { {"air-draught", TT_DATASFLAG_AIRDRAUGHT}, {"air-draught:summer", TT_DATASFLAG_AIRDRAUGHT_SUMMER}, {"air-draught:winter", TT_DATASFLAG_AIRDRAUGHT_WINTER}, {"arch", TT_DATASFLAG_ARCH}, {"attr", TT_DATASFLAG_ATTR}, {"continuation", TT_DATASFLAG_CONT}, {"dig", TT_DATASFLAG_DIG}, {"doline", TT_DATASFLAG_DOLINE}, {"entrance", TT_DATASFLAG_ENTRANCE}, {"explored", TT_DATASFLAG_EXPLORED}, {"fixed", TT_DATASFLAG_FIXED}, {"not", TT_DATASFLAG_NOT}, {"overhang", TT_DATASFLAG_OVERHANG}, {"sink", TT_DATASFLAG_SINK}, {"spring", TT_DATASFLAG_SPRING}, {NULL, TT_DATASFLAG_UNKNOWN}, }; /** * Main survey leg class. */ class thdataleg { public: bool is_valid; ///< whether leg is valid. thobjectsrc srcf; ///< Source file. int data_type, ///< leg data type flags; ///< Leg flags. unsigned int s_mark, ///< Type of the station mark extend; ///< Extend flags: normal, reverse, left, right, break int walls, shape, gridcs; thobjectname station, from, to; class thsurvey * psurvey; ///< parent survey double length, counter, fromcounter, tocounter, depth, fromdepth, todepth, depthchange, bearing, gradient, dx, dy, dz, backbearing, backgradient, total_length, total_bearing, total_gradient, total_dx, total_dy, total_dz, adj_dx, adj_dy, adj_dz, from_up, from_down, from_left, from_right, to_up, to_down, to_left, to_right, vtresh; double length_sd, counter_sd, depth_sd, bearing_sd, gradient_sd, dx_sd, dy_sd, dz_sd, x_sd, y_sd, z_sd, declination, implicit_declination, total_sdx, total_sdy, total_sdz, fxx, txx; bool infer_plumbs, infer_equates, direction, adjusted, to_be_adjusted, topofil, plumbed; /** * Standard constructor. */ thdataleg(); /** * Standard destructor. */ ~thdataleg(); /** * Clear survey leg data. */ void clear(); void calc_total_stds(); /** * Export station attributes to metapost. */ void export_mp_flags(FILE * out); }; /** * Fix station class. */ class thdatafix { public: thobjectname station; ///< Station name. thobjectsrc srcf; ///< Source file. class thsurvey * psurvey; ///< parent survey double x, y, z, sdx, sdy, sdz, cxy, cyz, cxz; // data thdatafix(); ///< Standard constructor. }; typedef std::map thdatass_attr_map; /** * Station class. */ class thdatass { public: thobjectname station; ///< Station name. thobjectsrc srcf; ///< Source file. class thsurvey * psurvey; ///< parent survey const char * comment; ///< Station comment. double explored; ///< Explored length within continuation. int flags; ///< Station flags. thdatass_attr_map attr; ///< Station attributes. thdatass(); ///< Standard constructor. }; /** * Equate class. */ class thdataequate { public: thobjectname station; ///< Station name. thobjectsrc srcf; ///< Source file. class thsurvey * psurvey; ///< parent survey int eqid; ///< Station equivalency id. thdataequate(); ///< Standard constructor. }; class thdatamark { public: thobjectname station; class thsurvey * psurvey; ///< parent survey thobjectsrc srcf; ///< Source file. unsigned char mark; thdatamark() : mark(TT_DATAMARK_TEMP) {} }; class thdataextend { public: thobjectname to, from; class thsurvey * psurvey; ///< parent survey thobjectsrc srcf; ///< Source file. int extend; thdataextend() {} }; class thstdims { public: thobjectname station; class thsurvey * psurvey; ///< parent survey thobjectsrc srcf; ///< Source file. double up, down, left, right; thstdims() : up(thnan), down(thnan), left(thnan), right(thnan) {} }; typedef std::list < thdataleg > thdataleg_list; ///< Data leg list. typedef std::list < thdatafix > thdatafix_list; ///< Data fix list. typedef std::list < thdatass > thdatass_list; ///< Data stations list. typedef std::list < thdataequate > thdataequate_list; ///< Data equates list. typedef std::list < thdataextend > thdataextend_list; ///< Data extend list. typedef std::list < thdatamark > thdatamark_list; ///< Universal object name list. typedef std::list < thstdims > thstdims_list; ///< Station dimensions. #endif therion/thdataobject.cxx0000664000175000017500000003204512042466562014441 0ustar useruser/** * @file thdataobject.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdataobject.h" #include "thexception.h" #include "thchenc.h" #include "thsurvey.h" #include "thconfig.h" #include "thparse.h" #include "thcsdata.h" #include "thdata.h" #include "thproj.h" #include "thcs.h" thdataobject::thdataobject() { this->db = NULL; this->cs = TTCS_LOCAL; this->id = 0; this->name = ""; this->title = ""; this->selected = false; this->selected_number = 0; this->stnpref = NULL; this->stnsuff = NULL; this->fsptr = NULL; this->nsptr = NULL; this->psptr = NULL; this->revision = 0; } thdataobject::~thdataobject() { } bool operator < (const thdataobject_author & a1, const thdataobject_author & a2) { if (a1.rev < a2.rev) return true; if ((a1.rev == a2.rev) && (a1.name < a2.name)) return true; return false; } bool operator < (const thdataobject_copyright & c1, const thdataobject_copyright & c2) { if (c1.rev < c2.rev) return true; if ((c1.rev == c2.rev) && (strcmp(c1.name, c2.name) < 0)) return true; return false; } void thdataobject::assigndb(thdatabase * pdb) { this->db = pdb; } int thdataobject::get_class_id() { return TT_DATAOBJECT_CMD; } bool thdataobject::is(int class_id) { if (class_id == TT_DATAOBJECT_CMD) return true; else return false; } int thdataobject::get_cmd_nargs() { return 0; } const char * thdataobject::get_cmd_end() { return NULL; } bool thdataobject::get_cmd_ends_state() { return false; } bool thdataobject::get_cmd_ends_match(char * cmd) { return false; } const char * thdataobject::get_cmd_name() { return NULL; } thcmd_option_desc thdataobject::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_dataobject_opt); switch (id) { case TT_DATAOBJECT_AUTHOR: case TT_DATAOBJECT_COPYRIGHT: case TT_DATAOBJECT_STNS: case TT_DATAOBJECT_ATTR: return thcmd_option_desc(id, 2); default: return thcmd_option_desc(id); } } void thdataobject::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { switch (cod.id) { case TT_DATAOBJECT_NAME: if (th_is_extkeyword(*args)) this->name = this->db->strstore(*args); else ththrow(("invalid keyword -- %s", *args)); break; case TT_DATAOBJECT_CS: switch (this->get_class_id()) { case TT_DATA_CMD: case TT_LAYOUT_CMD: case TT_SURFACE_CMD: case TT_IMPORT_CMD: case TT_SCRAP_CMD: break; default: ththrow(("coordinate system specification not valid for %s", this->get_cmd_name())) break; } { int id = thcs_parse(*args); if (id == TTCS_UNKNOWN) { ththrow(("unknown coordinate system -- %s", *args)); } if (this->get_class_id() != TT_DATA_CMD) { this->cs = id; this->cs_source = this->db->csrc; } else { thdata * cobj; cobj = (thdata *) this; if (cobj->cgroup->dl_declination_north_grid && (id == TTCS_LOCAL)) ththrow(("grid-angle has beed defined -- local CS not allowed")) cobj->cgroup->cs = id; cobj->cgroup->cs_source = this->db->csrc; } } break; case TT_DATAOBJECT_STNS: switch (this->get_class_id()) { case TT_DATA_CMD: case TT_SCRAP_CMD: break; default: ththrow(("station-names specification not valid for %s", this->get_cmd_name())) break; } if (strlen(args[0]) == 0) this->stnpref = NULL; else this->stnpref = this->db->strstore(args[0]); if (strlen(args[1]) == 0) this->stnsuff = NULL; else this->stnsuff = this->db->strstore(args[1]); break; case TT_DATAOBJECT_TITLE: switch (this->get_class_id()) { case TT_DATA_CMD: case TT_SURVEY_CMD: case TT_MAP_CMD: case TT_SCRAP_CMD: case TT_GRADE_CMD: case TT_LAYOUT_CMD: if (cod.nargs > 1) ththrow(("multiple option arguments -- title")) thencode(&(this->db->buff_enc), *args, argenc); this->title = this->db->strstore(this->db->buff_enc.get_buffer()); break; default: ththrow(("title specification not allowed for this object")); break; } break; case TT_DATAOBJECT_AUTHOR: switch (this->get_class_id()) { case TT_DATA_CMD: case TT_SCRAP_CMD: if (cod.nargs > 2) ththrow(("too many option arguments -- author")) this->dotmp_date.parse(args[0]); thencode(&(this->db->buff_enc), args[1], argenc); this->dotmp_person.parse(this->db, this->db->buff_enc.get_buffer()); this->dotmp_author = thdataobject_author(this->dotmp_person, this->revision); this->author_map[this->dotmp_author].join(this->dotmp_date); break; default: ththrow(("author specification not allowed for this object")); break; } break; case TT_DATAOBJECT_COPYRIGHT: switch (this->get_class_id()) { case TT_DATA_CMD: case TT_SCRAP_CMD: if (cod.nargs > 2) ththrow(("too many option arguments -- copyright")) this->dotmp_date.parse(args[0]); thencode(&(this->db->buff_enc), args[1], argenc); this->dotmp_copyright = thdataobject_copyright( this->db->strstore(this->db->buff_enc.get_buffer(), true), this->revision); this->copyright_map[this->dotmp_copyright].join(this->dotmp_date); break; default: ththrow(("copyright specification not allowed for this object")); break; } break; case TT_DATAOBJECT_ATTR: switch (this->get_class_id()) { case TT_LAYOUT_CMD: ththrow(("attribute specification not valid for layout")) break; } if (cod.nargs != 2) ththrow(("invalid attribute specification -- should be ")) thencode(&(this->db->buff_enc), args[1], argenc); this->parse_attribute(args[0], this->db->buff_enc.get_buffer()); break; default: ththrow(("unknown option -- %s", args[0])); } } int thdataobject::get_id() { return this->id; } void thdataobject::self_delete() { delete this; } int thdataobject::get_context() { return THCTX_SURVEY; } const char * thdataobject::get_name() { return this->name; } const char * thdataobject::get_title() { return this->title; } void thdataobject::throw_source() { if (strlen(thexc.get_buffer()) > 0) thexc.insspf(" -- "); thexc.insspf("%s [%d]", this->source.name, this->source.line); } void thdataobject::self_print(FILE * outf) { if (strlen(this->name) > 0) fprintf(outf,"%s (%ld:0x%lx) -- %s\n", this->get_class_name(), this->id, (unsigned long) this, this->name); else fprintf(outf,"%s (%ld:0x%lx)\n", this->get_class_name(), this->id, (unsigned long) this); this->self_print_properties(outf); if (strlen(this->name) > 0) fprintf(outf,"end %s -- %s\n", this->get_class_name(), this->name); else fprintf(outf,"end %s\n", this->get_class_name()); } void thdataobject::self_print_properties(FILE * outf) { fprintf(outf,"thdataobject:\n"); thdo_author_map_type::iterator aii; for (aii = this->author_map.begin(); aii != this->author_map.end(); aii++) { if (aii->first.rev == 0) fprintf(outf,"\tauthor: %s \"%s/%s\"\n", aii->second.get_str(), aii->first.name.get_n1(), aii->first.name.get_n2()); else fprintf(outf,"\tauthor: %s \"%s/%s\" (rev. %ld)\n", aii->second.get_str(), aii->first.name.get_n1(), aii->first.name.get_n2(), aii->first.rev); } thdo_copyright_map_type::iterator cii; for (cii = this->copyright_map.begin(); cii != this->copyright_map.end(); cii++) { if (cii->first.rev == 0) fprintf(outf,"\tcopyright: %s \"%s\"\n", cii->second.get_str(), cii->first.name); else fprintf(outf,"\tcopyright: %s \"%s\" (rev. %ld)\n", cii->second.get_str(), cii->first.name, cii->first.rev); } fprintf(outf,"\tname: \"%s\" at \"%s\"", this->name, (this->fsptr != NULL ? this->fsptr->full_name : "")); fprintf(outf,"\n"); fprintf(outf,"\ttitle: \"%s\"\n", this->title); if (this->selected) fprintf(outf,"\tselected: on (%ld)\n",this->selected_number); else fprintf(outf,"\tselected: off (%ld)\n",this->selected_number); thdb_revision_set_type::iterator rii; unsigned long rr; for (rr = 0; rr <= this->revision; rr++) { rii = this->db->revision_set.find(threvision(this->id, rr)); fprintf(outf,"\trevision %ld: %s [%ld]\n", rr, rii->srcf.name, rii->srcf.line); } } bool thdataobject::is_in_survey(thsurvey * psearch) { if (psearch == NULL) return false; thsurvey * tmp; if (this->get_class_id() == TT_SURVEY_CMD) { tmp = (thsurvey *) this; } else { tmp = this->fsptr; } while (tmp != NULL) { if (tmp->id == psearch->id) return true; tmp = tmp->fsptr; } return false; } void thdataobject::start_insert() { } void thdataobject::convert_cs(char * src_x, char * src_y, double & dst_x, double & dst_y) { // 1. Check kompatibility with output CS. if (thcfg.outcs_def.is_valid()) { if (((this->cs == TTCS_LOCAL) && (thcfg.outcs != TTCS_LOCAL)) || ((this->cs != TTCS_LOCAL) && (thcfg.outcs == TTCS_LOCAL))) ththrow(("mixing local and global coordinate systems not allowed -- conflict with cs specification at %s [%d]", thcfg.outcs_def.name, thcfg.outcs_def.line)); }; // 1. Conversion to numbers. const thcsdata * csdata = thcs_get_data(this->cs); int sv; double tx(0.0), ty(0.0), tz(0.0), dst_z(0.0); bool initcs(false); if ((this->cs != TTCS_LOCAL) && csdata->dms) { thparse_double_dms(sv, tx, src_x); tx /= 180.0 / THPI; } else { thparse_double(sv, tx, src_x); } if (sv != TT_SV_NUMBER) ththrow(("invalid X coordinate -- %s", src_x)); if ((this->cs != TTCS_LOCAL) && csdata->dms) { thparse_double_dms(sv, ty, src_y); ty /= 180.0 / THPI; } else { thparse_double(sv, ty, src_y); } if (sv != TT_SV_NUMBER) ththrow(("invalid Y coordinate -- %s", src_y)); if ((this->cs != TTCS_LOCAL) && csdata->swap) { tz = tx; tx = ty; ty = tz; tz = 0.0; } if ((this->cs != TTCS_LOCAL) && csdata->dms) { if ((tx < - THPI) || (tx > THPI)) ththrow(("longitude out of range -- %s", csdata->swap ? src_y : src_x)); if ((ty < (- THPI / 2)) || (ty > (THPI / 2))) ththrow(("latitude out of range -- %s", csdata->swap ? src_x : src_y)); } if (!thcfg.outcs_def.is_valid()) { if ((this->cs != TTCS_LOCAL) && (!csdata->output)) { // TODO: get NS double dumx, dumy, dumz; int south = 0; thcs2cs(csdata->params, thcs_get_data(TTCS_LAT_LONG)->params, tx, ty, tz, dumx, dumy, dumz); if (dumy < 0.0) south = 1; thcfg.outcs = TTCS_UTM1N + 2 * (thcs2zone(csdata->params, tx, ty, tz) - 1) + south; } else { thcfg.outcs = this->cs; } if (this->cs_source.is_valid()) thcfg.outcs_def = this->cs_source; else thcfg.outcs_def = this->source; initcs = true; } if (this->cs == TTCS_LOCAL) { dst_x = tx; dst_y = ty; dst_z = tz; } else { thcs2cs(csdata->params, thcs_get_data(thcfg.outcs)->params, tx, ty, tz, dst_x, dst_y, dst_z); } if (thcfg.outcs != TTCS_LOCAL) { if (initcs) { thcfg.outcs_sumx = dst_x; thcfg.outcs_sumy = dst_y; thcfg.outcs_sumz = dst_z; thcfg.outcs_sumn = 1.0; } else { thcfg.outcs_sumx += dst_x; thcfg.outcs_sumy += dst_y; thcfg.outcs_sumz += dst_z; thcfg.outcs_sumn += 1.0; } } } void thdataobject::parse_attribute(char * name, char * value) { // check name if ((name == NULL) || (strlen(name) == 0)) ththrow(("epmty attribute name not allowed")) if (name[0] == '_') ththrow(("attribute name starting with '_' not allowed")) if (!th_is_attr_name(name)) ththrow(("invalid characters in attribute name -- %s", name)) this->db->attr.insert_attribute(name, value, long(this->id)); } therion/thlegenddata.h0000664000175000017500000000255010625655142014053 0ustar useruser/* * Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thlegenddata_h #define thlegenddata_h #include struct legenddata { std::string legendtitle, colorlegendtitle, cavename, comment, copyrights, cavelengthtitle, cavelength, cavedepthtitle, cavedepth, explotitle, explodate, exploteam, topotitle, topodate, topoteam, cartotitle, cartodate, cartoteam; bool northarrow, scalebar; legenddata(); }; #endif therion/thsymbolset.h0000664000175000017500000000625012337643562014012 0ustar useruser/** * @file thsymbolset.h * Symbol set class. */ /* Copyright (C) 2003 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thsymbolset_h #define thsymbolset_h #include "thsymbolsetlist.h" #include "thlayoutclr.h" #include /** * Symbol set class. */ struct thsymbolset { bool assigned[thsymbolset_size], ///< definovane symboly used[thsymbolset_size]; ///< pouzite symboly thlayout_color color[thsymbolset_size]; ///< Symbol colors. bool group_symbols; ///< Ci zgrupuje podobne symboly alebo nie. thsymbolset(); /** * Vrati macro a zaragistruje ho ako pouzite. */ const char * get_mp_macro(int id); /** * Return whether symbol is assigned. */ bool is_assigned(int symbol); /** * Do MP suboru zapise mapsymbol() makro. */ void export_symbol_defaults(FILE * mpf, const char * symset); /** * Do MP suboru zapise mapsymbol() makro + zmeni hidden value. */ void export_symbol_assign(FILE * mpf, int sym_id, const char * symset); /** * Skryje symbol. */ void export_symbol_hide(FILE * mpf, int sym_id); /** * Zobrazi symbol. */ void export_symbol_show(FILE * mpf, int sym_id); /** * Set symbol color. */ void export_symbol_color(FILE * mpf, int sym_id, thlayout_color * clr); /** * Do MP suboru zapise mapsymbol() makro + zmeni hidden value. */ void export_symbol_assign_group(FILE * mpf, int sym_id, const char * symset); /** * Skryje symbol. */ void export_symbol_hide_group(FILE * mpf, int sym_id); /** * Zobrazi symbol. */ void export_symbol_show_group(FILE * mpf, int sym_id); /** * Set symbol color. */ void export_symbol_color_group(FILE * mpf, int sym_id, thlayout_color * clr); /** * Exportuje znackovy kluc do pdfka. */ void export_pdf(class thlayout * layout, FILE * mpf, unsigned & sfig); /** * Export symbol options to metapost. */ void export_mp_symbol_options(FILE * mpf, int sym_id); void export_mp_symbol_options(class thexception * x, int sym_id); }; /** * Vrati ID z popisu classu a symbolu. */ int thsymbolset__get_id(const char * symclass, const char * symbol); /** * Vrati ID itemu z groupy. */ int thsymbolset__get_group(int group_id, int cid); /** * Export all symbols. */ void export_all_symbols(); #endif therion/thcmdline.cxx0000664000175000017500000001071011575403512013743 0ustar useruser/** * @file thcmdline.cxx * Command line processing module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thcmdline.h" #include "therion.h" #include "thlogfile.h" #include "thconfig.h" //#include #include "thtmpdir.h" #ifdef THMSVC #define __STDC__ 1 #endif #include "extern/getopt.h" thcmdline::thcmdline() { this->version_ds = false; this->help_ds = false; this->m_bezier = false; this->extern_libs = false; this->print_state = THPS_NONE; } thcmdline::~thcmdline() { } bool thcmdline::get_version_disp_state() { return(this->version_ds); } bool thcmdline::get_help_disp_state() { return(this->help_ds); } void thcmdline::process(int argc, char * argv[]) { // 1. let's search for options int oc; int oindex = 0; static struct option thlong_options[] = { {"help",no_argument,NULL,'h'}, {"print-encodings",no_argument,NULL,THPS_ENCODINGS}, {"print-environment",no_argument,NULL,THPS_PATHS}, {"print-init-file",no_argument,NULL,THPS_INIT_FILE}, {"print-library-src",no_argument,NULL,THPS_LIB_SRC}, {"print-symbols",no_argument,NULL,THPS_SYMBOLS}, {"print-tex-encodings",no_argument,NULL,THPS_TEX_ENCODINGS}, {"print-xtherion-src",no_argument,NULL,THPS_XTHERION_SRC}, {"use-extern-libs",no_argument,NULL,THPS_EXTERN_LIBS}, {"version",no_argument,NULL,'v'}, {"bezier",no_argument,NULL,'b'}, {NULL, 0, NULL, 0} }; while(1) { oc = getopt_long (argc, argv, "dxs:l:qLvbhp:", thlong_options, &oindex); // no other options detected if (oc == -1) break; switch (oc) { case 'd': thtmp.debug = true; thtmp.delete_all = false; break; case 'h': this->help_ds = true; break; case 'v': this->version_ds = true; break; case 'b': this->m_bezier = true; break; case 'q': thverbose_mode = false; break; case 'L': thlog.logging_off(); break; case 'l': thlog.logging_on(); thlog.set_file_name(optarg); break; //case 'g': // thcfg.set_file_state(THCFG_GENERATE); // break; case 'x': thcfg.generate_xthcfg = true; break; //case 'u': // thcfg.set_file_state(THCFG_UPDATE); // break; case 'i': thcfg.comments_skip_on(); break; case 's': thcfg.append_source(optarg); break; case 'p': thcfg.set_search_path(optarg); break; case THPS_ENCODINGS: this->print_state = THPS_ENCODINGS; break; case THPS_TEX_ENCODINGS: this->print_state = THPS_TEX_ENCODINGS; break; case THPS_SYMBOLS: this->print_state = THPS_SYMBOLS; break; case THPS_XTHERION_SRC: this->print_state = THPS_XTHERION_SRC; break; case THPS_INIT_FILE: this->print_state = THPS_INIT_FILE; break; case THPS_LIB_SRC: this->print_state = THPS_LIB_SRC; break; case THPS_PATHS: this->print_state = THPS_PATHS; break; case THPS_EXTERN_LIBS: this->extern_libs = true; break; } } // 2. let's search for program arguments if (optind < argc) thcfg.set_file_name(argv[optind++]); if (optind < argc) thwarning(("too many input arguments")); } int thcmdline::get_print_state() { return this->print_state; } thcmdline thcmdln; therion/thgeomagdata.h0000664000175000017500000011663012446064762014066 0ustar useruser// generated by geomag/igrf2c.py #ifndef thgeomagdata_h #define thgeomagdata_h static const double thgeomag_GNM[24][14][14] = { { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-31543, -2298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-677, 2905, 924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1022, -1469, 1256, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {876, 628, 660, -361, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-184, 328, 264, 5, -86, -16, 0, 0, 0, 0, 0, 0, 0, 0, }, {63, 61, -11, -217, -58, 59, -90, 0, 0, 0, 0, 0, 0, 0, }, {70, -55, 0, 34, -41, -21, 18, 6, 0, 0, 0, 0, 0, 0, }, {11, 8, -4, -9, 1, 2, -9, 5, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -11, 12, 1, -2, 2, -1, -1, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 2, 2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-31464, -2298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-728, 2928, 1041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1037, -1494, 1239, 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {880, 643, 653, -380, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-192, 328, 259, -1, -93, -26, 0, 0, 0, 0, 0, 0, 0, 0, }, {62, 60, -11, -221, -57, 57, -92, 0, 0, 0, 0, 0, 0, 0, }, {70, -54, 0, 33, -41, -20, 18, 6, 0, 0, 0, 0, 0, 0, }, {11, 8, -4, -9, 1, 2, -8, 5, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -11, 12, 1, -2, 2, 0, -1, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 2, 2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-31354, -2297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-769, 2948, 1176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1058, -1524, 1223, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {884, 660, 644, -400, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-201, 327, 253, -9, -102, -38, 0, 0, 0, 0, 0, 0, 0, 0, }, {62, 58, -11, -224, -54, 54, -95, 0, 0, 0, 0, 0, 0, 0, }, {71, -54, 1, 32, -40, -19, 18, 6, 0, 0, 0, 0, 0, 0, }, {11, 8, -4, -9, 1, 2, -8, 5, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -11, 12, 1, -2, 2, 0, -1, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 2, 2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-31212, -2306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-802, 2956, 1309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1084, -1559, 1212, 778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {887, 678, 631, -416, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-211, 327, 245, -16, -111, -51, 0, 0, 0, 0, 0, 0, 0, 0, }, {61, 57, -10, -228, -51, 49, -98, 0, 0, 0, 0, 0, 0, 0, }, {72, -54, 2, 31, -38, -18, 19, 6, 0, 0, 0, 0, 0, 0, }, {11, 8, -4, -9, 2, 3, -8, 6, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -11, 12, 1, -2, 2, 0, -1, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 1, 2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-31060, -2317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-839, 2959, 1407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1111, -1600, 1205, 839, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {889, 695, 616, -424, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-221, 326, 236, -23, -119, -62, 0, 0, 0, 0, 0, 0, 0, 0, }, {61, 55, -10, -233, -46, 44, -101, 0, 0, 0, 0, 0, 0, 0, }, {73, -54, 2, 29, -37, -16, 19, 6, 0, 0, 0, 0, 0, 0, }, {11, 7, -3, -9, 2, 4, -7, 6, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -11, 12, 1, -2, 2, 0, -1, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 1, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30926, -2318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-893, 2969, 1471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1140, -1645, 1202, 881, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {891, 711, 601, -426, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-230, 326, 226, -28, -125, -69, 0, 0, 0, 0, 0, 0, 0, 0, }, {61, 54, -9, -238, -40, 39, -103, 0, 0, 0, 0, 0, 0, 0, }, {73, -54, 3, 27, -35, -14, 19, 6, 0, 0, 0, 0, 0, 0, }, {11, 7, -3, -9, 2, 4, -7, 7, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -11, 12, 1, -2, 2, 0, -1, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 1, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30805, -2316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-951, 2980, 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1172, -1692, 1205, 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {896, 727, 584, -422, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-237, 327, 218, -32, -131, -74, 0, 0, 0, 0, 0, 0, 0, 0, }, {60, 53, -9, -242, -32, 32, -104, 0, 0, 0, 0, 0, 0, 0, }, {74, -54, 4, 25, -34, -12, 18, 6, 0, 0, 0, 0, 0, 0, }, {11, 7, -3, -9, 2, 5, -6, 8, 8, 0, 0, 0, 0, 0, }, {8, 10, 1, -12, 12, 1, -2, 3, 0, -2, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 1, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30715, -2306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1018, 2984, 1550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1206, -1740, 1215, 918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {903, 744, 565, -415, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-241, 329, 211, -33, -136, -76, 0, 0, 0, 0, 0, 0, 0, 0, }, {59, 53, -8, -246, -25, 25, -106, 0, 0, 0, 0, 0, 0, 0, }, {74, -53, 4, 23, -33, -11, 18, 6, 0, 0, 0, 0, 0, 0, }, {11, 7, -3, -9, 1, 6, -6, 8, 7, 0, 0, 0, 0, 0, }, {8, 10, 1, -12, 11, 1, -2, 3, 0, -2, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 2, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30654, -2292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1106, 2981, 1566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1240, -1790, 1232, 916, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {914, 762, 550, -405, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-241, 334, 208, -33, -141, -76, 0, 0, 0, 0, 0, 0, 0, 0, }, {57, 54, -7, -249, -18, 18, -107, 0, 0, 0, 0, 0, 0, 0, }, {74, -53, 4, 20, -31, -9, 17, 5, 0, 0, 0, 0, 0, 0, }, {11, 7, -3, -10, 1, 6, -5, 9, 7, 0, 0, 0, 0, 0, }, {8, 10, 1, -12, 11, 1, -2, 3, 1, -2, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 6, 4, 0, 2, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30594, -2285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1244, 2990, 1578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1282, -1834, 1255, 913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {944, 776, 544, -421, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-253, 346, 194, -20, -142, -82, 0, 0, 0, 0, 0, 0, 0, 0, }, {59, 57, 6, -246, -25, 21, -104, 0, 0, 0, 0, 0, 0, 0, }, {70, -40, 0, 0, -29, -10, 15, 29, 0, 0, 0, 0, 0, 0, }, {13, 7, -8, -5, 9, 7, -10, 7, 2, 0, 0, 0, 0, 0, }, {5, -21, 1, -11, 3, 16, -3, -4, -3, -4, 0, 0, 0, 0, }, {-3, 11, 1, 2, -5, -1, 8, -1, -3, 5, -2, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30554, -2250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1341, 2998, 1576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1297, -1889, 1274, 896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {954, 792, 528, -408, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-240, 349, 211, -20, -147, -76, 0, 0, 0, 0, 0, 0, 0, 0, }, {54, 57, 4, -247, -16, 12, -105, 0, 0, 0, 0, 0, 0, 0, }, {65, -55, 2, 1, -40, -7, 5, 19, 0, 0, 0, 0, 0, 0, }, {22, 15, -4, -1, 11, 15, -13, 5, -1, 0, 0, 0, 0, 0, }, {3, -7, -1, -25, 10, 5, -5, -2, 3, 8, 0, 0, 0, 0, }, {-8, 4, -1, 13, -4, 4, 12, 3, 2, 10, 3, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30500, -2215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1440, 3003, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1302, -1944, 1288, 882, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {958, 796, 510, -397, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-229, 360, 230, -23, -152, -69, 0, 0, 0, 0, 0, 0, 0, 0, }, {47, 57, 3, -247, -8, 7, -107, 0, 0, 0, 0, 0, 0, 0, }, {65, -56, 2, 10, -32, -11, 9, 18, 0, 0, 0, 0, 0, 0, }, {11, 9, -6, -14, 6, 10, -7, 6, 9, 0, 0, 0, 0, 0, }, {4, 9, -4, -5, 2, 4, 1, 2, 2, 5, 0, 0, 0, 0, }, {-3, -5, -1, 2, -3, 7, 4, -2, 6, -2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30421, -2169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1555, 3002, 1590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1302, -1992, 1289, 878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {957, 800, 504, -394, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-222, 362, 242, -26, -156, -63, 0, 0, 0, 0, 0, 0, 0, 0, }, {46, 58, 1, -237, -1, -2, -113, 0, 0, 0, 0, 0, 0, 0, }, {67, -56, 5, 15, -32, -7, 17, 8, 0, 0, 0, 0, 0, 0, }, {15, 6, -4, -11, 2, 10, -5, 10, 8, 0, 0, 0, 0, 0, }, {4, 6, 0, -9, 1, 4, -1, -2, 3, -1, 0, 0, 0, 0, }, {1, -3, 4, 0, -1, 4, 6, 1, -1, 2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30334, -2119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1662, 2997, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1297, -2038, 1292, 856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {957, 804, 479, -390, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-219, 358, 254, -31, -157, -62, 0, 0, 0, 0, 0, 0, 0, 0, }, {45, 61, 8, -228, 4, 1, -111, 0, 0, 0, 0, 0, 0, 0, }, {75, -57, 4, 13, -26, -6, 13, 1, 0, 0, 0, 0, 0, 0, }, {13, 5, -4, -14, 0, 8, -1, 11, 4, 0, 0, 0, 0, 0, }, {8, 10, 2, -13, 10, -1, -1, 5, 1, -2, 0, 0, 0, 0, }, {-2, -3, 2, -5, -2, 4, 4, 0, 2, 2, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30220, -2068, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1781, 3000, 1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1287, -2091, 1278, 838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {952, 800, 461, -395, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-216, 359, 262, -42, -160, -56, 0, 0, 0, 0, 0, 0, 0, 0, }, {43, 64, 15, -212, 2, 3, -112, 0, 0, 0, 0, 0, 0, 0, }, {72, -57, 1, 14, -22, -2, 13, -2, 0, 0, 0, 0, 0, 0, }, {14, 6, -2, -13, -3, 5, 0, 11, 3, 0, 0, 0, 0, 0, }, {8, 10, 2, -12, 10, -1, 0, 3, 1, -1, 0, 0, 0, 0, }, {-3, -3, 2, -5, -1, 6, 4, 1, 0, 3, -1, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-30100, -2013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1902, 3010, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1276, -2144, 1260, 830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {946, 791, 438, -405, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-218, 356, 264, -59, -159, -49, 0, 0, 0, 0, 0, 0, 0, 0, }, {45, 66, 28, -198, 1, 6, -111, 0, 0, 0, 0, 0, 0, 0, }, {71, -56, 1, 16, -14, 0, 12, -5, 0, 0, 0, 0, 0, 0, }, {14, 6, -1, -12, -8, 4, 0, 10, 1, 0, 0, 0, 0, 0, }, {7, 10, 2, -12, 10, -1, -1, 4, 1, -2, 0, 0, 0, 0, }, {-3, -3, 2, -5, -2, 5, 4, 1, 0, 3, -1, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29992, -1956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-1997, 3027, 1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1281, -2180, 1251, 833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {938, 782, 398, -419, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-218, 357, 261, -74, -162, -48, 0, 0, 0, 0, 0, 0, 0, 0, }, {48, 66, 42, -192, 4, 14, -108, 0, 0, 0, 0, 0, 0, 0, }, {72, -59, 2, 21, -12, 1, 11, -2, 0, 0, 0, 0, 0, 0, }, {18, 6, 0, -11, -7, 4, 3, 6, -1, 0, 0, 0, 0, 0, }, {5, 10, 1, -12, 9, -3, -1, 7, 2, -5, 0, 0, 0, 0, }, {-4, -4, 2, -5, -2, 5, 3, 1, 2, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29873, -1905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2072, 3044, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1296, -2208, 1247, 829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {936, 780, 361, -424, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-214, 355, 253, -93, -164, -46, 0, 0, 0, 0, 0, 0, 0, 0, }, {53, 65, 51, -185, 4, 16, -102, 0, 0, 0, 0, 0, 0, 0, }, {74, -62, 3, 24, -6, 4, 10, 0, 0, 0, 0, 0, 0, 0, }, {21, 6, 0, -11, -9, 4, 4, 4, -4, 0, 0, 0, 0, 0, }, {5, 10, 1, -12, 9, -3, -1, 7, 1, -5, 0, 0, 0, 0, }, {-4, -4, 3, -5, -2, 5, 3, 1, 2, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29775, -1848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2131, 3059, 1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1314, -2239, 1248, 802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {939, 780, 325, -423, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-214, 353, 245, -109, -165, -36, 0, 0, 0, 0, 0, 0, 0, 0, }, {61, 65, 59, -178, 3, 18, -96, 0, 0, 0, 0, 0, 0, 0, }, {77, -64, 2, 26, -1, 5, 9, 0, 0, 0, 0, 0, 0, 0, }, {23, 5, -1, -10, -12, 3, 4, 2, -6, 0, 0, 0, 0, 0, }, {4, 9, 1, -12, 9, -4, -2, 7, 1, -6, 0, 0, 0, 0, }, {-3, -4, 2, -5, -2, 4, 3, 1, 3, 3, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29692, -1784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2200, 3070, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1335, -2267, 1249, 759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {940, 780, 290, -418, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-214, 352, 235, -118, -166, -17, 0, 0, 0, 0, 0, 0, 0, 0, }, {68, 67, 68, -170, -1, 19, -93, 0, 0, 0, 0, 0, 0, 0, }, {77, -72, 1, 28, 5, 4, 8, -2, 0, 0, 0, 0, 0, 0, }, {25, 6, -6, -9, -14, 9, 6, -5, -7, 0, 0, 0, 0, 0, }, {4, 9, 3, -10, 8, -8, -1, 10, -2, -8, 0, 0, 0, 0, }, {-3, -6, 2, -4, -1, 4, 2, 2, 5, 1, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29619.4, -1728.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2267.7, 3068.4, 1670.9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1339.6, -2288, 1252.1, 714.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {932.3, 786.8, 250, -403, 111.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-218.8, 351.4, 222.3, -130.4, -168.6, -12.9, 0, 0, 0, 0, 0, 0, 0, 0, }, {72.3, 68.2, 74.2, -160.9, -5.9, 16.9, -90.4, 0, 0, 0, 0, 0, 0, 0, }, {79, -74, 0, 33.3, 9.1, 6.9, 7.3, -1.2, 0, 0, 0, 0, 0, 0, }, {24.4, 6.6, -9.2, -7.9, -16.6, 9.1, 7, -7.9, -7, 0, 0, 0, 0, 0, }, {5, 9.4, 3, -8.4, 6.3, -8.9, -1.5, 9.3, -4.3, -8.2, 0, 0, 0, 0, }, {-2.6, -6, 1.7, -3.1, -0.5, 3.7, 1, 2, 4.2, 0.3, -1.1, 0, 0, 0, }, {2.7, -1.7, -1.9, 1.5, -0.1, 0.1, -0.7, 0.7, 1.7, 0.1, 1.2, 4, 0, 0, }, {-2.2, -0.3, 0.2, 0.9, -0.2, 0.9, -0.5, 0.3, -0.3, -0.4, -0.1, -0.2, -0.4, 0, }, {-0.2, -0.9, 0.3, 0.1, -0.4, 1.3, -0.4, 0.7, -0.4, 0.3, -0.1, 0.4, 0, 0.1, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29554.63, -1669.05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2337.24, 3047.69, 1657.76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1336.3, -2305.83, 1246.39, 672.51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {920.55, 797.96, 210.65, -379.86, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-227, 354.41, 208.95, -136.54, -168.05, -13.55, 0, 0, 0, 0, 0, 0, 0, 0, }, {73.6, 69.56, 76.74, -151.34, -14.58, 14.58, -86.36, 0, 0, 0, 0, 0, 0, 0, }, {79.88, -74.46, -1.65, 38.73, 12.3, 9.37, 5.42, 1.94, 0, 0, 0, 0, 0, 0, }, {24.8, 7.62, -11.73, -6.88, -18.11, 10.17, 9.36, -11.25, -4.87, 0, 0, 0, 0, 0, }, {5.58, 9.76, 3.58, -6.94, 5.01, -10.76, -1.25, 8.76, -6.66, -9.22, 0, 0, 0, 0, }, {-2.17, -6.12, 1.42, -2.35, -0.15, 3.06, 0.29, 2.06, 3.77, -0.21, -2.09, 0, 0, 0, }, {2.95, -1.6, -1.88, 1.44, -0.31, 0.29, -0.79, 0.53, 1.8, 0.16, 0.96, 3.99, 0, 0, }, {-2.15, -0.29, 0.21, 0.89, -0.38, 0.96, -0.3, 0.46, -0.35, -0.36, 0.08, -0.49, -0.08, 0, }, {-0.16, -0.88, 0.3, 0.28, -0.43, 1.18, -0.37, 0.75, -0.26, 0.35, -0.05, 0.41, -0.1, -0.18, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29496.57, -1586.42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2396.06, 3026.34, 1668.17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1339.85, -2326.54, 1232.1, 633.73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {912.66, 808.97, 166.58, -356.83, 89.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-230.87, 357.29, 200.26, -141.05, -163.17, -8.03, 0, 0, 0, 0, 0, 0, 0, 0, }, {72.78, 68.69, 75.92, -141.4, -22.83, 13.1, -78.09, 0, 0, 0, 0, 0, 0, 0, }, {80.44, -75, -4.55, 45.24, 14, 10.46, 1.64, 4.92, 0, 0, 0, 0, 0, 0, }, {24.41, 8.21, -14.5, -5.59, -19.34, 11.61, 10.85, -14.05, -3.54, 0, 0, 0, 0, 0, }, {5.5, 9.45, 3.45, -5.27, 3.13, -12.38, -0.76, 8.43, -8.42, -10.08, 0, 0, 0, 0, }, {-1.94, -6.24, 0.89, -1.07, -0.16, 2.45, -0.33, 2.13, 3.09, -1.03, -2.8, 0, 0, 0, }, {3.05, -1.48, -2.03, 1.65, -0.51, 0.54, -0.79, 0.37, 1.79, 0.12, 0.75, 3.75, 0, 0, }, {-2.12, -0.21, 0.3, 1.04, -0.63, 0.95, -0.11, 0.52, -0.39, -0.37, 0.21, -0.77, 0.04, 0, }, {-0.09, -0.89, 0.31, 0.42, -0.45, 1.08, -0.31, 0.78, -0.18, 0.38, 0.02, 0.42, -0.26, -0.26, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-29442, -1501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-2445.1, 3012.9, 1676.7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {1350.7, -2352.3, 1225.6, 582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {907.6, 813.7, 120.4, -334.9, 70.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-232.6, 360.1, 192.4, -140.9, -157.5, 4.1, 0, 0, 0, 0, 0, 0, 0, 0, }, {70, 67.7, 72.7, -129.9, -28.9, 13.2, -70.9, 0, 0, 0, 0, 0, 0, 0, }, {81.6, -76.1, -6.8, 51.8, 15, 9.4, -2.8, 6.8, 0, 0, 0, 0, 0, 0, }, {24.2, 8.8, -16.9, -3.2, -20.6, 13.4, 11.7, -15.9, -2, 0, 0, 0, 0, 0, }, {5.4, 8.8, 3.1, -3.3, 0.7, -13.3, -0.1, 8.7, -9.1, -10.5, 0, 0, 0, 0, }, {-1.9, -6.3, 0.1, 0.5, -0.5, 1.8, -0.7, 2.1, 2.4, -1.8, -3.6, 0, 0, 0, }, {3.1, -1.5, -2.3, 2, -0.8, 0.6, -0.7, 0.2, 1.7, -0.2, 0.4, 3.5, 0, 0, }, {-1.9, -0.2, 0.4, 1.2, -0.8, 0.9, 0.1, 0.5, -0.3, -0.4, 0.2, -0.9, 0, 0, }, {0, -0.9, 0.4, 0.5, -0.5, 1, -0.2, 0.8, -0.1, 0.3, 0.1, 0.5, -0.4, -0.3, }, }, }; static const double thgeomag_HNM[24][14][14] = { { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1061, 1121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -330, 3, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 195, -69, -210, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -210, 53, -33, -124, 3, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -9, 83, 2, -35, 36, -69, 0, 0, 0, 0, 0, 0, 0, }, {0, -45, -13, -10, -1, 28, -12, -22, 0, 0, 0, 0, 0, 0, }, {0, 8, -14, 7, -13, 5, 16, -5, -18, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 8, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1086, 1065, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -357, 34, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 203, -77, -201, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -193, 56, -32, -125, 11, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -7, 86, 4, -32, 32, -67, 0, 0, 0, 0, 0, 0, 0, }, {0, -46, -14, -11, 0, 28, -12, -22, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 7, -13, 5, 16, -5, -18, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 8, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1128, 1000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -389, 62, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 211, -90, -189, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -172, 57, -33, -126, 21, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -5, 89, 5, -29, 28, -65, 0, 0, 0, 0, 0, 0, 0, }, {0, -47, -14, -12, 1, 28, -13, -22, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 6, -13, 5, 16, -5, -18, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 8, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1191, 917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -421, 84, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 218, -109, -173, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -148, 58, -34, -126, 32, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2, 93, 8, -26, 23, -62, 0, 0, 0, 0, 0, 0, 0, }, {0, -48, -14, -12, 2, 28, -15, -22, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 6, -13, 5, 16, -5, -18, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 8, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1259, 823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -445, 103, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 220, -134, -153, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -122, 58, -38, -125, 43, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 96, 11, -22, 18, -57, 0, 0, 0, 0, 0, 0, 0, }, {0, -49, -14, -13, 4, 28, -16, -22, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 6, -14, 5, 17, -5, -19, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 9, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1334, 728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -462, 119, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 216, -163, -130, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -96, 58, -44, -122, 51, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 3, 99, 14, -18, 13, -52, 0, 0, 0, 0, 0, 0, 0, }, {0, -50, -14, -14, 5, 29, -17, -21, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 6, -14, 5, 17, -5, -19, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 9, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1424, 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -480, 133, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 205, -195, -109, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -72, 60, -53, -118, 58, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 4, 102, 19, -16, 8, -46, 0, 0, 0, 0, 0, 0, 0, }, {0, -51, -15, -14, 6, 29, -18, -20, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 5, -14, 5, 18, -5, -19, 0, 0, 0, 0, 0, }, {0, -20, 14, 5, -3, -2, 9, 10, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1520, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -494, 146, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 188, -226, -90, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -51, 64, -64, -115, 64, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 4, 104, 25, -15, 4, -40, 0, 0, 0, 0, 0, 0, 0, }, {0, -52, -17, -14, 7, 29, -19, -19, 0, 0, 0, 0, 0, 0, }, {0, 8, -15, 5, -15, 5, 18, -5, -19, 0, 0, 0, 0, 0, }, {0, -20, 15, 5, -3, -3, 9, 11, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -1, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1614, 528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -499, 163, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 169, -252, -72, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -33, 71, -75, -113, 69, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 4, 105, 33, -15, 0, -33, 0, 0, 0, 0, 0, 0, 0, }, {0, -52, -18, -14, 7, 29, -20, -19, 0, 0, 0, 0, 0, 0, }, {0, 8, -14, 5, -15, 5, 19, -5, -19, 0, 0, 0, 0, 0, }, {0, -21, 15, 5, -3, -3, 9, 11, -2, 2, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -1, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1702, 477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -499, 186, -11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 144, -276, -55, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -12, 95, -67, -119, 82, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 6, 100, 16, -9, -16, -39, 0, 0, 0, 0, 0, 0, 0, }, {0, -45, -18, 2, 6, 28, -17, -22, 0, 0, 0, 0, 0, 0, }, {0, 12, -21, -12, -7, 2, 18, 3, -11, 0, 0, 0, 0, 0, }, {0, -27, 17, 29, -9, 4, 9, 6, 1, 8, 0, 0, 0, 0, }, {0, 5, 1, -20, -1, -6, 6, -4, -2, 0, -2, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5815, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1810, 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -476, 206, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 136, -278, -37, -210, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 3, 103, -87, -122, 80, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1, 99, 33, -12, -12, -30, 0, 0, 0, 0, 0, 0, 0, }, {0, -35, -17, 0, 10, 36, -18, -16, 0, 0, 0, 0, 0, 0, }, {0, 5, -22, 0, -21, -8, 17, -4, -17, 0, 0, 0, 0, 0, }, {0, -24, 19, 12, 2, 2, 8, 8, -11, -7, 0, 0, 0, 0, }, {0, 13, -2, -10, 2, -3, 6, -3, 6, 11, 8, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5820, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1898, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -462, 216, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 133, -274, -23, -230, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 15, 110, -98, -121, 78, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -9, 96, 48, -16, -12, -24, 0, 0, 0, 0, 0, 0, 0, }, {0, -50, -24, -4, 8, 28, -20, -18, 0, 0, 0, 0, 0, 0, }, {0, 10, -15, 5, -23, 3, 23, -4, -13, 0, 0, 0, 0, 0, }, {0, -11, 12, 7, 6, -2, 10, 7, -6, 5, 0, 0, 0, 0, }, {0, -4, 0, -8, -2, -4, 1, -3, 7, -1, -3, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1967, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -414, 224, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 135, -278, 3, -255, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 16, 125, -117, -114, 81, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -10, 99, 60, -20, -11, -17, 0, 0, 0, 0, 0, 0, 0, }, {0, -55, -28, -6, 7, 23, -18, -17, 0, 0, 0, 0, 0, 0, }, {0, 11, -14, 7, -18, 4, 23, 1, -20, 0, 0, 0, 0, 0, }, {0, -18, 12, 2, 0, -3, 9, 8, 0, 5, 0, 0, 0, 0, }, {0, 4, 1, 0, 2, -5, 1, -1, 6, 0, -7, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2016, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -404, 240, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 148, -269, 13, -269, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 19, 128, -126, -97, 81, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -11, 100, 68, -32, -8, -7, 0, 0, 0, 0, 0, 0, 0, }, {0, -61, -27, -2, 6, 26, -23, -12, 0, 0, 0, 0, 0, 0, }, {0, 7, -12, 9, -16, 4, 24, -3, -17, 0, 0, 0, 0, 0, }, {0, -22, 15, 7, -4, -5, 10, 10, -4, 1, 0, 0, 0, 0, }, {0, 2, 1, 2, 6, -4, 0, -2, 3, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2047, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -366, 251, -196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 167, -266, 26, -279, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 26, 139, -139, -91, 83, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -12, 100, 72, -37, -6, 1, 0, 0, 0, 0, 0, 0, 0, }, {0, -70, -27, -4, 8, 23, -23, -11, 0, 0, 0, 0, 0, 0, }, {0, 7, -15, 6, -17, 6, 21, -6, -16, 0, 0, 0, 0, 0, }, {0, -21, 16, 6, -4, -5, 10, 11, -2, 1, 0, 0, 0, 0, }, {0, 1, 1, 3, 4, -4, 0, -1, 3, 1, -4, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2067, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -333, 262, -223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 191, -265, 39, -288, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 31, 148, -152, -83, 88, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -13, 99, 75, -41, -4, 11, 0, 0, 0, 0, 0, 0, 0, }, {0, -77, -26, -5, 10, 22, -23, -12, 0, 0, 0, 0, 0, 0, }, {0, 6, -16, 4, -19, 6, 18, -10, -17, 0, 0, 0, 0, 0, }, {0, -21, 16, 7, -4, -5, 10, 11, -3, 1, 0, 0, 0, 0, }, {0, 1, 1, 3, 4, -4, -1, -1, 3, 1, -5, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2129, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -336, 271, -252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 212, -257, 53, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 46, 150, -151, -78, 92, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -15, 93, 71, -43, -2, 17, 0, 0, 0, 0, 0, 0, 0, }, {0, -82, -27, -5, 16, 18, -23, -10, 0, 0, 0, 0, 0, 0, }, {0, 7, -18, 4, -22, 9, 16, -13, -15, 0, 0, 0, 0, 0, }, {0, -21, 16, 9, -5, -6, 9, 10, -6, 2, 0, 0, 0, 0, }, {0, 1, 0, 3, 6, -4, 0, -1, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2197, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -310, 284, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 232, -249, 69, -297, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 47, 150, -154, -75, 95, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -16, 88, 69, -48, -1, 21, 0, 0, 0, 0, 0, 0, 0, }, {0, -83, -27, -2, 20, 17, -23, -7, 0, 0, 0, 0, 0, 0, }, {0, 8, -19, 5, -23, 11, 14, -15, -11, 0, 0, 0, 0, 0, }, {0, -21, 15, 9, -6, -6, 9, 9, -7, 2, 0, 0, 0, 0, }, {0, 1, 0, 3, 6, -4, 0, -1, 4, 0, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2279, -373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -284, 293, -352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 247, -240, 84, -299, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 46, 154, -153, -69, 97, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -16, 82, 69, -52, 1, 24, 0, 0, 0, 0, 0, 0, 0, }, {0, -80, -26, 0, 21, 17, -23, -4, 0, 0, 0, 0, 0, 0, }, {0, 10, -19, 6, -22, 12, 12, -16, -10, 0, 0, 0, 0, 0, }, {0, -20, 15, 11, -7, -7, 9, 8, -7, 2, 0, 0, 0, 0, }, {0, 2, 1, 3, 6, -4, 0, -2, 3, -1, -6, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2366, -413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -262, 302, -427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 262, -236, 97, -306, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 46, 165, -143, -55, 107, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -17, 72, 67, -58, 1, 36, 0, 0, 0, 0, 0, 0, 0, }, {0, -69, -25, 4, 24, 17, -24, -6, 0, 0, 0, 0, 0, 0, }, {0, 11, -21, 8, -23, 15, 11, -16, -4, 0, 0, 0, 0, 0, }, {0, -20, 15, 12, -6, -8, 8, 5, -8, 3, 0, 0, 0, 0, }, {0, 1, 0, 4, 5, -5, -1, -2, 1, -2, -7, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5186.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2481.6, -458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -227.6, 293.4, -491.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 272.6, -231.9, 119.8, -303.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 43.8, 171.9, -133.1, -39.3, 106.3, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -17.4, 63.7, 65.1, -61.2, 0.7, 43.8, 0, 0, 0, 0, 0, 0, 0, }, {0, -64.6, -24.2, 6.2, 24, 14.8, -25.4, -5.8, 0, 0, 0, 0, 0, 0, }, {0, 11.9, -21.5, 8.5, -21.5, 15.5, 8.9, -14.9, -2.1, 0, 0, 0, 0, 0, }, {0, -19.7, 13.4, 12.5, -6.2, -8.4, 8.4, 3.8, -8.2, 4.8, 0, 0, 0, 0, }, {0, 1.7, 0, 4, 4.9, -5.9, -1.2, -2.9, 0.2, -2.2, -7.4, 0, 0, 0, }, {0, 0.1, 1.3, -0.9, -2.6, 0.9, -0.7, -2.8, -0.9, -1.2, -1.9, -0.9, 0, 0, }, {0, -0.4, 0.3, 2.5, -2.6, 0.7, 0.3, 0, 0, 0.3, -0.9, -0.4, 0.8, 0, }, {0, -0.9, 0.2, 1.8, -0.4, -1, -0.1, 0.7, 0.3, 0.6, 0.3, -0.2, -0.5, -0.9, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 5077.99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2594.5, -515.43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -198.86, 269.72, -524.72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 282.07, -225.23, 145.15, -305.36, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 42.72, 180.25, -123.45, -19.57, 103.85, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -20.33, 54.75, 63.63, -63.53, 0.24, 50.94, 0, 0, 0, 0, 0, 0, 0, }, {0, -61.14, -22.57, 6.82, 25.35, 10.93, -26.32, -4.64, 0, 0, 0, 0, 0, 0, }, {0, 11.2, -20.88, 9.83, -19.71, 16.22, 7.61, -12.76, -0.06, 0, 0, 0, 0, 0, }, {0, -20.11, 12.69, 12.67, -6.72, -8.16, 8.1, 2.92, -7.73, 6.01, 0, 0, 0, 0, }, {0, 2.19, 0.1, 4.46, 4.76, -6.58, -1.01, -3.47, -0.86, -2.31, -7.93, 0, 0, 0, }, {0, 0.26, 1.44, -0.77, -2.27, 0.9, -0.58, -2.69, -1.08, -1.58, -1.9, -1.39, 0, 0, }, {0, -0.55, 0.23, 2.38, -2.63, 0.61, 0.4, 0.01, 0.02, 0.28, -0.87, -0.34, 0.88, 0, }, {0, -0.76, 0.33, 1.72, -0.54, -1.07, -0.04, 0.63, 0.21, 0.53, 0.38, -0.22, -0.57, -0.82, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 4944.26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2708.54, -575.73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -160.4, 251.75, -537.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 286.48, -211.03, 164.46, -309.72, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 44.58, 189.01, -118.06, -0.01, 101.04, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -20.9, 44.18, 61.54, -66.26, 3.02, 55.4, 0, 0, 0, 0, 0, 0, 0, }, {0, -57.8, -21.2, 6.54, 24.96, 7.03, -27.61, -3.28, 0, 0, 0, 0, 0, 0, }, {0, 10.84, -20.03, 11.83, -17.41, 16.71, 6.96, -10.74, 1.64, 0, 0, 0, 0, 0, }, {0, -20.54, 11.51, 12.75, -7.14, -7.42, 7.97, 2.14, -6.08, 7.01, 0, 0, 0, 0, }, {0, 2.73, -0.1, 4.71, 4.44, -7.22, -0.96, -3.95, -1.99, -1.97, -8.31, 0, 0, 0, }, {0, 0.13, 1.67, -0.66, -1.76, 0.85, -0.39, -2.51, -1.27, -2.11, -1.94, -1.86, 0, 0, }, {0, -0.87, 0.27, 2.13, -2.49, 0.49, 0.59, 0, 0.13, 0.27, -0.86, -0.23, 0.87, 0, }, {0, -0.87, 0.3, 1.66, -0.59, -1.14, -0.07, 0.54, 0.1, 0.49, 0.44, -0.25, -0.53, -0.79, }, }, { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 4797.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -2845.6, -641.9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -115.3, 244.9, -538.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 283.3, -188.7, 180.9, -329.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 47.3, 197, -119.3, 16, 100.2, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -20.8, 33.2, 58.9, -66.7, 7.3, 62.6, 0, 0, 0, 0, 0, 0, 0, }, {0, -54.1, -19.5, 5.7, 24.4, 3.4, -27.4, -2.2, 0, 0, 0, 0, 0, 0, }, {0, 10.1, -18.3, 13.3, -14.6, 16.2, 5.7, -9.1, 2.1, 0, 0, 0, 0, 0, }, {0, -21.6, 10.8, 11.8, -6.8, -6.9, 7.8, 1, -4, 8.4, 0, 0, 0, 0, }, {0, 3.2, -0.4, 4.6, 4.4, -7.9, -0.6, -4.2, -2.8, -1.2, -8.7, 0, 0, 0, }, {0, -0.1, 2, -0.7, -1.1, 0.8, -0.2, -2.2, -1.4, -2.5, -2, -2.4, 0, 0, }, {0, -1.1, 0.4, 1.9, -2.2, 0.3, 0.7, -0.1, 0.3, 0.2, -0.9, -0.1, 0.7, 0, }, {0, -0.9, 0.4, 1.6, -0.5, -1.2, -0.1, 0.4, -0.1, 0.4, 0.5, -0.3, -0.4, -0.8, }, }, }; static const double thgeomag_GNMD[14][14] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {10.3, 18.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-8.7, -3.3, 2.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {3.4, -5.5, -0.7, -10.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-0.7, 0.2, -9.1, 4.1, -4.3, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {-0.2, 0.5, -1.3, -0.1, 1.4, 3.9, 0, 0, 0, 0, 0, 0, 0, 0, }, {-0.3, -0.1, -0.7, 2.1, -1.2, 0.3, 1.6, 0, 0, 0, 0, 0, 0, 0, }, {0.3, -0.2, -0.5, 1.3, 0.1, -0.6, -0.8, 0.2, 0, 0, 0, 0, 0, 0, }, {0.2, 0, -0.6, 0.5, -0.2, 0.4, 0.1, -0.4, 0.3, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }; static const double thgeomag_HNMD[14][14] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -26.6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -27.4, -14.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 8.2, -0.4, 1.8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, -1.3, 5.3, 2.9, -5.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0.6, 1.7, -1.2, 3.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, -2.1, -0.7, 0.2, 0.9, 1, 0, 0, 0, 0, 0, 0, 0, }, {0, 0.8, 0.4, -0.2, -0.3, -0.6, 0.1, -0.2, 0, 0, 0, 0, 0, 0, }, {0, -0.3, 0.3, 0.1, 0.5, -0.2, -0.3, 0.3, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }; #define thgeomag_maxmindex 23 #define thgeomag_step 5 #define thgeomag_minyear 1900 #define thgeomag_maxdeg 13 #endif therion/thcs.cxx0000664000175000017500000000676412447656213012762 0ustar useruser/** * @file proj.cxx */ /* Copyright (C) 2006 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thcs.h" #include "thparse.h" #include "thcsdata.h" #include "thexception.h" #include "extern/proj4/proj_api.h" #include "thdatabase.h" #include #include #include std::map thcs_custom_name2int; std::map thcs_custom_int2name; std::map thcs_custom_int2data; std::list thcs_custom_data; int thcs_custom_id = TTCS_UNKNOWN; int thcs_parse(const char * name) { int sv = thcasematch_token(name, thtt_cs); if (sv == TTCS_UNKNOWN) { std::map::iterator it = thcs_custom_name2int.find(std::string(name)); if (it != thcs_custom_name2int.end()) return it->second; } return sv; } const char * thcs_get_name(int cs) { size_t tab_size = ((sizeof(thtt_cs)/sizeof(thstok)) - 1); const char * csstr; long i, ii; i = 0; ii = -1; while (i < (long)tab_size) { if (thtt_cs[i].tok == cs) { ii = i; if (strlen(thtt_cs[ii].s) < 6) break; if (!(((thtt_cs[ii].s[0] == 'e' || thtt_cs[ii].s[0] == 'E') && (thtt_cs[ii].s[1] == 's' || thtt_cs[ii].s[1] == 'S') && (thtt_cs[ii].s[2] == 'r' || thtt_cs[ii].s[2] == 'R') && (thtt_cs[ii].s[3] == 'i' || thtt_cs[ii].s[3] == 'I')) || ((thtt_cs[ii].s[0] == 'e' || thtt_cs[ii].s[0] == 'E') && (thtt_cs[ii].s[1] == 'p' || thtt_cs[ii].s[1] == 'P') && (thtt_cs[ii].s[2] == 's' || thtt_cs[ii].s[2] == 'S') && (thtt_cs[ii].s[3] == 'g' || thtt_cs[ii].s[3] == 'G')))) break; } i++; } if (ii > -1) csstr = thtt_cs[ii].s; else if (cs < TTCS_UNKNOWN) return thcs_custom_int2name[cs].c_str(); else csstr = "unknown"; return csstr; } const thcsdata * thcs_get_data(int cs) { if (cs >= 0) return &(thcsdata_table[cs]); if (cs < TTCS_UNKNOWN) return thcs_custom_int2data[cs]; return NULL; } void thcs_add_cs(char * id, char * proj4id, size_t nargs, char ** args) { if (thcs_parse(id) != TTCS_UNKNOWN) ththrow(("cs already exists -- %s", id)); if (!th_is_extkeyword(id)) ththrow(("invalid cs identifier -- %s", id)); projPJ P1; if ((P1 = pj_init_plus(proj4id))==NULL) ththrow(("invalid proj4 identifier -- %s", proj4id)); pj_free(P1); thcsdata * pd = &(*thcs_custom_data.insert(thcs_custom_data.end(), thcsdata())); pd->prjspec = ""; pd->params = thdb.strstore(proj4id); pd->swap = false; pd->output = true; pd->dms = false; thcs_custom_id--; thcs_custom_name2int[std::string(id)] = thcs_custom_id; thcs_custom_int2name[thcs_custom_id] = std::string(id); thcs_custom_int2data[thcs_custom_id] = pd; } therion/thparse.cxx0000664000175000017500000007077711253633150013461 0ustar useruser/** * @file thparse.cxx * Parsing module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thparse.h" #include "therion.h" #include "thlang.h" #include "thtexfonts.h" #include #include "thinfnan.h" #include "thdatabase.h" #include "thtflength.h" #include "thexception.h" #include "thtexfonts.h" #include #include #include #ifdef THMSVC #define strcasecmp _stricmp #endif #ifdef HAVE_ROUND extern double round(double); /* prototype is often missing... */ # define thround round #else static double thround(double x) { if (x >= 0.0) return floor(x + 0.5); return ceil(x - 0.5); } #endif thmbuffer thparse_mbuff; int thmatch_stok(const char *buffer, const thstok *tab, int tab_size) { int a = 0, b = tab_size - 1, c, r; while (a <= b) { c = unsigned((a + b) / 2); r = strcmp(tab[c].s, buffer); if (r == 0) return tab[c].tok; if (r < 0) a = c + 1; else b = c - 1; } return tab[tab_size].tok; /* no match */ } int thcasematch_stok(const char *buffer, const thstok *tab, int tab_size) { int a = 0, b = tab_size - 1, c, r; while (a <= b) { c = unsigned((a + b) / 2); r = strcasecmp(tab[c].s, buffer); if (r == 0) return tab[c].tok; if (r < 0) a = c + 1; else b = c - 1; } return tab[tab_size].tok; /* no match */ } const char * thmatch_tstring(int token, const thstok *tab, int tab_size) { int i = 0; while ((i < tab_size) && (tab[i].tok != token)) i++; if (tab[i].tok == token) return tab[i].s; else return ""; /* no match */ } void thsplit_word(thbuffer * dword, thbuffer * drest, const char * src) { long srcl = strlen(src), idx = 0, idx0 = 0; short state = -1; // -1 before, 0 in, 1 out, 2 on the rest, 3 out unsigned char * s1 = NULL, * s2 = (unsigned char *) src; while ((state < 2) && (idx < srcl)) { switch (state) { case -1: if (*s2 > 32) { state = 0; s1 = s2; idx0 = idx; } break; case 0: if (*s2 < 33) { state = 1; dword->strncpy((char *)s1, idx - idx0); } break; case 1: if (*s2 > 32) { state = 2; s1 = s2; idx0 = idx; } } idx++; s2++; } switch (state) { case -1: dword->strcpy(""); drest->strcpy(""); break; case 0: dword->strcpy((char *)s1); drest->strcpy(""); break; case 1: drest->strcpy(""); break; default: idx = srcl; s2 = (unsigned char *) src + idx; while ((idx >= idx0) && (*s2 < 33)) { s2--; idx--; } drest->strncpy((char *) s1, idx - idx0 + 1); } } void thsplit_words(thmbuffer * dest, const char * src) { long srcl = strlen(src), idx = 0, idx0 = 0; dest->clear(); short state = 0; // 0 before, 1 in unsigned char * s1 = NULL, * s2 = (unsigned char *) src; while (idx < srcl) { switch (state) { case 0: if (*s2 > 32) { state = 1; s1 = s2; idx0 = idx; } break; case 1: if (*s2 < 33) { state = 0; dest->appendn((char *) s1, idx - idx0); } } idx++; s2++; } if (state == 1) { dest->append((char *) s1); } } void thsplit_strings(thmbuffer * dest, const char * src, const char separator) { long srcl = strlen(src), idx = 0, idx0 = 0; dest->clear(); short state = 0; // 0 before, 1 in unsigned char * s1 = NULL, * s2 = (unsigned char *) src; while (idx < srcl) { switch (state) { case 0: if (*s2 != separator) { state = 1; s1 = s2; idx0 = idx; } break; case 1: if (*s2 == separator) { state = 0; dest->appendn((char *)s1, idx - idx0); } } idx++; s2++; } if (state == 1) dest->append((char *)s1); } void thsplit_paths(thmbuffer * dest, const char * src, char separator) { long srcl = strlen(src), idx = 0, idx0 = 0; dest->clear(); short state = 0; // 0 before, 1 in unsigned char * s1 = NULL, * s2 = (unsigned char *) src; while (idx < srcl) { switch (state) { case 0: if (*s2 != separator) { state = 1; s1 = s2; idx0 = idx; } break; case 1: if (*s2 == separator) { #ifdef THWIN32 if ((idx - idx0 == 1) && (((src[idx0] >= 'A') && (src[idx0] <= 'Z')) || ((src[idx0] >= 'a') && (src[idx0] <= 'z')))) break; #endif state = 0; dest->appendn((char *)s1, idx - idx0); } } idx++; s2++; } if (state == 1) dest->append((char *)s1); } void thsplit_args_postp_quotes(char * buf) { long bl = strlen(buf), idx = 0; while (idx < bl) { if (*buf == '"') { strcpy(buf, buf+1); bl--; } buf++; idx++; } } void thsplit_args(thmbuffer * dest, const char * src) { long srcl = strlen(src), idx = 0, idx0 = 0; dest->clear(); short state = 0, qlevel = 0; // 0 before, 1 in word, 2 in "", 3 in [] unsigned char * s1 = NULL, * s2 = (unsigned char *) src; bool postp_quotes = false; char * postp_ptr = NULL; while (idx < srcl) { switch (state) { case 0: if (*s2 > 32) { switch (*s2) { case '#': idx = srcl; break; case '"': state = 2; postp_quotes = false; break; case '[': state = 3; qlevel = 1; break; default: state = 1; } s1 = s2; idx0 = idx; } break; case 1: if (*s2 < 33) { state = 0; dest->appendn((char *) s1, idx - idx0); } break; case 3: switch (*s2) { case ']': qlevel--; if (qlevel <= 0) { state = 0; if (idx > (idx0 + 1)) dest->appendn((char *) s1 + 1, idx - idx0 - 1); else dest->appendn("",0); } break; case '[': qlevel++; break; } break; case 2: if (*s2 == '"') { if ((idx + 1 < srcl) && (s2[1] == '"')) { postp_quotes = true; idx++; s2++; break; } else { state = 0; if (idx > (idx0 + 1)) { postp_ptr = dest->appendn((char *) s1 + 1, idx - idx0 - 1); if (postp_quotes) thsplit_args_postp_quotes(postp_ptr); } else dest->appendn("",0); } } } idx++; s2++; } switch (state) { case 1: dest->append((char *) s1); break; case 2: if (idx > (idx0 + 1)) dest->appendn((char *) s1 + 1, idx - idx0 - 1); else dest->appendn("",0); break; case 3: if (idx > (idx0 + 1)) postp_ptr = dest->appendn((char *) s1 + 1, idx - idx0 - 1); if (postp_quotes) thsplit_args_postp_quotes(postp_ptr); else dest->appendn("",0); break; } } void thsplit_fpath(thbuffer * dest, const char * src) { long len = strlen(src); const char * s = src + len++; while ((len > 0) && (*s != '/')) { s--; len--; } dest->strncpy(src, len); } bool th_is_keyword(const char * str) { size_t sl = strlen(str), i; unsigned char * s = (unsigned char *) str; if (sl == 0) return false; else for(i = 0; i < sl; i++, s++) { if ((*s > 96) && (*s < 123)) continue; if ((*s > 64) && (*s < 91)) continue; if ((*s > 46) && (*s < 58)) continue; if (*s == 95) continue; if ((*s == 45) && (i > 0)) continue; return false; } return true; } bool th_is_attr_name(const char * str) { size_t sl = strlen(str), i; unsigned char * s = (unsigned char *) str; if (sl == 0) return false; else for(i = 0; i < sl; i++, s++) { if ((*s > 47) && (*s < 58)) continue; if ((*s > 64) && (*s < 91)) continue; if ((*s > 96) && (*s < 123)) continue; if ((*s == 95) && (i > 0)) continue; return false; } return true; } bool th_is_index(const char * str) { size_t sl = strlen(str), i; unsigned char * s = (unsigned char *) str; if (sl == 0) return false; else for(i = 0; i < sl; i++, s++) { if ((*s > 47) && (*s < 58)) continue; return false; } return true; } bool th_is_keyword_list(const char * str, char sep) { size_t sl = strlen(str), i; unsigned char * s = (unsigned char *) str; if (sl == 0) return false; else for(i = 0; i < sl; i++, s++) { if ((*s > 96) && (*s < 123)) continue; if ((*s > 64) && (*s < 91)) continue; if ((*s > 46) && (*s < 58)) continue; if ((*s == 95) || (*s == 45)) continue; if (*s == sep) continue; return false; } return true; } bool th_is_extkeyword(const char * str) { size_t sl = strlen(str), i; unsigned char * s = (unsigned char *) str; if (sl == 0) return false; else for(i = 0; i < sl; i++, s++) { if ((*s > 96) && (*s < 123)) continue; if ((*s > 64) && (*s < 91)) continue; if ((*s > 46) && (*s < 58)) continue; if ((*s == 95) || (*s == 45)) continue; if (i > 0) { if (*s == 39) continue; if ((*s > 41) && (*s < 48)) continue; } return false; } return true; } void thparse_double(int & sv, double & dv, const char * src) { char * endptr; sv = thmatch_token(src, thtt_special_val); switch (sv) { case TT_SV_NAN: dv = thnan; break; case TT_SV_UP: case TT_SV_PINF: dv = thinf; break; case TT_SV_DOWN: case TT_SV_NINF: dv = - thinf; break; default: errno = 0; dv = strtod(src,&endptr); if ((*endptr == 0) && (errno == 0)) sv = TT_SV_NUMBER; else dv = 0.0; } } void thparse_double_dms(int & sv, double & dv, const char * src) { int ssv; double dms; thsplit_strings(&thparse_mbuff,src,':'); if (thparse_mbuff.get_size() > 0) { thparse_double(sv, dv, thparse_mbuff.get_buffer()[0]); // thprintf("DEG:%lf\n", dv); if (sv == TT_SV_NUMBER) { // ok, mame stupne if (thparse_mbuff.get_size() > 1) { thparse_double(ssv, dms, thparse_mbuff.get_buffer()[1]); // thprintf("MIN:%lf\n", dms); if ((ssv == TT_SV_NUMBER) && (dms >= 0.0) && (dv == double(int(dv)))) { // ok, mame minuty if (dv > 0.0) { dv += dms / 60.0; } else { dv -= dms / 60.0; } if ((dms == double(int(dms))) && (thparse_mbuff.get_size() == 3)) { thparse_double(ssv, dms, thparse_mbuff.get_buffer()[2]); // thprintf("SEC:%lf\n", dms); if ((ssv == TT_SV_NUMBER) && (dms >= 0.0)) { if (dv > 0.0) { dv += dms / 3600.0; } else { dv -= dms / 3600.0; } } else { // error sv = TT_SV_UNKNOWN; } } else if (thparse_mbuff.get_size() >= 3) { // error sv = TT_SV_UNKNOWN; } } else { // nemame nic sv = TT_SV_UNKNOWN; } } } } else { sv = TT_SV_UNKNOWN; dv = 0.0; } // thprintf("\n%s -> %lf\n", src, dv); } void thdecode_c(thbuffer * dest, const char * src) { size_t srcln = strlen(src), srcx = 0; unsigned char * srcp, * dstp; unsigned num; dest->guarantee(srcln * 8 + 1); // check buffer size srcp = (unsigned char*) src; dstp = (unsigned char*) dest->get_buffer(); while (srcx < srcln) { if ((*srcp < 32) || (*srcp > 127)) { *dstp = '"'; dstp++; *dstp = '"'; dstp++; *dstp = '\\'; dstp++; *dstp = 'x'; dstp++; num = *srcp / 16; if (num < 10) *dstp = '0' + num; else *dstp = 'A' + (num - 10); dstp++; num = *srcp % 16; if (num < 10) *dstp = '0' + num; else *dstp = 'A' + (num - 10); dstp++; *dstp = '"'; dstp++; *dstp = '"'; } else { if ((*srcp == '\\') || (*srcp == '"')) { *dstp = '\\'; dstp++; } *dstp = *srcp; } srcx++; srcp++; dstp++; } // end destination string with 0 *dstp = 0; } void thdecode_tcl(thbuffer * dest, const char * src) { size_t srcln = strlen(src), srcx = 0; unsigned char * srcp, * dstp; unsigned num; dest->guarantee(srcln * 8 + 1); // check buffer size srcp = (unsigned char*) src; dstp = (unsigned char*) dest->get_buffer(); while (srcx < srcln) { if ((*srcp < 32) || (*srcp > 127) || (*srcp == '[') || (*srcp == '[') || (*srcp == '"')) { *dstp = '\\'; dstp++; num = *srcp / 64; *dstp = '0' + num; dstp++; num = *srcp % 64; *dstp = '0' + (num/8); dstp++; *dstp = '0' + (num % 8); } else { if ((*srcp == '\\') || (*srcp == '"')) { *dstp = '\\'; dstp++; } *dstp = *srcp; } srcx++; srcp++; dstp++; } // end destination string with 0 *dstp = 0; } void thdecode_mp(thbuffer * dest, const char * src) { size_t srcln = strlen(src), srcx = 0; unsigned char * srcp, * dstp; dest->guarantee(srcln * 8 + 1); // check buffer size srcp = (unsigned char*) src; dstp = (unsigned char*) dest->get_buffer(); while (srcx < srcln) { if (*srcp < 32) { *dstp = ' '; } else { if (*srcp == '"') { *dstp = '"'; dstp++; *dstp = '&'; dstp++; *dstp = 'd'; dstp++; *dstp = 't'; dstp++; *dstp = 't'; dstp++; *dstp = 'o'; dstp++; *dstp = '&'; dstp++; } *dstp = *srcp; } srcx++; srcp++; dstp++; } // end destination string with 0 *dstp = 0; } void thdecode_tex(thbuffer * dest, const char * src) { size_t srcln = strlen(src), srcx = 0; unsigned char * srcp, * dstp; // unsigned num; dest->guarantee(srcln * 8 + 1); // check buffer size srcp = (unsigned char*) src; dstp = (unsigned char*) dest->get_buffer(); while (srcx < srcln) { switch (*srcp) { case '%': case '_': case '&': case '$': case '#': case '@': case '~': case '`': case '^': case '*': case '\\': case '{': case '}': case '|': case '"': *dstp = '\\'; dstp++; *dstp = *srcp; break; default: *dstp = *srcp; break; } srcx++; srcp++; dstp++; } // end destination string with 0 *dstp = 0; } void thdecode_utf2tex(thbuffer * dest, const char * src) { static thbuffer tmpb; tmpb = src; size_t srcln = strlen(src), srcx = 0, tmpl; unsigned char * srcp, * dstp, * wsrcp, *tmpp; dest->strcpy(""); // check buffer size srcp = (unsigned char*) src; dstp = (unsigned char*) tmpb.get_buffer(); while (srcx < srcln) { switch (*srcp) { case '%': case '_': case '(': case ')': case '[': case ']': case '&': case '$': case '#': case '@': case '~': case '`': case '^': case '*': case '\\': case '{': case '}': case '|': case '"': case ' ': case 9: case 12: *dstp = 0; break; default: *dstp = *srcp; break; } srcx++; srcp++; dstp++; } // end destination string with 0 srcx = 0; srcp = (unsigned char*) src; wsrcp = (unsigned char*) tmpb.get_buffer(); unsigned char single[2]; bool isutf8; dstp = &(single[0]); single[1] = 0; // copy word by word while(srcx < srcln) { if (*wsrcp == 0) { single[0] = *srcp; dest->strcat((char*) dstp); srcx++; srcp++; wsrcp++; } else { isutf8 = false; tmpl = 0; // check if there is some character > 127 for(tmpp = wsrcp; *tmpp != 0; tmpp++) { tmpl++; isutf8 = isutf8 || (*tmpp > 127); } if (isutf8) { dest->strcat(utf2tex((char*) wsrcp)); } else { dest->strcat((char*) wsrcp); } srcx+=tmpl; srcp+=tmpl; wsrcp+=tmpl; } } } void thdecode_sql(thbuffer * dest, const char * src) { size_t srcln = strlen(src), srcx = 0; unsigned char * srcp, * dstp; // unsigned num; if ((src == NULL) || (srcln == 0)) { *dest = "NULL"; return; } dest->guarantee(srcln * 8 + 3); // check buffer size srcp = (unsigned char*) src; dstp = (unsigned char*) dest->get_buffer(); *dstp = '\''; dstp++; while (srcx < srcln) { switch (*srcp) { case '\'': *dstp = '\''; dstp++; *dstp = *srcp; break; default: *dstp = *srcp; break; } srcx++; srcp++; dstp++; } // end destination string with 0 *dstp = '\''; dstp++; *dstp = 0; } void thdecode_arg(thbuffer * dest, const char * src) { size_t srcln = strlen(src), srcx; unsigned char * srcp, * dstp; // unsigned num; srcx = 0; srcp = (unsigned char*) src; // rychlo prescanuje, an nenajde whitespace, tak len skopiruje bool quickcpy = true; while (srcx < srcln) { if (*srcp <= 32) { quickcpy = false; break; } srcp++; srcx++; } if (quickcpy) { dest->strcpy(src); return; } // zaciatocna uvodzovka dest->guarantee(srcln * 8 + 3); // check buffer size srcx = 0; srcp = (unsigned char*) src; dstp = (unsigned char*) dest->get_buffer(); *dstp = '"'; dstp++; while (srcx < srcln) { if (*srcp == '"') { *dstp = '"'; dstp++; } *dstp = *srcp; srcx++; srcp++; dstp++; } // end destination string with 0 *dstp = '"'; dstp++; *dstp = 0; } void thparse_altitude(const char * src, double & altv, double & fixv) { thsplit_args(& thdb.db2d.mbf, src); int npar = thdb.db2d.mbf.get_size(); char ** pars = thdb.db2d.mbf.get_buffer(); int sv, ux = 0; bool parsev = true; thtflength lentf; altv = 0.0; fixv = 1.0; if ((npar > 1) && (strcmp(pars[0],"fix") == 0)) { fixv = 0.0; npar--; pars++; } switch (npar) { case 0: parsev = false; break; case 1: break; case 2: ux = 1; break; default: ththrow(("invalid altitude specification -- %s",src)) } if (parsev) { thparse_double(sv,altv,pars[0]); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid altitude value -- %s", pars[0])); if (sv == TT_SV_NAN) altv = 0.0; } if ((ux > 0) && (sv != TT_SV_NAN)) { lentf.parse_units(pars[ux]); altv = lentf.transform(altv); } } void thparse_image(const char * fname, double & width, double & height, double & dpi, int & type) { type = TT_IMG_TYPE_UNKNOWN; FILE * pictf = fopen(fname, "rb"); #define picths 2048 size_t phsize; double xdpi, ydpi; unsigned char picth [picths], * scan; size_t sx; width = 0.0; height = 0.0; dpi = 300.0; if (pictf != NULL) { phsize = fread(&(picth[0]), 1, picths, pictf); fclose(pictf); // najde si format a vytiahne informacie if ((picth[0] == 0xFF) && (picth[1] == 0xD8) && (picth[2] == 0xFF) && (picth[3] == 0xE0)) { // JPEG type = TT_IMG_TYPE_JPEG; xdpi = 300.0; ydpi = 300.0; switch (picth[13]) { case 1: xdpi = thround(double(picth[14] * 256.0 + picth[15])); ydpi = thround(double(picth[16] * 256.0 + picth[17])); break; case 2: xdpi = thround(double(picth[14] * 256 + picth[15]) * 2.54); ydpi = thround(double(picth[16] * 256 + picth[17]) * 2.54); break; } if (xdpi != ydpi) { ththrow(("X and Y image resolution not equal -- %s", fname)); } dpi = xdpi; if (dpi < 1.0) { dpi = 300.0; } //for(sx = 0, scan = &(picth[0]); sx < (phsize - 10); sx++, scan++) { // if ((scan[0] == 0xFF) && ((scan[1] == 0xC0) || (scan[1] == 0xC1))) { // height = thround(double(scan[5]) * 256.0 + double(scan[6])); // width = thround(double(scan[7]) * 256.0 + double(scan[8])); // } //} sx = 0; int marker; size_t len; pictf = fopen(fname, "rb"); fread(&(picth[0]), 1, 2, pictf); height = -1.0; width = -1.0; while(getc(pictf) == 255) { marker = getc(pictf); len = 256 * (size_t) getc(pictf) + (size_t) getc(pictf); if ((marker == 0xC0) || (marker == 0xC1)) { getc(pictf); height = thround(double(getc(pictf)) * 256.0 + double(getc(pictf))); width = thround(double(getc(pictf)) * 256.0 + double(getc(pictf))); break; } fseek(pictf, len - 2, SEEK_CUR); } fclose(pictf); if ((height < 0.0) || (width < 0.0)) ththrow(("unable to determine image size -- %s", fname)); } else if ( (picth[0] == 0x89) && (picth[1] == 0x50) && (picth[2] == 0x4E) && (picth[3] == 0x47) && (picth[4] == 0x0D) && (picth[5] == 0x0A) && (picth[6] == 0x1A) && (picth[7] == 0x0A)) { // PNG type = TT_IMG_TYPE_PNG; // najde pHYs za nim 4(x), 4(y), 1(units) = 01-meters, 00-unspec for(sx = 0, scan = &(picth[0]); sx < (phsize - 12); sx++, scan++) { if (strncmp((char *) scan,"pHYs",4) == 0) { xdpi = double(scan[4] * 0x1000000 + scan[5] * 0x10000 + scan[6] * 0x100 + scan[7]); ydpi = double(scan[8] * 0x1000000 + scan[9] * 0x10000 + scan[10] * 0x100 + scan[11]); if (xdpi != ydpi) { ththrow(("X and Y image resolution not equal -- %s", fname)); } switch (scan[12]) { case 1: xdpi = thround(xdpi * 0.0254); break; default: xdpi = 300.0; break; } dpi = xdpi; break; } } width = thround(double(picth[16] * 0x1000000 + picth[17] * 0x10000 + picth[18] * 0x100 + picth[19])); height = thround(double(picth[20] * 0x1000000 + picth[21] * 0x10000 + picth[22] * 0x100 + picth[23])); } else { ththrow(("file format not supported -- %s", fname)) } } else { ththrow(("file not found -- %s", fname)) } #ifdef THDEBUG thprintf("\nIMAGE FILE:%s\n", fname); thprintf( " DPI:%.0f\n", dpi); thprintf( " SIZE:%.0f x %.0f\n\n", width, height); #endif } void thHSV2RGB(double H, double S, double V, double & R, double & G, double & B) { if (S == 0.0) { R = V; G = V; B = V; } else { double var_h = H * 6; int var_i = (int) floor( var_h ); double var_1 = V * ( 1 - S ); double var_2 = V * ( 1 - S * ( var_h - var_i ) ); double var_3 = V * ( 1 - S * ( 1 - ( var_h - var_i ) ) ); switch (var_i) { case 0: R = V ; G = var_3 ; B = var_1 ; break; case 1: R = var_2 ; G = V ; B = var_1 ; break; case 2: R = var_1 ; G = V ; B = var_3 ; break; case 3: R = var_1 ; G = var_2 ; B = V ; break; case 4: R = var_3 ; G = var_1 ; B = V ; break; default: R = V ; G = var_1 ; B = var_2 ; break; } } } void thset_color(int color_map, double index, double total, double & R, double & G, double & B) { switch (color_map) { default: if (total > 0) thHSV2RGB(index / total * 0.833333, 1.0, 1.0, R, G, B); else { R = 1.0; G = 1.0; B = 1.0; } } R = double(int(100 * R)) / 100.0; G = double(int(100 * G)) / 100.0; B = double(int(100 * B)) / 100.0; } void thset_grid( double gorigin, double gsize, double min, double max, double & qstart, long & nquads) { // treba nam najst origin start a quads aby if (min < gorigin) qstart = gorigin - gsize * ceil((gorigin - min) / gsize); else qstart = gorigin + gsize * floor((min - gorigin) / gsize); nquads = long(ceil(max - qstart) / gsize); } const char * thutf82xhtml(const char * src) { static thbuffer tmp; if (src == NULL) return ""; size_t sx, dx, sl = strlen(src); bool inspec; char * res; tmp.guarantee(sl); res = tmp.get_buffer(); inspec = false; for(sx = 0, dx = 0; sx < sl; sx++) { if ((!inspec) && (src[sx] == '<')) { inspec = true; } else if ((inspec) && (src[sx] == '>')) { inspec = false; } else if (!inspec) { res[dx] = src[sx]; dx++; } } res[dx] = 0; return res; } static const char base64_tab[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; void thbase64_encode(const char * fname, FILE * fout) { int llength = 0; char in_buffer[3]; unsigned char out_buffer[5]; out_buffer[4] = 0; FILE * fin; fin = fopen(fname, "rb"); size_t count; do { for (int i = 0; i < 3; i++) in_buffer[i] = '\x0'; for (int i = 0; i < 4; i++) out_buffer[i] = '='; if (fin != NULL) count = fread(in_buffer, 1, 3, fin); else count = 0; unsigned long value = ((unsigned char)in_buffer[0]) << 16 | ((unsigned char)in_buffer[1]) << 8 | ((unsigned char)in_buffer[2]) << 0; out_buffer[0] = base64_tab[(value >> 18) & 0x3F]; out_buffer[1] = base64_tab[(value >> 12) & 0x3F]; if (count > 1) out_buffer[2] = base64_tab[(value >> 6) & 0x3F]; if (count > 2) out_buffer[3] = base64_tab[(value >> 0) & 0x3F]; if (llength >= 76) { fprintf(fout,"\n"); llength = 0; } fprintf(fout,"%s",out_buffer); llength += 4; } while ((fin != NULL) && (!feof(fin))); if (fin != NULL) fclose(fin); } bool thpath_is_absolute(const char * fname) { #ifdef THWIN32 return ((strlen(fname) > 3) && (fname[1] == ':')); #else return ((strlen(fname) > 2) && (fname[0] == '/')); #endif } void thparse_length(int & sv, double & dv, const char * src) { sv = thmatch_token(src, thtt_special_val); if (sv == TT_SV_NAN) { dv = thnan; return; } else { sv = TT_SV_UNKNOWN; } char * units; size_t strl, cx; strl = strlen(src); thtflength lt; static thbuffer plb; char * srcb; plb.strcpy(src); srcb = plb.get_buffer(); // first let's find units index bool has_units = false; units = NULL; for(cx = strl - 1; cx > 0; cx--) { if (has_units) { if (srcb[cx] < 33) srcb[cx] = 0; else break; } else { if ((cx < strl - 1) && (!( ((srcb[cx] >= 'a') && (srcb[cx] <= 'z')) || ((srcb[cx] >= 'A') && (srcb[cx] <= 'Z')) )) ) { units = &(srcb[cx+1]); if (((*units >= 'a') && (*units <= 'z')) || ((*units >= 'A') && (*units <= 'Z'))) { has_units = true; } else { units = NULL; } } if (srcb[cx] < 33) srcb[cx] = 0; } } // parse units if applicable if (units != NULL) { lt.parse_units(units); *units = 0; } // parse double value errno = 0; char * endptr; dv = strtod(srcb,&endptr); if ((*endptr == 0) && (errno == 0)) sv = TT_SV_NUMBER; else dv = thnan; dv = lt.transform(dv); } std::string ths2tex(std::string original, int lang, bool remove_kerning) { return utf2tex(select_lang(original, thlang_getid(lang)), remove_kerning); } std::string ths2txt(const char * original, int lang, int encoding) { return ths2txt(std::string(original == NULL ? "" : original), lang, encoding); } std::string ths2txt(std::string original, int lang, int encoding) { // TODO: encoding conversion & al. return select_lang(original, thlang_getid(lang)); } therion/thsymbolsets.cxx0000664000175000017500000002125012340611142014524 0ustar useruser#include "thsymbolsets.h" int thsymsets_symbols [thsymbolset_size][thsymsets_size]; int thsymsets_figure [thsymbolset_size][thsymsets_size+1]; int thsymsets_order[thsymbolset_size]; int thsymsets_count[thsymsets_size]; std::map thsymsets_comment; void thsymsets_symbols_init() { size_t i, j; for(i = 0; i <= thsymbolset_size; i++) for(j = 0; j < thsymsets_size; j++) thsymsets_symbols[i][j] = 0; thsymsets_symbols[SYMP_AIRDRAUGHT][1] = 1; thsymsets_symbols[SYMP_AIRDRAUGHT][7] = 1; thsymsets_symbols[SYMP_AIRDRAUGHT_SUMMER][7] = 1; thsymsets_symbols[SYMP_AIRDRAUGHT_WINTER][7] = 1; thsymsets_symbols[SYMP_ANASTOMOSIS][7] = 1; thsymsets_symbols[SYMP_ANCHOR][5] = 1; thsymsets_symbols[SYMP_ARAGONITE][3] = 1; thsymsets_symbols[SYMP_ARCHEOMATERIAL][7] = 1; thsymsets_symbols[SYMP_BEDROCK][0] = 1; thsymsets_symbols[SYMP_BLOCKS][1] = 1; thsymsets_symbols[SYMP_BLOCKS][7] = 1; thsymsets_symbols[SYMP_BREAKDOWNCHOKE][1] = 1; thsymsets_symbols[SYMP_BREAKDOWNCHOKE][3] = 1; thsymsets_symbols[SYMP_BRIDGE][5] = 1; thsymsets_symbols[SYMP_CAMP][5] = 1; thsymsets_symbols[SYMP_CAVEPEARL][5] = 1; thsymsets_symbols[SYMP_CLAY][1] = 1; thsymsets_symbols[SYMP_CLAY][5] = 1; thsymsets_symbols[SYMP_CLAYCHOKE][1] = 1; thsymsets_symbols[SYMP_CLAYTREE][1] = 1; thsymsets_symbols[SYMP_CONTINUATION][7] = 1; thsymsets_symbols[SYMP_CRYSTAL][1] = 1; thsymsets_symbols[SYMP_CRYSTAL][7] = 1; thsymsets_symbols[SYMP_CURTAIN][7] = 1; thsymsets_symbols[SYMP_DEBRIS][1] = 1; thsymsets_symbols[SYMP_DEBRIS][7] = 1; thsymsets_symbols[SYMP_DIG][7] = 1; thsymsets_symbols[SYMP_DISK][7] = 1; thsymsets_symbols[SYMP_ENTRANCE][1] = 1; thsymsets_symbols[SYMP_ENTRANCE][7] = 1; thsymsets_symbols[SYMP_FIXEDLADDER][5] = 1; thsymsets_symbols[SYMP_FLOWSTONE][7] = 1; thsymsets_symbols[SYMP_FLOWSTONECHOKE][3] = 1; thsymsets_symbols[SYMP_FLUTE][7] = 1; thsymsets_symbols[SYMP_GRADIENT][1] = 1; thsymsets_symbols[SYMP_GRADIENT][2] = 1; thsymsets_symbols[SYMP_GRADIENT][3] = 1; thsymsets_symbols[SYMP_GRADIENT][5] = 1; thsymsets_symbols[SYMP_GRADIENT][7] = 1; thsymsets_symbols[SYMP_GUANO][7] = 1; thsymsets_symbols[SYMP_GYPSUM][3] = 1; thsymsets_symbols[SYMP_GYPSUMFLOWER][3] = 1; thsymsets_symbols[SYMP_HANDRAIL][5] = 1; thsymsets_symbols[SYMP_HELICTITE][7] = 1; thsymsets_symbols[SYMP_ICE][1] = 1; thsymsets_symbols[SYMP_ICE][7] = 1; thsymsets_symbols[SYMP_ICEPILLAR][1] = 1; thsymsets_symbols[SYMP_ICESTALACTITE][1] = 1; thsymsets_symbols[SYMP_ICESTALAGMITE][1] = 1; thsymsets_symbols[SYMP_KARREN][7] = 1; thsymsets_symbols[SYMP_LOWEND][3] = 1; thsymsets_symbols[SYMP_LOWEND][7] = 1; thsymsets_symbols[SYMP_MOONMILK][7] = 1; thsymsets_symbols[SYMP_NARROWEND][7] = 1; thsymsets_symbols[SYMP_NOEQUIPMENT][5] = 1; thsymsets_symbols[SYMP_PALEOMATERIAL][7] = 1; thsymsets_symbols[SYMP_PEBBLES][1] = 1; thsymsets_symbols[SYMP_PEBBLES][7] = 1; thsymsets_symbols[SYMP_PILLAR][1] = 1; thsymsets_symbols[SYMP_PILLAR][7] = 1; thsymsets_symbols[SYMP_PILLARS][7] = 1; thsymsets_symbols[SYMP_POPCORN][7] = 1; thsymsets_symbols[SYMP_RAFT][3] = 1; thsymsets_symbols[SYMP_RAFTCONE][3] = 1; thsymsets_symbols[SYMP_RIMSTONEDAM][0] = 1; thsymsets_symbols[SYMP_RIMSTONEPOOL][0] = 1; thsymsets_symbols[SYMP_ROOT][0] = 1; thsymsets_symbols[SYMP_ROPE][5] = 1; thsymsets_symbols[SYMP_ROPELADDER][5] = 1; thsymsets_symbols[SYMP_SAND][1] = 1; thsymsets_symbols[SYMP_SAND][7] = 1; thsymsets_symbols[SYMP_SCALLOP][7] = 1; thsymsets_symbols[SYMP_SINK][1] = 1; thsymsets_symbols[SYMP_SINK][5] = 1; thsymsets_symbols[SYMP_SNOW][5] = 1; thsymsets_symbols[SYMP_SODASTRAW][7] = 1; thsymsets_symbols[SYMP_SPRING][1] = 1; thsymsets_symbols[SYMP_SPRING][5] = 1; thsymsets_symbols[SYMP_STALACTITE][1] = 1; thsymsets_symbols[SYMP_STALACTITE][7] = 1; thsymsets_symbols[SYMP_STALACTITES][7] = 1; thsymsets_symbols[SYMP_STALAGMITE][1] = 1; thsymsets_symbols[SYMP_STALAGMITE][7] = 1; thsymsets_symbols[SYMP_STALAGMITES][7] = 1; thsymsets_symbols[SYMP_STATION][5] = 1; thsymsets_symbols[SYMP_STATION_FIXED][0] = 1; thsymsets_symbols[SYMP_STATION_FIXED][1] = 1; thsymsets_symbols[SYMP_STATION_NATURAL][0] = 1; thsymsets_symbols[SYMP_STATION_PAINTED][1] = 1; thsymsets_symbols[SYMP_STATION_PAINTED][5] = 1; thsymsets_symbols[SYMP_STATION_TEMPORARY][0] = 1; thsymsets_symbols[SYMP_STATION_TEMPORARY][1] = 1; thsymsets_symbols[SYMP_STATION_TEMPORARY][5] = 1; thsymsets_symbols[SYMP_STEPS][5] = 1; thsymsets_symbols[SYMP_TRAVERSE][5] = 1; thsymsets_symbols[SYMP_VEGETABLEDEBRIS][0] = 1; thsymsets_symbols[SYMP_VIAFERRATA][5] = 1; thsymsets_symbols[SYMP_WALLCALCITE][7] = 1; thsymsets_symbols[SYMP_WATER][1] = 1; thsymsets_symbols[SYMP_WATER][7] = 1; thsymsets_symbols[SYMP_WATERFLOW_INTERMITTENT][7] = 1; thsymsets_symbols[SYMP_WATERFLOW_PALEO][7] = 1; thsymsets_symbols[SYMP_WATERFLOW_PERMANENT][7] = 1; thsymsets_symbols[SYML_ARROW][5] = 1; thsymsets_symbols[SYML_BORDER_PRESUMED][5] = 1; thsymsets_symbols[SYML_BORDER_TEMPORARY][5] = 1; thsymsets_symbols[SYML_BORDER_VISIBLE][5] = 1; thsymsets_symbols[SYML_CEILINGMEANDER][4] = 1; thsymsets_symbols[SYML_CEILINGMEANDER][5] = 1; thsymsets_symbols[SYML_CEILINGMEANDER][7] = 1; thsymsets_symbols[SYML_CEILINGSTEP][4] = 1; thsymsets_symbols[SYML_CEILINGSTEP][5] = 1; thsymsets_symbols[SYML_CEILINGSTEP][7] = 1; thsymsets_symbols[SYML_CHIMNEY][4] = 1; thsymsets_symbols[SYML_CHIMNEY][7] = 1; thsymsets_symbols[SYML_CONTOUR][1] = 1; thsymsets_symbols[SYML_CONTOUR][5] = 1; thsymsets_symbols[SYML_CONTOUR][7] = 1; thsymsets_symbols[SYML_FIXEDLADDER][5] = 1; thsymsets_symbols[SYML_FLOORMEANDER][5] = 1; thsymsets_symbols[SYML_FLOORSTEP][1] = 1; thsymsets_symbols[SYML_FLOORSTEP][7] = 1; thsymsets_symbols[SYML_FLOWSTONE][1] = 1; thsymsets_symbols[SYML_FLOWSTONE][7] = 1; thsymsets_symbols[SYML_GRADIENT][2] = 1; thsymsets_symbols[SYML_GRADIENT][7] = 1; thsymsets_symbols[SYML_HANDRAIL][5] = 1; thsymsets_symbols[SYML_MAPCONNECTION][5] = 1; thsymsets_symbols[SYML_MOONMILK][7] = 1; thsymsets_symbols[SYML_OVERHANG][1] = 1; thsymsets_symbols[SYML_OVERHANG][5] = 1; thsymsets_symbols[SYML_PIT][1] = 1; thsymsets_symbols[SYML_PIT][7] = 1; thsymsets_symbols[SYML_ROCKBORDER][7] = 1; thsymsets_symbols[SYML_ROCKEDGE][7] = 1; thsymsets_symbols[SYML_ROPE][5] = 1; thsymsets_symbols[SYML_ROPELADDER][5] = 1; thsymsets_symbols[SYML_SECTION][5] = 1; thsymsets_symbols[SYML_SLOPE][2] = 1; thsymsets_symbols[SYML_SLOPE][5] = 1; thsymsets_symbols[SYML_STEPS][5] = 1; thsymsets_symbols[SYML_SURVEY_CAVE][1] = 1; thsymsets_symbols[SYML_SURVEY_CAVE][5] = 1; thsymsets_symbols[SYML_SURVEY_CAVE][7] = 1; thsymsets_symbols[SYML_SURVEY_SURFACE][5] = 1; thsymsets_symbols[SYML_VIAFERRATA][5] = 1; thsymsets_symbols[SYML_WALL_BEDROCK][7] = 1; thsymsets_symbols[SYML_WALL_BLOCKS][1] = 1; thsymsets_symbols[SYML_WALL_BLOCKS][5] = 1; thsymsets_symbols[SYML_WALL_CLAY][1] = 1; thsymsets_symbols[SYML_WALL_CLAY][5] = 1; thsymsets_symbols[SYML_WALL_DEBRIS][1] = 1; thsymsets_symbols[SYML_WALL_DEBRIS][5] = 1; thsymsets_symbols[SYML_WALL_FLOWSTONE][1] = 1; thsymsets_symbols[SYML_WALL_ICE][1] = 1; thsymsets_symbols[SYML_WALL_ICE][5] = 1; thsymsets_symbols[SYML_WALL_MOONMILK][1] = 1; thsymsets_symbols[SYML_WALL_OVERLYING][1] = 1; thsymsets_symbols[SYML_WALL_PEBBLES][1] = 1; thsymsets_symbols[SYML_WALL_PEBBLES][5] = 1; thsymsets_symbols[SYML_WALL_PIT][1] = 1; thsymsets_symbols[SYML_WALL_PRESUMED][4] = 1; thsymsets_symbols[SYML_WALL_PRESUMED][7] = 1; thsymsets_symbols[SYML_WALL_SAND][1] = 1; thsymsets_symbols[SYML_WALL_SAND][5] = 1; thsymsets_symbols[SYML_WALL_UNDERLYING][1] = 1; thsymsets_symbols[SYML_WALL_UNDERLYING][7] = 1; thsymsets_symbols[SYML_WALL_UNSURVEYED][5] = 1; thsymsets_symbols[SYML_WATERFLOW_CONJECTURAL][5] = 1; thsymsets_symbols[SYML_WATERFLOW_INTERMITTENT][5] = 1; thsymsets_symbols[SYML_WATERFLOW_PERMANENT][7] = 1; thsymsets_symbols[SYMA_BEDROCK][5] = 1; thsymsets_symbols[SYMA_BLOCKS][1] = 1; thsymsets_symbols[SYMA_BLOCKS][5] = 1; thsymsets_symbols[SYMA_CLAY][1] = 1; thsymsets_symbols[SYMA_CLAY][5] = 1; thsymsets_symbols[SYMA_DEBRIS][1] = 1; thsymsets_symbols[SYMA_DEBRIS][5] = 1; thsymsets_symbols[SYMA_DEBRIS][7] = 1; thsymsets_symbols[SYMA_DIMENSIONS][5] = 1; thsymsets_symbols[SYMA_FLOWSTONE][0] = 1; thsymsets_symbols[SYMA_ICE][1] = 1; thsymsets_symbols[SYMA_ICE][5] = 1; thsymsets_symbols[SYMA_MOONMILK][5] = 1; thsymsets_symbols[SYMA_PEBBLES][1] = 1; thsymsets_symbols[SYMA_PEBBLES][5] = 1; thsymsets_symbols[SYMA_SAND][1] = 1; thsymsets_symbols[SYMA_SAND][7] = 1; thsymsets_symbols[SYMA_SNOW][1] = 1; thsymsets_symbols[SYMA_SNOW][5] = 1; thsymsets_symbols[SYMA_SUMP][1] = 1; thsymsets_symbols[SYMA_SUMP][5] = 1; thsymsets_symbols[SYMA_SUMP][7] = 1; thsymsets_symbols[SYMA_WATER][1] = 1; thsymsets_symbols[SYMA_WATER][5] = 1; thsymsets_symbols[SYMA_WATER][7] = 1; } therion/thinit.cxx0000664000175000017500000004076411547602522013310 0ustar useruser/** * @file thinit.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thinit.h" #include "thparse.h" #include "thchenc.h" #include "therion.h" #include "thconfig.h" #include "thexception.h" #include "thtexfonts.h" #include "thlang.h" #include "thlocale.h" #include "thtmpdir.h" #include "thcs.h" #ifdef THWIN32 #include #endif #ifdef THMSVC #define snprintf _snprintf #define strcasecmp _stricmp #endif const char * THCCC_INIT_FILE = "### Output character encodings ###\n" "# encoding-default ASCII\n" "# encoding-sql ASCII\n\n" "### Default regional settings ###\n" "# language en_UK\n" "# units metric\n\n" "### Prefered loop closure method\n" "# loop-closure survex\n\n" "### Paths to called executable files ###\n" "# mpost-path \"mpost\"\n" "# mpost-options \"-tex=etex\"\n" "# pdftex-path \"pdfetex\"\n" "# cavern-path \"cavern\"\n" "# convert-path \"convert\"\n" "# identify-path \"identify\"\n\n" "### Search paths for source and configuration files ###\n" "# source-path \"\"\n\n" "### Tex initialization ###\n" "# tex-env off\n" "# tex-fonts \n" "# tex-fonts raw cmr10 cmti10 cmbx10 cmss10 cmssi10\n" "# tex-fonts xl2 csr10 csti10 csbx10 csss10 csssi10\n\n" "### PDF fonts initialization\n" "# otf2pfb off\n" "# pdf-fonts \n\n" "### Path to temporary directory ###\n" "# tmp-path \"\"\n\n" "### User defined coordinate system ###\n" "# cs-def [other options]\n\n" "### Command to remove temporary directory ###\n" "# tmp-remove \"\"\n\n"; thinit::thinit() { this->fonts_ok = false; this->tex_env = false; this->lang = THLANG_UNKNOWN; this->loopc = THINIT_LOOPC_UNKNOWN; } thinit::~thinit() { } enum { TTIC_ENCODING_DEFAULT, TTIC_ENCODING_SQL, TTIC_PATH_CAVERN, // TTIC_PATH_3DTOPOS, TTIC_PATH_CONVERT, TTIC_PATH_IDENTIFY, TTIC_PATH_MPOST, TTIC_OPT_MPOST, TTIC_PATH_PDFTEX, TTIC_PATH_SOURCE, TTIC_TMP_PATH, TTIC_TMP_REMOVE_SCRIPT, TTIC_LANG, TTIC_TEX_FONTS, TTIC_TEX_ENV, TTIC_UNITS, TTIC_LOOPC, TTIC_TEXT, TTIC_PDF_FONTS, TTIC_OTF2PFB, TTIC_CS_DEF, TTIC_UNKNOWN, }; /** * Data types parsing table. */ static const thstok thtt_initcmd[] = { {"cavern-path", TTIC_PATH_CAVERN}, {"convert-path", TTIC_PATH_CONVERT}, {"cs-def", TTIC_CS_DEF}, {"encoding-default", TTIC_ENCODING_DEFAULT}, {"encoding-sql", TTIC_ENCODING_SQL}, // {"encoding_default", TTIC_ENCODING_DEFAULT}, // {"path_3dtopos", TTIC_PATH_3DTOPOS}, {"identify-path", TTIC_PATH_IDENTIFY}, {"language", TTIC_LANG}, {"loop-closure", TTIC_LOOPC}, {"mpost-options", TTIC_OPT_MPOST}, {"mpost-path", TTIC_PATH_MPOST}, {"otf2pfb", TTIC_OTF2PFB}, {"pdf-fonts", TTIC_PDF_FONTS}, {"pdftex-path", TTIC_PATH_PDFTEX}, {"source-path", TTIC_PATH_SOURCE}, {"tex-env",TTIC_TEX_ENV}, {"tex-fonts",TTIC_TEX_FONTS}, {"text",TTIC_TEXT}, {"tmp-path",TTIC_TMP_PATH}, {"tmp-remove",TTIC_TMP_REMOVE_SCRIPT}, {"units",TTIC_UNITS}, {NULL, TTIC_UNKNOWN}, }; void thinit__print_open(char * s) { #ifdef THDEBUG thprintf("\ninitialization file: %s\nreading\n", s); #else thprintf("initialization file: %s\n", s); thprintf("reading ..."); thtext_inline = true; #endif } static const thstok thtt_loopc[] = { {"survex", THINIT_LOOPC_SURVEX}, {"therion", THINIT_LOOPC_THERION}, {NULL, THINIT_LOOPC_UNKNOWN}, }; #ifdef THWIN32 thbuffer short_path_buffer; void thinit__make_short_path(thbuffer * bf) { DWORD rv; size_t sl; sl = strlen(bf->get_buffer()); if (sl == 0) return; short_path_buffer.guarantee(2 * sl); rv = GetShortPathName(bf->get_buffer(), short_path_buffer.get_buffer(), (DWORD) short_path_buffer.size); if ((rv > 0) && (rv < (DWORD) short_path_buffer.size)) { bf->strcpy(short_path_buffer.get_buffer()); } } #endif void thinit::copy_fonts() { if (ENC_NEW.NFSS == 0) return; static thbuffer tmpb; int retcode; if (fonts_ok) return; thprintf("copying_fonts ...\n"); for(int index = 0; index < 5; index++) { thprintf("%s\n", font_dst[index].c_str()); // skopiruje font subor #ifdef THWIN32 tmpb = "copy \""; #else tmpb = "cp \""; #endif tmpb += font_src[index].c_str(); tmpb += "\" \""; tmpb += thtmp.get_file_name(font_dst[index].c_str()); tmpb += "\""; #ifdef THWIN32 char * cpcmd; size_t cpch; cpcmd = tmpb.get_buffer(); for(cpch = 0; cpch < strlen(cpcmd); cpch++) { if (cpcmd[cpch] == '/') { cpcmd[cpch] = '\\'; } } #endif #ifdef THDEBUG thprintf("copying font\n"); #endif retcode = system(tmpb.get_buffer()); if (retcode != EXIT_SUCCESS) ththrow(("unable to copy font file -- %s", font_src[index].c_str())) } #ifdef THWIN32 FILE * f = fopen(thtmp.get_file_name("pltotf.bat"),"w"); fprintf(f,"@\"%s\\bin\\win32\\pltotf.exe\" %%1 %%2\n",thcfg.install_path.get_buffer()); fclose(f); f = fopen(thtmp.get_file_name("cfftot1.bat"),"w"); fprintf(f,"@\"%s\\bin\\win32\\cfftot1.exe\" %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9\n",thcfg.install_path.get_buffer()); fclose(f); #endif thprintf("done.\n"); fonts_ok = true; } int thinit::get_lang() { return thlang_getlang(this->lang); } void thinit::check_font_path(const char * fname, int index) { static thbuffer pfull, pshort, tmpb; pshort.strcpy(""); pfull.strcpy(""); long i, l; tmpb = fname; char * buff = tmpb.get_buffer(); l = (long) strlen(buff); bool search_sn = true; if (l == 0) ththrow(("missing font file name")); for(i = (l-1); i >= 0; i--) { if ((buff[i] == '/') || (buff[i] == '\\')) { if (search_sn) { pshort.strcpy(&(buff[i+1])); search_sn = false; } buff[i] = '/'; } } if (strlen(pshort.get_buffer()) == 0) ththrow(("invalid font name -- %s", fname)) if ( #ifdef THWIN32 ((l > 1) && (buff[1] == ':')) || #endif (buff[0] == '/')) { pfull.strcpy(buff); } else { if (strlen(this->ini_file.get_cif_path()) > 0) { pfull.strcpy(this->ini_file.get_cif_path()); pfull += "/"; } else { pfull = ""; } pfull += buff; } // checkne ci TTF if ((l > 3) && (strcasecmp(&(buff[l-4]), ".ttf")) == 0) ENC_NEW.t1_convert = 0; font_src[index] = pfull.get_buffer(); font_dst[index] = pshort.get_buffer(); ENC_NEW.otf_file[index] = pshort.get_buffer(); } void thinit::load() { // set encodings this->encoding_default = TT_ASCII; this->encoding_sql = TT_UNKNOWN_ENCODING; ENC_NEW.NFSS = 0; ENC_NEW.t1_convert = 1; this->opt_mpost = ""; // set programs paths this->path_cavern = "cavern"; #ifdef THWIN32 // set cavern path according to Windows registers this->path_cavern.guarantee(1024); thmbuffer mbf; thbuffer bf; DWORD type(0), length = 1024; HKEY key; bool loaded_ok = true; if (RegOpenKey(HKEY_CLASSES_ROOT,"survex.source\\shell\\Process\\command",&key) != ERROR_SUCCESS) loaded_ok = false; if (!loaded_ok || (RegQueryValueEx(key,NULL,NULL,&type,(BYTE *)this->path_cavern.get_buffer(),&length) != ERROR_SUCCESS)) { loaded_ok = false; RegCloseKey(key); } if (loaded_ok) RegCloseKey(key); if (type != REG_SZ) loaded_ok = false; if (loaded_ok) { thsplit_args(&mbf,this->path_cavern.get_buffer()); this->path_cavern = *(mbf.get_buffer()); } else { this->path_cavern = "cavern"; } #endif // try running survex if (this->loopc == THINIT_LOOPC_UNKNOWN) { thbuffer svxcom; svxcom = "\""; svxcom += thini.get_path_cavern(); svxcom += "\" --version"; #ifdef THDEBUG thprintf("testing cavern\n"); #endif if (system(svxcom.get_buffer()) == EXIT_SUCCESS) { this->loopc = THINIT_LOOPC_SURVEX; } else { this->loopc = THINIT_LOOPC_THERION; } } // this->path_3dtopos = "3dtopos"; #ifdef THWIN32 if (thcfg.install_tex) { this->path_mpost = thcfg.install_path.get_buffer(); this->path_pdftex = thcfg.install_path.get_buffer(); this->path_otftotfm = thcfg.install_path.get_buffer(); this->path_mpost += "\\bin\\win32\\mpost.exe"; this->path_pdftex += "\\bin\\win32\\pdfetex.exe"; this->path_otftotfm += "\\bin\\win32\\otftotfm.exe"; } else { #endif this->path_mpost = "mpost"; this->path_pdftex = "pdfetex"; this->path_otftotfm = "otftotfm"; #ifdef THWIN32 } #endif #ifdef THWIN32 if (thcfg.install_im) { this->path_convert = thcfg.install_path.get_buffer(); this->path_convert += "\\bin\\convert.exe"; this->path_identify = thcfg.install_path.get_buffer(); this->path_identify += "\\bin\\identify.exe"; } else { #endif this->path_convert = "convert"; this->path_identify = "identify"; #ifdef THWIN32 } #endif this->tmp_path = ""; this->tmp_remove_script = ""; this->lang = THLANG_UNKNOWN; char * cmdln; char ** args; int nargs, argid, sv; //, argid2; fontrecord frec; bool some_tex_fonts = false, started = false; this->ini_file.set_search_path(thcfg.get_initialization_path()); this->ini_file.set_file_name("therion.ini"); this->ini_file.sp_scan_on(); this->ini_file.cmd_sensitivity_off(); this->ini_file.print_if_opened(thinit__print_open, &started); this->ini_file.reset(); try { while((cmdln = this->ini_file.read_line()) != NULL) { thsplit_args(& this->cmb, cmdln); args = this->cmb.get_buffer(); nargs = this->cmb.get_size(); argid = thmatch_token(args[0], thtt_initcmd); // check number of arguments: switch (argid) { case TTIC_ENCODING_DEFAULT: case TTIC_PATH_CAVERN: case TTIC_PATH_CONVERT: case TTIC_PATH_IDENTIFY: case TTIC_LOOPC: case TTIC_TMP_PATH: case TTIC_LANG: case TTIC_UNITS: case TTIC_TMP_REMOVE_SCRIPT: case TTIC_PATH_MPOST: case TTIC_OPT_MPOST: case TTIC_PATH_PDFTEX: case TTIC_PATH_SOURCE: case TTIC_OTF2PFB: case TTIC_TEX_ENV: if (nargs != 2) ththrow(("invalid number of command arguments")); break; case TTIC_TEXT: if (nargs != 4) ththrow(("invalid text syntax -- should be: text ")) break; case TTIC_PDF_FONTS: if (nargs != 6) ththrow(("invalid number of command arguments")); break; case TTIC_TEX_FONTS: if (nargs != 7) ththrow(("invalid number of command arguments")); break; case TTIC_CS_DEF: if (nargs < 2) ththrow(("invalid cs-def syntax -- should be: cs-def [other options]")) break; default: ththrow(("invalid initialization command -- %s", args[0])) } switch(argid) { case TTIC_CS_DEF: thcs_add_cs(args[1], args[2], nargs - 2, &(args[3])); break; case TTIC_ENCODING_DEFAULT: this->encoding_default = thparse_encoding(args[1]); break; case TTIC_ENCODING_SQL: this->encoding_sql = thparse_encoding(args[1]); break; case TTIC_PATH_CAVERN: if (strlen(args[1]) < 1) ththrow(("invalid path")) this->path_cavern.strcpy(args[1]); break; case TTIC_PATH_CONVERT: if (strlen(args[1]) < 1) ththrow(("invalid path")) this->path_convert.strcpy(args[1]); break; case TTIC_PATH_IDENTIFY: if (strlen(args[1]) < 1) ththrow(("invalid path")) this->path_identify.strcpy(args[1]); break; case TTIC_TMP_PATH: this->tmp_path.strcpy(args[1]); break; case TTIC_LANG: this->lang = thlang_parse(args[1]); if (this->lang == THLANG_UNKNOWN) ththrow(("language not supported -- %s",args[1])) break; case TTIC_UNITS: thdeflocale.parse_units(args[1]); break; case TTIC_OTF2PFB: sv = thmatch_token(args[1], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid otf2pfb switch -- %s", args[1])) ENC_NEW.t1_convert = (sv == TT_TRUE); break; case TTIC_TEXT: thlang_set_translation(args[1], args[2], args[3]); break; case TTIC_TMP_REMOVE_SCRIPT: this->tmp_remove_script.strcpy(args[1]); break; case TTIC_PATH_MPOST: if (strlen(args[1]) < 1) ththrow(("invalid path")) this->path_mpost.strcpy(args[1]); break; case TTIC_OPT_MPOST: this->opt_mpost.strcpy(args[1]); break; case TTIC_PATH_PDFTEX: if (strlen(args[1]) < 1) ththrow(("invalid path")) this->path_pdftex.strcpy(args[1]); break; case TTIC_PATH_SOURCE: thcfg.set_search_path(args[1]); break; case TTIC_TEX_FONTS: frec.id = get_enc_id(args[1]); if (frec.id < 0) ththrow(("tex encoding not supported -- %s", args[1])) frec.rm = args[2]; frec.it = args[3]; frec.bf = args[4]; frec.ss = args[5]; frec.si = args[6]; FONTS.push_back(frec); some_tex_fonts = true; break; case TTIC_PDF_FONTS: // TODO: parsne nazvy suborov, nastavi t1_convert, ENC_NEW.NFSS = 1; check_font_path(args[1], 0); check_font_path(args[2], 1); check_font_path(args[3], 2); check_font_path(args[4], 3); check_font_path(args[5], 4); break; case TTIC_TEX_ENV: sv = thmatch_token(args[1], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid tex-env switch -- %s", args[1])) this->tex_env = (sv == TT_TRUE); break; case TTIC_LOOPC: sv = thmatch_token(args[1], thtt_loopc); if (sv == THINIT_LOOPC_UNKNOWN) ththrow(("invalid loop-closure switch -- %s", args[1])) this->loopc = sv; break; default: ththrow(("invalid initialization command -- %s", args[0])) } } } catch (...) threthrow(("%s [%d]", this->ini_file.get_cif_name(), this->ini_file.get_cif_line_number())) if (started) { #ifdef THDEBUG thprintf("\n"); #else thprintf(" done\n"); thtext_inline = false; #endif } if (!some_tex_fonts) init_encodings(); #ifdef THWIN32 thinit__make_short_path(&this->path_cavern); thinit__make_short_path(&this->path_convert); thinit__make_short_path(&this->path_identify); thinit__make_short_path(&this->path_mpost); thinit__make_short_path(&this->path_pdftex); #endif } char * thinit::get_path_cavern() { return this->path_cavern.get_buffer(); } char * thinit::get_path_convert() { return this->path_convert.get_buffer(); } char * thinit::get_path_identify() { return this->path_identify.get_buffer(); } //char * thinit::get_path_3dtopos() //{ // return this->path_3dtopos.get_buffer(); //} char * thinit::get_path_mpost() { return this->path_mpost.get_buffer(); } char * thinit::get_opt_mpost() { return this->opt_mpost.get_buffer(); } char * thinit::get_path_pdftex() { return this->path_pdftex.get_buffer(); } char * thinit::get_path_otftotfm() { return this->path_otftotfm.get_buffer(); } void thprint_init_file() { thprintf(THCCC_INIT_FILE); } int thinit::get_encoding(int type) { int res; switch (type) { case THINIT_ENCODING_SQL: res = this->encoding_sql; break; default: res = this->encoding_default; break; } if (res == TT_UNKNOWN_ENCODING) res = this->encoding_default; return res; } thinit thini; therion/TODO.MS0000664000175000017500000000726411371350360012264 0ustar useruserextend left/right a backreadings problem suradnice v cave-liste su v semilogaritmickom tvare bug s izbicou a pevnymi bodmi xth calibrate bitmap: zlucit filtre img/pdf Makefile: make library pri zmene prekladov (neaktualne therion.tcl!) Pacher: * obrovske patterny * interim bboxmargin:=0 bez skupiny pri l_wall_ice podpora NFSS pri --print-symbols (ENC_NEW.write_enc_files(); + skopirovat fonty) do sql: ostatne flagy; commenty pre stations (mutton) ATTR__scale pre vsetky znacky v MP pri kresleni s xvi na pozadi: ak nad mer. bod v xvi vkladam dva mer. body, druhy ma nespravne meno neumoznit shift 0 0 pre mapy kontrola nulovych segmentov na ciare pre MP stopy/palce pomocou '/" pri ctrl-p aktivovat point dialog a po vlozeni bodu aplikovt zmeny grades pre polygon aj fixne body meno obrazku do uvodzoviek: -sketch [Sketches/Greenlink Plan J2 sketch 210707.jpg] 0 -784 sketche do samostatneho layera map-comments v spravnom poradi konvertor: serie precislovat na jednoduche nazvy bodov HEEB: + chybajuci podorys vo vtacej2 premenovat subor na pth (?) pri manipulacii s fix bodmi (pridanie; najprv fix potom pripojenie na koncovy pri merani od konca) thexport len "FIX\r\n" / chyba spojnica k priecnemu rezu / v priecnom reze chybaju shoty a mer. bod / preco sa vo vsetkych nacrtkoch opakuje bod 0 (fix?) / thexport dodrziavat uhlove jednotky, / dat tam trip comment, / opakovat 3 merania polygonu, / problem s pripojenim roznych dist neprebera sa attr do survey ... - entrance ... ak je continuation s explored udajmi, nezobrazit otaznik ale dlzku xtherion ma do scrapu doplnit autora + rok! (pokial tam nie je) pridat margin option pre uvodne strany atlasu, potom dat pagesetup do 1) data.tex za opacity a scale s normalnym okrajom 2) do th_pagedef s overlapom 3) do legendy s normalnym altitude scaling ak je label prazdny retazec, zhuci mp? nejde naraz zadat mapy elev. v dvoch projekciach LOG-subor: X m surveyed (of which Y approximate) + about Z unsurveyed but explored (see the continuation-list and survey-list for details) do xtherionu info o tom ktory ini precital, + warning ak nerozparsoval ini xtherion linux -- delete nezmaze oznaceny blok textu, len znak na kurzore label k line section preco nepouzivame if else v Makefile namiesto komentovania casti? pri centerline so zadanou deklinaciou alebo data nosurvey nepozadovat datum na vypocet automatickej deklinacie obvod scrapu a rozdelena stena spajanie ciar ***************************************************************************** georeferencovanie bitmap aj pomocou jgw/pgw: A world file file is a plain ASCII text file consisting of six values separated by newlines. The format is: pixel X size rotation about the Y axis (usually 0.0) rotation about the X axis (usually 0.0) negative pixel Y size X coordinate of upper left pixel center Y coordinate of upper left pixel center ************************************************ loch pada pri exporte X Error of failed request: GLXBadContext Major opcode of failed request: 144 (GLX) Minor opcode of failed request: 5 (X_GLXMakeCurrent) Serial number of failed request: 70567 Current serial number in output stream: 70567 The program 'loch' received an X Window System error. This probably reflects a bug in the program. The error was 'GLXBadContext'. (Details: serial 23 error_code 155 request_code 144 minor_code 5) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.) therion/thlangdata.cxx0000664000175000017500000021045312302220705014077 0ustar useruser/** * @file thlangdata.cxx * Therion language translations module. * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ typedef const char * thlang_pchar; static const thstok thtt_lang [] = { {"bg", THLANG_BG}, {"cz", THLANG_CZ}, {"de", THLANG_DE}, {"el", THLANG_EL}, {"en", THLANG_EN}, {"en_UK", THLANG_EN_UK}, {"en_US", THLANG_EN_US}, {"es", THLANG_ES}, {"fr", THLANG_FR}, {"it", THLANG_IT}, {"mi", THLANG_MI}, {"pl", THLANG_PL}, {"pt", THLANG_PT}, {"pt_BR", THLANG_PT_BR}, {"pt_PT", THLANG_PT_PT}, {"ru", THLANG_RU}, {"sk", THLANG_SK}, {"sq", THLANG_SQ}, {NULL, THLANG_UNKNOWN}, }; static const thlang_pchar thlang__cxxids [] = { "THLANG_BG", "THLANG_CZ", "THLANG_DE", "THLANG_EL", "THLANG_EN", "THLANG_EN_UK", "THLANG_EN_US", "THLANG_ES", "THLANG_FR", "THLANG_IT", "THLANG_MI", "THLANG_PL", "THLANG_PT", "THLANG_PT_BR", "THLANG_PT_PT", "THLANG_RU", "THLANG_SK", "THLANG_SQ", }; static const int thlang__alternatives [] = { THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_EN, THLANG_EN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_PT, THLANG_PT, THLANG_UNKNOWN, THLANG_UNKNOWN, THLANG_UNKNOWN, }; static const thstok thtt__texts [181] = { {"area bedrock",0}, {"area blocks",1}, {"area clay",2}, {"area debris",3}, {"area flowstone",4}, {"area ice",5}, {"area moonmilk",6}, {"area pebbles",7}, {"area sand",8}, {"area snow",9}, {"area sump",10}, {"area water",11}, {"line border",12}, {"line border:presumed",13}, {"line border:temporary",14}, {"line border:visible",15}, {"line ceiling-meander",16}, {"line ceiling-step",17}, {"line chimney",18}, {"line contour",19}, {"line fixed-ladder",20}, {"line floor-meander",21}, {"line floor-step",22}, {"line flowstone",23}, {"line gradient",24}, {"line handrail",25}, {"line label",26}, {"line map-connection",27}, {"line moonmilk",28}, {"line overhang",29}, {"line pit",30}, {"line rock-border",31}, {"line rock-edge",32}, {"line rope",33}, {"line rope-ladder",34}, {"line section",35}, {"line slope",36}, {"line steps",37}, {"line survey",38}, {"line via-ferrata",39}, {"line wall",40}, {"line wall:bedrock",41}, {"line wall:blocks",42}, {"line wall:clay",43}, {"line wall:debris",44}, {"line wall:flowstone",45}, {"line wall:ice",46}, {"line wall:moonmilk",47}, {"line wall:overlying",48}, {"line wall:pebbles",49}, {"line wall:pit",50}, {"line wall:presumed",51}, {"line wall:sand",52}, {"line wall:underlying",53}, {"line wall:unsurveyed",54}, {"line water-flow",55}, {"line water-flow:conjectural",56}, {"line water-flow:intermittent",57}, {"line water-flow:permanent",58}, {"point air-draught",59}, {"point air-draught:summer",60}, {"point air-draught:winter",61}, {"point altitude",62}, {"point anastomosis",63}, {"point anchor",64}, {"point aragonite",65}, {"point archeo-material",66}, {"point bedrock",67}, {"point blocks",68}, {"point breakdown-choke",69}, {"point bridge",70}, {"point camp",71}, {"point cave-pearl",72}, {"point clay",73}, {"point clay-choke",74}, {"point clay-tree",75}, {"point continuation",76}, {"point crystal",77}, {"point curtain",78}, {"point date",79}, {"point debris",80}, {"point dig",81}, {"point dimensions",82}, {"point disk",83}, {"point entrance",84}, {"point fixed-ladder",85}, {"point flag:air-draught",86}, {"point flag:arch",87}, {"point flag:continuation",88}, {"point flag:dig",89}, {"point flag:doline",90}, {"point flag:entrance",91}, {"point flag:overhang",92}, {"point flag:sink",93}, {"point flag:spring",94}, {"point flowstone",95}, {"point flowstone-choke",96}, {"point flute",97}, {"point gradient",98}, {"point guano",99}, {"point gypsum",100}, {"point gypsum-flower",101}, {"point handrail",102}, {"point height",103}, {"point height:negative",104}, {"point height:positive",105}, {"point height:unsigned",106}, {"point helictite",107}, {"point ice",108}, {"point ice-pillar",109}, {"point ice-stalactite",110}, {"point ice-stalagmite",111}, {"point karren",112}, {"point label",113}, {"point low-end",114}, {"point moonmilk",115}, {"point narrow-end",116}, {"point no-equipment",117}, {"point paleo-material",118}, {"point passage-height",119}, {"point passage-height:both",120}, {"point passage-height:negative",121}, {"point passage-height:positive",122}, {"point passage-height:unsigned",123}, {"point pebbles",124}, {"point pillar",125}, {"point pillars",126}, {"point popcorn",127}, {"point raft",128}, {"point raft-cone",129}, {"point remark",130}, {"point rimstone-dam",131}, {"point rimstone-pool",132}, {"point root",133}, {"point rope",134}, {"point rope-ladder",135}, {"point sand",136}, {"point scallop",137}, {"point section",138}, {"point sink",139}, {"point snow",140}, {"point soda-straw",141}, {"point spring",142}, {"point stalactite",143}, {"point stalactites",144}, {"point stalagmite",145}, {"point stalagmites",146}, {"point station",147}, {"point station-name",148}, {"point station:fixed",149}, {"point station:natural",150}, {"point station:painted",151}, {"point station:temporary",152}, {"point steps",153}, {"point traverse",154}, {"point vegetable-debris",155}, {"point via-ferrata",156}, {"point wall-altitude",157}, {"point wall-calcite",158}, {"point water",159}, {"point water-flow",160}, {"point water-flow:intermittent",161}, {"point water-flow:paleo",162}, {"point water-flow:permanent",163}, {"title carto",164}, {"title carto (plural)",165}, {"title cave depth",166}, {"title cave length",167}, {"title color-legend-altitude",168}, {"title color-legend-map",169}, {"title explo",170}, {"title explo (plural)",171}, {"title legend",172}, {"title preview above",173}, {"title preview below",174}, {"title surface bitmap",175}, {"title topo",176}, {"title topo (plural)",177}, {"units ft",178}, {"units m",179}, {NULL, -1}, }; static thlang_pchar thlang__translations [180][18] = { { "оÑновна Ñкала", "pevná skála", "Deckgebirge", "πέτÏωμα", "bedrock", NULL, NULL, "roca madre", "roche", "roccia", NULL, NULL, "rocha encaixante", NULL, NULL, "ÐºÐ¾Ñ€ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ñ€Ð¾Ð´Ð°", "pevná skala", "shtrat shkembi", }, { "блокаж", "skalní bloky", "Fläche mit Blöcken", "ογκόλιθοι", "blocks, breakdown", NULL, NULL, "bloques", "blocs", "massi", "pakaru a kÅhatunui", "bloki skalne", "blocos", NULL, NULL, "навал глыб", "skalné bloky", "blloqe", }, { "глина", "bahno", "Lehmfläche", "άÏγιλος", "clay", NULL, NULL, "arcilla", "argile", "argilla", "oneuku", "glina", "lama", NULL, NULL, "глина", "íl", "argjil", }, { "чакъл", "Å¡tÄ›rk", "Schuttfläche", "χαλάσματα", "debris", NULL, NULL, "derrubios", "débris", "detriti", "otaota", "żwir", "escombros", NULL, NULL, "щебень", "Å¡trk", "mbetje-gurresh", }, { "каменен водопад", "sintrové náteky", "flächiger Sinter", "σταλαγμιτικό υλικό δαπέδου", "flowstone", NULL, NULL, "concreción", "concrétion", "concrezione", NULL, NULL, "escorrimento", NULL, NULL, "натечный каÑкад", "sintrové náteky", "gurre-rrjedhes", }, { "лед", "led", "Eisfläche", "πάγος", "ice", NULL, NULL, "hielo", "glace", "ghiaccio", "kÅpaka", "lód", "gelo", NULL, NULL, "лёд", "ľad", "akull", }, { "пещерно млÑко", "nickamínek", "Bergmilch", "γάλα σπηλαίου", "moonmilk", NULL, NULL, NULL, "mondmilch", "moonmilk", NULL, NULL, NULL, NULL, NULL, "лунное молоко", "náteky mäkkého sintra", "qumesht-hena", }, { "камъчета", "valouny", "Kiesfläche", "χαλίκια", "pebbles", NULL, NULL, "cantos rodados", "galets/pierres", "ciotoli", "nga kÅhatu iti", "okrÄ™glaki", "seixos", NULL, NULL, "галька", "okrúhliaky", "gurralece", }, { "пÑÑък", "písek", "Sandfläche", "άμμος", "sand", NULL, NULL, "arena", "sable", "sabbia", "onepÅ«", "piasek", "areia", NULL, NULL, "пеÑок", "piesok", "rane", }, { "ÑнÑг", "sníh", "Schneefläche", "χιόνι", "snow", NULL, NULL, "nieve", "neige", "neve", "huka", "Å›nieg", "neve", NULL, NULL, "Ñнег", "sneh", "bore", }, { "Ñифон", "sifon", "Siphonfläche", "σιφόνι", "sump", NULL, NULL, "sifón", "siphon", "sifone", "kari a wai", "syfon", "sifão", NULL, NULL, "Ñифон", "zatopená plocha (sifón)", "sifoni", }, { "вода", "vodní plocha", "Wasserfläche", "νεÏÏŒ", "water", NULL, NULL, "agua", "eau", "acqua", "wai", "powierzchnia wody", "água", NULL, NULL, "вода", "vodná plocha", "uje", }, { "граница", "ohraniÄení", "Begrenzung", "άκÏη", "border", NULL, NULL, "límite", "bord", "bordo", "rohe", "granica", "borda", NULL, NULL, "граница", "ohraniÄenie", "kufiri", }, { "предполагаема граница", "pÅ™edpokládané ohraniÄení", "geschätzte Begrenzung", "υποθετική άκÏη", "presumed border", NULL, NULL, "límite supuesto", "bord, supposé", "bordo presunto", "rohe whakaaringa whakaaro", "niewidoczna granica", "borda presumida", NULL, NULL, "Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÐ¼Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°", "predpokladané ohraniÄenie", "kufij I supozuar", }, { "временна граница", "nestálé ohraniÄení", "vorübergehende Begrenzung", "Ï€ÏοσωÏινή άκÏη", "temporary border", NULL, NULL, "límite temporal", "bord, temporaire", "bordo temporaneo", "rohe mo te wÄ", "tymczasowa granica", "borda temporária", NULL, NULL, "Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°", "nestále ohraniÄenie", "kufij i perkohshem", }, { "видима граница", "ohraniÄení", "sichtbare Begrenzung", "άκÏη", "border", NULL, NULL, "límite", "bord", "bordo", "rohe", "granica", "borda", NULL, NULL, "Ð²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð°", "ohraniÄenie", "vije kufiri-e dukshme", }, { "меандър, канал в тавана", "stropní meandr", "Deckenmäander", "μαίανδÏος οÏοφής", "ceiling meander", NULL, NULL, "meandro inverso", "méandre de plafond", "canale di volta", "kopiko tuanui", "meander w stropie", "meandro no teto", "meandro no teto", "meandro no tecto", "меандр, канал в потолке", "stropný meander", "rrjedhe uji gjarperore ne tavan", }, { "ниша в тавана", "zmÄ›na výšky stropu", "Deckenstufe", "σκαλοπάτι οÏοφής", "ceiling step", NULL, NULL, "resalte inverso", "marche de plafond", "gradino a soffitto", "tapuae ki te tuanui", "zmiana wysokoÅ›ci stropu", "degrau no teto", "degrau no teto", "degrau no tecto", "уÑтуп потолка", "zmena výšky stropu", "shkalle ne tavan", }, { "комин", "komín", "Schlot", "καμινάδα", "chimney", NULL, NULL, "chimenea", "cheminée", "camino", "tumera", "komin", "chaminé", NULL, NULL, "труба", "komín", "oxhak", }, { "контур", "vrstevnice", "Höhenlinie", "ισοϋψής", "contour", NULL, NULL, "contorno", "contour", "contorno", "koru", "poziomica", "contorno", NULL, NULL, "контур", "vrstevnica", "kontura", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "меандър, канал в пода", "meandr ve dnÄ›", "Bodenmäander", "μαίανδÏος δαπέδου", "floor meander", NULL, NULL, "meandro", "méandre au sol", "meandro", "kopiko", "meander w dnie", "meandro no piso", NULL, NULL, "меандр, канал в полу", "meander v dne", "rrjedhe uji gjarperore", }, { "праг", "stupeň", "Bodenstufe", "σκαλοπάτι", "floor step", NULL, NULL, "resalte", "marche", "gradino", "tapuae", "próg", "degrau", NULL, NULL, "уÑтуп пола", "stupeň", "shkalle ne dysheme", }, { "каменен водопад", "sintrové náteky", "flächiger Sinter", "σταλαγμιτικό υλικό δαπέδου", "flowstone", NULL, NULL, "concreción", "concrétion", "concrezione", "pari kÅhatu", "nacieki", "escorrimento", NULL, NULL, "натечный каÑкад", "sintrové náteky", "gurre-rrjedhes", }, { "наклон на галериÑта", "sklon chodby", "Gefälle", "κλίση στοάς", "passage gradient", NULL, NULL, "gradiente", "pente", "scivolo", "heke", "nachylenie korytarza", "declividade da galeria", NULL, NULL, "уклон хода", "sklon chodby", "pjertesia e kalimit", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "етикет", "pojmenování", "Beschriftung", "πεÏιγÏαφή", "label", NULL, NULL, "etiqueta", "libellé", "etichetta", "ingoa", "nazwa", "indicação", NULL, NULL, "текÑÑ‚Ð¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°", "pomenovanie", "mbishkrim", }, { "Ñвързване на карти", "spojení map", "zusammenhängende Pläne", "ένωση χαÏτών", "map connection", NULL, NULL, NULL, "jonction de carte", "riporto di mappa", "mahere whenua ki te hui", "połączenie map", NULL, NULL, NULL, "Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ‹Ð½Ð¾Ñа", "prepojenie máp", "lidhjet ne harta", }, { "пещерно млÑко", "nickamínek", "Bergmilch", "γάλα σπηλαίου", "moonmilk", NULL, NULL, NULL, "mondmilch", "moonmilk", "mirika marama", "miÄ™kkie nacieki", NULL, NULL, NULL, "лунное молоко", "náteky mäkkého sintra", "qumesht-hena", }, { "Ñкална площадка", "pÅ™evis", "Überhang", "Ï€Ïοέκταση οÏοφής", "overhang", NULL, NULL, "extraplomo", "surplomb", "sporgenza", "tauwharenga", "przewieszka", "projeção", "projeção", "projecção", "навиÑание потолка", "previs", "varese", }, { "кладенец", "propast", "Schacht", "πηγάδι", "pitch", "pitch", "pit", "pozo", "puits", "pozzo", "tupari", "studnia", "desnível", NULL, NULL, "колодец", "priepasÅ¥", "ngjitje", }, { "външен ръб на камък", "kameny", "Umriss eines Felsens", "πεÏίγÏαμμα βÏάχου", "rock border", NULL, NULL, "contorno bloque", "bord d’un rocher", "bordo masso", "rohe kÅhatu", "obrys kamienia", "lateral da rocha", NULL, NULL, "внешний кромка глыбы", "obrys kameňa", "kufij shkembinjsh", }, { "вътрешен ръб на камък", "hrany kamenů", "Struktur eines Felsens", "άκÏη βÏάχου", "rock edges", NULL, NULL, "arista bloque", "arête d’un rocher", "spigolo masso", "mata kohatu", "krawÄ™dzie kamienia", "bordas da rocha", NULL, NULL, "внутреннÑÑ ÐºÑ€Ð¾Ð¼ÐºÐ° глыбы", "hrany kameňa", "skaji I shkembit", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "напречно Ñечение", "příÄný Å™ez", "Schnittlinie", "τομή", "cross-section", NULL, NULL, "sección", "section", "sezione trasversale", "taha papahanga", "przekrój", "corte", NULL, NULL, "выноÑÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ ÑечениÑ", "prieÄny rez", "kryq-ndarje", }, { "Ñклон", "svah", "Hangform", "κλίση", "slope", NULL, NULL, "pendiente", "pente", "scivolo", "tupari", "pochyÅ‚a powierzchnia", "declive", NULL, NULL, "Ñклон", "Å¡ikmá plocha", "breg", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "антена", "polygonový tah", "Messzug", "γÏαμμή χαÏτογÏάφησης", "survey lines", NULL, NULL, "poligonal", "visée topo", "poligonale", "ruri rÄrangi", "ciÄ…g pomiarowy", "linha de topografia", NULL, NULL, "нитка хода", "polygónový Å¥ah", "vijat matese-vrojtuese", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "Ñтена", "stÄ›na", "Wand", "τοίχος", "wall", NULL, NULL, "pared", "mur", "parete", "tarÄ", "Å›ciana", "parede", NULL, NULL, "Ñтена", "stena", "muri", }, { "Ñтена (оÑновна Ñкала)", "stÄ›na", "Wand zum Deckgebirge", "τοίχος", "wall", NULL, NULL, "pared", "mur", "roccia", "tarÄ", "Å›ciana", "parede", NULL, NULL, "Ñтена", "stena", "shkembi-muri", }, { "Ñтена - блокаж", "zával", "Wand aus Versturz", "ογκόλιθοι", "blocks, breakdown", NULL, NULL, "bloques", "effrondrement", "massi", "pakaru", "Å›ciana utworzona przez zawalisko", "desmoronamento", NULL, NULL, "глыбы", "stena tvorená závalom", "blloqe", }, { "глина", "bahno", "Wand aus Lehm", "άÏγιλος", "clay", NULL, NULL, "arcilla", "argile", "argilla", "oneuku", "Å›ciana z gliny", "lama", NULL, NULL, "глина", "stena tvorená ílom", "argjil", }, { "чакъл", "Å¡tÄ›rk", "Wand aus Schutt", "χαλάσματα", "debris", NULL, NULL, "derrubios", "débris de roche", "detriti", "otaota", "Å›ciana utworzona przez żwir", "escombros", NULL, NULL, "щебень", "stena tvorená suÅ¥ou", "depozitime/mbetje gurresh", }, { NULL, NULL, "Wand aus Sinter", NULL, "flowstone wall", NULL, NULL, NULL, NULL, "colata", "tÄra a pari kÅhatu", "Å›ciana z nacieków", NULL, NULL, NULL, NULL, "stena tvorená sintrom", NULL, }, { "лед/фирн", "led", "Wand aus Eis", "πάγος", "ice", NULL, NULL, "hielo", "glace", "ghiaccio", "kÅpaka", "Å›ciana z lodu", "gelo", NULL, NULL, "лед, фирн", "stena tvorená ľadom", "akull", }, { NULL, NULL, "Wand aus Bergmilch", NULL, "moonmilk wall", NULL, NULL, NULL, NULL, "moonmilk", "tÄra a mirika marama", "Å›ciana z miÄ™kkich nacieków", NULL, NULL, NULL, NULL, "stena tvorená mäkkým sintrom", NULL, }, { NULL, NULL, "überlagerter Wandverlauf", NULL, "overlying wall", NULL, NULL, NULL, NULL, "parete:sovrastante", "tÄra ki runga", "Å›ciana poÅ‚ożona wyżej", NULL, NULL, NULL, NULL, "stena vyššej úrovne", NULL, }, { "камъчета", "valouny", "Wand aus Kies", "χαλίκια", "pebbles", NULL, NULL, "cantos rodados", "cailloux", "ciotoli", "nga kÅhatu iti", "Å›ciana utworzona przez okrÄ™glaki", "seixos", NULL, NULL, "галька", "stena tvorená okruhliakmi", "gurralece", }, { NULL, NULL, "Eingangsschacht", NULL, "entrance pit", NULL, NULL, NULL, NULL, "parete:pozzo", "rua", "studnia wstÄ™pna", NULL, NULL, NULL, NULL, "vstupná priepasÅ¥", NULL, }, { "предполагаема Ñтена", "pÅ™edpokládaná stÄ›na", "Wand geschätzt", "τοίχος υποθετικός", "presumed wall", NULL, NULL, "pared supuesta", "mur supposé", "parete:presunta", "tÄra whakaaro", "niewidoczna Å›ciana", "parede presumida", NULL, NULL, "Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð¾Ð³Ð°ÐµÐ¼Ð°Ñ Ñтена", "predpokladaná stena", "muri I supozuar", }, { "пÑÑък", "písek", "Wand aus Sand", "άμμος", "sand", NULL, NULL, "arena", "sable", "sabbia", "onepÅ«", "Å›ciana utworzona przez piasek", "areia", NULL, NULL, "пеÑок", "stena tvorená pieskom", "rane", }, { "по-ниÑко разположена Ñтена", "stÄ›na nižší úrovnÄ›", "Wand unterlagernder Gang", "υποκείμενος τοίχος", "underlying wall", NULL, NULL, "pared subyacente", "mur sousjacent", "parete:sottostante", "tÄra ki raro", "Å›ciana poÅ‚ożona niżej", "parede subjacente", NULL, NULL, "нижераÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ñтена", "stena nižšej úrovne", "muri I shtrire", }, { "окомерна Ñкица на Ñтените", "nezaměřená stÄ›na", "Wand unvermessen", "τοίχος (μη χαÏτογÏαφημένος)", "unsurveyed wall", NULL, NULL, "pared no topografiada", "mur non topographié", "parete:stimata", "ka rÅ«ri tÄra", "Å›ciana nie pomierzona", "parede não-topografada", NULL, NULL, "Ð³Ð»Ð°Ð·Ð¾Ð¼ÐµÑ€Ð½Ð°Ñ Ñъемка Ñтен", "nezameraná stena", "muri I pamatur", }, { "водно течение", "vodní tok", "Gerinne", "υδÏοÏÏοή", "water flow", NULL, NULL, "curso agua", "rivière", "corso d'acqua", "wairere", "ciek wodny", "fluxo de água", NULL, NULL, "водоток", "vodný tok", "rrjedhe uji", }, { "предполагаемо водно течение", "pÅ™edpokládaný vodní tok", "vermutetes Gerinne", "υποτιθέμενη υδÏοÏÏοή", "conjectural water flow", NULL, NULL, "curso agua supuesto", "rivière, conjoncturelle", "corso d'acqua presunto", "wairere a pÄtai", "przewidywany ciek wodny", "fluxo de água suposto", NULL, NULL, "предполагаемый водоток", "predpokladaný vodný tok", "rrjedhe uji e supozuar", }, { "периодично водно течение", "obÄasný vodní tok", "zeitweises Gerinne", "διακοπτόμενη υδÏοÏÏοή", "intermittent water flow", NULL, NULL, "curso agua intermitente", "rivière, intermittente", "corso d'acqua temporaneo", "wairere taumutumutu", "okresowy ciek wodny", "fluxo de água intermitente", NULL, NULL, "непоÑтоÑнный водоток", "obÄasný vodný tok", "rrjedhe uji me force", }, { "поÑтоÑнно водно течение", "vodní tok", "ständiges Gerinne", "μόνιμη υδÏοÏÏοή", "water flow", NULL, NULL, "curso agua", "rivière, permanente", "corso d'acqua permanente", "wairere", "ciek wodny", "fluxo de água permanente", NULL, NULL, "поÑтоÑнный водоток", "vodný tok", "rrjedhe uji e perhershme", }, { "въздушно течение", "průvan", "Luftzug", "Ïοή αέÏα", "air draught", NULL, NULL, "corriente aire", "courant d’air", "corrente d'aria", "tawhiri", "przewiew", "presença de vento", NULL, NULL, "ток воздуха", "prievan", "rrymim i ajrit", }, { "летен въздушно течение", "letní průvan", "Luftzug im Sommer", "θεÏινή Ïοή αέÏα", "summer air draught", NULL, NULL, NULL, "courant d’air d’été", "circolazione estiva", "tawhiri a raumati", "przewiew w lecie", NULL, NULL, NULL, "ток воздуха летний", "letný prievan", "rrymim ajri-veror", }, { "зимен въздушно течение", "zimní průvan", "Luftzug im Winter", "χειμεÏινή Ïοή αέÏα", "winter air draught", NULL, NULL, NULL, "courant d’air d’hiver", "circolazione invernale", "tawhiri a takurua", "przewiew w zimie", NULL, NULL, NULL, "ток воздуха зимний", "zimný prievan", "rrymim ajri-dimeror", }, { "н.м. виÑочина", "nadmoÅ™ská výška bodu v chodbÄ›", "Höhe über Koordinatenursprung", "Ïψος", "altitude", NULL, NULL, "altura", "altitude", "quota", "teitei, tiketike", "wysokość punktu pomiarowego npm", "altura", NULL, NULL, "выÑÐ¾Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ°", "nadmorská výška bodu v chodbe", "lartesia mbidetare", }, { "анаÑтомоза", "anastomóza", "Anastomose", "αναστόμωση", "anastomosis", NULL, NULL, "anastomosis", "anastomose", "anastomosi", "peka hono", "anastomoza", "anastomose", NULL, NULL, "анаÑтомозиÑ", "anastomóza", "anastomosa(kuartz)", }, { "закрепване", "kotvení", "Seilbefestigung", "αγκÏÏωση", "anchor", NULL, NULL, "anclaje", "ancrage", "ancoraggio", "punga", "punkt asekuracyjny", "ancoragem", NULL, NULL, "ИТО", "kotvenie", "pike-sigurimi", }, { "арагонит", "aragonit", "Aragonit", "αÏαγονίτης", "aragonite", NULL, NULL, "aragonito", "aragonite", "aragonite", "pÄkeho tuarua", "aragonit", "aragonita", "aragonita", "aragonite", "арагонит", "aragonit", "aragonite", }, { "археологичеÑка находка", "archeologické nálezy", "archäologischer Fund", "αÏχαιολογικό εÏÏημα", "archaeological material", NULL, NULL, "yacimiento (arq)", "matériel archéo", "materiale archeologico", "taonga o nehe", "znaleziska archeologiczne", "material arqueológico", NULL, NULL, "археологичеÑÐºÐ°Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ°", "archeologické nálezy", "material arkeologjik", }, { "оÑновна Ñкала", "pevná skála", "Deckgebirge", "πέτÏωμα", "bedrock", NULL, NULL, "roca madre", "roche", "roccia", "koiwi a papa", "lita skaÅ‚a", "rocha encaixante", NULL, NULL, "ÐºÐ¾Ñ€ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ñ€Ð¾Ð´Ð°", "pevná skala", "shtrat shkembi", }, { "камъни, блокаж", "kamenné bloky", "Blöcke", "ογκόλιθοι", "blocks, breakdown", NULL, NULL, "bloques", "blocs", "massi", "pakaru", "kamienne bloki", "blocos, desmoronamento", NULL, NULL, "глыбы, завал", "kamenné bloky", "blloqe, shembje", }, { "затворено от Ñрутище", "zavalený konec", "Fortsetzung verstürzt", "κλείσιμο στοάς λόγο χαλάσματος", "breakdown choke", NULL, NULL, "colmatado por derrumbe", "trémie", "chiude su frana", "nati pakaru", "koniec zawalony", "obstrução por desmoronamento", NULL, NULL, "блокировано обвалом", "zavalený koniec", "gurre rrjedhes-fund", }, { "моÑÑ‚", "most", "Brücke", "γέφυÏα", "bridge", NULL, NULL, "puente roca", "pont", "ponte di roccia", "piriti", "most", "ponte", NULL, NULL, "моÑÑ‚", "most", "ure", }, { "лагер", "bivak", "Biwak", "κατασκήνωση", "camp", NULL, NULL, "campamento", "camp", "campo", "topuni", "biwak", "acampamento", NULL, NULL, "ПБЛ", "bivak", "vend-pushim", }, { "пещерен биÑер", "jeskynní perly", "Höhlenperle", "μαÏγαÏιτάÏι των σπηλαίων", "cave pearl", NULL, NULL, "perla de caverna", "perle des cavernes", "pisolite", "ana kahurangi", "perÅ‚y jaskiniowe", "pérolas", "pérolas", "pérolas de Gruta", "пещерный жемчуг", "jaskynné perly", "margaritar te shpelles", }, { "глина", "bahno", "Lehm", "άÏγιλος", "clay", NULL, NULL, "arcilla", "argile", "argilla", "oneuku", "glina", "lama", NULL, NULL, "глина", "íl", "argjil", }, { NULL, NULL, "Fortsetzung verlehmt", NULL, "clay choke", NULL, NULL, NULL, NULL, "chiude su riempimento", "uku pari", "koniec zamkniÄ™ty glinÄ…", NULL, NULL, NULL, NULL, "koniec uzavretý ílom", NULL, }, { NULL, NULL, "Lehmbäumchen", NULL, "clay tree", NULL, NULL, NULL, NULL, "pini d'argilla", "rakau oneuku", NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "възможно продължение", "možné pokraÄování", "Fortsetzung", "πιθανή συνέχεια", "possible continuation", NULL, NULL, "continuación", "suite possible", "possibile prosecuzione", "roanga taea", "możliwa kontynuacja", "possível continuação", NULL, NULL, "возможное продолжение", "možné pokraÄovanie", "vazhdim I mundshem", }, { "криÑтал", "krystal", "Kristall", "κÏÏσταλλο", "crystal", NULL, NULL, "cristal", "cristaux", "cristallo", "kohatu piata", "krysztaÅ‚", "cristal", NULL, NULL, "криÑталлы", "kryÅ¡tál", "kristale", }, { "драпериÑ", "sintrové záclony", "Sinterfahne", "κουÏτίνα", "curtain", NULL, NULL, "cortina", "rideau", "cortina", "araia", "draperie naciekowe", "cortina", NULL, NULL, "натечный занавеÑ", "sintrové záclony", "perde", }, { "дата на наблюдението", "datum pozorování", "Datum", "ημεÏομηνία", "date of observation", NULL, NULL, "fecha", "date", "data d'osservazione", "rÄ o te titiro", "data obserwacji", "data de observação", NULL, NULL, "дата наблюдениÑ", "dátum pozorovania", "data e vrojtimit", }, { "чакъл", "Å¡tÄ›rk", "Schutt", "χαλάσματα", "debris", NULL, NULL, "derrubios", "débris", "detriti", "otaota", "żwir", "escombros", NULL, NULL, "щебень", "sutina", "mbetje-mbeturina", }, { "изкоп", "sonda", "Grabung", "διάνοιξη", "dig", NULL, NULL, NULL, "désobstruction", "disostruzione", "kari", "wykop", NULL, NULL, NULL, NULL, "sonda", "mihje", }, { "размери на галериÑта", "rozmÄ›ry", "Ausdehnung", "διαστάσεις", "dimensions", NULL, NULL, "dimensiones", "proportions", "dimensione", "rahinga, meiha", "rozmiary", "dimensões", NULL, NULL, "размеры хода", "rozmery", "dimenzionet", }, { "диÑк", "disk", "Diskus", "δίσκος", "disk", NULL, NULL, "disco", "disque", "disco", "kiwhi", "dysk", "disco", NULL, NULL, "диÑк", "disk", "pllake", }, { "вход", "vchod", "Eingang", "είσοδος", "entrance", NULL, NULL, "boca", "entrée", "ingresso", "ana ngutu", "wejÅ›cie", "entrada", NULL, NULL, "вход", "vchod", "hyrja", }, { "Ñтационарна Ñтълба", "pevný žebřík", "feste Leiter", "μόνιμη σκάλα", "fixed ladder", NULL, NULL, "escala fija", "échelle fixe", "scala fissa", "arawhata", "sztywna drabinka", "escada fixa", NULL, NULL, "жеÑÑ‚ÐºÐ°Ñ Ð»ÐµÑтница", "fixný rebrík", "shkalle fikse", }, { "въздушно течение", "průvan", "Luftzug", "Ïοή αέÏα", "air draught", NULL, NULL, "corriente aire", "courant d’air", "corrente d'aria", "tawhiri", "przewiew", "presença de vento", NULL, NULL, "ток воздуха", "prievan", "rrymim i ajrit", }, { NULL, NULL, NULL, NULL, "arch", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "skalný oblúk", NULL, }, { "възможно продължение", "možné pokraÄování", "Fortsetzung", "πιθανή συνέχεια", "possible continuation", NULL, NULL, "continuación", "suite possible", "possibile prosecuzione", "roanga taea", "możliwa kontynuacja", "possível continuação", NULL, NULL, "возможное продолжение", "možné pokraÄovanie", "vazhdim I mundshem", }, { "изкоп", "sonda", "Grabung", "διάνοιξη", "dig", NULL, NULL, NULL, "désobstruction", "disostruzione", "kari", "wykop", NULL, NULL, NULL, NULL, "sonda", "mihje", }, { NULL, "závrt", NULL, NULL, "doline", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "závrt", NULL, }, { "вход", "vchod", "Eingang", "είσοδος", "entrance", NULL, NULL, "boca", "entrée", "ingresso", "ana ngutu", "wejÅ›cie", "entrada", NULL, NULL, "вход", "vchod", "hyrja", }, { "Ñкална площадка", "pÅ™evis", "Überhang", "Ï€Ïοέκταση οÏοφής", "overhang", NULL, NULL, "extraplomo", "surplomb", "sporgenza", "tauwharenga", "przewieszka", "projeção", "projeção", "projecção", "навиÑание потолка", "previs", "varese", }, { "понор", "ponor", "Schluckloch", "καταβόθÏα", "sink", NULL, NULL, "sumidero", "perte", "perdita", "tapoko", "ponor", "sumidouro", NULL, NULL, "Ñток", "ponor", "pus", }, { "извор", "vývÄ›r", "Quelle", "πηγή", "spring", NULL, NULL, "surgencia", "source", "sorgente", "waipuna", "wywierzysko", "nascente", NULL, NULL, "иÑток", "výver", "burim", }, { "натек", "sintr", "flächiger Sinter", "σταλαγμιτικό υλικό δαπέδου", "flowstone", NULL, NULL, "concreción", "concrétions", "concrezione", "pari kÅhatu", "nacieki", "escorrimento", NULL, NULL, "натек", "sinter", "gurre-rrjedhes", }, { "блокирано от натеци", "zasintrovaný konec", "Fortsetzung zugesintert", "κλείσιμο στοάς λόγο ÏƒÏ„Î±Î»Î±Î³Î¼Î¹Ï„Î¹ÎºÎ¿Ï Î±Ï€Î¿Î¸Î­Î¼Î±Ï„Î¿Ï‚", "flowstone choke", NULL, NULL, "colmatado por concreción", "trémie calcifiée", "chiude su colata", "nati pari kÅhatu", "koniec zamkniÄ™ty naciekami", "obstrução por escorrimento", NULL, NULL, "блокировано натеками", "zasintrený koniec", "mbyllje me gurre-rrjedhes", }, { "карни жлебове", "píšťaly", "Kolk", "αυλάκι διάβÏωσης", "flute", NULL, NULL, "canaleta", "marmites", "scanalatura", "koauau", "marmity", "marcas de fluxo", NULL, NULL, "канавки", "píšťaly", "flauta", }, { "наклон на галериÑта", "sklon chodby", "Gefälle", "κλίση στοάς", "passage gradient", NULL, NULL, "gradiente", "pente", "scivolo", "harapaki putanga", "nachylenie korytarza", "declividade da galeria", NULL, NULL, "уклон хода", "sklon chodby", "pjertesia e kalimit", }, { "гуано", "guano", "Guano", "γκουανό (πεÏιττώματα νυχτεÏίδων)", "guano", NULL, NULL, "guano", "guano", "guano", "tutae", "guano", "guano", NULL, NULL, "гуано", "guáno", "jashteqitje e lakuriqeve-guano", }, { "гипÑ", "sádrovec", "Gips", "γÏψος", "gypsum", NULL, NULL, "yeso", "gypse", "gesso", "tote", "gips", "gipsita", NULL, NULL, "гипÑ", "sádrovec", "gjips", }, { "гипÑово цвете", "sádrovcový kvÄ›t", "Gipsblume", "άνθος γÏψου", "gypsum flower", NULL, NULL, "flor yeso", "fleur de gypse", "fiore di gesso", "putiputi tote", "gipsowy kwiat", "flor de gipsita", NULL, NULL, "гипÑовые цветы", "sádrovcový kvet", "lule gjipsi", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "виÑочина на праг/комин/кладенец", "výška stupnÄ›/komínu/hloubka propasti", "Höhe der Stufe oder des Schlotes oder Tiefe des Schachts", "Ïψος σκαλοπατιοÏ/καμινάδας ή βάθος πηγαδιοÏ", "pit/chimney/step depth/height", NULL, NULL, "altura resalte/chimenea/profundidad pozo", "hauteur d’une marche/d’une cheminée/profondeur", "altezza", "papa tapuae/tumera/teitei rua/hÅhonu", "wysokość progu/komina/głębokość studni", "altura do chão para degrau/chaminé/desnível", NULL, NULL, "выÑота уÑтупа/трубы/колодца", "hĺbka/výška priepasti/stupňa/komína", "lartesia e shkalles ne dysheme/oxhaku/thellesia e leshimit", }, { "Дълбочина на кладенец", "hloubka propasti", "Tiefe des Schachts", "βάθος πηγαδιοÏ", "pit depth", NULL, NULL, "profundidad pozo", "profondeur", "prodondità pozzo", "rua hÅhonu", "głębokosc studni", "profundidade do desnível", NULL, NULL, "выÑота колодца", "hĺbka priepasti", "thellesia e leshimit", }, { "виÑочина на комин", "výška komínu", "Höhe des Schlotes", "Ïψος καμινάδας", "chimney height", NULL, NULL, "altura chimenea", "hauteur d’une cheminée", "altezza camino", "teitei tumera", "wysokość komina", "altura da chaminé", NULL, NULL, "выÑота трубы", "výška komína", "lartesia e oxhakut", }, { "виÑочина на ниша в тавана", "výška stupnÄ›", "Höhe der Bodenstufe", "Ïψος σκαλοπατιοÏ", "floor step height", NULL, NULL, "altura resalte", "hauteur d’une marche", "altezza camino", "teitei papa tapuae", "wysokość progu", "altura do degrau no chão", NULL, NULL, "выÑота уÑтупа", "výška stupňa", "lartesia e shkalles se dyshemes", }, { "хеликтити", "heliktit", "Excentrique", "ελικτίτης", "helictite", NULL, NULL, "excéntrica", "excentrique/hélictite", "eccentrica", "pÄkeho torotoro", "heliktyt", "helictite", "helictite", "excêntrica", "геликтиты", "heliktit", "heliktite", }, { "лед", "led", "Eis", "πάγος", "ice", NULL, NULL, "hielo", "glace", "ghiaccio", "kÅpaka", "lód", "gelo", NULL, NULL, "лёд", "ľad", "akull", }, { NULL, NULL, "Eissäule", NULL, "ice pillar", NULL, NULL, NULL, NULL, "colonna di ghiaccio", "pou KÅpaka", "lodowy stalagnat", NULL, NULL, NULL, NULL, "ľadový stalagnát", NULL, }, { NULL, NULL, "Eisstalaktit", NULL, "ice stalactite", NULL, NULL, NULL, NULL, "stalattite di ghiaccio", "kÅpaka ki te haere ki runga", "lodowy stalaktyt", NULL, NULL, NULL, NULL, "ľadový stalaktit", NULL, }, { NULL, NULL, "Eisstalagmit", NULL, "ice stalagmite", NULL, NULL, NULL, NULL, "stalagmite di ghiaccio", "kÅpaka ki te haere ki raro", "lodowy stalagmit", NULL, NULL, NULL, NULL, "ľadový stalagmit", NULL, }, { "кари", "Å¡krapy", "Karren", "κάÏÏεν - γυμνός καÏστικοποιημένος βÏάχος", "karren", NULL, NULL, "lapiaz", "lapiez", "karren", "awaawa", "żłobki krasowe", "lapiás", NULL, NULL, "карры", "Å¡krapy", "karreni", }, { "етикет", "pojmenování", "Beschriftung", "πεÏιγÏαφή", "label", NULL, NULL, "etiqueta", "libellé", "etichetta", "ingoa", "nazwa", "indicação", NULL, NULL, "текÑÑ‚Ð¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°", "pomenovanie", "mbishkrim-etiket", }, { "хоризонтално ÑтеÑнение", "neprůlezné snížení", "Engstelle, zu flach", "κλείσιμο στοάς λόγω χαμηλής οÏοφής", "passage end, low", NULL, NULL, "final bajo", "passage bas", "chiude su laminatoio", "putanga pÄpaku mutunga", "obniżenie nie do przejÅ›cia", "passagem com final baixo", NULL, NULL, "Ð³Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÐ·Ð¾Ñть", "neprielezné zníženie", "kalim I poshtem-fund", }, { "пещерно млÑко", "nickamínek", "Bergmilch", "γάλα σπηλαίου", "moonmilk", NULL, NULL, "mondmilch", "mondmilch", "moonmilk", "mirika marama", "miÄ™kkie nacieki", "leite-de-lua", NULL, NULL, "лунное молоко", "mäkký sinter", "qumesht-hena", }, { "непроходимо Ñнижаване", "neprůlezné zúžení", "Engstelle, zu schmal", "κλείσιμο στοάς λόγω στενώματος", "passage end, narrow", NULL, NULL, "final estrecho", "passage impénétrable", "chiude su strettoia", "putanga kuiti mutunga", "zwężenie nie do przejÅ›cia", "passagem com final estreito", NULL, NULL, "Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑƒÐ·Ð¾Ñть", "neprielezné zúženie", "kalim I ngushte-fund", }, { "липÑва екипировка!", "nevystrojené místo", "keine Ausrüstung", "χωÏίς υλικά", "no equipment!", NULL, NULL, "sin equipar", "pas d’équipement", "senza armo", "wahi a taonga mahi kore", "miejsce bez punktu asekuracyjnego", "local sem equipamento", NULL, NULL, "ÑнарÑжение отутÑтвует!", "nevystrojené miesto", "vend pa pajisje", }, { "палеонтологична находка", "paleontologické nálezy", "paläontologischer Fund", "παλαιοντολογικό εÏÏημα", "paleo material", NULL, NULL, "yacimiento (pal)", "matériel paléo", "materiale paleologico", "taiao taonga o nehe", "znaleziska paleontologiczne", "material paleontológico", NULL, NULL, "палео-находка", "paleontologické nálezy", "paleo-material", }, { "виÑочина на галериÑта", "výška chodby", "Raumhöhe", "Ïψος στοάς", "passage height", NULL, NULL, "altura galería", "hauteur du passage", "altezza galleria", "ara teitei", "wysokość korytarza", "altura da galeria", NULL, NULL, "выÑота хода", "výška chodby", "lartesia e kalimit", }, { "виÑочина над и дълбочина под водата", "výška nad i pod hladinou", "Raumhöhe gesamt", "Ïψος και βάθος στοάς πάνω και κάτω από νεÏÏŒ", "height above, depth below water", NULL, NULL, "altura y profundidad respecto nivel del mar", "hauteur au dessous et au dessus de l’eau", "altezza sopra e sotto il livello dell'acqua", "karewa ki runga ki raro", "wysokość korytarza nad powierzchniÄ… wody i głębokość poniżej poziomu wody", "altura acima e profundidade abaixo do nível da água", NULL, NULL, "выÑота над и глубина ниже ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð¾Ð´Ñ‹", "výška nad a hĺbka pod hladinou", "lartesia mbi dhe nen nivelin e ujit", }, { "дълбочина на галериÑта под водата", "výška chodby pod hladinou", "Raumhöhe nach unten", "βάθος στοάς κάτω από νεÏÏŒ", "depth below water level", NULL, NULL, "profundidad bajo nivel del mar", "hauteur en dessous de l’eau", "profondità sotto il livello dell'acqua", "te hÅhunu a karewa ki raro", "wysokość korytarza pod powierzchniÄ… wody", "profundidade abaixo do nível da água", NULL, NULL, "глубина ниже ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð¾Ð´Ñ‹", "hĺbka pod hladinou", "thellesia nen nivelin e ujit", }, { "виÑочина на галериÑта над водата", "výška chodby nad hladinou", "Raumhöhe nach oben", "Ïψος στοάς πάνω από νεÏÏŒ", "height above water level", NULL, NULL, "altura sobre nivel del mar", "hauteur au-dessus de l’eau", "altezza sopra il livello dell'acqua", "te teitei a karewa ki runga", "wysokość korytarza nad powierzchniÄ… wody", "altura acima do nível da água", NULL, NULL, "выÑота над уровнем воды", "výška nad hladinou", "lartesia mbi nivelin e ujit", }, { "виÑочина на галериÑта", "výška chodby", "Raumhöhe", "Ïψος στοάς", "passage height", NULL, NULL, "altura galería", "hauteur du passage", "altezza galleria", "ara teitei", "wysokość korytarza", "altura da galeria", NULL, NULL, "выÑота хода", "výška chodby", "lartesia e kalimit-e pashenuar", }, { "камъчета", "valouny", "Kies", "χαλίκια", "pebbles", NULL, NULL, "cantos rodados", "galets", "ciotoli", "nga kÅhatu iti", "okrÄ™glaki", "seixos", NULL, NULL, "галька", "okruhliaky", "gurralece", }, { "Ñталактон", "stalagnát", "Säule", "κολόνα", "pillar", NULL, NULL, "pilar", "pillier", "colonna", "pou", "stalagnat", "coluna", NULL, NULL, "колонна", "stalagnát", "shtylle", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "коралити", "pizolity", "Blumenkohlsinter", "μανιτάÏια από σταλαγμιτικό υλικό", "popcorn", NULL, NULL, "coliflor", "choux-fleur", "cavolfiore", "kanga pÄhuuhuu", "pizolity", "couve-flor", NULL, NULL, "коралиты", "pizolity", "palagaqa-kokorroshka", }, { "наÑип", "náplav", "schwimmendes Kalkhäutchen", "σταλαγμιτικό υλικό που επιπλέει", "calcite raft", NULL, NULL, "calcita flotante", "calcite flottante", "calcite flottante", "mÅkihi o kÅhatu hÅhonu", "nanios", "jangada", NULL, NULL, "выÑыпка", "náplav", "trap-skele", }, { "наÑипен конуÑ", "náplavový kužel", "schwimmendes Kalkhäutchen", "σταλαγμιτικός κώνος που επιπλέει", "raft cone", NULL, NULL, "conos", "cone", "calcite flottante", "korere a mÅkihi kÅhatu hÅhonu", "nanios", "cone de jangada", NULL, NULL, "выÑыпной конуÑ", "náplavový kužeľ", "rrjedhe uji konike", }, { "забележка", "poznámka", "Bemerkung", "σχόλιο", "remark", NULL, NULL, "nota", "remarque", "nota", "korero", "uwaga", "anotação", NULL, NULL, "заметка", "poznámka", "shenim", }, { "Ñухо Ñинтрово езеро", "sintrová hrázka", "Sinterbarriere", "Î³ÎºÎ¿Ï…Ï (λιθωματικό φÏάγμα)", "rimstone dam", NULL, NULL, "gour-presa", "gours", "gour", "kÅhatu matatara", "naciekowa przegroda", "travertino", NULL, NULL, "гуры без воды", "sintrová hrádza", "penda guri", }, { "Ñинтрово езеро", "sintrové jezírko", "Sinterbecken", "Î³ÎºÎ¿Ï…Ï (λιθωματική λεκάνη)", "rimstone pool", NULL, NULL, "gour-poza", "gour", "vasca", "kÅhatu kopua wai", "jeziorko naciekowe", "lago travertino", NULL, NULL, "гуры Ñ Ð²Ð¾Ð´Ð¾Ð¹", "sintrové jazierko", "vaska uji", }, { "корени", "koÅ™eny", "Holzreste", "Ïίζες", "root", NULL, NULL, "raíz", "racine", "radice", "pakiaka", "korzenie", "raiz", NULL, NULL, "корни раÑтений", "korene", "rrenje", }, { "въже", "lano", "Seil", "σχοινί", "rope", NULL, NULL, "cuerda", "corde", "corda", "taura", "lina", "corda", NULL, NULL, "Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¾Ð¿Ð¾Ñ€Ð°", "lano", "litar", }, { "пещерна Ñтълба", "lanový žebřík", "Drahtseilleiter", "ανεμόσκαλα", "rope ladder", NULL, NULL, "escala", "échelle de corde", "scala di corda", "arawhata taura", "drabinka linowa", "escada de corda", NULL, NULL, "Ð³Ð¸Ð±ÐºÐ°Ñ Ð»ÐµÑтница", "lanový rebrík", "shkalle litari", }, { "пÑÑък", "písek", "Sand", "άμμος", "sand", NULL, NULL, "arena", "sable", "sabbia", "onepÅ«", "piasek", "areia", NULL, NULL, "пеÑок", "piesok", "rane", }, { "фаÑетки", "erozní útvary", "Fließfacette", "σκάλοπ (κενά διάβÏωσης)", "scallop", NULL, NULL, "cavitaciones", "vagues d’érosion (coups de gouge)", "scallop", "anatipa", "formy erozyjne", "marcas de fluxo", NULL, NULL, "фаÑетки", "lastúrovité jamky", "guacat", }, { "мÑÑто на Ñечение", "příÄný Å™ez", "Schnitt", "τομή", "section", NULL, NULL, "sección", "section", "sezione", "roherohenga", "przkrój", "seção", "seção", "secção", "Ñечение", "prieÄny rez", "pike-ndarje", }, { "понор", "ponor", "Schluckloch", "καταβόθÏα", "sink", NULL, NULL, "sumidero", "perte", "perdita", "tapoko", "ponor", "sumidouro", NULL, NULL, "Ñток", "ponor", "pus", }, { "ÑнÑг", "sníh", "Schnee", "χιώνι", "snow", NULL, NULL, "nieve", "neige", "neve", "huka", "Å›nieg", "neve", NULL, NULL, "Ñнег", "sneh", "bore", }, { "цевичен Ñталактит", "brÄka", "Makkaroni", "μακαÏόνια", "soda straw", NULL, NULL, "fistulosa", "fistuleuse", "tubolare", "pÅ« ngote", "nacieki", "canudos", NULL, "tubulares", "Ñталактиты-Ñоломины", "brÄká", "shkopinje sode", }, { "извор", "vývÄ›r", "Quelle", "πηγή", "spring", NULL, NULL, "surgencia", "source", "sorgente", "waipuna", "wywierzysko", "nascente", NULL, NULL, "иÑток", "výver", "burim", }, { "Ñталактит", "stalaktit", "Stalaktit", "σταλακτίτης", "stalactite", NULL, NULL, "estalactita", "stalactite", "stalattite", "kÅhatu ki te haere ki runga", "stalaktyt", "estalactite", NULL, NULL, "Ñталактит", "stalaktit", "stalaktit", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "Ñталагмит", "stalagmit", "Stalagmit", "σταλαγμίτης", "stalagmite", NULL, NULL, "estalagmita", "stalagmite", "stalagmite", "kÅhatu ki te haere ki raro", "stalagmit", "estalagmite", NULL, NULL, "Ñталагмит", "stalagmit", "stalagmit", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "реперна точка", "měřiÄský bod", "Messpunkt", "σημείο χαÏτογÏάφησης", "survey station", NULL, NULL, "estación", "station topo", "caposaldo", "kaimataara", "punkt pomiarowy", "base", NULL, NULL, "пикет", "meraÄský bod", "stacioni I matjes", }, { "име на реперна точка", "Äíslo měřiÄského bodu", "Messpunktname", "όνομα σημείου χαÏτογÏάφησης", "survey station name", NULL, NULL, "nombre estacion", "station topo, nom", "node del caposaldo", "kaimatara ingoa", "numer punktu pomiarowego", "nome de base", NULL, NULL, "номер пикета", "Äíslo meraÄského bodu", "emri I stacionit-mates", }, { "реперна точка (Ñтабилизирана)", "měřiÄský bod (stabilizovaný)", "dauerhafter Messpunkt", "μόνιμο σημείο χαÏτογÏάφησης", "fixed survey station", NULL, NULL, "estación (fija)", "station topo, fixe", "caposaldo fisso", "kaimataara whakakÅhatu", "punkt pomiarowy (zastabilizowany)", "base fixa", NULL, NULL, "репер", "meraÄský bod (stabilizovaný)", "stacion mates I palevizshem", }, { "реперна точка (еÑтеÑтвена)", "měřiÄský bod (přírodní)", "natürlicher Messpunkt", "σημείο χαÏτογÏάφησης (φυσικό)", "natural survey station", NULL, NULL, "estación (natural)", "station topo, naturelle", "caposaldo naturale", "kaimataara a papa", "punkt pomiarowy naturalny", "base natural", NULL, NULL, "еÑтеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° привÑзки", "meraÄský bod (prírodný)", "stacion mates natyral", }, { "реперна точка (боÑдиÑана)", "měřiÄský bod (zabarvený)", "farbig markierter Messpunkt", "σημείο χαÏτογÏάφησης (βαμμένο)", "painted survey station", NULL, NULL, "estación (pintada)", "station topo, peinte", "caposaldo verniciato", "kaimataara tohi", "punkt pomiarowy (oznaczony farbÄ…)", "base pintada", NULL, NULL, "нариÑованный пикет", "meraÄský bod (zafarbený)", "stacion mates I ngjyrosur", }, { "временна реперна точка", "měřiÄský bod (nestabilizovaný)", "unmarkierter Messpunkt", "Ï€ÏοσωÏινό σημείο χαÏτογÏάφησης", "temporary survey station", NULL, NULL, "estación topográfica", "station topo temporaire", "caposaldo termporaneo", "kaimataara mo te wÄ", "punkt pomiarowy (niezastabilizowany)", "base temporária", NULL, NULL, "временный пикет", "meraÄský bod (nestabilizovaný)", "stacion mates I perkohshem", }, { "Ñтъпала", "schody", "Stufen", "σκαλοπάτια", "steps", NULL, NULL, "escalones", "marches", "scalini", "nga tapuae", "schody", "degraus", NULL, NULL, "Ñтупени", "schody", "shkalle", }, { "траверÑ", "traverz", "Querung", "Ï„ÏαβέÏσα", "traverse", NULL, NULL, "pasamanos", "traversée", "traverso", "hikoi a tupari", "trawers", "travessia", NULL, NULL, "троллей", "traverz", "kalim anesore", }, { "оÑтанки от раÑтителноÑÑ‚", "zbytky rostlin", "Pflanzenreste", "φυτικά κατάλοιπα", "vegetable debris", NULL, NULL, "detritus vegetales", "débris végétaux", "detriti vegetali", "otaota a hua whenua", "szczÄ…tki roÅ›linne", "restos vegetais", NULL, NULL, "оÑтанки раÑтительноÑти", "zvyÅ¡ky rastlín", "mbetje perimesh", }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, { "виÑочинна отметка на Ñтената", "nadmoÅ™ská výška bodu na stÄ›nÄ›", "Höhe über Koordinatenursprung", "Ïψος τοίχου", "altitude", NULL, NULL, "altura pared", "altitude", "altezza", "teitei, tiketike", "wysokość punktu pomiarowego npm", "altura", NULL, NULL, "выÑÐ¾Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ° Ñтены", "nadmorská výška bodu na stene", "lartesia mbidetare e murit", }, { "повлек", "vápencový povlak", "Wandsinter", "ασβεστίτης τοιχώματος", "wall calcite", NULL, NULL, "calcita", "mur, calcite", "calcite", "tÄra a nga roimata a pakeho", "wapienna powÅ‚oka", "parede de calcita", "parede de calcita", "parede de calcite", "наÑтенный кальцит", "vápencový povlak", "kalcit-muri", }, { "вода", "voda", "Wasser", "νεÏÏŒ", "water", NULL, NULL, "agua", "eau", "acqua", "wai", "woda", "água", NULL, NULL, "вода", "voda", "uje", }, { "водно течение", "vodní tok", "Gerinne", "υδÏοÏÏοή", "water flow", NULL, NULL, "curso agua", "rivière", "corso d'acqua", "wairere", "ciek wodny", "fluxo de água", NULL, NULL, "водоток", "vodný tok", "rrjedhe uji", }, { "непоÑтоÑнно водно течение", "obÄasný vodní tok", "zeitweises Gerinne", "διακοπτόμενη υδÏοÏÏοή", "intermittent water flow", NULL, NULL, "curso agua intermitente", "rivière, intermittente", "corso d'acqua temporaneo", "wairere taumutumutu", "okresowy ciek wodny", "fluxo de água intermitente", NULL, NULL, "непоÑтоÑнный водоток", "obÄasný vodný tok", "rrjedhe uji me force", }, { "палео речно легло", "paleoÅ™eÄiÅ¡tÄ›", "ehemaliges Gerinne", "παλαιουδÏοÏÏοή", "paleo water flow (scallops)", NULL, NULL, "paleocurso agua", "rivière fossile", "paleocorso d'acqua", "wairere nehera", "stary ciek wodny", "paleo-fluxo de água", NULL, NULL, "палео-поток", "paleorieÄisko", "rrjedhe uji e vjeter", }, { "поÑтоÑнно водно течение", "vodní tok", "ständiges Gerinne", "μόνιμη υδÏοÏÏοή", "water flow", NULL, NULL, "curso agua", "rivière, permanente", "corso d'acqua permanente", "wairere", "ciek wodny", "fluxo de água permanente", NULL, NULL, "поÑтоÑнный водоток", "vodný tok", "rrjedhe uji e perhershme", }, { "Гл. картировач", "Kreslil", "Zeichnung", "ΣκαÏίφημα", "Drawn by", NULL, NULL, "Cartografía", "Dessinateur", "Cartografia", "Kaituhi", "rysowaÅ‚", "Desenhada por", NULL, NULL, "ÐšÐ°Ð¼ÐµÑ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°", "Kreslil", "vizatuar nga", }, { "Гл. картировачи", "Kreslili", "Zeichnung", "ΣκαÏίφημα", "Drawn by", NULL, NULL, "Cartografía", "Dessinateurs", "Cartografia", "Kaituhi", "rysowali", "Desenhadas por", NULL, NULL, "ÐšÐ°Ð¼ÐµÑ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°", "Kreslili", "vizatuar nga", }, { "ДенивелациÑ", "PÅ™evýšení", "Niveaudifferenz", "Βάθος", "Depth", NULL, NULL, "Desnivel", "Profondeur", "Profondità", "HÅhonu a ana, RÄ“tÅtanga", "przewyższenie", "Desnível", NULL, NULL, "Глубина", "Prevýšenie", "thellesia", }, { "Дължина", "Délka", "Gesamtlänge", "Μήκος", "Length", NULL, NULL, "Desarrollo", "Longueur", "Sviluppo", "Roa a ana", "dÅ‚ugość", "Extensão", NULL, NULL, "Длина", "Dĺžka", "gjatesia", }, { "ВиÑочинна Ñкала", "NadmoÅ™ské výšky", "Höhe des Titelfeldes", "ΥψομετÏικά", "Altitudes", NULL, NULL, "color (altitud)", "Altitudes", "Profondità", "Teitei, Tiketike", "wysokoÅ›ci npm", "Altitudes", NULL, NULL, "Ð’Ñ‹ÑÐ¾Ñ‚Ð½Ð°Ñ ÑˆÐºÐ°Ð»Ð°", "Nadmorské výšky", "titulli ngjyra-permbajtja-lartesia mbidetare", }, { "Карти", "Mapy", "Karten", "ΧάÏτες", "Maps", NULL, NULL, "color (mapa)", "Cartes", "Mappa", "Mahere whenua", "mapy", "Mapas", NULL, NULL, "Карты", "Mapy", "hartat", }, { "ИзÑледване", "Objevil", "Entdeckung", "ΕξεÏευνητής", "Explored by", NULL, NULL, "Exploración", "Explorateur", "Esplorazione", "Kaipokai whenua", "odkryÅ‚", "Explorada por", NULL, NULL, "ИÑÑледование", "Objavil", "hulumtuar nga", }, { "ИзÑледване", "Objevili", "Entdeckung", "ΕξεÏευνητές", "Explored by", NULL, NULL, "Exploración", "Explorateurs", "Esplorazione", "Kaipokai whenua", "odkryli", "Exploradas por", NULL, NULL, "ИÑÑледование", "Objavili", "hulumtuar nga", }, { "Легенда", "Legenda", "Legende", "Τίτλος", "Legend", NULL, NULL, "Leyenda", "Légende", "Legenda", "Kaiwhakaatu", "legenda", "Legenda", NULL, NULL, "УÑловные обозначениÑ", "Legenda", "permbajtja", }, { "Изглед от горе", "[Náhled horních vrstev]", "Vorschau oben", "[Ï€Ïοεπισκόπηση πάνω]", "[Preview above]", NULL, NULL, "Vista previa superior", "[Prévisualisation au-dessus]", "Anteprima sopra", "Tuhi a ana ki runga", "widok z góry", "[Visualização acima]", NULL, NULL, "[Вид выше]", "[Náhľad horných vrstiev]", "parashiqimi lart", }, { "Изглед от долу", "[Náhled dolních vrstev]", "Vorschau unten", "[Ï€Ïοεπισκόπηση κάτω]", "[Preview below]", NULL, NULL, "Vista previa inferior", "[Prévisualisation au-dessous]", "Anteprima sotto", "Tuhi a ana ki raro", "widok z doÅ‚u", "[Visualização abaixo]", NULL, NULL, "[Вид ниже]", "[Náhľad spodných vrstiev]", "parashiqimi perfundi", }, { "Карта на повърхноÑтта", "[Povrchová mapa]", "Erdoberfläche", "[χάÏτης επιφάνειας]", "[Surface Image]", NULL, NULL, "Mapa superficie", "[Carte extérieure]", "Mappa superficie", "Konohi o te whenua", "mapa powierzchni", "[Mapa de superfície]", NULL, NULL, "[Карта поверхноÑти]", "[Povrchová mapa]", "harta e siperfaqes", }, { "Картирал", "Měřil", "Vermessung", "ΧαÏτογÏαφήθηκε από τον", "Surveyed by", NULL, NULL, "Topografía", "Topographe", "Topografia", "KairÅ«ri", "mierzyÅ‚", "Topografada por", NULL, NULL, "Съемка", "Zameral", "matur nga", }, { "Картирали", "Měřili", "Vermessung", "ΧαÏτογÏαφήθηκε από τους", "Surveyed by", NULL, NULL, "Espeleometría", "Topographes", "Topografia", "KairÅ«ri", "pomierzyli", "Topografadas por", NULL, NULL, "Съемка", "Zamerali", "matur nga", }, { "футове", "ft", "ft", "πόδια", "ft", NULL, NULL, "ft", "ft", "ft", "whÄ«ti", "ft (stopy)", "pés", NULL, NULL, "футов", "ft", "njesia matese-kembe", }, { "м", "m", "m", "μ", "m", NULL, NULL, "m", "m", "m", "mehua", "m (metry)", "m", NULL, NULL, "м", "m", "njesia matese-metri", }, }; therion/thperson.cxx0000664000175000017500000000573610721203310013634 0ustar useruser/** * @file thperson.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thperson.h" #include "thdatabase.h" #include "thparse.h" #include "thexception.h" #include void thperson::reset() { this->n1 = ""; this->n2 = ""; this->nn = "/"; } void thperson::identify(thdatabase * dbp) { dbp->buff_tmp = this->n2; dbp->buff_tmp += "/"; dbp->buff_tmp += this->n1; this->nn = dbp->strstore(dbp->buff_tmp.get_buffer(), true); } thperson::thperson() { this->reset(); } #ifdef THWIN32 char * index(char * str, char znk) { size_t sln = strlen(str), idx; for(idx = 0; idx < sln; idx++, str++) if(*str == znk) return str; return NULL; } #endif void thperson::parse(thdatabase * dbp, char * src) { this->reset(); bool has_sep = (index(src,'/') != NULL); thsplit_strings(&(dbp->mbuff_tmp), src, '/'); if (has_sep) { if (dbp->mbuff_tmp.get_size() == 1) { this->n2 = dbp->strstore((dbp->mbuff_tmp.get_buffer())[0], true); } else if (dbp->mbuff_tmp.get_size() == 2) { this->n1 = dbp->strstore((dbp->mbuff_tmp.get_buffer())[0], true); this->n2 = dbp->strstore((dbp->mbuff_tmp.get_buffer())[1], true); } else ththrow(("invalid name format -- \"%s\"", src)) } else { thsplit_args(&(dbp->mbuff_tmp), src); if (dbp->mbuff_tmp.get_size() == 1) { this->n2 = dbp->strstore((dbp->mbuff_tmp.get_buffer())[0], true); } else if (dbp->mbuff_tmp.get_size() == 2) { this->n1 = dbp->strstore((dbp->mbuff_tmp.get_buffer())[0], true); this->n2 = dbp->strstore((dbp->mbuff_tmp.get_buffer())[1], true); } else ththrow(("invalid name format -- \"%s\"", src)) } this->identify(dbp); } bool operator < (const class thperson & p1, const class thperson & p2) { if (strcmp(p1.nn, p2.nn) < 0) return true; else return false; } bool operator == (const class thperson & p1, const class thperson & p2) { if (strcmp(p1.nn, p2.nn) == 0) return true; else return false; } const char * thperson::get_n1() const { return this->n1; } const char * thperson::get_n2() const { return this->n2; } therion/thsymbolsetlist.pl0000775000175000017500000000733012042160420015051 0ustar useruser#!/usr/bin/perl open(I,"mpost/thTrans.mp"); while () { if (/^\s*(\S+)\s+([plas]{1}[a-z_]+)/) { $SYMHASH{$2} = ""; } } close(I); open(I,"thsymbolsetfont.txt"); while () { if (/^\s*(\S+)\s+(\S+)\s+([a-z_]+)/) { $FNTHASH{"p_$3"} = $2; } } close(I); $SYMHASH{a_} = "noassign hidden"; $SYMHASH{a_u} = ""; $SYMHASH{a_zzz} = "noassign hidden"; $SYMHASH{l_border_invisible} = "hidden"; $SYMHASH{l_wall_invisible} = "hidden"; # ??? $SYMHASH{l_survey} = "noassign"; $SYMHASH{l_undefined} = "noassign"; $SYMHASH{l_label} = "noassign"; $SYMHASH{l_rope} = "noassign hidden"; $SYMHASH{l_u} = ""; $SYMHASH{l_} = "noassign hidden"; $SYMHASH{l_zzz} = "noassign hidden"; $SYMHASH{p_undefined} = "noassign"; $SYMHASH{p_section} = "noassign"; $SYMHASH{p_label} = "noassign"; $SYMHASH{p_remark} = "noassign"; $SYMHASH{p_mapconnection} = "noassign"; $SYMHASH{p_stationname} = "noassign"; $SYMHASH{p_date} = "noassign"; $SYMHASH{p_altitude} = "noassign"; $SYMHASH{p_wallaltitude} = "noassign"; $SYMHASH{p_height_positive} = "noassign"; $SYMHASH{p_height_negative} = "noassign"; $SYMHASH{p_height_unsigned} = "noassign"; $SYMHASH{p_passageheight_positive} = "noassign"; $SYMHASH{p_passageheight_negative} = "noassign"; $SYMHASH{p_passageheight_both} = "noassign"; $SYMHASH{p_passageheight_unsigned} = "noassign"; $SYMHASH{p_surfacestation} = "noassign"; $SYMHASH{p_cavestation} = "noassign"; $SYMHASH{p_flag_entrance} = "noassign hidden"; $SYMHASH{p_flag_spring} = "noassign hidden"; $SYMHASH{p_flag_sink} = "noassign hidden"; $SYMHASH{p_flag_doline} = "noassign hidden"; $SYMHASH{p_flag_airdraught} = "noassign hidden"; $SYMHASH{p_flag_continuation} = "noassign hidden"; $SYMHASH{p_flag_dig} = "noassign hidden"; $SYMHASH{p_flag_arch} = "noassign hidden"; $SYMHASH{p_flag_overhang} = "noassign hidden"; $SYMHASH{p_station} = "hidden"; $SYMHASH{p_u} = ""; $SYMHASH{p_} = "noassign hidden"; $SYMHASH{p_zzz} = "noassign hidden"; $SYMHASH{s_} = "noassign hidden"; $SYMHASH{s_zzz} = "noassign hidden"; $SYMHASH{x_} = "noassign hidden"; $SYMHASH{x_all} = "hidden"; $SYMHASH{x_ice} = "hidden"; $SYMHASH{x_sediments} = "hidden"; $SYMHASH{x_centerline} = "hidden"; $SYMHASH{x_water} = "hidden"; $SYMHASH{x_speleothems} = "hidden"; $SYMHASH{x_passagefills} = "hidden"; $SYMHASH{x_equipment} = "hidden"; $SYMHASH{x_sections} = "hidden"; $SYMHASH{x_text} = "hidden"; $SYMHASH{x_surfacecenterline} = "noassign hidden"; $SYMHASH{x_cavecenterline} = "noassign hidden"; $SYMHASH{x_line_wall} = "hidden"; $SYMHASH{x_line_border} = "hidden"; $SYMHASH{x_line_waterflow} = "hidden"; $SYMHASH{x_line_survey} = "hidden"; $SYMHASH{x_point_waterflow} = "hidden"; $SYMHASH{x_point_station} = "hidden"; $SYMHASH{x_point_flag} = "hidden"; $SYMHASH{x_point_height} = "hidden"; $SYMHASH{x_point_passageheight} = "hidden"; $SYMHASH{x_point_airdraught} = "hidden"; $i = 0; foreach $k (sort keys(%SYMHASH)) { $TK .= " SYM" . uc($k). " = $i,\n"; $TS .= " \"SYM" . uc($k). "\",\n"; $MP .= " \"$k\",\n"; $EX .= ($SYMHASH{$k} =~ /noassign/ ? " false,\n" : " true,\n"); $HN .= ($SYMHASH{$k} =~ /hidden/ ? " true,\n" : " false,\n"); $FC .= ($FNTHASH{$k} =~ /\S+/ ? " $FNTHASH{$k},\n" : " 0,\n"); $i++; } open(O,">thsymbolsetlist.h"); print O < #include #include #include #include #include #include #include #include #include #include #include "thtexfonts.h" #include "thtexenc.cxx" #include "thpdfdbg.h" #include "thinit.h" #include "thpdfdata.h" #ifndef NOTHERION #include "thbuffer.h" thbuffer thtexfontsbuff; #endif using namespace std; list FONTS; typedef list unistr; encodings_new::encodings_new () { v_fon.resize(134); // v_fon.resize(127); for (int i = 0; i < 33; i++) { v_fon[i] = 0; } for (int i = 33; i < 127; i++) { // printable ASCII v_fon[i] = i; m_fon[i] = i; } v_fon[127] = 0xFB00; m_fon[0xFB00] = 127; // ff v_fon[128] = 0xFB01; m_fon[0xFB01] = 128; // fi v_fon[129] = 0xFB02; m_fon[0xFB02] = 129; // fl v_fon[130] = 0xFB03; m_fon[0xFB03] = 130; // ffi v_fon[131] = 0xFB04; m_fon[0xFB04] = 131; // ffl v_fon[132] = 0x2013; m_fon[0x2013] = 132; // en dash v_fon[133] = 0x2014; m_fon[0x2014] = 133; // em dash i_fon = 0; NFSS = 0; t1_convert = 1; } int encodings_new::get_enc_pos (int ch) { if (m_fon.find(ch) == m_fon.end()) { if (i_fon < 33) { v_fon[i_fon] = ch; m_fon[ch] = i_fon; i_fon++; } else { v_fon.push_back(ch); m_fon[ch] = v_fon.size()-1; } } //cout << "==FP== " << m_fon[style][ch] << endl; return m_fon[ch]; }; void encodings_new::write_enc_files() { if (NFSS==0) return; thprintf("generating TeX metrics ... "); char fc[10]; string style[5] = {"rm", "it", "bf", "ss", "si"}; string s; ofstream H ("thfonts.map"); // delete previous file, we will append to it below if (!H) therror(("could not write font mapping data for pdfTeX\n")); H.close(); int fcount = get_enc_count(); for (int j = 0; j < fcount; j++) { sprintf(fc,"%02d", j); string fname_enc = string("th_enc")+fc+".enc"; ofstream F(fname_enc.c_str()); if (!F) therror(("could not write encoding file\n")); F << "% LIGKERN uni002D uni002D =: uni2013 ; uni2013 uni002D =: uni2014 ;" << endl; F << "% LIGKERN uni0066 uni0066 =: uniFB00 ; uni0066 uni006C =: uniFB02 ; uni0066 uni0069 =: uniFB01 ; uniFB00 uni0069 =: uniFB03 ; uniFB00 uni006C =: uniFB04 ;" << endl; F << "/" << fname_enc << "[" << endl; for (int k=0; k < 256; k++) { //cout << ccount << "** i:" << i << " j:" << j << " k:" << k << " " << v_fon[i][k] << endl; if ((v_fon.size() <= ((unsigned) 256*j + k)) || (v_fon[256*j + k] == 0)) F << "/.notdef" << endl; else F << "/uni" << setw(4) << setfill('0') << hex << noshowbase << uppercase << v_fon[256*j + k] << endl; } F << "] def" << endl; F.close(); for (int i=0; i<5; i++) { string fname_tfm = "th"+style[i]+fc; // convention used also in tex2uni // we don't use -fliga to turn ligatures on, beacause between // subsequent runs (metapost, pdftex) the meaning of ligatures // positioned at the end of the encoding would change // if more characters are present at the second run // -- a few ligatures are initialised in the constructor string type1 = (t1_convert==1) ? " " : " --no-type1 "; if (system(("\"" + string(thini.get_path_otftotfm()) + "\" -e " + fname_enc + " -fkern --no-default-ligkern --no-virtual --name " + fname_tfm + // " -fkern --no-default-ligkern --name " + fname_tfm + // type1 + " --warn-missing "+otf_file[i]+" > thotftfm.tmp").c_str()) > 0) type1 + otf_file[i]+" > thotftfm.tmp").c_str()) > 0) therror((("can't generate TFM file from "+otf_file[i]+" (LCDF typetools not installed?)").c_str())); ifstream G ("thotftfm.tmp"); if (!G) therror(("could not read font mapping data\n")); while (G) { getline(G,s); if (s.find("<") != string::npos) break; } if (s.substr(s.size()-3,3)=="otf" || s.substr(s.size()-3,3)=="OTF") { s.replace(s.rfind("<"), 1, "<<"); // OTF fonts must be fully embedded } G.close(); ofstream H ("thfonts.map", ios::app); if (!H) therror(("could not write font mapping data for pdfTeX\n")); H << "\\pdfmapline{+" << s << "}" << endl; H.close(); } } thprintf("done\n"); } int encodings_new::get_enc_count () { return v_fon.size() / 256 + 1; } int encodings_new::get_uni (int f, int ch) { return v_fon[256*f + ch]; } encodings_new ENC_NEW; // returns the index of given encoding (as used in predefined encoding arrays) // or -1 if such an encoding is not known int get_enc_id(const char * enc) { for (int i=0; i=192 && c<=223) { j = 64*(c-192); c = s[++i]; j += c-128; t.push_back(j); } else if (c>=224 && c<=239) { j = 4096*(c-224); c = s[++i]; j += 64*(c-128); c = s[++i]; j += c-128; t.push_back(j); } else therror (("Invalid utf-8 string!")); // we don't support higher // unicode characters } return t; } // converts utf8 to 2B Unicode in a special format for pdfTeX string utf2texoctal(string str) { unistr s = utf2uni(str); string t; char ch[10]; // t = "\\ne\\376\\ne\\377"; unsigned char c; for (unistr::iterator I = s.begin(); I != s.end(); I++) { c = (*I) / 256; sprintf(ch,"%o",c); t = t + "\\ne\\" + (string) ch; c = (*I) % 256; sprintf(ch,"%o",c); t = t + "\\ne\\" + (string) ch; } return t; } // converts utf8 to 2B Unicode in a special format for pdfTeX string utf2texhex(string str) { unistr s = utf2uni(str); string t; char ch[10]; unsigned char c; for (unistr::iterator I = s.begin(); I != s.end(); I++) { c = (*I) / 256; sprintf(ch,"%02x",c); t += (string) ch; c = (*I) % 256; sprintf(ch,"%02x",c); t += (string) ch; } return t; } string replace_all(string s, string f, string r) { size_t found = s.find(f); while(found != string::npos) { s.replace(found, f.length(), r); found = s.find(f); } return s; } // easier to use brute force than to link regex on all platforms :( string select_lang(string s, string lang) { size_t i,j; if (s.find(""); if (i != string::npos) { // precise match i = s.find(">",i); j = s.find(""); if (i != string::npos) { // match main language part i = s.find(">",i); j = s.find("",i); j = s.find("") != string::npos) align = 1; else if (str.find("") != string::npos) align = 1; else if (str.find("") != string::npos) align = 0; else if (str.find("") != string::npos) align = 2; if (str.find("
") != string::npos) is_multiline = true; str = replace_all(str,"
",""); str = replace_all(str,"",""); str = replace_all(str,"",""); str = replace_all(str,"",""); str = replace_all(str,"
","\x1B\x1"); // \e not accepted in VC++ str = replace_all(str,"","\x1B\x2"); str = replace_all(str,"","\x1B\x3"); str = replace_all(str,"","\x1B\x4"); str = replace_all(str,"","\x1B\x5"); str = replace_all(str,"","\x1B\x6"); str = replace_all(str,"","\x1B\x7"); str = replace_all(str,"","\x1B\x8"); str = replace_all(str,"","\x1B\x9"); // An attempt to implement hyperlinks, unsuccessful though: // ! pdfTeX error (ext4): link annotations cannot be inside an XForm. // \xxxx //// links // size_t i=-1,j; // while((i = str.find("",i); // if (j == string::npos) therror(("No closing '>' in definition")); // str = str.replace(j,1,"\x1B\x0B"); // str = str.replace(i,6,"\x1B\x0A"); // } // str = replace_all(str,"","\x1B\x0C"); //// endlinks if (is_multiline) { T << "\\vbox{\\halign{"; if (align > 0) T << "\\hfil"; T << "#"; if (align < 2) T << "\\hfil"; T << "\\cr"; } unistr s = utf2uni(str); for (unistr::iterator I = s.begin(); I != s.end(); I++) { wc = *I; if (wc == 32 || wc == 9) { // space requires special treatment T << "\\ "; // (it's not included in TeX fonts) continue; // so encodings search doesn't help } else if (wc == 27) { // escaped chars (special formatting) wc = *(++I); switch (wc) { case 0x1: if (rtl) T << "\\endR"; T << "\\cr"; if (rtl) T << "\\beginR"; switch (laststyle) { case 1: T << "\\rm"; break; case 2: T << "\\it"; break; case 3: T << "\\bf"; break; case 4: T << "\\ss"; break; case 5: T << "\\si"; break; } SELFONT; T << " "; break; case 0x2: T << "\\thinspace "; break; case 0x3: T << "\\rm "; laststyle = 1; SELFONT; break; case 0x4: T << "\\it "; laststyle = 2; SELFONT; break; case 0x5: T << "\\bf "; laststyle = 3; SELFONT; break; case 0x6: T << "\\ss "; laststyle = 4; SELFONT; break; case 0x7: T << "\\si "; laststyle = 5; SELFONT; break; case 0x8: T << "\\global\\TeXXeTstate=1\\beginR "; rtl = true; break; case 0x9: T << "\\endR "; rtl = false; break; //// links // case 0xA: if (link_active) T << "\\pdfendlink "; // T << "\\pdfstartlink attr {/Border [0 0 0]} goto name {"; // link_active = true; // break; // case 0xB: T << "}"; break; // case 0xC: if (link_active) { // T << "\\pdfendlink "; // link_active = false; // } // break; //// endlinks } continue; } if (ENC_NEW.NFSS==0) { if (wc==39) wc = 8217; // apostrophe -> quoteright; bool local_exit = false; bool local_repeat = true; bool is_accent = false; bool bot_accent = false; int bc = 0, alt = 0; // base char, alternative char while(local_repeat) { local_repeat = false; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) { int j = J->id; for (int i=0; i<256; i++) { if (texenc[i][j] == wc || (is_accent && (texenc[i][j] == alt))) { if (j != lastenc) { // do a better optimization // of the font changes in a string T << "\\thf" << u2str(j+1);//<< "{}"; lastenc = j; } if (!is_accent) { // some characters require special treatment in TeX // if (i==0 || i==127 || i==123 || i==125 || i==36 || i==38 || // i==10 || i==35 || i==95 || i==126 || i==13 || i==94 || // i==92 || i==37 || i < 32) { //original T << "\\char" << i << " "; T << "\\char" << i << " " << (remove_kerning ? "{}" : ""); // } // else { // T << char(i); //// if (bot_accent) T << " "; // } } else if (!bot_accent) { T << "\\accent" << i << " "; } else { T << "\\fixaccent{" << i << "}"; } local_exit = true; local_repeat = false; } if (local_exit) break; } if (local_exit) break; } if (!local_exit && !is_accent) { // current character is not included in any of the used encodings; // let's try to find an approximation based on Unicode // decomposition table int a = 0, b = max_base - 1, i, j; while (a<=b) { i = (int) (a+b)/2; j = unibase[i][0]; if (j == wc) { bc = unibase[i][1]; wc = unibase[i][2]; alt = -1; bot_accent = false; switch (wc) { case 768: alt = 96; break; // grave case 769: alt = 180; break; // acute case 770: alt = 710; break; // circumflex case 771: alt = 732; break; // tilde case 772: alt = 175; break; // macron case 774: alt = 728; break; // breve case 775: alt = 729; break; // dot above case 776: alt = 168; break; // diaeresis case 778: alt = 730; break; // ring above case 779: alt = 733; break; // double acute -- hungarian case 780: alt = 711; break; // caron case 807: alt = 184; bot_accent = true; break; // cedilla case 808: alt = 731; bot_accent = true; break; // ogonek } if (!bot_accent && bc == 105) bc = 305; // dotless i correction if (!bot_accent && bc == 106) bc = 63166; // dotless j correction is_accent = true; local_repeat = true; break; } if (j > wc) b = i - 1; else a = i + 1; } } else if (is_accent) { wc = bc; is_accent = false; local_repeat = true; local_exit = false; } } if (!local_exit) // we didn't find anything to display // it would be possible to add here various characters mapped // by plain TeX macros to mathematical fonts (backslash &c.) // This would require to make math fonts scalable with the \size[.] macro T << "."; } else { // NFSS == 1 int k = ENC_NEW.get_enc_pos(wc); int f_ind = k / 256; if (f_ind != lastenc) { T << "\\thf" << u2str(f_ind+1); lastenc = f_ind; } T << "\\char" << k % 256 << " " << (remove_kerning ? "{}" : ""); } } // endfor if (is_multiline) { T << "\\cr}}"; } T << "\\mainfont{}"; if (rtl) T << "\\endR "; // change from the links experiment return T.str(); } int tex2uni(string font, int ch) { if (ENC_NEW.NFSS==0) { int id = -1; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) if (J->rm == font || J->it == font || J->ss == font || J->si == font || J->bf == font) { id = J->id; break; } //assert(id != -1); ch %= 256; if (ch < 0) ch += 256; // if string is based on signed char if (id == -1) { ostringstream s; s << "can't map character 0x" << std::uppercase << std::setfill('0') << std::setw(2) << std::hex << ch << " in font '" << font << "' to unicode"; therror((s.str().c_str())); } return texenc[ch][id]; } else { // NFSS string f_ind = font.substr(4,2); // basic check that we have a number assert(f_ind[0] >= '0' && f_ind[0] <= '9' && f_ind[1] >= '0' && f_ind[1] <= '9'); if (ch < 0) ch += 256; // if string is based on signed char return ENC_NEW.get_uni(atoi(f_ind.c_str()),ch); } } //const char * utf2tex (char * s) { // string t = utf2tex(string(s)); // return t.c_str(); //} #ifndef NOTHERION const char * utf2tex (const char * s, bool b) { string t = utf2tex(string(s),b); thtexfontsbuff.strcpy(t.c_str()); return thtexfontsbuff.get_buffer(); } #endif // For simlicity we suppose that all characters which are set by TeX macros // are included in the first encoding specified. This concerns especially // page numbers, labels, and scalebar legend. Therefore we switch to \thfa // after each size/style change void print_fonts_setup() { ofstream P("th_enc.tex"); // included also in MetaPost if(!P) therror(("Can't write file th_enc.tex")); P << "\\def\\rms{\\rm}" << endl; P << "\\def\\its{\\it}" << endl; P << "\\def\\bfs{\\bf}" << endl; P << "\\def\\sss{\\ss}" << endl; P << "\\def\\sis{\\si}" << endl; if (ENC_NEW.NFSS==0) { P << "\\def\\fixaccent#1#2 {{\\setbox0\\hbox{#2}\\ifdim\\ht0=1ex\\accent#1 #2%" << endl; P << " \\else\\ooalign{\\unhbox0\\crcr\\hidewidth\\char#1\\hidewidth}\\fi}}" << endl; P << "\\def\\size[#1]{%" << endl; P << " \\let\\prevstyle\\laststyle" << endl; P << " \\baselineskip#1pt" << endl; P << " \\baselineskip=1.2\\baselineskip" << endl; string firstfont = "\\thf" + u2str(FONTS.begin()->id+1); P << " \\def\\rm{"; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) P << "\\font\\thf" << u2str(J->id+1) << "=" << J->rm << " at#1pt"; P << "\\let\\laststyle\\rms" << firstfont << "}%" << endl; P << " \\def\\it{"; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) P << "\\font\\thf" << u2str(J->id+1) << "=" << J->it << " at#1pt"; P << "\\let\\laststyle\\its" << firstfont << "}%" << endl; P << " \\def\\bf{"; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) P << "\\font\\thf" << u2str(J->id+1) << "=" << J->bf << " at#1pt"; P << "\\let\\laststyle\\bfs" << firstfont << "}%" << endl; P << " \\def\\ss{"; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) P << "\\font\\thf" << u2str(J->id+1) << "=" << J->ss << " at#1pt"; P << "\\let\\laststyle\\sss" << firstfont << "}%" << endl; P << " \\def\\si{"; for (list::iterator J = FONTS.begin(); J != FONTS.end(); J++) P << "\\font\\thf" << u2str(J->id+1) << "=" << J->si << " at#1pt"; P << "\\let\\laststyle\\sis" << firstfont << "}%" << endl; P << " \\prevstyle" << endl; P << "}"; P << "\\let\\laststyle\\rms" << endl; P << "\\size[10]\\ss" << endl; P << "\\def\\mainfont{" << firstfont << "}" << endl; } else { string styledef[5] = {"rm", "it", "bf", "ss", "si"}; P << "\\def\\size[#1]{%" << endl; P << " \\let\\prevstyle\\laststyle" << endl; P << " \\baselineskip#1pt" << endl; P << " \\baselineskip=1.2\\baselineskip" << endl; for (int j=0; j<5; j++) { P << " \\def\\" << styledef[j] << "{"; for (int i = 0; i < ENC_NEW.get_enc_count(); i++) P << "\\font\\thf" << u2str(i+1) << "=th" << styledef[j] << setw(2) << setfill('0') << i << " at#1pt"; P << "\\let\\laststyle\\" << styledef[j] << "s\\thfa}%" << endl; } P << " \\prevstyle" << endl; P << "}"; P << "\\let\\laststyle\\rms" << endl; P << "\\size[10]\\ss" << endl; P << "\\def\\mainfont{\\thfa}" << endl; } P << "\\ifx\\TeXXeTstate\\undefined" << endl; P << " \\let\\beginR\\relax" << endl; P << " \\let\\endR\\relax" << endl; P << " \\def\\TeXXeTstate=#1{\\def\\blbost{}}" << endl; // for using \global\TeXXeTstate P << "\\fi" << endl; P.close(); } #ifdef NOTHERION #ifndef NOMAIN int main () { //cout << "xl2 " << get_enc_index("xl2") << endl; return(0); } #endif #endif // obsolete: // else if (wc == 60) { // special <.> string formatting // tmp = ""; // I++; // while (I != s.end() && (wc = *I) != 62 && wc < 128) { // tmp += char(wc); // I++; // } // if (tmp == "br") T << "\\cr "; // else if (tmp == "center" || tmp == "left" || tmp == "right") ; // else if (tmp == "thsp") T << "\\thinspace "; // else T << "?"; // if (I == s.end()) break; // incorrect input (no closing `>') // continue; // } therion/thcsdata.h0000664000175000017500000024163512447661275013243 0ustar useruser/** * @file thcsdata.h * Coordinate systems data. * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #ifndef thcsdata_h #define thcsdata_h #include "thparse.h" /** * CS tokens. */ enum { TTCS_UNKNOWN = -2, TTCS_LOCAL = -1, TTCS_LONG_LAT, TTCS_LAT_LONG, TTCS_JTSK, TTCS_JTSK03, TTCS_IJTSK, TTCS_IJTSK03, TTCS_S_MERC, TTCS_EUR79Z30, TTCS_UTM1N, TTCS_UTM1S, TTCS_UTM2N, TTCS_UTM2S, TTCS_UTM3N, TTCS_UTM3S, TTCS_UTM4N, TTCS_UTM4S, TTCS_UTM5N, TTCS_UTM5S, TTCS_UTM6N, TTCS_UTM6S, TTCS_UTM7N, TTCS_UTM7S, TTCS_UTM8N, TTCS_UTM8S, TTCS_UTM9N, TTCS_UTM9S, TTCS_UTM10N, TTCS_UTM10S, TTCS_UTM11N, TTCS_UTM11S, TTCS_UTM12N, TTCS_UTM12S, TTCS_UTM13N, TTCS_UTM13S, TTCS_UTM14N, TTCS_UTM14S, TTCS_UTM15N, TTCS_UTM15S, TTCS_UTM16N, TTCS_UTM16S, TTCS_UTM17N, TTCS_UTM17S, TTCS_UTM18N, TTCS_UTM18S, TTCS_UTM19N, TTCS_UTM19S, TTCS_UTM20N, TTCS_UTM20S, TTCS_UTM21N, TTCS_UTM21S, TTCS_UTM22N, TTCS_UTM22S, TTCS_UTM23N, TTCS_UTM23S, TTCS_UTM24N, TTCS_UTM24S, TTCS_UTM25N, TTCS_UTM25S, TTCS_UTM26N, TTCS_UTM26S, TTCS_UTM27N, TTCS_UTM27S, TTCS_UTM28N, TTCS_UTM28S, TTCS_UTM29N, TTCS_UTM29S, TTCS_UTM30N, TTCS_UTM30S, TTCS_UTM31N, TTCS_UTM31S, TTCS_UTM32N, TTCS_UTM32S, TTCS_UTM33N, TTCS_UTM33S, TTCS_UTM34N, TTCS_UTM34S, TTCS_UTM35N, TTCS_UTM35S, TTCS_UTM36N, TTCS_UTM36S, TTCS_UTM37N, TTCS_UTM37S, TTCS_UTM38N, TTCS_UTM38S, TTCS_UTM39N, TTCS_UTM39S, TTCS_UTM40N, TTCS_UTM40S, TTCS_UTM41N, TTCS_UTM41S, TTCS_UTM42N, TTCS_UTM42S, TTCS_UTM43N, TTCS_UTM43S, TTCS_UTM44N, TTCS_UTM44S, TTCS_UTM45N, TTCS_UTM45S, TTCS_UTM46N, TTCS_UTM46S, TTCS_UTM47N, TTCS_UTM47S, TTCS_UTM48N, TTCS_UTM48S, TTCS_UTM49N, TTCS_UTM49S, TTCS_UTM50N, TTCS_UTM50S, TTCS_UTM51N, TTCS_UTM51S, TTCS_UTM52N, TTCS_UTM52S, TTCS_UTM53N, TTCS_UTM53S, TTCS_UTM54N, TTCS_UTM54S, TTCS_UTM55N, TTCS_UTM55S, TTCS_UTM56N, TTCS_UTM56S, TTCS_UTM57N, TTCS_UTM57S, TTCS_UTM58N, TTCS_UTM58S, TTCS_UTM59N, TTCS_UTM59S, TTCS_UTM60N, TTCS_UTM60S, TTCS_OSGB_SV, TTCS_OSGB_SW, TTCS_OSGB_SX, TTCS_OSGB_SY, TTCS_OSGB_SZ, TTCS_OSGB_SQ, TTCS_OSGB_SR, TTCS_OSGB_SS, TTCS_OSGB_ST, TTCS_OSGB_SU, TTCS_OSGB_SL, TTCS_OSGB_SM, TTCS_OSGB_SN, TTCS_OSGB_SO, TTCS_OSGB_SP, TTCS_OSGB_SF, TTCS_OSGB_SG, TTCS_OSGB_SH, TTCS_OSGB_SJ, TTCS_OSGB_SK, TTCS_OSGB_SA, TTCS_OSGB_SB, TTCS_OSGB_SC, TTCS_OSGB_SD, TTCS_OSGB_SE, TTCS_OSGB_TV, TTCS_OSGB_TW, TTCS_OSGB_TX, TTCS_OSGB_TY, TTCS_OSGB_TZ, TTCS_OSGB_TQ, TTCS_OSGB_TR, TTCS_OSGB_TS, TTCS_OSGB_TT, TTCS_OSGB_TU, TTCS_OSGB_TL, TTCS_OSGB_TM, TTCS_OSGB_TN, TTCS_OSGB_TO, TTCS_OSGB_TP, TTCS_OSGB_TF, TTCS_OSGB_TG, TTCS_OSGB_TH, TTCS_OSGB_TJ, TTCS_OSGB_TK, TTCS_OSGB_TA, TTCS_OSGB_TB, TTCS_OSGB_TC, TTCS_OSGB_TD, TTCS_OSGB_TE, TTCS_OSGB_NV, TTCS_OSGB_NW, TTCS_OSGB_NX, TTCS_OSGB_NY, TTCS_OSGB_NZ, TTCS_OSGB_NQ, TTCS_OSGB_NR, TTCS_OSGB_NS, TTCS_OSGB_NT, TTCS_OSGB_NU, TTCS_OSGB_NL, TTCS_OSGB_NM, TTCS_OSGB_NN, TTCS_OSGB_NO, TTCS_OSGB_NP, TTCS_OSGB_NF, TTCS_OSGB_NG, TTCS_OSGB_NH, TTCS_OSGB_NJ, TTCS_OSGB_NK, TTCS_OSGB_NA, TTCS_OSGB_NB, TTCS_OSGB_NC, TTCS_OSGB_ND, TTCS_OSGB_NE, TTCS_OSGB_OV, TTCS_OSGB_OW, TTCS_OSGB_OX, TTCS_OSGB_OY, TTCS_OSGB_OZ, TTCS_OSGB_OQ, TTCS_OSGB_OR, TTCS_OSGB_OS, TTCS_OSGB_OT, TTCS_OSGB_OU, TTCS_OSGB_OL, TTCS_OSGB_OM, TTCS_OSGB_ON, TTCS_OSGB_OO, TTCS_OSGB_OP, TTCS_OSGB_OF, TTCS_OSGB_OG, TTCS_OSGB_OH, TTCS_OSGB_OJ, TTCS_OSGB_OK, TTCS_OSGB_OA, TTCS_OSGB_OB, TTCS_OSGB_OC, TTCS_OSGB_OD, TTCS_OSGB_OE, TTCS_OSGB_HV, TTCS_OSGB_HW, TTCS_OSGB_HX, TTCS_OSGB_HY, TTCS_OSGB_HZ, TTCS_OSGB_HQ, TTCS_OSGB_HR, TTCS_OSGB_HS, TTCS_OSGB_HT, TTCS_OSGB_HU, TTCS_OSGB_HL, TTCS_OSGB_HM, TTCS_OSGB_HN, TTCS_OSGB_HO, TTCS_OSGB_HP, TTCS_OSGB_HF, TTCS_OSGB_HG, TTCS_OSGB_HH, TTCS_OSGB_HJ, TTCS_OSGB_HK, TTCS_OSGB_HA, TTCS_OSGB_HB, TTCS_OSGB_HC, TTCS_OSGB_HD, TTCS_OSGB_HE, TTCS_EPSG_3819, TTCS_EPSG_3821, TTCS_EPSG_3824, TTCS_EPSG_3906, TTCS_EPSG_4001, TTCS_EPSG_4002, TTCS_EPSG_4005, TTCS_EPSG_4006, TTCS_EPSG_4007, TTCS_EPSG_4008, TTCS_EPSG_4009, TTCS_EPSG_4010, TTCS_EPSG_4011, TTCS_EPSG_4012, TTCS_EPSG_4013, TTCS_EPSG_4014, TTCS_EPSG_4015, TTCS_EPSG_4016, TTCS_EPSG_4018, TTCS_EPSG_4019, TTCS_EPSG_4020, TTCS_EPSG_4021, TTCS_EPSG_4022, TTCS_EPSG_4024, TTCS_EPSG_4025, TTCS_EPSG_4027, TTCS_EPSG_4028, TTCS_EPSG_4029, TTCS_EPSG_4030, TTCS_EPSG_4032, TTCS_EPSG_4033, TTCS_EPSG_4034, TTCS_EPSG_4035, TTCS_EPSG_4036, TTCS_EPSG_4041, TTCS_EPSG_4042, TTCS_EPSG_4043, TTCS_EPSG_4044, TTCS_EPSG_4045, TTCS_EPSG_4047, TTCS_EPSG_4052, TTCS_EPSG_4053, TTCS_EPSG_4054, TTCS_EPSG_4055, TTCS_EPSG_4121, TTCS_EPSG_4125, TTCS_EPSG_4130, TTCS_EPSG_4133, TTCS_EPSG_4139, TTCS_EPSG_4141, TTCS_EPSG_4142, TTCS_EPSG_4143, TTCS_EPSG_4146, TTCS_EPSG_4147, TTCS_EPSG_4148, TTCS_EPSG_4149, TTCS_EPSG_4153, TTCS_EPSG_4155, TTCS_EPSG_4161, TTCS_EPSG_4164, TTCS_EPSG_4165, TTCS_EPSG_4169, TTCS_EPSG_4175, TTCS_EPSG_4181, TTCS_EPSG_4183, TTCS_EPSG_4184, TTCS_EPSG_4188, TTCS_EPSG_4192, TTCS_EPSG_4193, TTCS_EPSG_4195, TTCS_EPSG_4196, TTCS_EPSG_4200, TTCS_EPSG_4205, TTCS_EPSG_4212, TTCS_EPSG_4213, TTCS_EPSG_4218, TTCS_EPSG_4219, TTCS_EPSG_4223, TTCS_EPSG_4225, TTCS_EPSG_4233, TTCS_EPSG_4236, TTCS_EPSG_4239, TTCS_EPSG_4244, TTCS_EPSG_4245, TTCS_EPSG_4246, TTCS_EPSG_4247, TTCS_EPSG_4250, TTCS_EPSG_4251, TTCS_EPSG_4255, TTCS_EPSG_4256, TTCS_EPSG_4257, TTCS_EPSG_4260, TTCS_EPSG_4261, TTCS_EPSG_4262, TTCS_EPSG_4264, TTCS_EPSG_4267, TTCS_EPSG_4269, TTCS_EPSG_4272, TTCS_EPSG_4273, TTCS_EPSG_4275, TTCS_EPSG_4277, TTCS_EPSG_4281, TTCS_EPSG_4287, TTCS_EPSG_4292, TTCS_EPSG_4297, TTCS_EPSG_4299, TTCS_EPSG_4304, TTCS_EPSG_4309, TTCS_EPSG_4311, TTCS_EPSG_4312, TTCS_EPSG_4313, TTCS_EPSG_4314, TTCS_EPSG_4315, TTCS_EPSG_4318, TTCS_EPSG_4324, TTCS_EPSG_4326, TTCS_EPSG_4602, TTCS_EPSG_4603, TTCS_EPSG_4604, TTCS_EPSG_4606, TTCS_EPSG_4607, TTCS_EPSG_4610, TTCS_EPSG_4611, TTCS_EPSG_4614, TTCS_EPSG_4615, TTCS_EPSG_4620, TTCS_EPSG_4621, TTCS_EPSG_4623, TTCS_EPSG_4624, TTCS_EPSG_4628, TTCS_EPSG_4631, TTCS_EPSG_4632, TTCS_EPSG_4635, TTCS_EPSG_4636, TTCS_EPSG_4637, TTCS_EPSG_4638, TTCS_EPSG_4643, TTCS_EPSG_4645, TTCS_EPSG_4657, TTCS_EPSG_4658, TTCS_EPSG_4660, TTCS_EPSG_4668, TTCS_EPSG_4672, TTCS_EPSG_4673, TTCS_EPSG_4675, TTCS_EPSG_4678, TTCS_EPSG_4679, TTCS_EPSG_4680, TTCS_EPSG_4683, TTCS_EPSG_4688, TTCS_EPSG_4691, TTCS_EPSG_4692, TTCS_EPSG_4693, TTCS_EPSG_4695, TTCS_EPSG_4699, TTCS_EPSG_4701, TTCS_EPSG_4706, TTCS_EPSG_4707, TTCS_EPSG_4708, TTCS_EPSG_4709, TTCS_EPSG_4710, TTCS_EPSG_4711, TTCS_EPSG_4712, TTCS_EPSG_4713, TTCS_EPSG_4714, TTCS_EPSG_4715, TTCS_EPSG_4716, TTCS_EPSG_4717, TTCS_EPSG_4719, TTCS_EPSG_4721, TTCS_EPSG_4722, TTCS_EPSG_4723, TTCS_EPSG_4724, TTCS_EPSG_4725, TTCS_EPSG_4728, TTCS_EPSG_4729, TTCS_EPSG_4730, TTCS_EPSG_4731, TTCS_EPSG_4732, TTCS_EPSG_4733, TTCS_EPSG_4734, TTCS_EPSG_4735, TTCS_EPSG_4736, TTCS_EPSG_4739, TTCS_EPSG_4740, TTCS_EPSG_4743, TTCS_EPSG_4748, TTCS_EPSG_4750, TTCS_EPSG_4751, TTCS_EPSG_4754, TTCS_EPSG_4801, TTCS_EPSG_4802, TTCS_EPSG_4803, TTCS_EPSG_4804, TTCS_EPSG_4805, TTCS_EPSG_4806, TTCS_EPSG_4807, TTCS_EPSG_4808, TTCS_EPSG_4809, TTCS_EPSG_4810, TTCS_EPSG_4811, TTCS_EPSG_4814, TTCS_EPSG_4815, TTCS_EPSG_4816, TTCS_EPSG_4817, TTCS_EPSG_4819, TTCS_EPSG_4901, TTCS_EPSG_4902, TTCS_EPSG_4903, TTCS_EPSG_4904, TTCS_EPSG_2000, TTCS_EPSG_2002, TTCS_EPSG_2003, TTCS_EPSG_2004, TTCS_EPSG_2006, TTCS_EPSG_2007, TTCS_EPSG_2008, TTCS_EPSG_2009, TTCS_EPSG_2010, TTCS_EPSG_2011, TTCS_EPSG_2012, TTCS_EPSG_2013, TTCS_EPSG_2014, TTCS_EPSG_2015, TTCS_EPSG_2016, TTCS_EPSG_2020, TTCS_EPSG_2021, TTCS_EPSG_2022, TTCS_EPSG_2023, TTCS_EPSG_2024, TTCS_EPSG_2025, TTCS_EPSG_2026, TTCS_EPSG_2027, TTCS_EPSG_2028, TTCS_EPSG_2029, TTCS_EPSG_2030, TTCS_EPSG_2033, TTCS_EPSG_2034, TTCS_EPSG_2035, TTCS_EPSG_2036, TTCS_EPSG_2037, TTCS_EPSG_2038, TTCS_EPSG_2039, TTCS_EPSG_2040, TTCS_EPSG_2041, TTCS_EPSG_2042, TTCS_EPSG_2043, TTCS_EPSG_2044, TTCS_EPSG_2045, TTCS_EPSG_2056, TTCS_EPSG_2057, TTCS_EPSG_2058, TTCS_EPSG_2059, TTCS_EPSG_2060, TTCS_EPSG_2061, TTCS_EPSG_2062, TTCS_EPSG_2063, TTCS_EPSG_2064, TTCS_EPSG_2065, TTCS_EPSG_2066, TTCS_EPSG_2067, TTCS_EPSG_2068, TTCS_EPSG_2069, TTCS_EPSG_2070, TTCS_EPSG_2071, TTCS_EPSG_2072, TTCS_EPSG_2073, TTCS_EPSG_2074, TTCS_EPSG_2075, TTCS_EPSG_2076, TTCS_EPSG_2077, TTCS_EPSG_2078, TTCS_EPSG_2079, TTCS_EPSG_2080, TTCS_EPSG_2081, TTCS_EPSG_2082, TTCS_EPSG_2084, TTCS_EPSG_2085, TTCS_EPSG_2086, TTCS_EPSG_2087, TTCS_EPSG_2088, TTCS_EPSG_2089, TTCS_EPSG_2090, TTCS_EPSG_2091, TTCS_EPSG_2092, TTCS_EPSG_2093, TTCS_EPSG_2094, TTCS_EPSG_2095, TTCS_EPSG_2096, TTCS_EPSG_2097, TTCS_EPSG_2098, TTCS_EPSG_2099, TTCS_EPSG_2100, TTCS_EPSG_2101, TTCS_EPSG_2102, TTCS_EPSG_2103, TTCS_EPSG_2104, TTCS_EPSG_2105, TTCS_EPSG_2106, TTCS_EPSG_2107, TTCS_EPSG_2108, TTCS_EPSG_2109, TTCS_EPSG_2110, TTCS_EPSG_2111, TTCS_EPSG_2112, TTCS_EPSG_2113, TTCS_EPSG_2114, TTCS_EPSG_2115, TTCS_EPSG_2116, TTCS_EPSG_2117, TTCS_EPSG_2118, TTCS_EPSG_2119, TTCS_EPSG_2120, TTCS_EPSG_2121, TTCS_EPSG_2122, TTCS_EPSG_2123, TTCS_EPSG_2124, TTCS_EPSG_2125, TTCS_EPSG_2126, TTCS_EPSG_2127, TTCS_EPSG_2128, TTCS_EPSG_2129, TTCS_EPSG_2130, TTCS_EPSG_2131, TTCS_EPSG_2132, TTCS_EPSG_2133, TTCS_EPSG_2134, TTCS_EPSG_2135, TTCS_EPSG_2136, TTCS_EPSG_2137, TTCS_EPSG_2138, TTCS_EPSG_2139, TTCS_EPSG_2140, TTCS_EPSG_2141, TTCS_EPSG_2142, TTCS_EPSG_2143, TTCS_EPSG_2144, TTCS_EPSG_2145, TTCS_EPSG_2146, TTCS_EPSG_2147, TTCS_EPSG_2148, TTCS_EPSG_2149, TTCS_EPSG_2150, TTCS_EPSG_2151, TTCS_EPSG_2152, TTCS_EPSG_2153, TTCS_EPSG_2154, TTCS_EPSG_2155, TTCS_EPSG_2156, TTCS_EPSG_2157, TTCS_EPSG_2158, TTCS_EPSG_2159, TTCS_EPSG_2160, TTCS_EPSG_2161, TTCS_EPSG_2162, TTCS_EPSG_2163, TTCS_EPSG_2164, TTCS_EPSG_2165, TTCS_EPSG_2166, TTCS_EPSG_2167, TTCS_EPSG_2168, TTCS_EPSG_2169, TTCS_EPSG_2170, TTCS_EPSG_2171, TTCS_EPSG_2172, TTCS_EPSG_2173, TTCS_EPSG_2174, TTCS_EPSG_2175, TTCS_EPSG_2176, TTCS_EPSG_2177, TTCS_EPSG_2178, TTCS_EPSG_2179, TTCS_EPSG_2180, TTCS_EPSG_2188, TTCS_EPSG_2189, TTCS_EPSG_2190, TTCS_EPSG_2191, TTCS_EPSG_2192, TTCS_EPSG_2193, TTCS_EPSG_2194, TTCS_EPSG_2195, TTCS_EPSG_2196, TTCS_EPSG_2197, TTCS_EPSG_2198, TTCS_EPSG_2199, TTCS_EPSG_2200, TTCS_EPSG_2204, TTCS_EPSG_2205, TTCS_EPSG_2206, TTCS_EPSG_2207, TTCS_EPSG_2208, TTCS_EPSG_2209, TTCS_EPSG_2210, TTCS_EPSG_2211, TTCS_EPSG_2212, TTCS_EPSG_2213, TTCS_EPSG_2214, TTCS_EPSG_2215, TTCS_EPSG_2216, TTCS_EPSG_2217, TTCS_EPSG_2219, TTCS_EPSG_2220, TTCS_EPSG_2222, TTCS_EPSG_2223, TTCS_EPSG_2224, TTCS_EPSG_2225, TTCS_EPSG_2226, TTCS_EPSG_2227, TTCS_EPSG_2228, TTCS_EPSG_2229, TTCS_EPSG_2230, TTCS_EPSG_2231, TTCS_EPSG_2232, TTCS_EPSG_2233, TTCS_EPSG_2234, TTCS_EPSG_2235, TTCS_EPSG_2236, TTCS_EPSG_2237, TTCS_EPSG_2238, TTCS_EPSG_2239, TTCS_EPSG_2240, TTCS_EPSG_2241, TTCS_EPSG_2242, TTCS_EPSG_2243, TTCS_EPSG_2244, TTCS_EPSG_2245, TTCS_EPSG_2246, TTCS_EPSG_2247, TTCS_EPSG_2248, TTCS_EPSG_2249, TTCS_EPSG_2250, TTCS_EPSG_2251, TTCS_EPSG_2252, TTCS_EPSG_2253, TTCS_EPSG_2254, TTCS_EPSG_2255, TTCS_EPSG_2256, TTCS_EPSG_2257, TTCS_EPSG_2258, TTCS_EPSG_2259, TTCS_EPSG_2260, TTCS_EPSG_2261, TTCS_EPSG_2262, TTCS_EPSG_2263, TTCS_EPSG_2264, TTCS_EPSG_2265, TTCS_EPSG_2266, TTCS_EPSG_2267, TTCS_EPSG_2268, TTCS_EPSG_2269, TTCS_EPSG_2270, TTCS_EPSG_2271, TTCS_EPSG_2272, TTCS_EPSG_2273, TTCS_EPSG_2274, TTCS_EPSG_2275, TTCS_EPSG_2276, TTCS_EPSG_2277, TTCS_EPSG_2278, TTCS_EPSG_2279, TTCS_EPSG_2280, TTCS_EPSG_2281, TTCS_EPSG_2282, TTCS_EPSG_2283, TTCS_EPSG_2284, TTCS_EPSG_2285, TTCS_EPSG_2286, TTCS_EPSG_2287, TTCS_EPSG_2288, TTCS_EPSG_2289, TTCS_EPSG_2290, TTCS_EPSG_2291, TTCS_EPSG_2292, TTCS_EPSG_2294, TTCS_EPSG_2295, TTCS_EPSG_2308, TTCS_EPSG_2309, TTCS_EPSG_2310, TTCS_EPSG_2311, TTCS_EPSG_2312, TTCS_EPSG_2314, TTCS_EPSG_2316, TTCS_EPSG_2317, TTCS_EPSG_2318, TTCS_EPSG_2319, TTCS_EPSG_2320, TTCS_EPSG_2321, TTCS_EPSG_2322, TTCS_EPSG_2323, TTCS_EPSG_2324, TTCS_EPSG_2325, TTCS_EPSG_2326, TTCS_EPSG_2327, TTCS_EPSG_2328, TTCS_EPSG_2329, TTCS_EPSG_2330, TTCS_EPSG_2331, TTCS_EPSG_2332, TTCS_EPSG_2333, TTCS_EPSG_2334, TTCS_EPSG_2335, TTCS_EPSG_2336, TTCS_EPSG_2337, TTCS_EPSG_2338, TTCS_EPSG_2339, TTCS_EPSG_2340, TTCS_EPSG_2341, TTCS_EPSG_2342, TTCS_EPSG_2343, TTCS_EPSG_2344, TTCS_EPSG_2345, TTCS_EPSG_2346, TTCS_EPSG_2347, TTCS_EPSG_2348, TTCS_EPSG_2349, TTCS_EPSG_2350, TTCS_EPSG_2351, TTCS_EPSG_2352, TTCS_EPSG_2353, TTCS_EPSG_2354, TTCS_EPSG_2355, TTCS_EPSG_2356, TTCS_EPSG_2357, TTCS_EPSG_2358, TTCS_EPSG_2359, TTCS_EPSG_2360, TTCS_EPSG_2361, TTCS_EPSG_2362, TTCS_EPSG_2363, TTCS_EPSG_2364, TTCS_EPSG_2365, TTCS_EPSG_2366, TTCS_EPSG_2367, TTCS_EPSG_2368, TTCS_EPSG_2369, TTCS_EPSG_2371, TTCS_EPSG_2373, TTCS_EPSG_2375, TTCS_EPSG_2377, TTCS_EPSG_2379, TTCS_EPSG_2381, TTCS_EPSG_2383, TTCS_EPSG_2385, TTCS_EPSG_2387, TTCS_EPSG_2389, TTCS_EPSG_2391, TTCS_EPSG_2392, TTCS_EPSG_2393, TTCS_EPSG_2394, TTCS_EPSG_2400, TTCS_EPSG_2401, TTCS_EPSG_2402, TTCS_EPSG_2403, TTCS_EPSG_2404, TTCS_EPSG_2405, TTCS_EPSG_2406, TTCS_EPSG_2407, TTCS_EPSG_2408, TTCS_EPSG_2409, TTCS_EPSG_2410, TTCS_EPSG_2411, TTCS_EPSG_2412, TTCS_EPSG_2413, TTCS_EPSG_2414, TTCS_EPSG_2415, TTCS_EPSG_2416, TTCS_EPSG_2417, TTCS_EPSG_2418, TTCS_EPSG_2419, TTCS_EPSG_2420, TTCS_EPSG_2421, TTCS_EPSG_2422, TTCS_EPSG_2423, TTCS_EPSG_2424, TTCS_EPSG_2425, TTCS_EPSG_2426, TTCS_EPSG_2427, TTCS_EPSG_2428, TTCS_EPSG_2429, TTCS_EPSG_2430, TTCS_EPSG_2431, TTCS_EPSG_2432, TTCS_EPSG_2433, TTCS_EPSG_2434, TTCS_EPSG_2435, TTCS_EPSG_2436, TTCS_EPSG_2437, TTCS_EPSG_2438, TTCS_EPSG_2439, TTCS_EPSG_2440, TTCS_EPSG_2441, TTCS_EPSG_2442, TTCS_EPSG_2443, TTCS_EPSG_2444, TTCS_EPSG_2445, TTCS_EPSG_2446, TTCS_EPSG_2447, TTCS_EPSG_2448, TTCS_EPSG_2449, TTCS_EPSG_2450, TTCS_EPSG_2451, TTCS_EPSG_2452, TTCS_EPSG_2453, TTCS_EPSG_2454, TTCS_EPSG_2455, TTCS_EPSG_2456, TTCS_EPSG_2457, TTCS_EPSG_2458, TTCS_EPSG_2459, TTCS_EPSG_2460, TTCS_EPSG_2461, TTCS_EPSG_2463, TTCS_EPSG_2464, TTCS_EPSG_2465, TTCS_EPSG_2466, TTCS_EPSG_2467, TTCS_EPSG_2468, TTCS_EPSG_2469, TTCS_EPSG_2470, TTCS_EPSG_2471, TTCS_EPSG_2472, TTCS_EPSG_2473, TTCS_EPSG_2474, TTCS_EPSG_2475, TTCS_EPSG_2476, TTCS_EPSG_2477, TTCS_EPSG_2478, TTCS_EPSG_2479, TTCS_EPSG_2480, TTCS_EPSG_2481, TTCS_EPSG_2482, TTCS_EPSG_2483, TTCS_EPSG_2484, TTCS_EPSG_2485, TTCS_EPSG_2486, TTCS_EPSG_2487, TTCS_EPSG_2488, TTCS_EPSG_2489, TTCS_EPSG_2490, TTCS_EPSG_2491, TTCS_EPSG_2492, TTCS_EPSG_2493, TTCS_EPSG_2494, TTCS_EPSG_2495, TTCS_EPSG_2496, TTCS_EPSG_2497, TTCS_EPSG_2498, TTCS_EPSG_2499, TTCS_EPSG_2500, TTCS_EPSG_2501, TTCS_EPSG_2502, TTCS_EPSG_2514, TTCS_EPSG_2515, TTCS_EPSG_2516, TTCS_EPSG_2517, TTCS_EPSG_2518, TTCS_EPSG_2519, TTCS_EPSG_2520, TTCS_EPSG_2521, TTCS_EPSG_2522, TTCS_EPSG_2523, TTCS_EPSG_2524, TTCS_EPSG_2525, TTCS_EPSG_2526, TTCS_EPSG_2527, TTCS_EPSG_2528, TTCS_EPSG_2529, TTCS_EPSG_2530, TTCS_EPSG_2531, TTCS_EPSG_2532, TTCS_EPSG_2533, TTCS_EPSG_2534, TTCS_EPSG_2535, TTCS_EPSG_2536, TTCS_EPSG_2537, TTCS_EPSG_2538, TTCS_EPSG_2539, TTCS_EPSG_2540, TTCS_EPSG_2550, TTCS_EPSG_2563, TTCS_EPSG_2564, TTCS_EPSG_2565, TTCS_EPSG_2566, TTCS_EPSG_2567, TTCS_EPSG_2568, TTCS_EPSG_2569, TTCS_EPSG_2570, TTCS_EPSG_2571, TTCS_EPSG_2572, TTCS_EPSG_2573, TTCS_EPSG_2574, TTCS_EPSG_2575, TTCS_EPSG_2576, TTCS_EPSG_2577, TTCS_EPSG_2578, TTCS_EPSG_2579, TTCS_EPSG_2580, TTCS_EPSG_2581, TTCS_EPSG_2583, TTCS_EPSG_2585, TTCS_EPSG_2587, TTCS_EPSG_2589, TTCS_EPSG_2591, TTCS_EPSG_2593, TTCS_EPSG_2595, TTCS_EPSG_2597, TTCS_EPSG_2599, TTCS_EPSG_2600, TTCS_EPSG_2622, TTCS_EPSG_2624, TTCS_EPSG_2626, TTCS_EPSG_2628, TTCS_EPSG_2630, TTCS_EPSG_2632, TTCS_EPSG_2634, TTCS_EPSG_2636, TTCS_EPSG_2638, TTCS_EPSG_2640, TTCS_EPSG_2641, TTCS_EPSG_2642, TTCS_EPSG_2643, TTCS_EPSG_2644, TTCS_EPSG_2645, TTCS_EPSG_2646, TTCS_EPSG_2647, TTCS_EPSG_2648, TTCS_EPSG_2649, TTCS_EPSG_2650, TTCS_EPSG_2651, TTCS_EPSG_2652, TTCS_EPSG_2653, TTCS_EPSG_2654, TTCS_EPSG_2655, TTCS_EPSG_2656, TTCS_EPSG_2657, TTCS_EPSG_2658, TTCS_EPSG_2659, TTCS_EPSG_2660, TTCS_EPSG_2661, TTCS_EPSG_2662, TTCS_EPSG_2663, TTCS_EPSG_2664, TTCS_EPSG_2665, TTCS_EPSG_2666, TTCS_EPSG_2667, TTCS_EPSG_2668, TTCS_EPSG_2669, TTCS_EPSG_2670, TTCS_EPSG_2671, TTCS_EPSG_2672, TTCS_EPSG_2673, TTCS_EPSG_2674, TTCS_EPSG_2675, TTCS_EPSG_2676, TTCS_EPSG_2677, TTCS_EPSG_2678, TTCS_EPSG_2679, TTCS_EPSG_2680, TTCS_EPSG_2681, TTCS_EPSG_2682, TTCS_EPSG_2683, TTCS_EPSG_2684, TTCS_EPSG_2685, TTCS_EPSG_2686, TTCS_EPSG_2687, TTCS_EPSG_2688, TTCS_EPSG_2689, TTCS_EPSG_2690, TTCS_EPSG_2691, TTCS_EPSG_2692, TTCS_EPSG_2693, TTCS_EPSG_2694, TTCS_EPSG_2695, TTCS_EPSG_2696, TTCS_EPSG_2697, TTCS_EPSG_2698, TTCS_EPSG_2700, TTCS_EPSG_2702, TTCS_EPSG_2704, TTCS_EPSG_2706, TTCS_EPSG_2708, TTCS_EPSG_2710, TTCS_EPSG_2712, TTCS_EPSG_2714, TTCS_EPSG_2716, TTCS_EPSG_2718, TTCS_EPSG_2720, TTCS_EPSG_2722, TTCS_EPSG_2724, TTCS_EPSG_2726, TTCS_EPSG_2728, TTCS_EPSG_2730, TTCS_EPSG_2732, TTCS_EPSG_2734, TTCS_EPSG_2736, TTCS_EPSG_2737, TTCS_EPSG_2738, TTCS_EPSG_2740, TTCS_EPSG_2742, TTCS_EPSG_2744, TTCS_EPSG_2746, TTCS_EPSG_2748, TTCS_EPSG_2750, TTCS_EPSG_2752, TTCS_EPSG_2754, TTCS_EPSG_2756, TTCS_EPSG_2758, TTCS_EPSG_2759, TTCS_EPSG_2760, TTCS_EPSG_2761, TTCS_EPSG_2762, TTCS_EPSG_2763, TTCS_EPSG_2764, TTCS_EPSG_2765, TTCS_EPSG_2766, TTCS_EPSG_2767, TTCS_EPSG_2768, TTCS_EPSG_2769, TTCS_EPSG_2770, TTCS_EPSG_2771, TTCS_EPSG_2772, TTCS_EPSG_2773, TTCS_EPSG_2774, TTCS_EPSG_2775, TTCS_EPSG_2776, TTCS_EPSG_2777, TTCS_EPSG_2778, TTCS_EPSG_2779, TTCS_EPSG_2780, TTCS_EPSG_2781, TTCS_EPSG_2782, TTCS_EPSG_2783, TTCS_EPSG_2784, TTCS_EPSG_2785, TTCS_EPSG_2786, TTCS_EPSG_2787, TTCS_EPSG_2788, TTCS_EPSG_2789, TTCS_EPSG_2790, TTCS_EPSG_2791, TTCS_EPSG_2792, TTCS_EPSG_2793, TTCS_EPSG_2794, TTCS_EPSG_2795, TTCS_EPSG_2796, TTCS_EPSG_2797, TTCS_EPSG_2798, TTCS_EPSG_2799, TTCS_EPSG_2800, TTCS_EPSG_2801, TTCS_EPSG_2802, TTCS_EPSG_2803, TTCS_EPSG_2804, TTCS_EPSG_2805, TTCS_EPSG_2806, TTCS_EPSG_2807, TTCS_EPSG_2808, TTCS_EPSG_2809, TTCS_EPSG_2810, TTCS_EPSG_2811, TTCS_EPSG_2812, TTCS_EPSG_2813, TTCS_EPSG_2814, TTCS_EPSG_2815, TTCS_EPSG_2816, TTCS_EPSG_2817, TTCS_EPSG_2818, TTCS_EPSG_2819, TTCS_EPSG_2820, TTCS_EPSG_2821, TTCS_EPSG_2822, TTCS_EPSG_2823, TTCS_EPSG_2824, TTCS_EPSG_2825, TTCS_EPSG_2826, TTCS_EPSG_2827, TTCS_EPSG_2829, TTCS_EPSG_2830, TTCS_EPSG_2831, TTCS_EPSG_2832, TTCS_EPSG_2833, TTCS_EPSG_2834, TTCS_EPSG_2835, TTCS_EPSG_2836, TTCS_EPSG_2837, TTCS_EPSG_2838, TTCS_EPSG_2839, TTCS_EPSG_2840, TTCS_EPSG_2841, TTCS_EPSG_2842, TTCS_EPSG_2843, TTCS_EPSG_2844, TTCS_EPSG_2845, TTCS_EPSG_2846, TTCS_EPSG_2847, TTCS_EPSG_2848, TTCS_EPSG_2849, TTCS_EPSG_2850, TTCS_EPSG_2851, TTCS_EPSG_2852, TTCS_EPSG_2853, TTCS_EPSG_2854, TTCS_EPSG_2855, TTCS_EPSG_2856, TTCS_EPSG_2857, TTCS_EPSG_2858, TTCS_EPSG_2859, TTCS_EPSG_2860, TTCS_EPSG_2861, TTCS_EPSG_2862, TTCS_EPSG_2863, TTCS_EPSG_2864, TTCS_EPSG_2865, TTCS_EPSG_2866, TTCS_EPSG_2867, TTCS_EPSG_2868, TTCS_EPSG_2869, TTCS_EPSG_2870, TTCS_EPSG_2871, TTCS_EPSG_2872, TTCS_EPSG_2873, TTCS_EPSG_2874, TTCS_EPSG_2875, TTCS_EPSG_2876, TTCS_EPSG_2877, TTCS_EPSG_2878, TTCS_EPSG_2879, TTCS_EPSG_2880, TTCS_EPSG_2881, TTCS_EPSG_2882, TTCS_EPSG_2883, TTCS_EPSG_2884, TTCS_EPSG_2885, TTCS_EPSG_2886, TTCS_EPSG_2887, TTCS_EPSG_2888, TTCS_EPSG_2889, TTCS_EPSG_2890, TTCS_EPSG_2891, TTCS_EPSG_2892, TTCS_EPSG_2893, TTCS_EPSG_2894, TTCS_EPSG_2895, TTCS_EPSG_2896, TTCS_EPSG_2897, TTCS_EPSG_2898, TTCS_EPSG_2899, TTCS_EPSG_2900, TTCS_EPSG_2901, TTCS_EPSG_2902, TTCS_EPSG_2903, TTCS_EPSG_2904, TTCS_EPSG_2905, TTCS_EPSG_2906, TTCS_EPSG_2907, TTCS_EPSG_2908, TTCS_EPSG_2909, TTCS_EPSG_2910, TTCS_EPSG_2911, TTCS_EPSG_2912, TTCS_EPSG_2913, TTCS_EPSG_2914, TTCS_EPSG_2915, TTCS_EPSG_2916, TTCS_EPSG_2917, TTCS_EPSG_2918, TTCS_EPSG_2919, TTCS_EPSG_2920, TTCS_EPSG_2921, TTCS_EPSG_2922, TTCS_EPSG_2923, TTCS_EPSG_2924, TTCS_EPSG_2925, TTCS_EPSG_2926, TTCS_EPSG_2927, TTCS_EPSG_2928, TTCS_EPSG_2929, TTCS_EPSG_2930, TTCS_EPSG_2931, TTCS_EPSG_2932, TTCS_EPSG_2933, TTCS_EPSG_2934, TTCS_EPSG_2935, TTCS_EPSG_2936, TTCS_EPSG_2937, TTCS_EPSG_2938, TTCS_EPSG_2939, TTCS_EPSG_2940, TTCS_EPSG_2941, TTCS_EPSG_2942, TTCS_EPSG_2944, TTCS_EPSG_2945, TTCS_EPSG_2946, TTCS_EPSG_2947, TTCS_EPSG_2948, TTCS_EPSG_2949, TTCS_EPSG_2950, TTCS_EPSG_2951, TTCS_EPSG_2952, TTCS_EPSG_2953, TTCS_EPSG_2954, TTCS_EPSG_2955, TTCS_EPSG_2956, TTCS_EPSG_2957, TTCS_EPSG_2958, TTCS_EPSG_2959, TTCS_EPSG_2960, TTCS_EPSG_2961, TTCS_EPSG_2962, TTCS_EPSG_2964, TTCS_EPSG_2965, TTCS_EPSG_2966, TTCS_EPSG_2967, TTCS_EPSG_2968, TTCS_EPSG_2969, TTCS_EPSG_2971, TTCS_EPSG_2972, TTCS_EPSG_2975, TTCS_EPSG_2976, TTCS_EPSG_2977, TTCS_EPSG_2978, TTCS_EPSG_2979, TTCS_EPSG_2980, TTCS_EPSG_2981, TTCS_EPSG_2983, TTCS_EPSG_2984, TTCS_EPSG_2987, TTCS_EPSG_2988, TTCS_EPSG_2989, TTCS_EPSG_2990, TTCS_EPSG_2991, TTCS_EPSG_2992, TTCS_EPSG_2993, TTCS_EPSG_2994, TTCS_EPSG_2997, TTCS_EPSG_2999, TTCS_EPSG_3000, TTCS_EPSG_3002, TTCS_EPSG_3003, TTCS_EPSG_3004, TTCS_EPSG_3005, TTCS_EPSG_3006, TTCS_EPSG_3007, TTCS_EPSG_3008, TTCS_EPSG_3009, TTCS_EPSG_3010, TTCS_EPSG_3011, TTCS_EPSG_3012, TTCS_EPSG_3013, TTCS_EPSG_3014, TTCS_EPSG_3015, TTCS_EPSG_3016, TTCS_EPSG_3017, TTCS_EPSG_3018, TTCS_EPSG_3019, TTCS_EPSG_3020, TTCS_EPSG_3022, TTCS_EPSG_3023, TTCS_EPSG_3024, TTCS_EPSG_3031, TTCS_EPSG_3032, TTCS_EPSG_3033, TTCS_EPSG_3034, TTCS_EPSG_3035, TTCS_EPSG_3036, TTCS_EPSG_3037, TTCS_EPSG_3038, TTCS_EPSG_3039, TTCS_EPSG_3040, TTCS_EPSG_3041, TTCS_EPSG_3042, TTCS_EPSG_3043, TTCS_EPSG_3044, TTCS_EPSG_3045, TTCS_EPSG_3046, TTCS_EPSG_3047, TTCS_EPSG_3048, TTCS_EPSG_3049, TTCS_EPSG_3050, TTCS_EPSG_3051, TTCS_EPSG_3054, TTCS_EPSG_3055, TTCS_EPSG_3056, TTCS_EPSG_3057, TTCS_EPSG_3058, TTCS_EPSG_3059, TTCS_EPSG_3062, TTCS_EPSG_3064, TTCS_EPSG_3065, TTCS_EPSG_3066, TTCS_EPSG_3068, TTCS_EPSG_3069, TTCS_EPSG_3070, TTCS_EPSG_3071, TTCS_EPSG_3072, TTCS_EPSG_3073, TTCS_EPSG_3074, TTCS_EPSG_3075, TTCS_EPSG_3076, TTCS_EPSG_3077, TTCS_EPSG_3078, TTCS_EPSG_3079, TTCS_EPSG_3080, TTCS_EPSG_3081, TTCS_EPSG_3082, TTCS_EPSG_3083, TTCS_EPSG_3084, TTCS_EPSG_3085, TTCS_EPSG_3086, TTCS_EPSG_3087, TTCS_EPSG_3088, TTCS_EPSG_3089, TTCS_EPSG_3090, TTCS_EPSG_3091, TTCS_EPSG_3092, TTCS_EPSG_3093, TTCS_EPSG_3094, TTCS_EPSG_3095, TTCS_EPSG_3096, TTCS_EPSG_3097, TTCS_EPSG_3098, TTCS_EPSG_3099, TTCS_EPSG_3100, TTCS_EPSG_3101, TTCS_EPSG_3102, TTCS_EPSG_3103, TTCS_EPSG_3104, TTCS_EPSG_3105, TTCS_EPSG_3106, TTCS_EPSG_3107, TTCS_EPSG_3108, TTCS_EPSG_3109, TTCS_EPSG_3110, TTCS_EPSG_3111, TTCS_EPSG_3112, TTCS_EPSG_3113, TTCS_EPSG_3114, TTCS_EPSG_3115, TTCS_EPSG_3116, TTCS_EPSG_3117, TTCS_EPSG_3118, TTCS_EPSG_3120, TTCS_EPSG_3121, TTCS_EPSG_3122, TTCS_EPSG_3123, TTCS_EPSG_3124, TTCS_EPSG_3125, TTCS_EPSG_3126, TTCS_EPSG_3127, TTCS_EPSG_3128, TTCS_EPSG_3129, TTCS_EPSG_3130, TTCS_EPSG_3131, TTCS_EPSG_3132, TTCS_EPSG_3133, TTCS_EPSG_3134, TTCS_EPSG_3135, TTCS_EPSG_3136, TTCS_EPSG_3137, TTCS_EPSG_3138, TTCS_EPSG_3140, TTCS_EPSG_3141, TTCS_EPSG_3142, TTCS_EPSG_3143, TTCS_EPSG_3146, TTCS_EPSG_3147, TTCS_EPSG_3148, TTCS_EPSG_3149, TTCS_EPSG_3150, TTCS_EPSG_3151, TTCS_EPSG_3152, TTCS_EPSG_3153, TTCS_EPSG_3154, TTCS_EPSG_3155, TTCS_EPSG_3156, TTCS_EPSG_3157, TTCS_EPSG_3158, TTCS_EPSG_3159, TTCS_EPSG_3160, TTCS_EPSG_3161, TTCS_EPSG_3162, TTCS_EPSG_3163, TTCS_EPSG_3164, TTCS_EPSG_3165, TTCS_EPSG_3166, TTCS_EPSG_3167, TTCS_EPSG_3168, TTCS_EPSG_3169, TTCS_EPSG_3172, TTCS_EPSG_3174, TTCS_EPSG_3175, TTCS_EPSG_3176, TTCS_EPSG_3177, TTCS_EPSG_3182, TTCS_EPSG_3183, TTCS_EPSG_3184, TTCS_EPSG_3185, TTCS_EPSG_3186, TTCS_EPSG_3187, TTCS_EPSG_3188, TTCS_EPSG_3190, TTCS_EPSG_3191, TTCS_EPSG_3192, TTCS_EPSG_3193, TTCS_EPSG_3194, TTCS_EPSG_3195, TTCS_EPSG_3196, TTCS_EPSG_3197, TTCS_EPSG_3198, TTCS_EPSG_3199, TTCS_EPSG_3200, TTCS_EPSG_3201, TTCS_EPSG_3202, TTCS_EPSG_3203, TTCS_EPSG_3204, TTCS_EPSG_3205, TTCS_EPSG_3206, TTCS_EPSG_3207, TTCS_EPSG_3208, TTCS_EPSG_3209, TTCS_EPSG_3210, TTCS_EPSG_3211, TTCS_EPSG_3212, TTCS_EPSG_3213, TTCS_EPSG_3214, TTCS_EPSG_3215, TTCS_EPSG_3216, TTCS_EPSG_3217, TTCS_EPSG_3218, TTCS_EPSG_3219, TTCS_EPSG_3220, TTCS_EPSG_3221, TTCS_EPSG_3222, TTCS_EPSG_3223, TTCS_EPSG_3224, TTCS_EPSG_3225, TTCS_EPSG_3226, TTCS_EPSG_3227, TTCS_EPSG_3228, TTCS_EPSG_3229, TTCS_EPSG_3230, TTCS_EPSG_3231, TTCS_EPSG_3232, TTCS_EPSG_3233, TTCS_EPSG_3234, TTCS_EPSG_3235, TTCS_EPSG_3236, TTCS_EPSG_3237, TTCS_EPSG_3238, TTCS_EPSG_3239, TTCS_EPSG_3240, TTCS_EPSG_3241, TTCS_EPSG_3242, TTCS_EPSG_3243, TTCS_EPSG_3244, TTCS_EPSG_3245, TTCS_EPSG_3246, TTCS_EPSG_3247, TTCS_EPSG_3248, TTCS_EPSG_3249, TTCS_EPSG_3250, TTCS_EPSG_3251, TTCS_EPSG_3252, TTCS_EPSG_3253, TTCS_EPSG_3254, TTCS_EPSG_3255, TTCS_EPSG_3256, TTCS_EPSG_3257, TTCS_EPSG_3258, TTCS_EPSG_3259, TTCS_EPSG_3260, TTCS_EPSG_3261, TTCS_EPSG_3262, TTCS_EPSG_3263, TTCS_EPSG_3264, TTCS_EPSG_3265, TTCS_EPSG_3266, TTCS_EPSG_3267, TTCS_EPSG_3268, TTCS_EPSG_3269, TTCS_EPSG_3270, TTCS_EPSG_3271, TTCS_EPSG_3272, TTCS_EPSG_3273, TTCS_EPSG_3274, TTCS_EPSG_3275, TTCS_EPSG_3276, TTCS_EPSG_3277, TTCS_EPSG_3278, TTCS_EPSG_3279, TTCS_EPSG_3280, TTCS_EPSG_3281, TTCS_EPSG_3282, TTCS_EPSG_3283, TTCS_EPSG_3284, TTCS_EPSG_3285, TTCS_EPSG_3286, TTCS_EPSG_3287, TTCS_EPSG_3288, TTCS_EPSG_3289, TTCS_EPSG_3290, TTCS_EPSG_3291, TTCS_EPSG_3292, TTCS_EPSG_3293, TTCS_EPSG_3294, TTCS_EPSG_3296, TTCS_EPSG_3297, TTCS_EPSG_3298, TTCS_EPSG_3299, TTCS_EPSG_3300, TTCS_EPSG_3301, TTCS_EPSG_3303, TTCS_EPSG_3304, TTCS_EPSG_3305, TTCS_EPSG_3306, TTCS_EPSG_3307, TTCS_EPSG_3308, TTCS_EPSG_3309, TTCS_EPSG_3310, TTCS_EPSG_3311, TTCS_EPSG_3312, TTCS_EPSG_3313, TTCS_EPSG_3314, TTCS_EPSG_3315, TTCS_EPSG_3316, TTCS_EPSG_3317, TTCS_EPSG_3318, TTCS_EPSG_3319, TTCS_EPSG_3320, TTCS_EPSG_3321, TTCS_EPSG_3322, TTCS_EPSG_3325, TTCS_EPSG_3326, TTCS_EPSG_3327, TTCS_EPSG_3328, TTCS_EPSG_3333, TTCS_EPSG_3335, TTCS_EPSG_3337, TTCS_EPSG_3338, TTCS_EPSG_3339, TTCS_EPSG_3340, TTCS_EPSG_3341, TTCS_EPSG_3342, TTCS_EPSG_3345, TTCS_EPSG_3347, TTCS_EPSG_3348, TTCS_EPSG_3349, TTCS_EPSG_3350, TTCS_EPSG_3351, TTCS_EPSG_3352, TTCS_EPSG_3353, TTCS_EPSG_3355, TTCS_EPSG_3356, TTCS_EPSG_3358, TTCS_EPSG_3359, TTCS_EPSG_3360, TTCS_EPSG_3361, TTCS_EPSG_3362, TTCS_EPSG_3363, TTCS_EPSG_3364, TTCS_EPSG_3365, TTCS_EPSG_3366, TTCS_EPSG_3370, TTCS_EPSG_3371, TTCS_EPSG_3372, TTCS_EPSG_3373, TTCS_EPSG_3374, TTCS_EPSG_3375, TTCS_EPSG_3376, TTCS_EPSG_3377, TTCS_EPSG_3378, TTCS_EPSG_3379, TTCS_EPSG_3380, TTCS_EPSG_3381, TTCS_EPSG_3382, TTCS_EPSG_3383, TTCS_EPSG_3384, TTCS_EPSG_3385, TTCS_EPSG_3386, TTCS_EPSG_3387, TTCS_EPSG_3388, TTCS_EPSG_3389, TTCS_EPSG_3390, TTCS_EPSG_3391, TTCS_EPSG_3392, TTCS_EPSG_3393, TTCS_EPSG_3395, TTCS_EPSG_3396, TTCS_EPSG_3397, TTCS_EPSG_3399, TTCS_EPSG_3400, TTCS_EPSG_3401, TTCS_EPSG_3402, TTCS_EPSG_3403, TTCS_EPSG_3404, TTCS_EPSG_3405, TTCS_EPSG_3406, TTCS_EPSG_3407, TTCS_EPSG_3408, TTCS_EPSG_3409, TTCS_EPSG_3410, TTCS_EPSG_3411, TTCS_EPSG_3412, TTCS_EPSG_3413, TTCS_EPSG_3414, TTCS_EPSG_3415, TTCS_EPSG_3416, TTCS_EPSG_3417, TTCS_EPSG_3418, TTCS_EPSG_3419, TTCS_EPSG_3420, TTCS_EPSG_3421, TTCS_EPSG_3422, TTCS_EPSG_3423, TTCS_EPSG_3425, TTCS_EPSG_3426, TTCS_EPSG_3427, TTCS_EPSG_3428, TTCS_EPSG_3429, TTCS_EPSG_3430, TTCS_EPSG_3431, TTCS_EPSG_3433, TTCS_EPSG_3434, TTCS_EPSG_3435, TTCS_EPSG_3436, TTCS_EPSG_3437, TTCS_EPSG_3438, TTCS_EPSG_3439, TTCS_EPSG_3440, TTCS_EPSG_3441, TTCS_EPSG_3442, TTCS_EPSG_3443, TTCS_EPSG_3444, TTCS_EPSG_3445, TTCS_EPSG_3446, TTCS_EPSG_3447, TTCS_EPSG_3448, TTCS_EPSG_3449, TTCS_EPSG_3450, TTCS_EPSG_3451, TTCS_EPSG_3452, TTCS_EPSG_3453, TTCS_EPSG_3454, TTCS_EPSG_3456, TTCS_EPSG_3457, TTCS_EPSG_3458, TTCS_EPSG_3459, TTCS_EPSG_3461, TTCS_EPSG_3462, TTCS_EPSG_3463, TTCS_EPSG_3464, TTCS_EPSG_3465, TTCS_EPSG_3466, TTCS_EPSG_3467, TTCS_EPSG_3468, TTCS_EPSG_3469, TTCS_EPSG_3470, TTCS_EPSG_3471, TTCS_EPSG_3472, TTCS_EPSG_3473, TTCS_EPSG_3474, TTCS_EPSG_3475, TTCS_EPSG_3476, TTCS_EPSG_3477, TTCS_EPSG_3478, TTCS_EPSG_3479, TTCS_EPSG_3480, TTCS_EPSG_3481, TTCS_EPSG_3482, TTCS_EPSG_3483, TTCS_EPSG_3484, TTCS_EPSG_3485, TTCS_EPSG_3486, TTCS_EPSG_3487, TTCS_EPSG_3488, TTCS_EPSG_3489, TTCS_EPSG_3490, TTCS_EPSG_3491, TTCS_EPSG_3492, TTCS_EPSG_3493, TTCS_EPSG_3494, TTCS_EPSG_3495, TTCS_EPSG_3496, TTCS_EPSG_3497, TTCS_EPSG_3498, TTCS_EPSG_3499, TTCS_EPSG_3500, TTCS_EPSG_3501, TTCS_EPSG_3502, TTCS_EPSG_3503, TTCS_EPSG_3504, TTCS_EPSG_3505, TTCS_EPSG_3506, TTCS_EPSG_3507, TTCS_EPSG_3508, TTCS_EPSG_3509, TTCS_EPSG_3510, TTCS_EPSG_3511, TTCS_EPSG_3512, TTCS_EPSG_3513, TTCS_EPSG_3514, TTCS_EPSG_3515, TTCS_EPSG_3516, TTCS_EPSG_3517, TTCS_EPSG_3518, TTCS_EPSG_3519, TTCS_EPSG_3520, TTCS_EPSG_3521, TTCS_EPSG_3522, TTCS_EPSG_3523, TTCS_EPSG_3524, TTCS_EPSG_3525, TTCS_EPSG_3526, TTCS_EPSG_3527, TTCS_EPSG_3528, TTCS_EPSG_3529, TTCS_EPSG_3530, TTCS_EPSG_3531, TTCS_EPSG_3532, TTCS_EPSG_3533, TTCS_EPSG_3534, TTCS_EPSG_3535, TTCS_EPSG_3536, TTCS_EPSG_3537, TTCS_EPSG_3538, TTCS_EPSG_3539, TTCS_EPSG_3540, TTCS_EPSG_3541, TTCS_EPSG_3542, TTCS_EPSG_3543, TTCS_EPSG_3544, TTCS_EPSG_3545, TTCS_EPSG_3546, TTCS_EPSG_3547, TTCS_EPSG_3548, TTCS_EPSG_3549, TTCS_EPSG_3550, TTCS_EPSG_3551, TTCS_EPSG_3552, TTCS_EPSG_3553, TTCS_EPSG_3554, TTCS_EPSG_3555, TTCS_EPSG_3556, TTCS_EPSG_3557, TTCS_EPSG_3558, TTCS_EPSG_3559, TTCS_EPSG_3560, TTCS_EPSG_3561, TTCS_EPSG_3562, TTCS_EPSG_3563, TTCS_EPSG_3564, TTCS_EPSG_3565, TTCS_EPSG_3566, TTCS_EPSG_3567, TTCS_EPSG_3568, TTCS_EPSG_3569, TTCS_EPSG_3570, TTCS_EPSG_3571, TTCS_EPSG_3572, TTCS_EPSG_3573, TTCS_EPSG_3574, TTCS_EPSG_3575, TTCS_EPSG_3576, TTCS_EPSG_3577, TTCS_EPSG_3578, TTCS_EPSG_3579, TTCS_EPSG_3580, TTCS_EPSG_3581, TTCS_EPSG_3582, TTCS_EPSG_3583, TTCS_EPSG_3584, TTCS_EPSG_3585, TTCS_EPSG_3586, TTCS_EPSG_3587, TTCS_EPSG_3588, TTCS_EPSG_3589, TTCS_EPSG_3590, TTCS_EPSG_3591, TTCS_EPSG_3592, TTCS_EPSG_3593, TTCS_EPSG_3594, TTCS_EPSG_3595, TTCS_EPSG_3596, TTCS_EPSG_3597, TTCS_EPSG_3598, TTCS_EPSG_3599, TTCS_EPSG_3600, TTCS_EPSG_3601, TTCS_EPSG_3602, TTCS_EPSG_3603, TTCS_EPSG_3604, TTCS_EPSG_3605, TTCS_EPSG_3606, TTCS_EPSG_3607, TTCS_EPSG_3608, TTCS_EPSG_3609, TTCS_EPSG_3610, TTCS_EPSG_3611, TTCS_EPSG_3612, TTCS_EPSG_3613, TTCS_EPSG_3614, TTCS_EPSG_3615, TTCS_EPSG_3616, TTCS_EPSG_3617, TTCS_EPSG_3618, TTCS_EPSG_3619, TTCS_EPSG_3620, TTCS_EPSG_3621, TTCS_EPSG_3622, TTCS_EPSG_3623, TTCS_EPSG_3624, TTCS_EPSG_3627, TTCS_EPSG_3628, TTCS_EPSG_3629, TTCS_EPSG_3630, TTCS_EPSG_3631, TTCS_EPSG_3632, TTCS_EPSG_3633, TTCS_EPSG_3634, TTCS_EPSG_3635, TTCS_EPSG_3636, TTCS_EPSG_3637, TTCS_EPSG_3638, TTCS_EPSG_3639, TTCS_EPSG_3640, TTCS_EPSG_3641, TTCS_EPSG_3642, TTCS_EPSG_3643, TTCS_EPSG_3644, TTCS_EPSG_3645, TTCS_EPSG_3646, TTCS_EPSG_3647, TTCS_EPSG_3648, TTCS_EPSG_3649, TTCS_EPSG_3650, TTCS_EPSG_3651, TTCS_EPSG_3652, TTCS_EPSG_3653, TTCS_EPSG_3654, TTCS_EPSG_3655, TTCS_EPSG_3656, TTCS_EPSG_3657, TTCS_EPSG_3658, TTCS_EPSG_3659, TTCS_EPSG_3660, TTCS_EPSG_3661, TTCS_EPSG_3662, TTCS_EPSG_3663, TTCS_EPSG_3664, TTCS_EPSG_3665, TTCS_EPSG_3666, TTCS_EPSG_3667, TTCS_EPSG_3668, TTCS_EPSG_3669, TTCS_EPSG_3670, TTCS_EPSG_3671, TTCS_EPSG_3672, TTCS_EPSG_3673, TTCS_EPSG_3674, TTCS_EPSG_3675, TTCS_EPSG_3676, TTCS_EPSG_3677, TTCS_EPSG_3678, TTCS_EPSG_3679, TTCS_EPSG_3680, TTCS_EPSG_3681, TTCS_EPSG_3682, TTCS_EPSG_3683, TTCS_EPSG_3684, TTCS_EPSG_3685, TTCS_EPSG_3686, TTCS_EPSG_3687, TTCS_EPSG_3688, TTCS_EPSG_3689, TTCS_EPSG_3690, TTCS_EPSG_3691, TTCS_EPSG_3692, TTCS_EPSG_3693, TTCS_EPSG_3694, TTCS_EPSG_3695, TTCS_EPSG_3696, TTCS_EPSG_3697, TTCS_EPSG_3698, TTCS_EPSG_3699, TTCS_EPSG_3700, TTCS_EPSG_3701, TTCS_EPSG_3702, TTCS_EPSG_3703, TTCS_EPSG_3704, TTCS_EPSG_3705, TTCS_EPSG_3706, TTCS_EPSG_3707, TTCS_EPSG_3708, TTCS_EPSG_3709, TTCS_EPSG_3710, TTCS_EPSG_3711, TTCS_EPSG_3712, TTCS_EPSG_3713, TTCS_EPSG_3714, TTCS_EPSG_3715, TTCS_EPSG_3716, TTCS_EPSG_3717, TTCS_EPSG_3721, TTCS_EPSG_3722, TTCS_EPSG_3723, TTCS_EPSG_3727, TTCS_EPSG_3728, TTCS_EPSG_3729, TTCS_EPSG_3730, TTCS_EPSG_3731, TTCS_EPSG_3732, TTCS_EPSG_3733, TTCS_EPSG_3734, TTCS_EPSG_3735, TTCS_EPSG_3736, TTCS_EPSG_3737, TTCS_EPSG_3738, TTCS_EPSG_3739, TTCS_EPSG_3750, TTCS_EPSG_3751, TTCS_EPSG_3752, TTCS_EPSG_3753, TTCS_EPSG_3754, TTCS_EPSG_3755, TTCS_EPSG_3756, TTCS_EPSG_3757, TTCS_EPSG_3758, TTCS_EPSG_3759, TTCS_EPSG_3760, TTCS_EPSG_3761, TTCS_EPSG_3762, TTCS_EPSG_3763, TTCS_EPSG_3764, TTCS_EPSG_3765, TTCS_EPSG_3766, TTCS_EPSG_3768, TTCS_EPSG_3770, TTCS_EPSG_3771, TTCS_EPSG_3772, TTCS_EPSG_3773, TTCS_EPSG_3774, TTCS_EPSG_3775, TTCS_EPSG_3776, TTCS_EPSG_3777, TTCS_EPSG_3778, TTCS_EPSG_3779, TTCS_EPSG_3780, TTCS_EPSG_3781, TTCS_EPSG_3782, TTCS_EPSG_3783, TTCS_EPSG_3784, TTCS_EPSG_3785, TTCS_EPSG_3786, TTCS_EPSG_3787, TTCS_EPSG_3788, TTCS_EPSG_3789, TTCS_EPSG_3790, TTCS_EPSG_3791, TTCS_EPSG_3793, TTCS_EPSG_3794, TTCS_EPSG_3795, TTCS_EPSG_3796, TTCS_EPSG_3797, TTCS_EPSG_3798, TTCS_EPSG_3799, TTCS_EPSG_3812, TTCS_EPSG_3814, TTCS_EPSG_3815, TTCS_EPSG_3816, TTCS_EPSG_3825, TTCS_EPSG_3826, TTCS_EPSG_3827, TTCS_EPSG_3828, TTCS_EPSG_3829, TTCS_EPSG_3832, TTCS_EPSG_3833, TTCS_EPSG_3844, TTCS_EPSG_3845, TTCS_EPSG_3846, TTCS_EPSG_3847, TTCS_EPSG_3848, TTCS_EPSG_3849, TTCS_EPSG_3850, TTCS_EPSG_3851, TTCS_EPSG_3852, TTCS_EPSG_3854, TTCS_EPSG_3890, TTCS_EPSG_3891, TTCS_EPSG_3892, TTCS_EPSG_3893, TTCS_EPSG_3907, TTCS_EPSG_3908, TTCS_EPSG_3909, TTCS_EPSG_3910, TTCS_EPSG_3911, TTCS_EPSG_3912, TTCS_EPSG_3920, TTCS_EPSG_3942, TTCS_EPSG_3943, TTCS_EPSG_3944, TTCS_EPSG_3945, TTCS_EPSG_3946, TTCS_EPSG_3947, TTCS_EPSG_3948, TTCS_EPSG_3949, TTCS_EPSG_3950, TTCS_EPSG_3968, TTCS_EPSG_3969, TTCS_EPSG_3970, TTCS_EPSG_3975, TTCS_EPSG_3976, TTCS_EPSG_3978, TTCS_EPSG_3979, TTCS_EPSG_3985, TTCS_EPSG_3986, TTCS_EPSG_3987, TTCS_EPSG_3988, TTCS_EPSG_3989, TTCS_EPSG_3991, TTCS_EPSG_3992, TTCS_EPSG_3994, TTCS_EPSG_3995, TTCS_EPSG_3996, TTCS_EPSG_3997, TTCS_EPSG_4026, TTCS_EPSG_4048, TTCS_EPSG_4049, TTCS_EPSG_4050, TTCS_EPSG_4051, TTCS_EPSG_4056, TTCS_EPSG_4057, TTCS_EPSG_4058, TTCS_EPSG_4059, TTCS_EPSG_4060, TTCS_EPSG_4061, TTCS_EPSG_4062, TTCS_EPSG_4063, TTCS_EPSG_4071, TTCS_EPSG_20004, TTCS_EPSG_20005, TTCS_EPSG_20006, TTCS_EPSG_20007, TTCS_EPSG_20008, TTCS_EPSG_20009, TTCS_EPSG_20010, TTCS_EPSG_20011, TTCS_EPSG_20012, TTCS_EPSG_20013, TTCS_EPSG_20014, TTCS_EPSG_20015, TTCS_EPSG_20016, TTCS_EPSG_20017, TTCS_EPSG_20018, TTCS_EPSG_20019, TTCS_EPSG_20020, TTCS_EPSG_20021, TTCS_EPSG_20022, TTCS_EPSG_20023, TTCS_EPSG_20024, TTCS_EPSG_20025, TTCS_EPSG_20026, TTCS_EPSG_20027, TTCS_EPSG_20028, TTCS_EPSG_20029, TTCS_EPSG_20030, TTCS_EPSG_20031, TTCS_EPSG_20032, TTCS_EPSG_20135, TTCS_EPSG_20136, TTCS_EPSG_20137, TTCS_EPSG_20138, TTCS_EPSG_20248, TTCS_EPSG_20249, TTCS_EPSG_20250, TTCS_EPSG_20251, TTCS_EPSG_20252, TTCS_EPSG_20253, TTCS_EPSG_20254, TTCS_EPSG_20255, TTCS_EPSG_20256, TTCS_EPSG_20257, TTCS_EPSG_20258, TTCS_EPSG_20436, TTCS_EPSG_20437, TTCS_EPSG_20538, TTCS_EPSG_20539, TTCS_EPSG_20790, TTCS_EPSG_20791, TTCS_EPSG_20822, TTCS_EPSG_20824, TTCS_EPSG_20934, TTCS_EPSG_20935, TTCS_EPSG_20936, TTCS_EPSG_21035, TTCS_EPSG_21036, TTCS_EPSG_21037, TTCS_EPSG_21148, TTCS_EPSG_21149, TTCS_EPSG_21291, TTCS_EPSG_21292, TTCS_EPSG_21413, TTCS_EPSG_21414, TTCS_EPSG_21415, TTCS_EPSG_21416, TTCS_EPSG_21417, TTCS_EPSG_21418, TTCS_EPSG_21419, TTCS_EPSG_21420, TTCS_EPSG_21421, TTCS_EPSG_21422, TTCS_EPSG_21423, TTCS_EPSG_21500, TTCS_EPSG_21780, TTCS_EPSG_21781, TTCS_EPSG_21782, TTCS_EPSG_21817, TTCS_EPSG_21818, TTCS_EPSG_21891, TTCS_EPSG_21892, TTCS_EPSG_21893, TTCS_EPSG_21894, TTCS_EPSG_22032, TTCS_EPSG_22033, TTCS_EPSG_22091, TTCS_EPSG_22092, TTCS_EPSG_22171, TTCS_EPSG_22172, TTCS_EPSG_22173, TTCS_EPSG_22174, TTCS_EPSG_22175, TTCS_EPSG_22176, TTCS_EPSG_22177, TTCS_EPSG_22181, TTCS_EPSG_22182, TTCS_EPSG_22183, TTCS_EPSG_22184, TTCS_EPSG_22185, TTCS_EPSG_22186, TTCS_EPSG_22187, TTCS_EPSG_22191, TTCS_EPSG_22193, TTCS_EPSG_22194, TTCS_EPSG_22195, TTCS_EPSG_22196, TTCS_EPSG_22197, TTCS_EPSG_22332, TTCS_EPSG_22391, TTCS_EPSG_22392, TTCS_EPSG_22521, TTCS_EPSG_22522, TTCS_EPSG_22523, TTCS_EPSG_22524, TTCS_EPSG_22525, TTCS_EPSG_22700, TTCS_EPSG_22780, TTCS_EPSG_22832, TTCS_EPSG_22991, TTCS_EPSG_22992, TTCS_EPSG_22993, TTCS_EPSG_22994, TTCS_EPSG_23030, TTCS_EPSG_23031, TTCS_EPSG_23090, TTCS_EPSG_23095, TTCS_EPSG_23433, TTCS_EPSG_23700, TTCS_EPSG_23830, TTCS_EPSG_23831, TTCS_EPSG_23832, TTCS_EPSG_23833, TTCS_EPSG_23834, TTCS_EPSG_23835, TTCS_EPSG_23836, TTCS_EPSG_23837, TTCS_EPSG_23838, TTCS_EPSG_23839, TTCS_EPSG_23840, TTCS_EPSG_23841, TTCS_EPSG_23842, TTCS_EPSG_23843, TTCS_EPSG_23844, TTCS_EPSG_23845, TTCS_EPSG_23846, TTCS_EPSG_23847, TTCS_EPSG_23848, TTCS_EPSG_23849, TTCS_EPSG_23850, TTCS_EPSG_23851, TTCS_EPSG_23852, TTCS_EPSG_23853, TTCS_EPSG_23866, TTCS_EPSG_23867, TTCS_EPSG_23868, TTCS_EPSG_23869, TTCS_EPSG_23870, TTCS_EPSG_23871, TTCS_EPSG_23872, TTCS_EPSG_23877, TTCS_EPSG_23878, TTCS_EPSG_23879, TTCS_EPSG_23880, TTCS_EPSG_23881, TTCS_EPSG_23882, TTCS_EPSG_23883, TTCS_EPSG_23884, TTCS_EPSG_23886, TTCS_EPSG_23887, TTCS_EPSG_23888, TTCS_EPSG_23889, TTCS_EPSG_23890, TTCS_EPSG_23891, TTCS_EPSG_23892, TTCS_EPSG_23893, TTCS_EPSG_23894, TTCS_EPSG_23946, TTCS_EPSG_23947, TTCS_EPSG_23948, TTCS_EPSG_24047, TTCS_EPSG_24100, TTCS_EPSG_24200, TTCS_EPSG_24305, TTCS_EPSG_24306, TTCS_EPSG_24311, TTCS_EPSG_24312, TTCS_EPSG_24313, TTCS_EPSG_24342, TTCS_EPSG_24343, TTCS_EPSG_24344, TTCS_EPSG_24345, TTCS_EPSG_24346, TTCS_EPSG_24347, TTCS_EPSG_24370, TTCS_EPSG_24371, TTCS_EPSG_24372, TTCS_EPSG_24373, TTCS_EPSG_24374, TTCS_EPSG_24375, TTCS_EPSG_24376, TTCS_EPSG_24377, TTCS_EPSG_24378, TTCS_EPSG_24379, TTCS_EPSG_24380, TTCS_EPSG_24381, TTCS_EPSG_24382, TTCS_EPSG_24383, TTCS_EPSG_24500, TTCS_EPSG_24547, TTCS_EPSG_24548, TTCS_EPSG_24571, TTCS_EPSG_24600, TTCS_EPSG_24718, TTCS_EPSG_24719, TTCS_EPSG_24720, TTCS_EPSG_24817, TTCS_EPSG_24818, TTCS_EPSG_24819, TTCS_EPSG_24821, TTCS_EPSG_24877, TTCS_EPSG_24878, TTCS_EPSG_24881, TTCS_EPSG_24891, TTCS_EPSG_24892, TTCS_EPSG_24893, TTCS_EPSG_25000, TTCS_EPSG_25231, TTCS_EPSG_25391, TTCS_EPSG_25392, TTCS_EPSG_25393, TTCS_EPSG_25394, TTCS_EPSG_25395, TTCS_EPSG_25700, TTCS_EPSG_25884, TTCS_EPSG_26191, TTCS_EPSG_26192, TTCS_EPSG_26193, TTCS_EPSG_26194, TTCS_EPSG_26195, TTCS_EPSG_26237, TTCS_EPSG_26331, TTCS_EPSG_26332, TTCS_EPSG_26391, TTCS_EPSG_26392, TTCS_EPSG_26393, TTCS_EPSG_26432, TTCS_EPSG_26591, TTCS_EPSG_26592, TTCS_EPSG_26692, TTCS_EPSG_26701, TTCS_EPSG_26702, TTCS_EPSG_26703, TTCS_EPSG_26704, TTCS_EPSG_26705, TTCS_EPSG_26706, TTCS_EPSG_26707, TTCS_EPSG_26708, TTCS_EPSG_26709, TTCS_EPSG_26710, TTCS_EPSG_26711, TTCS_EPSG_26712, TTCS_EPSG_26713, TTCS_EPSG_26714, TTCS_EPSG_26715, TTCS_EPSG_26716, TTCS_EPSG_26717, TTCS_EPSG_26718, TTCS_EPSG_26719, TTCS_EPSG_26720, TTCS_EPSG_26721, TTCS_EPSG_26722, TTCS_EPSG_26729, TTCS_EPSG_26730, TTCS_EPSG_26731, TTCS_EPSG_26732, TTCS_EPSG_26733, TTCS_EPSG_26734, TTCS_EPSG_26735, TTCS_EPSG_26736, TTCS_EPSG_26737, TTCS_EPSG_26738, TTCS_EPSG_26739, TTCS_EPSG_26740, TTCS_EPSG_26741, TTCS_EPSG_26742, TTCS_EPSG_26743, TTCS_EPSG_26744, TTCS_EPSG_26745, TTCS_EPSG_26746, TTCS_EPSG_26747, TTCS_EPSG_26748, TTCS_EPSG_26749, TTCS_EPSG_26750, TTCS_EPSG_26751, TTCS_EPSG_26752, TTCS_EPSG_26753, TTCS_EPSG_26754, TTCS_EPSG_26755, TTCS_EPSG_26756, TTCS_EPSG_26757, TTCS_EPSG_26758, TTCS_EPSG_26759, TTCS_EPSG_26760, TTCS_EPSG_26766, TTCS_EPSG_26767, TTCS_EPSG_26768, TTCS_EPSG_26769, TTCS_EPSG_26770, TTCS_EPSG_26771, TTCS_EPSG_26772, TTCS_EPSG_26773, TTCS_EPSG_26774, TTCS_EPSG_26775, TTCS_EPSG_26776, TTCS_EPSG_26777, TTCS_EPSG_26778, TTCS_EPSG_26779, TTCS_EPSG_26780, TTCS_EPSG_26781, TTCS_EPSG_26782, TTCS_EPSG_26783, TTCS_EPSG_26784, TTCS_EPSG_26785, TTCS_EPSG_26786, TTCS_EPSG_26787, TTCS_EPSG_26791, TTCS_EPSG_26792, TTCS_EPSG_26793, TTCS_EPSG_26794, TTCS_EPSG_26795, TTCS_EPSG_26796, TTCS_EPSG_26797, TTCS_EPSG_26798, TTCS_EPSG_26799, TTCS_EPSG_26801, TTCS_EPSG_26802, TTCS_EPSG_26803, TTCS_EPSG_26811, TTCS_EPSG_26812, TTCS_EPSG_26813, TTCS_EPSG_26814, TTCS_EPSG_26815, TTCS_EPSG_26819, TTCS_EPSG_26820, TTCS_EPSG_26821, TTCS_EPSG_26822, TTCS_EPSG_26823, TTCS_EPSG_26824, TTCS_EPSG_26830, TTCS_EPSG_26831, TTCS_EPSG_26832, TTCS_EPSG_26833, TTCS_EPSG_26834, TTCS_EPSG_26835, TTCS_EPSG_26841, TTCS_EPSG_26842, TTCS_EPSG_26843, TTCS_EPSG_26844, TTCS_EPSG_26845, TTCS_EPSG_26846, TTCS_EPSG_26847, TTCS_EPSG_26848, TTCS_EPSG_26849, TTCS_EPSG_26850, TTCS_EPSG_26851, TTCS_EPSG_26852, TTCS_EPSG_26853, TTCS_EPSG_26854, TTCS_EPSG_26855, TTCS_EPSG_26856, TTCS_EPSG_26857, TTCS_EPSG_26858, TTCS_EPSG_26859, TTCS_EPSG_26860, TTCS_EPSG_26861, TTCS_EPSG_26862, TTCS_EPSG_26863, TTCS_EPSG_26864, TTCS_EPSG_26865, TTCS_EPSG_26866, TTCS_EPSG_26867, TTCS_EPSG_26868, TTCS_EPSG_26869, TTCS_EPSG_26870, TTCS_EPSG_26891, TTCS_EPSG_26892, TTCS_EPSG_26893, TTCS_EPSG_26894, TTCS_EPSG_26895, TTCS_EPSG_26896, TTCS_EPSG_26897, TTCS_EPSG_26898, TTCS_EPSG_26899, TTCS_EPSG_26901, TTCS_EPSG_26902, TTCS_EPSG_26903, TTCS_EPSG_26904, TTCS_EPSG_26905, TTCS_EPSG_26906, TTCS_EPSG_26907, TTCS_EPSG_26908, TTCS_EPSG_26909, TTCS_EPSG_26910, TTCS_EPSG_26911, TTCS_EPSG_26912, TTCS_EPSG_26913, TTCS_EPSG_26914, TTCS_EPSG_26915, TTCS_EPSG_26916, TTCS_EPSG_26917, TTCS_EPSG_26918, TTCS_EPSG_26919, TTCS_EPSG_26920, TTCS_EPSG_26921, TTCS_EPSG_26922, TTCS_EPSG_26923, TTCS_EPSG_26929, TTCS_EPSG_26930, TTCS_EPSG_26931, TTCS_EPSG_26932, TTCS_EPSG_26933, TTCS_EPSG_26934, TTCS_EPSG_26935, TTCS_EPSG_26936, TTCS_EPSG_26937, TTCS_EPSG_26938, TTCS_EPSG_26939, TTCS_EPSG_26940, TTCS_EPSG_26941, TTCS_EPSG_26942, TTCS_EPSG_26943, TTCS_EPSG_26944, TTCS_EPSG_26945, TTCS_EPSG_26946, TTCS_EPSG_26948, TTCS_EPSG_26949, TTCS_EPSG_26950, TTCS_EPSG_26951, TTCS_EPSG_26952, TTCS_EPSG_26953, TTCS_EPSG_26954, TTCS_EPSG_26955, TTCS_EPSG_26956, TTCS_EPSG_26957, TTCS_EPSG_26958, TTCS_EPSG_26959, TTCS_EPSG_26960, TTCS_EPSG_26961, TTCS_EPSG_26962, TTCS_EPSG_26963, TTCS_EPSG_26964, TTCS_EPSG_26965, TTCS_EPSG_26966, TTCS_EPSG_26967, TTCS_EPSG_26968, TTCS_EPSG_26969, TTCS_EPSG_26970, TTCS_EPSG_26971, TTCS_EPSG_26972, TTCS_EPSG_26973, TTCS_EPSG_26974, TTCS_EPSG_26975, TTCS_EPSG_26976, TTCS_EPSG_26977, TTCS_EPSG_26978, TTCS_EPSG_26979, TTCS_EPSG_26980, TTCS_EPSG_26981, TTCS_EPSG_26982, TTCS_EPSG_26985, TTCS_EPSG_26986, TTCS_EPSG_26987, TTCS_EPSG_26988, TTCS_EPSG_26989, TTCS_EPSG_26990, TTCS_EPSG_26991, TTCS_EPSG_26992, TTCS_EPSG_26993, TTCS_EPSG_26994, TTCS_EPSG_26995, TTCS_EPSG_26996, TTCS_EPSG_26997, TTCS_EPSG_26998, TTCS_EPSG_27200, TTCS_EPSG_27205, TTCS_EPSG_27206, TTCS_EPSG_27207, TTCS_EPSG_27208, TTCS_EPSG_27209, TTCS_EPSG_27210, TTCS_EPSG_27211, TTCS_EPSG_27212, TTCS_EPSG_27213, TTCS_EPSG_27214, TTCS_EPSG_27215, TTCS_EPSG_27216, TTCS_EPSG_27217, TTCS_EPSG_27218, TTCS_EPSG_27219, TTCS_EPSG_27220, TTCS_EPSG_27221, TTCS_EPSG_27222, TTCS_EPSG_27223, TTCS_EPSG_27224, TTCS_EPSG_27225, TTCS_EPSG_27226, TTCS_EPSG_27227, TTCS_EPSG_27228, TTCS_EPSG_27229, TTCS_EPSG_27230, TTCS_EPSG_27231, TTCS_EPSG_27232, TTCS_EPSG_27258, TTCS_EPSG_27259, TTCS_EPSG_27260, TTCS_EPSG_27291, TTCS_EPSG_27292, TTCS_EPSG_27391, TTCS_EPSG_27392, TTCS_EPSG_27393, TTCS_EPSG_27394, TTCS_EPSG_27395, TTCS_EPSG_27396, TTCS_EPSG_27397, TTCS_EPSG_27398, TTCS_EPSG_27492, TTCS_EPSG_27500, TTCS_EPSG_27561, TTCS_EPSG_27562, TTCS_EPSG_27563, TTCS_EPSG_27564, TTCS_EPSG_27571, TTCS_EPSG_27572, TTCS_EPSG_27573, TTCS_EPSG_27574, TTCS_EPSG_27700, TTCS_EPSG_28191, TTCS_EPSG_28192, TTCS_EPSG_28193, TTCS_EPSG_28348, TTCS_EPSG_28349, TTCS_EPSG_28350, TTCS_EPSG_28351, TTCS_EPSG_28352, TTCS_EPSG_28353, TTCS_EPSG_28354, TTCS_EPSG_28355, TTCS_EPSG_28356, TTCS_EPSG_28406, TTCS_EPSG_28407, TTCS_EPSG_28408, TTCS_EPSG_28409, TTCS_EPSG_28410, TTCS_EPSG_28411, TTCS_EPSG_28412, TTCS_EPSG_28424, TTCS_EPSG_28425, TTCS_EPSG_28426, TTCS_EPSG_28427, TTCS_EPSG_28428, TTCS_EPSG_28429, TTCS_EPSG_28430, TTCS_EPSG_28431, TTCS_EPSG_28432, TTCS_EPSG_28600, TTCS_EPSG_28991, TTCS_EPSG_28992, TTCS_EPSG_29100, TTCS_EPSG_29101, TTCS_EPSG_29118, TTCS_EPSG_29119, TTCS_EPSG_29120, TTCS_EPSG_29121, TTCS_EPSG_29122, TTCS_EPSG_29168, TTCS_EPSG_29169, TTCS_EPSG_29170, TTCS_EPSG_29171, TTCS_EPSG_29172, TTCS_EPSG_29177, TTCS_EPSG_29178, TTCS_EPSG_29179, TTCS_EPSG_29180, TTCS_EPSG_29181, TTCS_EPSG_29182, TTCS_EPSG_29183, TTCS_EPSG_29184, TTCS_EPSG_29185, TTCS_EPSG_29187, TTCS_EPSG_29188, TTCS_EPSG_29189, TTCS_EPSG_29190, TTCS_EPSG_29191, TTCS_EPSG_29192, TTCS_EPSG_29193, TTCS_EPSG_29194, TTCS_EPSG_29195, TTCS_EPSG_29220, TTCS_EPSG_29221, TTCS_EPSG_29333, TTCS_EPSG_29635, TTCS_EPSG_29636, TTCS_EPSG_29700, TTCS_EPSG_29738, TTCS_EPSG_29739, TTCS_EPSG_29849, TTCS_EPSG_29850, TTCS_EPSG_29871, TTCS_EPSG_29872, TTCS_EPSG_29873, TTCS_EPSG_29900, TTCS_EPSG_29901, TTCS_EPSG_29903, TTCS_EPSG_30161, TTCS_EPSG_30162, TTCS_EPSG_30163, TTCS_EPSG_30164, TTCS_EPSG_30165, TTCS_EPSG_30166, TTCS_EPSG_30167, TTCS_EPSG_30168, TTCS_EPSG_30169, TTCS_EPSG_30170, TTCS_EPSG_30171, TTCS_EPSG_30172, TTCS_EPSG_30173, TTCS_EPSG_30174, TTCS_EPSG_30175, TTCS_EPSG_30176, TTCS_EPSG_30177, TTCS_EPSG_30178, TTCS_EPSG_30179, TTCS_EPSG_30200, TTCS_EPSG_30339, TTCS_EPSG_30340, TTCS_EPSG_30491, TTCS_EPSG_30492, TTCS_EPSG_30493, TTCS_EPSG_30494, TTCS_EPSG_30791, TTCS_EPSG_30792, TTCS_EPSG_31028, TTCS_EPSG_31121, TTCS_EPSG_31154, TTCS_EPSG_31170, TTCS_EPSG_31171, TTCS_EPSG_31251, TTCS_EPSG_31252, TTCS_EPSG_31253, TTCS_EPSG_31254, TTCS_EPSG_31255, TTCS_EPSG_31256, TTCS_EPSG_31257, TTCS_EPSG_31258, TTCS_EPSG_31259, TTCS_EPSG_31265, TTCS_EPSG_31266, TTCS_EPSG_31267, TTCS_EPSG_31268, TTCS_EPSG_31275, TTCS_EPSG_31276, TTCS_EPSG_31277, TTCS_EPSG_31279, TTCS_EPSG_31281, TTCS_EPSG_31282, TTCS_EPSG_31283, TTCS_EPSG_31284, TTCS_EPSG_31285, TTCS_EPSG_31286, TTCS_EPSG_31287, TTCS_EPSG_31288, TTCS_EPSG_31289, TTCS_EPSG_31290, TTCS_EPSG_31300, TTCS_EPSG_31370, TTCS_EPSG_31461, TTCS_EPSG_31462, TTCS_EPSG_31463, TTCS_EPSG_31464, TTCS_EPSG_31465, TTCS_EPSG_31600, TTCS_EPSG_31838, TTCS_EPSG_31839, TTCS_EPSG_31900, TTCS_EPSG_31901, TTCS_EPSG_31977, TTCS_EPSG_31978, TTCS_EPSG_31979, TTCS_EPSG_31980, TTCS_EPSG_31981, TTCS_EPSG_31982, TTCS_EPSG_31983, TTCS_EPSG_31984, TTCS_EPSG_31985, TTCS_EPSG_32001, TTCS_EPSG_32002, TTCS_EPSG_32003, TTCS_EPSG_32005, TTCS_EPSG_32006, TTCS_EPSG_32007, TTCS_EPSG_32008, TTCS_EPSG_32009, TTCS_EPSG_32010, TTCS_EPSG_32011, TTCS_EPSG_32012, TTCS_EPSG_32013, TTCS_EPSG_32014, TTCS_EPSG_32015, TTCS_EPSG_32016, TTCS_EPSG_32017, TTCS_EPSG_32018, TTCS_EPSG_32019, TTCS_EPSG_32020, TTCS_EPSG_32021, TTCS_EPSG_32022, TTCS_EPSG_32023, TTCS_EPSG_32024, TTCS_EPSG_32025, TTCS_EPSG_32026, TTCS_EPSG_32027, TTCS_EPSG_32028, TTCS_EPSG_32029, TTCS_EPSG_32030, TTCS_EPSG_32031, TTCS_EPSG_32033, TTCS_EPSG_32034, TTCS_EPSG_32035, TTCS_EPSG_32036, TTCS_EPSG_32037, TTCS_EPSG_32038, TTCS_EPSG_32039, TTCS_EPSG_32040, TTCS_EPSG_32041, TTCS_EPSG_32042, TTCS_EPSG_32043, TTCS_EPSG_32044, TTCS_EPSG_32045, TTCS_EPSG_32046, TTCS_EPSG_32047, TTCS_EPSG_32048, TTCS_EPSG_32049, TTCS_EPSG_32050, TTCS_EPSG_32051, TTCS_EPSG_32052, TTCS_EPSG_32053, TTCS_EPSG_32054, TTCS_EPSG_32055, TTCS_EPSG_32056, TTCS_EPSG_32057, TTCS_EPSG_32058, TTCS_EPSG_32061, TTCS_EPSG_32062, TTCS_EPSG_32064, TTCS_EPSG_32065, TTCS_EPSG_32066, TTCS_EPSG_32067, TTCS_EPSG_32081, TTCS_EPSG_32082, TTCS_EPSG_32083, TTCS_EPSG_32084, TTCS_EPSG_32085, TTCS_EPSG_32086, TTCS_EPSG_32098, TTCS_EPSG_32099, TTCS_EPSG_32100, TTCS_EPSG_32104, TTCS_EPSG_32107, TTCS_EPSG_32108, TTCS_EPSG_32109, TTCS_EPSG_32110, TTCS_EPSG_32111, TTCS_EPSG_32112, TTCS_EPSG_32113, TTCS_EPSG_32114, TTCS_EPSG_32116, TTCS_EPSG_32117, TTCS_EPSG_32118, TTCS_EPSG_32119, TTCS_EPSG_32120, TTCS_EPSG_32121, TTCS_EPSG_32122, TTCS_EPSG_32123, TTCS_EPSG_32124, TTCS_EPSG_32125, TTCS_EPSG_32126, TTCS_EPSG_32127, TTCS_EPSG_32128, TTCS_EPSG_32129, TTCS_EPSG_32130, TTCS_EPSG_32133, TTCS_EPSG_32134, TTCS_EPSG_32135, TTCS_EPSG_32136, TTCS_EPSG_32137, TTCS_EPSG_32138, TTCS_EPSG_32139, TTCS_EPSG_32140, TTCS_EPSG_32141, TTCS_EPSG_32142, TTCS_EPSG_32143, TTCS_EPSG_32144, TTCS_EPSG_32145, TTCS_EPSG_32146, TTCS_EPSG_32147, TTCS_EPSG_32148, TTCS_EPSG_32149, TTCS_EPSG_32150, TTCS_EPSG_32151, TTCS_EPSG_32152, TTCS_EPSG_32153, TTCS_EPSG_32154, TTCS_EPSG_32155, TTCS_EPSG_32156, TTCS_EPSG_32157, TTCS_EPSG_32158, TTCS_EPSG_32161, TTCS_EPSG_32164, TTCS_EPSG_32165, TTCS_EPSG_32166, TTCS_EPSG_32167, TTCS_EPSG_32180, TTCS_EPSG_32181, TTCS_EPSG_32182, TTCS_EPSG_32183, TTCS_EPSG_32184, TTCS_EPSG_32185, TTCS_EPSG_32186, TTCS_EPSG_32187, TTCS_EPSG_32188, TTCS_EPSG_32189, TTCS_EPSG_32190, TTCS_EPSG_32191, TTCS_EPSG_32192, TTCS_EPSG_32193, TTCS_EPSG_32194, TTCS_EPSG_32195, TTCS_EPSG_32196, TTCS_EPSG_32197, TTCS_EPSG_32198, TTCS_EPSG_32199, TTCS_EPSG_32201, TTCS_EPSG_32202, TTCS_EPSG_32203, TTCS_EPSG_32204, TTCS_EPSG_32205, TTCS_EPSG_32206, TTCS_EPSG_32207, TTCS_EPSG_32208, TTCS_EPSG_32209, TTCS_EPSG_32210, TTCS_EPSG_32211, TTCS_EPSG_32212, TTCS_EPSG_32213, TTCS_EPSG_32214, TTCS_EPSG_32215, TTCS_EPSG_32216, TTCS_EPSG_32217, TTCS_EPSG_32218, TTCS_EPSG_32219, TTCS_EPSG_32220, TTCS_EPSG_32221, TTCS_EPSG_32222, TTCS_EPSG_32223, TTCS_EPSG_32224, TTCS_EPSG_32225, TTCS_EPSG_32226, TTCS_EPSG_32227, TTCS_EPSG_32228, TTCS_EPSG_32229, TTCS_EPSG_32230, TTCS_EPSG_32231, TTCS_EPSG_32232, TTCS_EPSG_32233, TTCS_EPSG_32234, TTCS_EPSG_32235, TTCS_EPSG_32236, TTCS_EPSG_32237, TTCS_EPSG_32238, TTCS_EPSG_32239, TTCS_EPSG_32240, TTCS_EPSG_32241, TTCS_EPSG_32242, TTCS_EPSG_32243, TTCS_EPSG_32244, TTCS_EPSG_32245, TTCS_EPSG_32246, TTCS_EPSG_32247, TTCS_EPSG_32248, TTCS_EPSG_32249, TTCS_EPSG_32250, TTCS_EPSG_32251, TTCS_EPSG_32252, TTCS_EPSG_32253, TTCS_EPSG_32254, TTCS_EPSG_32255, TTCS_EPSG_32256, TTCS_EPSG_32257, TTCS_EPSG_32258, TTCS_EPSG_32259, TTCS_EPSG_32260, TTCS_EPSG_32301, TTCS_EPSG_32302, TTCS_EPSG_32303, TTCS_EPSG_32304, TTCS_EPSG_32305, TTCS_EPSG_32306, TTCS_EPSG_32307, TTCS_EPSG_32308, TTCS_EPSG_32309, TTCS_EPSG_32310, TTCS_EPSG_32311, TTCS_EPSG_32312, TTCS_EPSG_32313, TTCS_EPSG_32314, TTCS_EPSG_32315, TTCS_EPSG_32316, TTCS_EPSG_32317, TTCS_EPSG_32318, TTCS_EPSG_32319, TTCS_EPSG_32320, TTCS_EPSG_32321, TTCS_EPSG_32322, TTCS_EPSG_32323, TTCS_EPSG_32324, TTCS_EPSG_32325, TTCS_EPSG_32326, TTCS_EPSG_32327, TTCS_EPSG_32328, TTCS_EPSG_32329, TTCS_EPSG_32330, TTCS_EPSG_32331, TTCS_EPSG_32332, TTCS_EPSG_32333, TTCS_EPSG_32334, TTCS_EPSG_32335, TTCS_EPSG_32336, TTCS_EPSG_32337, TTCS_EPSG_32338, TTCS_EPSG_32339, TTCS_EPSG_32340, TTCS_EPSG_32341, TTCS_EPSG_32342, TTCS_EPSG_32343, TTCS_EPSG_32344, TTCS_EPSG_32345, TTCS_EPSG_32346, TTCS_EPSG_32347, TTCS_EPSG_32348, TTCS_EPSG_32349, TTCS_EPSG_32350, TTCS_EPSG_32351, TTCS_EPSG_32352, TTCS_EPSG_32353, TTCS_EPSG_32354, TTCS_EPSG_32355, TTCS_EPSG_32356, TTCS_EPSG_32357, TTCS_EPSG_32358, TTCS_EPSG_32359, TTCS_EPSG_32360, TTCS_EPSG_32401, TTCS_EPSG_32402, TTCS_EPSG_32403, TTCS_EPSG_32404, TTCS_EPSG_32405, TTCS_EPSG_32406, TTCS_EPSG_32407, TTCS_EPSG_32408, TTCS_EPSG_32409, TTCS_EPSG_32410, TTCS_EPSG_32411, TTCS_EPSG_32412, TTCS_EPSG_32413, TTCS_EPSG_32414, TTCS_EPSG_32415, TTCS_EPSG_32416, TTCS_EPSG_32417, TTCS_EPSG_32418, TTCS_EPSG_32419, TTCS_EPSG_32420, TTCS_EPSG_32421, TTCS_EPSG_32422, TTCS_EPSG_32423, TTCS_EPSG_32424, TTCS_EPSG_32425, TTCS_EPSG_32426, TTCS_EPSG_32427, TTCS_EPSG_32428, TTCS_EPSG_32429, TTCS_EPSG_32430, TTCS_EPSG_32431, TTCS_EPSG_32432, TTCS_EPSG_32433, TTCS_EPSG_32434, TTCS_EPSG_32435, TTCS_EPSG_32436, TTCS_EPSG_32437, TTCS_EPSG_32438, TTCS_EPSG_32439, TTCS_EPSG_32440, TTCS_EPSG_32441, TTCS_EPSG_32442, TTCS_EPSG_32443, TTCS_EPSG_32444, TTCS_EPSG_32445, TTCS_EPSG_32446, TTCS_EPSG_32447, TTCS_EPSG_32448, TTCS_EPSG_32449, TTCS_EPSG_32450, TTCS_EPSG_32451, TTCS_EPSG_32452, TTCS_EPSG_32453, TTCS_EPSG_32454, TTCS_EPSG_32455, TTCS_EPSG_32456, TTCS_EPSG_32457, TTCS_EPSG_32458, TTCS_EPSG_32459, TTCS_EPSG_32460, TTCS_EPSG_32501, TTCS_EPSG_32502, TTCS_EPSG_32503, TTCS_EPSG_32504, TTCS_EPSG_32505, TTCS_EPSG_32506, TTCS_EPSG_32507, TTCS_EPSG_32508, TTCS_EPSG_32509, TTCS_EPSG_32510, TTCS_EPSG_32511, TTCS_EPSG_32512, TTCS_EPSG_32513, TTCS_EPSG_32514, TTCS_EPSG_32515, TTCS_EPSG_32516, TTCS_EPSG_32517, TTCS_EPSG_32518, TTCS_EPSG_32519, TTCS_EPSG_32520, TTCS_EPSG_32521, TTCS_EPSG_32522, TTCS_EPSG_32523, TTCS_EPSG_32524, TTCS_EPSG_32525, TTCS_EPSG_32526, TTCS_EPSG_32527, TTCS_EPSG_32528, TTCS_EPSG_32529, TTCS_EPSG_32530, TTCS_EPSG_32531, TTCS_EPSG_32532, TTCS_EPSG_32533, TTCS_EPSG_32534, TTCS_EPSG_32535, TTCS_EPSG_32536, TTCS_EPSG_32537, TTCS_EPSG_32538, TTCS_EPSG_32539, TTCS_EPSG_32540, TTCS_EPSG_32541, TTCS_EPSG_32542, TTCS_EPSG_32543, TTCS_EPSG_32544, TTCS_EPSG_32545, TTCS_EPSG_32546, TTCS_EPSG_32547, TTCS_EPSG_32548, TTCS_EPSG_32549, TTCS_EPSG_32550, TTCS_EPSG_32551, TTCS_EPSG_32552, TTCS_EPSG_32553, TTCS_EPSG_32554, TTCS_EPSG_32555, TTCS_EPSG_32556, TTCS_EPSG_32557, TTCS_EPSG_32558, TTCS_EPSG_32559, TTCS_EPSG_32560, TTCS_EPSG_32661, TTCS_EPSG_32662, TTCS_EPSG_32664, TTCS_EPSG_32665, TTCS_EPSG_32666, TTCS_EPSG_32667, TTCS_EPSG_32761, TTCS_EPSG_32766, TTCS_, TTCS_ESRI_2000, TTCS_ESRI_2001, TTCS_ESRI_2002, TTCS_ESRI_2003, TTCS_ESRI_2004, TTCS_ESRI_2005, TTCS_ESRI_2006, TTCS_ESRI_2008, TTCS_ESRI_2009, TTCS_ESRI_2010, TTCS_ESRI_2011, TTCS_ESRI_2012, TTCS_ESRI_2013, TTCS_ESRI_2014, TTCS_ESRI_2015, TTCS_ESRI_2016, TTCS_ESRI_2020, TTCS_ESRI_2021, TTCS_ESRI_2022, TTCS_ESRI_2023, TTCS_ESRI_2024, TTCS_ESRI_2025, TTCS_ESRI_2026, TTCS_ESRI_2036, TTCS_ESRI_2039, TTCS_ESRI_2044, TTCS_ESRI_2045, TTCS_ESRI_2056, TTCS_ESRI_2062, TTCS_ESRI_2065, TTCS_ESRI_2066, TTCS_ESRI_2068, TTCS_ESRI_2069, TTCS_ESRI_2070, TTCS_ESRI_2071, TTCS_ESRI_2072, TTCS_ESRI_2073, TTCS_ESRI_2074, TTCS_ESRI_2075, TTCS_ESRI_2076, TTCS_ESRI_2081, TTCS_ESRI_2083, TTCS_ESRI_2084, TTCS_ESRI_2087, TTCS_ESRI_2088, TTCS_ESRI_2091, TTCS_ESRI_2092, TTCS_ESRI_2093, TTCS_ESRI_2094, TTCS_ESRI_2096, TTCS_ESRI_2097, TTCS_ESRI_2098, TTCS_ESRI_2100, TTCS_ESRI_2105, TTCS_ESRI_2106, TTCS_ESRI_2107, TTCS_ESRI_2108, TTCS_ESRI_2109, TTCS_ESRI_2110, TTCS_ESRI_2111, TTCS_ESRI_2112, TTCS_ESRI_2113, TTCS_ESRI_2114, TTCS_ESRI_2115, TTCS_ESRI_2116, TTCS_ESRI_2117, TTCS_ESRI_2118, TTCS_ESRI_2119, TTCS_ESRI_2120, TTCS_ESRI_2121, TTCS_ESRI_2122, TTCS_ESRI_2123, TTCS_ESRI_2124, TTCS_ESRI_2125, TTCS_ESRI_2126, TTCS_ESRI_2127, TTCS_ESRI_2128, TTCS_ESRI_2129, TTCS_ESRI_2130, TTCS_ESRI_2131, TTCS_ESRI_2132, TTCS_ESRI_2136, TTCS_ESRI_2137, TTCS_ESRI_2139, TTCS_ESRI_2140, TTCS_ESRI_2141, TTCS_ESRI_2142, TTCS_ESRI_2143, TTCS_ESRI_2144, TTCS_ESRI_2145, TTCS_ESRI_2146, TTCS_ESRI_2147, TTCS_ESRI_2155, TTCS_ESRI_2157, TTCS_ESRI_2159, TTCS_ESRI_2160, TTCS_ESRI_2164, TTCS_ESRI_2165, TTCS_ESRI_2166, TTCS_ESRI_2167, TTCS_ESRI_2168, TTCS_ESRI_2169, TTCS_ESRI_2170, TTCS_ESRI_2171, TTCS_ESRI_2172, TTCS_ESRI_2173, TTCS_ESRI_2174, TTCS_ESRI_2175, TTCS_ESRI_2180, TTCS_ESRI_2193, TTCS_ESRI_2194, TTCS_ESRI_2195, TTCS_ESRI_2196, TTCS_ESRI_2197, TTCS_ESRI_2198, TTCS_ESRI_2199, TTCS_ESRI_2200, TTCS_ESRI_2204, TTCS_ESRI_2206, TTCS_ESRI_2207, TTCS_ESRI_2208, TTCS_ESRI_2209, TTCS_ESRI_2210, TTCS_ESRI_2211, TTCS_ESRI_2212, TTCS_ESRI_2213, TTCS_ESRI_2214, TTCS_ESRI_2222, TTCS_ESRI_2223, TTCS_ESRI_2224, TTCS_ESRI_2225, TTCS_ESRI_2226, TTCS_ESRI_2227, TTCS_ESRI_2228, TTCS_ESRI_2229, TTCS_ESRI_2230, TTCS_ESRI_2231, TTCS_ESRI_2232, TTCS_ESRI_2233, TTCS_ESRI_2234, TTCS_ESRI_2235, TTCS_ESRI_2236, TTCS_ESRI_2237, TTCS_ESRI_2238, TTCS_ESRI_2239, TTCS_ESRI_2240, TTCS_ESRI_2241, TTCS_ESRI_2242, TTCS_ESRI_2243, TTCS_ESRI_2244, TTCS_ESRI_2245, TTCS_ESRI_2246, TTCS_ESRI_2247, TTCS_ESRI_2248, TTCS_ESRI_2249, TTCS_ESRI_2250, TTCS_ESRI_2251, TTCS_ESRI_2252, TTCS_ESRI_2253, TTCS_ESRI_2254, TTCS_ESRI_2255, TTCS_ESRI_2256, TTCS_ESRI_2257, TTCS_ESRI_2258, TTCS_ESRI_2259, TTCS_ESRI_2260, TTCS_ESRI_2261, TTCS_ESRI_2262, TTCS_ESRI_2263, TTCS_ESRI_2264, TTCS_ESRI_2265, TTCS_ESRI_2266, TTCS_ESRI_2267, TTCS_ESRI_2268, TTCS_ESRI_2269, TTCS_ESRI_2270, TTCS_ESRI_2271, TTCS_ESRI_2272, TTCS_ESRI_2273, TTCS_ESRI_2274, TTCS_ESRI_2275, TTCS_ESRI_2276, TTCS_ESRI_2277, TTCS_ESRI_2278, TTCS_ESRI_2279, TTCS_ESRI_2280, TTCS_ESRI_2281, TTCS_ESRI_2282, TTCS_ESRI_2283, TTCS_ESRI_2284, TTCS_ESRI_2285, TTCS_ESRI_2286, TTCS_ESRI_2287, TTCS_ESRI_2288, TTCS_ESRI_2289, TTCS_ESRI_2290, TTCS_ESRI_2291, TTCS_ESRI_2292, TTCS_ESRI_2294, TTCS_ESRI_2295, TTCS_ESRI_2308, TTCS_ESRI_2309, TTCS_ESRI_2310, TTCS_ESRI_2311, TTCS_ESRI_2314, TTCS_ESRI_2319, TTCS_ESRI_2320, TTCS_ESRI_2321, TTCS_ESRI_2322, TTCS_ESRI_2323, TTCS_ESRI_2324, TTCS_ESRI_2325, TTCS_ESRI_2326, TTCS_ESRI_2327, TTCS_ESRI_2328, TTCS_ESRI_2329, TTCS_ESRI_2330, TTCS_ESRI_2331, TTCS_ESRI_2332, TTCS_ESRI_2333, TTCS_ESRI_2334, TTCS_ESRI_2335, TTCS_ESRI_2336, TTCS_ESRI_2337, TTCS_ESRI_2338, TTCS_ESRI_2339, TTCS_ESRI_2340, TTCS_ESRI_2341, TTCS_ESRI_2342, TTCS_ESRI_2343, TTCS_ESRI_2344, TTCS_ESRI_2345, TTCS_ESRI_2346, TTCS_ESRI_2347, TTCS_ESRI_2348, TTCS_ESRI_2349, TTCS_ESRI_2350, TTCS_ESRI_2351, TTCS_ESRI_2352, TTCS_ESRI_2353, TTCS_ESRI_2354, TTCS_ESRI_2355, TTCS_ESRI_2356, TTCS_ESRI_2357, TTCS_ESRI_2358, TTCS_ESRI_2359, TTCS_ESRI_2360, TTCS_ESRI_2361, TTCS_ESRI_2362, TTCS_ESRI_2363, TTCS_ESRI_2364, TTCS_ESRI_2365, TTCS_ESRI_2366, TTCS_ESRI_2367, TTCS_ESRI_2368, TTCS_ESRI_2369, TTCS_ESRI_2371, TTCS_ESRI_2373, TTCS_ESRI_2375, TTCS_ESRI_2377, TTCS_ESRI_2379, TTCS_ESRI_2381, TTCS_ESRI_2383, TTCS_ESRI_2385, TTCS_ESRI_2387, TTCS_ESRI_2389, TTCS_ESRI_2391, TTCS_ESRI_2392, TTCS_ESRI_2393, TTCS_ESRI_2394, TTCS_ESRI_2400, TTCS_ESRI_2401, TTCS_ESRI_2402, TTCS_ESRI_2403, TTCS_ESRI_2404, TTCS_ESRI_2405, TTCS_ESRI_2406, TTCS_ESRI_2407, TTCS_ESRI_2408, TTCS_ESRI_2409, TTCS_ESRI_2410, TTCS_ESRI_2411, TTCS_ESRI_2412, TTCS_ESRI_2413, TTCS_ESRI_2414, TTCS_ESRI_2415, TTCS_ESRI_2416, TTCS_ESRI_2417, TTCS_ESRI_2418, TTCS_ESRI_2419, TTCS_ESRI_2420, TTCS_ESRI_2421, TTCS_ESRI_2422, TTCS_ESRI_2423, TTCS_ESRI_2424, TTCS_ESRI_2425, TTCS_ESRI_2426, TTCS_ESRI_2427, TTCS_ESRI_2428, TTCS_ESRI_2429, TTCS_ESRI_2430, TTCS_ESRI_2431, TTCS_ESRI_2432, TTCS_ESRI_2433, TTCS_ESRI_2434, TTCS_ESRI_2435, TTCS_ESRI_2436, TTCS_ESRI_2437, TTCS_ESRI_2438, TTCS_ESRI_2439, TTCS_ESRI_2440, TTCS_ESRI_2441, TTCS_ESRI_2442, TTCS_ESRI_2443, TTCS_ESRI_2444, TTCS_ESRI_2445, TTCS_ESRI_2446, TTCS_ESRI_2447, TTCS_ESRI_2448, TTCS_ESRI_2449, TTCS_ESRI_2450, TTCS_ESRI_2451, TTCS_ESRI_2452, TTCS_ESRI_2453, TTCS_ESRI_2454, TTCS_ESRI_2455, TTCS_ESRI_2456, TTCS_ESRI_2457, TTCS_ESRI_2458, TTCS_ESRI_2459, TTCS_ESRI_2460, TTCS_ESRI_2461, TTCS_ESRI_2463, TTCS_ESRI_2464, TTCS_ESRI_2465, TTCS_ESRI_2466, TTCS_ESRI_2467, TTCS_ESRI_2468, TTCS_ESRI_2469, TTCS_ESRI_2470, TTCS_ESRI_2471, TTCS_ESRI_2483, TTCS_ESRI_2484, TTCS_ESRI_2485, TTCS_ESRI_2486, TTCS_ESRI_2487, TTCS_ESRI_2488, TTCS_ESRI_2489, TTCS_ESRI_2490, TTCS_ESRI_2491, TTCS_ESRI_2492, TTCS_ESRI_2493, TTCS_ESRI_2523, TTCS_ESRI_2524, TTCS_ESRI_2525, TTCS_ESRI_2526, TTCS_ESRI_2527, TTCS_ESRI_2528, TTCS_ESRI_2529, TTCS_ESRI_2530, TTCS_ESRI_2531, TTCS_ESRI_2532, TTCS_ESRI_2533, TTCS_ESRI_2534, TTCS_ESRI_2535, TTCS_ESRI_2536, TTCS_ESRI_2537, TTCS_ESRI_2538, TTCS_ESRI_2539, TTCS_ESRI_2540, TTCS_ESRI_2563, TTCS_ESRI_2564, TTCS_ESRI_2565, TTCS_ESRI_2566, TTCS_ESRI_2567, TTCS_ESRI_2568, TTCS_ESRI_2569, TTCS_ESRI_2570, TTCS_ESRI_2571, TTCS_ESRI_2572, TTCS_ESRI_2573, TTCS_ESRI_2574, TTCS_ESRI_2575, TTCS_ESRI_2576, TTCS_ESRI_2577, TTCS_ESRI_2578, TTCS_ESRI_2579, TTCS_ESRI_2580, TTCS_ESRI_2581, TTCS_ESRI_2583, TTCS_ESRI_2585, TTCS_ESRI_2587, TTCS_ESRI_2589, TTCS_ESRI_2591, TTCS_ESRI_2593, TTCS_ESRI_2595, TTCS_ESRI_2597, TTCS_ESRI_2599, TTCS_ESRI_2600, TTCS_ESRI_2622, TTCS_ESRI_2624, TTCS_ESRI_2626, TTCS_ESRI_2628, TTCS_ESRI_2630, TTCS_ESRI_2632, TTCS_ESRI_2634, TTCS_ESRI_2636, TTCS_ESRI_2638, TTCS_ESRI_2640, TTCS_ESRI_2759, TTCS_ESRI_2760, TTCS_ESRI_2761, TTCS_ESRI_2762, TTCS_ESRI_2763, TTCS_ESRI_2777, TTCS_ESRI_2778, TTCS_ESRI_2780, TTCS_ESRI_2781, TTCS_ESRI_2782, TTCS_ESRI_2783, TTCS_ESRI_2784, TTCS_ESRI_2785, TTCS_ESRI_2786, TTCS_ESRI_2787, TTCS_ESRI_2788, TTCS_ESRI_2789, TTCS_ESRI_2790, TTCS_ESRI_2791, TTCS_ESRI_2792, TTCS_ESRI_2793, TTCS_ESRI_2802, TTCS_ESRI_2803, TTCS_ESRI_2813, TTCS_ESRI_2814, TTCS_ESRI_2815, TTCS_ESRI_2816, TTCS_ESRI_2817, TTCS_ESRI_2820, TTCS_ESRI_2821, TTCS_ESRI_2822, TTCS_ESRI_2823, TTCS_ESRI_2824, TTCS_ESRI_2825, TTCS_ESRI_2826, TTCS_ESRI_2827, TTCS_ESRI_2829, TTCS_ESRI_2830, TTCS_ESRI_2840, TTCS_ESRI_2852, TTCS_ESRI_2862, TTCS_ESRI_2863, TTCS_ESRI_2864, TTCS_ESRI_2865, TTCS_ESRI_2866, TTCS_ESRI_2867, TTCS_ESRI_2868, TTCS_ESRI_2869, TTCS_ESRI_2870, TTCS_ESRI_2871, TTCS_ESRI_2872, TTCS_ESRI_2873, TTCS_ESRI_2874, TTCS_ESRI_2875, TTCS_ESRI_2876, TTCS_ESRI_2877, TTCS_ESRI_2878, TTCS_ESRI_2879, TTCS_ESRI_2880, TTCS_ESRI_2881, TTCS_ESRI_2882, TTCS_ESRI_2883, TTCS_ESRI_2884, TTCS_ESRI_2885, TTCS_ESRI_2886, TTCS_ESRI_2887, TTCS_ESRI_2888, TTCS_ESRI_2889, TTCS_ESRI_2890, TTCS_ESRI_2891, TTCS_ESRI_2892, TTCS_ESRI_2893, TTCS_ESRI_2894, TTCS_ESRI_2895, TTCS_ESRI_2896, TTCS_ESRI_2897, TTCS_ESRI_2898, TTCS_ESRI_2899, TTCS_ESRI_2900, TTCS_ESRI_2901, TTCS_ESRI_2902, TTCS_ESRI_2903, TTCS_ESRI_2904, TTCS_ESRI_2905, TTCS_ESRI_2906, TTCS_ESRI_2907, TTCS_ESRI_2908, TTCS_ESRI_2909, TTCS_ESRI_2910, TTCS_ESRI_2911, TTCS_ESRI_2912, TTCS_ESRI_2913, TTCS_ESRI_2914, TTCS_ESRI_2915, TTCS_ESRI_2916, TTCS_ESRI_2917, TTCS_ESRI_2918, TTCS_ESRI_2919, TTCS_ESRI_2920, TTCS_ESRI_2921, TTCS_ESRI_2922, TTCS_ESRI_2923, TTCS_ESRI_2924, TTCS_ESRI_2925, TTCS_ESRI_2926, TTCS_ESRI_2927, TTCS_ESRI_2928, TTCS_ESRI_2929, TTCS_ESRI_2930, TTCS_ESRI_2931, TTCS_ESRI_2932, TTCS_ESRI_2934, TTCS_ESRI_2935, TTCS_ESRI_2936, TTCS_ESRI_2937, TTCS_ESRI_2938, TTCS_ESRI_2939, TTCS_ESRI_2940, TTCS_ESRI_2941, TTCS_ESRI_3148, TTCS_ESRI_3149, TTCS_ESRI_3176, TTCS_ESRI_3561, TTCS_ESRI_3562, TTCS_ESRI_3563, TTCS_ESRI_3564, TTCS_ESRI_3565, TTCS_ESRI_3991, TTCS_ESRI_3992, TTCS_ESRI_4002, TTCS_ESRI_4007, TTCS_ESRI_4015, TTCS_ESRI_4028, TTCS_ESRI_4042, TTCS_ESRI_4044, TTCS_ESRI_4121, TTCS_ESRI_4123, TTCS_ESRI_4145, TTCS_ESRI_4168, TTCS_ESRI_4178, TTCS_ESRI_4179, TTCS_ESRI_4216, TTCS_ESRI_4224, TTCS_ESRI_4231, TTCS_ESRI_4239, TTCS_ESRI_4244, TTCS_ESRI_4254, TTCS_ESRI_4302, TTCS_ESRI_4316, TTCS_ESRI_4601, TTCS_ESRI_4605, TTCS_ESRI_4903, TTCS_ESRI_20005, TTCS_ESRI_20006, TTCS_ESRI_20007, TTCS_ESRI_20008, TTCS_ESRI_20009, TTCS_ESRI_20010, TTCS_ESRI_20011, TTCS_ESRI_20012, TTCS_ESRI_20013, TTCS_ESRI_20014, TTCS_ESRI_20015, TTCS_ESRI_20016, TTCS_ESRI_20017, TTCS_ESRI_20018, TTCS_ESRI_20019, TTCS_ESRI_20020, TTCS_ESRI_20021, TTCS_ESRI_20022, TTCS_ESRI_20023, TTCS_ESRI_20024, TTCS_ESRI_20025, TTCS_ESRI_20026, TTCS_ESRI_20027, TTCS_ESRI_20028, TTCS_ESRI_20029, TTCS_ESRI_20030, TTCS_ESRI_20031, TTCS_ESRI_20032, TTCS_ESRI_20790, TTCS_ESRI_20791, TTCS_ESRI_21292, TTCS_ESRI_21500, TTCS_ESRI_21780, TTCS_ESRI_21781, TTCS_ESRI_21891, TTCS_ESRI_21892, TTCS_ESRI_21893, TTCS_ESRI_21894, TTCS_ESRI_22091, TTCS_ESRI_22092, TTCS_ESRI_22191, TTCS_ESRI_22193, TTCS_ESRI_22194, TTCS_ESRI_22195, TTCS_ESRI_22196, TTCS_ESRI_22197, TTCS_ESRI_22391, TTCS_ESRI_22392, TTCS_ESRI_22780, TTCS_ESRI_22991, TTCS_ESRI_22992, TTCS_ESRI_22993, TTCS_ESRI_22994, TTCS_ESRI_23090, TTCS_ESRI_23095, TTCS_ESRI_23700, TTCS_ESRI_23946, TTCS_ESRI_23947, TTCS_ESRI_23948, TTCS_ESRI_24047, TTCS_ESRI_24100, TTCS_ESRI_24305, TTCS_ESRI_24306, TTCS_ESRI_24311, TTCS_ESRI_24312, TTCS_ESRI_24313, TTCS_ESRI_24370, TTCS_ESRI_24371, TTCS_ESRI_24372, TTCS_ESRI_24373, TTCS_ESRI_24374, TTCS_ESRI_24375, TTCS_ESRI_24376, TTCS_ESRI_24377, TTCS_ESRI_24382, TTCS_ESRI_24891, TTCS_ESRI_24892, TTCS_ESRI_24893, TTCS_ESRI_25000, TTCS_ESRI_25391, TTCS_ESRI_25392, TTCS_ESRI_25393, TTCS_ESRI_25394, TTCS_ESRI_25395, TTCS_ESRI_25700, TTCS_ESRI_25884, TTCS_ESRI_26391, TTCS_ESRI_26392, TTCS_ESRI_26393, TTCS_ESRI_26591, TTCS_ESRI_26592, TTCS_ESRI_26729, TTCS_ESRI_26730, TTCS_ESRI_26731, TTCS_ESRI_26732, TTCS_ESRI_26733, TTCS_ESRI_26734, TTCS_ESRI_26735, TTCS_ESRI_26736, TTCS_ESRI_26737, TTCS_ESRI_26738, TTCS_ESRI_26739, TTCS_ESRI_26740, TTCS_ESRI_26741, TTCS_ESRI_26742, TTCS_ESRI_26743, TTCS_ESRI_26744, TTCS_ESRI_26745, TTCS_ESRI_26746, TTCS_ESRI_26747, TTCS_ESRI_26748, TTCS_ESRI_26749, TTCS_ESRI_26750, TTCS_ESRI_26751, TTCS_ESRI_26752, TTCS_ESRI_26753, TTCS_ESRI_26754, TTCS_ESRI_26755, TTCS_ESRI_26756, TTCS_ESRI_26757, TTCS_ESRI_26758, TTCS_ESRI_26759, TTCS_ESRI_26760, TTCS_ESRI_26766, TTCS_ESRI_26767, TTCS_ESRI_26768, TTCS_ESRI_26769, TTCS_ESRI_26770, TTCS_ESRI_26771, TTCS_ESRI_26772, TTCS_ESRI_26773, TTCS_ESRI_26774, TTCS_ESRI_26775, TTCS_ESRI_26776, TTCS_ESRI_26777, TTCS_ESRI_26778, TTCS_ESRI_26779, TTCS_ESRI_26780, TTCS_ESRI_26781, TTCS_ESRI_26782, TTCS_ESRI_26783, TTCS_ESRI_26784, TTCS_ESRI_26785, TTCS_ESRI_26786, TTCS_ESRI_26787, TTCS_ESRI_26791, TTCS_ESRI_26792, TTCS_ESRI_26793, TTCS_ESRI_26794, TTCS_ESRI_26795, TTCS_ESRI_26796, TTCS_ESRI_26797, TTCS_ESRI_26798, TTCS_ESRI_26801, TTCS_ESRI_26802, TTCS_ESRI_26803, TTCS_ESRI_26811, TTCS_ESRI_26812, TTCS_ESRI_26813, TTCS_ESRI_26929, TTCS_ESRI_26930, TTCS_ESRI_26932, TTCS_ESRI_26933, TTCS_ESRI_26934, TTCS_ESRI_26935, TTCS_ESRI_26936, TTCS_ESRI_26937, TTCS_ESRI_26938, TTCS_ESRI_26939, TTCS_ESRI_26948, TTCS_ESRI_26949, TTCS_ESRI_26950, TTCS_ESRI_26958, TTCS_ESRI_26959, TTCS_ESRI_26961, TTCS_ESRI_26962, TTCS_ESRI_26963, TTCS_ESRI_26964, TTCS_ESRI_26965, TTCS_ESRI_26966, TTCS_ESRI_26967, TTCS_ESRI_26968, TTCS_ESRI_26969, TTCS_ESRI_26970, TTCS_ESRI_26971, TTCS_ESRI_26972, TTCS_ESRI_26973, TTCS_ESRI_26974, TTCS_ESRI_26983, TTCS_ESRI_26984, TTCS_ESRI_26994, TTCS_ESRI_26995, TTCS_ESRI_26996, TTCS_ESRI_26997, TTCS_ESRI_26998, TTCS_ESRI_27200, TTCS_ESRI_27205, TTCS_ESRI_27206, TTCS_ESRI_27207, TTCS_ESRI_27208, TTCS_ESRI_27209, TTCS_ESRI_27210, TTCS_ESRI_27211, TTCS_ESRI_27212, TTCS_ESRI_27213, TTCS_ESRI_27214, TTCS_ESRI_27215, TTCS_ESRI_27216, TTCS_ESRI_27217, TTCS_ESRI_27218, TTCS_ESRI_27219, TTCS_ESRI_27220, TTCS_ESRI_27221, TTCS_ESRI_27222, TTCS_ESRI_27223, TTCS_ESRI_27224, TTCS_ESRI_27225, TTCS_ESRI_27226, TTCS_ESRI_27227, TTCS_ESRI_27228, TTCS_ESRI_27229, TTCS_ESRI_27230, TTCS_ESRI_27231, TTCS_ESRI_27232, TTCS_ESRI_27260, TTCS_ESRI_27291, TTCS_ESRI_27292, TTCS_ESRI_27391, TTCS_ESRI_27392, TTCS_ESRI_27393, TTCS_ESRI_27394, TTCS_ESRI_27395, TTCS_ESRI_27396, TTCS_ESRI_27397, TTCS_ESRI_27398, TTCS_ESRI_27492, TTCS_ESRI_27500, TTCS_ESRI_27561, TTCS_ESRI_27562, TTCS_ESRI_27563, TTCS_ESRI_27564, TTCS_ESRI_27571, TTCS_ESRI_27572, TTCS_ESRI_27573, TTCS_ESRI_27574, TTCS_ESRI_27700, TTCS_ESRI_28191, TTCS_ESRI_28192, TTCS_ESRI_28193, TTCS_ESRI_28402, TTCS_ESRI_28403, TTCS_ESRI_28600, TTCS_ESRI_28991, TTCS_ESRI_28992, TTCS_ESRI_29700, TTCS_ESRI_29900, TTCS_ESRI_29901, TTCS_ESRI_30161, TTCS_ESRI_30162, TTCS_ESRI_30163, TTCS_ESRI_30164, TTCS_ESRI_30165, TTCS_ESRI_30166, TTCS_ESRI_30167, TTCS_ESRI_30168, TTCS_ESRI_30169, TTCS_ESRI_30170, TTCS_ESRI_30171, TTCS_ESRI_30172, TTCS_ESRI_30173, TTCS_ESRI_30174, TTCS_ESRI_30175, TTCS_ESRI_30176, TTCS_ESRI_30177, TTCS_ESRI_30178, TTCS_ESRI_30179, TTCS_ESRI_30200, TTCS_ESRI_31154, TTCS_ESRI_31170, TTCS_ESRI_31171, TTCS_ESRI_31265, TTCS_ESRI_31266, TTCS_ESRI_31267, TTCS_ESRI_31268, TTCS_ESRI_31275, TTCS_ESRI_31276, TTCS_ESRI_31277, TTCS_ESRI_31279, TTCS_ESRI_31281, TTCS_ESRI_31282, TTCS_ESRI_31283, TTCS_ESRI_31284, TTCS_ESRI_31285, TTCS_ESRI_31286, TTCS_ESRI_31287, TTCS_ESRI_31300, TTCS_ESRI_31370, TTCS_ESRI_31461, TTCS_ESRI_31462, TTCS_ESRI_31463, TTCS_ESRI_31464, TTCS_ESRI_31600, TTCS_ESRI_31700, TTCS_ESRI_31838, TTCS_ESRI_31839, TTCS_ESRI_31900, TTCS_ESRI_32001, TTCS_ESRI_32002, TTCS_ESRI_32003, TTCS_ESRI_32005, TTCS_ESRI_32006, TTCS_ESRI_32007, TTCS_ESRI_32008, TTCS_ESRI_32009, TTCS_ESRI_32010, TTCS_ESRI_32011, TTCS_ESRI_32012, TTCS_ESRI_32013, TTCS_ESRI_32014, TTCS_ESRI_32015, TTCS_ESRI_32016, TTCS_ESRI_32017, TTCS_ESRI_32018, TTCS_ESRI_32019, TTCS_ESRI_32020, TTCS_ESRI_32021, TTCS_ESRI_32022, TTCS_ESRI_32023, TTCS_ESRI_32024, TTCS_ESRI_32025, TTCS_ESRI_32026, TTCS_ESRI_32027, TTCS_ESRI_32028, TTCS_ESRI_32029, TTCS_ESRI_32030, TTCS_ESRI_32031, TTCS_ESRI_32033, TTCS_ESRI_32034, TTCS_ESRI_32035, TTCS_ESRI_32036, TTCS_ESRI_32037, TTCS_ESRI_32038, TTCS_ESRI_32039, TTCS_ESRI_32040, TTCS_ESRI_32041, TTCS_ESRI_32042, TTCS_ESRI_32043, TTCS_ESRI_32044, TTCS_ESRI_32045, TTCS_ESRI_32046, TTCS_ESRI_32047, TTCS_ESRI_32048, TTCS_ESRI_32049, TTCS_ESRI_32050, TTCS_ESRI_32051, TTCS_ESRI_32052, TTCS_ESRI_32053, TTCS_ESRI_32054, TTCS_ESRI_32055, TTCS_ESRI_32056, TTCS_ESRI_32057, TTCS_ESRI_32058, TTCS_ESRI_32064, TTCS_ESRI_32065, TTCS_ESRI_32066, TTCS_ESRI_32067, TTCS_ESRI_32081, TTCS_ESRI_32082, TTCS_ESRI_32083, TTCS_ESRI_32084, TTCS_ESRI_32085, TTCS_ESRI_32086, TTCS_ESRI_32107, TTCS_ESRI_32108, TTCS_ESRI_32109, TTCS_ESRI_32110, TTCS_ESRI_32111, TTCS_ESRI_32112, TTCS_ESRI_32113, TTCS_ESRI_32114, TTCS_ESRI_32116, TTCS_ESRI_32117, TTCS_ESRI_32130, TTCS_ESRI_32145, TTCS_ESRI_32155, TTCS_ESRI_32156, TTCS_ESRI_32157, TTCS_ESRI_32158, TTCS_ESRI_32180, TTCS_ESRI_32181, TTCS_ESRI_32182, TTCS_ESRI_32183, TTCS_ESRI_32184, TTCS_ESRI_32185, TTCS_ESRI_32186, TTCS_ESRI_32187, TTCS_ESRI_32188, TTCS_ESRI_32189, TTCS_ESRI_32190, TTCS_ESRI_32191, TTCS_ESRI_32192, TTCS_ESRI_32193, TTCS_ESRI_32194, TTCS_ESRI_32195, TTCS_ESRI_32196, TTCS_ESRI_32197, TTCS_ESRI_32766, TTCS_ESRI_26761, TTCS_ESRI_26762, TTCS_ESRI_26763, TTCS_ESRI_26764, TTCS_ESRI_26765, TTCS_ESRI_26788, TTCS_ESRI_26789, TTCS_ESRI_26790, TTCS_ESRI_32059, TTCS_ESRI_32060, TTCS_ESRI_53001, TTCS_ESRI_53003, TTCS_ESRI_53004, TTCS_ESRI_53008, TTCS_ESRI_53009, TTCS_ESRI_53010, TTCS_ESRI_53012, TTCS_ESRI_53016, TTCS_ESRI_53021, TTCS_ESRI_53026, TTCS_ESRI_53027, TTCS_ESRI_53028, TTCS_ESRI_53029, TTCS_ESRI_53030, TTCS_ESRI_53032, TTCS_ESRI_54001, TTCS_ESRI_54003, TTCS_ESRI_54004, TTCS_ESRI_54008, TTCS_ESRI_54009, TTCS_ESRI_54010, TTCS_ESRI_54012, TTCS_ESRI_54016, TTCS_ESRI_54021, TTCS_ESRI_54026, TTCS_ESRI_54027, TTCS_ESRI_54028, TTCS_ESRI_54029, TTCS_ESRI_54030, TTCS_ESRI_54032, TTCS_ESRI_65061, TTCS_ESRI_65161, TTCS_ESRI_102001, TTCS_ESRI_102002, TTCS_ESRI_102003, TTCS_ESRI_102004, TTCS_ESRI_102005, TTCS_ESRI_102007, TTCS_ESRI_102008, TTCS_ESRI_102009, TTCS_ESRI_102010, TTCS_ESRI_102012, TTCS_ESRI_102013, TTCS_ESRI_102014, TTCS_ESRI_102015, TTCS_ESRI_102016, TTCS_ESRI_102017, TTCS_ESRI_102018, TTCS_ESRI_102019, TTCS_ESRI_102020, TTCS_ESRI_102021, TTCS_ESRI_102022, TTCS_ESRI_102023, TTCS_ESRI_102024, TTCS_ESRI_102025, TTCS_ESRI_102026, TTCS_ESRI_102027, TTCS_ESRI_102028, TTCS_ESRI_102029, TTCS_ESRI_102030, TTCS_ESRI_102031, TTCS_ESRI_102032, TTCS_ESRI_102033, TTCS_ESRI_102065, TTCS_ESRI_102066, TTCS_ESRI_102091, TTCS_ESRI_102092, TTCS_ESRI_102101, TTCS_ESRI_102102, TTCS_ESRI_102103, TTCS_ESRI_102104, TTCS_ESRI_102105, TTCS_ESRI_102106, TTCS_ESRI_102107, TTCS_ESRI_102108, TTCS_ESRI_102110, TTCS_ESRI_102114, TTCS_ESRI_102115, TTCS_ESRI_102120, TTCS_ESRI_102121, TTCS_ESRI_102122, TTCS_ESRI_102123, TTCS_ESRI_102132, TTCS_ESRI_102133, TTCS_ESRI_102134, TTCS_ESRI_102135, TTCS_ESRI_102140, TTCS_ESRI_102141, TTCS_ESRI_102142, TTCS_ESRI_102156, TTCS_ESRI_102160, TTCS_ESRI_102163, TTCS_ESRI_102164, TTCS_ESRI_102165, TTCS_ESRI_102191, TTCS_ESRI_102192, TTCS_ESRI_102193, TTCS_ESRI_102229, TTCS_ESRI_102230, TTCS_ESRI_102241, TTCS_ESRI_102242, TTCS_ESRI_102243, TTCS_ESRI_102244, TTCS_ESRI_102245, TTCS_ESRI_102246, TTCS_ESRI_102248, TTCS_ESRI_102249, TTCS_ESRI_102250, TTCS_ESRI_102251, TTCS_ESRI_102252, TTCS_ESRI_102253, TTCS_ESRI_102254, TTCS_ESRI_102255, TTCS_ESRI_102256, TTCS_ESRI_102258, TTCS_ESRI_102259, TTCS_ESRI_102260, TTCS_ESRI_102261, TTCS_ESRI_102262, TTCS_ESRI_102263, TTCS_ESRI_102264, TTCS_ESRI_102265, TTCS_ESRI_102266, TTCS_ESRI_102267, TTCS_ESRI_102268, TTCS_ESRI_102269, TTCS_ESRI_102270, TTCS_ESRI_102271, TTCS_ESRI_102272, TTCS_ESRI_102273, TTCS_ESRI_102274, TTCS_ESRI_102277, TTCS_ESRI_102278, TTCS_ESRI_102280, TTCS_ESRI_102281, TTCS_ESRI_102282, TTCS_ESRI_102283, TTCS_ESRI_102284, TTCS_ESRI_102285, TTCS_ESRI_102286, TTCS_ESRI_102287, TTCS_ESRI_102288, TTCS_ESRI_102289, TTCS_ESRI_102290, TTCS_ESRI_102291, TTCS_ESRI_102292, TTCS_ESRI_102293, TTCS_ESRI_102294, TTCS_ESRI_102295, TTCS_ESRI_102296, TTCS_ESRI_102297, TTCS_ESRI_102298, TTCS_ESRI_102300, TTCS_ESRI_102304, TTCS_ESRI_102307, TTCS_ESRI_102308, TTCS_ESRI_102309, TTCS_ESRI_102310, TTCS_ESRI_102311, TTCS_ESRI_102312, TTCS_ESRI_102313, TTCS_ESRI_102314, TTCS_ESRI_102316, TTCS_ESRI_102317, TTCS_ESRI_102318, TTCS_ESRI_102320, TTCS_ESRI_102321, TTCS_ESRI_102322, TTCS_ESRI_102323, TTCS_ESRI_102324, TTCS_ESRI_102325, TTCS_ESRI_102326, TTCS_ESRI_102327, TTCS_ESRI_102330, TTCS_ESRI_102334, TTCS_ESRI_102335, TTCS_ESRI_102336, TTCS_ESRI_102337, TTCS_ESRI_102338, TTCS_ESRI_102339, TTCS_ESRI_102340, TTCS_ESRI_102341, TTCS_ESRI_102342, TTCS_ESRI_102343, TTCS_ESRI_102344, TTCS_ESRI_102345, TTCS_ESRI_102346, TTCS_ESRI_102347, TTCS_ESRI_102348, TTCS_ESRI_102349, TTCS_ESRI_102350, TTCS_ESRI_102351, TTCS_ESRI_102352, TTCS_ESRI_102353, TTCS_ESRI_102354, TTCS_ESRI_102355, TTCS_ESRI_102356, TTCS_ESRI_102357, TTCS_ESRI_102358, TTCS_ESRI_102361, TTCS_ESRI_102491, TTCS_ESRI_102492, TTCS_ESRI_102581, TTCS_ESRI_102582, TTCS_ESRI_102583, TTCS_ESRI_102584, TTCS_ESRI_102629, TTCS_ESRI_102630, TTCS_ESRI_102631, TTCS_ESRI_102632, TTCS_ESRI_102633, TTCS_ESRI_102634, TTCS_ESRI_102635, TTCS_ESRI_102636, TTCS_ESRI_102637, TTCS_ESRI_102638, TTCS_ESRI_102639, TTCS_ESRI_102640, TTCS_ESRI_102641, TTCS_ESRI_102642, TTCS_ESRI_102643, TTCS_ESRI_102644, TTCS_ESRI_102645, TTCS_ESRI_102646, TTCS_ESRI_102648, TTCS_ESRI_102649, TTCS_ESRI_102650, TTCS_ESRI_102651, TTCS_ESRI_102652, TTCS_ESRI_102653, TTCS_ESRI_102654, TTCS_ESRI_102655, TTCS_ESRI_102656, TTCS_ESRI_102657, TTCS_ESRI_102658, TTCS_ESRI_102659, TTCS_ESRI_102660, TTCS_ESRI_102661, TTCS_ESRI_102662, TTCS_ESRI_102663, TTCS_ESRI_102664, TTCS_ESRI_102665, TTCS_ESRI_102666, TTCS_ESRI_102667, TTCS_ESRI_102668, TTCS_ESRI_102669, TTCS_ESRI_102670, TTCS_ESRI_102671, TTCS_ESRI_102672, TTCS_ESRI_102673, TTCS_ESRI_102674, TTCS_ESRI_102675, TTCS_ESRI_102676, TTCS_ESRI_102677, TTCS_ESRI_102678, TTCS_ESRI_102679, TTCS_ESRI_102680, TTCS_ESRI_102681, TTCS_ESRI_102682, TTCS_ESRI_102683, TTCS_ESRI_102684, TTCS_ESRI_102685, TTCS_ESRI_102686, TTCS_ESRI_102687, TTCS_ESRI_102688, TTCS_ESRI_102689, TTCS_ESRI_102690, TTCS_ESRI_102691, TTCS_ESRI_102692, TTCS_ESRI_102693, TTCS_ESRI_102694, TTCS_ESRI_102695, TTCS_ESRI_102696, TTCS_ESRI_102697, TTCS_ESRI_102698, TTCS_ESRI_102700, TTCS_ESRI_102704, TTCS_ESRI_102707, TTCS_ESRI_102708, TTCS_ESRI_102709, TTCS_ESRI_102710, TTCS_ESRI_102713, TTCS_ESRI_102714, TTCS_ESRI_102716, TTCS_ESRI_102717, TTCS_ESRI_102718, TTCS_ESRI_102719, TTCS_ESRI_102720, TTCS_ESRI_102721, TTCS_ESRI_102722, TTCS_ESRI_102723, TTCS_ESRI_102724, TTCS_ESRI_102725, TTCS_ESRI_102726, TTCS_ESRI_102727, TTCS_ESRI_102728, TTCS_ESRI_102729, TTCS_ESRI_102730, TTCS_ESRI_102733, TTCS_ESRI_102734, TTCS_ESRI_102735, TTCS_ESRI_102736, TTCS_ESRI_102737, TTCS_ESRI_102738, TTCS_ESRI_102739, TTCS_ESRI_102740, TTCS_ESRI_102741, TTCS_ESRI_102742, TTCS_ESRI_102743, TTCS_ESRI_102744, TTCS_ESRI_102745, TTCS_ESRI_102746, TTCS_ESRI_102747, TTCS_ESRI_102748, TTCS_ESRI_102749, TTCS_ESRI_102750, TTCS_ESRI_102751, TTCS_ESRI_102752, TTCS_ESRI_102753, TTCS_ESRI_102754, TTCS_ESRI_102755, TTCS_ESRI_102756, TTCS_ESRI_102757, TTCS_ESRI_102758, TTCS_ESRI_102761, TTCS_ESRI_102766, TTCS_ESRI_103300, TTCS_ESRI_4812, TTCS_ESRI_37002, TTCS_ESRI_37003, TTCS_ESRI_37004, TTCS_ESRI_37005, TTCS_ESRI_37007, TTCS_ESRI_37223, }; /** * CS data structure. */ typedef struct { bool dms, output, swap; const char * params; const char * prjspec; const char * prjname; } thcsdata; extern const thstok thtt_cs[6987]; extern const thcsdata thcsdata_table[4492]; #endif therion/thdata.cxx0000664000175000017500000025171512043754764013266 0ustar useruser/** * @file thdata.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdata.h" #include "thexception.h" #include "thchenc.h" #include "thinfnan.h" #include "thsurvey.h" #include "thlayout.h" #include "thgrade.h" #include "thcsdata.h" #include #include "thdatareader.h" #ifdef THMSVC #define strcasecmp _stricmp #endif thdata::thdata() { this->team_set.clear(); // set standard deviations and declination this->dl_declination = thnan; this->dl_survey_declination = thnan; this->dl_survey_declination_on = false; this->dl_declination_north_grid = false; this->dl_direction = true; this->dli_plumbs = false; this->dli_equates = false; this->d_mark = TT_DATAMARK_TEMP; this->d_flags = TT_LEGFLAG_NONE; this->d_extend = TT_EXTENDFLAG_NORMAL; this->d_vtresh = 67.5; this->d_shape = TT_DATALEG_SHAPE_OCTAGON; this->d_walls = TT_AUTO; this->d_last_equate = 0; this->reset_data_sd(); this->reset_data(); this->di_from = true; this->di_to = true; this->di_length = true; this->di_bearing = true; this->di_gradient = true; this->d_type = TT_DATATYPE_NORMAL; this->d_order[0] = TT_DATALEG_FROM; this->d_order[1] = TT_DATALEG_TO; this->d_order[2] = TT_DATALEG_LENGTH; this->d_order[3] = TT_DATALEG_BEARING; this->d_order[4] = TT_DATALEG_GRADIENT; this->d_nitems = 5; this->d_current = 0; this->stat_length = 0.0; this->stat_dlength = 0.0; this->stat_splaylength = 0.0; this->stat_slength = 0.0; this->stat_alength = 0.0; this->stat_st_state = 0; this->stat_st_top = NULL; this->stat_st_bottom = NULL; this->ugroup = NULL; this->cgroup = this; this->dlu_gradient.allow_percentage = true; } void thdata::reset_data_sd() { this->dls_length = thnan; this->dls_gradient = thnan; this->dls_bearing = thnan; this->dls_counter = thnan; this->dls_depth = thnan; this->dls_dx = thnan; this->dls_dy = thnan; this->dls_dz = thnan; this->dls_x = thnan; this->dls_y = thnan; this->dls_z = thnan; } void thdata::reset_data() { this->di_station = false; this->di_from = false; this->di_to = false; this->di_length = false; this->di_bearing = false; this->di_gradient = false; this->di_backbearing = false; this->di_backgradient = false; this->di_depth = false; this->di_fromdepth = false; this->di_todepth = false; this->di_depthchange = false; this->di_count = false; this->di_fromcount = false; this->di_tocount = false; this->di_dx = false; this->di_dy = false; this->di_dz = false; this->di_direction = false; this->di_newline = false; this->di_interleaved = false; this->di_up = false; this->di_down = false; this->di_left = false; this->di_right = false; this->d_type = TT_DATATYPE_UNKNOWN; int i; for(i = 0; i < THDATA_MAX_ITEMS; i++) this->d_order[i] = TT_DATALEG_UNKNOWN; this->d_nitems = 0; this->d_current = 0; this->cd_leg_def = false; this->pd_leg_def = false; } thdata::~thdata() { } int thdata::get_class_id() { return TT_DATA_CMD; } bool thdata::is(int class_id) { if (class_id == TT_DATA_CMD) return true; else return thdataobject::is(class_id); } int thdata::get_cmd_nargs() { // replace by real number of arguments return 0; } const char * thdata::get_cmd_end() { // insert endcommand if multiline command return "endcentreline"; } bool thdata::get_cmd_ends_state() { return true; } static const thstok thdata__end_cmds[] = { {"endcenterline", TT_DATA_CMD}, {"endcentreline", TT_DATA_CMD}, {NULL, TT_UNKNOWN_CMD}, }; bool thdata::get_cmd_ends_match(char * cmd) { return (thmatch_token(cmd,thdata__end_cmds) == TT_DATA_CMD); } thcmd_option_desc thdata::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_data_opt); if (id == TT_DATA_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else switch (id) { case TT_DATA_FIX: return thcmd_option_desc(id,4); case TT_DATA_SD: case TT_DATA_UNITS: case TT_DATA_INSTRUMENT: case TT_DATA_CALIBRATE: case TT_DATA_INFER: case TT_DATA_STATION: case TT_DATA_EQUATE: case TT_DATA_DATA: case TT_DATA_DECLINATION: case TT_DATA_VTRESH: return thcmd_option_desc(id,2); default: return thcmd_option_desc(id,1); case TT_DATA_BREAK: case TT_DATA_GROUP: case TT_DATA_ENDGROUP: return thcmd_option_desc(id,0); } } void thdata::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { thdate temp_date; thperson temp_person; int prole_i; switch (cod.id) { case 0: // let's split the line thsplit_args(& this->db->mbuff_tmp, *args); this->cgroup->insert_data_leg(this->db->mbuff_tmp.get_size(), this->db->mbuff_tmp.get_buffer()); break; case TT_DATA_FIX: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- fix")) this->cgroup->set_data_fix(cod.nargs, args); break; case TT_DATA_EQUATE: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- equate")) this->cgroup->set_data_equate(cod.nargs, args); break; case TT_DATA_FLAGS: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- flags")) this->cgroup->set_data_flags(cod.nargs, args); break; case TT_DATA_EXTEND: this->cgroup->set_data_extend(cod.nargs, args); break; case TT_DATA_STATION: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- station")) this->cgroup->set_data_station(cod.nargs, args, argenc); break; case TT_DATA_MARK: this->cgroup->set_data_mark(cod.nargs, args); break; case TT_DATA_DATE: temp_date.parse(*args); this->date.join(temp_date); this->set_survey_declination(); break; case TT_DATA_DISCOVERY_DATE: temp_date.parse(*args); this->discovery_date.join(temp_date); break; case TT_DATA_WALLS: if (cod.nargs != 1) ththrow(("invalid number of option arguments -- walls")); this->cgroup->d_walls = thmatch_token(*args, thtt_onoffauto); if (this->cgroup->d_walls == TT_UNKNOWN_BOOL) ththrow(("invalid walls switch -- %s", *args)); break; case TT_DATA_SHAPE: if (cod.nargs != 1) ththrow(("invalid number of option arguments -- shape")); this->cgroup->d_shape = thmatch_token(*args, thtt_dataleg_shape); if (this->cgroup->d_shape == TT_DATALEG_SHAPE_UNKNOWN) ththrow(("unknown shape type -- %s", *args)); break; case TT_DATA_VTRESH: this->cgroup->set_data_vtresh(cod.nargs, args); break; case TT_DATA_INSTRUMENT: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- instrument")) this->set_data_instrument(cod.nargs, args); break; case TT_DATA_SD: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- sd")) this->cgroup->set_data_sd(cod.nargs, args); break; case TT_DATA_DATA: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- data")) this->cgroup->set_data_data(cod.nargs, args); break; case TT_DATA_INFER: this->cgroup->set_data_infer(cod.nargs, args); break; case TT_DATA_GRID_ANGLE: this->cgroup->dl_declination_north_grid = true; if (this->cgroup->cs == TTCS_LOCAL) ththrow(("missing coordinate system specification")) this->cgroup->set_data_declination(cod.nargs, args); break; case TT_DATA_DECLINATION: this->cgroup->dl_declination_north_grid = false; this->cgroup->set_data_declination(cod.nargs, args); break; case TT_DATA_UNITS: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- units")) this->cgroup->set_data_units(cod.nargs, args); break; case TT_DATA_GRADE: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- grade")) this->cgroup->set_data_grade(cod.nargs, args); break; case TT_DATA_BREAK: if (cod.nargs > 0) ththrow(("no arguments allowed after break")) this->cgroup->complete_interleaved_data(); this->cgroup->cd_leg_def = false; this->cgroup->d_current = 0; break; case TT_DATA_CALIBRATE: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- calibrate")) this->cgroup->set_data_calibration(cod.nargs, args); break; case TT_DATA_TEAM: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- team")) thencode(&(this->db->buff_enc), *args, argenc); temp_person.parse(this->db, this->db->buff_enc.get_buffer()); this->team_set.insert(temp_person); // check person roles if (cod.nargs > 1) { for(prole_i = 1; prole_i < cod.nargs; prole_i++) { switch (thmatch_token(args[prole_i], thtt_dataleg_comp)) { case TT_DATALEG_ALTITUDE: case TT_DATALEG_LENGTH: case TT_DATALEG_BEARING: case TT_DATALEG_GRADIENT: case TT_DATALEG_BACKBEARING: case TT_DATALEG_BACKGRADIENT: case TT_DATALEG_NOTES: case TT_DATALEG_ASSISTANT: case TT_DATALEG_INSTRUMENTS: case TT_DATALEG_PICTURES: case TT_DATALEG_COUNT: case TT_DATALEG_DEPTH: case TT_DATALEG_STATION: case TT_DATALEG_POSITION: case TT_DATALEG_DIMS: case TT_DATALEG_UP: case TT_DATALEG_DOWN: case TT_DATALEG_LEFT: case TT_DATALEG_RIGHT: break; default: ththrow(("unknown team role -- %s", args[prole_i])) break; } } } break; case TT_DATA_DISCOVERY_TEAM: if ((indataline & THOP_INLINE) == 0) ththrow(("not a command line option -- explo-team")) thencode(&(this->db->buff_enc), *args, argenc); temp_person.parse(this->db, this->db->buff_enc.get_buffer()); this->discovery_team_set.insert(temp_person); break; case TT_DATA_GROUP: this->start_group(); break; case TT_DATA_ENDGROUP: this->end_group(); break; // if not found, try to set fathers properties default: thdataobject::set(cod, args, argenc, indataline); } } void thdata::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thdata:\n"); fprintf(outf,"\tdate: %s\n",this->date.get_str()); fprintf(outf,"\tlength: %g\n",this->stat_length); // print the data team thdata_team_set_type::iterator ii; for(ii = this->team_set.begin(); ii != this->team_set.end(); ii++) fprintf(outf,"\tteam: \"%s/%s\"\n", ii->get_n1(), ii->get_n2()); fprintf(outf,"\tdiscovery-date: %s\n",this->discovery_date.get_str()); // print the data team for(ii = this->discovery_team_set.begin(); ii != this->discovery_team_set.end(); ii++) fprintf(outf,"\tdiscovery-team: \"%s/%s\"\n", ii->get_n1(), ii->get_n2()); // print survey data for(thdataleg_list::iterator li = this->leg_list.begin(); li != this->leg_list.end(); li++) if (li->is_valid) { fprintf(outf,"\tshot: "); fprintf(outf,li->from); fprintf(outf," - "); fprintf(outf,li->to); switch(li->data_type) { case TT_DATATYPE_NORMAL: fprintf(outf," (normal)\n"); fprintf(outf,"\t\tlength: %f +- %f m\n", thinn(li->length), thinn(li->length_sd)); fprintf(outf,"\t\tbearing: %f +- %f deg\n", thinn(li->bearing), thinn(li->bearing_sd)); fprintf(outf,"\t\tgradient: %f +- %f deg\n", thinn(li->gradient), thinn(li->gradient_sd)); fprintf(outf,"\t\ttotal length: %f\n",thinn(li->total_length)); break; case TT_DATATYPE_CYLPOLAR: fprintf(outf," (cylpolar)\n"); case TT_DATATYPE_DIVING: if (li->data_type == TT_DATATYPE_DIVING) fprintf(outf," (diving)\n"); fprintf(outf,"\t\tlength: %f +- %f m\n", thinn(li->length), thinn(li->length_sd)); fprintf(outf,"\t\tbearing: %f +- %f deg\n", thinn(li->bearing), thinn(li->bearing_sd)); if (thisnan(li->depthchange)) { fprintf(outf,"\t\tfromdepth: %f +- %f m\n", thinn(li->fromdepth), thinn(li->depth_sd)); fprintf(outf,"\t\ttodepth: %f +- %f m\n", thinn(li->todepth), thinn(li->depth_sd)); } else fprintf(outf,"\t\tdepthchange: %f +- %f m\n", thinn(li->depthchange), thinn(li->depth_sd)); fprintf(outf,"\t\ttotal length: %f\n",thinn(li->total_length)); break; case TT_DATATYPE_CARTESIAN: fprintf(outf," (cartesian)\n"); fprintf(outf,"\t\tdx: %f +- %f m\n", thinn(li->dx), thinn(li->dx_sd)); fprintf(outf,"\t\tdy: %f +- %f m\n", thinn(li->dy), thinn(li->dy_sd)); fprintf(outf,"\t\tdz: %f +- %f m\n", thinn(li->dz), thinn(li->dz_sd)); fprintf(outf,"\t\ttotal length: %f\n",thinn(li->total_length)); break; case TT_DATATYPE_NOSURVEY: fprintf(outf," (nosurvey)\n"); break; } fprintf(outf,"\t\tUDLR: (%g,%g,%g,%g) - (%g,%g,%g,%g)\n", thinn(li->from_up),thinn(li->from_down),thinn(li->from_left),thinn(li->from_right), thinn(li->to_up),thinn(li->to_down),thinn(li->to_left),thinn(li->to_right)); fprintf(outf,"\t\tdecination: %f deg\n", thinn(li->declination)); fprintf(outf,"\t\tmark: %d\n", li->s_mark); fprintf(outf,"\t\tflags: %d\n", li->flags); fprintf(outf,"\t\tinfer:"); if (li->infer_plumbs) fprintf(outf," plumbs"); if (li->infer_equates) fprintf(outf," equates"); if (!(li->infer_plumbs || li->infer_equates)) fprintf(outf," none"); fprintf(outf,"\n"); fprintf(outf,"\t\tsurvey: %s\n", li->psurvey->get_full_name()); fprintf(outf,"\t\tsource: %s [%ld]\n", li->srcf.name, li->srcf.line); } // print fixed stations for(thdatafix_list::iterator fxi = this->fix_list.begin(); fxi != this->fix_list.end(); fxi++) { fprintf(outf,"\tfix: "); fprintf(outf,fxi->station); fprintf(outf,"\n"); fprintf(outf,"\t\tpos:\t%f\t%f\t%f\n", thinn(fxi->x), thinn(fxi->y), thinn(fxi->z)); fprintf(outf,"\t\tstd:\t%f\t%f\t%f\n", thinn(fxi->sdx), thinn(fxi->sdy), thinn(fxi->sdz)); fprintf(outf,"\t\tcov:\t%f\t%f\t%f\n", thinn(fxi->cxy), thinn(fxi->cyz), thinn(fxi->cxz)); fprintf(outf,"\t\tsource: %s [%ld]\n", fxi->srcf.name, fxi->srcf.line); } // print equates int last_e = 0; thdataequate_list::iterator eii; for(thdataequate_list::iterator ei = this->equate_list.begin(); ei != this->equate_list.end(); ei++) { if (last_e != ei->eqid) { if (last_e > 0) fprintf(outf,"\n"); fprintf(outf,"\tequate:"); eii = ei; last_e = ei->eqid; } fprintf(outf," "); fprintf(outf,ei->station); } if (last_e > 0) { fprintf(outf," (%s [%ld])\n", eii->srcf.name, eii->srcf.line); } // print stations for(thdatass_list::iterator si = this->ss_list.begin(); si != this->ss_list.end(); si++) { fprintf(outf,"\tstation: "); fprintf(outf,si->station); fprintf(outf," \"%s\" %d (%s [%ld])\n", (si->comment == NULL ? "" : si->comment), si->flags, si->srcf.name, si->srcf.line); } // print dimension lists for(thstdims_list::iterator di = this->dims_list.begin(); di != this->dims_list.end(); di++) { fprintf(outf,"\tUDLR: "); fprintf(outf,di->station); fprintf(outf," %g,%g,%g,%g\n", thinn(di->up), thinn(di->down), thinn(di->left), thinn(di->right)); } } void thdata::self_delete() { delete this; } void thdata::set_data_calibration(int nargs, char ** args) { static int items[THDATA_MAX_ITEMS]; int nitems, iit, itid; // 1-length, 2-angle nitems = nargs - 1; if (nitems > THDATA_MAX_ITEMS) ththrow(("too many quantities")) // scan quantities bool to_set; for (iit = 0; iit < nitems; iit++) { itid = thmatch_token(args[iit], thtt_dataleg_comp); to_set = true; switch (itid) { case TT_DATALEG_LENGTH: case TT_DATALEG_COUNT: case TT_DATALEG_DEPTH: case TT_DATALEG_X: case TT_DATALEG_POSITION: case TT_DATALEG_EASTING: case TT_DATALEG_Y: case TT_DATALEG_NORTHING: case TT_DATALEG_Z: case TT_DATALEG_DIMS: case TT_DATALEG_ALTITUDE: case TT_DATALEG_BEARING: case TT_DATALEG_GRADIENT: case TT_DATALEG_UP: case TT_DATALEG_DOWN: case TT_DATALEG_LEFT: case TT_DATALEG_RIGHT: break; default: to_set = false; nitems = iit; break; } if (to_set) items[iit] = itid; else break; } // parse calibration this->dlc_default.parse(nargs - nitems, args + nitems); // set units for (iit = 0; iit < nitems; iit++) { switch (items[iit]) { case TT_DATALEG_LENGTH: this->dlc_length = this->dlc_default; break; case TT_DATALEG_COUNT: this->dlc_counter = this->dlc_default; break; case TT_DATALEG_DEPTH: this->dlc_depth = this->dlc_default; break; case TT_DATALEG_X: this->dlc_x = this->dlc_default; break; case TT_DATALEG_EASTING: this->dlc_dx = this->dlc_default; break; case TT_DATALEG_Y: this->dlc_y = this->dlc_default; break; case TT_DATALEG_NORTHING: this->dlc_dy = this->dlc_default; break; case TT_DATALEG_Z: this->dlc_z = this->dlc_default; break; case TT_DATALEG_POSITION: this->dlc_x = this->dlc_default; this->dlc_y = this->dlc_default; this->dlc_z = this->dlc_default; break; case TT_DATALEG_ALTITUDE: this->dlc_dz = this->dlc_default; break; case TT_DATALEG_BEARING: this->dlc_bearing = this->dlc_default; break; case TT_DATALEG_GRADIENT: this->dlc_gradient = this->dlc_default; break; case TT_DATALEG_DIMS: this->dlc_up = this->dlc_default; this->dlc_down = this->dlc_default; this->dlc_left = this->dlc_default; this->dlc_right = this->dlc_default; break; case TT_DATALEG_UP: this->dlc_up = this->dlc_default; break; case TT_DATALEG_DOWN: this->dlc_down = this->dlc_default; break; case TT_DATALEG_LEFT: this->dlc_left = this->dlc_default; break; case TT_DATALEG_RIGHT: this->dlc_right = this->dlc_default; break; } } } // data calibration void thdata::set_data_units(int nargs, char ** args) { static int items[THDATA_MAX_ITEMS]; int nitems, iit, itid, sdtype = 0; // 1-length, 2-angle this->dlu_sdangle.allow_percentage = true; nitems = nargs - 1; if (nitems > THDATA_MAX_ITEMS) ththrow(("too many quantities")) // scan quantities bool to_set; for (iit = 0; iit < nitems; iit++) { itid = thmatch_token(args[iit], thtt_dataleg_comp); to_set = true; switch (itid) { case TT_DATALEG_LENGTH: case TT_DATALEG_COUNT: case TT_DATALEG_DEPTH: case TT_DATALEG_DEPTHCHANGE: case TT_DATALEG_POSITION: case TT_DATALEG_X: case TT_DATALEG_EASTING: case TT_DATALEG_Y: case TT_DATALEG_NORTHING: case TT_DATALEG_Z: case TT_DATALEG_ALTITUDE: case TT_DATALEG_DIMS: case TT_DATALEG_UP: case TT_DATALEG_DOWN: case TT_DATALEG_LEFT: case TT_DATALEG_RIGHT: if (sdtype == 0) sdtype = 1; else { if (sdtype != 1) ththrow(("incompatible quantity -- %s", args[iit])) } break; case TT_DATALEG_BEARING: case TT_DATALEG_GRADIENT: if (sdtype == 0) sdtype = 2; else { if (sdtype != 2) ththrow(("incompatible quantity -- %s", args[iit])) } break; default: to_set = false; if (iit == nitems - 1) { nitems--; break; } else ththrow(("invalid quantity -- %s",args[iit])) } if (to_set) items[iit] = itid; } // parse units switch (sdtype) { case 1: this->dlu_sdlength.parse_units(args[nargs-1]); if (nitems == nargs - 2) this->dlu_sdlength.parse_scale(args[nitems]); break; case 2: this->dlu_sdangle.parse_units(args[nargs-1]); if (nitems == nargs - 2) this->dlu_sdangle.parse_scale(args[nitems]); break; } // set units for (iit = 0; iit < nitems; iit++) { switch (items[iit]) { case TT_DATALEG_LENGTH: this->dlu_length = this->dlu_sdlength; break; case TT_DATALEG_COUNT: this->dlu_counter = this->dlu_sdlength; break; case TT_DATALEG_DEPTH: case TT_DATALEG_DEPTHCHANGE: this->dlu_depth = this->dlu_sdlength; break; case TT_DATALEG_X: this->dlu_x = this->dlu_sdlength; break; case TT_DATALEG_EASTING: this->dlu_dx = this->dlu_sdlength; break; case TT_DATALEG_Y: this->dlu_y = this->dlu_sdlength; break; case TT_DATALEG_NORTHING: this->dlu_dy = this->dlu_sdlength; break; case TT_DATALEG_Z: this->dlu_z = this->dlu_sdlength; break; case TT_DATALEG_POSITION: this->dlu_x = this->dlu_sdlength; this->dlu_y = this->dlu_sdlength; this->dlu_z = this->dlu_sdlength; break; case TT_DATALEG_ALTITUDE: this->dlu_dz = this->dlu_sdlength; break; case TT_DATALEG_BEARING: this->dlu_bearing = this->dlu_sdangle; if (this->dlu_bearing.get_units() == TT_TFU_PERC) ththrow(("percentage bearing specification not allowed")) break; case TT_DATALEG_GRADIENT: this->dlu_gradient = this->dlu_sdangle; break; case TT_DATALEG_DIMS: this->dlu_up = this->dlu_sdlength; this->dlu_down = this->dlu_sdlength; this->dlu_left = this->dlu_sdlength; this->dlu_right = this->dlu_sdlength; break; case TT_DATALEG_UP: this->dlu_up = this->dlu_sdlength; break; case TT_DATALEG_DOWN: this->dlu_down = this->dlu_sdlength; break; case TT_DATALEG_LEFT: this->dlu_left = this->dlu_sdlength; break; case TT_DATALEG_RIGHT: this->dlu_right = this->dlu_sdlength; break; } } this->dlu_sdangle.allow_percentage = false; } // data units void thdata::set_data_vtresh(int nargs, char ** args) { if ((nargs < 1) || (nargs > 2)) ththrow(("invalid number of option arguments -- vthreshold")) int nid; thtfangle dlu; thparse_double(nid, this->d_vtresh, args[0]); if (nid != TT_SV_NUMBER) ththrow(("invalid vthreshold -- %s", args[0])) if (nargs > 1) { dlu.parse_units(args[1]); this->d_vtresh = dlu.transform(this->d_vtresh); } if ((this->d_vtresh < 0.0) || (this->d_vtresh > 90.0)) ththrow(("vthreshold out of range -- %s", args[0])) } void thdata::set_data_declination(int nargs, char ** args) { if (nargs > 2) ththrow(("too many option arguments")) int nid; thparse_double(nid, this->dl_declination, args[0]); if (nargs > 1) { this->dlu_declination.parse_units(args[1]); this->dl_declination = this->dlu_declination.transform(this->dl_declination); } else if (nid != TT_SV_NAN) ththrow(("missing angular units")) if ((nid != TT_SV_NUMBER) && (nid != TT_SV_NAN)) ththrow(("invalid number -- %s", args[0])) } void thdata::set_data_infer(int nargs, char ** args) { if (nargs > 2) ththrow(("too many option arguments")) int iwhat, ihow; iwhat = thmatch_token(args[0],thtt_dataleg_infer); ihow = thmatch_token(args[1],thtt_bool); if (ihow == TT_UNKNOWN_BOOL) ththrow(("invalid boolean argument -- %s", args[1])) switch (iwhat) { case TT_DATALEG_INFER_EQUATES: this->dli_equates = (ihow == TT_TRUE); break; case TT_DATALEG_INFER_PLUMBS: this->dli_plumbs = (ihow == TT_TRUE); break; default: ththrow(("invalid argument -- %s", args[0])) } } void thdata::set_data_instrument(int nargs, char ** args) { int iid, i; for (i = 0; i < nargs - 1; i++) { iid = thmatch_token(args[i], thtt_dataleg_comp); switch (iid) { case TT_DATALEG_STATION: case TT_DATALEG_LENGTH: case TT_DATALEG_BEARING: case TT_DATALEG_GRADIENT: case TT_DATALEG_BACKBEARING: case TT_DATALEG_BACKGRADIENT: case TT_DATALEG_DEPTH: case TT_DATALEG_COUNT: case TT_DATALEG_NOTES: case TT_DATALEG_PICTURES: case TT_DATALEG_POSITION: case TT_DATALEG_INSTRUMENTS: case TT_DATALEG_ASSISTANT: case TT_DATALEG_UP: case TT_DATALEG_DOWN: case TT_DATALEG_LEFT: case TT_DATALEG_RIGHT: break; default: ththrow(("invalid instrument -- %s", args[i])) } } } void thdata::set_data_sd(int nargs, char ** args) { static int items[THDATA_MAX_ITEMS]; int nitems, nid, iit, itid, sdtype = 0; // 1-length, 2-angle double nval; nitems = nargs - 1; if (nitems > THDATA_MAX_ITEMS) ththrow(("too many quantities")) // scan quantities bool to_set; for (iit = 0; iit < nitems; iit++) { itid = thmatch_token(args[iit], thtt_dataleg_comp); to_set = true; switch (itid) { case TT_DATALEG_LENGTH: case TT_DATALEG_COUNT: case TT_DATALEG_DEPTH: case TT_DATALEG_X: case TT_DATALEG_EASTING: case TT_DATALEG_Y: case TT_DATALEG_NORTHING: case TT_DATALEG_Z: case TT_DATALEG_ALTITUDE: case TT_DATALEG_POSITION: if (sdtype == 0) sdtype = 1; else { if (sdtype != 1) ththrow(("incompatible quantity -- %s", args[iit])) } break; case TT_DATALEG_BEARING: case TT_DATALEG_GRADIENT: if (sdtype == 0) sdtype = 2; else { if (sdtype != 2) ththrow(("incompatible quantity -- %s", args[iit])) } break; default: to_set = false; if (iit == nitems - 1) { nitems--; break; } else ththrow(("invalid quantity -- %s",args[iit])) } if (to_set) items[iit] = itid; } // parse value thparse_double(nid, nval, args[nitems]); switch (nid) { case TT_SV_NUMBER: if (nitems == nargs - 1) ththrow(("missing standard deviation units")); switch (sdtype) { case 1: this->dlu_sdlength.parse_units(args[nitems+1]); nval = this->dlu_sdlength.transform(nval); break; case 2: this->dlu_sdangle.parse_units(args[nitems+1]); nval = this->dlu_sdangle.transform(nval); break; } break; case TT_SV_NAN: break; default: if (nid != TT_SV_NUMBER) ththrow(("invalid value -- %s", args[nitems])) } // set standard deviations for (iit = 0; iit < nitems; iit++) { switch (items[iit]) { case TT_DATALEG_LENGTH: this->dls_length = nval; break; case TT_DATALEG_COUNT: this->dls_counter = nval; break; case TT_DATALEG_DEPTH: this->dls_depth = nval; break; case TT_DATALEG_X: this->dls_x = nval; break; case TT_DATALEG_EASTING: this->dls_dx = nval; break; case TT_DATALEG_Y: this->dls_y = nval; break; case TT_DATALEG_NORTHING: this->dls_dy = nval; break; case TT_DATALEG_Z: this->dls_z = nval; break; case TT_DATALEG_POSITION: this->dls_x = nval; this->dls_y = nval; this->dls_z = nval; break; case TT_DATALEG_ALTITUDE: this->dls_dz = nval; break; case TT_DATALEG_BEARING: this->dls_bearing = nval; break; case TT_DATALEG_GRADIENT: this->dls_gradient = nval; break; } } } // standard deviation void thdata::set_data_data(int nargs, char ** args) { // OK, finish the data previosly specified this->complete_interleaved_data(); // first let's detect data type this->reset_data(); this->d_type = thmatch_token(args[0], thtt_datatype); if (this->d_type == TT_DATATYPE_UNKNOWN) ththrow(("unknown data type -- %s", args[0])) // second let's detect data order if (nargs > THDATA_MAX_ITEMS) ththrow(("too many quantities")) int dix, idd; bool err_duplicate = false, err_inimm = false, err_itype = false, err_idanl = false; for(dix = 1; dix < nargs; dix++) { idd = thmatch_token(args[dix], thtt_dataleg_comp); switch (idd) { case TT_DATALEG_STATION: if (this->di_station) { err_duplicate = true; break; } if (this->di_newline) { err_idanl = true; break; } if (this->di_from || this->di_to) { err_inimm = true; break; } this->di_station = true; this->di_interleaved = true; break; case TT_DATALEG_FROM: if (this->di_from) { err_duplicate = true; break; } if (this->di_station) { err_inimm = true; break; } if (this->d_type == TT_DATATYPE_DIMS) { err_itype = true; break; } this->di_from = true; break; case TT_DATALEG_TO: if (this->di_to) { err_duplicate = true; break; } if (this->di_station) { err_inimm = true; break; } if (this->d_type == TT_DATATYPE_DIMS) { err_itype = true; break; } this->di_to = true; break; case TT_DATALEG_LENGTH: if (this->di_length || this->di_fromcount || this->di_tocount) { err_duplicate = true; break; } if (this->di_count) { err_inimm = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_length = true; break; case TT_DATALEG_BEARING: if (this->di_bearing) { err_duplicate = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_bearing = true; break; case TT_DATALEG_BACKBEARING: if (this->di_backbearing) { err_duplicate = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_backbearing = true; break; case TT_DATALEG_GRADIENT: if (this->di_gradient) { err_duplicate = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: break; default: err_itype = true; } if (err_itype) break; this->di_gradient = true; break; case TT_DATALEG_BACKGRADIENT: if (this->di_backgradient) { err_duplicate = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: break; default: err_itype = true; } if (err_itype) break; this->di_backgradient = true; break; case TT_DATALEG_DEPTH: if (this->di_depth) { err_duplicate = true; break; } if (this->di_fromdepth || this->di_todepth || this->di_depthchange) { err_inimm = true; break; } if (this->di_newline) { err_idanl = true; break; } switch (this->d_type) { case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_depth = true; this->di_interleaved = true; break; case TT_DATALEG_FROMDEPTH: if (this->di_fromdepth || this->di_depthchange) { err_duplicate = true; break; } if (this->di_depth) { err_inimm = true; break; } switch (this->d_type) { case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_fromdepth = true; break; case TT_DATALEG_TODEPTH: if (this->di_todepth || this->di_depthchange) { err_duplicate = true; break; } if (this->di_depth) { err_inimm = true; break; } switch (this->d_type) { case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_todepth = true; break; case TT_DATALEG_DEPTHCHANGE: if (this->di_depthchange || this->di_fromdepth || this->di_todepth) { err_duplicate = true; break; } if (this->di_depth) { err_inimm = true; break; } switch (this->d_type) { case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_depthchange = true; break; case TT_DATALEG_COUNT: if (this->di_count) { err_duplicate = true; break; } if (this->di_fromcount || this->di_tocount || this->di_length) { err_inimm = true; break; } if (this->di_newline) { err_idanl = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_count = true; this->di_interleaved = true; break; case TT_DATALEG_FROMCOUNT: if (this->di_fromcount || this->di_length) { err_duplicate = true; break; } if (this->di_count) { err_inimm = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_fromcount = true; break; case TT_DATALEG_TOCOUNT: if (this->di_tocount || this->di_length) { err_duplicate = true; break; } if (this->di_count) { err_inimm = true; break; } switch (this->d_type) { case TT_DATATYPE_NORMAL: case TT_DATATYPE_DIVING: case TT_DATATYPE_CYLPOLAR: break; default: err_itype = true; } if (err_itype) break; this->di_tocount = true; break; case TT_DATALEG_EASTING: if (this->di_dx) { err_duplicate = true; break; } if (this->d_type != TT_DATATYPE_CARTESIAN) { err_itype = true; break; } this->di_dx = true; break; case TT_DATALEG_NORTHING: if (this->di_dy) { err_duplicate = true; break; } if (this->d_type != TT_DATATYPE_CARTESIAN) { err_itype = true; break; } this->di_dy = true; break; case TT_DATALEG_ALTITUDE: if (this->di_dz) { err_duplicate = true; break; } if (this->d_type != TT_DATATYPE_CARTESIAN) { err_itype = true; break; } this->di_dz = true; break; case TT_DATALEG_DIRECTION: if (this->di_direction) { err_duplicate = true; break; } if (this->d_type == TT_DATATYPE_DIMS) { err_itype = true; break; } this->di_direction = true; break; case TT_DATALEG_NEWLINE: if (this->di_newline) { err_duplicate = true; break; } if (this->d_type == TT_DATATYPE_DIMS) { err_itype = true; break; } if ((dix == 1) || (dix == nargs - 1)) ththrow(("invalid newline position")) this->di_newline = true; break; case TT_DATALEG_UP: if (this->di_up) { err_duplicate = true; break; } if (this->di_newline) { err_idanl = true; break; } this->di_up = true; break; case TT_DATALEG_DOWN: if (this->di_down) { err_duplicate = true; break; } if (this->di_newline) { err_idanl = true; break; } this->di_down = true; break; case TT_DATALEG_LEFT: if (this->di_left) { err_duplicate = true; break; } if (this->di_newline) { err_idanl = true; break; } this->di_left = true; break; case TT_DATALEG_RIGHT: if (this->di_right) { err_duplicate = true; break; } if (this->di_newline) { err_idanl = true; break; } this->di_right = true; break; case TT_DATALEG_IGNORE: break; case TT_DATALEG_IGNOREALL: break; default: ththrow(("invalid identifier -- %s", args[dix])) } // catch errors if (err_duplicate) ththrow(("duplicate identifier -- %s", args[dix])) if (err_inimm) ththrow(("interleaved and non-interleaved reading mix -- %s", args[dix])) if (err_itype) ththrow(("invalid reading for this style -- %s", args[dix])) if (err_idanl) ththrow(("interleaved reading after newline -- %s", args[dix])) // if no errors, no ignoreall - set order this->d_order[dix - 1] = idd; this->d_nitems++; if (idd == TT_DATALEG_IGNOREALL) break; } // check if all the data specified bool all_data = false; switch(this->d_type) { case TT_DATATYPE_NORMAL: all_data = (this->di_count || (this->di_fromcount && this->di_tocount) || this->di_length) && (this->di_bearing || this->di_backbearing) && (this->di_gradient || this->di_backgradient); break; case TT_DATATYPE_CYLPOLAR: case TT_DATATYPE_DIVING: all_data = (this->di_count || (this->di_fromcount && this->di_tocount) || this->di_length) && (this->di_bearing || this->di_backbearing) && (this->di_depth || (this->di_fromdepth && this->di_todepth) || this->di_depthchange); break; case TT_DATATYPE_CARTESIAN: all_data = this->di_dx || this->di_dy || this->di_dz; break; case TT_DATATYPE_NOSURVEY: all_data = true; break; case TT_DATATYPE_DIMS: all_data = this->di_up || this->di_down || this->di_left || this->di_right; break; } all_data = all_data && ((this->di_from && this->di_to) || this->di_station); if (!all_data) ththrow(("not all data for given style")) if (this->di_interleaved) { for(dix = 0; (!err_inimm) && (dix < this->d_nitems) && (this->d_order[dix] != TT_DATALEG_NEWLINE); dix++) { switch (this->d_order[dix]) { case TT_DATALEG_FROM: case TT_DATALEG_TO: case TT_DATALEG_DIRECTION: case TT_DATALEG_LENGTH: case TT_DATALEG_BEARING: case TT_DATALEG_BACKBEARING: case TT_DATALEG_GRADIENT: case TT_DATALEG_BACKGRADIENT: case TT_DATALEG_FROMCOUNT: case TT_DATALEG_TOCOUNT: case TT_DATALEG_FROMDEPTH: case TT_DATALEG_TODEPTH: case TT_DATALEG_DEPTHCHANGE: case TT_DATALEG_NORTHING: case TT_DATALEG_EASTING: case TT_DATALEG_ALTITUDE: case TT_DATALEG_X: case TT_DATALEG_Y: case TT_DATALEG_Z: err_inimm = true; break; } } if (err_inimm) ththrow(("non-interleaved data before newline -- %s", args[dix])) } } // data data void thdata_parse_dim(const char * src, double & d1, double & d2, bool & d2ok, const char * item, thtfpwf * ctran, thtflength * utran) { int sv; d1 = thnan; d2 = thnan; if (!d2ok) { thparse_double(sv, d1, src); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid %s reading -- %s", item, src)) } else { char ** args; long nargs; thsplit_args(& thdb.mbuff_tmp2, src); args = thdb.mbuff_tmp2.get_buffer(); nargs = thdb.mbuff_tmp2.get_size(); d2ok = false; if ((nargs < 1) || (nargs > 2)) ththrow(("invalid %s reading -- %s", item, src)) if (nargs > 1) { d2ok = true; thparse_double(sv, d2, args[1]); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid %s reading -- %s", item, args[1])) } thparse_double(sv, d1, args[0]); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid %s reading -- %s", item, args[0])) } if (!thisnan(d1)) { d1 = ctran->evaluate(d1); d1 = utran->transform(d1); if (d1 < 0.0) ththrow(("negative %s reading -- %s", item, src)) } if (!thisnan(d2)) { d2 = ctran->evaluate(d2); d2 = utran->transform(d2); if (d2 < 0.0) ththrow(("negative %s reading -- %s", item, src)) } } void thdata_parse_station_name(thobjectname & ds, thmbuffer * sstore, char * src, thdataobject * psobj) { ds.name = NULL; if (strcmp(src,"-") == 0) { ds.name = "-"; } if (strcmp(src,".") == 0) { ds.name = "."; } if (ds.name == NULL) thparse_objectname(ds, sstore, src, psobj); else { ds.survey = NULL; ds.psurvey = thdb.get_current_survey(); } } void thdata::insert_data_leg(int nargs, char ** args) { bool to_clear = true, ftgiven = false, ftorder = false; thdataleg dumm; thstdims * cdims = NULL; #ifdef THDEBUG thdataleg * cdleg; #endif int carg; if ((this->d_current == 0) && (this->d_type != TT_DATATYPE_DIMS)) { this->pd_leg = this->cd_leg; this->pd_leg_def = this->cd_leg_def; this->cd_leg = this->leg_list.insert(this->leg_list.end(),dumm); #ifdef THDEBUG cdleg = &(*this->cd_leg); #endif // set all the data this->cd_leg->srcf = this->db->csrc; this->cd_leg->is_valid = !(this->di_interleaved); this->cd_leg->data_type = this->d_type; this->cd_leg->s_mark = this->d_mark; this->cd_leg->flags = this->d_flags; this->cd_leg->extend = (unsigned char) this->d_extend; this->d_extend &= (TT_EXTENDFLAG_DIRECTION | TT_EXTENDFLAG_IGNORE | TT_EXTENDFLAG_HIDE); this->cd_leg->psurvey = this->db->get_current_survey(); this->cd_leg->walls = this->d_walls; this->cd_leg->vtresh = this->d_vtresh; this->cd_leg->shape = this->d_shape; this->cd_leg->length_sd = this->dls_length; this->cd_leg->bearing_sd = this->dls_bearing; this->cd_leg->gradient_sd = this->dls_gradient; this->cd_leg->counter_sd = this->dls_counter; this->cd_leg->depth_sd = this->dls_depth; this->cd_leg->dx_sd = this->dls_dx; this->cd_leg->dy_sd = this->dls_dy; this->cd_leg->dz_sd = this->dls_dz; this->cd_leg->x_sd = this->dls_x; this->cd_leg->y_sd = this->dls_y; this->cd_leg->z_sd = this->dls_z; if (thisnan(this->dl_declination)) { if (!(this->dl_survey_declination_on)) this->set_survey_declination(); this->cd_leg->declination = this->dl_survey_declination; } else { if (this->dl_declination_north_grid) this->cd_leg->gridcs = this->cs; this->cd_leg->declination = this->dl_declination; } this->cd_leg->infer_plumbs = this->dli_plumbs; this->cd_leg->infer_equates = this->dli_equates; this->cd_leg_def = true; if (this->di_newline) to_clear = false; } if (this->d_type == TT_DATATYPE_DIMS) { // vlozi novu dimension a nastavi pointer na nu cdims = &(*(this->dims_list.insert(this->dims_list.end(), thstdims()))); cdims->psurvey = this->db->get_current_survey(); cdims->srcf = this->db->csrc; to_clear = false; } // now set the data bool exit_new_line = false; int val_id; double val; ftgiven = this->di_from && this->di_to; if (ftgiven) { for(carg = 0; carg < this->d_nitems; carg++) { if (this->d_order[carg] == TT_DATALEG_FROM) { ftorder = true; break; } else if (this->d_order[carg] == TT_DATALEG_TO) { ftorder = false; break; } } } for(carg = 0;this->d_current < this->d_nitems;this->d_current++, carg++) { if ((carg == nargs) && ((this->d_order[this->d_current] != TT_DATALEG_NEWLINE) && (this->d_order[this->d_current] != TT_DATALEG_IGNOREALL))) ththrow(("not enough data readings")) switch(this->d_order[this->d_current]) { case TT_DATALEG_STATION: if (this->d_type == TT_DATATYPE_DIMS) { thparse_objectname(cdims->station, &(this->db->buff_stations), args[carg], this); } else { thdata_parse_station_name(this->cd_leg->station, &(this->db->buff_stations), args[carg], this); } break; case TT_DATALEG_FROM: thdata_parse_station_name(this->cd_leg->from, &(this->db->buff_stations), args[carg], this); break; case TT_DATALEG_TO: thdata_parse_station_name(this->cd_leg->to, &(this->db->buff_stations), args[carg], this); break; case TT_DATALEG_DIRECTION: if (strcasecmp(args[carg],"b") == 0) this->cd_leg->direction = false; else if (strcasecmp(args[carg], "f") != 0) ththrow(("invalid survey direction -- %s", args[carg])) break; case TT_DATALEG_LENGTH: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_length.evaluate(val); val = this->dlu_length.transform(val); if (val < 0.0) ththrow(("negative length reading -- %s", args[carg])) else this->cd_leg->length = val; break; // case TT_SV_NAN: // this->cd_leg->length = val; // break; default: ththrow(("invalid length reading -- %s", args[carg])) } break; case TT_DATALEG_BEARING: if (this->dlu_bearing.get_units() == TT_TFU_DEG) thparse_double_dms(val_id, val, args[carg]); else thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_bearing.evaluate(val); val = this->dlu_bearing.transform(val); if (val < 0.0) val += 360.0; if (val >= 360.0) val -= 360.0; if ((val < 0.0) || (val >= 360.0)) ththrow(("bearing reading out of range -- %s", args[carg])) else this->cd_leg->bearing = val; break; case TT_SV_NAN: this->cd_leg->bearing = val; break; default: ththrow(("invalid bearing reading -- %s", args[carg])) } break; case TT_DATALEG_BACKBEARING: if (this->dlu_bearing.get_units() == TT_TFU_DEG) thparse_double_dms(val_id, val, args[carg]); else thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_bearing.evaluate(val); val = this->dlu_bearing.transform(val); if (val < 0.0) val += 360.0; if (val >= 360.0) val -= 360.0; if ((val < 0.0) || (val >= 360.0)) ththrow(("backwards bearing reading out of range -- %s", args[carg])) else this->cd_leg->backbearing = val; break; case TT_SV_NAN: this->cd_leg->backbearing = val; break; default: ththrow(("invalid backwards bearing reading -- %s", args[carg])) } break; case TT_DATALEG_GRADIENT: if (this->dlu_gradient.get_units() == TT_TFU_DEG) thparse_double_dms(val_id, val, args[carg]); else thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_gradient.evaluate(val); val = this->dlu_gradient.transform(val); if ((val <= -90.00001) || (val >= 90.00001)) ththrow(("gradient reading out of range -- %s", args[carg])) else this->cd_leg->gradient = val; break; // case TT_SV_NAN: case TT_SV_UP: case TT_SV_DOWN: this->cd_leg->gradient = val; break; default: ththrow(("invalid gradient reading -- %s", args[carg])) } break; case TT_DATALEG_BACKGRADIENT: if (this->dlu_gradient.get_units() == TT_TFU_DEG) thparse_double_dms(val_id, val, args[carg]); else thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_gradient.evaluate(val); val = this->dlu_gradient.transform(val); if ((val <= -90.00001) || (val >= 90.00001)) ththrow(("backwards gradient reading out of range -- %s", args[carg])) else this->cd_leg->backgradient = val; break; // case TT_SV_NAN: case TT_SV_UP: case TT_SV_DOWN: this->cd_leg->backgradient = val; break; default: ththrow(("invalid backwards gradient reading -- %s", args[carg])) } break; case TT_DATALEG_COUNT: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_counter.evaluate(val); val = this->dlu_counter.transform(val); if (val < 0.0) ththrow(("negative counter reading -- %s", args[carg])) else this->cd_leg->counter = val; break; // case TT_SV_NAN: // this->cd_leg->counter = val; // break; default: ththrow(("invalid counter reading -- %s", args[carg])) } break; case TT_DATALEG_FROMCOUNT: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_counter.evaluate(val) - this->dlc_counter.evaluate(0.0); val = this->dlu_counter.transform(val); this->cd_leg->fromcounter = val; break; // case TT_SV_NAN: // this->cd_leg->fromcounter = val; // break; default: ththrow(("invalid counter reading -- %s", args[carg])) } break; case TT_DATALEG_TOCOUNT: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_counter.evaluate(val); val = this->dlu_counter.transform(val); this->cd_leg->tocounter = val; break; // case TT_SV_NAN: // this->cd_leg->tocounter = val; // break; default: ththrow(("invalid counter reading -- %s", args[carg])) } break; case TT_DATALEG_DEPTH: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_depth.evaluate(val); val = this->dlu_depth.transform(val); this->cd_leg->depth = val; break; // case TT_SV_NAN: // this->cd_leg->depth = val; // break; default: ththrow(("invalid depth reading -- %s", args[carg])) } break; case TT_DATALEG_FROMDEPTH: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_depth.evaluate(val) - this->dlc_depth.evaluate(0.0); val = this->dlu_depth.transform(val); this->cd_leg->fromdepth = val; break; // case TT_SV_NAN: // this->cd_leg->fromdepth = val; // break; default: ththrow(("invalid depth reading -- %s", args[carg])) } break; case TT_DATALEG_TODEPTH: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_depth.evaluate(val); val = this->dlu_depth.transform(val); this->cd_leg->todepth = val; break; // case TT_SV_NAN: // this->cd_leg->todepth = val; // break; default: ththrow(("invalid depth reading -- %s", args[carg])) } break; case TT_DATALEG_DEPTHCHANGE: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_depth.evaluate(val); val = this->dlu_depth.transform(val); this->cd_leg->depthchange = val; break; // case TT_SV_NAN: // this->cd_leg->depthchange = val; // break; default: ththrow(("invalid depth change reading -- %s", args[carg])) } break; case TT_DATALEG_NORTHING: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_dy.evaluate(val); val = this->dlu_dy.transform(val); this->cd_leg->dy = val; break; // case TT_SV_NAN: // this->cd_leg->dy = val; // break; default: ththrow(("invalid northing reading -- %s", args[carg])) } break; case TT_DATALEG_EASTING: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_dx.evaluate(val); val = this->dlu_dx.transform(val); this->cd_leg->dx = val; break; // case TT_SV_NAN: // this->cd_leg->dx = val; // break; default: ththrow(("invalid easting reading -- %s", args[carg])) } break; case TT_DATALEG_ALTITUDE: thparse_double(val_id, val, args[carg]); switch (val_id) { case TT_SV_NUMBER: val = this->dlc_dz.evaluate(val); val = this->dlu_dz.transform(val); this->cd_leg->dz = val; break; // case TT_SV_NAN: // this->cd_leg->dz = val; // break; default: ththrow(("invalid altitude reading -- %s", args[carg])) } break; case TT_DATALEG_IGNOREALL: carg = nargs; to_clear = true; case TT_DATALEG_NEWLINE: this->d_current++; exit_new_line = true; break; // iba ak specifikovane from a to, tak moozu byt dve // hodnoty - inak nacitavame do to case TT_DATALEG_UP: if (this->d_type == TT_DATATYPE_DIMS) { ftgiven = false; thdata_parse_dim(args[carg], cdims->up, val, ftgiven, "up", &this->dlc_up, &this->dlu_up); } else { ftgiven = this->di_from && this->di_to; thdata_parse_dim(args[carg], this->cd_leg->to_up, this->cd_leg->from_up, ftgiven, "up", &this->dlc_up, &this->dlu_up); if (ftgiven && ftorder) { val = this->cd_leg->to_up; this->cd_leg->to_up = this->cd_leg->from_up; this->cd_leg->from_up = val; } } break; case TT_DATALEG_DOWN: if (this->d_type == TT_DATATYPE_DIMS) { ftgiven = false; thdata_parse_dim(args[carg], cdims->down, val, ftgiven, "down", &this->dlc_down, &this->dlu_down); } else { ftgiven = this->di_from && this->di_to; thdata_parse_dim(args[carg], this->cd_leg->to_down, this->cd_leg->from_down, ftgiven, "down", &this->dlc_down, &this->dlu_down); if (ftgiven && ftorder) { val = this->cd_leg->to_down; this->cd_leg->to_down = this->cd_leg->from_down; this->cd_leg->from_down = val; } } break; case TT_DATALEG_LEFT: if (this->d_type == TT_DATATYPE_DIMS) { ftgiven = false; thdata_parse_dim(args[carg], cdims->left, val, ftgiven, "left", &this->dlc_left, &this->dlu_left); } else { ftgiven = this->di_from && this->di_to; thdata_parse_dim(args[carg], this->cd_leg->to_left, this->cd_leg->from_left, ftgiven, "left", &this->dlc_left, &this->dlu_left); if (ftgiven && ftorder) { val = this->cd_leg->to_left; this->cd_leg->to_left = this->cd_leg->from_left; this->cd_leg->from_left = val; } } break; case TT_DATALEG_RIGHT: if (this->d_type == TT_DATATYPE_DIMS) { ftgiven = false; thdata_parse_dim(args[carg], cdims->right, val, ftgiven, "right", &this->dlc_right, &this->dlu_right); } else { ftgiven = this->di_from && this->di_to; thdata_parse_dim(args[carg], this->cd_leg->to_right, this->cd_leg->from_right, ftgiven, "right", &this->dlc_right, &this->dlu_right); if (ftgiven && ftorder) { val = this->cd_leg->to_right; this->cd_leg->to_right = this->cd_leg->from_right; this->cd_leg->from_right = val; } } break; } if (exit_new_line) break; } // end of data setting if (carg < nargs) ththrow(("too many data readings")) if (to_clear) { if (this->di_fromcount && this->di_tocount && (this->cd_leg->fromcounter > this->cd_leg->tocounter)) ththrow(("negative counter difference")) // if ((this->di_gradient || this->di_backgradient) && (this->di_bearing || this->di_backbearing) && // (!(thisnan(this->cd_leg->bearing) // && thisnan(this->cd_leg->backbearing))) && // (((thisinf(this->cd_leg->gradient) != 0) || // (thisinf(this->cd_leg->backgradient) != 0)))) // ththrow(("compass reading given on plumbed shot")) if ((this->di_gradient && this->di_backgradient) && (((thisinf(this->cd_leg->gradient) != 0) && (thisinf(this->cd_leg->backgradient) == 0)) || ((thisinf(this->cd_leg->gradient) == 0) && (thisinf(this->cd_leg->backgradient) != 0)))) ththrow(("plumbed shot with a gradient reading")) this->d_current = 0; this->complete_interleaved_data(); } if (this->d_type == TT_DATATYPE_DIMS) { this->d_current = 0; } } void thdata::complete_interleaved_data() { if (!this->di_interleaved) return; if (!this->pd_leg_def) return; if (this->cd_leg->is_valid) return; // OK, set the station name if (this->di_station) { this->pd_leg->from = this->pd_leg->station; this->pd_leg->to = this->cd_leg->station; } if (this->di_up) { this->pd_leg->from_up = this->pd_leg->to_up; this->pd_leg->to_up = this->cd_leg->to_up; } if (this->di_down) { this->pd_leg->from_down = this->pd_leg->to_down; this->pd_leg->to_down = this->cd_leg->to_down; } if (this->di_left) { this->pd_leg->from_left = this->pd_leg->to_left; this->pd_leg->to_left = this->cd_leg->to_left; } if (this->di_right) { this->pd_leg->from_right = this->pd_leg->to_right; this->pd_leg->to_right = this->cd_leg->to_right; } // set the counter if (this->di_count) { this->pd_leg->fromcounter = this->pd_leg->counter; this->pd_leg->tocounter = this->cd_leg->counter; if ((!thisnan(this->pd_leg->fromcounter)) && (!thisnan(this->pd_leg->tocounter)) && (this->pd_leg->fromcounter > this->pd_leg->tocounter)) ththrow(("negative counter difference")) } // set the depth if (this->di_depth) { this->pd_leg->fromdepth = this->pd_leg->depth; this->pd_leg->todepth = this->cd_leg->depth; } this->pd_leg->topofil = (this->di_count || this->di_fromcount || this->di_tocount); this->pd_leg->is_valid = true; } void thdata::start_insert() { if (this->cgroup->ugroup != NULL) ththrow(("missing endgroup")) this->complete_interleaved_data(); } void thdata::set_data_fix(int nargs, char ** args) { int ai, vid; double val; thdatafix dumm; thdatafix_list::iterator it; switch(nargs) { case 4: case 5: case 6: case 7: // case 10: break; default: ththrow(("invalid number of fix option arguments")) } it = this->fix_list.insert(this->fix_list.end(),dumm); it->srcf = this->db->csrc; it->psurvey = this->db->get_current_survey(); it->sdx = thnan; it->sdy = thnan; it->sdz = thnan; this->convert_cs(args[1], args[2], it->x, it->y); for(ai = 0; ai < nargs; ai++) { if (ai > 2) { thparse_double(vid, val, args[ai]); if (vid != TT_SV_NUMBER) ththrow(("invalid number -- %s", args[ai])) } switch (ai) { case 0: thparse_objectname(it->station, & this->db->buff_stations, args[0], this); break; case 1: if (this->cs == TTCS_LOCAL) { val = this->dlc_x.evaluate(it->x); val = this->dlu_x.transform(val); it->x = val; } break; case 2: if (this->cs == TTCS_LOCAL) { val = this->dlc_y.evaluate(it->y); val = this->dlu_y.transform(val); it->y = val; } break; case 3: val = this->dlc_z.evaluate(val); val = this->dlu_z.transform(val); it->z = val; break; case 4: val = this->dlu_x.transform(val); it->sdx = val; it->sdy = val; it->sdz = val; break; case 5: if (nargs == 6) { val = this->dlu_z.transform(val); it->sdz = val; } else { val = this->dlu_y.transform(val); it->sdy = val; } break; case 6: val = this->dlu_z.transform(val); it->sdz = val; break; case 7: val = this->dlu_x.transform(val); val = this->dlu_y.transform(val); it->cxy = val; break; case 8: val = this->dlu_y.transform(val); val = this->dlu_z.transform(val); it->cyz = val; break; case 9: val = this->dlu_x.transform(val); val = this->dlu_z.transform(val); it->cxz = val; break; } } } void thdata::set_data_equate(int nargs, char ** args) { int eid, cid = ++this->d_last_equate; thdataequate dumm; thdataequate_list::iterator it; for(eid = 0; eid < nargs; eid++) { it = this->equate_list.insert(this->equate_list.end(),dumm); thparse_objectname(it->station, & this->db->buff_stations, args[eid], this); it->eqid = cid; it->srcf = this->db->csrc; it->psurvey = this->db->get_current_survey(); } } #define setstflag(casev, flagv) case casev: \ if (notflag) \ it->flags &= ~flagv; \ else \ it->flags |= flagv; \ break void thdata::set_data_station(int nargs, char ** args, int argenc) { int ai, fid, sv; thdatass_list::iterator it; thdatass dumm; std::string attrname; bool notflag = false; it = this->ss_list.insert(this->ss_list.end(),dumm); it->srcf = this->db->csrc; it->psurvey = this->db->get_current_survey(); for(ai = 0; ai < nargs; ai++) { switch (ai) { case 0: thparse_objectname(it->station, & this->db->buff_stations, args[0], this); break; case 1: if (strlen(args[1]) > 0) { thencode(&(this->db->buff_enc), args[1], argenc); it->comment = this->db->strstore(this->db->buff_enc.get_buffer()); } break; default: fid = thmatch_token(args[ai], thtt_datasflag); switch (fid) { case TT_DATASFLAG_ENTRANCE: if (notflag) it->flags &= ~TT_STATIONFLAG_ENTRANCE; else it->flags |= TT_STATIONFLAG_ENTRANCE; break; setstflag(TT_DATASFLAG_AIRDRAUGHT, (TT_STATIONFLAG_AIRDRAUGHT_SUMMER + TT_STATIONFLAG_AIRDRAUGHT_WINTER)); setstflag(TT_DATASFLAG_AIRDRAUGHT_SUMMER, TT_STATIONFLAG_AIRDRAUGHT_SUMMER); setstflag(TT_DATASFLAG_AIRDRAUGHT_WINTER, TT_STATIONFLAG_AIRDRAUGHT_WINTER); setstflag(TT_DATASFLAG_SINK, TT_STATIONFLAG_SINK); setstflag(TT_DATASFLAG_SPRING, TT_STATIONFLAG_SPRING); setstflag(TT_DATASFLAG_DOLINE, TT_STATIONFLAG_DOLINE); setstflag(TT_DATASFLAG_DIG, TT_STATIONFLAG_DIG); setstflag(TT_DATASFLAG_OVERHANG, TT_STATIONFLAG_OVERHANG); setstflag(TT_DATASFLAG_ARCH, TT_STATIONFLAG_ARCH); case TT_DATASFLAG_FIXED: if (notflag) it->flags |= TT_STATIONFLAG_NOTFIXED; else ththrow(("you can not set fixed station flag directly - fix command needs to be used for this")); break; case TT_DATASFLAG_CONT: if (notflag) { it->explored = thnan; it->flags &= ~TT_STATIONFLAG_CONT; } else it->flags |= TT_STATIONFLAG_CONT; break; //case TT_DATASFLAG_CODE: // if ((it->flags & TT_STATIONFLAG_CONT) == 0) // ththrow(("missing continuation flag before code")); // if (notflag) { // it->code = NULL; // break; // } // if ((ai + 1) == nargs) // ththrow(("too few flags - missing continuation code")); // ai++; // if (strlen(args[ai]) == 0) { // it->code = NULL; // } else { // thencode(&(this->db->buff_enc), args[ai], argenc); // it->code = this->db->strstore(this->db->buff_enc.get_buffer()); // } // break; case TT_DATASFLAG_EXPLORED: if ((it->flags & TT_STATIONFLAG_CONT) == 0) ththrow(("missing continuation flag before explored length")); if (notflag) { it->explored = thnan; break; } if ((ai + 1) == nargs) ththrow(("too few flags - missing explored length")); ai++; if (strlen(args[ai]) == 0) { it->explored = thnan; } else { thparse_length(sv, it->explored, args[ai]); if (sv == TT_SV_UNKNOWN) ththrow(("invalid explored length specification -- %s", args[ai])); } break; case TT_DATASFLAG_ATTR: if ((ai + 1) == nargs) ththrow(("too few flags - missing attribute name")); ai++; if (strlen(args[ai]) == 0) ththrow(("epmty attribute name not allowed")) if (args[ai][0] == '_') ththrow(("attribute name starting with '_' not allowed -- %s", args[ai])) if (!th_is_attr_name(args[ai])) ththrow(("invalid characters in attribute name -- %s", args[ai])) attrname = args[ai]; if (notflag) { it->attr.erase(attrname); break; } if ((ai + 1) == nargs) ththrow(("too few flags - missing attribute value")); ai++; if (strlen(args[ai]) > 0) { thencode(&(this->db->buff_enc), args[ai], argenc); it->attr[attrname] = this->db->strstore(this->db->buff_enc.get_buffer()); } else { it->attr.erase(attrname); } break; case TT_DATASFLAG_NOT: break; default: ththrow(("invalid station flag -- %s", args[ai])) } if (fid == TT_DATASFLAG_NOT) notflag = true; else notflag = false; break; } } } void thdata::set_data_flags(int nargs, char ** args) { int fid, ffl; bool notb = false; for (fid = 0; fid < nargs; fid++) { ffl = thmatch_token(args[fid], thtt_datalflag); switch (ffl) { case TT_DATALFLAG_NOT: if ((fid < nargs - 1) && (!notb)) notb = true; else ththrow(("wrong not context")) break; case TT_DATALFLAG_SURFACE: if (notb) this->d_flags &= ~TT_LEGFLAG_SURFACE; else this->d_flags |= TT_LEGFLAG_SURFACE; notb = false; break; case TT_DATALFLAG_SPLAY: if (notb) this->d_flags &= ~TT_LEGFLAG_SPLAY; else this->d_flags |= TT_LEGFLAG_SPLAY; notb = false; break; case TT_DATALFLAG_APPROXIMATE: if (notb) this->d_flags &= ~TT_LEGFLAG_APPROXIMATE; else this->d_flags |= TT_LEGFLAG_APPROXIMATE; notb = false; break; case TT_DATALFLAG_DUPLICATE: if (notb) this->d_flags &= ~TT_LEGFLAG_DUPLICATE; else this->d_flags |= TT_LEGFLAG_DUPLICATE; notb = false; break; default: ththrow(("unknown leg flag -- %s", args[fid])) } } } void thdata::set_data_extend(int nargs, char ** args) { int cextend; thdataextend dumm; cextend = thmatch_token(args[0], thtt_extendflag); if (cextend == TT_EXTENDFLAG_UNKNOWN) ththrow(("unknown extend flag -- %s", args[0])) switch (nargs) { case 1: if ((cextend & TT_EXTENDFLAG_DIRECTION) != 0) { this->d_extend &= ~TT_EXTENDFLAG_DIRECTION; } this->d_extend |= cextend; break; case 3: // parsnut mena to bodu thparse_objectname(dumm.to, & this->db->buff_stations, args[2], this); case 2: // parsnut meno from bodu a prida thparse_objectname(dumm.from, & this->db->buff_stations, args[1], this); dumm.extend = cextend; dumm.srcf = this->db->csrc; dumm.psurvey = this->db->get_current_survey(); this->extend_list.insert(this->extend_list.end(), dumm); break; default: ththrow(("invalid extend specification")) } } void thdata::set_data_mark(int nargs, char ** args) { if (nargs < 1) ththrow(("missing option arguments -- mark")); int tmp_mark = thmatch_token(args[nargs - 1], thtt_datamark); if (tmp_mark == TT_DATAMARK_UNKNOWN) { ththrow(("unknown type of station mark -- %s", args[nargs - 1])) } if (nargs > 1) { thdatamark dumm; thdatamark_list::iterator it; int mi; for(mi = 0; mi < (nargs - 1); mi++) { it = this->mark_list.insert(this->mark_list.end(),dumm); it->mark = tmp_mark; thparse_objectname(it->station, & this->db->buff_stations, args[mi], this); it->srcf = this->db->csrc; it->psurvey = this->db->get_current_survey(); } } else this->d_mark = tmp_mark; } void thdata::set_data_grade(int nargs, char ** args) { thgrade * cgrd; int gid; this->reset_data_sd(); for (gid = 0; gid < nargs; gid++) { cgrd = this->db->get_grade(args[gid]); if (cgrd != NULL) cgrd->update_data_sd(this); else ththrow(("unknown survey grade -- %s", args[gid])) } } const char * thdata::get_cmd_name() { return "centreline"; } void thdata::set_survey_declination() { double ad = 0, admin, admax; thsurvey * csptr; bool addef = false; thtfpwfxy * decdata; size_t ndecdata, idd; // calculate average survey date if (this->date.is_defined()) { addef = true; if (this->date.is_interval()) ad = (this->date.get_start_year() + this->date.get_end_year()) / 2.0; else ad = this->date.get_start_year(); } else { addef = false; } // find nearest survey, where declination is defined if (this->fsptr != NULL) csptr = this->fsptr; else csptr = this->db->get_current_survey(); bool hasdec = false; if (csptr != NULL) { hasdec = csptr->get_decdef(); while((csptr != NULL) && (!hasdec)) { csptr = csptr->get_father_survey(); if (csptr != NULL) hasdec = csptr->get_decdef(); } } // set survey declination if (hasdec) { if ((!addef) && (!thisnan(csptr->get_decuds()))) { this->dl_survey_declination = csptr->get_decuds(); } else { if (!addef) { // let's calculate ad in the middle of defined interval ndecdata = csptr->get_declin()->get_size(); decdata = csptr->get_declin()->get_values(); admin = decdata->x; admax = decdata->y; for (idd = 1; idd < ndecdata; idd++) { if (decdata[idd].x < admin) admin = decdata[idd].x; if (decdata[idd].x > admax) admax = decdata[idd].x; } ad = (admin + admax) / 2.0; } this->dl_survey_declination = csptr->get_declin()->evaluate(ad); if (!addef) thwarning(("%s [%d] -- no declination specified for undated survey data -- using average (%.2f degrees)", thdbreader.get_cinf()->get_cif_name(), thdbreader.get_cinf()->get_cif_line_number(), this->dl_survey_declination)); } } else this->dl_survey_declination = thnan; dl_survey_declination_on = true; } void thdata::start_group() { thdata * tmp = new thdata; tmp->ugroup = this->cgroup; this->cgroup->complete_interleaved_data(); this->cgroup->cd_leg_def = false; this->cgroup->d_current = 0; tmp->db = this->db; // nastavi secko tak, ako to mame nastavene teraz tmp->dlu_length = this->cgroup->dlu_length; tmp->dlu_counter = this->cgroup->dlu_counter; tmp->dlu_depth = this->cgroup->dlu_depth; tmp->dlu_dx = this->cgroup->dlu_dx; tmp->dlu_dy = this->cgroup->dlu_dy; tmp->dlu_dz = this->cgroup->dlu_dz; tmp->dlu_x = this->cgroup->dlu_x; tmp->dlu_y = this->cgroup->dlu_y; tmp->dlu_z = this->cgroup->dlu_z; tmp->dlu_sdlength = this->cgroup->dlu_sdlength; tmp->dlu_bearing = this->cgroup->dlu_bearing; tmp->dlu_gradient = this->cgroup->dlu_gradient; tmp->dlu_declination = this->cgroup->dlu_declination; tmp->dlu_sdangle = this->cgroup->dlu_sdangle; tmp->dlc_length = this->cgroup->dlc_length; tmp->dlc_gradient = this->cgroup->dlc_gradient; tmp->dlc_bearing = this->cgroup->dlc_bearing; tmp->dlc_counter = this->cgroup->dlc_counter; tmp->dlc_depth = this->cgroup->dlc_depth; tmp->dlc_dx = this->cgroup->dlc_dx; tmp->dlc_dy = this->cgroup->dlc_dy; tmp->dlc_dz = this->cgroup->dlc_dz; tmp->dlc_x = this->cgroup->dlc_x; tmp->dlc_y = this->cgroup->dlc_y; tmp->dlc_z = this->cgroup->dlc_z; tmp->dlc_default = this->cgroup->dlc_default; // dls - data standard deviation and declination tmp->dls_length = this->cgroup->dls_length; tmp->dls_gradient = this->cgroup->dls_gradient; tmp->dls_bearing = this->cgroup->dls_bearing; tmp->dls_counter = this->cgroup->dls_counter; tmp->dls_depth = this->cgroup->dls_depth; tmp->dls_dx = this->cgroup->dls_dx; tmp->dls_dy = this->cgroup->dls_dy; tmp->dls_dz = this->cgroup->dls_dz; tmp->dls_x = this->cgroup->dls_x; tmp->dls_y = this->cgroup->dls_y; tmp->dls_z = this->cgroup->dls_z; tmp->dl_declination = this->cgroup->dl_declination; tmp->dl_declination_north_grid = this->cgroup->dl_declination_north_grid; tmp->cs = this->cgroup->cs; tmp->cs_source = this->cgroup->cs_source; tmp->dl_survey_declination = this->cgroup->dl_survey_declination; tmp->dli_plumbs = this->cgroup->dli_plumbs; tmp->dli_equates = this->cgroup->dli_equates; tmp->dl_direction = this->cgroup->dl_direction; // what is inserted tmp->di_station = this->cgroup->di_station; tmp->di_from = this->cgroup->di_from; tmp->di_to = this->cgroup->di_to; tmp->di_length = this->cgroup->di_length; tmp->di_bearing = this->cgroup->di_bearing; tmp->di_gradient = this->cgroup->di_gradient; tmp->di_backbearing = this->cgroup->di_backbearing; tmp->di_backgradient = this->cgroup->di_backgradient; tmp->di_depth = this->cgroup->di_depth; tmp->di_fromdepth = this->cgroup->di_fromdepth; tmp->di_todepth = this->cgroup->di_todepth; tmp->di_depthchange = this->cgroup->di_depthchange; tmp->di_count = this->cgroup->di_count; tmp->di_fromcount = this->cgroup->di_fromcount; tmp->di_tocount = this->cgroup->di_tocount; tmp->di_dx = this->cgroup->di_dx; tmp->di_dy = this->cgroup->di_dy; tmp->di_dz = this->cgroup->di_dz; tmp->di_direction = this->cgroup->di_direction; tmp->di_newline = this->cgroup->di_newline; tmp->di_interleaved = this->cgroup->di_interleaved; tmp->di_up = this->cgroup->di_up; tmp->di_down = this->cgroup->di_down; tmp->di_left = this->cgroup->di_left; tmp->di_right = this->cgroup->di_right; tmp->dl_survey_declination_on = this->cgroup->dl_survey_declination_on; tmp->d_type = this->cgroup->d_type; for (int i = 0; i < THDATA_MAX_ITEMS; i++) tmp->d_order[i] = this->cgroup->d_order[i]; tmp->d_nitems = this->cgroup->d_nitems; tmp->d_mark = this->cgroup->d_mark; tmp->d_flags = this->cgroup->d_flags; tmp->d_extend = this->cgroup->d_extend & (TT_EXTENDFLAG_DIRECTION | TT_EXTENDFLAG_IGNORE | TT_EXTENDFLAG_HIDE); tmp->d_last_equate = this->cgroup->d_last_equate; tmp->d_vtresh = this->cgroup->d_vtresh; tmp->d_walls = this->cgroup->d_walls; tmp->d_shape = this->cgroup->d_shape; this->cgroup = tmp; } void thdata::end_group() { if (this->cgroup->ugroup == NULL) { ththrow(("endgroup without startgroup")) } thdata * tmp = this->cgroup; this->cgroup = this->cgroup->ugroup; tmp->complete_interleaved_data(); // do cgroupu prida vsetky zoznamy ktore existuju // teda stations, fixes, equates a legs // survey data for(thdataleg_list::iterator li = tmp->leg_list.begin(); li != tmp->leg_list.end(); li++) if (li->is_valid) { this->cgroup->leg_list.insert(this->cgroup->leg_list.end(), (*li)); } // fixed stations for(thdatafix_list::iterator fxi = tmp->fix_list.begin(); fxi != tmp->fix_list.end(); fxi++) { this->cgroup->fix_list.insert(this->cgroup->fix_list.end(), (*fxi)); } // extend specs for(thdataextend_list::iterator xxi = tmp->extend_list.begin(); xxi != tmp->extend_list.end(); xxi++) { this->cgroup->extend_list.insert(this->cgroup->extend_list.end(), (*xxi)); } // marks for(thdatamark_list::iterator mi = tmp->mark_list.begin(); mi != tmp->mark_list.end(); mi++) { this->cgroup->mark_list.insert(this->cgroup->mark_list.end(), (*mi)); } // equates for(thdataequate_list::iterator ei = tmp->equate_list.begin(); ei != tmp->equate_list.end(); ei++) { this->cgroup->equate_list.insert(this->cgroup->equate_list.end(), (*ei)); } // stations for(thdatass_list::iterator si = tmp->ss_list.begin(); si != tmp->ss_list.end(); si++) { this->cgroup->ss_list.insert(this->cgroup->ss_list.end(), (*si)); } // dimensions for(thstdims_list::iterator di = tmp->dims_list.begin(); di != tmp->dims_list.end(); di++) { this->cgroup->dims_list.insert(this->cgroup->dims_list.end(), (*di)); } tmp->self_delete(); } struct thdatadimrec { double u,d,l,r; thdatadimrec() : u(thnan), d(thnan), l(thnan), r(thnan) {} }; typedef std::map thdatadimmap; #define setdims(sU,sD,sL,sR,tU,tD,tL,tR) {\ if (!thisnan(sU)) tU = sU; \ if (!thisnan(sD)) tD = sD; \ if (!thisnan(sL)) tL = sL; \ if (!thisnan(sR)) tR = sR; \ } #define adddims(sU,sD,sL,sR,tU,tD,tL,tR) {\ if (thisnan(tU)) tU = sU; \ if (thisnan(tD)) tD = sD; \ if (thisnan(tL)) tL = sL; \ if (thisnan(tR)) tR = sR; \ } void thdata::complete_dimensions() { thdatadimmap dm, idm; thdatadimmap::iterator dmi; thdatadimrec dr; thdataleg_list::iterator li, pli; // vytvori explicitny dim map for(thstdims_list::iterator di = this->dims_list.begin(); di != this->dims_list.end(); di++) { dr = dm[di->station.id]; setdims(di->up,di->down,di->left,di->right,dr.u,dr.d,dr.l,dr.r); dm[di->station.id] = dr; } #define start_leg_cycle \ for(li = this->leg_list.begin(); li != this->leg_list.end(); li++) \ if (li->is_valid) { #define end_leg_cycle } // vytvori implicitny dim map start_leg_cycle dr = idm[li->from.id]; setdims(li->from_up, li->from_down, li->from_left, li->from_right, dr.u, dr.d, dr.l, dr.r) idm[li->from.id] = dr; dr = idm[li->to.id]; setdims(li->to_up, li->to_down, li->to_left, li->to_right, dr.u, dr.d, dr.l, dr.r) idm[li->to.id] = dr; end_leg_cycle // priradi explicitny dim map if (this->dims_list.size() > 0) { start_leg_cycle dmi = dm.find(li->from.id); if (dmi != dm.end()) adddims(dmi->second.u, dmi->second.d, dmi->second.l, dmi->second.r, li->from_up, li->from_down, li->from_left, li->from_right); dmi = dm.find(li->to.id); if (dmi != dm.end()) adddims(dmi->second.u, dmi->second.d, dmi->second.l, dmi->second.r, li->to_up, li->to_down, li->to_left, li->to_right); end_leg_cycle } pli = this->leg_list.end(); start_leg_cycle // ak je zadany aspon jeden udaj if ((!thisnan(li->from_up)) || (!thisnan(li->from_down)) || (!thisnan(li->from_left)) || (!thisnan(li->from_right)) || (!thisnan(li->to_up)) || (!thisnan(li->to_down)) || (!thisnan(li->to_left)) || (!thisnan(li->to_right))) { // predchadzajuca zamera if ((pli != this->leg_list.end()) && (pli->to.id == li->from.id)) adddims(pli->to_up, pli->to_down, pli->to_left, pli->to_right, li->from_up, li->from_down, li->from_left, li->from_right); if ((pli != this->leg_list.end()) && (pli->from.id == li->from.id)) adddims(pli->from_up, pli->from_down, pli->from_left, pli->from_right, li->from_up, li->from_down, li->from_left, li->from_right); // impl. dim map dmi = idm.find(li->from.id); if (dmi != idm.end()) adddims(dmi->second.u, dmi->second.d, dmi->second.l, dmi->second.r, li->from_up, li->from_down, li->from_left, li->from_right); dmi = idm.find(li->to.id); if (dmi != idm.end()) adddims(dmi->second.u, dmi->second.d, dmi->second.l, dmi->second.r, li->to_up, li->to_down, li->to_left, li->to_right); // prev station/next station adddims(li->to_up, li->to_down, li->to_left, li->to_right, li->from_up, li->from_down, li->from_left, li->from_right); adddims(li->from_up, li->from_down, li->from_left, li->from_right, li->to_up, li->to_down, li->to_left, li->to_right); pli = li; } end_leg_cycle // TODO: pre kazdy rez, kde aspon niekde nieco - podoplna chybajuce // a nastavi walls na off kde nic nenajde start_leg_cycle adddims(li->to_down, li->to_up, li->to_right, li->to_left, li->to_up, li->to_down, li->to_left, li->to_right); adddims(li->to_left, li->to_left, li->to_up, li->to_up, li->to_up, li->to_down, li->to_left, li->to_right); adddims(li->from_down, li->from_up, li->from_right, li->from_left, li->from_up, li->from_down, li->from_left, li->from_right); adddims(li->from_left, li->from_left, li->from_up, li->from_up, li->from_up, li->from_down, li->from_left, li->from_right); if ((thisnan(li->to_up)) || (thisnan(li->from_up))) li->walls = TT_FALSE; end_leg_cycle } therion/thpdfdbg.h0000664000175000017500000000254410625655142013214 0ustar useruser/* * Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thpdfdbg_h #define thpdfdbg_h #include #include #ifndef NOTHERION #include "thexception.h" #endif using namespace std; #ifdef NOTHERION #define therror(P) {\ cerr << P << endl;\ exit(0);\ } #endif void thpdfdbg(); // volat len v debugovacom mode string u2str(unsigned u); string tex_Xname(string s); string tex_Wname(string s); string pdf_info(void); string rgb2svg(double r, double g, double b); #endif therion/thtexenc.cxx0000664000175000017500000005614310776452374013644 0ustar useruser// This file is generated automatically; don't modify it static const int max_enc = 3; static const int max_base = 579; static const char* encodings[3] = { "cmcyr", "raw", "xl2", }; static const int texenc[256][3] = { {0x0000, 0x0393, 0x0393}, {0x0000, 0x2206, 0x2206}, {0x0000, 0x0398, 0x0398}, {0x0000, 0x039B, 0x039B}, {0x0000, 0x039E, 0x039E}, {0x0000, 0x03A0, 0x03A0}, {0x0000, 0x03A3, 0x03A3}, {0x0000, 0x03A5, 0x03A5}, {0x0000, 0x03A6, 0x03A6}, {0x0000, 0x03A8, 0x03A8}, {0x0000, 0x03A9, 0x03A9}, {0x0000, 0xFB00, 0xFB00}, {0x0000, 0xFB01, 0xFB01}, {0x0000, 0xFB02, 0xFB02}, {0x0000, 0xFB03, 0xFB03}, {0x0000, 0xFB04, 0xFB04}, {0x0000, 0x0131, 0x0131}, {0x0000, 0xF6BE, 0xF6BE}, {0x0000, 0x0060, 0x0060}, {0x0000, 0x00B4, 0x00B4}, {0x0000, 0x02C7, 0x02C7}, {0x0000, 0x02D8, 0x02D8}, {0x0000, 0x00AF, 0x00AF}, {0x0000, 0x02DA, 0x02DA}, {0x0000, 0x00B8, 0x00B8}, {0x0000, 0x00DF, 0x00DF}, {0x0000, 0x00E6, 0x00E6}, {0x0000, 0x0153, 0x0153}, {0x0000, 0x00F8, 0x00F8}, {0x0000, 0x00C6, 0x00C6}, {0x0000, 0x0152, 0x0152}, {0x0000, 0x00D8, 0x00D8}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0021, 0x0021}, {0x0000, 0x201D, 0x201D}, {0x0000, 0x0023, 0x0023}, {0x0000, 0x0024, 0x0024}, {0x0000, 0x0025, 0x0025}, {0x0000, 0x0026, 0x0026}, {0x0000, 0x2019, 0x2019}, {0x0000, 0x0028, 0x0028}, {0x0000, 0x0029, 0x0029}, {0x0000, 0x002A, 0x002A}, {0x0000, 0x002B, 0x002B}, {0x0000, 0x002C, 0x002C}, {0x0000, 0x002D, 0x002D}, {0x0000, 0x002E, 0x002E}, {0x0000, 0x002F, 0x002F}, {0x0000, 0x0030, 0x0030}, {0x0000, 0x0031, 0x0031}, {0x0000, 0x0032, 0x0032}, {0x0000, 0x0033, 0x0033}, {0x0000, 0x0034, 0x0034}, {0x0000, 0x0035, 0x0035}, {0x0000, 0x0036, 0x0036}, {0x0000, 0x0037, 0x0037}, {0x0000, 0x0038, 0x0038}, {0x0000, 0x0039, 0x0039}, {0x0000, 0x003A, 0x003A}, {0x0000, 0x003B, 0x003B}, {0x0451, 0x00A1, 0x00A1}, {0x0000, 0x003D, 0x003D}, {0x0401, 0x00BF, 0x00BF}, {0x0000, 0x003F, 0x003F}, {0x044E, 0x0040, 0x0040}, {0x0430, 0x0041, 0x0041}, {0x0431, 0x0042, 0x0042}, {0x0446, 0x0043, 0x0043}, {0x0434, 0x0044, 0x0044}, {0x0435, 0x0045, 0x0045}, {0x0444, 0x0046, 0x0046}, {0x0433, 0x0047, 0x0047}, {0x0445, 0x0048, 0x0048}, {0x0438, 0x0049, 0x0049}, {0x0439, 0x004A, 0x004A}, {0x043A, 0x004B, 0x004B}, {0x043B, 0x004C, 0x004C}, {0x043C, 0x004D, 0x004D}, {0x043D, 0x004E, 0x004E}, {0x043E, 0x004F, 0x004F}, {0x043F, 0x0050, 0x0050}, {0x044F, 0x0051, 0x0051}, {0x0440, 0x0052, 0x0052}, {0x0441, 0x0053, 0x0053}, {0x0442, 0x0054, 0x0054}, {0x0443, 0x0055, 0x0055}, {0x0436, 0x0056, 0x0056}, {0x0432, 0x0057, 0x0057}, {0x044C, 0x0058, 0x0058}, {0x044B, 0x0059, 0x0059}, {0x0437, 0x005A, 0x005A}, {0x0448, 0x005B, 0x005B}, {0x044D, 0x201C, 0x201C}, {0x0449, 0x005D, 0x005D}, {0x0447, 0x02C6, 0x02C6}, {0x044A, 0x02D9, 0x02D9}, {0x042E, 0x2018, 0x2018}, {0x0410, 0x0061, 0x0061}, {0x0411, 0x0062, 0x0062}, {0x0426, 0x0063, 0x0063}, {0x0414, 0x0064, 0x0064}, {0x0415, 0x0065, 0x0065}, {0x0424, 0x0066, 0x0066}, {0x0413, 0x0067, 0x0067}, {0x0425, 0x0068, 0x0068}, {0x0418, 0x0069, 0x0069}, {0x0419, 0x006A, 0x006A}, {0x041A, 0x006B, 0x006B}, {0x041B, 0x006C, 0x006C}, {0x041C, 0x006D, 0x006D}, {0x041D, 0x006E, 0x006E}, {0x041E, 0x006F, 0x006F}, {0x041F, 0x0070, 0x0070}, {0x042F, 0x0071, 0x0071}, {0x0420, 0x0072, 0x0072}, {0x0421, 0x0073, 0x0073}, {0x0422, 0x0074, 0x0074}, {0x0423, 0x0075, 0x0075}, {0x0416, 0x0076, 0x0076}, {0x0412, 0x0077, 0x0077}, {0x042C, 0x0078, 0x0078}, {0x042B, 0x0079, 0x0079}, {0x0417, 0x007A, 0x007A}, {0x0428, 0x2013, 0x2013}, {0x042D, 0x2014, 0x2014}, {0x0429, 0x02DD, 0x02DD}, {0x0427, 0x02DC, 0x02DC}, {0x0000, 0x00A8, 0x00A8}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x2030}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00C0}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x002D}, {0x0000, 0x0000, 0x02DB}, {0x0000, 0x0000, 0x00AB}, {0x0000, 0x0000, 0x00BB}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x013D}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0160}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0164}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x017D}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x013E}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00E0}, {0x0000, 0x0000, 0x0161}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0165}, {0x2116, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x017E}, {0x0000, 0x0000, 0x0000}, {0x00AB, 0x0000, 0x0154}, {0x00BB, 0x0000, 0x00C1}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x042A, 0x0000, 0x00C4}, {0x0000, 0x0000, 0x0139}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x010C}, {0x0000, 0x0000, 0x00C9}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x011A}, {0x0000, 0x0000, 0x00CD}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x010E}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0147}, {0x0000, 0x0000, 0x00D3}, {0x0000, 0x0000, 0x00D4}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00D6}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0158}, {0x0000, 0x0000, 0x016E}, {0x0000, 0x0000, 0x00DA}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00DC}, {0x0000, 0x0000, 0x00DD}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0155}, {0x0000, 0x0000, 0x00E1}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00E4}, {0x0000, 0x0000, 0x013A}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x010D}, {0x0000, 0x0000, 0x00E9}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x011B}, {0x0000, 0x0000, 0x00ED}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x010F}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0148}, {0x0000, 0x0000, 0x00F3}, {0x0000, 0x0000, 0x00F4}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00F6}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x0159}, {0x0000, 0x0000, 0x016F}, {0x0000, 0x0000, 0x00FA}, {0x0000, 0x0000, 0x0000}, {0x0000, 0x0000, 0x00FC}, {0x0000, 0x0000, 0x00FD}, {0x0000, 0x0000, 0x201E}, {0x0000, 0x0000, 0x201C}, }; static const int unibase[579][3] = { {0x00C0, 0x0041, 0x0300}, {0x00C1, 0x0041, 0x0301}, {0x00C2, 0x0041, 0x0302}, {0x00C3, 0x0041, 0x0303}, {0x00C4, 0x0041, 0x0308}, {0x00C5, 0x0041, 0x030A}, {0x00C7, 0x0043, 0x0327}, {0x00C8, 0x0045, 0x0300}, {0x00C9, 0x0045, 0x0301}, {0x00CA, 0x0045, 0x0302}, {0x00CB, 0x0045, 0x0308}, {0x00CC, 0x0049, 0x0300}, {0x00CD, 0x0049, 0x0301}, {0x00CE, 0x0049, 0x0302}, {0x00CF, 0x0049, 0x0308}, {0x00D1, 0x004E, 0x0303}, {0x00D2, 0x004F, 0x0300}, {0x00D3, 0x004F, 0x0301}, {0x00D4, 0x004F, 0x0302}, {0x00D5, 0x004F, 0x0303}, {0x00D6, 0x004F, 0x0308}, {0x00D9, 0x0055, 0x0300}, {0x00DA, 0x0055, 0x0301}, {0x00DB, 0x0055, 0x0302}, {0x00DC, 0x0055, 0x0308}, {0x00DD, 0x0059, 0x0301}, {0x00E0, 0x0061, 0x0300}, {0x00E1, 0x0061, 0x0301}, {0x00E2, 0x0061, 0x0302}, {0x00E3, 0x0061, 0x0303}, {0x00E4, 0x0061, 0x0308}, {0x00E5, 0x0061, 0x030A}, {0x00E7, 0x0063, 0x0327}, {0x00E8, 0x0065, 0x0300}, {0x00E9, 0x0065, 0x0301}, {0x00EA, 0x0065, 0x0302}, {0x00EB, 0x0065, 0x0308}, {0x00EC, 0x0069, 0x0300}, {0x00ED, 0x0069, 0x0301}, {0x00EE, 0x0069, 0x0302}, {0x00EF, 0x0069, 0x0308}, {0x00F1, 0x006E, 0x0303}, {0x00F2, 0x006F, 0x0300}, {0x00F3, 0x006F, 0x0301}, {0x00F4, 0x006F, 0x0302}, {0x00F5, 0x006F, 0x0303}, {0x00F6, 0x006F, 0x0308}, {0x00F9, 0x0075, 0x0300}, {0x00FA, 0x0075, 0x0301}, {0x00FB, 0x0075, 0x0302}, {0x00FC, 0x0075, 0x0308}, {0x00FD, 0x0079, 0x0301}, {0x00FF, 0x0079, 0x0308}, {0x0100, 0x0041, 0x0304}, {0x0101, 0x0061, 0x0304}, {0x0102, 0x0041, 0x0306}, {0x0103, 0x0061, 0x0306}, {0x0104, 0x0041, 0x0328}, {0x0105, 0x0061, 0x0328}, {0x0106, 0x0043, 0x0301}, {0x0107, 0x0063, 0x0301}, {0x0108, 0x0043, 0x0302}, {0x0109, 0x0063, 0x0302}, {0x010A, 0x0043, 0x0307}, {0x010B, 0x0063, 0x0307}, {0x010C, 0x0043, 0x030C}, {0x010D, 0x0063, 0x030C}, {0x010E, 0x0044, 0x030C}, {0x010F, 0x0064, 0x030C}, {0x0112, 0x0045, 0x0304}, {0x0113, 0x0065, 0x0304}, {0x0114, 0x0045, 0x0306}, {0x0115, 0x0065, 0x0306}, {0x0116, 0x0045, 0x0307}, {0x0117, 0x0065, 0x0307}, {0x0118, 0x0045, 0x0328}, {0x0119, 0x0065, 0x0328}, {0x011A, 0x0045, 0x030C}, {0x011B, 0x0065, 0x030C}, {0x011C, 0x0047, 0x0302}, {0x011D, 0x0067, 0x0302}, {0x011E, 0x0047, 0x0306}, {0x011F, 0x0067, 0x0306}, {0x0120, 0x0047, 0x0307}, {0x0121, 0x0067, 0x0307}, {0x0122, 0x0047, 0x0327}, {0x0123, 0x0067, 0x0327}, {0x0124, 0x0048, 0x0302}, {0x0125, 0x0068, 0x0302}, {0x0128, 0x0049, 0x0303}, {0x0129, 0x0069, 0x0303}, {0x012A, 0x0049, 0x0304}, {0x012B, 0x0069, 0x0304}, {0x012C, 0x0049, 0x0306}, {0x012D, 0x0069, 0x0306}, {0x012E, 0x0049, 0x0328}, {0x012F, 0x0069, 0x0328}, {0x0130, 0x0049, 0x0307}, {0x0134, 0x004A, 0x0302}, {0x0135, 0x006A, 0x0302}, {0x0136, 0x004B, 0x0327}, {0x0137, 0x006B, 0x0327}, {0x0139, 0x004C, 0x0301}, {0x013A, 0x006C, 0x0301}, {0x013B, 0x004C, 0x0327}, {0x013C, 0x006C, 0x0327}, {0x013D, 0x004C, 0x030C}, {0x013E, 0x006C, 0x030C}, {0x0143, 0x004E, 0x0301}, {0x0144, 0x006E, 0x0301}, {0x0145, 0x004E, 0x0327}, {0x0146, 0x006E, 0x0327}, {0x0147, 0x004E, 0x030C}, {0x0148, 0x006E, 0x030C}, {0x014C, 0x004F, 0x0304}, {0x014D, 0x006F, 0x0304}, {0x014E, 0x004F, 0x0306}, {0x014F, 0x006F, 0x0306}, {0x0150, 0x004F, 0x030B}, {0x0151, 0x006F, 0x030B}, {0x0154, 0x0052, 0x0301}, {0x0155, 0x0072, 0x0301}, {0x0156, 0x0052, 0x0327}, {0x0157, 0x0072, 0x0327}, {0x0158, 0x0052, 0x030C}, {0x0159, 0x0072, 0x030C}, {0x015A, 0x0053, 0x0301}, {0x015B, 0x0073, 0x0301}, {0x015C, 0x0053, 0x0302}, {0x015D, 0x0073, 0x0302}, {0x015E, 0x0053, 0x0327}, {0x015F, 0x0073, 0x0327}, {0x0160, 0x0053, 0x030C}, {0x0161, 0x0073, 0x030C}, {0x0162, 0x0054, 0x0327}, {0x0163, 0x0074, 0x0327}, {0x0164, 0x0054, 0x030C}, {0x0165, 0x0074, 0x030C}, {0x0168, 0x0055, 0x0303}, {0x0169, 0x0075, 0x0303}, {0x016A, 0x0055, 0x0304}, {0x016B, 0x0075, 0x0304}, {0x016C, 0x0055, 0x0306}, {0x016D, 0x0075, 0x0306}, {0x016E, 0x0055, 0x030A}, {0x016F, 0x0075, 0x030A}, {0x0170, 0x0055, 0x030B}, {0x0171, 0x0075, 0x030B}, {0x0172, 0x0055, 0x0328}, {0x0173, 0x0075, 0x0328}, {0x0174, 0x0057, 0x0302}, {0x0175, 0x0077, 0x0302}, {0x0176, 0x0059, 0x0302}, {0x0177, 0x0079, 0x0302}, {0x0178, 0x0059, 0x0308}, {0x0179, 0x005A, 0x0301}, {0x017A, 0x007A, 0x0301}, {0x017B, 0x005A, 0x0307}, {0x017C, 0x007A, 0x0307}, {0x017D, 0x005A, 0x030C}, {0x017E, 0x007A, 0x030C}, {0x01A0, 0x004F, 0x031B}, {0x01A1, 0x006F, 0x031B}, {0x01AF, 0x0055, 0x031B}, {0x01B0, 0x0075, 0x031B}, {0x01CD, 0x0041, 0x030C}, {0x01CE, 0x0061, 0x030C}, {0x01CF, 0x0049, 0x030C}, {0x01D0, 0x0069, 0x030C}, {0x01D1, 0x004F, 0x030C}, {0x01D2, 0x006F, 0x030C}, {0x01D3, 0x0055, 0x030C}, {0x01D4, 0x0075, 0x030C}, {0x01D5, 0x00DC, 0x0304}, {0x01D6, 0x00FC, 0x0304}, {0x01D7, 0x00DC, 0x0301}, {0x01D8, 0x00FC, 0x0301}, {0x01D9, 0x00DC, 0x030C}, {0x01DA, 0x00FC, 0x030C}, {0x01DB, 0x00DC, 0x0300}, {0x01DC, 0x00FC, 0x0300}, {0x01DE, 0x00C4, 0x0304}, {0x01DF, 0x00E4, 0x0304}, {0x01E0, 0x0041, 0x0304}, {0x01E1, 0x0061, 0x0304}, {0x01E2, 0x00C6, 0x0304}, {0x01E3, 0x00E6, 0x0304}, {0x01E6, 0x0047, 0x030C}, {0x01E7, 0x0067, 0x030C}, {0x01E8, 0x004B, 0x030C}, {0x01E9, 0x006B, 0x030C}, {0x01EA, 0x004F, 0x0328}, {0x01EB, 0x006F, 0x0328}, {0x01EC, 0x004F, 0x0304}, {0x01ED, 0x006F, 0x0304}, {0x01F0, 0x006A, 0x030C}, {0x01F4, 0x0047, 0x0301}, {0x01F5, 0x0067, 0x0301}, {0x01F8, 0x004E, 0x0300}, {0x01F9, 0x006E, 0x0300}, {0x01FA, 0x0041, 0x0301}, {0x01FB, 0x0061, 0x0301}, {0x01FC, 0x00C6, 0x0301}, {0x01FD, 0x00E6, 0x0301}, {0x01FE, 0x00D8, 0x0301}, {0x01FF, 0x00F8, 0x0301}, {0x0200, 0x0041, 0x030F}, {0x0201, 0x0061, 0x030F}, {0x0202, 0x0041, 0x0311}, {0x0203, 0x0061, 0x0311}, {0x0204, 0x0045, 0x030F}, {0x0205, 0x0065, 0x030F}, {0x0206, 0x0045, 0x0311}, {0x0207, 0x0065, 0x0311}, {0x0208, 0x0049, 0x030F}, {0x0209, 0x0069, 0x030F}, {0x020A, 0x0049, 0x0311}, {0x020B, 0x0069, 0x0311}, {0x020C, 0x004F, 0x030F}, {0x020D, 0x006F, 0x030F}, {0x020E, 0x004F, 0x0311}, {0x020F, 0x006F, 0x0311}, {0x0210, 0x0052, 0x030F}, {0x0211, 0x0072, 0x030F}, {0x0212, 0x0052, 0x0311}, {0x0213, 0x0072, 0x0311}, {0x0214, 0x0055, 0x030F}, {0x0215, 0x0075, 0x030F}, {0x0216, 0x0055, 0x0311}, {0x0217, 0x0075, 0x0311}, {0x0218, 0x0053, 0x0326}, {0x0219, 0x0073, 0x0326}, {0x021A, 0x0054, 0x0326}, {0x021B, 0x0074, 0x0326}, {0x021E, 0x0048, 0x030C}, {0x021F, 0x0068, 0x030C}, {0x0226, 0x0041, 0x0307}, {0x0227, 0x0061, 0x0307}, {0x0228, 0x0045, 0x0327}, {0x0229, 0x0065, 0x0327}, {0x022A, 0x00D6, 0x0304}, {0x022B, 0x00F6, 0x0304}, {0x022C, 0x004F, 0x0304}, {0x022D, 0x006F, 0x0304}, {0x022E, 0x004F, 0x0307}, {0x022F, 0x006F, 0x0307}, {0x0230, 0x004F, 0x0304}, {0x0231, 0x006F, 0x0304}, {0x0232, 0x0059, 0x0304}, {0x0233, 0x0079, 0x0304}, {0x037E, 0x003B, 0x0000}, {0x0385, 0x00A8, 0x0301}, {0x038E, 0x03A5, 0x0301}, {0x038F, 0x03A9, 0x0301}, {0x03AB, 0x03A5, 0x0308}, {0x0400, 0x0415, 0x0300}, {0x0401, 0x0415, 0x0308}, {0x0403, 0x0413, 0x0301}, {0x040C, 0x041A, 0x0301}, {0x040D, 0x0418, 0x0300}, {0x040E, 0x0423, 0x0306}, {0x0419, 0x0418, 0x0306}, {0x0439, 0x0438, 0x0306}, {0x0450, 0x0435, 0x0300}, {0x0451, 0x0435, 0x0308}, {0x0453, 0x0433, 0x0301}, {0x045C, 0x043A, 0x0301}, {0x045D, 0x0438, 0x0300}, {0x045E, 0x0443, 0x0306}, {0x04C1, 0x0416, 0x0306}, {0x04C2, 0x0436, 0x0306}, {0x04D0, 0x0410, 0x0306}, {0x04D1, 0x0430, 0x0306}, {0x04D2, 0x0410, 0x0308}, {0x04D3, 0x0430, 0x0308}, {0x04D6, 0x0415, 0x0306}, {0x04D7, 0x0435, 0x0306}, {0x04DC, 0x0416, 0x0308}, {0x04DD, 0x0436, 0x0308}, {0x04DE, 0x0417, 0x0308}, {0x04DF, 0x0437, 0x0308}, {0x04E2, 0x0418, 0x0304}, {0x04E3, 0x0438, 0x0304}, {0x04E4, 0x0418, 0x0308}, {0x04E5, 0x0438, 0x0308}, {0x04E6, 0x041E, 0x0308}, {0x04E7, 0x043E, 0x0308}, {0x04EC, 0x042D, 0x0308}, {0x04ED, 0x044D, 0x0308}, {0x04EE, 0x0423, 0x0304}, {0x04EF, 0x0443, 0x0304}, {0x04F0, 0x0423, 0x0308}, {0x04F1, 0x0443, 0x0308}, {0x04F2, 0x0423, 0x030B}, {0x04F3, 0x0443, 0x030B}, {0x04F4, 0x0427, 0x0308}, {0x04F5, 0x0447, 0x0308}, {0x04F8, 0x042B, 0x0308}, {0x04F9, 0x044B, 0x0308}, {0x1E00, 0x0041, 0x0325}, {0x1E01, 0x0061, 0x0325}, {0x1E02, 0x0042, 0x0307}, {0x1E03, 0x0062, 0x0307}, {0x1E04, 0x0042, 0x0323}, {0x1E05, 0x0062, 0x0323}, {0x1E06, 0x0042, 0x0331}, {0x1E07, 0x0062, 0x0331}, {0x1E08, 0x0043, 0x0301}, {0x1E09, 0x0063, 0x0301}, {0x1E0A, 0x0044, 0x0307}, {0x1E0B, 0x0064, 0x0307}, {0x1E0C, 0x0044, 0x0323}, {0x1E0D, 0x0064, 0x0323}, {0x1E0E, 0x0044, 0x0331}, {0x1E0F, 0x0064, 0x0331}, {0x1E10, 0x0044, 0x0327}, {0x1E11, 0x0064, 0x0327}, {0x1E12, 0x0044, 0x032D}, {0x1E13, 0x0064, 0x032D}, {0x1E14, 0x0045, 0x0300}, {0x1E15, 0x0065, 0x0300}, {0x1E16, 0x0045, 0x0301}, {0x1E17, 0x0065, 0x0301}, {0x1E18, 0x0045, 0x032D}, {0x1E19, 0x0065, 0x032D}, {0x1E1A, 0x0045, 0x0330}, {0x1E1B, 0x0065, 0x0330}, {0x1E1C, 0x0045, 0x0306}, {0x1E1D, 0x0065, 0x0306}, {0x1E1E, 0x0046, 0x0307}, {0x1E1F, 0x0066, 0x0307}, {0x1E20, 0x0047, 0x0304}, {0x1E21, 0x0067, 0x0304}, {0x1E22, 0x0048, 0x0307}, {0x1E23, 0x0068, 0x0307}, {0x1E24, 0x0048, 0x0323}, {0x1E25, 0x0068, 0x0323}, {0x1E26, 0x0048, 0x0308}, {0x1E27, 0x0068, 0x0308}, {0x1E28, 0x0048, 0x0327}, {0x1E29, 0x0068, 0x0327}, {0x1E2A, 0x0048, 0x032E}, {0x1E2B, 0x0068, 0x032E}, {0x1E2C, 0x0049, 0x0330}, {0x1E2D, 0x0069, 0x0330}, {0x1E2E, 0x0049, 0x0301}, {0x1E2F, 0x0069, 0x0301}, {0x1E30, 0x004B, 0x0301}, {0x1E31, 0x006B, 0x0301}, {0x1E32, 0x004B, 0x0323}, {0x1E33, 0x006B, 0x0323}, {0x1E34, 0x004B, 0x0331}, {0x1E35, 0x006B, 0x0331}, {0x1E36, 0x004C, 0x0323}, {0x1E37, 0x006C, 0x0323}, {0x1E38, 0x004C, 0x0304}, {0x1E39, 0x006C, 0x0304}, {0x1E3A, 0x004C, 0x0331}, {0x1E3B, 0x006C, 0x0331}, {0x1E3C, 0x004C, 0x032D}, {0x1E3D, 0x006C, 0x032D}, {0x1E3E, 0x004D, 0x0301}, {0x1E3F, 0x006D, 0x0301}, {0x1E40, 0x004D, 0x0307}, {0x1E41, 0x006D, 0x0307}, {0x1E42, 0x004D, 0x0323}, {0x1E43, 0x006D, 0x0323}, {0x1E44, 0x004E, 0x0307}, {0x1E45, 0x006E, 0x0307}, {0x1E46, 0x004E, 0x0323}, {0x1E47, 0x006E, 0x0323}, {0x1E48, 0x004E, 0x0331}, {0x1E49, 0x006E, 0x0331}, {0x1E4A, 0x004E, 0x032D}, {0x1E4B, 0x006E, 0x032D}, {0x1E4C, 0x004F, 0x0301}, {0x1E4D, 0x006F, 0x0301}, {0x1E4E, 0x004F, 0x0308}, {0x1E4F, 0x006F, 0x0308}, {0x1E50, 0x004F, 0x0300}, {0x1E51, 0x006F, 0x0300}, {0x1E52, 0x004F, 0x0301}, {0x1E53, 0x006F, 0x0301}, {0x1E54, 0x0050, 0x0301}, {0x1E55, 0x0070, 0x0301}, {0x1E56, 0x0050, 0x0307}, {0x1E57, 0x0070, 0x0307}, {0x1E58, 0x0052, 0x0307}, {0x1E59, 0x0072, 0x0307}, {0x1E5A, 0x0052, 0x0323}, {0x1E5B, 0x0072, 0x0323}, {0x1E5C, 0x0052, 0x0304}, {0x1E5D, 0x0072, 0x0304}, {0x1E5E, 0x0052, 0x0331}, {0x1E5F, 0x0072, 0x0331}, {0x1E60, 0x0053, 0x0307}, {0x1E61, 0x0073, 0x0307}, {0x1E62, 0x0053, 0x0323}, {0x1E63, 0x0073, 0x0323}, {0x1E64, 0x0053, 0x0307}, {0x1E65, 0x0073, 0x0307}, {0x1E66, 0x0160, 0x0307}, {0x1E67, 0x0161, 0x0307}, {0x1E68, 0x0053, 0x0307}, {0x1E69, 0x0073, 0x0307}, {0x1E6A, 0x0054, 0x0307}, {0x1E6B, 0x0074, 0x0307}, {0x1E6C, 0x0054, 0x0323}, {0x1E6D, 0x0074, 0x0323}, {0x1E6E, 0x0054, 0x0331}, {0x1E6F, 0x0074, 0x0331}, {0x1E70, 0x0054, 0x032D}, {0x1E71, 0x0074, 0x032D}, {0x1E72, 0x0055, 0x0324}, {0x1E73, 0x0075, 0x0324}, {0x1E74, 0x0055, 0x0330}, {0x1E75, 0x0075, 0x0330}, {0x1E76, 0x0055, 0x032D}, {0x1E77, 0x0075, 0x032D}, {0x1E78, 0x0055, 0x0301}, {0x1E79, 0x0075, 0x0301}, {0x1E7A, 0x0055, 0x0308}, {0x1E7B, 0x0075, 0x0308}, {0x1E7C, 0x0056, 0x0303}, {0x1E7D, 0x0076, 0x0303}, {0x1E7E, 0x0056, 0x0323}, {0x1E7F, 0x0076, 0x0323}, {0x1E80, 0x0057, 0x0300}, {0x1E81, 0x0077, 0x0300}, {0x1E82, 0x0057, 0x0301}, {0x1E83, 0x0077, 0x0301}, {0x1E84, 0x0057, 0x0308}, {0x1E85, 0x0077, 0x0308}, {0x1E86, 0x0057, 0x0307}, {0x1E87, 0x0077, 0x0307}, {0x1E88, 0x0057, 0x0323}, {0x1E89, 0x0077, 0x0323}, {0x1E8A, 0x0058, 0x0307}, {0x1E8B, 0x0078, 0x0307}, {0x1E8C, 0x0058, 0x0308}, {0x1E8D, 0x0078, 0x0308}, {0x1E8E, 0x0059, 0x0307}, {0x1E8F, 0x0079, 0x0307}, {0x1E90, 0x005A, 0x0302}, {0x1E91, 0x007A, 0x0302}, {0x1E92, 0x005A, 0x0323}, {0x1E93, 0x007A, 0x0323}, {0x1E94, 0x005A, 0x0331}, {0x1E95, 0x007A, 0x0331}, {0x1E96, 0x0068, 0x0331}, {0x1E97, 0x0074, 0x0308}, {0x1E98, 0x0077, 0x030A}, {0x1E99, 0x0079, 0x030A}, {0x1EA0, 0x0041, 0x0323}, {0x1EA1, 0x0061, 0x0323}, {0x1EA2, 0x0041, 0x0309}, {0x1EA3, 0x0061, 0x0309}, {0x1EA4, 0x0041, 0x0301}, {0x1EA5, 0x0061, 0x0301}, {0x1EA6, 0x0041, 0x0300}, {0x1EA7, 0x0061, 0x0300}, {0x1EA8, 0x0041, 0x0309}, {0x1EA9, 0x0061, 0x0309}, {0x1EAA, 0x0041, 0x0303}, {0x1EAB, 0x0061, 0x0303}, {0x1EAC, 0x0041, 0x0302}, {0x1EAD, 0x0061, 0x0302}, {0x1EAE, 0x0041, 0x0301}, {0x1EAF, 0x0061, 0x0301}, {0x1EB0, 0x0041, 0x0300}, {0x1EB1, 0x0061, 0x0300}, {0x1EB2, 0x0041, 0x0309}, {0x1EB3, 0x0061, 0x0309}, {0x1EB4, 0x0041, 0x0303}, {0x1EB5, 0x0061, 0x0303}, {0x1EB6, 0x0041, 0x0306}, {0x1EB7, 0x0061, 0x0306}, {0x1EB8, 0x0045, 0x0323}, {0x1EB9, 0x0065, 0x0323}, {0x1EBA, 0x0045, 0x0309}, {0x1EBB, 0x0065, 0x0309}, {0x1EBC, 0x0045, 0x0303}, {0x1EBD, 0x0065, 0x0303}, {0x1EBE, 0x0045, 0x0301}, {0x1EBF, 0x0065, 0x0301}, {0x1EC0, 0x0045, 0x0300}, {0x1EC1, 0x0065, 0x0300}, {0x1EC2, 0x0045, 0x0309}, {0x1EC3, 0x0065, 0x0309}, {0x1EC4, 0x0045, 0x0303}, {0x1EC5, 0x0065, 0x0303}, {0x1EC6, 0x0045, 0x0302}, {0x1EC7, 0x0065, 0x0302}, {0x1EC8, 0x0049, 0x0309}, {0x1EC9, 0x0069, 0x0309}, {0x1ECA, 0x0049, 0x0323}, {0x1ECB, 0x0069, 0x0323}, {0x1ECC, 0x004F, 0x0323}, {0x1ECD, 0x006F, 0x0323}, {0x1ECE, 0x004F, 0x0309}, {0x1ECF, 0x006F, 0x0309}, {0x1ED0, 0x00D4, 0x0301}, {0x1ED1, 0x00F4, 0x0301}, {0x1ED2, 0x00D4, 0x0300}, {0x1ED3, 0x00F4, 0x0300}, {0x1ED4, 0x00D4, 0x0309}, {0x1ED5, 0x00F4, 0x0309}, {0x1ED6, 0x00D4, 0x0303}, {0x1ED7, 0x00F4, 0x0303}, {0x1ED8, 0x004F, 0x0302}, {0x1ED9, 0x006F, 0x0302}, {0x1EDA, 0x004F, 0x0301}, {0x1EDB, 0x006F, 0x0301}, {0x1EDC, 0x004F, 0x0300}, {0x1EDD, 0x006F, 0x0300}, {0x1EDE, 0x004F, 0x0309}, {0x1EDF, 0x006F, 0x0309}, {0x1EE0, 0x004F, 0x0303}, {0x1EE1, 0x006F, 0x0303}, {0x1EE2, 0x004F, 0x0323}, {0x1EE3, 0x006F, 0x0323}, {0x1EE4, 0x0055, 0x0323}, {0x1EE5, 0x0075, 0x0323}, {0x1EE6, 0x0055, 0x0309}, {0x1EE7, 0x0075, 0x0309}, {0x1EE8, 0x0055, 0x0301}, {0x1EE9, 0x0075, 0x0301}, {0x1EEA, 0x0055, 0x0300}, {0x1EEB, 0x0075, 0x0300}, {0x1EEC, 0x0055, 0x0309}, {0x1EED, 0x0075, 0x0309}, {0x1EEE, 0x0055, 0x0303}, {0x1EEF, 0x0075, 0x0303}, {0x1EF0, 0x0055, 0x0323}, {0x1EF1, 0x0075, 0x0323}, {0x1EF2, 0x0059, 0x0300}, {0x1EF3, 0x0079, 0x0300}, {0x1EF4, 0x0059, 0x0323}, {0x1EF5, 0x0079, 0x0323}, {0x1EF6, 0x0059, 0x0309}, {0x1EF7, 0x0079, 0x0309}, {0x1EF8, 0x0059, 0x0303}, {0x1EF9, 0x0079, 0x0303}, {0x1F59, 0x03A5, 0x0314}, {0x1F5B, 0x03A5, 0x0300}, {0x1F5D, 0x03A5, 0x0301}, {0x1F5F, 0x03A5, 0x0342}, {0x1F68, 0x03A9, 0x0313}, {0x1F69, 0x03A9, 0x0314}, {0x1F6A, 0x03A9, 0x0300}, {0x1F6B, 0x03A9, 0x0300}, {0x1F6C, 0x03A9, 0x0301}, {0x1F6D, 0x03A9, 0x0301}, {0x1F6E, 0x03A9, 0x0342}, {0x1F6F, 0x03A9, 0x0342}, {0x1FA8, 0x03A9, 0x0345}, {0x1FA9, 0x03A9, 0x0345}, {0x1FAA, 0x03A9, 0x0345}, {0x1FAB, 0x03A9, 0x0345}, {0x1FAC, 0x03A9, 0x0345}, {0x1FAD, 0x03A9, 0x0345}, {0x1FAE, 0x03A9, 0x0345}, {0x1FAF, 0x03A9, 0x0345}, {0x1FC1, 0x00A8, 0x0342}, {0x1FE8, 0x03A5, 0x0306}, {0x1FE9, 0x03A5, 0x0304}, {0x1FEA, 0x03A5, 0x0300}, {0x1FEB, 0x03A5, 0x0000}, {0x1FED, 0x00A8, 0x0300}, {0x1FEE, 0x00A8, 0x0000}, {0x1FEF, 0x0060, 0x0000}, {0x1FFA, 0x03A9, 0x0300}, {0x1FFB, 0x03A9, 0x0000}, {0x1FFC, 0x03A9, 0x0345}, {0x1FFD, 0x00B4, 0x0000}, {0x2126, 0x03A9, 0x0000}, {0x212A, 0x004B, 0x0000}, {0x212B, 0x0041, 0x0000}, {0x2260, 0x003D, 0x0338}, }; therion/thproj.h0000664000175000017500000000241710625655142012737 0ustar useruser/* * Copyright (C) 2006 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thproj_h #define thproj_h #include void thcs2utm(std::string, signed int, double, double, double, double &, double &, double &); void thcs2cs(std::string, std::string, double, double, double, double &, double &, double &); signed int thcs2zone(std::string, double, double, double); double thcsconverg(std::string, double, double); #endif therion/thsvg.cxx0000664000175000017500000006652512430722076013146 0ustar useruser/** * @file thconvert.cxx */ /* Copyright (C) 2005 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include //#include #include #include //#include #include #include #include #include #include #include #include "thepsparse.h" #include "thpdfdbg.h" #include "thpdfdata.h" //#include "thtexfonts.h" #include "therion.h" #include "thversion.h" #include "thlegenddata.h" #include "thtexfonts.h" using namespace std; //////////////////////////////////////////////////////////////////////////////// string escape_html(string s) { s = replace_all(s,"
",""); // could be implemented using left-aligned table s = replace_all(s,"",""); s = replace_all(s,"",""); s = replace_all(s,"",""); s = replace_all(s,"
","\x1B\x1"); s = replace_all(s,"","\x1B\x2"); s = replace_all(s,"","\x1B\x3"); s = replace_all(s,"","\x1B\x4"); s = replace_all(s,"","\x1B\x5"); s = replace_all(s,"","\x1B\x6"); // which font should we choose? s = replace_all(s,"","\x1B\x7"); s = replace_all(s,"",""); // has no effect s = replace_all(s,"",""); // in firefox or chrome s = replace_all(s,"&","\x1B\x8"); s = replace_all(s,"<","<"); s = replace_all(s,">",">"); s = replace_all(s,"'","'"); s = replace_all(s,"\"","""); string t = ""; string close_font = ""; size_t i,j; for (i=0; i> 18) & 0x3F]; out_buffer[1] = base64_tab[(value >> 12) & 0x3F]; if (fin.gcount() > 1) out_buffer[2] = base64_tab[(value >> 6) & 0x3F]; if (fin.gcount() > 2) out_buffer[3] = base64_tab[(value >> 0) & 0x3F]; if (llength >= 76) { fout << endl; llength = 0; } fout << out_buffer[0] << out_buffer[1] << out_buffer[2] << out_buffer[3]; llength += 4; } while (fin); fin.close(); } void find_dimensions(double & MINX,double & MINY,double & MAXX,double & MAXY) { double llx = 0, lly = 0, urx = 0, ury = 0; double a,b,w,h; MINX=DBL_MAX, MINY=DBL_MAX, MAXX=-DBL_MAX, MAXY=-DBL_MAX; for (list::iterator I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { llx = DBL_MAX; lly = DBL_MAX; urx = -DBL_MAX; ury = -DBL_MAX; if (I->F != "" && I->E == "" && I->G == "" && I->B == "" && I->X == "") { // clipped symbols shouldn't affect map size if (I->F1 < llx) llx = I->F1; if (I->F2 < lly) lly = I->F2; if (I->F3 > urx) urx = I->F3; if (I->F4 > ury) ury = I->F4; } if (I->E != "") { if (I->E1 < llx) llx = I->E1; if (I->E2 < lly) lly = I->E2; if (I->E3 > urx) urx = I->E3; if (I->E4 > ury) ury = I->E4; } if (I->G != "") { if (I->G1 < llx) llx = I->G1; if (I->G2 < lly) lly = I->G2; if (I->G3 > urx) urx = I->G3; if (I->G4 > ury) ury = I->G4; } if (I->B != "") { if (I->B1 < llx) llx = I->B1; if (I->B2 < lly) lly = I->B2; if (I->B3 > urx) urx = I->B3; if (I->B4 > ury) ury = I->B4; } if (I->I != "") { if (I->I1 < llx) llx = I->I1; if (I->I2 < lly) lly = I->I2; if (I->I3 > urx) urx = I->I3; if (I->I4 > ury) ury = I->I4; } if (I->X != "") { if (I->X1 < llx) llx = I->X1; if (I->X2 < lly) lly = I->X2; if (I->X3 > urx) urx = I->X3; if (I->X4 > ury) ury = I->X4; } for (list::iterator I_sk = I->SKETCHLIST.begin(); I_sk != I->SKETCHLIST.end(); I_sk++) { for (int i = 0; i<=1; i++) { for (int j = 0; j<=1; j++) { w = i * I_sk->width; h = j * I_sk->height; a = I_sk->xx*w + I_sk->xy*h + I_sk->dx; b = I_sk->yx*w + I_sk->yy*h + I_sk->dy; if (a < llx) llx = a; if (b < lly) lly = b; if (a > urx) urx = a; if (b > ury) ury = b; } } }; if (llx == DBL_MAX || lly == DBL_MAX || urx == -DBL_MAX || ury == -DBL_MAX) therror(("This can't happen -- no data for a scrap!")); map::iterator J = LAYERHASH.find(I->layer); assert(J != LAYERHASH.end()); map >::iterator K = (((*J).second).scraps).find(I->level); if (K == (((*J).second).scraps).end()) { set SCRP; (((*J).second).scraps).insert(make_pair(I->level,SCRP)); K = (((*J).second).scraps).find(I->level); } ((*K).second).insert(I->name); (((*J).second).allscraps).insert(I->name); if (((*J).second).Z == 0) { if (MINX > llx) MINX = llx; if (MINY > lly) MINY = lly; if (MAXX < urx) MAXX = urx; if (MAXY < ury) MAXY = ury; } } } void print_preview(int up,ofstream& F, string unique_prefix) { set used_layers; set used_scraps; if (up) { F << "" << endl; } else { F << "" << endl; } used_layers = (up ? MAP_PREVIEW_UP : MAP_PREVIEW_DOWN); for (set::iterator I=used_layers.begin(); I != used_layers.end(); I++) { map::iterator J = LAYERHASH.find(*I); assert (J != LAYERHASH.end()); used_scraps = J->second.allscraps; if (!used_scraps.empty()) { for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0) { if (up) { if (K->B != "" && K->sect == 0) { F << "B1 << "\" y=\"" << K->B2 << "\" xlink:href=\"#B_" << K->name << "_" << unique_prefix << "\" />" << endl; } } else { if (K->I != "" && K->sect == 0) { F << "I1 << "\" y=\"" << K->I2 << "\" xlink:href=\"#I_" << K->name << "_" << unique_prefix << "\" />" << endl; } } } } } } F << "" << endl; } void print_grid(ofstream& PAGEDEF, double LLX,double LLY,double URX,double URY, string unique_prefix) { if (LAYOUT.grid == 0) return; PAGEDEF << "" << endl; paired ll, ur, lr, ul, llrot, urrot, ulrot, lrrot, llnew, urnew, origin; ll.x = LLX; ll.y = LLY; ur.x = URX; ur.y = URY; lr.x = ur.x; lr.y = ll.y; ul.x = ll.x; ul.y = ur.y; origin.x = LAYOUT.hgridorigin; origin.y = LAYOUT.vgridorigin; //cout << endl << origin.x << " " << origin.y << endl; llrot = rotatedaround(ll,origin,-LAYOUT.gridrot); urrot = rotatedaround(ur,origin,-LAYOUT.gridrot); lrrot = rotatedaround(lr,origin,-LAYOUT.gridrot); ulrot = rotatedaround(ul,origin,-LAYOUT.gridrot); llnew.x = min(min(llrot.x, urrot.x), min(lrrot.x, ulrot.x)); llnew.y = min(min(llrot.y, urrot.y), min(lrrot.y, ulrot.y)); urnew.x = max(max(llrot.x, urrot.x), max(lrrot.x, ulrot.x)); urnew.y = max(max(llrot.y, urrot.y), max(lrrot.y, ulrot.y)); double grid_init_x = LAYOUT.hgridsize * floor ((llnew.x-origin.x)/LAYOUT.hgridsize) + origin.x; double grid_init_y = LAYOUT.vgridsize * floor ((llnew.y-origin.y)/LAYOUT.vgridsize) + origin.y; double G_real_init_x = LAYOUT.XO + LAYOUT.XS * floor ((llnew.x-origin.x)/LAYOUT.hgridsize); double G_real_init_y = LAYOUT.YO + LAYOUT.YS * floor ((llnew.y-origin.y)/LAYOUT.vgridsize); double cosr = cos(-LAYOUT.gridrot * 3.14159265 / 180); double sinr = sin(-LAYOUT.gridrot * 3.14159265 / 180); int row, col, elem; if (LAYOUT.proj == 0) { paired out,tmp; int ii,jj; double i, j; for (i = grid_init_x, ii=0; i < urnew.x + LAYOUT.hgridsize - 0.05; i += LAYOUT.hgridsize, ii++) { for (j = grid_init_y, jj=0; j < urnew.y + LAYOUT.vgridsize - 0.05; j += LAYOUT.vgridsize, jj++) { col = (i == grid_init_x ? 0 : (i >= urnew.x ? 2 : 1)); row = (j == grid_init_y ? 0 : (j >= urnew.y ? 2 : 1)); elem = col + 3*row; tmp.x = i+LAYOUT.gridcell[elem].x; tmp.y = j+LAYOUT.gridcell[elem].y; out = rotatedaround(tmp,origin,LAYOUT.gridrot); // out.x -= LLX; // out.y -= LLY; PAGEDEF << ""; PAGEDEF << ""; PAGEDEF << "" << endl; if (LAYOUT.grid_coord_freq==2 || (LAYOUT.grid_coord_freq==1 && elem!=4)) { tmp.x = i+ (col==2 ? -2 : 2); tmp.y = j+ (row==2 ? -9 : 2); out = rotatedaround(tmp,origin,LAYOUT.gridrot); PAGEDEF << "(" << setprecision(0) << G_real_init_x+ii*LAYOUT.XS << "," << G_real_init_y+jj*LAYOUT.YS << setprecision(3) << ")" << endl; } /* PAGEDEF << ""; PAGEDEF << i/72*2.54/100*200 << " " << j/72*2.54/100*200; PAGEDEF << "" << endl;*/ } } } else { grid_init_x = LLX; int jj; double i, j; for (j = grid_init_y, jj=0; j < urnew.y + LAYOUT.vgridsize - 0.05; j += LAYOUT.vgridsize, jj++) { for (i = grid_init_x; i < urnew.x + LAYOUT.hgridsize - 0.05; i += LAYOUT.hgridsize) { col = (i == grid_init_x ? 0 : (i >= urnew.x ? 2 : 1)); row = (j == grid_init_y ? 0 : (j >= urnew.y ? 2 : 1)); elem = col + 3*row; PAGEDEF << "" << endl; if (col == 0 && LAYOUT.grid_coord_freq > 0) { PAGEDEF << "" << setprecision(0) << G_real_init_y+jj*LAYOUT.YS << "" << endl; } if (col == 2 && LAYOUT.grid_coord_freq == 2) { PAGEDEF << "" << setprecision(0) << G_real_init_y+jj*LAYOUT.YS << "" << endl; } } } } PAGEDEF << "" << endl; } void print_surface_bitmaps (ofstream &F) { if (LAYOUT.transparency) F << "" << endl; F.precision(8); for (list::iterator I = SURFPICTLIST.begin(); I != SURFPICTLIST.end(); I++) { F << "xx << " " << I->yx << " " << -I->xy << " " << -I->yy << " " << I->dx << " " << I->dy << ")\">"; F << "height << "\" width=\"" << I->width << "\" height=\"" << I->height << "\" xlink:href=\"data:image/" << I->type << ";base64," << endl; base64_encode(I->filename, F); F << "\" />"; F << "" << endl; }; F.precision(3); if (LAYOUT.transparency) F << "" << endl; } #define ginit(ID) F << "" << endl; #define gend F << "" << endl; void thsvg(const char * fname, int fmt, legenddata ldata) { if (fmt == 0) thprintf("making svg map ... "); else thprintf("making svg (xhtml) map ... "); string bgcol; string unique_prefix = fname; ofstream F(fname); F.setf(ios::fixed, ios::floatfield); // dolezite pre velke suradnice F.precision(3); double llx=0, lly=0, urx=0, ury=0; find_dimensions(llx, lly, urx, ury); if (LAYOUT.proj > 0 && LAYOUT.grid > 0) { // natiahnutie vysky aby sa zobrazil grid pod aj nad jaskynou lly = LAYOUT.vgridsize * floor ((lly-LAYOUT.vgridorigin)/LAYOUT.vgridsize) + LAYOUT.vgridorigin; ury = LAYOUT.vgridsize * ceil ((ury-LAYOUT.vgridorigin)/LAYOUT.vgridsize) + LAYOUT.vgridorigin; } if (LAYOUT.map_grid) { llx = LAYOUT.hsize * floor (llx/LAYOUT.hsize); lly = LAYOUT.vsize * floor (lly/LAYOUT.vsize); urx = LAYOUT.hsize * ceil (urx/LAYOUT.hsize); ury = LAYOUT.vsize * ceil (ury/LAYOUT.vsize); } double llxo(llx), llyo(lly), urxo(urx), uryo(ury); // rozmery mapy bez overlapu llx -= LAYOUT.overlap; urx += LAYOUT.overlap; lly -= LAYOUT.overlap; ury += LAYOUT.overlap; F << "" << endl; F << "" << endl; if (LAYOUT.doc_author != "") F << "" << endl; if (LAYOUT.doc_title != "") F << "" << endl; if (LAYOUT.doc_subject != "") F << "" << endl; if (LAYOUT.doc_keywords != "") F << "" << endl; if (fmt == 0) F << "" << endl; else { F << "" << endl; F << "" << endl; F << "" << endl; // title if (!ldata.cavename.empty()) F << "

" << escape_html(ldata.cavename) << "

" << endl; if (!ldata.comment.empty()) F << "

" << escape_html(ldata.comment) << "

" << endl; // north, scale // ... if (!ldata.cavelength.empty()) F << "

" << escape_html(ldata.cavelengthtitle) << ": " << ldata.cavelength << "

" << endl; if (!ldata.cavedepth.empty()) F << "

" << escape_html(ldata.cavedepthtitle) << ": " << ldata.cavedepth << "

" << endl; if (!ldata.copyrights.empty()) F << "

" << escape_html(ldata.copyrights) << "

" << endl; if (LAYOUT.scalebar != "") { F << "

" << endl; ScBar.print_svg(F,unique_prefix); F << "

" << endl; } if (LAYOUT.northarrow != "") { F << "

" << endl; NArrow.print_svg(F,unique_prefix); F << "

" << endl; } } F << "" << endl; F << "" << endl; // patterns: // pattern is clipped according to width and height attributes; // it's not possible to specify clipping area independently // like using BBox in PDF -- may produce some strange results // if the pattern definition exceeds the BBox in MetaPost for (list::iterator I = PATTERNLIST.begin(); I != PATTERNLIST.end(); I++) { if (I->used) { F << "name << "_" << unique_prefix << "\" patternUnits=\"userSpaceOnUse\"" << " width=\"" << I->xstep << "\" height=\"" << I->ystep << "\" patternTransform=\"matrix(" << I->xx << " " << I->xy << " " << I->yx << " " << I->yy << " " << I->x << " " << I->y << ")\">" << endl; F << "llx1-I->llx << " " << I->lly1-I->lly << ")\">" << endl; I->data.MP.print_svg(F,unique_prefix); F << "" << endl; F << "" << endl; } } // scraps: for(list::iterator I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { ginit("F_" + I->name); I->Fc.MP.print_svg(F,unique_prefix); gend; ginit("G_" + I->name); I->Gc.MP.print_svg(F,unique_prefix); gend; ginit("B_" + I->name); I->Bc.MP.print_svg(F,unique_prefix); gend; ginit("I_" + I->name); I->Ic.MP.print_svg(F,unique_prefix); gend; ginit("E_" + I->name); I->Ec.MP.print_svg(F,unique_prefix); gend; ginit("X_" + I->name); I->Xc.MP.print_svg(F,unique_prefix); gend; } // grid: int i=0; for (list::iterator I = GRIDLIST.begin(); I != GRIDLIST.end(); I++) { ginit("grid_" + u2str(++i)); I->MP.print_svg(F,unique_prefix); gend; } // clip to initial viewBox // (browsers mostly ignore clip="auto" overflow="hidden" root svg attributes) F << "" << endl; F << "" << endl; F << "" << endl; F << "" << endl; // --- end of definitions --- F << "" << endl; // page background: if ((LAYOUT.background_r != 1) || (LAYOUT.background_g != 1) || (LAYOUT.background_b != 1)) { bgcol=rgb2svg(LAYOUT.background_r, LAYOUT.background_g, LAYOUT.background_b); F << "" << endl; } // surface: if (LAYOUT.surface == 1) print_surface_bitmaps(F); // white scrap backgrounds (when transparency added): // grid: if (LAYOUT.grid == 1) print_grid(F,llxo,llyo,urxo,uryo,unique_prefix); // preview down: if (!MAP_PREVIEW_DOWN.empty()) print_preview(0,F,unique_prefix); // map export: for (map::iterator J = LAYERHASH.begin(); J != LAYERHASH.end(); J++) { if (J->second.Z == 0) { map < int,set > LEVEL; set page_text_scraps,used_scraps; LEVEL = J->second.scraps; /*for (map < int,set >::iterator I_l = LEVEL.begin(); I_l != LEVEL.end(); I_l++) { used_scraps = I_l->second; for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->P != "") page_text_scraps.insert(K->name); } }*/ for (map < int,set >::iterator I = LEVEL.begin(); I != LEVEL.end(); I++) { used_scraps = I->second; // background for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (K->r < 0 || K->g < 0 || K->b < 0) { bgcol=rgb2svg(LAYOUT.foreground_r, LAYOUT.foreground_g, LAYOUT.foreground_b); } else { bgcol=rgb2svg(K->r, K->g, K->b); } if (used_scraps.count(K->name) > 0 && K->I != "") { F << "" << endl; F << "I1 << "\" y=\"" << K->I2 << "\" xlink:href=\"#I_" << K->name << "_" << unique_prefix << "\" />" << endl; F << "" << endl; } } // F << "G1 << "\" y=\"" << -I->G2 << "\" xlink:href=\"#G_" << I->name << "_" << unique_prefix << "\" />" << endl; // sketches F.precision(8); for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { for (list::iterator I_sk = K->SKETCHLIST.begin(); I_sk != K->SKETCHLIST.end(); I_sk++) { F << "xx << " " << I_sk->yx << " " << -I_sk->xy << " " << -I_sk->yy << " " << I_sk->dx << " " << I_sk->dy << ")\">"; F << "height << "\" width=\"" << I_sk->width << "\" height=\"" << I_sk->height << "\" xlink:href=\"data:image/" << I_sk->type << ";base64," << endl; base64_encode(I_sk->filename, F); F << "\" />"; F << "" << endl; }; } F.precision(3); // end of sketches for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->F != "") { F << "F1 << "\" y=\"" << K->F2 << "\" xlink:href=\"#F_" << K->name << "_" << unique_prefix << "\" />" << endl; } } for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->E != "") { F << "E1 << "\" y=\"" << K->E2 << "\" xlink:href=\"#E_" << K->name << "_" << unique_prefix << "\" />" << endl; } } for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->X != "") { F << "X1 << "\" y=\"" << K->X2 << "\" xlink:href=\"#X_" << K->name << "_" << unique_prefix << "\" />" << endl; } } } } } // preview up: if (!MAP_PREVIEW_UP.empty()) print_preview(1,F,unique_prefix); // surface: if (LAYOUT.surface == 2) print_surface_bitmaps(F); // grid: if (LAYOUT.grid == 2) print_grid(F,llxo,llyo,urxo,uryo,unique_prefix); // map grid: if (LAYOUT.map_grid) { F << "" << endl; F << "" << endl; for (double i=llxo; i <= urxo; i += LAYOUT.hsize) { F << "" << endl; } for (double i=llyo; i <= uryo; i += LAYOUT.vsize) { F << "" << endl; } F << "" << endl; } F << "" << endl; F << "" << endl; // end of main SVG data block if (fmt > 0) { // legend in xhtml // title if (!ldata.exploteam.empty()) F << "

" << escape_html(ldata.explotitle) << ": " << escape_html(ldata.exploteam) << " " << ldata.explodate << "

" << endl; if (!ldata.topoteam.empty()) F << "

" << escape_html(ldata.topotitle) << ": " << escape_html(ldata.topoteam) << " " << ldata.topodate << "

" << endl; if (!ldata.cartoteam.empty()) F << "

" << escape_html(ldata.cartotitle) << ": " << escape_html(ldata.cartoteam) << " " << ldata.cartodate << "

" << endl; // color legend if (!COLORLEGENDLIST.empty()) { F << "

" << escape_html(ldata.colorlegendtitle) << "

" << endl; F << "" << endl; for(list::iterator I = COLORLEGENDLIST.begin(); I != COLORLEGENDLIST.end(); I++) { F << "" << endl; F << "" << endl; F << "" << endl; } F << "
R,I->G,I->B) << "; height: 24px; width: 36px;\">" << endl; F << "" << I->name << "
" << endl; } // map symbols if (!LEGENDLIST.empty()) { F << "

" << escape_html(ldata.legendtitle) << "

" << endl; vector L; for(list::iterator I = LEGENDLIST.begin(); I != LEGENDLIST.end(); I++) { L.push_back(*I); } int legendbox_num = LEGENDLIST.size(); int columns = LAYOUT.legend_columns; int rows = (int) ceil(double(legendbox_num) / columns); int pos = 0; F << "" << endl; for (int i = 0; i < rows; i++) { F << "" << endl; for (int j = 0; j < columns; j++) { F << "" << endl; } F << "" << endl; } F << "
" << endl; pos = i + j * rows; if (pos < legendbox_num) { L[pos].ldata.print_svg(F,unique_prefix); F << L[pos].descr; // F << "

" << endl; } F << "
" << endl; } F << "" << endl << "" << endl; } F.close(); thprintf("done\n"); } therion/thpdfdata.cxx0000664000175000017500000000510011446630400013723 0ustar useruser/** * @file thpdfdata.cxx */ /* Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include #include "thpdfdata.h" #include "thlang.h" using namespace std; list SCRAPLIST; list LEGENDLIST; list COLORLEGENDLIST; map LAYERHASH; set MAP_PREVIEW_UP, MAP_PREVIEW_DOWN; layout LAYOUT; list SURFPICTLIST; scraprecord::scraprecord() { S1=0.0; S2=0.0; layer=0; level=0; sect=0; F1=0.0; F2=0.0; F3=0.0; F4=0.0; G1=0.0; G2=0.0; G3=0.0; G4=0.0; B1=0.0; B2=0.0; B3=0.0; B4=0.0; I1=0.0; I2=0.0; I3=0.0; I4=0.0; E1=0.0; E2=0.0; E3=0.0; E4=0.0; X1=0.0; X2=0.0; X3=0.0; X4=0.0; r=-1; g=-1; b=-1; } layerrecord::layerrecord() { Z=0; AltJump = 0; minx=0; maxx=0; miny=0; maxy=0; bookmark = false; } layout::layout() { transparency = true; overlap = 20; hsize = 400; vsize = 600; map_grid = false; hoffset = 0; voffset = 0; excl_pages = false; labelx = "0"; labely = "0"; page_numbering = true; nav_right = 2; nav_up = 2; nav_factor = 30; title_pages = false; background_r = 1; background_g = 1; background_b = 1; foreground_r = 1; foreground_g = 1; foreground_b = 1; preview_below_r = .8; preview_below_g = .8; preview_below_b = .8; preview_above_r = 0; preview_above_g = 0; preview_above_b = 0; own_pages = 0; OCG = true; lang = THLANG_UNKNOWN; legend_width = 200; legend_columns = 2; surface = 0; surface_opacity = 0.7; hgridorigin = 0; vgridorigin = 0; map_header_bg = false; transparent_map_bg = false; colored_text = true; grid_coord_freq = 2; } paired::paired() { x = 0; y = 0; } therion/thdb2dab.h0000664000175000017500000000266610625655142013111 0ustar useruser/** * @file thdb2dab.h * Area border class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2dab_h #define thdb2dab_h #include #include "thobjectname.h" #include "thobjectsrc.h" /** * Area border line. */ class thdb2dab { public: thobjectname name; ///< Line name. thobjectsrc source; ///< Line source. class thline * line; ///< Line pointer. thdb2dab(); ///< Default constructor. thdb2dab * next_line, ///< Next line. * prev_line; ///< Prev line. }; typedef std::list thdb2dab_list; #endif therion/thmap.cxx0000664000175000017500000001530412046531540013106 0ustar useruser/** * @file thmap.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thmap.h" #include "thexception.h" #include "thdb2dmi.h" #include "thchenc.h" #include "thscrap.h" #include "thobjectname.h" #include "thdb2dmi.h" #include "thtflength.h" thmap::thmap() { this->first_item = NULL; this->last_item = NULL; this->expl_projection = NULL; this->projection_id = 0; this->last_level = 1; this->is_basic = true; this->selection_mode = TT_MAPITEM_UNKNOWN; this->selection_xs = NULL; this->z = thnan; this->nz = -1; } thmap::~thmap() { } int thmap::get_class_id() { return TT_MAP_CMD; } bool thmap::is(int class_id) { if (class_id == TT_MAP_CMD) return true; else return thdataobject::is(class_id); } int thmap::get_cmd_nargs() { return 1; } const char * thmap::get_cmd_end() { return "endmap"; } const char * thmap::get_cmd_name() { return "map"; } thcmd_option_desc thmap::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_map_opt); if (id == TT_MAP_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else { switch (id) { case TT_MAP_PREVIEW: return thcmd_option_desc(id,2); case TT_MAP_BREAK: return thcmd_option_desc(id,0); default: return thcmd_option_desc(id); } } } void thmap::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { thdb2dprjpr projection; if (cod.id == 1) cod.id = TT_DATAOBJECT_NAME; switch (cod.id) { case 0: thsplit_args(& this->db->db2d.mbf, *args); this->parse_item(this->db->db2d.mbf.get_size(), this->db->db2d.mbf.get_buffer()); break; case TT_MAP_PROJECTION: projection = this->db->db2d.parse_projection(*args); if (!projection.parok) ththrow(("invalid parameters of projection")); this->expl_projection = projection.prj; break; case TT_MAP_BREAK: this->last_level++; break; case TT_MAP_SURVEY: thparse_objectname(this->asoc_survey, &(this->db->buff_stations), args[0], this); break; case TT_MAP_PREVIEW: this->parse_preview(args); break; // if not found, try to set fathers properties default: thdataobject::set(cod, args, argenc, indataline); } } void thmap::self_delete() { delete this; } void thmap::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thmap:\n"); fprintf(outf,"\tz: %f\n",this->z); fprintf(outf,"\tprojection id: %d\n",this->projection_id); if (this->first_item != NULL) { fprintf(outf,"\tmap items:\n"); thdb2dmi * cbl = this->first_item; while (cbl != NULL) { fprintf(outf,"\t\t"); fprintf(outf,cbl->name); fprintf(outf," type:%d\n",cbl->type); cbl = cbl->next_item; } } } thmbuffer mapitmmb; void thmap::parse_item(int npar, char ** pars) { if ((npar != 1) && (npar != 3)) ththrow(("invalid map item")) thdb2dmi * citem = this->db->db2d.insert_map_item(); citem->itm_level = this->last_level; citem->source = this->db->csrc; citem->psurvey = this->db->get_current_survey(); citem->type = TT_MAPITEM_NORMAL; thparse_objectname(citem->name,& this->db->buff_stations, *pars); if (this->last_item == NULL) { this->first_item = citem; this->last_item = citem; } else { this->last_item->next_item = citem; citem->prev_item = this->last_item; this->last_item = citem; } if (npar == 3) { thsplit_words(&mapitmmb, pars[1]); char ** ss; size_t nw; int sv; nw = mapitmmb.get_size(); ss = mapitmmb.get_buffer(); if ((nw < 2) || (nw > 3)) ththrow(("invalid map shift specification -- %s", pars[1])) thtflength l; thparse_double(sv, citem->m_shift.m_x, ss[0]); if (sv != TT_SV_NUMBER) ththrow(("not a number -- %s", ss[0])); thparse_double(sv, citem->m_shift.m_y, ss[1]); if (sv != TT_SV_NUMBER) ththrow(("not a number -- %s", ss[1])); if (nw > 2) l.parse_units(ss[2]); citem->m_shift.m_x = l.transform(citem->m_shift.m_x); citem->m_shift.m_y = l.transform(citem->m_shift.m_y); citem->m_shift.m_preview = thmatch_token(pars[2],thtt_2dmi); if ((citem->m_shift.m_preview == TT_MAPITEM_UNKNOWN) || (citem->m_shift.m_preview == TT_MAPITEM_NORMAL)) ththrow(("unsupported preview type -- %s", pars[2])) } } void thmap::parse_preview(char ** pars) { thdb2dmi * citem = this->db->db2d.insert_map_item(); citem->source = this->db->csrc; citem->psurvey = this->db->get_current_survey(); citem->type = thmatch_token(*pars,thtt_2dmi); switch (citem->type) { case TT_MAPITEM_ABOVE: case TT_MAPITEM_BELOW: break; default: ththrow(("unsupported preview type -- %s", *pars)) } thparse_objectname(citem->name,& this->db->buff_stations, pars[1]); if (this->last_item == NULL) { this->first_item = citem; this->last_item = citem; } else { this->last_item->next_item = citem; citem->prev_item = this->last_item; this->last_item = citem; } } void thmap::calc_z() { thdb2dmi * mi; if (this->nz > -1) return; this->z = 0.0; this->nz = 0; mi = this->first_item; while (mi != NULL) { if (mi->type == TT_MAPITEM_NORMAL) { switch (mi->object->get_class_id()) { case TT_MAP_CMD: ((thmap*)mi->object)->calc_z(); if (((thmap*)mi->object)->nz > 0) { this->z += ((thmap*)mi->object)->z; this->nz++; } break; case TT_SCRAP_CMD: if (!thisnan(((thscrap*)mi->object)->z)) { this->z += ((thscrap*)mi->object)->z; this->nz++; } break; } } mi = mi->next_item; } if (this->nz > 0) { this->z /= double(this->nz); } else { this->z = thnan; } } int thmap::get_context() { return (THCTX_SURVEY); } therion/thexpuni.h0000664000175000017500000000356710625655142013304 0ustar useruser/** * @file thexpuni.h * Shapefile export classes. */ /* Copyright (C) 2007 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexpuni_h #define thexpuni_h #include #include "thscrap.h" #include "thpoint.h" #include "thline.h" #include "tharea.h" #include "thattr.h" #include "thdb2d.h" struct thexpuni_data { double m_x, m_y, m_z, m_a; thexpuni_data(double x, double y, double z, double a) : m_x(x), m_y(y), m_z(z), m_a(a) {} }; struct thexpuni_part { bool m_outer; thdb2dlp * m_lp; thscraplo * m_lo; std::list m_point_list; thexpuni_part() : m_outer(true), m_lp(NULL), m_lo(NULL) {} }; // Universal module struct thexpuni { std::list m_part_list; double resol; thexpuni(); void clear(); thexpuni_part * m_cpart; std::list m_ring_list; void polygon_start_ring(bool outer); void polygon_insert_line(thline * ln, bool reverse); void polygon_close_ring(); void parse_line(thline * line); void parse_scrap(thscrap * scrap); }; #endif therion/thdb1d.h0000664000175000017500000001773512267532260012607 0ustar useruser/** * @file thdb1d.h * Survey data structure processing class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb1d_h #define thdb1d_h #include "thobjectid.h" #include "thinfnan.h" #include "thdataleg.h" #include "thdb3d.h" #include "thdataleg.h" #include "thattr.h" #include #include #include enum { TT_TEMPSTATION_NONE, TT_TEMPSTATION_WALL, TT_TEMPSTATION_FEATURE, }; struct thdb1d_loop_leg { thdb1d_loop_leg * next_leg, * prev_leg; thdataleg * leg; bool reverse; }; struct thdb1d_loop { thdb1d_loop_leg * first_leg, * last_leg; class thdb1ds * from, * to; unsigned long nlegs; bool open; double err_dx, err_dy, err_dz, err_length, src_length; }; class thdb1d_tree_node { public: bool is_attached, is_fixed; int xx_left; bool xx_touched, extendx_ok; thdb1d_tree_node * next_eq, * prev_eq; unsigned long id, uid, narrows; double xx, extendx; class thdb1d_tree_arrow * first_arrow, * last_arrow, * back_arrow; thdb1d_tree_node() : is_attached(false), is_fixed(false), xx_left(1), xx_touched(false), extendx_ok(false), next_eq(NULL), prev_eq(NULL), id(0), uid(0), narrows(0), xx(0.0), extendx(0.0), first_arrow(NULL), last_arrow(NULL), back_arrow(NULL) {} }; class thdb1d_tree_arrow { public: bool is_discovery, is_nosurvey, is_reversed; thdb1d_tree_node * start_node, * end_node; class thdb1dl * leg; unsigned char extend; thdb1d_tree_arrow * negative; thdb1d_tree_arrow * next_arrow; thdb1d_tree_arrow() : is_discovery(false), is_nosurvey(false), is_reversed(false), start_node(NULL), end_node(NULL), leg(NULL), extend(TT_EXTENDFLAG_NORMAL), negative(NULL), next_arrow(NULL) {} }; /** * Stations search map. */ typedef std::map thdb1d_station_map_type; /** * Station information class. */ class thdb1ds { public: unsigned long uid; ///< Unique ID of a station. double x, y, z; // coordinates double xx; // coordinate for extended elevation double asl; // average cave shot length from this point const char * name, ///< Station name. * comment; ///< Station comment. class thsurvey * survey; ///< Station survey. class thdataobject * fixcontext; ///< Fix context. bool tmpselect; std::list data; ///< Station data. unsigned data_priority; ///< 0 - undefined, 1 - equate, 2 - leg, 3 - fix char temps; ///< Station temporary status. unsigned long flags; ///< Station flags. int mark, ///< Mark type. extend; ///< Extend flags: normal, reverse, left, right, break bool mark_station; bool adjusted, fixed; int placed; double sdx, sdy, sdz; double explored; /** * Default constructor. */ thdb1ds() : uid(0), x(0), y(0), z(0), name(NULL), comment(NULL), survey(NULL), fixcontext(NULL), data_priority(0), temps(TT_TEMPSTATION_NONE), flags(TT_STATIONFLAG_NONE), mark(TT_DATAMARK_TEMP), extend(TT_EXTENDFLAG_NORMAL), adjusted(false), fixed(false), placed(0), sdx(0.0), sdy(0.0), sdz(0.0), explored(thnan) {} /** * Default constructor with 2 parameters. */ thdb1ds(const char * n, class thsurvey * ps) : uid(0), x(0), y(0), z(0), name(n), comment(NULL), survey(ps), fixcontext(NULL), data_priority(0), temps(TT_TEMPSTATION_NONE), flags(TT_STATIONFLAG_NONE), mark(TT_DATAMARK_TEMP), extend(TT_EXTENDFLAG_NORMAL), mark_station(false), adjusted(false), fixed(false), placed(0), sdx(0.0), sdy(0.0), sdz(0.0), explored(thnan) {} /** * Set parent data. */ void set_parent_data(class thdata * pd, unsigned pd_priority); /** * Is station temporary. */ bool is_temporary() {return (temps != TT_TEMPSTATION_NONE);} /** * Set temporary status. */ void set_temporary(char ts) {temps = ts;} /** * Set temporary status. */ void set_temporary(const char * name); /** * Export station attributes to metapost. */ void export_mp_flags(FILE * out); }; /** * Stations vector. */ typedef std::vector < thdb1ds > thdb1d_station_vec_type; /** * Leg information class. */ class thdb1dl { public: class thdataleg * leg; class thdata * data; class thsurvey * survey; bool reverse; unsigned long series_id, component_id; thdb1dl() : leg(NULL), data(NULL), survey(NULL), reverse(false), series_id(0), component_id(0) {} thdb1dl(class thdataleg * l, class thdata * d, class thsurvey * s) : leg(l), data(d), survey(s), reverse(false), series_id(0), component_id(0) {} }; /** * Legs vector. */ typedef std::vector < thdb1dl > thdb1d_leg_vec_type; typedef std::list < thdb1d_loop_leg > thdb1d_loop_leg_list_type; typedef std::list < thdb1d_loop > thdb1d_loop_list_type; /** * Survey data structure processing class. */ class thdb1d { public: class thdatabase * db; ///< Our database. thdb1dl ** tree_legs; ///< Tree structure. thdb1d_tree_arrow * tree_arrows; thdb1d_tree_node * tree_nodes; thdb3ddata d3_data, d3_surface, d3_walls, d3_splay; thattr m_station_attr; double min_year, max_year; bool d3_data_parsed; unsigned long num_tree_legs; ///< Number of legs in the tree. unsigned long lsid; ///< Last station id. double nlength; /** * Scan survey stations. */ void scan_data(); /** * Process survey data tree. */ void process_tree(); /** * Insert station into mapping. */ unsigned long insert_station(class thobjectname on, class thsurvey * ps, class thdata * pd, unsigned priority); /** * Process survey statistics. */ void process_survey_stat(); void postprocess_objects(); public: thdb1d_station_vec_type station_vec; ///< Stations data. thdb1d_station_map_type station_map; ///< Stations map. thdb1d_leg_vec_type leg_vec; ///< Survey shots. thdb1d_loop_leg_list_type loop_leg_list; thdb1d_loop_list_type loop_list; /** * Standard constructor. */ thdb1d(); /** * Destructor. */ ~thdb1d(); /** * Assign database pointer. */ void assigndb(thdatabase * dbptr); /** * Make a loop closure and calculate stations coordinates. */ void process_data(); /** * Return station id if exist, 0 otherwise. */ unsigned long get_station_id(class thobjectname on, class thsurvey * ps); /** * Print self. */ void self_print(FILE * outf); /** * Return number of legs in the tree. */ unsigned long get_tree_size(); /** * Return tree legs. */ thdb1dl ** get_tree_legs(); thdb1d_tree_arrow * get_tree_arrows() {return this->tree_arrows;} thdb1d_tree_node * get_tree_nodes() {return this->tree_nodes;} /** * Find loops. */ void find_loops(); /** * Make loop closure and calculate station coordinates. */ void close_loops(); void print_loops(); void process_xelev(); thdb3ddata * get_3d(); thdb3ddata * get_3d_splay(); thdb3ddata * get_3d_surface(); thdb3ddata * get_3d_walls(); }; #endif therion/therion.ico0000664000175000017500000000137610024272314013414 0ustar useruser è( @€€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ àÎàîÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿçÿÿÿãÿÿþÁÿÿø€ÿþÁ€ü?þþþüø<ðxÀø€ÀÀÿ‡Ãð‡ãðƒãàáàƒáãÇàãÇáçæáïçÃï÷‡ÇÿÿÇÿÿãŸÿÿñ?ÿÿütherion/makeconvert.pl0000775000175000017500000000175210576400772014141 0ustar useruser#!/usr/bin/perl @ls = `ls -1 -R`; @flist = (); $cdir = '.'; foreach $ln (@ls) { if ($ln =~ /(.*)\:$/) { $cdir = $1; } elsif ($ln =~ /\S/) { $ln =~ s/^\s+//; $ln =~ s/\s+$//; if ($ln =~ /(\.th$|\.th2$)/) { push @flist, "$cdir/$ln"; } } } foreach $fn (@flist) { open(FL,"$fn"); @fls = ; close(FL); @flso = (); $toconv = 1; $numch = 0; foreach $fln (@fls) { if ($fln =~ /\d\s+station\s+\-name\s+\S+/) { $toconv = 0; } if ($fln =~ /\s+\-id\s+\S+/) { $toconv = 0; } if ($fln =~ /(\s+)\-name(\s+\S+)/) {$numch++}; $fln =~ s/(\s+)\-name(\s+\S+)/\1\-id\2/g; if ($fln =~ /(^\s*)name(\s+\S+\s*$)/) {$numch++}; $fln =~ s/(^\s*)name(\s+\S+\s*$)/\1\id\2/g; if ($fln =~ /(\s+)\-station(\s+\S+)/) {$numch++}; $fln =~ s/(\s+)\-station(\s+\S+)/\1\-name\2/g; push @flso,$fln; } if ($toconv && ($numch > 0)) { print "$fn ($numch changes)\n"; open(FL,">$fn"); print FL "@flso"; close(FL); } }therion/thdatastation.h0000664000175000017500000000313210721175432014267 0ustar useruser/** * @file thdatastation.h * datastation module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdatastation_h #define thdatastation_h #include "thdataobject.h" /** * Datastation class. * * Only virtual class. */ class thdatastation : public thdataobject { public: /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thdatastation";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); }; #endif therion/thchencdata.cxx0000664000175000017500000011521510720726736014257 0ustar useruser/** * @file thchencdata.cxx * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #ifndef thchencdata_cxx #define thchencdata_cxx #include /** * First ascii en-de-coded character. */ static const unsigned char thchenc_facc = 0X80; /** * First unicode en-de-coded character. */ static const wchar_t thchenc_fucc = 0X0080; /** * Size of decoding table. */ static const size_t thdecode_tbl_size = 375; /** * Undefined ascii character. */ static const unsigned char thdecode_undef = 0X5F; static const wchar_t thencode_tbl[128][9] = { {0X005F, 0X20AC, 0X0402, 0X20AC, 0X20AC, 0X0080, 0X0080, 0X0080, 0X0080}, {0X005F, 0X005F, 0X0403, 0X005F, 0X005F, 0X0081, 0X0081, 0X0081, 0X0081}, {0X005F, 0X201A, 0X201A, 0X201A, 0X201A, 0X0082, 0X0082, 0X0082, 0X0082}, {0X005F, 0X005F, 0X0453, 0X0192, 0X0192, 0X0083, 0X0083, 0X0083, 0X0083}, {0X005F, 0X201E, 0X201E, 0X201E, 0X201E, 0X0084, 0X0084, 0X0084, 0X0084}, {0X005F, 0X2026, 0X2026, 0X2026, 0X2026, 0X0085, 0X0085, 0X0085, 0X0085}, {0X005F, 0X2020, 0X2020, 0X2020, 0X2020, 0X0086, 0X0086, 0X0086, 0X0086}, {0X005F, 0X2021, 0X2021, 0X2021, 0X2021, 0X0087, 0X0087, 0X0087, 0X0087}, {0X005F, 0X005F, 0X005F, 0X02C6, 0X005F, 0X0088, 0X0088, 0X0088, 0X0088}, {0X005F, 0X2030, 0X2030, 0X2030, 0X2030, 0X0089, 0X0089, 0X0089, 0X0089}, {0X005F, 0X0160, 0X0409, 0X0160, 0X005F, 0X008A, 0X008A, 0X008A, 0X008A}, {0X005F, 0X2039, 0X2039, 0X2039, 0X2039, 0X008B, 0X008B, 0X008B, 0X008B}, {0X005F, 0X015A, 0X040A, 0X0152, 0X005F, 0X008C, 0X008C, 0X008C, 0X008C}, {0X005F, 0X0164, 0X040C, 0X005F, 0X005F, 0X008D, 0X008D, 0X008D, 0X008D}, {0X005F, 0X017D, 0X040B, 0X017D, 0X005F, 0X008E, 0X008E, 0X008E, 0X008E}, {0X005F, 0X0179, 0X040F, 0X005F, 0X005F, 0X008F, 0X008F, 0X008F, 0X008F}, {0X005F, 0X005F, 0X0452, 0X005F, 0X005F, 0X0090, 0X0090, 0X0090, 0X0090}, {0X005F, 0X2018, 0X2018, 0X2018, 0X2018, 0X0091, 0X0091, 0X0091, 0X0091}, {0X005F, 0X2019, 0X2019, 0X2019, 0X2019, 0X0092, 0X0092, 0X0092, 0X0092}, {0X005F, 0X201C, 0X201C, 0X201C, 0X201C, 0X0093, 0X0093, 0X0093, 0X0093}, {0X005F, 0X201D, 0X201D, 0X201D, 0X201D, 0X0094, 0X0094, 0X0094, 0X0094}, {0X005F, 0X2022, 0X2022, 0X2022, 0X2022, 0X0095, 0X0095, 0X0095, 0X0095}, {0X005F, 0X2013, 0X2013, 0X2013, 0X2013, 0X0096, 0X0096, 0X0096, 0X0096}, {0X005F, 0X2014, 0X2014, 0X2014, 0X2014, 0X0097, 0X0097, 0X0097, 0X0097}, {0X005F, 0X005F, 0X005F, 0X02DC, 0X005F, 0X0098, 0X0098, 0X0098, 0X0098}, {0X005F, 0X2122, 0X2122, 0X2122, 0X2122, 0X0099, 0X0099, 0X0099, 0X0099}, {0X005F, 0X0161, 0X0459, 0X0161, 0X005F, 0X009A, 0X009A, 0X009A, 0X009A}, {0X005F, 0X203A, 0X203A, 0X203A, 0X203A, 0X009B, 0X009B, 0X009B, 0X009B}, {0X005F, 0X015B, 0X045A, 0X0153, 0X005F, 0X009C, 0X009C, 0X009C, 0X009C}, {0X005F, 0X0165, 0X045C, 0X005F, 0X005F, 0X009D, 0X009D, 0X009D, 0X009D}, {0X005F, 0X017E, 0X045B, 0X017E, 0X005F, 0X009E, 0X009E, 0X009E, 0X009E}, {0X005F, 0X017A, 0X045F, 0X0178, 0X005F, 0X009F, 0X009F, 0X009F, 0X009F}, {0X005F, 0X00A0, 0X00A0, 0X00A0, 0X00A0, 0X00A0, 0X00A0, 0X00A0, 0X00A0}, {0X005F, 0X02C7, 0X040E, 0X00A1, 0X0385, 0X00A1, 0X0104, 0X0401, 0X2018}, {0X005F, 0X02D8, 0X045E, 0X00A2, 0X0386, 0X00A2, 0X02D8, 0X0402, 0X2019}, {0X005F, 0X0141, 0X0408, 0X00A3, 0X00A3, 0X00A3, 0X0141, 0X0403, 0X00A3}, {0X005F, 0X00A4, 0X00A4, 0X00A4, 0X00A4, 0X00A4, 0X00A4, 0X0404, 0X005F}, {0X005F, 0X0104, 0X0490, 0X00A5, 0X00A5, 0X00A5, 0X013D, 0X0405, 0X005F}, {0X005F, 0X00A6, 0X00A6, 0X00A6, 0X00A6, 0X00A6, 0X015A, 0X0406, 0X00A6}, {0X005F, 0X00A7, 0X00A7, 0X00A7, 0X00A7, 0X00A7, 0X00A7, 0X0407, 0X00A7}, {0X005F, 0X00A8, 0X0401, 0X00A8, 0X00A8, 0X00A8, 0X00A8, 0X0408, 0X00A8}, {0X005F, 0X00A9, 0X00A9, 0X00A9, 0X00A9, 0X00A9, 0X0160, 0X0409, 0X00A9}, {0X005F, 0X015E, 0X0404, 0X00AA, 0X005F, 0X00AA, 0X015E, 0X040A, 0X005F}, {0X005F, 0X00AB, 0X00AB, 0X00AB, 0X00AB, 0X00AB, 0X0164, 0X040B, 0X00AB}, {0X005F, 0X00AC, 0X00AC, 0X00AC, 0X00AC, 0X00AC, 0X0179, 0X040C, 0X00AC}, {0X005F, 0X00AD, 0X00AD, 0X00AD, 0X00AD, 0X00AD, 0X00AD, 0X00AD, 0X00AD}, {0X005F, 0X00AE, 0X00AE, 0X00AE, 0X00AE, 0X00AE, 0X017D, 0X040E, 0X005F}, {0X005F, 0X017B, 0X0407, 0X00AF, 0X2015, 0X00AF, 0X017B, 0X040F, 0X2015}, {0X005F, 0X00B0, 0X00B0, 0X00B0, 0X00B0, 0X00B0, 0X00B0, 0X0410, 0X00B0}, {0X005F, 0X00B1, 0X00B1, 0X00B1, 0X00B1, 0X00B1, 0X0105, 0X0411, 0X00B1}, {0X005F, 0X02DB, 0X0406, 0X00B2, 0X00B2, 0X00B2, 0X02DB, 0X0412, 0X00B2}, {0X005F, 0X0142, 0X0456, 0X00B3, 0X00B3, 0X00B3, 0X0142, 0X0413, 0X00B3}, {0X005F, 0X00B4, 0X0491, 0X00B4, 0X0384, 0X00B4, 0X00B4, 0X0414, 0X0384}, {0X005F, 0X00B5, 0X00B5, 0X00B5, 0X00B5, 0X00B5, 0X013E, 0X0415, 0X0385}, {0X005F, 0X00B6, 0X00B6, 0X00B6, 0X00B6, 0X00B6, 0X015B, 0X0416, 0X0386}, {0X005F, 0X00B7, 0X00B7, 0X00B7, 0X00B7, 0X00B7, 0X02C7, 0X0417, 0X00B7}, {0X005F, 0X00B8, 0X0451, 0X00B8, 0X0388, 0X00B8, 0X00B8, 0X0418, 0X0388}, {0X005F, 0X0105, 0X2116, 0X00B9, 0X0389, 0X00B9, 0X0161, 0X0419, 0X0389}, {0X005F, 0X015F, 0X0454, 0X00BA, 0X038A, 0X00BA, 0X015F, 0X041A, 0X038A}, {0X005F, 0X00BB, 0X00BB, 0X00BB, 0X00BB, 0X00BB, 0X0165, 0X041B, 0X00BB}, {0X005F, 0X013D, 0X0458, 0X00BC, 0X038C, 0X00BC, 0X017A, 0X041C, 0X038C}, {0X005F, 0X02DD, 0X0405, 0X00BD, 0X00BD, 0X00BD, 0X02DD, 0X041D, 0X00BD}, {0X005F, 0X013E, 0X0455, 0X00BE, 0X038E, 0X00BE, 0X017E, 0X041E, 0X038E}, {0X005F, 0X017C, 0X0457, 0X00BF, 0X038F, 0X00BF, 0X017C, 0X041F, 0X038F}, {0X005F, 0X0154, 0X0410, 0X00C0, 0X0390, 0X00C0, 0X0154, 0X0420, 0X0390}, {0X005F, 0X00C1, 0X0411, 0X00C1, 0X0391, 0X00C1, 0X00C1, 0X0421, 0X0391}, {0X005F, 0X00C2, 0X0412, 0X00C2, 0X0392, 0X00C2, 0X00C2, 0X0422, 0X0392}, {0X005F, 0X0102, 0X0413, 0X00C3, 0X0393, 0X00C3, 0X0102, 0X0423, 0X0393}, {0X005F, 0X00C4, 0X0414, 0X00C4, 0X0394, 0X00C4, 0X00C4, 0X0424, 0X0394}, {0X005F, 0X0139, 0X0415, 0X00C5, 0X0395, 0X00C5, 0X0139, 0X0425, 0X0395}, {0X005F, 0X0106, 0X0416, 0X00C6, 0X0396, 0X00C6, 0X0106, 0X0426, 0X0396}, {0X005F, 0X00C7, 0X0417, 0X00C7, 0X0397, 0X00C7, 0X00C7, 0X0427, 0X0397}, {0X005F, 0X010C, 0X0418, 0X00C8, 0X0398, 0X00C8, 0X010C, 0X0428, 0X0398}, {0X005F, 0X00C9, 0X0419, 0X00C9, 0X0399, 0X00C9, 0X00C9, 0X0429, 0X0399}, {0X005F, 0X0118, 0X041A, 0X00CA, 0X039A, 0X00CA, 0X0118, 0X042A, 0X039A}, {0X005F, 0X00CB, 0X041B, 0X00CB, 0X039B, 0X00CB, 0X00CB, 0X042B, 0X039B}, {0X005F, 0X011A, 0X041C, 0X00CC, 0X039C, 0X00CC, 0X011A, 0X042C, 0X039C}, {0X005F, 0X00CD, 0X041D, 0X00CD, 0X039D, 0X00CD, 0X00CD, 0X042D, 0X039D}, {0X005F, 0X00CE, 0X041E, 0X00CE, 0X039E, 0X00CE, 0X00CE, 0X042E, 0X039E}, {0X005F, 0X010E, 0X041F, 0X00CF, 0X039F, 0X00CF, 0X010E, 0X042F, 0X039F}, {0X005F, 0X0110, 0X0420, 0X00D0, 0X03A0, 0X00D0, 0X0110, 0X0430, 0X03A0}, {0X005F, 0X0143, 0X0421, 0X00D1, 0X03A1, 0X00D1, 0X0143, 0X0431, 0X03A1}, {0X005F, 0X0147, 0X0422, 0X00D2, 0X005F, 0X00D2, 0X0147, 0X0432, 0X005F}, {0X005F, 0X00D3, 0X0423, 0X00D3, 0X03A3, 0X00D3, 0X00D3, 0X0433, 0X03A3}, {0X005F, 0X00D4, 0X0424, 0X00D4, 0X03A4, 0X00D4, 0X00D4, 0X0434, 0X03A4}, {0X005F, 0X0150, 0X0425, 0X00D5, 0X03A5, 0X00D5, 0X0150, 0X0435, 0X03A5}, {0X005F, 0X00D6, 0X0426, 0X00D6, 0X03A6, 0X00D6, 0X00D6, 0X0436, 0X03A6}, {0X005F, 0X00D7, 0X0427, 0X00D7, 0X03A7, 0X00D7, 0X00D7, 0X0437, 0X03A7}, {0X005F, 0X0158, 0X0428, 0X00D8, 0X03A8, 0X00D8, 0X0158, 0X0438, 0X03A8}, {0X005F, 0X016E, 0X0429, 0X00D9, 0X03A9, 0X00D9, 0X016E, 0X0439, 0X03A9}, {0X005F, 0X00DA, 0X042A, 0X00DA, 0X03AA, 0X00DA, 0X00DA, 0X043A, 0X03AA}, {0X005F, 0X0170, 0X042B, 0X00DB, 0X03AB, 0X00DB, 0X0170, 0X043B, 0X03AB}, {0X005F, 0X00DC, 0X042C, 0X00DC, 0X03AC, 0X00DC, 0X00DC, 0X043C, 0X03AC}, {0X005F, 0X00DD, 0X042D, 0X00DD, 0X03AD, 0X00DD, 0X00DD, 0X043D, 0X03AD}, {0X005F, 0X0162, 0X042E, 0X00DE, 0X03AE, 0X00DE, 0X0162, 0X043E, 0X03AE}, {0X005F, 0X00DF, 0X042F, 0X00DF, 0X03AF, 0X00DF, 0X00DF, 0X043F, 0X03AF}, {0X005F, 0X0155, 0X0430, 0X00E0, 0X03B0, 0X00E0, 0X0155, 0X0440, 0X03B0}, {0X005F, 0X00E1, 0X0431, 0X00E1, 0X03B1, 0X00E1, 0X00E1, 0X0441, 0X03B1}, {0X005F, 0X00E2, 0X0432, 0X00E2, 0X03B2, 0X00E2, 0X00E2, 0X0442, 0X03B2}, {0X005F, 0X0103, 0X0433, 0X00E3, 0X03B3, 0X00E3, 0X0103, 0X0443, 0X03B3}, {0X005F, 0X00E4, 0X0434, 0X00E4, 0X03B4, 0X00E4, 0X00E4, 0X0444, 0X03B4}, {0X005F, 0X013A, 0X0435, 0X00E5, 0X03B5, 0X00E5, 0X013A, 0X0445, 0X03B5}, {0X005F, 0X0107, 0X0436, 0X00E6, 0X03B6, 0X00E6, 0X0107, 0X0446, 0X03B6}, {0X005F, 0X00E7, 0X0437, 0X00E7, 0X03B7, 0X00E7, 0X00E7, 0X0447, 0X03B7}, {0X005F, 0X010D, 0X0438, 0X00E8, 0X03B8, 0X00E8, 0X010D, 0X0448, 0X03B8}, {0X005F, 0X00E9, 0X0439, 0X00E9, 0X03B9, 0X00E9, 0X00E9, 0X0449, 0X03B9}, {0X005F, 0X0119, 0X043A, 0X00EA, 0X03BA, 0X00EA, 0X0119, 0X044A, 0X03BA}, {0X005F, 0X00EB, 0X043B, 0X00EB, 0X03BB, 0X00EB, 0X00EB, 0X044B, 0X03BB}, {0X005F, 0X011B, 0X043C, 0X00EC, 0X03BC, 0X00EC, 0X011B, 0X044C, 0X03BC}, {0X005F, 0X00ED, 0X043D, 0X00ED, 0X03BD, 0X00ED, 0X00ED, 0X044D, 0X03BD}, {0X005F, 0X00EE, 0X043E, 0X00EE, 0X03BE, 0X00EE, 0X00EE, 0X044E, 0X03BE}, {0X005F, 0X010F, 0X043F, 0X00EF, 0X03BF, 0X00EF, 0X010F, 0X044F, 0X03BF}, {0X005F, 0X0111, 0X0440, 0X00F0, 0X03C0, 0X00F0, 0X0111, 0X2116, 0X03C0}, {0X005F, 0X0144, 0X0441, 0X00F1, 0X03C1, 0X00F1, 0X0144, 0X0451, 0X03C1}, {0X005F, 0X0148, 0X0442, 0X00F2, 0X03C2, 0X00F2, 0X0148, 0X0452, 0X03C2}, {0X005F, 0X00F3, 0X0443, 0X00F3, 0X03C3, 0X00F3, 0X00F3, 0X0453, 0X03C3}, {0X005F, 0X00F4, 0X0444, 0X00F4, 0X03C4, 0X00F4, 0X00F4, 0X0454, 0X03C4}, {0X005F, 0X0151, 0X0445, 0X00F5, 0X03C5, 0X00F5, 0X0151, 0X0455, 0X03C5}, {0X005F, 0X00F6, 0X0446, 0X00F6, 0X03C6, 0X00F6, 0X00F6, 0X0456, 0X03C6}, {0X005F, 0X00F7, 0X0447, 0X00F7, 0X03C7, 0X00F7, 0X00F7, 0X0457, 0X03C7}, {0X005F, 0X0159, 0X0448, 0X00F8, 0X03C8, 0X00F8, 0X0159, 0X0458, 0X03C8}, {0X005F, 0X016F, 0X0449, 0X00F9, 0X03C9, 0X00F9, 0X016F, 0X0459, 0X03C9}, {0X005F, 0X00FA, 0X044A, 0X00FA, 0X03CA, 0X00FA, 0X00FA, 0X045A, 0X03CA}, {0X005F, 0X0171, 0X044B, 0X00FB, 0X03CB, 0X00FB, 0X0171, 0X045B, 0X03CB}, {0X005F, 0X00FC, 0X044C, 0X00FC, 0X03CC, 0X00FC, 0X00FC, 0X045C, 0X03CC}, {0X005F, 0X00FD, 0X044D, 0X00FD, 0X03CD, 0X00FD, 0X00FD, 0X00A7, 0X03CD}, {0X005F, 0X0163, 0X044E, 0X00FE, 0X03CE, 0X00FE, 0X0163, 0X045E, 0X03CE}, {0X005F, 0X02D9, 0X044F, 0X00FF, 0X005F, 0X00FF, 0X02D9, 0X045F, 0X005F}, }; static const wchar_t thdecode_tbl_idx[375] = { 0X0080, 0X0081, 0X0082, 0X0083, 0X0084, 0X0085, 0X0086, 0X0087, 0X0088, 0X0089, 0X008A, 0X008B, 0X008C, 0X008D, 0X008E, 0X008F, 0X0090, 0X0091, 0X0092, 0X0093, 0X0094, 0X0095, 0X0096, 0X0097, 0X0098, 0X0099, 0X009A, 0X009B, 0X009C, 0X009D, 0X009E, 0X009F, 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7, 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF, 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7, 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF, 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7, 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, 0X00D0, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7, 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF, 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7, 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, 0X00F0, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7, 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X00FF, 0X0102, 0X0103, 0X0104, 0X0105, 0X0106, 0X0107, 0X010C, 0X010D, 0X010E, 0X010F, 0X0110, 0X0111, 0X0118, 0X0119, 0X011A, 0X011B, 0X0139, 0X013A, 0X013D, 0X013E, 0X0141, 0X0142, 0X0143, 0X0144, 0X0147, 0X0148, 0X0150, 0X0151, 0X0152, 0X0153, 0X0154, 0X0155, 0X0158, 0X0159, 0X015A, 0X015B, 0X015E, 0X015F, 0X0160, 0X0161, 0X0162, 0X0163, 0X0164, 0X0165, 0X016E, 0X016F, 0X0170, 0X0171, 0X0178, 0X0179, 0X017A, 0X017B, 0X017C, 0X017D, 0X017E, 0X0192, 0X02C6, 0X02C7, 0X02D8, 0X02D9, 0X02DB, 0X02DC, 0X02DD, 0X0384, 0X0385, 0X0386, 0X0388, 0X0389, 0X038A, 0X038C, 0X038E, 0X038F, 0X0390, 0X0391, 0X0392, 0X0393, 0X0394, 0X0395, 0X0396, 0X0397, 0X0398, 0X0399, 0X039A, 0X039B, 0X039C, 0X039D, 0X039E, 0X039F, 0X03A0, 0X03A1, 0X03A3, 0X03A4, 0X03A5, 0X03A6, 0X03A7, 0X03A8, 0X03A9, 0X03AA, 0X03AB, 0X03AC, 0X03AD, 0X03AE, 0X03AF, 0X03B0, 0X03B1, 0X03B2, 0X03B3, 0X03B4, 0X03B5, 0X03B6, 0X03B7, 0X03B8, 0X03B9, 0X03BA, 0X03BB, 0X03BC, 0X03BD, 0X03BE, 0X03BF, 0X03C0, 0X03C1, 0X03C2, 0X03C3, 0X03C4, 0X03C5, 0X03C6, 0X03C7, 0X03C8, 0X03C9, 0X03CA, 0X03CB, 0X03CC, 0X03CD, 0X03CE, 0X0401, 0X0402, 0X0403, 0X0404, 0X0405, 0X0406, 0X0407, 0X0408, 0X0409, 0X040A, 0X040B, 0X040C, 0X040E, 0X040F, 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417, 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F, 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427, 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F, 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437, 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F, 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447, 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F, 0X0451, 0X0452, 0X0453, 0X0454, 0X0455, 0X0456, 0X0457, 0X0458, 0X0459, 0X045A, 0X045B, 0X045C, 0X045E, 0X045F, 0X0490, 0X0491, 0X2013, 0X2014, 0X2015, 0X2018, 0X2019, 0X201A, 0X201C, 0X201D, 0X201E, 0X2020, 0X2021, 0X2022, 0X2026, 0X2030, 0X2039, 0X203A, 0X20AC, 0X2116, 0X2122, }; static const unsigned char thdecode_tbl[375][9] = { {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X80, 0X80, 0X80, 0X80}, //0X0080 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X81, 0X81, 0X81, 0X81}, //0X0081 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X82, 0X82, 0X82, 0X82}, //0X0082 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X83, 0X83, 0X83, 0X83}, //0X0083 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X84, 0X84, 0X84, 0X84}, //0X0084 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X85, 0X85, 0X85, 0X85}, //0X0085 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X86, 0X86, 0X86, 0X86}, //0X0086 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X87, 0X87, 0X87, 0X87}, //0X0087 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X88, 0X88, 0X88, 0X88}, //0X0088 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X89, 0X89, 0X89, 0X89}, //0X0089 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X8A, 0X8A, 0X8A, 0X8A}, //0X008A {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X8B, 0X8B, 0X8B, 0X8B}, //0X008B {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X8C, 0X8C, 0X8C, 0X8C}, //0X008C {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X8D, 0X8D, 0X8D, 0X8D}, //0X008D {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X8E, 0X8E, 0X8E, 0X8E}, //0X008E {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X8F, 0X8F, 0X8F, 0X8F}, //0X008F {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X90, 0X90, 0X90, 0X90}, //0X0090 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X91, 0X91, 0X91, 0X91}, //0X0091 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X92, 0X92, 0X92, 0X92}, //0X0092 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X93, 0X93, 0X93, 0X93}, //0X0093 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X94, 0X94, 0X94, 0X94}, //0X0094 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X95, 0X95, 0X95, 0X95}, //0X0095 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X96, 0X96, 0X96, 0X96}, //0X0096 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X97, 0X97, 0X97, 0X97}, //0X0097 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X98, 0X98, 0X98, 0X98}, //0X0098 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X99, 0X99, 0X99, 0X99}, //0X0099 {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X9A, 0X9A, 0X9A, 0X9A}, //0X009A {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X9B, 0X9B, 0X9B, 0X9B}, //0X009B {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X9C, 0X9C, 0X9C, 0X9C}, //0X009C {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X9D, 0X9D, 0X9D, 0X9D}, //0X009D {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X9E, 0X9E, 0X9E, 0X9E}, //0X009E {0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X9F, 0X9F, 0X9F, 0X9F}, //0X009F {0X5F, 0XA0, 0XA0, 0XA0, 0XA0, 0XA0, 0XA0, 0XA0, 0XA0}, //0X00A0 {0X5F, 0X5F, 0X5F, 0XA1, 0X5F, 0XA1, 0X5F, 0X5F, 0X5F}, //0X00A1 {0X5F, 0X5F, 0X5F, 0XA2, 0X5F, 0XA2, 0X5F, 0X5F, 0X5F}, //0X00A2 {0X5F, 0X5F, 0X5F, 0XA3, 0XA3, 0XA3, 0X5F, 0X5F, 0XA3}, //0X00A3 {0X5F, 0XA4, 0XA4, 0XA4, 0XA4, 0XA4, 0XA4, 0X5F, 0X5F}, //0X00A4 {0X5F, 0X5F, 0X5F, 0XA5, 0XA5, 0XA5, 0X5F, 0X5F, 0X5F}, //0X00A5 {0X5F, 0XA6, 0XA6, 0XA6, 0XA6, 0XA6, 0X5F, 0X5F, 0XA6}, //0X00A6 {0X5F, 0XA7, 0XA7, 0XA7, 0XA7, 0XA7, 0XA7, 0XFD, 0XA7}, //0X00A7 {0X5F, 0XA8, 0X5F, 0XA8, 0XA8, 0XA8, 0XA8, 0X5F, 0XA8}, //0X00A8 {0X5F, 0XA9, 0XA9, 0XA9, 0XA9, 0XA9, 0X5F, 0X5F, 0XA9}, //0X00A9 {0X5F, 0X5F, 0X5F, 0XAA, 0X5F, 0XAA, 0X5F, 0X5F, 0X5F}, //0X00AA {0X5F, 0XAB, 0XAB, 0XAB, 0XAB, 0XAB, 0X5F, 0X5F, 0XAB}, //0X00AB {0X5F, 0XAC, 0XAC, 0XAC, 0XAC, 0XAC, 0X5F, 0X5F, 0XAC}, //0X00AC {0X5F, 0XAD, 0XAD, 0XAD, 0XAD, 0XAD, 0XAD, 0XAD, 0XAD}, //0X00AD {0X5F, 0XAE, 0XAE, 0XAE, 0XAE, 0XAE, 0X5F, 0X5F, 0X5F}, //0X00AE {0X5F, 0X5F, 0X5F, 0XAF, 0X5F, 0XAF, 0X5F, 0X5F, 0X5F}, //0X00AF {0X5F, 0XB0, 0XB0, 0XB0, 0XB0, 0XB0, 0XB0, 0X5F, 0XB0}, //0X00B0 {0X5F, 0XB1, 0XB1, 0XB1, 0XB1, 0XB1, 0X5F, 0X5F, 0XB1}, //0X00B1 {0X5F, 0X5F, 0X5F, 0XB2, 0XB2, 0XB2, 0X5F, 0X5F, 0XB2}, //0X00B2 {0X5F, 0X5F, 0X5F, 0XB3, 0XB3, 0XB3, 0X5F, 0X5F, 0XB3}, //0X00B3 {0X5F, 0XB4, 0X5F, 0XB4, 0X5F, 0XB4, 0XB4, 0X5F, 0X5F}, //0X00B4 {0X5F, 0XB5, 0XB5, 0XB5, 0XB5, 0XB5, 0X5F, 0X5F, 0X5F}, //0X00B5 {0X5F, 0XB6, 0XB6, 0XB6, 0XB6, 0XB6, 0X5F, 0X5F, 0X5F}, //0X00B6 {0X5F, 0XB7, 0XB7, 0XB7, 0XB7, 0XB7, 0X5F, 0X5F, 0XB7}, //0X00B7 {0X5F, 0XB8, 0X5F, 0XB8, 0X5F, 0XB8, 0XB8, 0X5F, 0X5F}, //0X00B8 {0X5F, 0X5F, 0X5F, 0XB9, 0X5F, 0XB9, 0X5F, 0X5F, 0X5F}, //0X00B9 {0X5F, 0X5F, 0X5F, 0XBA, 0X5F, 0XBA, 0X5F, 0X5F, 0X5F}, //0X00BA {0X5F, 0XBB, 0XBB, 0XBB, 0XBB, 0XBB, 0X5F, 0X5F, 0XBB}, //0X00BB {0X5F, 0X5F, 0X5F, 0XBC, 0X5F, 0XBC, 0X5F, 0X5F, 0X5F}, //0X00BC {0X5F, 0X5F, 0X5F, 0XBD, 0XBD, 0XBD, 0X5F, 0X5F, 0XBD}, //0X00BD {0X5F, 0X5F, 0X5F, 0XBE, 0X5F, 0XBE, 0X5F, 0X5F, 0X5F}, //0X00BE {0X5F, 0X5F, 0X5F, 0XBF, 0X5F, 0XBF, 0X5F, 0X5F, 0X5F}, //0X00BF {0X41, 0X41, 0X41, 0XC0, 0X41, 0XC0, 0X41, 0X41, 0X41}, //0X00C0 {0X41, 0XC1, 0X41, 0XC1, 0X41, 0XC1, 0XC1, 0X41, 0X41}, //0X00C1 {0X41, 0XC2, 0X41, 0XC2, 0X41, 0XC2, 0XC2, 0X41, 0X41}, //0X00C2 {0X41, 0X41, 0X41, 0XC3, 0X41, 0XC3, 0X41, 0X41, 0X41}, //0X00C3 {0X41, 0XC4, 0X41, 0XC4, 0X41, 0XC4, 0XC4, 0X41, 0X41}, //0X00C4 {0X41, 0X41, 0X41, 0XC5, 0X41, 0XC5, 0X41, 0X41, 0X41}, //0X00C5 {0X41, 0X41, 0X41, 0XC6, 0X41, 0XC6, 0X41, 0X41, 0X41}, //0X00C6 {0X43, 0XC7, 0X43, 0XC7, 0X43, 0XC7, 0XC7, 0X43, 0X43}, //0X00C7 {0X45, 0X45, 0X45, 0XC8, 0X45, 0XC8, 0X45, 0X45, 0X45}, //0X00C8 {0X45, 0XC9, 0X45, 0XC9, 0X45, 0XC9, 0XC9, 0X45, 0X45}, //0X00C9 {0X45, 0X45, 0X45, 0XCA, 0X45, 0XCA, 0X45, 0X45, 0X45}, //0X00CA {0X45, 0XCB, 0X45, 0XCB, 0X45, 0XCB, 0XCB, 0X45, 0X45}, //0X00CB {0X49, 0X49, 0X49, 0XCC, 0X49, 0XCC, 0X49, 0X49, 0X49}, //0X00CC {0X49, 0XCD, 0X49, 0XCD, 0X49, 0XCD, 0XCD, 0X49, 0X49}, //0X00CD {0X49, 0XCE, 0X49, 0XCE, 0X49, 0XCE, 0XCE, 0X49, 0X49}, //0X00CE {0X49, 0X49, 0X49, 0XCF, 0X49, 0XCF, 0X49, 0X49, 0X49}, //0X00CF {0X45, 0X45, 0X45, 0XD0, 0X45, 0XD0, 0X45, 0X45, 0X45}, //0X00D0 {0X4E, 0X4E, 0X4E, 0XD1, 0X4E, 0XD1, 0X4E, 0X4E, 0X4E}, //0X00D1 {0X4F, 0X4F, 0X4F, 0XD2, 0X4F, 0XD2, 0X4F, 0X4F, 0X4F}, //0X00D2 {0X4F, 0XD3, 0X4F, 0XD3, 0X4F, 0XD3, 0XD3, 0X4F, 0X4F}, //0X00D3 {0X4F, 0XD4, 0X4F, 0XD4, 0X4F, 0XD4, 0XD4, 0X4F, 0X4F}, //0X00D4 {0X4F, 0X4F, 0X4F, 0XD5, 0X4F, 0XD5, 0X4F, 0X4F, 0X4F}, //0X00D5 {0X4F, 0XD6, 0X4F, 0XD6, 0X4F, 0XD6, 0XD6, 0X4F, 0X4F}, //0X00D6 {0X5F, 0XD7, 0X5F, 0XD7, 0X5F, 0XD7, 0XD7, 0X5F, 0X5F}, //0X00D7 {0X4F, 0X4F, 0X4F, 0XD8, 0X4F, 0XD8, 0X4F, 0X4F, 0X4F}, //0X00D8 {0X55, 0X55, 0X55, 0XD9, 0X55, 0XD9, 0X55, 0X55, 0X55}, //0X00D9 {0X55, 0XDA, 0X55, 0XDA, 0X55, 0XDA, 0XDA, 0X55, 0X55}, //0X00DA {0X55, 0X55, 0X55, 0XDB, 0X55, 0XDB, 0X55, 0X55, 0X55}, //0X00DB {0X55, 0XDC, 0X55, 0XDC, 0X55, 0XDC, 0XDC, 0X55, 0X55}, //0X00DC {0X59, 0XDD, 0X59, 0XDD, 0X59, 0XDD, 0XDD, 0X59, 0X59}, //0X00DD {0X54, 0X54, 0X54, 0XDE, 0X54, 0XDE, 0X54, 0X54, 0X54}, //0X00DE {0X73, 0XDF, 0X73, 0XDF, 0X73, 0XDF, 0XDF, 0X73, 0X73}, //0X00DF {0X61, 0X61, 0X61, 0XE0, 0X61, 0XE0, 0X61, 0X61, 0X61}, //0X00E0 {0X61, 0XE1, 0X61, 0XE1, 0X61, 0XE1, 0XE1, 0X61, 0X61}, //0X00E1 {0X61, 0XE2, 0X61, 0XE2, 0X61, 0XE2, 0XE2, 0X61, 0X61}, //0X00E2 {0X61, 0X61, 0X61, 0XE3, 0X61, 0XE3, 0X61, 0X61, 0X61}, //0X00E3 {0X61, 0XE4, 0X61, 0XE4, 0X61, 0XE4, 0XE4, 0X61, 0X61}, //0X00E4 {0X61, 0X61, 0X61, 0XE5, 0X61, 0XE5, 0X61, 0X61, 0X61}, //0X00E5 {0X61, 0X61, 0X61, 0XE6, 0X61, 0XE6, 0X61, 0X61, 0X61}, //0X00E6 {0X63, 0XE7, 0X63, 0XE7, 0X63, 0XE7, 0XE7, 0X63, 0X63}, //0X00E7 {0X65, 0X65, 0X65, 0XE8, 0X65, 0XE8, 0X65, 0X65, 0X65}, //0X00E8 {0X65, 0XE9, 0X65, 0XE9, 0X65, 0XE9, 0XE9, 0X65, 0X65}, //0X00E9 {0X65, 0X65, 0X65, 0XEA, 0X65, 0XEA, 0X65, 0X65, 0X65}, //0X00EA {0X65, 0XEB, 0X65, 0XEB, 0X65, 0XEB, 0XEB, 0X65, 0X65}, //0X00EB {0X69, 0X69, 0X69, 0XEC, 0X69, 0XEC, 0X69, 0X69, 0X69}, //0X00EC {0X69, 0XED, 0X69, 0XED, 0X69, 0XED, 0XED, 0X69, 0X69}, //0X00ED {0X69, 0XEE, 0X69, 0XEE, 0X69, 0XEE, 0XEE, 0X69, 0X69}, //0X00EE {0X69, 0X69, 0X69, 0XEF, 0X69, 0XEF, 0X69, 0X69, 0X69}, //0X00EF {0X65, 0X65, 0X65, 0XF0, 0X65, 0XF0, 0X65, 0X65, 0X65}, //0X00F0 {0X6E, 0X6E, 0X6E, 0XF1, 0X6E, 0XF1, 0X6E, 0X6E, 0X6E}, //0X00F1 {0X6F, 0X6F, 0X6F, 0XF2, 0X6F, 0XF2, 0X6F, 0X6F, 0X6F}, //0X00F2 {0X6F, 0XF3, 0X6F, 0XF3, 0X6F, 0XF3, 0XF3, 0X6F, 0X6F}, //0X00F3 {0X6F, 0XF4, 0X6F, 0XF4, 0X6F, 0XF4, 0XF4, 0X6F, 0X6F}, //0X00F4 {0X6F, 0X6F, 0X6F, 0XF5, 0X6F, 0XF5, 0X6F, 0X6F, 0X6F}, //0X00F5 {0X6F, 0XF6, 0X6F, 0XF6, 0X6F, 0XF6, 0XF6, 0X6F, 0X6F}, //0X00F6 {0X5F, 0XF7, 0X5F, 0XF7, 0X5F, 0XF7, 0XF7, 0X5F, 0X5F}, //0X00F7 {0X6F, 0X6F, 0X6F, 0XF8, 0X6F, 0XF8, 0X6F, 0X6F, 0X6F}, //0X00F8 {0X75, 0X75, 0X75, 0XF9, 0X75, 0XF9, 0X75, 0X75, 0X75}, //0X00F9 {0X75, 0XFA, 0X75, 0XFA, 0X75, 0XFA, 0XFA, 0X75, 0X75}, //0X00FA {0X75, 0X75, 0X75, 0XFB, 0X75, 0XFB, 0X75, 0X75, 0X75}, //0X00FB {0X75, 0XFC, 0X75, 0XFC, 0X75, 0XFC, 0XFC, 0X75, 0X75}, //0X00FC {0X79, 0XFD, 0X79, 0XFD, 0X79, 0XFD, 0XFD, 0X79, 0X79}, //0X00FD {0X74, 0X74, 0X74, 0XFE, 0X74, 0XFE, 0X74, 0X74, 0X74}, //0X00FE {0X79, 0X79, 0X79, 0XFF, 0X79, 0XFF, 0X79, 0X79, 0X79}, //0X00FF {0X41, 0XC3, 0X41, 0X41, 0X41, 0X41, 0XC3, 0X41, 0X41}, //0X0102 {0X61, 0XE3, 0X61, 0X61, 0X61, 0X61, 0XE3, 0X61, 0X61}, //0X0103 {0X41, 0XA5, 0X41, 0X41, 0X41, 0X41, 0XA1, 0X41, 0X41}, //0X0104 {0X61, 0XB9, 0X61, 0X61, 0X61, 0X61, 0XB1, 0X61, 0X61}, //0X0105 {0X43, 0XC6, 0X43, 0X43, 0X43, 0X43, 0XC6, 0X43, 0X43}, //0X0106 {0X63, 0XE6, 0X63, 0X63, 0X63, 0X63, 0XE6, 0X63, 0X63}, //0X0107 {0X43, 0XC8, 0X43, 0X43, 0X43, 0X43, 0XC8, 0X43, 0X43}, //0X010C {0X63, 0XE8, 0X63, 0X63, 0X63, 0X63, 0XE8, 0X63, 0X63}, //0X010D {0X44, 0XCF, 0X44, 0X44, 0X44, 0X44, 0XCF, 0X44, 0X44}, //0X010E {0X64, 0XEF, 0X64, 0X64, 0X64, 0X64, 0XEF, 0X64, 0X64}, //0X010F {0X44, 0XD0, 0X44, 0X44, 0X44, 0X44, 0XD0, 0X44, 0X44}, //0X0110 {0X64, 0XF0, 0X64, 0X64, 0X64, 0X64, 0XF0, 0X64, 0X64}, //0X0111 {0X45, 0XCA, 0X45, 0X45, 0X45, 0X45, 0XCA, 0X45, 0X45}, //0X0118 {0X65, 0XEA, 0X65, 0X65, 0X65, 0X65, 0XEA, 0X65, 0X65}, //0X0119 {0X45, 0XCC, 0X45, 0X45, 0X45, 0X45, 0XCC, 0X45, 0X45}, //0X011A {0X65, 0XEC, 0X65, 0X65, 0X65, 0X65, 0XEC, 0X65, 0X65}, //0X011B {0X4C, 0XC5, 0X4C, 0X4C, 0X4C, 0X4C, 0XC5, 0X4C, 0X4C}, //0X0139 {0X6C, 0XE5, 0X6C, 0X6C, 0X6C, 0X6C, 0XE5, 0X6C, 0X6C}, //0X013A {0X4C, 0XBC, 0X4C, 0X4C, 0X4C, 0X4C, 0XA5, 0X4C, 0X4C}, //0X013D {0X6C, 0XBE, 0X6C, 0X6C, 0X6C, 0X6C, 0XB5, 0X6C, 0X6C}, //0X013E {0X4C, 0XA3, 0X4C, 0X4C, 0X4C, 0X4C, 0XA3, 0X4C, 0X4C}, //0X0141 {0X6C, 0XB3, 0X6C, 0X6C, 0X6C, 0X6C, 0XB3, 0X6C, 0X6C}, //0X0142 {0X4E, 0XD1, 0X4E, 0X4E, 0X4E, 0X4E, 0XD1, 0X4E, 0X4E}, //0X0143 {0X6E, 0XF1, 0X6E, 0X6E, 0X6E, 0X6E, 0XF1, 0X6E, 0X6E}, //0X0144 {0X4E, 0XD2, 0X4E, 0X4E, 0X4E, 0X4E, 0XD2, 0X4E, 0X4E}, //0X0147 {0X6E, 0XF2, 0X6E, 0X6E, 0X6E, 0X6E, 0XF2, 0X6E, 0X6E}, //0X0148 {0X4F, 0XD5, 0X4F, 0X4F, 0X4F, 0X4F, 0XD5, 0X4F, 0X4F}, //0X0150 {0X6F, 0XF5, 0X6F, 0X6F, 0X6F, 0X6F, 0XF5, 0X6F, 0X6F}, //0X0151 {0X5F, 0X5F, 0X5F, 0X8C, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F}, //0X0152 {0X5F, 0X5F, 0X5F, 0X9C, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F}, //0X0153 {0X52, 0XC0, 0X52, 0X52, 0X52, 0X52, 0XC0, 0X52, 0X52}, //0X0154 {0X72, 0XE0, 0X72, 0X72, 0X72, 0X72, 0XE0, 0X72, 0X72}, //0X0155 {0X52, 0XD8, 0X52, 0X52, 0X52, 0X52, 0XD8, 0X52, 0X52}, //0X0158 {0X72, 0XF8, 0X72, 0X72, 0X72, 0X72, 0XF8, 0X72, 0X72}, //0X0159 {0X53, 0X8C, 0X53, 0X53, 0X53, 0X53, 0XA6, 0X53, 0X53}, //0X015A {0X73, 0X9C, 0X73, 0X73, 0X73, 0X73, 0XB6, 0X73, 0X73}, //0X015B {0X53, 0XAA, 0X53, 0X53, 0X53, 0X53, 0XAA, 0X53, 0X53}, //0X015E {0X73, 0XBA, 0X73, 0X73, 0X73, 0X73, 0XBA, 0X73, 0X73}, //0X015F {0X53, 0X8A, 0X53, 0X8A, 0X53, 0X53, 0XA9, 0X53, 0X53}, //0X0160 {0X73, 0X9A, 0X73, 0X9A, 0X73, 0X73, 0XB9, 0X73, 0X73}, //0X0161 {0X54, 0XDE, 0X54, 0X54, 0X54, 0X54, 0XDE, 0X54, 0X54}, //0X0162 {0X74, 0XFE, 0X74, 0X74, 0X74, 0X74, 0XFE, 0X74, 0X74}, //0X0163 {0X54, 0X8D, 0X54, 0X54, 0X54, 0X54, 0XAB, 0X54, 0X54}, //0X0164 {0X74, 0X9D, 0X74, 0X74, 0X74, 0X74, 0XBB, 0X74, 0X74}, //0X0165 {0X55, 0XD9, 0X55, 0X55, 0X55, 0X55, 0XD9, 0X55, 0X55}, //0X016E {0X75, 0XF9, 0X75, 0X75, 0X75, 0X75, 0XF9, 0X75, 0X75}, //0X016F {0X55, 0XDB, 0X55, 0X55, 0X55, 0X55, 0XDB, 0X55, 0X55}, //0X0170 {0X75, 0XFB, 0X75, 0X75, 0X75, 0X75, 0XFB, 0X75, 0X75}, //0X0171 {0X59, 0X59, 0X59, 0X9F, 0X59, 0X59, 0X59, 0X59, 0X59}, //0X0178 {0X5A, 0X8F, 0X5A, 0X5A, 0X5A, 0X5A, 0XAC, 0X5A, 0X5A}, //0X0179 {0X7A, 0X9F, 0X7A, 0X7A, 0X7A, 0X7A, 0XBC, 0X7A, 0X7A}, //0X017A {0X5A, 0XAF, 0X5A, 0X5A, 0X5A, 0X5A, 0XAF, 0X5A, 0X5A}, //0X017B {0X7A, 0XBF, 0X7A, 0X7A, 0X7A, 0X7A, 0XBF, 0X7A, 0X7A}, //0X017C {0X5A, 0X8E, 0X5A, 0X8E, 0X5A, 0X5A, 0XAE, 0X5A, 0X5A}, //0X017D {0X7A, 0X9E, 0X7A, 0X9E, 0X7A, 0X7A, 0XBE, 0X7A, 0X7A}, //0X017E {0X66, 0X66, 0X66, 0X83, 0X83, 0X66, 0X66, 0X66, 0X66}, //0X0192 {0X5F, 0X5F, 0X5F, 0X88, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F}, //0X02C6 {0X5F, 0XA1, 0X5F, 0X5F, 0X5F, 0X5F, 0XB7, 0X5F, 0X5F}, //0X02C7 {0X5F, 0XA2, 0X5F, 0X5F, 0X5F, 0X5F, 0XA2, 0X5F, 0X5F}, //0X02D8 {0X5F, 0XFF, 0X5F, 0X5F, 0X5F, 0X5F, 0XFF, 0X5F, 0X5F}, //0X02D9 {0X5F, 0XB2, 0X5F, 0X5F, 0X5F, 0X5F, 0XB2, 0X5F, 0X5F}, //0X02DB {0X5F, 0X5F, 0X5F, 0X98, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F}, //0X02DC {0X5F, 0XBD, 0X5F, 0X5F, 0X5F, 0X5F, 0XBD, 0X5F, 0X5F}, //0X02DD {0X5F, 0X5F, 0X5F, 0X5F, 0XB4, 0X5F, 0X5F, 0X5F, 0XB4}, //0X0384 {0X5F, 0X5F, 0X5F, 0X5F, 0XA1, 0X5F, 0X5F, 0X5F, 0XB5}, //0X0385 {0X5F, 0X5F, 0X5F, 0X5F, 0XA2, 0X5F, 0X5F, 0X5F, 0XB6}, //0X0386 {0X5F, 0X5F, 0X5F, 0X5F, 0XB8, 0X5F, 0X5F, 0X5F, 0XB8}, //0X0388 {0X5F, 0X5F, 0X5F, 0X5F, 0XB9, 0X5F, 0X5F, 0X5F, 0XB9}, //0X0389 {0X5F, 0X5F, 0X5F, 0X5F, 0XBA, 0X5F, 0X5F, 0X5F, 0XBA}, //0X038A {0X5F, 0X5F, 0X5F, 0X5F, 0XBC, 0X5F, 0X5F, 0X5F, 0XBC}, //0X038C {0X5F, 0X5F, 0X5F, 0X5F, 0XBE, 0X5F, 0X5F, 0X5F, 0XBE}, //0X038E {0X5F, 0X5F, 0X5F, 0X5F, 0XBF, 0X5F, 0X5F, 0X5F, 0XBF}, //0X038F {0X5F, 0X5F, 0X5F, 0X5F, 0XC0, 0X5F, 0X5F, 0X5F, 0XC0}, //0X0390 {0X5F, 0X5F, 0X5F, 0X5F, 0XC1, 0X5F, 0X5F, 0X5F, 0XC1}, //0X0391 {0X5F, 0X5F, 0X5F, 0X5F, 0XC2, 0X5F, 0X5F, 0X5F, 0XC2}, //0X0392 {0X5F, 0X5F, 0X5F, 0X5F, 0XC3, 0X5F, 0X5F, 0X5F, 0XC3}, //0X0393 {0X5F, 0X5F, 0X5F, 0X5F, 0XC4, 0X5F, 0X5F, 0X5F, 0XC4}, //0X0394 {0X5F, 0X5F, 0X5F, 0X5F, 0XC5, 0X5F, 0X5F, 0X5F, 0XC5}, //0X0395 {0X5F, 0X5F, 0X5F, 0X5F, 0XC6, 0X5F, 0X5F, 0X5F, 0XC6}, //0X0396 {0X5F, 0X5F, 0X5F, 0X5F, 0XC7, 0X5F, 0X5F, 0X5F, 0XC7}, //0X0397 {0X5F, 0X5F, 0X5F, 0X5F, 0XC8, 0X5F, 0X5F, 0X5F, 0XC8}, //0X0398 {0X5F, 0X5F, 0X5F, 0X5F, 0XC9, 0X5F, 0X5F, 0X5F, 0XC9}, //0X0399 {0X5F, 0X5F, 0X5F, 0X5F, 0XCA, 0X5F, 0X5F, 0X5F, 0XCA}, //0X039A {0X5F, 0X5F, 0X5F, 0X5F, 0XCB, 0X5F, 0X5F, 0X5F, 0XCB}, //0X039B {0X5F, 0X5F, 0X5F, 0X5F, 0XCC, 0X5F, 0X5F, 0X5F, 0XCC}, //0X039C {0X5F, 0X5F, 0X5F, 0X5F, 0XCD, 0X5F, 0X5F, 0X5F, 0XCD}, //0X039D {0X5F, 0X5F, 0X5F, 0X5F, 0XCE, 0X5F, 0X5F, 0X5F, 0XCE}, //0X039E {0X5F, 0X5F, 0X5F, 0X5F, 0XCF, 0X5F, 0X5F, 0X5F, 0XCF}, //0X039F {0X5F, 0X5F, 0X5F, 0X5F, 0XD0, 0X5F, 0X5F, 0X5F, 0XD0}, //0X03A0 {0X5F, 0X5F, 0X5F, 0X5F, 0XD1, 0X5F, 0X5F, 0X5F, 0XD1}, //0X03A1 {0X5F, 0X5F, 0X5F, 0X5F, 0XD3, 0X5F, 0X5F, 0X5F, 0XD3}, //0X03A3 {0X5F, 0X5F, 0X5F, 0X5F, 0XD4, 0X5F, 0X5F, 0X5F, 0XD4}, //0X03A4 {0X5F, 0X5F, 0X5F, 0X5F, 0XD5, 0X5F, 0X5F, 0X5F, 0XD5}, //0X03A5 {0X5F, 0X5F, 0X5F, 0X5F, 0XD6, 0X5F, 0X5F, 0X5F, 0XD6}, //0X03A6 {0X5F, 0X5F, 0X5F, 0X5F, 0XD7, 0X5F, 0X5F, 0X5F, 0XD7}, //0X03A7 {0X5F, 0X5F, 0X5F, 0X5F, 0XD8, 0X5F, 0X5F, 0X5F, 0XD8}, //0X03A8 {0X5F, 0X5F, 0X5F, 0X5F, 0XD9, 0X5F, 0X5F, 0X5F, 0XD9}, //0X03A9 {0X5F, 0X5F, 0X5F, 0X5F, 0XDA, 0X5F, 0X5F, 0X5F, 0XDA}, //0X03AA {0X5F, 0X5F, 0X5F, 0X5F, 0XDB, 0X5F, 0X5F, 0X5F, 0XDB}, //0X03AB {0X5F, 0X5F, 0X5F, 0X5F, 0XDC, 0X5F, 0X5F, 0X5F, 0XDC}, //0X03AC {0X5F, 0X5F, 0X5F, 0X5F, 0XDD, 0X5F, 0X5F, 0X5F, 0XDD}, //0X03AD {0X5F, 0X5F, 0X5F, 0X5F, 0XDE, 0X5F, 0X5F, 0X5F, 0XDE}, //0X03AE {0X5F, 0X5F, 0X5F, 0X5F, 0XDF, 0X5F, 0X5F, 0X5F, 0XDF}, //0X03AF {0X5F, 0X5F, 0X5F, 0X5F, 0XE0, 0X5F, 0X5F, 0X5F, 0XE0}, //0X03B0 {0X5F, 0X5F, 0X5F, 0X5F, 0XE1, 0X5F, 0X5F, 0X5F, 0XE1}, //0X03B1 {0X5F, 0X5F, 0X5F, 0X5F, 0XE2, 0X5F, 0X5F, 0X5F, 0XE2}, //0X03B2 {0X5F, 0X5F, 0X5F, 0X5F, 0XE3, 0X5F, 0X5F, 0X5F, 0XE3}, //0X03B3 {0X5F, 0X5F, 0X5F, 0X5F, 0XE4, 0X5F, 0X5F, 0X5F, 0XE4}, //0X03B4 {0X5F, 0X5F, 0X5F, 0X5F, 0XE5, 0X5F, 0X5F, 0X5F, 0XE5}, //0X03B5 {0X5F, 0X5F, 0X5F, 0X5F, 0XE6, 0X5F, 0X5F, 0X5F, 0XE6}, //0X03B6 {0X5F, 0X5F, 0X5F, 0X5F, 0XE7, 0X5F, 0X5F, 0X5F, 0XE7}, //0X03B7 {0X5F, 0X5F, 0X5F, 0X5F, 0XE8, 0X5F, 0X5F, 0X5F, 0XE8}, //0X03B8 {0X5F, 0X5F, 0X5F, 0X5F, 0XE9, 0X5F, 0X5F, 0X5F, 0XE9}, //0X03B9 {0X5F, 0X5F, 0X5F, 0X5F, 0XEA, 0X5F, 0X5F, 0X5F, 0XEA}, //0X03BA {0X5F, 0X5F, 0X5F, 0X5F, 0XEB, 0X5F, 0X5F, 0X5F, 0XEB}, //0X03BB {0X5F, 0X5F, 0X5F, 0X5F, 0XEC, 0X5F, 0X5F, 0X5F, 0XEC}, //0X03BC {0X5F, 0X5F, 0X5F, 0X5F, 0XED, 0X5F, 0X5F, 0X5F, 0XED}, //0X03BD {0X5F, 0X5F, 0X5F, 0X5F, 0XEE, 0X5F, 0X5F, 0X5F, 0XEE}, //0X03BE {0X5F, 0X5F, 0X5F, 0X5F, 0XEF, 0X5F, 0X5F, 0X5F, 0XEF}, //0X03BF {0X5F, 0X5F, 0X5F, 0X5F, 0XF0, 0X5F, 0X5F, 0X5F, 0XF0}, //0X03C0 {0X5F, 0X5F, 0X5F, 0X5F, 0XF1, 0X5F, 0X5F, 0X5F, 0XF1}, //0X03C1 {0X5F, 0X5F, 0X5F, 0X5F, 0XF2, 0X5F, 0X5F, 0X5F, 0XF2}, //0X03C2 {0X5F, 0X5F, 0X5F, 0X5F, 0XF3, 0X5F, 0X5F, 0X5F, 0XF3}, //0X03C3 {0X5F, 0X5F, 0X5F, 0X5F, 0XF4, 0X5F, 0X5F, 0X5F, 0XF4}, //0X03C4 {0X5F, 0X5F, 0X5F, 0X5F, 0XF5, 0X5F, 0X5F, 0X5F, 0XF5}, //0X03C5 {0X5F, 0X5F, 0X5F, 0X5F, 0XF6, 0X5F, 0X5F, 0X5F, 0XF6}, //0X03C6 {0X5F, 0X5F, 0X5F, 0X5F, 0XF7, 0X5F, 0X5F, 0X5F, 0XF7}, //0X03C7 {0X5F, 0X5F, 0X5F, 0X5F, 0XF8, 0X5F, 0X5F, 0X5F, 0XF8}, //0X03C8 {0X5F, 0X5F, 0X5F, 0X5F, 0XF9, 0X5F, 0X5F, 0X5F, 0XF9}, //0X03C9 {0X5F, 0X5F, 0X5F, 0X5F, 0XFA, 0X5F, 0X5F, 0X5F, 0XFA}, //0X03CA {0X5F, 0X5F, 0X5F, 0X5F, 0XFB, 0X5F, 0X5F, 0X5F, 0XFB}, //0X03CB {0X5F, 0X5F, 0X5F, 0X5F, 0XFC, 0X5F, 0X5F, 0X5F, 0XFC}, //0X03CC {0X5F, 0X5F, 0X5F, 0X5F, 0XFD, 0X5F, 0X5F, 0X5F, 0XFD}, //0X03CD {0X5F, 0X5F, 0X5F, 0X5F, 0XFE, 0X5F, 0X5F, 0X5F, 0XFE}, //0X03CE {0X5F, 0X5F, 0XA8, 0X5F, 0X5F, 0X5F, 0X5F, 0XA1, 0X5F}, //0X0401 {0X5F, 0X5F, 0X80, 0X5F, 0X5F, 0X5F, 0X5F, 0XA2, 0X5F}, //0X0402 {0X5F, 0X5F, 0X81, 0X5F, 0X5F, 0X5F, 0X5F, 0XA3, 0X5F}, //0X0403 {0X5F, 0X5F, 0XAA, 0X5F, 0X5F, 0X5F, 0X5F, 0XA4, 0X5F}, //0X0404 {0X5F, 0X5F, 0XBD, 0X5F, 0X5F, 0X5F, 0X5F, 0XA5, 0X5F}, //0X0405 {0X5F, 0X5F, 0XB2, 0X5F, 0X5F, 0X5F, 0X5F, 0XA6, 0X5F}, //0X0406 {0X5F, 0X5F, 0XAF, 0X5F, 0X5F, 0X5F, 0X5F, 0XA7, 0X5F}, //0X0407 {0X5F, 0X5F, 0XA3, 0X5F, 0X5F, 0X5F, 0X5F, 0XA8, 0X5F}, //0X0408 {0X5F, 0X5F, 0X8A, 0X5F, 0X5F, 0X5F, 0X5F, 0XA9, 0X5F}, //0X0409 {0X5F, 0X5F, 0X8C, 0X5F, 0X5F, 0X5F, 0X5F, 0XAA, 0X5F}, //0X040A {0X5F, 0X5F, 0X8E, 0X5F, 0X5F, 0X5F, 0X5F, 0XAB, 0X5F}, //0X040B {0X5F, 0X5F, 0X8D, 0X5F, 0X5F, 0X5F, 0X5F, 0XAC, 0X5F}, //0X040C {0X5F, 0X5F, 0XA1, 0X5F, 0X5F, 0X5F, 0X5F, 0XAE, 0X5F}, //0X040E {0X5F, 0X5F, 0X8F, 0X5F, 0X5F, 0X5F, 0X5F, 0XAF, 0X5F}, //0X040F {0X5F, 0X5F, 0XC0, 0X5F, 0X5F, 0X5F, 0X5F, 0XB0, 0X5F}, //0X0410 {0X5F, 0X5F, 0XC1, 0X5F, 0X5F, 0X5F, 0X5F, 0XB1, 0X5F}, //0X0411 {0X5F, 0X5F, 0XC2, 0X5F, 0X5F, 0X5F, 0X5F, 0XB2, 0X5F}, //0X0412 {0X5F, 0X5F, 0XC3, 0X5F, 0X5F, 0X5F, 0X5F, 0XB3, 0X5F}, //0X0413 {0X5F, 0X5F, 0XC4, 0X5F, 0X5F, 0X5F, 0X5F, 0XB4, 0X5F}, //0X0414 {0X5F, 0X5F, 0XC5, 0X5F, 0X5F, 0X5F, 0X5F, 0XB5, 0X5F}, //0X0415 {0X5F, 0X5F, 0XC6, 0X5F, 0X5F, 0X5F, 0X5F, 0XB6, 0X5F}, //0X0416 {0X5F, 0X5F, 0XC7, 0X5F, 0X5F, 0X5F, 0X5F, 0XB7, 0X5F}, //0X0417 {0X5F, 0X5F, 0XC8, 0X5F, 0X5F, 0X5F, 0X5F, 0XB8, 0X5F}, //0X0418 {0X5F, 0X5F, 0XC9, 0X5F, 0X5F, 0X5F, 0X5F, 0XB9, 0X5F}, //0X0419 {0X5F, 0X5F, 0XCA, 0X5F, 0X5F, 0X5F, 0X5F, 0XBA, 0X5F}, //0X041A {0X5F, 0X5F, 0XCB, 0X5F, 0X5F, 0X5F, 0X5F, 0XBB, 0X5F}, //0X041B {0X5F, 0X5F, 0XCC, 0X5F, 0X5F, 0X5F, 0X5F, 0XBC, 0X5F}, //0X041C {0X5F, 0X5F, 0XCD, 0X5F, 0X5F, 0X5F, 0X5F, 0XBD, 0X5F}, //0X041D {0X5F, 0X5F, 0XCE, 0X5F, 0X5F, 0X5F, 0X5F, 0XBE, 0X5F}, //0X041E {0X5F, 0X5F, 0XCF, 0X5F, 0X5F, 0X5F, 0X5F, 0XBF, 0X5F}, //0X041F {0X5F, 0X5F, 0XD0, 0X5F, 0X5F, 0X5F, 0X5F, 0XC0, 0X5F}, //0X0420 {0X5F, 0X5F, 0XD1, 0X5F, 0X5F, 0X5F, 0X5F, 0XC1, 0X5F}, //0X0421 {0X5F, 0X5F, 0XD2, 0X5F, 0X5F, 0X5F, 0X5F, 0XC2, 0X5F}, //0X0422 {0X5F, 0X5F, 0XD3, 0X5F, 0X5F, 0X5F, 0X5F, 0XC3, 0X5F}, //0X0423 {0X5F, 0X5F, 0XD4, 0X5F, 0X5F, 0X5F, 0X5F, 0XC4, 0X5F}, //0X0424 {0X5F, 0X5F, 0XD5, 0X5F, 0X5F, 0X5F, 0X5F, 0XC5, 0X5F}, //0X0425 {0X5F, 0X5F, 0XD6, 0X5F, 0X5F, 0X5F, 0X5F, 0XC6, 0X5F}, //0X0426 {0X5F, 0X5F, 0XD7, 0X5F, 0X5F, 0X5F, 0X5F, 0XC7, 0X5F}, //0X0427 {0X5F, 0X5F, 0XD8, 0X5F, 0X5F, 0X5F, 0X5F, 0XC8, 0X5F}, //0X0428 {0X5F, 0X5F, 0XD9, 0X5F, 0X5F, 0X5F, 0X5F, 0XC9, 0X5F}, //0X0429 {0X5F, 0X5F, 0XDA, 0X5F, 0X5F, 0X5F, 0X5F, 0XCA, 0X5F}, //0X042A {0X5F, 0X5F, 0XDB, 0X5F, 0X5F, 0X5F, 0X5F, 0XCB, 0X5F}, //0X042B {0X5F, 0X5F, 0XDC, 0X5F, 0X5F, 0X5F, 0X5F, 0XCC, 0X5F}, //0X042C {0X5F, 0X5F, 0XDD, 0X5F, 0X5F, 0X5F, 0X5F, 0XCD, 0X5F}, //0X042D {0X5F, 0X5F, 0XDE, 0X5F, 0X5F, 0X5F, 0X5F, 0XCE, 0X5F}, //0X042E {0X5F, 0X5F, 0XDF, 0X5F, 0X5F, 0X5F, 0X5F, 0XCF, 0X5F}, //0X042F {0X5F, 0X5F, 0XE0, 0X5F, 0X5F, 0X5F, 0X5F, 0XD0, 0X5F}, //0X0430 {0X5F, 0X5F, 0XE1, 0X5F, 0X5F, 0X5F, 0X5F, 0XD1, 0X5F}, //0X0431 {0X5F, 0X5F, 0XE2, 0X5F, 0X5F, 0X5F, 0X5F, 0XD2, 0X5F}, //0X0432 {0X5F, 0X5F, 0XE3, 0X5F, 0X5F, 0X5F, 0X5F, 0XD3, 0X5F}, //0X0433 {0X5F, 0X5F, 0XE4, 0X5F, 0X5F, 0X5F, 0X5F, 0XD4, 0X5F}, //0X0434 {0X5F, 0X5F, 0XE5, 0X5F, 0X5F, 0X5F, 0X5F, 0XD5, 0X5F}, //0X0435 {0X5F, 0X5F, 0XE6, 0X5F, 0X5F, 0X5F, 0X5F, 0XD6, 0X5F}, //0X0436 {0X5F, 0X5F, 0XE7, 0X5F, 0X5F, 0X5F, 0X5F, 0XD7, 0X5F}, //0X0437 {0X5F, 0X5F, 0XE8, 0X5F, 0X5F, 0X5F, 0X5F, 0XD8, 0X5F}, //0X0438 {0X5F, 0X5F, 0XE9, 0X5F, 0X5F, 0X5F, 0X5F, 0XD9, 0X5F}, //0X0439 {0X5F, 0X5F, 0XEA, 0X5F, 0X5F, 0X5F, 0X5F, 0XDA, 0X5F}, //0X043A {0X5F, 0X5F, 0XEB, 0X5F, 0X5F, 0X5F, 0X5F, 0XDB, 0X5F}, //0X043B {0X5F, 0X5F, 0XEC, 0X5F, 0X5F, 0X5F, 0X5F, 0XDC, 0X5F}, //0X043C {0X5F, 0X5F, 0XED, 0X5F, 0X5F, 0X5F, 0X5F, 0XDD, 0X5F}, //0X043D {0X5F, 0X5F, 0XEE, 0X5F, 0X5F, 0X5F, 0X5F, 0XDE, 0X5F}, //0X043E {0X5F, 0X5F, 0XEF, 0X5F, 0X5F, 0X5F, 0X5F, 0XDF, 0X5F}, //0X043F {0X5F, 0X5F, 0XF0, 0X5F, 0X5F, 0X5F, 0X5F, 0XE0, 0X5F}, //0X0440 {0X5F, 0X5F, 0XF1, 0X5F, 0X5F, 0X5F, 0X5F, 0XE1, 0X5F}, //0X0441 {0X5F, 0X5F, 0XF2, 0X5F, 0X5F, 0X5F, 0X5F, 0XE2, 0X5F}, //0X0442 {0X5F, 0X5F, 0XF3, 0X5F, 0X5F, 0X5F, 0X5F, 0XE3, 0X5F}, //0X0443 {0X5F, 0X5F, 0XF4, 0X5F, 0X5F, 0X5F, 0X5F, 0XE4, 0X5F}, //0X0444 {0X5F, 0X5F, 0XF5, 0X5F, 0X5F, 0X5F, 0X5F, 0XE5, 0X5F}, //0X0445 {0X5F, 0X5F, 0XF6, 0X5F, 0X5F, 0X5F, 0X5F, 0XE6, 0X5F}, //0X0446 {0X5F, 0X5F, 0XF7, 0X5F, 0X5F, 0X5F, 0X5F, 0XE7, 0X5F}, //0X0447 {0X5F, 0X5F, 0XF8, 0X5F, 0X5F, 0X5F, 0X5F, 0XE8, 0X5F}, //0X0448 {0X5F, 0X5F, 0XF9, 0X5F, 0X5F, 0X5F, 0X5F, 0XE9, 0X5F}, //0X0449 {0X5F, 0X5F, 0XFA, 0X5F, 0X5F, 0X5F, 0X5F, 0XEA, 0X5F}, //0X044A {0X5F, 0X5F, 0XFB, 0X5F, 0X5F, 0X5F, 0X5F, 0XEB, 0X5F}, //0X044B {0X5F, 0X5F, 0XFC, 0X5F, 0X5F, 0X5F, 0X5F, 0XEC, 0X5F}, //0X044C {0X5F, 0X5F, 0XFD, 0X5F, 0X5F, 0X5F, 0X5F, 0XED, 0X5F}, //0X044D {0X5F, 0X5F, 0XFE, 0X5F, 0X5F, 0X5F, 0X5F, 0XEE, 0X5F}, //0X044E {0X5F, 0X5F, 0XFF, 0X5F, 0X5F, 0X5F, 0X5F, 0XEF, 0X5F}, //0X044F {0X5F, 0X5F, 0XB8, 0X5F, 0X5F, 0X5F, 0X5F, 0XF1, 0X5F}, //0X0451 {0X5F, 0X5F, 0X90, 0X5F, 0X5F, 0X5F, 0X5F, 0XF2, 0X5F}, //0X0452 {0X5F, 0X5F, 0X83, 0X5F, 0X5F, 0X5F, 0X5F, 0XF3, 0X5F}, //0X0453 {0X5F, 0X5F, 0XBA, 0X5F, 0X5F, 0X5F, 0X5F, 0XF4, 0X5F}, //0X0454 {0X5F, 0X5F, 0XBE, 0X5F, 0X5F, 0X5F, 0X5F, 0XF5, 0X5F}, //0X0455 {0X5F, 0X5F, 0XB3, 0X5F, 0X5F, 0X5F, 0X5F, 0XF6, 0X5F}, //0X0456 {0X5F, 0X5F, 0XBF, 0X5F, 0X5F, 0X5F, 0X5F, 0XF7, 0X5F}, //0X0457 {0X5F, 0X5F, 0XBC, 0X5F, 0X5F, 0X5F, 0X5F, 0XF8, 0X5F}, //0X0458 {0X5F, 0X5F, 0X9A, 0X5F, 0X5F, 0X5F, 0X5F, 0XF9, 0X5F}, //0X0459 {0X5F, 0X5F, 0X9C, 0X5F, 0X5F, 0X5F, 0X5F, 0XFA, 0X5F}, //0X045A {0X5F, 0X5F, 0X9E, 0X5F, 0X5F, 0X5F, 0X5F, 0XFB, 0X5F}, //0X045B {0X5F, 0X5F, 0X9D, 0X5F, 0X5F, 0X5F, 0X5F, 0XFC, 0X5F}, //0X045C {0X5F, 0X5F, 0XA2, 0X5F, 0X5F, 0X5F, 0X5F, 0XFE, 0X5F}, //0X045E {0X5F, 0X5F, 0X9F, 0X5F, 0X5F, 0X5F, 0X5F, 0XFF, 0X5F}, //0X045F {0X5F, 0X5F, 0XA5, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F}, //0X0490 {0X5F, 0X5F, 0XB4, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F, 0X5F}, //0X0491 {0X5F, 0X96, 0X96, 0X96, 0X96, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2013 {0X5F, 0X97, 0X97, 0X97, 0X97, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2014 {0X5F, 0X5F, 0X5F, 0X5F, 0XAF, 0X5F, 0X5F, 0X5F, 0XAF}, //0X2015 {0X5F, 0X91, 0X91, 0X91, 0X91, 0X5F, 0X5F, 0X5F, 0XA1}, //0X2018 {0X5F, 0X92, 0X92, 0X92, 0X92, 0X5F, 0X5F, 0X5F, 0XA2}, //0X2019 {0X5F, 0X82, 0X82, 0X82, 0X82, 0X5F, 0X5F, 0X5F, 0X5F}, //0X201A {0X5F, 0X93, 0X93, 0X93, 0X93, 0X5F, 0X5F, 0X5F, 0X5F}, //0X201C {0X5F, 0X94, 0X94, 0X94, 0X94, 0X5F, 0X5F, 0X5F, 0X5F}, //0X201D {0X5F, 0X84, 0X84, 0X84, 0X84, 0X5F, 0X5F, 0X5F, 0X5F}, //0X201E {0X5F, 0X86, 0X86, 0X86, 0X86, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2020 {0X5F, 0X87, 0X87, 0X87, 0X87, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2021 {0X5F, 0X95, 0X95, 0X95, 0X95, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2022 {0X5F, 0X85, 0X85, 0X85, 0X85, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2026 {0X5F, 0X89, 0X89, 0X89, 0X89, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2030 {0X5F, 0X8B, 0X8B, 0X8B, 0X8B, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2039 {0X5F, 0X9B, 0X9B, 0X9B, 0X9B, 0X5F, 0X5F, 0X5F, 0X5F}, //0X203A {0X5F, 0X80, 0X5F, 0X80, 0X80, 0X5F, 0X5F, 0X5F, 0X5F}, //0X20AC {0X5F, 0X5F, 0XB9, 0X5F, 0X5F, 0X5F, 0X5F, 0XF0, 0X5F}, //0X2116 {0X5F, 0X99, 0X99, 0X99, 0X99, 0X5F, 0X5F, 0X5F, 0X5F}, //0X2122 }; #endif therion/makedepend2.pl0000664000175000017500000000045512317561614013774 0ustar useruser# read make file open(MF,"Makefile"); @mflines = ; close(MF); open(MF,">Makefile"); $ind = 0; foreach $ln (@mflines) { if ($ln =~ /^\s*\#\s*DEPENDENCIES/) { $ind = 1; } if ($ind && ($ln =~ /^\w+\.o\:\s+/)) { print MF "\$(OUTDIR)/$ln"; } else { print MF $ln; } } close(MF); therion/thconfig.h0000664000175000017500000001240012047265472013226 0ustar useruser/** * @file thconfig.h * Configuration module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thconfig_h #define thconfig_h #include #include "thbuffer.h" #include "thmbuffer.h" #include "thinput.h" #include "thexporter.h" #include "thselector.h" #include "thobjectsrc.h" /** * What to do with configuration file? */ typedef enum {THCFG_GENERATE, ///< Generate config file. THCFG_UPDATE, ///< Update config file. THCFG_READ ///< Read only config file. } thcfg_fstate; struct thconfig_src { const char * fname; long startln, endln; thconfig_src() : fname(""), startln(-1), endln(-1) {} }; typedef std::list thconfig_src_list; /** * Configuration class. * * Provides functions for therion configuration. */ class thconfig { public: thbuffer fname, ///< Configuration file name. search_path, ///< Lib files search path. init_path, ///< Initialization path. install_path, ///< Installation path. bf1, ///< TMP buffer. bf2; ///< TMP buffer. thmbuffer strmbuff, ///< String storage buffer. src_fnames, ///< Source file name. cfg_dblines, ///< Lines with database commands. mbf1; ///< TMP buffer. bool skip_comments, ///< Skip comments when writing config file. generate_xthcfg, ///< Generate xtherion log file. install_tcltk, ///< Whether tcltk is installed with therion. install_tex, ///< Whether TeX is installed with therion. install_im, ///< Whether ImageMagick is installed with therion. auto_join; ///< Whether scraps in one file should be automatically joined thcfg_fstate fstate; ///< What to do with cfg file. thinput cfg_file; ///< Configuration file input. int cfg_fenc; ///< Configuration file encoding. int outcs; ///< Output coordinate system. int lang; ///< Output language. int sketch_warp; ///< Sketch warping method. thobjectsrc outcs_def; ///< Where output coordinate system is defined. double outcs_sumx, outcs_sumy, outcs_sumz, outcs_sumn; thconfig_src_list src; double tmp3dSMP, tmp3dWALLSMP, tmp3dMAXDIMD; int sketch_colors; class thdatabase * dbptr; ///< Associated db. thexporter exporter; ///< Data exporter. thselector selector; ///< Database selector. /** * Standard constructor. */ thconfig(); /** * Standard destructor. */ ~thconfig(); /** * Set config file name. */ void set_file_name(char * fn); /** * Retrieve config file name. */ char * get_file_name(); /** * Set input file name. */ void append_source(char * fname, long startln = -1, long endln = -1); /** * Retrieve input file name. */ thconfig_src_list * get_sources(); /** * Set/get skip comments state. */ void set_comments_skip(bool state); void comments_skip_on(); void comments_skip_off(); bool get_comments_skip(); /** * Set/get config file state. */ void set_file_state(thcfg_fstate fs); thcfg_fstate get_file_state(); /** * Set/get search path. */ void set_search_path(char * pth); char * get_search_path(); char * get_initialization_path(); /** * Load input from configuration file. */ void load(); /** * Load database command. */ void load_dbcommand(thmbuffer * valmb); /** * Save input into configuration file. */ void save(); /** * Write configuration to xth file. */ void xth_save(); /** * Return string storage buffer. */ thmbuffer * get_str_buff() {return &(this->strmbuff);} /** * Assign db. */ void assign_db(class thdatabase * dp); /** * Return assigned db. */ class thdatabase * get_db() {return this->dbptr;} /** * Select objects in database. */ void select_data(); /** * Export data from database. */ void export_data(); /** * Return input ptr. */ thinput * get_cfg_file() {return &(this->cfg_file);} /** * Return output coordinate system meridian convergence. */ double get_outcs_convergence(); double get_cs_convergence(int cs); bool get_outcs_center(double & x, double & y, double & z); bool get_outcs_mag_decl(double year, double & decl); void log_outcs(double decsyear, double deceyear); int get_lang(); }; /** * Configuration module. */ extern thconfig thcfg; #endif therion/thsurvey.h0000664000175000017500000001310710776207044013321 0ustar useruser/** * @file thsurvey.h * Survey module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thsurvey_h #define thsurvey_h #include "thdataobject.h" #include "thtfpwf.h" #include "thperson.h" #include /** * survey command options tokens. */ enum { TT_SURVEY_UNKNOWN = 2000, TT_SURVEY_DECLINATION = 2001, TT_SURVEY_PERSON_RENAME = 2002, TT_SURVEY_NAMESPACE = 2003, TT_SURVEY_ENTRANCE = 2004, }; /** * survey command options parsing table. */ static const thstok thtt_survey_opt[] = { {"declination", TT_SURVEY_DECLINATION}, {"entrance", TT_SURVEY_ENTRANCE}, {"namespace", TT_SURVEY_NAMESPACE}, {"person-rename", TT_SURVEY_PERSON_RENAME}, {NULL, TT_SURVEY_UNKNOWN}, }; typedef std::map thsurveyp2pmap; /** * Survey statistics class. */ class thsurveystat { public: double length, length_duplicate, length_splay, length_surface, length_approx, length_explored; class thdb1ds * station_top, * station_bottom, * station_east, * station_west, * station_north, * station_south; int station_state; ///< 0 - undefined, 1 - surface, 2 - underground unsigned long num_stations, num_shots, num_entrances; thsurveystat() : length(0.0), length_duplicate(0.0), length_splay(0.0), length_surface(0.0), length_approx(0.0), length_explored(0.0), station_top(NULL), station_bottom(NULL), station_east(NULL), station_west(NULL), station_north(NULL), station_south(NULL), station_state(0), num_stations(0), num_shots(0), num_entrances(0) {} }; /** * Survey class. * * Main data structure object. */ class thsurvey : public thdataobject { public: friend class thdatabase; friend class thdataobject; friend class thdb1d; const char * full_name; ///< Full survey name. thbuffer reverse_full_name; ///< Reverse full name - for sorting. thdataobject * foptr, ///< First object in survey. * loptr; ///< Last object in survey. unsigned level; class thdata * data; void parse_declination(char * str); void full_name_reverse(); bool decdef; ///< Check whether declination is defined. thtfpwf declin; ///< Return the declination pwf function. double decuds; ///< Declination for undated surveys. long num1; ///< Number of something. thsurveystat stat; ///< Survey statistics. thsurveyp2pmap person_renames; thobjectname entrance; ///< Entrance station name. bool privatens; thsurvey * surveyns; public: /** * Standard constructor. */ thsurvey(); /** * Standard destructor. */ virtual ~thsurvey(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Get context for object. */ virtual int get_context(); /** * Return class name. */ virtual const char * get_class_name() {return "thsurvey";}; /** * Return full survey name. */ virtual const char * get_full_name(); /** * Return reverse full survey name. */ virtual const char * get_reverse_full_name() {return this->reverse_full_name;} /** * Print object contents into file. */ virtual void self_print_properties(FILE * outf); /** * Return true, if declination was specified. */ bool get_decdef() { return this->decdef; } /** * Return the declination pwf function. */ thtfpwf * get_declin() { return &(this->declin); } /** * Return true, if declination was specified. */ double get_decuds() { return this->decuds; } /** * Get first object in survey. */ thdataobject * get_first_survey_object() {return this->foptr;} /** * Get last object in survey. */ thdataobject * get_last_survey_object() {return this->loptr;} /** * Return namespace survey. */ thsurvey * get_nss(); }; #endif therion/lib/0000775000175000017500000000000012426431257012022 5ustar userusertherion/lib/layouts.thcfg0000664000175000017500000000101411400274562014526 0ustar useruserlayout SCR200 -title "Computer screen layout" scale 1 200 grid-size 10 10 10 m page-setup 27 20.25 26 19.25 0.5 0.5 cm overlap 1 cm size 24 13.99 cm origin-label 100 100 nav-size 2 2 nav-factor 25 symbol-set SKBB endlayout layout AUT -title "Austrian symbol set" symbol-set AUT symbol-color group water [18 19 57] symbol-color group speleothems [87 39 23] symbol-color group sediments [50 42 39] symbol-color group centerline [95 0 0] symbol-color group ice [0 68 94] endlayout therion/lib/therion.th0000664000175000017500000000004607662022752014031 0ustar useruser# input survey grades input grades.th therion/lib/grades.th0000664000175000017500000000126311102261006013605 0ustar userusergrade BCRA3 -title "BCRA grade 3" # 95.44% of readings are within 0.5m (2 S.D.) length 0.25 metres # 95.44% of readings are within 2.5 degrees (2 S.D.) bearing 1.25 degrees # 95.44% of readings are within 2.5 degrees (2 S.D.) gradient 1.25 degrees # 95.44% of positions are within 0.5m (2 S.D.) position 0.25 metres endgrade grade BCRA5 -title "BCRA grade 5" # 95.44% of readings are within 0.1m (2 S.D.) length 0.05 metres # 95.44% of readings are within 1 degree (2 S.D.) bearing 0.5 degrees # 95.44% of readings are within 1 degree (2 S.D.) gradient 0.5 degrees # 95.44% of positions are within 0.1m (2 S.D.) position 0.05 metres endgrade therion/CHANGES0000664000175000017500000010013712447770430012253 0ustar useruserTherion 5.3.16 (2014-12-28): therion: * scale upper limit changed to 1:10 * geomag data updated upto 2020 * bugs fixed: - black area displayed instead of some patterns in SVG - broken XHTML output when string formatting keywords are used in map-comment etc. - unescaped special characters in map-comment etc. in XHTML - improved error message when therion can't map custom TeX fonts in MetaPost macros to Unicode - cave depth value in XHTML output - invalid compass/backcompass averaging formula xtherion: * elevation orientation in Compiler map structure loch: * VTK 6.0 support * wxWidgets 3.0 support -------------------------------------------------------------------------------- Therion 5.3.15 (2014-05-27): therion: * multiline comments inside (comment/endcomment) block allowed in data and configuration files * new TeX variables \cave[max|min]z = altitude max|min value \thversion = current therion version \currentdate = current date \outcs[code|name] = output CS code and name \northdir = true or grid \magdecl = magnetic declination in degrees \gridconv = grid meridian convergence in degrees * new metapost variables NorthDir = "true" or "grid" MagDecl = magnetic declination in degrees GridConv = grid meridian convergence in degrees * bugs fixed: - invalid colors for station names and wall altitudes xtherion: * resetting symbol options when type is changed can be turned off using xth(gui,me,type_reset_options) variable * you can turn off symbol type translation in dropdown menus using xth(gui,me,type_dropdown_trans) variable * bugs fixed: - area type u type change bug -------------------------------------------------------------------------------- Therion 5.3.14 (2014-02-22): xtherion: * added Undo/Redo toolbar buttons * added option Edit->Hide inactive scraps * added context menu, right click on line and point -------------------------------------------------------------------------------- Therion 5.3.13 (2014-01-22): therion: * bugs fixed: - update survex img parser to v8 (should fix various errors) - several patches from Wookey's debian distribution applied -------------------------------------------------------------------------------- Therion 5.3.12 (2013-12-22): therion: * -enable/disable spay-shots should work for VRML and DXF format (splay shots in separate layer) * added ATTR__shotflag_splay, ATTR__shotflag_duplicate, ATTR__shotflag_approx to metapost code before line survey * warning raised, if equate statement creates new station in some subsurvey * removed transaction from SQL export * bugs fixed: - color map-fg altitude should work for elevation projection - error deleting temporary directory - missing vcomp100.dll in Win32 installation xtherion: * bugs fixed: - BOM handling in UTF-8 files - ver.tcl ends with lf only loch: * bugs fixed: - file open dialog not working properly on Debian linux -------------------------------------------------------------------------------- Therion 5.3.11 (2012-12-22): therion: * added -survey option for map for setting survey associated with map. For example all surveying statistics from this survey will be used, when this map is selected for output. * added sketch-colors option to thconfig file, to reduce size of sketch bitmap images in maps * hide symbol from legend, if it has explicitly empty translation * survey-level works for point station-name labels, if station name is automatically determined (no -text is specified) * symbol-show|hide group text for point label, remark, date and line label * grid-angle - can be used in centerline to specify magnetic grid angle (declination against grid north). * -cs output specification works for export cave-list (including lat-long) * dates are shown using OS locale settings in map export * layout statistics explo/topo-length on/hide/off -- if it is off, team members are sorted alphabetically * KML export format supported for cave-list and continuation-list * bugs fixed: - PLT export in output coordinate system - context point air-draught not working - instrument position in centerline does not work - debug scrap-names crashes if empty scraps - counter not working in centerline data diving - revise not working outside of survey context - wrong length/depth and other statistics calculation for map output - sketch bitmaps inserted multiple times in PDF files xtherion: * bugs fixed: - new file in xtherion works, even if file is already open -------------------------------------------------------------------------------- Therion 5.3.10 (2012-08-13): therion: * added new point types: ice-stalactite, ice-stalagmite, ice-pillar, clay-choke, clay-tree * added new wall subtypes: pit, flowstone, moonmilk, overlying * added new symbol groups: ice, sediments * added -height option for pit/wall:pit * added new layout option: color map-bg transparent * full OSGB grid coverage (e.g. cs OSGB:ST) * Austrian symbol set added (thanks to Georg Pacher) * added New Zealand symbol set (NZSS, thanks to Bruce Mutton) * updated UIS symbol set (thanks to Bruce Mutton) * updated German translation (thanks to Georg Pacher) * updated Italian translation (thanks to Marco Corvi) * added bulgarian translation (thanks to Alexander Yanev) * updated English translation (thanks to Bruce Mutton) * added te reo Maori translation (thanks to Kyle Davis) * added possibility to define own coordinate system in therion.ini (cs-def) * updated survex img library to version 1.1.15 * added option -enable/disable splay-shots to 3d model export (works with .3d and .kml file formats) * bugs fixed: - fixed huge coordinate numbers in extended elevation xvi - xvi with sketches export - unnecessary warningcheck changes eliminated from metapost code - fixed bug with 3d model generation from scraps without outline - fixed bug with missing patterns in symbols.xhtml - fixed bug - direction point not working with line secion - fixed inaccurate clipping of coloured scrap background - fixed placement of surface bitmaps with larger offset - fixed alignment of some point symbols in AUT symbol set - missing white fill below cave passages in transparent PDFs if background colour is white (needed if the map is included into other map with non-white background) - fixed incorrect line width conversion in some patterns - hide white background of scraps when the PDF layer containing them is invisible - constrained Delaunay triangulation engine replaced by poly2tri - passage outline scanning algorithm improved - "nosurvey" shots allowed between unfixed stations - added missing area flowstone, moonmilk and bedrock into legend - fixed xvi export of extended elevation - fixed symbol-hide/show point remark bug - fixed wall:debris bug in AUT symbol set (thanks to Georg Pacher) - fixed layout color map-bg transparent bug - LRUD area dimensions is drawn for all shots before these shots are drawn (centerline is compact when map is exported from centerline only) xtherion: * bugs fixed: - loch: * VTK file export changed to binary type (problem with coordinate systems) * added checkbox that enables/disables surface lighting (Scene->Surface) * bugs fixed: - vthreshold should work now for LRUD modelling -------------------------------------------------------------------------------- Therion 5.3 (2010-02-17): therion: * added language selector for strings * -filter (on)|off option added to continuation export to support export of all continuations * -surveys (on)|off option added to cave-list export to allow export of raw list of caves * new easy setup for OpenType and TrueType fonts (requires lcdf-typetools) (new otf2pfb and pdf-fonts options in therion.ini) * basic support for right-to-left scripts in labels and legend * PDF files now contain unicode mapping information to allow searching and copying texts consisting of accented and non-latin characters * georeferencing data added to pdf maps * new layout option: symbol-color * new symbol groups: water, speleothems, passage-fills, equipment * new flags for stations: arch and overhang to mark these surface karst features * support for splay shots without station names (using "-" or "." as station name) * added greek translation (thanks to Stelios Zacharias) * added albanian translation (thanks to Fatos Katallozi) * updated german translation (thanks to Roger Schuster; Georg Pacher's additions to be implemented soon) * sketches displayed in map layer in pdf and svg, not among surface bitmaps (T#8996) * PROJ.4 library updated to 4.7.0 * geomag data updated until 2015 * bugs fixed: - BCRA3 and BCRA5 survey grades fixed - missing altitudes in cave list - atlas page exclusion - map header positioning using real numbers - attribute export to metapost - fixed russian translation (B#26399) - transparency in metapost reset when followed by clipped area - back readings supported in data roles+instruments - missing LRUD data in PLT export (B#25532) - segfault on line with single point - "-flip none" not working for scrap - lat/long out of range - map-header x y off behaves as if map-header x y nw (B#25537) - incorrect boundary of background sketches in pdf and svg maps xtherion: * script for creation of OziExplorer MAP files for georeferenced maps (Help->Calibrate bitmap) * added import functions for PocketTopo export - centerline in text editor: File->Import->PocketTopo therion export - sketches in map editor: Backgroud Images->Insert->PocketTopo therion export * bugs fixed: - increasing of station numbers with leading zeros or trailing letters loch: * added File->Import function to allow merging of e.g. 3d files with DTM in loch format * added Tools->Options->Measurement system setup * splay and duplicate shots are hidden by default * entrances, stations and fixed stations and their labels can be displayed on screen (added toolbar buttons and Scene setup->Stations control panel) -------------------------------------------------------------------------------- Therion 5.2 (2008-08-07): therion: * statistics of explored but not yet surveyed passages. Just specify `-explored ' to point continuation or add `explored ' to station flags and this length will be used in survey/cave statistics. * new handling of user defined symbols (including legend) * improved station flags handling. Added new flags for stations: sink, spring, doline, dig, air-draught(:winter|summer). Also `not' is supported before flag. User defined attributes may be added to stations using flag `attr' followed by attribute name and value. * station flags can be turned on|off using layout: symbol-show|hide point flag:entrance|continuation|sink|spring|doline|dig... * added `splay' and `approx[imate]' survey shot flag * grid labeling using coordinates - layout option grid-coords off|border|all * ability to color labels by scrap color using `color labels on|off' in layout * user can change translation of therion texts at runtime using `text' option in configuration or initialization files * when layouts are copied one into another, map-comments are concatenated instead of replaced * added russian translations + encodings (thanks to Vasily Vl. Suhachev) * updated french translations (thanks to Gilbert Fernandes) * attributes to metapost are exported as strings only * bugs fixed: - symbol-show|hide line moonmilk works - declination output fixed (half year shift removed) - invalid LRUD dimensions in PDF map output - installation script - page grid origin not affected by rotation/meridian convergence - scale works with all point labels xtherion: * ERROR/WARNING state of compilation * changed increased default sidebar width + default sidebar width configuration option in xtherion.ini file * single .xtherion.dat file containing survey and map structures is created after compilation * bugs fixed: - "end of line" characters translation - toolbar icon decriptions added to localization files loch: * export of cave 3D model in VTK format using File->Export * bugs fixed: - wxWidgets 2.8.0 compilation thanks to Olly Betts - walls altitude coloring under Linux -------------------------------------------------------------------------------- Therion 0.5.1 (2007-08-29): therion: * added configuration for debian based linux systems: make config-debian * new samples directory * new subtypes for air-draught symbol: winter and summer * new area types: flowstone, moonmilk * ability to display overlying maps in offset * new point and line type: map-connection (used to indicate connection between map parts - extended elevations, maps in offset) * improved default centerline symbols * LRUD envelopes of maps exported from centerline * point -extend option changed to -from * user defined types of points/lines/areas (using u type and custom subtype string e.g. u:electric-cable) * scraps without calibration stations are allowed * coordinate system specification allowed for scraps * areas exported to SHP files * export of simple DXF maps * updated Italian translation (thanks to Marco Corvi) * bugs fixed: - top level objects selection - generation of extended elevation - map coloring - creating surveys from .3d files - subpixel inaccuracy with bitmap morphing - entering angles/lat-long in degree:minutes format - shapefile export fixes xtherion: * DXF/SVG import in map editor (File->Import) * symbol themes and translations comboboxes * autocompletion in symbol type comboboxes * bugs fixed: - translations of type:subtype works loch: * first Mac OS X version works * bugs fixed: - surface texture mapping under Linux -------------------------------------------------------------------------------- Therion 0.5.0 (2007-02-02): therion: * geodetic coordinate systems support -- CS specification in layout, centerline, surface, import and configuration file. Coordinate systems used all around the world are supported (EPSG and ESRI standards). * added GEOMAG model for automatic calculation of magnetic declination according to cave coordinates and survey date * multiple images (PDF, PNG, JPEG) in PDF map supported (e.g. plan and xelevation in single PDF) using new layout option map-image * new improved vector morphing algorithm * morphing of survey sketches now supported. New -sketch option for scrap + sketches switch in layout. Allows export of morphed survey sketches in PDF and XVI. ImageMagick package (convert and identify executables) are needed to use these features. * -attr option for specification of user defined attributes, valid for all objects. Attributes are exported to metapost code using ATTR_* variables. * shapefile map export format * Google Earth (.kml) map (scrap outlines) and model (centerline) export * -enc|-encoding option allowed for map and model export * top level survey command not needed any more * survey: new -namespace switch, enables using datasets with unique station names * new area type: bedrock * subtype specification is now possible using ":" separator (e.g. border:invisible) * added "system" command in configuration files to execute system commands during therion compilation * new layout option: north (true)|grid * -calibrate option for import * source/endsource construct allowed in configuration files * input allowed within multiline commands * improved ceiling and floor meander symbols * background centerline map exported only when no scraps or maps exist * support for 1.1 survex .3d file format * added German translation of symbols (thanks to Roger Schuster), updated Italian translation (thanks to Marco Corvi). * default Linux installation is done into "/usr/local" instead of "/usr" directory * bugs fixed: - automatic calculation of atlas paper size when only size is specified - extended elevation generation ("break" removed, only "ignore" works) - empty map when exported with -layout-color map-fg map xtherion: * compiler preview toolbox (experimental, acrobat reader supported on Win32, xpdf on Linux (original idea of Marco Corvi)) * sketch control (insert, remove) in scrap toolbox * 3D viewer removed from xtherion * does not connect to Internet any more to check new version available * remembers last working directory on Windows * improved scrap scaling - "Scale" button + scale preview arrow in scrap control * scrap selection selects current scrap first * bugs fixed: - hang when area inserted at the end of file - deleting contents of configuration files should not happen any more - fixed zooming of transparent pictures loch: * bugs fixed: - initial size on multiple display machines - crash when file with texture is opened as loch argument (or doubleclick on Win) -------------------------------------------------------------------------------- Therion 0.4.0 (2006-10-02): therion: * loch - new 3D viewer and default 3D export format * VRML model export improved (added surface texture) * export model: -wall-source (all)|maps|centerline -- specify the source of passage walls * layout: survey-level -- show up to N surveys with station names (default N=0, survey-level all is also accepted). * 3d file import improved -- multiple imports of the same centerline allowed * if no map is selected with export, also centerline is exported * symbol sets overview using --print-symbols option. Output in XHTML format (file symbols.xhtml). * fixed bug with autojoin and multiple projection output xtherion: * images outside .th2 file path accepted, relative path is still created using ".." directory reference * area border lines are highlighted, when selected in listbox * backup of configuration files is created after OK compilation * added IT translation -------------------------------------------------------------------------------- Therion 0.3.10 (2006-04-05): therion: * decimal point in low passage heights * fixed bugs: loop closure errors log, symbol-hide group cave-centreline * SVG export in XHTML format * flowstone and waterflow symbols joined in legend, if used as line and point together * improved loop closure method selection - if there was an error when processed using survex - therion is used for loop closure * when scrap size exceed metapost limits - more reasonable errors are generated + limit for centerline scraps is larger * layout: you can change overlap or size and page setup is automatically recalculated * layout: color map-fg scrap * layout: debug station-names xtherion: * added toolbar (thanks to dzach) * added text editor template (in xtherion.ini file) -------------------------------------------------------------------------------- Therion 0.3.9 (2005-08-30): therion: * units (metric)|imperial in layout and initialization file * new therion.ini switch: loop-closure therion|survex By default, survex is used if present, otherwise therion. * fixed bugs - error log when disk full, vtreshold -> vthreshold * map export to .3d files * scraps in one .th2 file that have common end line points are automatically joined * scrap names in map output, via layout: debug scrap-names xtherion: * fixed bugs - view is not moved when line is split, file is not changed when image insertion is canceled -------------------------------------------------------------------------------- Therion 0.3.8 (2005-05-10): therion: * SVG export added (features not yet supported: map header, font embedding, layers, map transparency -- this requires SVG 1.2 features) * DXF model export added * export format automatically determined from file extension * layout: map-header-bg on|(off) - when on, background of map header is filled with background color * .ini files installed into /etc directory, .ini.new files always installed xtherion: * new items in xtherion.ini file * text editor - indent mode now similar to ordinary text editors -------------------------------------------------------------------------------- Therion 0.3.7 (2005-03-16): therion: * new (more intuitive) extended elevation arrangement * new import options: filter, surveys * new surface option: grid-flip * new centerline option: extend * new point type: dimensions * new scrap option: flip * new scrap/centerline option: station-names * reduced `extend' point option * all altitudes are exported as a difference against grid Z origin * XVI (xtherion vector image) map export * UD data from centerline used in 3D model generated from scraps * plt export with LRUD data * `/' supported as survey name character * Unicode characters support in layout TeX code * fixed bugs: plumbed shots; join; statistics of centerline only maps xtherion: * limited i18n support * XVI support (automatic insertion of survey stations, LRUD data) * fixed bug with gamma correction -------------------------------------------------------------------------------- Therion 0.3.6 (2005-01-31): therion: * LRUD passage dimensions support * centreline processed in other programs (*.3d, *.plt) may be imported * transparent solid surface in 3D model * map colouring support * map grid support * if station subtype is not specified, Therion reads it from centreline, if it's specified there * MetaPost symbols completed and improved (error handling, division by zero fixed) * scrap filled and clipped correctly even if scrap border intersects itself * centerline, bounding box and surface supported in 3DMF and VRML export * Spanish translation added * input language changes: - centreline command: mark, walls, vtreshold; + new role pics + new data item ignoreall + new data type dimensions (station, up/ceiling, down/floor, left, right) + LRUD dimensions may specified as pair [ ] - point command: snow - line command: ceiling/floor-meander, border:presumed + line gradient and water-flow not clipped by default - area command: blocks, snow, ice, clay, pebbles - scrap command: -3d changed to -walls option - equate command: may be used outside of centreline - import command added * configuration file changes: - layout command: grid, grid-size, code/endcode, color map-fg , color-legend xtherion: * new items in xtherion.ini * file timestamps are checked while saving * auto save feature * lot of bugfixes * Map editor: new shortcuts (ctrl-a, ctrl-r, page up/down, shift page up/down) * Map editor: clicking twice on the same point ends the point insertion mode * Map editor: station names are automatically increased (or decreased :) in extended elevation) -------------------------------------------------------------------------------- Therion 0.3.5 (2004-11-25): therion: * map rotation in 2D output supported * bug fixed: -scale option works for point labels * input language changes: - centreline command: percent[age] clino units support * configuration file changes: - layout command: rotate xtherion: * Map editor: point, line and area symbol are never inserted outside of a scrap -------------------------------------------------------------------------------- Therion 0.3.4 (2004-10-22): therion: * MetaPost and TeX supplied in Therion for Windows installer work even if there is other TeX(Live) installation present in the system (see the tex-env initialization file option) * if there are no maps defined and map is exported, all scraps in given projection are exported * input language changes: - centreline command: group/endgroup * initialization file: - new option: tex-env * fixed bug in atlas export introduced in 0.3.3 * fixed minor MetaPost bugs xtherion: * Compiler: hyperlinked error messages * Map editor: larger tick at the line symbol beginning * Map editor: new scrap is inserted in the beginning of the file * Map editor: fixed bug when deleting last line point * Map editor: line symbol type change resets rotations and lengths set-up in the line points -------------------------------------------------------------------------------- Therion 0.3.3 (2004-09-10): therion: * surface (topographical) map supported in 2D maps * surface grid supported in 3D models (therion format) * typesetting of legend symbols in multiple columns fixed * input language changes: - new command surface - point, line and area commands have new option: context - line command: survey has new subtypes: cave, surface - line command has new option: adjust - map command: ability to draw centreline from specified survey without drawing a scrap; new option: projection * configuration file changes: - layout command has new options: legend-width, legend-columns, surface, surface-opacity - export model has new options: enable, disable xtherion: * Model viewer: mouse wheel supported -------------------------------------------------------------------------------- Therion 0.3.2 (2004-07-22): therion: * configuration file changes: - layout command: scale 1 50 up to 1 100000 allowed and supported * Therion constructs accented characters if the character is not present in the font. It used to omit the accent and display the base character only * error message `invalid command context' changed to `missing xxx command before yyy command' * French translation added xtherion: * line split bug fixed * automatically checks for updates * 3D viewer: reload (Ctrl+R) * 3D viewer: bounding box computation fixed -------------------------------------------------------------------------------- Therion 0.3.1 (2004-04-23): therion: * input language changes: - scrap command has new option: 3d * windows version: accepts slashes as directory separators in the export command * Czech translation added xtherion: * Map editor: fixed bug with empty lines displayed as text * Map editor: doesn't allow to insert a background image if the *.th2 file hasn't been saved -------------------------------------------------------------------------------- Therion 0.3.0 (2004-04-16): therion: * Therion exports 3D model * loop closure algorithms implemented in Therion * input language changes: - centreline command: fix doesn't accept covariances specification * configuration file changes: - layout command: map-header improved - export command: new formats for 3D model export added -- vrml, 3dmf, therion (default) * initialization file changes: - removed item: path-cavern * log file contains both loop errors and scrap distortions at the end * completely new Win32 installation with TeX and Tcl/Tk included xtherion: * data file may be specified as an argument from the command line * basic 3D model viewer added * Map editor: only the visible part of background images is zoomed (less memory consumption and speed improvement) -------------------------------------------------------------------------------- Therion 0.2.19 (2004-03-01): therion: * input language changes: - place option of point, line, area commands: none renamed to default - area command: place bottom is default - line command: if contour has no gradient specified, visualization is symbol-set dependent (no gradient tick in UIS, tick in the middle in SKBB) - line command: pit may be spelled as pitch - line command has new type: gradient - survey command has new option: person-rename * configuration file changes: - layout command has new option: debug - select command: new rules for selection if there is no map selected * scrap transformation improved, distortion logged in the log file * debugging map mode shows scrap distortions * bug fixed in PLT export xtherion: * Map editor: status bar displays command preview * Map editor: new Area control * Map editor: `Move to' in File commands added * Map editor: name of the edited scrap displayed in Title bar * Map editor: edited line is highlighted * Map editor: selected area is highlighted * Map editor: orientation tick at the beginning of line symbols * Help/Control dialog with key and mouse shortcuts * input (keyboard) encoding menu -------------------------------------------------------------------------------- Therion 0.2.18 (2004-02-12): therion: * Therion supports translations of texts in PDF map/atlas output * Therion exports centreline to SQL database * input language changes: - line command has new type: water-flow - centerline command: discovery-date/team renamed to explo-date/team - layout command has new options: language, colo[u]r, symbol-show, map-comment, map-header, scale-bar, statistics - -author and -copyright options apply only to centreline and scrap, -title to survey, centreline, map and scrap - it's possible to leave date field unspecified `-' * configuration file changes: - export command has new type: database * initialization file changes: - new items: language, encoding-sql - encoding_default renamed to encoding-default * air-draught ticks set according to -scale option -------------------------------------------------------------------------------- Therion 0.2.17 (2003-12-04): therion: * input language changes: - layout command has new options: base-scale, symbol-set, symbol-assign, symbol-hide - size option for point and line symbols accepts following values: tiny (xs), small (s), normal (m), large (l), huge (xl) * support for run-time loading of map symbols * MetaPost processing optimizations -------------------------------------------------------------------------------- Therion 0.2.16 (2003-11-24): therion: * input language changes: - centerline command has new team roles: instruments (insts), assistant (dog) - centerline command has new data readings: up/ceiling, down/floor, left, right, ignore - centerline may be spelled as centreline - deg:min:sec syntax allowed for degree values - point, line and area commands have new option: visibility on/off * new rules for displaying map previews * new initialization file items: tmp-path, tmp-remove * error if no source files are specified * if error occurs under Win32, Therion waits until RETURN is pressed xtherion: * Help/BAC Calculator dialog added -------------------------------------------------------------------------------- Therion 0.2.15: therion: * input language changes: - layout command has new option: code - join command has new option: count * therion checks validity of UTF-8 encoded input files xtherion: * bug fixed -- compiler does not add empty lines to config files -------------------------------------------------------------------------------- Therion 0.2.14 (2003-07-16): therion: * input language changes: - layout command has new option: layers on/off * initialization file syntax changes: cavern-path, pdftex-path, mpost-path, source-path * fonts setup for PDF output * updated documentation * Therion reads (definitely) following environment variable: - THERION -- search paths for [x]therion.ini file -------------------------------------------------------------------------------- Therion 0.2.13 (2003-06-16): therion: * thpdf, theps2pdf and 3dtops external programs integrated into Therion * MetaPost and TeX macros compiled into Therion * compilation: just "make" is enough; works also on win32 systems * input language changes: - centerline command has new options: discovery-date, discovery-team - point command: type anostomosen renamed to anastomosis - layout command has new option: transparency on/off - layout command has changed option: opacity 0.0-100.0 - layout command has changed option: grid-size is measured in real units * Therion reads following environment variables: - THINIT -- search paths for [x]therion.ini file - THERION -- search paths for configuration and source files * PDF output: support for Optional Content Groups (Layers) in Acrobat 6 xtherion: * Text editor: text undo/redo works with tcltk8.4.3 * Map editor: line symbols may be split therion/thtflength.cxx0000664000175000017500000000323110754774266014162 0ustar useruser/** * @file thtflength.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thtflength.h" #include "thexception.h" thtflength::thtflength() { this->units = TT_TFU_M; } void thtflength::parse_units(char * ustr) { this->units = thmatch_token(ustr, thtt_tfunits_length); switch (this->units) { case TT_TFU_CM: this->ufactor = 0.01; break; case TT_TFU_MM: this->ufactor = 0.001; break; case TT_TFU_FT: this->ufactor = 0.3048; break; case TT_TFU_IN: this->ufactor = 0.0254; break; case TT_TFU_M: this->ufactor = 1.0; break; case TT_TFU_YD: this->ufactor = 0.9144; break; case TT_TFU_UNKNOWN_LENGTH: ththrow(("unknown length unit -- %s", ustr)) break; } } therion/thbezier.cxx0000664000175000017500000013107211576361176013627 0ustar useruser/** * @file thbezier.cxx */ /* * Bezier interpolation for inkscape drawing code. * Original code published in: * An Algorithm for Automatically Fitting Digitized Curves * by Philip J. Schneider * "Graphics Gems", Academic Press, 1990 * * Authors: * Philip J. Schneider * Lauris Kaplinski * Peter Moulder * * Copyright (C) 1990 Philip J. Schneider * Copyright (C) 2001 Lauris Kaplinski * Copyright (C) 2001 Ximian, Inc. * Copyright (C) 2003,2004 Monash University * */ /* Copyright (C) 2007 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thbezier.h" #include #include #include #define __SP_BEZIER_UTILS_C__ #define SP_HUGE 1e5 #define noBEZIER_DEBUG #ifdef HAVE_CONFIG_H # include #endif #ifdef HAVE_IEEEFP_H # include #endif //#include //#include //#include //#include //#include #include #ifdef THMSVC #include #define hypot _hypot #endif #define g_return_val_if_fail(C,V) if (!(C)) return (V); #define g_return_if_fail(C) if (!(C)) return; #define g_new(T,L) new T [L]; #define g_free(V) if (V != NULL) delete [] V #define g_assert(X) assert(X) /* You might try changing the above to if you have problems. * Whether you use math.h or cmath, you may need to edit the .cpp file * and/or other .h files to use the same header file. */ #if defined(__isnan) # define isNaN(_a) (__isnan(_a)) /* MacOSX/Darwin definition < 10.4 */ #elif defined(WIN32) || defined(_isnan) # define isNaN(_a) (_isnan(_a)) /* Win32 definition */ #elif defined(isnan) || defined(__FreeBSD__) || defined(__osf__) # define isNaN(_a) (isnan(_a)) /* GNU definition */ #else # define isNaN(_a) (std::isnan(_a)) #endif /* If the above doesn't work, then try (a != a). * Also, please report a bug as per http://www.inkscape.org/report_bugs.php, * giving information about what platform and compiler version you're using. */ #if defined(__isfinite) # define isFinite(_a) (__isfinite(_a)) /* MacOSX/Darwin definition < 10.4 */ #elif defined(__sgi) # define isFinite(_a) (_isfinite(_a)) #elif defined(isfinite) # define isFinite(_a) (isfinite(_a)) #elif defined(__osf__) # define isFinite(_a) (finite(_a) && !isNaN(_a)) #elif defined(THMSVC) # define isFinite(_a) (_finite(_a) && !isNaN(_a)) #else # define isFinite(_a) (std::isfinite(_a)) #endif /* If the above doesn't work, then try (finite(_a) && !isNaN(_a)) or (!isNaN((_a) - (_a))). * Also, please report a bug as per http://www.inkscape.org/report_bugs.php, * giving information about what platform and compiler version you're using. */ class NR_Point { private: double _pt[2]; public: inline NR_Point() { _pt[0] = _pt[1] = 0; } inline NR_Point(double x, double y) { _pt[0] = x; _pt[1] = y; } inline NR_Point(NR_Point const &p) { for (unsigned i = 0; i < 2; ++i) { _pt[i] = p._pt[i]; } } inline NR_Point &operator=(NR_Point const &p) { for (unsigned i = 0; i < 2; ++i) { _pt[i] = p._pt[i]; } return *this; } inline double operator[](unsigned i) const { return _pt[i]; } inline double &operator[](unsigned i) { return _pt[i]; } //double operator[](size_t d) const throw() { return _pt[d]; } //double &operator[](size_t d) throw() { return _pt[d]; } /** Return a point like this point but rotated -90 degrees. (If the y axis grows downwards and the x axis grows to the right, then this is 90 degrees counter-clockwise.) **/ NR_Point ccw() const { return NR_Point(_pt[1], -_pt[0]); } /** Return a point like this point but rotated +90 degrees. (If the y axis grows downwards and the x axis grows to the right, then this is 90 degrees clockwise.) **/ NR_Point cw() const { return NR_Point(-_pt[1], _pt[0]); } void normalize(); inline NR_Point &operator+=(NR_Point const &o) { for ( unsigned i = 0 ; i < 2 ; ++i ) { _pt[i] += o._pt[i]; } return *this; } inline NR_Point &operator-=(NR_Point const &o) { for ( unsigned i = 0 ; i < 2 ; ++i ) { _pt[i] -= o._pt[i]; } return *this; } inline NR_Point &operator/=(double const s) { for ( unsigned i = 0 ; i < 2 ; ++i ) { _pt[i] /= s; } return *this; } inline NR_Point &operator*=(double const s) { for ( unsigned i = 0 ; i < 2 ; ++i ) { _pt[i] *= s; } return *this; } //inline bool operator == (const NR_Point &in_pnt) const { // return ((_pt[0] == in_pnt[0]) && (_pt[1] == in_pnt[1])); //} }; inline NR_Point rot90(NR_Point const &p) { return NR_Point(-p[1], p[0]); } inline NR_Point operator+(NR_Point const &a, NR_Point const &b) { NR_Point ret; for (int i = 0; i < 2; i++) { ret[i] = a[i] + b[i]; } return ret; } inline double dot(NR_Point const &a, NR_Point const &b) { double ret = 0; for ( int i = 0 ; i < 2 ; i++ ) { ret += a[i] * b[i]; } return ret; } void NR_Point::normalize() { double len = hypot(_pt[0], _pt[1]); g_return_if_fail(len != 0); g_return_if_fail(!isNaN(len)); static double const inf = 1e300; if(len != inf) { *this /= len; } else { unsigned n_inf_coords = 0; /* Delay updating pt in case neither coord is infinite. */ NR_Point tmp; for ( unsigned i = 0 ; i < 2 ; ++i ) { if ( _pt[i] == inf ) { ++n_inf_coords; tmp[i] = 1.0; } else if ( _pt[i] == -inf ) { ++n_inf_coords; tmp[i] = -1.0; } else { tmp[i] = 0.0; } } switch (n_inf_coords) { case 0: /* Can happen if both coords are near +/-DBL_MAX. */ *this /= 4.0; len = hypot(_pt[0], _pt[1]); g_assert(len != inf); *this /= len; break; case 1: *this = tmp; break; case 2: *this = NR_Point(sqrt(0.5) * tmp[0], sqrt(0.5) * tmp[1]); break; } } } inline NR_Point operator-(NR_Point const &a, NR_Point const &b) { NR_Point ret; for (int i = 0; i < 2; i++) { ret[i] = a[i] - b[i]; } return ret; } /** This is a rotation (sort of). */ inline NR_Point operator^(NR_Point const &a, NR_Point const &b) { NR_Point const ret(a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]); return ret; } inline NR_Point operator-(NR_Point const &a) { NR_Point ret; for(unsigned i = 0; i < 2; i++) { ret[i] = -a[i]; } return ret; } inline NR_Point operator*(double const s, NR_Point const &b) { NR_Point ret; for(int i = 0; i < 2; i++) { ret[i] = s * b[i]; } return ret; } inline NR_Point operator/(NR_Point const &b, double const d) { NR_Point ret; for(int i = 0; i < 2; i++) { ret[i] = b[i] / d; } return ret; } inline bool operator==(NR_Point const &a, NR_Point const &b) { return ( ( a[0] == b[0] ) && ( a[1] == b[1] ) ); } inline bool operator!=(NR_Point const &a, NR_Point const &b) { return ( ( a[0] != b[0] ) || ( a[1] != b[1] ) ); } inline double L2(NR_Point const &p) { return hypot(p[0], p[1]); } bool is_zero(NR_Point const &p) { return ( p[0] == 0 && p[1] == 0 ); } NR_Point unit_vector(NR_Point const &a) { NR_Point ret(a); ret.normalize(); return ret; } NR_Point bezier_pt(unsigned degree, NR_Point const V[], double t); long sp_bezier_fit_cubic(NR_Point bezier[], NR_Point const data[], long len, double error); long sp_bezier_fit_cubic_r(NR_Point bezier[], NR_Point const data[], long len, double error, unsigned max_beziers); long sp_bezier_fit_cubic_full(NR_Point bezier[], int split_points[], NR_Point const data[], long len, NR_Point const &tHat1, NR_Point const &tHat2, double error, unsigned max_beziers); NR_Point sp_darray_left_tangent(NR_Point const d[], unsigned const len); NR_Point sp_darray_left_tangent(NR_Point const d[], unsigned const len, double const tolerance_sq); NR_Point sp_darray_right_tangent(NR_Point const d[], unsigned const length, double const tolerance_sq); /* * Temporary fix for various misdefinitions of isnan(). * isnan() is becoming undef'd in some .h files. * #include this last in your .cpp file to get it right. * * The problem is that isnan and isfinite are part of C99 but aren't part of * the C++ standard (which predates C99). * * Authors: * Inkscape groupies and obsessive-compulsives * * Copyright (C) 2004 authors * * Released under GNU GPL, read the file 'COPYING' for more information * * 2005 modification hereby placed in public domain. Probably supercedes the 2004 copyright * for the code itself. */ typedef NR_Point BezierCurve[]; /* Forward declarations */ static void generate_bezier(NR_Point b[], NR_Point const d[], double const u[], unsigned len, NR_Point const &tHat1, NR_Point const &tHat2, double tolerance_sq); static void estimate_lengths(NR_Point bezier[], NR_Point const data[], double const u[], unsigned len, NR_Point const &tHat1, NR_Point const &tHat2); static void estimate_bi(NR_Point b[4], unsigned ei, NR_Point const data[], double const u[], unsigned len); static void reparameterize(NR_Point const d[], unsigned len, double u[], BezierCurve const bezCurve); static double NewtonRaphsonRootFind(BezierCurve const Q, NR_Point const &P, double u); static NR_Point sp_darray_center_tangent(NR_Point const d[], unsigned center, unsigned length); static NR_Point sp_darray_right_tangent(NR_Point const d[], unsigned const len); static unsigned copy_without_nans_or_adjacent_duplicates(NR_Point const src[], unsigned src_len, NR_Point dest[]); static void chord_length_parameterize(NR_Point const d[], double u[], unsigned len); static double compute_max_error_ratio(NR_Point const d[], double const u[], unsigned len, BezierCurve const bezCurve, double tolerance, unsigned *splitPoint); static double compute_hook(NR_Point const &a, NR_Point const &b, double const u, BezierCurve const bezCurve, double const tolerance); static NR_Point const unconstrained_tangent(0, 0); /* * B0, B1, B2, B3 : Bezier multipliers */ #define B0(u) ( ( 1.0 - u ) * ( 1.0 - u ) * ( 1.0 - u ) ) #define B1(u) ( 3 * u * ( 1.0 - u ) * ( 1.0 - u ) ) #define B2(u) ( 3 * u * u * ( 1.0 - u ) ) #define B3(u) ( u * u * u ) #ifdef BEZIER_DEBUG # define DOUBLE_ASSERT(x) g_assert( ( (x) > -SP_HUGE ) && ( (x) < SP_HUGE ) ) # define BEZIER_ASSERT(b) do { \ DOUBLE_ASSERT((b)[0][0]); DOUBLE_ASSERT((b)[0][1]); \ DOUBLE_ASSERT((b)[1][0]); DOUBLE_ASSERT((b)[1][1]); \ DOUBLE_ASSERT((b)[2][0]); DOUBLE_ASSERT((b)[2][1]); \ DOUBLE_ASSERT((b)[3][0]); DOUBLE_ASSERT((b)[3][1]); \ } while(0) #else # define DOUBLE_ASSERT(x) do { } while(0) # define BEZIER_ASSERT(b) do { } while(0) #endif /** * Fit a single-segment Bezier curve to a set of digitized points. * * \return Number of segments generated, or -1 on error. */ long sp_bezier_fit_cubic(NR_Point *bezier, NR_Point const *data, long len, double error) { return sp_bezier_fit_cubic_r(bezier, data, len, error, 1); } /** * Fit a multi-segment Bezier curve to a set of digitized points, with * possible weedout of identical points and NaNs. * * \param max_beziers Maximum number of generated segments * \param Result array, must be large enough for n. segments * 4 elements. * * \return Number of segments generated, or -1 on error. */ long sp_bezier_fit_cubic_r(NR_Point bezier[], NR_Point const data[], long const len, double const error, unsigned const max_beziers) { g_return_val_if_fail(bezier != NULL, -1); g_return_val_if_fail(data != NULL, -1); g_return_val_if_fail(len > 0, -1); g_return_val_if_fail(max_beziers < (1ul << (31 - 2 - 1 - 3)), -1); NR_Point *uniqued_data = g_new(NR_Point, len); unsigned uniqued_len = copy_without_nans_or_adjacent_duplicates(data, len, uniqued_data); if ( uniqued_len < 2 ) { g_free(uniqued_data); return 0; } /* Call fit-cubic function with recursion. */ long const ret = sp_bezier_fit_cubic_full(bezier, NULL, uniqued_data, uniqued_len, unconstrained_tangent, unconstrained_tangent, error, max_beziers); g_free(uniqued_data); return ret; } /** * Copy points from src to dest, filter out points containing NaN and * adjacent points with equal x and y. * \return length of dest */ static unsigned copy_without_nans_or_adjacent_duplicates(NR_Point const src[], unsigned src_len, NR_Point dest[]) { unsigned si = 0; for (;;) { if ( si == src_len ) { return 0; } if (!isNaN(src[si][0]) && !isNaN(src[si][1])) { dest[0] = NR_Point(src[si]); ++si; break; } } unsigned di = 0; for (; si < src_len; ++si) { NR_Point const src_pt = NR_Point(src[si]); if ( src_pt != dest[di] && !isNaN(src_pt[0]) && !isNaN(src_pt[1])) { dest[++di] = src_pt; } } unsigned dest_len = di + 1; g_assert( dest_len <= src_len ); return dest_len; } /** * Fit a multi-segment Bezier curve to a set of digitized points, without * possible weedout of identical points and NaNs. * * \pre data is uniqued, i.e. not exist i: data[i] == data[i + 1]. * \param max_beziers Maximum number of generated segments * \param Result array, must be large enough for n. segments * 4 elements. */ long sp_bezier_fit_cubic_full(NR_Point bezier[], int split_points[], NR_Point const data[], long const len, NR_Point const &tHat1, NR_Point const &tHat2, double const error, unsigned const max_beziers) { int const maxIterations = 4; /* Max times to try iterating */ g_return_val_if_fail(bezier != NULL, -1); g_return_val_if_fail(data != NULL, -1); g_return_val_if_fail(len > 0, -1); g_return_val_if_fail(max_beziers >= 1, -1); g_return_val_if_fail(error >= 0.0, -1); if ( len < 2 ) return 0; if ( len == 2 ) { /* We have 2 points, which can be fitted trivially. */ bezier[0] = data[0]; bezier[3] = data[len - 1]; double const dist = ( L2( data[len - 1] - data[0] ) / 3.0 ); if (isNaN(dist)) { /* Numerical problem, fall back to straight line segment. */ bezier[1] = bezier[0]; bezier[2] = bezier[3]; } else { bezier[1] = ( is_zero(tHat1) ? ( 2 * bezier[0] + bezier[3] ) / 3. : bezier[0] + dist * tHat1 ); bezier[2] = ( is_zero(tHat2) ? ( bezier[0] + 2 * bezier[3] ) / 3. : bezier[3] + dist * tHat2 ); } BEZIER_ASSERT(bezier); return 1; } /* Parameterize points, and attempt to fit curve */ unsigned splitPoint; /* Point to split point set at. */ bool is_corner; { double *u = g_new(double, len); chord_length_parameterize(data, u, len); if ( u[len - 1] == 0.0 ) { /* Zero-length path: every point in data[] is the same. * * (Clients aren't allowed to pass such data; handling the case is defensive * programming.) */ g_free(u); return 0; } generate_bezier(bezier, data, u, len, tHat1, tHat2, error); reparameterize(data, len, u, bezier); /* Find max deviation of points to fitted curve. */ double const tolerance = sqrt(error + 1e-9); double maxErrorRatio = compute_max_error_ratio(data, u, len, bezier, tolerance, &splitPoint); if ( fabs(maxErrorRatio) <= 1.0 ) { BEZIER_ASSERT(bezier); g_free(u); return 1; } /* If error not too large, then try some reparameterization and iteration. */ if ( 0.0 <= maxErrorRatio && maxErrorRatio <= 3.0 ) { for (int i = 0; i < maxIterations; i++) { generate_bezier(bezier, data, u, len, tHat1, tHat2, error); reparameterize(data, len, u, bezier); maxErrorRatio = compute_max_error_ratio(data, u, len, bezier, tolerance, &splitPoint); if ( fabs(maxErrorRatio) <= 1.0 ) { BEZIER_ASSERT(bezier); g_free(u); return 1; } } } g_free(u); is_corner = (maxErrorRatio < 0); } if (is_corner) { g_assert(splitPoint < unsigned(len)); if (splitPoint == 0) { if (is_zero(tHat1)) { /* Got spike even with unconstrained initial tangent. */ ++splitPoint; } else { return sp_bezier_fit_cubic_full(bezier, split_points, data, len, unconstrained_tangent, tHat2, error, max_beziers); } } else if (splitPoint == unsigned(len - 1)) { if (is_zero(tHat2)) { /* Got spike even with unconstrained final tangent. */ --splitPoint; } else { return sp_bezier_fit_cubic_full(bezier, split_points, data, len, tHat1, unconstrained_tangent, error, max_beziers); } } } if ( 1 < max_beziers ) { /* * Fitting failed -- split at max error point and fit recursively */ unsigned const rec_max_beziers1 = max_beziers - 1; NR_Point recTHat2, recTHat1; if (is_corner) { g_return_val_if_fail(0 < splitPoint && splitPoint < unsigned(len - 1), -1); recTHat1 = recTHat2 = unconstrained_tangent; } else { /* Unit tangent vector at splitPoint. */ recTHat2 = sp_darray_center_tangent(data, splitPoint, len); recTHat1 = -recTHat2; } long const nsegs1 = sp_bezier_fit_cubic_full(bezier, split_points, data, splitPoint + 1, tHat1, recTHat2, error, rec_max_beziers1); if ( nsegs1 < 0 ) { #ifdef BEZIER_DEBUG g_print("fit_cubic[1]: recursive call failed\n"); #endif return -1; } g_assert( nsegs1 != 0 ); if (split_points != NULL) { split_points[nsegs1 - 1] = splitPoint; } unsigned const rec_max_beziers2 = max_beziers - nsegs1; long const nsegs2 = sp_bezier_fit_cubic_full(bezier + nsegs1*4, ( split_points == NULL ? NULL : split_points + nsegs1 ), data + splitPoint, len - splitPoint, recTHat1, tHat2, error, rec_max_beziers2); if ( nsegs2 < 0 ) { #ifdef BEZIER_DEBUG g_print("fit_cubic[2]: recursive call failed\n"); #endif return -1; } #ifdef BEZIER_DEBUG g_print("fit_cubic: success[nsegs: %d+%d=%d] on max_beziers:%u\n", nsegs1, nsegs2, nsegs1 + nsegs2, max_beziers); #endif return nsegs1 + nsegs2; } else { return -1; } } /** * Fill in \a bezier[] based on the given data and tangent requirements, using * a least-squares fit. * * Each of tHat1 and tHat2 should be either a zero vector or a unit vector. * If it is zero, then bezier[1 or 2] is estimated without constraint; otherwise, * it bezier[1 or 2] is placed in the specified direction from bezier[0 or 3]. * * \param tolerance_sq Used only for an initial guess as to tangent directions * when \a tHat1 or \a tHat2 is zero. */ static void generate_bezier(NR_Point bezier[], NR_Point const data[], double const u[], unsigned const len, NR_Point const &tHat1, NR_Point const &tHat2, double const tolerance_sq) { bool const est1 = is_zero(tHat1); bool const est2 = is_zero(tHat2); NR_Point est_tHat1( est1 ? sp_darray_left_tangent(data, len, tolerance_sq) : tHat1 ); NR_Point est_tHat2( est2 ? sp_darray_right_tangent(data, len, tolerance_sq) : tHat2 ); estimate_lengths(bezier, data, u, len, est_tHat1, est_tHat2); /* We find that sp_darray_right_tangent tends to produce better results for our current freehand tool than full estimation. */ if (est1) { estimate_bi(bezier, 1, data, u, len); if (bezier[1] != bezier[0]) { est_tHat1 = unit_vector(bezier[1] - bezier[0]); } estimate_lengths(bezier, data, u, len, est_tHat1, est_tHat2); } } static void estimate_lengths(NR_Point bezier[], NR_Point const data[], double const uPrime[], unsigned const len, NR_Point const &tHat1, NR_Point const &tHat2) { double C[2][2]; /* Matrix C. */ double X[2]; /* Matrix X. */ /* Create the C and X matrices. */ C[0][0] = 0.0; C[0][1] = 0.0; C[1][0] = 0.0; C[1][1] = 0.0; X[0] = 0.0; X[1] = 0.0; /* First and last control points of the Bezier curve are positioned exactly at the first and last data points. */ bezier[0] = data[0]; bezier[3] = data[len - 1]; for (unsigned i = 0; i < len; i++) { /* Bezier control point coefficients. */ double const b0 = B0(uPrime[i]); double const b1 = B1(uPrime[i]); double const b2 = B2(uPrime[i]); double const b3 = B3(uPrime[i]); /* rhs for eqn */ NR_Point const a1 = b1 * tHat1; NR_Point const a2 = b2 * tHat2; C[0][0] += dot(a1, a1); C[0][1] += dot(a1, a2); C[1][0] = C[0][1]; C[1][1] += dot(a2, a2); /* Additional offset to the data point from the predicted point if we were to set bezier[1] to bezier[0] and bezier[2] to bezier[3]. */ NR_Point const shortfall = ( data[i] - ( ( b0 + b1 ) * bezier[0] ) - ( ( b2 + b3 ) * bezier[3] ) ); X[0] += dot(a1, shortfall); X[1] += dot(a2, shortfall); } /* We've constructed a pair of equations in the form of a matrix product C * alpha = X. Now solve for alpha. */ double alpha_l, alpha_r; /* Compute the determinants of C and X. */ double const det_C0_C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1]; if ( det_C0_C1 != 0 ) { /* Apparently Kramer's rule. */ double const det_C0_X = C[0][0] * X[1] - C[0][1] * X[0]; double const det_X_C1 = X[0] * C[1][1] - X[1] * C[0][1]; alpha_l = det_X_C1 / det_C0_C1; alpha_r = det_C0_X / det_C0_C1; } else { /* The matrix is under-determined. Try requiring alpha_l == alpha_r. * * One way of implementing the constraint alpha_l == alpha_r is to treat them as the same * variable in the equations. We can do this by adding the columns of C to form a single * column, to be multiplied by alpha to give the column vector X. * * We try each row in turn. */ double const c0 = C[0][0] + C[0][1]; if (c0 != 0) { alpha_l = alpha_r = X[0] / c0; } else { double const c1 = C[1][0] + C[1][1]; if (c1 != 0) { alpha_l = alpha_r = X[1] / c1; } else { /* Let the below code handle this. */ alpha_l = alpha_r = 0.; } } } /* If alpha negative, use the Wu/Barsky heuristic (see text). (If alpha is 0, you get coincident control points that lead to divide by zero in any subsequent NewtonRaphsonRootFind() call.) */ /// \todo Check whether this special-casing is necessary now that /// NewtonRaphsonRootFind handles non-positive denominator. if ( alpha_l < 1.0e-6 || alpha_r < 1.0e-6 ) { alpha_l = alpha_r = ( L2( data[len - 1] - data[0] ) / 3.0 ); } /* Control points 1 and 2 are positioned an alpha distance out on the tangent vectors, left and right, respectively. */ bezier[1] = alpha_l * tHat1 + bezier[0]; bezier[2] = alpha_r * tHat2 + bezier[3]; return; } static double lensq(NR_Point const p) { return dot(p, p); } static void estimate_bi(NR_Point bezier[4], unsigned const ei, NR_Point const data[], double const u[], unsigned const len) { g_return_if_fail(1 <= ei && ei <= 2); unsigned const oi = 3 - ei; double num[2] = {0., 0.}; double den = 0.; for (unsigned i = 0; i < len; ++i) { double const ui = u[i]; double const b[4] = { B0(ui), B1(ui), B2(ui), B3(ui) }; for (unsigned d = 0; d < 2; ++d) { num[d] += b[ei] * (b[0] * bezier[0][d] + b[oi] * bezier[oi][d] + b[3] * bezier[3][d] + - data[i][d]); } den -= b[ei] * b[ei]; } if (den != 0.) { for (unsigned d = 0; d < 2; ++d) { bezier[ei][d] = num[d] / den; } } else { bezier[ei] = ( oi * bezier[0] + ei * bezier[3] ) / 3.; } } /** * Given set of points and their parameterization, try to find a better assignment of parameter * values for the points. * * \param d Array of digitized points. * \param u Current parameter values. * \param bezCurve Current fitted curve. * \param len Number of values in both d and u arrays. * Also the size of the array that is allocated for return. */ static void reparameterize(NR_Point const d[], unsigned const len, double u[], BezierCurve const bezCurve) { g_assert( 2 <= len ); unsigned const last = len - 1; g_assert( bezCurve[0] == d[0] ); g_assert( bezCurve[3] == d[last] ); g_assert( u[0] == 0.0 ); g_assert( u[last] == 1.0 ); /* Otherwise, consider including 0 and last in the below loop. */ for (unsigned i = 1; i < last; i++) { u[i] = NewtonRaphsonRootFind(bezCurve, d[i], u[i]); } } /** * Use Newton-Raphson iteration to find better root. * * \param Q Current fitted curve * \param P Digitized point * \param u Parameter value for "P" * * \return Improved u */ static double NewtonRaphsonRootFind(BezierCurve const Q, NR_Point const &P, double const u) { g_assert( 0.0 <= u ); g_assert( u <= 1.0 ); /* Generate control vertices for Q'. */ NR_Point Q1[3]; for (unsigned i = 0; i < 3; i++) { Q1[i] = 3.0 * ( Q[i+1] - Q[i] ); } /* Generate control vertices for Q''. */ NR_Point Q2[2]; for (unsigned i = 0; i < 2; i++) { Q2[i] = 2.0 * ( Q1[i+1] - Q1[i] ); } /* Compute Q(u), Q'(u) and Q''(u). */ NR_Point const Q_u = bezier_pt(3, Q, u); NR_Point const Q1_u = bezier_pt(2, Q1, u); NR_Point const Q2_u = bezier_pt(1, Q2, u); /* Compute f(u)/f'(u), where f is the derivative wrt u of distsq(u) = 0.5 * the square of the distance from P to Q(u). Here we're using Newton-Raphson to find a stationary point in the distsq(u), hopefully corresponding to a local minimum in distsq (and hence a local minimum distance from P to Q(u)). */ NR_Point const diff = Q_u - P; double numerator = dot(diff, Q1_u); double denominator = dot(Q1_u, Q1_u) + dot(diff, Q2_u); double improved_u; if ( denominator > 0. ) { /* One iteration of Newton-Raphson: improved_u = u - f(u)/f'(u) */ improved_u = u - ( numerator / denominator ); } else { /* Using Newton-Raphson would move in the wrong direction (towards a local maximum rather than local minimum), so we move an arbitrary amount in the right direction. */ if ( numerator > 0. ) { improved_u = u * .98 - .01; } else if ( numerator < 0. ) { /* Deliberately asymmetrical, to reduce the chance of cycling. */ improved_u = .031 + u * .98; } else { improved_u = u; } } if (!isFinite(improved_u)) { improved_u = u; } else if ( improved_u < 0.0 ) { improved_u = 0.0; } else if ( improved_u > 1.0 ) { improved_u = 1.0; } /* Ensure that improved_u isn't actually worse. */ { double const diff_lensq = lensq(diff); for (double proportion = .125; ; proportion += .125) { if ( lensq( bezier_pt(3, Q, improved_u) - P ) > diff_lensq ) { if ( proportion > 1.0 ) { //g_warning("found proportion %g", proportion); improved_u = u; break; } improved_u = ( ( 1 - proportion ) * improved_u + proportion * u ); } else { break; } } } DOUBLE_ASSERT(improved_u); return improved_u; } /** * Evaluate a Bezier curve at parameter value \a t. * * \param degree The degree of the Bezier curve: 3 for cubic, 2 for quadratic etc. * \param V The control points for the Bezier curve. Must have (\a degree+1) * elements. * \param t The "parameter" value, specifying whereabouts along the curve to * evaluate. Typically in the range [0.0, 1.0]. * * Let s = 1 - t. * BezierII(1, V) gives (s, t) * V, i.e. t of the way * from V[0] to V[1]. * BezierII(2, V) gives (s**2, 2*s*t, t**2) * V. * BezierII(3, V) gives (s**3, 3 s**2 t, 3s t**2, t**3) * V. * * The derivative of BezierII(i, V) with respect to t * is i * BezierII(i-1, V'), where for all j, V'[j] = * V[j + 1] - V[j]. */ NR_Point bezier_pt(unsigned const degree, NR_Point const V[], double const t) { /** Pascal's triangle. */ static int const pascal[4][4] = {{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}}; //g_assert( degree < G_N_ELEMENTS(pascal) ); g_assert( degree < 5 ); double const s = 1.0 - t; /* Calculate powers of t and s. */ double spow[4]; double tpow[4]; spow[0] = 1.0; spow[1] = s; tpow[0] = 1.0; tpow[1] = t; for (unsigned i = 1; i < degree; ++i) { spow[i + 1] = spow[i] * s; tpow[i + 1] = tpow[i] * t; } NR_Point ret = spow[degree] * V[0]; for (unsigned i = 1; i <= degree; ++i) { ret += pascal[degree][i] * spow[degree - i] * tpow[i] * V[i]; } return ret; } /* * ComputeLeftTangent, ComputeRightTangent, ComputeCenterTangent : * Approximate unit tangents at endpoints and "center" of digitized curve */ /** * Estimate the (forward) tangent at point d[first + 0.5]. * * Unlike the center and right versions, this calculates the tangent in * the way one might expect, i.e., wrt increasing index into d. * \pre (2 \<= len) and (d[0] != d[1]). **/ NR_Point sp_darray_left_tangent(NR_Point const d[], unsigned const len) { g_assert( len >= 2 ); g_assert( d[0] != d[1] ); return unit_vector( d[1] - d[0] ); } /** * Estimates the (backward) tangent at d[last - 0.5]. * * \note The tangent is "backwards", i.e. it is with respect to * decreasing index rather than increasing index. * * \pre 2 \<= len. * \pre d[len - 1] != d[len - 2]. * \pre all[p in d] in_svg_plane(p). */ static NR_Point sp_darray_right_tangent(NR_Point const d[], unsigned const len) { g_assert( 2 <= len ); unsigned const last = len - 1; unsigned const prev = last - 1; g_assert( d[last] != d[prev] ); return unit_vector( d[prev] - d[last] ); } /** * Estimate the (forward) tangent at point d[0]. * * Unlike the center and right versions, this calculates the tangent in * the way one might expect, i.e., wrt increasing index into d. * * \pre 2 \<= len. * \pre d[0] != d[1]. * \pre all[p in d] in_svg_plane(p). * \post is_unit_vector(ret). **/ NR_Point sp_darray_left_tangent(NR_Point const d[], unsigned const len, double const tolerance_sq) { g_assert( 2 <= len ); g_assert( 0 <= tolerance_sq ); for (unsigned i = 1;;) { NR_Point const pi(d[i]); NR_Point const t(pi - d[0]); double const distsq = dot(t, t); if ( tolerance_sq < distsq ) { return unit_vector(t); } ++i; if (i == len) { return ( distsq == 0 ? sp_darray_left_tangent(d, len) : unit_vector(t) ); } } } /** * Estimates the (backward) tangent at d[last]. * * \note The tangent is "backwards", i.e. it is with respect to * decreasing index rather than increasing index. * * \pre 2 \<= len. * \pre d[len - 1] != d[len - 2]. * \pre all[p in d] in_svg_plane(p). */ NR_Point sp_darray_right_tangent(NR_Point const d[], unsigned const len, double const tolerance_sq) { g_assert( 2 <= len ); g_assert( 0 <= tolerance_sq ); unsigned const last = len - 1; for (unsigned i = last - 1;; i--) { NR_Point const pi(d[i]); NR_Point const t(pi - d[last]); double const distsq = dot(t, t); if ( tolerance_sq < distsq ) { return unit_vector(t); } if (i == 0) { return ( distsq == 0 ? sp_darray_right_tangent(d, len) : unit_vector(t) ); } } } /** * Estimates the (backward) tangent at d[center], by averaging the two * segments connected to d[center] (and then normalizing the result). * * \note The tangent is "backwards", i.e. it is with respect to * decreasing index rather than increasing index. * * \pre (0 \< center \< len - 1) and d is uniqued (at least in * the immediate vicinity of \a center). */ static NR_Point sp_darray_center_tangent(NR_Point const d[], unsigned const center, unsigned const len) { g_assert( center != 0 ); g_assert( center < len - 1 ); NR_Point ret; if ( d[center + 1] == d[center - 1] ) { /* Rotate 90 degrees in an arbitrary direction. */ NR_Point const diff = d[center] - d[center - 1]; ret = rot90(diff); } else { ret = d[center - 1] - d[center + 1]; } ret.normalize(); return ret; } /** * Assign parameter values to digitized points using relative distances between points. * * \pre Parameter array u must have space for \a len items. */ static void chord_length_parameterize(NR_Point const d[], double u[], unsigned const len) { g_return_if_fail( 2 <= len ); /* First let u[i] equal the distance travelled along the path from d[0] to d[i]. */ u[0] = 0.0; for (unsigned i = 1; i < len; i++) { double const dist = L2( d[i] - d[i-1] ); u[i] = u[i-1] + dist; } /* Then scale to [0.0 .. 1.0]. */ double tot_len = u[len - 1]; g_return_if_fail( tot_len != 0 ); if (isFinite(tot_len)) { for (unsigned i = 1; i < len; ++i) { u[i] /= tot_len; } } else { /* We could do better, but this probably never happens anyway. */ for (unsigned i = 1; i < len; ++i) { u[i] = i / (double) ( len - 1 ); } } /** \todo * It's been reported that u[len - 1] can differ from 1.0 on some * systems (amd64), despite it having been calculated as x / x where x * is isFinite and non-zero. */ if (u[len - 1] != 1) { double const diff = u[len - 1] - 1; if (fabs(diff) > 1e-13) { fprintf(stderr,"u[len - 1] = %19g (= 1 + %19g), expecting exactly 1", u[len - 1], diff); } u[len - 1] = 1; } #ifdef BEZIER_DEBUG g_assert( u[0] == 0.0 && u[len - 1] == 1.0 ); for (unsigned i = 1; i < len; i++) { g_assert( u[i] >= u[i-1] ); } #endif } /** * Find the maximum squared distance of digitized points to fitted curve, and (if this maximum * error is non-zero) set \a *splitPoint to the corresponding index. * * \pre 2 \<= len. * \pre u[0] == 0. * \pre u[len - 1] == 1.0. * \post ((ret == 0.0) * || ((*splitPoint \< len - 1) * \&\& (*splitPoint != 0 || ret \< 0.0))). */ static double compute_max_error_ratio(NR_Point const d[], double const u[], unsigned const len, BezierCurve const bezCurve, double const tolerance, unsigned *const splitPoint) { g_assert( 2 <= len ); unsigned const last = len - 1; g_assert( bezCurve[0] == d[0] ); g_assert( bezCurve[3] == d[last] ); g_assert( u[0] == 0.0 ); g_assert( u[last] == 1.0 ); /* I.e. assert that the error for the first & last points is zero. * Otherwise we should include those points in the below loop. * The assertion is also necessary to ensure 0 < splitPoint < last. */ double maxDistsq = 0.0; /* Maximum error */ double max_hook_ratio = 0.0; unsigned snap_end = 0; NR_Point prev = bezCurve[0]; for (unsigned i = 1; i <= last; i++) { NR_Point const curr = bezier_pt(3, bezCurve, u[i]); double const distsq = lensq( curr - d[i] ); if ( distsq > maxDistsq ) { maxDistsq = distsq; *splitPoint = i; } double const hook_ratio = compute_hook(prev, curr, .5 * (u[i - 1] + u[i]), bezCurve, tolerance); if (max_hook_ratio < hook_ratio) { max_hook_ratio = hook_ratio; snap_end = i; } prev = curr; } double const dist_ratio = sqrt(maxDistsq) / tolerance; double ret; if (max_hook_ratio <= dist_ratio) { ret = dist_ratio; } else { g_assert(0 < snap_end); ret = -max_hook_ratio; *splitPoint = snap_end - 1; } g_assert( ret == 0.0 || ( ( *splitPoint < last ) && ( *splitPoint != 0 || ret < 0. ) ) ); return ret; } /** * Whereas compute_max_error_ratio() checks for itself that each data point * is near some point on the curve, this function checks that each point on * the curve is near some data point (or near some point on the polyline * defined by the data points, or something like that: we allow for a * "reasonable curviness" from such a polyline). "Reasonable curviness" * means we draw a circle centred at the midpoint of a..b, of radius * proportional to the length |a - b|, and require that each point on the * segment of bezCurve between the parameters of a and b be within that circle. * If any point P on the bezCurve segment is outside of that allowable * region (circle), then we return some metric that increases with the * distance from P to the circle. * * Given that this is a fairly arbitrary criterion for finding appropriate * places for sharp corners, we test only one point on bezCurve, namely * the point on bezCurve with parameter halfway between our estimated * parameters for a and b. (Alternatives are taking the farthest of a * few parameters between those of a and b, or even using a variant of * NewtonRaphsonFindRoot() for finding the maximum rather than minimum * distance.) */ static double compute_hook(NR_Point const &a, NR_Point const &b, double const u, BezierCurve const bezCurve, double const tolerance) { NR_Point const P = bezier_pt(3, bezCurve, u); NR_Point const diff = .5 * (a + b) - P; double const dist = L2(diff); if (dist < tolerance) { return 0; } double const allowed = L2(b - a) + tolerance; return dist / allowed; /** \todo * effic: Hooks are very rare. We could start by comparing * distsq, only resorting to the more expensive L2 in cases of * uncertainty. */ } void thbezier_curve::clear() { this->m_segments.clear(); this->m_current_segment = this->m_segments.end(); } thbezier_segment * thbezier_curve::insert_segment() { return &(*this->m_segments.insert(this->m_segments.end(), thbezier_segment())); } thbezier_segment * thbezier_curve::get_first_segment() { this->m_current_segment = this->m_segments.begin(); return this->get_current_segment(); } thbezier_segment * thbezier_curve::get_current_segment() { if (this->m_current_segment != this->m_segments.end()) return &(*this->m_current_segment); else return NULL; } thbezier_segment * thbezier_curve::get_next_segment() { this->m_current_segment++; return this->get_current_segment(); } void thbezier_curve::copy_polyline(struct thbezier_polyline * line, double err) { this->clear(); size_t i, max = line->get_length(); long nbp; if (max < 3) return; NR_Point * poly, * bezier; poly = new NR_Point[max]; bezier = new NR_Point[4 * max]; thbezier_point * p; for(i = 0, p = line->get_first_point(); p != NULL; p = line->get_next_point(), i++) { poly[i][0] = p->m_x; poly[i][1] = p->m_y; } NR_Point stan(0, 0), etan(0,0); if ((poly[0][0] == poly[max-1][0]) && (poly[0][1] == poly[max-1][1])) { stan = NR_Point(poly[1][0] - poly[0][0], poly[1][1] - poly[0][1]); stan.normalize(); etan = NR_Point(poly[max-1][0] - poly[max-2][0], poly[max-1][1] - poly[max-2][1]); etan.normalize(); stan += etan; if (is_zero(stan)) stan = etan; else stan.normalize(); } //nbp = (long) sp_bezier_fit_cubic_r(bezier, poly, (long) max, err, (unsigned int)max); nbp = (long) sp_bezier_fit_cubic_full(bezier, NULL, poly, (long) max, stan, -stan, err, (unsigned int)max); thbezier_segment * s; s = this->insert_segment(); s->m_p = thbezier_point(bezier[0][0], bezier[0][1]); for(i = 0; i < (size_t) nbp; i++) { s = this->insert_segment(); s->m_cp1 = thbezier_point(bezier[4*i+1][0],bezier[4*i+1][1]); s->m_cp2 = thbezier_point(bezier[4*i+2][0],bezier[4*i+2][1]); s->m_p = thbezier_point(bezier[4*i+3][0],bezier[4*i+3][1]); } } void thbezier_polyline::clear() { this->m_points.clear(); this->m_current_point = this->m_points.end(); } thbezier_point * thbezier_polyline::insert_point() { return &(*this->m_points.insert(this->m_points.end(), thbezier_point())); } thbezier_point * thbezier_polyline::get_first_point() { this->m_current_point = this->m_points.begin(); return this->get_current_point(); } thbezier_point * thbezier_polyline::get_current_point() { if (this->m_current_point != this->m_points.end()) return &(*this->m_current_point); else return NULL; } thbezier_point * thbezier_polyline::get_next_point() { this->m_current_point++; return this->get_current_point(); } void thbezier_polyline::copy_curve(struct thbezier_curve * curve, double err) { this->clear(); // TODO: bezier 2 polyline conversion } void thbezier_main() { FILE * fin, * fout; fin = fopen("therion.bci","r"); double x, y, px(0.0), py(0.0); bool xfirst(true); thbezier_polyline line; thbezier_curve curve; thbezier_point * pt; while (fscanf(fin,"%lf%lf",&x,&y) == 2) { if ((xfirst) || (x != px) || (y != py)) { pt = line.insert_point(); pt->m_x = px = x; pt->m_y = py = y; pt->m_valid = true; } xfirst = false; } fclose(fin); if (line.m_points.size() < 3) return; curve.copy_polyline(&line, 2.0); thbezier_segment *s; fout = fopen("therion.bco","w"); s = curve.get_first_segment(); fprintf(fout, "%.2lf %.2lf\n", s->m_p.m_x, s->m_p.m_y); for(s = curve.get_next_segment(); s != NULL; s = curve.get_next_segment()) { fprintf(fout, "%.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n",s->m_cp1.m_x, s->m_cp1.m_y, s->m_cp2.m_x, s->m_cp2.m_y, s->m_p.m_x, s->m_p.m_y); } fclose(fout); } therion/thscrap.cxx0000664000175000017500000013155512255633624013460 0ustar useruser/** * @file thscrap.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thscrap.h" #include "thexception.h" #include "thchenc.h" #include "thtflength.h" #include "thinfnan.h" #include "thdb1d.h" #include "thdb2d.h" #include "thdb2dmi.h" #include "th2ddataobject.h" #include "thline.h" #include "thpoint.h" #include "thscrapis.h" #include "thsurvey.h" #include "thsymbolset.h" #include "thsketch.h" #include "thcsdata.h" #ifdef THMSVC #define hypot _hypot #endif #define EXPORT3D_INVISIBLE true thscrap::thscrap() { this->fs2doptr = NULL; this->ls2doptr = NULL; this->fcpp = NULL; this->lcpp = NULL; this->ncp = 0; this->proj = thdb.db2d.get_default_projection(); this->proj_next_scrap = NULL; this->proj_prev_scrap = NULL; this->xscrap = NULL; this->R = 1.0; this->G = 1.0; this->B = 1.0; this->z = 0.0; this->a = 0.0; this->flip = TT_SCRAP_FLIP_NONE; this->scale = 1.0; this->scale_r1x = 0.0; this->scale_r1y = 0.0; this->scale_r2x = 1.0; this->scale_r2y = 0.0; this->scale_p1x = 0.0; this->scale_p1y = 0.0; this->scale_p2x = 1.0; this->scale_p2y = 0.0; this->scale_p9 = false; this->reset_limits(); this->reset_transformation(); this->outline_parsed = false; this->outline_first = NULL; this->ends_parsed = false; this->exported = false; this->ends_first = NULL; this->polygon_parsed = false; this->polygon_first = NULL; this->polygon_last = NULL; this->d3 = TT_AUTO; this->d3_parsed = false; this->maxdist = 0.0; this->avdist = 0.0; this->maxdistp1 = NULL; this->maxdistp2 = NULL; this->centerline_survey = NULL; this->centerline_io = false; } thscrap::~thscrap() { } int thscrap::get_class_id() { return TT_SCRAP_CMD; } bool thscrap::is(int class_id) { if (class_id == TT_SCRAP_CMD) return true; else return thdataobject::is(class_id); } int thscrap::get_cmd_nargs() { return 1; } const char * thscrap::get_cmd_end() { // insert endcommand if multiline command return NULL; } const char * thscrap::get_cmd_name() { // insert command name here return "scrap"; } thcmd_option_desc thscrap::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_scrap_opt); if (id == TT_SCRAP_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else switch (id) { case TT_SCRAP_SKETCH: return thcmd_option_desc(id,3); default: return thcmd_option_desc(id); } } static const thstok thtt_scrap_flips[] = { {"horiz", TT_SCRAP_FLIP_HORIZ}, {"horizontal", TT_SCRAP_FLIP_HORIZ}, {"none", TT_SCRAP_FLIP_NONE}, {"vert", TT_SCRAP_FLIP_VERT}, {"vertical", TT_SCRAP_FLIP_VERT}, {NULL, TT_SCRAP_FLIP_UNKNOWN}, }; void thscrap::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { thdb2dprjpr projection; if (cod.id == 1) cod.id = TT_DATAOBJECT_NAME; switch (cod.id) { // case TT_DATAOBJECT_NAME: // if (th_is_keyword(*args)) // this->name = this->db->strstore(*args); // else // ththrow(("invalid keyword -- %s", *args)); // break; case TT_SCRAP_PROJECTION: projection = this->db->db2d.parse_projection(*args); if (!projection.parok) ththrow(("invalid parameters of projection")); this->proj = projection.prj; break; case TT_SCRAP_SCALE: this->parse_scale(*args); break; case TT_SCRAP_STATIONS: this->parse_stations(*args); break; case TT_SCRAP_3D: this->d3 = thmatch_token(*args, thtt_onoffauto); if (this->d3 == TT_UNKNOWN_BOOL) ththrow(("invalid -3d switch -- %s", *args)); break; case TT_SCRAP_FLIP: this->flip = thmatch_token(*args, thtt_scrap_flips); if (this->flip == TT_SCRAP_FLIP_UNKNOWN) ththrow(("invalid -flip switch -- %s", *args)); break; case TT_SCRAP_SKETCH: this->parse_sketch(args, argenc); break; // if not found, try to set fathers properties default: thdataobject::set(cod, args, argenc, indataline); } } void thscrap::self_delete() { delete this; } void thscrap::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thscrap:\n"); fprintf(outf,"\tprojection: %d\n",this->proj->id); fprintf(outf,"\tscale: %f\n",this->scale); fprintf(outf,"\tz: %f\n",this->z); fprintf(outf,"\ta: %f\n",this->a); // insert intended print of object properties here } void thscrap::parse_scale(char * ss) { thsplit_words(& this->db->db2d.mbf,ss); int npar = this->db->db2d.mbf.get_size(); char ** pars = this->db->db2d.mbf.get_buffer(); if ((npar < 1) || ((npar > 3) && (npar != 8) && (npar != 9))) ththrow(("invalid number of scale arguments -- %d",npar)) double n1 = 1.0, n2 = 1.0; bool p9 = false; int sv, ux = 0, n2x = 0; thtflength lentf; switch (npar) { case 2: ux = 1; break; case 3: ux = 2; n2x = 1; break; case 9: ux = 8; case 8: p9 = true; break; } this->scale_p9 = p9; #define parse_scalep9(var,parn) \ thparse_double(sv,var,pars[parn]); \ if (sv != TT_SV_NUMBER) \ ththrow(("real number required -- %s", pars[parn])); if (ux > 0) { lentf.parse_units(pars[ux]); } if (p9) { // thparse_double(sv,this->scale_r1x,pars[0]); // if ((sv != TT_SV_NUMBER) || (n1 <= 0.0)) // ththrow(("real positive number required -- %s", pars[0])); parse_scalep9(this->scale_p1x,0) parse_scalep9(this->scale_p1y,1) parse_scalep9(this->scale_p2x,2) parse_scalep9(this->scale_p2y,3) if (this->cs == TTCS_LOCAL) { parse_scalep9(this->scale_r1x,4) parse_scalep9(this->scale_r1y,5) parse_scalep9(this->scale_r2x,6) parse_scalep9(this->scale_r2y,7) if (ux > 0) { this->scale_r1x = lentf.transform(this->scale_r1x); this->scale_r1y = lentf.transform(this->scale_r1y); this->scale_r2x = lentf.transform(this->scale_r2x); this->scale_r2y = lentf.transform(this->scale_r2y); } } else { this->convert_cs(pars[4], pars[5], this->scale_r1x, this->scale_r1y); this->convert_cs(pars[6], pars[7], this->scale_r2x, this->scale_r2y); } if (hypot(this->scale_r1x - this->scale_r2x, this->scale_r1y - this->scale_r2y) == 0.0) ththrow(("zero scale real length")); if (hypot(this->scale_p1x - this->scale_p2x, this->scale_p1y - this->scale_p2y) == 0.0) ththrow(("zero scale picture length")); } else { // let's parse first number thparse_double(sv,n1,pars[0]); if ((sv != TT_SV_NUMBER) || (n1 <= 0.0)) ththrow(("real positive number required -- %s", pars[0])); // let's parse second number if (n2x > 0) { thparse_double(sv,n2,pars[n2x]); if ((sv != TT_SV_NUMBER) || (n2 <= 0.0)) ththrow(("real positive number required -- %s", pars[0])); n1 = n2 / n1; if (ux > 0) n1 = lentf.transform(n1); } this->scale = n1; } } thdb2dcp * thscrap::insert_control_point() { thdb2dcp * cp = this->db->db2d.insert_control_point(); if (this->fcpp == NULL) { this->fcpp = cp; this->lcpp = cp; this->ncp = 1; } else { cp->prevcp = this->lcpp; this->lcpp->nextcp = cp; this->lcpp = cp; this->ncp++; } return cp; } void thscrap::reset_limits() { this->lxmin = thnan; this->lxmax = thnan; this->lymin = thnan; this->lymax = thnan; } void thscrap::reset_transformation() { this->mx = 0.0; this->my = 0.0; this->mxx = 1.0; this->mxy = 0.0; this->myx = 0.0; this->myy = 1.0; this->mr = 0.0; this->ms = 1.0; } thscraplo * thscrap::get_outline() { if (this->outline_parsed) return this->outline_first; //if (!this->proj->processed) // this->db->db2d.process_projection(this->proj); this->outline_parsed = true; #ifdef THDEBUG thprintf("\n\nscanning outline: scrap %s\n",this->name); #endif th2ddataobject * obj = this->fs2doptr; // thline * pln; thscraplo * co, * co2, * co3, * co3last, * lo = NULL, ** pco3; double cdist, mindist; while (obj != NULL) { #ifdef THDEBUG if (obj->get_class_id() == TT_LINE_CMD) thprintf("%d [%s]\n", obj->id, obj->name); #endif if ((obj->get_class_id() == TT_LINE_CMD) && (((thline *)obj)->first_point != NULL) && ((((thline *)obj)->outline == TT_LINE_OUTLINE_IN) || (((thline *)obj)->outline == TT_LINE_OUTLINE_OUT))) { #ifdef THDEBUG thprintf("inserting line - %d [%s]\n", obj->id, obj->name); #endif co = this->db->db2d.insert_scraplo(); co->line = (thline *) obj; if (this->outline_first == NULL) { this->outline_first = co; lo = co; } else { // vzdialenost moojho konca od zaciatku mindist = hypot(co->line->last_point->point->x - co->line->first_point->point->x, co->line->last_point->point->y - co->line->first_point->point->y); if ((this->outline_first->line->outline == TT_LINE_OUTLINE_IN) && (((thline *)obj)->outline == TT_LINE_OUTLINE_OUT)) { co->next_scrap_line = this->outline_first; this->outline_first = co; } else { // poojdeme odpredu co3 = this->outline_first; pco3 = &(this->outline_first); while (co3 != NULL) { if ((co3->line->outline == co->line->outline) && (hypot(co3->line->last_point->point->x - co3->line->first_point->point->x, co3->line->last_point->point->y - co3->line->first_point->point->y) < mindist)) { co->next_scrap_line = co3; *pco3 = co; break; } pco3 = &(co3->next_scrap_line); co3 = co3->next_scrap_line; if (co3 == NULL) { lo->next_scrap_line = co; lo = co; } } } } } obj = obj->nscrapoptr; } co = this->outline_first; while (co != NULL) { if (co->line->is_closed) { co->lfreefirst = false; co->lfreelast = false; } co2 = co->next_scrap_line; while (co2 != NULL && (co->lfreefirst || co->lfreelast)) { if ((co2->line->outline == co->line->outline) && (co2->lfreefirst || co2->lfreelast)) { if (co->lfreefirst && co2->lfreefirst && (co->line->first_point->point->x == co2->line->first_point->point->x) && (co->line->first_point->point->y == co2->line->first_point->point->y)) { co->lfreefirst = false; co2->lfreefirst = false; #ifdef THDEBUG thprintf("\tJOIN F-F: %.2f,%.2f\n", co->line->first_point->point->x, co->line->first_point->point->y); thprintf("\t%d -- %d\n", co->line->id, co2->line->id); #endif } if (co->lfreefirst && co2->lfreelast && (co->line->first_point->point->x == co2->line->last_point->point->x) && (co->line->first_point->point->y == co2->line->last_point->point->y)) { co->lfreefirst = false; co2->lfreelast = false; #ifdef THDEBUG thprintf("\tJOIN F-L: %.2f,%.2f\n", co->line->first_point->point->x, co->line->first_point->point->y); thprintf("\t%d -- %d\n", co->line->id, co2->line->id); #endif } if (co->lfreelast && co2->lfreefirst && (co->line->last_point->point->x == co2->line->first_point->point->x) && (co->line->last_point->point->y == co2->line->first_point->point->y)) { co->lfreelast = false; co2->lfreefirst = false; #ifdef THDEBUG thprintf("\tJOIN L-F: %.2f,%.2f\n", co->line->last_point->point->x, co->line->last_point->point->y); thprintf("\t%d -- %d\n", co->line->id, co2->line->id); #endif } if (co->lfreelast && co2->lfreelast && (co->line->last_point->point->x == co2->line->last_point->point->x) && (co->line->last_point->point->y == co2->line->last_point->point->y)) { co->lfreelast = false; co2->lfreelast = false; #ifdef THDEBUG thprintf("\tJOIN L-L: %.2f,%.2f\n", co->line->last_point->point->x, co->line->last_point->point->y); thprintf("\t%d -- %d\n", co->line->id, co2->line->id); #endif } } co2 = co2->next_scrap_line; } co = co->next_scrap_line; } bool still_in_line, co3_normal = false; thdb2dpt * first_pt, * last_pt; if (this->outline_first != NULL) { co = this->outline_first; while (co != NULL) { first_pt = co->line->first_point->point; last_pt = co->line->last_point->point; co->mode = TT_OUTLINE_NORMAL; #ifdef THDEBUG thprintf("\tfirst line: %d [%s] - mode %d\n",co->line->id, co->line->name, co->line->outline); #endif still_in_line = !(co->line->is_closed); co3 = co; bool search_all; while (still_in_line) { mindist = hypot(last_pt->x - first_pt->x, last_pt->y - first_pt->y); co2 = co->next_scrap_line; search_all = false; co3last = co3; co3 = NULL; while (co2 != NULL) { if ((co2->mode == TT_OUTLINE_NO) && (co2->line->outline == co->line->outline)) { if ((co2->line->last_point->point->x == last_pt->x) && (co2->line->last_point->point->y == last_pt->y)) { co3_normal = false; co3 = co2; mindist = 0.0; } if (search_all || co2->lfreelast) { cdist = hypot(co2->line->last_point->point->x - last_pt->x, co2->line->last_point->point->y - last_pt->y); if (cdist <= mindist) { co3_normal = false; co3 = co2; mindist = cdist; } } if ((co2->line->first_point->point->x == last_pt->x) && (co2->line->first_point->point->y == last_pt->y)) { co3_normal = true; co3 = co2; mindist = 0.0; } if (search_all || co2->lfreefirst) { cdist = hypot(co2->line->first_point->point->x - last_pt->x, co2->line->first_point->point->y - last_pt->y); if (cdist <= mindist) { co3_normal = true; co3 = co2; mindist = cdist; } } } co2 = co2->next_scrap_line; if ((co2 == NULL) && (!search_all) && (co3 == NULL)) { co2 = co->next_scrap_line; search_all = true; #ifdef THDEBUG thprintf("\tsearch all\n"); #endif } } if (co3 == NULL) still_in_line = false; else { co3last->next_line = co3; #ifdef THDEBUG thprintf("\tnext line: %d [%s] %s\n", co3->line->id, co3->line->name, (co3_normal ? "normal" : "reversed")); #endif if (co3_normal) { co3->mode = TT_OUTLINE_NORMAL; last_pt = co3->line->last_point->point; } else { co3->mode = TT_OUTLINE_REVERSED; last_pt = co3->line->first_point->point; } } } // podme na dalsi co2 = co->next_scrap_line; while ((co2 != NULL) && (co2->mode != TT_OUTLINE_NO)) co2 = co2->next_scrap_line; co->next_outline = co2; co = co2; } } return this->outline_first; } // get_outline thscraplp * thscrap::polygon_insert(thscraplp * before) { thscraplp * rv = this->db->db2d.insert_scraplp(); if (before == NULL) { if (this->polygon_last == NULL) { this->polygon_first = rv; this->polygon_last = rv; } else { this->polygon_last->next_item = rv; rv->prev_item = this->polygon_last; this->polygon_last = rv; } } else { if (before->prev_item == NULL) this->polygon_first = rv; else before->prev_item->next_item = rv; rv->prev_item = before->prev_item; before->prev_item = rv; rv->next_item = before; } return rv; } void thscrap::parse_stations(char * ss) { thsplit_words(& this->db->db2d.mbf,ss); int npar = this->db->db2d.mbf.get_size(), ipar = 0; char ** pars = this->db->db2d.mbf.get_buffer(); thscraplp * lp; while (ipar < npar) { lp = this->polygon_insert(); thparse_objectname(lp->station_name,&(this->db->buff_stations),*pars); pars++; ipar++; } } thscraplp * thscrap::get_polygon() { if (this->polygon_parsed) return this->polygon_first; if (!this->proj->processed) this->db->db2d.process_projection(this->proj); double sina = 0.0, cosa = 0.0; switch (this->proj->type) { case TT_2DPROJ_ELEV: sina = sin(this->proj->pp1 / 180.0 * 3.14159265358); cosa = cos(this->proj->pp1 / 180.0 * 3.14159265358); break; } bool incp; thdb2dcp * cp; thscraplp * lp, * nlp; thdb1ds * st, * st1, * st2; size_t i, ni = this->db->db1d.station_vec.size(), nlegs = this->db->db1d.leg_vec.size(); thdataleg * cl; bool ffselect, ttselect; thdb1ds * ffst, * ttst; thdb1d_tree_arrow * arrow; double newx; thdb1d_tree_node * nodes = this->db->db1d.get_tree_nodes(), * cnode; for(i = 0; i < ni; i++) { this->db->db1d.station_vec[i].tmpselect = false; } if (this->centerline_io) { // povkladame vsetky meracske body if (this->proj->type == TT_2DPROJ_EXTEND) { // scan all shots and add stations for each shot for (i = 0; i < nlegs; i++) { cl = this->db->db1d.leg_vec[i].leg; #define set_ffst_ttst { \ ffst = &(this->db->db1d.station_vec[cl->from.id - 1]); \ ttst = &(this->db->db1d.station_vec[cl->to.id - 1]); \ } set_ffst_ttst; ffselect = ((this->centerline_survey == NULL) && (ffst->survey->selected)); ttselect = ((this->centerline_survey == NULL) && (ttst->survey->selected)); ffselect = ffselect || ((this->centerline_survey != NULL) && (ffst->survey->is_in_survey(this->centerline_survey))); ttselect = ttselect || ((this->centerline_survey != NULL) && (ttst->survey->is_in_survey(this->centerline_survey))); if ((cl->extend & TT_EXTENDFLAG_HIDE) == 0) { if ((ffselect && ttselect) || (cl->psurvey->is_in_survey(this->centerline_survey))) { ffst->tmpselect = true; ttst->tmpselect = true; } } } } else { for(i = 0; i < ni; i++) { st = &(this->db->db1d.station_vec[i]); if (((this->centerline_survey != NULL) && (st->survey->is_in_survey(this->centerline_survey))) || ((this->centerline_survey == NULL) && (st->survey->selected))) { st->tmpselect = true; } } for (i = 0; i < nlegs; i++) { cl = this->db->db1d.leg_vec[i].leg; //if (((cl->extend & TT_EXTENDFLAG_HIDE) == 0) && (cl->psurvey->is_in_survey(this->centerline_survey))) { if ((cl->psurvey->is_in_survey(this->centerline_survey))) { this->db->db1d.station_vec[cl->from.id - 1].tmpselect = true; this->db->db1d.station_vec[cl->to.id - 1].tmpselect = true; } } } // other projections // enter selected stations for(i = 0; i < ni; i++) { st = &(this->db->db1d.station_vec[i]); if (st->tmpselect && !st->is_temporary()) { lp = this->polygon_insert(); lp->station = st; lp->ustation = st; lp->station_name.id = (unsigned long)i+1; lp->station_name.name = st->name; lp->station_name.psurvey = st->survey; this->insert_adata(st); } } } switch (this->proj->type) { case TT_2DPROJ_PLAN: case TT_2DPROJ_ELEV: case TT_2DPROJ_EXTEND: incp = true; lp = NULL; cp = this->fcpp; while (incp || (lp != NULL)) { if (incp && (cp == NULL)) { incp = false; lp = this->polygon_first; } if ((cp != NULL) || (lp != NULL)) { if (lp != NULL) { st = lp->ustation; if (st != NULL) { switch (this->proj->type) { case TT_2DPROJ_EXTEND: cnode = &(nodes[st->uid - 1]); lp->stx = cnode->extendx - this->proj->shift_x; lp->sty = st->z - this->proj->shift_z; lp->stz = 0.0; arrow = cnode->first_arrow; while (arrow != NULL) { newx = (arrow->is_reversed ? arrow->leg->leg->txx : arrow->leg->leg->fxx) - this->proj->shift_x; if (((arrow->leg->leg->extend & TT_EXTENDFLAG_HIDE) == 0) && (newx != lp->stx)) { nlp = this->polygon_insert(lp); nlp->station = st; nlp->ustation = st; nlp->station_name.id = st->uid; nlp->station_name.name = st->name; nlp->station_name.psurvey = st->survey; nlp->stx = newx - this->proj->shift_x; nlp->sty = st->z - this->proj->shift_z; nlp->stz = 0.0; thscraplp * olp; olp = nlp; nlp = this->polygon_insert(lp); nlp->lnio = true; nlp->type = SYML_MAPCONNECTION; nlp->lnx1 = lp->stx; nlp->lny1 = lp->sty; nlp->lnz1 = lp->stz; nlp->lnx2 = olp->stx; nlp->lny2 = olp->sty; nlp->lnz2 = olp->stz; } arrow = arrow->next_arrow; } break; case TT_2DPROJ_PLAN: lp->stx = st->x - this->proj->shift_x; lp->sty = st->y - this->proj->shift_y; lp->stz = st->z - this->proj->shift_z; break; case TT_2DPROJ_ELEV: lp->stx = cosa * (st->x - this->proj->shift_x) - sina * (st->y - this->proj->shift_y); lp->sty = st->z - this->proj->shift_z; lp->stz = sina * (st->x - this->proj->shift_x) + cosa * (st->y - this->proj->shift_y); break; } lp->station_name.name = st->name; this->update_limits(lp->stx, lp->sty); } } else st = cp->st; if ((st != NULL) && (nodes != NULL)) { // let's process each arrow from this point arrow = nodes[st->uid - 1].first_arrow; while (arrow != NULL) { // if ((((this->centerline_survey != NULL) && (arrow->leg->survey->is_in_survey(this->centerline_survey))) || // ((this->centerline_survey == NULL) && (arrow->leg->survey->selected))) && // ((this->proj->type != TT_2DPROJ_EXTEND) || ((arrow->leg->leg->extend & TT_EXTENDFLAG_IGNORE) == 0))) { if (((((this->centerline_survey != NULL) && (arrow->leg->survey->is_in_survey(this->centerline_survey))) || ((this->centerline_survey == NULL) && (arrow->leg->survey->selected)))) && ((this->proj->type != TT_2DPROJ_EXTEND) || ((arrow->leg->leg->extend & TT_EXTENDFLAG_HIDE) == 0))) { // process arrow here nlp = this->polygon_insert(); nlp->lnio = true; nlp->arrow = arrow; nlp->type = (((arrow->leg->leg->flags & TT_LEGFLAG_SURFACE) != 0) ? SYML_SURVEY_SURFACE : SYML_SURVEY_CAVE); st1 = &(this->db->db1d.station_vec[arrow->start_node->uid - 1]); st2 = &(this->db->db1d.station_vec[arrow->end_node->uid - 1]); switch (this->proj->type) { case TT_2DPROJ_EXTEND: nlp->lnx1 = (arrow->is_reversed ? arrow->leg->leg->txx : arrow->leg->leg->fxx) - this->proj->shift_x; nlp->lny1 = st1->z - this->proj->shift_z; nlp->lnz1 = 0.0; nlp->lnx2 = (arrow->is_reversed ? arrow->leg->leg->fxx : arrow->leg->leg->txx) - this->proj->shift_x; nlp->lny2 = st2->z - this->proj->shift_z; nlp->lnz2 = 0.0; break; case TT_2DPROJ_PLAN: nlp->lnx1 = st1->x - this->proj->shift_x; nlp->lny1 = st1->y - this->proj->shift_y; nlp->lnz1 = st1->z - this->proj->shift_z; nlp->lnx2 = st2->x - this->proj->shift_x; nlp->lny2 = st2->y - this->proj->shift_y; nlp->lnz2 = st2->z - this->proj->shift_z; break; case TT_2DPROJ_ELEV: nlp->lnx1 = cosa * (st1->x - this->proj->shift_x) - sina * (st1->y - this->proj->shift_y); nlp->lny1 = st1->z - this->proj->shift_z; nlp->lnz1 = sina * (st1->x - this->proj->shift_x) + cosa * (st1->y - this->proj->shift_y); nlp->lnx2 = cosa * (st2->x - this->proj->shift_x) - sina * (st2->y - this->proj->shift_y); nlp->lny2 = st2->z - this->proj->shift_z; nlp->lnz2 = sina * (st2->x - this->proj->shift_x) + cosa * (st2->y - this->proj->shift_y); break; } } arrow = arrow->next_arrow; } } } if (cp != NULL) { cp = cp->nextcp; } if (lp != NULL) { lp = lp->next_item; } } break; // case TT_2DPROJ_EXTEND: // cp = this->fcpp; // while (cp != NULL) { // if (cp->used_in_attachement) { // nlp = this->polygon_insert(); // nlp->lnio = true; // nlp->lnx1 = cp->tx; // nlp->lny1 = cp->ty; // nlp->lnz1 = 0.0; // nlp->lnx2 = cp->point->extend_point->cpoint->tx; // nlp->lny2 = cp->point->extend_point->cpoint->ty; // nlp->lnz2 = 0.0; // } // cp = cp->nextcp; // } // break; } this->polygon_parsed = true; return this->polygon_first; } void thscrap::calc_z() { thdb2dcp * cp = this->fcpp; this->z = 0.0; this->a = 0.0; unsigned long numcp = 0; while(cp != NULL) { if (cp->st != NULL) { this->z += cp->tz; this->a += cp->ta; numcp++; } cp = cp->nextcp; } if (numcp > 0) { this->z /= double(numcp); this->a /= double(numcp); } else { this->z = thnan; this->a = thnan; } } thdb1ds * thscrap::get_nearest_station(thdb2dpt * pt) { double mindist, cdist; thdb1ds * res = NULL; mindist = -1.0; // skusi kontrolne body thdb2dcp * cp = this->fcpp; while(cp != NULL) { if (cp->st != NULL) { cdist = hypot(cp->pt->xt - pt->xt,cp->pt->yt - pt->yt); if ((cdist < mindist) || (mindist < 0.0)) { res = cp->st; mindist = cdist; } } cp = cp->nextcp; } // skusi pridany polygon thscraplp * lp = this->polygon_first; while(lp != NULL) { if (lp->station != NULL) { cdist = hypot(lp->stx - pt->xt,lp->sty - pt->yt); if ((cdist < mindist) || (mindist < 0.0)) { res = lp->station; mindist = cdist; } } lp = lp->next_item; } return res; } thscrapen * thscrap::get_ends() { if (this->ends_parsed) return this->ends_first; bool search_inv, cont, rev, lastvis, cvis = false, try_next_line; thdb2dlp * first_point, * clp; thscrapen * res = NULL, * cres; thscraplo * lo = this->get_outline(), * lo2, * nextlo; #ifdef THDEBUG thprintf("\nscaning ends: %s\n", this->name); #endif while (lo != NULL) { if (lo->line->outline != TT_LINE_OUTLINE_NONE) { lo2 = lo; #ifdef THDEBUG thprintf("\toutline from: %d -- mode %d\n", lo->line->id, lo->line->outline); #endif search_inv = true; cont = true; first_point = NULL; lastvis = (lo->mode == TT_OUTLINE_REVERSED ? ((lo->line->last_point->subtype != TT_LINE_SUBTYPE_INVISIBLE) && (lo->line->type == TT_LINE_TYPE_WALL)) : ((lo->line->first_point->subtype != TT_LINE_SUBTYPE_INVISIBLE) && (lo->line->type == TT_LINE_TYPE_WALL))); while (cont) { if ((lo2 == NULL) && (first_point != NULL)) lo2 = lo; if (lo2 == NULL) break; // teraz podme po bodoch krivky rev = (lo2->mode == TT_OUTLINE_REVERSED); if (rev) clp = lo2->line->last_point; else clp = lo2->line->first_point; while (cont && (clp != NULL)) { // urcime sucanu viditelnost try_next_line = false; if (rev) { if (clp->prevlp != NULL) cvis = ((clp->prevlp->subtype != TT_LINE_SUBTYPE_INVISIBLE) && (lo2->line->type == TT_LINE_TYPE_WALL)); else try_next_line = true; } else { if (clp->nextlp != NULL) cvis = ((clp->subtype != TT_LINE_SUBTYPE_INVISIBLE) && (lo2->line->type == TT_LINE_TYPE_WALL)); else try_next_line = true; } // skusi nasledovnu ciaru if (try_next_line) { cvis = true; if (lo2->next_line != NULL) nextlo = lo2->next_line; else nextlo = lo; // ak je dalsia normalne natocena if (nextlo->mode == TT_OUTLINE_REVERSED) { if ((nextlo->line->last_point->point->x != clp->point->x) || (nextlo->line->last_point->point->y != clp->point->y)) cvis = false; else if ((nextlo->line->last_point->prevlp != NULL) && ((nextlo->line->last_point->prevlp->subtype == TT_LINE_SUBTYPE_INVISIBLE) || (nextlo->line->type != TT_LINE_TYPE_WALL))) cvis = false; } else { if ((nextlo->line->first_point->point->x != clp->point->x) || (nextlo->line->first_point->point->y != clp->point->y)) cvis = false; else if ((nextlo->line->first_point->subtype == TT_LINE_SUBTYPE_INVISIBLE) || (nextlo->line->type != TT_LINE_TYPE_WALL)) cvis = false; } } // zistime ci mame bod if ((cvis != lastvis) && (search_inv != cvis)) { // mame bod, teraz ho priradime if (search_inv) { cres = this->db->db2d.insert_scrapen(); if (first_point != clp) { if (res == NULL) res = cres; else { cres->next_end = res; res = cres; } res->l1 = lo2->line; res->lp1 = clp; } else cont = false; if (first_point == NULL) first_point = clp; } else { res->l2 = lo2->line; res->lp2 = clp; } search_inv = !search_inv; } // podme na dalsi bod if (rev) clp = clp->prevlp; else clp = clp->nextlp; lastvis = cvis; } lo2 = lo2->next_line; } } lo = lo->next_outline; } this->ends_parsed = true; this->ends_first = res; return res; } void thscrap::insert_adata(class thdb1ds * as) { // najde ci dane data uz mame if (as->data.empty()) return; thmapstat_dataptr temp; for(std::list::iterator it = as->data.begin(); it != as->data.end(); it++) { temp.ptr = *it; thmapstat_datamap::iterator di = this->adata.find(temp); if (di == adata.end()) { this->adata[temp] = 1; } else { di->second++; } } } void thscrap::process_3d() { if (this->d3_parsed) return; this->d3_parsed = true; thprintf("."); thscrapis is(this); #ifndef THSCRAPIS_NEW3D thscraplp * slp; th2ddataobject * o2; thpoint * pp; // vlozi vsetky meracske body (body + body z polygonu) slp = this->get_polygon(); while (slp != NULL) { if (!slp->lnio) { is.insert_bp(slp->stx, slp->sty, slp->stz); } slp = slp->next_item; } o2 = this->fs2doptr; while (o2 != NULL) { if (o2->get_class_id() == TT_POINT_CMD) { pp = (thpoint *) o2; if (pp->station_name.id != 0) { is.insert_bp(pp->point->xt, pp->point->yt, pp->point->zt); } } o2 = o2->nscrapoptr; } // koniec vkladania is.end_bp(); // vlozi vsetky smerniky na zaklade shotov slp = this->get_polygon(); while (slp != NULL) { if (slp->lnio) { is.insert_bp_direction(slp->lnx1, slp->lny1, slp->lnz1, slp->lnx2, slp->lny2, slp->lnz2, slp); } slp = slp->next_item; } // koniec vkladania is.end_bp_direction(); // povklada medzibody na shotoch slp = this->get_polygon(); while (slp != NULL) { if (slp->lnio) { is.insert_bp_shot(slp->lnx1, slp->lny1, slp->lnz1, slp->lnx2, slp->lny2, slp->lnz2); } slp = slp->next_item; } #endif is.outline_scan(this->get_outline()); #ifndef THSCRAPIS_NEW3D // prejde vsetky objekty a nasackuje passage-heights o2 = this->fs2doptr; double cup, cdown; while (o2 != NULL) { if (o2->get_class_id() == TT_POINT_CMD) { pp = (thpoint *) o2; if ((pp->type == TT_POINT_TYPE_PASSAGE_HEIGHT) && ((pp->tags & TT_POINT_TAG_HEIGHT_U) != 0) && (!thisnan(pp->xsize))) { cdown = pp->xsize / 1.618; if (cdown > 1.618) cdown = 1.618; cup = pp->xsize - cdown; is.insert_dim(pp->point->xt, pp->point->yt, cup, cdown); } else if ((pp->type == TT_POINT_TYPE_DIMENSIONS) && (!thisnan(pp->xsize)) && (!thisnan(pp->ysize))) { is.insert_dim(pp->point->xt, pp->point->yt, pp->xsize, pp->ysize); } } o2 = o2->nscrapoptr; } is.insert_bp_dim(); is.outline_interpolate_dims(); #endif thscrapisolpt * oline, * olineln, * prevolineln = NULL; bool started = false; #ifndef THSCRAPIS_NEW3D double normx, normy, norml; // povkladame vsetky body na outlineoch for(oline = is.firstolseg; oline != NULL; oline = oline->next_segment) { for(olineln = oline; olineln != NULL; olineln = olineln->next) { olineln->vx3dup = this->d3_outline.insert_vertex( olineln->x + this->proj->shift_x, olineln->y + this->proj->shift_y, olineln->zu + this->proj->shift_z); olineln->vx3ddn = this->d3_outline.insert_vertex( olineln->x + this->proj->shift_x, olineln->y + this->proj->shift_y, olineln->zd + this->proj->shift_z); } } oline = is.firstolseg; thdb3dfc * cfc = NULL; thdb3dfx * cfx, * cfx2; while (oline != NULL) { started = false; olineln = oline->next; while (olineln != NULL) { if (EXPORT3D_INVISIBLE || olineln->visible) { normx = olineln->y - olineln->prev->y; normy = olineln->prev->x - olineln->x; norml = hypot(normx, normy); if (!started) { cfc = this->d3_outline.insert_face(THDB3DFC_TRIANGLE_STRIP); cfx = cfc->insert_vertex(olineln->prev->vx3dup); cfx2 = cfc->insert_vertex(olineln->prev->vx3ddn); if (norml > 0.0) { cfx->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); } started = true; } cfx = cfc->insert_vertex(olineln->vx3dup); cfx2 = cfc->insert_vertex(olineln->vx3ddn); if (norml > 0.0) { cfx->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); } } else { if (started) { started = false; } } prevolineln = olineln; olineln = olineln->next; } if ((oline->next != NULL) && (EXPORT3D_INVISIBLE || oline->visible)) { if (!started && (prevolineln != NULL)) { cfc = this->d3_outline.insert_face(THDB3DFC_TRIANGLE_STRIP); } if (prevolineln != NULL) { normx = oline->y - prevolineln->y; normy = prevolineln->x - oline->x; norml = hypot(normx, normy); } else { normx = 1.0; normy = 1.0; norml = sqrt(2.0); } if (!started && (prevolineln != NULL)) { cfx = cfc->insert_vertex(prevolineln->vx3dup); cfx2 = cfc->insert_vertex(prevolineln->vx3ddn); if (norml > 0) { cfx->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); } started = true; } cfx = cfc->insert_vertex(oline->vx3dup); cfx2 = cfc->insert_vertex(oline->vx3ddn); if (norml > 0) { cfx->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); cfx2->vertex->insert_normal(normx / norml, normy / norml, 0.0); } } oline = oline->next_segment; } int i, j; double vx, vy, vz, wx, wy, wz, nx, ny, nz, nl; if (is.tri_num > 0) { cfc = this->d3_outline.insert_face(THDB3DFC_TRIANGLES); for(i = 0; i < is.tri_num; i++) { oline = is.tri_triangles[i][0]; olineln = is.tri_triangles[i][1]; vx = olineln->x - oline->x; vy = olineln->y - oline->y; vz = olineln->zd - oline->zd; oline = is.tri_triangles[i][1]; olineln = is.tri_triangles[i][2]; wx = olineln->x - oline->x; wy = olineln->y - oline->y; wz = olineln->zd - oline->zd; nx = - (vy * wz - wy * vz); ny = - (wx * vz - vx * wz); nz = - (vx * wy - wx * vy); nl = hypot(hypot(nx, ny), nz); for(j = 2; j >= 0; j--) { oline = is.tri_triangles[i][j]; cfx = cfc->insert_vertex(oline->vx3ddn); if (nl > 0.0) { if (j == 2) cfx->insert_normal(nx / nl, ny / nl, nz / nl); cfx->vertex->insert_normal(nx / nl, ny / nl, nz / nl); } } oline = is.tri_triangles[i][0]; olineln = is.tri_triangles[i][1]; vx = olineln->x - oline->x; vy = olineln->y - oline->y; vz = olineln->zu - oline->zu; oline = is.tri_triangles[i][1]; olineln = is.tri_triangles[i][2]; wx = olineln->x - oline->x; wy = olineln->y - oline->y; wz = olineln->zu - oline->zu; nx = (vy * wz - wy * vz); ny = (wx * vz - vx * wz); nz = (vx * wy - wx * vy); nl = hypot(hypot(nx, ny), nz); for(j = 0; j < 3; j++) { oline = is.tri_triangles[i][j]; cfx = cfc->insert_vertex(oline->vx3dup); if (nl > 0.0) { if (j == 0) cfx->insert_normal(nx / nl, ny / nl, nz / nl); cfx->vertex->insert_normal(nx / nl, ny / nl, nz / nl); } } } } #endif #ifdef THSCRAPIS_NEW3D lxVec norm; double norml; // povkladame horne a spodne body for(oline = is.firstolseg; oline != NULL; oline = oline->next_segment) { for(olineln = oline; olineln != NULL; olineln = olineln->next) { olineln->vx3dup = this->d3_outline.insert_vertex(olineln->pt + olineln->d_up * olineln->dir); olineln->vx3ddn = this->d3_outline.insert_vertex(olineln->pt - olineln->d_dn * olineln->dir); } } // vlozime triangle strip dookola oline = is.firstolseg; thdb3dfc * cfc = NULL; thdb3dfx * cfx, * cfx2; while (oline != NULL) { started = false; // najdeme posledny bod prevolineln = NULL; olineln = oline->next; while (olineln != NULL) { prevolineln = olineln; olineln = olineln->next; } // nemame ani 2 body - nerobime outline if (prevolineln == NULL) break; olineln = oline; while (olineln != NULL) { if (EXPORT3D_INVISIBLE || olineln->visible) { norm = (olineln->pt - prevolineln->pt) ^ (olineln->dir); norml = norm.Length(); if (!started) { cfc = this->d3_outline.insert_face(THDB3DFC_TRIANGLE_STRIP); cfx = cfc->insert_vertex(prevolineln->vx3dup); cfx2 = cfc->insert_vertex(prevolineln->vx3ddn); if (norml > 0.0) { norm /= norml; cfx->insert_normal(norm); cfx->vertex->insert_normal(2.0 * norm); cfx2->vertex->insert_normal(2.0 * norm); } started = true; } cfx = cfc->insert_vertex(olineln->vx3dup); cfx2 = cfc->insert_vertex(olineln->vx3ddn); if (norml > 0.0) { cfx->insert_normal(norm); cfx->vertex->insert_normal(2.0 * norm); cfx2->vertex->insert_normal(2.0 * norm); } } else { if (started) { started = false; } } prevolineln = olineln; olineln = olineln->next; } // prejdeme dalsi segment oline = oline->next_segment; } int i, j; lxVec v, w; if (is.tri_num > 0) { cfc = this->d3_outline.insert_face(THDB3DFC_TRIANGLES); for(i = 0; i < is.tri_num; i++) { // spodne trojuholniky v = is.tri_triangles[i][1]->vx3ddn->get_vector() - is.tri_triangles[i][0]->vx3ddn->get_vector(); w = is.tri_triangles[i][2]->vx3ddn->get_vector() - is.tri_triangles[i][1]->vx3ddn->get_vector(); norm = -1.0 * (v ^ w); norml = norm.Length(); if (norml > 0.0) norm /= norml; for(j = 2; j >= 0; j--) { oline = is.tri_triangles[i][j]; cfx = cfc->insert_vertex(oline->vx3ddn); if (norml > 0.0) { if (j == 2) cfx->insert_normal(norm); cfx->vertex->insert_normal(norm); } } // horne trojuholniky v = is.tri_triangles[i][1]->vx3dup->get_vector() - is.tri_triangles[i][0]->vx3dup->get_vector(); w = is.tri_triangles[i][2]->vx3dup->get_vector() - is.tri_triangles[i][1]->vx3dup->get_vector(); norm = (v ^ w); norml = norm.Length(); if (norml > 0.0) norm /= norml; for(j = 0; j < 3; j++) { oline = is.tri_triangles[i][j]; cfx = cfc->insert_vertex(oline->vx3dup); if (norml > 0.0) { if (j == 0) cfx->insert_normal(norm); cfx->vertex->insert_normal(norm); } } } } #endif this->d3_outline.postprocess(); } thdb3ddata * thscrap::get_3d_outline() { this->process_3d(); return &(this->d3_outline); } void thscrap::update_limits(double x, double y) { if (thisnan(this->lxmin)) { this->lxmin = x; this->lxmax = x; } else { if (x < this->lxmin) this->lxmin = x; if (x > this->lxmax) this->lxmax = x; } if (thisnan(this->lymin)) { this->lymin = y; this->lymax = y; } else { if (y < this->lymin) this->lymin = y; if (y > this->lymax) this->lymax = y; } } void thscrap::parse_sketch(char ** args, int argenc) { int sv; thsketch sk; sk.m_scrap = this; sk.m_pic.init(args[0], thdb.csrc.name); // X thparse_double(sv,sk.m_x,args[1]); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid number -- %s", args[1])) // Y thparse_double(sv,sk.m_y,args[2]); if ((sv != TT_SV_NUMBER) && (sv != TT_SV_NAN)) ththrow(("invalid number -- %s", args[2])) this->sketch_list.push_back(sk); } void thscrap::start_insert() { if (this->cs != TTCS_LOCAL) { if (this->proj->type != TT_2DPROJ_PLAN) ththrow(("coordinate system specification valid only for plan projection")) if (!this->scale_p9) ththrow(("scrap scaling not valid in this coordinate system")) } } therion/thmpost.cxx0000664000175000017500000047747312340611142013510 0ustar useruser/** * @file thmpost.cxx * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #include "thmpost.h" #ifndef THMSVC const char * thmpost_library = "%% therion source code\n" "%%\n" "%% therion.mp\n" "%%\n" "%% This file defines low-level MetaPost macros and variables required\n" "%% for generation of map symbols\n" "%%\n" "%% $Date: 2003/07/01 09:06:44 $\n" "%% $RCSfile: therion.mp,v $\n" "%% $Revision: 1.3 $\n" "%%\n" "%% Copyright (C) 2000-2003 Martin Budaj\n" "%%\n" "%% Some macros are adapted from MPATTERN package of P. Bolek\n" "%%\n" "%% Some macros are used from MetaFun package of H. Hagen\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% --------------------------------------------------------------------\n" "\n" "% This file defines low level macros used for map signatures in Therion.\n" "% Before loading this file set `Scale' variable to numeric value\n" "% representing denominator of the scale ratio. Internal variable \n" "% `prologues' is set to 1 by this file. This module loads also \n" "% symbol libraries.\n" "\n" "\n" "tracingstats:=1;\n" "prologues:=0;\n" "\n" "if known Background: background:=Background fi;\n" "%TrueScale:=Scale;\n" "\n" "% @VARIABLE\n" "% symbol_scale --\n" "%\n" "% internal numeric; in map symbol definitions used for scaling\n" "% in T transformation; recommended\n" "% values are 1 or 2.\n" "\n" "%newinternal symbol_scale;\n" "%symbol_scale := 1;\n" "\n" "% @VARIABLE\n" "% fill_only --\n" "%\n" "% boolean, used in thdraw and\n" "% thpattfill commands. When set to false, it has \n" "% no effect, when it is true, it supresses all drawing \n" "% commands with exception of thpermanentfill, so that only filled \n" "% areas are drawn\n" "\n" "boolean fill_only, horiz_labels, transparency;\n" "fill_only := false;\n" "horiz_labels:=true;\n" "transparency:=false;\n" "\n" "string ATTR__id, ATTR__survey, ATTR__scrap, NorthDir;\n" "boolean ATTR__scrap_centerline;\n" "picture ATTR__text;\n" "numeric ATTR__height;\n" "boolean ATTR__elevation;\n" "ATTR__scrap_centerline := false;\n" "ATTR__height:=0;\n" "ATTR__elevation:=false;\n" "\n" "boolean ATTR__shotflag_splay;\n" "ATTR__shotflag_splay:=false;\n" "boolean ATTR__shotflag_duplicate;\n" "ATTR__shotflag_duplicate:=false;\n" "boolean ATTR__shotflag_approx;\n" "ATTR__shotflag_approx:=false;\n" "boolean ATTR__stationflag_splay;\n" "ATTR__stationflag_splay:=false;\n" "\n" "\n" "color label_fill_color, label_fill_color_tmp;\n" "label_fill_color := (1.0, 1.0, 1.0);\n" "def push_label_fill_color(expr r,g,b) =\n" " label_fill_color_tmp := label_fill_color;\n" " label_fill_color := (r,g,b);\n" "enddef;\n" "def pop_label_fill_color =\n" " label_fill_color := label_fill_color_tmp;\n" "enddef;\n" "def process_filledlabel(expr cent, rot) =\n" " begingroup;\n" " interim bboxmargin:=2.0bp;\n" " q:=((bbox lab) smoothed 2) rotatedaround (cent, rot);\n" " fill q withcolor label_fill_color;\n" " draw lab rotatedaround (cent, rot);\n" " write_circ_bbox(q); % without corners smoothing it was enough to use\n" " % write_bbox(q);\n" " endgroup;\n" "enddef;\n" "\n" "\n" "\n" "\n" "numeric area_border_errors;\n" "area_border_errors = 0;\n" "\n" "% @VARIABLE\n" "% last_write --\n" "%\n" "% numeric; charcode of last figure which contained \n" "% write_bbox macro; this value is used by\n" "% close_file macro. Initially set to -1.\n" "\n" "numeric last_write;\n" "last_write = -1;\n" "\n" "% @VARIABLE\n" "% strut_string --\n" "%\n" "% string containing combination of the \"highest\" and \"lowest\" character\n" "% in used font; it's used by free_text macro.\n" "\n" "%string strut_string;\n" "%strut_string = \"(È\";\n" "\n" "% @VARIABLE\n" "% file_name --\n" "%\n" "% string, name of file, where write_bbox macro writes\n" "% text clipping path\n" "\n" "% @VARIABLE\n" "% s ch --\n" "%\n" "% string, temporary string/char variables\n" "\n" "string s, ch, file_name, bg_name, clip_name, lang, diff_pos, diff_neg,\n" " current_scrap, current_src;\n" "\n" "% @VARIABLE\n" "% u v w --\n" "%\n" "% internal numeric variables used as basic length units for drawing;\n" "% they are set by initialize macro.\n" "%
  • u -- normal unit decreasing with increasing scale\n" "%
  • v -- like u, but can increase drammaticaly\n" "% when some limit is encountered (to get effects like logarithmic\n" "% scale)\n" "%
  • w -- nearly constant at all scales\n" "%
\n" "\n" "% @VARIABLE\n" "% legend_scale --\n" "%\n" "% numeric, length of the longer side of signatures' legend box\n" "\n" "newinternal legend_scale, u,v,w;\n" "\n" "% @VARIABLE\n" "% lab Lab --\n" "%\n" "% picture, in which are saved typeset labels\n" "\n" "picture lab, Lab;\n" "\n" "% @VARIABLE\n" "% T --\n" "%\n" "% transformation, defines transformation function for transforming \n" "% every argument of thdraw and thfill\n" "% macros\n" "\n" "transform T;\n" "\n" "% @VARIABLE\n" "% p,q --\n" "%\n" "% path, for saving temporary paths\n" "\n" "path p,q;\n" "\n" "% @MACRO\n" "% initialize --\n" "%\n" "% initializes basic length units (u,v,w) and pens used \n" "% in map symbols according to scale. Five circular pens are defined:\n" "%
  • PenA -- thick; for outlines\n" "%
  • PenB, PenC -- thinner; for pits, symbols etc.\n" "%
  • PenD -- thinnest; for fine details\n" "%
  • PenX -- extra thick; not recommended for use\n" "%
\n" "\n" "def fonts_setup (expr t,s,m,l,h) =\n" " write \"\\def\\updown#1#2{\\vbox{\" &\n" " \"\\offinterlineskip\" &\n" " \"\\setbox100=\\hbox{#1}\" &\n" " \"\\setbox101=\\hbox{#2}\" &\n" " \"\\ifnum\\wd100>\\wd101\\hsize=\\wd100\\else\\hsize=\\wd101\\fi\" &\n" " \"\\centerline{\\box100}\\vskip4pt\" &\n" " \"\\centerline{\\box101}}}\" &\n" " \"\\def\\thlabel{\\thnormalsize}\" &\n" " \"\\def\\thremark{\\thsmallsize\\si}\" &\n" " \"\\def\\thcomment{\\thsmallsize}\" &\n" " \"\\def\\thentrance{\\thsmallsize}\" &\n" " \"\\def\\thaltitude{\\thsmallsize}\" &\n" " \"\\def\\thstationname{\\thsmallsize}\" &\n" " \"\\def\\thdate{\\thsmallsize}\" &\n" " \"\\def\\thheight{\\thsmallsize}\" &\n" " \"\\def\\thheightpos{+\\ignorespaces}\" &\n" " \"\\def\\thheightneg{-\\ignorespaces}\" &\n" " \"\\def\\thframed{\\thsmallsize}\" &\n" " \"\\def\\thwallaltitude{\\thtinysize}\"\n" " to \"mptexpre.tex\";\n" " write \"\\def\\thtinysize{\\size[\" & decimal max(optical_zoom*t,0) & \"]}\" & \n" " \"\\def\\thsmallsize{\\size[\" & decimal max(optical_zoom*s,0) & \"]}\" & \n" " \"\\def\\thnormalsize{\\size[\" & decimal max(optical_zoom*m,0) & \"]}\" & \n" " \"\\def\\thlargesize{\\size[\" & decimal max(optical_zoom*l,0) & \"]}\" & \n" " \"\\def\\thhugesize{\\size[\" & decimal max(optical_zoom*h,0) & \"]}\" \n" " to \"mptexpre.tex\";\n" " write EOF to \"mptexpre.tex\";\n" "enddef;\n" "\n" "def initialize (expr sc) =\n" "\n" " if unknown BaseScale: BaseScale = sc; fi;\n" " optical_zoom := BaseScale/sc;\n" "\n" " if BaseScale <= 1: % 1:100\n" " u:=14bp; v:=14bp; w:=12bp;\n" " fonts_setup(8,10,12,16,24);\n" " elseif BaseScale <= 2: % 1:200\n" " u:=12bp; v:=12bp; w:=12bp;\n" " fonts_setup(7,8,10,14,20);\n" " elseif BaseScale <= 5: % 1:500\n" " u:=10bp; v:=10bp; w:=12bp;\n" " fonts_setup(6,7,8,10,14);\n" " else:\n" " u:=7bp; v:=14bp; w:=10bp;\n" " fonts_setup(5,6,7,8,10);\n" " fi;\n" " \n" " u := optical_zoom * u;\n" " v := optical_zoom * v;\n" " w := optical_zoom * w;\n" "\n" " defaultscale := 0.8 * optical_zoom;\n" "\n" " def PenA = pencircle scaled (u/10) enddef;\n" " def PenB = pencircle scaled (0.7*u/10) enddef;\n" " def PenC = pencircle scaled (0.5*u/10) enddef;\n" " def PenD = pencircle scaled (0.35*u/10) enddef;\n" " def PenX = pencircle scaled (1.2*u/10) enddef;\n" " \n" " legend_scale := 3.14*u;\n" "enddef;\n" "\n" "% macro is expanded, we have to know all dimensions and pens before reading\n" "% mpattern macros\n" "\n" "initialize(Scale);\n" "\n" "vardef thTEX primary s =\n" " write \"verbatimtex \\input th_enc.tex etex\" to \"mptextmp.mp\";\n" " write \"btex \\mainfont \"&s&\" etex\" to \"mptextmp.mp\";\n" " write EOF to \"mptextmp.mp\";\n" " scantokens \"input mptextmp\"\n" "enddef;\n" "\n" "% @MACRO\n" "% inscale --\n" "%\n" "% zooms objects to scale specified in legend_scale variable (used in legend\n" "% typesetting)\n" "\n" "def inscale = \n" " xscaled legend_scale yscaled (0.618*legend_scale)\n" "enddef;\n" "\n" "% @MACRO\n" "% draw_legend_box --\n" "%\n" "% draws a legend bounding box and resets drawoptions() options \n" "\n" "def draw_legend_box =\n" " clip currentpicture to unitsquare inscale;\n" " drawoptions();\n" " pickup PenB;\n" " draw unitsquare inscale;\n" "enddef;\n" "\n" "def clean_legend_box =\n" " unfill unitsquare inscale;\n" "enddef;\n" "\n" "def legend_point (expr name) =\n" "% if substring (2,9) of name = \"station\":\n" "% scantokens(name)((0.5,0.5) inscale);\n" "% else:\n" " scantokens(name)((0.5,0.5) inscale,0,1,(0,0));\n" "% fi;\n" " draw_legend_box;\n" "enddef;\n" "\n" "def legend_line (expr name) =\n" " scantokens(name)((((-0.3,.5)..(.3,.7)..(.5,.3)..{dir 80}(1.3,.9)) inscale) \n" " randomized 3mm);\n" " draw_legend_box;\n" "enddef;\n" "\n" "% legend_label\n" "% legend_area\n" "% legend_random\n" "\n" "% @MACRO\n" "% roundone --\n" "%\n" "% rounds numeric value to one decimal point\n" "\n" "vardef roundone(expr n) =\n" "% round(10*n)/10\n" " n\n" "enddef;\n" "\n" "% @MACRO\n" "% process_label --\n" "%\n" "% draws a label saved in lab picture variable and calls \n" "% write_bbox macro.\n" "\n" "\n" "def process_label (expr cent, rot) =\n" " begingroup;\n" " interim bboxmargin:=0.8bp;\n" " q:=((bbox lab) smoothed 2) rotatedaround (cent, rot);\n" " draw lab rotatedaround (cent, rot);\n" " write_circ_bbox(q); % without corners smoothing it was enough to use\n" " % write_bbox(q);\n" " endgroup;\n" "enddef;\n" "\n" "% @MACRO\n" "% process_uplabel --\n" "%\n" "% draws a label into semicircular box and writes clipping path to a file\n" "\n" "def process_uplabel =\n" " begingroup;\n" " interim bboxmargin := 0.8 bp;\n" " q:=bbox lab;\n" " endgroup;\n" " alef:=.8-.02*(xpart lrcorner q - xpart llcorner q);\n" "% show alef;\n" " q:=alef[llcorner q,ulcorner q]{up} .. {down}alef[lrcorner q, urcorner q] --\n" " lrcorner q -- llcorner q -- cycle;\n" " draw lab;\n" " draw q;\n" " q:=reverse q;\n" " write_circ_bbox(q);\n" "enddef;\n" "\n" "% @MACRO\n" "% process_downlabel --\n" "%\n" "% draws a label into down oriented semicircular box and writes\n" "% clipping path to a file\n" "\n" "def process_downlabel =\n" " begingroup;\n" " interim bboxmargin := 0.8 bp;\n" " q:=bbox lab;\n" " endgroup;\n" " alef:=1-(.8-.02*(xpart lrcorner q - xpart llcorner q));\n" " q:=alef[llcorner q,ulcorner q]{down} .. \n" " {up}alef[lrcorner q, urcorner q] --\n" " urcorner q -- ulcorner q -- cycle;\n" " draw lab;\n" " draw q;\n" " write_circ_bbox(q);\n" "enddef;\n" "\n" "% @MACRO\n" "% process_updownlabel --\n" "%\n" "% draws a label splitted into down and up oriented semicircular boxes and \n" "% writes clipping path to a file\n" "\n" "def process_updownlabel =\n" " begingroup;\n" " interim bboxmargin := 0.8 bp;\n" " p:=bbox lab;\n" " endgroup;\n" " leftside:=xpart llcorner p;\n" " rightside:=xpart lrcorner p;\n" " draw (xpart llcorner p,.5[ypart llcorner p,ypart ulcorner p]) -- \n" " (xpart lrcorner p,.5[ypart llcorner p,ypart ulcorner p]);\n" " alef:=1.05-.02*(xpart lrcorner p - xpart llcorner p);\n" "% alef:=.8-.02*(rightside-leftside);\n" " p:=alef[(leftside, ypart llcorner p),(leftside, ypart ulcorner p)]{up} .. \n" " {down}alef[(rightside, ypart lrcorner p), (rightside, ypart urcorner p)]\n" " -- alef[(rightside, ypart urcorner p), (rightside, ypart lrcorner p)]{down}\n" " .. {up}alef[(leftside, ypart ulcorner p),(leftside, ypart llcorner p)]\n" " -- cycle;\n" "% p:=alef[llcorner p,ulcorner p]{up} .. {down}alef[lrcorner p, urcorner p] --\n" "% aleff[llcorner p,ulcorner p]{down} .. \n" "% {up}aleff[lrcorner p, urcorner p] -- cycle;\n" " draw lab;\n" " draw p;\n" " p:=reverse p;\n" " write_circ_bbox(p);\n" "enddef;\n" "\n" "def process_updownlabel_OLD =\n" " p:=bbox lab;\n" " q:=bbox Lab;\n" " leftside:=min(xpart llcorner p, xpart ulcorner q);\n" " rightside:=max(xpart lrcorner p, xpart urcorner q);\n" " draw .5[(leftside, ypart llcorner p),(leftside, ypart ulcorner q)] -- \n" " .5[(rightside,ypart lrcorner p),(rightside,ypart urcorner q)];\n" " alef:=.8-.02*(rightside-leftside);\n" " q:=alef[(leftside, ypart llcorner p),(leftside, ypart ulcorner p)]{up} .. \n" " {down}alef[(rightside, ypart lrcorner p), (rightside, ypart urcorner p)]\n" " -- alef[(rightside, ypart urcorner q), (rightside, ypart lrcorner q)]{down}\n" " .. {up}alef[(leftside, ypart ulcorner q),(leftside, ypart llcorner q)]\n" " -- cycle;\n" " draw lab;\n" " draw Lab;\n" " draw q;\n" " q:=reverse q;\n" " write_circ_bbox(q);\n" "enddef;\n" "\n" "% @MACRO\n" "% process_boxedlabel --\n" "%\n" "% draws a label into circular box and writes\n" "% clipping path to a file\n" "\n" "def process_boxedlabel =\n" " q:=bbox lab;\n" " draw lab;\n" " draw q;\n" " write_bbox(q);\n" "enddef;\n" "\n" "% @MACRO\n" "% process_circledlabel --\n" "%\n" "% draws a label into circular box and writes\n" "% clipping path to a file\n" "\n" "def process_circledlabel =\n" " begingroup;\n" " interim bboxmargin := 0.4 bp;\n" " q:=bbox lab;\n" " endgroup;\n" " q:=point 0 of q .. point 1 of q .. point 2 of q .. point 3 of q .. cycle;\n" " draw lab;\n" " draw q;\n" " write_circ_bbox(q);\n" "enddef;\n" "\n" "\n" "% @MACRO\n" "% write_bbox --\n" "%\n" "% Arguments:\n" "% path variable -- rectangular bounding box of a label;\n" "% assumptions: path is cyclic, counterclockwise oriented, with four points,\n" "% composed from linear segments;\n" "% see general write_circ_bbox macro\n" "% Results:\n" "% one file per figure which uses labels with a clipping path in pseudo-pdf \n" "% format\n" "\n" "def write_bbox (expr q) =\n" " file_name := jobname & \".\" & decimal(charcode) & \"bbox\";\n" " for i:=4 downto 0:\n" " s := decimal(roundone(xpart point i of q)) & \" \" \n" " & decimal(roundone(ypart point i of q)) \n" " & if i=4: \" m \" else: \" l\" fi;\n" " write s to file_name;\n" " endfor;\n" " last_write := charcode;\n" "enddef;\n" "\n" "% @MACRO\n" "% write_circ_bbox --\n" "%\n" "% Arguments:\n" "% path variable, only assumption is that path is cyclic\n" "% and counterclockwise oriented.\n" "% Results:\n" "% one file per figure which uses labels with a clipping path in pseudo-pdf \n" "% format\n" "\n" "def write_circ_bbox expr q =\n" " file_name := jobname & \".\" & decimal(charcode) & \"bbox\";\n" " tmp:=length q;\n" " s := decimal(roundone(xpart point tmp of q)) & \" \" \n" " & decimal(roundone(ypart point tmp of q)) & \" m\";\n" " write s to file_name;\n" " for i:=tmp downto 1:\n" " s := decimal(roundone(xpart precontrol i of q)) & \" \" \n" " & decimal(roundone(ypart precontrol i of q)) & \" \"\n" " & decimal(roundone(xpart postcontrol i-1 of q)) & \" \" \n" " & decimal(roundone(ypart postcontrol i-1 of q)) & \" \"\n" " & decimal(roundone(xpart point i-1 of q)) & \" \" \n" " & decimal(roundone(ypart point i-1 of q)) & \" c\";\n" " write s to file_name;\n" " endfor;\n" " last_write := charcode;\n" "enddef;\n" "\n" "% @MACRO\n" "% close_file --\n" "%\n" "% closes file with a clipping path; it's invoked by endchar macro\n" "\n" "def close_file =\n" " if last_write=charcode:\n" " write EOF to jobname & \".\" & decimal(charcode) & \"bbox\";\n" " fi;\n" "enddef;\n" "\n" "% endchar should run close_file macro\n" "\n" "extra_endfig := \"close_file;\";\n" "\n" "% @MACRO\n" "% thdraw --\n" "%\n" "% like plain MetaPost's draw, but draws a path transformed\n" "% (rotated, scaled, shifted) to scrap's coordinates according T variable.\n" "% (If fill_only=false)\n" "\n" "def thdrawoptions(text t) =\n" " def _thop_ = t enddef\n" "enddef;\n" "thdrawoptions();\n" "\n" "def thdraw expr p = \n" " if not fill_only:\n" " addto currentpicture \n" " if picture p: \n" " also (p transformed T)\n" " else:\n" " doublepath (p transformed T) withpen currentpen \n" " fi \n" " _thop_ _op_\n" " else:\n" " addto currentpicture also nullpicture\n" " fi\n" "enddef;\n" "\n" "% @MACRO\n" "% thfill --\n" "%\n" "% fills a path transformed\n" "% (rotated, scaled, shifted) to scrap's coordinates according T variable.\n" "% Filled areas are clipped (like most \n" "% other lines and points) with a clipping path around text labels.\n" "\n" "\n" "def thfill expr c = \n" " addto currentpicture contour (c transformed T) _thop_ _op_ \n" "enddef;\n" "\n" "def thfilldraw expr c =\n" " if not fill_only:\n" " addto currentpicture contour (c transformed T) withpen currentpen _thop_ _op_ \n" " else:\n" " addto currentpicture contour (c transformed T) _thop_ _op_ \n" " fi\n" "enddef;\n" "\n" "def thunfill expr c = \n" " thfill c withcolor background \n" "enddef;\n" "\n" "def thundraw expr p = \n" " thdraw p withcolor background \n" "enddef;\n" "\n" "def thunfilldraw expr c = \n" " thfilldraw c withcolor background \n" "enddef;\n" "\n" "def thclean expr c =\n" " if transparency:\n" " thfill c withtransparentcolor tr_bg\n" " else:\n" " thunfill c\n" " fi;\n" "enddef;\n" "\n" "def thPatternFill (expr Path, Pattern) =\n" " T:=identity;\n" " thclean Path;\n" " thfill Path withpattern Pattern;\n" "enddef;\n" "\n" "%def thLegendPatternFill (expr Path, Pattern) =\n" "% T:=identity;\n" "% thfill Path withpattern Pattern;\n" "%enddef;\n" "\n" "% for drawarrow:\n" "\n" "def _finarr text t =\n" " thdraw _apth t;\n" " thfilldraw arrowhead _apth t\n" "enddef;\n" "\n" "% @MACRO\n" "% thpermanentfill --\n" "%\n" "% Fills specified area with a solid color; this area is not affected by \n" "% text clipping path\n" "\n" "%def thpermanentfill expr c = \n" "% addto currentpicture contour (c transformed T) _thop_ _op_\n" "%enddef;\n" "\n" "let thpermanentfill = thfill;\n" "\n" "\n" "primarydef p aligned al=\n" " p shifted (xpart al * xpart U, ypart al * ypart U)\n" "enddef;\n" "\n" "% macros for drawing scraps in upper and lower levels; filled lower scraps \n" "% require special treatment (MetaPost doesn't support non-continuous paths).\n" "% We can't use one file for both, while PDF XObject has to be explicitely \n" "% filled or stroked. Second macro writes also pseudo-pdf code of a clipping \n" "% path for given scrap\n" "\n" "boolean drawnext;\n" "drawnext:=true;\n" "\n" "def draw_upscrap (expr isout)(text t) =\n" " path q;\n" " for i=t:\n" " if (numeric i):\n" " if (i=1): drawnext:=true; else: drawnext:=false; fi;\n" " else:\n" " if drawnext: draw i withpen PenD; fi;\n" " if not known q: q:=i; else: q:=q -- i; fi;\n" " fi;\n" " endfor;\n" " if not cycle q: q:=q -- cycle; fi;\n" " if turningnumber q = 0: \n" " thwarning(\"scrap outline intersects itself\"); \n" " fi;\n" " if isout=1:\n" " if turningnumber q > 0: q := reverse q; fi;\n" " else:\n" " if turningnumber q < 0: q := reverse q; fi;\n" " fi;\n" " addto bgfill contour q;\n" "enddef;\n" "\n" "% following macro writes noncontinuous PostScript path directly to EPS file\n" "% (filled background and clipping path)\n" "\n" "picture bgfill;\n" "bgfill:=nullpicture;\n" "\n" "def draw_downscrap =\n" " bg_name := jobname & \".\" & decimal(charcode) & \"bg\";\n" " clip_name := jobname & \".\" & decimal(charcode) & \"clip\";\n" " write \"%!PS\" to bg_name;\n" " write \"%%BoundingBox: \" & \n" " decimal floor xpart llcorner bgfill & \" \" &\n" " decimal floor ypart llcorner bgfill & \" \" &\n" " decimal ceiling xpart urcorner bgfill & \" \" &\n" " decimal ceiling ypart urcorner bgfill \n" " to bg_name;\n" " write \"%%Page: 1 1\" to bg_name;\n" " write \"newpath\" to bg_name;\n" " for qq within bgfill:\n" " q := pathpart qq;\n" " tmp:=length q;\n" " s := decimal(roundone(xpart point tmp of q)) & \" \" \n" " & decimal(roundone(ypart point tmp of q)) & \" m\";\n" " write s & \"oveto\" to bg_name;\n" " write s to clip_name;\n" " for i:=tmp downto 1:\n" " s := decimal(roundone(xpart precontrol i of q)) & \" \" \n" " & decimal(roundone(ypart precontrol i of q)) & \" \"\n" " & decimal(roundone(xpart postcontrol i-1 of q)) & \" \" \n" " & decimal(roundone(ypart postcontrol i-1 of q)) & \" \"\n" " & decimal(roundone(xpart point i-1 of q)) & \" \" \n" " & decimal(roundone(ypart point i-1 of q)) & \" c\";\n" " write s & \"urveto\" to bg_name;\n" " write s to clip_name;\n" " endfor;\n" " endfor;\n" " write \"closepath fill\" to bg_name;\n" " write \"showpage\" to bg_name;\n" " write \"%%EOF\" to bg_name;\n" " write EOF to bg_name;\n" " write EOF to clip_name;\n" " bgfill:=nullpicture;\n" "enddef;\n" "\n" "\n" "\n" "vardef buildcycle(text ll) =\n" " save ta_, tb_, k_, i_, pp_; path pp_[];\n" " k_=0;\n" " for q=ll: pp_[incr k_]=q; endfor\n" " i_=k_;\n" " for i=1 upto k_:\n" " (ta_[i], length pp_[i_]-tb_[i_]) =\n" " pp_[i] intersectiontimes reverse pp_[i_];\n" " if ta_[i]<0:\n" " message(\"[Error: area borders \"& area_border[i] &\" and \"& \n" " area_border[i_] &\" don't intersect in scrap \" & current_scrap &\n" " \" (file \" & current_src & \")]\");\n" " area_border_errors := area_border_errors + 1;\n" " fi\n" " i_ := i;\n" " endfor\n" " for i=1 upto k_: subpath (ta_[i],tb_[i]) of pp_[i] .. endfor\n" " cycle\n" "enddef;\n" "\n" "vardef unitvector primary z = \n" " if (z<>(0,0)):\n" " z/abs z \n" " else:\n" " hide(thwarning(\"strange path\"))\n" " (0,epsilon)\n" " fi\n" "enddef;\n" "\n" "def thwarning (expr m) = \n" " message(\"[Warning: \" & m & \" in scrap \" & current_scrap & \"]\");\n" "enddef;\n" "\n" "def check_area_borders = \n" " if area_border_errors > 0:\n" " fi;\n" "enddef;\n" "\n" "%%%%%%%%%%%% Map symbols management %%%%%%%%%%%%%%%%%%%\n" "\n" "def mapsymbol (expr name, set, warning) = \n" " string s, stype, lname, ID;\n" " stype = substring (0,1) of name;\n" " lname = name & \"_\" & set;\n" " ID := \"ID_\" & lname;\n" " if (known scantokens ID):\n" " if stype = \"a\":\n" " s = \"def \" & name & \" = scantokens(\" & ditto & lname & ditto & \") enddef;\";\n" " else:\n" " s = \"let \" & name & \" = \" & lname & \";\";\n" " fi;\n" " scantokens s;\n" " elseif warning: \n" " message(\"[Warning: undefined symbol `\" & lname & \"']\");\n" " fi;\n" "enddef;\n" "\n" "%def hidesymbol (expr name) =\n" "% string s, stype;\n" "% stype = substring (0,1) of name;\n" "% if stype = \"a\":\n" "% s = \"def \" & name & \" = scantokens(\" & ditto & \"a_empty\" & ditto & \") enddef;\";\n" "% else:\n" "% s = \"vardef \" & name & \"@# (text t) = enddef;\";\n" "% fi;\n" "% scantokens s;\n" "% write name to \"missed.dat\";\n" "%enddef;\n" "\n" "def initsymbol (expr name) =\n" " s := \"ID_\" & name & \" = 1\";\n" " scantokens s;\n" "enddef;\n" "\n" "%%%\n" "\n" "% comment out groups in order to use 'save ATTR_*' appropriately\n" "\n" "def beginfig(expr c) =\n" "% begingroup\n" " charcode:=c;\n" " clearxy; clearit; clearpen;\n" " pickup defaultpen;\n" " drawoptions();\n" " scantokens extra_beginfig;\n" " \n" " save smartll, smartur; \n" " pair smartll[], smartur[]; \n" " smart_count := 0;\n" "enddef;\n" "\n" "def endfig =\n" " scantokens extra_endfig;\n" " shipit;\n" "% endgroup\n" "enddef;\n" "\n" "\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "% P. Bolek's MPATTERN package adapted and simplified for Therion\n" "% (with the same user interface except of patterncolor)\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "\n" "string Pname_, PXYsteps_;\n" "string Pmatrix_;\n" "\n" "numeric Pnum_; Pnum_=0;\n" "\n" "def PmakeBB_=\n" " PBBox_ := \"[\" & decimal Plft_ & \" \" & decimal Plow_ & \" \"\n" " & decimal Prt_ & \" \" & decimal Pup_ & \"]\";\n" "enddef;\n" "\n" "def Psteps_=\n" " PXYsteps_ := decimal\n" " if unknown PXStep_: (Prt_-Plft_) else: PXStep_ fi \n" " & \":\" & decimal\n" " if unknown PYStep_: (Pup_-Plow_) else: PYStep_ fi;\n" "enddef;\n" " \n" "vardef Pfindbounds_=\n" " Plow_ = ypart (llcorner currentpicture);\n" " Plft_ = xpart (llcorner currentpicture);\n" " Pup_ = ypart (urcorner currentpicture);\n" " Prt_ = xpart (urcorner currentpicture);\n" " PmakeBB_;\n" "enddef;\n" "\n" "def PmakePattern_(expr name)=\n" " write decimal (Pnum_*epsilon) & \":\"\n" " & jobname & \".\" & decimal charcode & \":\"\n" " & PBBox_ & \":\"\n" " & PXYsteps_ & \":\"\n" " & Pmatrix_ \n" " to \"patterns.dat\"\n" "enddef;\n" "\n" "% User interface macros\n" "\n" "vardef patternbbox(expr a)(text b)=\n" " save Pi_, Pz_;\n" " numeric Pi_, Pz_[];\n" " if pair a:\n" " Plft_:=min(xpart(a),xpart(b)); Plow_:=min(ypart(a),ypart(b));\n" " Prt_:=max(xpart(a),xpart(b)); Pup_:=max(ypart(a),ypart(b));\n" " else:\n" " Pi_=1;\n" " for t=b:\n" "\t Pz_[Pi_]=t;\n" "\t Pi_:=Pi_+1;\n" " endfor;\n" " Plft_:=min(a,Pz_2); Plow_:=min(Pz_1,Pz_3);\n" " Prt_:=max(a,Pz_2); Pup_:=max(Pz_1,Pz_3);\n" " fi;\n" " PmakeBB_;\n" "enddef;\n" "\n" "def beginpattern(suffix name)=\n" " numeric PXStep_, PYStep_;\n" " numeric Plow_, Plft_, Pup_, Prt_;\n" " string PBBox_;\n" " Pmatrix_:=\"[1 0 0 1 0 0]\";\n" " Pname_:=str name;\n" " Pnum_:=Pnum_+1;\n" " beginfig(Pnum_+4000);\n" "enddef;\n" "\n" "def endpattern=\n" " if unknown PBBox_:\n" " Pfindbounds_;\n" " fi;\n" " endfig;\n" " Psteps_;\n" " PmakePattern_(Pname_);\n" " scantokens(Pname_ & \"=Pnum_;\");\n" "enddef;\n" "\n" "picture pattpict;\n" "color patterncolor_;\n" "patterncolor_ := black;\n" "\n" "primarydef p withpattern s=\n" " if known s:\n" "\n" " hide(pattpict := image(draw (0,0)--(10,10));\n" " for i within pattpict:\n" " patterncolor_ := (redpart i, greenpart i, bluepart i);\n" " endfor;)\n" "\n" " p withcolor (epsilon, 10*epsilon, s*epsilon)\n" " if known mpversion:\n" " if scantokens(mpversion)>=1.000: \n" " withprescript(decimal redpart patterncolor_ & \" \" &\n" " decimal greenpart patterncolor_ & \" \" &\n" " decimal bluepart patterncolor_ & \" THsetpatterncolor\")\n" " fi;\n" " fi;\n" " else:\n" " p withcolor (1,0,0);\n" " message(\"Warning: undefined pattern ignored\");\n" " fi; \n" "enddef;\n" " \n" "def patterntransform expr t=\n" " Pmatrix_ := \"[\" & decimal xxpart t\n" " & \" \" & decimal yxpart t\n" " & \" \" & decimal xypart t\n" " & \" \" & decimal yypart t\n" " & \" \" & decimal xpart t\n" " & \" \" & decimal ypart t & \"]\";\n" "enddef;\n" "\n" "def patternxstep expr t=\n" " PXStep_ = t;\n" "enddef;\n" "\n" "def patternystep expr t=\n" " PYStep_ = t;\n" "enddef;\n" "\n" "def patternstep text t=\n" " if pair t:\n" " PXStep_ = xpart t;\n" " PYStep_ = ypart t;\n" " else:\n" " (PXStep_,PYStep_)=t;\n" " fi;\n" "enddef;\n" "\n" "def patterncolor expr t=\n" " message(\"Warning: patterncolor not supported in Therion\");\n" "enddef;\n" "\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "% end of pattern macros\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "\n" "% transparent rgb colors\n" "\n" "numeric RGBnum; RGBnum=0;\n" "string RGBname;\n" "\n" "def def_transparent_rgb (suffix name)(expr r, g, b) =\n" " RGBnum := RGBnum+1;\n" " RGBname := str name;\n" " write decimal (RGBnum*epsilon) & \":\"\n" " & decimal r & \" \"\n" " & decimal g & \" \"\n" " & decimal b \n" " to \"rgbcolors.dat\";\n" " scantokens(RGBname & \":=RGBnum;\");\n" "enddef;\n" "\n" "primarydef p withtransparentcolor s=\n" " p withcolor (epsilon, 12*epsilon, s*epsilon);\n" "enddef;\n" "\n" "def_transparent_rgb(tr_white, 1, 1, 1);\n" "def_transparent_rgb(tr_blue, 0, 0, 1);\n" "def_transparent_rgb(tr_black, 0, 0, 0);\n" "def_transparent_rgb(tr_bg, \n" " redpart background, greenpart background, bluepart background);\n" "\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "% some useful macros from H. Hagen's MetaFun package\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "\n" "vardef paired (expr d) =\n" " if pair d : d else : (d,d) fi\n" "enddef ;\n" "\n" "primarydef p randomshifted s = \n" " begingroup ; save ss ; pair ss ; ss := paired(s) ; \n" " p shifted (-.5xpart ss + uniformdeviate xpart ss,\n" " -.5ypart ss + uniformdeviate ypart ss) \n" " endgroup \n" "enddef ; \n" "\n" "primarydef p randomized s =\n" " (if path p : \n" " for i=0 upto length(p)-1 :\n" " ((point i of p) randomshifted s) .. controls \n" " ((postcontrol i of p) randomshifted s) and \n" " ((precontrol (i+1) of p) randomshifted s) .. \n" " endfor \n" " if cycle p : \n" " cycle \n" " else :\n" " ((point length(p) of p) randomshifted s) \n" " fi\n" " elseif pair p :\n" " p randomshifted s \n" " elseif color p :\n" " if color s : \n" " (uniformdeviate redpart s * redpart p,\n" " uniformdeviate greenpart s * greenpart p,\n" " uniformdeviate bluepart s * bluepart p) \n" " elseif pair s : \n" " ((xpart s + uniformdeviate (ypart s - xpart s)) * p) \n" " else : \n" " (uniformdeviate s * p) \n" " fi \n" " else :\n" " p + uniformdeviate s \n" " fi) \n" "enddef ; \n" "\n" "primarydef p llmoved d =\n" " ((llcorner p) shifted (-xpart paired(d),-ypart paired(d)))\n" "enddef ;\n" "\n" "primarydef p lrmoved d =\n" " ((lrcorner p) shifted (+xpart paired(d),-ypart paired(d)))\n" "enddef ;\n" "\n" "primarydef p urmoved d =\n" " ((urcorner p) shifted (+xpart paired(d),+ypart paired(d)))\n" "enddef ;\n" "\n" "primarydef p ulmoved d =\n" " ((ulcorner p) shifted (-xpart paired(d),+ypart paired(d)))\n" "enddef ;\n" "\n" "primarydef p smoothed d =\n" " (p llmoved (-xpart paired(d),0) -- p lrmoved (-xpart paired(d),0) {right} .. \n" " p lrmoved (0,-ypart paired(d)) -- p urmoved (0,-ypart paired(d)) {up} .. \n" " p urmoved (-xpart paired(d),0) -- p ulmoved (-xpart paired(d),0) {left} ..\n" " p ulmoved (0,-ypart paired(d)) -- p llmoved (0,-ypart paired(d)) {down} .. cycle) \n" "enddef ;\n" "\n" "vardef punked primary p = \n" " (point 0 of p for i=1 upto length(p)-1 : -- point i of p endfor \n" " if cycle p : -- cycle else : -- point length(p) of p fi) \n" "enddef ; \n" "\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "% end of MetaFun macros\n" "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" "\n" "% we input map symbol definitions\n" "\n" "\n\n\n%%%%% INPUT thPoint %%%%%\n\n\n" "%% therion source code\n" "%%\n" "%% This file defines macros for point map symbols\n" "%%\n" "%% $Date: 2003/07/01 09:06:44 $\n" "%% $RCSfile: thPoint.mp,v $\n" "%% $Revision: 1.8 $\n" "%%\n" "%% Copyright (C) 2000-2004 Martin Budaj\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% --------------------------------------------------------------------\n" "\n" "pair U;\n" "\n" "def p_stalactite_UIS(expr pos,theta,sc,al) =\n" " U:=(.15u, .4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,-.4u) -- (0,.15u) -- (-.15u,.4u);\n" " thdraw (0,.15u) -- (.15u,.4u);\n" "enddef;\n" "\n" "def p_stalagmite_UIS(expr pos,theta,sc,al) =\n" " U:=(.15u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,.4u) -- (0,-.15u) -- (-.15u,-.4u);\n" " thdraw (0,-.15u) -- (.15u,-.4u);\n" "enddef;\n" "\n" "def p_pillar_UIS(expr pos,theta,sc,al) =\n" " U:=(.15u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,.15u)--(0,-.15u);\n" " thdraw (-.15u,-.4u)--(0,-.15u)--(.15u,-.4u);\n" " thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u);\n" "enddef;\n" "\n" "def p_curtain_UIS(expr pos,theta,sc,al) =\n" " U:=(.15u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u);\n" " thdraw (0,.15u)--(0,0){dir 180}..(-.12u,-.11u)..{dir 0}(0,-.22u)--(0,-.4u);\n" "enddef;\n" "\n" "def p_helictite_UIS(expr pos,theta,sc,al) =\n" " U:=(.2u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,.4u)--(0,-.4u);\n" " p := (-.2u,.4u)---(-.2u,.1u){down}..{dir -10}(-.1u,0.02u)---origin;\n" " thdraw p;\n" " thdraw p reflectedabout (origin,(0,u)) reflectedabout (origin,(u,0));\n" "enddef;\n" "\n" "def p_sodastraw_UIS(expr pos,theta,sc,al) =\n" " U:=(.5u,.25u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,.2u)--(.5u,.2u);\n" " pickup PenD;\n" " thdraw (-.4u,.2u)--(-.4u,0);\n" " thdraw (-.12u,.2u)--(-.12u,-.25u);\n" " thdraw (.02u,.2u)--(.02u,-.1u);\n" " thdraw (.23u,.2u)--(.23u,-.19u);\n" " thdraw (.35u,.2u)--(.35u,-.15u);\n" "enddef;\n" "\n" "def p_crystal_UIS (expr pos,theta,sc,al)=\n" " U:=(.35u,.35u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p := ((-.35*u,0)--(.35*u,0));\n" " thdraw p;\n" " thdraw p rotated (60);\n" " thdraw p rotated (120);\n" "enddef;\n" "\n" "def p_flowstone_UIS (expr pos,theta,sc,al)=\n" " U:=(.45u,.1u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p := ((-.15*u,0)--(.15*u,0));\n" " thdraw p shifted (.3u,-.1u);\n" " thdraw p shifted (-.3u,-.1u);\n" " thdraw p shifted (0,.1u);\n" "enddef;\n" "\n" "def p_moonmilk_UIS (expr pos,theta,sc,al)=\n" " U:=(.5u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,-.2u){up}..{dir -60}(-.18u,-.105u){dir 80}..\n" " {dir-80}(.18u,-.105u){dir 60}..{down}(.5u,-.2u);\n" "enddef;\n" "\n" "def p_wallcalcite_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.2u,-.2u)--(0,.1u)--(.2u,-.2u);\n" "enddef;\n" "\n" "def p_popcorn_UIS (expr pos,theta,sc,al)=\n" " U:=(.5u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,-.2u)--(.5u,-.2u);\n" " pickup PenD;\n" " thdraw (-.3u,-.2u)--(-.3u,.1u);\n" " thdraw (0,-.2u)--(0,.1u);\n" " thdraw (.3u,-.2u)--(.3u,.1u);\n" " thfill fullcircle scaled .2u shifted (-.3u,.1u);\n" " thfill fullcircle scaled .2u shifted (0,.1u);\n" " thfill fullcircle scaled .2u shifted (.3u,.1u);\n" "enddef;\n" "\n" "def p_disk_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.2u,-.3u)--origin--(.2u,-.3u);\n" " p:=fullcircle scaled .3u shifted (0,.15u);\n" " thclean p;\n" " thdraw p;\n" "enddef;\n" "\n" "def p_gypsum_NSS (expr pos,theta,sc,al)=\n" " U:=(.25u,.25u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.25u,0)--(.25u,0);\n" " thdraw (0,-.25u)--(0,.25u);\n" "enddef;\n" "\n" "def p_aragonite_NSS (expr pos,theta,sc,al)=\n" " U:=(.3u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,-.4u)--(0,.3u);\n" " thdraw (0,-.1u){dir 40}..{dir 5}(.3u,.08u);\n" " thdraw (0,-.1u){dir 140}..{dir 175}(-.3u,.08u);\n" " thdraw (0,.2u){dir 30}..{dir 5}(.25u,.3u);\n" " thdraw (0,.2u){dir 150}..{dir 175}(-.25u,.3u);\n" "enddef;\n" "\n" "\n" "def p_cavepearl_SKBB (expr pos,theta,sc,al)=\n" " U:=(.25u,.25u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:=fullcircle scaled .25u shifted (0,.16u);\n" " thdraw p;\n" " thdraw p rotated 120;\n" " thdraw p rotated 240;\n" "enddef;\n" "\n" "def p_gypsumflower_NSS (expr pos,theta,sc,al)=\n" " U:=(.4u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" "% thdraw (.2u,0){left}..(0,.2u)..(.25u,.35u)..(.5u,0)..\n" "% (.1u,-.3u)..{dir 125}(-.5u,.2u);\n" " thdraw (.18u,0){left}..(0,.15u)..(.2u,.3u)..(.4u,0)..\n" " (.15u,-.28u)..{dir 120}(-.4u,.15u);\n" "enddef;\n" "\n" "def p_rimstonepool_ASF (expr pos,theta,sc,al)=\n" " U:=(.4u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p := (-.4u,.2u){dir -70}..{dir 70}(.4u,.2u);\n" " thfill buildcycle(p,((.5u,.1u)--(-.5u,.1u)));\n" " thdraw p;\n" "enddef;\n" "\n" "def p_rimstonedam_ASF (expr pos,theta,sc,al)=\n" " U:=(.4u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.4u,.2u){dir -70}..{dir 70}(.4u,.2u);\n" "enddef;\n" "\n" "def p_anastomosis_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:=(-.4u,-.2u)--(-.3u,-.3u)--(0,.3u)--(.1u,.2u);\n" " thdraw p;\n" " thdraw p shifted (.3u,0);\n" "enddef;\n" "\n" "def p_karren_UIS (expr pos,theta,sc,al)=\n" " U:=(.5u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,-.3u){dir -85}..{dir 85}(-.32u,-.3u)..(-.28u,.3u){dir 85}..\n" " {dir -85}(-.12u,.3u)..(-.08u,-.3u){dir-85}..{dir 85}(.08u,-.3u)..\n" " {dir85}(.12u,.3u)..(.28u,.3u){dir -85}..(.32u,-.3u){dir -85}..\n" " {dir 85}(.5u,-.3u);\n" "enddef;\n" "\n" "def p_scallop_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,-.4u){dir 125}..{dir 105}(-.2u,.1u){up}..\n" " {down}(.2u,.1u){dir -105}...{dir -125}(0,-.4u);\n" "enddef;\n" "\n" "def p_flute_UIS (expr pos,theta,sc,al)=\n" " U:=(.5u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,.2u)--(.5u,.2u);\n" " thdraw (-.3u,.2u){dir -70}..{dir 70}(.3u,.2u);\n" "enddef;\n" "\n" "def p_raft_NSS (expr pos,theta,sc,al)=\n" " U:=(.5u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,.2u){dir -80}..(-.3u,-.2u)..origin..(.3u,.2u)..\n" " {dir -80}(.5u,-.2u);\n" "enddef;\n" "\n" "def p_raftcone_NSS (expr pos,theta,sc,al)=\n" " U:=(.3u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,-.4u)--(0,.4u)--(.3u,-.4u);\n" "enddef;\n" "\n" "def p_spring_SKBB (expr pos,theta,sc,al)=\n" " U:=(.3u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,.2u){down}..(0,-.2u)..{up}(.3u,.2u);\n" "enddef;\n" "\n" "def p_sink_SKBB (expr pos,theta,sc,al)=\n" " U:=(.3u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,-.2u){up}..(0,.2u)..{down}(.3u,-.2u);\n" "enddef;\n" "\n" "def p_narrowend_UIS (expr pos,theta,sc,al)=\n" " U:=(.1u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.1u,-.4u)--(-.1u,.4u);\n" " thdraw (.1u,-.4u)--(.1u,.4u);\n" "enddef;\n" "\n" "def p_lowend_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.1u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.4u,-.1u)--(.4u,-.1u);\n" " thdraw (-.4u,.1u)--(.4u,.1u);\n" "enddef;\n" "\n" "def p_lowend_NSS (expr pos,theta,sc,al)=\n" " U:=(.4u,0);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.4u,0)--(.4u,0);\n" "enddef;\n" "\n" "def p_flowstonechoke_NSS (expr pos,theta,sc,al)=\n" " U:=(.4u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:=(-.4u,-.4u){right}..{dir120}(-.2u,-.2u){dir -20}..{up}(0,0);\n" " thdraw p;\n" " thdraw p shifted (0,.2u);\n" " thdraw p reflectedabout (origin,down);\n" " thdraw p reflectedabout (origin,down) shifted (0,.2u);\n" "enddef;\n" "\n" "def p_breakdownchoke_NSS (expr pos,theta,sc,al)=\n" " U:=(.5u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,-.1u)--(-.15u,.05u)--(-.48u,.2u)--cycle;\n" " thdraw (-.2u,-.2u)--(.15u,-.18u)--(-.08u,.14u)--cycle;\n" " thdraw (.1u,0)--(.4u,-.1u)--(.5u,.2u)--(.1u,.2u)--cycle;\n" "enddef;\n" "\n" "def p_bedrock_ASF (expr pos,theta,sc,al)=\n" " U:=(.5u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,0)--(.5u,0);\n" " thdraw (-.3u,0)--(-.3u,.2u);\n" " thdraw (.3u,0)--(.3u,-.2u);\n" "enddef;\n" "\n" "def p_sand_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenB;\n" " thdraw (0,.2u);\n" " thdraw (0,.2u) rotated 120;\n" " thdraw (0,.2u) rotated 240;\n" "enddef;\n" "\n" "def p_clay_SKBB (expr pos,theta,sc,al) =\n" " U:=(.3u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,0){up}..origin{down}..{up}(0.3u,0);\n" "enddef;\n" "\n" "def p_pebbles_UIS (expr pos,theta,sc,al)=\n" " U:=(.45u,.35u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:=superellipse((.2u,0),(0,.1u),(-.2u,0),(0,.-.1u),.75);\n" " thdraw p rotated 20 shifted (0,.25u);\n" " thdraw p rotated -37 shifted (.25u,-.25u);\n" " thdraw p rotated -62 shifted (-.25u,-.25u);\n" "enddef;\n" "\n" "def p_debris_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,-.4u)--(0,-.22u)--(-.4u,-.1u)--cycle;\n" " thdraw (.2u,-.4u)--(.4u,-.1u)--(.1u,-.1u)--cycle;\n" " thdraw (-.1u,0)--(.2u,.3u)--(-.2u,.3u)--cycle;\n" "enddef;\n" "\n" "def p_blocks_UIS (expr pos,theta,sc,al)=\n" " U:=(.5u,.5u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.5u,-.5u)--(.3u,-.4u)--(-.17u,.2u)--cycle;\n" " thdraw (.25u,-.25u)--(.5u,-.15u)--(.3u,.5u)--(-.1u,.5u)--cycle;\n" " thdraw (-.27u,0)--(-.1u,.3u)--(-.5u,.35u)--cycle;\n" " pickup PenD;\n" " thdraw (-.5u,-.5u)--(-.1u,-.2u)--(-.17u,.2u);\n" " thdraw (-.1u,-.2u)--(.3u,-.4u);\n" " thdraw (.25u,-.25u)--(.3u,0)--(.2u,.2u)--(-.1u,.5u);\n" " thdraw (.3u,.5u)--(.2u,.2u);\n" " thdraw (.5u,-.15u)--(.3u,0);\n" "enddef;\n" "\n" "def p_water_UIS (expr pos,theta,sc,al)=\n" " U:=(.425u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenD;\n" " p:=fullcircle xscaled (.85u) yscaled (.6u);\n" " thfill p withpattern pattern_water_UIS;\n" " thdraw p;\n" "enddef;\n" "\n" "def p_ice_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.35u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p := (0,.05u)--(0,.35u);\n" " thdraw p;\n" " thdraw p shifted (-.25u,-.3u);\n" " thdraw p shifted (.25u,-.3u);\n" " p := (-0.15u,.2u)--(0.15u,.2u);\n" " thdraw p;\n" " thdraw p shifted (-.25u,-.3u);\n" " thdraw p shifted (.25u,-.3u);\n" "enddef;\n" "\n" "def p_snow_SKBB (expr pos,theta,sc,al)=\n" " U:=(.35u,.35u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p := origin--(0,.25*u);\n" " q := ((0,.35u)--(0,0.25u)--(0.1u,0.25u)) rotatedaround ((0,0.25u),45);\n" " thdraw p;\n" " thdraw p rotated (60);\n" " thdraw p rotated (120);\n" " thdraw p rotated (180);\n" " thdraw p rotated (240);\n" " thdraw p rotated (300);\n" " thdraw q;\n" " thdraw q rotated (60);\n" " thdraw q rotated (120);\n" " thdraw q rotated (180);\n" " thdraw q rotated (240);\n" " thdraw q rotated (300);\n" "enddef;\n" "\n" "\n" "def p_archeomaterial_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p := fullcircle scaled .8u; \n" " thdraw (-.5u,-.5u)--origin cutbefore p;\n" " thdraw (-.5u,.5u)--origin cutbefore p;\n" " thdraw origin--(.4u,0);\n" " thdraw p;\n" "enddef;\n" "\n" "def p_paleomaterial_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thfill (-.4u,-.2u)..(-.2u,-.08u)---(-.1u,.05u)---(0,.2u)..(-.03u,.4u)..\n" " (.2u,.3u)..(.35u,.25u)..(.2u,.2u)---origin---(-.1u,-.17u)..\n" " (-.08u,-.25u){dir -120}..(-.3u,-.23u)\n" " ..cycle;\n" "enddef;\n" "\n" "def p_guano_UIS (expr pos,theta,sc,al)=\n" " U:=(.4u,.35u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.4u,.2u){dir 40}..{down}(0,-.35u){up}..{dir-40}(.4u,.2u);\n" "enddef;\n" "\n" "def p_vegetabledebris_ASF (expr pos,theta,sc,al)=\n" " U:=(.38u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,-.3u)--(0,.3u);\n" " thdraw (0,-.3u)--(.3u,.3u);\n" " thdraw (-.25u,.13u)--(.38u,.13u);\n" " thdraw (-.38u,-.13u)--(.25u,-.13u);\n" "enddef;\n" "\n" "def p_root_ASF (expr pos,theta,sc,al)=\n" " U:=(.1u,.5u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.1u,-.5u)--(-.1u,.5u);\n" " p:=(-.1u,-.3u)--(.1u,-.5u);\n" " thdraw p;\n" " thdraw p shifted (0,.2u);\n" " thdraw p shifted (0,.4u);\n" "enddef;\n" "\n" "def p_entrance_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,.5u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thfill (-.2u,-.5u)--(0,.5u)--(.2u,-.5u)--cycle;\n" "enddef;\n" "\n" "def p_waterflow_paleo_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,-u)--(0,u);\n" " thdraw halfcircle scaled .4u shifted (0,-.4u);\n" " p:=(-.15u,.6u)--(0,u)--(.15u,.6u)--cycle;\n" " thfill p;\n" " thdraw p;\n" "enddef;\n" "\n" "def p_gradient_UIS (expr pos,theta,sc,al)=\n" " U:=(.15u,u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,-u)--(0,u);\n" " p:=(-.15u,.6u)--(0,u)--(.15u,.6u)--cycle;\n" " thfill p;\n" " thdraw p;\n" "enddef;\n" "\n" "def p_gradient_BCRA (expr pos,theta,sc,al)=\n" " U:=(.25u,0.7u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thfill (-.25u,-0.7u)--(0,.7u)--(.25u,-.7u)--cycle;\n" "enddef;\n" "\n" "% by Philip Schuchardt\n" "def p_gradient_NSS (expr pos,theta,sc,al) =\n" " U:=(.7u, .6u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" "\n" " thdraw (-.3u, -.5u) -- (-.7u, -.2u);\n" " thdraw (-.2u, -.4u) -- (-.4u, .3u);\n" " thdraw (0u, -.3u) -- (0u, .6u);\n" " thdraw (.3u, -.5u) -- (.7u, -.2u);\n" " thdraw (.2u, -.4u) -- (.4u, .3u);\n" "enddef;\n" "\n" "def p_waterflow_permanent_UIS (expr pos,theta,sc,al)=\n" " U:=(.15u,.5u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:=(0,.5u){down}..(.12u,.3u)..(-.15u,.15u)..(.13u,0)..\n" " (-.08u,-.2u)..{down}(0,-.5u);\n" " p:=p rotated 180;\n" " thdraw p;\n" " thdrawoptions();\n" " oldahlength:=ahlength; ahlength:=2.5pt*optical_zoom;\n" " thdraw arrowhead p;\n" " thfill arrowhead p;\n" " ahlength:=oldahlength;\n" "enddef;\n" "\n" "def p_waterflow_intermittent_UIS (expr pos,theta,sc,al)=\n" " thdrawoptions(dashed evenly scaled (.5 * optical_zoom));\n" " p_waterflow_permanent_UIS (pos,theta,sc,al);\n" " thdrawoptions();\n" "enddef;\n" "\n" "def p_airdraught_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,u);\n" " T:=identity aligned al rotated theta scaled 1 shifted pos;\n" " pickup PenC;\n" " thdraw (0,u)--(0,-0.8u);\n" "\tp:=(-.2u,.65u){dir 20}..{dir 90}(0,u);\n" "\tthdraw p;\n" "\tthdraw p reflectedabout (origin,(0,u));\n" "\tfor i:=1 upto round(3+2*mlog(sc)/mlog 2):\n" "\t thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u);\n" "\tendfor;\n" "enddef;\n" "\n" "def p_airdraught_winter_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,u);\n" " T:=identity aligned al rotated theta scaled 1 shifted pos;\n" " pickup PenC;\n" " thdraw (0,u)--(0,-0.8u);\n" " p:=(-.2u,.65u){dir 20}..{dir 90}(0,u);\n" " thdraw p;\n" " thdraw p reflectedabout (origin,(0,u));\n" " for i:=1 upto round(3+2*mlog(sc)/mlog 2):\n" " thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u);\n" " endfor;\n" " thclean fullcircle scaled 0.6u shifted (0,0.05u);\n" " thdraw (-0.1732u,-0.05u) -- (0.1732u,0.15u);\n" " thdraw (0.1732u,-0.05u) -- (-0.1732u,0.15u);\n" " thdraw (0,-0.15u) -- (0,0.25u);\n" "enddef;\n" "\n" "def p_airdraught_summer_UIS (expr pos,theta,sc,al)=\n" " U:=(.2u,u);\n" " T:=identity aligned al rotated theta scaled 1 shifted pos;\n" " pickup PenC;\n" " thdraw (0,u)--(0,-0.8u);\n" " p:=(-.2u,.65u){dir 20}..{dir 90}(0,u);\n" " thdraw p;\n" " thdraw p reflectedabout (origin,(0,u));\n" " for i:=1 upto round(3+2*mlog(sc)/mlog 2):\n" " thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u);\n" " endfor;\n" " thclean fullcircle scaled 0.6u shifted (0,0.05u);\n" " thdraw (-0.1732u,-0.05u) -- (0.1732u,0.15u);\n" " thdraw (0.1732u,-0.05u) -- (-0.1732u,0.15u);\n" " thdraw (0,-0.15u) -- (0,0.25u);\n" " thclean fullcircle scaled 0.3u shifted (0,0.05u);\n" " thdraw fullcircle scaled 0.2u shifted (0,0.05u);\n" "enddef;\n" "\n" "\n" "def p_station_fixed_ASF (expr pos)=\n" " T:=identity shifted pos;\n" " pickup PenD;\n" " pair z;\n" " z:=(0,.2u);\n" " thclean z -- (z rotated 120) -- (z rotated 240) -- cycle;\n" " thdraw z -- (z rotated 120) -- (z rotated 240) -- cycle;\n" " thdraw origin;\n" "enddef;\n" "\n" "def p_station_painted_SKBB (expr pos)=\n" " T:=identity shifted pos;\n" " pickup PenC;\n" " thclean fullcircle scaled 0.25u;\n" " thdraw fullcircle scaled 0.25u;\n" "enddef;\n" "\n" "def p_station_natural_ASF (expr pos)=\n" " T:=identity shifted pos;\n" " pickup PenD;\n" " thclean fullcircle scaled .3u;\n" " thdraw fullcircle scaled .3u;\n" " thdraw origin;\n" "enddef;\n" "\n" "def p_station_temporary_ASF (expr pos)=\n" " T:=identity shifted pos;\n" " pickup PenD;\n" " p:=(-.2u,0)--(.2u,0);\n" " thdraw p;\n" " thdraw p rotated 90;\n" " thclean fullcircle scaled .16u;\n" " pickup PenC;\n" " thdraw origin;\n" "enddef;\n" "\n" "let p_station_temporary_SKBB = p_station_painted_SKBB;\n" "\n" "def p_steps_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (-.3u,.3u)--(-.3u,.1u)--(-.1u,.1u)--(-.1u,-.1u)--\n" " (.1u,-.1u)--(.1u,-.3u)--(.3u,-.3u);\n" "enddef;\n" "\n" "def p_fixedladder_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (-.15u,-.4u)--(-.15u,.4u);\n" " thdraw (.15u,-.4u)--(.15u,.4u);\n" " thdraw (-.15u,0)--(.15u,0);\n" " thdraw (-.15u,.2u)--(.15u,.2u);\n" " thdraw (-.15u,-.2u)--(.15u,-.2u);\n" "enddef;\n" "\n" "def p_ropeladder_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (.1u,-.4u)..(.2u,-.2u)..(.1u,.2u)..(.2u,.4u);\n" " thdraw (-.2u,-.4u)..(-.1u,-.2u)..(-.2u,.2u)..(-.1u,.4u);\n" " thdraw (-.2u,.2u)--(.1u,.2u);\n" " thdraw (-.15u,0)--(.15u,0);\n" " thdraw (-.1u,-.2u)--(.2u,-.2u);\n" "enddef;\n" "\n" "def p_bridge_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (-.3u,.2u)--(-.2u,.1u)--(.2u,.1u)--(.3u,.2u);\n" " thdraw (-.3u,-.2u)--(-.2u,-.1u)--(.2u,-.1u)--(.3u,-.2u);\n" "enddef;\n" "\n" "def p_noequipment_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " thfill (0,-.1u)--(-.05u,.3u)--(.05u,.3u)--cycle;\n" " thdraw (0,-.2u) withpen PenX;\n" "enddef;\n" "\n" "def p_anchor_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " thdraw fullcircle scaled .2u shifted (0.2u,0) withpen PenC;\n" " begingroup;\n" " interim linecap:=butt;\n" " thdraw (-.3u,0)--(.1u,0) withpen PenA;\n" " endgroup;\n" " thdraw (.1u,-.4u)--(.1u,.4u) withpen PenD;\n" "enddef;\n" "\n" "def p_traverse_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (-.25u,.05u)..(0,-.08u)..(.25u,.05u);\n" " pickup pencircle scaled .18u;\n" " thdraw (-.25u,.05u);\n" " thdraw (.25u,.05u);\n" "enddef;\n" "\n" "def p_rope_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (-.2u,.2u)..origin..(.1u,.1u)--(.1u,-.4u);\n" " pickup pencircle scaled .18u;\n" " thdraw (-.2u,.2u);\n" " thdraw (.1u,.1u);\n" "enddef;\n" "\n" "def p_camp_SKBB (expr pos,r,s,al) = \n" " U:=(.4u, .5u);\n" " T:=identity aligned al shifted pos;\n" " pickup PenC;\n" " thdraw (-.4u,-.4u)--(0,.5u)--(.4u,-.4u)--cycle;\n" " pickup PenD;\n" " thdraw (0,-.4u)--(0,.5u);\n" "enddef;\n" "\n" "\n" "def p_dig_UIS (expr pos,r,s,al) = \n" " U:=(.4u, .5u);\n" " T:=identity aligned al shifted pos;\n" " thfill ((-.075u,-.5u){down} .. {up}(0.075u, -.5u) -- (0.075u, .15u) -- (0.3u, 0.15u) -- (0.3u, 0.5u) --\n" " (-.3u, .5u) -- (-.3u, .15u) -- (-.075u, .15u) -- cycle) rotated 45;\n" "enddef;\n" "\n" "def p_continuation_UIS(expr pos,theta,sc,al) =\n" " U:=(.15u,.3u);\n" " T:=identity aligned al shifted pos;\n" " pickup PenC;\n" " thdraw (-.1u,.2u){up}..{down}(.1u,.2u)..{down}(0,-.05u);\n" " pickup PenX;\n" " thdraw (0,-.2u);\n" "enddef;\n" "\n" "def p_station_SKBB(expr pos,mark,txt)(text flags) =\n" " T:=identity shifted pos;\n" "\n" " if mark=4: p_station_fixed(pos)\n" " elseif mark=3: p_station_natural(pos)\n" " elseif mark=2: p_station_painted(pos)\n" " elseif mark=1: p_station_temporary(pos)\n" " fi;\n" " \n" " path path_cave;\n" " path_cave = (-.3u,-.25u) -- (-.2u,-.25u){dir 135} .. (0, .25u) .. {dir 225}(.2u,-.25u) -- (.3u,-.25u);\n" " for i=flags:\n" " pickup PenX;\n" " if i=\"entrance\":\n" "% thfill fullcircle scaled 1 cm withtransparentcolor tr_blue;\n" " thdraw path_cave;\n" "% p_label.urt(txt,pos+(0.4u,0),0,0);\n" " if not numeric txt:\n" " p_smartlabel(txt,pos);\n" " fi;\n" " elseif i=\"sink\":\n" " thdraw path_cave cutbefore ((-u,0)--(u,0)) cutafter ((-u,0)--(u,0));\n" " pickup PenA;\n" " thdraw (0,-.45u) -- (0,.05u) withcolor blue;\n" " thdraw (-.15u,-.02u) -- (0,.05u) -- (.15u,-.02u) withcolor blue;\n" " elseif i=\"spring\":\n" " thdraw path_cave cutbefore ((-u,0)--(u,0)) cutafter ((-u,0)--(u,0));\n" " pickup PenA;\n" " thdraw (0,-.45u) -- (0,.05u) withcolor blue;\n" " thdraw (-.15u,-.38u) -- (0,-.45u) -- (.15u,-.38u) withcolor blue;\n" " elseif i=\"doline\":\n" " thdraw (-.5u,.05u){down}..(0,-0.6u)..{up}(.5u,.05u);\n" " elseif i=\"dig\":\n" " thdraw (-.5u,.25u) -- (-.35u,.25u)--(-.23u,-.25u)--(.23u,-.25u)--(.35u,.25u)--(.5u,.25u);\n" " elseif substring(0,11) of i = \"air-draught\":\n" " pickup PenB;\n" " thdraw ((0,.11u){dir-120} ..{dir-70}(0,0) .. {dir-120}(0,-.11u));\n" " thdraw ((0,.11u){dir-120} ..{dir-70}(0,0) .. {dir-120}(0,-.11u)) shifted (.11u,0);\n" " thdraw ((0,.11u){dir-120} ..{dir-70}(0,0) .. {dir-120}(0,-.11u)) shifted (-.11u,0);\n" " elseif i=\"continuation\":\n" " if picture(txt):\n" " picture ATTR__text;\n" " ATTR__text := txt;\n" " fi;\n" " begingroup;\n" " save T; transform T;\n" " p_continuation(pos+(0,.25u),0,1,(0,1));\n" " endgroup;\n" " if picture(txt):\n" " save ATTR__text;\n" " fi;\n" " elseif i=\"arch\":\n" " thdraw (-.5u,-.25u)--(-.5u,.25u)--(.5u,.25u)--(.5u,-.25u)..(0,.2u)..cycle;\n" " thfill (-.5u,-.25u)--(-.5u,.25u)--(.5u,.25u)--(.5u,-.25u)..(0,.2u)..cycle;\n" " elseif i=\"overhang\":\n" " thdraw (.2u,-.25u)--(-.2u,-.25u){up}..{right}(.2u,.25u);\n" " fi;\n" " endfor;\n" "% thdraw (0,0) withpen PenX withcolor red;\n" "enddef;\n" "\n" "def p_debug (expr col, pen, pos)=\n" " T:=identity shifted pos;\n" " thdraw origin withpen pencircle \n" " scaled if pen=0: 2pt \n" " else: 4pt fi \n" " withcolor if col=-2: (1,.85,0)\n" " elseif col=-1: black \n" " elseif col=0: red \n" " else: blue fi;\n" "enddef;\n" "\n" "\n" "def p_u(expr pos,theta,sc,al) =\n" " T:=identity shifted pos;\n" " thdraw origin withpen pencircle scaled 4pt withcolor red;\n" "enddef;\n" "\n" "def p_handrail_SKBB(expr pos,theta,sc,al) =\n" " tmph := 1 / Scale * 72 / 2.54; % 1 m height\n" " U:=(.1u, tmph);\n" " pickup PenC;\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thdraw (0,0) -- (0,tmph);\n" " thdraw (0,tmph) withpen pencircle scaled .25u; \n" "enddef;\n" "\n" "def p_viaferrata_SKBB(expr pos,r,s,al) = \n" " U:=(.4u, .4u);\n" " T:=identity aligned al shifted pos;\n" " thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD;\n" " pickup PenC;\n" " thdraw (-.15u,.15u)--(-.15u,.1u)--(.15u,.1u)--(.15u,.15u);\n" " thdraw (-.15u,-.05u)--(-.15u,-.1u)--(.15u,-.1u)--(.15u,-.05u);\n" "enddef;\n" "\n" "def p_stalagmites_UIS(expr pos,theta,sc,al) =\n" " U:=(.3u, .2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " for i=-1 upto 1:\n" " T:=identity aligned al rotated theta scaled (sc * 0.7) shifted (pos + (i * .3u, 0));\n" " thdraw (0,.4u) -- (0,-.15u) -- (-.15u,-.4u);\n" " thdraw (0,-.15u) -- (.15u,-.4u);\n" " endfor;\n" "enddef;\n" "\n" "def p_stalactites_UIS(expr pos,theta,sc,al) =\n" " U:=(.3u, .2u);\n" " pickup PenC;\n" " for i=-1 upto 1:\n" " T:=identity aligned al rotated theta scaled (sc * 0.7) shifted (pos + (i * .3u, 0));\n" " thdraw (0,-.4u) -- (0,.15u) -- (-.15u,.4u);\n" " thdraw (0,.15u) -- (.15u,.4u);\n" " endfor;\n" "enddef;\n" "\n" "def p_gradient_SKBB (expr pos,theta,sc,al)=\n" " U:=(.3u,.6u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,-.6u)--(-.3u,.6u);\n" " thdraw (0,-.6u)--(0,-0.2u);\n" " thdraw (.3u,-.6u)--(.3u,.6u);\n" "enddef;\n" "\n" "def p_pillars_UIS(expr pos,theta,sc,al) =\n" " U:=(.3u, .2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " for i=-1 upto 1:\n" " T:=identity aligned al rotated theta scaled (sc * 0.7) shifted (pos + (i * .3u, 0));\n" " thdraw (0,.15u)--(0,-.15u);\n" " thdraw (-.15u,-.4u)--(0,-.15u)--(.15u,-.4u);\n" " thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u);\n" " endfor;\n" "enddef;\n" "\n" "\n" "\n\n\n%%%%% ENDINPUT thPoint %%%%%\n\n\n" "\n\n\n%%%%% INPUT thLine %%%%%\n\n\n" "%% therion source code\n" "%%\n" "%% This file defines macros for line symbols\n" "%%\n" "%% $Date: 2003/07/01 09:06:44 $\n" "%% $RCSfile: thLine.mp,v $\n" "%% $Revision: 1.4 $\n" "%%\n" "%% Copyright (C) 2000 Martin Budaj\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% --------------------------------------------------------------------\n" "\n" "% some definitions\n" "\n" "% adjust step according to the length of the path; return at least two steps\n" "\n" "vardef adjust_step (expr len, s) =\n" " if s <= len/2: len / (floor(len / s))\n" " else: len/2 fi\n" "enddef;\n" "\n" "def mark_(expr p,t,l) =\n" " thdraw (point t of p) --\n" " ((point t of p) + l * unitvector(thdir(p,t) rotated 90));\n" "enddef;\n" "\n" "vardef thdir (expr p,t) = % 1 * epsilon caused problems in scales < 1:1000\n" " % n * epsilon is enough for scale 1:(n*1000)\n" " if arclength(p)=0:\n" " hide(thwarning(\"unable to determine direction on zero-length path\"))\n" " (0,1)\n" " else:\n" "% ((direction t-100*epsilon of p) + (direction t+100*epsilon of p)) / 2\n" " postcontrol (t+1000*epsilon) of p - precontrol (t-1000*epsilon) of p\n" "% direction t of p\n" " fi\n" "enddef;\n" "\n" "% walls:\n" "\n" "def l_wall_bedrock_UIS (expr P) = \n" " T:=identity;\n" " pickup PenA;\n" " thdraw P;\n" "enddef;\n" "\n" "def l_wall_sand_SKBB (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.1u);\n" " pickup PenB; \n" " forever:\n" " t := arctime cas of P;\n" " thdraw ((point t of P) + (uniformdeviate 1) * .4u \n" " * unitvector(thdir(P,t) rotated -90));\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " endfor;\n" " pickup PenA; \n" " thdraw P;\n" "enddef;\n" "\n" "def l_wall_pebbles_SKBB (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .35u);\n" " pickup PenC;\n" " q:=superellipse((.2u,0),(0,.1u),(-.2u,0),(0,.-.1u),.75);\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " thdraw q randomized (u/20) rotated (angle(thdir(P,t)) + (normaldeviate*40)) shifted point t of P;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "def l_wall_clay_SKBB (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .5u);\n" " pickup PenC;\n" " q := (-0.15u,0){up}..{down}origin..{up}(0.15u,0);\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " thdraw q shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" " pickup PenA; \n" " thdraw P;\n" "enddef;\n" "\n" "def l_wall_debris_SKBB (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .4u);\n" " pickup PenC;\n" "% q := ((-.1u,-.15u)--(.2,.03u)--(-.2u,.15u)--cycle) scaled 1.5;\n" " q := ((-.2u,-.1u)--(.2u,-.1u)--(0,.2u)--cycle) scaled 1.1;\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " thdraw q randomized (u/10) rotated uniformdeviate (360) shifted point t of P;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "def l_wall_blocks_SKBB (expr P) = \n" "% pickup PenD;\n" "% draw P withcolor red;\n" "\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" "if dlzka > 0:\n" " mojkrok:=adjust_step(dlzka, 1.5u);\n" " pickup PenA;\n" " forever:\n" " t1 := arctime (cas + mojkrok*1/10) of P;\n" " t2 := arctime (cas + mojkrok*9/10) of P;\n" " q := ((point t1 of P) + .4u * unitvector(thdir(P,t1) rotated -90)) --\n" " (subpath (t1,t2) of P) --\n" " ((point t2 of P) + .4u * unitvector(thdir(P,t2) rotated -90));\n" " thdraw q randomized (u/6);\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "fi;\n" "enddef;\n" "\n" "def l_wall_ice_SKBB (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .5u);\n" " pickup PenC;\n" " p := (-.1u,0)--(.1u,0);\n" " q := (0,-.1u)--(0,.1u);\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " thdraw p shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " thdraw q shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" " pickup PenA; \n" " thdraw P;\n" "enddef;\n" "\n" "def l_wall_underlying_UIS (expr P) = \n" " T:=identity;\n" " pickup PenA;\n" " thdraw P dashed evenly scaled optical_zoom;\n" "enddef;\n" "\n" "def l_wall_unsurveyed_SKBB (expr P) = \n" " T:=identity;\n" " pickup PenC;\n" " thdraw P;\n" "enddef;\n" "\n" "def l_wall_presumed_UIS (expr P) = \n" " T:=identity;\n" " pickup PenA;\n" " thdraw P dashed evenly scaled (2*optical_zoom);\n" "enddef;\n" "\n" "% other line symbols\n" "\n" "def l_pit_UIS (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.25u);\n" " pickup PenD; \n" " forever:\n" " t := arctime cas of P;\n" " mark_ (P,t,0.2u);\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " endfor;\n" " pickup PenC; \n" " thdraw P;\n" "enddef;\n" "\n" "let l_floorstep_UIS = l_pit_UIS;\n" "\n" "def l_overhang_SKBB (expr P) =\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.3u);\n" " pickup PenC;\n" " t1:=0;\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " t2 := arctime (cas + mojkrok) of P;\n" " thfill (subpath (t1,t2) of P) -- \n" " ((point t of P) + .3u * unitvector(thdir(P,t) rotated 90)) -- \n" " cycle;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " t1:=t2;\n" " endfor;\n" " thdraw P;\n" "enddef;\n" "\n" "\n" "def l_chimney_UIS (expr P) = \n" " T:=identity;\n" " pickup PenC;\n" " thdraw P dashed evenly scaled optical_zoom;\n" "enddef;\n" "\n" "def l_ceilingstep_SKBB (expr P) =\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.8u);\n" " pickup PenC;\n" " forever:\n" " t1 := arctime (cas + mojkrok*1/5) of P;\n" " t := arctime (cas + mojkrok/2) of P;\n" " t2 := arctime (cas + mojkrok*4/5) of P;\n" " thdraw (subpath (t1,t2) of P);\n" " mark_ (P,t,0.2u);\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "def l_ceilingmeander_SKBB (expr P) =\n" " pair Pp;\n" " pair Pd;\n" " pair Pv;\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.8u);\n" " pickup PenC;\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " Pp := (point t of P);\n" " Pd := unitvector(thdir(P,t));\n" " Pv := Pd rotated 90;\n" " thdraw (Pp + 0.1u * Pv) --\n" " (Pp + 0.2u * Pv);\n" " thdraw (Pp + 0.2u * Pv + 0.2u * Pd) --\n" " (Pp + 0.2u * Pv - 0.2u * Pd);\n" " thdraw (Pp - 0.1u * Pv) --\n" " (Pp - 0.2u * Pv);\n" " thdraw (Pp - 0.2u * Pv + 0.2u * Pd) --\n" " (Pp - 0.2u * Pv - 0.2u * Pd);\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "\n" "%Bruce Mutton 2012.06.16 uses general code for l_ceilingmeander_SKBB defined in therion source code by Martin Budaj 5.3.9\n" "% but ticks on outside (rock) side of lines \n" "def l_ceilingmeander_UIS (expr P) =\n" " pair Pp;\n" " pair Pd;\n" " pair Pv;\n" " T:=identity;\n" " cas := 0; % cursor to step along path\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.8u); % symbol length nudged to be multiple of path length\n" " pickup PenC;\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " Pp := (point t of P);\n" " Pd := unitvector(thdir(P,t));\n" " Pv := Pd rotated 90;\n" " thdraw (Pp + 0.2u * Pv) --\n" " (Pp + 0.3u * Pv); % add 0.1u to each moves ticks outside\n" " thdraw (Pp + 0.2u * Pv + 0.2u * Pd) --\n" " (Pp + 0.2u * Pv - 0.2u * Pd); \n" " thdraw (Pp - 0.2u * Pv) --\n" " (Pp - 0.3u * Pv); % subtract 0.1u to each moves ticks outside\n" " thdraw (Pp - 0.2u * Pv + 0.2u * Pd) --\n" " (Pp - 0.2u * Pv - 0.2u * Pd); \n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "let l_ceilingmeander_NZSS = l_ceilingmeander_UIS;\n" "\n" "%Bruce Mutton 2012.06.16 uses general code for l_ceilingstep_SKBB defined in therion source code by Martin Budaj 5.3.9\n" "% but ticks on righthand (rock) side of line \n" "def l_ceilingstep_UIS (expr P) =\n" " T:=identity;\n" " cas := 0; % cursor to step along path\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.8u); % symbol length nudged to be multiple of path length\n" " pickup PenC;\n" " forever:\n" " t1 := arctime (cas + mojkrok*1/5) of P;\n" " t := arctime (cas + mojkrok/2) of P;\n" " t2 := arctime (cas + mojkrok*4/5) of P;\n" " thdraw (subpath (t1,t2) of P);\n" " mark_ (P,t,-0.2u); % change sign to -0.2u\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "let l_ceilingstep_NZSS = l_ceilingstep_UIS;\n" "\n" "%Bruce Mutton 2012.06.10 uses general code for l_pit_UIS defined in therion source code by Martin Budaj 5.3.9\n" "% dots on righthand (rock) side of line spaced 0.2u, 0.2u same as floor-step ticks\n" "def l_chimney_NZSS (expr P) = \n" "\tT:=identity;\n" "\tcas := 0; % cursor to step along path\n" "\tdlzka := arclength P;\n" "\tmojkrok:=adjust_step(dlzka, 0.25u); % symbol length nudged to be multiple of path length\n" "\tq:= (0.20u,-0.20u) -- (0.21u,-0.21u); % dot\n" "\n" "\tpickup PenC; %2nd thinnest pen\n" "\tforever:\n" "\t t := arctime cas of P;\n" "\tthdraw q rotated angle(thdir(P,t)) shifted (point t of P ); % draw dots\n" "\tcas := cas + mojkrok;\n" "\t exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" "\tendfor;\n" "\tpickup PenB; %2nd thickest pen\n" "\tthdraw P; %continuous line\n" "enddef;\n" "\n" "%Bruce Mutton 2010.06.20 uses general code and adjust_step defined in therion source code by Martin Budaj\n" "%for Therion 5.3.8\n" "def l_wall_presumed_NZSS (expr P) =\n" "\tT:=identity;\n" "\tcas := 0; % cursor to step along path\n" "\tdlzka := arclength P;\n" "\tmojkrok:=adjust_step(dlzka, 1.5u); % symbol length nudged to be multiple of path length\n" "\tq := (-0.2u,-0.4u)--(0,0)--(0.2u,-0.4u); % define v shape \n" "\tforever:\n" "\t t1 := arctime (cas + mojkrok*1/5) of P;\n" "\t t := arctime (cas + mojkrok/2) of P;\n" "\t t2 := arctime (cas + mojkrok*4/5) of P;\n" "\t\tpickup PenA; % thick\n" "\tthdraw (subpath (t1,t2) of P); % dash\n" "\t pickup PenC; % thin\n" "\t thdraw q rotated angle(thdir(P,t)) shifted (point t of P ); % v shape\n" "\n" "\t cas := cas + mojkrok;\n" "\t exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" "\tendfor;\n" "enddef;\n" "\n" "def l_floormeander_SKBB (expr P) =\n" " pair Pp;\n" " pair Pd;\n" " pair Pv;\n" " pair PPp;\n" " pair PPd;\n" " pair PPv;\n" "\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.25u);\n" " pickup PenC;\n" " forever:\n" " t := arctime cas of P;\n" " Pp := (point t of P);\n" " Pd := unitvector(thdir(P,t));\n" " Pv := Pd rotated 90;\n" " thdraw (Pp + 0.1u * Pv) --\n" " (Pp + 0.2u * Pv);\n" " thdraw (Pp - 0.1u * Pv) --\n" " (Pp - 0.2u * Pv);\n" " if cas > 0:\n" " thdraw (PPp + 0.2u * PPv) --\n" " (Pp + 0.2u * Pv);\n" " thdraw (PPp - 0.2u * PPv) --\n" " (Pp - 0.2u * Pv);\n" " fi;\n" " PPp := Pp;\n" " PPd := Pd;\n" " PPv := Pv;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " endfor;\n" "enddef; \n" "\n" "boolean alw_perpendicular;\n" "\n" "def l_slope_SKBB (expr P,S)(text Q) = \n" "%show Q;\n" " T:=identity;\n" " numeric dirs[];\n" " numeric lengths[];\n" " for i=Q:\n" " dirs[redpart i]:=greenpart i;\n" " lengths[redpart i]:=bluepart i;\n" " endfor; \n" "\n" "\n" " li:=length(P); % last\n" "\n" " alw_perpendicular:=true;\n" "\n" " for i=0 upto li:\n" " if unknown dirs[i]: dirs[i]:=-1; \n" " else: \n" " if dirs[i]>-1:\n" " dirs[i]:=((90-dirs[i]) - angle(thdir(P,i))) mod 360; \n" " alw_perpendicular:=false;\n" " fi;\n" " fi;\n" " if unknown lengths[i]: lengths[i]:=-1; fi;\n" " endfor;\n" "\n" "%for i=0 upto li: show dirs[i]; endfor;\n" "\n" " ni:=0; % next\n" " pi:=0; % previous\n" "\n" " for i=0 upto li:\n" " d:=dirs[i];\n" " if d=-1:\n" " if (i=0) or (i=li):\n" " dirs[i] := angle(thdir(P,i) rotated 90) mod 360;\n" "\tpi:=i;\n" " else:\n" " if ni<=i:\n" "\t for j=i upto li:\n" " ni:=j;\n" "\t exitif dirs[j]>-1;\n" "\t endfor;\n" "\tfi;\n" "\tw:=arclength(subpath(pi,i) of P) / \n" "\t arclength(subpath(pi,ni) of P);\n" "\tdirs[i]:=w[dirs[pi],dirs[ni]];\n" "% if (dirs[i]-angle(thdir(P,i))) mod 360>180:\n" "% dirs[i]:=w[dirs[ni],dirs[pi]];\n" "%\t message(\"*******\");\n" "% fi;\n" " fi;\n" " else:\n" " pi:=i;\n" " fi;\n" " endfor;\n" "\n" "%for i=0 upto li: show dirs[i]; endfor;\n" "\n" " ni:=0; % next\n" " pi:=0; % previous\n" "\n" " for i=0 upto li:\n" " l:=lengths[i];\n" " if l=-1:\n" " if (i=0) or (i=li):\n" " lengths[i] := 1cm; % should never happen!\n" "\tthwarning(\"slope width at the end point not specified\");\n" "\tpi:=i;\n" " else:\n" " if ni<=i:\n" "\t for j=i+1 upto li:\n" " ni:=j;\n" "\t exitif lengths[j]>-1;\n" "\t endfor;\n" "\tfi;\n" "\tw:=arclength(subpath(pi,i) of P) / \n" "\t arclength(subpath(pi,ni) of P);\n" "\tlengths[i]:=w[lengths[pi],lengths[ni]];\n" "\tpi:=i;\n" " fi;\n" " else:\n" " pi:=i;\n" " fi;\n" " endfor;\n" "\n" "% for i=0 upto li: show lengths[i]; endfor;\n" "\n" " T:=identity;\n" " boolean par;\n" " offset:=0;\n" " dlzka := (arclength P);\n" " if dlzka>3u: \n" " offset := 0.3u;\n" " elseif dlzka>u:\n" " offset := 0.1u;\n" " fi;\n" " dlzka:=dlzka-2offset;\n" " cas := offset;\n" " mojkrok:=adjust_step(dlzka,1.4u) / 2;\n" " pickup PenD;\n" " par := false; \n" " forever:\n" " t := arctime cas of P;\n" " if t mod 1>0: % not a key point\n" " w := (arclength(subpath(floor t,t) of P) / \n" " arclength(subpath(floor t,ceiling t) of P));\n" " if alw_perpendicular:\n" " a := 90;\n" " else:\n" " a := w[dirs[floor t],dirs[ceiling t]];\n" " fi;\n" " l := w[lengths[floor t],lengths[ceiling t]];\n" " else:\n" " if alw_perpendicular:\n" " a := 90;\n" " else:\n" " a:= dirs[t];\n" " fi; \n" " l:=lengths[t];\n" " fi;\n" " \n" " a := a + angle(thdir(P,t));\n" " \n" " thdraw (point t of P) -- \n" " ((point t of P) + if par: 0.333 * fi l * unitvector(dir(a)));\n" " cas := cas + mojkrok;\n" " par := not par;\n" " exitif cas > dlzka + offset + 0.1mm; % for rounding errors\n" " endfor;\n" " if S = 1: pickup PenC; draw P fi;\n" "%pickup pencircle scaled 3pt;\n" "%for i=0 upto li: draw point i of P; endfor;\n" "enddef;\n" "\n" "\n" "def l_slope_BCRA (expr P,S)(text Q) = \n" "%show Q;\n" " T:=identity;\n" " numeric dirs[];\n" " numeric lengths[];\n" " for i=Q:\n" " dirs[redpart i]:=greenpart i;\n" " lengths[redpart i]:=bluepart i;\n" " endfor; \n" "\n" "\n" " li:=length(P); % last\n" "\n" " alw_perpendicular:=true;\n" "\n" " for i=0 upto li:\n" " if unknown dirs[i]: dirs[i]:=-1; \n" " else: \n" " if dirs[i]>-1:\n" " dirs[i]:=((90-dirs[i]) - angle(thdir(P,i))) mod 360; \n" " alw_perpendicular:=false;\n" " fi;\n" " fi;\n" " if unknown lengths[i]: lengths[i]:=-1; fi;\n" " endfor;\n" "\n" "%for i=0 upto li: show dirs[i]; endfor;\n" "\n" " ni:=0; % next\n" " pi:=0; % previous\n" "\n" " for i=0 upto li:\n" " d:=dirs[i];\n" " if d=-1:\n" " if (i=0) or (i=li):\n" " dirs[i] := angle(thdir(P,i) rotated 90) mod 360;\n" "\tpi:=i;\n" " else:\n" " if ni<=i:\n" "\t for j=i upto li:\n" " ni:=j;\n" "\t exitif dirs[j]>-1;\n" "\t endfor;\n" "\tfi;\n" "\tw:=arclength(subpath(pi,i) of P) / \n" "\t arclength(subpath(pi,ni) of P);\n" "\tdirs[i]:=w[dirs[pi],dirs[ni]];\n" "% if (dirs[i]-angle(thdir(P,i))) mod 360>180:\n" "% dirs[i]:=w[dirs[ni],dirs[pi]];\n" "%\t message(\"*******\");\n" "% fi;\n" " fi;\n" " else:\n" " pi:=i;\n" " fi;\n" " endfor;\n" "\n" "%for i=0 upto li: show dirs[i]; endfor;\n" "\n" " ni:=0; % next\n" " pi:=0; % previous\n" "\n" " for i=0 upto li:\n" " l:=lengths[i];\n" " if l=-1:\n" " if (i=0) or (i=li):\n" " lengths[i] := 1cm; % should never happen!\n" "\tthwarning(\"slope width at the end point not specified\");\n" "\tpi:=i;\n" " else:\n" " if ni<=i:\n" "\t for j=i+1 upto li:\n" " ni:=j;\n" "\t exitif lengths[j]>-1;\n" "\t endfor;\n" "\tfi;\n" "\tw:=arclength(subpath(pi,i) of P) / \n" "\t arclength(subpath(pi,ni) of P);\n" "\tlengths[i]:=w[lengths[pi],lengths[ni]];\n" "\tpi:=i;\n" " fi;\n" " else:\n" " pi:=i;\n" " fi;\n" " endfor;\n" "\n" "% for i=0 upto li: show lengths[i]; endfor;\n" "\n" " T:=identity;\n" " boolean par;\n" " offset:=0;\n" " dlzka := (arclength P);\n" " if dlzka>3u: \n" " offset := 0.3u;\n" " elseif dlzka>u:\n" " offset := 0.1u;\n" " fi;\n" " dlzka:=dlzka-2offset;\n" " cas := offset;\n" " mojkrok:=adjust_step(dlzka,1.4u) / 2;\n" " pickup PenD;\n" " par := false; \n" " forever:\n" " t := arctime cas of P;\n" " if t mod 1>0: % not a key point\n" " w := (arclength(subpath(floor t,t) of P) / \n" " arclength(subpath(floor t,ceiling t) of P));\n" " if alw_perpendicular:\n" " a := 90;\n" " else:\n" " a := w[dirs[floor t],dirs[ceiling t]];\n" " fi;\n" " l := w[lengths[floor t],lengths[ceiling t]];\n" " else:\n" " if alw_perpendicular:\n" " a := 90;\n" " else:\n" " a:= dirs[t];\n" " fi; \n" " l:=lengths[t];\n" " fi;\n" " \n" " a := a + angle(thdir(P,t));\n" " \n" " if par:\n" " thfill (point t of P) + mojkrok/2.5 * unitvector(dir(a+90))-- \n" " ((point t of P) + l * unitvector(dir(a))) --\n" " (point t of P) + mojkrok/2.5 * unitvector(dir(a-90)) -- cycle;\n" " fi;\n" " cas := cas + mojkrok;\n" " par := not par;\n" " exitif cas > dlzka + offset + 0.1mm; % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "\n" "def l_contour_UIS(expr P)(text txt) =\n" " T:=identity;\n" " pickup PenD;\n" " thdraw P;\n" " for pnt=txt:\n" " if pnt=-2:\n" " mark_(P,arctime(arclength(P)/2) of P, 0.2u);\n" " elseif pnt>=0:\n" " mark_(P,pnt,0.2*u);\n" " fi;\n" " exitif pnt<0;\n" " endfor;\n" "enddef;\n" "\n" "def l_contour_SKBB(expr P)(text txt) =\n" " T:=identity;\n" " pickup PenD;\n" " thdraw P;\n" " for pnt=txt:\n" " if (pnt=-2) or (pnt=-1):\n" " mark_(P,arctime(arclength(P)/2) of P, 0.2u);\n" " elseif pnt>=0:\n" " mark_(P,pnt,0.2*u);\n" " fi;\n" " exitif pnt<0;\n" " endfor;\n" "enddef;\n" "\n" "def l_rockborder_UIS (expr P) = \n" " T:=identity;\n" " pickup PenC;\n" " if cycle P: thclean P fi;\n" " thdraw P;\n" "enddef;\n" "\n" "def l_rockedge_UIS (expr P) = \n" " T:=identity;\n" " pickup PenD;\n" " thdraw P;\n" "enddef;\n" "\n" "def l_border_visible_SKBB (expr Path) =\n" " T:=identity;\n" " pickup PenC;\n" " draw Path;\n" "enddef;\n" "\n" "def l_border_temporary_SKBB (expr Path) =\n" " T:=identity;\n" " pickup PenC;\n" " draw Path dashed evenly scaled optical_zoom;\n" "enddef;\n" "\n" "def l_flowstone_UIS (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .7u);\n" " if (cycle P) and (dlzka < 3.5u): % make at least 5 curls on a cyclic path\n" " mojkrok := dlzka/5;\n" " fi;\n" " pickup PenC; \n" " t1:=0;\n" " forever:\n" " t2 := arctime (cas + mojkrok) of P;\n" " thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 60)} ..\n" " {dir (angle(thdir(P,t2)) - 60)}(point t2 of P);\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " t1:=t2;\n" " endfor;\n" "enddef;\n" "\n" "\n" "def l_moonmilk_UIS (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .3u);\n" " pickup PenC; \n" " t1:=0;\n" " forever:\n" " t2 := arctime (cas + mojkrok) of P;\n" " thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 80)} ..\n" " {dir (angle(thdir(P,t2)) - 80)}(point t2 of P);\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " t1:=t2;\n" " endfor;\n" "enddef;\n" "\n" "\n" "def l_survey_surface_SKBB (expr P) =\n" " T:=identity;\n" " thdrawoptions(dashed withdots scaled (0.2 * optical_zoom) withpen PenC);\n" " thdraw P;\n" " thdrawoptions();\n" "enddef;\n" "\n" "def l_survey_cave_SKBB (expr P) =\n" " T:=identity;\n" " pickup PenC;\n" " if ATTR__scrap_centerline:\n" " thdraw P;\n" " else:\n" " PolygonLine:=.8u;\n" " pair zz[];\n" " for t = 0 upto length P - 1:\n" " zz1 := point t of P;\n" " zz2 := point t+1 of P;\n" " if length (zz2-zz1) > 2*PolygonLine:\n" " thdraw zz1 -- zz1 + PolygonLine * unitvector(zz2 - zz1);\n" " thdraw zz2 -- zz2 + PolygonLine * unitvector(zz1 - zz2);\n" " else:\n" " thdraw zz1 -- zz2;\n" " fi;\n" " endfor;\n" " fi;\n" "enddef;\n" "\n" "def l_survey_cave_UIS (expr P) =\n" " T:=identity;\n" " pair zz[];\n" " pickup PenC;\n" " for t = 0 upto length P - 1:\n" " zz1 := point t of P;\n" " zz2 := point t+1 of P;\n" " draw zz1 -- zz2;\n" " endfor;\n" "enddef;\n" "\n" "def l_waterflow_permanent_UIS (expr Path) =\n" " path ppp;\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength Path;\n" " mojkrok:=adjust_step(dlzka, 0.5u);\n" " pickup PenD; \n" " vardef azim = 50 + 15*normaldeviate enddef;\n" " az1 := azim;\n" " sgn := 1;\n" " ppp := point 0 of Path;\n" " forever:\n" " t1 := arctime cas of Path;\n" " t2 := arctime (cas+mojkrok) of Path;\n" " if cas+1.1*mojkrok > dlzka:\n" " az2 := 0;\n" " else:\n" " az2 := azim;\n" " fi;\n" " d1 := angle(thdir(Path,t1)) + sgn * az1;\n" " d2 := angle(thdir(Path,t2)) - sgn * az2;\n" " ppp := ppp & (point t1 of Path){dir d1} .. {dir d2}(point t2 of Path);\n" " az1 := az2;\n" " sgn := -1 * sgn;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + mojkrok/3; % for rounding errors\n" " endfor;\n" "% drawarrow ppp;\n" " thdraw ppp;\n" " thdrawoptions();\n" " oldahlength:=ahlength;\n" " ahlength:=ahlength*optical_zoom;\n" " thdraw arrowhead ppp;\n" " thfill arrowhead ppp;\n" " ahlength:=oldahlength;\n" "enddef;\n" "\n" "def l_waterflow_intermittent_SKBB (expr Path) =\n" " thdrawoptions(dashed evenly scaled optical_zoom);\n" " l_waterflow_permanent_UIS (Path);\n" " thdrawoptions();\n" "enddef;\n" "\n" "def l_waterflow_conjectural_SKBB (expr Path) =\n" " thdrawoptions(dashed withdots scaled (0.5 * optical_zoom) withpen PenB);\n" " l_waterflow_permanent_UIS (Path);\n" " thdrawoptions();\n" "enddef;\n" "\n" "def l_invisible (expr P) = \n" "enddef;\n" "\n" "def l_undefined (expr P) = \n" " T:=identity;\n" " pickup PenC;\n" " thdraw P withcolor red;\n" " thwarning(\"undefined line symbol used\");\n" "enddef;\n" "\n" "% Q = 0 -- no arrows\n" "% 1 -- end\n" "% 2 -- begin\n" "% 3 -- both\n" "\n" "def l_arrow_SKBB (expr P, Q) =\n" " T:=identity;\n" " pickup PenC;\n" " thdraw P;\n" " p := (-.1u,-.25u)--(0,0)--(.1u,-.25u);\n" " if odd Q:\n" " draw p rotated (angle(thdir(P,0))+90) shifted (point 0 of P);\n" " fi;\n" " if Q>1:\n" " draw p rotated (angle(thdir(P,length P))-90) \n" " shifted (point infinity of P);\n" " fi;\n" "enddef;\n" "\n" "def l_mapconnection_SKBB (expr P) =\n" " thdrawoptions(dashed withdots scaled (0.5 * optical_zoom) withpen PenB);\n" " l_arrow_SKBB(P,3);\n" " thdrawoptions();\n" "enddef;\n" "\n" "\n" "def l_section_SKBB (expr P)(text txt) =\n" " T:=identity;\n" " path Q; Q = punked P;\n" " pickup PenC;\n" " for t = 0 upto length P - 1:\n" " pair zz[];\n" " zz1 := point t of P;\n" " zz2 := point t+1 of P;\n" " zz3 := postcontrol t of P;\n" " zz4 := precontrol t+1 of P;\n" " if (length(zz3-1/3[zz1,zz2]) > 0.1pt) or\n" " (length(zz4-2/3[zz1,zz2]) > 0.1pt):\n" " zz5 = whatever[zz1,zz2];\n" " (zz3-zz5) = whatever * (zz1-zz2) rotated 90;\n" " draw zz1--zz5;\n" " zz6 = whatever[zz1,zz2];\n" " (zz4-zz6) = whatever * (zz1-zz2) rotated 90;\n" " draw zz2--zz6;\n" " else:\n" " draw zz1--zz2;\n" " fi;\n" " endfor;\n" " for pnt=txt:\n" " if pnt=-1:\n" " else:\n" " T:=identity rotated angle(thdir(Q,pnt)) shifted (point pnt of Q);\n" " pickup PenC;\n" " thdraw (0,0)--(0,.8u);\n" " thdraw (-.1u,.55u)--(0,.8u)--(.1u,.55u);\n" " fi;\n" " exitif pnt=-1;\n" " endfor;\n" "enddef;\n" "\n" "let l_border_invisible = l_invisible;\n" "let l_wall_invisible = l_invisible;\n" "\n" "def l_debug (expr col, pen, P) =\n" " T:=identity;\n" " pickup if pen=0: PenD else: PenB fi;\n" " thdraw P \n" " withcolor if col=-2: (1,.85,0)\n" " elseif col=-1: black \n" " elseif col=0: red \n" " else: blue fi;\n" "enddef;\n" "\n" "\n" "def l_u (expr P) =\n" " T:=identity;\n" " pickup PenA;\n" " thdraw P withcolor red;\n" "enddef;\n" "\n" "\n" "def l_gradient_UIS (expr P) =\n" " T:=identity;\n" " pickup PenC;\n" " thdraw P;\n" " p:=(-.15u,-.4u)--(0,0)--(.15u,-.4u)--cycle;\n" " thfill (p rotated (angle(thdir(P,length P))-90) \n" " shifted (point infinity of P));\n" " thdraw (p rotated (angle(thdir(P,length P))-90) \n" " shifted (point infinity of P));\n" "enddef;\n" "\n" "def l_gradient_BCRA (expr P) =\n" " T:=identity;\n" " pickup PenC;\n" " for t = 0 upto length P - 1:\n" " pair zz[];\n" " zz1 := point t of P;\n" " zz2 := point t+1 of P;\n" " zz3 := unitvector(zz2 - zz1);\n" " thfill zz1 + u/3 * zz3 + .25u * (zz3 rotated 90) --\n" " zz2 - u/3 * zz3 --\n" "\t zz1 + u/3 * zz3 + .25u * (zz3 rotated -90) -- cycle;\n" " endfor;\n" "enddef;\n" "\n" "\n" "def l_rope_SKBB (expr P,exact) =\n" " T:=identity;\n" " pickup PenC;\n" " if exact:\n" " draw P;\n" " else:\n" " d:=0.5u;\n" " for i:=0 upto (length P - 2):\n" " x1 := xpart point i of P;\n" " y1 := ypart point i of P;\n" " x2 := xpart point i+1 of P;\n" " y2 := ypart point i+1 of P;\n" " \n" " dx1:=x1; dy1:=y1; x1:=0; y1:=0; x2:=x2-dx1; y2:=y2-dy1;\n" " if y2 > y1:\n" " y3 := y1 - d;\n" " x3 := x1 + (x2-x1)*sqrt(d)/(sqrt(d)+sqrt(y2-y1+d));\n" " else:\n" " y3 := y2 - d;\n" " x3 := x1 + (x2-x1)*sqrt(y1-y2+d)/(sqrt(d)+sqrt(y1-y2+d));\n" " fi;\n" " numeric a,b,c;\n" " a*x1/10*x1 + b/10*x1 + c/10 = y1/10;\n" " a*x2/10*x2 + b/10*x2 + c/10 = y2/10;\n" " a*x3/10*x3 + b/10*x3 + c/10 = y3/10;\n" " draw (x1+dx1,y1+dy1)\n" " for t = x1 step (x2-x1)/20 until x2+10*epsilon:\n" " -- (t+dx1,a*t*t+b*t+c+dy1)\n" " endfor;\n" " endfor;\n" " pair x;\n" " x = point (length P)-1 of P + whatewer * down;\n" " x = point (length P) of P + whatever * right;\n" " draw point (length P)-1 of P -- x;\n" "% thdraw point length P of P withpen pencircle scaled 0.3u withcolor red;\n" " fi;\n" " for i:=0 upto length P if not exact: -1 fi:\n" " thdraw point i of P withpen pencircle scaled 0.3u;\n" " endfor;\n" "enddef;\n" "\n" "def l_border_presumed_SKBB (expr Path) =\n" " T:=identity;\n" " pickup PenC;\n" " draw Path dashed evenly scaled (0.25 * optical_zoom);\n" "enddef;\n" "\n" "def l_steps_SKBB (expr P) =\n" " if known ATTR_c: c := scantokens ATTR_c; else: c := 2; fi;\n" " if ATTR__elevation:\n" " if (c < 2):\n" " thwarning(\"Invalid stairs definition (c<2)\");\n" " pickup PenA;\n" " draw P withcolor red;\n" " else:\n" " path PP;\n" " if (ypart point 0 of P) < (ypart point length P of P):\n" " PP := P;\n" " else:\n" " PP := reverse P;\n" " fi;\n" " path p; \n" " for j:=0 upto ((length PP) - 1):\n" " p := (point j of PP) -- (point (j + 1) of PP);\n" " c := ceiling(abs((ypart point 0 of p) - (ypart point length p of p)) / (0.2 / Scale * 72 / 2.54)); % 20 cm height\n" " if (c < 2): c:=2 fi;\n" " pair cp;\n" " cp = point length p of p - point 0 of p;\n" " dx := (xpart cp) / c;\n" " dy := (ypart cp) / c;\n" " cp := point 0 of p;\n" " for i:= 0 upto c - 1:\n" " l_border_visible(cp -- cp + (0,dy) -- cp + (dx,dy));\n" " cp := cp + (dx, dy);\n" " endfor;\n" " %draw P;\n" " endfor;\n" " fi;\n" " else:\n" " if known ATTR_l: l := scantokens ATTR_l; else: l := (length(P)-2)/2; fi;\n" " if ((length(P) < 4) or (c < 2)) or ((odd length P) and (not known ATTR_l)):\n" " thwarning(\"Invalid stairs definition\" if c<2: &\" (c<2)\" fi);\n" " pickup PenA;\n" " draw P withcolor red;\n" " else:\n" " path p, q;\n" " p = subpath (1, 1+l) of P;\n" " q = reverse subpath (l+2, length(P)) of P;\n" " lp := arclength(p);\n" " lq := arclength(q);\n" " for i=1 upto c:\n" " l_border_visible(point(arctime ((i-1)/(c-1)*lp) of p) of p -- point(arctime ((i-1)/(c-1)*lq) of q) of q);\n" " endfor;\n" " l_border_visible(p);\n" " l_border_visible(q);\n" " drawoptions(withcolor 0.3*white);\n" " %p_label(decimal c, point 0.5 of P, 0, 6);\n" " drawoptions();\n" " fi;\n" " fi;\n" "enddef;\n" "\n" "def l_handrail_SKBB (expr P) = \n" " if ATTR__elevation:\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 1u);\n" " pickup PenD; \n" " pair tmppoint;\n" " tmph := 1 / Scale * 72 / 2.54; % 1 m height\n" " tmppoint:=(point 0 of P) +(0,tmph);\n" " forever:\n" " t := arctime cas of P;\n" " draw point t of P -- (point t of P)+(0,tmph) withpen PenD;\n" " if cas > 0:\n" " draw tmppoint -- (point t of P)+(0,tmph) withpen PenC;\n" " tmppoint := (point t of P)+(0,tmph);\n" " fi;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " endfor;\n" " else:\n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, u);\n" " pickup PenD; \n" " forever:\n" " t := arctime cas of P;\n" " thdraw point t of P withpen pencircle scaled .25u;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " endfor;\n" " pickup PenC; \n" " thdraw P;\n" " fi;\n" "enddef;\n" "\n" "def l_fixedladder_SKBB (expr P) = \n" " pickup PenD;\n" " draw P withcolor red;\n" "enddef;\n" "\n" "def l_ropeladder_SKBB (expr P) = \n" " pickup PenD;\n" " draw P withcolor red;\n" "enddef;\n" "\n" "def l_viaferrata_SKBB (expr P) = \n" " pickup PenD;\n" " draw P withcolor red;\n" "enddef;\n" "\n" "\n\n\n%%%%% ENDINPUT thLine %%%%%\n\n\n" "\n\n\n%%%%% INPUT thArea %%%%%\n\n\n" "%% therion source code\n" "%%\n" "%% This file defines tiling patterns\n" "%%\n" "%% $Date: 2003/07/01 09:06:44 $\n" "%% $RCSfile: thPatterns.mp,v $\n" "%% $Revision: 1.6 $\n" "%%\n" "%% Copyright (C) 2000-2004 Martin Budaj\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% --------------------------------------------------------------------\n" "\n" "if unknown a_water_UIS: else: endinput fi;\n" "\n" "% patterns\n" "\n" "beginpattern(pattern_water_UIS);\n" " draw origin--10up withpen pensquare scaled (0.02u);\n" " patternxstep(.18u);\n" " patterntransform(identity rotated 45);\n" "endpattern;\n" "\n" "beginpattern(pattern_sump_UIS);\n" " draw origin--(0,.25u) withpen pensquare scaled (0.02u);\n" " draw origin--(.25u,0) withpen pensquare scaled (0.02u);\n" " patterntransform(identity rotated 45);\n" "endpattern;\n" "\n" "beginpattern(pattern_sand_UIS);\n" " pickup PenC;\n" " draw (0.2u,.3u);\n" " draw (0.35u,.7u);\n" " draw (0.6u,.5u);\n" " draw (0.8u,.1u); \n" "endpattern;\n" "\n" "beginpattern(pattern_debris_SKBB);\n" " pickup PenC;\n" " p:=(-.15u,0)--(.15u,0);\n" " draw p rotated -40 shifted (.2u,.3u);\n" " draw p rotated 70 shifted (.9u,1.5u);\n" " draw p rotated 20 shifted (1.5u,.8u);\n" "% draw p rotated 95 shifted (.9u,.8u);\n" "endpattern;\n" "\n" "\n" "beginpattern(pattern_moonmilk_SKBB);\n" " pickup PenC;\n" " p:=(-.5u,0){down} .. {up}(-.1666u,0){down}..\n" " {up}(.1666u,0){down} .. {up}(.5u,0);\n" " draw p;\n" " draw p shifted (0.5u,0.3u);\n" " patternxstep(1.0u);\n" " patternystep(0.6u);\n" "endpattern;\n" "\n" "\n" "beginpattern(pattern_flowstone_ASF);\n" " pickup PenC;\n" " p:=(-.35u,0){dir -60} .. {dir 60}(0.35u,0);\n" " draw p;\n" " draw p shifted (0.35u,0.4u);\n" " patternxstep(u);\n" " patternystep(0.8u);\n" "endpattern;\n" "\n" "\n" "beginpattern(pattern_empty);\n" " patternbbox(0,0,10,10);\n" " patternstep(10,10);\n" "endpattern;\n" "\n" "% symbols\n" "\n" "def a_water_UIS (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" " thfill Path withpattern pattern_water_UIS;\n" "enddef;\n" "\n" "def a_sump_UIS (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" " thfill Path withpattern pattern_sump_UIS;\n" "enddef;\n" "\n" "\n" "def a_flowstone_ASF (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" " thfill Path withpattern pattern_flowstone_ASF;\n" "enddef;\n" "\n" "\n" "def a_moonmilk_SKBB (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" " thfill Path withpattern pattern_moonmilk_SKBB;\n" "enddef;\n" "\n" "\n" "\n" "def a_sand_UIS (expr p) =\n" " T:=identity;\n" "% thclean p;\n" " pickup PenC;\n" " path q; q = bbox p;\n" " picture tmp_pic; \n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1u until xpart urcorner q:\n" " for j = ypart llcorner q step 1u until ypart urcorner q:\n" " draw origin shifted ((i,j) randomized 0.7u) withpen PenC;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "def a_debris_UIS (expr Path) =\n" " T:=identity;\n" "% thclean Path;\n" " thfill Path withpattern pattern_debris_SKBB;\n" "enddef;\n" "\n" "\n" "def a_bedrock_SKBB (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" "enddef;\n" "\n" "\n" "% used to export centerline LRUD envelope for maps created from surveys\n" "\n" "def a_dimensions_SKBB (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" "enddef;\n" "\n" "\n" "def a_debris_SKBB (expr p) =\n" " T:=identity;\n" "% thclean p;\n" " pickup PenC;\n" " path q; q = bbox p;\n" " picture tmp_pic; \n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1u until xpart urcorner q:\n" " for j = ypart llcorner q step 1u until ypart urcorner q:\n" " draw ((-.2u,0)--(.2u,0)) \n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.6u) withpen PenC;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "def a_clay_SKBB (expr p) =\n" " T:=identity;\n" " pickup PenC;\n" " path q, qq; q = bbox p;\n" " picture tmp_pic; \n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1.5u until xpart urcorner q:\n" " for j = ypart llcorner q step 1.5u until ypart urcorner q:\n" " qq := ((-.25u,0){up}..origin{down}..{up}(0.25u,0)) randomized (u/15)\n" " shifted ((i,j) randomized 1.3u);\n" "\tif xpart (p intersectiontimes qq) < 0:\n" "\t thdraw qq;\n" "\tfi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "def a_ice_SKBB (expr p) =\n" " T:=identity;\n" " pickup PenC;\n" " path q; q = bbox p;\n" " picture tmp_pic, tmp_ice; \n" " pair z;\n" " tmp_ice := image (\n" " draw (-.2u,0)--(.2u,0);\n" " draw (0,-.2u)--(0,.2u);\n" " );\n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1.5u until xpart urcorner q:\n" " for j = ypart llcorner q step 1.5u until ypart urcorner q:\n" " z := ((i,j) randomized 1.3u);\n" "\tif xpart (p intersectiontimes ((bbox tmp_ice) shifted z)) < 0:\n" "\t draw tmp_ice shifted z;\n" "\tfi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "\n" "def a_snow_SKBB (expr P) =\n" " T:=identity;\n" " pickup PenC;\n" " path q; q = bbox P;\n" " picture tmp_pic, tmp_sn; \n" " pair z;\n" " tmp_sn := image(\n" " pickup PenC;\n" " p := origin--(0,.2*u);\n" " draw p; draw p rotated (60); draw p rotated (120);\n" " draw p rotated (180); draw p rotated (240); draw p rotated (300);\n" " p := ((0,.3u)--(0,0.2u)--(0.1u,0.2u)) rotatedaround ((0,0.2u),45);\n" " draw p; draw p rotated (60); draw p rotated (120);\n" " draw p rotated (180); draw p rotated (240);\n" " draw p rotated (300);\n" " );\n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1.5u until xpart urcorner q:\n" " for j = ypart llcorner q step 1.5u until ypart urcorner q:\n" " z:=((i,j) randomized 1.3u);\n" "\tif xpart (P intersectiontimes ((bbox tmp_sn) shifted z)) < 0:\n" " draw tmp_sn shifted z;\n" "\tfi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to P;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "def a_blocks_SKBB (expr p) =\n" " T:=identity;\n" " pickup PenC;\n" " path q, qq; q = bbox p;\n" " picture tmp_pic; \n" " uu := max(u, (xpart urcorner q - xpart llcorner q)/100, (ypart urcorner q - ypart llcorner q)/100);\n" " tmp_pic := image(\n" " for i = xpart llcorner q step 2uu until xpart urcorner q:\n" " for j = ypart llcorner q step 2uu until ypart urcorner q:\n" " qq := punked (((-.5uu,-.5uu)--(.5uu,-.5uu)--(.5uu,.5uu)--(-.5uu,.5uu)--cycle) \n" "\t randomized (uu/2))\n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 1.6uu);\n" "\tif xpart (p intersectiontimes qq) < 0:\n" "\t thclean qq;\n" "\t thdraw qq;\n" "\tfi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "def a_blocks_SKBB_ (expr p,o,s_beg,s_end,d_beg,d_end) =\n" " T:=identity;\n" " orient = 90-o;\n" " pickup PenC;\n" " path q[], qq; q1 = bbox p;\n" " draw q1; draw p;\n" " q2 = llcorner q1 .. lrcorner q1 .. urcorner q1 .. ulcorner q1 .. cycle;\n" " draw q2;\n" " pair zz[];\n" " radius := .5*length(llcorner q1 - urcorner q1);\n" " zz1 := .5[llcorner q1,urcorner q1];\n" " zz2 := zz1 - dir(orient)*radius;\n" " zz3 = zz1 rotatedaround (zz2,90);\n" " draw zz1 withpen pencircle scaled 2mm;\n" " draw zz2 withpen pencircle scaled 2mm;\n" " draw zz3 withpen pencircle scaled 2mm;\n" " picture tmp_pic; \n" " tmp_pic := image(\n" " j := 0;\n" " forever:\n" " i := 0;\n" " forever:\n" " qq := punked (((-.5,-.5)--(.5,-.5)--(.5,.5)--(-.5,.5)--cycle) \n" " scaled (0.7(5u-(j/(2*radius))[u*s_beg,u*s_end]))\n" "\t randomized (u/2))\n" " rotated uniformdeviate(360) \n" " shifted (((zz3 + (i,j)) rotatedaround (zz3,-o)) randomized 1.6u);\n" " draw ((zz3 + (i,j)) rotatedaround (zz3,-o)) withpen pencircle scaled 1mm withcolor red;\n" "\tif xpart (p intersectiontimes qq) < 0:\n" "\t thclean qq;\n" "\t thdraw qq;\n" "\tfi;\n" " i := i + (j/(2*radius))[u*d_beg,u*d_end];\n" " exitif i > 2*radius;\n" " endfor; \n" " j := j + (j/(2*radius))[u*d_beg,u*d_end];\n" " exitif j > 2*radius;\n" " endfor;\n" " );\n" "% clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "\n" "def a_pebbles_SKBB (expr p) =\n" " T:=identity;\n" " pickup PenC;\n" " path q, qq; q = bbox p;\n" " picture tmp_pic; \n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1.5u until xpart urcorner q:\n" " for j = ypart llcorner q step 1.5u until ypart urcorner q:\n" " qq := (superellipse((.2u,0),(0,.1u),(-.2u,0),(0,.-.1u),.75))\n" "% randomized (u/25)\n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.8u);\n" "\tif xpart (p intersectiontimes qq) < 0:\n" "\t thdraw qq;\n" "\tfi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef;\n" "\n" "def a_water_SKBB (expr Path) =\n" " T:=identity;\n" " thfill Path;\n" "enddef;\n" "\n" "let a_sump_SKBB = a_water_SKBB;\n" "\n" "def a_u (expr p) =\n" " T:=identity;\n" " thfill p withcolor red;\n" "enddef;\n" "\n" "\n\n\n%%%%% ENDINPUT thArea %%%%%\n\n\n" "\n\n\n%%%%% INPUT thText %%%%%\n\n\n" "%% therion source code\n" "%%\n" "%% This file defines macros for labels\n" "%%\n" "%% $Date: 2003/07/01 09:06:44 $\n" "%% $RCSfile: thText.mp,v $\n" "%% $Revision: 1.6 $\n" "%%\n" "%% Copyright (C) 2000-2004 Martin Budaj\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% --------------------------------------------------------------------\n" "\n" "labeloffset:=0bp;\n" "\n" "def l_label(expr txt,path) =\n" " picture pict,pic;\n" " pair pos;\n" " numeric dx[],dy[],ptime;\n" " string ss,ch;\n" "\n" " pic := thelabel(txt,(0,0));\n" " strl := xpart(lrcorner pic - llcorner pic);\n" " pathl := arclength (path);\n" " dx0 := xpart(llcorner pic);\n" "% dy0 := ypart(llcorner pic);\n" "\n" " if strl>pathl:\n" " txtzoom := pathl / strl;\n" " thwarning(\"text scaled down to fit the path\");\n" " else:\n" " txtzoom := 1;\n" " fi;\n" " zoom := pathl / strl;\n" "\n" " for p within pic:\n" " if textual p: \n" " ss := textpart p;\n" " dx1 := xpart p;\n" " dy1 := ypart p;\n" " dx2 := dx1;\n" "\n" " if xxpart p / yypart p <> 1: message(\"Error: distorted text!\") fi;\n" " txtscale := txtzoom * xxpart p;\n" "\n" " l := length(ss);\n" " ptime := 0;\n" " for i=0 upto (l - 1):\n" " ch := substring(i,i+1) of ss;\n" " pict := ch infont fontpart p scaled txtscale;\n" " charwidth := xpart (lrcorner pict - llcorner pict) / txtzoom;\n" " dy2 := ypart lrcorner pict / txtzoom;\n" " ptime := (dx2 - dx0 + 0.5*charwidth) * zoom;\n" " t := arctime ptime of (path);\n" " pos := point t of path + \n" " (dy1+dy2)*txtzoom*unitvector((direction t of path) rotated 90);\n" " begingroup\n" "% interim labeloffset:=0bp;\n" " lab:=thelabel.top(pict,pos);\n" " process_label(pos,angle direction t of path);\n" " endgroup;\n" " dx2 := dx2 + charwidth;\n" " endfor;\n" "\n" " else: message(\"Strange component of line label!\");\n" " fi;\n" " endfor;\n" " % draw path;\n" "enddef;\n" "\n" "vardef p_label@#(expr txt,pos,rot,mode) =\n" " if (mode=1) or (mode=7): interim labeloffset:=(u/8) fi;\n" " lab:=thelabel@#(txt, pos);\n" " if mode>1: pickup PenD fi;\n" " if mode=1:\n" " pickup pencircle scaled (u/6);\n" " drawdot(pos);\n" " process_label(pos,0);\n" " elseif mode=2: process_uplabel; \n" " elseif mode=3: process_downlabel;\n" " elseif mode=4: process_updownlabel;\n" " elseif mode=5: process_circledlabel;\n" " elseif mode=6: process_boxedlabel;\n" " elseif mode=7: process_label(pos,rot); % station name\n" " elseif mode=8: process_filledlabel(pos, rot);\n" " else: process_label(pos,rot); fi;\n" "enddef;\n" "\n" "\n" "% at beginfig: save smartll[], smartur[]; pair smartll[], smartur[]; smart_count=0;\n" "numeric smart_count, smart_D;\n" "boolean smart_quit, smart_inner_quit;\n" "\n" "def p_smartlabel (expr txt, pos) =\n" " begingroup;\n" " interim bboxmargin:=0.2pt;\n" " lab:=thelabel.rt(txt,pos+(0.4u,0));\n" " q:=bbox lab;\n" " smart_D := 0;\n" " forever:\n" " smart_quit := true;\n" " smart_inner_quit := false;\n" " for i=1 upto smart_count:\n" " if smart_overlap(((point 0 of q) shifted (0,smart_D)), \n" " ((point 2 of q) shifted (0,smart_D)),\n" " smartll[i], smartur[i]) = 1:\n" " smart_quit := false;\n" " smart_D := smart_D - 3pt;\n" " smart_inner_quit := true;\n" " fi;\n" " exitif smart_inner_quit;\n" " endfor;\n" " exitif smart_quit;\n" " endfor;\n" " smart_U := 0;\n" " forever:\n" " smart_quit := true;\n" " smart_inner_quit := false;\n" " for i=1 upto smart_count:\n" " if smart_overlap(((point 0 of q) shifted (0,smart_U)), \n" " ((point 2 of q) shifted (0,smart_U)),\n" " smartll[i], smartur[i]) = 1:\n" " smart_quit := false;\n" " smart_U := smart_U + 3pt;\n" " smart_inner_quit := true;\n" " fi;\n" " exitif smart_inner_quit;\n" " endfor;\n" " exitif smart_quit;\n" " endfor;\n" " if (smart_U < -smart_D): smart_D := smart_U; fi;\n" " draw lab shifted (0,smart_D);\n" " if (abs(smart_D)>3pt):\n" " pickup PenB;\n" " draw pos{left}..{right}(pos shifted (.4u, smart_D)) dashed withdots scaled 0.2;\n" " pickup PenA;\n" " drawdot pos;\n" " fi;\n" " smart_count := smart_count + 1;\n" " smartll[smart_count] := point 0 of (q shifted (0,smart_D));\n" " smartur[smart_count] := point 2 of (q shifted (0,smart_D));\n" " endgroup;\n" "enddef;\n" "\n" "def smart_overlap (expr llA, urA, llB, urB) =\n" " if ((xpart llA < xpart urB) and (xpart urA > xpart llB)) and\n" " ((ypart llA < ypart urB) and (ypart urA > ypart llB)):\n" " 1\n" " else:\n" " 0 \n" " fi\n" "enddef;\n" "\n" "\n" "\n" "\n" "def p_wallaltitude (expr pprev,pos,pnext,txt) =\n" " rot:=angle(unitvector(pnext-pos)+unitvector(pos-pprev)) - 90;\n" " pickup PenD;\n" " pair zz;\n" "% zz:=(pos + 3*unitvector(dir rot));\n" " zz:=(pos + (u/4)*unitvector(dir rot));\n" " draw (pos)--zz;\n" " begingroup \n" "% interim labeloffset:=2pt;\n" " interim labeloffset:=(u/12);\n" " if horiz_labels:\n" " rot:=rot mod 360;\n" " if rot<=22.5: lab:=thelabel.rt(txt, zz);\n" " elseif rot<=67.5: lab:=thelabel.urt(txt, zz);\n" " elseif rot<=112.5: lab:=thelabel.top(txt, zz);\n" " elseif rot<=157.5: lab:=thelabel.ulft(txt, zz);\n" " elseif rot<=202.5: lab:=thelabel.lft(txt, zz);\n" " elseif rot<=247.5: lab:=thelabel.llft(txt, zz);\n" " elseif rot<=292.5: lab:=thelabel.bot(txt, zz);\n" " elseif rot<=337.5: lab:=thelabel.lrt(txt, zz);\n" " else: lab:=thelabel.rt(txt, zz);\n" " fi;\n" " else:\n" " if (abs rot>90) and (abs rot <=270):\n" " rot:=rot-180;\n" " lab:=thelabel.lft(txt, pos);\n" " else:\n" " lab:=thelabel.rt(txt, pos);\n" " fi;\n" " fi;\n" " process_label(pos, if horiz_labels: 0 else: rot fi);\n" " endgroup;\n" "enddef;\n" "\n" "\n\n\n%%%%% ENDINPUT thText %%%%%\n\n\n" "\n\n\n%%%%% INPUT thSpecial %%%%%\n\n\n" "%% therion source code\n" "%%\n" "%% This file defines macros for special symbols\n" "%%\n" "%% $Date: $\n" "%% $RCSfile: $\n" "%% $Revision: $\n" "%%\n" "%% Copyright (C) 2004 Martin Budaj\n" "%%\n" "%% -------------------------------------------------------------------- \n" "%% This program is free software; you can redistribute it and/or modify\n" "%% it under the terms of the GNU General Public License as published by\n" "%% the Free Software Foundation; either version 2 of the License, or\n" "%% any later version.\n" "%%\n" "%% This program is distributed in the hope that it will be useful,\n" "%% but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "%% GNU General Public License for more details.\n" "%% \n" "%% You should have received a copy of the GNU General Public License\n" "%% along with this program; if not, write to the Free Software\n" "%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "%% --------------------------------------------------------------------\n" "\n" "def s_northarrow_SKBB_old (expr rot) = \n" " T:=identity;\n" " picture tmp_pic;\n" " tmp_pic = image (\n" " begingroup\n" " interim defaultscale:=3;\n" " label(if (lang=\"sk\") or (lang=\"cz\"): \"S\" else: \"N\" fi, origin);\n" " endgroup;\n" " drawarrow (0,-1cm)--(0,1cm);\n" " );\n" " draw tmp_pic rotatedaround(origin, -rot);\n" "enddef;\n" "\n" "def s_northarrow_SKBB (expr rot) =\n" " T:=identity scaled 0.7 rotated -rot;\n" " thdraw (-.5cm,-1cm)--(0,1.5cm)--(.5cm,-1cm)--(0,-.5cm)--cycle;\n" " thfill (-.5cm,-1cm)--(0,1.5cm)--(0,-.5cm)--cycle;\n" "enddef;\n" "\n" "def s_scalebar_SKBB (expr l, units, txt) = \n" " begingroup\n" " interim warningcheck:=0;\n" " tmpl:=l / Scale * cm * units / 2;\n" " endgroup;\n" " pickup PenC;\n" " draw (-tmpl,0)--(tmpl,0);\n" " draw (-tmpl,0)--(-tmpl,2bp);\n" " draw (tmpl,0)--(tmpl,2bp);\n" " begingroup\n" " interim labeloffset:=2bp;\n" " label.top(thTEX(decimal (l) & \"\\thinspace\" & txt),origin);\n" " endgroup\n" "enddef;\n" "\n" "def s_scalebar_SM (expr l, units, txt) = \n" " begingroup\n" " interim warningcheck:=0;\n" " tmpl:=l / Scale * cm * units / 2;\n" " endgroup;\n" " pickup PenC;\n" " draw (-tmpl,0)--(tmpl,0);\n" " draw (-tmpl,0)--(-tmpl,2bp);\n" " draw (tmpl,0)--(tmpl,2bp);\n" " draw (0,0)--(0,2bp);\n" " begingroup\n" " interim labeloffset:=3.5bp;\n" " label.top(thTEX(decimal (0)),(-tmpl,0));\n" " label.top(thTEX(decimal (l/2)),origin);\n" " label.top(thTEX(decimal (l) & \"\\thinspace\" & txt),(tmpl,0));\n" " endgroup\n" "enddef;\n" "\n" "\n" "def s_hgrid_SM (expr xpos, ypos, xsize, ysize) =\n" " pickup PenD;\n" " draw (\n" " if xpos < 0: 0 else: -5mm fi, 0\n" " ) -- (\n" " if xpos > 0: 0 else: 5mm fi, 0\n" " );\n" " draw (\n" " 0, if ypos < 0: 0 else: -5mm fi\n" " ) -- (\n" " 0, if ypos > 0: 0 else: 5mm fi\n" " );\n" "enddef;\n" "\n" "\n" "def s_vgrid_SM (expr xpos, ypos, xsize, ysize) =\n" " pickup PenD;\n" " draw (\n" " if xpos < 0: 0 else: -xsize/2 fi, 0\n" " ) -- (\n" " if xpos > 0: 0 else: xsize/2 fi, 0\n" " ) dashed evenly;\n" "enddef;\n" "\n" "\n\n\n%%%%% ENDINPUT thSpecial %%%%%\n\n\n" "\n\n\n%%%%% INPUT uAUT %%%%%\n\n\n" "% Austrian Symbol Set, author Georg Pacher\n" "\n" "% color (for Austrian symbol-set)\n" "\n" "color col_water_bg;\n" "col_water_bg :=(226/255,244/255,253/255);\n" "\n" "%%%%%%%%%%%%%%%%%%%%%%%\n" "\n" "\n" "%% areas\n" "\n" "% returns true if pair point lies within path q. \n" "% outside_point is any pair outside of path q (needed for reference).\n" "vardef pointinside(expr pt,q,outside_point)=\n" " T:=identity;\n" " path test;\n" " test:= outside_point--pt;\n" " %thdraw test;\n" " boolean isinside;\n" " isinside:=false;\n" " numintersections:=recgetnumintersections(test,q,0);\n" " if (numintersections <0):\n" " isinside:=true;\n" " elseif odd(numintersections):\n" " isinside:=true;\n" " else:\n" " isinside:=false;\n" " fi;\n" " isinside\n" "enddef;\n" "\n" "% get number of intersection between paths p (length 1!) and q\n" "% recnum is needed for limitation of recursions. \n" "% If the number of allowed recursions is reached, a negativ number of intersections is returned\n" "vardef recgetnumintersections(expr p,q,recnum)=\n" " \n" " pair inter;\n" " save preinter;\n" " save postinter;\n" " save numintersections;\n" " path preinter, postinter;\n" " inter:=p intersectiontimes q;\n" " %show recnum;\n" " if recnum >25:\n" " numintersections:=-100;\n" " else: \n" " if xpart(inter)>0 :\n" " %show (xpart inter);\n" " % split p into two paths and call yourself again\n" " \n" " preinter:=subpath (0,xpart(inter)-2eps) of p;\n" " \n" " postinter:=subpath (xpart(inter)+2eps,1) of p;\n" " \n" " numintersections:= recgetnumintersections(preinter,q,recnum+1)\n" " + recgetnumintersections(postinter,q,recnum+1)\n" " + 1;\n" " else:\n" " numintersections:=0;\n" " fi;\n" " fi;\n" " numintersections\n" " \n" "enddef;\n" "\n" "beginpattern(pattern_water_AUT);\n" " draw origin--10up withpen pensquare scaled (0.02u);\n" " patternxstep(.18u);\n" " patterntransform(identity rotated 90);\n" "endpattern;\n" "\n" "beginpattern(pattern_sump_AUT);\n" " draw origin--(0,.25u) withpen pensquare scaled (0.02u);\n" " draw origin--(.25u,0) withpen pensquare scaled (0.02u);\n" "endpattern;\n" "\n" "beginpattern(pattern_sand_AUT);\n" " pickup PenC;\n" " p:= origin -- (0.01u,0.01u);\n" " for i=0.0u step 0.2u until 2.4u:\n" " for j=0.0u step 0.2u until 2.4u:\n" " draw p rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.09u);\n" " endfor;\n" " endfor;\n" " if BaseScale<=2.5:\n" " my_step:=2.4u;\n" " else:\n" " my_step:=2.6u;\n" " fi;\n" " patternstep(my_step,my_step); \n" "endpattern;\n" "\n" "beginpattern(pattern_pebbles_AUT);\n" " pickup PenC;\n" " path qq;\n" " for i=0.0u step 0.3u until 5.1u:\n" " for j=0.0u step 0.3u until 5.1u:\n" " qq := (superellipse((.1u,0),(0,.05u),(-.1u,0),(0,.-.05u),.75))\n" " randomized (u/45)\n" " scaled (uniformdeviate(0.4)+.55)\n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.15u);\n" " draw qq;\n" " endfor;\n" " endfor;\n" " patternstep(5.1u,5.1u);\n" "endpattern;\n" "\n" "beginpattern(pattern_ice_AUT);\n" " pickup PenC;\n" " p:=(-.15u,.0u) -- (0.15u,.0u);\n" " draw p;\n" " draw p shifted (0.25u,.0u) rotated (90);\n" " draw p shifted (0.45u,0.25u);\n" " draw p shifted (0.0u,0.45u) rotated (90);\n" " patternxstep(.9u);\n" " patternystep(0.5u);\n" "endpattern;\n" "\n" "def a_water_AUT (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" " pickup PenC;\n" " thfill Path withcolor col_water_bg;\n" " thfill Path withpattern pattern_water_AUT;\n" " thdraw Path;\n" "enddef;\n" "\n" "def a_sump_AUT (expr Path) =\n" " T:=identity;\n" " thclean Path;\n" " pickup PenC;\n" " thfill Path withcolor col_water_bg;\n" " thfill Path withpattern pattern_sump_AUT;\n" " thdraw Path;\n" "enddef;\n" "\n" "def a_sand_AUT (expr Path) =\n" " T:=identity;\n" "% thclean Path;\n" " thfill Path withpattern pattern_sand_AUT ;\n" "enddef;\n" "\n" "let a_clay_AUT = a_sand_AUT;\n" "\n" "\n" "def a_pebbles_AUT (expr p) =\n" " T:=identity;\n" " thfill p withpattern pattern_pebbles_AUT;\n" "enddef;\n" "\n" "\n" "\n" "def a_debris_AUT (expr p) =\n" " T:=identity;\n" " \n" " symbol_distance:=1.0;\n" " scale_factor:= 0.3;\n" " pickup PenC;\n" " path q, qq; q = bbox p;\n" " pair outside;\n" " outside:= ulcorner q + up;\n" " picture tmp_pic; \n" " uu := max(u, (xpart urcorner q - xpart llcorner q)/100, (ypart urcorner q - ypart llcorner q)/100);\n" " tmp_pic := image(\n" " for i = xpart llcorner q step symbol_distance*uu until xpart urcorner q:\n" " for j = ypart llcorner q step symbol_distance*uu until ypart urcorner q:\n" " qq := punked (((-.5uu,-.5uu)--(.5uu,-.5uu)--(1.05uu,0.01uu)--(.5uu,.5uu)--(-.5uu,.5uu)--cycle) \n" " randomized (uu/2))\n" " scaled (uniformdeviate(0.4)+scale_factor )\n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.5uu);\n" " if xpart (p intersectiontimes qq) < 0:\n" " if pointinside((i,j),p,outside):\n" " thclean qq;\n" " thdraw qq;\n" " fi;\n" " else:\n" " qq:= qq scaled (uniformdeviate(.2)+.5 )\n" " if xpart (p intersectiontimes qq) < 0:\n" " if pointinside((i,j),p,outside):\n" " thclean qq;\n" " thdraw qq;\n" " fi;\n" " fi;\n" " fi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef; \n" "\n" "def a_ice_AUT (expr p) =\n" " T:=identity;\n" " thclean p;\n" " thfill p withpattern pattern_ice_AUT;\n" " pickup PenC;\n" " thdraw p;\n" "enddef;\n" "\n" "def a_snow_AUT (expr P) =\n" " T:=identity;\n" " pickup PenC;\n" " path q; q = bbox P;\n" " picture tmp_pic, tmp_sn; \n" " pair z;\n" " tmp_sn := image(\n" " pickup PenC;\n" " p := origin--(0,.2*u);\n" " draw p; draw p rotated (60); draw p rotated (120);\n" " draw p rotated (180); draw p rotated (240); draw p rotated (300);\n" " p := ((0,.3u)--(0,0.2u)--(0.1u,0.2u)) rotatedaround ((0,0.2u),45);\n" " draw p; draw p rotated (60); draw p rotated (120);\n" " draw p rotated (180); draw p rotated (240);\n" " draw p rotated (300);\n" " );\n" " tmp_pic := image(\n" " for i = xpart llcorner q step 1.0u until xpart urcorner q:\n" " for j = ypart llcorner q step 1.0u until ypart urcorner q:\n" " z:=((i,j) randomized 0.5u);\n" "\tif xpart (P intersectiontimes ((bbox tmp_sn) shifted z)) < 0:\n" " draw tmp_sn shifted z;\n" "\tfi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to P;\n" " draw tmp_pic;\n" " thdraw P;\n" "enddef;\n" "\n" "def a_blocks_AUT (expr p) =\n" " T:=identity;\n" " symbol_distance:=1.6;\n" " scale_factor:= 0.8;\n" " pickup PenC;\n" " path q, qq; q = bbox p;\n" " pair outside;\n" " outside:= ulcorner q + up;\n" " picture tmp_pic; \n" " uu := max(u, (xpart urcorner q - xpart llcorner q)/100, (ypart urcorner q - ypart llcorner q)/100);\n" " tmp_pic := image(\n" " for i = xpart llcorner q step symbol_distance*uu until xpart urcorner q:\n" " for j = ypart llcorner q step symbol_distance*uu until ypart urcorner q:\n" " qq := punked (((-.5uu,-.5uu)--(.5uu,-.5uu)--(1.05uu,0.01uu)--(.5uu,.5uu)--(-.5uu,.5uu)--cycle) \n" " randomized (uu/2))\n" " scaled (uniformdeviate(0.7)+scale_factor )\n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.75uu);\n" " if xpart (p intersectiontimes qq) < 0:\n" " if pointinside((i,j),p,outside):\n" " thclean qq;\n" " thdraw qq;\n" " fi;\n" " else:\n" " qq:= qq scaled (uniformdeviate(.2)+.5 )\n" " if xpart (p intersectiontimes qq) < 0:\n" " if pointinside((i,j),p,outside):\n" " thclean qq;\n" " thdraw qq;\n" " fi;\n" " fi;\n" " fi;\n" " endfor; \n" " endfor;\n" " );\n" " clip tmp_pic to p;\n" " drawoptions();\n" " draw tmp_pic;\n" "enddef; \n" "\n" "\n" "%% lines\n" "\n" "def l_wall_pit_AUT (expr P) = \n" " T:=identity;\n" " % draw outer path\n" " pickup PenA;\n" " thdraw P;\n" "\n" " laenge:= arclength P;\n" "\n" " pair inner[],innerdir[], inter;\n" " pair test;\n" " \n" " samplingdistance:=max(0.15u,laenge/1500);\n" " \n" " path testcircle;\n" " % testcircle, used to test, whether the path makes a 'v'-like bend, \n" " % where normal sampling and offsetting gives poor results for the parallel line\n" " % size of testcircle= size PenA/2 + 2* (distance between outer and inner line)\n" " % + PenC (inner line)\n" " testcircle := halfcircle scaled (.5*u/10+2*.125u+.5*u/10) shifted (0,.5*u/10);\n" " cur:=samplingdistance/2;\n" " count:=0;\n" " forever:\n" " t:= arctime cur of P;\n" " inter:=P intersectiontimes (testcircle rotated (angle thdir(P,t)) shifted (point t of P));\n" " \n" " %thdraw testcircle rotated (angle thdir(P,t)) shifted (point t of P) withpen (pencircle scaled 0.01u) ;\n" " if (xpart inter) >=0:\n" " % we are at a 'sharp bend', so set next point to intersectionpoint\n" " cur:=cur+samplingdistance;\n" " t := max( xpart inter, arctime cur of P);\n" " %thdraw point t of P withcolor 0.7*green;\n" " forever:\n" " t:= arctime cur of P;\n" " inter:=P intersectiontimes (testcircle rotated (angle thdir(P,t)) shifted (point t of P));\n" " exitif (xpart inter <0);\n" " cur := cur + samplingdistance;\n" " exitif (cur >=laenge); \n" " endfor;\n" " if (cur =laenge);\n" " endfor;\n" " if count>2:\n" " % draw inner path\n" " pickup PenC;\n" " path innerpath;\n" " innerpath =\n" " for i=0 upto count-2:\n" " inner[i]{(innerdir[i])} ..\n" " endfor\n" " if cycle P: cycle;\n" " else: inner[count-1];\n" " fi;\n" " thdraw innerpath;\n" " \n" " % draw the triangles\n" "\n" " path draw_triangle;\n" " pair l_triangle;\n" " \n" " laenge:= arclength innerpath;\n" " symsize:= adjust_step(laenge,0.5u);\n" " triangle_width:=symsize/2;\n" " cur:=(symsize/2);\n" " t := arctime (cur) of innerpath;\n" " t1:= arctime (cur-triangle_width/2) of innerpath;\n" " t2:= arctime (cur+triangle_width/2) of innerpath; \n" " l_triangle := (point t of innerpath);\n" " if ATTR__height >= 10: thfill else: thdraw fi (subpath (t1,t2) of innerpath) -- \n" " ((point t of innerpath) + symsize/2 * unitvector(thdir(innerpath,t) rotated 90))\n" " -- cycle;\n" "\n" " for cur=(symsize/2) step symsize until laenge:\n" " t := arctime (cur) of innerpath;\n" " test := (point t of innerpath);\n" " my_dist := length(test-l_triangle);\n" " if (abs(my_dist-symsize) < 0.05u) or (my_dist>symsize):\n" " t1:= arctime (cur-triangle_width/2) of innerpath;\n" " t2:= arctime (cur+triangle_width/2) of innerpath; \n" "\t draw_triangle:=(subpath (t1,t2) of innerpath) -- \n" " ((point t of innerpath) + symsize/2 * unitvector(thdir(innerpath,t) rotated 90))\n" " -- cycle;\n" "\t if xpart (draw_triangle intersectiontimes P) < 0:\n" "\t if ATTR__height >= 10: \n" "\t thfill draw_triangle;\n" "\t else:\n" "\t thclean draw_triangle;\n" "\t thdraw draw_triangle;\n" "\t fi;\n" "\t l_triangle:= test;\n" "\t fi;\n" " fi;\n" " endfor;\n" " \n" " fi;\n" "enddef;\n" "\n" "\n" "def l_wall_sand_AUT (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, 0.1u);\n" " pickup PenC; \n" " forever:\n" " t := arctime cas of P;\n" " thdraw (((0.01u,0.01u)--origin) rotated uniformdeviate(360) shifted ((point t of P) + (uniformdeviate 1) * .4u \n" " * unitvector(thdir(P,t) rotated -90)));\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka + (mojkrok / 3); % for rounding errors\n" " endfor;\n" " pickup PenC; \n" " thdraw P;\n" "\n" "enddef;\n" "\n" "def l_wall_pebbles_AUT (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .18u);\n" " pickup PenC;\n" " q:=superellipse((.1u,0),(0,.05u),(-.1u,0),(0,.-.05u),.75);\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " thdraw q randomized (u/45) rotated (angle(thdir(P,t)) + (normaldeviate*40)) shifted point t of P;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" "enddef;\n" "\n" "\n" "let l_wall_clay_AUT = l_wall_sand_AUT;\n" "\n" "\n" "def l_wall_debris_AUT (expr P) = \n" " T:=identity;\n" " pickup PenC;\n" " laenge := arclength P;\n" " path block;\n" " path old_block;\n" " \n" " cur := 0;\n" " t:= arctime cur of P;\n" " % draw first block\n" " old_block := (((-.0u,-.0u)--(.25u,-.15u)--(.45u,0.01u)--(.2u,.25u)--(.05u,.15u)--cycle));\n" " block_width := (xpart urcorner old_block - xpart ulcorner old_block);\n" " old_block:=old_block rotated angle(thdir(P,0)) shifted point t of P;\n" " thclean old_block;\n" " thdraw old_block;\n" " \n" " cur := cur + 0.9*block_width;\n" " t:= arctime cur of P;\n" "\t% proceed with path\n" " forever:\n" "\t % generate random block\n" " block := punked (((-.25u,-.25u)--(0.25.u,-.25u)--(0.50u,0.01u)--(0.25u,.25u)--(-.25u,.25u)--cycle) \n" " randomized (u/4))\n" " scaled (uniformdeviate(0.3)+.4)\n" " rotated uniformdeviate(360);\n" "\t % check width of block\n" " block_width := (xpart urcorner block - xpart ulcorner block);\n" " exitif cur > (laenge- 2.5*block_width/2);\n" " % find next position where the block fits in without intersecting the previous one\n" "\t forever: \n" "\t exitif xpart ( (block rotated angle(-direction t of P) shifted point t of P) intersectiontimes old_block) < 0;\n" " cur:=cur+0.01u;\n" " t:= arctime cur of P;\n" " exitif cur > (laenge- 2.5*block_width/2);\n" " endfor;\n" " exitif cur > (laenge- 2.5*block_width/2);\n" "\n" " old_block:= block rotated angle(-direction t of P) shifted point t of P;\n" " thclean old_block;\n" " thdraw old_block;\n" " cur := cur + block_width/2;\n" " t:= arctime cur of P;\n" " endfor;\n" "\tt:= arctime laenge-eps of P;\n" "\n" "\t% generate last block\n" " block := (((-.0u,-.0u)--(.25u,-.15u)--(.45u,0.01u)--(.2u,.25u)--(.1u,.15u)--cycle));\n" " block_width := (xpart urcorner block - xpart ulcorner block);\n" " \n" "\t% scale last block to fit in the remaining gap\n" " scale_factor:=1.5*(laenge-cur)/block_width;\n" " forever:\n" " exitif scale_factor < 0; % bruces stab at preventing endless loop at large scales\n" " exitif xpart ( (block rotated angle(-direction t of P) scaled scale_factor shifted (point t of P)) intersectiontimes old_block) < 0;\n" " scale_factor:=scale_factor-0.01;\n" " endfor;\n" " if scale_factor > 0:\n" " thclean block rotated angle(-direction t of P) scaled scale_factor shifted (point t of P);\n" " thdraw block rotated angle(-direction t of P) scaled scale_factor shifted (point t of P);\n" " fi;\n" "enddef;\n" "\n" "\n" "def l_wall_blocks_AUT (expr P) = \n" "\n" " T:=identity;\n" " pickup PenC;\n" " laenge := arclength P;\n" "\n" " path block;\n" " path old_block;\n" " \n" " cur := 0;\n" " t:= arctime cur of P;\n" " \n" " % draw first block\n" " old_block := ( (.7u,-.35u)--(.85u,0.01u)--(.4u,.5u)--(.1u,.3u)--(-.0u,-.0u) );\n" " block_width := (xpart urcorner old_block - xpart ulcorner old_block);\n" " old_block:=old_block rotated angle( thdir(P,0) ) shifted point t of P;\n" " thclean (old_block--cycle);\n" " thdraw old_block;\n" " \n" " \n" " cur := cur + block_width/2;\n" " t:= arctime cur of P;\n" " forever:\n" " % generate random block\n" " block := punked ( ( (.8u,-.35u)--(.85u,0.01u)--(.6u,.4u)--(.1u,.1u)--(-.0u,-.3u) )\n" " randomized (0.3u) )\n" " scaled (uniformdeviate(0.3)+.65)\n" " rotated (uniformdeviate(45)-15);\n" " % check width of block\n" " block_width := (xpart urcorner block - xpart ulcorner block);\n" " \n" " exitif cur > (laenge- 3.5*block_width/2);\n" " % find next position where the block fits in without intersecting the previous one\n" " forever: \n" " exitif xpart ( ((block--cycle) rotated angle(direction t of P) shifted point t of P) intersectiontimes old_block) < 0;\n" " cur:=cur+0.01u;\n" " t:= arctime cur of P;\n" " exitif cur > (laenge- 3.5*block_width/2);\n" " endfor;\n" " exitif cur > (laenge- 3.5*block_width/2);\n" " \n" " old_block:= block rotated angle(direction t of P) shifted point t of P;\n" " thclean (old_block--cycle);\n" " thdraw old_block;\n" " \n" " \n" " cur := cur + block_width/2;\n" " t:= arctime cur of P;\n" " endfor;\n" " \n" " % generate last block\n" " t:= arctime laenge-eps of P;\n" " block := (( (-.15u,-.35u)--(.0u,.0u)--(-.45u,.5u)--(-.75u,.3u)--(-.85u,-.0u)) );\n" " block_width := (xpart urcorner block - xpart ulcorner block);\n" " % scale last block to fit in the remaining gap\n" " scale_factor:=(laenge-cur)/block_width;\n" " forever:\n" "\t exitif scale_factor < 0;\n" " exitif xpart ( ( (block) rotated angle (direction t of P) scaled scale_factor shifted (point t of P) ) intersectiontimes old_block) < 0;\n" " scale_factor:=scale_factor-0.001;\n" " endfor;\n" " if scale_factor > 0:\n" " thclean (block--cycle) rotated angle (direction t of P) scaled scale_factor shifted (point t of P);\n" " thdraw (block) rotated angle (direction t of P) scaled scale_factor shifted (point t of P);\n" " fi;\n" "enddef;\n" "\n" "\n" "\n" "def l_wall_ice_AUT (expr P) = \n" " T:=identity;\n" " cas := 0;\n" " dlzka := arclength P;\n" " mojkrok:=adjust_step(dlzka, .6u);\n" " pickup PenC;\n" " p := (-.15u,0)--(.15u,0);\n" " q := p rotated 90 shifted (.25u,.0u);\n" " picture symbol,test_symbol;\n" " symbol:= image (\n" " thdraw p;\n" " thdraw q;\n" " );\n" " path bound,old_bound,test_bound;\n" " begingroup;\n" " interim bboxmargin:=0;\n" " bound := bbox (symbol);\n" " endgroup;\n" " t := arctime (cas + mojkrok/2) of P;\n" " thdraw symbol rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " old_bound:=bound rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" "\n" " forever:\n" " t := arctime (cas + mojkrok/2) of P;\n" " test_bound:= bound rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " if xpart ((old_bound) intersectiontimes (test_bound))<0:\n" " if xpart (P intersectiontimes (test_bound))<0:\n" " thdraw symbol rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " old_bound:=bound rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90));\n" " fi;\n" " fi;\n" " cas := cas + mojkrok;\n" " exitif cas > dlzka - (2*mojkrok/3); % for rounding errors\n" " endfor;\n" " thdraw P;\n" "enddef;\n" "\n" "\n" "def l_wall_underlying_AUT (expr P) = \n" " T:=identity;\n" " pickup PenA;\n" " laenge:= arclength P;\n" " t1 := arctime (0.5u) of P;\n" " t2 := arctime (laenge-.5u) of P;\n" " thdraw (subpath (t1,t2) of P) dashed evenly scaled optical_zoom;\n" "enddef;\n" "\n" "\n" "def l_wall_overlying_AUT (expr P) = \n" " T:=identity;\n" " laenge:= arclength P;\n" " t1 := arctime (0.25u) of P;\n" " t2 := arctime (laenge-.25u) of P;\n" " t3 :=arctime (laenge) of P;\n" " pickup pensquare scaled (3.5*u/10);\n" " thdraw (subpath (t1,t2) of P) withcolor background;\n" " pickup PenA;\n" " thdraw subpath(0,t1) of P; \n" " thdraw subpath(t2,t3) of P;\n" " thdraw (subpath (t1,t2) of P) dashed dashpattern(on 2bp off 2bp on .5bp off 2bp on 2bp) scaled optical_zoom;\n" "enddef;\n" "\n" "def l_wall_moonmilk_AUT (expr P) = \n" " T:=identity;\n" " laenge:= arclength P;\n" " symsize:=adjust_step(laenge,0.8u);\n" " circle_width:=symsize/2;\n" " cur:=(symsize-circle_width)/2;\n" " pickup PenC;\n" " forever:\n" " t1 := arctime (cur) of P;\n" " t2 := arctime (cur + circle_width) of P;\n" " thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 90)} ..\n" " {dir (angle(thdir(P,t2)) - 90)}(point t2 of P);\n" " cur := cur + symsize;\n" " exitif cur > laenge + (symsize / 3); % for rounding errors\n" " endfor;\n" " pickup PenA;\n" " thdraw P;\n" "enddef;\n" "\n" "def l_wall_flowstone_AUT (expr P) = \n" " T:=identity;\n" " laenge:= arclength P;\n" " symsize:=adjust_step(laenge,0.8u);\n" " circle_width:=symsize/2;\n" " cur:=(symsize-circle_width)/2;\n" " pickup PenC;\n" " forever:\n" " t1 := arctime (cur) of P;\n" " t2 := arctime (cur + circle_width) of P;\n" " thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 90)} ..\n" " {dir (angle(thdir(P,t2)) - 90)}(point t2 of P);\n" " thfill (point t1 of P){dir (angle(thdir(P,t1)) + 90)} ..\n" " {dir (angle(thdir(P,t2)) - 90)}(point t2 of P) --\n" " (point t1 of P)--cycle;\n" " cur := cur + symsize;\n" " exitif cur > laenge + (symsize / 3); % for rounding errors\n" " endfor;\n" " pickup PenA;\n" " thdraw P;\n" "enddef;\n" "\n" "def l_pit_AUT (expr P) =\n" " T:=identity;\n" " laenge:= arclength P;\n" " symsize:=adjust_step(laenge,0.5u);\n" " triangle_width:=symsize/2;\n" " cur:=(symsize-triangle_width)/2;\n" " pickup PenC;\n" " forever:\n" " t1 := arctime (cur) of P;\n" " t := arctime (cur + triangle_width/2) of P;\n" " t2 := arctime (cur + triangle_width) of P;\n" " if ATTR__height >= 10:\n" " thfill (subpath (t1,t2) of P) -- \n" " ((point t of P) + symsize/2 * unitvector(thdir(P,t) rotated 90)) -- \n" " cycle;\n" " else:\n" " thclean (subpath (t1,t2) of P) -- \n" " ((point t of P) + symsize/2 * unitvector(thdir(P,t) rotated 90)) -- \n" " cycle;\n" " thdraw (point t2 of P) --((point t of P) + symsize/2 * unitvector(thdir(P,t) rotated 90)) -- \n" " (point t1 of P);\n" " fi;\n" " cur := cur + symsize;\n" " exitif cur > laenge - (1*symsize/3); % for rounding errors\n" " t1:=arctime (cur) of P;\n" " endfor;\n" " thdraw P;\n" "enddef;\n" "\n" "\n" "let l_overhang_AUT = l_pit_AUT;\n" "\n" "let l_floorstep_AUT = l_floorstep_UIS;\n" "\n" "let l_contour_AUT =l_contour_SKBB;\n" "\n" "def l_flowstone_AUT (expr P) = \n" " T:=identity;\n" " pickup PenC;\n" " thdraw P dashed evenly scaled optical_zoom;\n" "enddef;\n" "\n" "def l_survey_cave_AUT (expr P) =\n" " T:=identity;\n" " pair zz[];\n" " pickup PenD;\n" " thdraw P;\n" "enddef;\n" "\n" "%% points\n" "\n" "def p_stalactite_AUT(expr pos,theta,sc,al) =\n" " pickup PenC;\n" " if ATTR__elevation:\n" " U:=(.15u, .4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thdraw (0,-.4u) -- (0,.15u) -- (-.15u,.4u);\n" " thdraw (0,.15u) -- (.15u,.4u);\n" " else:\n" " U:=(.175u, .175u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thclean fullcircle scaled 0.35u;\n" " thdraw fullcircle scaled 0.35u;\n" " fi;\n" "enddef;\n" "\n" "let p_icestalactite_AUT = p_stalactite_AUT;\n" "\n" "def p_stalagmite_AUT(expr pos,theta,sc,al) =\n" " pickup PenC;\n" " if ATTR__elevation:\n" " U:=(.15u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thdraw (0,.4u) -- (0,-.15u) -- (-.15u,-.4u);\n" " thdraw (0,-.15u) -- (.15u,-.4u);\n" " else:\n" " U:=(.15u,.15u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thfill fullcircle scaled 0.3u;\n" " fi;\n" "enddef;\n" "\n" "let p_icestalagmite_AUT = p_stalagmite_AUT;\n" "\n" "def p_pillar_AUT(expr pos,theta,sc,al) =\n" " pickup PenC;\n" " if ATTR__elevation:\n" " U:=(.15u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thdraw (0,.15u)--(0,-.15u);\n" " thdraw (-.15u,-.4u)--(0,-.15u)--(.15u,-.4u);\n" " thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u);\n" " else:\n" " U:=(.225u,.225u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " thclean fullcircle scaled 0.45u;\n" " thdraw fullcircle scaled 0.45u;\n" " thfill fullcircle scaled 0.3u;\n" " fi;\n" "enddef;\n" "\n" "let p_icepillar_AUT = p_pillar_AUT;\n" "\n" "def p_crystal_AUT (expr pos,theta,sc,al)=\n" " U:=(.35u,.35u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " \n" " pickup PenC;\n" " p := ((-.35*u,0)--(.35*u,0));\n" " thdraw p;\n" " thdraw p rotated (45);\n" " thdraw p rotated (90);\n" " thdraw p rotated (135);\n" " \n" " thdrawoptions();\n" "\n" "enddef;\n" "\n" "def p_spring_AUT (expr pos,theta,sc,al)=\n" " U:=(.3u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,.1u)..(0,-.1u)..(.3u,.1u);\n" "enddef;\n" "\n" "\n" "def p_sink_AUT (expr pos,theta,sc,al)=\n" " U:=(.3u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (-.3u,-.1u)..(0,.1u)..(.3u,-.1u);\n" "enddef;\n" "\n" "def p_breakdownchoke_AUT (expr pos,theta,sc,al)=\n" " U:=(.4u,.4u);\n" " T:=identity rotated -theta aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thclean (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle;\n" " thdraw (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle;\n" " thdraw (-.21u,.305u)--(.0u,-.305u)--(.21u,.305u);\n" "enddef;\n" "\n" "def p_sand_AUT (expr pos,theta,sc,al)=\n" " U:=(.2u,.2u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:= origin -- (0.01u,0.01u);\n" " for i=-0.1u step 0.2u until .15u:\n" " for j=-0.1u step 0.2u until .15u:\n" " thdraw p rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.09u);\n" " endfor;\n" " endfor;\n" " thdrawoptions();\n" "enddef;\n" "\n" "let p_clay_AUT = p_sand_AUT;\n" "\n" "def p_pebbles_AUT (expr pos,theta,sc,al)=\n" " U:=(.4u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " path qq;\n" " for i=-0.15u step 0.3u until .2u:\n" " for j=-0.15u step 0.3u until .2u:\n" " qq := (superellipse((.1u,0),(0,.05u),(-.1u,0),(0,.-.05u),.75))\n" " randomized (u/45)\n" " scaled (uniformdeviate(0.4)+.55)\n" " rotated uniformdeviate(360) \n" " shifted ((i,j) randomized 0.15u);\n" " thdraw qq;\n" " endfor;\n" " endfor;\n" "enddef;\n" "\n" "def p_debris_AUT (expr pos,theta,sc,al)=\n" " U:=(.5u,.5u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " path block,q;\n" " block := ((-.15u,-.15u)--(.15u,-.15u)--(.3u,0.01u)--(.15u,.15u)--(-.15u,.15u)--cycle) ;\n" " \n" " q:= (punked (block randomized (0.15u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.3)+0.3) shifted (0.0u,0.15u);\n" " thclean q; thdraw q;\n" " \n" " q:= (punked (block randomized (0.15u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.5)+0.7) shifted (-0.15u,-0.15u);\n" " thclean q; thdraw q;\n" "\n" " q:= (punked (block randomized (0.15u))) rotated uniformdeviate(360) shifted (0.15u,-0.15u);\n" " thclean q; thdraw q;\n" " \n" "enddef;\n" "\n" "def p_blocks_AUT (expr pos,theta,sc,al)=\n" " U:=(u,u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" "\n" " path block,q;\n" " block := ((-.25u,-.25u)--(.25u,-.25u)--(.5u,0.01u)--(.25u,.25u)--(-.25u,.25u)--cycle) ;\n" " \n" " q:= (punked (block randomized (0.3u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.3)+0.3) shifted (0.0u,0.25u);\n" " thclean q; thdraw q;\n" " \n" " q:= (punked (block randomized (0.3u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.5)+0.7) shifted (-0.25u,-0.25u);\n" " thclean q; thdraw q;\n" "\n" " q:= (punked (block randomized (0.3u))) rotated uniformdeviate(360) shifted (0.25u,-0.25u);\n" " thclean q; thdraw q;\n" " \n" "enddef;\n" "\n" "def p_water_AUT (expr pos,theta,sc,al)=\n" " U:=(.425u,.3u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenD;\n" " p:=fullcircle xscaled (.85u) yscaled (.6u);\n" " thfill p withcolor col_water_bg;\n" " thfill p withpattern pattern_water_AUT;\n" " thdraw p;\n" "enddef;\n" "\n" "def p_ice_AUT (expr pos,theta,sc,al)=\n" " U:=(.6u,.4u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:=(-.15u,.0u) -- (0.15u,.0u);\n" " thdraw p rotated 90;\n" " thdraw p shifted (0.45u,.0u);\n" " thdraw p shifted (-0.45u,.0u);\n" " \n" " thdraw p rotated 90 shifted (-0.45u,0.25u);\n" " thdraw p shifted (0u,0.25u);\n" " thdraw p rotated 90 shifted (0.45u,.25u);\n" "enddef;\n" "\n" "def p_entrance_AUT (expr pos,theta,sc,al)=\n" " U:=(.3u,.75u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " path slice;\n" " for i= -0.5 step 0.01 until 0.5:\n" " slice:= (-.3u*(0.5-i),1.5*i*u)--(0,.75u)--(.3u*(0.5-i),1.5i*u)--cycle;\n" " thfill slice withcolor (min(0.95,0.5-1.75i),min(0.95,.5-1.75i),min(0.95,.5-1.75i));\n" " endfor;\n" " thdraw ((-.3u,-0.75u)--(0,.75u)--(.3u,-0.75u)--cycle);\n" "enddef;\n" " \n" "def p_gradient_AUT (expr pos,theta,sc,al)=\n" " U:=(.15u,u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thdraw (0,-0.5u)--(0,0.5u);\n" " p:=(-.15u,.3u)--(0,0.7u)--(.15u,.3u)--cycle;\n" " thfill p;\n" " thdraw p;\n" "enddef;\n" "\n" "def p_airdraught_AUT (expr pos,theta,sc,al)=\n" " U:=(.2u,u);\n" " T:=identity aligned al rotated theta scaled 1 shifted pos;\n" " pickup PenC;\n" " thdraw (0,.5u)--(0,-0.8u);\n" "\tp:=(-.2u,.2u)--(0,.55u)--(.2u,.2u)--cycle;\n" "\tthfill p;\n" "\tfor i:=1 upto round(3+2*mlog(sc)/mlog 2):\n" "\t thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u);\n" "\t thdraw (0,-(1-0.2i)*u)--(-.2u,-(1-0.2(i-1))*u);\n" "\tendfor;\n" "enddef;\n" "\n" "def p_station_temporary_AUT (expr pos)=\n" " T:=identity shifted pos;\n" " pickup PenD;\n" " thclean fullcircle scaled 0.15u;\n" " thdraw fullcircle scaled 0.15u;\n" "enddef;\n" "\n" "let p_station_painted_AUT = p_station_temporary_AUT ;\n" "let p_station_fixed_AUT = p_station_temporary_AUT ;\n" "\n" "def p_claychoke_AUT (expr pos,theta,sc,al)=\n" " U:=(.4u,.4u);\n" " T:=identity rotated -theta aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " thclean (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle;\n" " thdraw (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle;\n" " thdraw (-.15u,.3u)--(-.15u,-.25u)--(.15u,-.25u);\n" "enddef;\n" "\n" "def p_claytree_AUT (expr pos,theta,sc,al)=\n" " U:=(.55u,.6u);\n" " T:=identity aligned al rotated theta scaled sc shifted pos;\n" " pickup PenC;\n" " p:= (-.15u,.15u)--(.0u,.6u)--(.15u,.15u);\n" " thdraw p ;\n" " thdraw p shifted (-.4u,-.3u);\n" " thdraw p shifted (.4u,-.2u) ;\n" "enddef;\n" "\n" "\n\n\n%%%%% ENDINPUT uAUT %%%%%\n\n\n" "\n" "\n\n\n%%%%% INPUT thTrans %%%%%\n\n\n" "% default translations\n" "\n" "let p_station_fixed = p_station_fixed_ASF;\n" "let p_station_painted = p_station_painted_SKBB;\n" "let p_station_natural = p_station_natural_ASF; \n" "let p_station_temporary = p_station_temporary_ASF;\n" "\n" "let p_waterflow_paleo = p_waterflow_paleo_UIS;\n" "let p_waterflow_permanent = p_waterflow_permanent_UIS;\n" "let p_waterflow_intermittent = p_waterflow_intermittent_UIS;\n" "\n" "let p_stalactite = p_stalactite_UIS;\n" "let p_stalagmite = p_stalagmite_UIS;\n" "let p_pillar = p_pillar_UIS;\n" "let p_icestalactite = p_icestalactite_AUT;\n" "let p_icestalagmite = p_icestalagmite_AUT;\n" "let p_icepillar = p_icepillar_AUT;\n" "let p_curtain = p_curtain_UIS;\n" "let p_helictite = p_helictite_UIS;\n" "let p_sodastraw = p_sodastraw_UIS;\n" "let p_crystal = p_crystal_UIS;\n" "let p_flowstone = p_flowstone_UIS;\n" "let p_moonmilk = p_moonmilk_UIS;\n" "let p_wallcalcite = p_wallcalcite_UIS;\n" "let p_popcorn = p_popcorn_UIS;\n" "let p_disk = p_disk_UIS;\n" "let p_gypsum = p_gypsum_NSS;\n" "let p_aragonite = p_aragonite_NSS;\n" "let p_cavepearl = p_cavepearl_SKBB;\n" "let p_gypsumflower = p_gypsumflower_NSS;\n" "let p_rimstonepool = p_rimstonepool_ASF;\n" "let p_rimstonedam = p_rimstonedam_ASF;\n" "let p_anastomosis = p_anastomosis_UIS;\n" "let p_karren = p_karren_UIS;\n" "let p_scallop = p_scallop_UIS;\n" "let p_flute = p_flute_UIS;\n" "let p_raft = p_raft_NSS;\n" "let p_raftcone = p_raftcone_NSS;\n" "let p_spring = p_spring_SKBB;\n" "let p_sink = p_sink_SKBB;\n" "let p_narrowend = p_narrowend_UIS;\n" "let p_lowend = p_lowend_UIS;\n" "let p_flowstonechoke = p_flowstonechoke_NSS;\n" "let p_breakdownchoke = p_breakdownchoke_NSS;\n" "let p_claychoke = p_claychoke_AUT;\n" "let p_claytree = p_claytree_AUT;\n" "let p_bedrock = p_bedrock_ASF;\n" "let p_clay = p_clay_SKBB; \n" "let p_sand = p_sand_UIS;\n" "let p_pebbles = p_pebbles_UIS;\n" "let p_debris = p_debris_UIS;\n" "let p_blocks = p_blocks_UIS;\n" "let p_water = p_water_UIS;\n" "let p_ice = p_ice_UIS;\n" "let p_snow = p_snow_SKBB;\n" "let p_archeomaterial = p_archeomaterial_UIS;\n" "let p_paleomaterial = p_paleomaterial_UIS;\n" "let p_guano = p_guano_UIS;\n" "let p_vegetabledebris = p_vegetabledebris_ASF;\n" "let p_root = p_root_ASF;\n" "let p_entrance = p_entrance_UIS;\n" "let p_gradient = p_gradient_UIS;\n" "let p_rope = p_rope_SKBB; \n" "let p_fixedladder = p_fixedladder_SKBB; \n" "let p_ropeladder = p_ropeladder_SKBB; \n" "let p_steps = p_steps_SKBB; \n" "let p_bridge = p_bridge_SKBB; \n" "let p_traverse = p_traverse_SKBB;\n" "let p_anchor = p_anchor_SKBB;\n" "let p_camp = p_camp_SKBB;\n" "let p_dig = p_dig_UIS;\n" "let p_noequipment = p_noequipment_SKBB;\n" "let p_sectionarrow = p_sectionarrow_SKBB;\n" "let p_continuation = p_continuation_UIS;\n" "let p_airdraught = p_airdraught_UIS;\n" "let p_airdraught_winter = p_airdraught_winter_UIS;\n" "let p_airdraught_summer = p_airdraught_summer_UIS;\n" "let p_station = p_station_SKBB;\n" "let p_handrail = p_handrail_SKBB;\n" "let p_viaferrata = p_viaferrata_SKBB;\n" "let p_stalactites = p_stalactites_UIS;\n" "let p_stalagmites = p_stalagmites_UIS;\n" "let p_pillars = p_pillars_UIS;\n" "\n" "let l_wall_bedrock = l_wall_bedrock_UIS;\n" "let l_wall_sand = l_wall_sand_SKBB;\n" "let l_wall_clay = l_wall_clay_SKBB;\n" "let l_wall_pebbles = l_wall_pebbles_SKBB;\n" "let l_wall_debris = l_wall_debris_SKBB;\n" "let l_wall_blocks = l_wall_blocks_SKBB;\n" "let l_wall_ice = l_wall_ice_SKBB;\n" "let l_wall_underlying = l_wall_underlying_UIS;\n" "let l_wall_unsurveyed = l_wall_unsurveyed_SKBB;\n" "let l_wall_presumed = l_wall_presumed_UIS;\n" "%let l_wall_invisible = l_wall_invisible;\n" "let l_wall_pit = l_wall_pit_AUT;\n" "let l_wall_overlying = l_wall_overlying_AUT;\n" "let l_wall_flowstone = l_wall_flowstone_AUT;\n" "let l_wall_moonmilk = l_wall_moonmilk_AUT;\n" "\n" "let l_waterflow_permanent = l_waterflow_permanent_UIS;\n" "let l_waterflow_intermittent = l_waterflow_intermittent_SKBB;\n" "let l_waterflow_conjectural = l_waterflow_conjectural_SKBB;\n" "\n" "let l_border_visible = l_border_visible_SKBB;\n" "let l_border_temporary = l_border_temporary_SKBB;\n" "let l_border_presumed = l_border_presumed_SKBB;\n" "%let l_border_invisible = l_border_invisible;\n" "\n" "let l_floorstep = l_floorstep_UIS;\n" "let l_pit = l_pit_UIS;\n" "let l_ceilingstep = l_ceilingstep_SKBB;\n" "let l_chimney = l_chimney_UIS;\n" "let l_overhang = l_overhang_SKBB;\n" "let l_slope = l_slope_SKBB;\n" "let l_ceilingmeander = l_ceilingmeander_SKBB;\n" "let l_floormeander = l_floormeander_SKBB;\n" "let l_contour = l_contour_SKBB;\n" "let l_rockborder = l_rockborder_UIS;\n" "let l_rockedge = l_rockedge_UIS;\n" "let l_flowstone = l_flowstone_UIS;\n" "let l_moonmilk = l_moonmilk_UIS;\n" "let l_section = l_section_SKBB;\n" "let l_survey_cave = l_survey_cave_SKBB;\n" "let l_survey_surface = l_survey_surface_SKBB;\n" "let l_arrow = l_arrow_SKBB;\n" "let l_gradient = l_gradient_UIS;\n" "let l_mapconnection = l_mapconnection_SKBB;\n" "let l_handrail = l_handrail_SKBB;\n" "let l_steps = l_steps_SKBB;\n" "let l_fixedladder = l_fixedladder_SKBB;\n" "let l_ropeladder = l_ropeladder_SKBB;\n" "let l_rope = l_rope_SKBB;\n" "let l_viaferrata = l_viaferrata_SKBB;\n" "\n" "let a_water = a_water_UIS;\n" "let a_sump = a_sump_UIS;\n" "let a_sand = a_sand_UIS;\n" "let a_debris = a_debris_SKBB;\n" "let a_blocks = a_blocks_SKBB;\n" "let a_snow = a_snow_SKBB;\n" "let a_ice = a_ice_SKBB;\n" "let a_pebbles = a_pebbles_SKBB;\n" "let a_clay = a_clay_SKBB;\n" "let a_bedrock = a_bedrock_SKBB;\n" "let a_flowstone = a_flowstone_ASF;\n" "let a_moonmilk = a_moonmilk_SKBB;\n" "let a_dimensions = a_dimensions_SKBB;\n" "\n" "let s_northarrow = s_northarrow_SKBB;\n" "let s_scalebar = s_scalebar_SKBB;\n" "let s_hgrid = s_hgrid_SM;\n" "let s_vgrid = s_vgrid_SM;\n" "\n\n\n%%%%% ENDINPUT thTrans %%%%%\n\n\n" "\n" "nonstopmode;\n" "initsymbol(\"s_hgrid_SM\");\n" "initsymbol(\"s_northarrow_SKBB\");\n" "initsymbol(\"s_scalebar_SKBB\");\n" "initsymbol(\"s_scalebar_SM\");\n" "initsymbol(\"s_vgrid_SM\");\n" "initsymbol(\"p_airdraught_AUT\");\n" "initsymbol(\"p_airdraught_UIS\");\n" "initsymbol(\"p_airdraught_summer_UIS\");\n" "initsymbol(\"p_airdraught_winter_UIS\");\n" "initsymbol(\"p_anastomosis_UIS\");\n" "initsymbol(\"p_anchor_SKBB\");\n" "initsymbol(\"p_aragonite_NSS\");\n" "initsymbol(\"p_archeomaterial_UIS\");\n" "initsymbol(\"p_bedrock_ASF\");\n" "initsymbol(\"p_blocks_AUT\");\n" "initsymbol(\"p_blocks_UIS\");\n" "initsymbol(\"p_breakdownchoke_AUT\");\n" "initsymbol(\"p_breakdownchoke_NSS\");\n" "initsymbol(\"p_bridge_SKBB\");\n" "initsymbol(\"p_camp_SKBB\");\n" "initsymbol(\"p_cavepearl_SKBB\");\n" "initsymbol(\"p_clay_AUT\");\n" "initsymbol(\"p_clay_SKBB\");\n" "initsymbol(\"p_claychoke_AUT\");\n" "initsymbol(\"p_claytree_AUT\");\n" "initsymbol(\"p_continuation_UIS\");\n" "initsymbol(\"p_crystal_AUT\");\n" "initsymbol(\"p_crystal_UIS\");\n" "initsymbol(\"p_curtain_UIS\");\n" "initsymbol(\"p_debris_AUT\");\n" "initsymbol(\"p_debris_UIS\");\n" "initsymbol(\"p_dig_UIS\");\n" "initsymbol(\"p_disk_UIS\");\n" "initsymbol(\"p_entrance_AUT\");\n" "initsymbol(\"p_entrance_UIS\");\n" "initsymbol(\"p_fixedladder_SKBB\");\n" "initsymbol(\"p_flowstone_UIS\");\n" "initsymbol(\"p_flowstonechoke_NSS\");\n" "initsymbol(\"p_flute_UIS\");\n" "initsymbol(\"p_gradient_AUT\");\n" "initsymbol(\"p_gradient_BCRA\");\n" "initsymbol(\"p_gradient_NSS\");\n" "initsymbol(\"p_gradient_SKBB\");\n" "initsymbol(\"p_gradient_UIS\");\n" "initsymbol(\"p_guano_UIS\");\n" "initsymbol(\"p_gypsum_NSS\");\n" "initsymbol(\"p_gypsumflower_NSS\");\n" "initsymbol(\"p_handrail_SKBB\");\n" "initsymbol(\"p_helictite_UIS\");\n" "initsymbol(\"p_ice_AUT\");\n" "initsymbol(\"p_ice_UIS\");\n" "initsymbol(\"p_icepillar_AUT\");\n" "initsymbol(\"p_icestalactite_AUT\");\n" "initsymbol(\"p_icestalagmite_AUT\");\n" "initsymbol(\"p_karren_UIS\");\n" "initsymbol(\"p_lowend_NSS\");\n" "initsymbol(\"p_lowend_UIS\");\n" "initsymbol(\"p_moonmilk_UIS\");\n" "initsymbol(\"p_narrowend_UIS\");\n" "initsymbol(\"p_noequipment_SKBB\");\n" "initsymbol(\"p_paleomaterial_UIS\");\n" "initsymbol(\"p_pebbles_AUT\");\n" "initsymbol(\"p_pebbles_UIS\");\n" "initsymbol(\"p_pillar_AUT\");\n" "initsymbol(\"p_pillar_UIS\");\n" "initsymbol(\"p_pillars_UIS\");\n" "initsymbol(\"p_popcorn_UIS\");\n" "initsymbol(\"p_raft_NSS\");\n" "initsymbol(\"p_raftcone_NSS\");\n" "initsymbol(\"p_rimstonedam_ASF\");\n" "initsymbol(\"p_rimstonepool_ASF\");\n" "initsymbol(\"p_root_ASF\");\n" "initsymbol(\"p_rope_SKBB\");\n" "initsymbol(\"p_ropeladder_SKBB\");\n" "initsymbol(\"p_sand_AUT\");\n" "initsymbol(\"p_sand_UIS\");\n" "initsymbol(\"p_scallop_UIS\");\n" "initsymbol(\"p_sink_AUT\");\n" "initsymbol(\"p_sink_SKBB\");\n" "initsymbol(\"p_snow_SKBB\");\n" "initsymbol(\"p_sodastraw_UIS\");\n" "initsymbol(\"p_spring_AUT\");\n" "initsymbol(\"p_spring_SKBB\");\n" "initsymbol(\"p_stalactite_AUT\");\n" "initsymbol(\"p_stalactite_UIS\");\n" "initsymbol(\"p_stalactites_UIS\");\n" "initsymbol(\"p_stalagmite_AUT\");\n" "initsymbol(\"p_stalagmite_UIS\");\n" "initsymbol(\"p_stalagmites_UIS\");\n" "initsymbol(\"p_station_SKBB\");\n" "initsymbol(\"p_station_fixed_ASF\");\n" "initsymbol(\"p_station_fixed_AUT\");\n" "initsymbol(\"p_station_natural_ASF\");\n" "initsymbol(\"p_station_painted_AUT\");\n" "initsymbol(\"p_station_painted_SKBB\");\n" "initsymbol(\"p_station_temporary_ASF\");\n" "initsymbol(\"p_station_temporary_AUT\");\n" "initsymbol(\"p_station_temporary_SKBB\");\n" "initsymbol(\"p_steps_SKBB\");\n" "initsymbol(\"p_traverse_SKBB\");\n" "initsymbol(\"p_vegetabledebris_ASF\");\n" "initsymbol(\"p_viaferrata_SKBB\");\n" "initsymbol(\"p_wallcalcite_UIS\");\n" "initsymbol(\"p_water_AUT\");\n" "initsymbol(\"p_water_UIS\");\n" "initsymbol(\"p_waterflow_intermittent_UIS\");\n" "initsymbol(\"p_waterflow_paleo_UIS\");\n" "initsymbol(\"p_waterflow_permanent_UIS\");\n" "initsymbol(\"l_arrow_SKBB\");\n" "initsymbol(\"l_border_presumed_SKBB\");\n" "initsymbol(\"l_border_temporary_SKBB\");\n" "initsymbol(\"l_border_visible_SKBB\");\n" "initsymbol(\"l_ceilingmeander_NZSS\");\n" "initsymbol(\"l_ceilingmeander_SKBB\");\n" "initsymbol(\"l_ceilingmeander_UIS\");\n" "initsymbol(\"l_ceilingstep_NZSS\");\n" "initsymbol(\"l_ceilingstep_SKBB\");\n" "initsymbol(\"l_ceilingstep_UIS\");\n" "initsymbol(\"l_chimney_NZSS\");\n" "initsymbol(\"l_chimney_UIS\");\n" "initsymbol(\"l_contour_AUT\");\n" "initsymbol(\"l_contour_SKBB\");\n" "initsymbol(\"l_contour_UIS\");\n" "initsymbol(\"l_fixedladder_SKBB\");\n" "initsymbol(\"l_floormeander_SKBB\");\n" "initsymbol(\"l_floorstep_AUT\");\n" "initsymbol(\"l_floorstep_UIS\");\n" "initsymbol(\"l_flowstone_AUT\");\n" "initsymbol(\"l_flowstone_UIS\");\n" "initsymbol(\"l_gradient_BCRA\");\n" "initsymbol(\"l_gradient_UIS\");\n" "initsymbol(\"l_handrail_SKBB\");\n" "initsymbol(\"l_mapconnection_SKBB\");\n" "initsymbol(\"l_moonmilk_UIS\");\n" "initsymbol(\"l_overhang_AUT\");\n" "initsymbol(\"l_overhang_SKBB\");\n" "initsymbol(\"l_pit_AUT\");\n" "initsymbol(\"l_pit_UIS\");\n" "initsymbol(\"l_rockborder_UIS\");\n" "initsymbol(\"l_rockedge_UIS\");\n" "initsymbol(\"l_rope_SKBB\");\n" "initsymbol(\"l_ropeladder_SKBB\");\n" "initsymbol(\"l_section_SKBB\");\n" "initsymbol(\"l_slope_BCRA\");\n" "initsymbol(\"l_slope_SKBB\");\n" "initsymbol(\"l_steps_SKBB\");\n" "initsymbol(\"l_survey_cave_AUT\");\n" "initsymbol(\"l_survey_cave_SKBB\");\n" "initsymbol(\"l_survey_cave_UIS\");\n" "initsymbol(\"l_survey_surface_SKBB\");\n" "initsymbol(\"l_viaferrata_SKBB\");\n" "initsymbol(\"l_wall_bedrock_UIS\");\n" "initsymbol(\"l_wall_blocks_AUT\");\n" "initsymbol(\"l_wall_blocks_SKBB\");\n" "initsymbol(\"l_wall_clay_AUT\");\n" "initsymbol(\"l_wall_clay_SKBB\");\n" "initsymbol(\"l_wall_debris_AUT\");\n" "initsymbol(\"l_wall_debris_SKBB\");\n" "initsymbol(\"l_wall_flowstone_AUT\");\n" "initsymbol(\"l_wall_ice_AUT\");\n" "initsymbol(\"l_wall_ice_SKBB\");\n" "initsymbol(\"l_wall_moonmilk_AUT\");\n" "initsymbol(\"l_wall_overlying_AUT\");\n" "initsymbol(\"l_wall_pebbles_AUT\");\n" "initsymbol(\"l_wall_pebbles_SKBB\");\n" "initsymbol(\"l_wall_pit_AUT\");\n" "initsymbol(\"l_wall_presumed_NZSS\");\n" "initsymbol(\"l_wall_presumed_UIS\");\n" "initsymbol(\"l_wall_sand_AUT\");\n" "initsymbol(\"l_wall_sand_SKBB\");\n" "initsymbol(\"l_wall_underlying_AUT\");\n" "initsymbol(\"l_wall_underlying_UIS\");\n" "initsymbol(\"l_wall_unsurveyed_SKBB\");\n" "initsymbol(\"l_waterflow_conjectural_SKBB\");\n" "initsymbol(\"l_waterflow_intermittent_SKBB\");\n" "initsymbol(\"l_waterflow_permanent_UIS\");\n" "initsymbol(\"a_bedrock_SKBB\");\n" "initsymbol(\"a_blocks_AUT\");\n" "initsymbol(\"a_blocks_SKBB\");\n" "initsymbol(\"a_clay_AUT\");\n" "initsymbol(\"a_clay_SKBB\");\n" "initsymbol(\"a_debris_AUT\");\n" "initsymbol(\"a_debris_SKBB\");\n" "initsymbol(\"a_debris_UIS\");\n" "initsymbol(\"a_dimensions_SKBB\");\n" "initsymbol(\"a_flowstone_ASF\");\n" "initsymbol(\"a_ice_AUT\");\n" "initsymbol(\"a_ice_SKBB\");\n" "initsymbol(\"a_moonmilk_SKBB\");\n" "initsymbol(\"a_pebbles_AUT\");\n" "initsymbol(\"a_pebbles_SKBB\");\n" "initsymbol(\"a_sand_AUT\");\n" "initsymbol(\"a_sand_UIS\");\n" "initsymbol(\"a_snow_AUT\");\n" "initsymbol(\"a_snow_SKBB\");\n" "initsymbol(\"a_sump_AUT\");\n" "initsymbol(\"a_sump_SKBB\");\n" "initsymbol(\"a_sump_UIS\");\n" "initsymbol(\"a_water_AUT\");\n" "initsymbol(\"a_water_SKBB\");\n" "initsymbol(\"a_water_UIS\");\n" ; #else const char * thmpost_library = "input therion;"; #endif therion/thversion.h0000664000175000017500000000003312341130224013424 0ustar useruser#define THVERSION "5.3.16" therion/thperson.h0000664000175000017500000000337310721203330013256 0ustar useruser/** * @file thperson.h * Person class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thperson_h #define thperson_h /** * Person class. */ class thperson { const char * n1, ///< First name. * n2, ///< Second name. * nn; ///< Identification string. void reset(); ///< Reset person names. void identify(class thdatabase * dbp); ///< Make identification string. friend bool operator < (const class thperson &, const class thperson &); friend bool operator == (const class thperson &, const class thperson &); public: /** * Standard constructor. */ thperson(); /** * Parse the person name. */ void parse(thdatabase * dbp, char * src); /** * Return first name. */ const char * get_n1() const; /** * Return second name. */ const char * get_n2() const; }; #endif therion/thscraplp.h0000664000175000017500000000310711656736364013441 0ustar useruser/** * @file thscraplp.h * Scrap polygon line class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thscraplp_h #define thscraplp_h #include #include "thdb1d.h" #include /** * Scrap polygon line class. */ class thscraplp { public: thscraplp * next_item, * prev_item; thobjectname station_name; thdb1ds * station, * ustation; class thdb1d_tree_arrow * arrow; thscraplp(); ///< Default constructor double stx, sty, stz, lnx1, lnx2, lny1, lny2, lnz1, lnz2; bool lnio; int type; void export_mp(class thexpmapmpxs * out, class thscrap * scrap, bool background); }; typedef std::list thscraplp_list; ///< Points list. #endif therion/thconvert.h0000664000175000017500000000177610625655142013454 0ustar useruser/* * Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thconvert_h #define thconvert_h int thconvert(); void read_rgb(); #endif therion/thbuffer.cxx0000664000175000017500000000533610722030254013601 0ustar useruser/** * @file thbuffer.cxx * String buffer class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thbuffer.h" thbuffer::thbuffer() { this->size = 16; this->buff = new char [this->size]; this->buff[0] = 0; } thbuffer::~thbuffer() { if (this->buff) delete [] this->buff; } void thbuffer::enlarge(size_t min_size) { char * new_buff; size_t new_size = 4 * this->size; while(new_size <= min_size) new_size *= 4; new_buff = new char [new_size]; memcpy(new_buff, this->buff, this->size); delete [] this->buff; this->buff = new_buff; this->size = new_size; } char * thbuffer::strncpy(const char * src, size_t n) { if (n >= this->size) this->enlarge(n); ::strncpy(this->buff, src, n); this->buff[n] = 0; return this->buff; } char * thbuffer::strcpy(const char * src) { size_t srclen = strlen(src); if (srclen >= this->size) this->enlarge(srclen); return ::strcpy(this->buff, src); } char * thbuffer::strcat(const char * src) { size_t newlen = strlen(src) + strlen(this->buff); if (newlen >= this->size) this->enlarge(newlen); return ::strcat(this->buff, src); } char * thbuffer::strncat(const char * src, size_t n) { size_t newlen = n + 1 + strlen(this->buff); if (newlen >= this->size) this->enlarge(newlen); return ::strncat(this->buff, src, n); } thbuffer::operator char* () { return this->buff; } thbuffer::operator char** () { return &(this->buff); } char * thbuffer::get_buffer() { return this->buff; } thbuffer & thbuffer::operator=(const char * src) { this->strcpy(src); return *this; } thbuffer & thbuffer::operator=(thbuffer const & srcbf) { this->strcpy(srcbf.buff); return *this; } thbuffer & thbuffer::operator+=(const char * src) { this->strcat(src); return *this; } void thbuffer::guarantee(size_t bs) { if (this->size <= bs) this->enlarge(bs); } therion/man/0000775000175000017500000000000012426431177012030 5ustar userusertherion/man/xtherion.10000664000175000017500000000206007735157760013762 0ustar useruser.TH "THERION" "1" "2003/07/15" .SH "NAME" XTherion \(em Graphical drawing editor for Therion .SH "SYNOPSIS" .PP \fBxtherion\fP .SH "DESCRIPTION" .PP This manual page documents \fBXTherion\fP, which is part of the therion package. .PP \fBXTherion\fP is an application that serves as a graphical front end for Therion. Therion itself works entirely with text-based files, but much of the data needs to be generated graphically, so XTherion is one example of how it might be done. It is written in Tcl/Tk. .PP \fBXTherion\fP lets you load a background GIF, PPM or PNM (a scan of the cave segment or to-scale notes), scale it, then draw Therion 'scraps' over the image, and relate it to survey stations and save the resulting data. .PP For full information see The Therion Book which describes the application and its use in detail. .SH "OPTIONS" .PP XTherion takes no options. .SH "SEE ALSO" .PP therion (1) .SH "AUTHOR" .PP Stacho Mudrak. This manual page was written by Wookey wookey@debian.org for the \fBDebian\fP system. Modified by MB.therion/man/therion.10000664000175000017500000001014607705142140013555 0ustar useruser.TH "THERION" "1" "2003/07/15" .SH "NAME" Therion \(em program to draw cave surveys .SH "SYNOPSIS" .PP \fBtherion\fP [\fB-q\fP] [\fB-L\fP] [\fB-l \fIlog-file\fR] [\fB-s \fIsource file\fR] [\fB-p \fIsearch path\fR] [\fB-g\fP|\fB-u\fP] [\fB-i\fP] [\fB-d\fP] [\fB-x\fP] [config-file] .PP \fBtherion\fP [\fB-h\fP|\fB--help\fP] [\fB-v\fP|\fB--version\fP] [\fB--print-encodings\fP] [\fB--print-tex-encodings\fP] [\fB--print-init-file\fP] .SH "DESCRIPTION" .PP This manual page briefly documents \fBTherion\fP and provides an overview of the package. .PP \fBTherion\fP is a program that processes Therion data files to produce cave surveys. The data files are usually .th files which contain survey data, largely equivalent to survex .svx files, .th2 files which contain drawing data and thconfig files which control the data files to be used and the maps to be output. .PP \fBTherion\fP uses a number of helper programs to do its job. \fBSurvex\fP is used to process the centreline data, \fBMetaPost\fP is used to draw cave symbols, and \fBpdfTeX\fP generates the final maps. .PP In order to make the entering of drawing data practical, and to make the editing of survey files easier, a graphical editor \fBXTherion\fP is included. This also includes a 'compiler' function which runs Therion on the data to produce output. This is implemented using Tcl/Tk. .PP The Therion data files describe the cave as text in terms of objects so the corresponding graphical representations are only inserted at output generation time. This means that a survey can be produced using whichever symbol set you require by specifying the relevant set of MetaPost macros. Currently the UIS symbol set is supported. .PP Multiple languages and character sets are supported \(em currently ISO-8859-1, ISO-8859-2, ISO-8859-5, ISO-8859-7, UTF-8, ASCII and CP1250. .SH "ARGUMENTS" .PP therion takes only one argument \(em a \fIconfig-file\fP. If no file is specified then the default \fIthconfig\fP file in the current directory will be used. A new default file can be created using the \fB-g\fP option. .SH "OPTIONS" .PP This program follows the usual GNU command line syntax, with long options starting with two dashes ("--"). A summary of options is included below. For a complete description, see \fBThe Therion Book\fP. .IP "\fB-h\fP, \fB--help\fP" 10 Show summary of options. .IP "\fB-v\fP, \fB--version\fP" 10 Show version information. .IP "\fB-q\fP" 10 Quiet mode \(em minimise output. .IP "\fB-g\fP" 10 Generate a new configuration file. This will be the given config-file if specified, or \fBthconfig\fP in the current directory if not. If the file already exists, it will be overwritten. .IP "\fB-i\fP" 10 Ignore comments when writing (-g|-u) configuration file. .IP "\fB-L\fP" 10 Do not create a log-file. Normally all messages are written into a \fBtherion.log\fP file. .IP "\fB-l log-file\fP" 10 Change the name of the log file. .IP "\fB-p search-path\fP" 10 This option is used to set the search path (or list of paths, separated by colon), which therion will use to find its source files (if it doesn't find them in the working directory). .IP "\fB-q\fP" 10 Run therion in quiet mode. It will print only warning and error messages (to STDERR). .IP "\fB--print-encodings\fP" 10 Print a list of all supported encodings. .IP "\fB--print-init-file\fP" 10 Print a default initialisation file. For more details see the Initialisation section in the Appendix of the Therion Book. .IP "\fB-s\fP" 10 Set the name of the source file. .IP "\fB-u\fP" 10 Upgrade the configuration file. .IP "\fB-d\fP" 10 Turn on debugging mode. The current implementation creates a temporary directory named \fBthTMPDIR\fP (in your system temporary directory) and does not delete any temporary files. .SH "SEE ALSO" .PP xtherion (1) .PP For full information see The Therion Book which describes Therion and its use in detail. .SH "AUTHORS" .PP Stacho Mudrak and Martin Budaj. This manual page was written by Wookey wookey@debian.org for the \fBDebian\fP system. Modified by MB.therion/makefile.pl0000664000175000017500000000175612346020677013400 0ustar useruseruse File::Glob; use File::Copy; use File::Path; if ($ARGV[0] =~ /^\s*cp\s*$/i) { copy($ARGV[1],$ARGV[2]) || die("$0: error -- cp $ARGV[1] -> $ARGV[2]\n"); } elsif ($ARGV[0] =~ /^\s*mv\s*$/i) { copy($ARGV[1],$ARGV[2]) || die("$0: error -- cp $ARGV[1] -> $ARGV[2]\n"); unlink($ARGV[1]) || warn("$0: can't delete $ARGV[1]\n");; } elsif ($ARGV[0] =~ /^\s*rm\s*$/i) { $dum = shift @ARGV; $quietdel = ''; if ($ARGV[0] =~ /^\s*\-q\s*$/) { $dum = shift @ARGV; $quietdel = 1; } foreach $f (@ARGV) { if ($f =~ /\*/) { @fl = glob($f); foreach $ff (@fl) { unlink($ff) || $quietdel || warn("$0: can't delete $ff\n"); } } else { unlink($f) || $quietdel || warn("$0: can't delete $f\n"); } } } elsif ($ARGV[0] =~ /^\s*rmdir\s*$/i) { $dum = shift @ARGV; $quietdel = ''; if ($ARGV[0] =~ /^\s*\-q\s*$/) { $dum = shift @ARGV; $quietdel = 1; } foreach $f (@ARGV) { rmtree($f) || $quietdel || warn("$0: can't delete $f\n");; } } therion/thparse.h0000664000175000017500000001753111253631700013072 0ustar useruser/** * @file thparse.h * Parsing module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thparse_h #define thparse_h #include #include #include "thbuffer.h" #include "thmbuffer.h" enum { TT_IMG_TYPE_UNKNOWN, TT_IMG_TYPE_JPEG, TT_IMG_TYPE_PNG, }; /** * Token definition structure. */ typedef struct { const char * s; ///< String. int tok; ///< Token. } thstok; /** * Match string token. * * Scan array of token definitions (stok) for given string. If not found, * last element of array is returned. This array should allways be * alphabetically sorted and last element should be set to * like TT_UNKNOWN. * * @param buffer String buffer. * @param tab Array of token definitions. * @param tab_size Size of token array (ID of last element). * * @sa thmatch_token */ int thmatch_stok(const char *buffer, const thstok *tab, int tab_size); int thcasematch_stok(const char *buffer, const thstok *tab, int tab_size); /** * Match string token macro. */ #define thmatch_token(buffer, table) thmatch_stok(buffer, table,\ ((sizeof(table)/sizeof(thstok)) - 1)) #define thcasematch_token(buffer, table) thcasematch_stok(buffer, table,\ ((sizeof(table)/sizeof(thstok)) - 1)) /** * Match token string. * * Inverse function to thmatch_stok(). */ const char * thmatch_tstring(int token, const thstok *tab, int tab_size); /** * Match token string macro. */ #define thmatch_string(token, table) thmatch_tstring(token, table,\ ((sizeof(table)/sizeof(thstok)) - 1)) /** * Boolean tokens. */ enum { TT_UNKNOWN_BOOL = 0, ///< Not match. TT_TRUE, ///< yes, on, 1, true. TT_FALSE, ///< no, off, 0, false. TT_AUTO, ///< automatical setting }; /** * Boolean token table. * * Defines following: * - 1, on, yes, true = TT_TRUE * - 0, off, no, false = TT_FALSE * - TT_UNKNOWN_BOOL otherwise */ static const thstok thtt_bool[] = { // {"0", TT_FALSE}, // {"1", TT_TRUE}, // {"false", TT_FALSE}, // {"no", TT_FALSE}, {"off", TT_FALSE}, {"on", TT_TRUE}, // {"true", TT_TRUE}, // {"yes", TT_TRUE}, {NULL, TT_UNKNOWN_BOOL} }; /** * ON/OFF/AUTO token table. */ static const thstok thtt_onoffauto[] = { {"auto", TT_AUTO}, {"off", TT_FALSE}, {"on", TT_TRUE}, {NULL, TT_UNKNOWN_BOOL} }; /** * Special values tokens. */ enum { TT_SV_UNKNOWN, ///< Unknown special value TT_SV_NUMBER, ///< A real number. TT_SV_NAN, ///< Not a number. TT_SV_PINF, ///< Positive infinity. TT_SV_NINF, ///< Negative infinity. TT_SV_UP, ///< Up direction. TT_SV_DOWN, ///< Down direction. TT_SV_ALL, ///< All TT_SV_OFF, ///< Off }; /** * Special values token table. * * Defines following: * - "-", ".", "nan", "NAN", "NaN" = TT_SV_NAN * - "Inf", "inf", "INF" = TT_SV_PINF * - "-Inf", "-inf", "-INF" = TT_SV_NINF * - "up", "Up", "UP" = TT_SV_UP * - "down", "Down", "DOWN" = TT_SV_DOWN * - TT_SV_UNKNOWN otherwise */ static const thstok thtt_special_val[] = { {"-", TT_SV_NAN}, {"-INF", TT_SV_NINF}, {"-Inf", TT_SV_NINF}, {"-inf", TT_SV_NINF}, {".", TT_SV_NAN}, {"DOWN", TT_SV_DOWN}, {"Down", TT_SV_DOWN}, {"INF", TT_SV_PINF}, {"Inf", TT_SV_PINF}, {"NAN", TT_SV_NAN}, {"NaN", TT_SV_NAN}, {"UP", TT_SV_UP}, {"Up", TT_SV_UP}, {"all", TT_SV_ALL}, {"down", TT_SV_DOWN}, {"inf", TT_SV_PINF}, {"nan", TT_SV_NAN}, {"off", TT_SV_OFF}, {"up", TT_SV_UP}, {NULL, TT_SV_UNKNOWN} }; /** * Parse double value (with check for special values). */ void thparse_double(int & sv, double & dv, const char * src); /** * Parse length value. */ void thparse_length(int & sv, double & dv, const char * src); /** * Parse double value given in DMS (with check for special values). */ void thparse_double_dms(int & sv, double & dv, const char * src); /** * Update double value (with check for special values). */ #define thupdate_double(ov, uv) if (!(thisnan(uv))) ov = uv /** * Split given string into first word and the rest. */ void thsplit_word(thbuffer * dword, thbuffer * drest, const char * src); /** * Split given string into words (separated by white spaces). */ void thsplit_words(thmbuffer * dest, const char * src); /** * Split given string into substrings. * * In the source, they're separated by given character separator. */ void thsplit_strings(thmbuffer * dest, const char * src, const char separator); /** * Split given string into paths. * * Take care of C:\.... */ void thsplit_paths(thmbuffer * dest, const char * src, char separator); /** * Separate given argument string. * * Arguments are separated by white spaces. Strings could be quoted * ("" = ") or given in [] brackets. */ void thsplit_args(thmbuffer * dest, const char * src); /** * Separate path part from full file name. */ void thsplit_fpath(thbuffer * dest, const char * src); /** * Check if given string is keyword. * * Valid keyword characters are A-Z, a-z, 0-9,'_' and '-'. */ bool th_is_keyword(const char * str); /** * Check if given string is index (positive integer). */ bool th_is_index(const char * str); /** * Check if given string is keyword list. * * Valid keyword characters are A-Z, a-z, 0-9,'_' and '-'. * * @param str Input string. * @param sep Keyword separator. */ bool th_is_keyword_list(const char * str, char sep); /** * Check if given string is extended keyword. * * A-Z, a-z, 0-9 and [_.,-/+*'] */ bool th_is_extkeyword(const char * str); /** * Decode string into C format. */ void thdecode_c(thbuffer * dest, const char * src); void thdecode_tcl(thbuffer * dest, const char * src); /** * Decode string into TeX format. */ void thdecode_tex(thbuffer * dest, const char * src); void thdecode_utf2tex(thbuffer * dest, const char * src); void thdecode_sql(thbuffer * dest, const char * src); void thdecode_mp(thbuffer * dest, const char * src); /** * Decode into argument string. */ void thdecode_arg(thbuffer * dest, const char * src); /** * Parse altitude value */ void thparse_altitude(const char * src, double & altv, double & fixv); /** * Check image. */ void thparse_image(const char * fname, double & width, double & height, double & dpi, int & type); /** * Set color according to color map (TODO). */ void thset_color(int color_map, double index, double total, double & R, double & G, double & B); /** * Set grid origin and size. */ void thset_grid(double gorigin, double gsize, double min, double max, double & qstart, long & nquads); /** * Convert therion string to xhtml. */ const char * thutf82xhtml(const char * src); /** * Base 64 file encoder. */ void thbase64_encode(const char * fname, FILE * fout); /** * Check if path is absolute. */ bool thpath_is_absolute(const char * fname); /** * Check on attribute name. */ bool th_is_attr_name(const char * str); std::string ths2tex(std::string original, int lang = -1, bool remove_kerning = false); std::string ths2txt(const char * original, int lang = -1, int encoding = -1); std::string ths2txt(std::string original, int lang = -1, int encoding = -1); #endif therion/thconvert.cxx0000664000175000017500000006530711462110512014012 0ustar useruser/** * @file thconvert.cxx */ /* Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ // #include #include #include #include #include #include #include #include #include #include #include #include #include #include "thpdfdbg.h" #include "thpdfdata.h" #include "thtexfonts.h" using namespace std; // extern list SCRAPLIST; #define IOerr(F) ((string)"Can't open file "+F+"!\n").c_str() map RGB, ALL_FONTS, ALL_PATTERNS; typedef set FONTCHARS; map USED_CHARS; unsigned font_id, patt_id; int convert_mode; //////////////////////////////////////////////////////////////////////////////// void read_hash() { ifstream F("data.pl"); if(!F) therror((IOerr("data.pl"))); string line, tmp = ""; char buf[100]; scraprecord S; list::iterator I; while(F.getline(buf,100,'\n')) { line = buf; if (line.find(';') != string::npos) break; if (line.find(" => {") != string::npos) { tmp = line.substr(line.find_first_not_of('\t'),7); S.name = tmp; SCRAPLIST.push_front(S); I = SCRAPLIST.begin(); } else if (line.find("F => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->F = tmp; } else if (line.find("B => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->B = tmp; } else if (line.find("I => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->I = tmp; } else if (line.find("E => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->E = tmp; } else if (line.find("X => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->X = tmp; } else if (line.find("G => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->G = tmp; } else if (line.find("C => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->C = tmp; } else if (line.find("P => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); I->P = tmp; } else if (line.find("S => ") != string::npos) { tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); tmp = tmp.substr(0,tmp.find_first_of(' ')); I->S1 = atof(tmp.c_str()); tmp = line.substr(line.find_first_of('"')+1, line.find_last_of('"')-line.find_first_of('"')-1); tmp = tmp.substr(tmp.find_first_of(' ')+1, tmp.size()-tmp.find_first_of(' ')-1); I->S2 = atof(tmp.c_str()); } else if (line.find("Y => ") != string::npos) { tmp = line.substr(line.find_first_of('>')+2, line.find_last_of(',')-line.find_first_of('>')-2); I->layer = atol(tmp.c_str()); } else if (line.find("V => ") != string::npos) { tmp = line.substr(line.find_first_of('>')+2, line.find_last_of(',')-line.find_first_of('>')-2); I->level = atol(tmp.c_str()); } else if (line.find("Z => ") != string::npos) { I->sect = 1; } } F.close(); SCRAPLIST.reverse(); } string tex_Fname(string s) {return("THF"+s);} string tex_Pname(string s) {return("THP"+s);} string tex_Lname(string s) {return("THL"+s);} list::iterator find_scrap(string name) { list::iterator I; for (I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { if (I->name == name) break; } if (I == SCRAPLIST.end()) { cerr << "This can't happen!" << endl; } return (I); } void print_queue(deque& thstack, double llx, double lly, string command, ofstream& TEX) { if (convert_mode>0) {TEX << "\\PL{";} for(unsigned i=0; i0) {TEX << "}%";} TEX << endl; } void print_str(string str, ofstream& TEX) { if (convert_mode>0) {TEX << "\\PL{";} TEX << str; if (convert_mode>0) {TEX << "}%";} TEX << endl; } string process_pdf_string(string s, string font) { string r,t; unsigned char c; char *err; unsigned j; map::iterator I; I = USED_CHARS.find(font); if (I == USED_CHARS.end()) cerr << "This can't happen!"; s = s.substr(1,s.length()-3); // delete surrounding parentheses and final space for (unsigned i=0; i=48 && c<=57) { j = i+1; t = c; while((c=s[j])>=48 && c<=57 && j"; } // convert modes: 0 -- patterns // 10 -- scrap content which shoul be clipped // 11 -- background // 12 -- outline // 13 -- filled outline // 20 -- nonclipped scrap data // 30 -- legend // 31 -- northarrow, scalebar void distill_eps(string name, string fname, string cname, int mode, ofstream& TEX, double r = -1, double g = -1, double b = -1) { string form_id; string tok, lastmovex, lastmovey, buffer; string font, patt, fntmatr; string pattcolor = "0 0 0"; bool comment = true, concat = false, already_transp = false, transp_used = false, before_group_transp = false; double llx = 0, lly = 0, urx = 0, ury = 0, HS = 0.0, VS = 0.0; double dx, dy; char x[20],y[20]; deque thstack; set FORM_FONTS, FORM_PATTERNS; list::iterator J; convert_mode = mode; ostringstream text_attr; if (LAYOUT.colored_text && r >= 0 && g >= 0 && b >= 0) { text_attr << "0.1 w " << r << " " << g << " " << b << " rg 2 Tr "; }; ifstream F(fname.c_str()); if(!F) therror((IOerr(fname))); while(F >> tok) { if (comment) { // File header if ((tok == "%%BoundingBox:") && (mode > 0)) { F >> llx >> lly >> urx >> ury; if ((mode>0) && (mode<30)) { J = find_scrap(name); dx = J->S1; dy = J->S2; if (J->name == "") J->name = name; if (mode == 10) { J->F1 = llx+dx; J->F2 = lly+dy; J->F3 = urx+dx; J->F4 = ury+dy; form_id = tex_Xname(name); } else if (mode == 11) { J->G1 = llx+dx; J->G2 = lly+dy; J->G3 = urx+dx; J->G4 = ury+dy; form_id = tex_Xname("G"+name); } else if (mode == 12) { J->B1 = llx+dx; J->B2 = lly+dy; J->B3 = urx+dx; J->B4 = ury+dy; form_id = tex_Xname("B"+name); } else if (mode == 13) { J->I1 = llx+dx; J->I2 = lly+dy; J->I3 = urx+dx; J->I4 = ury+dy; form_id = tex_Xname("I"+name); } else if (mode == 14) { J->E1 = llx+dx; J->E2 = lly+dy; J->E3 = urx+dx; J->E4 = ury+dy; form_id = tex_Xname("E"+name); } else if (mode == 20) { J->X1 = llx+dx; J->X2 = lly+dy; J->X3 = urx+dx; J->X4 = ury+dy; form_id = tex_Xname("X"+name); } else cerr << "Unknown mode!" << endl; } else if (mode == 30) { form_id = tex_Lname(name); } else if (mode == 31) { form_id = tex_Wname(name); } else if (mode > 100 && mode < 110) { form_id = tex_Wname(name); LAYOUT.gridcell[mode - 101].x = llx; LAYOUT.gridcell[mode - 101].y = lly; } HS = urx - llx; VS = ury - lly; TEX << "%\n\\setbox\\xxx=\\hbox{\\vbox to" << VS << "bp{\\vfill" << endl; if ((mode <= 11) && (cname != "")) { // beginning of boundary cl.path definition TEX << "\\PL{q}"; // for F and G scraps ifstream G(cname.c_str()); if(!G) therror((IOerr(cname))); while(G >> buffer) { if ((buffer == "m") || (buffer == "l") || (buffer == "c")) { print_queue(thstack,llx,lly,buffer,TEX); thstack.clear(); } else { thstack.push_back(buffer); } } G.close(); thstack.clear(); TEX << "\\PL{W* n}"; // end of boundary clipping path definition } } else if (tok == "%%Page:") { F >> tok; F >> tok; comment = false; } } else { // PostScript commands if (tok == "showpage") { break; } else if (tok == "moveto") { lastmovex = thstack[0]; lastmovey = thstack[1]; print_queue(thstack,llx,lly,"m",TEX); thstack.clear(); } else if (tok == "curveto") { print_queue(thstack,llx,lly,"c",TEX); thstack.clear(); } else if (tok == "lineto") { print_queue(thstack,llx,lly,"l",TEX); thstack.clear(); } else if (tok == "rlineto") { thstack.clear(); thstack.push_back(lastmovex); thstack.push_back(lastmovey); print_queue(thstack,llx,lly,"l",TEX); thstack.clear(); } else if (tok == "newpath") { thstack.clear(); } else if (tok == "closepath") { print_str("h",TEX); thstack.clear(); } else if (tok == "fill") { print_str("f*",TEX); thstack.clear(); } else if (tok == "stroke") { print_str("S",TEX); thstack.clear(); } else if (tok == "clip") { print_str("W* n",TEX); thstack.clear(); } else if (tok == "setlinejoin") { print_str(thstack[0]+" j",TEX); thstack.clear(); } else if (tok == "setlinecap") { print_str(thstack[0]+" J",TEX); thstack.clear(); } else if (tok == "setmiterlimit") { print_str(thstack[0]+" M",TEX); thstack.clear(); } else if (tok == "setgray") { if (mode == 0) { thstack.clear(); continue; // ignore color for uncolored patterns } if (already_transp) { // transp off print_str("/GS0 gs",TEX); already_transp = false; } print_str(thstack[0]+" g "+thstack[0]+" G",TEX); thstack.clear(); } else if (tok == "setrgbcolor") { if (mode == 0) { thstack.clear(); continue; // ignore color for uncolored patterns } if ((!((thstack[0] == "0.00002") && (thstack[1] == "0.00018"))) && already_transp) { // transp off print_str("/GS0 gs",TEX); already_transp = false; }; if (thstack[0] == "0.00002") { // special commands if (thstack[1] == "0.00015") { // patterns patt = thstack[2]; if (FORM_PATTERNS.find(patt) == FORM_PATTERNS.end()) { FORM_PATTERNS.insert(patt); } if (ALL_PATTERNS.find(patt) == ALL_PATTERNS.end()) { ALL_PATTERNS.insert(make_pair(patt,u2str(patt_id))); patt_id++; } print_str("/CS1 cs "+pattcolor+" /"+patt+" scn",TEX); } else if (thstack[1] == "0.00018") { // transparency transp_used = true; if (!already_transp) { print_str("/GS1 gs",TEX); already_transp = true; } map::iterator I = RGB.find(thstack[2]); if (I != RGB.end()) { print_str((*I).second+" rg "+(*I).second+" RG",TEX); } else cerr << "Unknown color!" << endl; } else cerr << "Unknown special!" << endl; } else { // regular RGB color print_str(thstack[0]+" "+thstack[1]+" "+thstack[2]+" rg " +thstack[0]+" "+thstack[1]+" "+thstack[2]+" RG",TEX); } thstack.clear(); } else if (tok == "setdash") { buffer = ""; for(unsigned i=0; i> tok; // redundant pop } print_str(buffer+" w",TEX); thstack.clear(); } else if (tok == "gsave") { print_str("q",TEX); thstack.clear(); if (already_transp) before_group_transp = true; else before_group_transp = false; } else if (tok == "grestore") { print_str("Q",TEX); thstack.clear(); if (before_group_transp) already_transp = true; else already_transp = false; } else if (tok == "translate") { print_str("1 0 0 1 "+thstack[0]+" "+thstack[1]+" cm",TEX); thstack.clear(); } else if (tok == "scale") { print_str(thstack[0]+" 0 0 "+thstack[1]+" 0 0 cm",TEX); thstack.clear(); } // text conversion should be // A B moveto (C) D E fshow // -> // BT /Fiii E Tf 1 0 0 1 A B Tm (C) Tj ET // or // gsave [A1 A2 A3 A4 A5 A6 ] concat 0 0 moveto (C) D E fshow grestore // -> // BT /Fiii E Tf A1 A2 A3 A4 A5 A6 Tm (C) Tj ET // // currently we leave moveto, gsave, grestore unchanged; // path started with moveto is terminated with the `n' operator else if (tok == "fshow") { // font changes should be optimized unsigned i = thstack.size(); font = thstack[i-2]; if (FORM_FONTS.find(font) == FORM_FONTS.end()) { FORM_FONTS.insert(font); } if (ALL_FONTS.find(font) == ALL_FONTS.end()) { ALL_FONTS.insert(make_pair(font,u2str(font_id))); font_id++; } font = tex_Fname(ALL_FONTS[font]); if (USED_CHARS.find(font) == USED_CHARS.end()) { FONTCHARS FCH; USED_CHARS.insert(make_pair(font,FCH)); } buffer = ""; for (unsigned j=0; j0) { if ((mode <= 11) && (cname != "")) { // end of boundary cl.path TEX << "\\PL{Q}%" << endl; } TEX << "}}\\wd\\xxx=" << HS << "bp" << endl; TEX << "\\immediate\\pdfxform"; // if (mode == 12 || mode == 13) { // TEX << " attr {"; // if (mode == 12) { // TEX << "/OC \\the\\ocU\\space 0 R "; // } // else if (mode == 13) { // TEX << "/OC \\the\\ocD\\space 0 R "; // } // TEX << "} "; // } if (transp_used || !FORM_FONTS.empty() || !FORM_PATTERNS.empty()) { TEX << " resources { /ProcSet [/PDF /Text] "; if (transp_used) { TEX << "/ExtGState \\the\\resid\\space 0 R "; } if (!FORM_FONTS.empty()) { TEX << "/Font << "; for(set::iterator I = FORM_FONTS.begin(); I != FORM_FONTS.end(); I++) { font = tex_Fname(ALL_FONTS[*I]); TEX << "/F\\pdffontname\\" << font << "\\space\\pdffontobjnum\\" << font << "\\space 0 R "; } TEX << ">> "; } if (!FORM_PATTERNS.empty()) { TEX << "/Pattern << "; for(set::iterator I = FORM_PATTERNS.begin(); I != FORM_PATTERNS.end(); I++) { TEX << "/" << *I << " \\the\\" << tex_Pname(ALL_PATTERNS[*I]) << "\\space 0 R "; } TEX << ">> "; TEX << "/ColorSpace << /CS1 [/Pattern /DeviceRGB] >> "; } TEX << "} "; } TEX << "\\xxx\n\\newcount\\" << form_id << "\\" << form_id << "=\\pdflastxform" << endl; } } void convert_scraps() { unsigned char c; ofstream TEX("th_formdef.tex"); if(!TEX) therror((IOerr("th_formdef.tex"))); TEX.setf(ios::fixed, ios::floatfield); TEX.precision(2); for(list::iterator I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { // cout << "*" << flush; if (I->F != "") distill_eps(I->name, I->F, I->C, 10, TEX, I->r, I->g, I->b); if (I->G != "") distill_eps(I->name, I->G, I->C, 11, TEX); if (I->B != "") distill_eps(I->name, I->B, "", 12, TEX); if (I->I != "") distill_eps(I->name, I->I, "", 13, TEX); if (I->E != "") distill_eps(I->name, I->E, "", 14, TEX, I->r, I->g, I->b); if (I->X != "") distill_eps(I->name, I->X, "", 20, TEX, I->r, I->g, I->b); } // similarly with legend (distill_eps( , , , 30, TEX)) for(list::iterator I = LEGENDLIST.begin(); I != LEGENDLIST.end(); I++) { if (I->fname != "") distill_eps(I->name, I->fname, "", 30, TEX); } // north arrow &c. if (LAYOUT.northarrow != "") distill_eps("northarrow", LAYOUT.northarrow, "", 31, TEX); if (LAYOUT.scalebar != "") distill_eps("scalebar", LAYOUT.scalebar, "", 31, TEX); if (LAYOUT.grid > 0) { distill_eps("grida", LAYOUT.gridAA, "", 101, TEX); distill_eps("gridb", LAYOUT.gridAB, "", 102, TEX); distill_eps("gridc", LAYOUT.gridAC, "", 103, TEX); distill_eps("gridd", LAYOUT.gridBA, "", 104, TEX); distill_eps("gride", LAYOUT.gridBB, "", 105, TEX); distill_eps("gridf", LAYOUT.gridBC, "", 106, TEX); distill_eps("gridg", LAYOUT.gridCA, "", 107, TEX); distill_eps("gridh", LAYOUT.gridCB, "", 108, TEX); distill_eps("gridi", LAYOUT.gridCC, "", 109, TEX); } TEX.close(); ofstream F("th_fontdef.tex"); if(!F) therror((IOerr("th_fontdef.tex"))); F.setf(ios::fixed, ios::floatfield); F.precision(2); for (map::iterator I = ALL_FONTS.begin(); I != ALL_FONTS.end(); I++) { F << "\\font\\" << tex_Fname((*I).second) << "=" << (*I).first << endl; } F << "\\begingroup" << endl // make special characters normal << "\\catcode`\\^^@=12\\catcode`\\^^?=12\\catcode`\\{=12" << endl << "\\catcode`\\}=12\\catcode`\\$=12\\catcode`\\&=12" << endl << "\\catcode`\\#=12\\catcode`\\_=12\\catcode`\\~=12" << endl << "\\catcode`\\%=12" << endl << "\\catcode`\\^^L=12\\catcode`\\^^A=12\\catcode`\\^^K=12\\catcode`\\^^I=12" << endl << "\\catcode`\\^^M=12" << endl; // na tomto riadku ma tex este stare catcode konca riadku, // vsetko nasledovne musi byt v jednom riadku for (map::iterator I = USED_CHARS.begin(); I != USED_CHARS.end(); I++) { F << "\\includechars\\" << (*I).first << ":"; for (FONTCHARS::iterator J = ((*I).second).begin(); J != ((*I).second).end(); J++) { c = *J; if (c > 31) { // if (c==37) F << "\\"; // % remains a comment F << c; if (c==92) F << " "; // \ has to be followed by space } else { F << "^^" << char(c+64); } } F << "\\endinclude"; } F << "\\endgroup" << endl; ifstream P("patterns.dat"); if(!P) therror((IOerr("patterns.dat"))); char buf[200]; char delim[] = ":"; string line,num,pfile,bbox,xstep,ystep,matr; while(P.getline(buf,200,'\n')) { num = strtok(buf,delim); pfile = strtok(NULL,delim); bbox = strtok(NULL,delim); xstep = strtok(NULL,delim); ystep = strtok(NULL,delim); matr = strtok(NULL,delim); map::iterator I = ALL_PATTERNS.find(num); if (I != ALL_PATTERNS.end()) { F << "\\immediate\\pdfobj stream attr {/Type /Pattern" << endl; F << "/PaintType 2 /PatternType 1 /TilingType 1" << endl; F << "/Matrix " << matr << endl; F << "/BBox " << bbox << endl; F << "/XStep " << xstep << endl; F << "/YStep " << ystep << endl; F << "/Resources << /ProcSet [/PDF ] >> } {" << endl; distill_eps("", pfile , "", 0, F); F << "} \\newcount \\" << tex_Pname((*I).second) << "\\" << tex_Pname((*I).second) << "=\\pdflastobj" << endl; } } P.close(); F.close(); vector legend_arr_n, legend_arr_d; for(list::iterator I = LEGENDLIST.begin(); I != LEGENDLIST.end(); I++) { legend_arr_n.push_back(I->name); legend_arr_d.push_back(I->descr); } ofstream LEG("th_legend.tex"); if(!LEG) therror(("Can't write a file!")); /* for(list::iterator I = LEGENDLIST.begin(); I != LEGENDLIST.end(); I++) { LEG << "\\legendsymbolbox{\\" << tex_Lname(I->name) << "}{" << utf2tex(I->descr) << "}" << endl; } */ int legendbox_num = LEGENDLIST.size(); int columns = LAYOUT.legend_columns; int rows = (int) ceil(double(legendbox_num) / columns); int pos = 0; LEG << "\\legendcolumns" << columns << endl; for (int i = 0; i < rows; i++) { LEG << "\\line{%" << endl; for (int j = 0; j < columns; j++) { pos = i + j * rows; if (pos < legendbox_num) LEG << " \\legendsymbolbox{\\" << tex_Lname(legend_arr_n[pos]) << "}{" << utf2tex(legend_arr_d[pos]) << "}\\hskip10pt" << endl; } LEG << "\\hss}" << endl; } LEG.close(); vector legend_color; colorlegendrecord lcr; for(list::iterator I = COLORLEGENDLIST.begin(); I != COLORLEGENDLIST.end(); I++) { lcr.R = I->R; lcr.G = I->G; lcr.B = I->B; lcr.texname = I->texname; legend_color.push_back(lcr); } ofstream LEGCOLOR("th_legendcolor.tex"); if(!LEGCOLOR) therror(("Can't write a file!")); legendbox_num = COLORLEGENDLIST.size(); columns = 1; rows = (int) ceil(double(legendbox_num) / columns); pos = 0; LEGCOLOR << "\\legendcolumns" << columns << endl; for (int i = 0; i < rows; i++) { LEGCOLOR << "\\line{%" << endl; for (int j = 0; j < columns; j++) { pos = i + j * rows; if (pos < legendbox_num) { LEGCOLOR << " \\colorlegendbox{" << legend_color[pos].R << "}{" << legend_color[pos].G << "}{" << legend_color[pos].B << "}%" << endl; LEGCOLOR << " \\legendsymbolbox{\\pdflastxform}{" << legend_color[pos].texname << "}\\hskip10pt" << endl; } } LEGCOLOR << "\\hss}" << endl; } LEGCOLOR.close(); } void read_rgb() { ifstream F("rgbcolors.dat"); if(!F) therror((IOerr("rgbcolors.dat"))); char buf[100]; string line, color, value; while(F.getline(buf,100,'\n')) { line = buf; color = line.substr(0,line.find(':')); value = line.substr(line.find(':')+1,line.size()-line.find(':')-1); RGB.insert(make_pair(color,value)); } F.close(); } int thconvert() { #ifdef NOTHERION cout << "converting scraps ... " << flush; #else thprintf("converting scraps ... "); #endif RGB.clear(); ALL_FONTS.clear(); ALL_PATTERNS.clear(); USED_CHARS.clear(); font_id = 1; patt_id = 1; #ifdef NOTHERION read_hash(); #endif read_rgb(); convert_scraps(); thpdfdbg(); // in the debugging mode only #ifdef NOTHERION cout << "done" << endl; #else thprintf("done\n"); #endif return(0); } #ifdef NOTHERION int main() { thconvert(); return(0); } #endif therion/thbuffer.h0000664000175000017500000000534210722030216013221 0ustar useruser/** * @file thbuffer.h * String buffer class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thbuffer_h #define thbuffer_h #include /** * String buffer class. */ class thbuffer { public: char * buff; ///< Buffer. size_t size; ///< Buffer size. /** * Enlarge the buffer at least to given size. * * @param min_size Minimal buffer size. */ void enlarge(size_t min_size); public: /** * Standard constructor. */ thbuffer(); /** * Destructor. */ ~thbuffer(); /** * Copy given string to buffer and return pointer to it. * @param src Given string. */ char * strcpy(const char * src); /** * Copy n characters from given string to buffer and return pointer to it. * * Also add 0 to the end. * @param src Given string. * @param n Source length. */ char * strncpy(const char * src, size_t n); /** * Concatenate given string and buffer and return pointer to it. * @param src Given string. */ char * strcat(const char * src); /** * Concatenate n characters from given string and * buffer and return pointer to it. * @param src Given string. */ char * strncat(const char * src, size_t n); /** * Guarantee buffer size. * * @param bs Minimal buffer size. */ void guarantee(size_t bs); /** * Return pointer to the buffer. */ char * get_buffer(); /** * Type conversion to char*. */ operator char* (); /** * Type conversion to char*. */ operator char** (); /** * "=" operator. */ thbuffer & operator=(const char * src); /** * "=" operator. */ thbuffer & operator=(thbuffer const & srcbf); /** * "+=" operator. */ thbuffer & operator+=(const char * src); }; #endif therion/thexpsys.cxx0000664000175000017500000000241710625655142013673 0ustar useruser/** * @file thexpsys.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexpsys.h" #include "thexception.h" #include "thdatabase.h" thexpsys::thexpsys() { this->cmd = ""; } void thexpsys::process_db(class thdatabase * dbp) { thprintf("system: %s\n", this->cmd); int retcode = system(this->cmd); if (retcode != EXIT_SUCCESS) thwarning(("system exit code -- %d", retcode)) } therion/thchencdata/0000775000175000017500000000000012426431513013515 5ustar userusertherion/thchencdata/CP1251.TXT0000664000175000017500000002211710720724554014741 0ustar useruser# # Name: cp1251_WinCyrillic to Unicode table # Unicode version: 2.0 # Table version: 2.00 # Table format: Format A # Date: 04/24/96 # Authors: Lori Brownell # K.D. Chang # General notes: none # # Format: Three tab-separated columns # Column #1 is the cp1251_WinCyrillic code (in hex) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 is the Unicode name (follows a comment sign, '#') # # The entries are in cp1251_WinCyrillic order # 0x00 0x0000 #NULL 0x01 0x0001 #START OF HEADING 0x02 0x0002 #START OF TEXT 0x03 0x0003 #END OF TEXT 0x04 0x0004 #END OF TRANSMISSION 0x05 0x0005 #ENQUIRY 0x06 0x0006 #ACKNOWLEDGE 0x07 0x0007 #BELL 0x08 0x0008 #BACKSPACE 0x09 0x0009 #HORIZONTAL TABULATION 0x0A 0x000A #LINE FEED 0x0B 0x000B #VERTICAL TABULATION 0x0C 0x000C #FORM FEED 0x0D 0x000D #CARRIAGE RETURN 0x0E 0x000E #SHIFT OUT 0x0F 0x000F #SHIFT IN 0x10 0x0010 #DATA LINK ESCAPE 0x11 0x0011 #DEVICE CONTROL ONE 0x12 0x0012 #DEVICE CONTROL TWO 0x13 0x0013 #DEVICE CONTROL THREE 0x14 0x0014 #DEVICE CONTROL FOUR 0x15 0x0015 #NEGATIVE ACKNOWLEDGE 0x16 0x0016 #SYNCHRONOUS IDLE 0x17 0x0017 #END OF TRANSMISSION BLOCK 0x18 0x0018 #CANCEL 0x19 0x0019 #END OF MEDIUM 0x1A 0x001A #SUBSTITUTE 0x1B 0x001B #ESCAPE 0x1C 0x001C #FILE SEPARATOR 0x1D 0x001D #GROUP SEPARATOR 0x1E 0x001E #RECORD SEPARATOR 0x1F 0x001F #UNIT SEPARATOR 0x20 0x0020 #SPACE 0x21 0x0021 #EXCLAMATION MARK 0x22 0x0022 #QUOTATION MARK 0x23 0x0023 #NUMBER SIGN 0x24 0x0024 #DOLLAR SIGN 0x25 0x0025 #PERCENT SIGN 0x26 0x0026 #AMPERSAND 0x27 0x0027 #APOSTROPHE 0x28 0x0028 #LEFT PARENTHESIS 0x29 0x0029 #RIGHT PARENTHESIS 0x2A 0x002A #ASTERISK 0x2B 0x002B #PLUS SIGN 0x2C 0x002C #COMMA 0x2D 0x002D #HYPHEN-MINUS 0x2E 0x002E #FULL STOP 0x2F 0x002F #SOLIDUS 0x30 0x0030 #DIGIT ZERO 0x31 0x0031 #DIGIT ONE 0x32 0x0032 #DIGIT TWO 0x33 0x0033 #DIGIT THREE 0x34 0x0034 #DIGIT FOUR 0x35 0x0035 #DIGIT FIVE 0x36 0x0036 #DIGIT SIX 0x37 0x0037 #DIGIT SEVEN 0x38 0x0038 #DIGIT EIGHT 0x39 0x0039 #DIGIT NINE 0x3A 0x003A #COLON 0x3B 0x003B #SEMICOLON 0x3C 0x003C #LESS-THAN SIGN 0x3D 0x003D #EQUALS SIGN 0x3E 0x003E #GREATER-THAN SIGN 0x3F 0x003F #QUESTION MARK 0x40 0x0040 #COMMERCIAL AT 0x41 0x0041 #LATIN CAPITAL LETTER A 0x42 0x0042 #LATIN CAPITAL LETTER B 0x43 0x0043 #LATIN CAPITAL LETTER C 0x44 0x0044 #LATIN CAPITAL LETTER D 0x45 0x0045 #LATIN CAPITAL LETTER E 0x46 0x0046 #LATIN CAPITAL LETTER F 0x47 0x0047 #LATIN CAPITAL LETTER G 0x48 0x0048 #LATIN CAPITAL LETTER H 0x49 0x0049 #LATIN CAPITAL LETTER I 0x4A 0x004A #LATIN CAPITAL LETTER J 0x4B 0x004B #LATIN CAPITAL LETTER K 0x4C 0x004C #LATIN CAPITAL LETTER L 0x4D 0x004D #LATIN CAPITAL LETTER M 0x4E 0x004E #LATIN CAPITAL LETTER N 0x4F 0x004F #LATIN CAPITAL LETTER O 0x50 0x0050 #LATIN CAPITAL LETTER P 0x51 0x0051 #LATIN CAPITAL LETTER Q 0x52 0x0052 #LATIN CAPITAL LETTER R 0x53 0x0053 #LATIN CAPITAL LETTER S 0x54 0x0054 #LATIN CAPITAL LETTER T 0x55 0x0055 #LATIN CAPITAL LETTER U 0x56 0x0056 #LATIN CAPITAL LETTER V 0x57 0x0057 #LATIN CAPITAL LETTER W 0x58 0x0058 #LATIN CAPITAL LETTER X 0x59 0x0059 #LATIN CAPITAL LETTER Y 0x5A 0x005A #LATIN CAPITAL LETTER Z 0x5B 0x005B #LEFT SQUARE BRACKET 0x5C 0x005C #REVERSE SOLIDUS 0x5D 0x005D #RIGHT SQUARE BRACKET 0x5E 0x005E #CIRCUMFLEX ACCENT 0x5F 0x005F #LOW LINE 0x60 0x0060 #GRAVE ACCENT 0x61 0x0061 #LATIN SMALL LETTER A 0x62 0x0062 #LATIN SMALL LETTER B 0x63 0x0063 #LATIN SMALL LETTER C 0x64 0x0064 #LATIN SMALL LETTER D 0x65 0x0065 #LATIN SMALL LETTER E 0x66 0x0066 #LATIN SMALL LETTER F 0x67 0x0067 #LATIN SMALL LETTER G 0x68 0x0068 #LATIN SMALL LETTER H 0x69 0x0069 #LATIN SMALL LETTER I 0x6A 0x006A #LATIN SMALL LETTER J 0x6B 0x006B #LATIN SMALL LETTER K 0x6C 0x006C #LATIN SMALL LETTER L 0x6D 0x006D #LATIN SMALL LETTER M 0x6E 0x006E #LATIN SMALL LETTER N 0x6F 0x006F #LATIN SMALL LETTER O 0x70 0x0070 #LATIN SMALL LETTER P 0x71 0x0071 #LATIN SMALL LETTER Q 0x72 0x0072 #LATIN SMALL LETTER R 0x73 0x0073 #LATIN SMALL LETTER S 0x74 0x0074 #LATIN SMALL LETTER T 0x75 0x0075 #LATIN SMALL LETTER U 0x76 0x0076 #LATIN SMALL LETTER V 0x77 0x0077 #LATIN SMALL LETTER W 0x78 0x0078 #LATIN SMALL LETTER X 0x79 0x0079 #LATIN SMALL LETTER Y 0x7A 0x007A #LATIN SMALL LETTER Z 0x7B 0x007B #LEFT CURLY BRACKET 0x7C 0x007C #VERTICAL LINE 0x7D 0x007D #RIGHT CURLY BRACKET 0x7E 0x007E #TILDE 0x7F 0x007F #DELETE 0x80 0x0402 #CYRILLIC CAPITAL LETTER DJE 0x81 0x0403 #CYRILLIC CAPITAL LETTER GJE 0x82 0x201A #SINGLE LOW-9 QUOTATION MARK 0x83 0x0453 #CYRILLIC SMALL LETTER GJE 0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK 0x85 0x2026 #HORIZONTAL ELLIPSIS 0x86 0x2020 #DAGGER 0x87 0x2021 #DOUBLE DAGGER 0x88 #UNDEFINED 0x89 0x2030 #PER MILLE SIGN 0x8A 0x0409 #CYRILLIC CAPITAL LETTER LJE 0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK 0x8C 0x040A #CYRILLIC CAPITAL LETTER NJE 0x8D 0x040C #CYRILLIC CAPITAL LETTER KJE 0x8E 0x040B #CYRILLIC CAPITAL LETTER TSHE 0x8F 0x040F #CYRILLIC CAPITAL LETTER DZHE 0x90 0x0452 #CYRILLIC SMALL LETTER DJE 0x91 0x2018 #LEFT SINGLE QUOTATION MARK 0x92 0x2019 #RIGHT SINGLE QUOTATION MARK 0x93 0x201C #LEFT DOUBLE QUOTATION MARK 0x94 0x201D #RIGHT DOUBLE QUOTATION MARK 0x95 0x2022 #BULLET 0x96 0x2013 #EN DASH 0x97 0x2014 #EM DASH 0x98 #UNDEFINED 0x99 0x2122 #TRADE MARK SIGN 0x9A 0x0459 #CYRILLIC SMALL LETTER LJE 0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 0x9C 0x045A #CYRILLIC SMALL LETTER NJE 0x9D 0x045C #CYRILLIC SMALL LETTER KJE 0x9E 0x045B #CYRILLIC SMALL LETTER TSHE 0x9F 0x045F #CYRILLIC SMALL LETTER DZHE 0xA0 0x00A0 #NO-BREAK SPACE 0xA1 0x040E #CYRILLIC CAPITAL LETTER SHORT U 0xA2 0x045E #CYRILLIC SMALL LETTER SHORT U 0xA3 0x0408 #CYRILLIC CAPITAL LETTER JE 0xA4 0x00A4 #CURRENCY SIGN 0xA5 0x0490 #CYRILLIC CAPITAL LETTER GHE WITH UPTURN 0xA6 0x00A6 #BROKEN BAR 0xA7 0x00A7 #SECTION SIGN 0xA8 0x0401 #CYRILLIC CAPITAL LETTER IO 0xA9 0x00A9 #COPYRIGHT SIGN 0xAA 0x0404 #CYRILLIC CAPITAL LETTER UKRAINIAN IE 0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 0xAC 0x00AC #NOT SIGN 0xAD 0x00AD #SOFT HYPHEN 0xAE 0x00AE #REGISTERED SIGN 0xAF 0x0407 #CYRILLIC CAPITAL LETTER YI 0xB0 0x00B0 #DEGREE SIGN 0xB1 0x00B1 #PLUS-MINUS SIGN 0xB2 0x0406 #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I 0xB3 0x0456 #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 0xB4 0x0491 #CYRILLIC SMALL LETTER GHE WITH UPTURN 0xB5 0x00B5 #MICRO SIGN 0xB6 0x00B6 #PILCROW SIGN 0xB7 0x00B7 #MIDDLE DOT 0xB8 0x0451 #CYRILLIC SMALL LETTER IO 0xB9 0x2116 #NUMERO SIGN 0xBA 0x0454 #CYRILLIC SMALL LETTER UKRAINIAN IE 0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0xBC 0x0458 #CYRILLIC SMALL LETTER JE 0xBD 0x0405 #CYRILLIC CAPITAL LETTER DZE 0xBE 0x0455 #CYRILLIC SMALL LETTER DZE 0xBF 0x0457 #CYRILLIC SMALL LETTER YI 0xC0 0x0410 #CYRILLIC CAPITAL LETTER A 0xC1 0x0411 #CYRILLIC CAPITAL LETTER BE 0xC2 0x0412 #CYRILLIC CAPITAL LETTER VE 0xC3 0x0413 #CYRILLIC CAPITAL LETTER GHE 0xC4 0x0414 #CYRILLIC CAPITAL LETTER DE 0xC5 0x0415 #CYRILLIC CAPITAL LETTER IE 0xC6 0x0416 #CYRILLIC CAPITAL LETTER ZHE 0xC7 0x0417 #CYRILLIC CAPITAL LETTER ZE 0xC8 0x0418 #CYRILLIC CAPITAL LETTER I 0xC9 0x0419 #CYRILLIC CAPITAL LETTER SHORT I 0xCA 0x041A #CYRILLIC CAPITAL LETTER KA 0xCB 0x041B #CYRILLIC CAPITAL LETTER EL 0xCC 0x041C #CYRILLIC CAPITAL LETTER EM 0xCD 0x041D #CYRILLIC CAPITAL LETTER EN 0xCE 0x041E #CYRILLIC CAPITAL LETTER O 0xCF 0x041F #CYRILLIC CAPITAL LETTER PE 0xD0 0x0420 #CYRILLIC CAPITAL LETTER ER 0xD1 0x0421 #CYRILLIC CAPITAL LETTER ES 0xD2 0x0422 #CYRILLIC CAPITAL LETTER TE 0xD3 0x0423 #CYRILLIC CAPITAL LETTER U 0xD4 0x0424 #CYRILLIC CAPITAL LETTER EF 0xD5 0x0425 #CYRILLIC CAPITAL LETTER HA 0xD6 0x0426 #CYRILLIC CAPITAL LETTER TSE 0xD7 0x0427 #CYRILLIC CAPITAL LETTER CHE 0xD8 0x0428 #CYRILLIC CAPITAL LETTER SHA 0xD9 0x0429 #CYRILLIC CAPITAL LETTER SHCHA 0xDA 0x042A #CYRILLIC CAPITAL LETTER HARD SIGN 0xDB 0x042B #CYRILLIC CAPITAL LETTER YERU 0xDC 0x042C #CYRILLIC CAPITAL LETTER SOFT SIGN 0xDD 0x042D #CYRILLIC CAPITAL LETTER E 0xDE 0x042E #CYRILLIC CAPITAL LETTER YU 0xDF 0x042F #CYRILLIC CAPITAL LETTER YA 0xE0 0x0430 #CYRILLIC SMALL LETTER A 0xE1 0x0431 #CYRILLIC SMALL LETTER BE 0xE2 0x0432 #CYRILLIC SMALL LETTER VE 0xE3 0x0433 #CYRILLIC SMALL LETTER GHE 0xE4 0x0434 #CYRILLIC SMALL LETTER DE 0xE5 0x0435 #CYRILLIC SMALL LETTER IE 0xE6 0x0436 #CYRILLIC SMALL LETTER ZHE 0xE7 0x0437 #CYRILLIC SMALL LETTER ZE 0xE8 0x0438 #CYRILLIC SMALL LETTER I 0xE9 0x0439 #CYRILLIC SMALL LETTER SHORT I 0xEA 0x043A #CYRILLIC SMALL LETTER KA 0xEB 0x043B #CYRILLIC SMALL LETTER EL 0xEC 0x043C #CYRILLIC SMALL LETTER EM 0xED 0x043D #CYRILLIC SMALL LETTER EN 0xEE 0x043E #CYRILLIC SMALL LETTER O 0xEF 0x043F #CYRILLIC SMALL LETTER PE 0xF0 0x0440 #CYRILLIC SMALL LETTER ER 0xF1 0x0441 #CYRILLIC SMALL LETTER ES 0xF2 0x0442 #CYRILLIC SMALL LETTER TE 0xF3 0x0443 #CYRILLIC SMALL LETTER U 0xF4 0x0444 #CYRILLIC SMALL LETTER EF 0xF5 0x0445 #CYRILLIC SMALL LETTER HA 0xF6 0x0446 #CYRILLIC SMALL LETTER TSE 0xF7 0x0447 #CYRILLIC SMALL LETTER CHE 0xF8 0x0448 #CYRILLIC SMALL LETTER SHA 0xF9 0x0449 #CYRILLIC SMALL LETTER SHCHA 0xFA 0x044A #CYRILLIC SMALL LETTER HARD SIGN 0xFB 0x044B #CYRILLIC SMALL LETTER YERU 0xFC 0x044C #CYRILLIC SMALL LETTER SOFT SIGN 0xFD 0x044D #CYRILLIC SMALL LETTER E 0xFE 0x044E #CYRILLIC SMALL LETTER YU 0xFF 0x044F #CYRILLIC SMALL LETTER YA therion/thchencdata/CP1250.TXT0000664000175000017500000002246507376346034014754 0ustar useruser# # Name: cp1250 to Unicode table # Unicode version: 2.0 # Table version: 2.01 # Table format: Format A # Date: 04/15/98 # # Contact: cpxlate@microsoft.com # # General notes: none # # Format: Three tab-separated columns # Column #1 is the cp1250 code (in hex) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 is the Unicode name (follows a comment sign, '#') # # The entries are in cp1250 order # 0x00 0x0000 #NULL 0x01 0x0001 #START OF HEADING 0x02 0x0002 #START OF TEXT 0x03 0x0003 #END OF TEXT 0x04 0x0004 #END OF TRANSMISSION 0x05 0x0005 #ENQUIRY 0x06 0x0006 #ACKNOWLEDGE 0x07 0x0007 #BELL 0x08 0x0008 #BACKSPACE 0x09 0x0009 #HORIZONTAL TABULATION 0x0A 0x000A #LINE FEED 0x0B 0x000B #VERTICAL TABULATION 0x0C 0x000C #FORM FEED 0x0D 0x000D #CARRIAGE RETURN 0x0E 0x000E #SHIFT OUT 0x0F 0x000F #SHIFT IN 0x10 0x0010 #DATA LINK ESCAPE 0x11 0x0011 #DEVICE CONTROL ONE 0x12 0x0012 #DEVICE CONTROL TWO 0x13 0x0013 #DEVICE CONTROL THREE 0x14 0x0014 #DEVICE CONTROL FOUR 0x15 0x0015 #NEGATIVE ACKNOWLEDGE 0x16 0x0016 #SYNCHRONOUS IDLE 0x17 0x0017 #END OF TRANSMISSION BLOCK 0x18 0x0018 #CANCEL 0x19 0x0019 #END OF MEDIUM 0x1A 0x001A #SUBSTITUTE 0x1B 0x001B #ESCAPE 0x1C 0x001C #FILE SEPARATOR 0x1D 0x001D #GROUP SEPARATOR 0x1E 0x001E #RECORD SEPARATOR 0x1F 0x001F #UNIT SEPARATOR 0x20 0x0020 #SPACE 0x21 0x0021 #EXCLAMATION MARK 0x22 0x0022 #QUOTATION MARK 0x23 0x0023 #NUMBER SIGN 0x24 0x0024 #DOLLAR SIGN 0x25 0x0025 #PERCENT SIGN 0x26 0x0026 #AMPERSAND 0x27 0x0027 #APOSTROPHE 0x28 0x0028 #LEFT PARENTHESIS 0x29 0x0029 #RIGHT PARENTHESIS 0x2A 0x002A #ASTERISK 0x2B 0x002B #PLUS SIGN 0x2C 0x002C #COMMA 0x2D 0x002D #HYPHEN-MINUS 0x2E 0x002E #FULL STOP 0x2F 0x002F #SOLIDUS 0x30 0x0030 #DIGIT ZERO 0x31 0x0031 #DIGIT ONE 0x32 0x0032 #DIGIT TWO 0x33 0x0033 #DIGIT THREE 0x34 0x0034 #DIGIT FOUR 0x35 0x0035 #DIGIT FIVE 0x36 0x0036 #DIGIT SIX 0x37 0x0037 #DIGIT SEVEN 0x38 0x0038 #DIGIT EIGHT 0x39 0x0039 #DIGIT NINE 0x3A 0x003A #COLON 0x3B 0x003B #SEMICOLON 0x3C 0x003C #LESS-THAN SIGN 0x3D 0x003D #EQUALS SIGN 0x3E 0x003E #GREATER-THAN SIGN 0x3F 0x003F #QUESTION MARK 0x40 0x0040 #COMMERCIAL AT 0x41 0x0041 #LATIN CAPITAL LETTER A 0x42 0x0042 #LATIN CAPITAL LETTER B 0x43 0x0043 #LATIN CAPITAL LETTER C 0x44 0x0044 #LATIN CAPITAL LETTER D 0x45 0x0045 #LATIN CAPITAL LETTER E 0x46 0x0046 #LATIN CAPITAL LETTER F 0x47 0x0047 #LATIN CAPITAL LETTER G 0x48 0x0048 #LATIN CAPITAL LETTER H 0x49 0x0049 #LATIN CAPITAL LETTER I 0x4A 0x004A #LATIN CAPITAL LETTER J 0x4B 0x004B #LATIN CAPITAL LETTER K 0x4C 0x004C #LATIN CAPITAL LETTER L 0x4D 0x004D #LATIN CAPITAL LETTER M 0x4E 0x004E #LATIN CAPITAL LETTER N 0x4F 0x004F #LATIN CAPITAL LETTER O 0x50 0x0050 #LATIN CAPITAL LETTER P 0x51 0x0051 #LATIN CAPITAL LETTER Q 0x52 0x0052 #LATIN CAPITAL LETTER R 0x53 0x0053 #LATIN CAPITAL LETTER S 0x54 0x0054 #LATIN CAPITAL LETTER T 0x55 0x0055 #LATIN CAPITAL LETTER U 0x56 0x0056 #LATIN CAPITAL LETTER V 0x57 0x0057 #LATIN CAPITAL LETTER W 0x58 0x0058 #LATIN CAPITAL LETTER X 0x59 0x0059 #LATIN CAPITAL LETTER Y 0x5A 0x005A #LATIN CAPITAL LETTER Z 0x5B 0x005B #LEFT SQUARE BRACKET 0x5C 0x005C #REVERSE SOLIDUS 0x5D 0x005D #RIGHT SQUARE BRACKET 0x5E 0x005E #CIRCUMFLEX ACCENT 0x5F 0x005F #LOW LINE 0x60 0x0060 #GRAVE ACCENT 0x61 0x0061 #LATIN SMALL LETTER A 0x62 0x0062 #LATIN SMALL LETTER B 0x63 0x0063 #LATIN SMALL LETTER C 0x64 0x0064 #LATIN SMALL LETTER D 0x65 0x0065 #LATIN SMALL LETTER E 0x66 0x0066 #LATIN SMALL LETTER F 0x67 0x0067 #LATIN SMALL LETTER G 0x68 0x0068 #LATIN SMALL LETTER H 0x69 0x0069 #LATIN SMALL LETTER I 0x6A 0x006A #LATIN SMALL LETTER J 0x6B 0x006B #LATIN SMALL LETTER K 0x6C 0x006C #LATIN SMALL LETTER L 0x6D 0x006D #LATIN SMALL LETTER M 0x6E 0x006E #LATIN SMALL LETTER N 0x6F 0x006F #LATIN SMALL LETTER O 0x70 0x0070 #LATIN SMALL LETTER P 0x71 0x0071 #LATIN SMALL LETTER Q 0x72 0x0072 #LATIN SMALL LETTER R 0x73 0x0073 #LATIN SMALL LETTER S 0x74 0x0074 #LATIN SMALL LETTER T 0x75 0x0075 #LATIN SMALL LETTER U 0x76 0x0076 #LATIN SMALL LETTER V 0x77 0x0077 #LATIN SMALL LETTER W 0x78 0x0078 #LATIN SMALL LETTER X 0x79 0x0079 #LATIN SMALL LETTER Y 0x7A 0x007A #LATIN SMALL LETTER Z 0x7B 0x007B #LEFT CURLY BRACKET 0x7C 0x007C #VERTICAL LINE 0x7D 0x007D #RIGHT CURLY BRACKET 0x7E 0x007E #TILDE 0x7F 0x007F #DELETE 0x80 0x20AC #EURO SIGN 0x81 #UNDEFINED 0x82 0x201A #SINGLE LOW-9 QUOTATION MARK 0x83 #UNDEFINED 0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK 0x85 0x2026 #HORIZONTAL ELLIPSIS 0x86 0x2020 #DAGGER 0x87 0x2021 #DOUBLE DAGGER 0x88 #UNDEFINED 0x89 0x2030 #PER MILLE SIGN 0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON 0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK 0x8C 0x015A #LATIN CAPITAL LETTER S WITH ACUTE 0x8D 0x0164 #LATIN CAPITAL LETTER T WITH CARON 0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON 0x8F 0x0179 #LATIN CAPITAL LETTER Z WITH ACUTE 0x90 #UNDEFINED 0x91 0x2018 #LEFT SINGLE QUOTATION MARK 0x92 0x2019 #RIGHT SINGLE QUOTATION MARK 0x93 0x201C #LEFT DOUBLE QUOTATION MARK 0x94 0x201D #RIGHT DOUBLE QUOTATION MARK 0x95 0x2022 #BULLET 0x96 0x2013 #EN DASH 0x97 0x2014 #EM DASH 0x98 #UNDEFINED 0x99 0x2122 #TRADE MARK SIGN 0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON 0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 0x9C 0x015B #LATIN SMALL LETTER S WITH ACUTE 0x9D 0x0165 #LATIN SMALL LETTER T WITH CARON 0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON 0x9F 0x017A #LATIN SMALL LETTER Z WITH ACUTE 0xA0 0x00A0 #NO-BREAK SPACE 0xA1 0x02C7 #CARON 0xA2 0x02D8 #BREVE 0xA3 0x0141 #LATIN CAPITAL LETTER L WITH STROKE 0xA4 0x00A4 #CURRENCY SIGN 0xA5 0x0104 #LATIN CAPITAL LETTER A WITH OGONEK 0xA6 0x00A6 #BROKEN BAR 0xA7 0x00A7 #SECTION SIGN 0xA8 0x00A8 #DIAERESIS 0xA9 0x00A9 #COPYRIGHT SIGN 0xAA 0x015E #LATIN CAPITAL LETTER S WITH CEDILLA 0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 0xAC 0x00AC #NOT SIGN 0xAD 0x00AD #SOFT HYPHEN 0xAE 0x00AE #REGISTERED SIGN 0xAF 0x017B #LATIN CAPITAL LETTER Z WITH DOT ABOVE 0xB0 0x00B0 #DEGREE SIGN 0xB1 0x00B1 #PLUS-MINUS SIGN 0xB2 0x02DB #OGONEK 0xB3 0x0142 #LATIN SMALL LETTER L WITH STROKE 0xB4 0x00B4 #ACUTE ACCENT 0xB5 0x00B5 #MICRO SIGN 0xB6 0x00B6 #PILCROW SIGN 0xB7 0x00B7 #MIDDLE DOT 0xB8 0x00B8 #CEDILLA 0xB9 0x0105 #LATIN SMALL LETTER A WITH OGONEK 0xBA 0x015F #LATIN SMALL LETTER S WITH CEDILLA 0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0xBC 0x013D #LATIN CAPITAL LETTER L WITH CARON 0xBD 0x02DD #DOUBLE ACUTE ACCENT 0xBE 0x013E #LATIN SMALL LETTER L WITH CARON 0xBF 0x017C #LATIN SMALL LETTER Z WITH DOT ABOVE 0xC0 0x0154 #LATIN CAPITAL LETTER R WITH ACUTE 0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE 0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX 0xC3 0x0102 #LATIN CAPITAL LETTER A WITH BREVE 0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS 0xC5 0x0139 #LATIN CAPITAL LETTER L WITH ACUTE 0xC6 0x0106 #LATIN CAPITAL LETTER C WITH ACUTE 0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA 0xC8 0x010C #LATIN CAPITAL LETTER C WITH CARON 0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE 0xCA 0x0118 #LATIN CAPITAL LETTER E WITH OGONEK 0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS 0xCC 0x011A #LATIN CAPITAL LETTER E WITH CARON 0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE 0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX 0xCF 0x010E #LATIN CAPITAL LETTER D WITH CARON 0xD0 0x0110 #LATIN CAPITAL LETTER D WITH STROKE 0xD1 0x0143 #LATIN CAPITAL LETTER N WITH ACUTE 0xD2 0x0147 #LATIN CAPITAL LETTER N WITH CARON 0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE 0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX 0xD5 0x0150 #LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS 0xD7 0x00D7 #MULTIPLICATION SIGN 0xD8 0x0158 #LATIN CAPITAL LETTER R WITH CARON 0xD9 0x016E #LATIN CAPITAL LETTER U WITH RING ABOVE 0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE 0xDB 0x0170 #LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS 0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE 0xDE 0x0162 #LATIN CAPITAL LETTER T WITH CEDILLA 0xDF 0x00DF #LATIN SMALL LETTER SHARP S 0xE0 0x0155 #LATIN SMALL LETTER R WITH ACUTE 0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE 0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX 0xE3 0x0103 #LATIN SMALL LETTER A WITH BREVE 0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS 0xE5 0x013A #LATIN SMALL LETTER L WITH ACUTE 0xE6 0x0107 #LATIN SMALL LETTER C WITH ACUTE 0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA 0xE8 0x010D #LATIN SMALL LETTER C WITH CARON 0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE 0xEA 0x0119 #LATIN SMALL LETTER E WITH OGONEK 0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS 0xEC 0x011B #LATIN SMALL LETTER E WITH CARON 0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE 0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX 0xEF 0x010F #LATIN SMALL LETTER D WITH CARON 0xF0 0x0111 #LATIN SMALL LETTER D WITH STROKE 0xF1 0x0144 #LATIN SMALL LETTER N WITH ACUTE 0xF2 0x0148 #LATIN SMALL LETTER N WITH CARON 0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE 0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX 0xF5 0x0151 #LATIN SMALL LETTER O WITH DOUBLE ACUTE 0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS 0xF7 0x00F7 #DIVISION SIGN 0xF8 0x0159 #LATIN SMALL LETTER R WITH CARON 0xF9 0x016F #LATIN SMALL LETTER U WITH RING ABOVE 0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE 0xFB 0x0171 #LATIN SMALL LETTER U WITH DOUBLE ACUTE 0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS 0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE 0xFE 0x0163 #LATIN SMALL LETTER T WITH CEDILLA 0xFF 0x02D9 #DOT ABOVE therion/thchencdata/8859-1.TXT0000664000175000017500000002454007246476600014710 0ustar useruser# # Name: ISO/IEC 8859-1:1998 to Unicode # Unicode version: 3.0 # Table version: 1.0 # Table format: Format A # Date: 1999 July 27 # Authors: Ken Whistler # # Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. # # This file is provided as-is by Unicode, Inc. (The Unicode Consortium). # No claims are made as to fitness for any particular purpose. No # warranties of any kind are expressed or implied. The recipient # agrees to determine applicability of information provided. If this # file has been provided on optical media by Unicode, Inc., the sole # remedy for any claim will be exchange of defective media within 90 # days of receipt. # # Unicode, Inc. hereby grants the right to freely use the information # supplied in this file in the creation of products supporting the # Unicode Standard, and to make copies of this file in any form for # internal or external distribution as long as this notice remains # attached. # # General notes: # # This table contains the data the Unicode Consortium has on how # ISO/IEC 8859-1:1998 characters map into Unicode. # # Format: Three tab-separated columns # Column #1 is the ISO/IEC 8859-1 code (in hex as 0xXX) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 the Unicode name (follows a comment sign, '#') # # The entries are in ISO/IEC 8859-1 order. # # Version history # 1.0 version updates 0.1 version by adding mappings for all # control characters. # # Updated versions of this file may be found in: # # # Any comments or problems, contact # Please note that is an archival address; # notices will be checked, but do not expect an immediate response. # 0x00 0x0000 # NULL 0x01 0x0001 # START OF HEADING 0x02 0x0002 # START OF TEXT 0x03 0x0003 # END OF TEXT 0x04 0x0004 # END OF TRANSMISSION 0x05 0x0005 # ENQUIRY 0x06 0x0006 # ACKNOWLEDGE 0x07 0x0007 # BELL 0x08 0x0008 # BACKSPACE 0x09 0x0009 # HORIZONTAL TABULATION 0x0A 0x000A # LINE FEED 0x0B 0x000B # VERTICAL TABULATION 0x0C 0x000C # FORM FEED 0x0D 0x000D # CARRIAGE RETURN 0x0E 0x000E # SHIFT OUT 0x0F 0x000F # SHIFT IN 0x10 0x0010 # DATA LINK ESCAPE 0x11 0x0011 # DEVICE CONTROL ONE 0x12 0x0012 # DEVICE CONTROL TWO 0x13 0x0013 # DEVICE CONTROL THREE 0x14 0x0014 # DEVICE CONTROL FOUR 0x15 0x0015 # NEGATIVE ACKNOWLEDGE 0x16 0x0016 # SYNCHRONOUS IDLE 0x17 0x0017 # END OF TRANSMISSION BLOCK 0x18 0x0018 # CANCEL 0x19 0x0019 # END OF MEDIUM 0x1A 0x001A # SUBSTITUTE 0x1B 0x001B # ESCAPE 0x1C 0x001C # FILE SEPARATOR 0x1D 0x001D # GROUP SEPARATOR 0x1E 0x001E # RECORD SEPARATOR 0x1F 0x001F # UNIT SEPARATOR 0x20 0x0020 # SPACE 0x21 0x0021 # EXCLAMATION MARK 0x22 0x0022 # QUOTATION MARK 0x23 0x0023 # NUMBER SIGN 0x24 0x0024 # DOLLAR SIGN 0x25 0x0025 # PERCENT SIGN 0x26 0x0026 # AMPERSAND 0x27 0x0027 # APOSTROPHE 0x28 0x0028 # LEFT PARENTHESIS 0x29 0x0029 # RIGHT PARENTHESIS 0x2A 0x002A # ASTERISK 0x2B 0x002B # PLUS SIGN 0x2C 0x002C # COMMA 0x2D 0x002D # HYPHEN-MINUS 0x2E 0x002E # FULL STOP 0x2F 0x002F # SOLIDUS 0x30 0x0030 # DIGIT ZERO 0x31 0x0031 # DIGIT ONE 0x32 0x0032 # DIGIT TWO 0x33 0x0033 # DIGIT THREE 0x34 0x0034 # DIGIT FOUR 0x35 0x0035 # DIGIT FIVE 0x36 0x0036 # DIGIT SIX 0x37 0x0037 # DIGIT SEVEN 0x38 0x0038 # DIGIT EIGHT 0x39 0x0039 # DIGIT NINE 0x3A 0x003A # COLON 0x3B 0x003B # SEMICOLON 0x3C 0x003C # LESS-THAN SIGN 0x3D 0x003D # EQUALS SIGN 0x3E 0x003E # GREATER-THAN SIGN 0x3F 0x003F # QUESTION MARK 0x40 0x0040 # COMMERCIAL AT 0x41 0x0041 # LATIN CAPITAL LETTER A 0x42 0x0042 # LATIN CAPITAL LETTER B 0x43 0x0043 # LATIN CAPITAL LETTER C 0x44 0x0044 # LATIN CAPITAL LETTER D 0x45 0x0045 # LATIN CAPITAL LETTER E 0x46 0x0046 # LATIN CAPITAL LETTER F 0x47 0x0047 # LATIN CAPITAL LETTER G 0x48 0x0048 # LATIN CAPITAL LETTER H 0x49 0x0049 # LATIN CAPITAL LETTER I 0x4A 0x004A # LATIN CAPITAL LETTER J 0x4B 0x004B # LATIN CAPITAL LETTER K 0x4C 0x004C # LATIN CAPITAL LETTER L 0x4D 0x004D # LATIN CAPITAL LETTER M 0x4E 0x004E # LATIN CAPITAL LETTER N 0x4F 0x004F # LATIN CAPITAL LETTER O 0x50 0x0050 # LATIN CAPITAL LETTER P 0x51 0x0051 # LATIN CAPITAL LETTER Q 0x52 0x0052 # LATIN CAPITAL LETTER R 0x53 0x0053 # LATIN CAPITAL LETTER S 0x54 0x0054 # LATIN CAPITAL LETTER T 0x55 0x0055 # LATIN CAPITAL LETTER U 0x56 0x0056 # LATIN CAPITAL LETTER V 0x57 0x0057 # LATIN CAPITAL LETTER W 0x58 0x0058 # LATIN CAPITAL LETTER X 0x59 0x0059 # LATIN CAPITAL LETTER Y 0x5A 0x005A # LATIN CAPITAL LETTER Z 0x5B 0x005B # LEFT SQUARE BRACKET 0x5C 0x005C # REVERSE SOLIDUS 0x5D 0x005D # RIGHT SQUARE BRACKET 0x5E 0x005E # CIRCUMFLEX ACCENT 0x5F 0x005F # LOW LINE 0x60 0x0060 # GRAVE ACCENT 0x61 0x0061 # LATIN SMALL LETTER A 0x62 0x0062 # LATIN SMALL LETTER B 0x63 0x0063 # LATIN SMALL LETTER C 0x64 0x0064 # LATIN SMALL LETTER D 0x65 0x0065 # LATIN SMALL LETTER E 0x66 0x0066 # LATIN SMALL LETTER F 0x67 0x0067 # LATIN SMALL LETTER G 0x68 0x0068 # LATIN SMALL LETTER H 0x69 0x0069 # LATIN SMALL LETTER I 0x6A 0x006A # LATIN SMALL LETTER J 0x6B 0x006B # LATIN SMALL LETTER K 0x6C 0x006C # LATIN SMALL LETTER L 0x6D 0x006D # LATIN SMALL LETTER M 0x6E 0x006E # LATIN SMALL LETTER N 0x6F 0x006F # LATIN SMALL LETTER O 0x70 0x0070 # LATIN SMALL LETTER P 0x71 0x0071 # LATIN SMALL LETTER Q 0x72 0x0072 # LATIN SMALL LETTER R 0x73 0x0073 # LATIN SMALL LETTER S 0x74 0x0074 # LATIN SMALL LETTER T 0x75 0x0075 # LATIN SMALL LETTER U 0x76 0x0076 # LATIN SMALL LETTER V 0x77 0x0077 # LATIN SMALL LETTER W 0x78 0x0078 # LATIN SMALL LETTER X 0x79 0x0079 # LATIN SMALL LETTER Y 0x7A 0x007A # LATIN SMALL LETTER Z 0x7B 0x007B # LEFT CURLY BRACKET 0x7C 0x007C # VERTICAL LINE 0x7D 0x007D # RIGHT CURLY BRACKET 0x7E 0x007E # TILDE 0x7F 0x007F # DELETE 0x80 0x0080 # 0x81 0x0081 # 0x82 0x0082 # 0x83 0x0083 # 0x84 0x0084 # 0x85 0x0085 # 0x86 0x0086 # 0x87 0x0087 # 0x88 0x0088 # 0x89 0x0089 # 0x8A 0x008A # 0x8B 0x008B # 0x8C 0x008C # 0x8D 0x008D # 0x8E 0x008E # 0x8F 0x008F # 0x90 0x0090 # 0x91 0x0091 # 0x92 0x0092 # 0x93 0x0093 # 0x94 0x0094 # 0x95 0x0095 # 0x96 0x0096 # 0x97 0x0097 # 0x98 0x0098 # 0x99 0x0099 # 0x9A 0x009A # 0x9B 0x009B # 0x9C 0x009C # 0x9D 0x009D # 0x9E 0x009E # 0x9F 0x009F # 0xA0 0x00A0 # NO-BREAK SPACE 0xA1 0x00A1 # INVERTED EXCLAMATION MARK 0xA2 0x00A2 # CENT SIGN 0xA3 0x00A3 # POUND SIGN 0xA4 0x00A4 # CURRENCY SIGN 0xA5 0x00A5 # YEN SIGN 0xA6 0x00A6 # BROKEN BAR 0xA7 0x00A7 # SECTION SIGN 0xA8 0x00A8 # DIAERESIS 0xA9 0x00A9 # COPYRIGHT SIGN 0xAA 0x00AA # FEMININE ORDINAL INDICATOR 0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 0xAC 0x00AC # NOT SIGN 0xAD 0x00AD # SOFT HYPHEN 0xAE 0x00AE # REGISTERED SIGN 0xAF 0x00AF # MACRON 0xB0 0x00B0 # DEGREE SIGN 0xB1 0x00B1 # PLUS-MINUS SIGN 0xB2 0x00B2 # SUPERSCRIPT TWO 0xB3 0x00B3 # SUPERSCRIPT THREE 0xB4 0x00B4 # ACUTE ACCENT 0xB5 0x00B5 # MICRO SIGN 0xB6 0x00B6 # PILCROW SIGN 0xB7 0x00B7 # MIDDLE DOT 0xB8 0x00B8 # CEDILLA 0xB9 0x00B9 # SUPERSCRIPT ONE 0xBA 0x00BA # MASCULINE ORDINAL INDICATOR 0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0xBC 0x00BC # VULGAR FRACTION ONE QUARTER 0xBD 0x00BD # VULGAR FRACTION ONE HALF 0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS 0xBF 0x00BF # INVERTED QUESTION MARK 0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE 0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE 0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE 0xC6 0x00C6 # LATIN CAPITAL LETTER AE 0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA 0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE 0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE 0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS 0xD0 0x00D0 # LATIN CAPITAL LETTER ETH (Icelandic) 0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE 0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE 0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE 0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 0xD7 0x00D7 # MULTIPLICATION SIGN 0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE 0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE 0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE 0xDE 0x00DE # LATIN CAPITAL LETTER THORN (Icelandic) 0xDF 0x00DF # LATIN SMALL LETTER SHARP S (German) 0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE 0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE 0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE 0xE6 0x00E6 # LATIN SMALL LETTER AE 0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA 0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE 0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX 0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE 0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS 0xF0 0x00F0 # LATIN SMALL LETTER ETH (Icelandic) 0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE 0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE 0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE 0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 0xF7 0x00F7 # DIVISION SIGN 0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE 0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE 0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX 0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE 0xFE 0x00FE # LATIN SMALL LETTER THORN (Icelandic) 0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS therion/thchencdata/8859-2.TXT0000664000175000017500000002510007246476600014702 0ustar useruser# # Name: ISO 8859-2:1999 to Unicode # Unicode version: 3.0 # Table version: 1.0 # Table format: Format A # Date: 1999 July 27 # Authors: Ken Whistler # # Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. # # This file is provided as-is by Unicode, Inc. (The Unicode Consortium). # No claims are made as to fitness for any particular purpose. No # warranties of any kind are expressed or implied. The recipient # agrees to determine applicability of information provided. If this # file has been provided on optical media by Unicode, Inc., the sole # remedy for any claim will be exchange of defective media within 90 # days of receipt. # # Unicode, Inc. hereby grants the right to freely use the information # supplied in this file in the creation of products supporting the # Unicode Standard, and to make copies of this file in any form for # internal or external distribution as long as this notice remains # attached. # # General notes: # # This table contains the data the Unicode Consortium has on how # ISO/IEC 8859-2:1999 characters map into Unicode. # # Format: Three tab-separated columns # Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 the Unicode name (follows a comment sign, '#') # # The entries are in ISO/IEC 8859-2 order. # # Version history # 1.0 version updates 0.1 version by adding mappings for all # control characters. # # Updated versions of this file may be found in: # # # Any comments or problems, contact # Please note that is an archival address; # notices will be checked, but do not expect an immediate response. # 0x00 0x0000 # NULL 0x01 0x0001 # START OF HEADING 0x02 0x0002 # START OF TEXT 0x03 0x0003 # END OF TEXT 0x04 0x0004 # END OF TRANSMISSION 0x05 0x0005 # ENQUIRY 0x06 0x0006 # ACKNOWLEDGE 0x07 0x0007 # BELL 0x08 0x0008 # BACKSPACE 0x09 0x0009 # HORIZONTAL TABULATION 0x0A 0x000A # LINE FEED 0x0B 0x000B # VERTICAL TABULATION 0x0C 0x000C # FORM FEED 0x0D 0x000D # CARRIAGE RETURN 0x0E 0x000E # SHIFT OUT 0x0F 0x000F # SHIFT IN 0x10 0x0010 # DATA LINK ESCAPE 0x11 0x0011 # DEVICE CONTROL ONE 0x12 0x0012 # DEVICE CONTROL TWO 0x13 0x0013 # DEVICE CONTROL THREE 0x14 0x0014 # DEVICE CONTROL FOUR 0x15 0x0015 # NEGATIVE ACKNOWLEDGE 0x16 0x0016 # SYNCHRONOUS IDLE 0x17 0x0017 # END OF TRANSMISSION BLOCK 0x18 0x0018 # CANCEL 0x19 0x0019 # END OF MEDIUM 0x1A 0x001A # SUBSTITUTE 0x1B 0x001B # ESCAPE 0x1C 0x001C # FILE SEPARATOR 0x1D 0x001D # GROUP SEPARATOR 0x1E 0x001E # RECORD SEPARATOR 0x1F 0x001F # UNIT SEPARATOR 0x20 0x0020 # SPACE 0x21 0x0021 # EXCLAMATION MARK 0x22 0x0022 # QUOTATION MARK 0x23 0x0023 # NUMBER SIGN 0x24 0x0024 # DOLLAR SIGN 0x25 0x0025 # PERCENT SIGN 0x26 0x0026 # AMPERSAND 0x27 0x0027 # APOSTROPHE 0x28 0x0028 # LEFT PARENTHESIS 0x29 0x0029 # RIGHT PARENTHESIS 0x2A 0x002A # ASTERISK 0x2B 0x002B # PLUS SIGN 0x2C 0x002C # COMMA 0x2D 0x002D # HYPHEN-MINUS 0x2E 0x002E # FULL STOP 0x2F 0x002F # SOLIDUS 0x30 0x0030 # DIGIT ZERO 0x31 0x0031 # DIGIT ONE 0x32 0x0032 # DIGIT TWO 0x33 0x0033 # DIGIT THREE 0x34 0x0034 # DIGIT FOUR 0x35 0x0035 # DIGIT FIVE 0x36 0x0036 # DIGIT SIX 0x37 0x0037 # DIGIT SEVEN 0x38 0x0038 # DIGIT EIGHT 0x39 0x0039 # DIGIT NINE 0x3A 0x003A # COLON 0x3B 0x003B # SEMICOLON 0x3C 0x003C # LESS-THAN SIGN 0x3D 0x003D # EQUALS SIGN 0x3E 0x003E # GREATER-THAN SIGN 0x3F 0x003F # QUESTION MARK 0x40 0x0040 # COMMERCIAL AT 0x41 0x0041 # LATIN CAPITAL LETTER A 0x42 0x0042 # LATIN CAPITAL LETTER B 0x43 0x0043 # LATIN CAPITAL LETTER C 0x44 0x0044 # LATIN CAPITAL LETTER D 0x45 0x0045 # LATIN CAPITAL LETTER E 0x46 0x0046 # LATIN CAPITAL LETTER F 0x47 0x0047 # LATIN CAPITAL LETTER G 0x48 0x0048 # LATIN CAPITAL LETTER H 0x49 0x0049 # LATIN CAPITAL LETTER I 0x4A 0x004A # LATIN CAPITAL LETTER J 0x4B 0x004B # LATIN CAPITAL LETTER K 0x4C 0x004C # LATIN CAPITAL LETTER L 0x4D 0x004D # LATIN CAPITAL LETTER M 0x4E 0x004E # LATIN CAPITAL LETTER N 0x4F 0x004F # LATIN CAPITAL LETTER O 0x50 0x0050 # LATIN CAPITAL LETTER P 0x51 0x0051 # LATIN CAPITAL LETTER Q 0x52 0x0052 # LATIN CAPITAL LETTER R 0x53 0x0053 # LATIN CAPITAL LETTER S 0x54 0x0054 # LATIN CAPITAL LETTER T 0x55 0x0055 # LATIN CAPITAL LETTER U 0x56 0x0056 # LATIN CAPITAL LETTER V 0x57 0x0057 # LATIN CAPITAL LETTER W 0x58 0x0058 # LATIN CAPITAL LETTER X 0x59 0x0059 # LATIN CAPITAL LETTER Y 0x5A 0x005A # LATIN CAPITAL LETTER Z 0x5B 0x005B # LEFT SQUARE BRACKET 0x5C 0x005C # REVERSE SOLIDUS 0x5D 0x005D # RIGHT SQUARE BRACKET 0x5E 0x005E # CIRCUMFLEX ACCENT 0x5F 0x005F # LOW LINE 0x60 0x0060 # GRAVE ACCENT 0x61 0x0061 # LATIN SMALL LETTER A 0x62 0x0062 # LATIN SMALL LETTER B 0x63 0x0063 # LATIN SMALL LETTER C 0x64 0x0064 # LATIN SMALL LETTER D 0x65 0x0065 # LATIN SMALL LETTER E 0x66 0x0066 # LATIN SMALL LETTER F 0x67 0x0067 # LATIN SMALL LETTER G 0x68 0x0068 # LATIN SMALL LETTER H 0x69 0x0069 # LATIN SMALL LETTER I 0x6A 0x006A # LATIN SMALL LETTER J 0x6B 0x006B # LATIN SMALL LETTER K 0x6C 0x006C # LATIN SMALL LETTER L 0x6D 0x006D # LATIN SMALL LETTER M 0x6E 0x006E # LATIN SMALL LETTER N 0x6F 0x006F # LATIN SMALL LETTER O 0x70 0x0070 # LATIN SMALL LETTER P 0x71 0x0071 # LATIN SMALL LETTER Q 0x72 0x0072 # LATIN SMALL LETTER R 0x73 0x0073 # LATIN SMALL LETTER S 0x74 0x0074 # LATIN SMALL LETTER T 0x75 0x0075 # LATIN SMALL LETTER U 0x76 0x0076 # LATIN SMALL LETTER V 0x77 0x0077 # LATIN SMALL LETTER W 0x78 0x0078 # LATIN SMALL LETTER X 0x79 0x0079 # LATIN SMALL LETTER Y 0x7A 0x007A # LATIN SMALL LETTER Z 0x7B 0x007B # LEFT CURLY BRACKET 0x7C 0x007C # VERTICAL LINE 0x7D 0x007D # RIGHT CURLY BRACKET 0x7E 0x007E # TILDE 0x7F 0x007F # DELETE 0x80 0x0080 # 0x81 0x0081 # 0x82 0x0082 # 0x83 0x0083 # 0x84 0x0084 # 0x85 0x0085 # 0x86 0x0086 # 0x87 0x0087 # 0x88 0x0088 # 0x89 0x0089 # 0x8A 0x008A # 0x8B 0x008B # 0x8C 0x008C # 0x8D 0x008D # 0x8E 0x008E # 0x8F 0x008F # 0x90 0x0090 # 0x91 0x0091 # 0x92 0x0092 # 0x93 0x0093 # 0x94 0x0094 # 0x95 0x0095 # 0x96 0x0096 # 0x97 0x0097 # 0x98 0x0098 # 0x99 0x0099 # 0x9A 0x009A # 0x9B 0x009B # 0x9C 0x009C # 0x9D 0x009D # 0x9E 0x009E # 0x9F 0x009F # 0xA0 0x00A0 # NO-BREAK SPACE 0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK 0xA2 0x02D8 # BREVE 0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE 0xA4 0x00A4 # CURRENCY SIGN 0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON 0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE 0xA7 0x00A7 # SECTION SIGN 0xA8 0x00A8 # DIAERESIS 0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON 0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA 0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON 0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE 0xAD 0x00AD # SOFT HYPHEN 0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON 0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE 0xB0 0x00B0 # DEGREE SIGN 0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK 0xB2 0x02DB # OGONEK 0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE 0xB4 0x00B4 # ACUTE ACCENT 0xB5 0x013E # LATIN SMALL LETTER L WITH CARON 0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE 0xB7 0x02C7 # CARON 0xB8 0x00B8 # CEDILLA 0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON 0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA 0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON 0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE 0xBD 0x02DD # DOUBLE ACUTE ACCENT 0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON 0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE 0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE 0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE 0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE 0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS 0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE 0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE 0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA 0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON 0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE 0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK 0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS 0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON 0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE 0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON 0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE 0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE 0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON 0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE 0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS 0xD7 0x00D7 # MULTIPLICATION SIGN 0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON 0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE 0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE 0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS 0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE 0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA 0xDF 0x00DF # LATIN SMALL LETTER SHARP S 0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE 0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE 0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX 0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE 0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS 0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE 0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE 0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA 0xE8 0x010D # LATIN SMALL LETTER C WITH CARON 0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE 0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK 0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS 0xEC 0x011B # LATIN SMALL LETTER E WITH CARON 0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE 0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX 0xEF 0x010F # LATIN SMALL LETTER D WITH CARON 0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE 0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE 0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON 0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE 0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX 0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE 0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS 0xF7 0x00F7 # DIVISION SIGN 0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON 0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE 0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE 0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE 0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS 0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE 0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA 0xFF 0x02D9 # DOT ABOVE therion/thchencdata/8859-7.TXT0000664000175000017500000002417507246476600014722 0ustar useruser# # Name: ISO 8859-7:1987 to Unicode # Unicode version: 3.0 # Table version: 1.0 # Table format: Format A # Date: 1999 July 27 # Authors: Ken Whistler # # Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. # # This file is provided as-is by Unicode, Inc. (The Unicode Consortium). # No claims are made as to fitness for any particular purpose. No # warranties of any kind are expressed or implied. The recipient # agrees to determine applicability of information provided. If this # file has been provided on optical media by Unicode, Inc., the sole # remedy for any claim will be exchange of defective media within 90 # days of receipt. # # Unicode, Inc. hereby grants the right to freely use the information # supplied in this file in the creation of products supporting the # Unicode Standard, and to make copies of this file in any form for # internal or external distribution as long as this notice remains # attached. # # General notes: # # This table contains the data the Unicode Consortium has on how # ISO 8859-7:1987 characters map into Unicode. # # ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928, # and ECMA 118. # # Format: Three tab-separated columns # Column #1 is the ISO 8859-7 code (in hex as 0xXX) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 the Unicode name (follows a comment sign, '#') # # The entries are in ISO 8859-7 order. # # Version history # 1.0 version updates 0.1 version by adding mappings for all # control characters. # Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7 # Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7 # # Updated versions of this file may be found in: # # # Any comments or problems, contact # Please note that is an archival address; # notices will be checked, but do not expect an immediate response. # 0x00 0x0000 # NULL 0x01 0x0001 # START OF HEADING 0x02 0x0002 # START OF TEXT 0x03 0x0003 # END OF TEXT 0x04 0x0004 # END OF TRANSMISSION 0x05 0x0005 # ENQUIRY 0x06 0x0006 # ACKNOWLEDGE 0x07 0x0007 # BELL 0x08 0x0008 # BACKSPACE 0x09 0x0009 # HORIZONTAL TABULATION 0x0A 0x000A # LINE FEED 0x0B 0x000B # VERTICAL TABULATION 0x0C 0x000C # FORM FEED 0x0D 0x000D # CARRIAGE RETURN 0x0E 0x000E # SHIFT OUT 0x0F 0x000F # SHIFT IN 0x10 0x0010 # DATA LINK ESCAPE 0x11 0x0011 # DEVICE CONTROL ONE 0x12 0x0012 # DEVICE CONTROL TWO 0x13 0x0013 # DEVICE CONTROL THREE 0x14 0x0014 # DEVICE CONTROL FOUR 0x15 0x0015 # NEGATIVE ACKNOWLEDGE 0x16 0x0016 # SYNCHRONOUS IDLE 0x17 0x0017 # END OF TRANSMISSION BLOCK 0x18 0x0018 # CANCEL 0x19 0x0019 # END OF MEDIUM 0x1A 0x001A # SUBSTITUTE 0x1B 0x001B # ESCAPE 0x1C 0x001C # FILE SEPARATOR 0x1D 0x001D # GROUP SEPARATOR 0x1E 0x001E # RECORD SEPARATOR 0x1F 0x001F # UNIT SEPARATOR 0x20 0x0020 # SPACE 0x21 0x0021 # EXCLAMATION MARK 0x22 0x0022 # QUOTATION MARK 0x23 0x0023 # NUMBER SIGN 0x24 0x0024 # DOLLAR SIGN 0x25 0x0025 # PERCENT SIGN 0x26 0x0026 # AMPERSAND 0x27 0x0027 # APOSTROPHE 0x28 0x0028 # LEFT PARENTHESIS 0x29 0x0029 # RIGHT PARENTHESIS 0x2A 0x002A # ASTERISK 0x2B 0x002B # PLUS SIGN 0x2C 0x002C # COMMA 0x2D 0x002D # HYPHEN-MINUS 0x2E 0x002E # FULL STOP 0x2F 0x002F # SOLIDUS 0x30 0x0030 # DIGIT ZERO 0x31 0x0031 # DIGIT ONE 0x32 0x0032 # DIGIT TWO 0x33 0x0033 # DIGIT THREE 0x34 0x0034 # DIGIT FOUR 0x35 0x0035 # DIGIT FIVE 0x36 0x0036 # DIGIT SIX 0x37 0x0037 # DIGIT SEVEN 0x38 0x0038 # DIGIT EIGHT 0x39 0x0039 # DIGIT NINE 0x3A 0x003A # COLON 0x3B 0x003B # SEMICOLON 0x3C 0x003C # LESS-THAN SIGN 0x3D 0x003D # EQUALS SIGN 0x3E 0x003E # GREATER-THAN SIGN 0x3F 0x003F # QUESTION MARK 0x40 0x0040 # COMMERCIAL AT 0x41 0x0041 # LATIN CAPITAL LETTER A 0x42 0x0042 # LATIN CAPITAL LETTER B 0x43 0x0043 # LATIN CAPITAL LETTER C 0x44 0x0044 # LATIN CAPITAL LETTER D 0x45 0x0045 # LATIN CAPITAL LETTER E 0x46 0x0046 # LATIN CAPITAL LETTER F 0x47 0x0047 # LATIN CAPITAL LETTER G 0x48 0x0048 # LATIN CAPITAL LETTER H 0x49 0x0049 # LATIN CAPITAL LETTER I 0x4A 0x004A # LATIN CAPITAL LETTER J 0x4B 0x004B # LATIN CAPITAL LETTER K 0x4C 0x004C # LATIN CAPITAL LETTER L 0x4D 0x004D # LATIN CAPITAL LETTER M 0x4E 0x004E # LATIN CAPITAL LETTER N 0x4F 0x004F # LATIN CAPITAL LETTER O 0x50 0x0050 # LATIN CAPITAL LETTER P 0x51 0x0051 # LATIN CAPITAL LETTER Q 0x52 0x0052 # LATIN CAPITAL LETTER R 0x53 0x0053 # LATIN CAPITAL LETTER S 0x54 0x0054 # LATIN CAPITAL LETTER T 0x55 0x0055 # LATIN CAPITAL LETTER U 0x56 0x0056 # LATIN CAPITAL LETTER V 0x57 0x0057 # LATIN CAPITAL LETTER W 0x58 0x0058 # LATIN CAPITAL LETTER X 0x59 0x0059 # LATIN CAPITAL LETTER Y 0x5A 0x005A # LATIN CAPITAL LETTER Z 0x5B 0x005B # LEFT SQUARE BRACKET 0x5C 0x005C # REVERSE SOLIDUS 0x5D 0x005D # RIGHT SQUARE BRACKET 0x5E 0x005E # CIRCUMFLEX ACCENT 0x5F 0x005F # LOW LINE 0x60 0x0060 # GRAVE ACCENT 0x61 0x0061 # LATIN SMALL LETTER A 0x62 0x0062 # LATIN SMALL LETTER B 0x63 0x0063 # LATIN SMALL LETTER C 0x64 0x0064 # LATIN SMALL LETTER D 0x65 0x0065 # LATIN SMALL LETTER E 0x66 0x0066 # LATIN SMALL LETTER F 0x67 0x0067 # LATIN SMALL LETTER G 0x68 0x0068 # LATIN SMALL LETTER H 0x69 0x0069 # LATIN SMALL LETTER I 0x6A 0x006A # LATIN SMALL LETTER J 0x6B 0x006B # LATIN SMALL LETTER K 0x6C 0x006C # LATIN SMALL LETTER L 0x6D 0x006D # LATIN SMALL LETTER M 0x6E 0x006E # LATIN SMALL LETTER N 0x6F 0x006F # LATIN SMALL LETTER O 0x70 0x0070 # LATIN SMALL LETTER P 0x71 0x0071 # LATIN SMALL LETTER Q 0x72 0x0072 # LATIN SMALL LETTER R 0x73 0x0073 # LATIN SMALL LETTER S 0x74 0x0074 # LATIN SMALL LETTER T 0x75 0x0075 # LATIN SMALL LETTER U 0x76 0x0076 # LATIN SMALL LETTER V 0x77 0x0077 # LATIN SMALL LETTER W 0x78 0x0078 # LATIN SMALL LETTER X 0x79 0x0079 # LATIN SMALL LETTER Y 0x7A 0x007A # LATIN SMALL LETTER Z 0x7B 0x007B # LEFT CURLY BRACKET 0x7C 0x007C # VERTICAL LINE 0x7D 0x007D # RIGHT CURLY BRACKET 0x7E 0x007E # TILDE 0x7F 0x007F # DELETE 0x80 0x0080 # 0x81 0x0081 # 0x82 0x0082 # 0x83 0x0083 # 0x84 0x0084 # 0x85 0x0085 # 0x86 0x0086 # 0x87 0x0087 # 0x88 0x0088 # 0x89 0x0089 # 0x8A 0x008A # 0x8B 0x008B # 0x8C 0x008C # 0x8D 0x008D # 0x8E 0x008E # 0x8F 0x008F # 0x90 0x0090 # 0x91 0x0091 # 0x92 0x0092 # 0x93 0x0093 # 0x94 0x0094 # 0x95 0x0095 # 0x96 0x0096 # 0x97 0x0097 # 0x98 0x0098 # 0x99 0x0099 # 0x9A 0x009A # 0x9B 0x009B # 0x9C 0x009C # 0x9D 0x009D # 0x9E 0x009E # 0x9F 0x009F # 0xA0 0x00A0 # NO-BREAK SPACE 0xA1 0x2018 # LEFT SINGLE QUOTATION MARK 0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK 0xA3 0x00A3 # POUND SIGN 0xA6 0x00A6 # BROKEN BAR 0xA7 0x00A7 # SECTION SIGN 0xA8 0x00A8 # DIAERESIS 0xA9 0x00A9 # COPYRIGHT SIGN 0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 0xAC 0x00AC # NOT SIGN 0xAD 0x00AD # SOFT HYPHEN 0xAF 0x2015 # HORIZONTAL BAR 0xB0 0x00B0 # DEGREE SIGN 0xB1 0x00B1 # PLUS-MINUS SIGN 0xB2 0x00B2 # SUPERSCRIPT TWO 0xB3 0x00B3 # SUPERSCRIPT THREE 0xB4 0x0384 # GREEK TONOS 0xB5 0x0385 # GREEK DIALYTIKA TONOS 0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS 0xB7 0x00B7 # MIDDLE DOT 0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS 0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS 0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS 0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS 0xBD 0x00BD # VULGAR FRACTION ONE HALF 0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS 0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS 0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA 0xC2 0x0392 # GREEK CAPITAL LETTER BETA 0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA 0xC4 0x0394 # GREEK CAPITAL LETTER DELTA 0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON 0xC6 0x0396 # GREEK CAPITAL LETTER ZETA 0xC7 0x0397 # GREEK CAPITAL LETTER ETA 0xC8 0x0398 # GREEK CAPITAL LETTER THETA 0xC9 0x0399 # GREEK CAPITAL LETTER IOTA 0xCA 0x039A # GREEK CAPITAL LETTER KAPPA 0xCB 0x039B # GREEK CAPITAL LETTER LAMDA 0xCC 0x039C # GREEK CAPITAL LETTER MU 0xCD 0x039D # GREEK CAPITAL LETTER NU 0xCE 0x039E # GREEK CAPITAL LETTER XI 0xCF 0x039F # GREEK CAPITAL LETTER OMICRON 0xD0 0x03A0 # GREEK CAPITAL LETTER PI 0xD1 0x03A1 # GREEK CAPITAL LETTER RHO 0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA 0xD4 0x03A4 # GREEK CAPITAL LETTER TAU 0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON 0xD6 0x03A6 # GREEK CAPITAL LETTER PHI 0xD7 0x03A7 # GREEK CAPITAL LETTER CHI 0xD8 0x03A8 # GREEK CAPITAL LETTER PSI 0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA 0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS 0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS 0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS 0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS 0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 0xE1 0x03B1 # GREEK SMALL LETTER ALPHA 0xE2 0x03B2 # GREEK SMALL LETTER BETA 0xE3 0x03B3 # GREEK SMALL LETTER GAMMA 0xE4 0x03B4 # GREEK SMALL LETTER DELTA 0xE5 0x03B5 # GREEK SMALL LETTER EPSILON 0xE6 0x03B6 # GREEK SMALL LETTER ZETA 0xE7 0x03B7 # GREEK SMALL LETTER ETA 0xE8 0x03B8 # GREEK SMALL LETTER THETA 0xE9 0x03B9 # GREEK SMALL LETTER IOTA 0xEA 0x03BA # GREEK SMALL LETTER KAPPA 0xEB 0x03BB # GREEK SMALL LETTER LAMDA 0xEC 0x03BC # GREEK SMALL LETTER MU 0xED 0x03BD # GREEK SMALL LETTER NU 0xEE 0x03BE # GREEK SMALL LETTER XI 0xEF 0x03BF # GREEK SMALL LETTER OMICRON 0xF0 0x03C0 # GREEK SMALL LETTER PI 0xF1 0x03C1 # GREEK SMALL LETTER RHO 0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA 0xF3 0x03C3 # GREEK SMALL LETTER SIGMA 0xF4 0x03C4 # GREEK SMALL LETTER TAU 0xF5 0x03C5 # GREEK SMALL LETTER UPSILON 0xF6 0x03C6 # GREEK SMALL LETTER PHI 0xF7 0x03C7 # GREEK SMALL LETTER CHI 0xF8 0x03C8 # GREEK SMALL LETTER PSI 0xF9 0x03C9 # GREEK SMALL LETTER OMEGA 0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA 0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA 0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS 0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS 0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS therion/thchencdata/CP1253.TXT0000664000175000017500000002134510720725044014740 0ustar useruser# # Name: cp1253 to Unicode table # Unicode version: 2.0 # Table version: 2.00 # Table format: Format A # Date: 04/15/98 # # Contact: cpxlate@microsoft.com # # General notes: none # # Format: Three tab-separated columns # Column #1 is the cp1253 code (in hex) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 is the Unicode name (follows a comment sign, '#') # # The entries are in cp1253 order # 0x00 0x0000 #NULL 0x01 0x0001 #START OF HEADING 0x02 0x0002 #START OF TEXT 0x03 0x0003 #END OF TEXT 0x04 0x0004 #END OF TRANSMISSION 0x05 0x0005 #ENQUIRY 0x06 0x0006 #ACKNOWLEDGE 0x07 0x0007 #BELL 0x08 0x0008 #BACKSPACE 0x09 0x0009 #HORIZONTAL TABULATION 0x0A 0x000A #LINE FEED 0x0B 0x000B #VERTICAL TABULATION 0x0C 0x000C #FORM FEED 0x0D 0x000D #CARRIAGE RETURN 0x0E 0x000E #SHIFT OUT 0x0F 0x000F #SHIFT IN 0x10 0x0010 #DATA LINK ESCAPE 0x11 0x0011 #DEVICE CONTROL ONE 0x12 0x0012 #DEVICE CONTROL TWO 0x13 0x0013 #DEVICE CONTROL THREE 0x14 0x0014 #DEVICE CONTROL FOUR 0x15 0x0015 #NEGATIVE ACKNOWLEDGE 0x16 0x0016 #SYNCHRONOUS IDLE 0x17 0x0017 #END OF TRANSMISSION BLOCK 0x18 0x0018 #CANCEL 0x19 0x0019 #END OF MEDIUM 0x1A 0x001A #SUBSTITUTE 0x1B 0x001B #ESCAPE 0x1C 0x001C #FILE SEPARATOR 0x1D 0x001D #GROUP SEPARATOR 0x1E 0x001E #RECORD SEPARATOR 0x1F 0x001F #UNIT SEPARATOR 0x20 0x0020 #SPACE 0x21 0x0021 #EXCLAMATION MARK 0x22 0x0022 #QUOTATION MARK 0x23 0x0023 #NUMBER SIGN 0x24 0x0024 #DOLLAR SIGN 0x25 0x0025 #PERCENT SIGN 0x26 0x0026 #AMPERSAND 0x27 0x0027 #APOSTROPHE 0x28 0x0028 #LEFT PARENTHESIS 0x29 0x0029 #RIGHT PARENTHESIS 0x2A 0x002A #ASTERISK 0x2B 0x002B #PLUS SIGN 0x2C 0x002C #COMMA 0x2D 0x002D #HYPHEN-MINUS 0x2E 0x002E #FULL STOP 0x2F 0x002F #SOLIDUS 0x30 0x0030 #DIGIT ZERO 0x31 0x0031 #DIGIT ONE 0x32 0x0032 #DIGIT TWO 0x33 0x0033 #DIGIT THREE 0x34 0x0034 #DIGIT FOUR 0x35 0x0035 #DIGIT FIVE 0x36 0x0036 #DIGIT SIX 0x37 0x0037 #DIGIT SEVEN 0x38 0x0038 #DIGIT EIGHT 0x39 0x0039 #DIGIT NINE 0x3A 0x003A #COLON 0x3B 0x003B #SEMICOLON 0x3C 0x003C #LESS-THAN SIGN 0x3D 0x003D #EQUALS SIGN 0x3E 0x003E #GREATER-THAN SIGN 0x3F 0x003F #QUESTION MARK 0x40 0x0040 #COMMERCIAL AT 0x41 0x0041 #LATIN CAPITAL LETTER A 0x42 0x0042 #LATIN CAPITAL LETTER B 0x43 0x0043 #LATIN CAPITAL LETTER C 0x44 0x0044 #LATIN CAPITAL LETTER D 0x45 0x0045 #LATIN CAPITAL LETTER E 0x46 0x0046 #LATIN CAPITAL LETTER F 0x47 0x0047 #LATIN CAPITAL LETTER G 0x48 0x0048 #LATIN CAPITAL LETTER H 0x49 0x0049 #LATIN CAPITAL LETTER I 0x4A 0x004A #LATIN CAPITAL LETTER J 0x4B 0x004B #LATIN CAPITAL LETTER K 0x4C 0x004C #LATIN CAPITAL LETTER L 0x4D 0x004D #LATIN CAPITAL LETTER M 0x4E 0x004E #LATIN CAPITAL LETTER N 0x4F 0x004F #LATIN CAPITAL LETTER O 0x50 0x0050 #LATIN CAPITAL LETTER P 0x51 0x0051 #LATIN CAPITAL LETTER Q 0x52 0x0052 #LATIN CAPITAL LETTER R 0x53 0x0053 #LATIN CAPITAL LETTER S 0x54 0x0054 #LATIN CAPITAL LETTER T 0x55 0x0055 #LATIN CAPITAL LETTER U 0x56 0x0056 #LATIN CAPITAL LETTER V 0x57 0x0057 #LATIN CAPITAL LETTER W 0x58 0x0058 #LATIN CAPITAL LETTER X 0x59 0x0059 #LATIN CAPITAL LETTER Y 0x5A 0x005A #LATIN CAPITAL LETTER Z 0x5B 0x005B #LEFT SQUARE BRACKET 0x5C 0x005C #REVERSE SOLIDUS 0x5D 0x005D #RIGHT SQUARE BRACKET 0x5E 0x005E #CIRCUMFLEX ACCENT 0x5F 0x005F #LOW LINE 0x60 0x0060 #GRAVE ACCENT 0x61 0x0061 #LATIN SMALL LETTER A 0x62 0x0062 #LATIN SMALL LETTER B 0x63 0x0063 #LATIN SMALL LETTER C 0x64 0x0064 #LATIN SMALL LETTER D 0x65 0x0065 #LATIN SMALL LETTER E 0x66 0x0066 #LATIN SMALL LETTER F 0x67 0x0067 #LATIN SMALL LETTER G 0x68 0x0068 #LATIN SMALL LETTER H 0x69 0x0069 #LATIN SMALL LETTER I 0x6A 0x006A #LATIN SMALL LETTER J 0x6B 0x006B #LATIN SMALL LETTER K 0x6C 0x006C #LATIN SMALL LETTER L 0x6D 0x006D #LATIN SMALL LETTER M 0x6E 0x006E #LATIN SMALL LETTER N 0x6F 0x006F #LATIN SMALL LETTER O 0x70 0x0070 #LATIN SMALL LETTER P 0x71 0x0071 #LATIN SMALL LETTER Q 0x72 0x0072 #LATIN SMALL LETTER R 0x73 0x0073 #LATIN SMALL LETTER S 0x74 0x0074 #LATIN SMALL LETTER T 0x75 0x0075 #LATIN SMALL LETTER U 0x76 0x0076 #LATIN SMALL LETTER V 0x77 0x0077 #LATIN SMALL LETTER W 0x78 0x0078 #LATIN SMALL LETTER X 0x79 0x0079 #LATIN SMALL LETTER Y 0x7A 0x007A #LATIN SMALL LETTER Z 0x7B 0x007B #LEFT CURLY BRACKET 0x7C 0x007C #VERTICAL LINE 0x7D 0x007D #RIGHT CURLY BRACKET 0x7E 0x007E #TILDE 0x7F 0x007F #DELETE 0x80 0x20AC #EURO SIGN 0x81 #UNDEFINED 0x82 0x201A #SINGLE LOW-9 QUOTATION MARK 0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK 0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK 0x85 0x2026 #HORIZONTAL ELLIPSIS 0x86 0x2020 #DAGGER 0x87 0x2021 #DOUBLE DAGGER 0x88 #UNDEFINED 0x89 0x2030 #PER MILLE SIGN 0x8A #UNDEFINED 0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK 0x8C #UNDEFINED 0x8D #UNDEFINED 0x8E #UNDEFINED 0x8F #UNDEFINED 0x90 #UNDEFINED 0x91 0x2018 #LEFT SINGLE QUOTATION MARK 0x92 0x2019 #RIGHT SINGLE QUOTATION MARK 0x93 0x201C #LEFT DOUBLE QUOTATION MARK 0x94 0x201D #RIGHT DOUBLE QUOTATION MARK 0x95 0x2022 #BULLET 0x96 0x2013 #EN DASH 0x97 0x2014 #EM DASH 0x98 #UNDEFINED 0x99 0x2122 #TRADE MARK SIGN 0x9A #UNDEFINED 0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 0x9C #UNDEFINED 0x9D #UNDEFINED 0x9E #UNDEFINED 0x9F #UNDEFINED 0xA0 0x00A0 #NO-BREAK SPACE 0xA1 0x0385 #GREEK DIALYTIKA TONOS 0xA2 0x0386 #GREEK CAPITAL LETTER ALPHA WITH TONOS 0xA3 0x00A3 #POUND SIGN 0xA4 0x00A4 #CURRENCY SIGN 0xA5 0x00A5 #YEN SIGN 0xA6 0x00A6 #BROKEN BAR 0xA7 0x00A7 #SECTION SIGN 0xA8 0x00A8 #DIAERESIS 0xA9 0x00A9 #COPYRIGHT SIGN 0xAA #UNDEFINED 0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 0xAC 0x00AC #NOT SIGN 0xAD 0x00AD #SOFT HYPHEN 0xAE 0x00AE #REGISTERED SIGN 0xAF 0x2015 #HORIZONTAL BAR 0xB0 0x00B0 #DEGREE SIGN 0xB1 0x00B1 #PLUS-MINUS SIGN 0xB2 0x00B2 #SUPERSCRIPT TWO 0xB3 0x00B3 #SUPERSCRIPT THREE 0xB4 0x0384 #GREEK TONOS 0xB5 0x00B5 #MICRO SIGN 0xB6 0x00B6 #PILCROW SIGN 0xB7 0x00B7 #MIDDLE DOT 0xB8 0x0388 #GREEK CAPITAL LETTER EPSILON WITH TONOS 0xB9 0x0389 #GREEK CAPITAL LETTER ETA WITH TONOS 0xBA 0x038A #GREEK CAPITAL LETTER IOTA WITH TONOS 0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0xBC 0x038C #GREEK CAPITAL LETTER OMICRON WITH TONOS 0xBD 0x00BD #VULGAR FRACTION ONE HALF 0xBE 0x038E #GREEK CAPITAL LETTER UPSILON WITH TONOS 0xBF 0x038F #GREEK CAPITAL LETTER OMEGA WITH TONOS 0xC0 0x0390 #GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS 0xC1 0x0391 #GREEK CAPITAL LETTER ALPHA 0xC2 0x0392 #GREEK CAPITAL LETTER BETA 0xC3 0x0393 #GREEK CAPITAL LETTER GAMMA 0xC4 0x0394 #GREEK CAPITAL LETTER DELTA 0xC5 0x0395 #GREEK CAPITAL LETTER EPSILON 0xC6 0x0396 #GREEK CAPITAL LETTER ZETA 0xC7 0x0397 #GREEK CAPITAL LETTER ETA 0xC8 0x0398 #GREEK CAPITAL LETTER THETA 0xC9 0x0399 #GREEK CAPITAL LETTER IOTA 0xCA 0x039A #GREEK CAPITAL LETTER KAPPA 0xCB 0x039B #GREEK CAPITAL LETTER LAMDA 0xCC 0x039C #GREEK CAPITAL LETTER MU 0xCD 0x039D #GREEK CAPITAL LETTER NU 0xCE 0x039E #GREEK CAPITAL LETTER XI 0xCF 0x039F #GREEK CAPITAL LETTER OMICRON 0xD0 0x03A0 #GREEK CAPITAL LETTER PI 0xD1 0x03A1 #GREEK CAPITAL LETTER RHO 0xD2 #UNDEFINED 0xD3 0x03A3 #GREEK CAPITAL LETTER SIGMA 0xD4 0x03A4 #GREEK CAPITAL LETTER TAU 0xD5 0x03A5 #GREEK CAPITAL LETTER UPSILON 0xD6 0x03A6 #GREEK CAPITAL LETTER PHI 0xD7 0x03A7 #GREEK CAPITAL LETTER CHI 0xD8 0x03A8 #GREEK CAPITAL LETTER PSI 0xD9 0x03A9 #GREEK CAPITAL LETTER OMEGA 0xDA 0x03AA #GREEK CAPITAL LETTER IOTA WITH DIALYTIKA 0xDB 0x03AB #GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA 0xDC 0x03AC #GREEK SMALL LETTER ALPHA WITH TONOS 0xDD 0x03AD #GREEK SMALL LETTER EPSILON WITH TONOS 0xDE 0x03AE #GREEK SMALL LETTER ETA WITH TONOS 0xDF 0x03AF #GREEK SMALL LETTER IOTA WITH TONOS 0xE0 0x03B0 #GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS 0xE1 0x03B1 #GREEK SMALL LETTER ALPHA 0xE2 0x03B2 #GREEK SMALL LETTER BETA 0xE3 0x03B3 #GREEK SMALL LETTER GAMMA 0xE4 0x03B4 #GREEK SMALL LETTER DELTA 0xE5 0x03B5 #GREEK SMALL LETTER EPSILON 0xE6 0x03B6 #GREEK SMALL LETTER ZETA 0xE7 0x03B7 #GREEK SMALL LETTER ETA 0xE8 0x03B8 #GREEK SMALL LETTER THETA 0xE9 0x03B9 #GREEK SMALL LETTER IOTA 0xEA 0x03BA #GREEK SMALL LETTER KAPPA 0xEB 0x03BB #GREEK SMALL LETTER LAMDA 0xEC 0x03BC #GREEK SMALL LETTER MU 0xED 0x03BD #GREEK SMALL LETTER NU 0xEE 0x03BE #GREEK SMALL LETTER XI 0xEF 0x03BF #GREEK SMALL LETTER OMICRON 0xF0 0x03C0 #GREEK SMALL LETTER PI 0xF1 0x03C1 #GREEK SMALL LETTER RHO 0xF2 0x03C2 #GREEK SMALL LETTER FINAL SIGMA 0xF3 0x03C3 #GREEK SMALL LETTER SIGMA 0xF4 0x03C4 #GREEK SMALL LETTER TAU 0xF5 0x03C5 #GREEK SMALL LETTER UPSILON 0xF6 0x03C6 #GREEK SMALL LETTER PHI 0xF7 0x03C7 #GREEK SMALL LETTER CHI 0xF8 0x03C8 #GREEK SMALL LETTER PSI 0xF9 0x03C9 #GREEK SMALL LETTER OMEGA 0xFA 0x03CA #GREEK SMALL LETTER IOTA WITH DIALYTIKA 0xFB 0x03CB #GREEK SMALL LETTER UPSILON WITH DIALYTIKA 0xFC 0x03CC #GREEK SMALL LETTER OMICRON WITH TONOS 0xFD 0x03CD #GREEK SMALL LETTER UPSILON WITH TONOS 0xFE 0x03CE #GREEK SMALL LETTER OMEGA WITH TONOS 0xFF #UNDEFINED therion/thchencdata/ASCII.TXT0000664000175000017500000001565110003744400014745 0ustar useruser# # Name: 7bit ASCII to Unicode # Unicode version: 3.0 # Table version: 1.0 # Table format: Format A # Date: 2002 May 19 # Authors: Stacho Mudrak # 0x00 0x0000 # NULL 0x01 0x0001 # START OF HEADING 0x02 0x0002 # START OF TEXT 0x03 0x0003 # END OF TEXT 0x04 0x0004 # END OF TRANSMISSION 0x05 0x0005 # ENQUIRY 0x06 0x0006 # ACKNOWLEDGE 0x07 0x0007 # BELL 0x08 0x0008 # BACKSPACE 0x09 0x0009 # HORIZONTAL TABULATION 0x0A 0x000A # LINE FEED 0x0B 0x000B # VERTICAL TABULATION 0x0C 0x000C # FORM FEED 0x0D 0x000D # CARRIAGE RETURN 0x0E 0x000E # SHIFT OUT 0x0F 0x000F # SHIFT IN 0x10 0x0010 # DATA LINK ESCAPE 0x11 0x0011 # DEVICE CONTROL ONE 0x12 0x0012 # DEVICE CONTROL TWO 0x13 0x0013 # DEVICE CONTROL THREE 0x14 0x0014 # DEVICE CONTROL FOUR 0x15 0x0015 # NEGATIVE ACKNOWLEDGE 0x16 0x0016 # SYNCHRONOUS IDLE 0x17 0x0017 # END OF TRANSMISSION BLOCK 0x18 0x0018 # CANCEL 0x19 0x0019 # END OF MEDIUM 0x1A 0x001A # SUBSTITUTE 0x1B 0x001B # ESCAPE 0x1C 0x001C # FILE SEPARATOR 0x1D 0x001D # GROUP SEPARATOR 0x1E 0x001E # RECORD SEPARATOR 0x1F 0x001F # UNIT SEPARATOR 0x20 0x0020 # SPACE 0x21 0x0021 # EXCLAMATION MARK 0x22 0x0022 # QUOTATION MARK 0x23 0x0023 # NUMBER SIGN 0x24 0x0024 # DOLLAR SIGN 0x25 0x0025 # PERCENT SIGN 0x26 0x0026 # AMPERSAND 0x27 0x0027 # APOSTROPHE 0x28 0x0028 # LEFT PARENTHESIS 0x29 0x0029 # RIGHT PARENTHESIS 0x2A 0x002A # ASTERISK 0x2B 0x002B # PLUS SIGN 0x2C 0x002C # COMMA 0x2D 0x002D # HYPHEN-MINUS 0x2E 0x002E # FULL STOP 0x2F 0x002F # SOLIDUS 0x30 0x0030 # DIGIT ZERO 0x31 0x0031 # DIGIT ONE 0x32 0x0032 # DIGIT TWO 0x33 0x0033 # DIGIT THREE 0x34 0x0034 # DIGIT FOUR 0x35 0x0035 # DIGIT FIVE 0x36 0x0036 # DIGIT SIX 0x37 0x0037 # DIGIT SEVEN 0x38 0x0038 # DIGIT EIGHT 0x39 0x0039 # DIGIT NINE 0x3A 0x003A # COLON 0x3B 0x003B # SEMICOLON 0x3C 0x003C # LESS-THAN SIGN 0x3D 0x003D # EQUALS SIGN 0x3E 0x003E # GREATER-THAN SIGN 0x3F 0x003F # QUESTION MARK 0x40 0x0040 # COMMERCIAL AT 0x41 0x0041 # LATIN CAPITAL LETTER A 0x42 0x0042 # LATIN CAPITAL LETTER B 0x43 0x0043 # LATIN CAPITAL LETTER C 0x44 0x0044 # LATIN CAPITAL LETTER D 0x45 0x0045 # LATIN CAPITAL LETTER E 0x46 0x0046 # LATIN CAPITAL LETTER F 0x47 0x0047 # LATIN CAPITAL LETTER G 0x48 0x0048 # LATIN CAPITAL LETTER H 0x49 0x0049 # LATIN CAPITAL LETTER I 0x4A 0x004A # LATIN CAPITAL LETTER J 0x4B 0x004B # LATIN CAPITAL LETTER K 0x4C 0x004C # LATIN CAPITAL LETTER L 0x4D 0x004D # LATIN CAPITAL LETTER M 0x4E 0x004E # LATIN CAPITAL LETTER N 0x4F 0x004F # LATIN CAPITAL LETTER O 0x50 0x0050 # LATIN CAPITAL LETTER P 0x51 0x0051 # LATIN CAPITAL LETTER Q 0x52 0x0052 # LATIN CAPITAL LETTER R 0x53 0x0053 # LATIN CAPITAL LETTER S 0x54 0x0054 # LATIN CAPITAL LETTER T 0x55 0x0055 # LATIN CAPITAL LETTER U 0x56 0x0056 # LATIN CAPITAL LETTER V 0x57 0x0057 # LATIN CAPITAL LETTER W 0x58 0x0058 # LATIN CAPITAL LETTER X 0x59 0x0059 # LATIN CAPITAL LETTER Y 0x5A 0x005A # LATIN CAPITAL LETTER Z 0x5B 0x005B # LEFT SQUARE BRACKET 0x5C 0x005C # REVERSE SOLIDUS 0x5D 0x005D # RIGHT SQUARE BRACKET 0x5E 0x005E # CIRCUMFLEX ACCENT 0x5F 0x005F # LOW LINE 0x60 0x0060 # GRAVE ACCENT 0x61 0x0061 # LATIN SMALL LETTER A 0x62 0x0062 # LATIN SMALL LETTER B 0x63 0x0063 # LATIN SMALL LETTER C 0x64 0x0064 # LATIN SMALL LETTER D 0x65 0x0065 # LATIN SMALL LETTER E 0x66 0x0066 # LATIN SMALL LETTER F 0x67 0x0067 # LATIN SMALL LETTER G 0x68 0x0068 # LATIN SMALL LETTER H 0x69 0x0069 # LATIN SMALL LETTER I 0x6A 0x006A # LATIN SMALL LETTER J 0x6B 0x006B # LATIN SMALL LETTER K 0x6C 0x006C # LATIN SMALL LETTER L 0x6D 0x006D # LATIN SMALL LETTER M 0x6E 0x006E # LATIN SMALL LETTER N 0x6F 0x006F # LATIN SMALL LETTER O 0x70 0x0070 # LATIN SMALL LETTER P 0x71 0x0071 # LATIN SMALL LETTER Q 0x72 0x0072 # LATIN SMALL LETTER R 0x73 0x0073 # LATIN SMALL LETTER S 0x74 0x0074 # LATIN SMALL LETTER T 0x75 0x0075 # LATIN SMALL LETTER U 0x76 0x0076 # LATIN SMALL LETTER V 0x77 0x0077 # LATIN SMALL LETTER W 0x78 0x0078 # LATIN SMALL LETTER X 0x79 0x0079 # LATIN SMALL LETTER Y 0x7A 0x007A # LATIN SMALL LETTER Z 0x7B 0x007B # LEFT CURLY BRACKET 0x7C 0x007C # VERTICAL LINE 0x7D 0x007D # RIGHT CURLY BRACKET 0x7E 0x007E # TILDE 0x7F 0x007F # DELETE 0x80 #UNDEFINED 0x81 #UNDEFINED 0x82 #UNDEFINED 0x83 #UNDEFINED 0x84 #UNDEFINED 0x85 #UNDEFINED 0x86 #UNDEFINED 0x87 #UNDEFINED 0x88 #UNDEFINED 0x89 #UNDEFINED 0x8A #UNDEFINED 0x8B #UNDEFINED 0x8C #UNDEFINED 0x8D #UNDEFINED 0x8E #UNDEFINED 0x8F #UNDEFINED 0x90 #UNDEFINED 0x91 #UNDEFINED 0x92 #UNDEFINED 0x93 #UNDEFINED 0x94 #UNDEFINED 0x95 #UNDEFINED 0x96 #UNDEFINED 0x97 #UNDEFINED 0x98 #UNDEFINED 0x99 #UNDEFINED 0x9A #UNDEFINED 0x9B #UNDEFINED 0x9C #UNDEFINED 0x9D #UNDEFINED 0x9E #UNDEFINED 0x9F #UNDEFINED 0xA0 #UNDEFINED 0xA1 #UNDEFINED 0xA2 #UNDEFINED 0xA3 #UNDEFINED 0xA4 #UNDEFINED 0xA5 #UNDEFINED 0xA6 #UNDEFINED 0xA7 #UNDEFINED 0xA8 #UNDEFINED 0xA9 #UNDEFINED 0xAA #UNDEFINED 0xAB #UNDEFINED 0xAC #UNDEFINED 0xAD #UNDEFINED 0xAE #UNDEFINED 0xAF #UNDEFINED 0xB0 #UNDEFINED 0xB1 #UNDEFINED 0xB2 #UNDEFINED 0xB3 #UNDEFINED 0xB4 #UNDEFINED 0xB5 #UNDEFINED 0xB6 #UNDEFINED 0xB7 #UNDEFINED 0xB8 #UNDEFINED 0xB9 #UNDEFINED 0xBA #UNDEFINED 0xBB #UNDEFINED 0xBC #UNDEFINED 0xBD #UNDEFINED 0xBE #UNDEFINED 0xBF #UNDEFINED 0xC0 #UNDEFINED 0xC1 #UNDEFINED 0xC2 #UNDEFINED 0xC3 #UNDEFINED 0xC4 #UNDEFINED 0xC5 #UNDEFINED 0xC6 #UNDEFINED 0xC7 #UNDEFINED 0xC8 #UNDEFINED 0xC9 #UNDEFINED 0xCA #UNDEFINED 0xCB #UNDEFINED 0xCC #UNDEFINED 0xCD #UNDEFINED 0xCE #UNDEFINED 0xCF #UNDEFINED 0xD0 #UNDEFINED 0xD1 #UNDEFINED 0xD2 #UNDEFINED 0xD3 #UNDEFINED 0xD4 #UNDEFINED 0xD5 #UNDEFINED 0xD6 #UNDEFINED 0xD7 #UNDEFINED 0xD8 #UNDEFINED 0xD9 #UNDEFINED 0xDA #UNDEFINED 0xDB #UNDEFINED 0xDC #UNDEFINED 0xDD #UNDEFINED 0xDE #UNDEFINED 0xDF #UNDEFINED 0xE0 #UNDEFINED 0xE1 #UNDEFINED 0xE2 #UNDEFINED 0xE3 #UNDEFINED 0xE4 #UNDEFINED 0xE5 #UNDEFINED 0xE6 #UNDEFINED 0xE7 #UNDEFINED 0xE8 #UNDEFINED 0xE9 #UNDEFINED 0xEA #UNDEFINED 0xEB #UNDEFINED 0xEC #UNDEFINED 0xED #UNDEFINED 0xEE #UNDEFINED 0xEF #UNDEFINED 0xF0 #UNDEFINED 0xF1 #UNDEFINED 0xF2 #UNDEFINED 0xF3 #UNDEFINED 0xF4 #UNDEFINED 0xF5 #UNDEFINED 0xF6 #UNDEFINED 0xF7 #UNDEFINED 0xF8 #UNDEFINED 0xF9 #UNDEFINED 0xFA #UNDEFINED 0xFB #UNDEFINED 0xFC #UNDEFINED 0xFD #UNDEFINED 0xFE #UNDEFINED 0xFF #UNDEFINED therion/thchencdata/CP1252.TXT0000664000175000017500000002220610720724602014733 0ustar useruser# # Name: cp1252 to Unicode table # Unicode version: 2.0 # Table version: 2.00 # Table format: Format A # Date: 04/15/98 # # Contact: cpxlate@microsoft.com # # General notes: none # # Format: Three tab-separated columns # Column #1 is the cp1252 code (in hex) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 is the Unicode name (follows a comment sign, '#') # # The entries are in cp1252 order # 0x00 0x0000 #NULL 0x01 0x0001 #START OF HEADING 0x02 0x0002 #START OF TEXT 0x03 0x0003 #END OF TEXT 0x04 0x0004 #END OF TRANSMISSION 0x05 0x0005 #ENQUIRY 0x06 0x0006 #ACKNOWLEDGE 0x07 0x0007 #BELL 0x08 0x0008 #BACKSPACE 0x09 0x0009 #HORIZONTAL TABULATION 0x0A 0x000A #LINE FEED 0x0B 0x000B #VERTICAL TABULATION 0x0C 0x000C #FORM FEED 0x0D 0x000D #CARRIAGE RETURN 0x0E 0x000E #SHIFT OUT 0x0F 0x000F #SHIFT IN 0x10 0x0010 #DATA LINK ESCAPE 0x11 0x0011 #DEVICE CONTROL ONE 0x12 0x0012 #DEVICE CONTROL TWO 0x13 0x0013 #DEVICE CONTROL THREE 0x14 0x0014 #DEVICE CONTROL FOUR 0x15 0x0015 #NEGATIVE ACKNOWLEDGE 0x16 0x0016 #SYNCHRONOUS IDLE 0x17 0x0017 #END OF TRANSMISSION BLOCK 0x18 0x0018 #CANCEL 0x19 0x0019 #END OF MEDIUM 0x1A 0x001A #SUBSTITUTE 0x1B 0x001B #ESCAPE 0x1C 0x001C #FILE SEPARATOR 0x1D 0x001D #GROUP SEPARATOR 0x1E 0x001E #RECORD SEPARATOR 0x1F 0x001F #UNIT SEPARATOR 0x20 0x0020 #SPACE 0x21 0x0021 #EXCLAMATION MARK 0x22 0x0022 #QUOTATION MARK 0x23 0x0023 #NUMBER SIGN 0x24 0x0024 #DOLLAR SIGN 0x25 0x0025 #PERCENT SIGN 0x26 0x0026 #AMPERSAND 0x27 0x0027 #APOSTROPHE 0x28 0x0028 #LEFT PARENTHESIS 0x29 0x0029 #RIGHT PARENTHESIS 0x2A 0x002A #ASTERISK 0x2B 0x002B #PLUS SIGN 0x2C 0x002C #COMMA 0x2D 0x002D #HYPHEN-MINUS 0x2E 0x002E #FULL STOP 0x2F 0x002F #SOLIDUS 0x30 0x0030 #DIGIT ZERO 0x31 0x0031 #DIGIT ONE 0x32 0x0032 #DIGIT TWO 0x33 0x0033 #DIGIT THREE 0x34 0x0034 #DIGIT FOUR 0x35 0x0035 #DIGIT FIVE 0x36 0x0036 #DIGIT SIX 0x37 0x0037 #DIGIT SEVEN 0x38 0x0038 #DIGIT EIGHT 0x39 0x0039 #DIGIT NINE 0x3A 0x003A #COLON 0x3B 0x003B #SEMICOLON 0x3C 0x003C #LESS-THAN SIGN 0x3D 0x003D #EQUALS SIGN 0x3E 0x003E #GREATER-THAN SIGN 0x3F 0x003F #QUESTION MARK 0x40 0x0040 #COMMERCIAL AT 0x41 0x0041 #LATIN CAPITAL LETTER A 0x42 0x0042 #LATIN CAPITAL LETTER B 0x43 0x0043 #LATIN CAPITAL LETTER C 0x44 0x0044 #LATIN CAPITAL LETTER D 0x45 0x0045 #LATIN CAPITAL LETTER E 0x46 0x0046 #LATIN CAPITAL LETTER F 0x47 0x0047 #LATIN CAPITAL LETTER G 0x48 0x0048 #LATIN CAPITAL LETTER H 0x49 0x0049 #LATIN CAPITAL LETTER I 0x4A 0x004A #LATIN CAPITAL LETTER J 0x4B 0x004B #LATIN CAPITAL LETTER K 0x4C 0x004C #LATIN CAPITAL LETTER L 0x4D 0x004D #LATIN CAPITAL LETTER M 0x4E 0x004E #LATIN CAPITAL LETTER N 0x4F 0x004F #LATIN CAPITAL LETTER O 0x50 0x0050 #LATIN CAPITAL LETTER P 0x51 0x0051 #LATIN CAPITAL LETTER Q 0x52 0x0052 #LATIN CAPITAL LETTER R 0x53 0x0053 #LATIN CAPITAL LETTER S 0x54 0x0054 #LATIN CAPITAL LETTER T 0x55 0x0055 #LATIN CAPITAL LETTER U 0x56 0x0056 #LATIN CAPITAL LETTER V 0x57 0x0057 #LATIN CAPITAL LETTER W 0x58 0x0058 #LATIN CAPITAL LETTER X 0x59 0x0059 #LATIN CAPITAL LETTER Y 0x5A 0x005A #LATIN CAPITAL LETTER Z 0x5B 0x005B #LEFT SQUARE BRACKET 0x5C 0x005C #REVERSE SOLIDUS 0x5D 0x005D #RIGHT SQUARE BRACKET 0x5E 0x005E #CIRCUMFLEX ACCENT 0x5F 0x005F #LOW LINE 0x60 0x0060 #GRAVE ACCENT 0x61 0x0061 #LATIN SMALL LETTER A 0x62 0x0062 #LATIN SMALL LETTER B 0x63 0x0063 #LATIN SMALL LETTER C 0x64 0x0064 #LATIN SMALL LETTER D 0x65 0x0065 #LATIN SMALL LETTER E 0x66 0x0066 #LATIN SMALL LETTER F 0x67 0x0067 #LATIN SMALL LETTER G 0x68 0x0068 #LATIN SMALL LETTER H 0x69 0x0069 #LATIN SMALL LETTER I 0x6A 0x006A #LATIN SMALL LETTER J 0x6B 0x006B #LATIN SMALL LETTER K 0x6C 0x006C #LATIN SMALL LETTER L 0x6D 0x006D #LATIN SMALL LETTER M 0x6E 0x006E #LATIN SMALL LETTER N 0x6F 0x006F #LATIN SMALL LETTER O 0x70 0x0070 #LATIN SMALL LETTER P 0x71 0x0071 #LATIN SMALL LETTER Q 0x72 0x0072 #LATIN SMALL LETTER R 0x73 0x0073 #LATIN SMALL LETTER S 0x74 0x0074 #LATIN SMALL LETTER T 0x75 0x0075 #LATIN SMALL LETTER U 0x76 0x0076 #LATIN SMALL LETTER V 0x77 0x0077 #LATIN SMALL LETTER W 0x78 0x0078 #LATIN SMALL LETTER X 0x79 0x0079 #LATIN SMALL LETTER Y 0x7A 0x007A #LATIN SMALL LETTER Z 0x7B 0x007B #LEFT CURLY BRACKET 0x7C 0x007C #VERTICAL LINE 0x7D 0x007D #RIGHT CURLY BRACKET 0x7E 0x007E #TILDE 0x7F 0x007F #DELETE 0x80 0x20AC #EURO SIGN 0x81 #UNDEFINED 0x82 0x201A #SINGLE LOW-9 QUOTATION MARK 0x83 0x0192 #LATIN SMALL LETTER F WITH HOOK 0x84 0x201E #DOUBLE LOW-9 QUOTATION MARK 0x85 0x2026 #HORIZONTAL ELLIPSIS 0x86 0x2020 #DAGGER 0x87 0x2021 #DOUBLE DAGGER 0x88 0x02C6 #MODIFIER LETTER CIRCUMFLEX ACCENT 0x89 0x2030 #PER MILLE SIGN 0x8A 0x0160 #LATIN CAPITAL LETTER S WITH CARON 0x8B 0x2039 #SINGLE LEFT-POINTING ANGLE QUOTATION MARK 0x8C 0x0152 #LATIN CAPITAL LIGATURE OE 0x8D #UNDEFINED 0x8E 0x017D #LATIN CAPITAL LETTER Z WITH CARON 0x8F #UNDEFINED 0x90 #UNDEFINED 0x91 0x2018 #LEFT SINGLE QUOTATION MARK 0x92 0x2019 #RIGHT SINGLE QUOTATION MARK 0x93 0x201C #LEFT DOUBLE QUOTATION MARK 0x94 0x201D #RIGHT DOUBLE QUOTATION MARK 0x95 0x2022 #BULLET 0x96 0x2013 #EN DASH 0x97 0x2014 #EM DASH 0x98 0x02DC #SMALL TILDE 0x99 0x2122 #TRADE MARK SIGN 0x9A 0x0161 #LATIN SMALL LETTER S WITH CARON 0x9B 0x203A #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK 0x9C 0x0153 #LATIN SMALL LIGATURE OE 0x9D #UNDEFINED 0x9E 0x017E #LATIN SMALL LETTER Z WITH CARON 0x9F 0x0178 #LATIN CAPITAL LETTER Y WITH DIAERESIS 0xA0 0x00A0 #NO-BREAK SPACE 0xA1 0x00A1 #INVERTED EXCLAMATION MARK 0xA2 0x00A2 #CENT SIGN 0xA3 0x00A3 #POUND SIGN 0xA4 0x00A4 #CURRENCY SIGN 0xA5 0x00A5 #YEN SIGN 0xA6 0x00A6 #BROKEN BAR 0xA7 0x00A7 #SECTION SIGN 0xA8 0x00A8 #DIAERESIS 0xA9 0x00A9 #COPYRIGHT SIGN 0xAA 0x00AA #FEMININE ORDINAL INDICATOR 0xAB 0x00AB #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 0xAC 0x00AC #NOT SIGN 0xAD 0x00AD #SOFT HYPHEN 0xAE 0x00AE #REGISTERED SIGN 0xAF 0x00AF #MACRON 0xB0 0x00B0 #DEGREE SIGN 0xB1 0x00B1 #PLUS-MINUS SIGN 0xB2 0x00B2 #SUPERSCRIPT TWO 0xB3 0x00B3 #SUPERSCRIPT THREE 0xB4 0x00B4 #ACUTE ACCENT 0xB5 0x00B5 #MICRO SIGN 0xB6 0x00B6 #PILCROW SIGN 0xB7 0x00B7 #MIDDLE DOT 0xB8 0x00B8 #CEDILLA 0xB9 0x00B9 #SUPERSCRIPT ONE 0xBA 0x00BA #MASCULINE ORDINAL INDICATOR 0xBB 0x00BB #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0xBC 0x00BC #VULGAR FRACTION ONE QUARTER 0xBD 0x00BD #VULGAR FRACTION ONE HALF 0xBE 0x00BE #VULGAR FRACTION THREE QUARTERS 0xBF 0x00BF #INVERTED QUESTION MARK 0xC0 0x00C0 #LATIN CAPITAL LETTER A WITH GRAVE 0xC1 0x00C1 #LATIN CAPITAL LETTER A WITH ACUTE 0xC2 0x00C2 #LATIN CAPITAL LETTER A WITH CIRCUMFLEX 0xC3 0x00C3 #LATIN CAPITAL LETTER A WITH TILDE 0xC4 0x00C4 #LATIN CAPITAL LETTER A WITH DIAERESIS 0xC5 0x00C5 #LATIN CAPITAL LETTER A WITH RING ABOVE 0xC6 0x00C6 #LATIN CAPITAL LETTER AE 0xC7 0x00C7 #LATIN CAPITAL LETTER C WITH CEDILLA 0xC8 0x00C8 #LATIN CAPITAL LETTER E WITH GRAVE 0xC9 0x00C9 #LATIN CAPITAL LETTER E WITH ACUTE 0xCA 0x00CA #LATIN CAPITAL LETTER E WITH CIRCUMFLEX 0xCB 0x00CB #LATIN CAPITAL LETTER E WITH DIAERESIS 0xCC 0x00CC #LATIN CAPITAL LETTER I WITH GRAVE 0xCD 0x00CD #LATIN CAPITAL LETTER I WITH ACUTE 0xCE 0x00CE #LATIN CAPITAL LETTER I WITH CIRCUMFLEX 0xCF 0x00CF #LATIN CAPITAL LETTER I WITH DIAERESIS 0xD0 0x00D0 #LATIN CAPITAL LETTER ETH 0xD1 0x00D1 #LATIN CAPITAL LETTER N WITH TILDE 0xD2 0x00D2 #LATIN CAPITAL LETTER O WITH GRAVE 0xD3 0x00D3 #LATIN CAPITAL LETTER O WITH ACUTE 0xD4 0x00D4 #LATIN CAPITAL LETTER O WITH CIRCUMFLEX 0xD5 0x00D5 #LATIN CAPITAL LETTER O WITH TILDE 0xD6 0x00D6 #LATIN CAPITAL LETTER O WITH DIAERESIS 0xD7 0x00D7 #MULTIPLICATION SIGN 0xD8 0x00D8 #LATIN CAPITAL LETTER O WITH STROKE 0xD9 0x00D9 #LATIN CAPITAL LETTER U WITH GRAVE 0xDA 0x00DA #LATIN CAPITAL LETTER U WITH ACUTE 0xDB 0x00DB #LATIN CAPITAL LETTER U WITH CIRCUMFLEX 0xDC 0x00DC #LATIN CAPITAL LETTER U WITH DIAERESIS 0xDD 0x00DD #LATIN CAPITAL LETTER Y WITH ACUTE 0xDE 0x00DE #LATIN CAPITAL LETTER THORN 0xDF 0x00DF #LATIN SMALL LETTER SHARP S 0xE0 0x00E0 #LATIN SMALL LETTER A WITH GRAVE 0xE1 0x00E1 #LATIN SMALL LETTER A WITH ACUTE 0xE2 0x00E2 #LATIN SMALL LETTER A WITH CIRCUMFLEX 0xE3 0x00E3 #LATIN SMALL LETTER A WITH TILDE 0xE4 0x00E4 #LATIN SMALL LETTER A WITH DIAERESIS 0xE5 0x00E5 #LATIN SMALL LETTER A WITH RING ABOVE 0xE6 0x00E6 #LATIN SMALL LETTER AE 0xE7 0x00E7 #LATIN SMALL LETTER C WITH CEDILLA 0xE8 0x00E8 #LATIN SMALL LETTER E WITH GRAVE 0xE9 0x00E9 #LATIN SMALL LETTER E WITH ACUTE 0xEA 0x00EA #LATIN SMALL LETTER E WITH CIRCUMFLEX 0xEB 0x00EB #LATIN SMALL LETTER E WITH DIAERESIS 0xEC 0x00EC #LATIN SMALL LETTER I WITH GRAVE 0xED 0x00ED #LATIN SMALL LETTER I WITH ACUTE 0xEE 0x00EE #LATIN SMALL LETTER I WITH CIRCUMFLEX 0xEF 0x00EF #LATIN SMALL LETTER I WITH DIAERESIS 0xF0 0x00F0 #LATIN SMALL LETTER ETH 0xF1 0x00F1 #LATIN SMALL LETTER N WITH TILDE 0xF2 0x00F2 #LATIN SMALL LETTER O WITH GRAVE 0xF3 0x00F3 #LATIN SMALL LETTER O WITH ACUTE 0xF4 0x00F4 #LATIN SMALL LETTER O WITH CIRCUMFLEX 0xF5 0x00F5 #LATIN SMALL LETTER O WITH TILDE 0xF6 0x00F6 #LATIN SMALL LETTER O WITH DIAERESIS 0xF7 0x00F7 #DIVISION SIGN 0xF8 0x00F8 #LATIN SMALL LETTER O WITH STROKE 0xF9 0x00F9 #LATIN SMALL LETTER U WITH GRAVE 0xFA 0x00FA #LATIN SMALL LETTER U WITH ACUTE 0xFB 0x00FB #LATIN SMALL LETTER U WITH CIRCUMFLEX 0xFC 0x00FC #LATIN SMALL LETTER U WITH DIAERESIS 0xFD 0x00FD #LATIN SMALL LETTER Y WITH ACUTE 0xFE 0x00FE #LATIN SMALL LETTER THORN 0xFF 0x00FF #LATIN SMALL LETTER Y WITH DIAERESIS therion/thchencdata/8859-5.TXT0000664000175000017500000002427307246476600014717 0ustar useruser# # Name: ISO 8859-5:1999 to Unicode # Unicode version: 3.0 # Table version: 1.0 # Table format: Format A # Date: 1999 July 27 # Authors: Ken Whistler # # Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. # # This file is provided as-is by Unicode, Inc. (The Unicode Consortium). # No claims are made as to fitness for any particular purpose. No # warranties of any kind are expressed or implied. The recipient # agrees to determine applicability of information provided. If this # file has been provided on optical media by Unicode, Inc., the sole # remedy for any claim will be exchange of defective media within 90 # days of receipt. # # Unicode, Inc. hereby grants the right to freely use the information # supplied in this file in the creation of products supporting the # Unicode Standard, and to make copies of this file in any form for # internal or external distribution as long as this notice remains # attached. # # General notes: # # This table contains the data the Unicode Consortium has on how # ISO/IEC 8859-5:1999 characters map into Unicode. # # Format: Three tab-separated columns # Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX) # Column #2 is the Unicode (in hex as 0xXXXX) # Column #3 the Unicode name (follows a comment sign, '#') # # The entries are in ISO/IEC 8859-5 order. # # Version history # 1.0 version updates 0.1 version by adding mappings for all # control characters. # # Updated versions of this file may be found in: # # # Any comments or problems, contact # Please note that is an archival address; # notices will be checked, but do not expect an immediate response. # 0x00 0x0000 # NULL 0x01 0x0001 # START OF HEADING 0x02 0x0002 # START OF TEXT 0x03 0x0003 # END OF TEXT 0x04 0x0004 # END OF TRANSMISSION 0x05 0x0005 # ENQUIRY 0x06 0x0006 # ACKNOWLEDGE 0x07 0x0007 # BELL 0x08 0x0008 # BACKSPACE 0x09 0x0009 # HORIZONTAL TABULATION 0x0A 0x000A # LINE FEED 0x0B 0x000B # VERTICAL TABULATION 0x0C 0x000C # FORM FEED 0x0D 0x000D # CARRIAGE RETURN 0x0E 0x000E # SHIFT OUT 0x0F 0x000F # SHIFT IN 0x10 0x0010 # DATA LINK ESCAPE 0x11 0x0011 # DEVICE CONTROL ONE 0x12 0x0012 # DEVICE CONTROL TWO 0x13 0x0013 # DEVICE CONTROL THREE 0x14 0x0014 # DEVICE CONTROL FOUR 0x15 0x0015 # NEGATIVE ACKNOWLEDGE 0x16 0x0016 # SYNCHRONOUS IDLE 0x17 0x0017 # END OF TRANSMISSION BLOCK 0x18 0x0018 # CANCEL 0x19 0x0019 # END OF MEDIUM 0x1A 0x001A # SUBSTITUTE 0x1B 0x001B # ESCAPE 0x1C 0x001C # FILE SEPARATOR 0x1D 0x001D # GROUP SEPARATOR 0x1E 0x001E # RECORD SEPARATOR 0x1F 0x001F # UNIT SEPARATOR 0x20 0x0020 # SPACE 0x21 0x0021 # EXCLAMATION MARK 0x22 0x0022 # QUOTATION MARK 0x23 0x0023 # NUMBER SIGN 0x24 0x0024 # DOLLAR SIGN 0x25 0x0025 # PERCENT SIGN 0x26 0x0026 # AMPERSAND 0x27 0x0027 # APOSTROPHE 0x28 0x0028 # LEFT PARENTHESIS 0x29 0x0029 # RIGHT PARENTHESIS 0x2A 0x002A # ASTERISK 0x2B 0x002B # PLUS SIGN 0x2C 0x002C # COMMA 0x2D 0x002D # HYPHEN-MINUS 0x2E 0x002E # FULL STOP 0x2F 0x002F # SOLIDUS 0x30 0x0030 # DIGIT ZERO 0x31 0x0031 # DIGIT ONE 0x32 0x0032 # DIGIT TWO 0x33 0x0033 # DIGIT THREE 0x34 0x0034 # DIGIT FOUR 0x35 0x0035 # DIGIT FIVE 0x36 0x0036 # DIGIT SIX 0x37 0x0037 # DIGIT SEVEN 0x38 0x0038 # DIGIT EIGHT 0x39 0x0039 # DIGIT NINE 0x3A 0x003A # COLON 0x3B 0x003B # SEMICOLON 0x3C 0x003C # LESS-THAN SIGN 0x3D 0x003D # EQUALS SIGN 0x3E 0x003E # GREATER-THAN SIGN 0x3F 0x003F # QUESTION MARK 0x40 0x0040 # COMMERCIAL AT 0x41 0x0041 # LATIN CAPITAL LETTER A 0x42 0x0042 # LATIN CAPITAL LETTER B 0x43 0x0043 # LATIN CAPITAL LETTER C 0x44 0x0044 # LATIN CAPITAL LETTER D 0x45 0x0045 # LATIN CAPITAL LETTER E 0x46 0x0046 # LATIN CAPITAL LETTER F 0x47 0x0047 # LATIN CAPITAL LETTER G 0x48 0x0048 # LATIN CAPITAL LETTER H 0x49 0x0049 # LATIN CAPITAL LETTER I 0x4A 0x004A # LATIN CAPITAL LETTER J 0x4B 0x004B # LATIN CAPITAL LETTER K 0x4C 0x004C # LATIN CAPITAL LETTER L 0x4D 0x004D # LATIN CAPITAL LETTER M 0x4E 0x004E # LATIN CAPITAL LETTER N 0x4F 0x004F # LATIN CAPITAL LETTER O 0x50 0x0050 # LATIN CAPITAL LETTER P 0x51 0x0051 # LATIN CAPITAL LETTER Q 0x52 0x0052 # LATIN CAPITAL LETTER R 0x53 0x0053 # LATIN CAPITAL LETTER S 0x54 0x0054 # LATIN CAPITAL LETTER T 0x55 0x0055 # LATIN CAPITAL LETTER U 0x56 0x0056 # LATIN CAPITAL LETTER V 0x57 0x0057 # LATIN CAPITAL LETTER W 0x58 0x0058 # LATIN CAPITAL LETTER X 0x59 0x0059 # LATIN CAPITAL LETTER Y 0x5A 0x005A # LATIN CAPITAL LETTER Z 0x5B 0x005B # LEFT SQUARE BRACKET 0x5C 0x005C # REVERSE SOLIDUS 0x5D 0x005D # RIGHT SQUARE BRACKET 0x5E 0x005E # CIRCUMFLEX ACCENT 0x5F 0x005F # LOW LINE 0x60 0x0060 # GRAVE ACCENT 0x61 0x0061 # LATIN SMALL LETTER A 0x62 0x0062 # LATIN SMALL LETTER B 0x63 0x0063 # LATIN SMALL LETTER C 0x64 0x0064 # LATIN SMALL LETTER D 0x65 0x0065 # LATIN SMALL LETTER E 0x66 0x0066 # LATIN SMALL LETTER F 0x67 0x0067 # LATIN SMALL LETTER G 0x68 0x0068 # LATIN SMALL LETTER H 0x69 0x0069 # LATIN SMALL LETTER I 0x6A 0x006A # LATIN SMALL LETTER J 0x6B 0x006B # LATIN SMALL LETTER K 0x6C 0x006C # LATIN SMALL LETTER L 0x6D 0x006D # LATIN SMALL LETTER M 0x6E 0x006E # LATIN SMALL LETTER N 0x6F 0x006F # LATIN SMALL LETTER O 0x70 0x0070 # LATIN SMALL LETTER P 0x71 0x0071 # LATIN SMALL LETTER Q 0x72 0x0072 # LATIN SMALL LETTER R 0x73 0x0073 # LATIN SMALL LETTER S 0x74 0x0074 # LATIN SMALL LETTER T 0x75 0x0075 # LATIN SMALL LETTER U 0x76 0x0076 # LATIN SMALL LETTER V 0x77 0x0077 # LATIN SMALL LETTER W 0x78 0x0078 # LATIN SMALL LETTER X 0x79 0x0079 # LATIN SMALL LETTER Y 0x7A 0x007A # LATIN SMALL LETTER Z 0x7B 0x007B # LEFT CURLY BRACKET 0x7C 0x007C # VERTICAL LINE 0x7D 0x007D # RIGHT CURLY BRACKET 0x7E 0x007E # TILDE 0x7F 0x007F # DELETE 0x80 0x0080 # 0x81 0x0081 # 0x82 0x0082 # 0x83 0x0083 # 0x84 0x0084 # 0x85 0x0085 # 0x86 0x0086 # 0x87 0x0087 # 0x88 0x0088 # 0x89 0x0089 # 0x8A 0x008A # 0x8B 0x008B # 0x8C 0x008C # 0x8D 0x008D # 0x8E 0x008E # 0x8F 0x008F # 0x90 0x0090 # 0x91 0x0091 # 0x92 0x0092 # 0x93 0x0093 # 0x94 0x0094 # 0x95 0x0095 # 0x96 0x0096 # 0x97 0x0097 # 0x98 0x0098 # 0x99 0x0099 # 0x9A 0x009A # 0x9B 0x009B # 0x9C 0x009C # 0x9D 0x009D # 0x9E 0x009E # 0x9F 0x009F # 0xA0 0x00A0 # NO-BREAK SPACE 0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO 0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE 0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE 0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE 0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE 0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I 0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI 0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE 0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE 0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE 0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE 0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE 0xAD 0x00AD # SOFT HYPHEN 0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U 0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE 0xB0 0x0410 # CYRILLIC CAPITAL LETTER A 0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE 0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE 0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE 0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE 0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE 0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE 0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE 0xB8 0x0418 # CYRILLIC CAPITAL LETTER I 0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I 0xBA 0x041A # CYRILLIC CAPITAL LETTER KA 0xBB 0x041B # CYRILLIC CAPITAL LETTER EL 0xBC 0x041C # CYRILLIC CAPITAL LETTER EM 0xBD 0x041D # CYRILLIC CAPITAL LETTER EN 0xBE 0x041E # CYRILLIC CAPITAL LETTER O 0xBF 0x041F # CYRILLIC CAPITAL LETTER PE 0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER 0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES 0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE 0xC3 0x0423 # CYRILLIC CAPITAL LETTER U 0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF 0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA 0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE 0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE 0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA 0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA 0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN 0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU 0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN 0xCD 0x042D # CYRILLIC CAPITAL LETTER E 0xCE 0x042E # CYRILLIC CAPITAL LETTER YU 0xCF 0x042F # CYRILLIC CAPITAL LETTER YA 0xD0 0x0430 # CYRILLIC SMALL LETTER A 0xD1 0x0431 # CYRILLIC SMALL LETTER BE 0xD2 0x0432 # CYRILLIC SMALL LETTER VE 0xD3 0x0433 # CYRILLIC SMALL LETTER GHE 0xD4 0x0434 # CYRILLIC SMALL LETTER DE 0xD5 0x0435 # CYRILLIC SMALL LETTER IE 0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE 0xD7 0x0437 # CYRILLIC SMALL LETTER ZE 0xD8 0x0438 # CYRILLIC SMALL LETTER I 0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I 0xDA 0x043A # CYRILLIC SMALL LETTER KA 0xDB 0x043B # CYRILLIC SMALL LETTER EL 0xDC 0x043C # CYRILLIC SMALL LETTER EM 0xDD 0x043D # CYRILLIC SMALL LETTER EN 0xDE 0x043E # CYRILLIC SMALL LETTER O 0xDF 0x043F # CYRILLIC SMALL LETTER PE 0xE0 0x0440 # CYRILLIC SMALL LETTER ER 0xE1 0x0441 # CYRILLIC SMALL LETTER ES 0xE2 0x0442 # CYRILLIC SMALL LETTER TE 0xE3 0x0443 # CYRILLIC SMALL LETTER U 0xE4 0x0444 # CYRILLIC SMALL LETTER EF 0xE5 0x0445 # CYRILLIC SMALL LETTER HA 0xE6 0x0446 # CYRILLIC SMALL LETTER TSE 0xE7 0x0447 # CYRILLIC SMALL LETTER CHE 0xE8 0x0448 # CYRILLIC SMALL LETTER SHA 0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA 0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN 0xEB 0x044B # CYRILLIC SMALL LETTER YERU 0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN 0xED 0x044D # CYRILLIC SMALL LETTER E 0xEE 0x044E # CYRILLIC SMALL LETTER YU 0xEF 0x044F # CYRILLIC SMALL LETTER YA 0xF0 0x2116 # NUMERO SIGN 0xF1 0x0451 # CYRILLIC SMALL LETTER IO 0xF2 0x0452 # CYRILLIC SMALL LETTER DJE 0xF3 0x0453 # CYRILLIC SMALL LETTER GJE 0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE 0xF5 0x0455 # CYRILLIC SMALL LETTER DZE 0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I 0xF7 0x0457 # CYRILLIC SMALL LETTER YI 0xF8 0x0458 # CYRILLIC SMALL LETTER JE 0xF9 0x0459 # CYRILLIC SMALL LETTER LJE 0xFA 0x045A # CYRILLIC SMALL LETTER NJE 0xFB 0x045B # CYRILLIC SMALL LETTER TSHE 0xFC 0x045C # CYRILLIC SMALL LETTER KJE 0xFD 0x00A7 # SECTION SIGN 0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U 0xFF 0x045F # CYRILLIC SMALL LETTER DZHE therion/thchencdata/generate.pl0000775000175000017500000001120710720726666015663 0ustar useruser#!/usr/bin/perl %ifiles = ( 'ascii' => 'ASCII.TXT', 'iso8859-1' => '8859-1.TXT', 'iso8859-2' => '8859-2.TXT', 'iso8859-5' => '8859-5.TXT', 'iso8859-7' => '8859-7.TXT', 'cp1250' => 'CP1250.TXT', 'cp1251' => 'CP1251.TXT', 'cp1252' => 'CP1252.TXT', 'cp1253' => 'CP1253.TXT', ); $undef_u = '0X005F'; $undef_c = 'LOW LINE'; $undef_a = '0X5F'; $thchenc_facc = '0X80'; $thchenc_fucc = '0X0080'; $thtt_encoding_uc = ""; $thtt_encoding_lc = ""; $thtt_enum = "\tTT_UNKNOWN_ENCODING = -1,\n"; $thtt_enum_val = -1; foreach $ename (sort keys %ifiles) { $ENAME = uc $ename; $ekey = "TT_$ENAME"; $ekey =~ s/\W/\_/g; $fname = $ifiles{$ename}, "\n"; $thtt_encoding_uc .= "\t{\"$ENAME\",\t$ekey},\n"; $thtt_encoding_lc .= "\t{\"$ename\",\t$ekey},\n"; $thtt_enum_val++; $thtt_enum .= "\t$ekey = $thtt_enum_val,\n"; print "$fname => $ename, $ENAME, $ekey ... "; # let's build the structures open(INP,"$fname"); $id = $thtt_enum_val; LINE: while () { next LINE if /^\s*\#/; ($d, $c) = split /\#/; $d =~ s/^\s+//; $d =~ s/\s+$//; $c =~ s/^\s*\#//; $c =~ s/^\s+//; $c =~ s/\s+$//g; ($a, $u) = split /\s+/, $d; unless (defined $u) { $u = $undef_u; $c = $undef_c; } $a = uc $a; $u = uc $u; $c = uc $c; $c2u{$c} = $u; $u2c{$u} = $c; $uu2aa{$u}[$id] = $a; $aa2uu{$a}[$id] = $u; if ($a lt $thchenc_facc) { if ($u ge $thchenc_fucc) { die "ERROR: You have to use lower facc and fucc !!!\n"; } next LINE; } if ($u ne $undef_u) { $u2a{$u}[$id] = $a; } $a2u{$a}[$id] = $u; } close(INP); print "done\n"; } $thtt_enum_val++; $maxid = $thtt_enum_val; @ka2u = sort keys %a2u; @ku2a = sort keys %u2a; $maxascii = $#ka2u + 1; $maxunicode = $#ku2a + 1; $ENAME = 'UTF-8'; $ename = 'utf-8'; $ekey = 'TT_UTF_8'; $thtt_enum = "enum {\n$thtt_enum\t$ekey = $thtt_enum_val\n};\n"; $thtt_encoding = "static const thstok thtt_encoding[] = {\n" . "$thtt_encoding_uc\t{\"$ENAME\",\t$ekey},\n" . "$thtt_encoding_lc\t{\"$ename\",\t$ekey},\n" . "\t{NULL, TT_UNKNOWN_ENCODING}\n};\n"; # now let's generate encoding tables print "processing conversion tables: E$maxid, A$maxascii, U$maxunicode ... "; $thencode_tbl_def = "static const wchar_t thencode_tbl[][];\n"; $thencode_tbl = "static const wchar_t thencode_tbl[$maxascii][$maxid] = {\n"; foreach $av (@ka2u) { @current = @{$a2u{$av}}; for($i = 0; $i < $maxid; $i++) { if ($current[$i] eq '') { $current[$i] = $undef_u; } } $thencode_tbl .= "\t{" . join(", ", @current) . "},\n"; } $thencode_tbl .= "};\n"; # and now let's generate decoding tables $thdecode_tbl_def = "static const unsigned char thdecode_tbl[][];\n"; $thdecode_tbl_idx_def = "static const wchar_t thdecode_tbl_idx[];\n"; $thdecode_tbl = "static const unsigned char thdecode_tbl[$maxunicode][$maxid] = {\n"; $thdecode_tbl_idx = "static const wchar_t thdecode_tbl_idx[$maxunicode] = {\n"; foreach $uv (@ku2a) { @current = @{$u2a{$uv}}; for($i = 0; $i < $maxid; $i++) { if ($current[$i] eq '') { $j = 0; while ($current[$i] eq '') { if ($j == 0) { if ($u2c{$uv} =~ /(LATIN (?:CAPITAL|SMALL) LETTER [A-Z])/) { $current[$i] = $uu2aa{$c2u{$1}}[$i]; } } else { $current[$i] = $undef_a; } $j++; } } } $thdecode_tbl .= "\t{" . join(", ", @current) . "}, //$uv\n"; $thdecode_tbl_idx .= "\t$uv,\n"; } $thdecode_tbl_idx .= "};\n"; $thdecode_tbl .= "};\n"; print "done\n"; open(OUTPT, ">../thchencdata.cxx"); print OUTPT < /** * First ascii en-de-coded character. */ static const unsigned char thchenc_facc = $thchenc_facc; /** * First unicode en-de-coded character. */ static const wchar_t thchenc_fucc = $thchenc_fucc; /** * Size of decoding table. */ static const size_t thdecode_tbl_size = $maxunicode; /** * Undefined ascii character. */ static const unsigned char thdecode_undef = $undef_a; $thencode_tbl $thdecode_tbl_idx $thdecode_tbl #endif ENDOUTPT close(OUTPT); open(OUTPT, ">../thchencdata.h"); print OUTPT <x = 0.0; this->y = 0.0; this->xt = 0.0; this->yt = 0.0; this->zt = 0.0; this->at = 0.0; this->dbgx0 = 0.0; this->dbgy0 = 0.0; this->dbgx1 = 0.0; this->dbgy1 = 0.0; this->pscrap = NULL; this->join_item = NULL; } void thdb2dpt::export_mp(class thexpmapmpxs * out, int dbglevel) { switch (dbglevel) { case 1: fprintf(out->file,"(%.2f,%.2f)", thxmmxst(out, this->dbgx1, this->dbgy1)); break; case 0: fprintf(out->file,"(%.2f,%.2f)", thxmmxst(out, this->dbgx0, this->dbgy0)); break; default: fprintf(out->file,"(%.2f,%.2f)", thxmmxst(out, this->xt, this->yt)); } } therion/xtherion/0000775000175000017500000000000012450020345013101 5ustar userusertherion/xtherion/ctrl.tcl0000664000175000017500000001232411221133502014546 0ustar useruser## ## ctrl.tcl -- ## ## Controler module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- set xth(ctrl,all,number) 0 proc xth_ctrl_create {aname} { global xth set cf $xth(gui,$aname).af.ctrl canvas $cf.c -yscrollcommand "xth_scroll $cf.sv" \ -highlightthickness 0 scrollbar $cf.sv -orient vert -command "$cf.c yview" -takefocus 0 \ -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $cf 0 -weight 1 grid rowconf $cf 0 -weight 1 xth_scroll_showcmd $cf.sv "grid $cf.sv -row 0 -column 1 -sticky nsew; update idletasks; xth_ctrl_reshape te" xth_scroll_hidecmd $cf.sv "grid forget $cf.sv; update idletasks; xth_ctrl_reshape te" grid $cf.c -row 0 -column 0 -sticky nsew set xth(ctrl,$aname,number) 0 set xth(ctrl,$aname,list) {} } proc xth_ctrl_add {aname cname title} { global xth incr xth(ctrl,$aname,number) incr xth(ctrl,all,number) lappend xth(ctrl,$aname,list) $cname set cn $xth(ctrl,$aname,number) set cf $xth(gui,$aname).af.ctrl set ccf $cf.cf$cn frame $ccf frame $ccf.f set cid [$cf.c create window 0 0 -window $ccf -anchor nw] set xth(ctrl,$aname,$cname) $ccf.f set xth(ctrl,$aname,$cname,frm) $ccf set xth(ctrl,$aname,$cname,pos) $cn set xth(ctrl,$aname,$cname,max) 1 set xth(ctrl,$aname,$cname,menu) .xth_popup$xth(ctrl,all,number) set xth(ctrl,$aname,$cn) $cid menu .xth_popup$xth(ctrl,all,number) -tearoff 0 button $ccf.rb -text "$title" -command "xth_ctrl_minmax $aname $cname" \ -font $xth(gui,lfont) -bg #aaaaaa \ -fg white -bg darkBlue -activebackground lightBlue \ -anchor w -relief flat \ -takefocus 0 bind $ccf.rb "tk_popup .xth_popup$xth(ctrl,all,number) %X %Y" xth_status_bar $aname $ccf.rb [mc "Show or hide this control panel"] pack $ccf.rb -side top -fill x -expand 1 pack $ccf.f -expand yes -fill both xth_ctrl_reshape $aname } proc xth_ctrl_finish {aname} { global xth foreach ct $xth(ctrl,$aname,list) { set cmn $xth(ctrl,$aname,$ct,menu) foreach oct $xth(ctrl,$aname,list) { if {[string compare $ct $oct] != 0} { $cmn add command -label [$xth(ctrl,$aname,$oct,frm).rb cget -text] \ -command "xth_ctrl_replace $aname $ct $oct" -font $xth(gui,lfont) } } } } proc xth_ctrl_reshape {aname} { global xth set cn $xth(ctrl,$aname,number) set cnv $xth(gui,$aname).af.ctrl.c # position the windows set height 0 set width [winfo width $cnv] for {set i 1} {$i <= $cn} {incr i} { set cid $xth(ctrl,$aname,$i) set cw [$cnv itemcget $cid -window] $cnv coord $cid 0 $height $cnv itemconfigure $cid -width $width incr height [winfo height $cw] } $cnv configure -scrollregion "0 0 $width $height" } proc xth_ctrl_minmax {aname cname} { global xth set cmm $xth(ctrl,$aname,$cname,max) if {$cmm == 1} { pack forget $xth(ctrl,$aname,$cname) $xth(ctrl,$aname,$cname,frm).rb configure -relief raised set cmm 0 } else { pack $xth(ctrl,$aname,$cname) -expand yes -fill both $xth(ctrl,$aname,$cname,frm).rb configure -relief flat set cmm 1 } set xth(ctrl,$aname,$cname,max) $cmm update idletasks xth_ctrl_reshape $aname } proc xth_ctrl_replace {aname ccname dcname} { global xth set cnv $xth(gui,$aname).af.ctrl.c set p1 $xth(ctrl,$aname,$ccname,pos) set p2 $xth(ctrl,$aname,$dcname,pos) set xth(ctrl,$aname,$ccname,pos) $p2 set xth(ctrl,$aname,$dcname,pos) $p1 $cnv itemconfigure $xth(ctrl,$aname,$p1) \ -window $xth(ctrl,$aname,$dcname,frm) $cnv itemconfigure $xth(ctrl,$aname,$p2) \ -window $xth(ctrl,$aname,$ccname,frm) update idletasks xth_ctrl_reshape $aname } proc xth_ctrl_minimize {aname cname} { global xth set xth(ctrl,$aname,$cname,max) 1 xth_ctrl_minmax $aname $cname } proc xth_ctrl_maximize {aname cname} { global xth set xth(ctrl,$aname,$cname,max) 0 xth_ctrl_minmax $aname $cname } proc xth_ctrl_scroll_to {aname cname} { global xth set cf $xth(gui,$aname).af.ctrl set sr [$cf.c cget -scrollregion] set wp [$cf.c coord $xth(ctrl,$aname,[expr [lsearch $xth(ctrl,$aname,list) [lindex $xth(ctrl,$aname,list) [expr $xth(ctrl,$aname,$cname,pos) - 1]]] + 1])] # set wp [$cf.c coord $xth(ctrl,$aname,[expr [lsearch $xth(ctrl,$aname,list) $cname] + 1])] $cf.c yview moveto [expr [lindex $wp 1] / ([lindex $sr 3] - [lindex $sr 1])] } therion/xtherion/me_imgs.tcl0000664000175000017500000011171012270034016015226 0ustar useruser## ## me_imgs.tcl -- ## ## Map editor images module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- set xth(gui,openxp) 0 set xth(me,imgs,xviid) 0 proc xth_me_image_update_position {} { global xth set iidx [lindex [$xth(ctrl,me,images).il.ilbox curselection] 0] set imgx [lindex $xth(me,imgs,xlist) $iidx] $xth(ctrl,me,images).ic.posln configure -text [format "%.0f:%.0f" \ [lindex $xth(me,imgs,$imgx,position) 0] \ [lindex $xth(me,imgs,$imgx,position) 1]] set xth(ctrl,me,images,posx) [format "%.0f" [lindex $xth(me,imgs,$imgx,position) 0]] set xth(ctrl,me,images,posy) [format "%.0f" [lindex $xth(me,imgs,$imgx,position) 1]] update idletasks } proc xth_me_image_update_list {} { global xth set xth(me,imgs,list) {} foreach imgx $xth(me,imgs,xlist) { if {$xth(me,imgs,$imgx,XVI)} { set imgsize "(XVI)" } elseif {[string length $xth(me,imgs,$imgx,image)] > 0} { set imgw [image width $xth(me,imgs,$imgx,image)] set imgh [image height $xth(me,imgs,$imgx,image)] set imgsize "($imgw x $imgh)" } else { set imgsize "(unknown)" } lappend xth(me,imgs,list) "$xth(me,imgs,$imgx,name) $imgsize" } } proc xth_me_image_move_to {} { global xth xth_me_cmds_update {} if {$xth(me,nimgs) < 1} { return; } set iidx [lindex [$xth(ctrl,me,images).il.ilbox curselection] 0] set imgx [lindex $xth(me,imgs,xlist) $iidx] xth_me_unredo_action [mc "moving image"] \ "xth_me_image_move $imgx $xth(me,imgs,$imgx,position); xth_me_image_update_position" \ "xth_me_image_move $imgx $xth(ctrl,me,images,posx) $xth(ctrl,me,images,posy); xth_me_image_update_position" xth_me_image_move $imgx $xth(ctrl,me,images,posx) $xth(ctrl,me,images,posy) xth_me_image_update_position } proc xth_me_image_move {imgx xx yy} { # zisti si aktualne suradnice global xth if {[catch {expr $xx}]} { set xx [lindex $xth(me,imgs,$imgx,position) 0] } if {[catch {expr $yy}]} { set yy [lindex $xth(me,imgs,$imgx,position) 1] } set xth(me,imgs,$imgx,position) [list $xx $yy] xth_me_image_redraw $imgx } proc xth_me_image_toggle_vsb {iidx} { global xth if {$xth(me,nimgs) < 1} { return } set isel [$xth(ctrl,me,images).il.ilbox curselection] if {[llength $isel] < 1} { return } if {[string length $iidx] < 1} { set iidx [lindex $isel 0] } set imgx [lindex $xth(me,imgs,xlist) $iidx] xth_me_unredo_action [mc "toggle image visibility"] \ "xth_me_image_toggle_vsb $iidx" "xth_me_image_toggle_vsb $iidx" switch $xth(me,imgs,$imgx,vsb) { 0 { set xth(me,imgs,$imgx,vsb) 1 $xth(me,can) itemconfigure $xth(me,imgs,$imgx,image) -state normal xth_me_image_rescan $imgx xth_me_image_redraw $imgx set xth(ctrl,me,images,vis) 1 } 1 { set xth(me,imgs,$imgx,vsb) 0 $xth(me,can) itemconfigure $xth(me,imgs,$imgx,image) -state hidden set xth(ctrl,me,images,vis) 0 } default { set xth(ctrl,me,images,vis) 0 } } } proc xth_me_image_set_gamma {imgx} { global xth if {$xth(me,imgs,$imgx,vsb) <= 0} { return } if {$xth(me,imgs,$imgx,XVI)} { return } set ng $xth(me,imgs,$imgx,gamma) xth_status_bar_push me set totalsi [llength $xth(me,imgs,$imgx,subimgs)] set csi 0 xth_status_bar_status me [format "Correcting image gamma (%s) ..." $xth(me,imgs,$imgx,name)] xth_me_progbar_show $totalsi $xth(me,imgs,$imgx,image) configure -gamma $ng foreach imgl $xth(me,imgs,$imgx,subimgs) { set dsti [lindex $imgl 0] incr csi xth_me_progbar_prog $csi $dsti configure -gamma $ng } xth_me_progbar_hide xth_status_bar_pop me } if {$xth(gui,me,nozoom)} { proc xth_me_images_rescandraw {} { global xth if {($xth(me,zoom) > 100) && $xth(gui,me,nozoom)} { foreach imgx $xth(me,imgs,xlist) { xth_me_image_redraw $imgx } } } proc xth_me_image_redraw {imgx} { global xth if {$xth(me,imgs,$imgx,vsb) <= 0} { return } if {$xth(me,imgs,$imgx,XVI)} { xth_me_imgs_xvi_redraw $imgx return } set totalsi [llength $xth(me,imgs,$imgx,subimgs)] set csi 0 set x [lindex $xth(me,imgs,$imgx,position) 0] set y [lindex $xth(me,imgs,$imgx,position) 1] set w [image width $xth(me,imgs,$imgx,image)] set h [image height $xth(me,imgs,$imgx,image)] # ak je zoom 100 - nastavi image na source image # a kasle na ostatne if {$xth(me,zoom) <= 100} { foreach imgl $xth(me,imgs,$imgx,subimgs) { incr csi $xth(me,can) coords [lindex $imgl 1] \ [xth_me_real2canx [expr $x + [lindex $imgl 2]]] \ [xth_me_real2cany [expr $y - [lindex $imgl 3]]] } } else { # najde si suradnice z obrazka, ktore su viditelne set imgl [lindex $xth(me,imgs,$imgx,subimgs) 0] set cminx [winfo x $xth(me,can)] set cminy [winfo y $xth(me,can)] set cmaxx [expr $cminx + [winfo width $xth(me,can)]] set cmaxy [expr $cminy + [winfo height $xth(me,can)]] set sx [xth_me_can2realx [$xth(me,can) canvasx $cminx]] set sw [expr [xth_me_can2realx [$xth(me,can) canvasx $cmaxx]] - $sx] set sy [xth_me_can2realy [$xth(me,can) canvasy $cminy]] set sh [expr $sy - [xth_me_can2realy [$xth(me,can) canvasy $cmaxy]]] # ak je nieco viditelne - tak to zobrazi set vfx [expr round($sx - $x)] set vfy [expr round($y - $sy)] set vtx [expr round($vfx + $sw)] set vty [expr round($vfy + $sh)] if {$vfx < 0} {set vfx 0} if {$vfy < 0} {set vfy 0} if {$vtx > $w} {set vtx $w} if {$vty > $h} {set vty $h} #puts "$vfx $vfy $vtx $vty" if {($vtx <= 0) || ($vty <= 0) || ($vfx >= $w) || ($vfy >= $h) || ($vtx <= $vfx) || ($vty <= $vfy)} { # nezobrazime nic $xth(me,can) itemconfigure [lindex $imgl 1] -image {} } else { # zobrazime vyrez set dsti [lindex $imgl 0] $dsti copy $xth(me,imgs,$imgx,image) -zoom [expr $xth(me,zoom) / 100] -shrink \ -from $vfx $vfy $vtx $vty $xth(me,can) itemconfigure [lindex $imgl 1] -image $dsti $xth(me,can) coords [lindex $imgl 1] \ [xth_me_real2canx [expr $x + $vfx]] \ [xth_me_real2cany [expr $y - $vfy]] } } update idletasks } proc xth_me_image_rescan {imgx} { global xth if {$xth(me,imgs,$imgx,vsb) <= 0} { return } if {$xth(me,imgs,$imgx,XVI)} { return } set srci $xth(me,imgs,$imgx,image) xth_status_bar_push me set origgamma [$srci cget -gamma] $srci configure -gamma 1.0 set totalsi [llength $xth(me,imgs,$imgx,subimgs)] set csi 0 xth_status_bar_status me [format "Zooming image %s ..." $xth(me,imgs,$imgx,name)] xth_me_progbar_show $totalsi foreach imgl $xth(me,imgs,$imgx,subimgs) { set dsti [lindex $imgl 0] incr csi xth_me_progbar_prog $csi switch $xth(me,zoom) { 100 { $xth(me,can) itemconfigure [lindex $imgl 1] -image $srci } default { $xth(me,can) itemconfigure [lindex $imgl 1] -image $dsti } } switch $xth(me,zoom) { 25 {$dsti copy $srci -subsample 4 -shrink} 50 {$dsti copy $srci -subsample 2 -shrink} 200 {} 400 {} default {} } } xth_me_progbar_hide $srci configure -gamma $origgamma xth_status_bar_pop me } # NOZOOMING } else { proc xth_me_images_rescandraw {} { } proc xth_me_image_redraw {imgx} { global xth if {$xth(me,imgs,$imgx,vsb) <= 0} { return } if {$xth(me,imgs,$imgx,XVI)} { xth_me_imgs_xvi_redraw $imgx return } set totalsi [llength $xth(me,imgs,$imgx,subimgs)] set csi 0 set x [lindex $xth(me,imgs,$imgx,position) 0] set y [lindex $xth(me,imgs,$imgx,position) 1] foreach imgl $xth(me,imgs,$imgx,subimgs) { incr csi $xth(me,can) coords [lindex $imgl 1] \ [xth_me_real2canx [expr $x + [lindex $imgl 2]]] \ [xth_me_real2cany [expr $y - [lindex $imgl 3]]] } update idletasks } proc xth_me_image_rescan {imgx} { global xth if {$xth(me,imgs,$imgx,vsb) <= 0} { return } if {$xth(me,imgs,$imgx,XVI)} { return } set srci $xth(me,imgs,$imgx,image) xth_status_bar_push me set totalsi [llength $xth(me,imgs,$imgx,subimgs)] set csi 0 xth_status_bar_status me [format "Zooming image %s ..." $xth(me,imgs,$imgx,name)] xth_me_progbar_show $totalsi foreach imgl $xth(me,imgs,$imgx,subimgs) { set dsti [lindex $imgl 0] incr csi xth_me_progbar_prog $csi $dsti blank switch $xth(me,zoom) { 25 {$dsti copy $srci -subsample 4 -shrink -from \ [lindex $imgl 2] [lindex $imgl 3] [lindex $imgl 4] [lindex $imgl 5]} 50 {$dsti copy $srci -subsample 2 -shrink -from \ [lindex $imgl 2] [lindex $imgl 3] [lindex $imgl 4] [lindex $imgl 5]} 200 {$dsti copy $srci -zoom 2 -shrink -from \ [lindex $imgl 2] [lindex $imgl 3] [lindex $imgl 4] [lindex $imgl 5]} 400 {$dsti copy $srci -zoom 4 -shrink -from \ [lindex $imgl 2] [lindex $imgl 3] [lindex $imgl 4] [lindex $imgl 5]} default {$dsti copy $srci -shrink -from \ [lindex $imgl 2] [lindex $imgl 3] [lindex $imgl 4] [lindex $imgl 5]} } } xth_me_progbar_hide xth_status_bar_pop me } } # END NO NOZOOM proc xth_me_imgs_xvi_redraw {imgx} { global xth set id $xth(me,imgs,$imgx,image) # calculate all coordinates # grid set px [lindex $xth(me,imgs,$imgx,position) 0] set py [lindex $xth(me,imgs,$imgx,position) 1] set gx [lindex $xth(me,imgs,$imgx,XVIgrid) 0] set gy [lindex $xth(me,imgs,$imgx,XVIgrid) 1] set gxx [lindex $xth(me,imgs,$imgx,XVIgrid) 2] set gxy [lindex $xth(me,imgs,$imgx,XVIgrid) 3] set gyx [lindex $xth(me,imgs,$imgx,XVIgrid) 4] set gyy [lindex $xth(me,imgs,$imgx,XVIgrid) 5] set ngx [lindex $xth(me,imgs,$imgx,XVIgrid) 6] set ngy [lindex $xth(me,imgs,$imgx,XVIgrid) 7] set shx [expr double($px) - double($gx)] set shy [expr double($py) - double($gy)] set odd 0 set crd {} for {set i 0} {$i <= $ngy} {incr i} { set lvx [xth_me_real2canx [expr $shx + $gx + $i * $gyx]] set lvy [xth_me_real2cany [expr $shy + $gy + $i * $gyy]] set rvx [xth_me_real2canx [expr $shx + $gx + $i * $gyx + $ngx * $gxx]] set rvy [xth_me_real2cany [expr $shy + $gy + $i * $gyy + $ngx * $gxy]] if {$odd} { lappend crd $lvx $lvy $rvx $rvy set odd 0 } else { lappend crd $rvx $rvy $lvx $lvy set odd 1 } } $xth(me,can) coords [format "%sGH" $id] $crd set crd {} for {set i 0} {$i <= $ngx} {incr i} { set lvx [xth_me_real2canx [expr $shx + $gx + $i * $gxx]] set lvy [xth_me_real2cany [expr $shy + $gy + $i * $gxy]] set rvx [xth_me_real2canx [expr $shx + $gx + $i * $gxx + $ngy * $gyx]] set rvy [xth_me_real2cany [expr $shy + $gy + $i * $gxy + $ngy * $gyy]] if {$odd} { lappend crd $lvx $lvy $rvx $rvy set odd 0 } else { lappend crd $rvx $rvy $lvx $lvy set odd 1 } } $xth(me,can) coords [format "%sGV" $id] $crd # walls set shts $xth(me,imgs,$imgx,XVIshots) for {set i 0} {$i < [llength $shts]} {incr i} { if {[llength [lindex $shts $i]] >= 12} { set x0 [xth_me_real2canx [expr $shx + [lindex [lindex $shts $i] 4]]] set y0 [xth_me_real2cany [expr $shy + [lindex [lindex $shts $i] 5]]] set x1 [xth_me_real2canx [expr $shx + [lindex [lindex $shts $i] 6]]] set y1 [xth_me_real2cany [expr $shy + [lindex [lindex $shts $i] 7]]] set x2 [xth_me_real2canx [expr $shx + [lindex [lindex $shts $i] 8]]] set y2 [xth_me_real2cany [expr $shy + [lindex [lindex $shts $i] 9]]] set x3 [xth_me_real2canx [expr $shx + [lindex [lindex $shts $i] 10]]] set y3 [xth_me_real2cany [expr $shy + [lindex [lindex $shts $i] 11]]] $xth(me,can) coords [format "%sWLF%d" $id $i] $x0 $y0 $x1 $y1 $x2 $y2 $x3 $y3 $xth(me,can) coords [format "%sWLO%d" $id $i] $x0 $y0 $x1 $y1 $x2 $y2 $x3 $y3 $x0 $y0 } } # shots for {set i 0} {$i < [llength $shts]} {incr i} { set fx [xth_me_real2canx [expr $shx + [lindex [lindex $shts $i] 0]]] set fy [xth_me_real2cany [expr $shy + [lindex [lindex $shts $i] 1]]] set tx [xth_me_real2canx [expr $shx + [lindex [lindex $shts $i] 2]]] set ty [xth_me_real2cany [expr $shy + [lindex [lindex $shts $i] 3]]] $xth(me,can) coords [format "%sSH%d" $id $i] $fx $fy $tx $ty } # sketch lines set sklns $xth(me,imgs,$imgx,XVIsketchlines) for {set i 0} {$i < [llength $sklns]} {incr i} { set slcl [lrange [lindex $sklns $i] 1 end] set slcrds {} for {set j 0} {$j < [llength $slcl]} {set j [expr $j + 2]} { set xx [xth_me_real2canx [expr $shx + [lindex $slcl $j]]] set yy [xth_me_real2cany [expr $shy + [lindex $slcl [expr $j + 1]]]] append slcrds "$xx $yy " } if {[llength $slcrds] < 4} { set slcrds [list [expr $xx - 0.5] [expr $yy - 0.5] \ [expr $xx + 0.5] [expr $yy - 0.5] \ [expr $xx + 0.5] [expr $yy + 0.5] \ [expr $xx - 0.5] [expr $yy + 0.5] \ [expr $xx - 0.5] [expr $yy - 0.5]] } $xth(me,can) coords [format "%sSKLN%d" $id $i] $slcrds } # stations set stns $xth(me,imgs,$imgx,XVIstations) set xth(me,imgs,$imgx,XVIstationsX) {} for {set i 0} {$i < [llength $stns]} {incr i} { set cx [expr $shx + [lindex [lindex $stns $i] 0]] set cy [expr $shy + [lindex [lindex $stns $i] 1]] lappend xth(me,imgs,$imgx,XVIstationsX) [list $cx $cy] set cx [xth_me_real2canx $cx] set cy [xth_me_real2cany $cy] $xth(me,can) coords [format "%sST%d" $id $i] [expr $cx - $xth(gui,xvi_station_size)] [expr $cy - $xth(gui,xvi_station_size)] [expr $cx + $xth(gui,xvi_station_size)] [expr $cy + $xth(gui,xvi_station_size)] } if {$xth(me,imgs,$imgx,vsb) == 1} { $xth(me,can) itemconfigure $xth(me,imgs,$imgx,image) -state normal } } proc xth_me_imgs_xvi_create {imgx} { global xth # firstly delete all imgx items foreach silist $xth(me,imgs,$imgx,subimgs) { $xth(me,can) delete [lindex $silist 1] } set xth(me,imgs,$imgx,subimgs) {} set id $xth(me,imgs,$imgx,image) set stpref [format "XVIstI%sS" $imgx] # now create them # walls fill set shts $xth(me,imgs,$imgx,XVIshots) for {set i 0} {$i < [llength $shts]} {incr i} { if {[llength [lindex $shts $i]] >= 12} { set cid [$xth(me,can) create polygon 0 0 1 0 1 1 -stipple $xth(gui,xvi_walls_fptn) -fill $xth(gui,xvi_walls_fclr) -width 1 -state hidden -tags [list $id [format "%sWLF%d" $id $i]]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] } } # grid set grid_info_str [format [mc "grid - spacing %s"] $xth(me,imgs,$imgx,XVIgrids)] set cid [$xth(me,can) create line 0 0 1 1 -fill $xth(gui,xvi_grid_clr) -width 1 -state hidden -tags [list $id [format "%sGH" $id]]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx $xth(me,can) bind $cid "xth_status_bar_push me; xth_status_bar_status me [list $grid_info_str]" $xth(me,can) bind $cid "xth_status_bar_pop me" lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] set cid [$xth(me,can) create line 0 0 1 1 -fill $xth(gui,xvi_grid_clr) -width 1 -state hidden -tags [list $id [format "%sGV" $id]]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx $xth(me,can) bind $cid "xth_status_bar_push me; xth_status_bar_status me [list $grid_info_str]" $xth(me,can) bind $cid "xth_status_bar_pop me" lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] # walls outline set shts $xth(me,imgs,$imgx,XVIshots) for {set i 0} {$i < [llength $shts]} {incr i} { if {[llength [lindex $shts $i]] >= 12} { set cid [$xth(me,can) create line 0 0 1 1 -fill $xth(gui,xvi_walls_oclr) -width 1 -state hidden -tags [list $id [format "%sWLO%d" $id $i]]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] } } # shots for {set i 0} {$i < [llength $shts]} {incr i} { set cid [$xth(me,can) create line 0 0 1 1 -fill $xth(gui,xvi_shot_clr) -width 3 -state hidden -tags [list $id [format "%sSH%d" $id $i]]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] } # sketch lines set sklns $xth(me,imgs,$imgx,XVIsketchlines) for {set i 0} {$i < [llength $sklns]} {incr i} { set cclr [lindex [lindex $sklns $i] 0] set cdash {} if {[string equal $cclr connect]} { set cclr gray set cdash . } set cid [$xth(me,can) create line 0 0 1 1 -fill $cclr -dash $cdash -width $xth(gui,xvi_sketch_line_width) -state hidden -tags [list $id [format "%sSKLN%d" $id $i]]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] } # stations set stns $xth(me,imgs,$imgx,XVIstations) for {set i 0} {$i < [llength $stns]} {incr i} { set cid [$xth(me,can) create oval 0 0 1 1 -fill $xth(gui,xvi_station_fclr) -outline $xth(gui,xvi_station_oclr) -width 1 -state hidden -tags [list $id [format "%sST%d" $id $i] "$stpref$i"]] xth_me_bind_area_drag $cid $imgx xth_me_bind_image_drag $cid $imgx set stinfo [format [mc "station - %s"] [lindex [lindex $stns $i] 2]] $xth(me,can) bind $cid "xth_status_bar_push me; xth_status_bar_status me [list $stinfo]" $xth(me,can) bind $cid "xth_status_bar_pop me" lappend xth(me,imgs,$imgx,subimgs) [list {} $cid] } # and change coordinates catch {$xth(me,can) lower $xth(me,imgs,$imgx,image) command} set iidx [lsearch -exact $xth(me,imgs,xlist) $imgx] if {$iidx > 0} { $xth(me,can) lower $xth(me,imgs,$imgx,image) $xth(me,imgs,[lindex $xth(me,imgs,xlist) [expr $iidx - 1]],image) } xth_me_imgs_xvi_redraw $imgx } proc xth_me_imgs_set_root {imgx} { global xth if {!$xth(me,imgs,$imgx,XVI)} { return } set rs $xth(me,imgs,$imgx,XVIroot) set xss $xth(me,imgs,$imgx,XVIstations) if {[string length $rs] < 1} { return } # prejde vsetky stations, a skusi najst tu s danym menom # ked ju najde, prerata position na grid origin a vynuluje for {set i 0} {$i < [llength $xss]} {incr i} { if {[string equal [lindex [lindex $xss $i] 2] $rs]} { set sx [lindex [lindex $xss $i] 0] set sy [lindex [lindex $xss $i] 1] set px [lindex $xth(me,imgs,$imgx,position) 0] set py [lindex $xth(me,imgs,$imgx,position) 1] set gx [lindex $xth(me,imgs,$imgx,XVIgrid) 0] set gy [lindex $xth(me,imgs,$imgx,XVIgrid) 1] set xth(me,imgs,$imgx,position) [list [expr double($gx) + double($px) - double($sx)] [expr double($gy) + double($py) - double($sy)]] set xth(me,imgs,$imgx,XVIroot) {} break } } } proc xth_me_imgs_get_root {imgx} { global xth set xss $xth(me,imgs,$imgx,XVIstations) if {[llength $xss] > 0} { set i 0 set sx [lindex [lindex $xss $i] 0] set sy [lindex [lindex $xss $i] 1] set px [lindex $xth(me,imgs,$imgx,position) 0] set py [lindex $xth(me,imgs,$imgx,position) 1] set gx [lindex $xth(me,imgs,$imgx,XVIgrid) 0] set gy [lindex $xth(me,imgs,$imgx,XVIgrid) 1] return [list [lindex $xss $i 2] [expr double($sx) + double($px) - double($gx)] [expr double($sy) + double($py) - double($gy)]] } else { return [list $xth(me,imgs,$imgx,XVIroot)] } } proc xth_me_image_insert {xx yy fname iidx imgx} { global xth if {! $xth(me,fopen)} { return } set vsb 1 set igamma 1.0 if {[llength $xx] > 1} { if {[llength $xx] > 2} { set igamma [lindex $xx 2] } set vsb [lindex $xx 1] set xx [lindex $xx 0] } set xdata {} set ximage 0 if {[llength $imgx] > 1} { set xdata [lindex $imgx 1] set ximage 1 set imgx [lindex $imgx 0] } set XVIroot {} set isXVI 0 if {[llength $yy] > 1} { set XVIroot [lindex $yy 1] set yy [lindex $yy 0] } set dial_id 0 if {([string length $fname] < 1) && (!$ximage)} { if {$xth(me,fnewf)} { set wtd [MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon question -type yesno \ -message [mc "New *.th2 file needs to be saved before inserting background image. Save it now?"] \ -font $xth(gui,lfont)] if {$wtd == 1} { return } xth_me_save_file 1 } if {$xth(me,fnewf)} { return } set fname [tk_getOpenFile -parent $xth(gui,main) \ -filetypes $xth(gui,imgfiletypes) \ -initialdir $xth(me,fpath) -defaultextension ".gif"] if {[string length $fname] < 1} { return } else { if {[string equal -nocase [file extension $fname] .txt]} { set fname [xth_me_ptopo2xvi $fname] if {[string length $fname] < 1} { return } } # overi ci cesta sedi if {![string equal -length [string length $xth(me,fpath)] \ $xth(me,fpath) $fname]} { set cwpath [file split $xth(me,fpath)] set ifpath [file split $fname] set cmnpath [lindex $ifpath 0] if {![string equal [lindex $cwpath 0] $cmnpath]} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message "Unable to create relative path to current file from $fname." \ -font $xth(gui,lfont) return } for {set px 1} {$px < [llength $cwpath]} {incr px} { if {![string equal [lindex $cwpath $px] [lindex $ifpath $px]]} { break } else { append cmnpath [lindex $ifpath $px] } } set cmnlevel $px set fname {} for {} {$px < [llength $ifpath]} {incr px} { set fname [file join $fname [lindex $ifpath $px]] } set uplevel [expr [llength $cwpath] - $cmnlevel] for {set px 0} {$px < $uplevel} {incr px} { set fname [file join ".." $fname] } set dial_id 1 } else { set fname [string range $fname [expr [string length $xth(me,fpath)] + 1] end] set dial_id 1 } } } xth_status_bar_push me xth_status_bar_status me "Loading image file $fname ..." set ffname {} if {!$ximage} { set ffname [file join $xth(me,fpath) $fname] } if {[string length $imgx] < 1} { set imgx $xth(me,imgln) } set imgid {} set XVIgrids {} set XVIgrid {} set XVIstations {} set XVIshots {} set XVIsketchlines {} set XVIimages {} if {!$xth(gui,openxp)} { catch { if {$ximage} { set imgid [image create photo -data $xdata] } else { set imgid [image create photo -file $ffname] } } errorinf if {[string length $imgid] < 1} { catch { source $ffname } errorinf if {[string length $XVIgrids] > 0} { set isXVI 1 set imgid "XVI$xth(me,imgs,xviid)" incr xth(me,imgs,xviid) } } } else { set errorinf "excluded picture" } if {[string length $imgid] < 1} { if {$xth(me,unredook)} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message "$errorinf" \ -font $xth(gui,lfont) } xth_status_bar_pop me if {$dial_id} { return } else { set vsb [expr $vsb - 2] } } set undocmd "xth_me_image_remove %d" set redocmd "xth_me_image_insert %s %s [list $fname] %d $imgx" if {[catch {expr $xx}]} { set xx $xth(me,area,xmin) } if {[catch {expr $yy}]} { set yy $xth(me,area,ymin) } xth_me_unredo_action [mc "inserting image"] \ [format $undocmd $iidx] [format $redocmd "{$xx $vsb}" "{$yy $XVIroot}" $iidx] incr xth(me,nimgs) set xth(me,imgs,xlist) [linsert $xth(me,imgs,xlist) $iidx $imgx] set xth(me,imgs,$imgx,name) $fname set xth(me,imgs,$imgx,image) $imgid set xth(me,imgs,$imgx,position) [list $xx $yy] set xth(me,imgs,$imgx,subimgs) {} set xth(me,imgs,$imgx,vsb) $vsb set xth(me,imgs,$imgx,gamma) $igamma set xth(me,imgs,$imgx,reload) [list $undocmd $redocmd] set xth(me,imgs,$imgx,ffname) $ffname set xth(me,imgs,$imgx,fmtime) 0 catch {set xth(me,imgs,$imgx,fmtime) [file mtime $ffname]} set xth(me,imgs,$imgx,XVI) $isXVI set xth(me,imgs,$imgx,XVIbitmaps) {} set xth(me,imgs,$imgx,XVIimg) $ximage set xth(me,imgs,$imgx,XVIroot) $XVIroot set xth(me,imgs,$imgx,XVIgrids) $XVIgrids set xth(me,imgs,$imgx,XVIgrid) $XVIgrid set xth(me,imgs,$imgx,XVIshots) $XVIshots set xth(me,imgs,$imgx,XVIstations) $XVIstations set xth(me,imgs,$imgx,XVIsketchlines) $XVIsketchlines set xth(me,imgs,$imgx,XVIstationsX) {} xth_me_imgs_set_root $imgx if {$isXVI} { set Xxx [lindex $XVIgrid 0] set Xyy [lindex $XVIgrid 1] set nxx [lindex $xth(me,imgs,$imgx,position) 0] set nyy [lindex $xth(me,imgs,$imgx,position) 1] set Xshx [expr double($nxx) - double($Xxx)] set Xshy [expr double($nyy) - double($Xyy)] } # let's create image subimages if {($vsb >= 0) && (!$xth(me,imgs,$imgx,XVI))} { if {$xth(gui,me,nozoom)} { set subimg [image create photo] set subcimg [$xth(me,can) create image 0 0 -image $subimg -anchor nw \ -tags "$imgid bgimg imgx$imgx"] xth_me_bind_area_drag $subcimg $imgx xth_me_bind_image_drag $subcimg $imgx set iw [image width $imgid] set ih [image height $imgid] lappend xth(me,imgs,$imgx,subimgs) [list $subimg $subcimg 0 0 $iw $ih] catch {$xth(me,can) lower $xth(me,imgs,$imgx,image) command} if {$iidx > 0} { $xth(me,can) lower $xth(me,imgs,$imgx,image) $xth(me,imgs,[lindex $xth(me,imgs,xlist) [expr $iidx - 1]],image) } } else { set iw [image width $imgid] set ih [image height $imgid] set subisize 128 for {set subx 0} {$subx < $iw} {incr subx $subisize} { for {set suby 0} {$suby < $ih} {incr suby $subisize} { set subxx [expr $subx + $subisize] set subyy [expr $suby + $subisize] if {$subxx > $iw} { set subxx $iw } if {$subyy > $ih} { set subyy $ih } set subimg [image create photo] set subcimg [$xth(me,can) create image 0 0 -image $subimg -anchor nw \ -tags "$imgid bgimg imgx$imgx"] xth_me_bind_area_drag $subcimg $imgx xth_me_bind_image_drag $subcimg $imgx lappend xth(me,imgs,$imgx,subimgs) [list $subimg $subcimg $subx $suby $subxx $subyy] } } catch {$xth(me,can) lower $xth(me,imgs,$imgx,image) command} set iidx [lsearch -exact $xth(me,imgs,xlist) $imgx] if {$iidx > 0} { $xth(me,can) lower $xth(me,imgs,$imgx,image) $xth(me,imgs,[lindex $xth(me,imgs,xlist) [expr $iidx - 1]],image) } } } if {($vsb >= 0) && ($xth(me,imgs,$imgx,XVI))} { xth_me_imgs_xvi_create $imgx } xth_me_image_rescan $imgx xth_me_image_redraw $imgx xth_me_image_set_gamma $imgx xth_me_image_update_list xth_me_image_select 0 incr xth(me,imgln) catch {$xth(me,can) raise cmd_ctrl bgimg} set ximg 1 foreach xid $XVIimages { set llln $xth(me,imgln) xth_me_image_insert [expr double([lindex $xid 0]) + $Xshx] [expr double([lindex $xid 1]) + $Xshy] [format "%s - IMG%d" $fname $ximg] [expr $iidx + 1] [list {} [lindex $xid 2]] if {$xth(me,imgln) > $llln} { lappend xth(me,imgs,$imgx,XVIbitmaps) $llln } incr ximg } xth_status_bar_pop me } proc xth_me_image_destroy_all {} { global xth foreach imgx $xth(me,imgs,xlist) { unset xth(me,imgs,$imgx,name) unset xth(me,imgs,$imgx,position) if {[string length $xth(me,imgs,$imgx,image)] > 0} { catch {image delete $xth(me,imgs,$imgx,image)} } unset xth(me,imgs,$imgx,image) unset xth(me,imgs,$imgx,vsb) unset xth(me,imgs,$imgx,gamma) foreach silist $xth(me,imgs,$imgx,subimgs) { catch {image delete [lindex $silist 0]} $xth(me,can) delete [lindex $silist 1] } unset xth(me,imgs,$imgx,reload) unset xth(me,imgs,$imgx,ffname) unset xth(me,imgs,$imgx,fmtime) unset xth(me,imgs,$imgx,subimgs) unset xth(me,imgs,$imgx,XVI) unset xth(me,imgs,$imgx,XVIbitmaps) unset xth(me,imgs,$imgx,XVIroot) unset xth(me,imgs,$imgx,XVIgrids) unset xth(me,imgs,$imgx,XVIgrid) unset xth(me,imgs,$imgx,XVIshots) unset xth(me,imgs,$imgx,XVIstations) unset xth(me,imgs,$imgx,XVIstationsX) unset xth(me,imgs,$imgx,XVIsketchlines) } set xth(me,nimgs) 0 set xth(me,imgln) 0 set xth(me,imgs,list) {} set xth(me,imgs,xlist) {} } proc xth_me_image_remove {iidx} { global xth if {$xth(me,nimgs) < 1} { return } set isel [$xth(ctrl,me,images).il.ilbox curselection] if {[llength $isel] < 1} { return; } if {[string length $iidx] < 1} { set iidx [lindex $isel 0] set imgx [lindex $xth(me,imgs,xlist) $iidx] if {[string length $xth(me,imgs,$imgx,ffname)] == 0} return } set imgx [lindex $xth(me,imgs,xlist) $iidx] if {[llength $xth(me,imgs,$imgx,XVIbitmaps)] > 0} { foreach bx $xth(me,imgs,$imgx,XVIbitmaps) { set ccc [lsearch -exact $xth(me,imgs,xlist) $bx] catch {xth_me_image_remove $ccc} } } set iidx [lsearch -exact $xth(me,imgs,xlist) $imgx] xth_me_unredo_action [mc "removing image"] \ "xth_me_image_insert {[lindex $xth(me,imgs,$imgx,position) 0] $xth(me,imgs,$imgx,vsb) $xth(me,imgs,$imgx,gamma)} [lindex $xth(me,imgs,$imgx,position) 1] [list $xth(me,imgs,$imgx,name)] $iidx $imgx" "xth_me_image_remove $iidx" unset xth(me,imgs,$imgx,name) unset xth(me,imgs,$imgx,position) if {[string length $xth(me,imgs,$imgx,image)] > 0} { catch {image delete $xth(me,imgs,$imgx,image)} } unset xth(me,imgs,$imgx,image) unset xth(me,imgs,$imgx,vsb) unset xth(me,imgs,$imgx,gamma) foreach silist $xth(me,imgs,$imgx,subimgs) { catch {image delete [lindex $silist 0]} $xth(me,can) delete [lindex $silist 1] } unset xth(me,imgs,$imgx,subimgs) unset xth(me,imgs,$imgx,reload) unset xth(me,imgs,$imgx,ffname) unset xth(me,imgs,$imgx,fmtime) unset xth(me,imgs,$imgx,XVI) unset xth(me,imgs,$imgx,XVIbitmaps) unset xth(me,imgs,$imgx,XVIroot) unset xth(me,imgs,$imgx,XVIgrids) unset xth(me,imgs,$imgx,XVIgrid) unset xth(me,imgs,$imgx,XVIshots) unset xth(me,imgs,$imgx,XVIstations) unset xth(me,imgs,$imgx,XVIstationsX) unset xth(me,imgs,$imgx,XVIsketchlines) set xth(me,nimgs) [expr $xth(me,nimgs) - 1] set xth(me,imgs,xlist) [lreplace $xth(me,imgs,xlist) $iidx $iidx] xth_me_image_update_list if {$iidx >= [llength $xth(me,imgs,xlist)]} { set iidx end } xth_me_image_select $iidx } proc xth_me_image_move_special {iidx newiidx} { global xth if {$iidx == [expr $xth(me,nimgs) - 1]} { set iidx $xth(me,nimgs) } if {$iidx < $xth(me,nimgs)} { set iiidx $iidx set xiidx $iidx } else { set iiidx end set xiidx [expr $xth(me,nimgs) - 1] } set imgx [lindex $xth(me,imgs,xlist) $iiidx] if {$newiidx < $xth(me,nimgs)} { $xth(me,can) raise $xth(me,imgs,$imgx,image) $xth(me,imgs,[lindex $xth(me,imgs,xlist) $newiidx],image) set xth(me,imgs,xlist) [linsert [lreplace $xth(me,imgs,xlist) $iiidx $iiidx] $newiidx $imgx] } else { $xth(me,can) lower $xth(me,imgs,$imgx,image) $xth(me,imgs,[lindex $xth(me,imgs,xlist) end],image) set xth(me,imgs,xlist) [linsert [lreplace $xth(me,imgs,xlist) $iiidx $iiidx] end $imgx] } xth_me_unredo_action [mc "moving image"] \ "xth_me_image_move_special $newiidx $iidx" "xth_me_image_move_special $iidx $newiidx" xth_me_image_update_list xth_me_image_select $xiidx } proc xth_me_image_move_front {} { global xth xth_me_cmds_update {} if {$xth(me,nimgs) < 1} { return } set isel [$xth(ctrl,me,images).il.ilbox curselection] if {[llength $isel] < 1} { return; } set iidx [lindex $isel 0] if {$iidx == 0} { return } xth_me_image_move_special $iidx 0 } proc xth_me_image_move_back {} { global xth xth_me_cmds_update {} if {$xth(me,nimgs) < 1} { return } set isel [$xth(ctrl,me,images).il.ilbox curselection] if {[llength $isel] < 1} { return; } set iidx [lindex $isel 0] if {$iidx == ($xth(me,nimgs) - 1)} { return } xth_me_image_move_special $iidx $xth(me,nimgs) } proc xth_me_image_select {iidx} { global xth if {!$xth(me,fopen)} { return } if {[string length $iidx] == 0} { set iidx 0 } if {$xth(me,nimgs) > 0} { $xth(ctrl,me,images).ic.remp configure -state normal $xth(ctrl,me,images).ic.posl configure -state normal $xth(ctrl,me,images).ic.posln configure -state normal $xth(ctrl,me,images).ic.posch configure -state normal $xth(ctrl,me,images).ic.posx configure -state normal $xth(ctrl,me,images).ic.posy configure -state normal $xth(ctrl,me,images).ic.mvf configure -state normal $xth(ctrl,me,images).ic.mvb configure -state normal # $xth(ctrl,me,images).il.ilbox configure -state normal $xth(ctrl,me,images).il.ilbox selection clear 0 end $xth(ctrl,me,images).il.ilbox selection set $iidx set iidx [lindex [$xth(ctrl,me,images).il.ilbox curselection] 0] set imgx [lindex $xth(me,imgs,xlist) $iidx] if {$xth(me,imgs,$imgx,vsb) < 0} { $xth(ctrl,me,images).ic.viscb configure -state disabled $xth(ctrl,me,images).ic.gs configure -state disabled $xth(ctrl,me,images).ic.gr configure -state disabled $xth(ctrl,me,images).ic.gl configure -state disabled xth_me_image_update_gamma_scale set xth(ctrl,me,images,vis) 0 } else { $xth(ctrl,me,images).ic.viscb configure -state normal $xth(ctrl,me,images).ic.gs configure -state normal $xth(ctrl,me,images).ic.gr configure -state normal $xth(ctrl,me,images).ic.gl configure -state normal xth_me_image_update_gamma_scale set xth(ctrl,me,images,vis) $xth(me,imgs,$imgx,vsb) } xth_me_image_update_position update idletasks } else { $xth(ctrl,me,images).ic.viscb configure -state disabled $xth(ctrl,me,images).ic.remp configure -state disabled $xth(ctrl,me,images).ic.posl configure -state disabled $xth(ctrl,me,images).ic.posln configure -state disabled -text "" set xth(ctrl,me,images,posx) "" set xth(ctrl,me,images,posy) "" $xth(ctrl,me,images).ic.posch configure -state disabled $xth(ctrl,me,images).ic.posx configure -state disabled $xth(ctrl,me,images).ic.posy configure -state disabled $xth(ctrl,me,images).ic.mvf configure -state disabled $xth(ctrl,me,images).ic.mvb configure -state disabled $xth(ctrl,me,images).ic.gs configure -state disabled $xth(ctrl,me,images).ic.gr configure -state disabled $xth(ctrl,me,images).ic.gl configure -state disabled -text "gamma 1.00" # $xth(ctrl,me,images).il.ilbox configure -state disabled focus $xth(gui,main) update idletasks } } proc xth_me_image_gamma {imgx gv} { global xth set og $xth(me,imgs,$imgx,gamma) set xth(me,imgs,$imgx,gamma) $gv xth_me_image_set_gamma $imgx xth_me_unredo_action [mc "gamma correction"] \ "xth_me_image_gamma $imgx $og" \ "xth_me_image_gamma $imgx $gv" xth_me_image_update_gamma_scale } proc xth_me_image_update_gamma {} { global xth catch { set iidx [lindex [$xth(ctrl,me,images).il.ilbox curselection] 0] set imgx [lindex $xth(me,imgs,xlist) $iidx] if {[string length $imgx] > 0} { xth_me_image_gamma $imgx [expr pow(10.0,$xth(ctrl,me,images,gamma))] } } } proc xth_me_image_update_gamma_scale {} { global xth set iidx [lindex [$xth(ctrl,me,images).il.ilbox curselection] 0] set imgx [lindex $xth(me,imgs,xlist) $iidx] if {[string length $imgx] > 0} { set xth(ctrl,me,images,gamma) [expr log10($xth(me,imgs,$imgx,gamma))] $xth(ctrl,me,images).ic.gl configure -text [format "gamma %.2f" $xth(me,imgs,$imgx,gamma)] } else { $xth(ctrl,me,images).ic.gl configure -text "gamma 1.00" set xth(ctrl,me,images,gamma) 0 } } proc xth_me_xvi_refresh {} { global xth if {[catch { set todolist $xth(me,imgs,xlist) }]} { return } foreach imgx $todolist { if {[lsearch -exact $xth(me,imgs,xlist) $imgx] < 0} continue if $xth(me,imgs,$imgx,XVI) { set fmtime 0 if {![catch {set fmtime [file mtime $xth(me,imgs,$imgx,ffname)]}]} { if {$fmtime > $xth(me,imgs,$imgx,fmtime)} { set cpos [lsearch -exact $xth(me,imgs,xlist) $imgx] if {$cpos > -1} { set vsb $xth(me,imgs,$imgx,vsb) set gamma $xth(me,imgs,$imgx,gamma) if {$vsb < 0} { set vsb [expr $xth(me,imgs,$imgx,vsb) + 2] } set xpos [expr [lindex $xth(me,imgs,$imgx,position) 0]] set ypos [expr [lindex $xth(me,imgs,$imgx,position) 1]] set root [xth_me_imgs_get_root $imgx] switch [llength $root] { 1 { set ypos [list $ypos [lindex $root 0]] } 3 { set xpos [lindex $root 1] set ypos [list [lindex $root 2] [lindex $root 0]] } 0 {} } set undocmd [format [lindex $xth(me,imgs,$imgx,reload) 0] $cpos] set redocmd [format [lindex $xth(me,imgs,$imgx,reload) 1] "{$xpos $vsb $gamma}" "{$ypos}" $cpos] set xth(me,unredook) 0 eval $undocmd eval $redocmd set xth(me,unredook) 1 } } } } } xth_me_area_auto_adjust } therion/xtherion/controls.txt0000664000175000017500000001521610720735356015527 0ustar useruserКЛÐВИÐТУРÐЫЕ СОКРÐЩЕÐИЯ И ОПЕРÐЦИИ Ð’ РЕДÐКТОРЕ КÐРТ LeftClick - щелчек левой кнопкой мыши Double LeftClick - двойной щелчек левой кнопкой мыши RightClick - щелчек правой кнопкой мыши Double RightClick - двойной щелчек правой кнопкой мыши drag - перетаÑкивание: ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½ÑƒÑŽ кнопку мыши (и/или клавиатуры) перемещайте мышь Общее * Ctrl+Z = отмена дейÑÑ‚Ð²Ð¸Ñ (undo) * Ctrl+Y = вернуть отмененное дейÑтвие (redo) * F9 = компилÑÑ†Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ проекта * Ð”Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° в ÑпиÑках: - перемеÑтитеÑÑŒ к нужному Ñлементу ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "Tab"; - выбирайте нужный Ñлемент ÑпиÑка (он подчеркнут) Ñтрелками; - подтвердите выбор нажатием "Enter" ОблаÑть риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ фоновые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ * RightClick + drag = Ñкроллинг облаÑти риÑÐ¾Ð²Ð°Ð½Ð¸Ñ * Double RightClick на изображении + drag = перемещение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð’Ñтавка Ñкрапа * Ðажмите "Ctrl-r" или "ДейÑтвие" > "Ð’Ñтавить Ñкрап" на панели "Команды в файле" * новый Ñкрап вÑтавлÑетÑÑ Ð² поÑле текущего Ð’Ñтавка точки * Ctrl+P = переключение в режим `вÑтавка точки' * LeftClick = вÑтавка точки в позицию курÑора * Ctrl+LeftClick = вÑтавка точки близко Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ точкой (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * Esc = выйти из режима `вÑтавка точки' Редактирование точки * LeftClick + drag = перемещает точку * Ctrl+LeftClick + drag = перемещение точки близко от ÑущеÑтвующей точки (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * LeftClick + drag над Ñтрелкой = изменение ориентации точки (Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть включена на панели "Точка") Ð’Ñтавка линии * Crtl+L = Ð’Ñтавка новой линии и переход в режим `вÑтавка точек линии' * LeftClick = вÑтавка точки линии в позицию курÑора (без точек ÑглаживаниÑ) * Ctrl+LeftClick = вÑтавка точки линии близко от ÑущеÑтвующей (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * LeftClick + drag = вÑтавка точки линии (Ñ Ñ‚Ð¾Ñ‡ÐºÐ°Ð¼Ð¸ ÑглаживаниÑ) * ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ctrl во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ = перемещает только данную точку ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ * LeftClick + drag на точке ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ = изменение ее позиции * RightClick на одной из предыдущих точек текущей линии в режиме `вÑтавка точек линии' = выбрать ÑущеÑтвующую точку, полезно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ‡ÐµÐº ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ * Esc или LeftClick на поÑледней точке = закончить вÑтавку точек линии * LeftClick на первой точке линии = замкнуть начало линии на конец и выйти из режима вÑтавки Редактирование линии * LeftClick + drag = перемещение точки линии * Ctrl+LeftClick + drag = перемещение точки линии близко от ÑущеÑтвующей (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * LeftClick на точке ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ + drag = перемещение точки ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð”Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ точки к ÑущеÑтвующей линии * выбрать точку перед которой вы хотите вÑтавить новую точку; - перейдите в режим вÑтавки точки (панель "ЛиниÑ") - вÑтавьте точки (Ñм. Ð’Ñтавка линии); - Esc или LeftClick на точке Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы начинали = выход из режима вÑтавки Удаление точки линии * выбрать точку линии которую нужно удалить; нажмите "Править линию" > "Удалить точку" на панели "ЛиниÑ" Зазделение линии * выбрать точку в которой вы хотите разделить линию; нажмите "Править линию" > "Разделить линию" на панели "ЛиниÑ" Ð’Ñтавка облаÑти * "Ctrl-a" или на панели "Команды в файле" нажмите "ДейÑтвие" > "Ð’Ñтавить облаÑть" чтобы переключитÑÑ Ð² режим "выбор границ облаÑти" * LeftClick на линии = Ð»Ð¸Ð½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑетÑÑ Ðº ÑпиÑку границ облаÑти * Esc Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы закончить выбор границ облаÑти Редактировать облаÑть * Выбрать облаÑть Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ * неажать "Ð’Ñтавка" на панели "ОблаÑть" Ð´Ð»Ñ Ð²Ñтавки граничных линий в ÑпиÑок линий поÑле выбраной линии * нажать "Ð’Ñтавить по ИД" Ð´Ð»Ñ Ð²Ñтавки линии Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ идентификатором * нажать "Удалить" Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ линии из ÑпиÑка гранци облаÑти Выбор ÑущеÑтвующего объекта * LeftClick = выбор верхнего объекта * RightClick = перебор объектов закрытых верхним объектом (например полезно, когда неÑколько точек раÑположены в одной позиции друг над другом) therion/xtherion/tools_imgs.tcl0000664000175000017500000013027012275163475016010 0ustar useruserimage create photo compile_img -data { R0lGODlhEAASAPcAAFdVhrLM9LnT9Mfa+c7M+dXh+dXo+ePv+ero1urv+fH2 +QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///ywAAAAAEAASAAAImwABCBxIsKBABQgTKkiQQMGB hwQOKlzo8CFEiQkZJnhowMCBiAAUMgRg8UBHkAgTANi4YEFHAB0NHGR4oKVN lwYKgDywseZNlwUGgKRp06RNADoFPgRgs6PNAQZ2ejTw0+UAoQKnUv15FSvJ lwYGtAwLYIAAkDE7DihQ1qxZtB2Dhr0qwOxZgUHl1qVLIEAAkAQCCx482KBh ggEBADs= } image create photo save_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//////9sAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///////8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAMAALAAAAAASABIAQAjEAIEJHEiwYEE5 tm7ZsmRJkhw3EJOkCGCwokVgk7aBc6NCI7iP4Ha5KUFQiSRL27bZsiVpliRJ SQoAILjSEktJjiC6SaKkhC2CklIK1bZN2y6WSUgOdGNpl9BtCi3dclKC4sAk ThytnPTSoaQiAWZeHCvw1kdLTnaB/LhNjlKBQb8tXPvRVpO3wCTdutXw5UMn SiSGIOjGllq2T0daFehEkq2Uu/aytOWkwOCrciRduyWrr8MkARYDK0G6tOkS IQDgJVswIAA7 } image create photo saveas_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//////9sAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///////8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAMAALAAAAAASABIAQAjXAIEJHEhQYD1r 1gq6uWXrlqVLsfLlq9coSYkCBTNqJGjrGzgnSXaBA5cPH714bUoQVCLH1jaG sWQ5kuMmSYAAHG1NsiVJkiM3bmCZZCeJoKRtSJNmw1cPpRKVA91Y2oVUmz59 +WJJclMAAMESbhzpsmWp51ZJKQDg3EhQG7589hIO7AhOkhOR4PSZhNcKqsCj 28juG/m2XiuLRnfdumRpkqRqE1klQRzVlraRJCVGs+amxFqBTiTdQmpZn1a7 BT4DSyKVoaxGPYEmAUDga4nbuHN79st2Y0AAOw== } image create photo open_img -data { R0lGODlhEgAPANUxAOLKdvryrtG5bPXnnNW+b+7Wffv2ybGaWquUV+nRe2pS MHVeN9/HdIZvQtO8bv375/jspM+3a+DIde/Zg+TXmdnCcdjAcI53Rvz52aWO VL+rbMGpY39oPfLgj9XBe/HeiMWtZe3Wfuvgp8mxaMy0adXChOvZi/Ljlbyl YOXOeJmCTJR9Sfz2utzEc6CIT+3VfLegXf///wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADEALAAAAAASAA8AAAas wBhsSIwZYwALaXMUijCGR+ngUq2uBxXsWKGwNojMQeOhGDCswaqpCaAGrPjD wIKcJq7mwc16BP4DHy+DeUcIJygsBhAdBSGDCSkqTQgvb3cFBS+RABKTRyMo MAMnmi8pAC2qa0cOLjB2mwAMFRYEBKxHDTAnJikSLQQOAsQcTTELLpEMwQIR KA0KCMcXLinMBAIZCwstx0bVqREqCrnfMVUg0Q7nxzAKn+1GQQA7 } image create photo make_img -data { R0lGODlhEAAQAMQfAM/PzyQkJIaGhklJST4+PgoKClVVVR0dHQEBAfn5+ezs 7KOjo5ubm1NTU0ZGRpSUlG9vb2lpaZqamn19fRQUFDo6OjAwMMbGxszMzJ6e nuPj47Ozs8HBwTMzMwAAAP///yH5BAEAAB8ALAAAAAAQABAAAAVw4Pcl4gdR hyAq5dpcX+B5xAc85Np5yEPMA8CskbvMeEfkLFOSJZ+F1uf5LHkChaToWCgc dlUrl+ppJbMfzkI7PS42GNGAPEMwShI64nj/GOhJECMfFR4WH2AGHw4eDjkk Gxofcx4qHxEsUiICMxOaIQA7 } image create photo new_img -data { R0lGODlhEAASAPcAAFdVhrLM9LnT9Mfa+c7M+dXh+dXo+ePv+ero1urv+fH2 +QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///yH5BAEAAP8ALAAAAAAQABIAQAiVAAEIHEhQ4L+D /wAkSHCgoYEDBiIaKFCAgEACGDNq1ChQgUcFCxseAADRgEWSEg0MKDBApUoB Jz9+TKBg5AGLBwGAZCiyZMSKAiH6lNhywICTElmqNCpggACYHWV6XAgAZ06p CxkCiIhT506eEAsGBVuyJMuTDoeqVIq0bMSVRo0iTQmXqdOTLJU2ZUogQICT YgMLDAgAOw== } image create photo edit_img -data { R0lGODlhEgASAPcAABASCC4lJzgvJzgvMUIvJ1ZDMVZNUVZNhGBNMWBNPHRq UYhNJ4hhMZJXPJxDCJxqMaZNCLBhMbCIcLDN97p+PLrX98RhEsR+RsTX985h CM5+W85+Zc6whM7N99hqCNhqPNiSUdjh99jr9+JqJ+KcUeLr9+ySW+yccOyw cOzr1+z19/d+CPeICPeSMfewj/e5j/fDrvfNpPfXuPfhw/fhzffh1/frrvf1 4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///yH5BAEAAP8ALAAAAAASABIAQAjdAA8IHEhQ4L+D C1DYOKCihMMSIl7IqHFiBQsWGSAA+Hegg8ePIEEeOMhQhcmTDg88IBGjhUUW B0qEkOlihgsNDRYgAIChw0iOJ4M2jNmBAQkZLWCifCjiAoiWLzPGhBgixAsa Mk58GGHBAYCfB6qGUCBBQ4IEAjBgqDDBJ0mhQTuOXEDCRouScEscEGEUqUW8 JplSYJn0oge8TF+gaHkRo8apEEWEiHEDhokVKzJ4JSlThOQYNW5GWLAAgFuO YifD2NAAQYC0FU4fwBCCg4IABAyorcA2NtiCwAkeDAgAOw== } image create photo close_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiKAP8JHEiwYMEk ACQJLAGAxLaBJAA8NDhQG8WCEQG0kWRLUkaFBRm2OQigpK2L2iQlSbIRZUmG DgkiHDmwDYBIMhtaLGnQVsmSGQEkuUi0qM2fL08aPFpiosCjTv9J0rgtYkyB 2xrmVPoPIQCL/yI69VmCJAA3Qgv6FKp029S0FLe1YVgyCdeiRQMCADs= } image create photo 2d_img -data { R0lGODlhEAASAPcAAFdVhrLM9LnT9Mfa+c7M+dXh+dXo+ePv+ero1urv+fH2 +QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///ywAAAAAEAASAAAImwABCBxIsKBABQgTKkiQQMGB hwQOKlzo8CFEiQkZJnhowMCBiAAQLlAw0OKBjiBFJgBwgGXHlwYOJljQUuDJ lwVAHphpMebNAgNAMqR58iRIAjltHqAJE8CAAgAM6DSwAGbMAVdBeqx6M6hA Al5dVjXwFKtZAVqpdiw7YIAAt2kXyJ1LF61AoEANvG2LNkCAowQCCx4s2KBh ggEBADs= } image create photo 3d_img -data { R0lGODlhEAASAPcAAFdVhrLM9LnT9Mfa+c7M+dXh+dXo+ePv+ero1urv+fH2 +QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///ywAAAAAEAASAAAIngABCBxIsKBABQgTKkiQQMGB hwQOKjx4YOCBiAAULkwAoKIBAwAwIlywUODDjiBFKljA8CTIjwBAZkyw4CTK gQUwHqD58MBHnwYKDMDIsKZPoB8L5DR5oOZHAwsMDBBqQCfUp1GlSh0q0EBT r1GnDhjLFWXUBWK1DhCA8eOCsELHCljbFurbu3jZChRKda5cAgECYCRAuLBh wwYTEwwIADs= } image create photo up_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiWAP9ts0WQ4L+D CBMebFOCRImGthQiTNfuHwkAGDEmkahQUhIkH0OC3CiRBAEAJ09iPBnJHbmE SRrKlMUxYSSROJFsswcOnL2DthzFESqp5j95RpNazKhRqdOS3KJKlUqpTTlw 4Z4irIiwBFMAJCXa0wd0oFlbZhHaK3cwicO3MkmQKNoxSQoiKZJoU2orTZM0 bdJsSxoQADs= } image create photo bottom_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiqAP8JHCjQVpuD BwkKLGePIICHEJMQREGLFiZalHDRykWpFiZKEhUqLEGiZAkQbgjaA5eOIAmI D0MOvKcwSYmbJG0plKdwmy5rumzpEpmuocijBW0pXcpU506FMGMqBGcUKdGq /17ClCkQ6z9bbtqETWlVoE0SSUgUcSowXTlyVdOSLClJoTuFumRZ0stWIAo4 gAFDgjN4MJsmBK01iuQokhtJbSBLktOIYEAAOw== } image create photo down_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAihAP8JHEjwnzZb CG1pK8hwG4CHJAKQ2MaQoK2HGAHYYpikBJISHZOETDIwHThw2pBw48ZrJcuV TDZWFLitBAmbJUoItCdvn71/kty0EdpmaFFJO//9nMm0qdOBtkgAAAFx4dOZ 8sppy8j14UZ37WZu26ZtLEV74MSSkEqCwESB6ci5Ayqyrt1IA3na24cECRO/ ff8iIem0bpEUhJu2qVv0X0AAOw== } image create photo to_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiNAP8JHEiwoEGB 7eT9s4QkScOHbQ4SdAOgokVJEjNq/GeLBAkCH0ls0yjJ4kWSIACEUEnClj2B L9OV09cGyUOHDTf+22VLly1bu3QmGZpiqNChQyNq7EgCRNOWG7fpuqVr18hy 9uSl+0cOXDoS3MKK5cbGVsF7OkmuBJASqsY2bdy0ceImapISJPAm+RcQADs= } image create photo top_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAilAP/922aroMGD trYJXBipjcM2bhZKlGgLgMWLbSZq3ChR3sRtJEoAEFnClkRy9igywcWypUtc cBot3AaCJIgCkhaWCxduYpISJFKQSKKto76J2mxZU3prYrqUC7UlgROHKhw4 bOKwoYrE5EJJD8OKlaiNAAgSJM7mXAjO48dtu7YplNiW4kWMEttx3KvRFom7 INbuBRt2orujEn+WWFxirkCoAgMCADs= } image create photo selscr_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAitAP8JHEiw4MBb J0qceHOrYcN/AJJsO3HLoC1JBgWSSJJxWxISG0+IPOEG48BttyadMDGgIkQA AEhI0paRoEqKBbe9UVJikkOXDgmWcPPz1seXEf9tI4hS4aSBNNsAqEm1qsBt tgaYMHGiTRuDkki4seXwzZKHAwcsGeDz57+vkyYtFXhCwIm2DZ/ClGiCo7YS DtcK4IgUwFeCKbWemAvAFonDBW+R6AjAjVWqAQEAOw== } image create photo delete_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAjCAP8JHKitTZKD 2wYq/CfpIImDbSK1aUPiYZKF/7QlseiwhCSMSbTZGkmypDZJkQY2nMhSosSJ FxW2SWPp3zZJtradNJhyIIlIcSLJsqXNmi5rliI1avJR4EqWTdpETWIwplOq EyU2arMVJsabaRLaTGIL4z8SJHXZioSzZJum/5JEIirSpEi2KgEkaYQykl+/ bUqQUPi0SZIiJQ5SPUgYycSucVh6HSgLa5zIWllazZiCSBs3Wx21ibwRLsaT OMUqDAgAOw== } image create photo selare_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAjCAP8JHPhv25sl J04cSXhC4LYT9iJKlLbmFokk/yJW/HdkzZElBEMmIRHyhDSJKFE2PGFN4iuQ A0kAAEBCkrWQt07ISinx0RuBt47wtLft3z2JFdfsdNlQoEwARf4t2TbpUUR5 TQcWtQRAW0iHCh1Jk4fyyC6COU/yJCvtyMAlrlLeO1pW4JKlKbe1Marx1qQ1 EY/ee3Vi0j+ZGO0tubVEbcSs/0rMBJBk27YjjhcTrFkihVaI9hb9/PqPMsFJ t0iTDggAOw== } image create photo select_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAhPAP8JHEiwoMGB ABIqtHWwocOCCRk+PFgCgKSJ/yRiRKhQ20YASZIAaLNx4LaE20qqBKDxY8SS Cl9OjJlE0sWHSf6dBKDyXyQAJHre7HkwIAA7 } image create photo sellin_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiXAP8JHEhw4JsT J5bcKkiQ3L82JBgeXJKQoUBJALRZZDhrxKNJS5b8C/lmyQhrBNsAWNlG0saC JybNunXrxMubBfWVsydQJYCIAkHekjXrkciBtgQCcIkzqMJbk2ziXPKolKya TcnNWnLg0U198pji1MlTJVCCt5ZM+keOZ8+VPweeuDWrlNqUSZIAIDiX5l2G Kc4GXdg0IAA7 } image create photo selpt_img -data { R0lGODlhFAASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAAUABIAQAhsAP8JHEiwoEGD 9tqQ2HawYUFJCx0KJDfr1i1n7SQeTAKgoyRbGgXKsxeSILlbDKVlLDmwSUcC DFla+7cNgCSWOAfKI6csWTmW9pJZ3DWLHEt55aw10pZTYBsAEXG67Bg1ZBo3 T5sKLEFCq8OAADs= } image create photo insend_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiDAP8JHEhQoL10 5MrJK0hwWxuGA5eckPgGoi05EDOWS3XLGTmBE98sMWExSUaG9pLdmtSx3cl/ tiS9HGjy5BKWSm7dJGirTRISbWTO/FdO1q1Z5fTNPLiy5VBrycilsze0qtVJ S25l1Cb0H9amJwpybVNCkq1/Om+pDcvQVs2B2yZZDQgAOw== } image create photo inspt_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAinAP8JHEhw4JsT J5ZsK/jPXrJbJdzISsfwVsIlJxgKbGNLo8ZZA5TcWvLm38E3Swa40Ziko8eC JybdmpmRoTxyycoRk/RyIKlirpyBY7jtxC1JbibVHCinDYkkHHsKnLREJkqp /6pGtPhSnr5/RZRgLKmR3CyIpeRhLbfVWTyN295M+pckjr12agVK0jYw5qQS JsgOlCSpRJu9/2LOfCOYYMuCMrH+CwgAOw== } image create photo join_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAieAP8JPLFkyYk3 Av8RNIgwocNtECAwgADDoUWHA968WTLpYsJtu7aJTHht17VtHlNetCVJ0gA3 tzQmPHFrkpIlLVPWYaDSIwwIdVJq2zZ06IBJk5a8KUp0G0uXMGUOrKnERE6B A5YcOTjTIFeVVRho65lQl7YqEP6NJftvJwOxbBNWjPtvwIkTBzpalJSkr98B JUwI9uvXI9I3k25dDAgAOw== } image create photo split_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAimAP8JHPjmxJIl AwYqXPgvXTpw5Ny1Yyhw0pI3BQdaxHiC4sBtAkF6ZGhPn0dJKFMqWeLGzYCU KW15BFduJMOH4OJR1LbNzZJbtzpWfHNr0gltPFFGkhSpjRIVapy8jLTUjSSZ Cx8ZXDLC5kJ38rwuBJdOrEB74NKCM2mWHDmbkwacGJCw4oERB+r+S5LEhAlJ QTUSVTKAbxuBuzC+mTMw8ZtJjwYGBAA7 } image create photo delpt_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiZAP8JHEhQ4K0T CCcVFEhulpsSt8rpW3hiyZITChdq3ChwgIlJb04IrBjSBMeTBCctucXyzRuN 5ZIlI0cG5b9WwJI5KyaP4qRbSlTeIigpidEkkmz+w3hr0oltKG8teXjrTcaF 9uz9k1RiTcWhC9s5u+WmSDmb6RSV+EluI8hblkj8i9duo0uyJUQSbcO3TVKh t2bptdlU6b+AADs= } image create photo insbeg_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAikAP8JzKdPoEGD b06cWLLNIL58B9s0PGjQHjllycpRNNhGG0V6EDfeGjBp0pIl/9yVa5aMnKyN /5LYovgQ5olJt3KecFiQYhuYAvH1bDMTqL5ytyK5kaUxYhsSSYgapNeToslZ t96gDFr14JJJl3DuDBpy45sjJ94cJLhxIkyQQIGiixdXkkeB5G7FkuSsHUVJ kki0sfuvnKycfWHKpCjPXtyDAQEAOw== } image create photo point_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAhCAP8JHEiwoMGB J24pXDLpoMOHECMSvPWmocSLDifdwphw4RuMIEOKHEnwzYklJ05IvLVE4a1J KiOafIOSpM2b/wICADs= } image create photo scrap_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiUAP8JHEiwIMEl bwIMuMWw4a1JS05M2mYwiSSDGAvakpQkgIASAgKQaCPQVsM3J04IyMhy4LY3 tzJKIuHG4cOGLgUsmeSQI4ATJkycSGKL4K03A068acm0acEBEWNitEWihMVb J5IyHIh1QAmeNh0OfBP0RFisQk+4oegmyck3SUpc3Ba14DasSoQ63caRotN/ flsGBAA7 } image create photo text_img -data { R0lGODlhEgASAPcAAAQEBBoaGiQkJC8vLzo6OkRERE9PT1paWmRkZG9vb4SE hJqamqSkpK+vr7q6usTExM/Pz9ra2uTk5Pr6+gAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///yH5BAEAAP8ALAAAAAASABIAQAiPAP8JHEiwoMEF ABI6+Bcg4YAHBgxKFEjgwAICDAwm3AhAwT+IBQVwHBkApEQHHAkINFnQQEIB CjZCYCkwwsYDAhskLBlxYIKNHgdKAMBzosQABhwIWGAQwUgJH3sWZLBRJIAB USVuTAABKE2KGwU6Jfo15siNRQd23VigbYEBZKX+S3CgrsEHM+Uarcn3X0AA Ow== } image create photo area_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAiiAP8JHEjw1qQ3 a95M2iZw0hp7ECPak/VIorwT/xzae4SRoEeP207Ikkhy48IlEeWtmfRR4K03 IE8skgZRXkRpHf89eliSpLQl/06QlHWCocA1J179DBrRFdCWUAVyPLHm0StZ rxLGnNUT4pJbA0+46toUZlBrZCViXEIz5asTR96MqGgP57YjNe1NKwpyyYmv KO3ds5czKluvYKMO9LtG8cCAADs= } image create photo line_img -data { R0lGODlhEgASAPcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH5BAEAAP8ALAAAAAASABIAQAhyAP8JHEhw4K0l kwoW3EbClsJ/205MuvVmycOLGE+UcEMx4ZsBJzRKwkiS4IlbKN+8Iclw5ESM DTEivLVxya2SOCuqPLGtZMRJSm5NOuGzxIklIVnGxPlvKcae/0o4xHjr5CQT REsueSO0KlSSB0+sxBkQADs= } image create photo zoom+_img -data { R0lGODlhEgASAPcAAEdISVZXh3Z2d3Z+f31+nn1+po2VnpWVnpWdnpWdvZ2d pp2drZ2lpqWlpqWltaWlvayltaytxbStvbS1vbS1zLy8xcS8xcTExcTU5MzM zMzM3MzU69TU3NTc5NTc89vc6+Pr++vr6+vr8+vz+/Pz8/Pz+/v7+wAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///yH5BAEAAP8ALAAAAAASABIAQAiTAP8JHEiwoMEA JhKaOMBghEMQAQxKnFiQQIAIHDQ8CEBgIgQCJRx26ACiZAAJFFMWlIAwYQgR JkISmHBQYQmGI0pClJiBI4UNGCIEWKCyqMELFjk+SEnggcKEIxZEPEhCIYIG IUd8mDrQAoGEAgCIBTCgZIELBQN8iDnCgAKdHrgSDADhoc4EHSlW2EjAQQWj KgMCADs= } image create photo zoom-_img -data { R0lGODlhEgASAPcAAEdISVZXh3Z2d3Z+f31+nn1+ppWdvZ2drZ2dtaWltaWl vayltaytxbStvbS1vbS1zLy8xcS8xcTExcTU5MzMzMzM3MzU69TU3NTc89vc 6+Pr++vz+/Pz8/Pz+/v7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///yH5BAEAAP8ALAAAAAASABIAQAiGAP8JHEiwoMEA HhIq3MBQQwCDECMWJBCAwYUKCgIQiLiAQAeGDTU4bCCxZMEGCBUm/EjAwUGF H0M6hEhB4wMLExgEQGCyp0EJFDUqKElAgUoPGw48PMjhaMwMSwdGIJBQAICr AAaILCChYIAMHmJuEKkBQ1SCARbI1GBgo0QIGQkkgODTZEAAOw== } image create photo undo_img -data { R0lGODlhEAASAMZWAAtL0AtN0QtN0gxN0AtN0wxN0QtN1AtO0wtO1AtP1AtP1Q1P0wtQ1gtQ1wtR 1wpS2ApS2QtS1wpT2ApT2QtT2QtU2QtU2gtV2gtW2wtX2wxX2gtY2wtY3AxY2gtZ3AtZ3Qta3Ata 3Qpb3wtb3wtb4Apd4A1d3Qpe4gpg4gpg4wph4wpi5A5i4Qtj5Atl5Atm5Qxm5Qtn5Qto5gxo5gtp 5g1p5Axq5wtr6Atr6Qts6Qtt6Qtu6gxu6Axu6Qpv6wtv6gtv6wpw7Atw6wxw6gpx7Apx7Qpz7Qtz 7Ap07gp17Qp37wt47wt77wt88At98At+8At+8QuA8QuB8gyD8QuE8guF8v////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////yH5 BAEKAH8ALAAAAAAQABIAAAdtgH+Cg4SFhoeIiYqLghcTDgoHAQUDiB4YFRAOCQYCAIcjIRwYFg8N CQQBjBQSDAiMf44RhzWFHxsWhj03hCwkIyCFR0FAOjYzMC0qJyOETktJRT4/OTQxLiuGUE1LSERC OzgyiFFPsIJV5+qwgQA7 } image create photo redo_img -data { R0lGODlhEAASAMZWAAtL0AtN0QtN0gxN0AtN0wxN0QtN1AtO0wtO1AtP1AtP1Q1P0wtQ1gtQ1wtR 1wpS2ApS2QtS1wpT2ApT2QtT2QtU2QtU2gtV2gtW2wtX2wxX2gtY2wtY3AxY2gtZ3AtZ3Qta3Ata 3Qpb3wtb3wtb4Apd4A1d3Qpe4gpg4gpg4wph4wpi5A5i4Qtj5Atl5Atm5Qxm5Qtn5Qto5gxo5gtp 5g1p5Axq5wtr6Atr6Qts6Qtt6Qtu6gxu6Axu6Qpv6wtv6gtv6wpw7Atw6wxw6gpx7Apx7Qpz7Qtz 7Ap07gp17Qp37wt47wt77wt88At98At+8At+8QuA8QuB8gyD8QuE8guF8v////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////yH5 BAEKAH8ALAAAAAAQABIAAAdtgH+Cg4SFhoeIhlWJhk9RiDI4O0JESEtNUIYrLjE0OT8+RUlLToQj JyotMDM2OkBBR4UgIyQshDc9hhYbH4U1hxETF4yDCAwSFMR/AQQJDQ8WGBwhI4cAAgYJDhAVGB6I AwUBBwoOwsro6erpgQA7 } therion/xtherion/tools.tcl0000664000175000017500000002463412276154431014770 0ustar useruser# - dzach add toolbar set xth(tb,me,action) 0 set xth(gui,tb) $xth(gui,main).tb set allapps {te me cp} option add *tb*relief flat option add *tb*overRelief groove option add *tb*padx 0 option add *tb*indicatorOn off option add *tb*offRelief flat option add *tb*Button.width 20 option add *tb*Button.height 20 option add *tb*Radiobutton.width 18 option add *tb*Radiobutton.height 18 option add *edif*relief flat option add *edif*overRelief groove option add *edif*padx 0 option add *edif*indicatorOn off option add *edif*offRelief flat option add *edif*Button.width 20 option add *edif*Button.height 20 option add *edif*Radiobutton.width 18 option add *edif*Radiobutton.height 18 option add *movf*relief flat option add *movf*overRelief groove option add *movf*padx 0 option add *movf*indicatorOn off option add *movf*offRelief flat option add *movf*Button.width 20 option add *movf*Button.height 20 frame $xth(gui,tb) -relief raised -bd 1 -padx 5 pack $xth(gui,tb) -side top -anchor nw -fill x frame $xth(gui,tb).filf button $xth(gui,tb).newb -image {new_img} \ -command { switch -- $xth(app,active) { te { xth_te_new_file } me { xth_me_create_file } cp { xth_cp_new_file } } } xth_status_bar {te me cp} $xth(gui,tb).newb [mc "New file"] button $xth(gui,tb).openb -image {open_img} \ -command { switch -- $xth(app,active) { te { xth_te_open_file 1 {} 0 } me { xth_me_open_file 1 {} 1 } cp { xth_cp_open_file {} } } } xth_status_bar $allapps $xth(gui,tb).openb [mc "Open file"] button $xth(gui,tb).saveb -image {save_img} \ -command { switch -- $xth(app,active) { te { if {$xth(te,fcurr) >= 0} { xth_te_save_file 0 [lindex $xth(te,flist) $xth(te,fcurr)] } } me { xth_me_save_file 0 } } } xth_status_bar {te me cp} $xth(gui,tb).saveb [mc "Save file"] button $xth(gui,tb).savasb -image {saveas_img} \ -command { switch -- $xth(app,active) { te { if {$xth(te,fcurr) >= 0} { xth_te_save_file 1 [lindex $xth(te,flist) $xth(te,fcurr)] } } me { xth_me_save_file 1 } cp { xth_cp_save_as } } } xth_status_bar {te me cp} $xth(gui,tb).savasb [mc "Save file as"] button $xth(gui,tb).closeb -image {close_img} \ -command { switch -- $xth(app,active) { te { xth_te_close_file } me { xth_me_close_file } cp { xth_cp_close_file } } } xth_status_bar {te me cp} $xth(gui,tb).closeb [mc "Close file"] label $xth(gui,tb).sp01 -relief groove -width 0 -padx 0 -pady 0 -bd 1 frame $xth(gui,tb).unredof button $xth(gui,tb).undob -image {undo_img} -state disabled \ -command { switch -- $xth(app,active) { me { xth_me_unredo_undo } default { xth_app_clipboard redo } } } xth_status_bar $allapps $xth(gui,tb).undob [mc "Undo"] button $xth(gui,tb).redob -image {redo_img} -state disabled \ -command { switch -- $xth(app,active) { me { xth_me_unredo_redo } default { xth_app_clipboard redo } } } xth_status_bar $allapps $xth(gui,tb).redob [mc "Redo"] label $xth(gui,tb).sp01x -relief groove -width 0 -padx 0 -pady 0 -bd 1 frame $xth(gui,tb).winf button $xth(gui,tb).edb -image {edit_img} \ -command { xth_app_show te } xth_status_bar $allapps $xth(gui,tb).edb [mc "Switch to text editor"] button $xth(gui,tb).e2db -image {2d_img} \ -command { xth_app_show me } xth_status_bar $allapps $xth(gui,tb).e2db [mc "Switch to map editor"] button $xth(gui,tb).cpb -image {compile_img} \ -command { xth_app_show cp } xth_status_bar $allapps $xth(gui,tb).cpb [mc "Switch to compiler"] label $xth(gui,tb).sp02 -relief groove -width 0 -padx 0 -pady 0 -bd 1 frame $xth(gui,tb).makf button $xth(gui,tb).makeb -text "Make" -image {make_img} \ -command { xth_app_make } xth_status_bar $allapps $xth(gui,tb).makeb [mc "Compile"] label $xth(gui,tb).sp03 -relief groove -width 0 -padx 0 -pady 0 -bd 1 frame $xth(gui,tb).self radiobutton $xth(gui,tb).selb -text "Select" -image {select_img} \ -variable xth(tb,me,action) -value 0 \ -command { xth_me_cmds_set_mode 0 } -state disabled xth_status_bar me $xth(gui,tb).selb [mc "Switch to select mode"] button $xth(gui,tb).selscrb -text "Select scrap" -image {selscr_img} \ -command { xth_me_cmds_set_mode 0 xth_me_ss_next_cmd 4 } -state disabled xth_status_bar me $xth(gui,tb).selscrb [mc "Select next scrap"] button $xth(gui,tb).selarrb -image {selare_img} \ -command { xth_me_cmds_set_mode 0 xth_me_ss_next_cmd 6 } -state disabled xth_status_bar me $xth(gui,tb).selarrb [mc "Select next area"] label $xth(gui,tb).sp1 -relief groove -width 0 -padx 0 -pady 0 -bd 1 frame $xth(gui,tb).edif button $xth(gui,tb).edif.zoo+b -image {zoom+_img} \ -command { if {$::xth(me,zoom)*2 > 400} return xth_me_area_zoom_to [expr {$::xth(me,zoom) * 2}] } -state disabled xth_status_bar me $xth(gui,tb).edif.zoo+b [mc "Zoom in"] button $xth(gui,tb).edif.zoo-b -image {zoom-_img} \ -command { if {$::xth(me,zoom)/2 < 25} return xth_me_area_zoom_to [expr {$::xth(me,zoom) / 2}] } -state disabled xth_status_bar me $xth(gui,tb).edif.zoo-b [mc "Zoom out"] label $xth(gui,tb).edif.spZoom -relief groove -width 0 -padx 0 -pady 0 -bd 1 button $xth(gui,tb).edif.scb -image {scrap_img} \ -command { xth_me_cmds_create_scrap {} 1 "" "" xth_ctrl_scroll_to me scrap xth_ctrl_maximize me scrap } -state disabled xth_status_bar me $xth(gui,tb).edif.scb [mc "Insert new scrap"] radiobutton $xth(gui,tb).edif.ptrb \ -image {point_img} -indicatoron off \ -variable xth(tb,me,action) -value 1 \ -command {xth_me_cmds_set_mode 1} -state disabled xth_status_bar me $xth(gui,tb).edif.ptrb [mc "Insert new point"] radiobutton $xth(gui,tb).edif.lnrb \ -image {line_img} -indicatoron off \ -variable xth(tb,me,action) -value 2 \ -command { xth_me_cmds_create_line {} 1 "" "" "" xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } -state disabled xth_status_bar me $xth(gui,tb).edif.lnrb [mc "Insert new line"] radiobutton $xth(gui,tb).edif.arrb \ -image {area_img} -indicatoron off \ -variable xth(tb,me,action) -value 3 \ -command { xth_me_cmds_create_area {} 1 "" "" "" xth_ctrl_scroll_to me ac xth_ctrl_maximize me ac } -state disabled xth_status_bar me $xth(gui,tb).edif.arrb [mc "Insert new area"] button $xth(gui,tb).edif.txrb \ -image {text_img} \ -command { xth_me_cmds_create_text {} 1 "\n" "1.0" xth_ctrl_scroll_to me text xth_ctrl_maximize me text focus $xth(ctrl,me,text).txt } -state disabled label $xth(gui,tb).sp2 -relief groove -width 0 -padx 0 -pady 0 -bd 1 frame $xth(gui,tb).movf button $xth(gui,tb).movf.topb -text "top" -image {top_img} \ -command {xth_me_cmds_move_up {}} button $xth(gui,tb).movf.upb -text "Up" -image {up_img} \ -command {xth_me_cmds_move_up {}} button $xth(gui,tb).movf.dob -text "Down" -image {down_img} \ -command {xth_me_cmds_move_down {}} button $xth(gui,tb).movf.botb -text "Bottom" -image {bottom_img} \ -command {xth_me_cmds_move_down {}} button $xth(gui,tb).movf.tob -text "To" -image {to_img} \ -command {xth_me_cmds_move_to {} {}} button $xth(gui,tb).deb -image {delete_img} \ -command {xth_me_cmds_delete {}} -state disabled xth_status_bar me $xth(gui,tb).deb [mc "Delete selected object"] label $xth(gui,tb).sp3 -relief groove -width 0 -padx 0 -pady 0 -bd 1 # - file icons pack $xth(gui,tb).filf -side left pack $xth(gui,tb).newb $xth(gui,tb).openb $xth(gui,tb).saveb $xth(gui,tb).savasb \ $xth(gui,tb).closeb \ -side left -anchor center -in $xth(gui,tb).filf pack $xth(gui,tb).sp01 -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).filf # - undo/redo icons pack $xth(gui,tb).unredof -side left pack $xth(gui,tb).undob $xth(gui,tb).redob -side left -anchor center -in $xth(gui,tb).unredof pack $xth(gui,tb).sp01x -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).unredof # - window icons pack $xth(gui,tb).winf -side left pack $xth(gui,tb).edb $xth(gui,tb).e2db $xth(gui,tb).cpb \ -side left -anchor center -in $xth(gui,tb).winf pack $xth(gui,tb).sp02 -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).winf # - make icons pack $xth(gui,tb).makf -side left pack $xth(gui,tb).makeb \ -side left -anchor center -in $xth(gui,tb).makf pack $xth(gui,tb).sp03 -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).makf # - move icons # pack $xth(gui,tb).movf -side right -anchor nw pack $xth(gui,tb).movf.topb $xth(gui,tb).movf.botb $xth(gui,tb).movf.tob \ $xth(gui,tb).movf.upb $xth(gui,tb).movf.dob \ -side left -anchor center # - select icons pack $xth(gui,tb).self -side right -anchor nw pack $xth(gui,tb).selb \ -side left -anchor center -in $xth(gui,tb).self pack $xth(gui,tb).selscrb $xth(gui,tb).selarrb \ -side left -anchor center -in $xth(gui,tb).self pack $xth(gui,tb).sp3 -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).self pack $xth(gui,tb).deb \ -side left -anchor center -in $xth(gui,tb).self #pack $xth(gui,tb).sp1 -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).self # - edit icons pack $xth(gui,tb).edif -side right pack $xth(gui,tb).edif.zoo+b $xth(gui,tb).edif.zoo-b -side left -anchor center pack $xth(gui,tb).edif.spZoom -padx 7 -pady 5 -fill y -side left -anchor center pack $xth(gui,tb).edif.scb $xth(gui,tb).edif.ptrb $xth(gui,tb).edif.lnrb $xth(gui,tb).edif.arrb \ -side left -anchor center pack $xth(gui,tb).sp2 -padx 7 -pady 5 -fill y -side left -anchor center -in $xth(gui,tb).edif proc xth_tools_me_enable {} { global xth set tools [list \ $xth(gui,tb).deb $xth(gui,tb).selb $xth(gui,tb).selscrb $xth(gui,tb).selarrb \ $xth(gui,tb).edif.zoo+b $xth(gui,tb).edif.zoo-b \ $xth(gui,tb).edif.scb $xth(gui,tb).edif.ptrb $xth(gui,tb).edif.lnrb $xth(gui,tb).edif.arrb \ ] if {$xth(me,fopen)} { foreach tl $tools { $tl configure -state normal } } else { foreach tl $tools { $tl configure -state disabled } } } proc xth_tools_toggle {} { global xth set xth(gui,toolbar) [expr !$xth(gui,toolbar)] if $xth(gui,toolbar) { catch { pack $xth(gui,tb) -side top -anchor nw -fill x -before $xth(gui,main).$xth(app,active) } } else { catch { pack forget $xth(gui,tb) } } }therion/xtherion/global.tcl0000664000175000017500000004161112330252441015051 0ustar useruser## ## global.tcl -- ## ## Global variables definition. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- package require msgcat catch {namespace import ::msgcat::mc} if {[string equal -nocase [::msgcat::mclocale] c]} { ::msgcat::mclocale en } set xth(destroyed) 0 set xth(prj,name) "therion" set xth(prj,title) "therion user interface" set xth(gui,main) ".xth" set xth(gui,about) ".xth_about" set xth(gui,bacw) ".xth_bac" set xth(gui,dbg) ".xth_dbg" set xth(gui,help) ".xth_help" set xth(gui,message) ".xthmsg" #set xth(gui,minsize) {480 300} set xth(gui,minsize) {720 576} set xth(gui,balloons) 0 set xth(gui,toolbar) 1 set xth(te,template) {} set xth(kb_control) Control set xth(kb_meta) Meta set xth(gui,compshow) 0 set xth(gui,compcmd) "therion" set xth(gui,appctrlcmd) {} set xth(gui,auto_save) 0 set xth(gui,auto_backup) 0 set xth(gui,auto_backup_ext) "~" set xth(gui,check_update) 1 set xth(encodings) { iso8859-1 iso8859-2 iso8859-5 iso8859-7 utf-8 cp1250 cp1251 cp1252 cp1253} set xth(kbencodings) {utf-8 iso8859-1 iso8859-2 cp1250 cp1251 macCentEuro unicode} if {[lsearch -exact $xth(kbencodings) [encoding system]] < 0} { lappend xth(kbencodings) [encoding system] } set xth(length_units) {m cm in ft yd} set xth(angle_units) {deg min grad} set xth(point_types) {} set xth(line_types) {} set xth(scrap_projections) {plan elevation extended none} set xth(app,te,filetypes) { {{Therion files} {.th}} {{2D therion files} {.th2}} {{All files} {*}} } set xth(app,te,fileext) {.th} set xth(app,me,filetypes) { {{Therion 2D files} {.th2}} {{Therion files} {.th}} {{All files} {*}} } set xth(app,cp,filetypes) { {{Therion config files} {thconfig*}} {{Therion config files } {.thcfg .thconfig}} {{All files} {*}} } set xth(icmds) {survey} set xth(cmds) {scrap centerline grade line area map layout surface} set xth(datafmt,unknown) {4s} set xth(datafmt,station) {4s} set xth(datafmt,length) {6.2fx {-}} set xth(datafmt,counter) {6.2f {-}} set xth(datafmt,bearing) {5.1fx {-}} set xth(datafmt,gradient) {{5.1fx} {up down -}} set xth(datafmt,depth) {6.2fx {-}} set xth(datafmt,dimensions) {4.1fx {-}} set xth(gui,initdir) "" set xth(app,active) "" set xth(app,list) {} set xth(app,all,tbwidth) 256 set xth(app,all,relw) 380 set xth(app,all,wmwd) 180 set xth(app,all,wpsw) 1 set xth(app,fencoding) utf-8 set xth(app,sencoding) utf-8 # autodetect some options frame .def scrollbar .def.scrollbar text .def.text if {[catch {.def.text configure -undo 1}]} { set xth(gui,text_undo) 0; } else { set xth(gui,text_undo) 1; } label .def.label set xth(gui,sbwidth) [.def.scrollbar cget -width] set xth(gui,sbwidthb) [.def.scrollbar cget -borderwidth] set xth(gui,lfont) [.def.label cget -font] set xth(gui,efont) [.def.text cget -font] set xth(gui,ecolorbg) black set xth(gui,ecolorfg) green set xth(gui,escolorbg) black set xth(gui,escolorfg) red set xth(gui,ecolorselbg) green set xth(gui,ecolorselfg) black set xth(gui,selfg) white set xth(gui,selbg) darkBlue set xth(gui,etabsize) 2 set xth(gui,controlk) Ctrl set xth(import,size) 1024.0 set xth(import,mind) 8.0 set xth(import,dxf,scale) 1.0 set xth(import,dxf,cs) {} set xth(import,svg,scale) 1.0 set xth(import,svg,cs) {} set xth(import,default,scale) {} set xth(import,default,cs) {} set xth(gui,xvi_grid_clr) #00D0D0 set xth(gui,xvi_walls_fptn) gray12 set xth(gui,xvi_walls_fclr) gray80 set xth(gui,xvi_walls_oclr) gray60 set xth(gui,xvi_shot_clr) gray50 set xth(gui,xvi_station_fclr) black set xth(gui,xvi_station_oclr) black set xth(gui,xvi_station_size) 3.0 set xth(gui,xvi_sketch_line_width) 1 set xth(gui,me,nozoom) 1 destroy .def # end of options autodetection # map editor settings # translate types in dropdown menus set xth(gui,me,type_dropdown_trans) 1 # reset options string on type change set xth(gui,me,type_reset_options) 1 ######################################### # SCRAP # size of scrap scaling square set xth(gui,me,scrap,psize) 4 ######################################### # POINT # size of point set xth(gui,me,point,psize) 4 ######################################### # LINE # size of line point set xth(gui,me,line,psize) 4 # line width set xth(gui,me,line,width) 3 # size of line control point set xth(gui,me,line,cpsize) 4 # width of line between point and control point set xth(gui,me,line,clwidth) 2 # size of start line tick set xth(gui,me,line,ticksize) 15 # width of start line tick set xth(gui,me,line,tickwidth) 3 set xth(gui,me,activefill) red set xth(gui,me,pasivefill) blue set xth(gui,me,controlfill) blue set xth(gui,me,highlightfill) cyan set xth(gui,me,typelistwidth) 16 set xth(gui,rmb) 3 set xth(gui,bindinsdel) 1 # platform dependend settings case $tcl_platform(platform) { unix { set xth(gui,sbwidth) 9 set xth(gui,sbwidthb) 1 set xth(gui,efont) {fixed -20} set xth(gui,platform) unix set xth(gui,cursor) top_left_arrow set xth(gui,compshow) 1 if {[string equal $tcl_platform(os) Darwin]} { set xth(kb_meta) Meta set xth(kb_control) Alt set xth(gui,controlk) Cmd set xth(gui,platform) macintosh set xth(gui,cursor) arrow set xth(gui,bindinsdel) 0 } } windows { package require registry set xth(win32registry) {HKEY_LOCAL_MACHINE\SOFTWARE\Therion} if {[catch { set xth(gui,compcmd) "\"[file join [registry get $xth(win32registry) InstallDir] therion.exe]\"" }]} { set xth(win32registry) {HKEY_CURRENT_USER\SOFTWARE\Therion} catch { set xth(gui,compcmd) "\"[file join [registry get $xth(win32registry) InstallDir] therion.exe]\"" } } catch { if {[registry get {HKEY_LOCAL_MACHINE\SOFTWARE\Therion} AppCtrl]} { set xth(gui,appctrlcmd) "[file join [registry get $xth(win32registry) InstallDir] bin appctrl.exe]" } } regsub -all {\/} $xth(gui,compcmd) {\\\\} xth(gui,compcmd) set xth(gui,efont) "Courier 16 roman bold" set xth(gui,platform) windows set xth(gui,cursor) arrow set xth(app,sencoding) [encoding system] set xth(gui,bindinsdel) 0 if {[catch { set fid [open "|cmd.exe /c" r] read $fid; close $fid }]} { set xth(gui,compcmd) "command.com /c $xth(gui,compcmd)" } else { set xth(gui,compcmd) "cmd.exe /c $xth(gui,compcmd)" } } macintosh { set xth(kb_meta) Meta set xth(kb_control) Alt set xth(gui,controlk) Cmd set xth(gui,platform) macintosh set xth(gui,cursor) arrow set xth(gui,bindinsdel) 0 set xth(app,sencoding) utf-8 } } case $tcl_platform(os) { Darwin { set xth(gui,rmb) 2 } } # end of platform dependend settings # words to translate set tmp [mc "theme basic-symbols"] set tmp [mc "theme passage-fills"] set tmp [mc "theme speleothems"] set tmp [mc "theme equipement"] set xth(me,themes) { {theme basic-symbols} {point gradient} {point height} {point passage-height} {point entrance} {point label} {point station} {point continuation} {point water-flow} {point air-draught} {line wall} {line chimney} {line ceiling-step} {line floor-step} {line pit} {line floor-meander} {line ceiling-meander} {line contour} {line label} {line overhang} {line water-flow} {area water} {area sump} {area bedrock} {theme passage-fills} {point blocks} {point archeo-material} {point clay} {point debris} {point breakdown-choke} {point flowstone-choke} {point low-end} {point narrow-end} {point guano} {point ice} {point paleo-material} {point pebbles} {point raft} {point raft-cone} {point root} {point sand} {point snow} {point vegetable-debris} {point water} {line border} {line border:invisible} {line rock-border} {line rock-edge} {area blocks} {area clay} {area debris} {area ice} {area pebbles} {area sand} {area snow} {theme speleothems} {point anastomosis} {point aragonite} {point cave-pearl} {point crystal} {point curtain} {point disk} {point flowstone} {point flute} {point gypsum} {point gypsum-flower} {point helictite} {point karren} {point moonmilk} {point pillar} {point popcorn} {point rimstone-dam} {point rimstone-pool} {point scallop} {point soda-straw} {point stalactite} {point stalagmite} {point wall-calcite} {line flowstone} {line moonmilk} {area flowstone} {area moonmilk} {theme equipement} {point anchor} {point bridge} {point camp} {point fixed-ladder} {point no-equipment} {point rope} {point rope-ladder} {point steps} {point traverse} {line rope} } set xth(about,image_data) { R0lGODlhwACQAOcAAAAAAAAAVQAAqgAA/wAkAAAkVQAkqgAk/wBJAABJVQBJ qgBJ/wBtAABtVQBtqgBt/wCSAACSVQCSqgCS/wC2AAC2VQC2qgC2/wDbAADb VQDbqgDb/wD/AAD/VQD/qgD//yQAACQAVSQAqiQA/yQkACQkVSQkqiQk/yRJ ACRJVSRJqiRJ/yRtACRtVSRtqiRt/ySSACSSVSSSqiSS/yS2ACS2VSS2qiS2 /yTbACTbVSTbqiTb/yT/ACT/VST/qiT//0kAAEkAVUkAqkkA/0kkAEkkVUkk qkkk/0lJAElJVUlJqklJ/0ltAEltVUltqklt/0mSAEmSVUmSqkmS/0m2AEm2 VUm2qkm2/0nbAEnbVUnbqknb/0n/AEn/VUn/qkn//20AAG0AVW0Aqm0A/20k AG0kVW0kqm0k/21JAG1JVW1Jqm1J/21tAG1tVW1tqm1t/22SAG2SVW2Sqm2S /222AG22VW22qm22/23bAG3bVW3bqm3b/23/AG3/VW3/qm3//5IAAJIAVZIA qpIA/5IkAJIkVZIkqpIk/5JJAJJJVZJJqpJJ/5JtAJJtVZJtqpJt/5KSAJKS VZKSqpKS/5K2AJK2VZK2qpK2/5LbAJLbVZLbqpLb/5L/AJL/VZL/qpL//7YA ALYAVbYAqrYA/7YkALYkVbYkqrYk/7ZJALZJVbZJqrZJ/7ZtALZtVbZtqrZt /7aSALaSVbaSqraS/7a2ALa2Vba2qra2/7bbALbbVbbbqrbb/7b/ALb/Vbb/ qrb//9sAANsAVdsAqtsA/9skANskVdskqtsk/9tJANtJVdtJqttJ/9ttANtt Vdttqttt/9uSANuSVduSqtuS/9u2ANu2Vdu2qtu2/9vbANvbVdvbqtvb/9v/ ANv/Vdv/qtv///8AAP8AVf8Aqv8A//8kAP8kVf8kqv8k//9JAP9JVf9Jqv9J //9tAP9tVf9tqv9t//+SAP+SVf+Sqv+S//+2AP+2Vf+2qv+2///bAP/bVf/b qv/b////AP//Vf//qv///yH+CHh0aGVyaW9uACwAAAAAwACQAAAI/gABCBxI sKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJ sqXLjyRiloj5sqbNlDJJlJg586bPnxx1liiSpKjRJD2BKl0KUWfRNm0kQW1T lCbTq1gL6kSSJI4kSbZsfaWaxGpWADFJoD1rk0SKJG7AapurS6wbpGrPOsWb Ny9bnDvbOLKlbdu/bXPFIi3BtsTRpGv/ooyZJKotw/8yI7ZF1S/TvVOL7pzp WXJHx5bDFtb2LbPrw9tsRSqblUTluF/dkC1b2jTHymB1bdu27zXmf/sQz+7t U2iSSGHDSooUOilz3xOfgr083Hhh19rE/raB/FMm8NXRx3ZOq/Y69oW2K0cF ixmha8RSyd/MCXy4YYH/jHUUUmXp915C8UHVyHaFCSSTQbBpI0sTBrbl2Hn/ DTTdXVJBZRRp7h0IgFHzbdfdQsOFJwleTJXAFVRz/WOQdtOFJppZ73n2FG6q +ScJQaX9s5olbhAR4kt7JVHYNm0cVCBY6lXF2FU4akUQjWH5t81C2mgW3l1H 1uQcd0kglFds4lG1k1lhmrQXZOwBAIJAqEkiC2HbfJOhmSV4KV4RbMl0mTYM babYYjrR1CZJSVaV00xzoiWfXMP5k5lCBJDgp5qSkaAaoe0d5MZm+ZHAlWNr IplgG414KNpO/gAUAAABddoi3Gs/IlhcYdbkR4BpX3G3TSQLiXcUWUUsGhJq uEXp6EC1XqZZsd5JVVYAps3HnYzFdqhbaL09mlZkHNUZnHQexhSpbaxaguel C7nWmja6SNJEsr5Nyh1D0gUroH6NLpaqRjqlhp4turEYa63dwauQa8mFpeav pkW75UJtRKdxwnBeGFUbbnxrVJUSsZvxZfvoGZu1UwLgWBpyyCJccf80Ga+f kqSRgrLlAXfZQ4Ou3JlWwG2Xq40kO6RTE45YYs02ugh0i9BI0VlUXMI+dJ+x LfvGLn0QwSYxbQRFS6iGkiRMdlNPZcmtQCqS9evXtjz9dkOH7ROe/iP38vxT rWc75A9icZcJpM8NDqTNLVxHFJ+JewIgtJrsNuLuiVqTymmOTkUV3kNtaNb4 QHRHTrh4FR7UuYmZGS7QytY+ZZlw3zTykGHfaEPk2ti15zNmNjdEmCWbO4jh 3RFauyjdgx5UOInB2vKQJPcV7rdSpbsGkfWk/4682CvybmZRkdB3sUHGlrVj WGG7pg/VFIvocmXv3l1o+uYdT5BmVIfp2FdLst9AGhefOMisfZlJzIqutxSG Ra5QKxtQ25Z0pcOEhzPiMwjDtHcQWVhLICCwTSRkETy8ZUZPEhqa/Ixnmfrc Dk1qKwrMZDacg1xGMalDSwnSYD4Ooi8O/uuJz0Tu078VDgRxDmuIoahToKIE axv+QIjQUkcZzx1HgAKJnXMo4j6oWStSK4yJZb4TNlKxqHSBK4iQMNi1giDu igiJHRIuxEXk6OkW1opfGJ+zLYi0AT93mVLBzIeQJESwQqhxm2tcVxAg8uYt bZDDEP/Rmm30ajxG7B50pDWR6VRlfkmg1ELSlkGn9FB6CqGcpMZYQoZUazwM bCBcCNMliqwICWlJJGEYUiqitTCJCOFUCH93PhPuql4qNKJj3NDHiahydYlT CMv8YkpJfAeLbiRb6YrpSvCkMAlglN82sTnK4pWOX7HjiXa2xU0nWeeNEIkE JcWWTHG+kZwH/mlDYjaXKcQxREWxuw19WANMJ5EgUoDDZ0IMo6KqKfOeEEmR bIY2EwwVSoEbKt+2fJiQsoCAVuuMZkQKg7o25giiLwxLwvryu24aKjqIuaJC R9Qej4HlaRRJji6I51B7WrGgCiFVIHvCMIYkIUIxvaalMoMEo/KEKPqay0Tk qaJ76fE9y5TE1IC6UGvgr6ItRcluUHU1awJvImMzqW/qdM3tGQuX5hljO0fi KhL8yoFcRWdnwmkap0CnrUDTIrTgiRLBWi1jdpupFI2VNL2UoA3QialiBSKW 8HlmmykRSxPWRjcyTsQNhcshVv4nrbwO5I+hJd38omK3zE6ThfQx/q3wWNa7 xzKzYa7UXNd2Ih88RREljD3oKmM7WYWIJwW9I6ZsAWBB2RSFdDZt5kkIWMXL eWMfGFEpI/8COBcGlWq0AatlpvZAkozuQuYrr0Qi6LXH/nWpMz3M6EAKFeIK CSXasBZcGebZiqRoRV7zHkftMxflda++tHzNPxiJBH44+MFNBdKDHxwmr7aq KG9BXJeKW5DQNRfAndrggA+iOc4WDU8b5uiEJ1yQFT/4n4ciUCglkVgO749/ zq0Y+d7l3YUW8bBYC9prCOJiB7e4yPzaHWmIIGAbD6R6UiFCX+nH45pB0C5V G2YS0lBfdxWGZndDB5IJImYXF4uxDnos/qUsNZHjxC2WK3mcLcibxniZ0XDx kZ2JUkwQcPgZHyzu858DbRBNlTgvtGoCpdSbEA9nJjlf6mltEglYh4BvPRcq ClfishqO+tnPhBbIp8ER6htv5i4o6Itt4mArzFnaO6iDM2DkymatkbRDEpyj gCM36lL3+sUH8ROYBgICtkKRw4+m5KnLctWrkHZbrcSYkCa35dBARaMNuy8A gPFpQD8YGwMBBwA+TQ4HXyeB2yBl17KHbCI6V7TN6W5j+WUXqkxlKk+8poL3 ve8EiNvSwwmuQPrJWlc3JGUSNTB3MSRpiUQJ3+VbNL8nvm+I5E5o+CJdEVpY a4egUEWR0Blf/rFSOoWhNaDa6pFMKT7xiCqw4cWOCu04vA1vALSeeqFfuh1U kYkmAZIGI05rWM7y7Rp3jSQUnym/Y/SEHMxD8C4PaqxEkfQJlD6oFImhp61Z I2lFzbJ4yFEpqTc0B7iV8+5W7KCCtTqDxEuxSbpdvx6V9n1DH9qwhpJz9Ni0 Ay1N0PsZSbwUnjborDQBYFfWjXlrqhzIZG5QLUUyJgk5dMZniw8Jzp5FTZ+1 73QKX2vRciXrLJKlvmApyYcDGam7yjlqWlN2aEuvks7FpSNq01ZJTtcICnmm 2Fdz2lwTYseAW8vrfU0QWHiSEVc9J/UkOfSs6EQCorRw+PbZhzcs/mkJ5dG+ 9lj6PgBYVl9ZWCL6DS2BHnkrh4E2nfgfJov4QeIec+Ep2g7vEMg0+inEvAb/ 6xVplxUtE/ENehMbVJFxnJMaBld1XyEVEBg9KDZ0TuY8+TVsaZYEirZLBYh3 Zsc5JIBgnHQR/aJ/JdIjlWYR3EN9wCEcXFRi4lRF14d9DnEyAiIfbsB/2ZYR nhJ6mDVEjZdB2BFd+uYaADhKKMd2YHELXVJLG0E5mUIUN8VoDOEPejI2OxNG kqKDnbZccWQtuwEyXhZTHbEbIUUcXIRCGPR+yQUy24FiVKh2dYVgS0KDnQQV aqAtKQgRxXFqaQAomeQUOSiBSeVMlUUd/vYWFe7CHW5nEf2yiP7nhcGWcA0n Py5SGVc3KEbYSQ9YIm84F8PBhi4XFrqwJBRYR7fWBHOXSTrEFViib1VXWV8R CY4QPYXRGhmRIgGkYFyUHPDDikCyOnjSY24lHZGAiAzYcRZxQsixchRRSVRT AiPHiuN0GJ9lKPqlXBnRJxQnig+DY3chhKyIBHLVJWclEdIRSHDRQxxxDa9h DRfRRYwlK8B4Jc83jIchiehTI5UxQsKhD9jFEUMWj1DmCEmggPW4WnsmWbEo FRFXPx0xkMsoL4UzjYHoRLboH43IEG1QF7ZwJ1mCGXYYERJZEWMXIRg0f9iz IxnZHUfoEN8B/l8LlhEleRHasA8RMzEJSTqgAVkMQowTQTMUWIEQMmLLaHxt kIU7GYyBFyMj2U0VhxE1GY+584FLCSR4hRGONpUTwY1qVRGhgx/Fc5XZtIRx OFJcCRRjo5I5dzJnSZJGqRQ8ZZFXqXgxIpBxqZZUQZc7WTCR9ZYIZI1YYSxk eRBZuRET540hcZIK9l/jQQDYUpiDxUxbRZT20XIrQXHbd0nqJ5kHRin6aEL8 xhKakTd68g+Dg0NsuRRqsU6YoZgQwZhpORLmCBtJlRgYWJigEVmZ1xEpFpoY cVQMRThzUZzoIo712DmbtJF4mZcfAXcXpDGy4EHr4ZkVdX2DN5sf/rEPg5MY shgXIdMZX5mQcsaII6FgzOmbFhQ3riJ/q0klTpQlKcZIsjmTk7RvsJkdJ5Qn KhKO7OF3fSliHIWZEkFxb0d4Y7M2BNBsnqlDcmUYkWMczvmNo/mcyIF3vWJZ ZdOgCNFdoHg2vwmhiKGfFaqezXUo1EQuHIqVmBceHwqhq1GcSRVT3bENivmb v3Ef3YlH1bmi8IEa9cV/cBidGqMx1lCHiqWdBQoxQmVyPooglCE7PKIa6ZEb DxhxP/kNommZwZaPiLELlhAHn/SkStMoPtkvU9EE98ZlbmgivVmUCaQRG5Zw OYOcZIogpEEj6WQbp7ITL6ItT1Oj9jkQ/iuXnzNyQtqHjWlgp3fKEKtyI2mW KDqUYQw4HCpTEEM5ofCHoJLgSADaqHh6FFWCI3ElFy+KqaWpqfZhgOhhLcny np4pFFFXNi1KpQO0ctq2PYQnIJ8Kqo6qojyHIC/ygMSakfqQmEaFqKvxFc+i ELDqq8YjH/eGb1MIoVFJoQk3G0oJrS6RaZrGFS/Sdohxd0PZTYmqO42QBLjE rTWRKeNCAB9VqrZwDf7Bi0H1aJthkLPKriWRNAVTqdugDwaITWNngGooFdvK ry8Br+NzYviITcaxGUk3ngrbM7cxQnjiDRBLHNuXd5ZgkM9asRzhro6hpj3U iOhmPSErsh0hfxNNIAchuSSMVHOWhD8se3af6B8EQSpMtDMMerMkBxwgWZwE ETebta9AWx5/Gj1eRVnB9bNJS3JQpaYplx69h5BR21fq9BRYGgm6gbRZCxTj Any3kaaVGLZsEUIMazVHMUe9irZZQbJCMS5wq4WlsbJ1m7d6u7d827d++7dk GRAAOw== ==== } proc xth_incr_station_name {oname iii} { if {[regexp {^(\S+)(\@\S+)$} $oname dumm stname svname]} { set oname $stname } else { set svname {} } if {[regexp {^0*(\d+)$} $oname dum s2]} { set numlen [string length $dum] incr s2 $iii if {[string length $s2] < $numlen} { set s2 [format [join [list "%0" $numlen d] ""] $s2] } return "$s2$svname" } if {[regexp {^(.*\D)(0*(\d+))$} $oname dumm s1 s3 s2]} { set numlen [string length $s3] incr s2 $iii if {[string length $s2] < $numlen} { set s2 [format [join [list "%0" $numlen d] ""] $s2] } return "$s1$s2$svname" } if {[regexp {^(.*)(\D)$} $oname dumm s2 s1]} { set avs1 [scan $s1 %c] if {(($avs1 >= 65) && ($avs1 < 90)) || (($avs1 >= 97) && ($avs1 < 122))} { incr avs1 return "$s2[format %c $avs1]$svname" } } if {[regexp {^(0*(\d+))(\D.*)$} $oname dumm s3 s2 s1]} { set numlen [string length $s3] incr s2 $iii if {[string length $s2] < $numlen} { set s2 [format [join [list "%0" $numlen d] ""] $s2] } return "$s2$s1$svname" } return "$oname$svname" } proc xth_getdir {fname} { set d [file dirname $fname] if {[file exists $d] && [file isdirectory $d]} { return $d } return {} } therion/xtherion/svx_global.tcl0000664000175000017500000000325510625665160015766 0ustar useruser## ## svx_global.tcl -- ## ## Global variables for svxedit. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- # file extensions set xth(app,te,filetypes) { {{Survex files} {.svx}} {{Text files} {.txt}} {{All files} {*}} } set xth(app,te,fileext) {.svx} # command indenting set xth(icmds) {} set xth(cmds) {} set xth(cmd,*begin) 2 set xth(endcmd,*begin) "*end" set xth(cmd,*end) -2 set xth(endcmd,*end) "" # application titles set xth(prj,name) "svxedit" set xth(prj,title) "survex source editor" set xth(about,info) "svxedit v1.0 beta\n \u00A9 2002 Stacho Mudrak" # fonts :-) case $tcl_platform(platform) { unix { set xth(gui,lfont) "Helvetica 10" set xth(gui,efont) {fixed 10 roman} } windows { set xth(gui,efont) "Courier 12 roman" } macintosh { } } therion/xtherion/me_ss.tcl0000664000175000017500000002071010625665160014727 0ustar useruser## ## me_ss.tcl -- ## ## Map editor search & select tools. ## ## Copyright (C) 2003 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- proc xth_me_ss_next {} { global xth xth_me_cmds_update {} set cselid $xth(me,cmds,selid) set cselpid $xth(me,cmds,selpid) set eofvalid [expr $cselid == 0] xth_status_bar_push me xth_status_bar_status me "Searching ..." if {$cselid == 0} { set totalcnt [llength $xth(me,cmds,xlist)] } else { set totalcnt [expr [llength $xth(me,cmds,xlist)] - [lsearch -exact $xth(me,cmds,xlist) $cselid] - 1] } set cnt 0 xth_me_progbar_show $totalcnt while {($cselid != 0) || $eofvalid} { set eofvalid 0 # prejde na dalsi objekt if {$cselid == 0} { set cselid [lindex $xth(me,cmds,xlist) 0] if {$xth(me,cmds,$cselid,ct) == 3} { set cselpid [lindex $xth(me,cmds,$cselid,xplist) 0] } else { set cselpid 0 } incr cnt } elseif {($xth(me,cmds,$cselid,ct) != 3) || ($cselpid == 0)} { set cselid [lindex $xth(me,cmds,xlist) \ [expr [lsearch -exact $xth(me,cmds,xlist) $cselid] + 1]] if {$xth(me,cmds,$cselid,ct) == 3} { set cselpid [lindex $xth(me,cmds,$cselid,xplist) 0] } else { set cselpid 0 } incr cnt } else { set cselpid [lindex $xth(me,cmds,$cselid,xplist) \ [expr [lsearch -exact $xth(me,cmds,$cselid,xplist) $cselpid] + 1]] } xth_me_progbar_prog $cnt switch $xth(me,cmds,$cselid,ct) { 0 { xth_me_cmds_select 0 xth_me_progbar_hide xth_status_bar_pop me return } 3 { if {$cselpid == 0} { if {[xth_me_ss_match $xth(me,cmds,$cselid,data_ln)]} { xth_me_cmds_select "$cselid 0" xth_me_progbar_hide xth_status_bar_pop me return } } else { if {[xth_me_ss_match [lindex $xth(me,cmds,$cselid,data_pt) \ [lsearch -exact $xth(me,cmds,$cselid,xplist) $cselpid]]]} { xth_me_cmds_select "$cselid $cselpid" xth_me_progbar_hide xth_status_bar_pop me return } } } default { if {[xth_me_ss_match $xth(me,cmds,$cselid,data)]} { xth_me_cmds_select $cselid xth_me_progbar_hide xth_status_bar_pop me return } } } } xth_me_progbar_hide xth_status_bar_pop me } proc xth_me_ss_first {} { global xth xth_me_cmds_update {} xth_me_cmds_select 0 xth_me_ss_next } proc xth_me_ss_match {s} { global xth if $xth(ctrl,me,ss,regexp) { if $xth(ctrl,me,ss,cases) { return [regexp $xth(ctrl,me,ss,expr) $s] } else { return [regexp -nocase $xth(ctrl,me,ss,expr) $s] } } else { if $xth(ctrl,me,ss,cases) { if {[string first $xth(ctrl,me,ss,expr) $s] >= 0} { return 1 } else { return 0 } } else { if {[string first [string tolower $xth(ctrl,me,ss,expr)] [string tolower $s]] >= 0} { return 1 } else { return 0 } } } } proc xth_me_ss_show {} { global xth xth_me_cmds_update {} xth_me_cmds_set_colors set selcol red xth_status_bar_push me xth_status_bar_status me "Searching ..." xth_me_progbar_show [llength $xth(me,cmds,xlist)] set objcnt 0 foreach id $xth(me,cmds,xlist) { incr objcnt xth_me_progbar_prog $objcnt switch $xth(me,cmds,$id,ct) { 2 { if {[xth_me_ss_match $xth(me,cmds,$id,data)]} { # oznaci bod $xth(me,can) itemconfigure pt$id -fill $selcol } } 3 { set pnm 0 set trywhole 1 foreach tx $xth(me,cmds,$id,data_pt) { if {[xth_me_ss_match $tx]} { set pid [lindex $xth(me,cmds,$id,xplist) $pnm] # oznaci bod na ciare set trywhole 0 $xth(me,can) itemconfigure pt$id.$pid -fill $selcol set ppid [lindex $xth(me,cmds,$id,xplist) [expr $pnm + 1]] if {[string length $ppid] > 0} { $xth(me,can) itemconfigure ln$id.$ppid -fill $selcol } } incr pnm 1 } if {$trywhole && [xth_me_ss_match $xth(me,cmds,$id,data_ln)]} { # oznaci ciaru $xth(me,can) itemconfigure lnln$id -fill $selcol } } } } xth_status_bar_pop me xth_me_progbar_hide } proc xth_me_goto_line {ln} { global xth if {!$xth(me,fopen)} { return } # najprv preskoci zaciatocne prikazy set cln [expr [llength $xth(me,imgs,xlist)] + 4] # potom poojde prikaz za prikazom az najde taky, # ktory lezi na danej, alebo je mensi ako dana # pozicia a nasledujuci prikaz je uz zase vacsi set previd [lindex $xth(me,cmds,xlist) 0] set prevln $cln foreach cid $xth(me,cmds,xlist) { if {$xth(me,cmds,$cid,ct) == 4} { incr cln 2 } incr cln 1 # skontrolujeme ci to nebol predchadzajuci if {$cln > $ln} { xth_me_cmds_select $previd return } # resp. ci to nie je tento set prevln $cln incr cln [expr 1 + [regexp -all {\n} $xth(me,cmds,$cid,data)]] #puts "$prevln - $cln:\n$xth(me,cmds,$cid,data)" if {($ln >= $prevln) && ($ln < $cln)} { set posttry 0 switch $xth(me,cmds,$cid,ct) { 1 { xth_ctrl_scroll_to me text set posttry 1 } 2 {xth_ctrl_scroll_to me point} 3 {xth_ctrl_scroll_to me line} 4 {xth_ctrl_scroll_to me scrap} 6 {xth_ctrl_scroll_to me area} } xth_me_cmds_select $cid if {($ln > $prevln) || $posttry} { # skusime sa trafit presnejsie switch $xth(me,cmds,$cid,ct) { 1 { set txln [expr $ln - $prevln + 1] focus $xth(ctrl,me,text).txt $xth(ctrl,me,text).txt mark set insert $txln.0 $xth(ctrl,me,text).txt tag remove sel 1.0 end $xth(ctrl,me,text).txt tag add sel $txln.0 "$txln.0 lineend" } 3 { # skusime najst bod na ciare set txln [expr $ln - $prevln + 1] if {$txln > 1} { set tmpxpl $xth(me,cmds,$cid,xplist) #puts $tmpxpl set cxpl {} set cpix [lindex $tmpxpl] foreach pix [lrange $tmpxpl 0 [expr [llength $tmpxpl] - 2]] { lappend cxpl $pix catch { set xth(me,cmds,$cid,xplist) "$cxpl 0" xth_me_cmds_update_line_data $cid } set clnln [regexp -all {\n} $xth(me,cmds,$cid,data)] set xth(me,cmds,$cid,xplist) $tmpxpl #puts "$clnln -> $txln:\n$xth(me,cmds,$cid,data)" if {$clnln >= $txln} { set cpix $pix #puts $pix break } } set xth(me,cmds,$cid,xplist) $tmpxpl xth_me_cmds_update_line_data $cid xth_me_cmds_select "$cid $pix" xth_ctrl_scroll_to me linept } } } } return } set previd $cid } xth_me_cmds_select [lindex $xth(me,cmds,xlist) 0] } proc xth_me_ss_next_cmd {type} { global xth set cselid $xth(me,cmds,selid) set cpos [lsearch -exact $xth(me,cmds,xlist) $cselid] if {$cpos < 0} { set cpos 0 set ctyp -1 } else { set ctyp $xth(me,cmds,$cselid,ct) } set tlen [llength $xth(me,cmds,xlist)] set nxlist [lrange $xth(me,cmds,xlist) [expr $cpos + 1] end] append nxlist " [lrange $xth(me,cmds,xlist) 0 $cpos]" if {($ctyp > 0) && ($ctyp != 4) && ($type == 4)} { # search for current scrap first set nlst {} foreach xx $nxlist { set nlst [linsert $nlst 0 $xx] } set nxlist $nlst } foreach xx $nxlist { if {$xth(me,cmds,$xx,ct) == $type} { xth_me_cmds_select $xx xth_me_ss_show_control $xx break } } } # 1 text # 2 point # 3 line # 4 scrap # 5 endscrap # 6 area proc xth_me_ss_show_control {id} { global xth if {[lsearch -exact $xth(me,cmds,xlist) $id] > -1} { switch $xth(me,cmds,$id,ct) { 1 { xth_ctrl_scroll_to me text xth_ctrl_maximize me text } 2 { xth_ctrl_scroll_to me point xth_ctrl_maximize me point } 3 { xth_ctrl_scroll_to me point xth_ctrl_maximize me line xth_ctrl_maximize me linept } 4 { xth_ctrl_scroll_to me scrap xth_ctrl_maximize me scrap } 6 { xth_ctrl_scroll_to me ac xth_ctrl_maximize me ac } } } }therion/xtherion/me_cmds.tcl0000664000175000017500000035271012330252406015226 0ustar useruser## ## me_cmds.tcl -- ## ## Map editor command processing. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- proc xth_me_set_theme {x} { global xth set xth(me,acttheme) $x set at [lindex $xth(me,themes,list) $x] $xth(ctrl,me,point).typ configure -values $xth(me,themes,$at,point,list) $xth(ctrl,me,line).typ configure -values $xth(me,themes,$at,line,list) $xth(ctrl,me,ac).typ configure -values $xth(me,themes,$at,area,list) $xth(ctrl,me,point).themetype configure -values $xth(me,themes,$at,point,showlist) $xth(ctrl,me,line).themetype configure -values $xth(me,themes,$at,line,showlist) $xth(ctrl,me,ac).themetype configure -values $xth(me,themes,$at,area,showlist) if {[info exists xth(me,cmds,selid)]} { xth_me_cmds_update {} } } proc xth_me_point_themetype_modified {} { global xth set tx [$xth(ctrl,me,point).themetype getvalue] set at [lindex $xth(me,themes,list) $xth(me,acttheme)] if {$tx > -1} { set xth(ctrl,me,point,type) [lindex $xth(me,themes,$at,point,hidelist) $tx] xth_me_cmds_update {} } } proc xth_me_line_themetype_modified {} { global xth set tx [$xth(ctrl,me,line).themetype getvalue] set at [lindex $xth(me,themes,list) $xth(me,acttheme)] if {$tx > -1} { set xth(ctrl,me,line,type) [lindex $xth(me,themes,$at,line,hidelist) $tx] xth_me_cmds_update {} } } proc xth_me_area_themetype_modified {} { global xth set tx [$xth(ctrl,me,ac).themetype getvalue] set at [lindex $xth(me,themes,list) $xth(me,acttheme)] if {$tx > -1} { set xth(ctrl,me,ac,type) [lindex $xth(me,themes,$at,area,hidelist) $tx] xth_me_cmds_update {} } } proc xth_me_cmds_get_line_option {ln opt} { set rxl [list [list "\\s*\\-$opt\\s+\\\[(\[^\\\]\]*)\\\]" "\["]\ [list "\\s*\\-$opt\\s+\\\"((\\\"\\\"|\[^\\\"])+)\\\"" "\""]\ [list "\\s*\\-$opt\\s+(\\S+)" {}]] set rln $ln set val {} set sep {} set res 0 foreach rx $rxl { if {[regexp [lindex $rx 0] $ln dump val]} { regsub [lindex $rx 0] $ln {} rln set sep [lindex $rx 1] set res 1 break } } return [list $val $rln $res] } proc xth_me_cmds_get_sketch_option {ln} { set rxl [list [list "\\s*\\-sketch\\s+\\\[((\[^\\\]\]*))\\\]\\s+(\\S+)\\s+(\\S+)" "\[" "\]"]\ [list "\\s*\\-sketch\\s+\\\"((\\\"\\\"|\[^\\\"])+)\\\"\\s+(\\S+)\\s+(\\S+)" "\"" "\""]\ [list "\\s*\\-sketch\\s+((\\S+))\\s+(\\S+)\\s+(\\S+)" {} {}]] set rln $ln set val {} set sep {} set res 0 foreach rx $rxl { if {[regexp [lindex $rx 0] $ln dump v1 dum v2 v3]} { regsub [lindex $rx 0] $ln {} rln set val "[lindex $rx 1]$v1[lindex $rx 2] $v2 $v3" set res 1 break } } return [list $val $rln $res] } proc xth_me_cmds_set_action {act} { global xth set xth(me,cmds,action) $act switch $act { 0 { $xth(ctrl,me,cmds).cc.go configure -text [mc "Insert line"] } 1 { $xth(ctrl,me,cmds).cc.go configure -text [mc "Insert point"] } 2 { $xth(ctrl,me,cmds).cc.go configure -text [mc "Insert scrap"] } 3 { $xth(ctrl,me,cmds).cc.go configure -text [mc "Insert text"] } 4 { $xth(ctrl,me,cmds).cc.go configure -text [mc "Delete"] } 5 { $xth(ctrl,me,cmds).cc.go configure -text [mc "Insert area"] } } update idletasks } proc xth_me_cmds_update_buttons {} { global xth set ccbox $xth(ctrl,me,cmds).cc set clbox $xth(ctrl,me,cmds).cl set ncmd [expr [llength $xth(me,cmds,xlist)] - 1] if {$xth(me,fopen)} { $ccbox.cfg configure -state normal $clbox.l configure -takefocus 1 $ccbox.go configure -state normal $xth(me,mbar) configure -state normal if {$ncmd > 0} { $ccbox.sel configure -state normal $xth(me,menu,edit) entryconfigure [mc "Select"] -state normal $xth(ctrl,me,prev).upd configure -state normal $xth(ctrl,me,ss).xl configure -state normal $xth(ctrl,me,ss).xe configure -state normal $xth(ctrl,me,ss).cs configure -state normal $xth(ctrl,me,ss).rx configure -state normal $xth(ctrl,me,ss).sn configure -state normal $xth(ctrl,me,ss).sa configure -state normal $xth(ctrl,me,ss).sf configure -state normal $xth(ctrl,me,ss).ca configure -state normal if {$ncmd > 1} { $ccbox.mu configure -state normal $ccbox.md configure -state normal $ccbox.mt configure -state normal $ccbox.tt configure -state normal } else { $ccbox.mu configure -state disabled $ccbox.md configure -state disabled $ccbox.mt configure -state disabled $ccbox.tt configure -state disabled } $ccbox.cfg.m entryconfigure [mc "Delete"] -state normal $xth(me,menu,edit) entryconfigure [mc "Delete"] -state normal } else { $xth(ctrl,me,prev).upd configure -state disabled $ccbox.sel configure -state disabled $xth(me,menu,edit) entryconfigure [mc "Select"] -state disabled $ccbox.cfg.m entryconfigure [mc "Delete"] -state disabled $xth(me,menu,edit) entryconfigure [mc "Delete"] -state disabled $ccbox.mu configure -state disabled $ccbox.md configure -state disabled $ccbox.mt configure -state disabled $ccbox.tt configure -state disabled if {$xth(me,cmds,action) == 4} { xth_me_cmds_set_action 3 } $xth(ctrl,me,ss).xl configure -state disabled $xth(ctrl,me,ss).xe configure -state disabled $xth(ctrl,me,ss).cs configure -state disabled $xth(ctrl,me,ss).rx configure -state disabled $xth(ctrl,me,ss).sn configure -state disabled $xth(ctrl,me,ss).sa configure -state disabled $xth(ctrl,me,ss).sf configure -state disabled $xth(ctrl,me,ss).ca configure -state disabled } } else { xth_me_cmds_set_action 3 $ccbox.go configure -state disabled $ccbox.cfg configure -state disabled $clbox.l configure -takefocus 0 $xth(me,mbar) configure -text "" -state disabled -bg $xth(me,mbar,bg) -fg $xth(me,mbar,fg) $ccbox.sel configure -state disabled $ccbox.mu configure -state disabled $ccbox.md configure -state disabled $ccbox.mt configure -state disabled $ccbox.tt configure -state disabled $xth(ctrl,me,ss).xl configure -state disabled $xth(ctrl,me,ss).xe configure -state disabled $xth(ctrl,me,ss).cs configure -state disabled $xth(ctrl,me,ss).rx configure -state disabled $xth(ctrl,me,ss).sn configure -state disabled $xth(ctrl,me,ss).sa configure -state disabled $xth(ctrl,me,ss).sf configure -state disabled $xth(ctrl,me,ss).ca configure -state disabled } update idletasks } # typy prikazov # 0 eof # 1 text # 2 point # 3 line # 4 scrap # 5 endscrap # 6 area proc xth_me_cmds_create {typ id ix} { global xth if {[string length $id] < 1} { set id $xth(me,cmds,cmdln) incr xth(me,cmds,cmdln) } set xth(me,cmds,$id,listix) -1 set xth(me,cmds,$id,ct) $typ set xth(me,cmds,$id,type) {} set xth(me,cmds,$id,name) {} set xth(me,cmds,$id,data) {} set xth(me,cmds,$id,sbar) {} set ix [lsearch $xth(me,cmds,xlist) $xth(me,cmds,selid)] # ak sme v normalnom mode a na scrape a chceme vlozit # point, line, area alebo scrap if {$xth(me,unredook)} { set ccmdid $xth(me,cmds,selid) if {($xth(me,cmds,$ccmdid,ct) == 4) && (($typ == 2) || ($typ == 3) || ($typ == 6))} { incr ix; } } set xth(me,cmds,list) [linsert $xth(me,cmds,list) $ix {}] set xth(me,cmds,xlist) [linsert $xth(me,cmds,xlist) $ix $id] if {$ix != -1} { xth_me_cmds_update_list_ft $ix {} } xth_me_cmds_update_buttons return $id } proc xth_me_cmds_update_list_ft {f t} { global xth if {[string length $f] == 0} { set f 0 } if {[string length $t] == 0} { set t [llength $xth(me,cmds,xlist)] } for {set ii $f} {$ii < $t} {incr ii} { xth_me_cmds_update_list [lindex $xth(me,cmds,xlist) $ii] } } proc xth_me_cmds_update_list {id} { global xth set ix [lsearch $xth(me,cmds,xlist) $id] switch $xth(me,cmds,$id,ct) { 0 { set cstr "end of file" } 1 { set cstr "$ix: text" } 2 { set cstr "$ix: point" } 3 { set cstr "$ix: line" } 4 { set cstr "$ix: scrap" } 5 { set cstr "$ix: endscrap" } 6 { set cstr "$ix: area" } } if {[string length $xth(me,cmds,$id,type)] > 0} { set cstr "$cstr $xth(me,cmds,$id,type)" } if {[string length $xth(me,cmds,$id,name)] > 0} { set cstr "$cstr - $xth(me,cmds,$id,name)" } set xth(me,cmds,list) [lreplace $xth(me,cmds,list) $ix $ix $cstr] set xth(me,cmds,$id,listix) $ix update idletasks } proc xth_me_cmds_draw {id} { global xth switch $xth(me,cmds,$id,ct) { 2 { xth_me_cmds_draw_point $id } 3 { xth_me_cmds_draw_line $id } } } proc xth_me_cmds_erase {id} { global xth switch $xth(me,cmds,$id,ct) { 2 { $xth(me,can) delete pt$id } 3 { $xth(me,can) delete ln$id } } } proc xth_me_cmds_undelete {id pid ix} { global xth xth_me_cmds_select 0 set xth(me,cmds,list) [linsert $xth(me,cmds,list) $ix {}] set xth(me,cmds,xlist) [linsert $xth(me,cmds,xlist) $ix $id] xth_me_cmds_update_list_ft $ix {} #xth_me_cmds_update_list $id xth_me_cmds_draw $id xth_me_cmds_select "$id $pid" xth_me_cmds_update_buttons } proc xth_me_cmds_delete {id} { global xth if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {$xth(me,cmds,$id,ct) > 0} { set oldselid $xth(me,cmds,selid) set oldselpid $xth(me,cmds,selpid) xth_me_cmds_select 0 set ix [lsearch $xth(me,cmds,xlist) $id] set xth(me,cmds,list) [lreplace $xth(me,cmds,list) $ix $ix] set xth(me,cmds,xlist) [lreplace $xth(me,cmds,xlist) $ix $ix] xth_me_cmds_update_list_ft $ix {} xth_me_cmds_erase $id if {$oldselid == $id} { set nwid [lindex $xth(me,cmds,xlist) $ix] } else { set nwid $oldselid } xth_me_cmds_select $nwid xth_me_unredo_action [mc "deleting"] \ "xth_me_cmds_undelete $id $oldselpid $ix" \ "xth_me_cmds_delete $id" xth_me_cmds_update_buttons } } proc xth_me_cmds_update {id} { global xth if {[llength $id] < 1} { update idletasks set id $xth(me,cmds,selid) set pid $xth(me,cmds,selpid) } elseif {[llength $id] < 2} { set id [lindex $id 0] set pid $xth(me,cmds,selpid) } else { set id [lindex $id 0] set pid [lindex $id 1] } if {[string length $id] < 1} { set id $xth(me,cmds,selid) } switch $xth(me,cmds,$id,ct) { 1 { xth_me_cmds_update_text $id [$xth(ctrl,me,text).txt get 1.0 end] \ [$xth(ctrl,me,text).txt index insert] } 2 { xth_me_cmds_update_point $id $xth(ctrl,me,point,x) \ $xth(ctrl,me,point,y) $xth(ctrl,me,point,type) \ $xth(ctrl,me,point,name) $xth(ctrl,me,point,opts) \ $xth(ctrl,me,point,rot) $xth(ctrl,me,point,xs) \ $xth(ctrl,me,point,ys) xth_me_cmds_update_point_vars $id } 3 { xth_me_cmds_update_line $id $pid $xth(ctrl,me,line,type) \ $xth(ctrl,me,line,name) $xth(ctrl,me,line,opts) \ $xth(ctrl,me,line,reverse) $xth(ctrl,me,linept,x) \ $xth(ctrl,me,linept,y) $xth(ctrl,me,linept,xp) \ $xth(ctrl,me,linept,yp) $xth(ctrl,me,linept,xn) \ $xth(ctrl,me,linept,yn) $xth(ctrl,me,linept,smooth) \ $xth(ctrl,me,linept,rot) $xth(ctrl,me,linept,rs) \ $xth(ctrl,me,linept,ls) \ [$xth(ctrl,me,linept).oe.txt get 1.0 end] \ [$xth(ctrl,me,linept).oe.txt index insert] xth_me_cmds_update_line_vars $id $pid } 4 { xth_me_cmds_update_scrap $id $xth(ctrl,me,scrap,name) \ $xth(ctrl,me,scrap,projection) $xth(ctrl,me,scrap,options) \ [list $xth(ctrl,me,scrap,px1) $xth(ctrl,me,scrap,py1) \ $xth(ctrl,me,scrap,px2) $xth(ctrl,me,scrap,py2) \ $xth(ctrl,me,scrap,rx1) $xth(ctrl,me,scrap,ry1) \ $xth(ctrl,me,scrap,rx2) $xth(ctrl,me,scrap,ry2) \ $xth(ctrl,me,scrap,units)] xth_me_cmds_update_scrap_vars $id } 6 { xth_me_cmds_update_area $id $xth(ctrl,me,ac,type) \ $xth(ctrl,me,ac,opts) xth_me_cmds_update_area_vars $id } } xth_me_cmds_update_list $id xth_me_prev_cmd $xth(me,cmds,$id,data) update idletasks } proc xth_me_cmds_update_text_ctrl {id} { global xth if {[string length $id] > 0} { $xth(ctrl,me,text).txt configure -state normal $xth(ctrl,me,text).txt delete 1.0 end $xth(ctrl,me,text).txt insert 1.0 $xth(me,cmds,$id,data) $xth(ctrl,me,text).txt mark set insert $xth(me,cmds,$id,cpos) $xth(ctrl,me,text).txt see $xth(me,cmds,$id,cpos) $xth(ctrl,me,text).upd configure -state normal xth_me_prev_cmd $xth(me,cmds,$id,data) } else { $xth(ctrl,me,text).txt configure -state normal $xth(ctrl,me,text).txt delete 1.0 end $xth(ctrl,me,text).txt see 1.0 $xth(ctrl,me,text).txt configure -state disabled $xth(ctrl,me,text).upd configure -state disabled } } proc xth_me_cmds_unselect {id} { global xth if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {$xth(me,unredook)} { xth_me_cmds_update $id } switch $xth(me,cmds,$id,ct) { 1 {xth_me_cmds_update_text_ctrl {}} 2 {xth_me_cmds_update_point_ctrl {}} 3 { xth_me_cmds_update_line_ctrl {} xth_me_cmds_update_linept_ctrl {} 0 set xth(me,cmds,selpid) 0 if {$xth(me,cmds,mode) == 2} { xth_me_cmds_set_mode 0 } } 4 {xth_me_cmds_update_scrap_ctrl {}} 6 { xth_me_cmds_update_area_ctrl {} if {$xth(me,cmds,mode) == 3} { xth_me_cmds_set_mode 0 } } } update idletasks } proc xth_me_cmds_select {id} { global xth if {!$xth(me,fopen)} { return } set center_to 0 update idletasks if {[llength $id] < 1} { set id [lindex $xth(me,cmds,xlist) [lindex [$xth(ctrl,me,cmds).cl.l curselection] 0]] if {$xth(me,cmds,$id,ct) == 2} { set center_to 1 } set pid -1 } elseif {[llength $id] < 2} { set id [lindex $id 0] set pid -1 } else { set pid [lindex $id 1] set id [lindex $id 0] } if {$pid == -1} { set pid 0 if {($xth(me,cmds,$id,ct) == 3) && ([llength $xth(me,cmds,$id,xplist)] > 1)} { set center_to [lindex $xth(me,cmds,$id,xplist) [expr [llength $xth(me,cmds,$id,xplist)] - 2]] } } set newx [lsearch $xth(me,cmds,xlist) $id] if {$xth(me,cmds,selid) == $id} { $xth(ctrl,me,cmds).cl.l selection clear 0 end $xth(ctrl,me,cmds).cl.l selection set $newx $newx $xth(ctrl,me,cmds).cl.l see $newx if {($xth(me,cmds,$id,ct) == 3) && ($pid != $xth(me,cmds,selpid))} { xth_me_cmds_select_linept $id $pid } if {$xth(me,unredook)} { return } } if {$xth(me,cmds,$xth(me,cmds,selid),ct) != $xth(me,cmds,$id,ct)} { if {![string equal $xth(ctrl,me,cmds).cl.l [focus -lastfor $xth(gui,main)]]} { focus $xth(gui,main) } } if {$xth(me,cmds,selid) != $id} { xth_me_cmds_unselect $xth(me,cmds,selid) } set xth(me,cmds,selid) $id $xth(ctrl,me,cmds).cl.l selection clear 0 end $xth(ctrl,me,cmds).cl.l selection set $newx $newx $xth(ctrl,me,cmds).cl.l see $newx xth_me_cmds_set_colors switch $xth(me,cmds,$id,ct) { 1 {xth_me_cmds_update_text_ctrl $id} 2 {xth_me_cmds_update_point_ctrl $id} 3 { xth_me_cmds_update_line_ctrl $id xth_me_cmds_select_linept $id $pid $xth(me,can) itemconfigure lnln$id -fill $xth(gui,me,activefill) $xth(me,can) itemconfigure lnpt$id -fill $xth(gui,me,activefill) } 4 {xth_me_cmds_update_scrap_ctrl $id} 6 { xth_me_cmds_update_area_ctrl $id xth_me_cmds_show_current_area } default {xth_me_prev_cmd $xth(me,cmds,$id,data)} } if {$center_to > 0} { switch $xth(me,cmds,$id,ct) { 2 { xth_me_center_to [list $xth(me,cmds,$id,x) $xth(me,cmds,$id,y)] } 3 { xth_me_center_to [list \ $xth(me,cmds,$xth(me,cmds,selid),$center_to,x) \ $xth(me,cmds,$xth(me,cmds,selid),$center_to,y)] } } } update idletasks } proc xth_me_cmds_set_move_to_list {} { global xth # prejde vsetky prikazy a najde scrapy a endscrapy set xl [llength $xth(me,cmds,xlist)] set vls {} set lscrap {} for {set ii 0} {$ii < $xl} {incr ii} { set id [lindex $xth(me,cmds,xlist) $ii] switch $xth(me,cmds,$id,ct) { 4 { set lscrap $xth(me,cmds,$id,name) lappend vls "$lscrap begin \[[expr $ii + 1]\]" } 5 { lappend vls "$lscrap end \[$ii\]" } } } $xth(ctrl,me,cmds).cc.tt configure -values $vls update idletasks } proc xth_me_cmds_set_move_to {} { global xth set lnum {} regexp {\[(\d+)\]} $xth(ctrl,me,cmds,moveto) dum lnum set xth(ctrl,me,cmds,moveto) $lnum update idletasks } proc xth_me_cmds_move_to {id dx} { global xth xth_me_cmds_update {} if {[string length $dx] < 1} { set dx $xth(ctrl,me,cmds,moveto) } set dx [regexp -inline {\d*} $dx] if {[string length $dx] < 1} { return } if {[string length $id] < 1} { set id $xth(me,cmds,selid) } set sx [lsearch $xth(me,cmds,xlist) $id] set maxsdx [expr [llength $xth(me,cmds,xlist)] - 2] if {($dx == $sx) || ($sx > $maxsdx) || ($dx > $maxsdx)} { return; } # prehodi set xth(me,cmds,list) [linsert $xth(me,cmds,list) $dx [lindex $xth(me,cmds,list) $sx]] set xth(me,cmds,xlist) [linsert $xth(me,cmds,xlist) $dx [lindex $xth(me,cmds,xlist) $sx]] if {$dx < $sx} { set xth(me,cmds,list) [lreplace $xth(me,cmds,list) [expr $sx + 1] [expr $sx + 1]] set xth(me,cmds,xlist) [lreplace $xth(me,cmds,xlist) [expr $sx + 1] [expr $sx + 1]] } else { set xth(me,cmds,list) [lreplace $xth(me,cmds,list) $sx $sx] set xth(me,cmds,xlist) [lreplace $xth(me,cmds,xlist) $sx $sx] } if {$dx < $sx} { xth_me_cmds_update_list_ft $dx [expr $sx + 1] } else { xth_me_cmds_update_list_ft $sx [expr $dx + 1] } set nid [lindex $xth(me,cmds,xlist) $sx] if {$xth(me,unredook)} { xth_me_cmds_select $nid } # unredo xth_me_unredo_action [mc "moving command"] \ "xth_me_cmds_move_to $id $sx\nxth_me_cmds_select $id" \ "xth_me_cmds_move_to $id $dx\nxth_me_cmds_select $nid" update idletasks } proc xth_me_cmds_move_up {id} { global xth xth_me_cmds_update {} if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {$id < 1} { return } set ix [lsearch $xth(me,cmds,xlist) $id] if {$ix < 1} { return } set dix [expr $ix - 1] # vymenime v liste set xth(me,cmds,list) [lreplace $xth(me,cmds,list) $dix $ix \ [lindex $xth(me,cmds,list) $ix] [lindex $xth(me,cmds,list) $dix]] # vymenime v xliste set xth(me,cmds,xlist) [lreplace $xth(me,cmds,xlist) $dix $ix \ [lindex $xth(me,cmds,xlist) $ix] [lindex $xth(me,cmds,xlist) $dix]] # selection if {$id == $xth(me,cmds,selid)} { $xth(ctrl,me,cmds).cl.l selection clear 0 end $xth(ctrl,me,cmds).cl.l selection set $dix $dix $xth(ctrl,me,cmds).cl.l see $dix set selcmd "\nxth_me_cmds_select $id" } else { set selcmd {} } xth_me_cmds_update_list [lindex $xth(me,cmds,xlist) $ix] xth_me_cmds_update_list [lindex $xth(me,cmds,xlist) $dix] # unredo xth_me_unredo_action [mc "moving command"] \ "xth_me_cmds_move_down $id$selcmd" \ "xth_me_cmds_move_up $id$selcmd" update idletasks } proc xth_me_cmds_move_down {id} { global xth xth_me_cmds_update {} if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {$id < 1} { return } set ix [lsearch $xth(me,cmds,xlist) $id] if {$ix > [expr [llength $xth(me,cmds,xlist)] - 3]} { return } set iix [expr $ix + 1] # vymenime v liste set xth(me,cmds,list) [lreplace $xth(me,cmds,list) $ix $iix \ [lindex $xth(me,cmds,list) $iix] [lindex $xth(me,cmds,list) $ix]] # vymenime v xliste set xth(me,cmds,xlist) [lreplace $xth(me,cmds,xlist) $ix $iix \ [lindex $xth(me,cmds,xlist) $iix] [lindex $xth(me,cmds,xlist) $ix]] # selection if {$id == $xth(me,cmds,selid)} { $xth(ctrl,me,cmds).cl.l selection clear 0 end $xth(ctrl,me,cmds).cl.l selection set $iix $iix $xth(ctrl,me,cmds).cl.l see $iix set selcmd "\nxth_me_cmds_select $id" } else { set selcmd {} } # unredo xth_me_cmds_update_list [lindex $xth(me,cmds,xlist) $ix] xth_me_cmds_update_list [lindex $xth(me,cmds,xlist) $iix] xth_me_unredo_action [mc "moving command"] \ "xth_me_cmds_move_up $id$selcmd" "xth_me_cmds_move_down $id$selcmd" update idletasks } proc xth_me_cmds_create_endscrap {ix mode name} { global xth xth_me_cmds_update {} set id [xth_me_cmds_create 5 {} $ix] set xth(me,cmds,$id,name) {} set xth(me,cmds,$id,data) "endscrap" if {[string length $name] > 0} { set xth(me,cmds,$id,data) "$xth(me,cmds,$id,data)\n# $name" } xth_me_cmds_update_list $id if {$mode} { xth_me_cmds_select $id xth_me_cmds_select [expr $id - 1] xth_me_unredo_action [mc "creating endscrap"] \ "xth_me_cmds_delete $id" \ "xth_me_cmds_undelete $id 0 [lsearch $xth(me,cmds,xlist) $id]" } } proc xth_me_cmds_hide_scrap_xctrl {} { global xth $xth(me,can) itemconfigure $xth(me,canid,scrap,scp1) -state hidden $xth(me,can) bind $xth(me,canid,scrap,scp1) "" $xth(me,can) bind $xth(me,canid,scrap,scp1) "" $xth(me,can) itemconfigure $xth(me,canid,scrap,scp2) -state hidden $xth(me,can) bind $xth(me,canid,scrap,scp2) "" $xth(me,can) bind $xth(me,canid,scrap,scp2) "" $xth(me,can) itemconfigure $xth(me,canid,scrap,scpA) -state hidden } proc xth_me_cmds_move_scrap_xctrl {id x y} { global xth set xth(me,canid,scrap,scp$id,pos) [list $x $y] set x [xth_me_real2canx $x] set y [xth_me_real2cany $y] $xth(me,can) coords $xth(me,canid,scrap,scp$id) \ [expr $x - $xth(gui,me,scrap,psize)] [expr $y - $xth(gui,me,scrap,psize)] \ [expr $x + $xth(gui,me,scrap,psize)] [expr $y + $xth(gui,me,scrap,psize)] set x1 [xth_me_real2canx [lindex $xth(me,canid,scrap,scp1,pos) 0]] set y1 [xth_me_real2cany [lindex $xth(me,canid,scrap,scp1,pos) 1]] set x2 [xth_me_real2canx [lindex $xth(me,canid,scrap,scp2,pos) 0]] set y2 [xth_me_real2cany [lindex $xth(me,canid,scrap,scp2,pos) 1]] $xth(me,can) coords $xth(me,canid,scrap,scpA) $x1 $y1 $x2 $y2 } proc xth_me_cmds_start_scrap_xctrl_drag {pid x y} { global xth xth_me_cmds_update {} set xth(me,scrap,xdrag_mx) $x set xth(me,scrap,xdrag_my) $y set xth(me,scrap,xdrag_px) $xth(ctrl,me,scrap,px$pid) set xth(me,scrap,xdrag_py) $xth(ctrl,me,scrap,py$pid) set xth(me,scrap,xdrag_benter) [$xth(me,can) bind $xth(me,canid,scrap,scp$pid) ] $xth(me,can) bind $xth(me,canid,scrap,scp$pid) {} set xth(me,scrap,xdrag_bleave) [$xth(me,can) bind $xth(me,canid,scrap,scp$pid) ] $xth(me,can) bind $xth(me,canid,scrap,scp$pid) {} $xth(me,can) itemconfigure $xth(me,canid,scrap,scp$pid) -fill {} $xth(me,can) bind $xth(me,canid,scrap,scp$pid) "xth_me_cmds_scrap_xctrl_drag $pid %x %y" $xth(me,can) bind $xth(me,canid,scrap,scp$pid) "xth_me_cmds_end_scrap_xctrl_drag $pid %x %y" $xth(me,can) configure -cursor {} } proc xth_me_cmds_scrap_xctrl_drag {pid x y} { global xth set nx [expr $xth(me,scrap,xdrag_px) - [expr double($xth(me,scrap,xdrag_mx) - $x) * 100.0 / $xth(me,zoom)]] set ny [expr $xth(me,scrap,xdrag_py) + [expr double($xth(me,scrap,xdrag_my) - $y) * 100.0 / $xth(me,zoom)]] xth_me_cmds_move_scrap_xctrl $pid $nx $ny set xth(ctrl,me,scrap,px$pid) $nx set xth(ctrl,me,scrap,py$pid) $ny update idletasks } proc xth_me_cmds_end_scrap_xctrl_drag {pid x y} { global xth xth_me_cmds_scrap_xctrl_drag $pid $x $y $xth(me,can) bind $xth(me,canid,scrap,scp$pid) "" $xth(me,can) bind $xth(me,canid,scrap,scp$pid) "" $xth(me,can) bind $xth(me,canid,scrap,scp$pid) $xth(me,scrap,xdrag_benter) $xth(me,can) bind $xth(me,canid,scrap,scp$pid) $xth(me,scrap,xdrag_bleave) $xth(me,can) itemconfigure $xth(me,canid,scrap,scp$pid) -fill yellow $xth(me,can) configure -cursor crosshair xth_me_cmds_update {} } proc xth_me_cmds_show_scrap_xctrl {x1 y1 x2 y2} { global xth xth_me_cmds_move_scrap_xctrl 1 $x1 $y1 $xth(me,can) itemconfigure $xth(me,canid,scrap,scp1) -state normal $xth(me,can) raise $xth(me,canid,scrap,scp1) $xth(me,can) bind $xth(me,canid,scrap,scp1) "xth_status_bar_push me; xth_status_bar_status me \"Scrap picture scale point 1.\"; $xth(me,can) itemconfigure $xth(me,canid,scrap,scp1) -fill yellow" $xth(me,can) bind $xth(me,canid,scrap,scp1) "xth_status_bar_pop me; $xth(me,can) itemconfigure $xth(me,canid,scrap,scp1) -fill red" $xth(me,can) bind $xth(me,canid,scrap,scp1) <1> "xth_me_cmds_start_scrap_xctrl_drag 1 %x %y" xth_me_cmds_move_scrap_xctrl 2 $x2 $y2 $xth(me,can) itemconfigure $xth(me,canid,scrap,scp2) -state normal $xth(me,can) raise $xth(me,canid,scrap,scp2) $xth(me,can) bind $xth(me,canid,scrap,scp2) "xth_status_bar_push me; xth_status_bar_status me \"Scrap picture scale point 2.\"; $xth(me,can) itemconfigure $xth(me,canid,scrap,scp2) -fill yellow" $xth(me,can) bind $xth(me,canid,scrap,scp2) "xth_status_bar_pop me; $xth(me,can) itemconfigure $xth(me,canid,scrap,scp2) -fill red" $xth(me,can) bind $xth(me,canid,scrap,scp2) <1> "xth_me_cmds_start_scrap_xctrl_drag 2 %x %y" $xth(me,can) itemconfigure $xth(me,canid,scrap,scpA) -state normal } proc xth_me_cmds_update_scrap_ctrl {id} { global xth if {[string length $id] > 0} { $xth(ctrl,me,scrap).namel configure -state normal $xth(ctrl,me,scrap).name configure -state normal $xth(ctrl,me,scrap).projl configure -state normal $xth(ctrl,me,scrap).proj configure -state normal $xth(ctrl,me,scrap).optl configure -state normal $xth(ctrl,me,scrap).opt configure -state normal $xth(ctrl,me,scrap).scl configure -state normal $xth(ctrl,me,scrap).scpb configure -state normal $xth(ctrl,me,scrap).scpp configure -state normal $xth(ctrl,me,scrap).scrp configure -state normal $xth(ctrl,me,scrap).scx1p configure -state normal $xth(ctrl,me,scrap).scy1p configure -state normal $xth(ctrl,me,scrap).scx2p configure -state normal $xth(ctrl,me,scrap).scy2p configure -state normal $xth(ctrl,me,scrap).scx1r configure -state normal $xth(ctrl,me,scrap).scy1r configure -state normal $xth(ctrl,me,scrap).scx2r configure -state normal $xth(ctrl,me,scrap).scy2r configure -state normal $xth(ctrl,me,scrap).scu configure -state normal $xth(ctrl,me,scrap).scul configure -state normal $xth(ctrl,me,scrap).skl configure -state normal $xth(ctrl,me,scrap).skll.l configure -takefocus 1 \ -listvariable xth(me,cmds,$id,sklist) $xth(ctrl,me,scrap).skins configure -state normal $xth(ctrl,me,scrap).skdel configure -state normal set xth(ctrl,me,scrap,name) $xth(me,cmds,$id,name) set xth(ctrl,me,scrap,projection) $xth(me,cmds,$id,projection) set xth(ctrl,me,scrap,options) $xth(me,cmds,$id,options) set xth(ctrl,me,scrap,px1) [lindex $xth(me,cmds,$id,scale) 0] set xth(ctrl,me,scrap,py1) [lindex $xth(me,cmds,$id,scale) 1] set xth(ctrl,me,scrap,px2) [lindex $xth(me,cmds,$id,scale) 2] set xth(ctrl,me,scrap,py2) [lindex $xth(me,cmds,$id,scale) 3] set xth(ctrl,me,scrap,rx1) [lindex $xth(me,cmds,$id,scale) 4] set xth(ctrl,me,scrap,ry1) [lindex $xth(me,cmds,$id,scale) 5] set xth(ctrl,me,scrap,rx2) [lindex $xth(me,cmds,$id,scale) 6] set xth(ctrl,me,scrap,ry2) [lindex $xth(me,cmds,$id,scale) 7] set xth(ctrl,me,scrap,units) [lindex $xth(me,cmds,$id,scale) 8] xth_me_cmds_show_scrap_xctrl [lindex $xth(me,cmds,$id,scale) 0] \ [lindex $xth(me,cmds,$id,scale) 1] [lindex $xth(me,cmds,$id,scale) 2] \ [lindex $xth(me,cmds,$id,scale) 3] xth_me_prev_cmd $xth(me,cmds,$id,data) } else { set xth(ctrl,me,scrap,name) "" set xth(ctrl,me,scrap,projection) $xth(me,dflt,scrap,projection) set xth(ctrl,me,scrap,options) $xth(me,dflt,scrap,options) set xth(ctrl,me,scrap,px1) [lindex $xth(me,dflt,scrap,scale) 0] set xth(ctrl,me,scrap,py1) [lindex $xth(me,dflt,scrap,scale) 1] set xth(ctrl,me,scrap,px2) [lindex $xth(me,dflt,scrap,scale) 2] set xth(ctrl,me,scrap,py2) [lindex $xth(me,dflt,scrap,scale) 3] set xth(ctrl,me,scrap,rx1) [lindex $xth(me,dflt,scrap,scale) 4] set xth(ctrl,me,scrap,ry1) [lindex $xth(me,dflt,scrap,scale) 5] set xth(ctrl,me,scrap,rx2) [lindex $xth(me,dflt,scrap,scale) 6] set xth(ctrl,me,scrap,ry2) [lindex $xth(me,dflt,scrap,scale) 7] set xth(ctrl,me,scrap,units) [lindex $xth(me,dflt,scrap,scale) 8] $xth(ctrl,me,scrap).namel configure -state disabled $xth(ctrl,me,scrap).name configure -state disabled $xth(ctrl,me,scrap).projl configure -state disabled $xth(ctrl,me,scrap).proj configure -state disabled $xth(ctrl,me,scrap).optl configure -state disabled $xth(ctrl,me,scrap).opt configure -state disabled $xth(ctrl,me,scrap).scl configure -state disabled $xth(ctrl,me,scrap).scpb configure -state disabled $xth(ctrl,me,scrap).scpp configure -state disabled $xth(ctrl,me,scrap).scrp configure -state disabled $xth(ctrl,me,scrap).scx1p configure -state disabled $xth(ctrl,me,scrap).scy1p configure -state disabled $xth(ctrl,me,scrap).scx2p configure -state disabled $xth(ctrl,me,scrap).scy2p configure -state disabled $xth(ctrl,me,scrap).scx1r configure -state disabled $xth(ctrl,me,scrap).scy1r configure -state disabled $xth(ctrl,me,scrap).scx2r configure -state disabled $xth(ctrl,me,scrap).scy2r configure -state disabled $xth(ctrl,me,scrap).scu configure -state disabled $xth(ctrl,me,scrap).scul configure -state disabled $xth(ctrl,me,scrap).skl configure -state disabled $xth(ctrl,me,scrap).skll.l configure -takefocus 0 \ -listvariable xth(ctrl,me,scrap,sklempty) $xth(ctrl,me,scrap).skins configure -state disabled $xth(ctrl,me,scrap).skdel configure -state disabled xth_me_cmds_hide_scrap_xctrl } } proc xth_me_cmds_update_scrap_vars {id} { global xth set xth(ctrl,me,scrap,name) $xth(me,cmds,$id,name) set xth(ctrl,me,scrap,projection) $xth(me,cmds,$id,projection) set xth(ctrl,me,scrap,options) $xth(me,cmds,$id,options) set xth(ctrl,me,scrap,px1) [lindex $xth(me,cmds,$id,scale) 0] set xth(ctrl,me,scrap,py1) [lindex $xth(me,cmds,$id,scale) 1] set xth(ctrl,me,scrap,px2) [lindex $xth(me,cmds,$id,scale) 2] set xth(ctrl,me,scrap,py2) [lindex $xth(me,cmds,$id,scale) 3] set xth(ctrl,me,scrap,rx1) [lindex $xth(me,cmds,$id,scale) 4] set xth(ctrl,me,scrap,ry1) [lindex $xth(me,cmds,$id,scale) 5] set xth(ctrl,me,scrap,rx2) [lindex $xth(me,cmds,$id,scale) 6] set xth(ctrl,me,scrap,ry2) [lindex $xth(me,cmds,$id,scale) 7] set xth(ctrl,me,scrap,units) [lindex $xth(me,cmds,$id,scale) 8] xth_me_cmds_move_scrap_xctrl 1 [lindex $xth(me,cmds,$id,scale) 0] \ [lindex $xth(me,cmds,$id,scale) 1] xth_me_cmds_move_scrap_xctrl 2 [lindex $xth(me,cmds,$id,scale) 2] \ [lindex $xth(me,cmds,$id,scale) 3] } proc xth_me_cmds_update_scrap {id nname nproj nopt nscale} { global xth set oname $xth(me,cmds,$id,name) set oproj $xth(me,cmds,$id,projection) set oopt $xth(me,cmds,$id,options) set oscale $xth(me,cmds,$id,scale) regsub {^\s*} $nopt "" nopt regsub {\s*$} $nopt "" nopt if {[string length $nname] < 1} { set nname $oname } if {[llength $nscale] < 8} { set nscale oscale } else { for {set i 0} {$i < 8} {incr i} { if {[catch {expr [lindex $nscale $i]}]} { set nscale [lreplace $nscale $i $i [lindex $oscale $i]] } } } if {[llength $nscale] == 9} { if {[string length [lindex $nscale 8]] == 0} { set nscale [lreplace $nscale 8 8] } } if {![string equal "$oname $oproj $oopt $oscale" "$nname $nproj $nopt $nscale"]} { xth_me_unredo_action [mc "scrap changes"] \ "xth_me_cmds_update_scrap $id $oname [list $oproj] [list $oopt] [list $oscale]; xth_me_cmds_select $id" \ "xth_me_cmds_update_scrap $id $nname [list $nproj] [list $nopt] [list $nscale]; xth_me_cmds_select $id" set xth(me,cmds,$id,name) $nname set xth(me,cmds,$id,projection) $nproj set xth(me,cmds,$id,options) $nopt set xth(me,cmds,$id,scale) $nscale xth_me_cmds_update_scrap_data $id xth_me_cmds_update_list $id } } proc xth_me_cmds_update_scrap_data {id} { global xth set d "scrap $xth(me,cmds,$id,name)" if {[llength $xth(me,cmds,$id,projection)] > 1} { set d "$d -projection \[$xth(me,cmds,$id,projection)\]" } elseif {[llength $xth(me,cmds,$id,projection)] > 0} { set d "$d -projection $xth(me,cmds,$id,projection)" } set xth(me,dflt,scrap,projection) $xth(me,cmds,$id,projection) if {[string length $xth(me,cmds,$id,options)] > 0} { set d "$d $xth(me,cmds,$id,options)" } set xth(me,dflt,scrap,options) $xth(me,cmds,$id,options) set d "$d -scale \[$xth(me,cmds,$id,scale)\]" set xth(me,dflt,scrap,scale) $xth(me,cmds,$id,scale) foreach sk $xth(me,cmds,$id,sklist) { set d "$d -sketch $sk" } set xth(me,cmds,$id,data) "$d" } proc xth_me_cmds_create_scrap {ix mode name opts} { global xth xth_me_cmds_update {} set undoselect {} if {[string length $ix] == 0} { set undoselect "; xth_me_cmds_select $xth(me,cmds,selid)" #xth_me_cmds_select [lindex $xth(me,cmds,xlist) 0] set newselid 0 set cx [lsearch -exact $xth(me,cmds,xlist) $xth(me,cmds,selid)] if {$cx > -1} { for {set cc [expr $cx + 1]} {$cc < [llength $xth(me,cmds,xlist)]} {incr cc} { set cselid [lindex $xth(me,cmds,xlist) $cc] if {$xth(me,cmds,$cselid,ct) == 4} { set newselid $cselid break } } } xth_me_cmds_select $newselid } set id [xth_me_cmds_create 4 {} $ix] if {[string length $name] > 0} { set xth(me,cmds,$id,name) $name } else { set xth(me,cmds,$id,name) "scrap$id" } if {$mode && ([string length $opts] < 1)} { set opts $xth(me,dflt,scrap,options) } # nastavit projekciu if {$mode} { set xth(me,cmds,$id,projection) $xth(me,dflt,scrap,projection) } else { set xth(me,cmds,$id,projection) {} } set optl [xth_me_cmds_get_line_option $opts projection] if {[lindex $optl 2]} { set xth(me,cmds,$id,projection) [lindex $optl 0] set opts [lindex $optl 1] } set optl [xth_me_cmds_get_line_option $opts proj] if {[lindex $optl 2]} { set xth(me,cmds,$id,projection) [lindex $optl 0] set opts [lindex $optl 1] } # nastavit scale set xth(me,cmds,$id,scale) {} if {[llength $xth(me,dflt,scrap,scale)] < 1} { set xth(me,dflt,scrap,scale) [list $xth(me,area,xmin) $xth(me,area,ymin) \ $xth(me,area,xmax) $xth(me,area,ymin) 0.0 0.0 [expr 0.0254 * ($xth(me,area,xmax) - $xth(me,area,xmin))] 0.0 m] } set optl [xth_me_cmds_get_line_option $opts scale] set optv [lindex $optl 0] set opts [lindex $optl 1] switch [llength $optv] { 1 { set xth(me,cmds,$id,scale) [list $xth(me,area,xmin) $xth(me,area,ymin) \ $xth(me,area,xmax) $xth(me,area,ymin) 0.0 0.0 [expr 1.0 * $optv * ($xth(me,area,xmax) - $xth(me,area,xmin))] 0.0 m] } 2 { set xth(me,cmds,$id,scale) [list $xth(me,area,xmin) $xth(me,area,ymin) \ $xth(me,area,xmax) $xth(me,area,ymin) 0.0 0.0 [expr 1.0 * [lindex $optv 0] * ($xth(me,area,xmax) - $xth(me,area,xmin))] 0.0 [lindex $optv 1]] } 3 { set xth(me,cmds,$id,scale) [list $xth(me,area,xmin) $xth(me,area,ymin) \ $xth(me,area,xmax) $xth(me,area,ymin) 0.0 0.0 [expr 1.0 * [lindex $optv 1] / [lindex $optv 0] * ($xth(me,area,xmax) - $xth(me,area,xmin))] 0.0 [lindex $optv 2]] } 8 { set xth(me,cmds,$id,scale) [list [lindex $optv 0] [lindex $optv 1] [lindex $optv 2] \ [lindex $optv 3] [lindex $optv 4] [lindex $optv 5] [lindex $optv 6] [lindex $optv 7]] } 9 { set xth(me,cmds,$id,scale) [list [lindex $optv 0] [lindex $optv 1] [lindex $optv 2] \ [lindex $optv 3] [lindex $optv 4] [lindex $optv 5] [lindex $optv 6] [lindex $optv 7] [lindex $optv 8]] } default { set xth(me,cmds,$id,scale) $xth(me,dflt,scrap,scale) } } # set the list of sketches set xth(me,cmds,$id,sklist) {} set optl [xth_me_cmds_get_sketch_option $opts] while {[lindex $optl 2]} { lappend xth(me,cmds,$id,sklist) [lindex $optl 0] set opts [lindex $optl 1] set optl [xth_me_cmds_get_sketch_option $opts] } # nastavit options regsub {^\s*} $opts "" opts regsub {\s*$} $opts "" opts set xth(me,cmds,$id,options) $opts xth_me_cmds_update_list $id xth_me_cmds_update_scrap_data $id if {$mode} { xth_me_unredo_action [mc "creating scrap"] \ "xth_me_cmds_delete $id$undoselect" \ "xth_me_cmds_undelete $id 0 [lsearch $xth(me,cmds,xlist) $id]" xth_me_cmds_create_endscrap $ix $mode {} } } proc xth_me_cmds_create_text {ix mode data cpos} { global xth xth_me_cmds_update {} set id [xth_me_cmds_create 1 {} $ix] set xth(me,cmds,$id,data) $data set xth(me,cmds,$id,cpos) $cpos if {$mode} { xth_me_cmds_select $id xth_me_unredo_action [mc "creating text"] \ "xth_me_cmds_delete $id" \ "xth_me_cmds_undelete $id 0 [lsearch $xth(me,cmds,xlist) $id]" } } proc xth_me_cmds_update_text {id newdata newcpos} { global xth set olddata $xth(me,cmds,$id,data) set oldcpos $xth(me,cmds,$id,cpos) regsub {\s*$} $newdata {} newdata if {![string equal $xth(me,cmds,$id,data) $newdata]} { set newdata "$newdata\n" xth_me_unredo_action [mc "text changes"] \ "xth_me_cmds_update_text $id [list $olddata] $oldcpos; xth_me_cmds_select $id" \ "xth_me_cmds_update_text $id [list $newdata] $newcpos; xth_me_cmds_select $id" set xth(me,cmds,$id,data) $newdata set xth(me,cmds,$id,cpos) $newcpos } } proc xth_me_cmds_action {} { global xth switch $xth(me,cmds,action) { 0 { xth_me_cmds_create_line {} 1 "" "" "" xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } 1 { xth_me_cmds_set_mode 1 } 2 { xth_me_cmds_create_scrap {} 1 "" "" xth_ctrl_scroll_to me scrap xth_ctrl_maximize me scrap } 3 { xth_me_cmds_create_text {} 1 "\n" "1.0" xth_ctrl_scroll_to me text xth_ctrl_maximize me text focus $xth(ctrl,me,text).txt } 4 { xth_me_cmds_delete {} } 5 { xth_me_cmds_create_area {} 1 "" "" "" xth_ctrl_scroll_to me ac xth_ctrl_maximize me ac } } } proc xth_me_cmds_create_all {lns} { global xth set ctext {} xth_status_bar_push me set ctext_push { regsub {^\s*} $ctext {} ctext regsub {\s*$} $ctext {} ctext if {[string length $ctext] > 0} { xth_me_cmds_create_text [expr [llength $xth(me,cmds,xlist)] - 1] 0 "$ctext\n" 1.0 set ctext {} } } set line_lines {} set line_type {} set line_opts {} set inline 0 set linenumber 0 set totallns [llength $lns] xth_me_progbar_show $totallns xth_status_bar_status me "Processing commands ..." foreach ln $lns { incr linenumber xth_me_progbar_prog $linenumber # here take care of special commands if {[regexp {^\s*scrap\s+(\S+)\s*(.*)$} $ln dum name opts]} { eval $ctext_push xth_me_cmds_create_scrap [expr [llength $xth(me,cmds,xlist)] - 1] 0 $name $opts } elseif {[regexp {^\s*endscrap\s*(\S*)\s*$} $ln dum name]} { eval $ctext_push xth_me_cmds_create_endscrap [expr [llength $xth(me,cmds,xlist)] - 1] 0 $name } elseif {[regexp {^\s*point\s+(\S+)\s+(\S+)\s+(\S+)\s*(.*)$} $ln dum x y type opts]} { eval $ctext_push xth_me_cmds_create_point [expr [llength $xth(me,cmds,xlist)] - 1] 0 $x $y $type $opts } elseif {[regexp {^\s*line\s+(\S+)\s*(.*)$} $ln dum line_type line_opts]} { eval $ctext_push set line_lines {} set inline 1 } elseif {($inline == 1) && [regexp {^\s*endline(\s|$)} $ln]} { xth_me_cmds_create_line [expr [llength $xth(me,cmds,xlist)] - 1] 0 $line_type $line_opts $line_lines set line_lines {} set line_type {} set line_opts {} set inline 0 } elseif {[regexp {^\s*area\s+(\S+)\s*(.*)$} $ln dum line_type line_opts]} { eval $ctext_push set line_lines {} set inline 2 } elseif {($inline == 2) && [regexp {^\s*endarea(\s|$)} $ln]} { xth_me_cmds_create_area [expr [llength $xth(me,cmds,xlist)] - 1] 0 $line_type $line_opts $line_lines set line_lines {} set line_type {} set line_opts {} set inarea 0 } elseif {($inline > 0)} { lappend line_lines $ln } else { set ctext "$ctext\n$ln" } } if {$inline > 0} { foreach ln $line_lines { set ctext "$ctext\n$ln" } } eval $ctext_push xth_me_progbar_hide xth_status_bar_pop me } proc xth_me_cmds_click {id tagOrId x y mx my} { global xth xth_me_cmds_update {} if {[llength $id] == 2} { set pid [lindex $id 1] set id [lindex $id 0] } else { set pid 0 } switch $xth(me,cmds,mode) { 0 { if {[llength $id] > 0} { if {$id != $xth(me,cmds,selid)} { xth_me_cmds_select "$id $pid" if {$pid == 0} { xth_ctrl_scroll_to me point xth_ctrl_maximize me point } else { xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } } else { switch $xth(me,cmds,$id,ct) { 2 {xth_me_cmds_start_point_drag $id $mx $my} 3 { if {$xth(me,cmds,selpid) != $pid} { xth_me_cmds_select_linept $id $pid } else { xth_me_cmds_start_linecp_drag pt$id.$pid $id 0 $pid 0 x $mx $my } } } } } } 1 { xth_ctrl_scroll_to me point xth_ctrl_maximize me point # check, whether we clicked on XVI station set cptype {} set cpopts {} if {[regexp {XVIstI(\d+)S(\d+)} [$xth(me,can) itemcget $tagOrId -tags] dum imgx sti]} { set csname [lindex [lindex $xth(me,imgs,$imgx,XVIstations) $sti] 2] set x [lindex [lindex $xth(me,imgs,$imgx,XVIstationsX) $sti] 0] set y [lindex [lindex $xth(me,imgs,$imgx,XVIstationsX) $sti] 1] set cptype station set cpopts $xth(me,dflt,point,options) if {[regexp {\-name\s+(\S+)} $cpopts]} { regsub {\-name\s+(\S+)} $cpopts "-name $csname" cpopts } else { set cpopts "-name $csname" } } if {$id == ($xth(me,cmds,cmdln) - 1)} { xth_me_cmds_end_point } else { xth_me_cmds_create_point {} 1 $x $y $cptype $cpopts } } 2 { xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept set fpid -1 set lpid -1 if {($id == $xth(me,cmds,selid)) && ([string length $id] > 0) && ($pid > 0)} { set xl $xth(me,cmds,$id,xplist) set lix [expr [llength $xl] - 2] if {$lix >= 0} { set fpid [lindex $xl 0] set lpid [lindex $xl $lix] } } if {($id == $xth(me,cmds,selid)) && ($pid != 0) && ($pid == $xth(me,cmds,inspid))} { xth_me_cmds_end_line } elseif {($id == $xth(me,cmds,selid)) && ($pid == $fpid) && ($xth(me,cmds,inspid) == 0)} { xth_me_cmds_close_line $id } elseif {($id == $xth(me,cmds,selid)) && ($pid == $lpid) && ($xth(me,cmds,inspid) == 0)} { xth_me_cmds_end_line } else { # vytvori novy bod # ak sme klikli na XVIbod, tak hodime presne tam if {[regexp {XVIstI(\d+)S(\d+)} [$xth(me,can) itemcget $tagOrId -tags] dum imgx sti]} { set x [lindex [lindex $xth(me,imgs,$imgx,XVIstationsX) $sti] 0] set y [lindex [lindex $xth(me,imgs,$imgx,XVIstationsX) $sti] 1] } xth_me_cmds_start_create_linept $tagOrId $x $y $mx $my } } 3 { if {([string length $id] > 0) && ($xth(me,cmds,$id,ct) == 3)} { xth_me_cmds_insert_area_lineid $id $mx $my } } 4 { xth_me_cmds_scrap_scale $x $y } 5 { xth_me_cmds_scrap_sketch_insert $tagOrId } } } proc xth_me_cmds_end_point {} { set recmds "xth_me_cmds_set_mode 0" set uncmds "xth_me_cmds_set_mode 1" eval $recmds xth_me_unredo_action [mc "end point insertion"] $uncmds $recmds } proc xth_me_cmds_click_lineln {id tagOrId mx my} { global xth xth_me_cmds_update {} if {[llength $id] == 2} { set pid [lindex $id 1] set id [lindex $id 0] } else { set pid 0 } switch $xth(me,cmds,mode) { 3 { if {$xth(me,cmds,$id,ct) == 3} { xth_me_cmds_insert_area_lineid $id $mx $my } } 4 { xth_me_cmds_scrap_scale } 0 { xth_me_cmds_select "$id $pid" } default { xth_me_cmds_click_area ln$id.$pid $mx $my } } } proc xth_me_cmds_click_area {tagOrId x y} { global xth xth_me_cmds_click {} $tagOrId [xth_me_can2realx [$xth(me,can) canvasx $x]] [xth_me_can2realy [$xth(me,can) canvasy $y]] $x $y } proc xth_me_cmds_set_mode {nmode} { global xth if {!$xth(me,fopen)} { return } if {($nmode == 0) && ($xth(me,cmds,mode) == 0)} { xth_me_cmds_select_nopoint } set xth(me,cmds,mode) $nmode switch $nmode { 0 { $xth(me,mbar) configure -text [mc "select object"] -bg green -fg black $xth(ctrl,me,ac).ins configure -text [mc "Insert"] } 1 { $xth(me,mbar) configure -text [mc "insert point"] -bg red -fg white } 2 { $xth(me,mbar) configure -text [mc "insert line point"] -bg red -fg white } 3 { $xth(me,mbar) configure -text [mc "insert area border"] -bg red -fg white $xth(ctrl,me,ac).ins configure -text [mc "Select"] } 4 { $xth(me,mbar) configure -text [mc "scale scrap"] -bg red -fg white } 5 { $xth(me,mbar) configure -text [mc "insert sketch"] -bg red -fg white } } set xth(tb,me,action) $nmode } proc xth_me_cmds_create_point {ix mode x y type opts} { global xth xth_me_cmds_update {} set id [xth_me_cmds_create 2 {} $ix] set xth(me,cmds,$id,x) $x set xth(me,cmds,$id,y) $y if {$mode && ([string length $opts] < 1)} { if {([string length $type] < 1) && \ [string equal $xth(me,dflt,point,type) station] && \ [regexp {\-name\s+(\S+)} $xth(me,dflt,point,options) dum stname]} { regsub {\-name\s+(\S+)} $xth(me,dflt,point,options) "-name [xth_incr_station_name $stname $xth(me,snai)]" xth(me,dflt,point,options) } set opts $xth(me,dflt,point,options) } if {[string length $type] > 0} { set xth(me,cmds,$id,type) $type } else { set xth(me,cmds,$id,type) $xth(me,dflt,point,type) } # nastavit meno set optl [xth_me_cmds_get_line_option $opts id] if {[lindex $optl 2]} { set xth(me,cmds,$id,name) [lindex $optl 0] set opts [lindex $optl 1] } # nastavit rotation if {$mode} { set xth(me,cmds,$id,rotation) $xth(me,dflt,point,rotation) } else { set xth(me,cmds,$id,rotation) {} } set optl [xth_me_cmds_get_line_option $opts orientation] if {[lindex $optl 2]} { set xth(me,cmds,$id,rotation) [lindex $optl 0] set opts [lindex $optl 1] } else { set optl [xth_me_cmds_get_line_option $opts orient] if {[lindex $optl 2]} { set xth(me,cmds,$id,rotation) [lindex $optl 0] set opts [lindex $optl 1] } } # # nastavit xsize # if {$mode} { # set xth(me,cmds,$id,xsize) $xth(me,dflt,point,xsize) # } else { set xth(me,cmds,$id,xsize) {} # } # set optl [xth_me_cmds_get_line_option $opts size] # if {[lindex $optl 2]} { # set xth(me,cmds,$id,xsize) [lindex $optl 0] # set xth(me,cmds,$id,ysize) [lindex $optl 0] # set opts [lindex $optl 1] # } # set optl [xth_me_cmds_get_line_option $opts "x-size"] # if {[lindex $optl 2]} { # set xth(me,cmds,$id,xsize) [lindex $optl 0] # set opts [lindex $optl 1] # } # # # nastavit ysize # if {$mode} { # set xth(me,cmds,$id,ysize) $xth(me,dflt,point,ysize) # } else { set xth(me,cmds,$id,ysize) {} # } # set optl [xth_me_cmds_get_line_option $opts "y-size"] # if {[lindex $optl 2]} { # set xth(me,cmds,$id,ysize) [lindex $optl 0] # set opts [lindex $optl 1] # } # # if {([string length $xth(me,cmds,$id,ysize)] > 0) && # ([string length $xth(me,cmds,$id,xsize)] == 0)} { # set xth(me,cmds,$id,xsize) $xth(me,cmds,$id,ysize) # set xth(me,cmds,$id,ysize) {} # } # nastavit options regsub {^\s*} $opts "" opts regsub {\s*$} $opts "" opts set xth(me,cmds,$id,options) $opts xth_me_cmds_draw_point $id if {$mode} { $xth(me,can) itemconfigure pt$id -fill lightBlue } xth_me_cmds_update_list $id xth_me_cmds_update_point_data $id if {$mode} { xth_me_unredo_action [mc "creating point"] \ "xth_me_cmds_delete $id" \ "xth_me_cmds_undelete $id 0 [lsearch $xth(me,cmds,xlist) $id]" xth_me_cmds_select $id } } proc xth_me_cmds_update_point_data {id} { global xth set d "point $xth(me,cmds,$id,x) $xth(me,cmds,$id,y) $xth(me,cmds,$id,type)" set xth(me,dflt,point,type) $xth(me,cmds,$id,type) if {[string length $xth(me,cmds,$id,name)] > 0} { set d "$d -id $xth(me,cmds,$id,name)" } if {[string length $xth(me,cmds,$id,rotation)] > 0} { set d "$d -orientation $xth(me,cmds,$id,rotation)" } set xth(me,dflt,point,rotation) $xth(me,cmds,$id,rotation) if {[string length $xth(me,cmds,$id,xsize)] > 0} { set d "$d -x-size $xth(me,cmds,$id,xsize)" } set xth(me,dflt,point,xsize) $xth(me,cmds,$id,xsize) if {[string length $xth(me,cmds,$id,ysize)] > 0} { set d "$d -y-size $xth(me,cmds,$id,ysize)" } set xth(me,dflt,point,ysize) $xth(me,cmds,$id,ysize) if {[string length $xth(me,cmds,$id,options)] > 0} { set d "$d $xth(me,cmds,$id,options)" } set xth(me,dflt,point,options) $xth(me,cmds,$id,options) catch { set ttype [lindex $d 3] set xth(me,cmds,$id,sbar) "$d" if {([string length $ttype] > 0)} { set ttyp [ mc "point $ttype"] if {![string equal $ttype $ttyp]} { set nd [lreplace $d 3 3 "$ttype:$ttyp"] set xth(me,cmds,$id,sbar) "$nd" } } } set xth(me,cmds,$id,data) "$d" } proc xth_me_cmds_move_point_xctrl {id} { global xth set cx [xth_me_real2canx $xth(me,cmds,$id,x)] set cy [xth_me_real2cany $xth(me,cmds,$id,y)] set c1 [expr $cx - 3 * $xth(gui,me,point,psize)] set c2 [expr $cy - 3 * $xth(gui,me,point,psize)] set c3 [expr $cx + 3 * $xth(gui,me,point,psize)] set c4 [expr $cy + 3 * $xth(gui,me,point,psize)] $xth(me,can) coords $xth(me,canid,point,selector) [list $c1 $c2 $c3 $c4] } proc xth_me_cmds_show_point_xctrl {id} { global xth $xth(me,can) itemconfigure $xth(me,canid,point,selector) -state normal $xth(me,can) raise $xth(me,canid,point,selector) $xth(me,can) raise ptfill $xth(me,can) lower ptfill point xth_me_cmds_move_point_xctrl $id xth_me_cmds_show_point_fill_xctrl $id $xth(me,can) raise pt$id } proc xth_me_cmds_show_point_fill_xctrl {id} { global xth if {$xth(ctrl,me,point,xsid) || $xth(ctrl,me,point,ysid)} { xth_me_cmds_configure_point_fill_xctrl $id 1 xth_me_cmds_move_point_fill_xctrl $id $xth(ctrl,me,point,rot) $xth(ctrl,me,point,xs) $xth(ctrl,me,point,ys) } elseif {$xth(ctrl,me,point,rotid)} { xth_me_cmds_configure_point_fill_xctrl $id 0 xth_me_cmds_move_point_fill_xctrl $id $xth(ctrl,me,point,rot) $xth(ctrl,me,point,xs) $xth(ctrl,me,point,ys) } else { xth_me_cmds_configure_point_fill_xctrl {} 0 } } proc xth_me_cmds_hide_point_xctrl {} { global xth $xth(me,can) itemconfigure $xth(me,canid,point,selector) -state hidden xth_me_cmds_configure_point_fill_xctrl {} {} } proc xth_me_cmds_update_point_ctrl {id} { global xth if {[string length $id] > 0} { $xth(ctrl,me,point).posl configure -state normal $xth(ctrl,me,point).posx configure -state normal $xth(ctrl,me,point).posy configure -state normal $xth(ctrl,me,point).upd configure -state normal $xth(ctrl,me,point).typl configure -state normal $xth(ctrl,me,point).typ configure -state normal $xth(ctrl,me,point).namel configure -state normal $xth(ctrl,me,point).name configure -state normal $xth(ctrl,me,point).optl configure -state normal $xth(ctrl,me,point).opt configure -state normal $xth(ctrl,me,point).rotc configure -state normal $xth(ctrl,me,point).rot configure -state normal $xth(ctrl,me,point).xszc configure -state normal $xth(ctrl,me,point).xsz configure -state normal $xth(ctrl,me,point).yszc configure -state normal $xth(ctrl,me,point).ysz configure -state normal $xth(ctrl,me,point).theme configure -state normal $xth(ctrl,me,point).themetype configure -state normal set xth(ctrl,me,point,x) $xth(me,cmds,$id,x) set xth(ctrl,me,point,y) $xth(me,cmds,$id,y) set xth(ctrl,me,point,type) $xth(me,cmds,$id,type) set xth(ctrl,me,point,name) $xth(me,cmds,$id,name) set xth(ctrl,me,point,opts) $xth(me,cmds,$id,options) set at [lindex $xth(me,themes,list) $xth(me,acttheme)] set tx [lsearch -exact $xth(me,themes,$at,point,hidelist) $xth(me,cmds,$id,type)] if {$tx < 0} { set xth(ctrl,me,point,themetype) {} } else { set xth(ctrl,me,point,themetype) [lindex $xth(me,themes,$at,point,showlist) $tx] } set xth(ctrl,me,point,rot) $xth(me,cmds,$id,rotation) if {[string length $xth(me,cmds,$id,rotation)] > 0} { set xth(ctrl,me,point,rotid) 1 } else { set xth(ctrl,me,point,rotid) 0 } set xth(ctrl,me,point,xs) $xth(me,cmds,$id,xsize) if {[string length $xth(me,cmds,$id,xsize)] > 0} { set xth(ctrl,me,point,xsid) 1 } else { set xth(ctrl,me,point,xsid) 0 } set xth(ctrl,me,point,ys) $xth(me,cmds,$id,ysize) if {[string length $xth(me,cmds,$id,ysize)] > 0} { set xth(ctrl,me,point,ysid) 1 } else { set xth(ctrl,me,point,ysid) 0 } xth_me_cmds_show_point_xctrl $id xth_me_prev_cmd $xth(me,cmds,$id,data) } else { set xth(ctrl,me,point,x) {} set xth(ctrl,me,point,y) {} set xth(ctrl,me,point,type) $xth(me,dflt,point,type) set xth(ctrl,me,point,name) {} set xth(ctrl,me,point,opts) $xth(me,dflt,point,options) set xth(ctrl,me,point,rot) $xth(me,dflt,point,rotation) if {[string length $xth(me,dflt,point,rotation)] > 0} { set xth(ctrl,me,point,rotid) 1 } else { set xth(ctrl,me,point,rotid) 0 } set xth(ctrl,me,point,xs) $xth(me,dflt,point,xsize) if {[string length $xth(me,dflt,point,xsize)] > 0} { set xth(ctrl,me,point,xsid) 1 } else { set xth(ctrl,me,point,xsid) 0 } set xth(ctrl,me,point,ys) $xth(me,dflt,point,ysize) if {[string length $xth(me,dflt,point,ysize)] > 0} { set xth(ctrl,me,point,ysid) 1 } else { set xth(ctrl,me,point,ysid) 0 } $xth(ctrl,me,point).posl configure -state disabled $xth(ctrl,me,point).posx configure -state disabled $xth(ctrl,me,point).posy configure -state disabled $xth(ctrl,me,point).upd configure -state disabled $xth(ctrl,me,point).typl configure -state disabled $xth(ctrl,me,point).theme configure -state disabled $xth(ctrl,me,point).themetype configure -state disabled $xth(ctrl,me,point).typ configure -state disabled $xth(ctrl,me,point).namel configure -state disabled $xth(ctrl,me,point).name configure -state disabled $xth(ctrl,me,point).optl configure -state disabled $xth(ctrl,me,point).opt configure -state disabled $xth(ctrl,me,point).rotc configure -state disabled $xth(ctrl,me,point).rot configure -state disabled $xth(ctrl,me,point).xszc configure -state disabled $xth(ctrl,me,point).xsz configure -state disabled $xth(ctrl,me,point).yszc configure -state disabled $xth(ctrl,me,point).ysz configure -state disabled xth_me_cmds_hide_point_xctrl } } proc xth_me_cmds_update_point_vars {id} { global xth set xth(ctrl,me,point,x) $xth(me,cmds,$id,x) set xth(ctrl,me,point,y) $xth(me,cmds,$id,y) set xth(ctrl,me,point,type) $xth(me,cmds,$id,type) set xth(ctrl,me,point,name) $xth(me,cmds,$id,name) set xth(ctrl,me,point,opts) $xth(me,cmds,$id,options) set xth(ctrl,me,point,rot) $xth(me,cmds,$id,rotation) set at [lindex $xth(me,themes,list) $xth(me,acttheme)] set tx [lsearch -exact $xth(me,themes,$at,point,hidelist) $xth(me,cmds,$id,type)] if {$tx < 0} { set xth(ctrl,me,point,themetype) {} } else { set xth(ctrl,me,point,themetype) [lindex $xth(me,themes,$at,point,showlist) $tx] } if {[string length $xth(me,cmds,$id,rotation)] > 0} { set xth(ctrl,me,point,rotid) 1 } else { set xth(ctrl,me,point,rotid) 0 } set xth(ctrl,me,point,xs) $xth(me,cmds,$id,xsize) if {[string length $xth(me,cmds,$id,xsize)] > 0} { set xth(ctrl,me,point,xsid) 1 } else { set xth(ctrl,me,point,xsid) 0 } set xth(ctrl,me,point,ys) $xth(me,cmds,$id,ysize) if {[string length $xth(me,cmds,$id,ysize)] > 0} { set xth(ctrl,me,point,ysid) 1 } else { set xth(ctrl,me,point,ysid) 0 } xth_me_cmds_move_point_xctrl $id xth_me_cmds_show_point_fill_xctrl $id } proc xth_me_cmds_update_area {id ntype nopt} { global xth set otype $xth(me,cmds,$id,type) set oopt $xth(me,cmds,$id,options) regsub {^\s*} $nopt "" nopt regsub {\s*$} $nopt "" nopt if {[string length $ntype] < 1} { set ntype $otype } if {$xth(gui,me,type_reset_options) && (![string equal $ntype $otype]) && [string equal $nopt $oopt]} { set nopt {} } if {[regexp {^([^ :]+)\:([^ :]+)$} $ntype dum xntype xstype]} { if {![string equal $xntype u]} { set ntype $xntype set nopt [regsub -all {(^|\s+)\-subtype\s+\S+} $nopt {}] set nopt [regsub -all {^\s+|\s+$} $nopt {}] set nopt "-subtype $xstype $nopt" set nopt [regsub -all {^\s+|\s+$} $nopt {}] } } if {![string equal "$ntype $nopt" "$otype $oopt"]} { xth_me_unredo_action [mc "area changes"] \ "xth_me_cmds_update_area $id $otype [list $oopt]; xth_me_cmds_select $id" \ "xth_me_cmds_update_area $id $ntype [list $nopt]; xth_me_cmds_select $id" set xth(me,cmds,$id,type) $ntype set xth(me,cmds,$id,options) $nopt xth_me_cmds_update_area_data $id xth_me_cmds_update_list $id } } proc xth_me_cmds_update_point {id nx ny ntype nname nopt nrot nxs nys} { global xth set ox $xth(me,cmds,$id,x) set oy $xth(me,cmds,$id,y) set otype $xth(me,cmds,$id,type) set oname $xth(me,cmds,$id,name) set oopt $xth(me,cmds,$id,options) set orot $xth(me,cmds,$id,rotation) set oxs $xth(me,cmds,$id,xsize) set oys $xth(me,cmds,$id,ysize) regsub {^\s*} $nopt "" nopt regsub {\s*$} $nopt "" nopt if {[string length $ntype] < 1} { set ntype $otype } #reset point options & rotation when type changes if {$xth(gui,me,type_reset_options) && (![string equal $ntype $otype]) && [string equal $nopt $oopt] && [string equal $nrot $orot] && [string equal $nxs $oxs] && [string equal $nys $oys]} { set nopt {} set nrot {} set nxs {} set nys {} } if {[regexp {^([^ :]+)\:([^ :]+)$} $ntype dum xntype xstype]} { if {![string equal $xntype u]} { set ntype $xntype set nopt [regsub -all {(^|\s+)\-subtype\s+\S+} $nopt {}] set nopt [regsub -all {^\s+|\s+$} $nopt {}] set nopt "-subtype $xstype $nopt" set nopt [regsub -all {^\s+|\s+$} $nopt {}] } } if {[string length $nrot] > 0} { if {[catch {expr $nrot}]} { set nrot $orot } elseif {($nrot < 0.0) || ($nrot >= 360.0)} { set nrot $orot } } if {[catch {expr $nx}]} { set nx $ox } if {[catch {expr $ny}]} { set ny $oy } if {[string length $nxs] > 0} { if {[catch {expr $nxs}]} { set nxs $oxs } elseif {$nxs < 0.0} { set nxs $oxs } } if {[string length $nys] > 0} { if {[catch {expr $nys}]} { set nys $oys } elseif {$nys < 0.0} { set nys $oys } } # if {([string length $nys] > 0) && ([string length $nxs] == 0)} { # set nxs $nys # set nys {} # } if {![string equal "$nx $ny $ntype $nname $nopt $nrot $nxs $nys" "$ox $oy $otype $oname $oopt $orot $oxs $oys"]} { xth_me_unredo_action [mc "point changes"] \ "xth_me_cmds_update_point $id $ox $oy $otype [list $oname] [list $oopt] [list $orot] [list $oxs] [list $oys]; xth_me_cmds_select $id" \ "xth_me_cmds_update_point $id $nx $ny $ntype [list $nname] [list $nopt] [list $nrot] [list $nxs] [list $nys]; xth_me_cmds_select $id" set xth(me,cmds,$id,x) $nx set xth(me,cmds,$id,y) $ny set xth(me,cmds,$id,type) $ntype set xth(me,cmds,$id,name) $nname set xth(me,cmds,$id,options) $nopt set xth(me,cmds,$id,rotation) $nrot set xth(me,cmds,$id,xsize) $nxs set xth(me,cmds,$id,ysize) $nys $xth(me,can) coords pt$id [xth_me_cmds_calc_point_coords $id] xth_me_cmds_update_point_data $id xth_me_cmds_update_list $id } } proc xth_me_cmds_calc_point_coords {id} { global xth set x1 [expr [xth_me_real2canx $xth(me,cmds,$id,x)] - $xth(gui,me,point,psize)] set y1 [expr [xth_me_real2cany $xth(me,cmds,$id,y)] - $xth(gui,me,point,psize)] set x2 [expr [xth_me_real2canx $xth(me,cmds,$id,x)] + $xth(gui,me,point,psize)] set y2 [expr [xth_me_real2cany $xth(me,cmds,$id,y)] + $xth(gui,me,point,psize)] return [list $x1 $y1 $x2 $y2] # return [list \ # [expr [xth_me_real2canx $xth(me,cmds,$id,x)] - $xth(gui,me,point,psize)] \ # [expr [xth_me_real2cany $xth(me,cmds,$id,y)] - $xth(gui,me,point,psize)] \ # [expr [xth_me_real2canx $xth(me,cmds,$id,x)] + $xth(gui,me,point,psize)] \ # [expr [xth_me_real2cany $xth(me,cmds,$id,y)] + $xth(gui,me,point,psize)] # ] } proc xth_me_cmds_draw_point {id} { global xth $xth(me,can) create oval [xth_me_cmds_calc_point_coords $id] \ -tags "command point pt$id" -width 1 -outline blue -fill blue $xth(me,can) bind pt$id "$xth(me,can) itemconfigure pt$id -fill cyan; xth_status_bar_push me; xth_status_bar_status me \"\$xth(me,cmds,$id,listix): \$xth(me,cmds,$id,sbar)\"" $xth(me,can) bind pt$id "$xth(me,can) itemconfigure pt$id -fill \[$xth(me,can) itemcget pt$id -outline\]; xth_status_bar_pop me" $xth(me,can) bind pt$id <1> "xth_me_cmds_click $id pt$id \$xth(me,cmds,$id,x) \$xth(me,cmds,$id,y) %x %y" $xth(me,can) bind pt$id <$xth(gui,rmb)> "xth_me_show_context_menu $id %x %y" $xth(me,can) bind pt$id "xth_me_cmds_special_select $id %x %y" $xth(me,can) bind pt$id <$xth(kb_control)-1> "xth_me_cmds_click_area pt$id %x %y" } proc xth_me_cmds_special_select {id x y} { global xth if {[llength $id] == 2} { set pid [lindex $id 1] set id [lindex $id 0] } else { set pid 0 } $xth(me,can) raise point if {$xth(me,cmds,selid) != $id} { xth_me_cmds_select "$id $pid" if {$pid != 0} { xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } else { xth_ctrl_scroll_to me point xth_ctrl_maximize me point } } elseif {($xth(me,cmds,$id,ct) == 3) && ($xth(me,cmds,selpid) != $pid)} { xth_me_cmds_select_linept $id $pid xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } else { $xth(me,can) dtag all nearest if {$pid != 0} { set utag pt$id.$pid } else { set utag pt$id } $xth(me,can) addtag nearest closest [$xth(me,can) canvasx $x] [$xth(me,can) canvasy $y] 0 $utag set tgs [$xth(me,can) itemcget nearest -tags] #puts $tgs if {[regexp "(^|\\s)pt(\\d+)($|\\s)" $tgs d1 d2 nid]} { #puts "select $nid" xth_me_cmds_select $nid xth_ctrl_scroll_to me point xth_ctrl_maximize me point catch {$xth(me,can) lower $utag point} catch {$xth(me,can) raise $utag line} } elseif {[regexp "(^|\\s)pt(\\d+)\.(\\d+)($|\\s)" $tgs d1 d2 nid npid]} { #puts "select $nid $npid" xth_me_cmds_select "$nid $npid" if {$npid != 0} { xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } else { xth_ctrl_scroll_to me point xth_ctrl_maximize me point } catch {$xth(me,can) lower $utag point} catch {$xth(me,can) raise $utag line} } } } proc xth_me_cmds_start_point_drag {id x y} { global xth xth_me_cmds_update {} xth_me_cmds_drag_point_config_xctrl $id set xth(me,point,drag_mx) $x set xth(me,point,drag_my) $y set xth(me,point,drag_px) $xth(me,cmds,$id,x) set xth(me,point,drag_py) $xth(me,cmds,$id,y) set xth(me,point,drag_benter) [$xth(me,can) bind pt$id ] set xth(me,point,drag_bleave) [$xth(me,can) bind pt$id ] $xth(me,can) bind pt$id "" $xth(me,can) bind pt$id "" $xth(me,can) itemconfigure pt$id -fill {} $xth(me,can) bind pt$id "xth_me_cmds_point_drag $id %x %y 1" $xth(me,can) bind pt$id "xth_me_cmds_end_point_drag $id %x %y 1" $xth(me,can) bind pt$id <$xth(kb_control)-B1-Motion> "xth_me_cmds_point_drag $id %x %y 0" $xth(me,can) bind pt$id <$xth(kb_control)-B1-ButtonRelease> "xth_me_cmds_end_point_drag $id %x %y 0" $xth(me,can) configure -cursor {} } proc xth_me_cmds_drag_to {id pid x y} { global xth $xth(me,can) dtag all nearest if {[string length $pid] > 0} { set stt pt$id.$pid } else { set stt pt$id } $xth(me,can) addtag nearest closest [$xth(me,can) canvasx $x] \ [$xth(me,can) canvasy $y] 0 $stt set tgs [$xth(me,can) itemcget nearest -tags] if {[regexp "(^|\\s)pt(\\d+)($|\\s)" $tgs d1 d2 nid]} { # je vybraty bod, nastavime suradnice podla neho set nx $xth(me,cmds,$nid,x) set ny $xth(me,cmds,$nid,y) return [list 1 $nx $ny] } elseif {[regexp "(^|\\s)pt(\\d+)\.(\\d+)($|\\s)" $tgs d1 d2 nid npid]} { # je vybraty bod na ciare, nastavime suradnice podla neho set nx $xth(me,cmds,$nid,$npid,x) set ny $xth(me,cmds,$nid,$npid,y) return [list 1 $nx $ny] } elseif {[regexp {(^|\s)XVIstI(\d+)S(\d+)} $tgs d1 d2 imgx sti]} { set nx [lindex [lindex $xth(me,imgs,$imgx,XVIstationsX) $sti] 0] set ny [lindex [lindex $xth(me,imgs,$imgx,XVIstationsX) $sti] 1] return [list 1 $nx $ny] } return 0 } proc xth_me_cmds_point_drag {id x y dragto} { global xth set nx [expr $xth(me,point,drag_px) - [expr double($xth(me,point,drag_mx) - $x) * 100.0 / $xth(me,zoom)]] set ny [expr $xth(me,point,drag_py) + [expr double($xth(me,point,drag_my) - $y) * 100.0 / $xth(me,zoom)]] set dts 0 if $dragto { set dtl [xth_me_cmds_drag_to $id {} $x $y] if {[lindex $dtl 0]} { set nx [lindex $dtl 1] set ny [lindex $dtl 2] set dts 1 } } if $dts { $xth(me,can) itemconfigure pt$id -fill cyan } else { $xth(me,can) itemconfigure pt$id -fill {} } set xth(me,cmds,$id,x) $nx set xth(me,cmds,$id,y) $ny set xth(ctrl,me,point,x) $nx set xth(ctrl,me,point,y) $ny xth_me_cmds_move_point_xctrl $id xth_me_cmds_move_point_fill_xctrl $id $xth(me,cmds,$id,rotation) $xth(me,cmds,$id,xsize) $xth(me,cmds,$id,ysize) $xth(me,can) coords pt$id [xth_me_cmds_calc_point_coords $id] update idletasks } proc xth_me_cmds_end_point_drag {id x y dragto} { global xth xth_me_cmds_point_drag $id $x $y $dragto set xth(me,cmds,$id,x) $xth(me,point,drag_px) set xth(me,cmds,$id,y) $xth(me,point,drag_py) $xth(me,can) bind pt$id "" $xth(me,can) bind pt$id "" $xth(me,can) bind pt$id <$xth(kb_control)-B1-Motion> "" $xth(me,can) bind pt$id <$xth(kb_control)-B1-ButtonRelease> "" $xth(me,can) bind pt$id $xth(me,point,drag_benter) $xth(me,can) bind pt$id $xth(me,point,drag_bleave) $xth(me,can) itemconfigure pt$id -fill cyan $xth(me,can) configure -cursor crosshair set xth(me,unredola) "point dragging" xth_me_cmds_update {} xth_me_cmds_end_drag_point_config_xctrl $id } proc xth_me_cmds_configure_point_fill_xctrl {id sid} { global xth if {[string length $id] > 0} { ## DISABLED # $xth(me,can) itemconfigure $xth(me,canid,point,fx) -state normal $xth(me,can) bind $xth(me,canid,point,fx) <1> \ "xth_me_cmds_start_point_fdrag $xth(me,canid,point,fx) $id x %x %y" $xth(me,can) bind $xth(me,canid,point,fx) \ "$xth(me,can) itemconfigure $xth(me,canid,point,fx) -fill #ffda00" $xth(me,can) bind $xth(me,canid,point,fx) \ "$xth(me,can) itemconfigure $xth(me,canid,point,fx) -fill red" $xth(me,can) itemconfigure $xth(me,canid,point,fy) -state normal $xth(me,can) bind $xth(me,canid,point,fy) <1> \ "xth_me_cmds_start_point_fdrag $xth(me,canid,point,fy) $id y %x %y" $xth(me,can) bind $xth(me,canid,point,fy) \ "$xth(me,can) itemconfigure $xth(me,canid,point,fy) -fill #ffda00" $xth(me,can) bind $xth(me,canid,point,fy) \ "$xth(me,can) itemconfigure $xth(me,canid,point,fy) -fill red" #$xth(me,can) itemconfigure $xth(me,canid,point,fxc) -state normal #$xth(me,can) bind $xth(me,canid,point,fxc) \ # "$xth(me,can) itemconfigure $xth(me,canid,point,fxc) -fill yellow" #$xth(me,can) bind $xth(me,canid,point,fxc) \ # "$xth(me,can) itemconfigure $xth(me,canid,point,fxc) -fill red" #$xth(me,can) bind $xth(me,canid,point,fxc) <1> \ # "xth_me_cmds_start_point_fdrag $xth(me,canid,point,fxc) $id x %x %y" #$xth(me,can) itemconfigure $xth(me,canid,point,fyc) -state normal #$xth(me,can) bind $xth(me,canid,point,fyc) \ # "$xth(me,can) itemconfigure $xth(me,canid,point,fyc) -fill yellow" #$xth(me,can) bind $xth(me,canid,point,fyc) \ # "$xth(me,can) itemconfigure $xth(me,canid,point,fyc) -fill red" #$xth(me,can) bind $xth(me,canid,point,fyc) <1> \ # "xth_me_cmds_start_point_fdrag $xth(me,canid,point,fyc) $id y %x %y" if {$sid} { $xth(me,can) itemconfigure $xth(me,canid,point,fill) -state normal #$xth(me,can) bind $xth(me,canid,point,fill) <1> \ # "xth_me_cmds_start_point_fdrag $xth(me,canid,point,fill) $id z %x %y" } else { $xth(me,can) itemconfigure $xth(me,canid,point,fill) -state hidden } } else { # $xth(me,can) bind $xth(me,canid,point,fxc) "" # $xth(me,can) bind $xth(me,canid,point,fxc) "" # $xth(me,can) bind $xth(me,canid,point,fyc) "" # $xth(me,can) bind $xth(me,canid,point,fyc) "" $xth(me,can) bind $xth(me,canid,point,fx) <1> "" $xth(me,can) bind $xth(me,canid,point,fy) <1> "" $xth(me,can) bind $xth(me,canid,point,fx) "" $xth(me,can) bind $xth(me,canid,point,fx) "" $xth(me,can) bind $xth(me,canid,point,fy) "" $xth(me,can) bind $xth(me,canid,point,fy) "" #$xth(me,can) bind $xth(me,canid,point,fill) <1> "" $xth(me,can) itemconfigure ptfill -state hidden } } proc xth_me_cmds_move_point_fill_xctrl {id rot sx sy} { global xth if {[string length $rot] > 0} { set rot [expr double($rot) / 180 * 3.14159265359] } else { set rot 0.0 } set setfsx 0 if {[string length $sx] > 0} { set sx [expr $sx * 0.01 * $xth(me,zoom)] set fsx $sx } else { set sx 30.0 set setfsx 1 } # if {[string length $sy] > 0} { # set sy [expr $sy * 0.01 * $xth(me,zoom)] # } else { # if {[string length $sx] > 0} { # set sy $sx # } else { # set sy 30.0 # } # } if {[string length $sy] > 0} { set sy [expr $sy * 0.01 * $xth(me,zoom)] set fsy $sy } else { set sy 30.0 set fsy $sx } if {$setfsx} { set fsx $sy } set x [xth_me_real2canx $xth(me,cmds,$id,x)] set y [xth_me_real2cany $xth(me,cmds,$id,y)] set ca [expr cos($rot)] set sa [expr sin($rot)] set xvx [expr $ca * $sx] set xvy [expr $sa * $sx] set yvx [expr $sa * $sy] set yvy [expr - $ca * $sy] set fxvx [expr $ca * $fsx] set fxvy [expr $sa * $fsx] set fyvx [expr $sa * $fsy] set fyvy [expr - $ca * $fsy] $xth(me,can) coords $xth(me,canid,point,fx) $x $y [expr $x + $xvx] [expr $y + $xvy] set xth(me,canid,point,fx_tox) [expr $x + $xvx] set xth(me,canid,point,fx_toy) [expr $y + $xvy] #$xth(me,can) coords $xth(me,canid,point,fxc) [expr $x + $xvx - $xth(gui,me,point,cpsize)] [expr $y + $xvy - $xth(gui,me,point,cpsize)] [expr $x + $xvx + $xth(gui,me,point,cpsize)] [expr $y + $xvy + $xth(gui,me,point,cpsize)] $xth(me,can) coords $xth(me,canid,point,fy) $x $y [expr $x + $yvx] [expr $y + $yvy] set xth(me,canid,point,fy_tox) [expr $x + $yvx] set xth(me,canid,point,fy_toy) [expr $y + $yvy] #$xth(me,can) coords $xth(me,canid,point,fyc) [expr $x + $yvx - $xth(gui,me,point,cpsize)] [expr $y + $yvy - $xth(gui,me,point,cpsize)] [expr $x + $yvx + $xth(gui,me,point,cpsize)] [expr $y + $yvy + $xth(gui,me,point,cpsize)] $xth(me,can) coords $xth(me,canid,point,fill) [expr $x + $fxvx + $fyvx] [expr $y + $fxvy + $fyvy] \ [expr $x + $fxvx - $fyvx] [expr $y + $fxvy - $fyvy] [expr $x - $fxvx - $fyvx] [expr $y - $fxvy - $fyvy] \ [expr $x - $fxvx + $fyvx] [expr $y - $fxvy + $fyvy] update idletasks } proc xth_me_cmds_point_change_state {} { global xth set newrotid $xth(ctrl,me,point,rotid) set newxsid $xth(ctrl,me,point,xsid) set newysid $xth(ctrl,me,point,ysid) xth_me_cmds_update {} if {$newrotid && \ ([string length $xth(ctrl,me,point,rot)] < 1)} { set xth(ctrl,me,point,rot) 0.0 } elseif {(! $newrotid) && \ ([string length $xth(ctrl,me,point,rot)] > 0)} { set xth(ctrl,me,point,rot) {} } if {$newxsid && \ ([string length $xth(ctrl,me,point,xs)] < 1)} { set xth(ctrl,me,point,xs) 40.0 } elseif {(! $newxsid) && \ ([string length $xth(ctrl,me,point,xs)] > 0)} { set xth(ctrl,me,point,xs) {} # set xth(ctrl,me,point,ys) {} # set xth(ctrl,me,point,ysid) 0 } if {$newysid && \ ([string length $xth(ctrl,me,point,ys)] < 1)} { set xth(ctrl,me,point,ys) 40.0 } elseif {(! $newysid) && \ ([string length $xth(ctrl,me,point,ys)] > 0)} { set xth(ctrl,me,point,ys) {} } # if {$newysid && \ # ([string length $xth(ctrl,me,point,ys)] < 1) && \ # $newxsid} { # set xth(ctrl,me,point,ys) 40.0 # } elseif {((! $newysid) && \ # ([string length $xth(ctrl,me,point,ys)] > 0)) || \ # (! $newxsid)} { # set xth(ctrl,me,point,ys) {} # set xth(ctrl,me,point,ysid) 0 # } xth_me_cmds_update {} } proc xth_me_cmds_start_point_fdrag {tagOrId id ax x y} { global xth xth_me_cmds_update {} #if {[string equal $ax z]} { # set distx [expr hypot([$xth(me,can) canvasx $x] - $xth(me,canid,point,fx_tox), \ # [$xth(me,can) canvasy $y] - $xth(me,canid,point,fx_toy))] # set disty [expr hypot([$xth(me,can) canvasx $x] - $xth(me,canid,point,fy_tox), \ # [$xth(me,can) canvasy $y] - $xth(me,canid,point,fy_toy))] # if {$disty < $distx} { # set ax y # } else { # set ax x # } #} set dx [expr [xth_me_can2realx [$xth(me,can) canvasx $x]] - $xth(me,cmds,$id,x)] set dy [expr [xth_me_can2realy [$xth(me,can) canvasy $y]] - $xth(me,cmds,$id,y)] if {[string length $xth(me,cmds,$id,rotation)] == 0} { set xth(me,point,fdrag_rot) 0 } else { set xth(me,point,fdrag_rot) 1 set xth(me,point,fdrag_orot) [expr atan2($dy,$dx)] } if {([string length $xth(me,cmds,$id,xsize)] == 0) && ([string length $xth(me,cmds,$id,ysize)] == 0)} { set xth(me,point,fdrag_size) 0 } elseif {[string equal $ax y] && ([string length $xth(me,cmds,$id,ysize)] == 0)} { set xth(me,point,fdrag_size) 0 } elseif {[string equal $ax x] && ([string length $xth(me,cmds,$id,xsize)] == 0)} { set xth(me,point,fdrag_size) 0 } else { set xth(me,point,fdrag_ax) $ax set xth(me,point,fdrag_size) 1 set xth(me,point,fdrag_osize) [expr hypot($dy,$dx)] } $xth(me,can) itemconfigure $tagOrId -fill #ffda00 set xth(me,point,fdrag_benter) [$xth(me,can) bind $tagOrId ] set xth(me,point,fdrag_bleave) [$xth(me,can) bind $tagOrId ] $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "xth_me_cmds_point_fdrag $id %x %y" $xth(me,can) bind $tagOrId "xth_me_cmds_end_point_fdrag $tagOrId $id %x %y" $xth(me,can) configure -cursor {} } proc xth_me_cmds_point_fdrag {id x y} { global xth set dx [expr [xth_me_can2realx [$xth(me,can) canvasx $x]] - $xth(me,cmds,$id,x)] set dy [expr [xth_me_can2realy [$xth(me,can) canvasy $y]] - $xth(me,cmds,$id,y)] if $xth(me,point,fdrag_rot) { set rot [expr double($xth(me,cmds,$id,rotation)) - 180.0 / 3.14159265359 * (atan2($dy,$dx) - $xth(me,point,fdrag_orot))] if {$rot < 0.0} { set rot [expr 360.0 + $rot] } elseif {$rot >= 360.0} { set rot [expr $rot - 360.0] } set rot [format "%.1f" $rot] } else { set rot $xth(me,cmds,$id,rotation) } set xth(ctrl,me,point,rot) $rot if {$xth(me,point,fdrag_size)} { set cs [expr hypot($dy,$dx)] switch $xth(me,point,fdrag_ax) { x { set ns [expr $xth(me,cmds,$id,xsize) - $xth(me,point,fdrag_osize) + $cs] if {$ns <= 0.0} {set ns 0.1} set ns [format "%.1f" $ns] set xth(ctrl,me,point,xs) $ns } y { set ns [expr $xth(me,cmds,$id,ysize) - $xth(me,point,fdrag_osize) + $cs] if {$ns <= 0.0} {set ns 0.1} set ns [format "%.1f" $ns] set xth(ctrl,me,point,ys) $ns } } } xth_me_cmds_move_point_fill_xctrl $id $xth(ctrl,me,point,rot) $xth(ctrl,me,point,xs) $xth(ctrl,me,point,ys) } proc xth_me_cmds_end_point_fdrag {tagOrId id x y} { global xth xth_me_cmds_point_fdrag $id $x $y $xth(me,can) configure -cursor crosshair if {$xth(me,point,fdrag_size)} { set xth(me,unredola) "point resizing" } else { set xth(me,unredola) "point rotation" } $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" if {[lsearch [$xth(me,can) itemcget $tagOrId -tags] current] > -1} { $xth(me,can) itemconfigure $tagOrId -fill #ffda00 } $xth(me,can) bind $tagOrId $xth(me,point,fdrag_benter) $xth(me,can) bind $tagOrId $xth(me,point,fdrag_bleave) xth_me_cmds_update {} } proc xth_me_cmds_drag_point_config_xctrl {id} { global xth set xth(me,point,drag_stsel) [$xth(me,can) itemcget $xth(me,canid,point,selector) -state] $xth(me,can) itemconfigure $xth(me,canid,point,selector) -state hidden set xth(me,point,drag_stfx) [$xth(me,can) itemcget $xth(me,canid,point,fx) -state] $xth(me,can) itemconfigure $xth(me,canid,point,fx) -width 1 -arrow none #$xth(me,can) itemconfigure $xth(me,canid,point,fxc) -state hidden set xth(me,point,drag_stfy) [$xth(me,can) itemcget $xth(me,canid,point,fy) -state] $xth(me,can) itemconfigure $xth(me,canid,point,fy) -width 1 -arrow none #$xth(me,can) itemconfigure $xth(me,canid,point,fyc) -state hidden $xth(me,can) itemconfigure $xth(me,canid,point,fill) -fill {} -outline red } proc xth_me_cmds_end_drag_point_config_xctrl {id} { global xth $xth(me,can) itemconfigure $xth(me,canid,point,selector) -state $xth(me,point,drag_stsel) $xth(me,can) itemconfigure $xth(me,canid,point,fx) -width 5 -arrow last #$xth(me,can) itemconfigure $xth(me,canid,point,fxc) -state $xth(me,point,drag_stfx) $xth(me,can) itemconfigure $xth(me,canid,point,fy) -width 5 -arrow last #$xth(me,can) itemconfigure $xth(me,canid,point,fyc) -state $xth(me,point,drag_stfy) $xth(me,can) itemconfigure $xth(me,canid,point,fill) -fill red -outline {} } proc xth_me_cmds_select_nopoint {} { global xth set id $xth(me,cmds,selid) set ix [lsearch $xth(me,cmds,xlist) $id] set xl [llength $xth(me,cmds,xlist)] for {set ii $ix} {$ii < $xl} {incr ii} { set nid [lindex $xth(me,cmds,xlist) $ii] switch $xth(me,cmds,$nid,ct) { 3 { xth_me_cmds_select "$nid 0" break } 2 {} default { xth_me_cmds_select $nid break } } } } proc xth_me_get_center {} { global xth set sr [$xth(me,can) cget -scrollregion] set xw [$xth(me,can) xview] set yw [$xth(me,can) yview] set xx [expr double([lindex $xw 1] + [lindex $xw 0]) / 2.0] set yy [expr double([lindex $yw 1] + [lindex $yw 0]) / 2.0] set tw [expr [lindex $sr 2] - [lindex $sr 0]] set th [expr [lindex $sr 3] - [lindex $sr 1]] set x [xth_me_can2realx [expr [lindex $sr 0] + $xx * $tw]] set y [xth_me_can2realy [expr [lindex $sr 1] + $yy * $th]] return "$x $y" } proc xth_me_cmds_scrap_scale_start {} { global xth xth_me_cmds_update {} set xth(me,cmds,scrap_scale) 1 xth_me_cmds_set_mode 4 } proc xth_me_cmds_scrap_sketch_start {} { global xth xth_me_cmds_update {} xth_me_cmds_set_mode 5 } proc xth_me_cmds_scrap_scale {x y} { global xth xth_me_cmds_update {} set rx $x set ry $y switch $xth(me,cmds,scrap_scale) { 1 { set xth(ctrl,me,scrap,px1) $rx set xth(ctrl,me,scrap,py1) $ry incr xth(me,cmds,scrap_scale) xth_me_cmds_update {} focus $xth(ctrl,me,scrap).scx1r } 2 { set xth(ctrl,me,scrap,px2) $rx set xth(ctrl,me,scrap,py2) $ry set xth(me,cmds,scrap_scale) 0 xth_me_cmds_update {} focus $xth(ctrl,me,scrap).scx2r xth_me_cmds_set_mode 0 } } } proc xth_me_cmds_scrap_sketch_insert {tagOrId} { global xth xth_me_cmds_set_mode 0 if {[string length $tagOrId] == 0} return xth_me_cmds_update {} set err 1 set tags [$xth(me,can) itemcget $tagOrId -tags] foreach ix $xth(me,imgs,xlist) { if {[lsearch -exact $tags $xth(me,imgs,$ix,image)] > -1} { if {($xth(me,imgs,$ix,XVI) == 0) && ([string length $xth(me,imgs,$ix,ffname)] > 0)} { set sk $xth(me,imgs,$ix,name) if {[string first " " $sk] > -1} { set sk "\[$sk\]" } set skpos $xth(me,imgs,$ix,position) set imgh [image height $xth(me,imgs,$ix,image)] set sk "$sk [lindex $skpos 0] [expr [lindex $skpos 1] - $imgh]" xth_me_cmds_insert_scrap_sketch $sk set err 0 } } } if {$err} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [mc "Scrap sketch not inserted."] \ -font $xth(gui,lfont) } } proc xth_me_cmds_insert_scrap_sketch {sk} { global xth if {$xth(me,unredook)} { xth_me_cmds_update {} } if {[string length $sk] == 0} { return; } set id $xth(me,cmds,selid) set lid [lindex $xth(me,cmds,$id,sklist) [$xth(ctrl,me,scrap).skll.l curselection]] set ix [lsearch -exact $xth(me,cmds,$id,sklist) $lid] set xth(me,cmds,$id,sklist) [linsert $xth(me,cmds,$id,sklist) $ix $sk] xth_me_cmds_update_scrap_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) $xth(ctrl,me,scrap).skll.l selection clear 0 end $xth(ctrl,me,scrap).skll.l selection set [expr $ix + 1] [expr $ix + 1] $xth(ctrl,me,scrap).skll.l see [expr $ix + 1] xth_me_unredo_action [mc "inserting scrap sketch"] \ "xth_me_cmds_select $id\nxth_me_cmds_delete_scrap_sketch $id [list $sk]" \ "xth_me_cmds_select $id\nxth_me_cmds_undelete_scrap_sketch 1 $id [list $sk] $ix" } proc xth_me_cmds_delete_scrap_sketch {id lid} { global xth if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {[string length $lid] == 0} { set lid [lindex $xth(me,cmds,$id,sklist) [$xth(ctrl,me,scrap).skll.l curselection]] } if {[string length $lid] == 0} { return } if {$xth(me,unredook)} { xth_me_cmds_update {} } # odstrani ho zo zoznamu set ix [lsearch -exact $xth(me,cmds,$id,sklist) $lid] set xth(me,cmds,$id,sklist) [lreplace $xth(me,cmds,$id,sklist) $ix $ix] xth_me_cmds_update_scrap_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) $xth(ctrl,me,ac).ll.l selection clear 0 end $xth(ctrl,me,ac).ll.l selection set $ix $ix $xth(ctrl,me,ac).ll.l see $ix xth_me_unredo_action [mc "deleting scrap sketch"] \ "xth_me_cmds_select $id\nxth_me_cmds_undelete_scrap_sketch 0 $id [list $lid] $ix" \ "xth_me_cmds_select $id\nxth_me_cmds_delete_scrap_sketch $id [list $lid]" } proc xth_me_cmds_undelete_scrap_sketch {cr id lid ix} { global xth set xth(me,cmds,$id,sklist) [linsert $xth(me,cmds,$id,sklist) $ix $lid] xth_me_cmds_update_scrap_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) $xth(ctrl,me,ac).ll.l selection clear 0 end $xth(ctrl,me,ac).ll.l selection set [expr $ix + $cr] [expr $ix + $cr] $xth(ctrl,me,ac).ll.l see [expr $ix + $cr] } proc xth_me_cmds_toggleishiding {} { global xth xth_me_cmds_set_colors } set xth(me,ctxmenu) $xth(gui,main).mectx catch {menu $xth(me,ctxmenu) -tearoff 0} catch {menu $xth(me,ctxmenu).ptypes -tearoff 0} catch {menu $xth(me,ctxmenu).ltypes -tearoff 0} $xth(me,ctxmenu).ptypes delete 0 end $xth(me,ctxmenu).ltypes delete 0 end for {set j 0} {$j < [llength $xth(me,themes,list)]} {incr j} { set cm [lindex $xth(me,themes,list) $j] set cmn "$xth(me,ctxmenu).ptypes.m$j" catch {destroy $cmn} # vytvorime podmenu menu $cmn -tearoff 0 for {set i 0} {$i < [llength $xth(me,themes,$cm,point,showlist)]} {incr i} { if {$xth(gui,me,type_dropdown_trans)} { set l [lindex $xth(me,themes,$cm,point,showlist) $i] set v [lindex $xth(me,themes,$cm,point,hidelist) $i] } else { set l [lindex $xth(me,themes,$cm,point,list) $i] set v [lindex $xth(me,themes,$cm,point,list) $i] } $cmn add radiobutton -label $l -variable xth(ctrl,me,point,type) -value $v -command {xth_me_cmds_update {}} } # pripneme ho do menu $xth(me,ctxmenu).ptypes add cascade -label [lindex $xth(me,themes,showlist) $j] -menu $cmn set cmn "$xth(me,ctxmenu).ltypes.m$j" catch {destroy $cmn} # vytvorime podmenu menu $cmn -tearoff 0 for {set i 0} {$i < [llength $xth(me,themes,$cm,line,showlist)]} {incr i} { if {$xth(gui,me,type_dropdown_trans)} { set l [lindex $xth(me,themes,$cm,line,showlist) $i] set v [lindex $xth(me,themes,$cm,line,hidelist) $i] } else { set l [lindex $xth(me,themes,$cm,line,list) $i] set v [lindex $xth(me,themes,$cm,line,list) $i] } $cmn add radiobutton -label $l -variable xth(ctrl,me,line,type) -value $v -command {xth_me_cmds_update {}} } # pripneme ho do menu $xth(me,ctxmenu).ltypes add cascade -label [lindex $xth(me,themes,showlist) $j] -menu $cmn } catch {menu $xth(me,ctxmenu).clip -tearoff 0} $xth(me,ctxmenu).clip delete 0 end $xth(me,ctxmenu).clip add radiobutton -label [mc "on"] -variable xth(me,ctrl,ctx,clip) -value "on" -command {xth_me_set_option_value clip} $xth(me,ctxmenu).clip add radiobutton -label [mc "off"] -variable xth(me,ctrl,ctx,clip) -value "off" -command {xth_me_set_option_value clip} catch {menu $xth(me,ctxmenu).visibility -tearoff 0} $xth(me,ctxmenu).visibility delete 0 end $xth(me,ctxmenu).visibility add radiobutton -label [mc "on"] -variable xth(me,ctrl,ctx,visibility) -value "on" -command {xth_me_set_option_value visibility} $xth(me,ctxmenu).visibility add radiobutton -label [mc "off"] -variable xth(me,ctrl,ctx,visibility) -value "off" -command {xth_me_set_option_value visibility} catch {menu $xth(me,ctxmenu).place -tearoff 0} $xth(me,ctxmenu).place delete 0 end $xth(me,ctxmenu).place add radiobutton -label [mc "top"] -variable xth(me,ctrl,ctx,place) -value "top" -command {xth_me_set_option_value place} $xth(me,ctxmenu).place add radiobutton -label [mc "bottom"] -variable xth(me,ctrl,ctx,place) -value "bottom" -command {xth_me_set_option_value place} image create photo align-b.gif -data {R0lGODlhFQASAKECAP8AALi4uP///////yH5BAEKAAMALAAAAAAVABIAAAI/nI+pOwAMjYtwUuRe szCE7IFBJ5SCYwojE6SouS6t+ZaxMqfpneS6TfrBgkIVUchD+H7Jw1LXNHim1OnlaigAADs=} image create photo align-bl.gif -data {R0lGODlhFQASAKEBAP8AALi4uP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI+nI+pmwAMjYtwUuTe yCn472XBZh2BgKZq2amuwCLnm8YmnY7MjOsLT/MpgC9hCycwypBJCNGlNIGmnosVUQAAOw==} image create photo align-bls.gif -data {R0lGODlhFQASAKEDAAAAAP8AAP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI+nI+pmxEMjYtwUuTe yAn472XAZh2AgKZq2amuwCLnm8YmnY7MjOsLT/MpgC9hCycwypBJCNGlNIGmnosVUQAAOw==} image create photo align-br.gif -data {R0lGODlhFQASAKEBAP8AALi4uP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI8nI+pCLDPHIRtqiax NTrgAIbg0wjmiQYkgLaCupTuCS/BTEM3/up8/9jhagrhjJgwupAIZYt5EElDm2oBADs=} image create photo align-brs.gif -data {R0lGODlhFQASAKEDAAAAAP8AAP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI+nI+pGLHPHIRtqiax NRpgAIbg0wjmiQJkgLaCupTuCS/ATEM3/up8/9jhagrhjJgwupAIZYt5AEinVOnmWgAAOw==} image create photo align-bs.gif -data {R0lGODlhFQASAKECAAAAAP8AAP///////yH5BAEKAAMALAAAAAAVABIAAAJAnI+pOxEMjYtwUuRe sxCA7IFAJ5SCYwojA6SouS6t+ZaxMqfpneS6TfrBgkIVUchD+H7Jw1LXNACm1Or0gjUUAAA7} image create photo align-c.gif -data {R0lGODlhFQASAKECAP8AALi4uP///////yH5BAEKAAMALAAAAAAVABIAAAI5nI+py+0fopyxBYGz DlYDsHXZFzLXCGacKXypK6zLBbekrJwYqYp7isEldLbSTIOMWSjMh/MJjSIKADs=} image create photo align-cs.gif -data {R0lGODlhFQASAKECAAAAAP8AAP///////yH5BAEKAAMALAAAAAAVABIAAAI5nI+py+0PopyxAYGz BlaHsHXZFzLXCGacKXypK6zLBbekrJwYqYp7isEldLbSTIOMWSjMh/MJjSIKADs=} image create photo align-l.gif -data {R0lGODlhFQASAKECAP8AALi4uP///////yH5BAEKAAMALAAAAAAVABIAAAI2nI+py+0dopwRiotz sLkDwASdBy7iiH0h+gFbm5ykO8CIzJYKPqommtLFgJdNiIJ8KJfMpqIAADs=} image create photo align-ls.gif -data {R0lGODlhFQASAKECAAAAAP8AAP///////yH5BAEKAAMALAAAAAAVABIAAAI2nI+py+0NopwRiosz sLmHwACdBy7iiH0h+gVbm5ykO8CIzJYKPqommtLFgJdNiIJ8KJfMpqIAADs=} image create photo align-r.gif -data {R0lGODlhFQASAKECAP8AALi4uP///////yH5BAEKAAMALAAAAAAVABIAAAI5nI+py+1vgpxUtiCy 3oEBsIVCt3wi54FnRh4fMATv2RpvPIs1Yq5j6vuVVKsdAuMzHipMJeQJjSoKADs=} image create photo align-rs.gif -data {R0lGODlhFQASAKECAAAAAP8AAP///////yH5BAEKAAMALAAAAAAVABIAAAI5nI+py+1vgJxUNiCy 3oCFsIVCt3wi54FnRh5fMADv2RpvPIs1Yq5j6vuVVKsdAuMzHipMJeQJjSoKADs=} image create photo align-t.gif -data {R0lGODlhFQASAKECAP8AALi4uP///////yH5BAEKAAMALAAAAAAVABIAAAI+nI+pF+3flgmi2hvk oLdnyXXWt4SiQCqmmCarp71YfAHADNb3SFs2XgrYAI1hRDMYGpTIhK0peUIV0qn1UAAAOw==} image create photo align-tl.gif -data {R0lGODlhFQASAKEBAP8AALi4uP///7i4uCH5BAEKAAMALAAAAAAVABIAAAJAnI+pE+3flgmi2hsk u1xkSXXWt4Sip5kiqagdm7gcjMgXAIBnBeTlLuiBIA2AMWP0aQxJpnGpeEIX0mmiap0WAAA7} image create photo align-tls.gif -data {R0lGODlhFQASAKEDAAAAAP8AAP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI9nI+pA+3flgGi2gsk u1xkSXXWt4Sip5kiqagdm7gcjMhXEIBnhet7X4I0cIEMUYM4DpTIZK65AEIT0im0AAA7} image create photo align-tr.gif -data {R0lGODlhFQASAKEBAP8AALi4uP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI9nI+pGe3flgmi2hvk oLdnyXXWt4SiQCqmmDLnqK2eBABv1R71jdL23aoBNkKIIyE0JDWKGlPjfC6i0qqmAAA7} image create photo align-trs.gif -data {R0lGODlhFQASAKEDAAAAAP8AAP///7i4uCH5BAEKAAMALAAAAAAVABIAAAI9nI+pCe3flgGi2gvk oLdnyXXWt4SiQCqmmDLnqK2eFARv1R71jdL23aoFNkKIIyE0JDWKGlPjfC6i0qqmAAA7} image create photo align-ts.gif -data {R0lGODlhFQASAKECAAAAAP8AAP///////yH5BAEKAAMALAAAAAAVABIAAAI+nI+pB+3flgGi2gvk oLdnyXXWt4SiQCqmmCarp71YfAXBDNb3SFs2XgLYAo1hRDMYGpTIhK0peUIV0qn1UAAAOw==} catch {menu $xth(me,ctxmenu).align -tearoff 0} $xth(me,ctxmenu).align delete 0 end $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-tl.gif -selectimage align-tls.gif -variable xth(me,ctrl,ctx,align) -value "top-left" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-l.gif -selectimage align-ls.gif -variable xth(me,ctrl,ctx,align) -value "left" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-bl.gif -selectimage align-bls.gif -variable xth(me,ctrl,ctx,align) -value "bottom-left" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-t.gif -selectimage align-ts.gif -columnbreak 1 -variable xth(me,ctrl,ctx,align) -value "top" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-c.gif -selectimage align-cs.gif -variable xth(me,ctrl,ctx,align) -value "center" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-b.gif -selectimage align-bs.gif -variable xth(me,ctrl,ctx,align) -value "bottom" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-tr.gif -selectimage align-trs.gif -columnbreak 1 -variable xth(me,ctrl,ctx,align) -value "top-right" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-r.gif -selectimage align-rs.gif -variable xth(me,ctrl,ctx,align) -value "right" -command {xth_me_set_option_value align} $xth(me,ctxmenu).align add radiobutton -hidemargin 1 -image align-br.gif -selectimage align-brs.gif -variable xth(me,ctrl,ctx,align) -value "bottom-right" -command {xth_me_set_option_value align} catch {menu $xth(me,ctxmenu).scale -tearoff 0} $xth(me,ctxmenu).scale delete 0 end $xth(me,ctxmenu).scale add radiobutton -label [mc "tiny (xs)"] -variable xth(me,ctrl,ctx,scale) -value "xs" -command {xth_me_set_option_value scale} $xth(me,ctxmenu).scale add radiobutton -label [mc "small (s)"] -variable xth(me,ctrl,ctx,scale) -value "s" -command {xth_me_set_option_value scale} $xth(me,ctxmenu).scale add radiobutton -label [mc "normal (m)"] -variable xth(me,ctrl,ctx,scale) -value "m" -command {xth_me_set_option_value scale} $xth(me,ctxmenu).scale add radiobutton -label [mc "large (l)"] -variable xth(me,ctrl,ctx,scale) -value "l" -command {xth_me_set_option_value scale} $xth(me,ctxmenu).scale add radiobutton -label [mc "huge (xl)"] -variable xth(me,ctrl,ctx,scale) -value "xl" -command {xth_me_set_option_value scale} catch {menu $xth(me,ctxmenu).outline -tearoff 0} $xth(me,ctxmenu).outline delete 0 end $xth(me,ctxmenu).outline add radiobutton -label [mc "out"] -variable xth(me,ctrl,ctx,outline) -value "out" -command {xth_me_set_option_value outline} $xth(me,ctxmenu).outline add radiobutton -label [mc "in"] -variable xth(me,ctrl,ctx,outline) -value "in" -command {xth_me_set_option_value outline} $xth(me,ctxmenu).outline add radiobutton -label [mc "none"] -variable xth(me,ctrl,ctx,outline) -value "none" -command {xth_me_set_option_value outline} catch {menu $xth(me,ctxmenu).cps -tearoff 0} $xth(me,ctxmenu).cps delete 0 end $xth(me,ctxmenu).cps add checkbutton -label [mc "<<"] -variable xth(ctrl,me,linept,idp) -command xth_me_cmds_toggle_linept $xth(me,ctxmenu).cps add checkbutton -label [mc "smooth"] -variable xth(ctrl,me,linept,smooth) -command xth_me_cmds_toggle_linept $xth(me,ctxmenu).cps add checkbutton -label [mc ">>"] -variable xth(ctrl,me,linept,idn) -command xth_me_cmds_toggle_linept catch {menu $xth(me,ctxmenu).subtype -tearoff 0} catch {menu $xth(me,ctxmenu).segsubtype -tearoff 0} catch {menu $xth(me,ctxmenu).altitude -tearoff 0} $xth(me,ctxmenu).altitude delete 0 end $xth(me,ctxmenu).altitude add radiobutton -label [mc "auto"] -variable xth(me,ctrl,ctx,altitude) -value "." -command {xth_me_set_optionline_value altitude} $xth(me,ctxmenu).altitude add command -label [mc "edit"] -command {xth_me_ctx_change_text altitude [mc "Altitude"]} catch {menu $xth(me,ctxmenu).others -tearoff 0} # return point option proc xth_me_get_option_value {key optkey} { global xth set opt $xth($optkey) if {[regexp "(^|.*\\s)-($key)\\s+\\\[(\[^\\\]\]*)\\\]\\s*(.*)\$" $opt dum obeg okey oval oend]} { } elseif {[regexp "(^|.*\\s)-($key)\\s+\\\"(.*)\$" $opt dum obeg okey oval]} { set nx 0 set nl [string length $oval] set oend {} for {set xx 0} {$xx < $nl} {incr xx} { if {[string equal [string index $oval $xx] "\""]} { if {[string equal [string index $oval [expr $xx + 1]] "\""]} { incr xx } else { set oend [string range $oval [expr $xx + 1] end] set oval [string range $oval 0 [expr $xx - 1]] } } } } elseif {[regexp "(^|.*\\s)-($key)\\s+(\\S+)\\s*(.*)\$" $opt dum obeg okey oval oend]} { } else {return [list {} $opt]} set oend [regsub -all {^\s+|\s+$} $oend {}] set obeg [regsub -all {^\s+|\s+$} $obeg {}] if {([string length $obeg] > 0) && ([string length $oend] > 0)} { set oend " $oend" } return [list $oval "$obeg$oend"] } proc xth_me_get_optionline_value {key} { global xth set opt [$xth(ctrl,me,linept).oe.txt get 1.0 end] set oval {} set orest {} foreach ln [split $opt "\n"] { set oend $ln if {[regexp "^\\s*($key)\\s+\\\[(\[^\\\]\]*)\\\]\\s*(.*)\$" $ln dum okey oval oend]} { } elseif {[regexp "^\\s*($key)\\s+\\\"(.*)\$" $ln dum okey oval]} { set nx 0 set nl [string length $oval] set oend {} for {set xx 0} {$xx < $nl} {incr xx} { if {[string equal [string index $oval $xx] "\""]} { if {[string equal [string index $oval [expr $xx + 1]] "\""]} { incr xx } else { set oend [string range $oval [expr $xx + 1] end] set oval [string range $oval 0 [expr $xx - 1]] } } } } elseif {[regexp "^\\s*($key)\\s+(\\S+)\\s*(.*)\$" $ln dum okey oval oend]} { } if {([string length $oend] > 0) && [regexp {\S+} $oend]} { if {[string length $orest] > 0} { set orest "$orest\n" } set orest "$orest$oend" } } return [list $oval $orest] } proc xth_me_optlabel {opt args} { global xth set lab [mc $opt] if {[llength $args] > 0} { set lab [lindex $args 0] } set val $xth(me,ctrl,ctx,$opt) set lval {} switch $opt { name - text - altitude - value { if {[string length $val] > 22} { set lval " ([string range $val 0 18] ...)" } elseif {[string length $val] > 0} { set lval " ([string range $val 0 22])" } if {[string equal $opt altitude] && [string equal $val "."]} { set lval " (auto)" } } default { if {![string equal $val "auto"]} { set lval " ([mc $val])" } } } return "$lab$lval" } proc xth_me_set_option_value {opt} { global xth set nval $xth(me,ctrl,ctx,$opt) set oval $xth(me,ctrl,ctxold,$opt) switch $opt { name - text - value { } default { if {[string equal $nval "auto"] || [string equal $nval $oval]} { set nval {} } } } set oopts $xth(me,ctrl,ctxopt,$opt) if {[string length $nval] > 0} { if {[regexp {^[\w\.\-][^\s\[\]\"]*$} $nval]} { set xth($xth(me,ctrl,ctx,optkey)) "$oopts -$opt $nval" } elseif {![regexp {[\[\]]} $nval]} { set xth($xth(me,ctrl,ctx,optkey)) "$oopts -$opt \[$nval\]" } else { set nval [regsub -all {"} $nval {""}] set xth($xth(me,ctrl,ctx,optkey)) "$oopts -$opt \"$nval\"" } } else { set xth($xth(me,ctrl,ctx,optkey)) $oopts } xth_me_cmds_update {} } # option name, option name in therion command proc xth_me_set_optionline_value {opt args} { global xth set nval $xth(me,ctrl,ctx,$opt) set oval $xth(me,ctrl,ctxold,$opt) set oopts $xth(me,ctrl,ctxopt,$opt) set optstr $opt if {[llength $args] > 0} { set optstr [lindex $args 0] } switch $opt { altitude { if {[string equal $nval "."] && [string equal $nval $oval]} { set nval {} } } segsubtype { if {[string equal $nval $oval]} { set nval {} } } default { } } if {[string length $nval] > 0} { if {[string length $oopts] > 0} { set oopts "$oopts\n" } if {[regexp {^[\w\.\-][^\s\[\]\"]*$} $nval]} { set nopts "$oopts$optstr $nval" } elseif {![regexp {[\[\]]} $nval]} { set nopts "$oopts$optstr \[$nval\]" } else { set nval [regsub -all {"} $nval {""}] set nopts "$oopts$optstr \"$nval\"" } } else { set nopts $oopts } $xth(ctrl,me,linept).oe.txt delete 1.0 end $xth(ctrl,me,linept).oe.txt insert 1.0 $nopts $xth(ctrl,me,linept).oe.txt mark set insert end $xth(ctrl,me,linept).oe.txt see end xth_me_cmds_update {} } proc xth_me_ctx_change_text {id args} { global xth if {[llength $args] < 1} { set title $id } else { set title [lindex $args 0] } set d $xth(gui,main).ctxdlg catch {destroy $d} set dlg [Dialog $d -side bottom -title $title -transient no -cancel 1 -default 0 -geometry $xth(me,ctrl,ctx,dlggeom)] $d add -text [mc "OK"] $d add -text [mc "Cancel"] set f [$d getframe] Entry $f.stname -font $xth(gui,lfont) -width 0 -textvariable xth(me,ctrl,ctx,$id) -command "Dialog::enddialog $d 0" pack $f.stname -expand 1 -fill both set res [$d draw $f.stname] if {$res == 0} { if {[string equal $id altitude]} { xth_me_set_optionline_value $id } else { xth_me_set_option_value $id } } } # Show context menu at given coordinates proc xth_me_show_context_menu {id x y} { global xth if {[llength $id] == 2} { set pid [lindex $id 1] set id [lindex $id 0] } else { set pid 0 } $xth(me,can) raise point set some_below {} set select {} # select point, if not selected if {$xth(me,cmds,selid) != $id} { #xth_me_cmds_select "$id $pid" set select [list "$id $pid"] if {$pid != 0} { xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } else { xth_ctrl_scroll_to me point xth_ctrl_maximize me point } # select line point, if not selected } elseif {($xth(me,cmds,$id,ct) == 3) && ($xth(me,cmds,selpid) != $pid)} { #xth_me_cmds_select_linept $id $pid set select [list $id $pid] xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } else { # check, whether there is some point below $xth(me,can) dtag all nearest if {$pid != 0} { set utag pt$id.$pid } else { set utag pt$id } $xth(me,can) addtag nearest closest [$xth(me,can) canvasx $x] [$xth(me,can) canvasy $y] 0 $utag set tgs [$xth(me,can) itemcget nearest -tags] #puts $tgs if {[regexp "(^|\\s)pt(\\d+)($|\\s)" $tgs d1 d2 nid]} { set some_below "xth_me_cmds_select $nid; xth_ctrl_scroll_to me point; xth_ctrl_maximize me point; catch {\$xth(me,can) lower $utag point}; catch {\$xth(me,can) raise $utag line}" } elseif {[regexp "(^|\\s)pt(\\d+)\.(\\d+)($|\\s)" $tgs d1 d2 nid npid]} { set some_below "xth_me_cmds_select \"$nid $npid\"; if {$npid != 0} {xth_ctrl_scroll_to me line; xth_ctrl_maximize me line; xth_ctrl_maximize me linept} else {xth_ctrl_scroll_to me point; xth_ctrl_maximize me point}; catch {\$xth(me,can) lower $utag point}; catch {\$xth(me,can) raise $utag line}" } } if {[llength $select] == 1} { xth_me_cmds_select [lindex $select 0] } elseif {[llength $select] == 2} { xth_me_cmds_select_linept [lindex $select 0] [lindex $select 1] } $xth(me,ctxmenu) delete 0 end $xth(me,ctxmenu).others delete 0 end set opts {} if {$xth(me,cmds,$id,ct) == 2} { # add point menu items set opts "ctrl,me,point,opts" $xth(me,ctxmenu) add cascade -label [format "%s (%s)" [mc "type"] [thememc [list point $xth(me,cmds,$id,type)]]] -menu $xth(me,ctxmenu).ptypes # subtype if applicable $xth(me,ctxmenu).subtype delete 0 end if {[lsearch -exact {station air-draught water-flow} $xth(me,cmds,$id,type)] > -1} { set optsubtype [xth_me_get_option_value "subtype" $opts] set xth(me,ctrl,ctx,subtype) [lindex $optsubtype 0] if {[string length $xth(me,ctrl,ctx,subtype)] == 0} { set xth(me,ctrl,ctx,subtype) auto } switch $xth(me,cmds,$id,type) { station { $xth(me,ctxmenu).subtype add radiobutton -label [mc "temporary"] -variable xth(me,ctrl,ctx,subtype) -value "temporary" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "painted"] -variable xth(me,ctrl,ctx,subtype) -value "painted" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "natural"] -variable xth(me,ctrl,ctx,subtype) -value "natural" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "fixed"] -variable xth(me,ctrl,ctx,subtype) -value "fixed" -command {xth_me_set_option_value subtype} } air-draught { $xth(me,ctxmenu).subtype add radiobutton -label [mc "winter"] -variable xth(me,ctrl,ctx,subtype) -value "winter" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "summer"] -variable xth(me,ctrl,ctx,subtype) -value "summer" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "undefined"] -variable xth(me,ctrl,ctx,subtype) -value "undefined" -command {xth_me_set_option_value subtype} } water-flow { $xth(me,ctxmenu).subtype add radiobutton -label [mc "permanent"] -variable xth(me,ctrl,ctx,subtype) -value "permanent" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "intermittent"] -variable xth(me,ctrl,ctx,subtype) -value "intermittent" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "paleo"] -variable xth(me,ctrl,ctx,subtype) -value "paleo" -command {xth_me_set_option_value subtype} } } set xth(me,ctrl,ctxopt,subtype) [lindex $optsubtype 1] $xth(me,ctxmenu) add cascade -label [xth_me_optlabel subtype] -menu $xth(me,ctxmenu).subtype } # change align if {[lsearch -exact {station} $xth(me,cmds,$id,type)] == -1} { set optalign [xth_me_get_option_value "align" $opts] # set variable switch -nocase [lindex $optalign 0] { t - top { set xth(me,ctrl,ctx,align) "top" } tr - top-right { set xth(me,ctrl,ctx,align) "top-right" } tl - top-left { set xth(me,ctrl,ctx,align) "top-left" } b - bottom { set xth(me,ctrl,ctx,align) "bottom" } br - bottom-right { set xth(me,ctrl,ctx,align) "bottom-right" } bl - bottom-left { set xth(me,ctrl,ctx,align) "bottom-left" } c - centre - center { set xth(me,ctrl,ctx,align) "center" } r - right { set xth(me,ctrl,ctx,align) "right" } l - left { set xth(me,ctrl,ctx,align) "left" } default { set xth(me,ctrl,ctx,align) "auto" } } # set options set xth(me,ctrl,ctxopt,align) [lindex $optalign 1] $xth(me,ctxmenu) add cascade -label [xth_me_optlabel align] -menu $xth(me,ctxmenu).align } # name if {[lsearch -exact {station} $xth(me,cmds,$id,type)] > -1} { set optname [xth_me_get_option_value "name" $opts] set xth(me,ctrl,ctx,name) [lindex $optname 0] set xth(me,ctrl,ctxopt,name) [lindex $optname 1] $xth(me,ctxmenu) add command -label [xth_me_optlabel name] -command {xth_me_ctx_change_text name [mc "Station name"]} } # scrap if {[lsearch -exact {section} $xth(me,cmds,$id,type)] > -1} { set optscrap [xth_me_get_option_value "scrap" $opts] set xth(me,ctrl,ctx,scrap) [lindex $optscrap 0] set xth(me,ctrl,ctxopt,scrap) [lindex $optscrap 1] $xth(me,ctxmenu) add command -label [xth_me_optlabel scrap] -command {xth_me_ctx_change_text scrap [mc "Scrap reference"]} } # text if {[lsearch -exact {label remark continuation} $xth(me,cmds,$id,type)] > -1} { set opttext [xth_me_get_option_value "text" $opts] set xth(me,ctrl,ctx,text) [lindex $opttext 0] set xth(me,ctrl,ctxopt,text) [lindex $opttext 1] $xth(me,ctxmenu) add command -label [xth_me_optlabel text] -command {xth_me_ctx_change_text text} } # value if {[lsearch -exact {height passage-height dimensions} $xth(me,cmds,$id,type)] > -1} { set optvalue [xth_me_get_option_value "value" $opts] set xth(me,ctrl,ctx,value) [lindex $optvalue 0] set xth(me,ctrl,ctxopt,value) [lindex $optvalue 1] $xth(me,ctxmenu) add command -label [xth_me_optlabel value] -command {xth_me_ctx_change_text value} } # toggle orientation if {[lsearch -exact {station} $xth(me,cmds,$id,type)] == -1} { $xth(me,ctxmenu) add checkbutton -label [mc "orientation"] -variable xth(ctrl,me,point,rotid) -command xth_me_cmds_point_change_state } } elseif {$xth(me,cmds,$id,ct) == 3} { # add line menu items set opts "ctrl,me,line,opts" $xth(me,ctxmenu) add cascade -label [format "%s (%s)" [mc "type"] [thememc [list line $xth(me,cmds,$id,type)]]] -menu $xth(me,ctxmenu).ltypes # subtype if applicable $xth(me,ctxmenu).subtype delete 0 end if {[lsearch -exact {wall border water-flow survey} $xth(me,cmds,$id,type)] > -1} { set optsubtype [xth_me_get_option_value "subtype" $opts] set xth(me,ctrl,ctx,subtype) [lindex $optsubtype 0] if {[string length $xth(me,ctrl,ctx,subtype)] == 0} { set xth(me,ctrl,ctx,subtype) auto } switch $xth(me,cmds,$id,type) { wall { $xth(me,ctxmenu).subtype add radiobutton -label [mc "bedrock"] -variable xth(me,ctrl,ctx,subtype) -value "bedrock" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "invisible"] -variable xth(me,ctrl,ctx,subtype) -value "invisible" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "underlying"] -variable xth(me,ctrl,ctx,subtype) -value "underlying" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "overlying"] -variable xth(me,ctrl,ctx,subtype) -value "overlying" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "unsurveyed"] -variable xth(me,ctrl,ctx,subtype) -value "unsurveyed" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "presumed"] -variable xth(me,ctrl,ctx,subtype) -value "presumed" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "pit"] -variable xth(me,ctrl,ctx,subtype) -value "pit" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "sand"] -variable xth(me,ctrl,ctx,subtype) -value "sand" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "clay"] -variable xth(me,ctrl,ctx,subtype) -value "clay" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "pebbles"] -variable xth(me,ctrl,ctx,subtype) -value "pebbles" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "debris"] -variable xth(me,ctrl,ctx,subtype) -value "debris" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "blocks"] -variable xth(me,ctrl,ctx,subtype) -value "blocks" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "ice"] -variable xth(me,ctrl,ctx,subtype) -value "ice" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "flowstone"] -variable xth(me,ctrl,ctx,subtype) -value "flowstone" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "moonmilk"] -variable xth(me,ctrl,ctx,subtype) -value "moonmilk" -command {xth_me_set_option_value subtype} } border { $xth(me,ctxmenu).subtype add radiobutton -label [mc "visible"] -variable xth(me,ctrl,ctx,subtype) -value "visible" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "invisible"] -variable xth(me,ctrl,ctx,subtype) -value "invisible" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "temporary"] -variable xth(me,ctrl,ctx,subtype) -value "temporary" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "presumed"] -variable xth(me,ctrl,ctx,subtype) -value "presumed" -command {xth_me_set_option_value subtype} } water-flow { $xth(me,ctxmenu).subtype add radiobutton -label [mc "permanent"] -variable xth(me,ctrl,ctx,subtype) -value "permanent" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "intermittent"] -variable xth(me,ctrl,ctx,subtype) -value "intermittent" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "conjectural"] -variable xth(me,ctrl,ctx,subtype) -value "conjectural" -command {xth_me_set_option_value subtype} } survey { $xth(me,ctxmenu).subtype add radiobutton -label [mc "cave"] -variable xth(me,ctrl,ctx,subtype) -value "cave" -command {xth_me_set_option_value subtype} $xth(me,ctxmenu).subtype add radiobutton -label [mc "surface"] -variable xth(me,ctrl,ctx,subtype) -value "surface" -command {xth_me_set_option_value subtype} } } set xth(me,ctrl,ctxopt,subtype) [lindex $optsubtype 1] $xth(me,ctxmenu) add cascade -label [xth_me_optlabel subtype] -menu $xth(me,ctxmenu).subtype } $xth(me,ctxmenu) add cascade -label [mc "control points"] -menu $xth(me,ctxmenu).cps if {[lsearch -exact {slope} $xth(me,cmds,$id,type)] > -1} { $xth(me,ctxmenu) add checkbutton -label [mc "orientation"] -variable xth(ctrl,me,linept,rotid) -command xth_me_cmds_toggle_linept $xth(me,ctxmenu) add checkbutton -label [mc "l-size"] -variable xth(ctrl,me,linept,lsid) -command xth_me_cmds_toggle_linept } update set subtypelen [$xth(me,ctxmenu).subtype index end] if {($subtypelen > 0) && ($subtypelen < 22)} { $xth(me,ctxmenu).segsubtype delete 0 end set optsubtype [xth_me_get_optionline_value "subtype"] set xth(me,ctrl,ctx,segsubtype) [lindex $optsubtype 0] if {[string length $xth(me,ctrl,ctx,segsubtype)] == 0} { set xth(me,ctrl,ctx,segsubtype) auto } set xth(me,ctrl,ctxopt,segsubtype) [lindex $optsubtype 1] for {set sti 0} {$sti < $subtypelen} {incr sti} { $xth(me,ctxmenu).segsubtype add radiobutton -label [$xth(me,ctxmenu).subtype entrycget $sti -label] -variable xth(me,ctrl,ctx,segsubtype) -value [$xth(me,ctxmenu).subtype entrycget $sti -value] -command {xth_me_set_optionline_value segsubtype subtype} } $xth(me,ctxmenu) add cascade -label [xth_me_optlabel segsubtype [mc "segment subtype"]] -menu $xth(me,ctxmenu).segsubtype } # wall altitude if {[lsearch -exact {wall} $xth(me,cmds,$id,type)] > -1} { set optalt [xth_me_get_optionline_value "altitude"] set xth(me,ctrl,ctx,altitude) [lindex $optalt 0] if {[lsearch -exact {- nan NaN NAN} xth(me,ctrl,ctx,altitude)] > -1} { set xth(me,ctrl,ctx,altitude) "." } set xth(me,ctrl,ctxopt,altitude) [lindex $optalt 1] $xth(me,ctxmenu) add cascade -label [xth_me_optlabel altitude [mc "altitude label"]] -menu $xth(me,ctxmenu).altitude } # outline set optoutline [xth_me_get_option_value "outline" $opts] # set variable switch -nocase [lindex $optoutline 0] { in { set xth(me,ctrl,ctx,outline) "in" } out { set xth(me,ctrl,ctx,outline) "out" } none { set xth(me,ctrl,ctx,outline) "none" } default { set xth(me,ctrl,ctx,outline) "auto" } } # set options set xth(me,ctrl,ctxopt,outline) [lindex $optoutline 1] $xth(me,ctxmenu).others add cascade -label [xth_me_optlabel outline] -menu $xth(me,ctxmenu).outline # text for label if {[lsearch -exact {label} $xth(me,cmds,$id,type)] > -1} { set opttext [xth_me_get_option_value "text" $opts] set xth(me,ctrl,ctx,text) [lindex $opttext 0] set xth(me,ctrl,ctxopt,text) [lindex $opttext 1] $xth(me,ctxmenu) add command -label [xth_me_optlabel text] -command {xth_me_ctx_change_text text} } } # common options set xth(me,ctrl,ctx,optkey) $opts set xth(me,ctrl,ctx,dlggeom) "+[expr $x + [winfo rootx $xth(me,can)]]+[expr $y + [winfo rooty $xth(me,can)]]" # clip set optclip [xth_me_get_option_value "clip" $opts] # set variable switch -nocase [lindex $optclip 0] { 0 - off - false { set xth(me,ctrl,ctx,clip) "off" } 1 - on - true { set xth(me,ctrl,ctx,clip) "on" } default { set xth(me,ctrl,ctx,clip) "auto" } } # set options set xth(me,ctrl,ctxopt,clip) [lindex $optclip 1] $xth(me,ctxmenu).others add cascade -label [xth_me_optlabel clip] -menu $xth(me,ctxmenu).clip $xth(me,ctxmenu) add cascade -label [mc "other options"] -menu $xth(me,ctxmenu).others # place set optplace [xth_me_get_option_value "place" $opts] # set variable switch -nocase [lindex $optplace 0] { top { set xth(me,ctrl,ctx,place) "top" } bottom { set xth(me,ctrl,ctx,place) "bottom" } default { set xth(me,ctrl,ctx,place) "auto" } } # set options set xth(me,ctrl,ctxopt,place) [lindex $optplace 1] $xth(me,ctxmenu).others add cascade -label [xth_me_optlabel place] -menu $xth(me,ctxmenu).place # scale set optscale [xth_me_get_option_value "scale" $opts] # set variable switch -nocase [lindex $optscale 0] { xs - tiny { set xth(me,ctrl,ctx,scale) "xs" } s - small { set xth(me,ctrl,ctx,scale) "s" } m - normal { set xth(me,ctrl,ctx,scale) "m" } l - large { set xth(me,ctrl,ctx,scale) "l" } xl - huge { set xth(me,ctrl,ctx,scale) "xl" } default { set xth(me,ctrl,ctx,scale) "auto" } } # set options set xth(me,ctrl,ctxopt,scale) [lindex $optscale 1] $xth(me,ctxmenu).others add cascade -label [xth_me_optlabel scale] -menu $xth(me,ctxmenu).scale # visibility set optvis [xth_me_get_option_value "visible|visibility" $opts] # set variable switch -nocase [lindex $optvis 0] { 0 - off - false { set xth(me,ctrl,ctx,visibility) "off" } 1 - on - true { set xth(me,ctrl,ctx,visibility) "on" } default { set xth(me,ctrl,ctx,visibility) "auto" } } # set options set xth(me,ctrl,ctxopt,visibility) [lindex $optvis 1] $xth(me,ctxmenu).others add cascade -label [xth_me_optlabel visibility] -menu $xth(me,ctxmenu).visibility $xth(me,ctxmenu) add separator if {$xth(me,cmds,$id,ct) == 3} { $xth(me,ctxmenu) add cascade -label [mc "Edit line"] -menu $xth(ctrl,me,line).lpa.m $xth(me,ctxmenu).others add checkbutton -label [mc "close"] -variable xth(ctrl,me,line,close) -command xth_me_cmds_toggle_line_close $xth(me,ctxmenu).others add checkbutton -label [mc "reverse"] -variable xth(ctrl,me,line,reverse) -command xth_me_cmds_toggle_line_reverse } if {[string length $some_below] > 0} { $xth(me,ctxmenu) add command -label [mc "Select underlying point"] -command $some_below } $xth(me,ctxmenu) add command -label [mc "Delete symbol"] -command {xth_me_cmds_delete {}} # set original values variables foreach item [array names xth {me,ctrl,ctx,*}] { if {[regexp {^me,ctrl,ctx,([^,]*)$} $item dum key]} { set xth(me,ctrl,ctxold,$key) $xth($item) } } tk_popup $xth(me,ctxmenu) [expr $x + [winfo rootx $xth(me,can)]] [expr $y + [winfo rooty $xth(me,can)]] } therion/xtherion/licence.tcl0000664000175000017500000000151310625665160015223 0ustar useruser## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- therion/xtherion/cp_procs.tcl0000664000175000017500000005345412346304554015443 0ustar useruser## ## cp_procs.tcl -- ## ## Compiler procedures. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- xth_about_status [mc "loading compiler..."] proc xth_xcfg_fname {fpath} { return ".xtherion.dat" } proc xth_cp_new_file {} { global xth xth_status_bar_status cp "" if {$xth(cp,fopen)} { return } set xth(cp,fopen) 1 set xth(cp,special) {} set xth(cp,ffull) [file join $xth(gui,initdir) "thconfig"] if {[xth_cp_save_as]} { set ff $xth(cp,ffull) set xth(cp,fopen) 0 set xth(cp,fname) "" set xth(cp,open_file) "" set xth(cp,fpath) "" set xth(cp,ffull) "" xth_cp_open_file $ff } else { set xth(cp,fopen) 0 set xth(cp,fname) "" set xth(cp,open_file) "" set xth(cp,fpath) "" set xth(cp,ffull) "" } } proc xth_cp_open_file {fpath} { global xth xth_status_bar_status cp "" if {$xth(cp,fopen)} { return } if {[string length $fpath] == 0} { set fpath [tk_getOpenFile -filetypes $xth(app,cp,filetypes) \ -parent $xth(gui,main) -initialdir $xth(gui,initdir)] } if {[string length $fpath] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fpath] } set is_config_file [xth_cp_is_config_file $fpath]; if {[string length $is_config_file] > 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon info -type ok \ -message "$fpath\n-----\n$is_config_file" \ -font $xth(gui,lfont) return 0; } # read the file xth_status_bar_push cp xth_status_bar_status cp [format [mc "Opening %s ..."] $fpath] set fdata [xth_me_read_file $fpath 0] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) xth_status_bar_pop cp return 0 } # now let's show the file catch { set fid [open [file join [file dirname $fpath] [xth_xcfg_fname $fpath]] r] fconfigure $fid -encoding utf-8 while {![eof $fid]} { catch { eval [gets $fid] } } close $fid } set xth(cp,fopen) 1 set xth(cp,special) [lindex $fdata 2] set xth(cp,fname) [file tail $fpath] set xth(cp,open_file) [file tail $fpath] set xth(cp,fpath) [file dirname $fpath] set xth(cp,ffull) $fpath # enable controls $xth(cp,editor).txt configure -state normal # $xth(cp,editor).txt delete 1.0 end foreach ln [lindex $fdata 3] { $xth(cp,editor).txt insert end "$ln\n" } catch { $xth(cp,editor).txt edit reset } $xth(cp,editor).txt mark set insert $xth(cp,cursor) $xth(cp,editor).txt see $xth(cp,cursor) $xth(ctrl,cp,stp).wl configure -state normal $xth(ctrl,cp,stp).we configure -state normal $xth(ctrl,cp,stp).fl configure -state normal $xth(ctrl,cp,stp).fe configure -state normal $xth(ctrl,cp,stp).optl configure -state normal $xth(ctrl,cp,stp).opte configure -state normal $xth(ctrl,cp,stp).go configure -state normal $xth(ctrl,cp,stp).gores configure -state normal $xth(ctrl,cp,info).txt configure -state normal $xth(cp,menu,file) entryconfigure [mc "New"] -state disabled $xth(cp,menu,file) entryconfigure [mc "Open"] -state disabled $xth(cp,menu,file) entryconfigure [mc "Save as"] -state normal $xth(cp,menu,file) entryconfigure [mc "Close"] -state normal $xth(cp,menu) entryconfigure [mc "Edit"] -state normal xth_app_title cp xth_status_bar_pop cp update idletasks return 1 } set xth(cps,n) 0 set xth(cps,mxs) 0 set xth(cps,mxl) 0 set xth(cps,ts) 0 set xth(cps,tl) 0 proc xth_cp_comp_stat {tlen tscrap} { global xth incr xth(cps,n) if {$tscrap > $xth(cps,mxs)} { set xth(cps,mxs) $tscrap } if {$tlen > $xth(cps,mxl)} { set xth(cps,mxl) $tlen } set xth(cps,ts) [expr $xth(cps,ts) + $tscrap] set xth(cps,tl) [expr $xth(cps,tl) + $tscrap] set xth(cps,as) [expr double($xth(cps,ts)) / double($xth(cps,n))] set xth(cps,al) [expr double($xth(cps,tl)) / double($xth(cps,n))] } proc xth_cp_close_file {} { global xth xth_cp_data_tree_clear if {!$xth(cp,fopen)} { return } xth_cp_write_file $xth(cp,ffull) # disable controls $xth(cp,editor).txt delete 1.0 end $xth(cp,editor).txt see 1.0 $xth(cp,editor).txt configure -state disabled $xth(cp,log).txt configure -state normal $xth(cp,log).txt delete 1.0 end $xth(cp,log).txt see 1.0 $xth(cp,log).txt configure -state disabled $xth(cp,menu,file) entryconfigure [mc "New"] -state normal $xth(cp,menu,file) entryconfigure [mc "Open"] -state normal $xth(cp,menu,file) entryconfigure [mc "Save as"] -state disabled $xth(cp,menu,file) entryconfigure [mc "Close"] -state disabled $xth(cp,menu) entryconfigure [mc "Edit"] -state disabled $xth(ctrl,cp,stp).wl configure -state disabled $xth(ctrl,cp,stp).we configure -state disabled $xth(ctrl,cp,stp).fl configure -state disabled $xth(ctrl,cp,stp).fe configure -state disabled $xth(ctrl,cp,stp).optl configure -state disabled $xth(ctrl,cp,stp).opte configure -state disabled $xth(ctrl,cp,stp).go configure -state disabled $xth(ctrl,cp,stp).gores configure -text "" -fg $xth(cp,resfg) -bg $xth(cp,resbg) \ -state disabled $xth(ctrl,cp,info).txt configure -state disabled # set variables set xth(cp,fopen) 0 set xth(cp,cursor) 1.0 set xth(cp,fname) "" set xth(cp,open_file) "" set xth(cp,fpath) "" set xth(cp,opts) "" xth_app_title cp focus $xth(ctrl,cp,dat).t set xth(ctrl,cp,datrestore) {} set xth(ctrl,cp,msrestore) {} } # xth_cp_write_file -- # # return list containing # {success name} proc xth_cp_write_file {pth} { global errorInfo xth xth_status_bar_push cp xth_status_bar_status cp [format [mc "Saving %s ..."] $pth] if {[catch {set fid [open $pth w]}]} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message $errorInfo \ -font $xth(gui,lfont) xth_status_bar_pop cp return 0 } fconfigure $fid -encoding utf-8 -translation {auto auto} puts $fid "encoding utf-8" # let's put data set data [$xth(cp,editor).txt get 1.0 end] regsub {\s*$} $data {} data puts $fid $data # now let's put special commands foreach cmd $xth(cp,special) { puts $fid "##XTHERION## $cmd" } close $fid xth_status_bar_pop cp return 1 } proc xth_cp_save_as {} { global xth if {!$xth(cp,fopen)} { return 0 } set fname $xth(cp,ffull) set idir [file dirname $fname] if {[string length $idir] == 0} { set idir $xth(gui,initdir) } set fname [tk_getSaveFile -filetypes $xth(app,cp,filetypes) \ -parent $xth(gui,main) \ -initialfile [file tail $fname] \ -initialdir [xth_getdir $fname]] if {[string length $fname] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fname] } if {![xth_cp_write_file $fname]} { return 0 } set xth(cp,fname) [file tail $fname] set xth(cp,open_file) [file tail $fname] set xth(cp,fpath) [file dirname $fname] set xth(cp,ffull) $fname xth_app_title cp update idletasks return 1 } # xth_cp_read_file -- # # return success # {success name cmds lns} proc xth_cp_read_file {pth} { global errorInfo xth set curenc utf-8 set nm [file tail $pth] set encspc 0 set flnn 0 set success 1 set lastln "" set lns {} set cmds {} if {[catch {set fid [open $pth r]}]} { set success 0 set nm $errorInfo return [list $success $nm {} {}] } fconfigure $fid -encoding $curenc while {![eof $fid]} { gets $fid fln if {$flnn == 0} { if {[scan [string index $fln 0] %c] == 65279} { set fln [string range $fln 1 end] } } incr flnn if {[regexp {^\s*encoding\s+(\S+)\s*$} $fln encln enc]} { set encspc 1 set rxp "\\s+($enc)\\s+" set validenc [regexp -nocase $rxp $xth(encodings) dum curenc] if {$validenc == 0} { set success 0 set nm "$pth \[$flnn\] -- unknown encoding -- $enc" break } fconfigure $fid -encoding $curenc set lastln "" } elseif {[regexp {^\s*\#\#XTHERION\#\#\s+(\S.*)\s*$} $fln cmmdln cmmd]} { lappend cmds $cmmd set lastln "" } else { if {[regexp {(.*)\\\s*$} $lastln dumln prevln]} { set fln "$prevln$fln" if {[llength $lns] > 1} { set lns [lrange $lns 0 [expr [llength $lns] - 2]] } else { set lns {} } } lappend lns $fln set lastln $fln } } close $fid return [list $success $nm $cmds $lns] } proc xth_cp_is_config_file {fname} { set str {} return $str } proc xth_cp_compile {} { global xth errorInfo set xth(cp,compres) 0 if {!$xth(cp,fopen)} { return 0; } set ret 1 xth_cp_write_file $xth(cp,ffull) set cdir [pwd] cd $xth(cp,fpath) $xth(cp,log).txt configure -state normal $xth(cp,log).txt delete 1.0 end $xth(cp,log).txt configure -wrap word $xth(cp,editor).txt configure -state disabled xth_status_bar_push cp catch { set lid [open "therion.log" w] puts $lid "ERROR: Can not execute \"$xth(gui,compcmd) -x $xth(cp,opts) $xth(cp,fname)\"." close $lid } set acroreadopen 1 if {[llength $xth(cp,preview,acroreadpath)] > 0 } { catch { set acroreadopen [catch { exec $xth(gui,appctrlcmd) ARExists [file join $xth(cp,fpath) $xth(cp,preview,acroreadpath)] }] } if {!$acroreadopen} { catch { exec $xth(gui,appctrlcmd) AROpen [file join $xth(cp,fpath) $xth(cp,preview,acroreadpath)] exec $xth(gui,appctrlcmd) ARClose [file join $xth(cp,fpath) $xth(cp,preview,acroreadpath)] } } } xth_status_bar_status cp [mc "Running therion ..."] $xth(ctrl,cp,stp).gores configure -text [mc "RUNNING"] -fg black -bg yellow update idletasks catch { set thid [open "|$xth(gui,compcmd) -x $xth(cp,opts) $xth(cp,fname)" r] if $xth(gui,compshow) { while {![eof $thid]} { $xth(cp,log).txt insert end [read $thid 8] $xth(cp,log).txt see end update idletasks } } else { read $thid; } close $thid } set see_end 0 #puts $err #global errorInfo #puts $errorInfo # update UI xth_cp_data_tree_clear set xth(th_exit_state) 0 set xth(th_exit_number) $xth(th_exit_number_last) set dat_loaded_err [catch { set fid [open [file join [file dirname $xth(cp,ffull)] [xth_xcfg_fname $xth(cp,ffull)]] r] fconfigure $fid -encoding utf-8 while {![eof $fid]} { catch {eval [gets $fid]} } close $fid }] set err 0 if {$dat_loaded_err} { set err 1 } if {$xth(th_exit_number) == $xth(th_exit_number_last)} { set err 1 } else { set xth(th_exit_number_last) $xth(th_exit_number) } if {$xth(th_exit_state) == 0} { set err 1 } if {$err} { bell $xth(ctrl,cp,stp).gores configure -text [mc "ERROR"] -fg white -bg red set ret 0 set see_end 1 } else { set xth(cp,compres) 1 if {$xth(gui,auto_backup)} { xth_cp_write_file "$xth(cp,ffull)$xth(gui,auto_backup_ext)" } if {$xth(th_exit_state) == 1} { bell $xth(ctrl,cp,stp).gores configure -text [mc "WARNING"] -fg black -bg orange } else { $xth(ctrl,cp,stp).gores configure -text [mc "OK"] -fg black -bg green } if { [llength $xth(cp,preview,xpdfpath)] > 0 } { catch { exec xpdf -remote thpdf [file join $xth(cp,fpath) $xth(cp,preview,xpdfpath)] & } } if { [llength $xth(cp,preview,acroreadpath)] > 0 } { catch { if {$acroreadopen} { exec $xth(gui,appctrlcmd) AROpen [file join $xth(cp,fpath) $xth(cp,preview,acroreadpath)] } else { exec $xth(gui,appctrlcmd) ARBack [file join $xth(cp,fpath) $xth(cp,preview,acroreadpath)] } } } } xth_status_bar_status cp [mc "Reading therion log file ..."] if {[catch { set lid [open "therion.log" r] $xth(cp,log).txt delete 1.0 end $xth(cp,log).txt configure -wrap none $xth(cp,log).txt insert end "[read $lid]\n" close $lid }]} { $xth(cp,log).txt insert end [mc "\nerror opening therion.log file\n"] } if ($see_end) { $xth(cp,log).txt see end } else { $xth(cp,log).txt see 1.0 } xth_status_bar_pop cp update idletasks $xth(cp,log).txt configure -state normal $xth(cp,editor).txt configure -state normal xth_cp_show_errors # update configuration file if required set xth(cp,cursor) [$xth(cp,editor).txt index insert] if {0} { set fdata [xth_me_read_file $xth(cp,ffull) 0] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) } else { ###xth_cp_data_tree_clear set xth(cp,special) [lindex $fdata 2] $xth(cp,editor).txt configure -undo 0 $xth(cp,editor).txt delete 1.0 end foreach ln [lindex $fdata 3] { $xth(cp,editor).txt insert end "$ln\n" } $xth(cp,editor).txt mark set insert $xth(cp,cursor) $xth(cp,editor).txt see $xth(cp,cursor) $xth(cp,editor).txt configure -undo 1 } } cd $cdir xth_me_xvi_refresh xth_me_save_file 0 return $ret } proc xth_cp_data_tree_clear {} { global xth set tp $xth(ctrl,cp,dat).t set xth(ctrl,cp,datrestore) {} foreach di $xth(ctrl,cp,datlist) { catch { append xth(ctrl,cp,datrestore) "catch \{$tp itemconfigure [lindex $di 1] -open [$tp itemcget [lindex $di 1] -open]\}\n"; } } append xth(ctrl,cp,datrestore) "update idletasks\n" append xth(ctrl,cp,datrestore) "catch \{$tp xview moveto [lindex [$tp xview] 0]\}\n"; append xth(ctrl,cp,datrestore) "catch \{$tp yview moveto [lindex [$tp yview] 0]\}\n"; append xth(ctrl,cp,datrestore) "catch \{$tp selection set [$tp selection get]\}\n"; append xth(ctrl,cp,datrestore) "update idletasks\n" catch { $tp delete [$tp nodes root] } set tp $xth(ctrl,cp,ms).t set xth(ctrl,cp,msrestore) {} foreach di $xth(ctrl,cp,maplist) { catch { append xth(ctrl,cp,msrestore) "catch \{$tp itemconfigure [lindex $di 1] -open [$tp itemcget [lindex $di 1] -open]\}\n"; } } append xth(ctrl,cp,msrestore) "update idletasks\n" append xth(ctrl,cp,msrestore) "catch \{$tp xview moveto [lindex [$tp xview] 0]\}\n"; append xth(ctrl,cp,msrestore) "catch \{$tp yview moveto [lindex [$tp yview] 0]\}\n"; append xth(ctrl,cp,msrestore) "catch \{$tp selection set [$tp selection get]\}\n"; append xth(ctrl,cp,msrestore) "update idletasks\n" catch { $tp delete [$tp nodes root] } $xth(ctrl,cp,info).txt delete 1.0 end # prejde oba stromy a priradi rozvinutie/zvinutie do prikazov # plus ulozi poziciu } proc xth_cp_data_tree_insert {id parent level name fullname title stitle stat} { global xth if {[string length $title] < 1} { set title $name set stitle $name } lappend xth(ctrl,cp,datlist) [list $stitle $id $parent $level $name $fullname $title $stat] } proc xth_cp_data_tree_create {} { global xth if {[llength $xth(ctrl,cp,datlist)] == 0} { return } set nlist [lsort -dictionary -index 0 $xth(ctrl,cp,datlist)] set level 1 set tocnt 1 set copen 1 set tp $xth(ctrl,cp,dat).t while {$tocnt} { set tocnt 0 foreach di $nlist { if {[lindex $di 3] == $level} { if {$level == 1} { set parent root } else { set parent [lindex $di 2] } catch { $tp insert end $parent [lindex $di 1] -data [list survey [lindex $di 5] [lindex $di 6] [lindex $di 7]] \ -text [lindex $di 6] -image [Bitmap::get folder] -open $copen -font $xth(gui,lfont) } } if {[lindex $di 3] > $level} { set tocnt 1 } } set copen 0 incr level } catch { eval $xth(ctrl,cp,datrestore) } } proc xth_cp_map_tree_insert {type subtype id parent level name fullname title stitle} { global xth if {[string length $title] < 1} { set title $name set stitle $name } lappend xth(ctrl,cp,maplist) [list $stitle $id $parent $level $name $fullname $title $type $subtype] } proc xth_cp_map_tree_create {} { global xth if {[llength $xth(ctrl,cp,maplist)] == 0} { return } set nlist [lsort -dictionary -index 0 $xth(ctrl,cp,maplist)] set level 0 set tocnt 1 set copen 1 set tp $xth(ctrl,cp,ms).t while {$tocnt} { set tocnt 0 foreach di $nlist { if {[lindex $di 3] == $level} { if {$level == 0} { set parent root } else { set parent [lindex $di 2] } set ccopen $copen switch [lindex $di 7] { map { if {[lindex $di 8]} { set ii [Bitmap::get file] set ccopen 0 } else { set ii [Bitmap::get copy] } } scrap { set ii [Bitmap::get new] } default { set ii [Bitmap::get folder] } } catch { $tp insert end $parent [lindex $di 1] -data [list [lindex $di 7] [lindex $di 5] [lindex $di 6]] \ -text [lindex $di 6] -image $ii -open $ccopen -font $xth(gui,lfont) } } if {[lindex $di 3] > $level} { set tocnt 1 } } set copen 0 incr level } # odstrani projekcie bez map set prjs [$tp nodes root] foreach prj $prjs { set nds [$tp nodes $prj] switch [llength $nds] { 0 { $tp delete $prj } 1 { $tp itemconfigure $nds -open 1 } } } catch { eval $xth(ctrl,cp,msrestore) } } proc xth_cp_data_tree_enter {node} { global xth set tp $xth(ctrl,cp,dat).t xth_status_bar_push cp set d [$xth(ctrl,cp,dat).t itemcget $node -data] xth_status_bar_status cp [format "%s - %s (%s)" [lindex $d 0] [lindex $d 1] [lindex $d 2]] } proc xth_cp_data_tree_select {tpath node} { global xth set tp $tpath xth_status_bar_push cp set d [$tp itemcget $node -data] $xth(ctrl,cp,info).txt delete 1.0 end $xth(ctrl,cp,info).txt see 1.0 $xth(ctrl,cp,info).txt insert 1.0 "name: [lindex $d 1]\ntitle: [lindex $d 2]\n[lindex $d 3]" } proc xth_cp_data_tree_leave {node} { xth_status_bar_pop cp } proc xth_cp_data_tree_double_click {node} { global xth set tp $xth(ctrl,cp,dat).t set d [$tp itemcget $node -data] set i [$xth(cp,editor).txt index insert] regexp {(\d+)\.} $i dum cln $xth(cp,editor).txt insert $cln.0 [format "select %s\n" [lindex $d 1]] } proc xth_cp_map_tree_enter {node} { global xth set tp $xth(ctrl,cp,ms).t xth_status_bar_push cp set d [$xth(ctrl,cp,ms).t itemcget $node -data] xth_status_bar_status cp [format "%s - %s (%s)" [lindex $d 0] [lindex $d 1] [lindex $d 2]] } proc xth_cp_map_tree_leave {node} { xth_status_bar_pop cp } proc xth_cp_map_tree_double_click {node} { global xth set tp $xth(ctrl,cp,ms).t set d [$tp itemcget $node -data] set i [$xth(cp,editor).txt index insert] regexp {(\d+)\.} $i dum cln if {[string length [lindex $d 1]] > 0} { $xth(cp,editor).txt insert $cln.0 [format "select %s\n" [lindex $d 1]] } } proc xth_cp_show_errors {} { global xth set w $xth(cp,log).txt $w tag remove xtherr 1.0 end set rx {\S*[^\]\s]\s+\[\d+\]} set fnd [$w search -regexp -count cnt $rx 1.0 end] set i 0 while {([string length $fnd] > 0) && ($i < 10000)} { set enx [$w index "$fnd + $cnt chars"] set ctext [$w get $fnd "$fnd lineend"] set cfnm {} regexp {\S+} $ctext cfnm if {![regexp {(\.mp|\.tex)\)?$} $cfnm]} { $w tag add xtherr $fnd $enx } set fnd [$w search -regexp -count cnt $rx $enx end] incr i } $w tag configure xtherr -foreground red set prevcur [$xth(cp,log).txt cget -cursor] $w tag bind xtherr "$w configure -cursor hand2" $w tag bind xtherr "$w configure -cursor $prevcur" $w tag bind xtherr <1> "xth_cp_goto_error %x %y" } proc xth_cp_goto_error {x y} { global xth set epos [$xth(cp,log).txt get "@$x,$y wordstart" "@$x,$y lineend"] # skusime najst source error set fnm {} set fln {} if {(![regexp {\s*(\S+)\s+\[(\d+)\]} $epos dum fnm fln]) || [string equal $fnm "th"] || [string equal $fnm "th2"] || [string equal $fnm ".th"] || [string equal $fnm ".th2"]} { set epos [$xth(cp,log).txt get "@$x,$y linestart" "@$x,$y lineend"] regexp {\s*(\S+)\s+\[(\d+)\]} $epos dum fnm fln } if {([string length $fnm] == 0) || ([string length $fln] == 0)} { return } if {[catch {set fln [expr $fln - 1]}]} { return } # potom sa pozrieme ci subor nemame otvoreny v kompilatore, # mapovom alebo textovom editore a skocime tam if $xth(cp,fopen) { set fullfnm [file join $xth(cp,fpath) $fnm] if {[string equal $fullfnm $xth(cp,ffull)]} { after idle "focus $xth(cp,editor).txt; $xth(cp,editor).txt see $fln.0; $xth(cp,editor).txt mark set insert $fln.0; $xth(cp,editor).txt tag remove sel 1.0 end; $xth(cp,editor).txt tag add sel $fln.0 \"$fln.0 lineend\"" return } if {$xth(me,fopen) && [string equal $fullfnm $xth(me,ffull)]} { after idle "xth_app_show me; xth_me_goto_line [expr $fln + 1]" return } # skusime textovy editor, ci to mame otvorene foreach fx $xth(te,flist) { if {[string equal $fullfnm $xth(te,$fx,path)]} { after idle "xth_app_show te; xth_te_show_file $fx; $xth(te,$fx,frame).txt see $fln.0; $xth(te,$fx,frame).txt mark set insert $fln.0; $xth(te,$fx,frame).txt tag remove sel 1.0 end; $xth(te,$fx,frame).txt tag add sel $fln.0 \"$fln.0 lineend\"" return } } after idle "xth_app_show te; xth_te_open_file 0 [list $fullfnm] $fln" } } therion/xtherion/te_import.tcl0000664000175000017500000000625511106226524015623 0ustar useruserproc xth_te_import_file {} { global xth set fname [tk_getOpenFile -filetypes {{{PocketTopo therion export} {.txt}} {{All files} {*}}} \ -parent $xth(gui,main) \ -initialdir $xth(gui,initdir) -defaultextension .txt] if {[string length $fname] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fname] } # read the file xth_status_bar_push te xth_status_bar_status te [format [mc "Importing %s ..."] $fname] set fdata [xth_te_read_file $fname] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) xth_status_bar_pop te return 0 } # show the file set cfid [lindex $xth(te,flist) $xth(te,fcurr)] catch { $xth(te,$cfid,frame).txt edit separator } xth_te_insert_text $xth(te,$cfid,frame).txt "[xth_te_read_ptopo $fname]\n" $xth(te,$cfid,frame).txt see insert xth_status_bar_pop te return 1 } proc xth_te_read_ptopo {fname} { set fid [open $fname r] set ccline {} set cclines {} set csection {NULL} set indata 0 set cdirec 0 while {![eof $fid]} { gets $fid ln ##append ccline "### $csection: $ln\n" if {[string equal $ln FIX] || [string equal $ln TRIP] || [string equal $ln PLAN] || [string equal $ln ELEVATION]} { if {[string length $ccline] > 0} { lappend cclines $ccline set ccline {} set indata 0 set cdirec 0 } set csection $ln } if {[llength $ln] > 0} { switch $csection { FIX { if {[llength $ln] == 4} { append ccline " fix [lindex $ln 0] [lindex $ln 1] [lindex $ln 2] [lindex $ln 3]\n" } } TRIP { if {$indata} { # check direction if {[string equal [lindex $ln end] "<"]} { if {$cdirec >= 0} { append ccline " extend left\n" set cdirec -1 } } elseif {[string equal [lindex $ln end] ">"]} { if {$cdirec <= 0} { append ccline " extend right\n" set cdirec 1 } } if {[llength $ln] == 5} { append ccline " [lindex $ln 0] - [lindex $ln 1] [lindex $ln 2] [lindex $ln 3]\n" } elseif {[llength $ln] == 6} { append ccline " [lindex $ln 0] [lindex $ln 1] [lindex $ln 2] [lindex $ln 3] [lindex $ln 4]\n" } } else { append $ccline "# --[lindex $ln 0]--" switch [lindex $ln 0] { DATE { set xd [lindex $ln 1] regsub -all {\-} $xd {.} xd append ccline " date $xd\n" } DECLINATION { } DATA { append ccline " data normal from to compass clino tape\n" set indata 1 } } } } } } } if {[string length $ccline] > 0} { lappend cclines $ccline } close $fid set txt {} foreach cln $cclines { append txt "centreline\n$cln" append txt "endcentreline\n\n" } return $txt } therion/xtherion/main.tcl0000664000175000017500000000373710720737556014564 0ustar useruser## ## main.tcl -- ## ## Main script. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- xth_app_finish xth_app_clock encoding system $xth(app,sencoding) set xth(encoding_system) [encoding system] xth_about_hide wm deiconify $xth(gui,main) xth_app_normalize foreach xapp $xth(app,list) { catch { set xth(app,$xapp,relw) $xth(app,all,tbwidth) set xth(app,$xapp,relw) $xth(app,$xapp,tbwidth) } catch { xth_app_show $xapp } } if {[llength $xth(app,list)] > 2} { xth_app_show [lindex $xth(app,list) 2] } else { xth_app_show [lindex $xth(app,list) 0] } set th2open 1 set cfgopen 1 foreach fname $argv { if {$cfgopen && [regexp -nocase {thconfig|thcfg} $fname]} { set cfgopen 0 xth_app_show cp update idletasks xth_cp_open_file $fname } elseif {$th2open && [regexp -nocase {\.th2$} $fname]} { set th2open 0 xth_app_show me update idletasks xth_me_open_file 0 $fname 1 } else { xth_app_show te update idletasks xth_te_open_file 0 $fname 0 } } foreach idir $xth(idirs) { catch {source [file join $idir xtherion.ini]} } catch {source xtherion.ini} therion/xtherion/Makefile0000664000175000017500000000137012450017605014547 0ustar useruserOUTDIR ?= . THPLATFORM ?= LINUX ifneq ($(OUTDIR),.) LOUTDIR = $(OUTDIR)/xtherion else LOUTDIR = . endif ifeq ($(THPLATFORM),WIN32) TARGET = xtherion.tcl else TARGET = xtherion endif all: $(LOUTDIR)/$(TARGET) $(LOUTDIR)/$(TARGET): *.tcl tclsh mkall.tcl ifneq ($(OUTDIR),.) perl ../makefile.pl mv ./$(TARGET) $(LOUTDIR) endif survex: tclsh mkall.tcl survex tar -cvzf ../../../svxedit.tar.gz svxedit perl ../makefile.pl rm -q svxedit clean: perl ../makefile.pl rm -q *~ perl ../makefile.pl rm -q ../../bin/xtherion perl ../makefile.pl rm -q lang/*~ perl ../makefile.pl rm -q svxedit perl ../makefile.pl rm -q xtherion.tar.gz perl ../makefile.pl rm -q svxedit.tar.gz update: make -C ./lang update msgxth.tcl: lang/xtexts.txt make -C ./lang therion/xtherion/te.tcl0000664000175000017500000010673112255643530014237 0ustar useruser## ## te.tcl -- ## ## Text editor. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- xth_about_status [mc "loading text editor ..."] if {[string equal -nocase $xth(prj,name) svxedit]} { xth_app_create te {} } else { xth_app_create te [mc "Text Editor"] } xth_ctrl_add te files [mc "Files"] xth_ctrl_add te sdata [mc "Data table"] xth_ctrl_add te sr [mc "Search & Replace"] xth_ctrl_finish te set xth(te,open_file_encoding) $xth(app,fencoding) set xth(te,bind,text_tab) { if { [string equal [%W cget -state] "normal"] } { xth_te_insert_tab %W break } } set xth(te,bind,text_return) { regexp {(\d+)\.} [%W index insert] dum cln set spcs "" regexp {^\s+} [%W get $cln.0 $cln.end] spcs # set spcsc [string length $spcs] # set indct [string length [xth_te_get_indent %W $cln.0 1]] # if {$spcsc == $indct} { # } elseif {$spcsc > $indct} { # %W delete $cln.0 $cln.[expr $spcsc - $indct] # } elseif {$spcsc < $indct} { # %W insert $cln.0 [format \x25[expr $indct - $spcsc]s " "] # } # xth_te_insert_text %W "\n[xth_te_get_indent %W [expr $cln + 1].0 0]" xth_te_insert_text %W "\n$spcs" } proc xth_te_insert_text {w s} { if {[string equal $s ""] || [string equal [$w cget -state] "disabled"]} { return } set compound 0 catch { if {[$w compare sel.first <= insert] \ && [$w compare sel.last >= insert]} { set oldSeparator [$w cget -autoseparators] if { $oldSeparator } { $w configure -autoseparators 0 $w edit separator set compound 1 } $w delete sel.first sel.last } } $w insert insert $s $w see insert if { $compound && $oldSeparator } { $w edit separator $w configure -autoseparators 1 } } proc xth_te_insert_tab W { global xth regexp {\.(\d+)} [$W index insert] dum col set nsp [expr $xth(gui,etabsize) - ($col % $xth(gui,etabsize))] xth_te_insert_text $W [format \x25$nsp\s " "] focus $W } proc xth_te_sdata_enable {w} { global xth if {[string length $w] < 1} { set w $xth(ctrl,te,sdata) } set chlist [winfo children $w] if {[llength $chlist] > 0} { foreach sdw $chlist { catch {$sdw configure -state normal} catch {xth_te_sdata_enable $sdw} } } } proc xth_te_sdata_disable {w} { global xth if {[string length $w] < 1} { set w $xth(ctrl,te,sdata) } set chlist [winfo children $w] if {[llength $chlist] > 0} { foreach sdw $chlist { catch {$sdw configure -state disabled} catch {xth_te_sdata_disable $sdw} } } } set xth(te,flist) {} set xth(te,fcurr) -1 set xth(te,fltid) 0 # create position bar set pbar $xth(gui,te).sf.pbar label $pbar -text "2.0" -width 8 -relief sunken -font $xth(gui,lfont) pack $pbar -side left # file control frame $xth(ctrl,te,files).fl set flbox $xth(ctrl,te,files).fl.flbox listbox $flbox -height 6 -selectmode single -takefocus 1 \ -yscrollcommand "xth_scroll $xth(ctrl,te,files).fl.sv" \ -xscrollcommand "xth_scroll $xth(ctrl,te,files).fl.sh" \ -font $xth(gui,lfont) -exportselection no \ -selectborderwidth 1 scrollbar $xth(ctrl,te,files).fl.sv -orient vert -command "$flbox yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $xth(ctrl,te,files).fl.sh -orient horiz -command "$flbox xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) frame $xth(ctrl,te,files).ef bind $flbox <> "xth_te_show_file \[lindex \[%W curselection\] 0\]" grid columnconf $xth(ctrl,te,files).fl 0 -weight 1 grid rowconf $xth(ctrl,te,files).fl 0 -weight 1 grid $flbox -column 0 -row 0 -sticky news xth_scroll_showcmd $xth(ctrl,te,files).fl.sv "grid $xth(ctrl,te,files).fl.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $xth(ctrl,te,files).fl.sv "grid forget $xth(ctrl,te,files).fl.sv" xth_scroll_showcmd $xth(ctrl,te,files).fl.sh "grid $xth(ctrl,te,files).fl.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $xth(ctrl,te,files).fl.sh "grid forget $xth(ctrl,te,files).fl.sh" xth_status_bar te $flbox [mc "Switch open files."] grid columnconf $xth(ctrl,te,files) 0 -weight 1 grid $xth(ctrl,te,files).fl -column 0 -row 0 -sticky news if {![string equal -nocase $xth(prj,name) svxedit]} { grid $xth(ctrl,te,files).ef -column 0 -row 1 -sticky news } Label $xth(ctrl,te,files).ef.ecl -text [mc "Encoding"] -anchor e -font $xth(gui,lfont) -state disabled ComboBox $xth(ctrl,te,files).ef.ecb -values $xth(encodings) \ -textvariable xth(te,open_file_encoding) \ -font $xth(gui,lfont) -height 4 -command xth_te_set_encoding \ -state disabled Button $xth(ctrl,te,files).ef.chb -text [mc "Change to"] -anchor e -font $xth(gui,lfont) -padx 1 -state disabled -command xth_te_set_encoding Label $xth(ctrl,te,files).ef.cel -text "" -anchor w -padx 2 -font $xth(gui,lfont) -state disabled #grid columnconf $xth(ctrl,te,files).ef 0 -weight 0 grid columnconf $xth(ctrl,te,files).ef 1 -weight 1 grid $xth(ctrl,te,files).ef.ecl -column 0 -row 0 -sticky news grid $xth(ctrl,te,files).ef.cel -column 1 -row 0 -sticky news grid $xth(ctrl,te,files).ef.chb -column 0 -row 1 -sticky news grid $xth(ctrl,te,files).ef.ecb -column 1 -row 1 -sticky ew xth_status_bar te $xth(ctrl,te,files).ef [mc "To set file encoding, type encoding name and press button."] frame $xth(gui,te).af.apps.ff -bg $xth(gui,ecolorbg) pack $xth(gui,te).af.apps.ff -fill both -expand yes # table control Button $xth(ctrl,te,sdata).sfb -text [mc "Scan data format"] \ -font $xth(gui,lfont) -state disabled xth_status_bar te $xth(ctrl,te,sdata).sfb \ [mc "Scan data format and rebuild centerline data insertion tool."] checkbutton $xth(ctrl,te,sdata).sfs -text [mc "Enter station names"] -anchor w \ -font $xth(gui,lfont) -variable xth(te,sdata,es) -state disabled xth_status_bar te $xth(ctrl,te,sdata).sfs \ [mc "Check if you want to insert station names for each shot."] frame $xth(ctrl,te,sdata).sdf button $xth(ctrl,te,sdata).taf -text [mc "Auto format selection"] \ -font $xth(gui,lfont) -state disabled xth_status_bar te $xth(ctrl,te,sdata).taf [mc "Format selection to given table."] grid columnconf $xth(ctrl,te,sdata) 0 -weight 1 grid $xth(ctrl,te,sdata).sfb -column 0 -row 0 -sticky nsew grid $xth(ctrl,te,sdata).sdf -column 0 -row 1 -sticky nsew grid $xth(ctrl,te,sdata).sfs -column 0 -row 2 -sticky nsew grid $xth(ctrl,te,sdata).taf -column 0 -row 3 -sticky nsew set sfm $xth(ctrl,te,sr) set xth(ctrl,te,sr,selection_io) 0 set xth(ctrl,te,sr,search) "" set xth(ctrl,te,sr,replace_io) 0 set xth(ctrl,te,sr,replace) "" set xth(ctrl,te,sr,case_io) 0 set xth(ctrl,te,sr,regular_io) 0 set xth(ctrl,te,sr,selection_io) 0 set xth(ctrl,te,sr,selection_start) {} set xth(ctrl,te,sr,selection_end) {} set xth(ctrl,te,sr,search_end) end Label $sfm.seal -text [mc "search"] -anchor w -font $xth(gui,lfont) -state disabled \ -width 4 xth_status_bar te $sfm.seal [mc "Search expression."] Entry $sfm.seae -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,te,sr,search) xth_status_bar te $sfm.seae [mc "Search expression."] checkbutton $sfm.replc -text [mc "replace"] -anchor w -font $xth(gui,lfont) \ -state disabled -width 4 \ -variable xth(ctrl,te,sr,replace_io) \ -command {} xth_status_bar te $sfm.replc [mc "Check whether to replace found expression."] Entry $sfm.reple -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,te,sr,replace) xth_status_bar te $sfm.reple [mc "Replace expression."] checkbutton $sfm.ccase -text [mc "case sensitive search"] -anchor w -font $xth(gui,lfont) \ -state disabled -width 0 \ -variable xth(ctrl,te,sr,case_io) \ -command {} xth_status_bar te $sfm.ccase [mc "Check if search should be case sensitive."] checkbutton $sfm.creg -text [mc "regular expressions"] -anchor w -font $xth(gui,lfont) \ -state disabled -width 0 \ -variable xth(ctrl,te,sr,regular_io) \ -command {} xth_status_bar te $sfm.creg [mc "Check whether to evaluate search and replace as regular expressions."] checkbutton $sfm.csel -text [mc "search selection only"] -anchor w -font $xth(gui,lfont) \ -state disabled -width 0 \ -variable xth(ctrl,te,sr,selection_io) \ -command {} xth_status_bar te $sfm.csel [mc "Check whether to do search only in selected text."] Button $sfm.bfirst -text [mc "First"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 4 -command te_sr_first xth_status_bar te $sfm.bfirst [mc "Search or replace first expression in the file."] Button $sfm.bnext -text [mc "Next"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 4 -command te_sr_next xth_status_bar te $sfm.bnext [mc "Search or replace next expression after the cursor in the file."] Button $sfm.ball -text [mc "All"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 4 -command te_sr_all xth_status_bar te $sfm.ball [mc "Search or replace all expressions in the file."] Button $sfm.bclear -text [mc "Clear"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 4 -command { te_sr_clear set xth(ctrl,te,sr,replace_io) 0 update idletasks } xth_status_bar te $sfm.bclear [mc "Clear all highlights in the file."] grid columnconf $sfm 0 -weight 1 grid columnconf $sfm 1 -weight 1 grid $sfm.seal -row 0 -column 0 -sticky news grid $sfm.seae -row 1 -column 0 -sticky news grid $sfm.replc -row 0 -column 1 -sticky news grid $sfm.reple -row 1 -column 1 -sticky news grid $sfm.ccase -row 2 -column 0 -columnspan 2 -sticky news grid $sfm.creg -row 3 -column 0 -columnspan 2 -sticky news grid $sfm.csel -row 4 -column 0 -columnspan 2 -sticky news grid $sfm.bfirst -row 5 -column 0 -sticky news grid $sfm.bnext -row 5 -column 1 -sticky news grid $sfm.ball -row 6 -column 0 -sticky news grid $sfm.bclear -row 6 -column 1 -sticky news proc xth_te_show_file {fidx} { global xth if {$xth(te,fcurr) >= 0} { pack forget $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame) } if {$fidx < 0} { set fidx 0 } if {$fidx >= [llength $xth(te,flist)]} { set fidx [expr [llength $xth(te,flist)] - 1] } set xth(te,fcurr) $fidx if {$xth(te,fcurr) >= 0} { set cfid [lindex $xth(te,flist) $xth(te,fcurr)] pack $xth(te,$cfid,frame) -expand yes -fill both $xth(ctrl,te,files).fl.flbox delete $xth(te,fcurr) $xth(ctrl,te,files).fl.flbox insert $xth(te,fcurr) "[expr $xth(te,fcurr) + 1]. $xth(te,$cfid,name) ($xth(te,$cfid,path))" $xth(ctrl,te,files).fl.flbox see $fidx $xth(ctrl,te,files).fl.flbox selection clear 0 end $xth(ctrl,te,files).fl.flbox selection set $fidx $fidx focus $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt set xth(te,open_file) $xth(te,$cfid,name) # set xth(te,open_file_encoding) $xth(te,$cfid,encoding) $xth(ctrl,te,files).ef.cel configure -text $xth(te,$cfid,encoding) $xth(ctrl,te,files).ef.ecl configure -state normal $xth(ctrl,te,files).ef.ecb configure -state normal $xth(ctrl,te,files).ef.chb configure -state normal $xth(ctrl,te,files).ef.cel configure -state normal $xth(te,menu) entryconfigure [mc "Edit"] -state normal $xth(te,menu,file) entryconfigure [mc "Save"] -state normal $xth(te,menu,file) entryconfigure [mc "Save as"] -state normal $xth(te,menu,file) entryconfigure [mc "Import"] -state normal $xth(te,menu,file) entryconfigure [mc "Save all"] -state normal $xth(te,menu,file) entryconfigure [mc "Auto save"] -state normal $xth(te,menu,file) entryconfigure [mc "Close"] -state normal $xth(ctrl,te,sr).seal configure -state normal $xth(ctrl,te,sr).seae configure -state normal $xth(ctrl,te,sr).replc configure -state normal $xth(ctrl,te,sr).reple configure -state normal $xth(ctrl,te,sr).ccase configure -state normal $xth(ctrl,te,sr).creg configure -state normal $xth(ctrl,te,sr).csel configure -state normal $xth(ctrl,te,sr).bfirst configure -state normal $xth(ctrl,te,sr).bnext configure -state normal $xth(ctrl,te,sr).ball configure -state normal $xth(ctrl,te,sr).bclear configure -state normal if {[llength $xth(te,flist)] > 1} { $xth(te,menu,file) entryconfigure [mc "Next"] -state normal $xth(te,menu,file) entryconfigure [mc "Previous"] -state normal } else { $xth(te,menu,file) entryconfigure [mc "Next"] -state disabled $xth(te,menu,file) entryconfigure [mc "Previous"] -state disabled } xth_te_sdata_enable "" } else { set xth(te,open_file) "" set xth(te,open_file_encoding) $xth(app,fencoding) $xth(te,menu,file) entryconfigure [mc "Save"] -state disabled $xth(te,menu,file) entryconfigure [mc "Save as"] -state disabled $xth(te,menu,file) entryconfigure [mc "Import"] -state disabled $xth(te,menu,file) entryconfigure [mc "Save all"] -state disabled $xth(te,menu,file) entryconfigure [mc "Auto save"] -state disabled $xth(te,menu,file) entryconfigure [mc "Close"] -state disabled $xth(te,menu,file) entryconfigure [mc "Next"] -state disabled $xth(te,menu,file) entryconfigure [mc "Previous"] -state disabled $xth(ctrl,te,files).ef.ecl configure -state disabled $xth(ctrl,te,files).ef.ecb configure -state disabled $xth(ctrl,te,files).ef.chb configure -state disabled $xth(ctrl,te,files).ef.cel configure -state disabled -text "" xth_te_sdata_disable "" $xth(te,menu) entryconfigure [mc "Edit"] -state disabled $xth(ctrl,te,sr).seal configure -state disabled $xth(ctrl,te,sr).seae configure -state disabled $xth(ctrl,te,sr).replc configure -state disabled $xth(ctrl,te,sr).reple configure -state disabled $xth(ctrl,te,sr).ccase configure -state disabled $xth(ctrl,te,sr).creg configure -state disabled $xth(ctrl,te,sr).csel configure -state disabled $xth(ctrl,te,sr).bfirst configure -state disabled $xth(ctrl,te,sr).bnext configure -state disabled $xth(ctrl,te,sr).ball configure -state disabled $xth(ctrl,te,sr).bclear configure -state disabled xth_ctrl_minimize te sr } xth_app_title te } proc xth_te_set_encoding {} { global xth if {$xth(te,fcurr) >= 0} { # convert encoding into system's one set rxp "\\s+($xth(te,open_file_encoding))\\s+" if {[regexp -nocase $rxp $xth(encodings) dum temp]} { set xth(te,open_file_encoding) $temp set xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],encoding) $temp $xth(ctrl,te,files).ef.cel configure -text $temp } else { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message "uknown encoding -- $xth(te,open_file_encoding)" \ -font $xth(gui,lfont) } } } proc xth_te_switch_file {fdr} { global xth set cf $xth(te,fcurr) if {$cf != -1} { incr cf $fdr if {$cf < 0} { set cf [expr [llength $xth(te,flist)] - 1] } if {$cf >= [llength $xth(te,flist)]} { set cf 0 } xth_te_show_file $cf } } proc xth_te_create_file {} { global xth xth_status_bar_status te "" # create file variables incr xth(te,fltid) set cfid $xth(te,fltid) #set xth(te,$cfid,name) [format "noname%d$xth(app,te,fileext)" $cfid] set xth(te,$cfid,name) [format "(new file)" $cfid] set xth(te,$cfid,path) [file join $xth(gui,initdir) $xth(te,$cfid,name)] set xth(te,$cfid,newf) 1 set xth(te,$cfid,mtime) 0 set xth(te,$cfid,encoding) $xth(app,fencoding) set xth(te,$cfid,frame) $xth(gui,te).af.apps.ff.file$cfid set cfr $xth(te,$cfid,frame) # create the frame and bind the events set iac {if {[string equal $xth(app,active) te]} } frame $cfr text $cfr.txt -font $xth(gui,efont) -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -yscrollcommand "$cfr.sv set" \ -xscrollcommand "$cfr.sh set" \ -relief sunken \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -wrap none if {$xth(gui,text_undo)} { $cfr.txt configure -undo 1 -maxundo -1 } set xth(te,$cfid,otext) [$cfr.txt get 1.0 end] scrollbar $cfr.sv -orient vert -command "$cfr.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $cfr.sh -orient horiz -command "$cfr.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $cfr.txt "$iac {$xth(te,bind,text_tab)}" bind $cfr.txt "$iac {$xth(te,bind,text_return)}" bind $cfr.txt <> "xth_te_update_position $cfr.txt" bind $cfr.txt "+ $iac {event generate $cfr.txt <> -when tail}" bind $cfr.txt "+ $iac {event generate $cfr.txt <> -when tail}" bind $cfr.txt <$xth(kb_control)-Key-1> "$iac {xth_te_show_file 0}" bind $cfr.txt <$xth(kb_control)-Key-2> "$iac {xth_te_show_file 1}" bind $cfr.txt <$xth(kb_control)-Key-3> "$iac {xth_te_show_file 2}" bind $cfr.txt <$xth(kb_control)-Key-4> "$iac {xth_te_show_file 3}" bind $cfr.txt <$xth(kb_control)-Key-5> "$iac {xth_te_show_file 4}" bind $cfr.txt <$xth(kb_control)-Key-6> "$iac {xth_te_show_file 5}" bind $cfr.txt <$xth(kb_control)-Key-7> "$iac {xth_te_show_file 6}" bind $cfr.txt <$xth(kb_control)-Key-8> "$iac {xth_te_show_file 7}" bind $cfr.txt <$xth(kb_control)-Key-9> "$iac {xth_te_show_file 8}" bind $cfr.txt <$xth(kb_control)-Key-0> "$iac {xth_te_show_file 9}" bind $cfr.txt <$xth(kb_control)-Key-n> "$iac {xth_te_switch_file 1}" bind $cfr.txt <$xth(kb_control)-Key-p> "$iac {xth_te_switch_file -1}" bind $cfr.txt <$xth(kb_control)-Key-w> "$iac {xth_te_close_file}" bind $cfr.txt <$xth(kb_control)-Key-a> "$iac {xth_te_select_all}" bind $cfr.txt <$xth(kb_control)-Key-i> "$iac {xth_te_auto_indent}" bind $cfr.txt <$xth(kb_control)-Key-s> "$iac {xth_te_save_file 0 $cfid}" bind $cfr.txt "xth_te_before_close_file $cfid yesno" # if {$xth(gui,bindclip) == 1} { bind $cfr.txt <$xth(kb_control)-Key-x> "$iac {tk_textCut $cfr.txt}" bind $cfr.txt <$xth(kb_control)-Key-c> "$iac {tk_textCopy $cfr.txt}" bind $cfr.txt <$xth(kb_control)-Key-v> "$iac {tk_textPaste $cfr.txt}" bind $cfr.txt <$xth(kb_control)-Key-z> "$iac {catch {$cfr.txt edit undo}}" bind $cfr.txt <$xth(kb_control)-Key-y> "$iac {catch {$cfr.txt edit redo}}" if {$xth(gui,bindinsdel)} { bind $cfr.txt { %W delete insert %W see insert } bind $cfr.txt "$iac {tk_textCut $cfr.txt}" bind $cfr.txt <$xth(kb_control)-Key-Insert> "$iac {tk_textCopy $cfr.txt}" bind $cfr.txt "$iac {tk_textPaste $cfr.txt}" # catch { # bind $cfr.txt "$iac {tk_textCut $cfr.txt}" # bind $cfr.txt <$xth(kb_control)-Key-KP_Insert> "$iac {tk_textCopy $cfr.txt}" # bind $cfr.txt "$iac {tk_textPaste $cfr.txt}" # } } # } grid columnconf $cfr 0 -weight 1 grid rowconf $cfr 0 -weight 1 grid $cfr.txt -column 0 -row 0 -sticky news grid $cfr.sv -column 1 -row 0 -sticky news grid $cfr.sh -column 0 -row 1 -sticky news # add file to list and listbox set xth(te,flist) [linsert $xth(te,flist) end $cfid] $xth(ctrl,te,files).fl.flbox insert end "[llength $xth(te,flist)]. $xth(te,$cfid,name) ($xth(te,$cfid,path))" xth_te_show_file [expr [llength $xth(te,flist)] - 1] } # xth_te_read_file -- # # return list containing # {success name encoding text} proc xth_te_read_file {pth} { global errorInfo xth set curenc utf-8 set nm [file tail $pth] set encspc 0 set flnn 0 set success 1 set txt "" if {[catch {set fid [open $pth r]}]} { set success 0 set nm $errorInfo return [list $success $nm $curenc $txt] } fconfigure $fid -encoding $curenc while {[eof $fid] != 1} { gets $fid fln if {$flnn == 0} { if {[scan [string index $fln 0] %c] == 65279} { set fln [string range $fln 1 end] } } # replace tabs regsub -all {\t} $fln " " fln incr flnn if {[regexp {^\s*encoding\s+(\S+)\s*$} $fln encln enc]} { if {$encspc} { set success 0 set nm "$pth \[$flnn\] -- multiple encoding commands in file" break } set encspc 1 set rxp "\\s+($enc)\\s+" set validenc [regexp -nocase $rxp $xth(encodings) dum curenc] if {$validenc == 0} { set success 0 set nm "$pth \[$flnn\] -- unknown encoding -- $enc" break } fconfigure $fid -encoding $curenc } else { # if {$encspc == 0} { # if {[regexp {^\s*[^\#]+} $fln]} { # set success 0 # set nm "$pth \[$flnn\] -- encoding command expected" # break # } # } append txt "$fln\n" } } close $fid return [list $success $nm $curenc $txt] } # xth_te_write_file -- # # return list containing # {success name} proc xth_te_write_file {pth enc txt} { global errorInfo xth set curenc utf-8 set nm [file tail $pth] set success 1 if {[catch {set fid [open $pth w]}]} { set success 0 set nm $errorInfo return [list $success $nm] } fconfigure $fid -encoding $curenc -translation {auto auto} if {![string equal $xth(prj,name) svxedit]} { puts $fid "encoding $enc" } fconfigure $fid -encoding $enc -translation {auto auto} puts -nonewline $fid $txt close $fid return [list $success $nm] } proc xth_te_destroy_file {} { global xth if {$xth(te,fcurr) >= 0} { # delete file from list and listbox and destroy windows set tempcurr $xth(te,fcurr) set cfid [lindex $xth(te,flist) $tempcurr] pack forget $xth(te,$cfid,frame) set xth(te,flist) [lreplace $xth(te,flist) $xth(te,fcurr) $xth(te,fcurr)] $xth(ctrl,te,files).fl.flbox delete $tempcurr set xth(te,fcurr) -1 # set other window to be active xth_te_show_file $tempcurr # destroy variable unset xth(te,$cfid,name) unset xth(te,$cfid,path) unset xth(te,$cfid,newf) unset xth(te,$cfid,encoding) unset xth(te,$cfid,frame) unset xth(te,$cfid,otext) } } proc xth_te_open_file {dialogid fname fline} { global xth if {$dialogid} { set fname [tk_getOpenFile -filetypes $xth(app,te,filetypes) \ -parent $xth(gui,main) \ -initialdir $xth(gui,initdir) -defaultextension $xth(app,te,fileext)] } if {[string length $fname] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fname] } # now let's open file fname # check if not open exists for {set fid 0} {$fid < [llength $xth(te,flist)]} {incr fid} { if {[string equal $fname $xth(te,[lindex $xth(te,flist) $fid],path)]} { xth_te_show_file $fid return 1 } } # read the file xth_status_bar_push te xth_status_bar_status te [format [mc "Opening %s ..."] $fname] set fdata [xth_te_read_file $fname] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) xth_status_bar_pop te return 0 } # show the file xth_te_create_file set cfid [lindex $xth(te,flist) $xth(te,fcurr)] set xth(te,$cfid,name) [lindex $fdata 1] set xth(te,$cfid,path) $fname set xth(te,$cfid,newf) 0 set xth(te,$cfid,mtime) [file mtime $fname] set xth(te,$cfid,encoding) [lindex $fdata 2] $xth(ctrl,te,files).ef.cel configure -text [lindex $fdata 2] regsub -all {\s*$} [lindex $fdata 3] "" ftext xth_te_insert_text $xth(te,$cfid,frame).txt "$ftext\n" catch { $xth(te,$cfid,frame).txt edit reset } set xth(te,$cfid,otext) [$xth(te,$cfid,frame).txt get 1.0 end] xth_te_show_file $xth(te,fcurr) if {$fline > 0} { $xth(te,$cfid,frame).txt mark set insert "$fline.0" } else { $xth(te,$cfid,frame).txt mark set insert "1.0" } $xth(te,$cfid,frame).txt see insert if {$fline > 0} { $xth(te,$cfid,frame).txt tag remove sel 1.0 end $xth(te,$cfid,frame).txt tag add sel "$fline.0" "$fline.0 lineend" } xth_status_bar_pop te return 1 } proc xth_te_before_close_file {cfid btns} { global xth if { [catch {winfo exists $xth(te,$cfid,frame).txt}] || (![winfo exists $xth(te,$cfid,frame).txt])} { return 1 } set ftext [$xth(te,$cfid,frame).txt get 1.0 end] if {[string compare $xth(te,$cfid,otext) $ftext] != 0} { set wtd [MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon question -type $btns\ -message [format [mc "File %s is not saved. Save it now?"] $xth(te,$cfid,path)]\ -font $xth(gui,lfont)] switch $wtd { 0 { if {[xth_te_save_file 0 $cfid] == 0} { return 0 } } 1 {} default {return 0} } } return 1 } proc xth_te_close_file {} { global xth if {$xth(te,fcurr) < 0} { return } set cfid [lindex $xth(te,flist) $xth(te,fcurr)] if {[xth_te_before_close_file $cfid yesnocancel]} { xth_te_destroy_file return 1 } else { return 0 } } proc xth_te_save_file {dialogid cfid} { global xth if {[llength $xth(te,flist)] == 0} { return 0 } set fid [lsearch -exact $xth(te,flist) $cfid] if {$fid == -1} { return 0 } set cfid [lindex $xth(te,flist) $fid] # let's check if we need to save set ftext [$xth(te,$cfid,frame).txt get 1.0 end] if {! $dialogid} { if {[string compare $xth(te,$cfid,otext) $ftext] == 0} { return 1 } } xth_status_bar_push te if {$xth(te,$cfid,newf)} { set dialogid 1 } set fname $xth(te,$cfid,path) set ofname $fname if {$dialogid} { set fname [tk_getSaveFile -filetypes $xth(app,te,filetypes) \ -parent $xth(gui,main) \ -initialfile [file tail $fname] -initialdir [xth_getdir $fname] \ -defaultextension $xth(app,te,fileext)] } if {($xth(te,$cfid,mtime) > 0) && [file exists $fname] && \ ([file mtime $fname] > $xth(te,$cfid,mtime))} { set forcesave [MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon warning -type yesno -default 1 \ -message [format [mc "File %s was modified outside xtherion. Save it anyway?"] $fname]\ -font $xth(gui,lfont)] if {$forcesave != 0} { return 0 } } if {[string length $fname] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fname] } # save the file xth_status_bar_status te [format [mc "Saving %s ..."] $fname] set fdata [xth_te_write_file $fname $xth(te,$cfid,encoding) $ftext] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) xth_status_bar_pop te return 0 } set xth(te,$cfid,mtime) [file mtime $fname] set xth(te,$cfid,otext) $ftext set xth(te,$cfid,newf) 0 # if SaveAs, then redisplay the file if {$dialogid} { if {[string compare $ofname $fname] != 0} { set xth(te,$cfid,name) [lindex $fdata 1] set xth(te,$cfid,path) $fname xth_te_show_file $fid } } after 250 {xth_status_bar_pop te} return 1 } proc xth_te_save_all {} { global xth set ocur $xth(te,fcurr) foreach cfid $xth(te,flist) { xth_te_save_file 0 $cfid } xth_te_show_file $ocur } proc xth_te_update_position {W} { global xth regexp {(\d+)\.(\d+)} [$W index insert] dum lns pos $xth(gui,te).sf.pbar configure -text [format "%d.%d" [expr $lns + 1] $pos] } proc xth_te_text_select_all {txt} { $txt tag add sel 1.0 end } proc xth_te_select_all {} { global xth if {$xth(te,fcurr) > -1} { set cfid [lindex $xth(te,flist) $xth(te,fcurr)] $xth(te,$cfid,frame).txt tag add sel 1.0 end } } proc xth_te_new_file {} { global xth xth_te_create_file set cfid [lindex $xth(te,flist) $xth(te,fcurr)] xth_te_insert_text $xth(te,$cfid,frame).txt $xth(te,template) } $xth(te,menu,file) add command -label [mc "New"] -command xth_te_new_file \ -font $xth(gui,lfont) -underline 0 $xth(te,menu,file) add command -label [mc "Open"] -underline 0 \ -accelerator "$xth(gui,controlk)-o" \ -font $xth(gui,lfont) -command {xth_te_open_file 1 {} 0} $xth(te,menu,file) add command -label [mc "Save"] -underline 0 \ -accelerator "$xth(gui,controlk)-s" -state disabled \ -font $xth(gui,lfont) -command { if {$xth(te,fcurr) >= 0} { xth_te_save_file 0 [lindex $xth(te,flist) $xth(te,fcurr)] } } $xth(te,menu,file) add command -label [mc "Save as"] -underline 5 \ -font $xth(gui,lfont) -state disabled -command { if {$xth(te,fcurr) >= 0} { xth_te_save_file 1 [lindex $xth(te,flist) $xth(te,fcurr)] } } $xth(te,menu,file) add command -label [mc "Save all"] -underline 6 \ -font $xth(gui,lfont) -state disabled -command xth_te_save_all $xth(te,menu,file) add checkbutton -label [mc "Auto save"] -underline 1 \ -variable xth(gui,auto_save) -font $xth(gui,lfont) \ -state disabled -command xth_app_autosave_schedule $xth(te,menu,file) add command -state disabled -label [mc "Close"] -underline 0 \ -accelerator "$xth(gui,controlk)-w" \ -font $xth(gui,lfont) \ -command "xth_te_close_file" $xth(te,menu,file) add separator $xth(te,menu,file) add command -state disabled -label [mc "Import"] -underline 0 \ -font $xth(gui,lfont) \ -command "xth_te_import_file" $xth(te,menu,file) add separator $xth(te,menu,file) add command -state disabled -label [mc "Next"] \ -accelerator "$xth(gui,controlk)-n" \ -font $xth(gui,lfont) -command "xth_te_switch_file 1" -underline 2 $xth(te,menu,file) add command -state disabled -label [mc "Previous"] \ -accelerator "$xth(gui,controlk)-p" \ -font $xth(gui,lfont) -command "xth_te_switch_file -1" -underline 0 set xth(te,menu,edit) $xth(te,menu).edit menu $xth(te,menu,edit) -tearoff 0 $xth(te,menu) add cascade -label [mc "Edit"] -state disabled \ -font $xth(gui,lfont) -menu $xth(te,menu,edit) -underline 0 if {$xth(gui,text_undo)} { $xth(te,menu,edit) add command -label [mc "Undo"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-z" -command "xth_app_clipboard undo" $xth(te,menu,edit) add command -label [mc "Redo"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-y" -command "xth_app_clipboard redo" $xth(te,menu,edit) add separator } $xth(te,menu,edit) add command -label [mc "Cut"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-x" -command "xth_app_clipboard cut" $xth(te,menu,edit) add command -label [mc "Copy"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-c" -command "xth_app_clipboard copy" $xth(te,menu,edit) add command -label [mc "Paste"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-v" -command "xth_app_clipboard paste" $xth(te,menu,edit) add separator $xth(te,menu,edit) add command -label [mc "Select all"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-a" -command "xth_te_select_all" $xth(te,menu,edit) add command -label [mc "Auto indent"] -font $xth(gui,lfont) \ -command "xth_te_auto_indent" -accelerator "$xth(gui,controlk)-i" proc xth_te_get_indent {w i cilc} { global xth set indls "" set cmdls "" set cmd0s "" set cmdl 0 regexp {(\d+)\.} $i dum cln set line0 [$w get $cln.0 $cln.end] regexp {\S+} $line0 cmd0s if {[info exists xth(cmd,$cmd0s)]} { set cmd0 $xth(cmd,$cmd0s) } else { set cmd0 0 } set sln [expr $cln - 1] set line1 [$w get $sln.0 $sln.end] set linel $line1 set hasl 0 set escan 0 while {($sln > 1) && (! $hasl)} { incr sln -1 if {[regexp {\S} $linel]} { set cline [$w get $sln.0 $sln.end] if {[regexp {\\\s*$} $cline]} { set linel $cline } else { set hasl 1 } } else { set linel [$w get $sln.0 $sln.end] } } regexp {\S+} $linel cmdls if {[info exists xth(cmd,$cmdls)]} { set cmdl $xth(cmd,$cmdls) set endcmdls $xth(endcmd,$cmdls) } else { set cmdl 0 } regexp {^\s+} $linel indls set indl [string length $indls] set bsl1 [regexp {\\\s*$} $line1] # preskenuje prikazy nad #puts "cilc |$cilc|\nindl |$indl|\ncmd0 |$cmd0|\ncmd0s |$cmd0s|\ncmdl |$cmdl|\ncmdls |$cmdls|\n" if {$cmdl == 1} { # puts "$cln. cilc |$cilc|" set cmdcomct 0 set cmdcomctfi 1 set enddetect 0 set set_cmd_counts { regexp {\S+} $slns cmdcomx # puts "$cmdls ?? $cmdcomx" if {[string compare $endcmdls $cmdcomx] == 0} { set endscan 1 set enddetect 1 } elseif {[string compare $cmdls $cmdcomx] == 0} { if {! $cmdcomctfi} { if {$cmdcomct} { set endscan 1 } incr cmdcomct } else { set cmdcomctfi 0 } } } set sln [expr $cln - 1] set slns $line1 set endscan 0 while {($sln > 1) && (!$endscan)} { incr sln -1 if {[regexp {\S} $slns]} { set clns [$w get $sln.0 $sln.end] if {[regexp {(.*)\\\s*$} $clns dum vlns]} { set slns "$vlns$slns" } else { eval $set_cmd_counts set slns $clns } } else { set slns [$w get $sln.0 $sln.end] } } if {!$enddetect} { eval $set_cmd_counts } # puts $cmdcomct if {$cmdcomct > 0} { set cmdl 0 } } # koniec scanovania if {$bsl1} { set ind [expr $indl + 2 * $xth(gui,etabsize)] } else { set ind $indl if {$cmdl > 0} { incr ind $xth(gui,etabsize) } if {$cilc && ($cmd0 < 0)} { incr ind -$xth(gui,etabsize) } } if {$ind > 0} { return [format %$ind\s " "] } else { return "" } } proc xth_te_auto_indent {} { global xth if {$xth(te,fcurr) < 0} { return } set cfid [lindex $xth(te,flist) $xth(te,fcurr)] set W $xth(te,$cfid,frame).txt set rngs [$W tag ranges sel] set fln 1 set tln -1 regexp {(\d+)\.} [lindex $rngs 0] dum fln regexp {(\d+)\.} [lindex $rngs 1] dum tln xth_status_bar_push te for {set cln $fln} {$cln < $tln} {incr cln} { xth_status_bar_status te [format [mc "Processing line %s ..."] $cln] $W see $cln.0 set spcs "" regexp {^\s+} [$W get $cln.0 $cln.end] spcs set spcsc [string length $spcs] set indct [string length [xth_te_get_indent $W $cln.0 1]] if {$spcsc == $indct} { } elseif {$spcsc > $indct} { $W delete $cln.0 $cln.[expr $spcsc - $indct] } elseif {$spcsc < $indct} { $W insert $cln.0 [format \x25[expr $indct - $spcsc]s " "] } } $W see insert # $W tag remove sel 1.0 end xth_status_bar_pop te } proc xth_te_text_auto_indent {W} { set rngs [$W tag ranges sel] set fln 1 set tln -1 regexp {(\d+)\.} [lindex $rngs 0] dum fln regexp {(\d+)\.} [lindex $rngs 1] dum tln for {set cln $fln} {$cln < $tln} {incr cln} { $W see $cln.0 set spcs "" regexp {^\s+} [$W get $cln.0 $cln.end] spcs set spcsc [string length $spcs] set indct [string length [xth_te_get_indent $W $cln.0 1]] if {$spcsc == $indct} { } elseif {$spcsc > $indct} { $W delete $cln.0 $cln.[expr $spcsc - $indct] } elseif {$spcsc < $indct} { $W insert $cln.0 [format \x25[expr $indct - $spcsc]s " "] } } $W see insert } xth_ctrl_minimize te sr xth_status_bar_status te [mc "Text editor is not active. To activate it, open existing file or create new one."] therion/xtherion/scroll.tcl0000664000175000017500000000316410625665160015123 0ustar useruser## ## scroll.tcl -- ## ## Special scrollbar commands. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- proc xth_scroll_showcmd {sbar cmd} { global xth set xth(scroll,$sbar,show) $cmd set xth(scroll,$sbar,open) 0 } proc xth_scroll_hidecmd {sbar cmd} { global xth set xth(scroll,$sbar,hide) $cmd set xth(scroll,$sbar,open) 0 } proc xth_scroll {sbar first last} { global xth if {[expr $first == 0.0] && [expr $last == 1.0]} { if {$xth(scroll,$sbar,open) == 1} { set xth(scroll,$sbar,open) 0 eval $xth(scroll,$sbar,hide) update idletasks } } else { if {$xth(scroll,$sbar,open) == 0} { set xth(scroll,$sbar,open) 1 eval $xth(scroll,$sbar,show) update idletasks } $sbar set $first $last } }therion/xtherion/init.tcl0000664000175000017500000001363711102320752014560 0ustar useruser## ## init.tcl -- ## ## Initialization script. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- package require BWidget if {[catch {set imgver [package require Img]}]} { set xth(gui,imgfiletypes) { { {Pictures} {.gif .pnm .ppm .xvi} } { {PocketTopo therion export} {.txt} } { {All Files} * } } } else { set xth(gui,imgfiletypes) { { {Pictures} {.png .jpeg .jpg .gif .pnm .ppm .xvi} } { {PocketTopo therion export} {.txt} } { {All Files} * } } } # read xtherion.ini file from THERION directory set idir {} if {[catch {set idir $env(THERION)}]} { if {![catch {set idir $env(HOME)}]} { append idir "/.therion" if {[string equal $xth(gui,platform) windows]} { append idir ";" } else { append idir ":" } } if {[string equal $xth(gui,platform) windows]} { if {[catch { append idir [registry get $xth(win32registry) InstallDir] }]} { append idir "C:/WINDOWS;C:/WINNT;C:/Program files/Therion" } } else { append idir "/etc:/usr/etc:/usr/local/etc" } } if {[string equal $xth(gui,platform) windows]} { set idirs [split $idir ";"] } else { set idirs [split $idir ":"] } set xth(idirs) $idirs foreach idir $xth(idirs) { catch {source [file join $idir xtherion.ini]} } catch {source xtherion.ini} # create xth window wm withdraw . xth_about_show 0 toplevel $xth(gui,main) wm withdraw $xth(gui,main) wm protocol $xth(gui,main) WM_DELETE_WINDOW "xth_exit" wm title $xth(gui,main) $xth(prj,name) wm geometry $xth(gui,main) [format "%dx%d+0+0" [lindex $xth(gui,minsize) 0] \ [lindex $xth(gui,minsize) 1]] wm minsize $xth(gui,main) [lindex $xth(gui,minsize) 0] \ [lindex $xth(gui,minsize) 1] update idletasks bind $xth(gui,main) { catch {xth_app_place $xth(app,active)} } set xth(gui,clock) "00:00" # redefine some public key bindigs if {$xth(gui,bindinsdel)} { bind Text { } } bind Text <$xth(kb_control)-Key-o> "#" bind Text <$xth(kb_control)-Key-a> "#" bind Text <$xth(kb_control)-Key-i> "#" bind Text <$xth(kb_control)-Key-s> "#" bind Text <$xth(kb_control)-Key-w> "#" bind Text <$xth(kb_control)-Key-q> "#" bind Text <$xth(kb_control)-Key-x> "#" bind Text <$xth(kb_control)-Key-n> "#" bind Text <$xth(kb_control)-Key-p> "#" bind Text <$xth(kb_control)-Key-c> "#" bind Text <$xth(kb_control)-Key-v> "#" bind Text <$xth(kb_control)-Key-f> "#" bind Text <$xth(kb_control)-Key-h> "#" bind Text <$xth(kb_control)-Key-z> "#" bind Text <$xth(kb_control)-Key-y> "#" bind Text <$xth(kb_control)-Key-d> "#" bind Text <$xth(kb_control)-Key-k> "#" bind Text <$xth(kb_control)-Key-r> "#" bind Entry <$xth(kb_control)-Key-d> "#" bind Entry <$xth(kb_control)-Key-k> "#" set xth(gui,bind,text_tab) [bind Text ] set xth(gui,bind,text_return) [bind Text ] bind Text "#" bind Text "#" if {[string length $xth(gui,initdir)] == 0} { if {[catch { set xth(gui,initdir) [registry get $xth(win32registry) XTherionDir] }]} { set xth(gui,initdir) [pwd] } } proc thememc {tt} { set trans [mc $tt] if {[string equal $tt $trans]} { set trans [lindex $tt 1] regsub -all {[\-\:]} $trans { } trans } return $trans } set alllist {} foreach type $xth(point_types) { lappend alllist [list point $type] } foreach type $xth(line_types) { lappend alllist [list line $type] } foreach type $xth(area_types) { lappend alllist [list area $type] } set tmp [mc "theme all-symbols"] set alllist [linsert $alllist 0 {theme all-symbols}] set xth(me,themes) "$alllist $xth(me,themes)" set xth(me,themes,list) {} set xth(me,themes,showlist) {} # process themes set acttheme all-symbols foreach itm $xth(me,themes) { set key [lindex $itm 0] set value [lindex $itm 1] switch $key { theme { lappend xth(me,themes,list) $value lappend xth(me,themes,showlist) [thememc $itm] set xth(me,themes,$value,point,list) {} set xth(me,themes,$value,point,xlist) {} set xth(me,themes,$value,line,list) {} set xth(me,themes,$value,line,xlist) {} set xth(me,themes,$value,area,list) {} set xth(me,themes,$value,area,xlist) {} set acttheme $value } point { lappend xth(me,themes,$acttheme,point,list) $value lappend xth(me,themes,$acttheme,point,xlist) [list [thememc $itm] $value] } line { lappend xth(me,themes,$acttheme,line,list) $value lappend xth(me,themes,$acttheme,line,xlist) [list [thememc $itm] $value] } area { lappend xth(me,themes,$acttheme,area,list) $value lappend xth(me,themes,$acttheme,area,xlist) [list [thememc $itm] $value] } } } proc xth_me_sortxlist {cl} { set cl [lsort -index 0 $cl] set hl {} set sl {} foreach xl $cl { lappend sl [lindex $xl 0] lappend hl [lindex $xl 1] } return [list $sl $hl] } foreach tm $xth(me,themes,list) { foreach itm {point line area} { set lists [xth_me_sortxlist $xth(me,themes,$tm,$itm,xlist)] set xth(me,themes,$tm,$itm,showlist) [lindex $lists 0] set xth(me,themes,$tm,$itm,hidelist) [lindex $lists 1] unset xth(me,themes,$tm,$itm,xlist) } } therion/xtherion/te_sdata2.tcl0000664000175000017500000000025210625665160015466 0ustar useruser$xth(ctrl,te,sdata).taf configure -command xth_te_sdata_auto_format xth_te_sdata_buid {from to tape compass clino} [expr 2 * $xth(gui,etabsize)] xth_te_sdata_disable "" therion/xtherion/msgusr.tcl0000664000175000017500000006110711542657122015144 0ustar useruser::msgcat::mcset en "xtherion_help_control" { MAP EDITOR SHORTCUTS General shortcuts * Ctrl+Z = undo * Ctrl+Y = redo * F9 = compile current project * to select object in the listbox using keyboard: switch using "Tab" into desired listbox; move with underlined cursor to desired object; press "Space" Drawing area and background images * RightClick = scroll drawing area * Double RightClick on the image = move the image Inserting scrap * press "Ctrl-r" or "Edit" > "Insert" > "scrap" to insert new scrap * new scrap is inserted just after the current one Inserting point * Ctrl+P = switch to `insert point' mode * LeftClick = insert point at given position * Ctrl+LeftClick = insert point very close to existing point (normally it will be inserted right above the closest point) * Esc = escape from the `inset point' mode Editing point * LeftClick + drag = move point * Ctrl+LeftClick + drag = move point close to the existing point (normally it is moved right above closest existing point) * LeftClick + drag on point arrows = change point orientation or sizes (according to given switches in Point cotrol panel) Inserting line * Crtl+L = insert new line and enter an `insert line point' mode * LeftClick = insert line point (without control points) * Ctrl+LeftClick = insert line point very close to existing point (normally it's inserted right above closest existing point) * LeftClick + drag = insert line point (with control points) * hold Ctrl while dragging = fix the distance of previous control point * LeftClick + drag on the control point = move its position * RightClick on one of the previous points = selects the previous point while in insert mode (useful if you want to change also the direction of previous control point) * Esc or LeftClick on the last point = end the line insertion * LeftClick on the first line point = close the line and end line insertion Editing line * LeftClick + drag = move line point * Ctrl+LeftClick + drag = move line point close to the existing point (normally it is moved right above closest existing point) * LeftClick on control point + drag = move control point Adding line point * select the point before which you want to insert points; insert required points; press Esc or left-click on the point you selected at the begining Deleting line point * select the point you want to delete; press "Edit line" > "Delete point" in the Line control panel Splitting line * select the point at which you want to split the line; press "Edit line" > "Split line" in the Line control panel Inserting area * press "Ctrl-a" or "Edit" > "Insert" > "area" to switch to the "insert area border" mode * RightClick on the lines, that suround desired area * Esc to finish area border lines insertion Editing area * select area you want to edit * pres "Insert" in the area control to insert other border lines at current cursor position * pres "Insert ID" to insert border with given ID at current cursor position * pres "Delete" to remove selected area border line Selecting an existing object * LeftClick = select object on the top * RightClick = select object right below the top object (useful when several points lie above each other) } ::msgcat::mcset es "xtherion_help_control" { ATAJOS DE TECLADO PARA EDITAR MAPAS Atajos generales * Ctrl+Z = Deshacer * Ctrl+Y = Rehacer * F9 = Compilar proyecto actual * para seleccionar en los menús usando el teclado: Pulsar "Tab" hasta seleccionar el menú deseado; Moverse con las flechas hasta el objeto deseado; pulsar "Espacio" Area de dibujo e imáges de fondo * Click Dcho = desplazar área de dibujo * Doble click dcho en la imagen = mover la imagen Insertar croquis * Pulsar "Ctrl-r" o "Editar" > "Insertar" > "Croquis" para insertar un croquis nuevo * el nuevo croquis se insertará justo detrás del actual Insertar punto * CTRL+P = cambiar a modo 'insertar punto' * Click = insertar punto en esa posición * Ctrl+Click = insertar punto muy cerca de otro punto (normalmente se insertará justo encima del punto más cercano) * Esc = salir del modo 'insertar punto' Editar punto * Click en punto + arrastrar = mover el punto * Ctrl + Click en punto + Arrastrar = mover el punto cerca de otro * normalmente es movido justo encima del punto más cercano * Click en la punta de una flecha + arrastrar = cambiar la orientación o el tamaño (segun lo indicado en el panel de control Punto) Insertar línea * Ctrl+L = insertar nueva línea y pasar al modo "insertar puntos de línea" * Click = insertar punto de línea (sin puntos de control) * Ctrl+Click = Insertar punto de línea muy cerca de otro (Normalmente se inserta justo encima del punto más cercano) * Click + arrastrar = insertar punto de línea (con puntos de control) * Pulsar Ctrl mientras se arrastra = fijar la distancia al punto de control anterior * Arrastra punto de control = cambir su posición * Click dcho en uno de los puntos anteriores = seleccionar ese punto anterior cuando estamos en modo inserción (Util si se quiere cambiar también la dirección del punto de control anterior) * Esc o Click en último punto de la línea = finaliza la inserción de línea * Click en el primer punto de la línea = cierra la línea y finaliza la inserción de línea Editar línea * Click en punto + arrastrar = mover punto de línea * Ctrl+Click+arrastrar = mover punto de línea cerca de otro punto) (normalmente se mueve justo encima del punto más cercano) * Click en punto de control + arrastrar = mover punto de control Añadir puntos de línea * seleccionar el punto antes del cual se quieren insertar puntos * insertar los puntos que hagan falta * pulsar Esc o hacer click en el punto que se seleccionó al principio Borrar puntos de línea * seleccionar el punto que se quiere borrar * pulsar "Editar" > "Borrar punto" en el panel de control Líneas Partir líneas * seleccionar el punto en que se quiere cortar la línea * pulsar "Editar" > "Cortar línea" en el panel de control Líneas Insertar áreas * pulsar Ctrl-a o "Editar" > "Insertar" > área en menú principal * para cambiar al modo "insertar límite de área" * Click dcho en las líneas que limitarán el área * pulsar Esc para teminar la inserción de líneas límite Editar áreas * seleccionar el área que se quiere editar * pulsar "Insertar" en el control area para insertar otras líneas límite en la posición del cursor * pulsar "Insertar ID" para insertar un límite con el ID que se indique en l posición del cursor * Pulsar "Borrar" para eliminae la línea límite seleccionada Seleccionar objetos * Click = seleccionar el objeto que está sobre los demás * Click dcho = seleccionar el objeto que está en segundo plano (útil cuando varios puntos están superpuestos) } ::msgcat::mcset it "xtherion_help_control" { SHORTCUT - EDITOR DI MAPPA Shortcut generali * Ctrl+Z = torna indietro * Ctrl+Y = rifai * F9 = compila il progetto * per selezionare un oggetto in una lista con la tastiera: muovi con il tasto "Tab" nella lista desidearta; muovi il cursore sull'oggetto desiderato; premi il tasto "Spazio" Area di disegno e immagini di background * Tasto destro = scrolla l'area di disegno * Doppio click col tasto destro su una immagine = muovi l'immagine Inserimento scrap * premi "Ctrl-R" oppure "Edita" > "Inserisci" > "scrap" per inserire un nuovo scrap * il nuovo scrap viene inserito immediatamente dopo quello attivo Inserimento punto * "Ctrl-P" = cambia alla modalità di inserimento punti * Tasto sinistro = inserisci un punto nella posizione del mouse * Ctrl + tasto sinistro = inserisci un punto vicino ad uno esistente (di solito esso viene inserito esattamente sopra quello esistente) * "Esc" = esci dalla modalità di inserimento punti Editare punti * Trascina con tasto sinistro = muovi il punto * Trascina con Ctrl + tasto sinistro = muovi il punto vicino ad uno esistente (solitamente viene poszionato proprio sopra quello esistente) * Trascina con tasto sinistro per la punta delle freccie = cambia l'orientazione o la dimensione (dipendentemente dallo switch nel "Controllo Punti" del pannello) Inserimento linee * "Ctrl-L" = entra in modalità inserimento linee ed inserisci una nuova linea * Tasto sinistro = inserisci un nuovo punto della linea (senza punti di controllo) * Ctrl + tasto sinistro = inserisci un nuovo punto della linea vicino ad uno esistente (normalmente sopra di esso) * Trascina con tasto sinistro = inserisci un nuovo punto della linea (con punti di controllo) * tieni premuto "Ctrl" durante in trascinamento = fissa la distanza del precedente punto di controllo * Trascina con tasto sinistro su un punto di controllo = muovi la sua posizione * Tasto destro su uno dei punti precedenti = seleziona il punto precedente mentre sei in modaliatà di inserimento (utile se vuoi cambiare anche la direzione del precedente punto di controllo) * "Esc" oppure tasto sinistro sull'ultimo punto = fine inserimento linea * Tasto sinistro sul primo punto = chiudi la linea e fine inserimento Editare linee * Tasto sinistro e trascina = sposta il punto della linea * Ctrl + tasto sinistro e trascina = sposta il punto dell alinea vicino ad un punto esistente (di solito proprio sopra di esso) * Tasto sinistro su un punto di controllo e trascina = sposta il punto di controllo Aggiungere punti di linea * seleziona il punto prima del quale vuoi inserire dei punti; inserisci i punti desiderati; premi "Esc" o tasto sinstro sul punto selezionato all'inizio Rimuovere un punto di linea * seleziona il punto che vuoi rimuovere; premi "Edita linea" > "Rimuovi punto" nel Controllo Linee del pannello Dividere una linea * seleziona il punto dove vuoi dividere la linea; premi "Edita linea" > "Dividi linea" nel Controllo Linee del pannello Inserimento aree * premi "Ctrl-A" oppure "Edita" > "Inserisci" > "area" per passare alla modalità di inserimento bordo area * Tasto destro sulle linee, che contornano l'area desiderata * "Esc" per terminare l'inserimento dell'area Editare aree * seleziona l'area che vuoi editare * premi "Inserisci" nel Controllo Aree per inserire altre linee di bordo nella posizione del cursore * premi "Inserisci ID" per inserire una linea con un dato ID nella posizione del cursore * premi "Rimuovi" per rimuovere dal bordo dell'area la linea di bordo selezionata Selezionare un oggetto * Tasto sinistro = selezione l'oggetto che sta sopra * Tasto destro = seleziona l'oggetto appena sotto quello gia` selezionato (utile quando parecchi punti giaciono uno sopra l'altro) } ::msgcat::mcset ru "xtherion_help_control" { КЛÐВИÐТУРÐЫЕ СОКРÐЩЕÐИЯ И ОПЕРÐЦИИ Ð’ РЕДÐКТОРЕ КÐРТ LeftClick - щелчек левой кнопкой мыши Double LeftClick - двойной щелчек левой кнопкой мыши RightClick - щелчек правой кнопкой мыши Double RightClick - двойной щелчек правой кнопкой мыши drag - перетаÑкивание: ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½ÑƒÑŽ кнопку мыши (и/или клавиатуры) перемещайте мышь Общее * Ctrl+Z = отмена дейÑÑ‚Ð²Ð¸Ñ (undo) * Ctrl+Y = вернуть отмененное дейÑтвие (redo) * F9 = компилÑÑ†Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ проекта * Ð”Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° в ÑпиÑках: - перемеÑтитеÑÑŒ к нужному Ñлементу ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "Tab"; - выбирайте нужный Ñлемент ÑпиÑка (он подчеркнут) Ñтрелками; - подтвердите выбор нажатием "Enter" ОблаÑть риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ фоновые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ * RightClick + drag = Ñкроллинг облаÑти риÑÐ¾Ð²Ð°Ð½Ð¸Ñ * Double RightClick на изображении + drag = перемещение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð’Ñтавка Ñкрапа * Ðажмите "Ctrl-r" или "ДейÑтвие" > "Ð’Ñтавить Ñкрап" на панели "Команды в файле" * новый Ñкрап вÑтавлÑетÑÑ Ð² поÑле текущего Ð’Ñтавка точки * Ctrl+P = переключение в режим `вÑтавка точки' * LeftClick = вÑтавка точки в позицию курÑора * Ctrl+LeftClick = вÑтавка точки близко Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ точкой (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * Esc = выйти из режима `вÑтавка точки' Редактирование точки * LeftClick + drag = перемещает точку * Ctrl+LeftClick + drag = перемещение точки близко от ÑущеÑтвующей точки (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * LeftClick + drag над Ñтрелкой = изменение ориентации точки (Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть включена на панели "Точка") Ð’Ñтавка линии * Crtl+L = Ð’Ñтавка новой линии и переход в режим `вÑтавка точек линии' * LeftClick = вÑтавка точки линии в позицию курÑора (без точек ÑглаживаниÑ) * Ctrl+LeftClick = вÑтавка точки линии близко от ÑущеÑтвующей (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * LeftClick + drag = вÑтавка точки линии (Ñ Ñ‚Ð¾Ñ‡ÐºÐ°Ð¼Ð¸ ÑглаживаниÑ) * ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ctrl во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ = перемещает только данную точку ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ * LeftClick + drag на точке ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ = изменение ее позиции * RightClick на одной из предыдущих точек текущей линии в режиме `вÑтавка точек линии' = выбрать ÑущеÑтвующую точку, полезно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ‡ÐµÐº ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ * Esc или LeftClick на поÑледней точке = закончить вÑтавку точек линии * LeftClick на первой точке линии = замкнуть начало линии на конец и выйти из режима вÑтавки Редактирование линии * LeftClick + drag = перемещение точки линии * Ctrl+LeftClick + drag = перемещение точки линии близко от ÑущеÑтвующей (без Ctrl точка "притÑгиваетÑÑ" к уже ÑущеÑтвующей точке) * LeftClick на точке ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ + drag = перемещение точки ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð”Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ точки к ÑущеÑтвующей линии * выбрать точку перед которой вы хотите вÑтавить новую точку; - перейдите в режим вÑтавки точки (панель "ЛиниÑ") - вÑтавьте точки (Ñм. Ð’Ñтавка линии); - Esc или LeftClick на точке Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы начинали = выход из режима вÑтавки Удаление точки линии * выбрать точку линии которую нужно удалить; нажмите "Править линию" > "Удалить точку" на панели "ЛиниÑ" Зазделение линии * выбрать точку в которой вы хотите разделить линию; нажмите "Править линию" > "Разделить линию" на панели "ЛиниÑ" Ð’Ñтавка облаÑти * "Ctrl-a" или на панели "Команды в файле" нажмите "ДейÑтвие" > "Ð’Ñтавить облаÑть" чтобы переключитÑÑ Ð² режим "выбор границ облаÑти" * LeftClick на линии = Ð»Ð¸Ð½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑетÑÑ Ðº ÑпиÑку границ облаÑти * Esc Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы закончить выбор границ облаÑти Редактировать облаÑть * Выбрать облаÑть Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ * неажать "Ð’Ñтавка" на панели "ОблаÑть" Ð´Ð»Ñ Ð²Ñтавки граничных линий в ÑпиÑок линий поÑле выбраной линии * нажать "Ð’Ñтавить по ИД" Ð´Ð»Ñ Ð²Ñтавки линии Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ идентификатором * нажать "Удалить" Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ линии из ÑпиÑка гранци облаÑти Выбор ÑущеÑтвующего объекта * LeftClick = выбор верхнего объекта * RightClick = перебор объектов закрытых верхним объектом (например полезно, когда неÑколько точек раÑположены в одной позиции друг над другом) } ::msgcat::mcset bg "xtherion_help_control" { Клавишни комбинации и дейÑÑ‚Ð²Ð¸Ñ Ð² редактора на карти LeftClick - натиÑкане на Ð»ÐµÐ²Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ на мишката Double LeftClick - двойно натиÑкане на Ð»ÐµÐ²Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ на мишката RightClick - натиÑкане на деÑÐ½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ на мишката Double RightClick - двойно натиÑкане на деÑÐ½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ на мишката drag - премеÑтване: задръжте натиÑнат ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ на мишката (и/или клавиатурата) и движете мишката Общи * Ctrl+Z = отмÑна на дейÑтвие (undo) * Ctrl+Y = възÑтановÑване на отменено дейÑтвие (redo) * F9 = ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚ * За избор в менюто: - премеÑтете към нужниÑÑ‚ елемент за ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÑ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на бутона "Tab"; - Изберете нужниÑÑ‚ елемент от менюто (той е подчертан) ÑÑŠÑ Ñтрелките; - потвърдете избора, натиÑкайки "Enter" ОблаÑÑ‚ за риÑуване и фонови Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ * RightClick + drag = Ñкролиране на облаÑтта за риÑуване * Double RightClick в/у изображение + drag = премеÑтване на изображението Вмъкване на Ñкрап * ÐатиÑнете "Ctrl-r" или "ДейÑтвие" > "Вмъкни Ñкрап" на панела "Команди във файл" или "Редактиране" > "Вмъкни" > "Скрап" от горното меню * новиÑÑ‚ Ñкрап Ñе вмъква Ñлед Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð’Ð¼ÑŠÐºÐ²Ð°Ð½Ðµ на точка * Ctrl+P = превключване в режим "вмъкване на точка" * LeftClick = вмъкване на точка в позициÑта на курÑора * Ctrl+LeftClick = вмъкване на точка близко до друга точка (обикновено Ñе поÑвÑва точно над вече ÑъщеÑтвуващата точка) * Esc = излизане от режима "вмъкване на точка" Редактиране на точка * LeftClick + drag = премеÑтва точката * Ctrl+LeftClick + drag = премеÑтва точката близко до ÑъщеÑтвуваща точка (обикновено Ñе поÑвÑва точно над вече ÑъщеÑтвуващата точка) * LeftClick + drag на Ñтрелката на точката = изменение на ориентациÑта на точката (ориентациÑта трÑбва да бъде включена на панела "Точка") Вмъкване на Ð»Ð¸Ð½Ð¸Ñ * Crtl+L = Вмъкване на нова Ð»Ð¸Ð½Ð¸Ñ Ð¸ преход в режим "вмъкване на точка на линиÑ" * LeftClick = вмъкване на точка на Ð»Ð¸Ð½Ð¸Ñ Ð² позициÑта на курÑора (без контролна точка) * Ctrl+LeftClick = вмъкване на точка на Ð»Ð¸Ð½Ð¸Ñ Ð±Ð»Ð¸Ð·ÐºÐ¾ до ÑъщеÑтвуваща (обикновено Ñе поÑвÑва точно над вече ÑъщеÑтвуващата точка) * LeftClick + drag = вмъкване на точка на Ð»Ð¸Ð½Ð¸Ñ (Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ð½Ð° точка) * задържайки Ctrl по време на премеÑтването на точката = на определÑне на разÑтоÑнието до предишната контролна точка * LeftClick + drag в/у контролна точка = изменение на позициÑта и * RightClick на една от предишните точки на текущата Ð»Ð¸Ð½Ð¸Ñ Ð² режим "вмъкване на точка на линиÑ" = избиране на ÑъщеÑтвуваща точка, полезно за редактиране на предишна контролна точка * Esc или LeftClick на поÑледната точка = завършване на вмъкване на Ð»Ð¸Ð½Ð¸Ñ * LeftClick на първата точка на Ð»Ð¸Ð½Ð¸Ñ = Ñвързване на началото на линиÑта Ñ ÐºÑ€Ð°Ñ Ð¸ и изход от режима на вмъкване Редактиране на линии * LeftClick + drag = премеÑтване на точка на Ð»Ð¸Ð½Ð¸Ñ * Ctrl+LeftClick + drag = премеÑтване на точка на Ð»Ð¸Ð½Ð¸Ñ Ð±Ð»Ð¸Ð·ÐºÐ¾ до ÑъщеÑтвуваща * LeftClick на контролна точка + drag = премеÑтване на контролната точка ДобавÑне на точки към ÑъщеÑтвуваща Ð»Ð¸Ð½Ð¸Ñ * изберете точка пред коÑто иÑкате да вмъкнете нова точка; - преминете в режим вмъкване на точка (панел "ЛиниÑ") - вмъкнете точка (виж вмъкване на линиÑ); - Esc или LeftClick в/у точката Ñ ÐºÐ¾Ñто започнахте = изход от режим вмъкване Изтриване на точка на Ð»Ð¸Ð½Ð¸Ñ * изберете точката, коÑто е нужно да Ñе изтрие; натиÑнете "Редактирай линиÑ" > "Изтрий точка" на панела "ЛиниÑ" РазделÑне на Ð»Ð¸Ð½Ð¸Ñ * изберете точка в коÑто иÑкате да разделите линиÑта; натиÑнете "Редактирай линиÑ" > "Раздели линиÑ" на панела "ЛиниÑ" Вмъкване на облаÑÑ‚ * "Ctrl-a" или на панел "Команди във файл" натиÑнете "ДейÑтвие" > "Вмъкване на облаÑÑ‚" или "Редактиране" > "Вмъкни" > "ОблаÑÑ‚" от горното меню за да превключите в режим "избор на границите на облаÑтта" * LeftClick на Ð»Ð¸Ð½Ð¸Ñ = линиÑта Ñе Ð´Ð¾Ð±Ð°Ð²Ñ ÐºÑŠÐ¼ ÑпиÑъка Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð¸ на облаÑтта * Esc за да завършите избора на границите на облаÑтта Редактиране на облаÑÑ‚ * Изберете облаÑÑ‚ за редактиране * натиÑнете "Вмъкване" на панела "ОблаÑÑ‚" за да вмъкнете гранична линиÑ, коÑто Ñте маркирали Ñ ÐºÑƒÑ€Ñора * натиÑнете "Вмъкнете по ИД" за вмъкване на линиÑта Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ * натиÑнете "Изтрий" за да изтриетеизбраната Ð»Ð¸Ð½Ð¸Ñ Ð¾Ñ‚ ÑпиÑъка Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð¸ на облаÑтта Избор на ÑъщеÑтвуващ обект * LeftClick = избор на най-Ð³Ð¾Ñ€Ð½Ð¸Ñ Ð¾Ð±ÐµÐºÑ‚ * RightClick = избор на обекти, закрити от горен обект (например е полезно, когато нÑколко точки Ñа разположени в една Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ ÐµÐ´Ð½Ð° над друга) } therion/xtherion/app.tcl0000664000175000017500000004237112276153423014406 0ustar useruser## ## app.tcl -- ## ## Application module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- proc xth_app_move_panel {aname xx} { global xth if {$xth(app,$aname,wpsw) == 1} { set xth(app,$aname,relw) [expr [winfo width $xth(gui,main)] - $xx + $xth(app,$aname,wrtx)]; } else { set xth(app,$aname,relw) [expr $xx - $xth(app,$aname,wrtx)]; } xth_app_place $aname } proc xth_app_create {aname title} { global xth set aw "$xth(gui,main).$aname" set xth(gui,$aname) $aw set xth(app,list) [concat $xth(app,list) $aname] if {![info exists xth(app,$aname,relw)]} { set xth(app,$aname,relw) $xth(app,all,relw) } if {![info exists xth(app,$aname,wpsw)]} { set xth(app,$aname,wpsw) $xth(app,all,wpsw) } if {![info exists xth(app,$aname,wmwd)]} { set xth(app,$aname,wmwd) $xth(app,all,wmwd) } # create and configure application frames frame $aw frame $aw.af frame $aw.af.apps frame $aw.af.ctrl frame $aw.af.lrhn -borderwidth 2 -relief raised -cursor sb_h_double_arrow xth_status_bar $aname $aw.af.lrhn [mc "Drag to resize control panel."] frame $aw.sf set sbar $aw.sf.sbar label $sbar -text "" -anchor w -relief sunken -font $xth(gui,lfont) pack $sbar -side left -fill both -expand 1 bind $aw.af.lrhn "set xth(app,$aname,wwid) \[winfo width $xth(gui,main)\]; set xth(app,$aname,wrtx) \[winfo rootx $xth(gui,main)]; xth_ctrl_reshape $aname" bind $aw.af.lrhn "xth_app_move_panel $aname %X" set amn $aw.menu menu $amn -tearoff 0 set xth($aname,menu) $amn set fmn $amn.file menu $fmn -tearoff 0 $amn add cascade -label [mc "File"] -menu $fmn -font $xth(gui,lfont) -underline 0 set xth($aname,menu,file) $fmn set xth($aname,title) $title set xth($aname,wtitle) [string tolower $title] pack $aw.af -expand yes -fill both pack $aw.sf -side bottom -fill x set fr $xth(app,$aname,relw) set minfr $xth(app,$aname,wmwd) set lrhny [expr [winfo height $xth(gui,main)] - 64] if {$fr < $minfr} { set fr $minfr } elseif {$fr > ([winfo width $xth(gui,main)] - $xth(app,$aname,wmwd))} { set fr [expr {([winfo width $xth(gui,main)] - $xth(app,$aname,wmwd))}] } set xth(app,$aname,relw) $fr set fr [expr 1.0 - $fr / double([winfo width $xth(gui,main)])] if {$xth(app,$aname,wpsw) == 1} { place $aw.af.apps -relx 0 -rely 0 -relheight 1 -relwidth $fr place $aw.af.ctrl -relx $fr -rely 0 -relheight 1 -relwidth [expr 1.0 - $fr] place $aw.af.lrhn -relx $fr -y $lrhny -width 8 -height 8 -anchor center } else { place $aw.af.ctrl -relx 0 -rely 0 -relheight 1 -relwidth $fr place $aw.af.apps -relx $fr -rely 0 -relheight 1 -relwidth [expr 1.0 - $fr] place $aw.af.lrhn -relx $fr -y $lrhny -width 8 -height 8 -anchor center } xth_ctrl_create $aname } proc xth_app_clock {} { global xth set xth(gui,clock) [clock format [clock seconds] -format "%H:%M"] after 15000 xth_app_clock } proc xth_app_place {aname} { global xth set aw "$xth(gui,main).$aname" set fr $xth(app,$aname,relw) set minfr $xth(app,$aname,wmwd) if {$fr < $minfr} { set fr $minfr } elseif {$fr > ([winfo width $xth(gui,main)] - $xth(app,$aname,wmwd))} { set fr [expr {([winfo width $xth(gui,main)] - $xth(app,$aname,wmwd))}] } set xth(app,$aname,relw) $fr set fr [expr 1.0 - $fr / double([winfo width $xth(gui,main)])] set lrhny [expr [winfo height $xth(gui,main)] - 64] if {$xth(app,$aname,wpsw) == 1} { place configure $aw.af.apps -relx 0 -relwidth $fr place configure $aw.af.ctrl -relx $fr -relwidth [expr 1.0 - $fr] place configure $aw.af.lrhn -relx $fr -y $lrhny } else { place configure $aw.af.apps -relx [expr 1.0 - $fr] -relwidth $fr place configure $aw.af.ctrl -relx 0 -relwidth [expr 1.0 - $fr] place configure $aw.af.lrhn -relx [expr 1.0 - $fr] -y $lrhny } xth_ctrl_reshape $aname } proc xth_app_switch {} { global xth set aname $xth(app,active) if {$xth(app,$aname,wpsw) == 1} { set xth(app,$aname,wpsw) 0 } else { set xth(app,$aname,wpsw) 1 } xth_app_place $aname } proc xth_app_finish {} { global xth # add Window menu to each menu set m "$xth(gui,main).wmenu" menu $m -tearoff 0 set i 0 set xth(gui,menu,window) $m foreach aname $xth(app,list) { if {[llength $xth(app,list)] > 1} { set i [expr $i + 1] $m add command -label $xth($aname,title) -accelerator "F$i" \ -command "xth_app_show $aname" -font $xth(gui,lfont) bind $xth(gui,main) "xth_app_show $aname" } # add clock to aname set clockbar $xth(gui,$aname).sf.clockbar label $clockbar -textvariable xth(gui,clock) -anchor center \ -relief sunken -font $xth(gui,lfont) -width 5 pack $clockbar -side left } if {[llength $xth(app,list)] > 1} { $m add separator } $m add command -label [mc "Maximize"] -underline 1 \ -command "xth_app_maximize" -font $xth(gui,lfont) $m add command -label [mc "Normalize"] -underline 1 \ -command "xth_app_normalize" -font $xth(gui,lfont) $m add command -label [mc "Switch panels"] -underline 1 \ -command "xth_app_switch" -font $xth(gui,lfont) $m add separator $m add command -label [mc "Toggle toolbar"] -underline 1 \ -command "xth_tools_toggle" -font $xth(gui,lfont) menu $m.kbes -tearoff 0 set encnames [encoding names] set xth(encoding_system) [encoding system] foreach ecd [lsort $xth(kbencodings)] { if {[lsearch $encnames $ecd] >= 0} { $m.kbes add radiobutton -label $ecd \ -command "encoding system $ecd\nset xth(encoding_system) \[encoding system\]" -font $xth(gui,lfont) \ -variable xth(encoding_system) -value $ecd } } $m add cascade -label [mc "KBD encoding"] -menu $m.kbes if {$xth(debug)} { set dm "$xth(gui,main).dmenu" menu $dm -tearoff 0 $dm add command -label "Refresh procs" -underline 0 -command { set idir $xth(gui,initdir) source global.tcl source sbar.tcl source cp_procs.tcl source te_sdata.tcl source me_imgs.tcl source me_cmds.tcl source me_cmds2.tcl source me_ss.tcl source te_import.tcl source me_import.tcl source bac.tcl set xth(gui,initdir) $idir } -font $xth(gui,lfont) $dm add command -label "Screen dump" -underline 0 -command { after 5000 {xwd -out screendump -frame} } -font $xth(gui,lfont) $dm add separator $dm add command -label "Show command console" -underline 1 \ -command "wm deiconify $xth(gui,dbg); wm transient $xth(gui,dbg) $xth(gui,main)" -font $xth(gui,lfont) $dm add command -label "Hide command console" -underline 1 \ -command "wm withdraw $xth(gui,dbg)" -font $xth(gui,lfont) } bind $xth(gui,main) <$xth(kb_control)-Key-q> "xth_exit" bind $xth(gui,main) <$xth(kb_control)-Key-o> xth_app_control_o bind $xth(gui,main) <$xth(kb_control)-Key-r> xth_app_control_r bind $xth(gui,main) <$xth(kb_control)-Key-w> xth_app_control_w bind $xth(gui,main) <$xth(kb_control)-Key-s> xth_app_control_s bind $xth(gui,main) <$xth(kb_control)-Key-z> xth_app_control_z bind $xth(gui,main) <$xth(kb_control)-Key-y> xth_app_control_y bind $xth(gui,main) <$xth(kb_control)-Key-p> xth_app_control_p bind $xth(gui,main) <$xth(kb_control)-Key-l> xth_app_control_l bind $xth(gui,main) <$xth(kb_control)-Key-d> xth_app_control_d bind $xth(gui,main) <$xth(kb_control)-Key-a> xth_app_control_a bind $xth(gui,main) xth_app_pgup bind $xth(gui,main) xth_app_pgdn bind $xth(gui,main) xth_app_shift_pgup bind $xth(gui,main) xth_app_shift_pgdn bind $xth(gui,main) xth_app_escape bind $xth(gui,main) xth_app_make foreach aname $xth(app,list) { $xth($aname,menu) add cascade -label [mc "Window"] -menu $m -underline 0 \ -font $xth(gui,lfont) if $xth(debug) { $xth($aname,menu) add cascade -label "Debug" -menu $dm -underline 0 \ -font $xth(gui,lfont) } $xth($aname,menu,file) add separator $xth($aname,menu,file) add command -label [mc "Compile"] -underline 0 \ -command "xth_app_make" -font $xth(gui,lfont) \ -accelerator "F9" $xth($aname,menu,file) add command -label [mc "Quit"] -underline 0 \ -command "xth_exit" -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-q" $xth($aname,menu) add cascade -label [mc "Help"] -menu $xth(gui,menu,help) \ -underline 0 -font $xth(gui,lfont) } } proc xth_app_title {aname} { global xth # set the application menu set ofn "" if {[info exists xth($aname,open_file)]} { set ofn $xth($aname,open_file) } if {[string length $xth($aname,wtitle)] > 0} { set atit " $xth($aname,wtitle)" } else { set atit "" } if {[string equal $aname me] && ([string length $xth(me,curscrap)] > 0)} { set sname " - $xth(me,curscrap)" } else { set sname "" } if {[string length $ofn] > 0} { wm title $xth(gui,main) "$xth(prj,name)$atit - $xth($aname,open_file)$sname" } else { wm title $xth(gui,main) "$xth(prj,name)$atit$sname" } } proc xth_app_control_o {} { global xth # puts $xth(app,active) switch $xth(app,active) { te {xth_te_open_file 1 {} 0} me {xth_me_open_file 1 {} 1} cp { set xth(cp,updcf) 0 xth_cp_open_file {} } } } proc xth_app_pgup {} { global xth switch $xth(app,active) { te {} me { $xth(gui,main).me.af.ctrl.c yview scroll -1 pages } cp {} } } proc xth_app_pgdn {} { global xth switch $xth(app,active) { te {} me { $xth(gui,main).me.af.ctrl.c yview scroll 1 pages } cp {} } } proc xth_app_shift_pgup {} { global xth switch $xth(app,active) { te {} me { $xth(ctrl,me,cmds).cl.l yview scroll -1 pages } cp {} } } proc xth_app_shift_pgdn {} { global xth switch $xth(app,active) { te {} me { $xth(ctrl,me,cmds).cl.l yview scroll 1 pages } cp {} } } proc xth_app_control_a {} { global xth # puts $xth(app,active) switch $xth(app,active) { te {} me { xth_me_cmds_create_area {} 1 "" "" "" xth_ctrl_scroll_to me ac xth_ctrl_maximize me ac } cp {} } } proc xth_app_control_r {} { global xth # puts $xth(app,active) switch $xth(app,active) { te {} me { xth_me_cmds_create_scrap {} 1 "" "" xth_ctrl_scroll_to me scrap xth_ctrl_maximize me scrap } cp {} } } proc xth_app_control_w {} { global xth # puts $xth(app,active) switch $xth(app,active) { me {xth_me_close_file} cp {xth_cp_close_file} } } proc xth_app_control_s {} { global xth # puts $xth(app,active) switch $xth(app,active) { me {xth_me_save_file 0} } } proc xth_app_control_z {} { global xth # puts $xth(app,active) switch $xth(app,active) { me {xth_me_unredo_undo} } } proc xth_app_control_y {} { global xth # puts $xth(app,active) switch $xth(app,active) { me {xth_me_unredo_redo} } } proc xth_app_control_p {} { global xth switch $xth(app,active) { me {xth_me_cmds_set_mode 1} } } proc xth_app_control_d {} { global xth switch $xth(app,active) { me {xth_me_cmds_delete {}} } } proc xth_app_control_l {} { global xth switch $xth(app,active) { me { xth_me_cmds_create_line {} 1 "" "" "" xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } } } proc xth_app_escape {} { global xth switch $xth(app,active) { me {xth_me_cmds_set_mode 0} } } proc xth_app_show {aname} { global xth if {[string equal $xth(app,active) $aname]} { return; } if {![string equal $xth(app,active) ""]} { pack forget $xth(gui,$xth(app,active)) } set xth(app,active) $aname pack $xth(gui,$aname) -expand yes -fill both xth_app_title $aname $xth(gui,main) configure -menu $xth($aname,menu) regexp {([0-9]+)x([0-9]+)} [winfo geometry $xth(gui,main)] geom xsize ysize if {($xsize < [lindex $xth(gui,minsize) 0]) || \ ($ysize < [lindex $xth(gui,minsize) 1])} { if {($xsize < [lindex $xth(gui,minsize) 0])} { set xsize [lindex $xth(gui,minsize) 0] } if {($ysize < [lindex $xth(gui,minsize) 1])} { set ysize [lindex $xth(gui,minsize) 1] } set ogeom [winfo geometry $xth(gui,main)] regsub $geom $ogeom [format "%sx%s" $xsize $ysize] ngeom wm geometry $xth(gui,main) $ngeom } update idletasks xth_ctrl_reshape $aname # toolbar changes # disable map editor tools catch { pack forget $xth(gui,tb).edif pack forget $xth(gui,tb).self } switch $aname { me { # enable map editor tools pack $xth(gui,tb).self -side right -anchor nw pack $xth(gui,tb).edif -side right xth_me_unredo_update } default { $xth(gui,tb).undob configure -state normal $xth(gui,tb).redob configure -state normal } } } proc xth_exit {} { global xth catch { registry set $xth(win32registry) XTherionDir $xth(gui,initdir) } # save all open text editor files if {![info exists xth(te,flist)]} { set xth(te,flist) {} } foreach cfid $xth(te,flist) { if {[xth_te_before_close_file $cfid yesnocancel] == 0} { return } } if {[info exists xth(me,fopen)]} { if {$xth(me,fopen) == 1} { if {[xth_me_before_close_file yesnocancel] == 0} { return } } } if {[info exists xth(cp,fopen)]} { xth_cp_close_file } destroy $xth(gui,main) update destroy . } proc xth_app_maximize {} { global xth set swd [winfo screenwidth $xth(gui,main)] set shg [winfo screenheight $xth(gui,main)] wm geometry $xth(gui,main) [format "%dx%d+0+0" $swd $shg] update idletasks regexp {([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)} [winfo geometry $xth(gui,main)] geom xsize ysize xshft yshft wm geometry $xth(gui,main) [format "%dx%d+0+0" [expr $swd - $xshft] [expr $shg - $yshft]] update idletasks } proc xth_app_normalize {} { global xth set twd [expr int(0.8 * [winfo screenwidth $xth(gui,main)])] if {$twd < [lindex $xth(gui,minsize) 0]} { set twd [lindex $xth(gui,minsize) 0] } set thg [expr int(0.8 * [winfo screenheight $xth(gui,main)])] if {$thg < [lindex $xth(gui,minsize) 1]} { set thg [lindex $xth(gui,minsize) 1] } set tpx [expr int(0.5 * ([winfo screenwidth $xth(gui,main)] - $twd))] set tpy [expr int(0.5 * ([winfo screenheight $xth(gui,main)] - $thg))] wm geometry $xth(gui,main) [format "%dx%d+%d+%d" $twd $thg $tpx $tpy] update idletasks regexp {([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+)} [winfo geometry $xth(gui,main)] geom xsize ysize xshft yshft wm geometry $xth(gui,main) [format "%dx%d+%d+%d" [expr $twd - $xshft + $tpx] \ [expr $thg - $yshft + $tpy] $tpx $tpy] update idletasks } proc xth_app_clipboard {ev} { global xth set w [focus -lastfor $xth(gui,main)] if {[winfo ismapped $w]} { switch $ev { cut { event generate $w <> } copy { event generate $w <> } paste { event generate $w <> } undo { event generate $w <> } redo { event generate $w <> } } } } proc xth_app_check_text_undo_redo {} { global xth catch { set w [focus -lastfor $xth(gui,main)] if {[winfo ismapped $w]} { catch { $w edit separator } } } after idle {after 1000 xth_app_check_text_undo_redo} } if {$xth(gui,text_undo)} { after idle {after 1000 xth_app_check_text_undo_redo} } proc xth_app_make {} { global xth set oactive $xth(app,active) if {[string length $oactive] == 0} { set oactive cp } xth_te_save_all xth_me_save_file 0 switch $oactive { cp {} default { set xth(cp,updcf) 0 xth_app_show cp } } if {!$xth(cp,fopen)} { xth_cp_open_file {} } update idletasks if {[xth_cp_compile]} { if {[string equal $xth(gui,platform) windows]} { xth_app_show te xth_app_show me xth_app_show cp } if {![string equal $oactive cp]} { xth_app_show $oactive } } } proc xth_app_autosave_schedule {} { global xth if $xth(gui,auto_save) { set xth(gui,auto_save,id) [after 60000 xth_app_autosave] } else { catch { after cancel $xth(gui,auto_save,id) } } } proc xth_app_autosave {} { global xth switch $xth(app,active) { me {xth_me_save_file 0} te {xth_te_save_all} } xth_app_autosave_schedule } therion/xtherion/me.tcl0000664000175000017500000030431012276154431014221 0ustar useruser## ## me.tcl -- ## ## The therion map editor. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- xth_about_status [mc "loading map editor ..."] catch {package require Img} set xth(me,dflt,scrap,scale) {} proc xth_me_reset_defaults {} { global xth set xth(me,dflt,scrap,projection) {} set xth(me,dflt,scrap,options) {} set xth(me,dflt,point,type) {station} set xth(me,dflt,point,options) {} set xth(me,dflt,point,rotation) {} set xth(me,dflt,point,xsize) {} set xth(me,dflt,point,ysize) {} set xth(me,dflt,line,type) {wall} set xth(me,dflt,line,options) {} set xth(me,dflt,area,type) {water} set xth(me,dflt,area,options) {} } set xth(me,acttheme) 0 set xth(ctrl,me,acttheme) [lindex $xth(me,themes,showlist) 0] xth_me_reset_defaults proc xth_me_bind_entry_focusin {wlist} { foreach w $wlist { bind $w "$w selection range 0 end" } } proc xth_me_bind_entry_return {wlist retcmd} { foreach w $wlist { bind $w $retcmd } } proc xth_me_bind_entry_focus_return {wlist retcmd} { set llen [expr [llength $wlist] - 1] for {set i 0} {$i < $llen} {incr i} { bind [lindex $wlist $i] "focus [lindex $wlist [expr $i + 1]]" } bind [lindex $wlist end] "$retcmd\nfocus [lindex $wlist 0]" } proc xth_me_bind_typecbx_hint {pth smbl} { $pth _create_popup bind $pth.shell.listb "xth_status_bar_push me\nevent generate $pth.shell.listb <> -when tail" bind $pth.shell.listb "xth_status_bar_pop me" bind $pth.shell.listb <> [format { set vals [%s cget -values] xth_status_bar_status me [ mc "%s [lindex $vals [%s.shell.listb curselection]]"] } $pth $smbl $pth] } proc xth_me_unredo_reset {} { global xth set xth(me,undolist) {} set xth(me,redolist) {} set xth(me,unredook) 1 xth_me_unredo_update } proc xth_me_real2canx {x} { global xth return [expr 0.01 * $xth(me,zoom) * $x] } proc xth_me_real2cany {y} { global xth return [expr -0.01 * $xth(me,zoom) * $y] } proc xth_me_can2realx {x} { global xth return [expr 100.0 / $xth(me,zoom) * $x] } proc xth_me_can2realy {y} { global xth return [expr -100.0 / $xth(me,zoom) * $y] } proc xth_me_unredo_update {} { global xth if {[llength $xth(me,undolist)] > 0} { $xth(me,menu,edit) entryconfigure $xth(me,menu,edit,undo) \ -label [format [mc "Undo %s"] [lindex [lindex $xth(me,undolist) 0] 0]] -state normal $xth(gui,tb).undob configure -state normal #xth_status_bar me $xth(gui,tb).undob [format [mc "Undo %s"] [lindex [lindex $xth(me,undolist) 0] 0]] } else { $xth(me,menu,edit) entryconfigure $xth(me,menu,edit,undo) \ -label [mc "Undo"] -state disabled #xth_status_bar me $xth(gui,tb).undob [mc "Undo"] $xth(gui,tb).undob configure -state disabled } if {[llength $xth(me,redolist)] > 0} { $xth(me,menu,edit) entryconfigure $xth(me,menu,edit,redo) \ -label [format [mc "Redo %s"] [lindex [lindex $xth(me,redolist) 0] 0]] -state normal $xth(gui,tb).redob configure -state normal #xth_status_bar me $xth(gui,tb).redob [format [mc "Redo %s"] [lindex [lindex $xth(me,redolist) 0] 0]] } else { $xth(me,menu,edit) entryconfigure $xth(me,menu,edit,redo) \ -label [mc "Redo"] -state disabled #xth_status_bar me $xth(gui,tb).redob [mc "Redo"] $xth(gui,tb).redob configure -state disabled } } proc xth_me_unredo_undo {} { global xth xth_me_cmds_update {} if {[llength $xth(me,undolist)] > 0} { set acmd [lindex $xth(me,undolist) 0] set xth(me,undolist) [lreplace $xth(me,undolist) 0 0] set xth(me,redolist) [linsert $xth(me,redolist) 0 $acmd] set xth(me,unredook) 0 set xth(me,unredoshift) 1 eval [lindex $acmd 3] set xth(me,unredook) 1 if {$xth(me,unredoshift)} { $xth(me,can) xview moveto [lindex $acmd 1] $xth(me,can) yview moveto [lindex $acmd 2] xth_me_images_rescandraw } set xth(me,fsave) 1 xth_me_unredo_update } } proc xth_me_get_center {} { global xth set x [winfo x $xth(me,can)] set y [winfo y $xth(me,can)] set w [winfo width $xth(me,can)] set h [winfo height $xth(me,can)] return [list [xth_me_can2realx [$xth(me,can) canvasx [expr $x + $w / 2]]] \ [xth_me_can2realy [$xth(me,can) canvasy [expr $y + $h / 2]]]] } proc xth_me_center_to {crds} { global xth set x [xth_me_real2canx [lindex $crds 0]] set y [xth_me_real2cany [lindex $crds 1]] set sr [$xth(me,can) cget -scrollregion] set xw [$xth(me,can) xview] set yw [$xth(me,can) yview] # adjust x set wf [expr [lindex $xw 1] - [lindex $xw 0]] set hf [expr [lindex $yw 1] - [lindex $yw 0]] set tw [expr [lindex $sr 2] - [lindex $sr 0]] set th [expr [lindex $sr 3] - [lindex $sr 1]] if {double($wf) < 1.0} { set pp [expr double($x) - [lindex $sr 0] - \ 0.5 * $wf * $tw] if {$pp < 0} { set pf 0.0 } else { set pf [expr double($pp) / $tw] } $xth(me,can) xview moveto $pf } # adjust y if {double($hf) < 1.0} { set pp [expr double($y) - [lindex $sr 1] - \ 0.5 * $hf * $th] if {$pp < 0} { set pf 0.0 } else { set pf [expr double($pp) / $th] } $xth(me,can) yview moveto $pf } xth_me_images_rescandraw } proc xth_me_unredo_redo {} { global xth if {[llength $xth(me,redolist)] > 0} { set acmd [lindex $xth(me,redolist) 0] set xth(me,redolist) [lreplace $xth(me,redolist) 0 0] set xth(me,undolist) [linsert $xth(me,undolist) 0 $acmd] $xth(me,can) xview moveto [lindex $acmd 1] $xth(me,can) yview moveto [lindex $acmd 2] xth_me_images_rescandraw set xth(me,unredook) 0 eval [lindex $acmd 4] set xth(me,unredook) 1 set xth(me,fsave) 1 xth_me_unredo_update } } proc xth_me_unredo_action {txt undocmd redocmd} { global xth if {$xth(me,unredook)} { set xth(me,redolist) {} if {[string length $xth(me,unredola)] > 0} { set txt $xth(me,unredola) set xth(me,unredola) {} } set xth(me,undolist) [linsert $xth(me,undolist) 0 [list \ $txt [lindex [$xth(me,can) xview] 0] [lindex [$xth(me,can) yview] 0] $undocmd $redocmd]] set xth(me,fsave) 1 xth_me_unredo_update } } # create new file proc xth_me_create_file {} { global xth xth_status_bar_status me "" if {$xth(me,fopen) != 0} { return 0 } # create file variables set xth(me,unredook) 0 incr xth(me,fltid) set cfid $xth(me,fltid) #set xth(me,fname) [format "noname%02d.th2" $cfid] set xth(me,fname) [format "(new file)" $cfid] set xth(me,open_file) $xth(me,fname) set xth(me,fpath) $xth(gui,initdir) set xth(me,ffull) [file join $xth(gui,initdir) $xth(me,fname)] set xth(me,fnewf) 1 set xth(me,fopen) 1 set xth(me,fsave) 0 set xth(me,mtime) 0 set xth(me,nimgs) 0 set xth(me,imgln) 0 set xth(me,imgs,list) {} set xth(me,imgs,xlist) {} set xth(me,cmds,cmdln) 1 set xth(me,cmds,list) {} set xth(me,cmds,xlist) {} set xth(me,cmds,action) {} set xth(me,cmds,selid) 0 set xth(me,cmds,selpid) 0 set xth(me,cmds,selx) 0 set xth(me,cmds,mode) 0 xth_me_cmds_create 0 0 0 xth_me_cmds_update_buttons xth_me_cmds_set_mode 0 xth_me_prev_cmd {} $xth(ctrl,me,cmds).cl.l selection set 0 0 # enable all controls $xth(me,pbar) configure -state normal -text "0.0 : 0.0" $xth(ctrl,me,images).ic.insp configure -state normal $xth(ctrl,me,area).l configure -state normal $xth(ctrl,me,area).zl configure -state normal $xth(ctrl,me,area).zb configure -state normal $xth(me,menu,file) entryconfigure [mc "New"] -state disabled $xth(me,menu,file) entryconfigure [mc "Open"] -state disabled $xth(me,menu,file) entryconfigure [mc "Open (no pics)"] -state disabled $xth(me,menu,file) entryconfigure [mc "Save"] -state normal $xth(me,menu,file) entryconfigure [mc "Save as"] -state normal $xth(me,menu,file) entryconfigure [mc "Auto save"] -state normal $xth(me,menu,file) entryconfigure [mc "Close"] -state normal $xth(me,menu,file) entryconfigure [mc "Import"] -state normal $xth(me,menu) entryconfigure [mc "Edit"] -state normal $xth(ctrl,me,area).xmin configure -state normal $xth(ctrl,me,area).ymin configure -state normal $xth(ctrl,me,area).xmax configure -state normal $xth(ctrl,me,area).ymax configure -state normal $xth(ctrl,me,area).mab configure -state normal $xth(ctrl,me,area).aab configure -state normal xth_me_image_select 0 xth_me_cmds_set_action 2 # create working area grid $xth(me,canf) -column 0 -row 0 -sticky news xth_me_area_adjust 0 0 1600 1200 xth_app_title me xth_ctrl_maximize me area xth_ctrl_maximize me images set xth(me,fsave) 0 xth_me_unredo_reset xth_me_reset_defaults xth_tools_me_enable } proc xth_me_prev_cmd {cmd} { global xth $xth(ctrl,me,prev).txt configure -state normal $xth(ctrl,me,prev).txt delete 1.0 end $xth(ctrl,me,prev).txt insert 1.0 $cmd $xth(ctrl,me,prev).txt configure -state disabled $xth(ctrl,me,prev).txt see 1.0 update idletasks } proc xth_me_destroy_file {} { global xth if {$xth(me,fopen)} { xth_me_cmds_unselect {} set xth(me,unredook) 0 set xth(me,open_file) "" set xth(me,curscrap) {} set xth(me,fnewf) 0 set xth(me,fopen) 0 xth_me_image_destroy_all set xth(me,fsave) 0 set xth(me,zoom) 100 set xth(me,zoomv) 100 $xth(ctrl,me,area).zb configure -text [format "%d %%" 100] $xth(me,menu,edit) entryconfigure $xth(me,menu,edit,zoom) -label [format "Zoom %d %%" 100] # disable all controls $xth(me,pbar) configure -text "" -state disabled set xth(ctrl,me,images,posx) "" set xth(ctrl,me,images,posy) "" set xth(ctrl,me,images,newposx) 0 set xth(ctrl,me,images,newposy) 0 set xth(ctrl,me,images,vis) 0 $xth(ctrl,me,images).ic.insp configure -state disabled $xth(ctrl,me,area).l configure -state disabled -text "" set xth(ctrl,me,area,xmin) "" set xth(ctrl,me,area,ymin) "" set xth(ctrl,me,area,xmax) "" set xth(ctrl,me,area,ymax) "" $xth(ctrl,me,area).zl configure -state disabled $xth(ctrl,me,area).zb configure -state disabled $xth(me,menu,file) entryconfigure [mc "New"] -state normal $xth(me,menu,file) entryconfigure [mc "Open"] -state normal $xth(me,menu,file) entryconfigure [mc "Open (no pics)"] -state normal $xth(me,menu,file) entryconfigure [mc "Save"] -state disabled $xth(me,menu,file) entryconfigure [mc "Save as"] -state disabled $xth(me,menu,file) entryconfigure [mc "Auto save"] -state disabled $xth(me,menu,file) entryconfigure [mc "Close"] -state disabled $xth(me,menu,file) entryconfigure [mc "Import"] -state disabled $xth(me,menu) entryconfigure [mc "Edit"] -state disabled $xth(ctrl,me,area).xmin configure -state disabled $xth(ctrl,me,area).ymin configure -state disabled $xth(ctrl,me,area).xmax configure -state disabled $xth(ctrl,me,area).ymax configure -state disabled $xth(ctrl,me,area).mab configure -state disabled $xth(ctrl,me,area).aab configure -state disabled xth_me_image_select 0 focus $xth(gui,main) $xth(me,can) delete command xth_me_cmds_update_buttons xth_me_prev_cmd {} set xth(me,cmds,list) {} set xth(me,cmds,xlist) {} grid forget $xth(me,canf) xth_ctrl_minimize me cmds xth_ctrl_minimize me prev xth_ctrl_minimize me ss xth_ctrl_minimize me point xth_ctrl_minimize me line xth_ctrl_minimize me linept xth_ctrl_minimize me ac xth_ctrl_minimize me scrap xth_ctrl_minimize me text xth_ctrl_minimize me area xth_ctrl_minimize me images xth_me_unredo_reset xth_app_title me } xth_tools_me_enable } proc xth_me_before_close_file {btns} { global xth xth_me_cmds_update {} if {$xth(me,fsave)} { set wtd [MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon question -type $btns\ -message [format [mc "File %s is not saved. Save it now?"] $xth(me,ffull)] \ -font $xth(gui,lfont)] switch $wtd { 0 { if {[xth_me_save_file 0] == 0} { return 0 } } 1 {} default {return 0} } } return 1 } # xth_me_read_file -- # # return success # {success name cmds lns} proc xth_me_read_file {pth changebs} { global errorInfo xth set curenc utf-8 set nm [file tail $pth] set encspc 0 set flnn 0 set success 1 set lastln "" set lns {} set cmds {} if {[catch {set fid [open $pth r]}]} { set success 0 set nm $errorInfo return [list $success $nm {} {}] } fconfigure $fid -encoding $curenc while {![eof $fid]} { gets $fid fln if {$flnn == 0} { if {[scan [string index $fln 0] %c] == 65279} { set fln [string range $fln 1 end] } } incr flnn if {[regexp {^\s*encoding\s+(\S+)\s*$} $fln encln enc]} { if {$encspc} { set success 0 set nm [format [mc "%s \[%s\] -- multiple encoding commands in file"] $pth $flnn] break } set encspc 1 set rxp "\\s+($enc)\\s+" set validenc [regexp -nocase $rxp $xth(encodings) dum curenc] if {$validenc == 0} { set success 0 set nm [format [mc "%s \[%s\] -- unknown encoding -- %s"] $pth $flnn $enc] break } fconfigure $fid -encoding $curenc set lastln "" } elseif {[regexp {^\s*\#\#XTHERION\#\#\s+(\S.*)\s*$} $fln cmmdln cmmd]} { lappend cmds $cmmd set lastln "" if {[regexp {^\s*\#\#BEGIN\#\#\s*$} $cmmd]} { fconfigure $fid -encoding utf-8 } if {[regexp {^\s*\#\#END\#\#\s*$} $cmmd]} { fconfigure $fid -encoding $curenc } } else { if {$changebs && [regexp {(.*)\\\s*$} $lastln dumln prevln]} { set fln "$prevln$fln" if {[llength $lns] > 1} { set lns [lrange $lns 0 [expr [llength $lns] - 2]] } else { set lns {} } } lappend lns $fln set lastln $fln } } close $fid return [list $success $nm $cmds $lns] } # xth_me_write_file -- # # return list containing # {success name} proc xth_me_write_file {pth} { global errorInfo xth set curenc utf-8 set nm [file tail $pth] set success 1 if {[catch {set fid [open $pth w]}]} { set success 0 set nm $errorInfo return [list $success $nm] } fconfigure $fid -encoding utf-8 -translation {auto auto} puts $fid "encoding utf-8" # now let's put special commands puts $fid "##XTHERION## xth_me_area_adjust $xth(me,area,xmin) $xth(me,area,ymin) $xth(me,area,xmax) $xth(me,area,ymax)" puts $fid "##XTHERION## xth_me_area_zoom_to $xth(me,zoom)" # images set xxlist {} foreach imgx $xth(me,imgs,xlist) { set xxlist [linsert $xxlist 0 $imgx] } foreach imgx $xxlist { if {$xth(me,imgs,$imgx,XVIimg)} continue set vsb $xth(me,imgs,$imgx,vsb) set gamma $xth(me,imgs,$imgx,gamma) if {$vsb < 0} { set vsb [expr $xth(me,imgs,$imgx,vsb) + 2] } set root [xth_me_imgs_get_root $imgx] set xpos [expr [lindex $xth(me,imgs,$imgx,position) 0]] set ypos [expr [lindex $xth(me,imgs,$imgx,position) 1]] switch [llength $root] { 1 { set ypos [list $ypos [lindex $root 0]] } 3 { set xpos [lindex $root 1] set ypos [list [lindex $root 2] [lindex $root 0]] } 0 {} } puts $fid [format "##XTHERION## xth_me_image_insert %s %s %s 0 {}" \ "{$xpos $vsb $gamma}" \ "{$ypos}" \ [list $xth(me,imgs,$imgx,name)]] } foreach id $xth(me,cmds,xlist) { if {$xth(me,cmds,$id,ct) == 4} { puts $fid "\n" } puts $fid "\n$xth(me,cmds,$id,data)" } close $fid return [list $success $nm] } proc xth_me_open_file {dialogid fname fline} { global xth if {$xth(me,fopen) != 0} { return 0 } if {$dialogid} { set fname [tk_getOpenFile -filetypes $xth(app,me,filetypes) \ -parent $xth(gui,main) \ -initialdir $xth(gui,initdir) -defaultextension {.th2}] } if {[string length $fname] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fname] } # now let's open file fname # read the file xth_status_bar_push me xth_status_bar_status me [format [mc "Opening %s ..."] $fname] set fdata [xth_me_read_file $fname 1] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) xth_status_bar_pop me return 0 } # show the file xth_me_create_file set xth(me,unredook) 0 set xth(me,fname) [file tail $fname] set xth(me,open_file) [lindex $fdata 1] set xth(me,fpath) [file dirname $fname] set xth(me,ffull) $fname set xth(me,mtime) [file mtime $fname] foreach cmd [lindex $fdata 2] { catch {eval $cmd} } xth_me_cmds_create_all [lindex $fdata 3] xth_ctrl_maximize me cmds xth_ctrl_maximize me point xth_ctrl_maximize me line xth_ctrl_maximize me linept xth_ctrl_maximize me ac xth_ctrl_maximize me scrap xth_ctrl_maximize me text xth_ctrl_maximize me area xth_ctrl_maximize me images set xth(me,fnewf) 0 set xth(me,fopen) 1 set xth(me,fsave) 0 xth_app_title me xth_status_bar_pop me xth_me_cmds_select 0 xth_me_unredo_reset xth_me_reset_defaults return 1 } proc xth_me_save_file {dialogid} { global xth if {$xth(me,fopen) == 0} { return 0 } xth_me_cmds_update {} # let's check if we need to save if {!($xth(me,fnewf) || $xth(me,fsave) || $dialogid)} { return 1 } xth_status_bar_push me if {$xth(me,fnewf)} { set dialogid 1 } set fname $xth(me,ffull) set ofname $fname if {$dialogid} { set fname [tk_getSaveFile -filetypes $xth(app,me,filetypes) \ -parent $xth(gui,main) \ -initialfile [file tail $fname] -defaultextension {.th2} \ -initialdir [xth_getdir $fname]] } if {[string length $fname] == 0} { return 0 } else { set xth(gui,initdir) [file dirname $fname] } if {($xth(me,mtime) > 0) && [file exists $fname] && \ ([file mtime $fname] > $xth(me,mtime))} { set forcesave [MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon warning -type yesno -default 1 \ -message [format [mc "File %s was modified outside xtherion. Save it anyway?"] $fname] \ -font $xth(gui,lfont)] if {$forcesave != 0} { return 0 } } # save the file xth_status_bar_status me [format [mc "Saving %s ..."] $fname] set fdata [xth_me_write_file $fname] if {[lindex $fdata 0] == 0} { MessageDlg $xth(gui,message) -parent $xth(gui,main) \ -icon error -type ok \ -message [lindex $fdata 1] \ -font $xth(gui,lfont) xth_status_bar_pop me return 0 } set xth(me,mtime) [file mtime $fname] set xth(me,fnewf) 0 set xth(me,fsave) 0 # if SaveAs, then redisplay the file if {$dialogid} { if {[string compare $ofname $fname] != 0} { set xth(me,fname) [file tail $fname] set xth(me,ffull) $fname set xth(me,fpath) [file dirname $fname] set xth(me,open_file) $xth(me,fname) xth_app_title me } } after 250 {xth_status_bar_pop me} return 1 } proc xth_me_close_file {} { global xth if {$xth(me,fopen) == 0} { return } xth_me_cmds_update {} if {[xth_me_before_close_file yesnocancel]} { xth_me_destroy_file return 1 } else { return 0 } } proc xth_me_area_redraw {} { global xth set x1 [xth_me_real2canx $xth(me,area,xmin)] set x2 [xth_me_real2canx $xth(me,area,xmax)] set y1 [xth_me_real2cany $xth(me,area,ymin)] set y2 [xth_me_real2cany $xth(me,area,ymax)] $xth(me,can) coords $xth(me,canid,area) $x1 $y1 $x1 $y2 $x2 $y2 $x2 $y1 } proc xth_me_limitize {limits x y} { set xmin $x set xmax $x set ymin $y set ymax $y if {[llength $limits] == 4} { if {[lindex $limits 0] < $x} { set xmin [lindex $limits 0] } if {[lindex $limits 1] < $y} { set ymin [lindex $limits 1] } if {[lindex $limits 2] > $x} { set xmax [lindex $limits 2] } if {[lindex $limits 3] > $y} { set ymax [lindex $limits 3] } } return [list $xmin $ymin $xmax $ymax] } proc xth_me_image_newpos {} { global xth set limits {} # scan limits of pictures foreach imgx $xth(me,imgs,xlist) { set px [lindex $xth(me,imgs,$imgx,position) 0] set py [lindex $xth(me,imgs,$imgx,position) 1] set limits [xth_me_limitize $limits $px $py] if {$xth(me,imgs,$imgx,XVI)} { set gv $xth(me,imgs,$imgx,XVIgrid) set v1x [expr [lindex $gv 2] * ([lindex $gv 6] - 1.0)] set v1y [expr [lindex $gv 3] * ([lindex $gv 6] - 1.0)] set v2x [expr [lindex $gv 4] * ([lindex $gv 7] - 1.0)] set v2y [expr [lindex $gv 5] * ([lindex $gv 7] - 1.0)] set limits [xth_me_limitize $limits [expr $px + $v1x] [expr $py + $v1y]] set limits [xth_me_limitize $limits [expr $px + $v2x] [expr $py + $v2y]] set limits [xth_me_limitize $limits [expr $px + $v1x + $v2x] [expr $py + $v1y + $v2y]] } elseif {[string length $xth(me,imgs,$imgx,image)] > 0} { set sx [image width $xth(me,imgs,$imgx,image)] set sy [image height $xth(me,imgs,$imgx,image)] set limits [xth_me_limitize $limits [expr $px + $sx] [expr $py - $sy]] } } # scan limits of commands set cmdlim [$xth(me,can) bbox command] if {[llength $cmdlim] == 4} { set limits [xth_me_limitize $limits [xth_me_can2realx [lindex $cmdlim 0]] [xth_me_can2realy [lindex $cmdlim 1]]] set limits [xth_me_limitize $limits [xth_me_can2realx [lindex $cmdlim 2]] [xth_me_can2realy [lindex $cmdlim 3]]] } if {[llength $limits] > 0} { set xth(ctrl,me,images,newposx) [lindex $limits 0] set xth(ctrl,me,images,newposy) [expr 32.0 + [lindex $limits 3]] } else { set xth(ctrl,me,images,newposx) 0 set xth(ctrl,me,images,newposy) 0 } } proc xth_me_area_auto_adjust {} { global xth set limits {} # scan limits of pictures foreach imgx $xth(me,imgs,xlist) { set px [lindex $xth(me,imgs,$imgx,position) 0] set py [lindex $xth(me,imgs,$imgx,position) 1] set limits [xth_me_limitize $limits $px $py] if {$xth(me,imgs,$imgx,XVI)} { set gv $xth(me,imgs,$imgx,XVIgrid) set v1x [expr [lindex $gv 2] * ([lindex $gv 6] - 1.0)] set v1y [expr [lindex $gv 3] * ([lindex $gv 6] - 1.0)] set v2x [expr [lindex $gv 4] * ([lindex $gv 7] - 1.0)] set v2y [expr [lindex $gv 5] * ([lindex $gv 7] - 1.0)] set limits [xth_me_limitize $limits [expr $px + $v1x] [expr $py + $v1y]] set limits [xth_me_limitize $limits [expr $px + $v2x] [expr $py + $v2y]] set limits [xth_me_limitize $limits [expr $px + $v1x + $v2x] [expr $py + $v1y + $v2y]] } elseif {[string length $xth(me,imgs,$imgx,image)] > 0} { set sx [image width $xth(me,imgs,$imgx,image)] set sy [image height $xth(me,imgs,$imgx,image)] set limits [xth_me_limitize $limits [expr $px + $sx] [expr $py - $sy]] } } # scan limits of commands set cmdlim [$xth(me,can) bbox command] if {[llength $cmdlim] == 4} { set limits [xth_me_limitize $limits [xth_me_can2realx [lindex $cmdlim 0]] [xth_me_can2realy [lindex $cmdlim 1]]] set limits [xth_me_limitize $limits [xth_me_can2realx [lindex $cmdlim 2]] [xth_me_can2realy [lindex $cmdlim 3]]] } # adjust area limits if {[llength $limits] < 4} { set limits {128 128 128 128} } xth_me_area_adjust [expr [lindex $limits 0] - 128] [expr [lindex $limits 1] - 128] \ [expr [lindex $limits 2] + 128] [expr [lindex $limits 3] + 128] } proc xth_me_area_adjust {x1 y1 x2 y2} { global xth xth_me_unredo_action [mc "adjusting area"] \ "xth_me_area_adjust $xth(me,area,xmin) $xth(me,area,ymin) $xth(me,area,xmax) $xth(me,area,ymax)" \ "xth_me_area_adjust $x1 $y1 $x2 $y2" # let's assign zeros to non numbers if {[catch {expr $x1}]} { set x1 0.0 } if {[catch {expr $x2}]} { set x2 0.0 } if {[catch {expr $y1}]} { set y1 0.0 } if {[catch {expr $y2}]} { set y2 0.0 } if {($x2 - $x1) < 256} { set x2 [expr $x1 + 256] } if {($y2 - $y1) < 256} { set y2 [expr $y1 + 256] } set xth(me,area,xmin) $x1 set xth(me,area,xmax) $x2 set xth(me,area,ymin) $y1 set xth(me,area,ymax) $y2 set xth(ctrl,me,area,xmin) $x1 set xth(ctrl,me,area,xmax) $x2 set xth(ctrl,me,area,ymin) $y1 set xth(ctrl,me,area,ymax) $y2 xth_me_area_redraw xth_me_area_scroll_adjust catch {$xth(ctrl,me,area).l configure -text [format "%.0f:%.0f - %.0f:%.0f" $x1 $y1 $x2 $y2]} set xth(ctrl,me,images,newposx) $x1 set xth(ctrl,me,images,newposy) $y1 } proc xth_me_area_scroll {wdg fir las} { xth_scroll $wdg $fir $las xth_me_area_scroll_adjust } proc xth_me_area_scroll_adjust {} { global xth set scw [winfo width $xth(me,canf)] set sch [winfo height $xth(me,canf)] set axmax [xth_me_real2canx $xth(me,area,xmax)] set axmin [xth_me_real2canx $xth(me,area,xmin)] set aymax [xth_me_real2cany $xth(me,area,ymin)] set aymin [xth_me_real2cany $xth(me,area,ymax)] set aw [expr $axmax - $axmin] set ah [expr $aymax - $aymin] if {$aw < ($scw - 3 * $xth(gui,sbwidth))} { set sx1 [expr $axmin - ($scw - $aw)/2.0 + $xth(gui,sbwidth)] set sx2 [expr $axmax + ($scw - $aw)/2.0 - $xth(gui,sbwidth)] # eval $xth(scroll,$xth(me,canf).sh,hide) } else { set sx1 [expr $axmin - $xth(gui,sbwidth)/2.0] set sx2 [expr $axmax + $xth(gui,sbwidth)/2.0] } if {$ah < ($sch - 3 * $xth(gui,sbwidth))} { set sy1 [expr $aymin - ($sch - $ah)/2.0 + $xth(gui,sbwidth)] set sy2 [expr $aymax + ($sch - $ah)/2.0 - $xth(gui,sbwidth)] # eval $xth(scroll,$xth(me,canf).sv,hide) } else { set sy1 [expr $aymin - $xth(gui,sbwidth)/2.0] set sy2 [expr $aymax + $xth(gui,sbwidth)/2.0] } set csr [$xth(me,can) cget -scrollregion] set nsr "$sx1 $sy1 $sx2 $sy2" if {[string compare $csr $nsr] != 0} { $xth(me,can) configure -scrollregion $nsr } } proc xth_me_area_zoom_to {zv} { global xth xth_me_cmds_update {} if {($xth(me,cmds,$xth(me,cmds,selid),ct) == 3) && ($xth(me,cmds,selpid) > 0)} { set ccrds [list $xth(me,cmds,$xth(me,cmds,selid),$xth(me,cmds,selpid),x) \ $xth(me,cmds,$xth(me,cmds,selid),$xth(me,cmds,selpid),y)] } elseif {$xth(me,cmds,$xth(me,cmds,selid),ct) == 2} { set ccrds [list $xth(me,cmds,$xth(me,cmds,selid),x) \ $xth(me,cmds,$xth(me,cmds,selid),y)] } else { set ccrds [xth_me_get_center] } xth_me_unredo_action [mc "zooming"] \ "xth_me_area_zoom_to $xth(me,zoom)" \ "xth_me_area_zoom_to $zv" set xth(me,zoom) $zv set xth(me,zoomv) $zv $xth(ctrl,me,area).zb configure -text [format "%d %%" $zv] $xth(me,menu,edit) entryconfigure $xth(me,menu,edit,zoom) -label [format [mc "Zoom %d %%"] $zv] xth_me_area_redraw xth_me_area_scroll_adjust foreach imgx $xth(me,imgs,xlist) { xth_me_image_rescan $imgx xth_me_image_redraw $imgx } xth_status_bar_push me xth_status_bar_status me [mc "Zooming objects ..."] set ncmds [llength $xth(me,cmds,xlist)] xth_me_progbar_show $ncmds set ccmd 0 foreach id $xth(me,cmds,xlist) { incr ccmd xth_me_progbar_prog $ccmd switch $xth(me,cmds,$id,ct) { 4 { if {$id == $xth(me,cmds,selid)} { xth_me_cmds_move_scrap_xctrl 1 [lindex $xth(me,cmds,$id,scale) 0] \ [lindex $xth(me,cmds,$id,scale) 1] xth_me_cmds_move_scrap_xctrl 2 [lindex $xth(me,cmds,$id,scale) 2] \ [lindex $xth(me,cmds,$id,scale) 3] } } 3 { xth_me_cmds_move_line $id if {$id == $xth(me,cmds,selid)} { xth_me_cmds_show_line_xctrl $id set pid $xth(me,cmds,selpid) if {$pid != 0} { xth_me_cmds_show_linept_xctrl $id $pid } } } 2 { $xth(me,can) coords pt$id [xth_me_cmds_calc_point_coords $id] if {$id == $xth(me,cmds,selid)} { xth_me_cmds_move_point_xctrl $id xth_me_cmds_move_point_fill_xctrl $id $xth(me,cmds,$id,rotation) $xth(me,cmds,$id,xsize) $xth(me,cmds,$id,ysize) } } } } xth_me_center_to $ccrds set xth(me,unredoshift) 0 xth_me_progbar_hide xth_status_bar_pop me update idletasks } proc xth_me_image_choose {imgx} { global xth xth_me_image_select [lsearch $xth(me,imgs,xlist) $imgx] } proc xth_me_area_start_drag {tagOrId imgx x y} { global xth set hss [$xth(me,canf).sh get] set vss [$xth(me,canf).sv get] set srg [$xth(me,can) cget -scrollregion] set w [expr [lindex $srg 2] - [lindex $srg 0]] set h [expr [lindex $srg 3] - [lindex $srg 1]] set fx [expr (1 - [lindex $hss 1] + [lindex $hss 0]) * $w] set fy [expr (1 - [lindex $vss 1] + [lindex $vss 0]) * $h] if {$fx > 0} {set fx [expr (1 - [lindex $hss 1] + [lindex $hss 0]) / $fx]} if {$fy > 0} {set fy [expr (1 - [lindex $vss 1] + [lindex $vss 0]) / $fy]} set xth(me,area,drag_fx) $fx set xth(me,area,drag_fy) $fy set xth(me,area,drag_ox) [lindex $hss 0] set xth(me,area,drag_oy) [lindex $vss 0] set xth(me,area,drag_mx) $x set xth(me,area,drag_my) $y $xth(me,can) configure -cursor plus $xth(me,can) bind $tagOrId "xth_me_area_drag %x %y" $xth(me,can) bind $tagOrId "xth_me_area_end_drag $tagOrId \"$imgx\" %x %y" $xth(me,can) bind $tagOrId "xth_me_area_drag %x %y" $xth(me,can) bind $tagOrId "xth_me_area_end_drag $tagOrId \"$imgx\" %x %y" update idletasks } proc xth_me_area_drag {x y} { global xth set xdelta [expr ($xth(me,area,drag_mx) - $x) * $xth(me,area,drag_fx)] set ydelta [expr ($xth(me,area,drag_my) - $y) * $xth(me,area,drag_fy)] $xth(me,can) xview moveto [expr $xth(me,area,drag_ox) + $xdelta] $xth(me,can) yview moveto [expr $xth(me,area,drag_oy) + $ydelta] update idletasks } proc xth_me_area_end_drag {tagOrId imgx x y} { global xth xth_me_area_drag $x $y $xth(me,can) configure -cursor crosshair $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" if {[string length $imgx] > 0} { xth_me_image_choose $imgx } xth_me_images_rescandraw update idletasks } proc xth_me_area_motion {x y} { global xth $xth(me,pbar) configure -text [format "%.1f : %.1f" [xth_me_can2realx [$xth(me,can) canvasx $x]] [xth_me_can2realy [$xth(me,can) canvasy $y]]] } proc xth_me_bind_area_drag {tagOrId imgx} { global xth $xth(me,can) bind $tagOrId <1> "xth_me_cmds_click_area $tagOrId %x %y" $xth(me,can) bind $tagOrId <$xth(kb_control)-1> "xth_me_cmds_click_area $xth(me,canid,area) %x %y" $xth(me,can) bind $tagOrId "xth_me_area_motion %x %y" $xth(me,can) bind $tagOrId "xth_me_area_start_drag $tagOrId \"$imgx\" %x %y" $xth(me,can) bind $tagOrId <$xth(gui,rmb)> "xth_me_area_start_drag $tagOrId \"$imgx\" %x %y" } proc xth_me_bind_area_only_drag {tagOrId} { global xth $xth(me,can) bind $tagOrId "xth_me_area_start_drag $tagOrId {} %x %y" $xth(me,can) bind $tagOrId <$xth(gui,rmb)> "xth_me_area_start_drag $tagOrId {} %x %y" } proc xth_me_image_start_drag {tagOrId imgx x y} { global xth set xth(me,imgs,drag_mx) $x set xth(me,imgs,drag_my) $y set xth(me,imgs,drag_px) [lindex $xth(me,imgs,$imgx,position) 0] set xth(me,imgs,drag_py) [lindex $xth(me,imgs,$imgx,position) 1] $xth(me,can) configure -cursor fleur $xth(me,can) bind $tagOrId "xth_me_image_drag $imgx %x %y" $xth(me,can) bind $tagOrId "xth_me_image_end_drag $tagOrId $imgx %x %y" $xth(me,can) bind $tagOrId "xth_me_image_drag $imgx %x %y" $xth(me,can) bind $tagOrId "xth_me_image_end_drag $tagOrId $imgx %x %y" update idletasks } proc xth_me_image_drag {imgx x y} { global xth set xth(me,imgs,$imgx,position) [list \ [expr $xth(me,imgs,drag_px) - [expr double($xth(me,imgs,drag_mx) - $x) * 100.0 / $xth(me,zoom)]] \ [expr $xth(me,imgs,drag_py) + [expr double($xth(me,imgs,drag_my) - $y) * 100.0 / $xth(me,zoom)]] \ ] xth_me_image_redraw $imgx } proc xth_me_image_end_drag {tagOrId imgx x y} { global xth xth_me_image_drag $imgx $x $y $xth(me,can) configure -cursor crosshair $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" xth_me_image_choose $imgx xth_me_unredo_action [mc "dragging image"] \ "xth_me_image_move $imgx $xth(me,imgs,drag_px) $xth(me,imgs,drag_py)" \ "xth_me_image_move $imgx $xth(me,imgs,$imgx,position)" update idletasks } proc xth_me_bind_image_drag {tagOrId imgx} { global xth $xth(me,can) bind $tagOrId "xth_me_image_start_drag $tagOrId $imgx %x %y" $xth(me,can) bind $tagOrId "xth_me_image_start_drag $tagOrId $imgx %x %y" } xth_app_create me [mc "Map Editor"] xth_ctrl_add me cmds [mc "File commands"] xth_ctrl_add me ss [mc "Search & Select"] xth_ctrl_add me prev [mc "Command preview"] xth_ctrl_add me point [mc "Point control"] xth_ctrl_add me line [mc "Line control"] xth_ctrl_add me linept [mc "Line point control"] xth_ctrl_add me ac [mc "Area control"] xth_ctrl_add me scrap [mc "Scrap control"] xth_ctrl_add me text [mc "Text editor"] xth_ctrl_add me area [mc "Drawing area"] xth_ctrl_add me images [mc "Background images"] xth_ctrl_finish me # global variables initialization set xth(me,ffull) {} set xth(me,fltid) 0 set xth(me,fnewf) 0 set xth(me,fopen) 0 set xth(me,fsave) 0 set xth(me,zoom) 100 set xth(me,zoomv) 100 set xth(me,area,xmin) 0 set xth(me,area,xmax) 1600 set xth(me,area,ymin) 0 set xth(me,area,ymax) 1200 set xth(me,undolist) {} set xth(me,redolist) {} set xth(me,unredook) 0 set xth(me,unredola) {} set xth(me,curscrap) {} set xth(me,snai) 1 set xth(me,hinactives) 0 set xth(ctrl,me,images,posx) "" set xth(ctrl,me,images,posy) "" set xth(ctrl,me,images,newposx) 0 set xth(ctrl,me,images,newposy) 0 set xth(ctrl,me,images,vis) 0 set xth(ctrl,me,images,gamma) 0.0 set xth(ctrl,me,area,xmin) "" set xth(ctrl,me,area,xmax) "" set xth(ctrl,me,area,ymin) "" set xth(ctrl,me,area,ymax) "" set xth(ctrl,me,cmds,moveto) "" set xth(ctrl,me,scrap,name) "" set xth(ctrl,me,scrap,projection) "" set xth(ctrl,me,scrap,options) "" set xth(ctrl,me,scrap,px1) "" set xth(ctrl,me,scrap,py1) "" set xth(ctrl,me,scrap,px2) "" set xth(ctrl,me,scrap,py2) "" set xth(ctrl,me,scrap,rx1) "" set xth(ctrl,me,scrap,ry1) "" set xth(ctrl,me,scrap,rx2) "" set xth(ctrl,me,scrap,ry2) "" set xth(ctrl,me,scrap,units) "" set xth(ctrl,me,scrap,pp1) {} set xth(ctrl,me,scrap,pp2) {} set xth(ctrl,me,scrap,sklempty) {} set xth(ctrl,me,point,x) {} set xth(ctrl,me,point,y) {} set xth(ctrl,me,point,type) {} set xth(ctrl,me,point,name) {} set xth(ctrl,me,point,opts) {} set xth(ctrl,me,point,rot) {} set xth(ctrl,me,point,xs) {} set xth(ctrl,me,point,ys) {} set xth(ctrl,me,point,rotid) 0 set xth(ctrl,me,point,xsid) 0 set xth(ctrl,me,point,ysid) 0 set xth(ctrl,me,line,type) {} set xth(ctrl,me,line,name) {} set xth(ctrl,me,line,opts) {} set xth(ctrl,me,line,reverse) 0 set xth(ctrl,me,line,close) 0 set xth(ctrl,me,line,empty) {} set xth(ctrl,me,linept,x) {} set xth(ctrl,me,linept,y) {} set xth(ctrl,me,linept,xp) {} set xth(ctrl,me,linept,yp) {} set xth(ctrl,me,linept,xn) {} set xth(ctrl,me,linept,yn) {} set xth(ctrl,me,linept,idp) 0 set xth(ctrl,me,linept,idn) 0 set xth(ctrl,me,linept,smooth) 0 set xth(ctrl,me,linept,rot) {} set xth(ctrl,me,linept,rs) {} set xth(ctrl,me,linept,ls) {} set xth(ctrl,me,linept,rotid) 0 set xth(ctrl,me,linept,rsid) 0 set xth(ctrl,me,linept,lsid) 0 set xth(ctrl,me,ac,type) {} set xth(ctrl,me,ac,opts) {} set xth(ctrl,me,ac,empty) {} set xth(ctrl,me,ss,expr) "station" set xth(ctrl,me,ss,regexp) 0 set xth(ctrl,me,ss,cases) 0 # initialize drawing area xth_about_status [mc "loading area module ..."] $xth(gui,me).af.apps configure -bg black set canfm $xth(gui,me).af.apps.cf set xth(me,canf) $canfm grid columnconf $xth(gui,me).af.apps 0 -weight 1 grid rowconf $xth(gui,me).af.apps 0 -weight 1 frame $canfm set xth(me,can) $canfm.c scrollbar $canfm.sv -orient vertical -command "$xth(me,can) yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $canfm.sv xth_me_images_rescandraw scrollbar $canfm.sh -orient horizontal -command "$xth(me,can) xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $canfm.sh xth_me_images_rescandraw canvas $xth(me,can) -relief flat -borderwidth 0 -bg black \ -xscrollcommand "xth_me_area_scroll $canfm.sh" \ -yscrollcommand "xth_me_area_scroll $canfm.sv" \ -cursor crosshair bind $xth(me,can) xth_me_images_rescandraw set xth(me,canid,area) [$xth(me,can) create polygon 0 0 0 256 256 256 256 0 -fill LightYellow] set xth(me,canid,scrap,scp1) [$xth(me,can) create rectangle 0 0 3 3 \ -fill red -outline red -width 1 -state hidden -tags {cmd_ctrl}] set xth(me,canid,scrap,scp2) [$xth(me,can) create rectangle 0 0 3 3 \ -fill red -outline red -width 1 -state hidden -tags {cmd_ctrl}] set xth(me,canid,scrap,scpA) [$xth(me,can) create line 0 0 3 3 \ -fill red -width 5 -state hidden -arrow last -arrowshape {18 20 5} -tags {cmd_ctrl}] set xth(me,canid,scrap,scp1,pos) {0 0} set xth(me,canid,scrap,scp2,pos) {0 0} set xth(me,cmds,scrap_scale) 0 xth_me_bind_area_drag $xth(me,canid,area) {} xth_me_area_adjust 0 0 1600 1200 set xth(me,canid,point,selector) [$xth(me,can) create oval 0 0 10 10 \ -fill {} -outline red -width 1 -state hidden -tags {cmd_ctrl}] set xth(me,canid,point,fill) [$xth(me,can) create polygon 0 0 10 0 10 10 0 10 \ -fill red -stipple gray12 -state hidden -smooth on -tags {ptfill cmd_ctrl} -width 1] set xth(me,canid,point,fx) [$xth(me,can) create line 0 0 10 10 \ -width 5 -fill red -arrow last -arrowshape {9 12 4} \ -state hidden -tags {ptfill cmd_ctrl}] set xth(me,canid,point,fy) [$xth(me,can) create line 0 0 10 10 \ -width 5 -fill red -arrow last -arrowshape {9 12 4} \ -state hidden -tags {ptfill cmd_ctrl}] #set xth(me,canid,point,fxc) [$xth(me,can) create oval 0 0 10 10 \ # -outline red -fill red -width 1 -state hidden -tags {ptfill cmd_ctrl}] #set xth(me,canid,point,fyc) [$xth(me,can) create oval 0 0 10 10 \ # -outline red -fill red -width 1 -state hidden -tags {ptfill cmd_ctrl}] xth_me_bind_area_drag $xth(me,canid,point,fill) {} xth_me_bind_area_drag $xth(me,canid,point,selector) {} xth_me_bind_area_only_drag $xth(me,canid,point,fx) xth_me_bind_area_only_drag $xth(me,canid,point,fy) set xth(me,canid,linept,selector) [$xth(me,can) create oval 0 0 10 10 \ -fill {} -outline red -width 1 -state hidden -tags {linectrl cmd_ctrl}] set xth(me,canid,linept,fr) [$xth(me,can) create line 0 0 10 10 \ -width 5 -fill red -arrow last -arrowshape {9 12 4} \ -state hidden -tags {linectrl cmd_ctrl}] set xth(me,canid,linept,fl) [$xth(me,can) create line 0 0 10 10 \ -width 5 -fill red -arrow last -arrowshape {9 12 4} \ -state hidden -tags {linectrl cmd_ctrl}] set xth(me,canid,linept,ppcpl) [$xth(me,can) create line 0 0 10 10 \ -width $xth(gui,me,line,clwidth) -fill magenta -state hidden -tags "linectrl lineptppcp cmd_ctrl"] set xth(me,canid,linept,nncpl) [$xth(me,can) create line 0 0 10 10 \ -width $xth(gui,me,line,clwidth) -fill magenta -state hidden -tags "linectrl lineptnncp cmd_ctrl"] set xth(me,canid,linept,ppcp) [$xth(me,can) create rectangle 0 0 10 10 \ -width 1 -fill magenta -outline magenta -state hidden -tags "linectrl lineptppcp cmd_ctrl"] set xth(me,canid,linept,nncp) [$xth(me,can) create rectangle 0 0 10 10 \ -width 1 -fill magenta -outline magenta -state hidden -tags "linectrl lineptnncp cmd_ctrl"] set xth(me,canid,linept,pcpl) [$xth(me,can) create line 0 0 10 10 \ -width $xth(gui,me,line,clwidth) -fill $xth(gui,me,controlfill) -state hidden -tags "linectrl lineptpcp cmd_ctrl"] set xth(me,canid,linept,ncpl) [$xth(me,can) create line 0 0 10 10 \ -width $xth(gui,me,line,clwidth) -fill $xth(gui,me,controlfill) -state hidden -tags "linectrl lineptncp cmd_ctrl"] set xth(me,canid,linept,pcp) [$xth(me,can) create rectangle 0 0 10 10 \ -width 1 -fill red -outline $xth(gui,me,controlfill) -state hidden -tags "linectrl lineptpcp cmd_ctrl"] set xth(me,canid,linept,ncp) [$xth(me,can) create rectangle 0 0 10 10 \ -width 1 -fill red -outline $xth(gui,me,controlfill) -state hidden -tags "linectrl lineptncp cmd_ctrl"] set xth(me,canid,line,tick) [$xth(me,can) create line 0 0 10 10 \ -width $xth(gui,me,line,tickwidth) -fill #ffda00 -state hidden -tags "entirelinectrl cmd_ctrl"] xth_me_bind_area_only_drag $xth(me,canid,linept,fr) xth_me_bind_area_only_drag $xth(me,canid,linept,fl) xth_me_bind_area_drag $xth(me,canid,linept,pcpl) {} xth_me_bind_area_drag $xth(me,canid,linept,ncpl) {} xth_me_bind_area_drag $xth(me,canid,linept,ppcpl) {} xth_me_bind_area_drag $xth(me,canid,linept,nncpl) {} xth_me_bind_area_drag $xth(me,canid,linept,selector) {} xth_me_bind_area_drag $xth(me,canid,line,tick) {} grid columnconf $canfm 0 -weight 1 grid rowconf $canfm 0 -weight 1 grid $xth(me,can) -column 0 -row 0 -sticky news xth_scroll_showcmd $canfm.sv "grid $canfm.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $canfm.sv "grid forget $canfm.sv" xth_scroll_showcmd $canfm.sh "grid $canfm.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $canfm.sh "grid forget $canfm.sh" Label $xth(ctrl,me,area).l -text "" -anchor center -font $xth(gui,lfont) -state disabled xth_status_bar me $xth(ctrl,me,area).l [mc "Current drawing area."] Entry $xth(ctrl,me,area).xmin -font $xth(gui,lfont) -state disabled -width 4 -textvariable xth(ctrl,me,area,xmin) xth_status_bar me $xth(ctrl,me,area).xmin [mc "X min."] Entry $xth(ctrl,me,area).ymin -font $xth(gui,lfont) -state disabled -width 4 -textvariable xth(ctrl,me,area,ymin) xth_status_bar me $xth(ctrl,me,area).ymin [mc "Y min."] Entry $xth(ctrl,me,area).xmax -font $xth(gui,lfont) -state disabled -width 4 -textvariable xth(ctrl,me,area,xmax) xth_status_bar me $xth(ctrl,me,area).xmax [mc "X max."] Entry $xth(ctrl,me,area).ymax -font $xth(gui,lfont) -state disabled -width 4 -textvariable xth(ctrl,me,area,ymax) xth_status_bar me $xth(ctrl,me,area).ymax [mc "Y max."] Button $xth(ctrl,me,area).mab -text [mc "Adjust"] -anchor center -font $xth(gui,lfont) -state disabled -width 12 \ -command { xth_me_area_adjust $xth(ctrl,me,area,xmin) $xth(ctrl,me,area,ymin) \ $xth(ctrl,me,area,xmax) $xth(ctrl,me,area,ymax) } xth_status_bar me $xth(ctrl,me,area).mab [mc "Adjust drawing area to given limits."] Button $xth(ctrl,me,area).aab -text [mc "Auto adjust"] -anchor center -font $xth(gui,lfont) -state disabled -width 12 \ -command xth_me_area_auto_adjust xth_status_bar me $xth(ctrl,me,area).aab [mc "Adjust drawing area to automatically calculated limits."] Label $xth(ctrl,me,area).zl -text [mc "zoom"] -anchor e -font $xth(gui,lfont) -state disabled menubutton $xth(ctrl,me,area).zb -text "100 %" -anchor center -font $xth(gui,lfont) \ -indicatoron true -menu $xth(ctrl,me,area).zb.m -state disabled menu $xth(ctrl,me,area).zb.m -tearoff 0 -font $xth(gui,lfont) $xth(ctrl,me,area).zb.m add radiobutton -label "25 %" -variable xth(me,zoomv) -value 25 -command "xth_me_area_zoom_to 25" $xth(ctrl,me,area).zb.m add radiobutton -label "50 %" -variable xth(me,zoomv) -value 50 -command "xth_me_area_zoom_to 50" $xth(ctrl,me,area).zb.m add radiobutton -label "100 %" -variable xth(me,zoomv) -value 100 -command "xth_me_area_zoom_to 100" $xth(ctrl,me,area).zb.m add radiobutton -label "200 %" -variable xth(me,zoomv) -value 200 -command "xth_me_area_zoom_to 200" $xth(ctrl,me,area).zb.m add radiobutton -label "400 %" -variable xth(me,zoomv) -value 400 -command "xth_me_area_zoom_to 400" xth_status_bar me $xth(ctrl,me,area).zb [mc "Zoom drawing area."] xth_status_bar me $xth(ctrl,me,area).zl [mc "Zoom drawing area."] xth_me_bind_entry_focus_return "$xth(ctrl,me,area).xmin $xth(ctrl,me,area).ymin $xth(ctrl,me,area).xmax $xth(ctrl,me,area).ymax" { xth_me_area_adjust $xth(ctrl,me,area,xmin) $xth(ctrl,me,area,ymin) \ $xth(ctrl,me,area,xmax) $xth(ctrl,me,area,ymax) } xth_me_bind_entry_focusin "$xth(ctrl,me,area).xmin $xth(ctrl,me,area).ymin $xth(ctrl,me,area).xmax $xth(ctrl,me,area).ymax" grid columnconf $xth(ctrl,me,area) 0 -weight 1 grid columnconf $xth(ctrl,me,area) 1 -weight 1 grid columnconf $xth(ctrl,me,area) 2 -weight 1 grid columnconf $xth(ctrl,me,area) 3 -weight 1 grid $xth(ctrl,me,area).l -column 0 -row 0 -columnspan 4 -sticky news grid $xth(ctrl,me,area).xmin -column 0 -row 1 -sticky news -padx 1 grid $xth(ctrl,me,area).ymin -column 1 -row 1 -sticky news -padx 1 grid $xth(ctrl,me,area).xmax -column 2 -row 1 -sticky news -padx 1 grid $xth(ctrl,me,area).ymax -column 3 -row 1 -sticky news -padx 1 grid $xth(ctrl,me,area).mab -column 0 -row 2 -columnspan 2 -sticky news grid $xth(ctrl,me,area).aab -column 2 -row 2 -columnspan 2 -sticky news grid $xth(ctrl,me,area).zl -column 0 -row 3 -columnspan 2 -sticky news grid $xth(ctrl,me,area).zb -column 2 -row 3 -columnspan 2 -sticky news xth_about_status [mc "loading commands module ..."] # initialize file commands set clbox $xth(ctrl,me,cmds).cl set ccbox $xth(ctrl,me,cmds).cc frame $clbox frame $ccbox listbox $clbox.l -height 8 -selectmode single -takefocus 0 \ -yscrollcommand "xth_scroll $clbox.sv" \ -xscrollcommand "xth_scroll $clbox.sh" \ -font $xth(gui,lfont) -exportselection no \ -listvariable xth(me,cmds,list) -selectborderwidth 0 scrollbar $clbox.sv -orient vert -command "$clbox.l yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $clbox.sh -orient horiz -command "$clbox.l xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $clbox.l <> {xth_me_cmds_select {}} bind $clbox.l "focus $clbox.l" grid columnconf $clbox 0 -weight 1 grid rowconf $clbox 0 -weight 1 grid $clbox.l -column 0 -row 0 -sticky news xth_scroll_showcmd $clbox.sv "grid $clbox.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $clbox.sv "grid forget $clbox.sv" xth_scroll_showcmd $clbox.sh "grid $clbox.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $clbox.sh "grid forget $clbox.sh" xth_status_bar me $clbox [mc "Select command."] grid columnconf $xth(ctrl,me,cmds) 0 -weight 1 grid $clbox -column 0 -row 0 -sticky news grid $ccbox -column 0 -row 1 -sticky news Button $ccbox.go -text [mc "Insert scrap"] -anchor center -font $xth(gui,lfont) \ -state disabled -command xth_me_cmds_action xth_status_bar me $ccbox.go [mc "Action button."] Button $ccbox.sel -text [mc "Select"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_set_mode 0} xth_status_bar me $ccbox.sel [mc "Switch mouse mode to select objects."] menubutton $ccbox.cfg -text [mc "Action"] -anchor center -font $xth(gui,lfont) \ -indicatoron true -menu $ccbox.cfg.m -state disabled xth_status_bar me $ccbox.cfg [mc "Configure action assigned to action button."] menu $ccbox.cfg.m -tearoff 0 -font $xth(gui,lfont) $ccbox.cfg.m add command -label [mc "Insert point"] -command {xth_me_cmds_set_action 1} $ccbox.cfg.m add command -label [mc "Insert line"] -command {xth_me_cmds_set_action 0} $ccbox.cfg.m add command -label [mc "Insert area"] -command {xth_me_cmds_set_action 5} $ccbox.cfg.m add command -label [mc "Insert scrap"] -command {xth_me_cmds_set_action 2} $ccbox.cfg.m add command -label [mc "Insert text"] -command {xth_me_cmds_set_action 3} $ccbox.cfg.m add separator $ccbox.cfg.m add command -label [mc "Delete"] -command {xth_me_cmds_set_action 4} Button $ccbox.mu -text [mc "Move up"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 8 -command "xth_me_cmds_move_up {}" xth_status_bar me $ccbox.mu [mc "Move file command up in the list."] Button $ccbox.md -text [mc "Move down"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 8 -command "xth_me_cmds_move_down {}" xth_status_bar me $ccbox.md [mc "Move file command down in the list."] Button $ccbox.mt -text [mc "Move to"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 8 -command "xth_me_cmds_move_to {} {}" xth_status_bar me $ccbox.mt [mc "Move file command to given position."] ComboBox $ccbox.tt -postcommand xth_me_cmds_set_move_to_list \ -modifycmd xth_me_cmds_set_move_to \ -font $xth(gui,lfont) -height 4 -state disabled -width 8 \ -textvariable xth(ctrl,me,cmds,moveto) xth_status_bar me $ccbox.tt [mc "Select destination scrap and position in it."] grid columnconf $ccbox 0 -weight 1 grid columnconf $ccbox 1 -weight 1 grid $ccbox.go -column 0 -row 0 -columnspan 2 -sticky news grid $ccbox.cfg $ccbox.sel -row 1 -sticky news grid $ccbox.mu $ccbox.md -row 2 -sticky news grid $ccbox.mt $ccbox.tt -row 3 -sticky news # initialize text editor set txb $xth(ctrl,me,text) text $txb.txt -height 6 -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) Button $txb.upd -text [mc "Update text"] -anchor center -font $xth(gui,lfont) \ -state disabled \ -command {xth_me_cmds_update {}} xth_status_bar me $txb.upd [mc "Press this button to save code you have written."] grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news grid $txb.upd -column 0 -row 2 -columnspan 2 -sticky news xth_status_bar me $txb.txt [mc "Editor for free text in therion 2D file."] bind $txb.txt <$xth(kb_control)-Key-x> "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-c> "tk_textCopy $txb.txt" bind $txb.txt <$xth(kb_control)-Key-v> "tk_textPaste $txb.txt" if {$xth(gui,bindinsdel)} { bind $txb.txt { %W delete insert %W see insert } bind $txb.txt "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-Insert> "tk_textCopy $txb.txt" bind $txb.txt "tk_textPaste $txb.txt" # catch { # bind $txb.txt "tk_textCut $txb.txt" # bind $txb.txt <$xth(kb_control)-Key-KP_Insert> "tk_textCopy $txb.txt" # bind $txb.txt "tk_textPaste $txb.txt" # } } if {[info exists xth(gui,te)]} { # bind $txb.txt <$xth(kb_control)-Key-a> "xth_te_text_select_all %W" # bind $txb.txt <$xth(kb_control)-Key-i> "xth_te_text_auto_indent %W" bind $txb.txt $xth(te,bind,text_tab) bind $txb.txt $xth(te,bind,text_return) } else { bind $txb.txt $xth(gui,bind,text_tab) bind $txb.txt $xth(gui,bind,text_return) } # initialize search & select tool set ssbx $xth(ctrl,me,ss) Label $ssbx.xl -text [mc "expression"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $ssbx.xl [mc "Enter search expression."] Entry $ssbx.xe -font $xth(gui,lfont) -state disabled \ -textvariable xth(ctrl,me,ss,expr) -width 3 bind $ssbx.xe xth_me_ss_show xth_status_bar me $ssbx.xe [mc "Enter search expression."] checkbutton $ssbx.rx -text [mc "regular expression"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,ss,regexp) -command {} xth_status_bar me $ssbx.rx [mc "Search for regular expression."] checkbutton $ssbx.cs -text [mc "case sensitive"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,ss,cases) -command {} xth_status_bar me $ssbx.cs [mc "Case sensitive search."] Button $ssbx.sn -text [mc "Find next"] -anchor center -font $xth(gui,lfont) \ -state disabled -command xth_me_ss_next -width 10 xth_status_bar me $ssbx.sn [mc "Select next object matching expression."] Button $ssbx.sf -text [mc "Find first"] -anchor center -font $xth(gui,lfont) \ -state disabled -command xth_me_ss_first -width 10 xth_status_bar me $ssbx.sf [mc "Select first object matching expression."] Button $ssbx.sa -text [mc "Show all"] -anchor center -font $xth(gui,lfont) \ -state disabled -command xth_me_ss_show -width 9 xth_status_bar me $ssbx.sa [mc "Highlight all objects matching expression."] Button $ssbx.ca -text [mc "Clear all"] -anchor center -font $xth(gui,lfont) \ -state disabled -command xth_me_cmds_set_colors -width 9 xth_status_bar me $ssbx.ca [mc "Clear highlighted objects."] grid columnconf $ssbx 0 -weight 1 grid columnconf $ssbx 1 -weight 1 grid $ssbx.xl -column 0 -row 0 -sticky news grid $ssbx.xe -column 1 -row 0 -sticky news grid $ssbx.cs -column 0 -row 1 -sticky news -columnspan 2 grid $ssbx.rx -column 0 -row 2 -sticky news -columnspan 2 grid $ssbx.sf -column 0 -row 3 -sticky news grid $ssbx.sn -column 1 -row 3 -sticky news grid $ssbx.sa -column 0 -row 4 -sticky news grid $ssbx.ca -column 1 -row 4 -sticky news xth_about_status [mc "loading images module ..."] # initialize images frame $xth(ctrl,me,images).il set ilbox $xth(ctrl,me,images).il.ilbox set xth(me,imgs,list) {} listbox $ilbox -height 4 -selectmode single -takefocus 0 \ -yscrollcommand "xth_scroll $xth(ctrl,me,images).il.sv" \ -xscrollcommand "xth_scroll $xth(ctrl,me,images).il.sh" \ -font $xth(gui,lfont) -exportselection no \ -listvariable xth(me,imgs,list) -selectborderwidth 0 scrollbar $xth(ctrl,me,images).il.sv -orient vert -command "$ilbox yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $xth(ctrl,me,images).il.sh -orient horiz -command "$ilbox xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) frame $xth(ctrl,me,images).ic bind $ilbox <> "xth_me_image_select \[lindex \[%W curselection\] 0\]" grid columnconf $xth(ctrl,me,images).il 0 -weight 1 grid rowconf $xth(ctrl,me,images).il 0 -weight 1 grid $ilbox -column 0 -row 0 -sticky news xth_scroll_showcmd $xth(ctrl,me,images).il.sv "grid $xth(ctrl,me,images).il.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $xth(ctrl,me,images).il.sv "grid forget $xth(ctrl,me,images).il.sv" xth_scroll_showcmd $xth(ctrl,me,images).il.sh "grid $xth(ctrl,me,images).il.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $xth(ctrl,me,images).il.sh "grid forget $xth(ctrl,me,images).il.sh" xth_status_bar me $ilbox [mc "Select background image."] grid columnconf $xth(ctrl,me,images) 0 -weight 1 grid $xth(ctrl,me,images).il -column 0 -row 0 -sticky news grid $xth(ctrl,me,images).ic -column 0 -row 1 -sticky news Button $xth(ctrl,me,images).ic.insp -text [mc "Insert"] -anchor center -font $xth(gui,lfont) \ -state disabled -command { set nimgs [llength $xth(me,imgs,xlist)] xth_me_image_newpos xth_me_image_insert $xth(ctrl,me,images,newposx) $xth(ctrl,me,images,newposy) {} 0 {} set nnimgs [llength $xth(me,imgs,xlist)] if {$nnimgs > $nimgs} { xth_me_area_auto_adjust } } xth_status_bar me $xth(ctrl,me,images).ic.insp [mc "Insert new background image."] Button $xth(ctrl,me,images).ic.remp -text [mc "Remove"] -anchor center -font $xth(gui,lfont) -state disabled \ -command {xth_me_image_remove ""} xth_status_bar me $xth(ctrl,me,images).ic.remp [mc "Remove selected image."] Separator $xth(ctrl,me,images).ic.s1 -orient horizontal checkbutton $xth(ctrl,me,images).ic.viscb -text [mc "visibility"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,images,vis) -command {xth_me_image_toggle_vsb ""} xth_status_bar me $xth(ctrl,me,images).ic.viscb [mc "Switch image visibility."] Label $xth(ctrl,me,images).ic.gl -text "gamma 1.00" -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar me $xth(ctrl,me,images).ic.gl [mc "Control gamma value."] Button $xth(ctrl,me,images).ic.gr -text [mc "Reset"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 8 -command "set xth(ctrl,me,images,gamma) 0.0; xth_me_image_update_gamma" xth_status_bar me $xth(ctrl,me,images).ic.gr [mc "Reset image gamma value."] scale $xth(ctrl,me,images).ic.gs -from -1.0 -to 1.0 \ -font $xth(gui,lfont) -state disabled -showvalue 0 -resolution 0.01 \ -variable xth(ctrl,me,images,gamma) -orient horiz bind $xth(ctrl,me,images).ic.gs xth_me_image_update_gamma xth_status_bar me $xth(ctrl,me,images).ic.gs [mc "Set image gamma value."] Label $xth(ctrl,me,images).ic.posl -text [mc "position"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $xth(ctrl,me,images).ic.posl [mc "Current position of selected image."] Label $xth(ctrl,me,images).ic.posln -text "" -anchor center -font $xth(gui,lfont) -state disabled xth_status_bar me $xth(ctrl,me,images).ic.posln [mc "Current position of selected image."] Button $xth(ctrl,me,images).ic.posch -text [mc "Move to"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 8 -command "xth_me_image_move_to" xth_status_bar me $xth(ctrl,me,images).ic.posch [mc "Move image to given position."] Entry $xth(ctrl,me,images).ic.posx -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,images,posx) xth_status_bar me $xth(ctrl,me,images).ic.posx [mc "New X coordinate of image."] Entry $xth(ctrl,me,images).ic.posy -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,images,posy) xth_status_bar me $xth(ctrl,me,images).ic.posy [mc "New Y coordinate of image."] Button $xth(ctrl,me,images).ic.mvf -text [mc "Move front"] -anchor center -font $xth(gui,lfont) -state disabled -width 10 \ -command xth_me_image_move_front xth_status_bar me $xth(ctrl,me,images).ic.mvf [mc "Move image in front of all images."] Button $xth(ctrl,me,images).ic.mvb -text [mc "Move back"] -anchor center -font $xth(gui,lfont) -state disabled -width 10 \ -command xth_me_image_move_back xth_status_bar me $xth(ctrl,me,images).ic.mvb [mc "Move image behind all images."] xth_me_bind_entry_focus_return "$xth(ctrl,me,images).ic.posx $xth(ctrl,me,images).ic.posy" "xth_me_image_move_to" xth_me_bind_entry_focusin "$xth(ctrl,me,images).ic.posx $xth(ctrl,me,images).ic.posy" grid columnconf $xth(ctrl,me,images).ic 0 -weight 1 grid columnconf $xth(ctrl,me,images).ic 1 -weight 1 grid columnconf $xth(ctrl,me,images).ic 2 -weight 1 grid columnconf $xth(ctrl,me,images).ic 3 -weight 1 grid $xth(ctrl,me,images).ic.insp -column 0 -row 0 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.remp -column 2 -row 0 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.s1 -column 0 -row 1 -sticky news -columnspan 4 -pady 3 grid $xth(ctrl,me,images).ic.posl -column 0 -row 2 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.posln -column 2 -row 2 -sticky news -columnspan 2 -padx 1 grid $xth(ctrl,me,images).ic.posch -column 0 -row 3 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.posx -column 2 -row 3 -sticky ew -padx 1 grid $xth(ctrl,me,images).ic.posy -column 3 -row 3 -sticky ew -padx 1 grid $xth(ctrl,me,images).ic.mvf -column 0 -row 4 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.mvb -column 2 -row 4 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.gl -column 0 -row 5 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.gr -column 2 -row 5 -sticky news -columnspan 2 grid $xth(ctrl,me,images).ic.gs -column 0 -row 6 -sticky news -columnspan 4 grid $xth(ctrl,me,images).ic.viscb -column 0 -row 7 -sticky news -columnspan 4 # xth_status_bar me $xth(ctrl,me,images). "To set file encoding, type encoding name and press button." xth_about_status [mc "loading preview module ..."] # init command preview set txb $xth(ctrl,me,prev) text $txb.txt -height 4 -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) Button $txb.upd -text [mc "Update command"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_update {}} xth_status_bar me $txb.upd [mc "Press this button, if you have changed something and you can not see your changes here."] grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news grid $txb.upd -column 0 -row 2 -columnspan 2 -sticky news xth_status_bar me $txb.txt [mc "Command preview."] # init scrap control xth_about_status [mc "loading scrap module ..."] set sfm $xth(ctrl,me,scrap) Label $sfm.namel -text id -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $sfm.namel [mc "Scrap name."] Entry $sfm.name -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,name) xth_status_bar me $sfm.name [mc "Scrap name."] Label $sfm.projl -text [mc "projection"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $sfm.projl [mc "Scrap projection."] ComboBox $sfm.proj -values $xth(scrap_projections) -autocomplete 1 \ -font $xth(gui,lfont) -height 4 -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,projection) -command {xth_me_cmds_update {}} xth_status_bar me $sfm.proj [mc "Scrap projection."] xth_me_bind_typecbx_hint $sfm.proj projection Label $sfm.optl -text [mc "options"] -anchor e -font $xth(gui,lfont) -state disabled -width 8 xth_status_bar me $sfm.optl [mc "Other scrap options."] Entry $sfm.opt -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,options) xth_status_bar me $sfm.opt [mc "Other scrap options."] #Separator $sfm.s1 -orient horizontal Button $sfm.scl -text [mc "Scale"] -anchor center -font $xth(gui,lfont) -state disabled -command xth_me_cmds_scrap_scale_start xth_status_bar me $sfm.scl [mc "Scrap scaling - push to click picture calibration points."] Button $sfm.scpb -text [mc "Update scrap"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 4 -command {xth_me_cmds_update {}} xth_status_bar me $sfm.scpb [mc "Press this button to apply your changes to current scrap."] Label $sfm.scpp -text [mc "picture scale points"] -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar me $sfm.scpp [mc "Calibration points on the picture (X1:Y1 - X2:Y2)."] Entry $sfm.scx1p -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,px1) xth_status_bar me $sfm.scx1p [mc "X1 picture."] Entry $sfm.scy1p -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,py1) xth_status_bar me $sfm.scy1p [mc "Y1 picture."] Entry $sfm.scx2p -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,px2) xth_status_bar me $sfm.scx2p [mc "X2 picture."] Entry $sfm.scy2p -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,py2) xth_status_bar me $sfm.scy2p [mc "Y2 picture."] Label $sfm.scrp -text [mc "real scale points"] -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar me $sfm.scrp [mc "Real coordinates of calibration points (X1:Y1 - X2:Y2)."] Entry $sfm.scx1r -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,rx1) xth_status_bar me $sfm.scx1r [mc "X1 real."] Entry $sfm.scy1r -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,ry1) xth_status_bar me $sfm.scy1r [mc "Y1 real."] Entry $sfm.scx2r -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,rx2) xth_status_bar me $sfm.scx2r [mc "X2 real."] Entry $sfm.scy2r -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,ry2) xth_status_bar me $sfm.scy2r [mc "Y2 real."] Label $sfm.scul -text [mc "units"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $sfm.scul [mc "Units of real coordinates."] ComboBox $sfm.scu -values $xth(length_units) \ -font $xth(gui,lfont) -height 5 -state disabled -width 4 \ -textvariable xth(ctrl,me,scrap,units) -command {xth_me_cmds_update {}} xth_status_bar me $sfm.scu [mc "Units of real coordinates."] xth_me_bind_entry_focus_return "$sfm.scx1p $sfm.scy1p $sfm.scx2p $sfm.scy2p" {xth_me_cmds_update {}} xth_me_bind_entry_focus_return "$sfm.scx1r $sfm.scy1r $sfm.scx2r $sfm.scy2r" {xth_me_cmds_update {}} xth_me_bind_entry_return "$sfm.name $sfm.opt" {xth_me_cmds_update {}} xth_me_bind_entry_focusin "$sfm.name $sfm.opt $sfm.scx1p $sfm.scy1p $sfm.scx2p $sfm.scy2p $sfm.scx1r $sfm.scy1r $sfm.scx2r $sfm.scy2r" # scrap background sketches Label $sfm.skl -text [mc "background sketches"] -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar me $sfm.skl [mc "List of image files used as scrap background."] set plf $sfm.skll frame $plf listbox $plf.l -height 2 -selectmode single -takefocus 0 \ -yscrollcommand "xth_scroll $plf.sv" \ -xscrollcommand "xth_scroll $plf.sh" \ -font $xth(gui,lfont) -exportselection no \ -selectborderwidth 0 scrollbar $plf.sv -orient vert -command "$plf.l yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $plf.sh -orient horiz -command "$plf.l xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $plf.l "focus $plf.l" Button $sfm.skins -text [mc "Insert"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 10 -command xth_me_cmds_scrap_sketch_start xth_status_bar me $sfm.skins [mc "Press this button to insert sketch by clicking on it."] Button $sfm.skdel -text [mc "Delete"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 10 -command {xth_me_cmds_delete_scrap_sketch {} {}} xth_status_bar me $sfm.skdel [mc "Delete sketch from scrap."] grid columnconf $plf 0 -weight 1 grid rowconf $plf 0 -weight 1 grid $plf.l -column 0 -row 0 -sticky news xth_scroll_showcmd $plf.sv "grid $plf.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $plf.sv "grid forget $plf.sv" xth_scroll_showcmd $plf.sh "grid $plf.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $plf.sh "grid forget $plf.sh" xth_status_bar me $plf [mc "Select line in area."] grid columnconf $sfm 0 -weight 1 grid columnconf $sfm 1 -weight 1 grid columnconf $sfm 2 -weight 1 grid columnconf $sfm 3 -weight 1 grid $sfm.namel -row 0 -column 0 -columnspan 2 -sticky news grid $sfm.name -row 0 -column 2 -columnspan 2 -sticky news -padx 1 grid $sfm.projl -row 1 -column 0 -columnspan 2 -sticky news grid $sfm.proj -row 1 -column 2 -columnspan 2 -sticky news -padx 2 grid $sfm.optl -row 2 -column 0 -columnspan 2 -sticky news grid $sfm.opt -row 2 -column 2 -columnspan 2 -sticky news -padx 1 #grid $sfm.s1 -column 0 -row 3 -sticky news -columnspan 4 -pady 3 grid $sfm.scl -row 3 -column 0 -columnspan 2 -sticky news grid $sfm.scpb -row 3 -column 2 -columnspan 2 -sticky news grid $sfm.scpp -column 0 -row 4 -sticky news -columnspan 4 grid $sfm.scx1p $sfm.scy1p $sfm.scx2p $sfm.scy2p -row 5 -sticky news -padx 1 grid $sfm.scrp -column 0 -row 6 -sticky news -columnspan 4 grid $sfm.scx1r $sfm.scy1r $sfm.scx2r $sfm.scy2r -row 7 -sticky news -padx 1 grid $sfm.scul -row 8 -column 0 -columnspan 2 -sticky news grid $sfm.scu -row 8 -column 2 -columnspan 2 -sticky news -padx 2 grid $sfm.skl -column 0 -row 9 -sticky news -columnspan 4 grid $sfm.skll -column 0 -row 10 -sticky news -columnspan 4 grid $sfm.skins -row 11 -column 0 -columnspan 2 -sticky news grid $sfm.skdel -row 11 -column 2 -columnspan 2 -sticky news # point control xth_about_status [mc "loading point module ..."] set ptc $xth(ctrl,me,point) Label $ptc.posl -text [mc "position"] -anchor e -font $xth(gui,lfont) -state disabled -width 8 xth_status_bar me $ptc.posl [mc "Point position."] Entry $ptc.posx -font $xth(gui,lfont) -state disabled -width 4 -textvariable xth(ctrl,me,point,x) xth_status_bar me $ptc.posx [mc "Point X coordinate."] Entry $ptc.posy -font $xth(gui,lfont) -state disabled -width 4 -textvariable xth(ctrl,me,point,y) xth_status_bar me $ptc.posy [mc "Point Y coordinate."] Button $ptc.upd -text [mc "Update point"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_update {}} xth_status_bar me $ptc.upd [mc "Click this button to apply point changes."] ComboBox $ptc.theme -values $xth(me,themes,showlist) -autocomplete 1 -editable 0 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 \ -modifycmd "xth_me_set_theme \[$ptc.theme getvalue\]" -fg blue \ -textvariable xth(ctrl,me,acttheme) xth_status_bar me $ptc.theme [mc "Actual symbol theme."] ComboBox $ptc.themetype -values $xth(me,themes,all-symbols,point,showlist) -autocomplete 1 -editable 0 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 -fg blue \ -textvariable xth(ctrl,me,point,themetype) \ -modifycmd xth_me_point_themetype_modified xth_status_bar me $ptc.themetype [mc "Point type."] Label $ptc.typl -text [mc "type"] -anchor e -font $xth(gui,lfont) -state disabled -width 8 xth_status_bar me $ptc.typl [mc "Point type."] ComboBox $ptc.typ -values $xth(point_types) -autocomplete 1 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 \ -textvariable xth(ctrl,me,point,type) -command {xth_me_cmds_update {}} \ -modifycmd {xth_me_cmds_update {}} xth_status_bar me $ptc.typ [mc "Point type."] xth_me_bind_typecbx_hint $ptc.typ point Label $ptc.namel -text [mc "id"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $ptc.namel [mc "Point identifier."] Entry $ptc.name -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,point,name) xth_status_bar me $ptc.name [mc "Point identifier."] Label $ptc.optl -text [mc "options"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $ptc.optl [mc "Other point options."] Entry $ptc.opt -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,point,opts) xth_status_bar me $ptc.opt [mc "I.e, if type is label, write here: -text \042this will be displayed (P100)\042"] Separator $ptc.s1 -orient horizontal checkbutton $ptc.rotc -text [mc "orientation"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,point,rotid) -command xth_me_cmds_point_change_state Entry $ptc.rot -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,point,rot) xth_status_bar me $ptc.rot [mc "Enter symbol orientation angle."] xth_status_bar me $ptc.rotc [mc "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard."] checkbutton $ptc.xszc -text [mc "x-size"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,point,xsid) -command xth_me_cmds_point_change_state xth_status_bar me $ptc.xszc [mc "Set point size in main direction."] Entry $ptc.xsz -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,point,xs) xth_status_bar me $ptc.xsz [mc "Enter point size in main direction."] checkbutton $ptc.yszc -text [mc "y-size"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,point,ysid) -command xth_me_cmds_point_change_state xth_status_bar me $ptc.yszc [mc "Set point size in side direction."] Entry $ptc.ysz -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,point,ys) xth_status_bar me $ptc.ysz [mc "Enter point size in side direction."] xth_me_bind_entry_focus_return "$ptc.posx $ptc.posy" {xth_me_cmds_update {}} xth_me_bind_entry_return "$ptc.name $ptc.opt $ptc.rot $ptc.xsz $ptc.ysz" {xth_me_cmds_update {}} xth_me_bind_entry_focusin "$ptc.posx $ptc.posy $ptc.name $ptc.opt $ptc.rot $ptc.xsz $ptc.ysz" grid columnconf $ptc 0 -weight 1 grid columnconf $ptc 1 -weight 1 grid columnconf $ptc 2 -weight 1 grid columnconf $ptc 3 -weight 1 set crow 0 grid $ptc.theme -row $crow -column 0 -columnspan 2 -sticky news -padx 2 -pady 2 grid $ptc.themetype -row $crow -column 2 -columnspan 2 -sticky news -padx 2 -pady 2 incr crow grid $ptc.typl -row $crow -column 0 -columnspan 2 -sticky news grid $ptc.typ -row $crow -column 2 -columnspan 2 -sticky news -padx 2 incr crow grid $ptc.s1 -row $crow -column 0 -columnspan 4 -sticky news -pady 2 incr crow grid $ptc.posl -row $crow -column 0 -columnspan 2 -sticky news grid $ptc.posx -row $crow -column 2 -sticky news -padx 2 -pady 1 grid $ptc.posy -row $crow -column 3 -sticky news -padx 2 -pady 1 incr crow grid $ptc.namel -row $crow -column 0 -columnspan 2 -sticky news grid $ptc.name -row $crow -column 2 -columnspan 2 -sticky news -padx 2 -pady 1 incr crow grid $ptc.optl -row $crow -column 0 -columnspan 2 -sticky news grid $ptc.opt -row $crow -column 2 -columnspan 2 -sticky news -padx 2 -pady 1 incr crow grid $ptc.rotc -row $crow -column 0 -columnspan 2 -sticky news grid $ptc.rot -row $crow -column 2 -columnspan 2 -sticky news -padx 2 -pady 1 incr crow ## DISABLED #grid $ptc.xszc -row 6 -column 0 -columnspan 2 -sticky news #grid $ptc.xsz -row 6 -column 2 -columnspan 2 -sticky news -padx 1 #grid $ptc.yszc -row 7 -column 0 -columnspan 2 -sticky news #grid $ptc.ysz -row 7 -column 2 -columnspan 2 -sticky news -padx 1 grid $ptc.upd -row $crow -column 0 -columnspan 4 -sticky news incr crow # line control xth_about_status [mc "loading line module ..."] set lnc $xth(ctrl,me,line) ComboBox $lnc.theme -values $xth(me,themes,showlist) -autocomplete 1 -editable 0 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 \ -modifycmd "xth_me_set_theme \[$ptc.theme getvalue\]" -fg blue \ -textvariable xth(ctrl,me,acttheme) xth_status_bar me $lnc.theme [mc "Actual symbol theme."] ComboBox $lnc.themetype -values $xth(me,themes,all-symbols,line,showlist) -autocomplete 1 -editable 0 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 -fg blue \ -textvariable xth(ctrl,me,line,themetype) \ -modifycmd xth_me_line_themetype_modified xth_status_bar me $lnc.themetype [mc "Line type."] Label $lnc.typl -text [mc "type"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $lnc.typl [mc "Line type."] ComboBox $lnc.typ -values $xth(line_types) -autocomplete 1 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 \ -textvariable xth(ctrl,me,line,type) -modifycmd {xth_me_cmds_update {}} \ -command {xth_me_cmds_update {}} xth_status_bar me $lnc.typ [mc "Line type."] xth_me_bind_typecbx_hint $lnc.typ line Separator $lnc.s1 Label $lnc.namel -text [mc "id"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $lnc.namel [mc "Line identifier."] Entry $lnc.name -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,line,name) xth_status_bar me $lnc.name [mc "Line identifier."] Label $lnc.optl -text [mc "options"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $lnc.optl [mc "Other line options."] Entry $lnc.opt -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,line,opts) xth_status_bar me $lnc.opt [mc "Other line options."] checkbutton $lnc.rev -text [mc "reverse"] -anchor w -font $xth(gui,lfont) \ -state disabled \ -variable xth(ctrl,me,line,reverse) \ -command xth_me_cmds_toggle_line_reverse xth_status_bar me $lnc.rev [mc "Reverse line."] checkbutton $lnc.cls -text [mc "close"] -anchor w -font $xth(gui,lfont) \ -state disabled \ -variable xth(ctrl,me,line,close) \ -command xth_me_cmds_toggle_line_close xth_status_bar me $lnc.cls [mc "Close line."] set plf $lnc.pl frame $plf listbox $plf.l -height 4 -selectmode single -takefocus 0 \ -yscrollcommand "xth_scroll $plf.sv" \ -xscrollcommand "xth_scroll $plf.sh" \ -font $xth(gui,lfont) -exportselection no \ -selectborderwidth 0 scrollbar $plf.sv -orient vert -command "$plf.l yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $plf.sh -orient horiz -command "$plf.l xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $plf.l <> { if {$xth(me,fopen)} { xth_me_cmds_select_linept $xth(me,cmds,selid) \ [lindex $xth(me,cmds,$xth(me,cmds,selid),xplist) \ [lindex [%W curselection] 0]] if {$xth(me,cmds,selpid) > 0} { xth_me_center_to [list \ $xth(me,cmds,$xth(me,cmds,selid),$xth(me,cmds,selpid),x) \ $xth(me,cmds,$xth(me,cmds,selid),$xth(me,cmds,selpid),y)] } } } bind $plf.l "focus $plf.l" menubutton $lnc.lpa -text [mc "Edit line"] -anchor w -font $xth(gui,lfont) \ -indicatoron true -menu $lnc.lpa.m -state disabled -width 10 xth_status_bar me $lnc.lpa [mc "Insert/delete line point. Split line."] Button $lnc.upd -text [mc "Update"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_update {}} -width 10 Button $lnc.trace -text [mc "Continue tracing"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_line_trace} -width 10 Button $lnc.vector -text [mc "Convert to curve"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_line_poly2bezier} -width 10 xth_status_bar me $lnc.upd [mc "Click this button to apply line changes."] menu $lnc.lpa.m -tearoff 0 -font $xth(gui,lfont) $lnc.lpa.m add command -label [mc "Insert point"] -command {xth_me_cmds_start_linept_insert} -state disabled $lnc.lpa.m add command -label [mc "Delete point"] -command {xth_me_cmds_delete_linept {} {}} -state disabled $lnc.lpa.m add command -label [mc "Split line"] -command {xth_me_cmds_line_split} -state disabled $lnc.lpa.m add command -label [mc "Trace line"] -command {xth_me_cmds_line_trace_start} $lnc.lpa.m add command -label [mc "Convert to curve"] -command {xth_me_cmds_line_poly2bezier} #Button $lnc.insp -text "Insert" -anchor center -font $xth(gui,lfont) \ # -state disabled -width 10 -command {xth_me_cmds_start_linept_insert} #Button $lnc.delp -text "Delete" -anchor center -font $xth(gui,lfont) \ # -state disabled -width 10 -command {xth_me_cmds_delete_linept {} {}} grid columnconf $plf 0 -weight 1 grid rowconf $plf 0 -weight 1 grid $plf.l -column 0 -row 0 -sticky news xth_scroll_showcmd $plf.sv "grid $plf.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $plf.sv "grid forget $plf.sv" xth_scroll_showcmd $plf.sh "grid $plf.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $plf.sh "grid forget $plf.sh" xth_status_bar me $plf [mc "Select line point."] grid columnconf $lnc 0 -weight 1 grid columnconf $lnc 1 -weight 1 set crow 0 grid $lnc.theme -row $crow -column 0 -sticky news -padx 2 -pady 2 grid $lnc.themetype -row $crow -column 1 -sticky news -padx 2 -pady 2 incr crow grid $lnc.typl -row $crow -column 0 -sticky news grid $lnc.typ -row $crow -column 1 -sticky news -padx 2 incr crow grid $lnc.s1 -row $crow -column 0 -columnspan 2 -sticky news -padx 2 -pady 2 incr crow grid $lnc.namel -row $crow -column 0 -sticky news grid $lnc.name -row $crow -column 1 -sticky news -padx 2 -pady 1 incr crow grid $lnc.optl -row $crow -column 0 -sticky news grid $lnc.opt -row $crow -column 1 -sticky news -padx 2 -pady 1 incr crow grid $lnc.rev -row $crow -column 0 -sticky news grid $lnc.cls -row $crow -column 1 -sticky news incr crow grid $plf -row $crow -column 0 -columnspan 2 -sticky news incr crow set xth(ctrl,me,line,tracerow) $crow incr crow grid $lnc.lpa -row $crow -column 0 -sticky news grid $lnc.upd -row $crow -column 1 -sticky news incr crow #grid $lnc.insp -row 5 -column 0 -sticky news #grid $lnc.delp -row 5 -column 1 -sticky news xth_me_bind_entry_return "$lnc.name $lnc.opt" {xth_me_cmds_update {}} xth_me_bind_entry_focusin "$lnc.name $lnc.opt" # line point control xth_about_status [mc "loading line point module ..."] set lpc $xth(ctrl,me,linept) Label $lpc.posl -text [mc "position"] -anchor e -font $xth(gui,lfont) -state disabled -width 0 xth_status_bar me $lpc.posl [mc "Point position."] Entry $lpc.posx -font $xth(gui,lfont) -state disabled \ -textvariable xth(ctrl,me,linept,x) -width 0 xth_status_bar me $lpc.posx [mc "Point X coordinate."] Entry $lpc.posy -font $xth(gui,lfont) -state disabled \ -textvariable xth(ctrl,me,linept,y) -width 0 xth_status_bar me $lpc.posy [mc "Point Y coordinate."] Entry $lpc.xp -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,linept,xp) xth_status_bar me $lpc.xp [mc "Previous control point X coordinate."] Entry $lpc.yp -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,linept,yp) xth_status_bar me $lpc.yp [mc "Previous control point Y coordinate."] Entry $lpc.xn -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,linept,xn) xth_status_bar me $lpc.xn [mc "Next control point X coordinate."] Entry $lpc.yn -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,linept,yn) xth_status_bar me $lpc.yn [mc "Next control point Y coordinate."] checkbutton $lpc.cbp -text "<<" -anchor w -font $xth(gui,lfont) \ -state disabled -width 0 \ -variable xth(ctrl,me,linept,idp) \ -command xth_me_cmds_toggle_linept xth_status_bar me $lpc.cbp [mc "Checkbox whether to use previous control point."] checkbutton $lpc.cbs -text [mc "smooth"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,linept,smooth) -width 0\ -command xth_me_cmds_toggle_linept xth_status_bar me $lpc.cbs [mc "Set line to be smooth in given point."] checkbutton $lpc.cbn -text ">>" -anchor w -font $xth(gui,lfont) \ -state disabled -width 0 \ -variable xth(ctrl,me,linept,idn) \ -command xth_me_cmds_toggle_linept xth_status_bar me $lpc.cbn [mc "Checkbox whether to use next control point."] checkbutton $lpc.rotc -text [mc "orientation"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,linept,rotid) -width 0 \ -command xth_me_cmds_toggle_linept xth_status_bar me $lpc.rotc [mc "Set line point orientation."] Entry $lpc.rot -font $xth(gui,lfont) -state disabled -width 0 \ -textvariable xth(ctrl,me,linept,rot) xth_status_bar me $lpc.rot [mc "Enter line point orientation."] checkbutton $lpc.rszc -text [mc "r-size"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,linept,rsid) -width 0 \ -command xth_me_cmds_toggle_linept xth_status_bar me $lpc.rszc [mc "Set line size in right direction."] Entry $lpc.rsz -font $xth(gui,lfont) -state disabled -width 0 \ -textvariable xth(ctrl,me,linept,rs) xth_status_bar me $lpc.rsz [mc "Enter line size in right direction."] checkbutton $lpc.lszc -text [mc "l-size"] -anchor w -font $xth(gui,lfont) -state disabled \ -variable xth(ctrl,me,linept,lsid) -width 0 \ -command xth_me_cmds_toggle_linept xth_status_bar me $lpc.lszc [mc "Set line size in left direction."] Entry $lpc.lsz -font $xth(gui,lfont) -state disabled -width 0 \ -textvariable xth(ctrl,me,linept,ls) xth_status_bar me $lpc.lsz [mc "Enter line size in left direction."] Label $lpc.optl -text [mc "options"] -anchor sw -font $xth(gui,lfont) -state disabled \ -width 0 xth_status_bar me $lpc.optl [mc "Line point options editor."] Button $lpc.upd -text [mc "Update"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_update {}} -width 0 xth_status_bar me $lpc.upd [mc "Click this button to apply line point changes."] set txb $lpc.oe frame $txb text $txb.txt -height 2 -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -yscrollcommand "$txb.sv set" \ -selectborderwidth 0 \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news xth_status_bar me $txb [mc "Editor for line point options."] bind $txb.txt <$xth(kb_control)-Key-x> "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-c> "tk_textCopy $txb.txt" bind $txb.txt <$xth(kb_control)-Key-v> "tk_textPaste $txb.txt" if {$xth(gui,bindinsdel)} { bind $txb.txt { %W delete insert %W see insert } bind $txb.txt "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-Insert> "tk_textCopy $txb.txt" bind $txb.txt "tk_textPaste $txb.txt" # catch { # bind $txb.txt "tk_textCut $txb.txt" # bind $txb.txt <$xth(kb_control)-Key-KP_Insert> "tk_textCopy $txb.txt" # bind $txb.txt "tk_textPaste $txb.txt" # } } if {[info exists xth(gui,te)]} { bind $txb.txt $xth(te,bind,text_tab) bind $txb.txt $xth(te,bind,text_return) } else { bind $txb.txt $xth(gui,bind,text_tab) bind $txb.txt $xth(gui,bind,text_return) } grid columnconf $lpc 0 -weight 1 grid columnconf $lpc 1 -weight 1 grid columnconf $lpc 2 -weight 1 grid columnconf $lpc 3 -weight 1 grid $lpc.posl -row 0 -column 0 -columnspan 2 -sticky news grid $lpc.posx -row 0 -column 2 -sticky news grid $lpc.posy -row 0 -column 3 -sticky news xth_me_bind_entry_focus_return "$lpc.posx $lpc.posy" {xth_me_cmds_update {}} grid $lpc.xp -row 1 -column 0 -sticky news grid $lpc.yp -row 1 -column 1 -sticky news grid $lpc.xn -row 1 -column 2 -sticky news grid $lpc.yn -row 1 -column 3 -sticky news xth_me_bind_entry_focus_return "$lpc.xp $lpc.yp" {xth_me_cmds_update {}} xth_me_bind_entry_focus_return "$lpc.xn $lpc.yn" {xth_me_cmds_update {}} xth_me_bind_entry_focusin "$lpc.posx $lpc.posy $lpc.xp $lpc.yp $lpc.xn $lpc.yn" grid $lpc.cbp -row 2 -column 0 -sticky news grid $lpc.cbs -row 2 -column 1 -columnspan 2 -sticky news grid $lpc.cbn -row 2 -column 3 -sticky news grid $lpc.rotc -row 3 -column 0 -columnspan 2 -sticky news grid $lpc.rot -row 3 -column 2 -columnspan 2 -sticky news grid $lpc.lszc -row 4 -column 0 -columnspan 2 -sticky news grid $lpc.lsz -row 4 -column 2 -columnspan 2 -sticky news ## DISABLED #grid $lpc.rszc -row 5 -column 0 -columnspan 2 -sticky news #grid $lpc.rsz -row 5 -column 2 -columnspan 2 -sticky news grid $lpc.optl -row 6 -column 0 -columnspan 2 -sticky news grid $lpc.upd -row 6 -column 2 -columnspan 2 -sticky news grid $txb -row 7 -column 0 -columnspan 4 -sticky news xth_me_bind_entry_focusin "$lpc.rot $lpc.lsz $lpc.rsz" xth_me_bind_entry_return "$lpc.rot $lpc.lsz $lpc.rsz" {xth_me_cmds_update {}} # area control xth_about_status [mc "loading area module ..."] set lnc $xth(ctrl,me,ac) ComboBox $lnc.theme -values $xth(me,themes,showlist) -autocomplete 1 -editable 0 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 \ -modifycmd "xth_me_set_theme \[$ptc.theme getvalue\]" -fg blue \ -textvariable xth(ctrl,me,acttheme) xth_status_bar me $lnc.theme [mc "Actual symbol theme."] ComboBox $lnc.themetype -values $xth(me,themes,all-symbols,area,showlist) -autocomplete 1 -editable 0 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 -fg blue \ -textvariable xth(ctrl,me,ac,themetype) \ -modifycmd xth_me_area_themetype_modified xth_status_bar me $lnc.themetype [mc "Area type."] Separator $lnc.s1 Label $lnc.typl -text [mc "type"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $lnc.typl [mc "Area type."] ComboBox $lnc.typ -values $xth(area_types) -autocomplete 1 \ -font $xth(gui,lfont) -height $xth(gui,me,typelistwidth) -state disabled -width 4 \ -textvariable xth(ctrl,me,ac,type) -modifycmd {xth_me_cmds_update {}} \ -command {xth_me_cmds_update {}} xth_status_bar me $lnc.typ [mc "Area type."] xth_me_bind_typecbx_hint $lnc.typ area Label $lnc.optl -text [mc "options"] -anchor e -font $xth(gui,lfont) -state disabled xth_status_bar me $lnc.optl [mc "Other area options."] Entry $lnc.opt -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,ac,opts) xth_status_bar me $lnc.opt [mc "Other area options."] set plf $lnc.ll frame $plf listbox $plf.l -height 4 -selectmode single -takefocus 0 \ -yscrollcommand "xth_scroll $plf.sv" \ -xscrollcommand "xth_scroll $plf.sh" \ -font $xth(gui,lfont) -exportselection no \ -selectborderwidth 0 scrollbar $plf.sv -orient vert -command "$plf.l yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $plf.sh -orient horiz -command "$plf.l xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) bind $plf.l <> {xth_me_cmds_show_current_area} bind $plf.l "focus $plf.l" Button $lnc.ins -text [mc "Select lines"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 10 -command {xth_me_cmds_start_area_insert 1} xth_status_bar me $lnc.ins [mc "Switch to insert line into area mode."] Button $lnc.del -text [mc "Delete"] -anchor center -font $xth(gui,lfont) \ -state disabled -width 10 -command {xth_me_cmds_delete_area_line {} {}} xth_status_bar me $lnc.del [mc "Delete ID from area."] Button $lnc.insid -text [mc "Insert ID"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_insert_area_line $xth(ctrl,me,ac,insid) {} {}} -width 10 xth_status_bar me $lnc.insid [mc "Insert given id."] Entry $lnc.inside -font $xth(gui,lfont) -state disabled -width 4 \ -textvariable xth(ctrl,me,ac,insid) xth_status_bar me $lnc.inside [mc "ID to insert."] Button $lnc.upd -text [mc "Update"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_update {}} -width 10 xth_status_bar me $lnc.upd [mc "Click this button to apply changes you made to area."] Button $lnc.shw -text [mc "Show"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_me_cmds_show_current_area} -width 10 xth_status_bar me $lnc.shw [mc "Show area border lines."] grid columnconf $plf 0 -weight 1 grid rowconf $plf 0 -weight 1 grid $plf.l -column 0 -row 0 -sticky news xth_scroll_showcmd $plf.sv "grid $plf.sv -column 1 -row 0 -sticky news" xth_scroll_hidecmd $plf.sv "grid forget $plf.sv" xth_scroll_showcmd $plf.sh "grid $plf.sh -column 0 -row 1 -sticky news" xth_scroll_hidecmd $plf.sh "grid forget $plf.sh" xth_status_bar me $plf [mc "Select line in area."] grid columnconf $lnc 0 -weight 1 grid columnconf $lnc 1 -weight 1 set crow 0 grid $lnc.theme -row $crow -column 0 -sticky news -padx 2 -pady 2 grid $lnc.themetype -row $crow -column 1 -sticky news -padx 2 -pady 2 incr crow grid $lnc.typl -row $crow -column 0 -sticky news grid $lnc.typ -row $crow -column 1 -sticky news -padx 2 -pady 1 incr crow grid $lnc.s1 -row $crow -column 0 -columnspan 2 -sticky news -padx 2 -pady 2 incr crow grid $lnc.optl -row $crow -column 0 -sticky news grid $lnc.opt -row $crow -column 1 -sticky news -padx 2 -pady 1 incr crow grid $lnc.shw -row $crow -column 0 -sticky news grid $lnc.upd -row $crow -column 1 -sticky news incr crow grid $plf -row $crow -column 0 -columnspan 2 -sticky news incr crow grid $lnc.ins -row $crow -column 0 -sticky news grid $lnc.del -row $crow -column 1 -sticky news incr crow grid $lnc.insid -row $crow -column 0 -sticky news grid $lnc.inside -row $crow -column 1 -sticky news incr crow xth_me_bind_entry_return "$lnc.opt" {xth_me_cmds_update {}} xth_me_bind_entry_focusin "$lnc.opt" # main menu xth_about_status [mc "loading main menu ..."] $xth(me,menu,file) add command -label [mc "New"] -command xth_me_create_file \ -font $xth(gui,lfont) -underline 0 -state normal $xth(me,menu,file) add command -label [mc "Open"] -underline 0 \ -accelerator "$xth(gui,controlk)-o" -state normal \ -font $xth(gui,lfont) -command { set xth(gui,openxp) 0 xth_me_open_file 1 {} 1 } $xth(me,menu,file) add command -label [mc "Open (no pics)"] -underline 10 \ -state normal -font $xth(gui,lfont) -command { set xth(gui,openxp) 1 xth_me_open_file 1 {} 1 set xth(gui,openxp) 0 } $xth(me,menu,file) add command -label [mc "Save"] -underline 0 \ -accelerator "$xth(gui,controlk)-s" -state disabled \ -font $xth(gui,lfont) -command {xth_me_save_file 0} $xth(me,menu,file) add command -label [mc "Save as"] -underline 5 \ -font $xth(gui,lfont) -command {xth_me_save_file 1} -state disabled $xth(me,menu,file) add checkbutton -label [mc "Auto save"] -underline 1 \ -variable xth(gui,auto_save) -font $xth(gui,lfont) \ -state disabled -command xth_app_autosave_schedule $xth(me,menu,file) add command -label [mc "Close"] -underline 0 \ -accelerator "$xth(gui,controlk)-w" -state disabled \ -font $xth(gui,lfont) \ -command xth_me_close_file $xth(me,menu,file) add separator $xth(me,menu,file) add command -label [mc "Import"] -underline 0 \ -state disabled -font $xth(gui,lfont) -command {xth_me_import_file {} {}} set xth(me,menu,edit) $xth(me,menu).edit menu $xth(me,menu,edit) -tearoff 0 menu $xth(me,menu,edit).ins -tearoff 0 bind $xth(me,menu,edit) {xth_me_cmds_update {}} $xth(me,menu) add cascade -label [mc "Edit"] -state disabled \ -font $xth(gui,lfont) -menu $xth(me,menu,edit) -underline 0 $xth(me,menu,edit) add command -label [mc "Undo"] -font $xth(gui,lfont) \ -underline 0 -accelerator "$xth(gui,controlk)-z" -state disabled \ -command xth_me_unredo_undo $xth(me,menu,edit) add command -label [mc "Redo"] -font $xth(gui,lfont) \ -underline 0 -accelerator "$xth(gui,controlk)-y" -state disabled \ -command xth_me_unredo_redo $xth(me,menu,edit) add separator $xth(me,menu,edit) add command -label [mc "Cut"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-x" -command "xth_app_clipboard cut" $xth(me,menu,edit) add command -label [mc "Copy"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-c" -command "xth_app_clipboard copy" $xth(me,menu,edit) add command -label [mc "Paste"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-v" -command "xth_app_clipboard paste" $xth(me,menu,edit) add separator $xth(me,menu,edit) add command -label [mc "Select"] \ -accelerator "Esc" -underline 0 -font $xth(gui,lfont) -command {xth_me_cmds_set_mode 0} $xth(me,menu,edit) add cascade -label [mc "Insert ..."] \ -accelerator "$xth(gui,controlk)-i" -menu $xth(me,menu,edit).ins -underline 0 -font $xth(gui,lfont) $xth(me,menu,edit).ins add command -label [mc "point"] \ -accelerator "$xth(gui,controlk)-p" -underline 0 -font $xth(gui,lfont) -command {xth_me_cmds_set_mode 1} $xth(me,menu,edit).ins add command -label [mc "line"] \ -accelerator "$xth(gui,controlk)-l" -underline 0 -font $xth(gui,lfont) -command { xth_me_cmds_create_line {} 1 "" "" "" xth_ctrl_scroll_to me line xth_ctrl_maximize me line xth_ctrl_maximize me linept } $xth(me,menu,edit).ins add command -label [mc "area"] \ -accelerator "$xth(gui,controlk)-a" -font $xth(gui,lfont) -underline 0 -command { xth_me_cmds_create_area {} 1 "" "" "" xth_ctrl_scroll_to me ac xth_ctrl_maximize me ac } $xth(me,menu,edit).ins add command -label [mc "scrap"] \ -accelerator "$xth(gui,controlk)-r" -font $xth(gui,lfont) -underline 0 -command { xth_me_cmds_create_scrap {} 1 "" "" xth_ctrl_scroll_to me scrap xth_ctrl_maximize me scrap } $xth(me,menu,edit).ins add command -label [mc "text"] -font $xth(gui,lfont) -underline 0 -command { xth_me_cmds_create_text {} 1 "\n" "1.0" xth_ctrl_scroll_to me text xth_ctrl_maximize me text focus $xth(ctrl,me,text).txt } $xth(me,menu,edit) add command -label [mc "Delete"] \ -accelerator "$xth(gui,controlk)-d" -underline 0 -font $xth(gui,lfont) -command {xth_me_cmds_delete {}} $xth(me,menu,edit) add separator $xth(me,menu,edit) add cascade -label [mc "Zoom 100 %"] -font $xth(gui,lfont) \ -underline 0 -menu $xth(ctrl,me,area).zb.m $xth(me,menu,edit) add command -label [mc "Auto adjust area"] \ -font $xth(gui,lfont) -command xth_me_area_auto_adjust $xth(me,menu,edit) add command -label [mc "Insert image"] \ -font $xth(gui,lfont) \ -command { set nimgs [llength $xth(me,imgs,xlist)] xth_me_image_newpos xth_me_image_insert $xth(ctrl,me,images,newposx) $xth(ctrl,me,images,newposy) {} 0 {} set nnimgs [llength $xth(me,imgs,xlist)] if {$nnimgs > $nimgs} { xth_me_area_auto_adjust } } $xth(me,menu,edit) add separator $xth(me,menu,edit) add checkbutton -label [mc "Hide inactive scraps"] -variable xth(me,hinactives) -command xth_me_cmds_toggleishiding set xth(me,menu,edit,undo) [$xth(me,menu,edit) index [mc "Undo"]] set xth(me,menu,edit,redo) [$xth(me,menu,edit) index [mc "Redo"]] set xth(me,menu,edit,zoom) [$xth(me,menu,edit) index [mc "Zoom 100 %"]] # create mouse mode bar and progess bar set barfm $xth(gui,me).sf.barfm frame $barfm pack $barfm -side left grid columnconf $barfm 0 -weight 1 grid rowconf $barfm 0 -weight 1 set xth(me,mbar) $barfm.mbar Label $xth(me,mbar) -text "" -width 20 -relief sunken -font $xth(gui,lfont) \ -anchor center -state disabled grid $xth(me,mbar) -column 0 -row 0 -sticky news set xth(me,mbar,bg) [$xth(me,mbar) cget -bg] set xth(me,mbar,fg) [$xth(me,mbar) cget -fg] xth_status_bar me $xth(me,mbar) [mc "Mouse mode."] set xth(me,progbar) $barfm.pbar set xth(me,progbar,value) 0 ProgressBar $xth(me,progbar) -type normal -width 100 -variable xth(me,progbar,value) -fg darkBlue proc xth_me_progbar_show {max} { global xth set pbw [winfo width $xth(me,mbar)] set pbh [winfo height $xth(me,mbar)] grid forget $xth(me,mbar) grid $xth(me,progbar) -column 0 -row 0 -sticky news $xth(me,progbar) configure -maximum $max -width $pbw -height $pbh update idletasks } proc xth_me_progbar_hide {} { global xth grid forget $xth(me,progbar) grid $xth(me,mbar) -column 0 -row 0 -sticky news update idletasks } proc xth_me_progbar_prog {val} { global xth set xth(me,progbar,value) $val update idletasks } # create position bar set xth(me,pbar) $xth(gui,me).sf.pbar Label $xth(me,pbar) -text "" -width 15 -relief sunken -font $xth(gui,lfont) \ -anchor center -state disabled pack $xth(me,pbar) -side left xth_status_bar me $xth(me,pbar) [mc "Current mouse position."] xth_ctrl_minimize me cmds xth_ctrl_minimize me prev xth_ctrl_minimize me ss xth_ctrl_minimize me point xth_ctrl_minimize me line xth_ctrl_minimize me linept xth_ctrl_minimize me ac xth_ctrl_minimize me scrap xth_ctrl_minimize me text xth_ctrl_minimize me area xth_ctrl_minimize me images set xth(ctrl,me,area,xmin) "" set xth(ctrl,me,area,ymin) "" set xth(ctrl,me,area,xmax) "" set xth(ctrl,me,area,ymax) "" xth_me_set_theme 0 xth_about_status [mc "loading line procs ..."] xth_status_bar_status me [mc "Map editor is not active. To activate it, open existing file or create new one."] therion/xtherion/therion.tcl0000664000175000017500000105616012302220637015270 0ustar useruserset xth(point_types) { air-draught altitude anastomosis anchor aragonite archeo-material bedrock blocks breakdown-choke bridge camp cave-pearl clay clay-choke clay-tree continuation crystal curtain date debris dig dimensions disk entrance extra fixed-ladder flowstone flowstone-choke flute gradient guano gypsum gypsum-flower handrail height helictite ice ice-pillar ice-stalactite ice-stalagmite karren label low-end map-connection moonmilk narrow-end no-equipment paleo-material passage-height pebbles pillar pillars popcorn raft raft-cone remark rimstone-dam rimstone-pool root rope rope-ladder sand scallop section sink snow soda-straw spring stalactite stalactites stalagmite stalagmites station station-name steps traverse u vegetable-debris via-ferrata wall-calcite water water-flow } set xth(line_types) { arrow border ceiling-meander ceiling-step chimney contour fixed-ladder floor-meander floor-step flowstone gradient handrail label map-connection moonmilk overhang pit rock-border rock-edge rope rope-ladder section slope steps survey u via-ferrata wall water-flow } set xth(area_types) { bedrock blocks clay debris dimensions flowstone ice moonmilk pebbles sand snow sump u water } ::msgcat::mcset bg "area bedrock" [encoding convertfrom utf-8 "\320\276\321\201\320\275\320\276\320\262\320\275\320\260 \321\201\320\272\320\260\320\273\320\260"] ::msgcat::mcset cz "area bedrock" [encoding convertfrom utf-8 "pevn\303\241 sk\303\241la"] ::msgcat::mcset de "area bedrock" [encoding convertfrom utf-8 "Deckgebirge"] ::msgcat::mcset el "area bedrock" [encoding convertfrom utf-8 "\317\200\316\255\317\204\317\201\317\211\316\274\316\261"] ::msgcat::mcset en "area bedrock" [encoding convertfrom utf-8 "bedrock"] ::msgcat::mcset en_UK "area bedrock" [encoding convertfrom utf-8 "bedrock"] ::msgcat::mcset en_US "area bedrock" [encoding convertfrom utf-8 "bedrock"] ::msgcat::mcset es "area bedrock" [encoding convertfrom utf-8 "roca madre"] ::msgcat::mcset fr "area bedrock" [encoding convertfrom utf-8 "roche"] ::msgcat::mcset it "area bedrock" [encoding convertfrom utf-8 "roccia"] ::msgcat::mcset pt "area bedrock" [encoding convertfrom utf-8 "rocha encaixante"] ::msgcat::mcset pt_BR "area bedrock" [encoding convertfrom utf-8 "rocha encaixante"] ::msgcat::mcset pt_PT "area bedrock" [encoding convertfrom utf-8 "rocha encaixante"] ::msgcat::mcset ru "area bedrock" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\265\320\275\320\275\320\260\321\217 \320\277\320\276\321\200\320\276\320\264\320\260"] ::msgcat::mcset sk "area bedrock" [encoding convertfrom utf-8 "pevn\303\241 skala"] ::msgcat::mcset sq "area bedrock" [encoding convertfrom utf-8 "shtrat shkembi"] ::msgcat::mcset bg "area blocks" [encoding convertfrom utf-8 "\320\261\320\273\320\276\320\272\320\260\320\266"] ::msgcat::mcset cz "area blocks" [encoding convertfrom utf-8 "skaln\303\255 bloky"] ::msgcat::mcset de "area blocks" [encoding convertfrom utf-8 "Fl\303\244che mit Bl\303\266cken"] ::msgcat::mcset el "area blocks" [encoding convertfrom utf-8 "\316\277\316\263\316\272\317\214\316\273\316\271\316\270\316\277\316\271"] ::msgcat::mcset en "area blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset en_UK "area blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset en_US "area blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset es "area blocks" [encoding convertfrom utf-8 "bloques"] ::msgcat::mcset fr "area blocks" [encoding convertfrom utf-8 "blocs"] ::msgcat::mcset it "area blocks" [encoding convertfrom utf-8 "massi"] ::msgcat::mcset mi "area blocks" [encoding convertfrom utf-8 "pakaru a k\305\215hatunui"] ::msgcat::mcset pl "area blocks" [encoding convertfrom utf-8 "bloki skalne"] ::msgcat::mcset pt "area blocks" [encoding convertfrom utf-8 "blocos"] ::msgcat::mcset pt_BR "area blocks" [encoding convertfrom utf-8 "blocos"] ::msgcat::mcset pt_PT "area blocks" [encoding convertfrom utf-8 "blocos"] ::msgcat::mcset ru "area blocks" [encoding convertfrom utf-8 "\320\275\320\260\320\262\320\260\320\273 \320\263\320\273\321\213\320\261"] ::msgcat::mcset sk "area blocks" [encoding convertfrom utf-8 "skaln\303\251 bloky"] ::msgcat::mcset sq "area blocks" [encoding convertfrom utf-8 "blloqe"] ::msgcat::mcset bg "area clay" [encoding convertfrom utf-8 "\320\263\320\273\320\270\320\275\320\260"] ::msgcat::mcset cz "area clay" [encoding convertfrom utf-8 "bahno"] ::msgcat::mcset de "area clay" [encoding convertfrom utf-8 "Lehmfl\303\244che"] ::msgcat::mcset el "area clay" [encoding convertfrom utf-8 "\316\254\317\201\316\263\316\271\316\273\316\277\317\202"] ::msgcat::mcset en "area clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset en_UK "area clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset en_US "area clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset es "area clay" [encoding convertfrom utf-8 "arcilla"] ::msgcat::mcset fr "area clay" [encoding convertfrom utf-8 "argile"] ::msgcat::mcset it "area clay" [encoding convertfrom utf-8 "argilla"] ::msgcat::mcset mi "area clay" [encoding convertfrom utf-8 "oneuku"] ::msgcat::mcset pl "area clay" [encoding convertfrom utf-8 "glina"] ::msgcat::mcset pt "area clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset pt_BR "area clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset pt_PT "area clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset ru "area clay" [encoding convertfrom utf-8 "\320\263\320\273\320\270\320\275\320\260"] ::msgcat::mcset sk "area clay" [encoding convertfrom utf-8 "\303\255l"] ::msgcat::mcset sq "area clay" [encoding convertfrom utf-8 "argjil"] ::msgcat::mcset bg "area debris" [encoding convertfrom utf-8 "\321\207\320\260\320\272\321\212\320\273"] ::msgcat::mcset cz "area debris" [encoding convertfrom utf-8 "\305\241t\304\233rk"] ::msgcat::mcset de "area debris" [encoding convertfrom utf-8 "Schuttfl\303\244che"] ::msgcat::mcset el "area debris" [encoding convertfrom utf-8 "\317\207\316\261\316\273\316\254\317\203\316\274\316\261\317\204\316\261"] ::msgcat::mcset en "area debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset en_UK "area debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset en_US "area debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset es "area debris" [encoding convertfrom utf-8 "derrubios"] ::msgcat::mcset fr "area debris" [encoding convertfrom utf-8 "d\303\251bris"] ::msgcat::mcset it "area debris" [encoding convertfrom utf-8 "detriti"] ::msgcat::mcset mi "area debris" [encoding convertfrom utf-8 "otaota"] ::msgcat::mcset pl "area debris" [encoding convertfrom utf-8 "\305\274wir"] ::msgcat::mcset pt "area debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset pt_BR "area debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset pt_PT "area debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset ru "area debris" [encoding convertfrom utf-8 "\321\211\320\265\320\261\320\265\320\275\321\214"] ::msgcat::mcset sk "area debris" [encoding convertfrom utf-8 "\305\241trk"] ::msgcat::mcset sq "area debris" [encoding convertfrom utf-8 "mbetje-gurresh"] ::msgcat::mcset bg "area flowstone" [encoding convertfrom utf-8 "\320\272\320\260\320\274\320\265\320\275\320\265\320\275 \320\262\320\276\320\264\320\276\320\277\320\260\320\264"] ::msgcat::mcset cz "area flowstone" [encoding convertfrom utf-8 "sintrov\303\251 n\303\241teky"] ::msgcat::mcset de "area flowstone" [encoding convertfrom utf-8 "fl\303\244chiger Sinter"] ::msgcat::mcset el "area flowstone" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\317\214 \317\205\316\273\316\271\316\272\317\214 \316\264\316\261\317\200\316\255\316\264\316\277\317\205"] ::msgcat::mcset en "area flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset en_UK "area flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset en_US "area flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset es "area flowstone" [encoding convertfrom utf-8 "concreci\303\263n"] ::msgcat::mcset fr "area flowstone" [encoding convertfrom utf-8 "concr\303\251tion"] ::msgcat::mcset it "area flowstone" [encoding convertfrom utf-8 "concrezione"] ::msgcat::mcset pt "area flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset pt_BR "area flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset pt_PT "area flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset ru "area flowstone" [encoding convertfrom utf-8 "\320\275\320\260\321\202\320\265\321\207\320\275\321\213\320\271 \320\272\320\260\321\201\320\272\320\260\320\264"] ::msgcat::mcset sk "area flowstone" [encoding convertfrom utf-8 "sintrov\303\251 n\303\241teky"] ::msgcat::mcset sq "area flowstone" [encoding convertfrom utf-8 "gurre-rrjedhes"] ::msgcat::mcset bg "area ice" [encoding convertfrom utf-8 "\320\273\320\265\320\264"] ::msgcat::mcset cz "area ice" [encoding convertfrom utf-8 "led"] ::msgcat::mcset de "area ice" [encoding convertfrom utf-8 "Eisfl\303\244che"] ::msgcat::mcset el "area ice" [encoding convertfrom utf-8 "\317\200\316\254\316\263\316\277\317\202"] ::msgcat::mcset en "area ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset en_UK "area ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset en_US "area ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset es "area ice" [encoding convertfrom utf-8 "hielo"] ::msgcat::mcset fr "area ice" [encoding convertfrom utf-8 "glace"] ::msgcat::mcset it "area ice" [encoding convertfrom utf-8 "ghiaccio"] ::msgcat::mcset mi "area ice" [encoding convertfrom utf-8 "k\305\215paka"] ::msgcat::mcset pl "area ice" [encoding convertfrom utf-8 "l\303\263d"] ::msgcat::mcset pt "area ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset pt_BR "area ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset pt_PT "area ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset ru "area ice" [encoding convertfrom utf-8 "\320\273\321\221\320\264"] ::msgcat::mcset sk "area ice" [encoding convertfrom utf-8 "\304\276ad"] ::msgcat::mcset sq "area ice" [encoding convertfrom utf-8 "akull"] ::msgcat::mcset bg "area moonmilk" [encoding convertfrom utf-8 "\320\277\320\265\321\211\320\265\321\200\320\275\320\276 \320\274\320\273\321\217\320\272\320\276"] ::msgcat::mcset cz "area moonmilk" [encoding convertfrom utf-8 "nickam\303\255nek"] ::msgcat::mcset de "area moonmilk" [encoding convertfrom utf-8 "Bergmilch"] ::msgcat::mcset el "area moonmilk" [encoding convertfrom utf-8 "\316\263\316\254\316\273\316\261 \317\203\317\200\316\267\316\273\316\261\316\257\316\277\317\205"] ::msgcat::mcset en "area moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset en_UK "area moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset en_US "area moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset fr "area moonmilk" [encoding convertfrom utf-8 "mondmilch"] ::msgcat::mcset it "area moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset ru "area moonmilk" [encoding convertfrom utf-8 "\320\273\321\203\320\275\320\275\320\276\320\265 \320\274\320\276\320\273\320\276\320\272\320\276"] ::msgcat::mcset sk "area moonmilk" [encoding convertfrom utf-8 "n\303\241teky m\303\244kk\303\251ho sintra"] ::msgcat::mcset sq "area moonmilk" [encoding convertfrom utf-8 "qumesht-hena"] ::msgcat::mcset bg "area pebbles" [encoding convertfrom utf-8 "\320\272\320\260\320\274\321\212\321\207\320\265\321\202\320\260"] ::msgcat::mcset cz "area pebbles" [encoding convertfrom utf-8 "valouny"] ::msgcat::mcset de "area pebbles" [encoding convertfrom utf-8 "Kiesfl\303\244che"] ::msgcat::mcset el "area pebbles" [encoding convertfrom utf-8 "\317\207\316\261\316\273\316\257\316\272\316\271\316\261"] ::msgcat::mcset en "area pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset en_UK "area pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset en_US "area pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset es "area pebbles" [encoding convertfrom utf-8 "cantos rodados"] ::msgcat::mcset fr "area pebbles" [encoding convertfrom utf-8 "galets/pierres"] ::msgcat::mcset it "area pebbles" [encoding convertfrom utf-8 "ciotoli"] ::msgcat::mcset mi "area pebbles" [encoding convertfrom utf-8 "nga k\305\215hatu iti"] ::msgcat::mcset pl "area pebbles" [encoding convertfrom utf-8 "okr\304\231glaki"] ::msgcat::mcset pt "area pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset pt_BR "area pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset pt_PT "area pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset ru "area pebbles" [encoding convertfrom utf-8 "\320\263\320\260\320\273\321\214\320\272\320\260"] ::msgcat::mcset sk "area pebbles" [encoding convertfrom utf-8 "okr\303\272hliaky"] ::msgcat::mcset sq "area pebbles" [encoding convertfrom utf-8 "gurralece"] ::msgcat::mcset bg "area sand" [encoding convertfrom utf-8 "\320\277\321\217\321\201\321\212\320\272"] ::msgcat::mcset cz "area sand" [encoding convertfrom utf-8 "p\303\255sek"] ::msgcat::mcset de "area sand" [encoding convertfrom utf-8 "Sandfl\303\244che"] ::msgcat::mcset el "area sand" [encoding convertfrom utf-8 "\316\254\316\274\316\274\316\277\317\202"] ::msgcat::mcset en "area sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset en_UK "area sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset en_US "area sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset es "area sand" [encoding convertfrom utf-8 "arena"] ::msgcat::mcset fr "area sand" [encoding convertfrom utf-8 "sable"] ::msgcat::mcset it "area sand" [encoding convertfrom utf-8 "sabbia"] ::msgcat::mcset mi "area sand" [encoding convertfrom utf-8 "onep\305\253"] ::msgcat::mcset pl "area sand" [encoding convertfrom utf-8 "piasek"] ::msgcat::mcset pt "area sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset pt_BR "area sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset pt_PT "area sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset ru "area sand" [encoding convertfrom utf-8 "\320\277\320\265\321\201\320\276\320\272"] ::msgcat::mcset sk "area sand" [encoding convertfrom utf-8 "piesok"] ::msgcat::mcset sq "area sand" [encoding convertfrom utf-8 "rane"] ::msgcat::mcset bg "area snow" [encoding convertfrom utf-8 "\321\201\320\275\321\217\320\263"] ::msgcat::mcset cz "area snow" [encoding convertfrom utf-8 "sn\303\255h"] ::msgcat::mcset de "area snow" [encoding convertfrom utf-8 "Schneefl\303\244che"] ::msgcat::mcset el "area snow" [encoding convertfrom utf-8 "\317\207\316\271\317\214\316\275\316\271"] ::msgcat::mcset en "area snow" [encoding convertfrom utf-8 "snow"] ::msgcat::mcset en_UK "area snow" [encoding convertfrom utf-8 "snow"] ::msgcat::mcset en_US "area snow" [encoding convertfrom utf-8 "snow"] ::msgcat::mcset es "area snow" [encoding convertfrom utf-8 "nieve"] ::msgcat::mcset fr "area snow" [encoding convertfrom utf-8 "neige"] ::msgcat::mcset it "area snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset mi "area snow" [encoding convertfrom utf-8 "huka"] ::msgcat::mcset pl "area snow" [encoding convertfrom utf-8 "\305\233nieg"] ::msgcat::mcset pt "area snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset pt_BR "area snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset pt_PT "area snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset ru "area snow" [encoding convertfrom utf-8 "\321\201\320\275\320\265\320\263"] ::msgcat::mcset sk "area snow" [encoding convertfrom utf-8 "sneh"] ::msgcat::mcset sq "area snow" [encoding convertfrom utf-8 "bore"] ::msgcat::mcset bg "area sump" [encoding convertfrom utf-8 "\321\201\320\270\321\204\320\276\320\275"] ::msgcat::mcset cz "area sump" [encoding convertfrom utf-8 "sifon"] ::msgcat::mcset de "area sump" [encoding convertfrom utf-8 "Siphonfl\303\244che"] ::msgcat::mcset el "area sump" [encoding convertfrom utf-8 "\317\203\316\271\317\206\317\214\316\275\316\271"] ::msgcat::mcset en "area sump" [encoding convertfrom utf-8 "sump"] ::msgcat::mcset en_UK "area sump" [encoding convertfrom utf-8 "sump"] ::msgcat::mcset en_US "area sump" [encoding convertfrom utf-8 "sump"] ::msgcat::mcset es "area sump" [encoding convertfrom utf-8 "sif\303\263n"] ::msgcat::mcset fr "area sump" [encoding convertfrom utf-8 "siphon"] ::msgcat::mcset it "area sump" [encoding convertfrom utf-8 "sifone"] ::msgcat::mcset mi "area sump" [encoding convertfrom utf-8 "kari a wai"] ::msgcat::mcset pl "area sump" [encoding convertfrom utf-8 "syfon"] ::msgcat::mcset pt "area sump" [encoding convertfrom utf-8 "sif\303\243o"] ::msgcat::mcset pt_BR "area sump" [encoding convertfrom utf-8 "sif\303\243o"] ::msgcat::mcset pt_PT "area sump" [encoding convertfrom utf-8 "sif\303\243o"] ::msgcat::mcset ru "area sump" [encoding convertfrom utf-8 "\321\201\320\270\321\204\320\276\320\275"] ::msgcat::mcset sk "area sump" [encoding convertfrom utf-8 "zatopen\303\241 plocha (sif\303\263n)"] ::msgcat::mcset sq "area sump" [encoding convertfrom utf-8 "sifoni"] ::msgcat::mcset bg "area water" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\260"] ::msgcat::mcset cz "area water" [encoding convertfrom utf-8 "vodn\303\255 plocha"] ::msgcat::mcset de "area water" [encoding convertfrom utf-8 "Wasserfl\303\244che"] ::msgcat::mcset el "area water" [encoding convertfrom utf-8 "\316\275\316\265\317\201\317\214"] ::msgcat::mcset en "area water" [encoding convertfrom utf-8 "water"] ::msgcat::mcset en_UK "area water" [encoding convertfrom utf-8 "water"] ::msgcat::mcset en_US "area water" [encoding convertfrom utf-8 "water"] ::msgcat::mcset es "area water" [encoding convertfrom utf-8 "agua"] ::msgcat::mcset fr "area water" [encoding convertfrom utf-8 "eau"] ::msgcat::mcset it "area water" [encoding convertfrom utf-8 "acqua"] ::msgcat::mcset mi "area water" [encoding convertfrom utf-8 "wai"] ::msgcat::mcset pl "area water" [encoding convertfrom utf-8 "powierzchnia wody"] ::msgcat::mcset pt "area water" [encoding convertfrom utf-8 "\303\241gua"] ::msgcat::mcset pt_BR "area water" [encoding convertfrom utf-8 "\303\241gua"] ::msgcat::mcset pt_PT "area water" [encoding convertfrom utf-8 "\303\241gua"] ::msgcat::mcset ru "area water" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\260"] ::msgcat::mcset sk "area water" [encoding convertfrom utf-8 "vodn\303\241 plocha"] ::msgcat::mcset sq "area water" [encoding convertfrom utf-8 "uje"] ::msgcat::mcset bg "line border" [encoding convertfrom utf-8 "\320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset cz "line border" [encoding convertfrom utf-8 "ohrani\304\215en\303\255"] ::msgcat::mcset de "line border" [encoding convertfrom utf-8 "Begrenzung"] ::msgcat::mcset el "line border" [encoding convertfrom utf-8 "\316\254\316\272\317\201\316\267"] ::msgcat::mcset en "line border" [encoding convertfrom utf-8 "border"] ::msgcat::mcset en_UK "line border" [encoding convertfrom utf-8 "border"] ::msgcat::mcset en_US "line border" [encoding convertfrom utf-8 "border"] ::msgcat::mcset es "line border" [encoding convertfrom utf-8 "l\303\255mite"] ::msgcat::mcset fr "line border" [encoding convertfrom utf-8 "bord"] ::msgcat::mcset it "line border" [encoding convertfrom utf-8 "bordo"] ::msgcat::mcset mi "line border" [encoding convertfrom utf-8 "rohe"] ::msgcat::mcset pl "line border" [encoding convertfrom utf-8 "granica"] ::msgcat::mcset pt "line border" [encoding convertfrom utf-8 "borda"] ::msgcat::mcset pt_BR "line border" [encoding convertfrom utf-8 "borda"] ::msgcat::mcset pt_PT "line border" [encoding convertfrom utf-8 "borda"] ::msgcat::mcset ru "line border" [encoding convertfrom utf-8 "\320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset sk "line border" [encoding convertfrom utf-8 "ohrani\304\215enie"] ::msgcat::mcset sq "line border" [encoding convertfrom utf-8 "kufiri"] ::msgcat::mcset bg "line border:presumed" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\260\320\263\320\260\320\265\320\274\320\260 \320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset cz "line border:presumed" [encoding convertfrom utf-8 "p\305\231edpokl\303\241dan\303\251 ohrani\304\215en\303\255"] ::msgcat::mcset de "line border:presumed" [encoding convertfrom utf-8 "gesch\303\244tzte Begrenzung"] ::msgcat::mcset el "line border:presumed" [encoding convertfrom utf-8 "\317\205\317\200\316\277\316\270\316\265\317\204\316\271\316\272\316\256 \316\254\316\272\317\201\316\267"] ::msgcat::mcset en "line border:presumed" [encoding convertfrom utf-8 "presumed border"] ::msgcat::mcset en_UK "line border:presumed" [encoding convertfrom utf-8 "presumed border"] ::msgcat::mcset en_US "line border:presumed" [encoding convertfrom utf-8 "presumed border"] ::msgcat::mcset es "line border:presumed" [encoding convertfrom utf-8 "l\303\255mite supuesto"] ::msgcat::mcset fr "line border:presumed" [encoding convertfrom utf-8 "bord, suppos\303\251"] ::msgcat::mcset it "line border:presumed" [encoding convertfrom utf-8 "bordo presunto"] ::msgcat::mcset mi "line border:presumed" [encoding convertfrom utf-8 "rohe whakaaringa whakaaro"] ::msgcat::mcset pl "line border:presumed" [encoding convertfrom utf-8 "niewidoczna granica"] ::msgcat::mcset pt "line border:presumed" [encoding convertfrom utf-8 "borda presumida"] ::msgcat::mcset pt_BR "line border:presumed" [encoding convertfrom utf-8 "borda presumida"] ::msgcat::mcset pt_PT "line border:presumed" [encoding convertfrom utf-8 "borda presumida"] ::msgcat::mcset ru "line border:presumed" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\260\320\263\320\260\320\265\320\274\320\260\321\217 \320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset sk "line border:presumed" [encoding convertfrom utf-8 "predpokladan\303\251 ohrani\304\215enie"] ::msgcat::mcset sq "line border:presumed" [encoding convertfrom utf-8 "kufij I supozuar"] ::msgcat::mcset bg "line border:temporary" [encoding convertfrom utf-8 "\320\262\321\200\320\265\320\274\320\265\320\275\320\275\320\260 \320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset cz "line border:temporary" [encoding convertfrom utf-8 "nest\303\241l\303\251 ohrani\304\215en\303\255"] ::msgcat::mcset de "line border:temporary" [encoding convertfrom utf-8 "vor\303\274bergehende Begrenzung"] ::msgcat::mcset el "line border:temporary" [encoding convertfrom utf-8 "\317\200\317\201\316\277\317\203\317\211\317\201\316\271\316\275\316\256 \316\254\316\272\317\201\316\267"] ::msgcat::mcset en "line border:temporary" [encoding convertfrom utf-8 "temporary border"] ::msgcat::mcset en_UK "line border:temporary" [encoding convertfrom utf-8 "temporary border"] ::msgcat::mcset en_US "line border:temporary" [encoding convertfrom utf-8 "temporary border"] ::msgcat::mcset es "line border:temporary" [encoding convertfrom utf-8 "l\303\255mite temporal"] ::msgcat::mcset fr "line border:temporary" [encoding convertfrom utf-8 "bord, temporaire"] ::msgcat::mcset it "line border:temporary" [encoding convertfrom utf-8 "bordo temporaneo"] ::msgcat::mcset mi "line border:temporary" [encoding convertfrom utf-8 "rohe mo te w\304\201"] ::msgcat::mcset pl "line border:temporary" [encoding convertfrom utf-8 "tymczasowa granica"] ::msgcat::mcset pt "line border:temporary" [encoding convertfrom utf-8 "borda tempor\303\241ria"] ::msgcat::mcset pt_BR "line border:temporary" [encoding convertfrom utf-8 "borda tempor\303\241ria"] ::msgcat::mcset pt_PT "line border:temporary" [encoding convertfrom utf-8 "borda tempor\303\241ria"] ::msgcat::mcset ru "line border:temporary" [encoding convertfrom utf-8 "\320\262\321\200\320\265\320\274\320\265\320\275\320\275\320\260\321\217 \320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset sk "line border:temporary" [encoding convertfrom utf-8 "nest\303\241le ohrani\304\215enie"] ::msgcat::mcset sq "line border:temporary" [encoding convertfrom utf-8 "kufij i perkohshem"] ::msgcat::mcset bg "line border:visible" [encoding convertfrom utf-8 "\320\262\320\270\320\264\320\270\320\274\320\260 \320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset cz "line border:visible" [encoding convertfrom utf-8 "ohrani\304\215en\303\255"] ::msgcat::mcset de "line border:visible" [encoding convertfrom utf-8 "sichtbare Begrenzung"] ::msgcat::mcset el "line border:visible" [encoding convertfrom utf-8 "\316\254\316\272\317\201\316\267"] ::msgcat::mcset en "line border:visible" [encoding convertfrom utf-8 "border"] ::msgcat::mcset en_UK "line border:visible" [encoding convertfrom utf-8 "border"] ::msgcat::mcset en_US "line border:visible" [encoding convertfrom utf-8 "border"] ::msgcat::mcset es "line border:visible" [encoding convertfrom utf-8 "l\303\255mite"] ::msgcat::mcset fr "line border:visible" [encoding convertfrom utf-8 "bord"] ::msgcat::mcset it "line border:visible" [encoding convertfrom utf-8 "bordo"] ::msgcat::mcset mi "line border:visible" [encoding convertfrom utf-8 "rohe"] ::msgcat::mcset pl "line border:visible" [encoding convertfrom utf-8 "granica"] ::msgcat::mcset pt "line border:visible" [encoding convertfrom utf-8 "borda"] ::msgcat::mcset pt_BR "line border:visible" [encoding convertfrom utf-8 "borda"] ::msgcat::mcset pt_PT "line border:visible" [encoding convertfrom utf-8 "borda"] ::msgcat::mcset ru "line border:visible" [encoding convertfrom utf-8 "\320\262\320\270\320\264\320\270\320\274\320\260\321\217 \320\263\321\200\320\260\320\275\320\270\321\206\320\260"] ::msgcat::mcset sk "line border:visible" [encoding convertfrom utf-8 "ohrani\304\215enie"] ::msgcat::mcset sq "line border:visible" [encoding convertfrom utf-8 "vije kufiri-e dukshme"] ::msgcat::mcset bg "line ceiling-meander" [encoding convertfrom utf-8 "\320\274\320\265\320\260\320\275\320\264\321\212\321\200, \320\272\320\260\320\275\320\260\320\273 \320\262 \321\202\320\260\320\262\320\260\320\275\320\260"] ::msgcat::mcset cz "line ceiling-meander" [encoding convertfrom utf-8 "stropn\303\255 meandr"] ::msgcat::mcset de "line ceiling-meander" [encoding convertfrom utf-8 "Deckenm\303\244ander"] ::msgcat::mcset el "line ceiling-meander" [encoding convertfrom utf-8 "\316\274\316\261\316\257\316\261\316\275\316\264\317\201\316\277\317\202 \316\277\317\201\316\277\317\206\316\256\317\202"] ::msgcat::mcset en "line ceiling-meander" [encoding convertfrom utf-8 "ceiling meander"] ::msgcat::mcset en_UK "line ceiling-meander" [encoding convertfrom utf-8 "ceiling meander"] ::msgcat::mcset en_US "line ceiling-meander" [encoding convertfrom utf-8 "ceiling meander"] ::msgcat::mcset es "line ceiling-meander" [encoding convertfrom utf-8 "meandro inverso"] ::msgcat::mcset fr "line ceiling-meander" [encoding convertfrom utf-8 "m\303\251andre de plafond"] ::msgcat::mcset it "line ceiling-meander" [encoding convertfrom utf-8 "canale di volta"] ::msgcat::mcset mi "line ceiling-meander" [encoding convertfrom utf-8 "kopiko tuanui"] ::msgcat::mcset pl "line ceiling-meander" [encoding convertfrom utf-8 "meander w stropie"] ::msgcat::mcset pt "line ceiling-meander" [encoding convertfrom utf-8 "meandro no teto"] ::msgcat::mcset pt_BR "line ceiling-meander" [encoding convertfrom utf-8 "meandro no teto"] ::msgcat::mcset pt_PT "line ceiling-meander" [encoding convertfrom utf-8 "meandro no tecto"] ::msgcat::mcset ru "line ceiling-meander" [encoding convertfrom utf-8 "\320\274\320\265\320\260\320\275\320\264\321\200, \320\272\320\260\320\275\320\260\320\273 \320\262 \320\277\320\276\321\202\320\276\320\273\320\272\320\265"] ::msgcat::mcset sk "line ceiling-meander" [encoding convertfrom utf-8 "stropn\303\275 meander"] ::msgcat::mcset sq "line ceiling-meander" [encoding convertfrom utf-8 "rrjedhe uji gjarperore ne tavan"] ::msgcat::mcset bg "line ceiling-step" [encoding convertfrom utf-8 "\320\275\320\270\321\210\320\260 \320\262 \321\202\320\260\320\262\320\260\320\275\320\260"] ::msgcat::mcset cz "line ceiling-step" [encoding convertfrom utf-8 "zm\304\233na v\303\275\305\241ky stropu"] ::msgcat::mcset de "line ceiling-step" [encoding convertfrom utf-8 "Deckenstufe"] ::msgcat::mcset el "line ceiling-step" [encoding convertfrom utf-8 "\317\203\316\272\316\261\316\273\316\277\317\200\316\254\317\204\316\271 \316\277\317\201\316\277\317\206\316\256\317\202"] ::msgcat::mcset en "line ceiling-step" [encoding convertfrom utf-8 "ceiling step"] ::msgcat::mcset en_UK "line ceiling-step" [encoding convertfrom utf-8 "ceiling step"] ::msgcat::mcset en_US "line ceiling-step" [encoding convertfrom utf-8 "ceiling step"] ::msgcat::mcset es "line ceiling-step" [encoding convertfrom utf-8 "resalte inverso"] ::msgcat::mcset fr "line ceiling-step" [encoding convertfrom utf-8 "marche de plafond"] ::msgcat::mcset it "line ceiling-step" [encoding convertfrom utf-8 "gradino a soffitto"] ::msgcat::mcset mi "line ceiling-step" [encoding convertfrom utf-8 "tapuae ki te tuanui"] ::msgcat::mcset pl "line ceiling-step" [encoding convertfrom utf-8 "zmiana wysoko\305\233ci stropu"] ::msgcat::mcset pt "line ceiling-step" [encoding convertfrom utf-8 "degrau no teto"] ::msgcat::mcset pt_BR "line ceiling-step" [encoding convertfrom utf-8 "degrau no teto"] ::msgcat::mcset pt_PT "line ceiling-step" [encoding convertfrom utf-8 "degrau no tecto"] ::msgcat::mcset ru "line ceiling-step" [encoding convertfrom utf-8 "\321\203\321\201\321\202\321\203\320\277 \320\277\320\276\321\202\320\276\320\273\320\272\320\260"] ::msgcat::mcset sk "line ceiling-step" [encoding convertfrom utf-8 "zmena v\303\275\305\241ky stropu"] ::msgcat::mcset sq "line ceiling-step" [encoding convertfrom utf-8 "shkalle ne tavan"] ::msgcat::mcset bg "line chimney" [encoding convertfrom utf-8 "\320\272\320\276\320\274\320\270\320\275"] ::msgcat::mcset cz "line chimney" [encoding convertfrom utf-8 "kom\303\255n"] ::msgcat::mcset de "line chimney" [encoding convertfrom utf-8 "Schlot"] ::msgcat::mcset el "line chimney" [encoding convertfrom utf-8 "\316\272\316\261\316\274\316\271\316\275\316\254\316\264\316\261"] ::msgcat::mcset en "line chimney" [encoding convertfrom utf-8 "chimney"] ::msgcat::mcset en_UK "line chimney" [encoding convertfrom utf-8 "chimney"] ::msgcat::mcset en_US "line chimney" [encoding convertfrom utf-8 "chimney"] ::msgcat::mcset es "line chimney" [encoding convertfrom utf-8 "chimenea"] ::msgcat::mcset fr "line chimney" [encoding convertfrom utf-8 "chemin\303\251e"] ::msgcat::mcset it "line chimney" [encoding convertfrom utf-8 "camino"] ::msgcat::mcset mi "line chimney" [encoding convertfrom utf-8 "tumera"] ::msgcat::mcset pl "line chimney" [encoding convertfrom utf-8 "komin"] ::msgcat::mcset pt "line chimney" [encoding convertfrom utf-8 "chamin\303\251"] ::msgcat::mcset pt_BR "line chimney" [encoding convertfrom utf-8 "chamin\303\251"] ::msgcat::mcset pt_PT "line chimney" [encoding convertfrom utf-8 "chamin\303\251"] ::msgcat::mcset ru "line chimney" [encoding convertfrom utf-8 "\321\202\321\200\321\203\320\261\320\260"] ::msgcat::mcset sk "line chimney" [encoding convertfrom utf-8 "kom\303\255n"] ::msgcat::mcset sq "line chimney" [encoding convertfrom utf-8 "oxhak"] ::msgcat::mcset bg "line contour" [encoding convertfrom utf-8 "\320\272\320\276\320\275\321\202\321\203\321\200"] ::msgcat::mcset cz "line contour" [encoding convertfrom utf-8 "vrstevnice"] ::msgcat::mcset de "line contour" [encoding convertfrom utf-8 "H\303\266henlinie"] ::msgcat::mcset el "line contour" [encoding convertfrom utf-8 "\316\271\317\203\316\277\317\213\317\210\316\256\317\202"] ::msgcat::mcset en "line contour" [encoding convertfrom utf-8 "contour"] ::msgcat::mcset en_UK "line contour" [encoding convertfrom utf-8 "contour"] ::msgcat::mcset en_US "line contour" [encoding convertfrom utf-8 "contour"] ::msgcat::mcset es "line contour" [encoding convertfrom utf-8 "contorno"] ::msgcat::mcset fr "line contour" [encoding convertfrom utf-8 "contour"] ::msgcat::mcset it "line contour" [encoding convertfrom utf-8 "contorno"] ::msgcat::mcset mi "line contour" [encoding convertfrom utf-8 "koru"] ::msgcat::mcset pl "line contour" [encoding convertfrom utf-8 "poziomica"] ::msgcat::mcset pt "line contour" [encoding convertfrom utf-8 "contorno"] ::msgcat::mcset pt_BR "line contour" [encoding convertfrom utf-8 "contorno"] ::msgcat::mcset pt_PT "line contour" [encoding convertfrom utf-8 "contorno"] ::msgcat::mcset ru "line contour" [encoding convertfrom utf-8 "\320\272\320\276\320\275\321\202\321\203\321\200"] ::msgcat::mcset sk "line contour" [encoding convertfrom utf-8 "vrstevnica"] ::msgcat::mcset sq "line contour" [encoding convertfrom utf-8 "kontura"] ::msgcat::mcset bg "line floor-meander" [encoding convertfrom utf-8 "\320\274\320\265\320\260\320\275\320\264\321\212\321\200, \320\272\320\260\320\275\320\260\320\273 \320\262 \320\277\320\276\320\264\320\260"] ::msgcat::mcset cz "line floor-meander" [encoding convertfrom utf-8 "meandr ve dn\304\233"] ::msgcat::mcset de "line floor-meander" [encoding convertfrom utf-8 "Bodenm\303\244ander"] ::msgcat::mcset el "line floor-meander" [encoding convertfrom utf-8 "\316\274\316\261\316\257\316\261\316\275\316\264\317\201\316\277\317\202 \316\264\316\261\317\200\316\255\316\264\316\277\317\205"] ::msgcat::mcset en "line floor-meander" [encoding convertfrom utf-8 "floor meander"] ::msgcat::mcset en_UK "line floor-meander" [encoding convertfrom utf-8 "floor meander"] ::msgcat::mcset en_US "line floor-meander" [encoding convertfrom utf-8 "floor meander"] ::msgcat::mcset es "line floor-meander" [encoding convertfrom utf-8 "meandro"] ::msgcat::mcset fr "line floor-meander" [encoding convertfrom utf-8 "m\303\251andre au sol"] ::msgcat::mcset it "line floor-meander" [encoding convertfrom utf-8 "meandro"] ::msgcat::mcset mi "line floor-meander" [encoding convertfrom utf-8 "kopiko"] ::msgcat::mcset pl "line floor-meander" [encoding convertfrom utf-8 "meander w dnie"] ::msgcat::mcset pt "line floor-meander" [encoding convertfrom utf-8 "meandro no piso"] ::msgcat::mcset pt_BR "line floor-meander" [encoding convertfrom utf-8 "meandro no piso"] ::msgcat::mcset pt_PT "line floor-meander" [encoding convertfrom utf-8 "meandro no piso"] ::msgcat::mcset ru "line floor-meander" [encoding convertfrom utf-8 "\320\274\320\265\320\260\320\275\320\264\321\200, \320\272\320\260\320\275\320\260\320\273 \320\262 \320\277\320\276\320\273\321\203"] ::msgcat::mcset sk "line floor-meander" [encoding convertfrom utf-8 "meander v dne"] ::msgcat::mcset sq "line floor-meander" [encoding convertfrom utf-8 "rrjedhe uji gjarperore"] ::msgcat::mcset bg "line floor-step" [encoding convertfrom utf-8 "\320\277\321\200\320\260\320\263"] ::msgcat::mcset cz "line floor-step" [encoding convertfrom utf-8 "stupe\305\210"] ::msgcat::mcset de "line floor-step" [encoding convertfrom utf-8 "Bodenstufe"] ::msgcat::mcset el "line floor-step" [encoding convertfrom utf-8 "\317\203\316\272\316\261\316\273\316\277\317\200\316\254\317\204\316\271"] ::msgcat::mcset en "line floor-step" [encoding convertfrom utf-8 "floor step"] ::msgcat::mcset en_UK "line floor-step" [encoding convertfrom utf-8 "floor step"] ::msgcat::mcset en_US "line floor-step" [encoding convertfrom utf-8 "floor step"] ::msgcat::mcset es "line floor-step" [encoding convertfrom utf-8 "resalte"] ::msgcat::mcset fr "line floor-step" [encoding convertfrom utf-8 "marche"] ::msgcat::mcset it "line floor-step" [encoding convertfrom utf-8 "gradino"] ::msgcat::mcset mi "line floor-step" [encoding convertfrom utf-8 "tapuae"] ::msgcat::mcset pl "line floor-step" [encoding convertfrom utf-8 "pr\303\263g"] ::msgcat::mcset pt "line floor-step" [encoding convertfrom utf-8 "degrau"] ::msgcat::mcset pt_BR "line floor-step" [encoding convertfrom utf-8 "degrau"] ::msgcat::mcset pt_PT "line floor-step" [encoding convertfrom utf-8 "degrau"] ::msgcat::mcset ru "line floor-step" [encoding convertfrom utf-8 "\321\203\321\201\321\202\321\203\320\277 \320\277\320\276\320\273\320\260"] ::msgcat::mcset sk "line floor-step" [encoding convertfrom utf-8 "stupe\305\210"] ::msgcat::mcset sq "line floor-step" [encoding convertfrom utf-8 "shkalle ne dysheme"] ::msgcat::mcset bg "line flowstone" [encoding convertfrom utf-8 "\320\272\320\260\320\274\320\265\320\275\320\265\320\275 \320\262\320\276\320\264\320\276\320\277\320\260\320\264"] ::msgcat::mcset cz "line flowstone" [encoding convertfrom utf-8 "sintrov\303\251 n\303\241teky"] ::msgcat::mcset de "line flowstone" [encoding convertfrom utf-8 "fl\303\244chiger Sinter"] ::msgcat::mcset el "line flowstone" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\317\214 \317\205\316\273\316\271\316\272\317\214 \316\264\316\261\317\200\316\255\316\264\316\277\317\205"] ::msgcat::mcset en "line flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset en_UK "line flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset en_US "line flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset es "line flowstone" [encoding convertfrom utf-8 "concreci\303\263n"] ::msgcat::mcset fr "line flowstone" [encoding convertfrom utf-8 "concr\303\251tion"] ::msgcat::mcset it "line flowstone" [encoding convertfrom utf-8 "concrezione"] ::msgcat::mcset mi "line flowstone" [encoding convertfrom utf-8 "pari k\305\215hatu"] ::msgcat::mcset pl "line flowstone" [encoding convertfrom utf-8 "nacieki"] ::msgcat::mcset pt "line flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset pt_BR "line flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset pt_PT "line flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset ru "line flowstone" [encoding convertfrom utf-8 "\320\275\320\260\321\202\320\265\321\207\320\275\321\213\320\271 \320\272\320\260\321\201\320\272\320\260\320\264"] ::msgcat::mcset sk "line flowstone" [encoding convertfrom utf-8 "sintrov\303\251 n\303\241teky"] ::msgcat::mcset sq "line flowstone" [encoding convertfrom utf-8 "gurre-rrjedhes"] ::msgcat::mcset bg "line gradient" [encoding convertfrom utf-8 "\320\275\320\260\320\272\320\273\320\276\320\275 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "line gradient" [encoding convertfrom utf-8 "sklon chodby"] ::msgcat::mcset de "line gradient" [encoding convertfrom utf-8 "Gef\303\244lle"] ::msgcat::mcset el "line gradient" [encoding convertfrom utf-8 "\316\272\316\273\316\257\317\203\316\267 \317\203\317\204\316\277\316\254\317\202"] ::msgcat::mcset en "line gradient" [encoding convertfrom utf-8 "passage gradient"] ::msgcat::mcset en_UK "line gradient" [encoding convertfrom utf-8 "passage gradient"] ::msgcat::mcset en_US "line gradient" [encoding convertfrom utf-8 "passage gradient"] ::msgcat::mcset es "line gradient" [encoding convertfrom utf-8 "gradiente"] ::msgcat::mcset fr "line gradient" [encoding convertfrom utf-8 "pente"] ::msgcat::mcset it "line gradient" [encoding convertfrom utf-8 "scivolo"] ::msgcat::mcset mi "line gradient" [encoding convertfrom utf-8 "heke"] ::msgcat::mcset pl "line gradient" [encoding convertfrom utf-8 "nachylenie korytarza"] ::msgcat::mcset pt "line gradient" [encoding convertfrom utf-8 "declividade da galeria"] ::msgcat::mcset pt_BR "line gradient" [encoding convertfrom utf-8 "declividade da galeria"] ::msgcat::mcset pt_PT "line gradient" [encoding convertfrom utf-8 "declividade da galeria"] ::msgcat::mcset ru "line gradient" [encoding convertfrom utf-8 "\321\203\320\272\320\273\320\276\320\275 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "line gradient" [encoding convertfrom utf-8 "sklon chodby"] ::msgcat::mcset sq "line gradient" [encoding convertfrom utf-8 "pjertesia e kalimit"] ::msgcat::mcset bg "line label" [encoding convertfrom utf-8 "\320\265\321\202\320\270\320\272\320\265\321\202"] ::msgcat::mcset cz "line label" [encoding convertfrom utf-8 "pojmenov\303\241n\303\255"] ::msgcat::mcset de "line label" [encoding convertfrom utf-8 "Beschriftung"] ::msgcat::mcset el "line label" [encoding convertfrom utf-8 "\317\200\316\265\317\201\316\271\316\263\317\201\316\261\317\206\316\256"] ::msgcat::mcset en "line label" [encoding convertfrom utf-8 "label"] ::msgcat::mcset en_UK "line label" [encoding convertfrom utf-8 "label"] ::msgcat::mcset en_US "line label" [encoding convertfrom utf-8 "label"] ::msgcat::mcset es "line label" [encoding convertfrom utf-8 "etiqueta"] ::msgcat::mcset fr "line label" [encoding convertfrom utf-8 "libell\303\251"] ::msgcat::mcset it "line label" [encoding convertfrom utf-8 "etichetta"] ::msgcat::mcset mi "line label" [encoding convertfrom utf-8 "ingoa"] ::msgcat::mcset pl "line label" [encoding convertfrom utf-8 "nazwa"] ::msgcat::mcset pt "line label" [encoding convertfrom utf-8 "indica\303\247\303\243o"] ::msgcat::mcset pt_BR "line label" [encoding convertfrom utf-8 "indica\303\247\303\243o"] ::msgcat::mcset pt_PT "line label" [encoding convertfrom utf-8 "indica\303\247\303\243o"] ::msgcat::mcset ru "line label" [encoding convertfrom utf-8 "\321\202\320\265\320\272\321\201\321\202\320\276\320\262\320\260\321\217 \320\274\320\265\321\202\320\272\320\260"] ::msgcat::mcset sk "line label" [encoding convertfrom utf-8 "pomenovanie"] ::msgcat::mcset sq "line label" [encoding convertfrom utf-8 "mbishkrim"] ::msgcat::mcset bg "line map-connection" [encoding convertfrom utf-8 "\321\201\320\262\321\212\321\200\320\267\320\262\320\260\320\275\320\265 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270"] ::msgcat::mcset cz "line map-connection" [encoding convertfrom utf-8 "spojen\303\255 map"] ::msgcat::mcset de "line map-connection" [encoding convertfrom utf-8 "zusammenh\303\244ngende Pl\303\244ne"] ::msgcat::mcset el "line map-connection" [encoding convertfrom utf-8 "\316\255\316\275\317\211\317\203\316\267 \317\207\316\261\317\201\317\204\317\216\316\275"] ::msgcat::mcset en "line map-connection" [encoding convertfrom utf-8 "map connection"] ::msgcat::mcset en_UK "line map-connection" [encoding convertfrom utf-8 "map connection"] ::msgcat::mcset en_US "line map-connection" [encoding convertfrom utf-8 "map connection"] ::msgcat::mcset fr "line map-connection" [encoding convertfrom utf-8 "jonction de carte"] ::msgcat::mcset it "line map-connection" [encoding convertfrom utf-8 "riporto di mappa"] ::msgcat::mcset mi "line map-connection" [encoding convertfrom utf-8 "mahere whenua ki te hui"] ::msgcat::mcset pl "line map-connection" [encoding convertfrom utf-8 "po\305\202\304\205czenie map"] ::msgcat::mcset ru "line map-connection" [encoding convertfrom utf-8 "\320\273\320\270\320\275\320\270\321\217 \320\262\321\213\320\275\320\276\321\201\320\260"] ::msgcat::mcset sk "line map-connection" [encoding convertfrom utf-8 "prepojenie m\303\241p"] ::msgcat::mcset sq "line map-connection" [encoding convertfrom utf-8 "lidhjet ne harta"] ::msgcat::mcset bg "line moonmilk" [encoding convertfrom utf-8 "\320\277\320\265\321\211\320\265\321\200\320\275\320\276 \320\274\320\273\321\217\320\272\320\276"] ::msgcat::mcset cz "line moonmilk" [encoding convertfrom utf-8 "nickam\303\255nek"] ::msgcat::mcset de "line moonmilk" [encoding convertfrom utf-8 "Bergmilch"] ::msgcat::mcset el "line moonmilk" [encoding convertfrom utf-8 "\316\263\316\254\316\273\316\261 \317\203\317\200\316\267\316\273\316\261\316\257\316\277\317\205"] ::msgcat::mcset en "line moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset en_UK "line moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset en_US "line moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset fr "line moonmilk" [encoding convertfrom utf-8 "mondmilch"] ::msgcat::mcset it "line moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset mi "line moonmilk" [encoding convertfrom utf-8 "mirika marama"] ::msgcat::mcset pl "line moonmilk" [encoding convertfrom utf-8 "mi\304\231kkie nacieki"] ::msgcat::mcset ru "line moonmilk" [encoding convertfrom utf-8 "\320\273\321\203\320\275\320\275\320\276\320\265 \320\274\320\276\320\273\320\276\320\272\320\276"] ::msgcat::mcset sk "line moonmilk" [encoding convertfrom utf-8 "n\303\241teky m\303\244kk\303\251ho sintra"] ::msgcat::mcset sq "line moonmilk" [encoding convertfrom utf-8 "qumesht-hena"] ::msgcat::mcset bg "line overhang" [encoding convertfrom utf-8 "\321\201\320\272\320\260\320\273\320\275\320\260 \320\277\320\273\320\276\321\211\320\260\320\264\320\272\320\260"] ::msgcat::mcset cz "line overhang" [encoding convertfrom utf-8 "p\305\231evis"] ::msgcat::mcset de "line overhang" [encoding convertfrom utf-8 "\303\234berhang"] ::msgcat::mcset el "line overhang" [encoding convertfrom utf-8 "\317\200\317\201\316\277\316\255\316\272\317\204\316\261\317\203\316\267 \316\277\317\201\316\277\317\206\316\256\317\202"] ::msgcat::mcset en "line overhang" [encoding convertfrom utf-8 "overhang"] ::msgcat::mcset en_UK "line overhang" [encoding convertfrom utf-8 "overhang"] ::msgcat::mcset en_US "line overhang" [encoding convertfrom utf-8 "overhang"] ::msgcat::mcset es "line overhang" [encoding convertfrom utf-8 "extraplomo"] ::msgcat::mcset fr "line overhang" [encoding convertfrom utf-8 "surplomb"] ::msgcat::mcset it "line overhang" [encoding convertfrom utf-8 "sporgenza"] ::msgcat::mcset mi "line overhang" [encoding convertfrom utf-8 "tauwharenga"] ::msgcat::mcset pl "line overhang" [encoding convertfrom utf-8 "przewieszka"] ::msgcat::mcset pt "line overhang" [encoding convertfrom utf-8 "proje\303\247\303\243o"] ::msgcat::mcset pt_BR "line overhang" [encoding convertfrom utf-8 "proje\303\247\303\243o"] ::msgcat::mcset pt_PT "line overhang" [encoding convertfrom utf-8 "projec\303\247\303\243o"] ::msgcat::mcset ru "line overhang" [encoding convertfrom utf-8 "\320\275\320\260\320\262\320\270\321\201\320\260\320\275\320\270\320\265 \320\277\320\276\321\202\320\276\320\273\320\272\320\260"] ::msgcat::mcset sk "line overhang" [encoding convertfrom utf-8 "previs"] ::msgcat::mcset sq "line overhang" [encoding convertfrom utf-8 "varese"] ::msgcat::mcset bg "line pit" [encoding convertfrom utf-8 "\320\272\320\273\320\260\320\264\320\265\320\275\320\265\321\206"] ::msgcat::mcset cz "line pit" [encoding convertfrom utf-8 "propast"] ::msgcat::mcset de "line pit" [encoding convertfrom utf-8 "Schacht"] ::msgcat::mcset el "line pit" [encoding convertfrom utf-8 "\317\200\316\267\316\263\316\254\316\264\316\271"] ::msgcat::mcset en "line pit" [encoding convertfrom utf-8 "pitch"] ::msgcat::mcset en_UK "line pit" [encoding convertfrom utf-8 "pitch"] ::msgcat::mcset en_US "line pit" [encoding convertfrom utf-8 "pit"] ::msgcat::mcset es "line pit" [encoding convertfrom utf-8 "pozo"] ::msgcat::mcset fr "line pit" [encoding convertfrom utf-8 "puits"] ::msgcat::mcset it "line pit" [encoding convertfrom utf-8 "pozzo"] ::msgcat::mcset mi "line pit" [encoding convertfrom utf-8 "tupari"] ::msgcat::mcset pl "line pit" [encoding convertfrom utf-8 "studnia"] ::msgcat::mcset pt "line pit" [encoding convertfrom utf-8 "desn\303\255vel"] ::msgcat::mcset pt_BR "line pit" [encoding convertfrom utf-8 "desn\303\255vel"] ::msgcat::mcset pt_PT "line pit" [encoding convertfrom utf-8 "desn\303\255vel"] ::msgcat::mcset ru "line pit" [encoding convertfrom utf-8 "\320\272\320\276\320\273\320\276\320\264\320\265\321\206"] ::msgcat::mcset sk "line pit" [encoding convertfrom utf-8 "priepas\305\245"] ::msgcat::mcset sq "line pit" [encoding convertfrom utf-8 "ngjitje"] ::msgcat::mcset bg "line rock-border" [encoding convertfrom utf-8 "\320\262\321\212\320\275\321\210\320\265\320\275 \321\200\321\212\320\261 \320\275\320\260 \320\272\320\260\320\274\321\212\320\272"] ::msgcat::mcset cz "line rock-border" [encoding convertfrom utf-8 "kameny"] ::msgcat::mcset de "line rock-border" [encoding convertfrom utf-8 "Umriss eines Felsens"] ::msgcat::mcset el "line rock-border" [encoding convertfrom utf-8 "\317\200\316\265\317\201\316\257\316\263\317\201\316\261\316\274\316\274\316\261 \316\262\317\201\316\254\317\207\316\277\317\205"] ::msgcat::mcset en "line rock-border" [encoding convertfrom utf-8 "rock border"] ::msgcat::mcset en_UK "line rock-border" [encoding convertfrom utf-8 "rock border"] ::msgcat::mcset en_US "line rock-border" [encoding convertfrom utf-8 "rock border"] ::msgcat::mcset es "line rock-border" [encoding convertfrom utf-8 "contorno bloque"] ::msgcat::mcset fr "line rock-border" [encoding convertfrom utf-8 "bord d\342\200\231un rocher"] ::msgcat::mcset it "line rock-border" [encoding convertfrom utf-8 "bordo masso"] ::msgcat::mcset mi "line rock-border" [encoding convertfrom utf-8 "rohe k\305\215hatu"] ::msgcat::mcset pl "line rock-border" [encoding convertfrom utf-8 "obrys kamienia"] ::msgcat::mcset pt "line rock-border" [encoding convertfrom utf-8 "lateral da rocha"] ::msgcat::mcset pt_BR "line rock-border" [encoding convertfrom utf-8 "lateral da rocha"] ::msgcat::mcset pt_PT "line rock-border" [encoding convertfrom utf-8 "lateral da rocha"] ::msgcat::mcset ru "line rock-border" [encoding convertfrom utf-8 "\320\262\320\275\320\265\321\210\320\275\320\270\320\271 \320\272\321\200\320\276\320\274\320\272\320\260 \320\263\320\273\321\213\320\261\321\213"] ::msgcat::mcset sk "line rock-border" [encoding convertfrom utf-8 "obrys kame\305\210a"] ::msgcat::mcset sq "line rock-border" [encoding convertfrom utf-8 "kufij shkembinjsh"] ::msgcat::mcset bg "line rock-edge" [encoding convertfrom utf-8 "\320\262\321\212\321\202\321\200\320\265\321\210\320\265\320\275 \321\200\321\212\320\261 \320\275\320\260 \320\272\320\260\320\274\321\212\320\272"] ::msgcat::mcset cz "line rock-edge" [encoding convertfrom utf-8 "hrany kamen\305\257"] ::msgcat::mcset de "line rock-edge" [encoding convertfrom utf-8 "Struktur eines Felsens"] ::msgcat::mcset el "line rock-edge" [encoding convertfrom utf-8 "\316\254\316\272\317\201\316\267 \316\262\317\201\316\254\317\207\316\277\317\205"] ::msgcat::mcset en "line rock-edge" [encoding convertfrom utf-8 "rock edges"] ::msgcat::mcset en_UK "line rock-edge" [encoding convertfrom utf-8 "rock edges"] ::msgcat::mcset en_US "line rock-edge" [encoding convertfrom utf-8 "rock edges"] ::msgcat::mcset es "line rock-edge" [encoding convertfrom utf-8 "arista bloque"] ::msgcat::mcset fr "line rock-edge" [encoding convertfrom utf-8 "ar\303\252te d\342\200\231un rocher"] ::msgcat::mcset it "line rock-edge" [encoding convertfrom utf-8 "spigolo masso"] ::msgcat::mcset mi "line rock-edge" [encoding convertfrom utf-8 "mata kohatu"] ::msgcat::mcset pl "line rock-edge" [encoding convertfrom utf-8 "kraw\304\231dzie kamienia"] ::msgcat::mcset pt "line rock-edge" [encoding convertfrom utf-8 "bordas da rocha"] ::msgcat::mcset pt_BR "line rock-edge" [encoding convertfrom utf-8 "bordas da rocha"] ::msgcat::mcset pt_PT "line rock-edge" [encoding convertfrom utf-8 "bordas da rocha"] ::msgcat::mcset ru "line rock-edge" [encoding convertfrom utf-8 "\320\262\320\275\321\203\321\202\321\200\320\265\320\275\320\275\321\217\321\217 \320\272\321\200\320\276\320\274\320\272\320\260 \320\263\320\273\321\213\320\261\321\213"] ::msgcat::mcset sk "line rock-edge" [encoding convertfrom utf-8 "hrany kame\305\210a"] ::msgcat::mcset sq "line rock-edge" [encoding convertfrom utf-8 "skaji I shkembit"] ::msgcat::mcset bg "line section" [encoding convertfrom utf-8 "\320\275\320\260\320\277\321\200\320\265\321\207\320\275\320\276 \321\201\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "line section" [encoding convertfrom utf-8 "p\305\231\303\255\304\215n\303\275 \305\231ez"] ::msgcat::mcset de "line section" [encoding convertfrom utf-8 "Schnittlinie"] ::msgcat::mcset el "line section" [encoding convertfrom utf-8 "\317\204\316\277\316\274\316\256"] ::msgcat::mcset en "line section" [encoding convertfrom utf-8 "cross-section"] ::msgcat::mcset en_UK "line section" [encoding convertfrom utf-8 "cross-section"] ::msgcat::mcset en_US "line section" [encoding convertfrom utf-8 "cross-section"] ::msgcat::mcset es "line section" [encoding convertfrom utf-8 "secci\303\263n"] ::msgcat::mcset fr "line section" [encoding convertfrom utf-8 "section"] ::msgcat::mcset it "line section" [encoding convertfrom utf-8 "sezione trasversale"] ::msgcat::mcset mi "line section" [encoding convertfrom utf-8 "taha papahanga"] ::msgcat::mcset pl "line section" [encoding convertfrom utf-8 "przekr\303\263j"] ::msgcat::mcset pt "line section" [encoding convertfrom utf-8 "corte"] ::msgcat::mcset pt_BR "line section" [encoding convertfrom utf-8 "corte"] ::msgcat::mcset pt_PT "line section" [encoding convertfrom utf-8 "corte"] ::msgcat::mcset ru "line section" [encoding convertfrom utf-8 "\320\262\321\213\320\275\320\276\321\201\320\275\320\260\321\217 \320\273\320\270\320\275\320\270\321\217 \321\201\320\265\321\207\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "line section" [encoding convertfrom utf-8 "prie\304\215ny rez"] ::msgcat::mcset sq "line section" [encoding convertfrom utf-8 "kryq-ndarje"] ::msgcat::mcset bg "line slope" [encoding convertfrom utf-8 "\321\201\320\272\320\273\320\276\320\275"] ::msgcat::mcset cz "line slope" [encoding convertfrom utf-8 "svah"] ::msgcat::mcset de "line slope" [encoding convertfrom utf-8 "Hangform"] ::msgcat::mcset el "line slope" [encoding convertfrom utf-8 "\316\272\316\273\316\257\317\203\316\267"] ::msgcat::mcset en "line slope" [encoding convertfrom utf-8 "slope"] ::msgcat::mcset en_UK "line slope" [encoding convertfrom utf-8 "slope"] ::msgcat::mcset en_US "line slope" [encoding convertfrom utf-8 "slope"] ::msgcat::mcset es "line slope" [encoding convertfrom utf-8 "pendiente"] ::msgcat::mcset fr "line slope" [encoding convertfrom utf-8 "pente"] ::msgcat::mcset it "line slope" [encoding convertfrom utf-8 "scivolo"] ::msgcat::mcset mi "line slope" [encoding convertfrom utf-8 "tupari"] ::msgcat::mcset pl "line slope" [encoding convertfrom utf-8 "pochy\305\202a powierzchnia"] ::msgcat::mcset pt "line slope" [encoding convertfrom utf-8 "declive"] ::msgcat::mcset pt_BR "line slope" [encoding convertfrom utf-8 "declive"] ::msgcat::mcset pt_PT "line slope" [encoding convertfrom utf-8 "declive"] ::msgcat::mcset ru "line slope" [encoding convertfrom utf-8 "\321\201\320\272\320\273\320\276\320\275"] ::msgcat::mcset sk "line slope" [encoding convertfrom utf-8 "\305\241ikm\303\241 plocha"] ::msgcat::mcset sq "line slope" [encoding convertfrom utf-8 "breg"] ::msgcat::mcset bg "line survey" [encoding convertfrom utf-8 "\320\260\320\275\321\202\320\265\320\275\320\260"] ::msgcat::mcset cz "line survey" [encoding convertfrom utf-8 "polygonov\303\275 tah"] ::msgcat::mcset de "line survey" [encoding convertfrom utf-8 "Messzug"] ::msgcat::mcset el "line survey" [encoding convertfrom utf-8 "\316\263\317\201\316\261\316\274\316\274\316\256 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "line survey" [encoding convertfrom utf-8 "survey lines"] ::msgcat::mcset en_UK "line survey" [encoding convertfrom utf-8 "survey lines"] ::msgcat::mcset en_US "line survey" [encoding convertfrom utf-8 "survey lines"] ::msgcat::mcset es "line survey" [encoding convertfrom utf-8 "poligonal"] ::msgcat::mcset fr "line survey" [encoding convertfrom utf-8 "vis\303\251e topo"] ::msgcat::mcset it "line survey" [encoding convertfrom utf-8 "poligonale"] ::msgcat::mcset mi "line survey" [encoding convertfrom utf-8 "ruri r\304\201rangi"] ::msgcat::mcset pl "line survey" [encoding convertfrom utf-8 "ci\304\205g pomiarowy"] ::msgcat::mcset pt "line survey" [encoding convertfrom utf-8 "linha de topografia"] ::msgcat::mcset pt_BR "line survey" [encoding convertfrom utf-8 "linha de topografia"] ::msgcat::mcset pt_PT "line survey" [encoding convertfrom utf-8 "linha de topografia"] ::msgcat::mcset ru "line survey" [encoding convertfrom utf-8 "\320\275\320\270\321\202\320\272\320\260 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "line survey" [encoding convertfrom utf-8 "polyg\303\263nov\303\275 \305\245ah"] ::msgcat::mcset sq "line survey" [encoding convertfrom utf-8 "vijat matese-vrojtuese"] ::msgcat::mcset bg "line wall" [encoding convertfrom utf-8 "\321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset cz "line wall" [encoding convertfrom utf-8 "st\304\233na"] ::msgcat::mcset de "line wall" [encoding convertfrom utf-8 "Wand"] ::msgcat::mcset el "line wall" [encoding convertfrom utf-8 "\317\204\316\277\316\257\317\207\316\277\317\202"] ::msgcat::mcset en "line wall" [encoding convertfrom utf-8 "wall"] ::msgcat::mcset en_UK "line wall" [encoding convertfrom utf-8 "wall"] ::msgcat::mcset en_US "line wall" [encoding convertfrom utf-8 "wall"] ::msgcat::mcset es "line wall" [encoding convertfrom utf-8 "pared"] ::msgcat::mcset fr "line wall" [encoding convertfrom utf-8 "mur"] ::msgcat::mcset it "line wall" [encoding convertfrom utf-8 "parete"] ::msgcat::mcset mi "line wall" [encoding convertfrom utf-8 "tar\304\201"] ::msgcat::mcset pl "line wall" [encoding convertfrom utf-8 "\305\233ciana"] ::msgcat::mcset pt "line wall" [encoding convertfrom utf-8 "parede"] ::msgcat::mcset pt_BR "line wall" [encoding convertfrom utf-8 "parede"] ::msgcat::mcset pt_PT "line wall" [encoding convertfrom utf-8 "parede"] ::msgcat::mcset ru "line wall" [encoding convertfrom utf-8 "\321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset sk "line wall" [encoding convertfrom utf-8 "stena"] ::msgcat::mcset sq "line wall" [encoding convertfrom utf-8 "muri"] ::msgcat::mcset bg "line wall:bedrock" [encoding convertfrom utf-8 "\321\201\321\202\320\265\320\275\320\260 (\320\276\321\201\320\275\320\276\320\262\320\275\320\260 \321\201\320\272\320\260\320\273\320\260)"] ::msgcat::mcset cz "line wall:bedrock" [encoding convertfrom utf-8 "st\304\233na"] ::msgcat::mcset de "line wall:bedrock" [encoding convertfrom utf-8 "Wand zum Deckgebirge"] ::msgcat::mcset el "line wall:bedrock" [encoding convertfrom utf-8 "\317\204\316\277\316\257\317\207\316\277\317\202"] ::msgcat::mcset en "line wall:bedrock" [encoding convertfrom utf-8 "wall"] ::msgcat::mcset en_UK "line wall:bedrock" [encoding convertfrom utf-8 "wall"] ::msgcat::mcset en_US "line wall:bedrock" [encoding convertfrom utf-8 "wall"] ::msgcat::mcset es "line wall:bedrock" [encoding convertfrom utf-8 "pared"] ::msgcat::mcset fr "line wall:bedrock" [encoding convertfrom utf-8 "mur"] ::msgcat::mcset it "line wall:bedrock" [encoding convertfrom utf-8 "roccia"] ::msgcat::mcset mi "line wall:bedrock" [encoding convertfrom utf-8 "tar\304\201"] ::msgcat::mcset pl "line wall:bedrock" [encoding convertfrom utf-8 "\305\233ciana"] ::msgcat::mcset pt "line wall:bedrock" [encoding convertfrom utf-8 "parede"] ::msgcat::mcset pt_BR "line wall:bedrock" [encoding convertfrom utf-8 "parede"] ::msgcat::mcset pt_PT "line wall:bedrock" [encoding convertfrom utf-8 "parede"] ::msgcat::mcset ru "line wall:bedrock" [encoding convertfrom utf-8 "\321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset sk "line wall:bedrock" [encoding convertfrom utf-8 "stena"] ::msgcat::mcset sq "line wall:bedrock" [encoding convertfrom utf-8 "shkembi-muri"] ::msgcat::mcset bg "line wall:blocks" [encoding convertfrom utf-8 "\321\201\321\202\320\265\320\275\320\260 - \320\261\320\273\320\276\320\272\320\260\320\266"] ::msgcat::mcset cz "line wall:blocks" [encoding convertfrom utf-8 "z\303\241val"] ::msgcat::mcset de "line wall:blocks" [encoding convertfrom utf-8 "Wand aus Versturz"] ::msgcat::mcset el "line wall:blocks" [encoding convertfrom utf-8 "\316\277\316\263\316\272\317\214\316\273\316\271\316\270\316\277\316\271"] ::msgcat::mcset en "line wall:blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset en_UK "line wall:blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset en_US "line wall:blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset es "line wall:blocks" [encoding convertfrom utf-8 "bloques"] ::msgcat::mcset fr "line wall:blocks" [encoding convertfrom utf-8 "effrondrement"] ::msgcat::mcset it "line wall:blocks" [encoding convertfrom utf-8 "massi"] ::msgcat::mcset mi "line wall:blocks" [encoding convertfrom utf-8 "pakaru"] ::msgcat::mcset pl "line wall:blocks" [encoding convertfrom utf-8 "\305\233ciana utworzona przez zawalisko"] ::msgcat::mcset pt "line wall:blocks" [encoding convertfrom utf-8 "desmoronamento"] ::msgcat::mcset pt_BR "line wall:blocks" [encoding convertfrom utf-8 "desmoronamento"] ::msgcat::mcset pt_PT "line wall:blocks" [encoding convertfrom utf-8 "desmoronamento"] ::msgcat::mcset ru "line wall:blocks" [encoding convertfrom utf-8 "\320\263\320\273\321\213\320\261\321\213"] ::msgcat::mcset sk "line wall:blocks" [encoding convertfrom utf-8 "stena tvoren\303\241 z\303\241valom"] ::msgcat::mcset sq "line wall:blocks" [encoding convertfrom utf-8 "blloqe"] ::msgcat::mcset bg "line wall:clay" [encoding convertfrom utf-8 "\320\263\320\273\320\270\320\275\320\260"] ::msgcat::mcset cz "line wall:clay" [encoding convertfrom utf-8 "bahno"] ::msgcat::mcset de "line wall:clay" [encoding convertfrom utf-8 "Wand aus Lehm"] ::msgcat::mcset el "line wall:clay" [encoding convertfrom utf-8 "\316\254\317\201\316\263\316\271\316\273\316\277\317\202"] ::msgcat::mcset en "line wall:clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset en_UK "line wall:clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset en_US "line wall:clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset es "line wall:clay" [encoding convertfrom utf-8 "arcilla"] ::msgcat::mcset fr "line wall:clay" [encoding convertfrom utf-8 "argile"] ::msgcat::mcset it "line wall:clay" [encoding convertfrom utf-8 "argilla"] ::msgcat::mcset mi "line wall:clay" [encoding convertfrom utf-8 "oneuku"] ::msgcat::mcset pl "line wall:clay" [encoding convertfrom utf-8 "\305\233ciana z gliny"] ::msgcat::mcset pt "line wall:clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset pt_BR "line wall:clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset pt_PT "line wall:clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset ru "line wall:clay" [encoding convertfrom utf-8 "\320\263\320\273\320\270\320\275\320\260"] ::msgcat::mcset sk "line wall:clay" [encoding convertfrom utf-8 "stena tvoren\303\241 \303\255lom"] ::msgcat::mcset sq "line wall:clay" [encoding convertfrom utf-8 "argjil"] ::msgcat::mcset bg "line wall:debris" [encoding convertfrom utf-8 "\321\207\320\260\320\272\321\212\320\273"] ::msgcat::mcset cz "line wall:debris" [encoding convertfrom utf-8 "\305\241t\304\233rk"] ::msgcat::mcset de "line wall:debris" [encoding convertfrom utf-8 "Wand aus Schutt"] ::msgcat::mcset el "line wall:debris" [encoding convertfrom utf-8 "\317\207\316\261\316\273\316\254\317\203\316\274\316\261\317\204\316\261"] ::msgcat::mcset en "line wall:debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset en_UK "line wall:debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset en_US "line wall:debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset es "line wall:debris" [encoding convertfrom utf-8 "derrubios"] ::msgcat::mcset fr "line wall:debris" [encoding convertfrom utf-8 "d\303\251bris de roche"] ::msgcat::mcset it "line wall:debris" [encoding convertfrom utf-8 "detriti"] ::msgcat::mcset mi "line wall:debris" [encoding convertfrom utf-8 "otaota"] ::msgcat::mcset pl "line wall:debris" [encoding convertfrom utf-8 "\305\233ciana utworzona przez \305\274wir"] ::msgcat::mcset pt "line wall:debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset pt_BR "line wall:debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset pt_PT "line wall:debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset ru "line wall:debris" [encoding convertfrom utf-8 "\321\211\320\265\320\261\320\265\320\275\321\214"] ::msgcat::mcset sk "line wall:debris" [encoding convertfrom utf-8 "stena tvoren\303\241 su\305\245ou"] ::msgcat::mcset sq "line wall:debris" [encoding convertfrom utf-8 "depozitime/mbetje gurresh"] ::msgcat::mcset de "line wall:flowstone" [encoding convertfrom utf-8 "Wand aus Sinter"] ::msgcat::mcset en "line wall:flowstone" [encoding convertfrom utf-8 "flowstone wall"] ::msgcat::mcset en_UK "line wall:flowstone" [encoding convertfrom utf-8 "flowstone wall"] ::msgcat::mcset en_US "line wall:flowstone" [encoding convertfrom utf-8 "flowstone wall"] ::msgcat::mcset it "line wall:flowstone" [encoding convertfrom utf-8 "colata"] ::msgcat::mcset mi "line wall:flowstone" [encoding convertfrom utf-8 "t\304\201ra a pari k\305\215hatu"] ::msgcat::mcset pl "line wall:flowstone" [encoding convertfrom utf-8 "\305\233ciana z naciek\303\263w"] ::msgcat::mcset sk "line wall:flowstone" [encoding convertfrom utf-8 "stena tvoren\303\241 sintrom"] ::msgcat::mcset bg "line wall:ice" [encoding convertfrom utf-8 "\320\273\320\265\320\264/\321\204\320\270\321\200\320\275"] ::msgcat::mcset cz "line wall:ice" [encoding convertfrom utf-8 "led"] ::msgcat::mcset de "line wall:ice" [encoding convertfrom utf-8 "Wand aus Eis"] ::msgcat::mcset el "line wall:ice" [encoding convertfrom utf-8 "\317\200\316\254\316\263\316\277\317\202"] ::msgcat::mcset en "line wall:ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset en_UK "line wall:ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset en_US "line wall:ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset es "line wall:ice" [encoding convertfrom utf-8 "hielo"] ::msgcat::mcset fr "line wall:ice" [encoding convertfrom utf-8 "glace"] ::msgcat::mcset it "line wall:ice" [encoding convertfrom utf-8 "ghiaccio"] ::msgcat::mcset mi "line wall:ice" [encoding convertfrom utf-8 "k\305\215paka"] ::msgcat::mcset pl "line wall:ice" [encoding convertfrom utf-8 "\305\233ciana z lodu"] ::msgcat::mcset pt "line wall:ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset pt_BR "line wall:ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset pt_PT "line wall:ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset ru "line wall:ice" [encoding convertfrom utf-8 "\320\273\320\265\320\264, \321\204\320\270\321\200\320\275"] ::msgcat::mcset sk "line wall:ice" [encoding convertfrom utf-8 "stena tvoren\303\241 \304\276adom"] ::msgcat::mcset sq "line wall:ice" [encoding convertfrom utf-8 "akull"] ::msgcat::mcset de "line wall:moonmilk" [encoding convertfrom utf-8 "Wand aus Bergmilch"] ::msgcat::mcset en "line wall:moonmilk" [encoding convertfrom utf-8 "moonmilk wall"] ::msgcat::mcset en_UK "line wall:moonmilk" [encoding convertfrom utf-8 "moonmilk wall"] ::msgcat::mcset en_US "line wall:moonmilk" [encoding convertfrom utf-8 "moonmilk wall"] ::msgcat::mcset it "line wall:moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset mi "line wall:moonmilk" [encoding convertfrom utf-8 "t\304\201ra a mirika marama"] ::msgcat::mcset pl "line wall:moonmilk" [encoding convertfrom utf-8 "\305\233ciana z mi\304\231kkich naciek\303\263w"] ::msgcat::mcset sk "line wall:moonmilk" [encoding convertfrom utf-8 "stena tvoren\303\241 m\303\244kk\303\275m sintrom"] ::msgcat::mcset de "line wall:overlying" [encoding convertfrom utf-8 "\303\274berlagerter Wandverlauf"] ::msgcat::mcset en "line wall:overlying" [encoding convertfrom utf-8 "overlying wall"] ::msgcat::mcset en_UK "line wall:overlying" [encoding convertfrom utf-8 "overlying wall"] ::msgcat::mcset en_US "line wall:overlying" [encoding convertfrom utf-8 "overlying wall"] ::msgcat::mcset it "line wall:overlying" [encoding convertfrom utf-8 "parete:sovrastante"] ::msgcat::mcset mi "line wall:overlying" [encoding convertfrom utf-8 "t\304\201ra ki runga"] ::msgcat::mcset pl "line wall:overlying" [encoding convertfrom utf-8 "\305\233ciana po\305\202o\305\274ona wy\305\274ej"] ::msgcat::mcset sk "line wall:overlying" [encoding convertfrom utf-8 "stena vy\305\241\305\241ej \303\272rovne"] ::msgcat::mcset bg "line wall:pebbles" [encoding convertfrom utf-8 "\320\272\320\260\320\274\321\212\321\207\320\265\321\202\320\260"] ::msgcat::mcset cz "line wall:pebbles" [encoding convertfrom utf-8 "valouny"] ::msgcat::mcset de "line wall:pebbles" [encoding convertfrom utf-8 "Wand aus Kies"] ::msgcat::mcset el "line wall:pebbles" [encoding convertfrom utf-8 "\317\207\316\261\316\273\316\257\316\272\316\271\316\261"] ::msgcat::mcset en "line wall:pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset en_UK "line wall:pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset en_US "line wall:pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset es "line wall:pebbles" [encoding convertfrom utf-8 "cantos rodados"] ::msgcat::mcset fr "line wall:pebbles" [encoding convertfrom utf-8 "cailloux"] ::msgcat::mcset it "line wall:pebbles" [encoding convertfrom utf-8 "ciotoli"] ::msgcat::mcset mi "line wall:pebbles" [encoding convertfrom utf-8 "nga k\305\215hatu iti"] ::msgcat::mcset pl "line wall:pebbles" [encoding convertfrom utf-8 "\305\233ciana utworzona przez okr\304\231glaki"] ::msgcat::mcset pt "line wall:pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset pt_BR "line wall:pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset pt_PT "line wall:pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset ru "line wall:pebbles" [encoding convertfrom utf-8 "\320\263\320\260\320\273\321\214\320\272\320\260"] ::msgcat::mcset sk "line wall:pebbles" [encoding convertfrom utf-8 "stena tvoren\303\241 okruhliakmi"] ::msgcat::mcset sq "line wall:pebbles" [encoding convertfrom utf-8 "gurralece"] ::msgcat::mcset de "line wall:pit" [encoding convertfrom utf-8 "Eingangsschacht"] ::msgcat::mcset en "line wall:pit" [encoding convertfrom utf-8 "entrance pit"] ::msgcat::mcset en_UK "line wall:pit" [encoding convertfrom utf-8 "entrance pit"] ::msgcat::mcset en_US "line wall:pit" [encoding convertfrom utf-8 "entrance pit"] ::msgcat::mcset it "line wall:pit" [encoding convertfrom utf-8 "parete:pozzo"] ::msgcat::mcset mi "line wall:pit" [encoding convertfrom utf-8 "rua"] ::msgcat::mcset pl "line wall:pit" [encoding convertfrom utf-8 "studnia wst\304\231pna"] ::msgcat::mcset sk "line wall:pit" [encoding convertfrom utf-8 "vstupn\303\241 priepas\305\245"] ::msgcat::mcset bg "line wall:presumed" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\260\320\263\320\260\320\265\320\274\320\260 \321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset cz "line wall:presumed" [encoding convertfrom utf-8 "p\305\231edpokl\303\241dan\303\241 st\304\233na"] ::msgcat::mcset de "line wall:presumed" [encoding convertfrom utf-8 "Wand gesch\303\244tzt"] ::msgcat::mcset el "line wall:presumed" [encoding convertfrom utf-8 "\317\204\316\277\316\257\317\207\316\277\317\202 \317\205\317\200\316\277\316\270\316\265\317\204\316\271\316\272\317\214\317\202"] ::msgcat::mcset en "line wall:presumed" [encoding convertfrom utf-8 "presumed wall"] ::msgcat::mcset en_UK "line wall:presumed" [encoding convertfrom utf-8 "presumed wall"] ::msgcat::mcset en_US "line wall:presumed" [encoding convertfrom utf-8 "presumed wall"] ::msgcat::mcset es "line wall:presumed" [encoding convertfrom utf-8 "pared supuesta"] ::msgcat::mcset fr "line wall:presumed" [encoding convertfrom utf-8 "mur suppos\303\251"] ::msgcat::mcset it "line wall:presumed" [encoding convertfrom utf-8 "parete:presunta"] ::msgcat::mcset mi "line wall:presumed" [encoding convertfrom utf-8 "t\304\201ra whakaaro"] ::msgcat::mcset pl "line wall:presumed" [encoding convertfrom utf-8 "niewidoczna \305\233ciana"] ::msgcat::mcset pt "line wall:presumed" [encoding convertfrom utf-8 "parede presumida"] ::msgcat::mcset pt_BR "line wall:presumed" [encoding convertfrom utf-8 "parede presumida"] ::msgcat::mcset pt_PT "line wall:presumed" [encoding convertfrom utf-8 "parede presumida"] ::msgcat::mcset ru "line wall:presumed" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\276\320\263\320\260\320\265\320\274\320\260\321\217 \321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset sk "line wall:presumed" [encoding convertfrom utf-8 "predpokladan\303\241 stena"] ::msgcat::mcset sq "line wall:presumed" [encoding convertfrom utf-8 "muri I supozuar"] ::msgcat::mcset bg "line wall:sand" [encoding convertfrom utf-8 "\320\277\321\217\321\201\321\212\320\272"] ::msgcat::mcset cz "line wall:sand" [encoding convertfrom utf-8 "p\303\255sek"] ::msgcat::mcset de "line wall:sand" [encoding convertfrom utf-8 "Wand aus Sand"] ::msgcat::mcset el "line wall:sand" [encoding convertfrom utf-8 "\316\254\316\274\316\274\316\277\317\202"] ::msgcat::mcset en "line wall:sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset en_UK "line wall:sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset en_US "line wall:sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset es "line wall:sand" [encoding convertfrom utf-8 "arena"] ::msgcat::mcset fr "line wall:sand" [encoding convertfrom utf-8 "sable"] ::msgcat::mcset it "line wall:sand" [encoding convertfrom utf-8 "sabbia"] ::msgcat::mcset mi "line wall:sand" [encoding convertfrom utf-8 "onep\305\253"] ::msgcat::mcset pl "line wall:sand" [encoding convertfrom utf-8 "\305\233ciana utworzona przez piasek"] ::msgcat::mcset pt "line wall:sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset pt_BR "line wall:sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset pt_PT "line wall:sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset ru "line wall:sand" [encoding convertfrom utf-8 "\320\277\320\265\321\201\320\276\320\272"] ::msgcat::mcset sk "line wall:sand" [encoding convertfrom utf-8 "stena tvoren\303\241 pieskom"] ::msgcat::mcset sq "line wall:sand" [encoding convertfrom utf-8 "rane"] ::msgcat::mcset bg "line wall:underlying" [encoding convertfrom utf-8 "\320\277\320\276-\320\275\320\270\321\201\320\272\320\276 \321\200\320\260\320\267\320\277\320\276\320\273\320\276\320\266\320\265\320\275\320\260 \321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset cz "line wall:underlying" [encoding convertfrom utf-8 "st\304\233na ni\305\276\305\241\303\255 \303\272rovn\304\233"] ::msgcat::mcset de "line wall:underlying" [encoding convertfrom utf-8 "Wand unterlagernder Gang"] ::msgcat::mcset el "line wall:underlying" [encoding convertfrom utf-8 "\317\205\317\200\316\277\316\272\316\265\316\257\316\274\316\265\316\275\316\277\317\202 \317\204\316\277\316\257\317\207\316\277\317\202"] ::msgcat::mcset en "line wall:underlying" [encoding convertfrom utf-8 "underlying wall"] ::msgcat::mcset en_UK "line wall:underlying" [encoding convertfrom utf-8 "underlying wall"] ::msgcat::mcset en_US "line wall:underlying" [encoding convertfrom utf-8 "underlying wall"] ::msgcat::mcset es "line wall:underlying" [encoding convertfrom utf-8 "pared subyacente"] ::msgcat::mcset fr "line wall:underlying" [encoding convertfrom utf-8 "mur sousjacent"] ::msgcat::mcset it "line wall:underlying" [encoding convertfrom utf-8 "parete:sottostante"] ::msgcat::mcset mi "line wall:underlying" [encoding convertfrom utf-8 "t\304\201ra ki raro"] ::msgcat::mcset pl "line wall:underlying" [encoding convertfrom utf-8 "\305\233ciana po\305\202o\305\274ona ni\305\274ej"] ::msgcat::mcset pt "line wall:underlying" [encoding convertfrom utf-8 "parede subjacente"] ::msgcat::mcset pt_BR "line wall:underlying" [encoding convertfrom utf-8 "parede subjacente"] ::msgcat::mcset pt_PT "line wall:underlying" [encoding convertfrom utf-8 "parede subjacente"] ::msgcat::mcset ru "line wall:underlying" [encoding convertfrom utf-8 "\320\275\320\270\320\266\320\265\321\200\320\260\321\201\320\277\320\276\320\273\320\276\320\266\320\265\320\275\320\275\320\260\321\217 \321\201\321\202\320\265\320\275\320\260"] ::msgcat::mcset sk "line wall:underlying" [encoding convertfrom utf-8 "stena ni\305\276\305\241ej \303\272rovne"] ::msgcat::mcset sq "line wall:underlying" [encoding convertfrom utf-8 "muri I shtrire"] ::msgcat::mcset bg "line wall:unsurveyed" [encoding convertfrom utf-8 "\320\276\320\272\320\276\320\274\320\265\321\200\320\275\320\260 \321\201\320\272\320\270\321\206\320\260 \320\275\320\260 \321\201\321\202\320\265\320\275\320\270\321\202\320\265"] ::msgcat::mcset cz "line wall:unsurveyed" [encoding convertfrom utf-8 "nezam\304\233\305\231en\303\241 st\304\233na"] ::msgcat::mcset de "line wall:unsurveyed" [encoding convertfrom utf-8 "Wand unvermessen"] ::msgcat::mcset el "line wall:unsurveyed" [encoding convertfrom utf-8 "\317\204\316\277\316\257\317\207\316\277\317\202 (\316\274\316\267 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\261\317\206\316\267\316\274\316\255\316\275\316\277\317\202)"] ::msgcat::mcset en "line wall:unsurveyed" [encoding convertfrom utf-8 "unsurveyed wall"] ::msgcat::mcset en_UK "line wall:unsurveyed" [encoding convertfrom utf-8 "unsurveyed wall"] ::msgcat::mcset en_US "line wall:unsurveyed" [encoding convertfrom utf-8 "unsurveyed wall"] ::msgcat::mcset es "line wall:unsurveyed" [encoding convertfrom utf-8 "pared no topografiada"] ::msgcat::mcset fr "line wall:unsurveyed" [encoding convertfrom utf-8 "mur non topographi\303\251"] ::msgcat::mcset it "line wall:unsurveyed" [encoding convertfrom utf-8 "parete:stimata"] ::msgcat::mcset mi "line wall:unsurveyed" [encoding convertfrom utf-8 "ka r\305\253ri t\304\201ra"] ::msgcat::mcset pl "line wall:unsurveyed" [encoding convertfrom utf-8 "\305\233ciana nie pomierzona"] ::msgcat::mcset pt "line wall:unsurveyed" [encoding convertfrom utf-8 "parede n\303\243o-topografada"] ::msgcat::mcset pt_BR "line wall:unsurveyed" [encoding convertfrom utf-8 "parede n\303\243o-topografada"] ::msgcat::mcset pt_PT "line wall:unsurveyed" [encoding convertfrom utf-8 "parede n\303\243o-topografada"] ::msgcat::mcset ru "line wall:unsurveyed" [encoding convertfrom utf-8 "\320\263\320\273\320\260\320\267\320\276\320\274\320\265\321\200\320\275\320\260\321\217 \321\201\321\212\320\265\320\274\320\272\320\260 \321\201\321\202\320\265\320\275"] ::msgcat::mcset sk "line wall:unsurveyed" [encoding convertfrom utf-8 "nezameran\303\241 stena"] ::msgcat::mcset sq "line wall:unsurveyed" [encoding convertfrom utf-8 "muri I pamatur"] ::msgcat::mcset bg "line water-flow" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "line water-flow" [encoding convertfrom utf-8 "vodn\303\255 tok"] ::msgcat::mcset de "line water-flow" [encoding convertfrom utf-8 "Gerinne"] ::msgcat::mcset el "line water-flow" [encoding convertfrom utf-8 "\317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "line water-flow" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_UK "line water-flow" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_US "line water-flow" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset es "line water-flow" [encoding convertfrom utf-8 "curso agua"] ::msgcat::mcset fr "line water-flow" [encoding convertfrom utf-8 "rivi\303\250re"] ::msgcat::mcset it "line water-flow" [encoding convertfrom utf-8 "corso d'acqua"] ::msgcat::mcset mi "line water-flow" [encoding convertfrom utf-8 "wairere"] ::msgcat::mcset pl "line water-flow" [encoding convertfrom utf-8 "ciek wodny"] ::msgcat::mcset pt "line water-flow" [encoding convertfrom utf-8 "fluxo de \303\241gua"] ::msgcat::mcset pt_BR "line water-flow" [encoding convertfrom utf-8 "fluxo de \303\241gua"] ::msgcat::mcset pt_PT "line water-flow" [encoding convertfrom utf-8 "fluxo de \303\241gua"] ::msgcat::mcset ru "line water-flow" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "line water-flow" [encoding convertfrom utf-8 "vodn\303\275 tok"] ::msgcat::mcset sq "line water-flow" [encoding convertfrom utf-8 "rrjedhe uji"] ::msgcat::mcset bg "line water-flow:conjectural" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\260\320\263\320\260\320\265\320\274\320\276 \320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "line water-flow:conjectural" [encoding convertfrom utf-8 "p\305\231edpokl\303\241dan\303\275 vodn\303\255 tok"] ::msgcat::mcset de "line water-flow:conjectural" [encoding convertfrom utf-8 "vermutetes Gerinne"] ::msgcat::mcset el "line water-flow:conjectural" [encoding convertfrom utf-8 "\317\205\317\200\316\277\317\204\316\271\316\270\316\255\316\274\316\265\316\275\316\267 \317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "line water-flow:conjectural" [encoding convertfrom utf-8 "conjectural water flow"] ::msgcat::mcset en_UK "line water-flow:conjectural" [encoding convertfrom utf-8 "conjectural water flow"] ::msgcat::mcset en_US "line water-flow:conjectural" [encoding convertfrom utf-8 "conjectural water flow"] ::msgcat::mcset es "line water-flow:conjectural" [encoding convertfrom utf-8 "curso agua supuesto"] ::msgcat::mcset fr "line water-flow:conjectural" [encoding convertfrom utf-8 "rivi\303\250re, conjoncturelle"] ::msgcat::mcset it "line water-flow:conjectural" [encoding convertfrom utf-8 "corso d'acqua presunto"] ::msgcat::mcset mi "line water-flow:conjectural" [encoding convertfrom utf-8 "wairere a p\304\201tai"] ::msgcat::mcset pl "line water-flow:conjectural" [encoding convertfrom utf-8 "przewidywany ciek wodny"] ::msgcat::mcset pt "line water-flow:conjectural" [encoding convertfrom utf-8 "fluxo de \303\241gua suposto"] ::msgcat::mcset pt_BR "line water-flow:conjectural" [encoding convertfrom utf-8 "fluxo de \303\241gua suposto"] ::msgcat::mcset pt_PT "line water-flow:conjectural" [encoding convertfrom utf-8 "fluxo de \303\241gua suposto"] ::msgcat::mcset ru "line water-flow:conjectural" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\264\320\277\320\276\320\273\320\260\320\263\320\260\320\265\320\274\321\213\320\271 \320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "line water-flow:conjectural" [encoding convertfrom utf-8 "predpokladan\303\275 vodn\303\275 tok"] ::msgcat::mcset sq "line water-flow:conjectural" [encoding convertfrom utf-8 "rrjedhe uji e supozuar"] ::msgcat::mcset bg "line water-flow:intermittent" [encoding convertfrom utf-8 "\320\277\320\265\321\200\320\270\320\276\320\264\320\270\321\207\320\275\320\276 \320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "line water-flow:intermittent" [encoding convertfrom utf-8 "ob\304\215asn\303\275 vodn\303\255 tok"] ::msgcat::mcset de "line water-flow:intermittent" [encoding convertfrom utf-8 "zeitweises Gerinne"] ::msgcat::mcset el "line water-flow:intermittent" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\272\316\277\317\200\317\204\317\214\316\274\316\265\316\275\316\267 \317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "line water-flow:intermittent" [encoding convertfrom utf-8 "intermittent water flow"] ::msgcat::mcset en_UK "line water-flow:intermittent" [encoding convertfrom utf-8 "intermittent water flow"] ::msgcat::mcset en_US "line water-flow:intermittent" [encoding convertfrom utf-8 "intermittent water flow"] ::msgcat::mcset es "line water-flow:intermittent" [encoding convertfrom utf-8 "curso agua intermitente"] ::msgcat::mcset fr "line water-flow:intermittent" [encoding convertfrom utf-8 "rivi\303\250re, intermittente"] ::msgcat::mcset it "line water-flow:intermittent" [encoding convertfrom utf-8 "corso d'acqua temporaneo"] ::msgcat::mcset mi "line water-flow:intermittent" [encoding convertfrom utf-8 "wairere taumutumutu"] ::msgcat::mcset pl "line water-flow:intermittent" [encoding convertfrom utf-8 "okresowy ciek wodny"] ::msgcat::mcset pt "line water-flow:intermittent" [encoding convertfrom utf-8 "fluxo de \303\241gua intermitente"] ::msgcat::mcset pt_BR "line water-flow:intermittent" [encoding convertfrom utf-8 "fluxo de \303\241gua intermitente"] ::msgcat::mcset pt_PT "line water-flow:intermittent" [encoding convertfrom utf-8 "fluxo de \303\241gua intermitente"] ::msgcat::mcset ru "line water-flow:intermittent" [encoding convertfrom utf-8 "\320\275\320\265\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\321\213\320\271 \320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "line water-flow:intermittent" [encoding convertfrom utf-8 "ob\304\215asn\303\275 vodn\303\275 tok"] ::msgcat::mcset sq "line water-flow:intermittent" [encoding convertfrom utf-8 "rrjedhe uji me force"] ::msgcat::mcset bg "line water-flow:permanent" [encoding convertfrom utf-8 "\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\320\276 \320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "line water-flow:permanent" [encoding convertfrom utf-8 "vodn\303\255 tok"] ::msgcat::mcset de "line water-flow:permanent" [encoding convertfrom utf-8 "st\303\244ndiges Gerinne"] ::msgcat::mcset el "line water-flow:permanent" [encoding convertfrom utf-8 "\316\274\317\214\316\275\316\271\316\274\316\267 \317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "line water-flow:permanent" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_UK "line water-flow:permanent" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_US "line water-flow:permanent" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset es "line water-flow:permanent" [encoding convertfrom utf-8 "curso agua"] ::msgcat::mcset fr "line water-flow:permanent" [encoding convertfrom utf-8 "rivi\303\250re, permanente"] ::msgcat::mcset it "line water-flow:permanent" [encoding convertfrom utf-8 "corso d'acqua permanente"] ::msgcat::mcset mi "line water-flow:permanent" [encoding convertfrom utf-8 "wairere"] ::msgcat::mcset pl "line water-flow:permanent" [encoding convertfrom utf-8 "ciek wodny"] ::msgcat::mcset pt "line water-flow:permanent" [encoding convertfrom utf-8 "fluxo de \303\241gua permanente"] ::msgcat::mcset pt_BR "line water-flow:permanent" [encoding convertfrom utf-8 "fluxo de \303\241gua permanente"] ::msgcat::mcset pt_PT "line water-flow:permanent" [encoding convertfrom utf-8 "fluxo de \303\241gua permanente"] ::msgcat::mcset ru "line water-flow:permanent" [encoding convertfrom utf-8 "\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\321\213\320\271 \320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "line water-flow:permanent" [encoding convertfrom utf-8 "vodn\303\275 tok"] ::msgcat::mcset sq "line water-flow:permanent" [encoding convertfrom utf-8 "rrjedhe uji e perhershme"] ::msgcat::mcset bg "point air-draught" [encoding convertfrom utf-8 "\320\262\321\212\320\267\320\264\321\203\321\210\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point air-draught" [encoding convertfrom utf-8 "pr\305\257van"] ::msgcat::mcset de "point air-draught" [encoding convertfrom utf-8 "Luftzug"] ::msgcat::mcset el "point air-draught" [encoding convertfrom utf-8 "\317\201\316\277\316\256 \316\261\316\255\317\201\316\261"] ::msgcat::mcset en "point air-draught" [encoding convertfrom utf-8 "air draught"] ::msgcat::mcset en_UK "point air-draught" [encoding convertfrom utf-8 "air draught"] ::msgcat::mcset en_US "point air-draught" [encoding convertfrom utf-8 "air draught"] ::msgcat::mcset es "point air-draught" [encoding convertfrom utf-8 "corriente aire"] ::msgcat::mcset fr "point air-draught" [encoding convertfrom utf-8 "courant d\342\200\231air"] ::msgcat::mcset it "point air-draught" [encoding convertfrom utf-8 "corrente d'aria"] ::msgcat::mcset mi "point air-draught" [encoding convertfrom utf-8 "tawhiri"] ::msgcat::mcset pl "point air-draught" [encoding convertfrom utf-8 "przewiew"] ::msgcat::mcset pt "point air-draught" [encoding convertfrom utf-8 "presen\303\247a de vento"] ::msgcat::mcset pt_BR "point air-draught" [encoding convertfrom utf-8 "presen\303\247a de vento"] ::msgcat::mcset pt_PT "point air-draught" [encoding convertfrom utf-8 "presen\303\247a de vento"] ::msgcat::mcset ru "point air-draught" [encoding convertfrom utf-8 "\321\202\320\276\320\272 \320\262\320\276\320\267\320\264\321\203\321\205\320\260"] ::msgcat::mcset sk "point air-draught" [encoding convertfrom utf-8 "prievan"] ::msgcat::mcset sq "point air-draught" [encoding convertfrom utf-8 "rrymim i ajrit"] ::msgcat::mcset bg "point air-draught:summer" [encoding convertfrom utf-8 "\320\273\320\265\321\202\320\265\320\275 \320\262\321\212\320\267\320\264\321\203\321\210\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point air-draught:summer" [encoding convertfrom utf-8 "letn\303\255 pr\305\257van"] ::msgcat::mcset de "point air-draught:summer" [encoding convertfrom utf-8 "Luftzug im Sommer"] ::msgcat::mcset el "point air-draught:summer" [encoding convertfrom utf-8 "\316\270\316\265\317\201\316\271\316\275\316\256 \317\201\316\277\316\256 \316\261\316\255\317\201\316\261"] ::msgcat::mcset en "point air-draught:summer" [encoding convertfrom utf-8 "summer air draught"] ::msgcat::mcset en_UK "point air-draught:summer" [encoding convertfrom utf-8 "summer air draught"] ::msgcat::mcset en_US "point air-draught:summer" [encoding convertfrom utf-8 "summer air draught"] ::msgcat::mcset fr "point air-draught:summer" [encoding convertfrom utf-8 "courant d\342\200\231air d\342\200\231\303\251t\303\251"] ::msgcat::mcset it "point air-draught:summer" [encoding convertfrom utf-8 "circolazione estiva"] ::msgcat::mcset mi "point air-draught:summer" [encoding convertfrom utf-8 "tawhiri a raumati"] ::msgcat::mcset pl "point air-draught:summer" [encoding convertfrom utf-8 "przewiew w lecie"] ::msgcat::mcset ru "point air-draught:summer" [encoding convertfrom utf-8 "\321\202\320\276\320\272 \320\262\320\276\320\267\320\264\321\203\321\205\320\260 \320\273\320\265\321\202\320\275\320\270\320\271"] ::msgcat::mcset sk "point air-draught:summer" [encoding convertfrom utf-8 "letn\303\275 prievan"] ::msgcat::mcset sq "point air-draught:summer" [encoding convertfrom utf-8 "rrymim ajri-veror"] ::msgcat::mcset bg "point air-draught:winter" [encoding convertfrom utf-8 "\320\267\320\270\320\274\320\265\320\275 \320\262\321\212\320\267\320\264\321\203\321\210\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point air-draught:winter" [encoding convertfrom utf-8 "zimn\303\255 pr\305\257van"] ::msgcat::mcset de "point air-draught:winter" [encoding convertfrom utf-8 "Luftzug im Winter"] ::msgcat::mcset el "point air-draught:winter" [encoding convertfrom utf-8 "\317\207\316\265\316\271\316\274\316\265\317\201\316\271\316\275\316\256 \317\201\316\277\316\256 \316\261\316\255\317\201\316\261"] ::msgcat::mcset en "point air-draught:winter" [encoding convertfrom utf-8 "winter air draught"] ::msgcat::mcset en_UK "point air-draught:winter" [encoding convertfrom utf-8 "winter air draught"] ::msgcat::mcset en_US "point air-draught:winter" [encoding convertfrom utf-8 "winter air draught"] ::msgcat::mcset fr "point air-draught:winter" [encoding convertfrom utf-8 "courant d\342\200\231air d\342\200\231hiver"] ::msgcat::mcset it "point air-draught:winter" [encoding convertfrom utf-8 "circolazione invernale"] ::msgcat::mcset mi "point air-draught:winter" [encoding convertfrom utf-8 "tawhiri a takurua"] ::msgcat::mcset pl "point air-draught:winter" [encoding convertfrom utf-8 "przewiew w zimie"] ::msgcat::mcset ru "point air-draught:winter" [encoding convertfrom utf-8 "\321\202\320\276\320\272 \320\262\320\276\320\267\320\264\321\203\321\205\320\260 \320\267\320\270\320\274\320\275\320\270\320\271"] ::msgcat::mcset sk "point air-draught:winter" [encoding convertfrom utf-8 "zimn\303\275 prievan"] ::msgcat::mcset sq "point air-draught:winter" [encoding convertfrom utf-8 "rrymim ajri-dimeror"] ::msgcat::mcset bg "point altitude" [encoding convertfrom utf-8 "\320\275.\320\274. \320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260"] ::msgcat::mcset cz "point altitude" [encoding convertfrom utf-8 "nadmo\305\231sk\303\241 v\303\275\305\241ka bodu v chodb\304\233"] ::msgcat::mcset de "point altitude" [encoding convertfrom utf-8 "H\303\266he \303\274ber Koordinatenursprung"] ::msgcat::mcset el "point altitude" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202"] ::msgcat::mcset en "point altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset en_UK "point altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset en_US "point altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset es "point altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset fr "point altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset it "point altitude" [encoding convertfrom utf-8 "quota"] ::msgcat::mcset mi "point altitude" [encoding convertfrom utf-8 "teitei, tiketike"] ::msgcat::mcset pl "point altitude" [encoding convertfrom utf-8 "wysoko\305\233\304\207 punktu pomiarowego npm"] ::msgcat::mcset pt "point altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset pt_BR "point altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset pt_PT "point altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset ru "point altitude" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\275\320\260\321\217 \320\276\321\202\320\274\320\265\321\202\320\272\320\260"] ::msgcat::mcset sk "point altitude" [encoding convertfrom utf-8 "nadmorsk\303\241 v\303\275\305\241ka bodu v chodbe"] ::msgcat::mcset sq "point altitude" [encoding convertfrom utf-8 "lartesia mbidetare"] ::msgcat::mcset bg "point anastomosis" [encoding convertfrom utf-8 "\320\260\320\275\320\260\321\201\321\202\320\276\320\274\320\276\320\267\320\260"] ::msgcat::mcset cz "point anastomosis" [encoding convertfrom utf-8 "anastom\303\263za"] ::msgcat::mcset de "point anastomosis" [encoding convertfrom utf-8 "Anastomose"] ::msgcat::mcset el "point anastomosis" [encoding convertfrom utf-8 "\316\261\316\275\316\261\317\203\317\204\317\214\316\274\317\211\317\203\316\267"] ::msgcat::mcset en "point anastomosis" [encoding convertfrom utf-8 "anastomosis"] ::msgcat::mcset en_UK "point anastomosis" [encoding convertfrom utf-8 "anastomosis"] ::msgcat::mcset en_US "point anastomosis" [encoding convertfrom utf-8 "anastomosis"] ::msgcat::mcset es "point anastomosis" [encoding convertfrom utf-8 "anastomosis"] ::msgcat::mcset fr "point anastomosis" [encoding convertfrom utf-8 "anastomose"] ::msgcat::mcset it "point anastomosis" [encoding convertfrom utf-8 "anastomosi"] ::msgcat::mcset mi "point anastomosis" [encoding convertfrom utf-8 "peka hono"] ::msgcat::mcset pl "point anastomosis" [encoding convertfrom utf-8 "anastomoza"] ::msgcat::mcset pt "point anastomosis" [encoding convertfrom utf-8 "anastomose"] ::msgcat::mcset pt_BR "point anastomosis" [encoding convertfrom utf-8 "anastomose"] ::msgcat::mcset pt_PT "point anastomosis" [encoding convertfrom utf-8 "anastomose"] ::msgcat::mcset ru "point anastomosis" [encoding convertfrom utf-8 "\320\260\320\275\320\260\321\201\321\202\320\276\320\274\320\276\320\267\320\270\321\201"] ::msgcat::mcset sk "point anastomosis" [encoding convertfrom utf-8 "anastom\303\263za"] ::msgcat::mcset sq "point anastomosis" [encoding convertfrom utf-8 "anastomosa(kuartz)"] ::msgcat::mcset bg "point anchor" [encoding convertfrom utf-8 "\320\267\320\260\320\272\321\200\320\265\320\277\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "point anchor" [encoding convertfrom utf-8 "kotven\303\255"] ::msgcat::mcset de "point anchor" [encoding convertfrom utf-8 "Seilbefestigung"] ::msgcat::mcset el "point anchor" [encoding convertfrom utf-8 "\316\261\316\263\316\272\317\215\317\201\317\211\317\203\316\267"] ::msgcat::mcset en "point anchor" [encoding convertfrom utf-8 "anchor"] ::msgcat::mcset en_UK "point anchor" [encoding convertfrom utf-8 "anchor"] ::msgcat::mcset en_US "point anchor" [encoding convertfrom utf-8 "anchor"] ::msgcat::mcset es "point anchor" [encoding convertfrom utf-8 "anclaje"] ::msgcat::mcset fr "point anchor" [encoding convertfrom utf-8 "ancrage"] ::msgcat::mcset it "point anchor" [encoding convertfrom utf-8 "ancoraggio"] ::msgcat::mcset mi "point anchor" [encoding convertfrom utf-8 "punga"] ::msgcat::mcset pl "point anchor" [encoding convertfrom utf-8 "punkt asekuracyjny"] ::msgcat::mcset pt "point anchor" [encoding convertfrom utf-8 "ancoragem"] ::msgcat::mcset pt_BR "point anchor" [encoding convertfrom utf-8 "ancoragem"] ::msgcat::mcset pt_PT "point anchor" [encoding convertfrom utf-8 "ancoragem"] ::msgcat::mcset ru "point anchor" [encoding convertfrom utf-8 "\320\230\320\242\320\236"] ::msgcat::mcset sk "point anchor" [encoding convertfrom utf-8 "kotvenie"] ::msgcat::mcset sq "point anchor" [encoding convertfrom utf-8 "pike-sigurimi"] ::msgcat::mcset bg "point aragonite" [encoding convertfrom utf-8 "\320\260\321\200\320\260\320\263\320\276\320\275\320\270\321\202"] ::msgcat::mcset cz "point aragonite" [encoding convertfrom utf-8 "aragonit"] ::msgcat::mcset de "point aragonite" [encoding convertfrom utf-8 "Aragonit"] ::msgcat::mcset el "point aragonite" [encoding convertfrom utf-8 "\316\261\317\201\316\261\316\263\316\277\316\275\316\257\317\204\316\267\317\202"] ::msgcat::mcset en "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset en_UK "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset en_US "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset es "point aragonite" [encoding convertfrom utf-8 "aragonito"] ::msgcat::mcset fr "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset it "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset mi "point aragonite" [encoding convertfrom utf-8 "p\304\201keho tuarua"] ::msgcat::mcset pl "point aragonite" [encoding convertfrom utf-8 "aragonit"] ::msgcat::mcset pt "point aragonite" [encoding convertfrom utf-8 "aragonita"] ::msgcat::mcset pt_BR "point aragonite" [encoding convertfrom utf-8 "aragonita"] ::msgcat::mcset pt_PT "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset ru "point aragonite" [encoding convertfrom utf-8 "\320\260\321\200\320\260\320\263\320\276\320\275\320\270\321\202"] ::msgcat::mcset sk "point aragonite" [encoding convertfrom utf-8 "aragonit"] ::msgcat::mcset sq "point aragonite" [encoding convertfrom utf-8 "aragonite"] ::msgcat::mcset bg "point archeo-material" [encoding convertfrom utf-8 "\320\260\321\200\321\205\320\265\320\276\320\273\320\276\320\263\320\270\321\207\320\265\321\201\320\272\320\260 \320\275\320\260\321\205\320\276\320\264\320\272\320\260"] ::msgcat::mcset cz "point archeo-material" [encoding convertfrom utf-8 "archeologick\303\251 n\303\241lezy"] ::msgcat::mcset de "point archeo-material" [encoding convertfrom utf-8 "arch\303\244ologischer Fund"] ::msgcat::mcset el "point archeo-material" [encoding convertfrom utf-8 "\316\261\317\201\317\207\316\261\316\271\316\277\316\273\316\277\316\263\316\271\316\272\317\214 \316\265\317\215\317\201\316\267\316\274\316\261"] ::msgcat::mcset en "point archeo-material" [encoding convertfrom utf-8 "archaeological material"] ::msgcat::mcset en_UK "point archeo-material" [encoding convertfrom utf-8 "archaeological material"] ::msgcat::mcset en_US "point archeo-material" [encoding convertfrom utf-8 "archaeological material"] ::msgcat::mcset es "point archeo-material" [encoding convertfrom utf-8 "yacimiento (arq)"] ::msgcat::mcset fr "point archeo-material" [encoding convertfrom utf-8 "mat\303\251riel arch\303\251o"] ::msgcat::mcset it "point archeo-material" [encoding convertfrom utf-8 "materiale archeologico"] ::msgcat::mcset mi "point archeo-material" [encoding convertfrom utf-8 "taonga o nehe"] ::msgcat::mcset pl "point archeo-material" [encoding convertfrom utf-8 "znaleziska archeologiczne"] ::msgcat::mcset pt "point archeo-material" [encoding convertfrom utf-8 "material arqueol\303\263gico"] ::msgcat::mcset pt_BR "point archeo-material" [encoding convertfrom utf-8 "material arqueol\303\263gico"] ::msgcat::mcset pt_PT "point archeo-material" [encoding convertfrom utf-8 "material arqueol\303\263gico"] ::msgcat::mcset ru "point archeo-material" [encoding convertfrom utf-8 "\320\260\321\200\321\205\320\265\320\276\320\273\320\276\320\263\320\270\321\207\320\265\321\201\320\272\320\260\321\217 \320\275\320\260\321\205\320\276\320\264\320\272\320\260"] ::msgcat::mcset sk "point archeo-material" [encoding convertfrom utf-8 "archeologick\303\251 n\303\241lezy"] ::msgcat::mcset sq "point archeo-material" [encoding convertfrom utf-8 "material arkeologjik"] ::msgcat::mcset bg "point bedrock" [encoding convertfrom utf-8 "\320\276\321\201\320\275\320\276\320\262\320\275\320\260 \321\201\320\272\320\260\320\273\320\260"] ::msgcat::mcset cz "point bedrock" [encoding convertfrom utf-8 "pevn\303\241 sk\303\241la"] ::msgcat::mcset de "point bedrock" [encoding convertfrom utf-8 "Deckgebirge"] ::msgcat::mcset el "point bedrock" [encoding convertfrom utf-8 "\317\200\316\255\317\204\317\201\317\211\316\274\316\261"] ::msgcat::mcset en "point bedrock" [encoding convertfrom utf-8 "bedrock"] ::msgcat::mcset en_UK "point bedrock" [encoding convertfrom utf-8 "bedrock"] ::msgcat::mcset en_US "point bedrock" [encoding convertfrom utf-8 "bedrock"] ::msgcat::mcset es "point bedrock" [encoding convertfrom utf-8 "roca madre"] ::msgcat::mcset fr "point bedrock" [encoding convertfrom utf-8 "roche"] ::msgcat::mcset it "point bedrock" [encoding convertfrom utf-8 "roccia"] ::msgcat::mcset mi "point bedrock" [encoding convertfrom utf-8 "koiwi a papa"] ::msgcat::mcset pl "point bedrock" [encoding convertfrom utf-8 "lita ska\305\202a"] ::msgcat::mcset pt "point bedrock" [encoding convertfrom utf-8 "rocha encaixante"] ::msgcat::mcset pt_BR "point bedrock" [encoding convertfrom utf-8 "rocha encaixante"] ::msgcat::mcset pt_PT "point bedrock" [encoding convertfrom utf-8 "rocha encaixante"] ::msgcat::mcset ru "point bedrock" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\265\320\275\320\275\320\260\321\217 \320\277\320\276\321\200\320\276\320\264\320\260"] ::msgcat::mcset sk "point bedrock" [encoding convertfrom utf-8 "pevn\303\241 skala"] ::msgcat::mcset sq "point bedrock" [encoding convertfrom utf-8 "shtrat shkembi"] ::msgcat::mcset bg "point blocks" [encoding convertfrom utf-8 "\320\272\320\260\320\274\321\212\320\275\320\270, \320\261\320\273\320\276\320\272\320\260\320\266"] ::msgcat::mcset cz "point blocks" [encoding convertfrom utf-8 "kamenn\303\251 bloky"] ::msgcat::mcset de "point blocks" [encoding convertfrom utf-8 "Bl\303\266cke"] ::msgcat::mcset el "point blocks" [encoding convertfrom utf-8 "\316\277\316\263\316\272\317\214\316\273\316\271\316\270\316\277\316\271"] ::msgcat::mcset en "point blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset en_UK "point blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset en_US "point blocks" [encoding convertfrom utf-8 "blocks, breakdown"] ::msgcat::mcset es "point blocks" [encoding convertfrom utf-8 "bloques"] ::msgcat::mcset fr "point blocks" [encoding convertfrom utf-8 "blocs"] ::msgcat::mcset it "point blocks" [encoding convertfrom utf-8 "massi"] ::msgcat::mcset mi "point blocks" [encoding convertfrom utf-8 "pakaru"] ::msgcat::mcset pl "point blocks" [encoding convertfrom utf-8 "kamienne bloki"] ::msgcat::mcset pt "point blocks" [encoding convertfrom utf-8 "blocos, desmoronamento"] ::msgcat::mcset pt_BR "point blocks" [encoding convertfrom utf-8 "blocos, desmoronamento"] ::msgcat::mcset pt_PT "point blocks" [encoding convertfrom utf-8 "blocos, desmoronamento"] ::msgcat::mcset ru "point blocks" [encoding convertfrom utf-8 "\320\263\320\273\321\213\320\261\321\213, \320\267\320\260\320\262\320\260\320\273"] ::msgcat::mcset sk "point blocks" [encoding convertfrom utf-8 "kamenn\303\251 bloky"] ::msgcat::mcset sq "point blocks" [encoding convertfrom utf-8 "blloqe, shembje"] ::msgcat::mcset bg "point breakdown-choke" [encoding convertfrom utf-8 "\320\267\320\260\321\202\320\262\320\276\321\200\320\265\320\275\320\276 \320\276\321\202 \321\201\321\200\321\203\321\202\320\270\321\211\320\265"] ::msgcat::mcset cz "point breakdown-choke" [encoding convertfrom utf-8 "zavalen\303\275 konec"] ::msgcat::mcset de "point breakdown-choke" [encoding convertfrom utf-8 "Fortsetzung verst\303\274rzt"] ::msgcat::mcset el "point breakdown-choke" [encoding convertfrom utf-8 "\316\272\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \317\203\317\204\316\277\316\254\317\202 \316\273\317\214\316\263\316\277 \317\207\316\261\316\273\316\254\317\203\316\274\316\261\317\204\316\277\317\202"] ::msgcat::mcset en "point breakdown-choke" [encoding convertfrom utf-8 "breakdown choke"] ::msgcat::mcset en_UK "point breakdown-choke" [encoding convertfrom utf-8 "breakdown choke"] ::msgcat::mcset en_US "point breakdown-choke" [encoding convertfrom utf-8 "breakdown choke"] ::msgcat::mcset es "point breakdown-choke" [encoding convertfrom utf-8 "colmatado por derrumbe"] ::msgcat::mcset fr "point breakdown-choke" [encoding convertfrom utf-8 "tr\303\251mie"] ::msgcat::mcset it "point breakdown-choke" [encoding convertfrom utf-8 "chiude su frana"] ::msgcat::mcset mi "point breakdown-choke" [encoding convertfrom utf-8 "nati pakaru"] ::msgcat::mcset pl "point breakdown-choke" [encoding convertfrom utf-8 "koniec zawalony"] ::msgcat::mcset pt "point breakdown-choke" [encoding convertfrom utf-8 "obstru\303\247\303\243o por desmoronamento"] ::msgcat::mcset pt_BR "point breakdown-choke" [encoding convertfrom utf-8 "obstru\303\247\303\243o por desmoronamento"] ::msgcat::mcset pt_PT "point breakdown-choke" [encoding convertfrom utf-8 "obstru\303\247\303\243o por desmoronamento"] ::msgcat::mcset ru "point breakdown-choke" [encoding convertfrom utf-8 "\320\261\320\273\320\276\320\272\320\270\321\200\320\276\320\262\320\260\320\275\320\276 \320\276\320\261\320\262\320\260\320\273\320\276\320\274"] ::msgcat::mcset sk "point breakdown-choke" [encoding convertfrom utf-8 "zavalen\303\275 koniec"] ::msgcat::mcset sq "point breakdown-choke" [encoding convertfrom utf-8 "gurre rrjedhes-fund"] ::msgcat::mcset bg "point bridge" [encoding convertfrom utf-8 "\320\274\320\276\321\201\321\202"] ::msgcat::mcset cz "point bridge" [encoding convertfrom utf-8 "most"] ::msgcat::mcset de "point bridge" [encoding convertfrom utf-8 "Br\303\274cke"] ::msgcat::mcset el "point bridge" [encoding convertfrom utf-8 "\316\263\316\255\317\206\317\205\317\201\316\261"] ::msgcat::mcset en "point bridge" [encoding convertfrom utf-8 "bridge"] ::msgcat::mcset en_UK "point bridge" [encoding convertfrom utf-8 "bridge"] ::msgcat::mcset en_US "point bridge" [encoding convertfrom utf-8 "bridge"] ::msgcat::mcset es "point bridge" [encoding convertfrom utf-8 "puente roca"] ::msgcat::mcset fr "point bridge" [encoding convertfrom utf-8 "pont"] ::msgcat::mcset it "point bridge" [encoding convertfrom utf-8 "ponte di roccia"] ::msgcat::mcset mi "point bridge" [encoding convertfrom utf-8 "piriti"] ::msgcat::mcset pl "point bridge" [encoding convertfrom utf-8 "most"] ::msgcat::mcset pt "point bridge" [encoding convertfrom utf-8 "ponte"] ::msgcat::mcset pt_BR "point bridge" [encoding convertfrom utf-8 "ponte"] ::msgcat::mcset pt_PT "point bridge" [encoding convertfrom utf-8 "ponte"] ::msgcat::mcset ru "point bridge" [encoding convertfrom utf-8 "\320\274\320\276\321\201\321\202"] ::msgcat::mcset sk "point bridge" [encoding convertfrom utf-8 "most"] ::msgcat::mcset sq "point bridge" [encoding convertfrom utf-8 "ure"] ::msgcat::mcset bg "point camp" [encoding convertfrom utf-8 "\320\273\320\260\320\263\320\265\321\200"] ::msgcat::mcset cz "point camp" [encoding convertfrom utf-8 "bivak"] ::msgcat::mcset de "point camp" [encoding convertfrom utf-8 "Biwak"] ::msgcat::mcset el "point camp" [encoding convertfrom utf-8 "\316\272\316\261\317\204\316\261\317\203\316\272\316\256\316\275\317\211\317\203\316\267"] ::msgcat::mcset en "point camp" [encoding convertfrom utf-8 "camp"] ::msgcat::mcset en_UK "point camp" [encoding convertfrom utf-8 "camp"] ::msgcat::mcset en_US "point camp" [encoding convertfrom utf-8 "camp"] ::msgcat::mcset es "point camp" [encoding convertfrom utf-8 "campamento"] ::msgcat::mcset fr "point camp" [encoding convertfrom utf-8 "camp"] ::msgcat::mcset it "point camp" [encoding convertfrom utf-8 "campo"] ::msgcat::mcset mi "point camp" [encoding convertfrom utf-8 "topuni"] ::msgcat::mcset pl "point camp" [encoding convertfrom utf-8 "biwak"] ::msgcat::mcset pt "point camp" [encoding convertfrom utf-8 "acampamento"] ::msgcat::mcset pt_BR "point camp" [encoding convertfrom utf-8 "acampamento"] ::msgcat::mcset pt_PT "point camp" [encoding convertfrom utf-8 "acampamento"] ::msgcat::mcset ru "point camp" [encoding convertfrom utf-8 "\320\237\320\221\320\233"] ::msgcat::mcset sk "point camp" [encoding convertfrom utf-8 "bivak"] ::msgcat::mcset sq "point camp" [encoding convertfrom utf-8 "vend-pushim"] ::msgcat::mcset bg "point cave-pearl" [encoding convertfrom utf-8 "\320\277\320\265\321\211\320\265\321\200\320\265\320\275 \320\261\320\270\321\201\320\265\321\200"] ::msgcat::mcset cz "point cave-pearl" [encoding convertfrom utf-8 "jeskynn\303\255 perly"] ::msgcat::mcset de "point cave-pearl" [encoding convertfrom utf-8 "H\303\266hlenperle"] ::msgcat::mcset el "point cave-pearl" [encoding convertfrom utf-8 "\316\274\316\261\317\201\316\263\316\261\317\201\316\271\317\204\316\254\317\201\316\271 \317\204\317\211\316\275 \317\203\317\200\316\267\316\273\316\261\316\257\317\211\316\275"] ::msgcat::mcset en "point cave-pearl" [encoding convertfrom utf-8 "cave pearl"] ::msgcat::mcset en_UK "point cave-pearl" [encoding convertfrom utf-8 "cave pearl"] ::msgcat::mcset en_US "point cave-pearl" [encoding convertfrom utf-8 "cave pearl"] ::msgcat::mcset es "point cave-pearl" [encoding convertfrom utf-8 "perla de caverna"] ::msgcat::mcset fr "point cave-pearl" [encoding convertfrom utf-8 "perle des cavernes"] ::msgcat::mcset it "point cave-pearl" [encoding convertfrom utf-8 "pisolite"] ::msgcat::mcset mi "point cave-pearl" [encoding convertfrom utf-8 "ana kahurangi"] ::msgcat::mcset pl "point cave-pearl" [encoding convertfrom utf-8 "per\305\202y jaskiniowe"] ::msgcat::mcset pt "point cave-pearl" [encoding convertfrom utf-8 "p\303\251rolas"] ::msgcat::mcset pt_BR "point cave-pearl" [encoding convertfrom utf-8 "p\303\251rolas"] ::msgcat::mcset pt_PT "point cave-pearl" [encoding convertfrom utf-8 "p\303\251rolas de Gruta"] ::msgcat::mcset ru "point cave-pearl" [encoding convertfrom utf-8 "\320\277\320\265\321\211\320\265\321\200\320\275\321\213\320\271 \320\266\320\265\320\274\321\207\321\203\320\263"] ::msgcat::mcset sk "point cave-pearl" [encoding convertfrom utf-8 "jaskynn\303\251 perly"] ::msgcat::mcset sq "point cave-pearl" [encoding convertfrom utf-8 "margaritar te shpelles"] ::msgcat::mcset bg "point clay" [encoding convertfrom utf-8 "\320\263\320\273\320\270\320\275\320\260"] ::msgcat::mcset cz "point clay" [encoding convertfrom utf-8 "bahno"] ::msgcat::mcset de "point clay" [encoding convertfrom utf-8 "Lehm"] ::msgcat::mcset el "point clay" [encoding convertfrom utf-8 "\316\254\317\201\316\263\316\271\316\273\316\277\317\202"] ::msgcat::mcset en "point clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset en_UK "point clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset en_US "point clay" [encoding convertfrom utf-8 "clay"] ::msgcat::mcset es "point clay" [encoding convertfrom utf-8 "arcilla"] ::msgcat::mcset fr "point clay" [encoding convertfrom utf-8 "argile"] ::msgcat::mcset it "point clay" [encoding convertfrom utf-8 "argilla"] ::msgcat::mcset mi "point clay" [encoding convertfrom utf-8 "oneuku"] ::msgcat::mcset pl "point clay" [encoding convertfrom utf-8 "glina"] ::msgcat::mcset pt "point clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset pt_BR "point clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset pt_PT "point clay" [encoding convertfrom utf-8 "lama"] ::msgcat::mcset ru "point clay" [encoding convertfrom utf-8 "\320\263\320\273\320\270\320\275\320\260"] ::msgcat::mcset sk "point clay" [encoding convertfrom utf-8 "\303\255l"] ::msgcat::mcset sq "point clay" [encoding convertfrom utf-8 "argjil"] ::msgcat::mcset de "point clay-choke" [encoding convertfrom utf-8 "Fortsetzung verlehmt"] ::msgcat::mcset en "point clay-choke" [encoding convertfrom utf-8 "clay choke"] ::msgcat::mcset en_UK "point clay-choke" [encoding convertfrom utf-8 "clay choke"] ::msgcat::mcset en_US "point clay-choke" [encoding convertfrom utf-8 "clay choke"] ::msgcat::mcset it "point clay-choke" [encoding convertfrom utf-8 "chiude su riempimento"] ::msgcat::mcset mi "point clay-choke" [encoding convertfrom utf-8 "uku pari"] ::msgcat::mcset pl "point clay-choke" [encoding convertfrom utf-8 "koniec zamkni\304\231ty glin\304\205"] ::msgcat::mcset sk "point clay-choke" [encoding convertfrom utf-8 "koniec uzavret\303\275 \303\255lom"] ::msgcat::mcset de "point clay-tree" [encoding convertfrom utf-8 "Lehmb\303\244umchen"] ::msgcat::mcset en "point clay-tree" [encoding convertfrom utf-8 "clay tree"] ::msgcat::mcset en_UK "point clay-tree" [encoding convertfrom utf-8 "clay tree"] ::msgcat::mcset en_US "point clay-tree" [encoding convertfrom utf-8 "clay tree"] ::msgcat::mcset it "point clay-tree" [encoding convertfrom utf-8 "pini d'argilla"] ::msgcat::mcset mi "point clay-tree" [encoding convertfrom utf-8 "rakau oneuku"] ::msgcat::mcset bg "point continuation" [encoding convertfrom utf-8 "\320\262\321\212\320\267\320\274\320\276\320\266\320\275\320\276 \320\277\321\200\320\276\320\264\321\212\320\273\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point continuation" [encoding convertfrom utf-8 "mo\305\276n\303\251 pokra\304\215ov\303\241n\303\255"] ::msgcat::mcset de "point continuation" [encoding convertfrom utf-8 "Fortsetzung"] ::msgcat::mcset el "point continuation" [encoding convertfrom utf-8 "\317\200\316\271\316\270\316\261\316\275\316\256 \317\203\317\205\316\275\316\255\317\207\316\265\316\271\316\261"] ::msgcat::mcset en "point continuation" [encoding convertfrom utf-8 "possible continuation"] ::msgcat::mcset en_UK "point continuation" [encoding convertfrom utf-8 "possible continuation"] ::msgcat::mcset en_US "point continuation" [encoding convertfrom utf-8 "possible continuation"] ::msgcat::mcset es "point continuation" [encoding convertfrom utf-8 "continuaci\303\263n"] ::msgcat::mcset fr "point continuation" [encoding convertfrom utf-8 "suite possible"] ::msgcat::mcset it "point continuation" [encoding convertfrom utf-8 "possibile prosecuzione"] ::msgcat::mcset mi "point continuation" [encoding convertfrom utf-8 "roanga taea"] ::msgcat::mcset pl "point continuation" [encoding convertfrom utf-8 "mo\305\274liwa kontynuacja"] ::msgcat::mcset pt "point continuation" [encoding convertfrom utf-8 "poss\303\255vel continua\303\247\303\243o"] ::msgcat::mcset pt_BR "point continuation" [encoding convertfrom utf-8 "poss\303\255vel continua\303\247\303\243o"] ::msgcat::mcset pt_PT "point continuation" [encoding convertfrom utf-8 "poss\303\255vel continua\303\247\303\243o"] ::msgcat::mcset ru "point continuation" [encoding convertfrom utf-8 "\320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276\320\265 \320\277\321\200\320\276\320\264\320\276\320\273\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "point continuation" [encoding convertfrom utf-8 "mo\305\276n\303\251 pokra\304\215ovanie"] ::msgcat::mcset sq "point continuation" [encoding convertfrom utf-8 "vazhdim I mundshem"] ::msgcat::mcset bg "point crystal" [encoding convertfrom utf-8 "\320\272\321\200\320\270\321\201\321\202\320\260\320\273"] ::msgcat::mcset cz "point crystal" [encoding convertfrom utf-8 "krystal"] ::msgcat::mcset de "point crystal" [encoding convertfrom utf-8 "Kristall"] ::msgcat::mcset el "point crystal" [encoding convertfrom utf-8 "\316\272\317\201\317\215\317\203\317\204\316\261\316\273\316\273\316\277"] ::msgcat::mcset en "point crystal" [encoding convertfrom utf-8 "crystal"] ::msgcat::mcset en_UK "point crystal" [encoding convertfrom utf-8 "crystal"] ::msgcat::mcset en_US "point crystal" [encoding convertfrom utf-8 "crystal"] ::msgcat::mcset es "point crystal" [encoding convertfrom utf-8 "cristal"] ::msgcat::mcset fr "point crystal" [encoding convertfrom utf-8 "cristaux"] ::msgcat::mcset it "point crystal" [encoding convertfrom utf-8 "cristallo"] ::msgcat::mcset mi "point crystal" [encoding convertfrom utf-8 "kohatu piata"] ::msgcat::mcset pl "point crystal" [encoding convertfrom utf-8 "kryszta\305\202"] ::msgcat::mcset pt "point crystal" [encoding convertfrom utf-8 "cristal"] ::msgcat::mcset pt_BR "point crystal" [encoding convertfrom utf-8 "cristal"] ::msgcat::mcset pt_PT "point crystal" [encoding convertfrom utf-8 "cristal"] ::msgcat::mcset ru "point crystal" [encoding convertfrom utf-8 "\320\272\321\200\320\270\321\201\321\202\320\260\320\273\320\273\321\213"] ::msgcat::mcset sk "point crystal" [encoding convertfrom utf-8 "kry\305\241t\303\241l"] ::msgcat::mcset sq "point crystal" [encoding convertfrom utf-8 "kristale"] ::msgcat::mcset bg "point curtain" [encoding convertfrom utf-8 "\320\264\321\200\320\260\320\277\320\265\321\200\320\270\321\217"] ::msgcat::mcset cz "point curtain" [encoding convertfrom utf-8 "sintrov\303\251 z\303\241clony"] ::msgcat::mcset de "point curtain" [encoding convertfrom utf-8 "Sinterfahne"] ::msgcat::mcset el "point curtain" [encoding convertfrom utf-8 "\316\272\316\277\317\205\317\201\317\204\316\257\316\275\316\261"] ::msgcat::mcset en "point curtain" [encoding convertfrom utf-8 "curtain"] ::msgcat::mcset en_UK "point curtain" [encoding convertfrom utf-8 "curtain"] ::msgcat::mcset en_US "point curtain" [encoding convertfrom utf-8 "curtain"] ::msgcat::mcset es "point curtain" [encoding convertfrom utf-8 "cortina"] ::msgcat::mcset fr "point curtain" [encoding convertfrom utf-8 "rideau"] ::msgcat::mcset it "point curtain" [encoding convertfrom utf-8 "cortina"] ::msgcat::mcset mi "point curtain" [encoding convertfrom utf-8 "araia"] ::msgcat::mcset pl "point curtain" [encoding convertfrom utf-8 "draperie naciekowe"] ::msgcat::mcset pt "point curtain" [encoding convertfrom utf-8 "cortina"] ::msgcat::mcset pt_BR "point curtain" [encoding convertfrom utf-8 "cortina"] ::msgcat::mcset pt_PT "point curtain" [encoding convertfrom utf-8 "cortina"] ::msgcat::mcset ru "point curtain" [encoding convertfrom utf-8 "\320\275\320\260\321\202\320\265\321\207\320\275\321\213\320\271 \320\267\320\260\320\275\320\260\320\262\320\265\321\201"] ::msgcat::mcset sk "point curtain" [encoding convertfrom utf-8 "sintrov\303\251 z\303\241clony"] ::msgcat::mcset sq "point curtain" [encoding convertfrom utf-8 "perde"] ::msgcat::mcset bg "point date" [encoding convertfrom utf-8 "\320\264\320\260\321\202\320\260 \320\275\320\260 \320\275\320\260\320\261\320\273\321\216\320\264\320\265\320\275\320\270\320\265\321\202\320\276"] ::msgcat::mcset cz "point date" [encoding convertfrom utf-8 "datum pozorov\303\241n\303\255"] ::msgcat::mcset de "point date" [encoding convertfrom utf-8 "Datum"] ::msgcat::mcset el "point date" [encoding convertfrom utf-8 "\316\267\316\274\316\265\317\201\316\277\316\274\316\267\316\275\316\257\316\261"] ::msgcat::mcset en "point date" [encoding convertfrom utf-8 "date of observation"] ::msgcat::mcset en_UK "point date" [encoding convertfrom utf-8 "date of observation"] ::msgcat::mcset en_US "point date" [encoding convertfrom utf-8 "date of observation"] ::msgcat::mcset es "point date" [encoding convertfrom utf-8 "fecha"] ::msgcat::mcset fr "point date" [encoding convertfrom utf-8 "date"] ::msgcat::mcset it "point date" [encoding convertfrom utf-8 "data d'osservazione"] ::msgcat::mcset mi "point date" [encoding convertfrom utf-8 "r\304\201 o te titiro"] ::msgcat::mcset pl "point date" [encoding convertfrom utf-8 "data obserwacji"] ::msgcat::mcset pt "point date" [encoding convertfrom utf-8 "data de observa\303\247\303\243o"] ::msgcat::mcset pt_BR "point date" [encoding convertfrom utf-8 "data de observa\303\247\303\243o"] ::msgcat::mcset pt_PT "point date" [encoding convertfrom utf-8 "data de observa\303\247\303\243o"] ::msgcat::mcset ru "point date" [encoding convertfrom utf-8 "\320\264\320\260\321\202\320\260 \320\275\320\260\320\261\320\273\321\216\320\264\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "point date" [encoding convertfrom utf-8 "d\303\241tum pozorovania"] ::msgcat::mcset sq "point date" [encoding convertfrom utf-8 "data e vrojtimit"] ::msgcat::mcset bg "point debris" [encoding convertfrom utf-8 "\321\207\320\260\320\272\321\212\320\273"] ::msgcat::mcset cz "point debris" [encoding convertfrom utf-8 "\305\241t\304\233rk"] ::msgcat::mcset de "point debris" [encoding convertfrom utf-8 "Schutt"] ::msgcat::mcset el "point debris" [encoding convertfrom utf-8 "\317\207\316\261\316\273\316\254\317\203\316\274\316\261\317\204\316\261"] ::msgcat::mcset en "point debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset en_UK "point debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset en_US "point debris" [encoding convertfrom utf-8 "debris"] ::msgcat::mcset es "point debris" [encoding convertfrom utf-8 "derrubios"] ::msgcat::mcset fr "point debris" [encoding convertfrom utf-8 "d\303\251bris"] ::msgcat::mcset it "point debris" [encoding convertfrom utf-8 "detriti"] ::msgcat::mcset mi "point debris" [encoding convertfrom utf-8 "otaota"] ::msgcat::mcset pl "point debris" [encoding convertfrom utf-8 "\305\274wir"] ::msgcat::mcset pt "point debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset pt_BR "point debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset pt_PT "point debris" [encoding convertfrom utf-8 "escombros"] ::msgcat::mcset ru "point debris" [encoding convertfrom utf-8 "\321\211\320\265\320\261\320\265\320\275\321\214"] ::msgcat::mcset sk "point debris" [encoding convertfrom utf-8 "sutina"] ::msgcat::mcset sq "point debris" [encoding convertfrom utf-8 "mbetje-mbeturina"] ::msgcat::mcset bg "point dig" [encoding convertfrom utf-8 "\320\270\320\267\320\272\320\276\320\277"] ::msgcat::mcset cz "point dig" [encoding convertfrom utf-8 "sonda"] ::msgcat::mcset de "point dig" [encoding convertfrom utf-8 "Grabung"] ::msgcat::mcset el "point dig" [encoding convertfrom utf-8 "\316\264\316\271\316\254\316\275\316\277\316\271\316\276\316\267"] ::msgcat::mcset en "point dig" [encoding convertfrom utf-8 "dig"] ::msgcat::mcset en_UK "point dig" [encoding convertfrom utf-8 "dig"] ::msgcat::mcset en_US "point dig" [encoding convertfrom utf-8 "dig"] ::msgcat::mcset fr "point dig" [encoding convertfrom utf-8 "d\303\251sobstruction"] ::msgcat::mcset it "point dig" [encoding convertfrom utf-8 "disostruzione"] ::msgcat::mcset mi "point dig" [encoding convertfrom utf-8 "kari"] ::msgcat::mcset pl "point dig" [encoding convertfrom utf-8 "wykop"] ::msgcat::mcset sk "point dig" [encoding convertfrom utf-8 "sonda"] ::msgcat::mcset sq "point dig" [encoding convertfrom utf-8 "mihje"] ::msgcat::mcset bg "point dimensions" [encoding convertfrom utf-8 "\321\200\320\260\320\267\320\274\320\265\321\200\320\270 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "point dimensions" [encoding convertfrom utf-8 "rozm\304\233ry"] ::msgcat::mcset de "point dimensions" [encoding convertfrom utf-8 "Ausdehnung"] ::msgcat::mcset el "point dimensions" [encoding convertfrom utf-8 "\316\264\316\271\316\261\317\203\317\204\316\254\317\203\316\265\316\271\317\202"] ::msgcat::mcset en "point dimensions" [encoding convertfrom utf-8 "dimensions"] ::msgcat::mcset en_UK "point dimensions" [encoding convertfrom utf-8 "dimensions"] ::msgcat::mcset en_US "point dimensions" [encoding convertfrom utf-8 "dimensions"] ::msgcat::mcset es "point dimensions" [encoding convertfrom utf-8 "dimensiones"] ::msgcat::mcset fr "point dimensions" [encoding convertfrom utf-8 "proportions"] ::msgcat::mcset it "point dimensions" [encoding convertfrom utf-8 "dimensione"] ::msgcat::mcset mi "point dimensions" [encoding convertfrom utf-8 "rahinga, meiha"] ::msgcat::mcset pl "point dimensions" [encoding convertfrom utf-8 "rozmiary"] ::msgcat::mcset pt "point dimensions" [encoding convertfrom utf-8 "dimens\303\265es"] ::msgcat::mcset pt_BR "point dimensions" [encoding convertfrom utf-8 "dimens\303\265es"] ::msgcat::mcset pt_PT "point dimensions" [encoding convertfrom utf-8 "dimens\303\265es"] ::msgcat::mcset ru "point dimensions" [encoding convertfrom utf-8 "\321\200\320\260\320\267\320\274\320\265\321\200\321\213 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "point dimensions" [encoding convertfrom utf-8 "rozmery"] ::msgcat::mcset sq "point dimensions" [encoding convertfrom utf-8 "dimenzionet"] ::msgcat::mcset bg "point disk" [encoding convertfrom utf-8 "\320\264\320\270\321\201\320\272"] ::msgcat::mcset cz "point disk" [encoding convertfrom utf-8 "disk"] ::msgcat::mcset de "point disk" [encoding convertfrom utf-8 "Diskus"] ::msgcat::mcset el "point disk" [encoding convertfrom utf-8 "\316\264\316\257\317\203\316\272\316\277\317\202"] ::msgcat::mcset en "point disk" [encoding convertfrom utf-8 "disk"] ::msgcat::mcset en_UK "point disk" [encoding convertfrom utf-8 "disk"] ::msgcat::mcset en_US "point disk" [encoding convertfrom utf-8 "disk"] ::msgcat::mcset es "point disk" [encoding convertfrom utf-8 "disco"] ::msgcat::mcset fr "point disk" [encoding convertfrom utf-8 "disque"] ::msgcat::mcset it "point disk" [encoding convertfrom utf-8 "disco"] ::msgcat::mcset mi "point disk" [encoding convertfrom utf-8 "kiwhi"] ::msgcat::mcset pl "point disk" [encoding convertfrom utf-8 "dysk"] ::msgcat::mcset pt "point disk" [encoding convertfrom utf-8 "disco"] ::msgcat::mcset pt_BR "point disk" [encoding convertfrom utf-8 "disco"] ::msgcat::mcset pt_PT "point disk" [encoding convertfrom utf-8 "disco"] ::msgcat::mcset ru "point disk" [encoding convertfrom utf-8 "\320\264\320\270\321\201\320\272"] ::msgcat::mcset sk "point disk" [encoding convertfrom utf-8 "disk"] ::msgcat::mcset sq "point disk" [encoding convertfrom utf-8 "pllake"] ::msgcat::mcset bg "point entrance" [encoding convertfrom utf-8 "\320\262\321\205\320\276\320\264"] ::msgcat::mcset cz "point entrance" [encoding convertfrom utf-8 "vchod"] ::msgcat::mcset de "point entrance" [encoding convertfrom utf-8 "Eingang"] ::msgcat::mcset el "point entrance" [encoding convertfrom utf-8 "\316\265\316\257\317\203\316\277\316\264\316\277\317\202"] ::msgcat::mcset en "point entrance" [encoding convertfrom utf-8 "entrance"] ::msgcat::mcset en_UK "point entrance" [encoding convertfrom utf-8 "entrance"] ::msgcat::mcset en_US "point entrance" [encoding convertfrom utf-8 "entrance"] ::msgcat::mcset es "point entrance" [encoding convertfrom utf-8 "boca"] ::msgcat::mcset fr "point entrance" [encoding convertfrom utf-8 "entr\303\251e"] ::msgcat::mcset it "point entrance" [encoding convertfrom utf-8 "ingresso"] ::msgcat::mcset mi "point entrance" [encoding convertfrom utf-8 "ana ngutu"] ::msgcat::mcset pl "point entrance" [encoding convertfrom utf-8 "wej\305\233cie"] ::msgcat::mcset pt "point entrance" [encoding convertfrom utf-8 "entrada"] ::msgcat::mcset pt_BR "point entrance" [encoding convertfrom utf-8 "entrada"] ::msgcat::mcset pt_PT "point entrance" [encoding convertfrom utf-8 "entrada"] ::msgcat::mcset ru "point entrance" [encoding convertfrom utf-8 "\320\262\321\205\320\276\320\264"] ::msgcat::mcset sk "point entrance" [encoding convertfrom utf-8 "vchod"] ::msgcat::mcset sq "point entrance" [encoding convertfrom utf-8 "hyrja"] ::msgcat::mcset bg "point fixed-ladder" [encoding convertfrom utf-8 "\321\201\321\202\320\260\321\206\320\270\320\276\320\275\320\260\321\200\320\275\320\260 \321\201\321\202\321\212\320\273\320\261\320\260"] ::msgcat::mcset cz "point fixed-ladder" [encoding convertfrom utf-8 "pevn\303\275 \305\276eb\305\231\303\255k"] ::msgcat::mcset de "point fixed-ladder" [encoding convertfrom utf-8 "feste Leiter"] ::msgcat::mcset el "point fixed-ladder" [encoding convertfrom utf-8 "\316\274\317\214\316\275\316\271\316\274\316\267 \317\203\316\272\316\254\316\273\316\261"] ::msgcat::mcset en "point fixed-ladder" [encoding convertfrom utf-8 "fixed ladder"] ::msgcat::mcset en_UK "point fixed-ladder" [encoding convertfrom utf-8 "fixed ladder"] ::msgcat::mcset en_US "point fixed-ladder" [encoding convertfrom utf-8 "fixed ladder"] ::msgcat::mcset es "point fixed-ladder" [encoding convertfrom utf-8 "escala fija"] ::msgcat::mcset fr "point fixed-ladder" [encoding convertfrom utf-8 "\303\251chelle fixe"] ::msgcat::mcset it "point fixed-ladder" [encoding convertfrom utf-8 "scala fissa"] ::msgcat::mcset mi "point fixed-ladder" [encoding convertfrom utf-8 "arawhata"] ::msgcat::mcset pl "point fixed-ladder" [encoding convertfrom utf-8 "sztywna drabinka"] ::msgcat::mcset pt "point fixed-ladder" [encoding convertfrom utf-8 "escada fixa"] ::msgcat::mcset pt_BR "point fixed-ladder" [encoding convertfrom utf-8 "escada fixa"] ::msgcat::mcset pt_PT "point fixed-ladder" [encoding convertfrom utf-8 "escada fixa"] ::msgcat::mcset ru "point fixed-ladder" [encoding convertfrom utf-8 "\320\266\320\265\321\201\321\202\320\272\320\260\321\217 \320\273\320\265\321\201\321\202\320\275\320\270\321\206\320\260"] ::msgcat::mcset sk "point fixed-ladder" [encoding convertfrom utf-8 "fixn\303\275 rebr\303\255k"] ::msgcat::mcset sq "point fixed-ladder" [encoding convertfrom utf-8 "shkalle fikse"] ::msgcat::mcset bg "point flag:air-draught" [encoding convertfrom utf-8 "\320\262\321\212\320\267\320\264\321\203\321\210\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point flag:air-draught" [encoding convertfrom utf-8 "pr\305\257van"] ::msgcat::mcset de "point flag:air-draught" [encoding convertfrom utf-8 "Luftzug"] ::msgcat::mcset el "point flag:air-draught" [encoding convertfrom utf-8 "\317\201\316\277\316\256 \316\261\316\255\317\201\316\261"] ::msgcat::mcset en "point flag:air-draught" [encoding convertfrom utf-8 "air draught"] ::msgcat::mcset en_UK "point flag:air-draught" [encoding convertfrom utf-8 "air draught"] ::msgcat::mcset en_US "point flag:air-draught" [encoding convertfrom utf-8 "air draught"] ::msgcat::mcset es "point flag:air-draught" [encoding convertfrom utf-8 "corriente aire"] ::msgcat::mcset fr "point flag:air-draught" [encoding convertfrom utf-8 "courant d\342\200\231air"] ::msgcat::mcset it "point flag:air-draught" [encoding convertfrom utf-8 "corrente d'aria"] ::msgcat::mcset mi "point flag:air-draught" [encoding convertfrom utf-8 "tawhiri"] ::msgcat::mcset pl "point flag:air-draught" [encoding convertfrom utf-8 "przewiew"] ::msgcat::mcset pt "point flag:air-draught" [encoding convertfrom utf-8 "presen\303\247a de vento"] ::msgcat::mcset pt_BR "point flag:air-draught" [encoding convertfrom utf-8 "presen\303\247a de vento"] ::msgcat::mcset pt_PT "point flag:air-draught" [encoding convertfrom utf-8 "presen\303\247a de vento"] ::msgcat::mcset ru "point flag:air-draught" [encoding convertfrom utf-8 "\321\202\320\276\320\272 \320\262\320\276\320\267\320\264\321\203\321\205\320\260"] ::msgcat::mcset sk "point flag:air-draught" [encoding convertfrom utf-8 "prievan"] ::msgcat::mcset sq "point flag:air-draught" [encoding convertfrom utf-8 "rrymim i ajrit"] ::msgcat::mcset en "point flag:arch" [encoding convertfrom utf-8 "arch"] ::msgcat::mcset en_UK "point flag:arch" [encoding convertfrom utf-8 "arch"] ::msgcat::mcset en_US "point flag:arch" [encoding convertfrom utf-8 "arch"] ::msgcat::mcset sk "point flag:arch" [encoding convertfrom utf-8 "skaln\303\275 obl\303\272k"] ::msgcat::mcset bg "point flag:continuation" [encoding convertfrom utf-8 "\320\262\321\212\320\267\320\274\320\276\320\266\320\275\320\276 \320\277\321\200\320\276\320\264\321\212\320\273\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point flag:continuation" [encoding convertfrom utf-8 "mo\305\276n\303\251 pokra\304\215ov\303\241n\303\255"] ::msgcat::mcset de "point flag:continuation" [encoding convertfrom utf-8 "Fortsetzung"] ::msgcat::mcset el "point flag:continuation" [encoding convertfrom utf-8 "\317\200\316\271\316\270\316\261\316\275\316\256 \317\203\317\205\316\275\316\255\317\207\316\265\316\271\316\261"] ::msgcat::mcset en "point flag:continuation" [encoding convertfrom utf-8 "possible continuation"] ::msgcat::mcset en_UK "point flag:continuation" [encoding convertfrom utf-8 "possible continuation"] ::msgcat::mcset en_US "point flag:continuation" [encoding convertfrom utf-8 "possible continuation"] ::msgcat::mcset es "point flag:continuation" [encoding convertfrom utf-8 "continuaci\303\263n"] ::msgcat::mcset fr "point flag:continuation" [encoding convertfrom utf-8 "suite possible"] ::msgcat::mcset it "point flag:continuation" [encoding convertfrom utf-8 "possibile prosecuzione"] ::msgcat::mcset mi "point flag:continuation" [encoding convertfrom utf-8 "roanga taea"] ::msgcat::mcset pl "point flag:continuation" [encoding convertfrom utf-8 "mo\305\274liwa kontynuacja"] ::msgcat::mcset pt "point flag:continuation" [encoding convertfrom utf-8 "poss\303\255vel continua\303\247\303\243o"] ::msgcat::mcset pt_BR "point flag:continuation" [encoding convertfrom utf-8 "poss\303\255vel continua\303\247\303\243o"] ::msgcat::mcset pt_PT "point flag:continuation" [encoding convertfrom utf-8 "poss\303\255vel continua\303\247\303\243o"] ::msgcat::mcset ru "point flag:continuation" [encoding convertfrom utf-8 "\320\262\320\276\320\267\320\274\320\276\320\266\320\275\320\276\320\265 \320\277\321\200\320\276\320\264\320\276\320\273\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "point flag:continuation" [encoding convertfrom utf-8 "mo\305\276n\303\251 pokra\304\215ovanie"] ::msgcat::mcset sq "point flag:continuation" [encoding convertfrom utf-8 "vazhdim I mundshem"] ::msgcat::mcset bg "point flag:dig" [encoding convertfrom utf-8 "\320\270\320\267\320\272\320\276\320\277"] ::msgcat::mcset cz "point flag:dig" [encoding convertfrom utf-8 "sonda"] ::msgcat::mcset de "point flag:dig" [encoding convertfrom utf-8 "Grabung"] ::msgcat::mcset el "point flag:dig" [encoding convertfrom utf-8 "\316\264\316\271\316\254\316\275\316\277\316\271\316\276\316\267"] ::msgcat::mcset en "point flag:dig" [encoding convertfrom utf-8 "dig"] ::msgcat::mcset en_UK "point flag:dig" [encoding convertfrom utf-8 "dig"] ::msgcat::mcset en_US "point flag:dig" [encoding convertfrom utf-8 "dig"] ::msgcat::mcset fr "point flag:dig" [encoding convertfrom utf-8 "d\303\251sobstruction"] ::msgcat::mcset it "point flag:dig" [encoding convertfrom utf-8 "disostruzione"] ::msgcat::mcset mi "point flag:dig" [encoding convertfrom utf-8 "kari"] ::msgcat::mcset pl "point flag:dig" [encoding convertfrom utf-8 "wykop"] ::msgcat::mcset sk "point flag:dig" [encoding convertfrom utf-8 "sonda"] ::msgcat::mcset sq "point flag:dig" [encoding convertfrom utf-8 "mihje"] ::msgcat::mcset cz "point flag:doline" [encoding convertfrom utf-8 "z\303\241vrt"] ::msgcat::mcset en "point flag:doline" [encoding convertfrom utf-8 "doline"] ::msgcat::mcset en_UK "point flag:doline" [encoding convertfrom utf-8 "doline"] ::msgcat::mcset en_US "point flag:doline" [encoding convertfrom utf-8 "doline"] ::msgcat::mcset sk "point flag:doline" [encoding convertfrom utf-8 "z\303\241vrt"] ::msgcat::mcset bg "point flag:entrance" [encoding convertfrom utf-8 "\320\262\321\205\320\276\320\264"] ::msgcat::mcset cz "point flag:entrance" [encoding convertfrom utf-8 "vchod"] ::msgcat::mcset de "point flag:entrance" [encoding convertfrom utf-8 "Eingang"] ::msgcat::mcset el "point flag:entrance" [encoding convertfrom utf-8 "\316\265\316\257\317\203\316\277\316\264\316\277\317\202"] ::msgcat::mcset en "point flag:entrance" [encoding convertfrom utf-8 "entrance"] ::msgcat::mcset en_UK "point flag:entrance" [encoding convertfrom utf-8 "entrance"] ::msgcat::mcset en_US "point flag:entrance" [encoding convertfrom utf-8 "entrance"] ::msgcat::mcset es "point flag:entrance" [encoding convertfrom utf-8 "boca"] ::msgcat::mcset fr "point flag:entrance" [encoding convertfrom utf-8 "entr\303\251e"] ::msgcat::mcset it "point flag:entrance" [encoding convertfrom utf-8 "ingresso"] ::msgcat::mcset mi "point flag:entrance" [encoding convertfrom utf-8 "ana ngutu"] ::msgcat::mcset pl "point flag:entrance" [encoding convertfrom utf-8 "wej\305\233cie"] ::msgcat::mcset pt "point flag:entrance" [encoding convertfrom utf-8 "entrada"] ::msgcat::mcset pt_BR "point flag:entrance" [encoding convertfrom utf-8 "entrada"] ::msgcat::mcset pt_PT "point flag:entrance" [encoding convertfrom utf-8 "entrada"] ::msgcat::mcset ru "point flag:entrance" [encoding convertfrom utf-8 "\320\262\321\205\320\276\320\264"] ::msgcat::mcset sk "point flag:entrance" [encoding convertfrom utf-8 "vchod"] ::msgcat::mcset sq "point flag:entrance" [encoding convertfrom utf-8 "hyrja"] ::msgcat::mcset bg "point flag:overhang" [encoding convertfrom utf-8 "\321\201\320\272\320\260\320\273\320\275\320\260 \320\277\320\273\320\276\321\211\320\260\320\264\320\272\320\260"] ::msgcat::mcset cz "point flag:overhang" [encoding convertfrom utf-8 "p\305\231evis"] ::msgcat::mcset de "point flag:overhang" [encoding convertfrom utf-8 "\303\234berhang"] ::msgcat::mcset el "point flag:overhang" [encoding convertfrom utf-8 "\317\200\317\201\316\277\316\255\316\272\317\204\316\261\317\203\316\267 \316\277\317\201\316\277\317\206\316\256\317\202"] ::msgcat::mcset en "point flag:overhang" [encoding convertfrom utf-8 "overhang"] ::msgcat::mcset en_UK "point flag:overhang" [encoding convertfrom utf-8 "overhang"] ::msgcat::mcset en_US "point flag:overhang" [encoding convertfrom utf-8 "overhang"] ::msgcat::mcset es "point flag:overhang" [encoding convertfrom utf-8 "extraplomo"] ::msgcat::mcset fr "point flag:overhang" [encoding convertfrom utf-8 "surplomb"] ::msgcat::mcset it "point flag:overhang" [encoding convertfrom utf-8 "sporgenza"] ::msgcat::mcset mi "point flag:overhang" [encoding convertfrom utf-8 "tauwharenga"] ::msgcat::mcset pl "point flag:overhang" [encoding convertfrom utf-8 "przewieszka"] ::msgcat::mcset pt "point flag:overhang" [encoding convertfrom utf-8 "proje\303\247\303\243o"] ::msgcat::mcset pt_BR "point flag:overhang" [encoding convertfrom utf-8 "proje\303\247\303\243o"] ::msgcat::mcset pt_PT "point flag:overhang" [encoding convertfrom utf-8 "projec\303\247\303\243o"] ::msgcat::mcset ru "point flag:overhang" [encoding convertfrom utf-8 "\320\275\320\260\320\262\320\270\321\201\320\260\320\275\320\270\320\265 \320\277\320\276\321\202\320\276\320\273\320\272\320\260"] ::msgcat::mcset sk "point flag:overhang" [encoding convertfrom utf-8 "previs"] ::msgcat::mcset sq "point flag:overhang" [encoding convertfrom utf-8 "varese"] ::msgcat::mcset bg "point flag:sink" [encoding convertfrom utf-8 "\320\277\320\276\320\275\320\276\321\200"] ::msgcat::mcset cz "point flag:sink" [encoding convertfrom utf-8 "ponor"] ::msgcat::mcset de "point flag:sink" [encoding convertfrom utf-8 "Schluckloch"] ::msgcat::mcset el "point flag:sink" [encoding convertfrom utf-8 "\316\272\316\261\317\204\316\261\316\262\317\214\316\270\317\201\316\261"] ::msgcat::mcset en "point flag:sink" [encoding convertfrom utf-8 "sink"] ::msgcat::mcset en_UK "point flag:sink" [encoding convertfrom utf-8 "sink"] ::msgcat::mcset en_US "point flag:sink" [encoding convertfrom utf-8 "sink"] ::msgcat::mcset es "point flag:sink" [encoding convertfrom utf-8 "sumidero"] ::msgcat::mcset fr "point flag:sink" [encoding convertfrom utf-8 "perte"] ::msgcat::mcset it "point flag:sink" [encoding convertfrom utf-8 "perdita"] ::msgcat::mcset mi "point flag:sink" [encoding convertfrom utf-8 "tapoko"] ::msgcat::mcset pl "point flag:sink" [encoding convertfrom utf-8 "ponor"] ::msgcat::mcset pt "point flag:sink" [encoding convertfrom utf-8 "sumidouro"] ::msgcat::mcset pt_BR "point flag:sink" [encoding convertfrom utf-8 "sumidouro"] ::msgcat::mcset pt_PT "point flag:sink" [encoding convertfrom utf-8 "sumidouro"] ::msgcat::mcset ru "point flag:sink" [encoding convertfrom utf-8 "\321\201\321\202\320\276\320\272"] ::msgcat::mcset sk "point flag:sink" [encoding convertfrom utf-8 "ponor"] ::msgcat::mcset sq "point flag:sink" [encoding convertfrom utf-8 "pus"] ::msgcat::mcset bg "point flag:spring" [encoding convertfrom utf-8 "\320\270\320\267\320\262\320\276\321\200"] ::msgcat::mcset cz "point flag:spring" [encoding convertfrom utf-8 "v\303\275v\304\233r"] ::msgcat::mcset de "point flag:spring" [encoding convertfrom utf-8 "Quelle"] ::msgcat::mcset el "point flag:spring" [encoding convertfrom utf-8 "\317\200\316\267\316\263\316\256"] ::msgcat::mcset en "point flag:spring" [encoding convertfrom utf-8 "spring"] ::msgcat::mcset en_UK "point flag:spring" [encoding convertfrom utf-8 "spring"] ::msgcat::mcset en_US "point flag:spring" [encoding convertfrom utf-8 "spring"] ::msgcat::mcset es "point flag:spring" [encoding convertfrom utf-8 "surgencia"] ::msgcat::mcset fr "point flag:spring" [encoding convertfrom utf-8 "source"] ::msgcat::mcset it "point flag:spring" [encoding convertfrom utf-8 "sorgente"] ::msgcat::mcset mi "point flag:spring" [encoding convertfrom utf-8 "waipuna"] ::msgcat::mcset pl "point flag:spring" [encoding convertfrom utf-8 "wywierzysko"] ::msgcat::mcset pt "point flag:spring" [encoding convertfrom utf-8 "nascente"] ::msgcat::mcset pt_BR "point flag:spring" [encoding convertfrom utf-8 "nascente"] ::msgcat::mcset pt_PT "point flag:spring" [encoding convertfrom utf-8 "nascente"] ::msgcat::mcset ru "point flag:spring" [encoding convertfrom utf-8 "\320\270\321\201\321\202\320\276\320\272"] ::msgcat::mcset sk "point flag:spring" [encoding convertfrom utf-8 "v\303\275ver"] ::msgcat::mcset sq "point flag:spring" [encoding convertfrom utf-8 "burim"] ::msgcat::mcset bg "point flowstone" [encoding convertfrom utf-8 "\320\275\320\260\321\202\320\265\320\272"] ::msgcat::mcset cz "point flowstone" [encoding convertfrom utf-8 "sintr"] ::msgcat::mcset de "point flowstone" [encoding convertfrom utf-8 "fl\303\244chiger Sinter"] ::msgcat::mcset el "point flowstone" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\317\214 \317\205\316\273\316\271\316\272\317\214 \316\264\316\261\317\200\316\255\316\264\316\277\317\205"] ::msgcat::mcset en "point flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset en_UK "point flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset en_US "point flowstone" [encoding convertfrom utf-8 "flowstone"] ::msgcat::mcset es "point flowstone" [encoding convertfrom utf-8 "concreci\303\263n"] ::msgcat::mcset fr "point flowstone" [encoding convertfrom utf-8 "concr\303\251tions"] ::msgcat::mcset it "point flowstone" [encoding convertfrom utf-8 "concrezione"] ::msgcat::mcset mi "point flowstone" [encoding convertfrom utf-8 "pari k\305\215hatu"] ::msgcat::mcset pl "point flowstone" [encoding convertfrom utf-8 "nacieki"] ::msgcat::mcset pt "point flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset pt_BR "point flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset pt_PT "point flowstone" [encoding convertfrom utf-8 "escorrimento"] ::msgcat::mcset ru "point flowstone" [encoding convertfrom utf-8 "\320\275\320\260\321\202\320\265\320\272"] ::msgcat::mcset sk "point flowstone" [encoding convertfrom utf-8 "sinter"] ::msgcat::mcset sq "point flowstone" [encoding convertfrom utf-8 "gurre-rrjedhes"] ::msgcat::mcset bg "point flowstone-choke" [encoding convertfrom utf-8 "\320\261\320\273\320\276\320\272\320\270\321\200\320\260\320\275\320\276 \320\276\321\202 \320\275\320\260\321\202\320\265\321\206\320\270"] ::msgcat::mcset cz "point flowstone-choke" [encoding convertfrom utf-8 "zasintrovan\303\275 konec"] ::msgcat::mcset de "point flowstone-choke" [encoding convertfrom utf-8 "Fortsetzung zugesintert"] ::msgcat::mcset el "point flowstone-choke" [encoding convertfrom utf-8 "\316\272\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \317\203\317\204\316\277\316\254\317\202 \316\273\317\214\316\263\316\277 \317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\316\277\317\215 \316\261\317\200\316\277\316\270\316\255\316\274\316\261\317\204\316\277\317\202"] ::msgcat::mcset en "point flowstone-choke" [encoding convertfrom utf-8 "flowstone choke"] ::msgcat::mcset en_UK "point flowstone-choke" [encoding convertfrom utf-8 "flowstone choke"] ::msgcat::mcset en_US "point flowstone-choke" [encoding convertfrom utf-8 "flowstone choke"] ::msgcat::mcset es "point flowstone-choke" [encoding convertfrom utf-8 "colmatado por concreci\303\263n"] ::msgcat::mcset fr "point flowstone-choke" [encoding convertfrom utf-8 "tr\303\251mie calcifi\303\251e"] ::msgcat::mcset it "point flowstone-choke" [encoding convertfrom utf-8 "chiude su colata"] ::msgcat::mcset mi "point flowstone-choke" [encoding convertfrom utf-8 "nati pari k\305\215hatu"] ::msgcat::mcset pl "point flowstone-choke" [encoding convertfrom utf-8 "koniec zamkni\304\231ty naciekami"] ::msgcat::mcset pt "point flowstone-choke" [encoding convertfrom utf-8 "obstru\303\247\303\243o por escorrimento"] ::msgcat::mcset pt_BR "point flowstone-choke" [encoding convertfrom utf-8 "obstru\303\247\303\243o por escorrimento"] ::msgcat::mcset pt_PT "point flowstone-choke" [encoding convertfrom utf-8 "obstru\303\247\303\243o por escorrimento"] ::msgcat::mcset ru "point flowstone-choke" [encoding convertfrom utf-8 "\320\261\320\273\320\276\320\272\320\270\321\200\320\276\320\262\320\260\320\275\320\276 \320\275\320\260\321\202\320\265\320\272\320\260\320\274\320\270"] ::msgcat::mcset sk "point flowstone-choke" [encoding convertfrom utf-8 "zasintren\303\275 koniec"] ::msgcat::mcset sq "point flowstone-choke" [encoding convertfrom utf-8 "mbyllje me gurre-rrjedhes"] ::msgcat::mcset bg "point flute" [encoding convertfrom utf-8 "\320\272\320\260\321\200\320\275\320\270 \320\266\320\273\320\265\320\261\320\276\320\262\320\265"] ::msgcat::mcset cz "point flute" [encoding convertfrom utf-8 "p\303\255\305\241\305\245aly"] ::msgcat::mcset de "point flute" [encoding convertfrom utf-8 "Kolk"] ::msgcat::mcset el "point flute" [encoding convertfrom utf-8 "\316\261\317\205\316\273\316\254\316\272\316\271 \316\264\316\271\316\254\316\262\317\201\317\211\317\203\316\267\317\202"] ::msgcat::mcset en "point flute" [encoding convertfrom utf-8 "flute"] ::msgcat::mcset en_UK "point flute" [encoding convertfrom utf-8 "flute"] ::msgcat::mcset en_US "point flute" [encoding convertfrom utf-8 "flute"] ::msgcat::mcset es "point flute" [encoding convertfrom utf-8 "canaleta"] ::msgcat::mcset fr "point flute" [encoding convertfrom utf-8 "marmites"] ::msgcat::mcset it "point flute" [encoding convertfrom utf-8 "scanalatura"] ::msgcat::mcset mi "point flute" [encoding convertfrom utf-8 "koauau"] ::msgcat::mcset pl "point flute" [encoding convertfrom utf-8 "marmity"] ::msgcat::mcset pt "point flute" [encoding convertfrom utf-8 "marcas de fluxo"] ::msgcat::mcset pt_BR "point flute" [encoding convertfrom utf-8 "marcas de fluxo"] ::msgcat::mcset pt_PT "point flute" [encoding convertfrom utf-8 "marcas de fluxo"] ::msgcat::mcset ru "point flute" [encoding convertfrom utf-8 "\320\272\320\260\320\275\320\260\320\262\320\272\320\270"] ::msgcat::mcset sk "point flute" [encoding convertfrom utf-8 "p\303\255\305\241\305\245aly"] ::msgcat::mcset sq "point flute" [encoding convertfrom utf-8 "flauta"] ::msgcat::mcset bg "point gradient" [encoding convertfrom utf-8 "\320\275\320\260\320\272\320\273\320\276\320\275 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "point gradient" [encoding convertfrom utf-8 "sklon chodby"] ::msgcat::mcset de "point gradient" [encoding convertfrom utf-8 "Gef\303\244lle"] ::msgcat::mcset el "point gradient" [encoding convertfrom utf-8 "\316\272\316\273\316\257\317\203\316\267 \317\203\317\204\316\277\316\254\317\202"] ::msgcat::mcset en "point gradient" [encoding convertfrom utf-8 "passage gradient"] ::msgcat::mcset en_UK "point gradient" [encoding convertfrom utf-8 "passage gradient"] ::msgcat::mcset en_US "point gradient" [encoding convertfrom utf-8 "passage gradient"] ::msgcat::mcset es "point gradient" [encoding convertfrom utf-8 "gradiente"] ::msgcat::mcset fr "point gradient" [encoding convertfrom utf-8 "pente"] ::msgcat::mcset it "point gradient" [encoding convertfrom utf-8 "scivolo"] ::msgcat::mcset mi "point gradient" [encoding convertfrom utf-8 "harapaki putanga"] ::msgcat::mcset pl "point gradient" [encoding convertfrom utf-8 "nachylenie korytarza"] ::msgcat::mcset pt "point gradient" [encoding convertfrom utf-8 "declividade da galeria"] ::msgcat::mcset pt_BR "point gradient" [encoding convertfrom utf-8 "declividade da galeria"] ::msgcat::mcset pt_PT "point gradient" [encoding convertfrom utf-8 "declividade da galeria"] ::msgcat::mcset ru "point gradient" [encoding convertfrom utf-8 "\321\203\320\272\320\273\320\276\320\275 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "point gradient" [encoding convertfrom utf-8 "sklon chodby"] ::msgcat::mcset sq "point gradient" [encoding convertfrom utf-8 "pjertesia e kalimit"] ::msgcat::mcset bg "point guano" [encoding convertfrom utf-8 "\320\263\321\203\320\260\320\275\320\276"] ::msgcat::mcset cz "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset de "point guano" [encoding convertfrom utf-8 "Guano"] ::msgcat::mcset el "point guano" [encoding convertfrom utf-8 "\316\263\316\272\316\277\317\205\316\261\316\275\317\214 (\317\200\316\265\317\201\316\271\317\204\317\204\317\216\316\274\316\261\317\204\316\261 \316\275\317\205\317\207\317\204\316\265\317\201\316\257\316\264\317\211\316\275)"] ::msgcat::mcset en "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset en_UK "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset en_US "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset es "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset fr "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset it "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset mi "point guano" [encoding convertfrom utf-8 "tutae"] ::msgcat::mcset pl "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset pt "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset pt_BR "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset pt_PT "point guano" [encoding convertfrom utf-8 "guano"] ::msgcat::mcset ru "point guano" [encoding convertfrom utf-8 "\320\263\321\203\320\260\320\275\320\276"] ::msgcat::mcset sk "point guano" [encoding convertfrom utf-8 "gu\303\241no"] ::msgcat::mcset sq "point guano" [encoding convertfrom utf-8 "jashteqitje e lakuriqeve-guano"] ::msgcat::mcset bg "point gypsum" [encoding convertfrom utf-8 "\320\263\320\270\320\277\321\201"] ::msgcat::mcset cz "point gypsum" [encoding convertfrom utf-8 "s\303\241drovec"] ::msgcat::mcset de "point gypsum" [encoding convertfrom utf-8 "Gips"] ::msgcat::mcset el "point gypsum" [encoding convertfrom utf-8 "\316\263\317\215\317\210\316\277\317\202"] ::msgcat::mcset en "point gypsum" [encoding convertfrom utf-8 "gypsum"] ::msgcat::mcset en_UK "point gypsum" [encoding convertfrom utf-8 "gypsum"] ::msgcat::mcset en_US "point gypsum" [encoding convertfrom utf-8 "gypsum"] ::msgcat::mcset es "point gypsum" [encoding convertfrom utf-8 "yeso"] ::msgcat::mcset fr "point gypsum" [encoding convertfrom utf-8 "gypse"] ::msgcat::mcset it "point gypsum" [encoding convertfrom utf-8 "gesso"] ::msgcat::mcset mi "point gypsum" [encoding convertfrom utf-8 "tote"] ::msgcat::mcset pl "point gypsum" [encoding convertfrom utf-8 "gips"] ::msgcat::mcset pt "point gypsum" [encoding convertfrom utf-8 "gipsita"] ::msgcat::mcset pt_BR "point gypsum" [encoding convertfrom utf-8 "gipsita"] ::msgcat::mcset pt_PT "point gypsum" [encoding convertfrom utf-8 "gipsita"] ::msgcat::mcset ru "point gypsum" [encoding convertfrom utf-8 "\320\263\320\270\320\277\321\201"] ::msgcat::mcset sk "point gypsum" [encoding convertfrom utf-8 "s\303\241drovec"] ::msgcat::mcset sq "point gypsum" [encoding convertfrom utf-8 "gjips"] ::msgcat::mcset bg "point gypsum-flower" [encoding convertfrom utf-8 "\320\263\320\270\320\277\321\201\320\276\320\262\320\276 \321\206\320\262\320\265\321\202\320\265"] ::msgcat::mcset cz "point gypsum-flower" [encoding convertfrom utf-8 "s\303\241drovcov\303\275 kv\304\233t"] ::msgcat::mcset de "point gypsum-flower" [encoding convertfrom utf-8 "Gipsblume"] ::msgcat::mcset el "point gypsum-flower" [encoding convertfrom utf-8 "\316\254\316\275\316\270\316\277\317\202 \316\263\317\215\317\210\316\277\317\205"] ::msgcat::mcset en "point gypsum-flower" [encoding convertfrom utf-8 "gypsum flower"] ::msgcat::mcset en_UK "point gypsum-flower" [encoding convertfrom utf-8 "gypsum flower"] ::msgcat::mcset en_US "point gypsum-flower" [encoding convertfrom utf-8 "gypsum flower"] ::msgcat::mcset es "point gypsum-flower" [encoding convertfrom utf-8 "flor yeso"] ::msgcat::mcset fr "point gypsum-flower" [encoding convertfrom utf-8 "fleur de gypse"] ::msgcat::mcset it "point gypsum-flower" [encoding convertfrom utf-8 "fiore di gesso"] ::msgcat::mcset mi "point gypsum-flower" [encoding convertfrom utf-8 "putiputi tote"] ::msgcat::mcset pl "point gypsum-flower" [encoding convertfrom utf-8 "gipsowy kwiat"] ::msgcat::mcset pt "point gypsum-flower" [encoding convertfrom utf-8 "flor de gipsita"] ::msgcat::mcset pt_BR "point gypsum-flower" [encoding convertfrom utf-8 "flor de gipsita"] ::msgcat::mcset pt_PT "point gypsum-flower" [encoding convertfrom utf-8 "flor de gipsita"] ::msgcat::mcset ru "point gypsum-flower" [encoding convertfrom utf-8 "\320\263\320\270\320\277\321\201\320\276\320\262\321\213\320\265 \321\206\320\262\320\265\321\202\321\213"] ::msgcat::mcset sk "point gypsum-flower" [encoding convertfrom utf-8 "s\303\241drovcov\303\275 kvet"] ::msgcat::mcset sq "point gypsum-flower" [encoding convertfrom utf-8 "lule gjipsi"] ::msgcat::mcset bg "point height" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\277\321\200\320\260\320\263/\320\272\320\276\320\274\320\270\320\275/\320\272\320\273\320\260\320\264\320\265\320\275\320\265\321\206"] ::msgcat::mcset cz "point height" [encoding convertfrom utf-8 "v\303\275\305\241ka stupn\304\233/kom\303\255nu/hloubka propasti"] ::msgcat::mcset de "point height" [encoding convertfrom utf-8 "H\303\266he der Stufe oder des Schlotes oder Tiefe des Schachts"] ::msgcat::mcset el "point height" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \317\203\316\272\316\261\316\273\316\277\317\200\316\261\317\204\316\271\316\277\317\215/\316\272\316\261\316\274\316\271\316\275\316\254\316\264\316\261\317\202 \316\256 \316\262\316\254\316\270\316\277\317\202 \317\200\316\267\316\263\316\261\316\264\316\271\316\277\317\215"] ::msgcat::mcset en "point height" [encoding convertfrom utf-8 "floor step/chimney/pit height/depth"] ::msgcat::mcset en_UK "point height" [encoding convertfrom utf-8 "floor step/chimney/pit height/depth"] ::msgcat::mcset en_US "point height" [encoding convertfrom utf-8 "floor step/chimney/pit height/depth"] ::msgcat::mcset es "point height" [encoding convertfrom utf-8 "altura resalte/chimenea/profundidad pozo"] ::msgcat::mcset fr "point height" [encoding convertfrom utf-8 "hauteur d\342\200\231une marche/d\342\200\231une chemin\303\251e/profondeur"] ::msgcat::mcset it "point height" [encoding convertfrom utf-8 "altezza"] ::msgcat::mcset mi "point height" [encoding convertfrom utf-8 "papa tapuae/tumera/teitei rua/h\305\215honu"] ::msgcat::mcset pl "point height" [encoding convertfrom utf-8 "wysoko\305\233\304\207 progu/komina/g\305\202\304\231boko\305\233\304\207 studni"] ::msgcat::mcset pt "point height" [encoding convertfrom utf-8 "altura do ch\303\243o para degrau/chamin\303\251/desn\303\255vel"] ::msgcat::mcset pt_BR "point height" [encoding convertfrom utf-8 "altura do ch\303\243o para degrau/chamin\303\251/desn\303\255vel"] ::msgcat::mcset pt_PT "point height" [encoding convertfrom utf-8 "altura do ch\303\243o para degrau/chamin\303\251/desn\303\255vel"] ::msgcat::mcset ru "point height" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \321\203\321\201\321\202\321\203\320\277\320\260/\321\202\321\200\321\203\320\261\321\213/\320\272\320\276\320\273\320\276\320\264\321\206\320\260"] ::msgcat::mcset sk "point height" [encoding convertfrom utf-8 "v\303\275\305\241ka/h\304\272bka stup\305\210a/kom\303\255na"] ::msgcat::mcset sq "point height" [encoding convertfrom utf-8 "lartesia e shkalles ne dysheme/oxhaku/thellesia e leshimit"] ::msgcat::mcset bg "point height:negative" [encoding convertfrom utf-8 "\320\224\321\212\320\273\320\261\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\272\320\273\320\260\320\264\320\265\320\275\320\265\321\206"] ::msgcat::mcset cz "point height:negative" [encoding convertfrom utf-8 "hloubka propasti"] ::msgcat::mcset de "point height:negative" [encoding convertfrom utf-8 "Tiefe des Schachts"] ::msgcat::mcset el "point height:negative" [encoding convertfrom utf-8 "\316\262\316\254\316\270\316\277\317\202 \317\200\316\267\316\263\316\261\316\264\316\271\316\277\317\215"] ::msgcat::mcset en "point height:negative" [encoding convertfrom utf-8 "pit depth"] ::msgcat::mcset en_UK "point height:negative" [encoding convertfrom utf-8 "pit depth"] ::msgcat::mcset en_US "point height:negative" [encoding convertfrom utf-8 "pit depth"] ::msgcat::mcset es "point height:negative" [encoding convertfrom utf-8 "profundidad pozo"] ::msgcat::mcset fr "point height:negative" [encoding convertfrom utf-8 "profondeur"] ::msgcat::mcset it "point height:negative" [encoding convertfrom utf-8 "prodondit\303\240 pozzo"] ::msgcat::mcset mi "point height:negative" [encoding convertfrom utf-8 "rua h\305\215honu"] ::msgcat::mcset pl "point height:negative" [encoding convertfrom utf-8 "g\305\202\304\231bokosc studni"] ::msgcat::mcset pt "point height:negative" [encoding convertfrom utf-8 "profundidade do desn\303\255vel"] ::msgcat::mcset pt_BR "point height:negative" [encoding convertfrom utf-8 "profundidade do desn\303\255vel"] ::msgcat::mcset pt_PT "point height:negative" [encoding convertfrom utf-8 "profundidade do desn\303\255vel"] ::msgcat::mcset ru "point height:negative" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \320\272\320\276\320\273\320\276\320\264\321\206\320\260"] ::msgcat::mcset sk "point height:negative" [encoding convertfrom utf-8 "h\304\272bka priepasti"] ::msgcat::mcset sq "point height:negative" [encoding convertfrom utf-8 "thellesia e leshimit"] ::msgcat::mcset bg "point height:positive" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\272\320\276\320\274\320\270\320\275"] ::msgcat::mcset cz "point height:positive" [encoding convertfrom utf-8 "v\303\275\305\241ka kom\303\255nu"] ::msgcat::mcset de "point height:positive" [encoding convertfrom utf-8 "H\303\266he des Schlotes"] ::msgcat::mcset el "point height:positive" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \316\272\316\261\316\274\316\271\316\275\316\254\316\264\316\261\317\202"] ::msgcat::mcset en "point height:positive" [encoding convertfrom utf-8 "chimney height"] ::msgcat::mcset en_UK "point height:positive" [encoding convertfrom utf-8 "chimney height"] ::msgcat::mcset en_US "point height:positive" [encoding convertfrom utf-8 "chimney height"] ::msgcat::mcset es "point height:positive" [encoding convertfrom utf-8 "altura chimenea"] ::msgcat::mcset fr "point height:positive" [encoding convertfrom utf-8 "hauteur d\342\200\231une chemin\303\251e"] ::msgcat::mcset it "point height:positive" [encoding convertfrom utf-8 "altezza camino"] ::msgcat::mcset mi "point height:positive" [encoding convertfrom utf-8 "teitei tumera"] ::msgcat::mcset pl "point height:positive" [encoding convertfrom utf-8 "wysoko\305\233\304\207 komina"] ::msgcat::mcset pt "point height:positive" [encoding convertfrom utf-8 "altura da chamin\303\251"] ::msgcat::mcset pt_BR "point height:positive" [encoding convertfrom utf-8 "altura da chamin\303\251"] ::msgcat::mcset pt_PT "point height:positive" [encoding convertfrom utf-8 "altura da chamin\303\251"] ::msgcat::mcset ru "point height:positive" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \321\202\321\200\321\203\320\261\321\213"] ::msgcat::mcset sk "point height:positive" [encoding convertfrom utf-8 "v\303\275\305\241ka kom\303\255na"] ::msgcat::mcset sq "point height:positive" [encoding convertfrom utf-8 "lartesia e oxhakut"] ::msgcat::mcset bg "point height:unsigned" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\275\320\270\321\210\320\260 \320\262 \321\202\320\260\320\262\320\260\320\275\320\260"] ::msgcat::mcset cz "point height:unsigned" [encoding convertfrom utf-8 "v\303\275\305\241ka stupn\304\233"] ::msgcat::mcset de "point height:unsigned" [encoding convertfrom utf-8 "H\303\266he der Bodenstufe"] ::msgcat::mcset el "point height:unsigned" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \317\203\316\272\316\261\316\273\316\277\317\200\316\261\317\204\316\271\316\277\317\215"] ::msgcat::mcset en "point height:unsigned" [encoding convertfrom utf-8 "floor step height"] ::msgcat::mcset en_UK "point height:unsigned" [encoding convertfrom utf-8 "floor step height"] ::msgcat::mcset en_US "point height:unsigned" [encoding convertfrom utf-8 "floor step height"] ::msgcat::mcset es "point height:unsigned" [encoding convertfrom utf-8 "altura resalte"] ::msgcat::mcset fr "point height:unsigned" [encoding convertfrom utf-8 "hauteur d\342\200\231une marche"] ::msgcat::mcset it "point height:unsigned" [encoding convertfrom utf-8 "altezza camino"] ::msgcat::mcset mi "point height:unsigned" [encoding convertfrom utf-8 "teitei papa tapuae"] ::msgcat::mcset pl "point height:unsigned" [encoding convertfrom utf-8 "wysoko\305\233\304\207 progu"] ::msgcat::mcset pt "point height:unsigned" [encoding convertfrom utf-8 "altura do degrau no ch\303\243o"] ::msgcat::mcset pt_BR "point height:unsigned" [encoding convertfrom utf-8 "altura do degrau no ch\303\243o"] ::msgcat::mcset pt_PT "point height:unsigned" [encoding convertfrom utf-8 "altura do degrau no ch\303\243o"] ::msgcat::mcset ru "point height:unsigned" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \321\203\321\201\321\202\321\203\320\277\320\260"] ::msgcat::mcset sk "point height:unsigned" [encoding convertfrom utf-8 "v\303\275\305\241ka stup\305\210a"] ::msgcat::mcset sq "point height:unsigned" [encoding convertfrom utf-8 "lartesia e shkalles se dyshemes"] ::msgcat::mcset bg "point helictite" [encoding convertfrom utf-8 "\321\205\320\265\320\273\320\270\320\272\321\202\320\270\321\202\320\270"] ::msgcat::mcset cz "point helictite" [encoding convertfrom utf-8 "heliktit"] ::msgcat::mcset de "point helictite" [encoding convertfrom utf-8 "Excentrique"] ::msgcat::mcset el "point helictite" [encoding convertfrom utf-8 "\316\265\316\273\316\271\316\272\317\204\316\257\317\204\316\267\317\202"] ::msgcat::mcset en "point helictite" [encoding convertfrom utf-8 "helictite"] ::msgcat::mcset en_UK "point helictite" [encoding convertfrom utf-8 "helictite"] ::msgcat::mcset en_US "point helictite" [encoding convertfrom utf-8 "helictite"] ::msgcat::mcset es "point helictite" [encoding convertfrom utf-8 "exc\303\251ntrica"] ::msgcat::mcset fr "point helictite" [encoding convertfrom utf-8 "excentrique/h\303\251lictite"] ::msgcat::mcset it "point helictite" [encoding convertfrom utf-8 "eccentrica"] ::msgcat::mcset mi "point helictite" [encoding convertfrom utf-8 "p\304\201keho torotoro"] ::msgcat::mcset pl "point helictite" [encoding convertfrom utf-8 "heliktyt"] ::msgcat::mcset pt "point helictite" [encoding convertfrom utf-8 "helictite"] ::msgcat::mcset pt_BR "point helictite" [encoding convertfrom utf-8 "helictite"] ::msgcat::mcset pt_PT "point helictite" [encoding convertfrom utf-8 "exc\303\252ntrica"] ::msgcat::mcset ru "point helictite" [encoding convertfrom utf-8 "\320\263\320\265\320\273\320\270\320\272\321\202\320\270\321\202\321\213"] ::msgcat::mcset sk "point helictite" [encoding convertfrom utf-8 "heliktit"] ::msgcat::mcset sq "point helictite" [encoding convertfrom utf-8 "heliktite"] ::msgcat::mcset bg "point ice" [encoding convertfrom utf-8 "\320\273\320\265\320\264"] ::msgcat::mcset cz "point ice" [encoding convertfrom utf-8 "led"] ::msgcat::mcset de "point ice" [encoding convertfrom utf-8 "Eis"] ::msgcat::mcset el "point ice" [encoding convertfrom utf-8 "\317\200\316\254\316\263\316\277\317\202"] ::msgcat::mcset en "point ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset en_UK "point ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset en_US "point ice" [encoding convertfrom utf-8 "ice"] ::msgcat::mcset es "point ice" [encoding convertfrom utf-8 "hielo"] ::msgcat::mcset fr "point ice" [encoding convertfrom utf-8 "glace"] ::msgcat::mcset it "point ice" [encoding convertfrom utf-8 "ghiaccio"] ::msgcat::mcset mi "point ice" [encoding convertfrom utf-8 "k\305\215paka"] ::msgcat::mcset pl "point ice" [encoding convertfrom utf-8 "l\303\263d"] ::msgcat::mcset pt "point ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset pt_BR "point ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset pt_PT "point ice" [encoding convertfrom utf-8 "gelo"] ::msgcat::mcset ru "point ice" [encoding convertfrom utf-8 "\320\273\321\221\320\264"] ::msgcat::mcset sk "point ice" [encoding convertfrom utf-8 "\304\276ad"] ::msgcat::mcset sq "point ice" [encoding convertfrom utf-8 "akull"] ::msgcat::mcset de "point ice-pillar" [encoding convertfrom utf-8 "Eiss\303\244ule"] ::msgcat::mcset en "point ice-pillar" [encoding convertfrom utf-8 "ice pillar"] ::msgcat::mcset en_UK "point ice-pillar" [encoding convertfrom utf-8 "ice pillar"] ::msgcat::mcset en_US "point ice-pillar" [encoding convertfrom utf-8 "ice pillar"] ::msgcat::mcset it "point ice-pillar" [encoding convertfrom utf-8 "colonna di ghiaccio"] ::msgcat::mcset mi "point ice-pillar" [encoding convertfrom utf-8 "pou K\305\215paka"] ::msgcat::mcset pl "point ice-pillar" [encoding convertfrom utf-8 "lodowy stalagnat"] ::msgcat::mcset sk "point ice-pillar" [encoding convertfrom utf-8 "\304\276adov\303\275 stalagn\303\241t"] ::msgcat::mcset de "point ice-stalactite" [encoding convertfrom utf-8 "Eisstalaktit"] ::msgcat::mcset en "point ice-stalactite" [encoding convertfrom utf-8 "ice stalactite"] ::msgcat::mcset en_UK "point ice-stalactite" [encoding convertfrom utf-8 "ice stalactite"] ::msgcat::mcset en_US "point ice-stalactite" [encoding convertfrom utf-8 "ice stalactite"] ::msgcat::mcset it "point ice-stalactite" [encoding convertfrom utf-8 "stalattite di ghiaccio"] ::msgcat::mcset mi "point ice-stalactite" [encoding convertfrom utf-8 "k\305\215paka ki te haere ki runga"] ::msgcat::mcset pl "point ice-stalactite" [encoding convertfrom utf-8 "lodowy stalaktyt"] ::msgcat::mcset sk "point ice-stalactite" [encoding convertfrom utf-8 "\304\276adov\303\275 stalaktit"] ::msgcat::mcset de "point ice-stalagmite" [encoding convertfrom utf-8 "Eisstalagmit"] ::msgcat::mcset en "point ice-stalagmite" [encoding convertfrom utf-8 "ice stalagmite"] ::msgcat::mcset en_UK "point ice-stalagmite" [encoding convertfrom utf-8 "ice stalagmite"] ::msgcat::mcset en_US "point ice-stalagmite" [encoding convertfrom utf-8 "ice stalagmite"] ::msgcat::mcset it "point ice-stalagmite" [encoding convertfrom utf-8 "stalagmite di ghiaccio"] ::msgcat::mcset mi "point ice-stalagmite" [encoding convertfrom utf-8 "k\305\215paka ki te haere ki raro"] ::msgcat::mcset pl "point ice-stalagmite" [encoding convertfrom utf-8 "lodowy stalagmit"] ::msgcat::mcset sk "point ice-stalagmite" [encoding convertfrom utf-8 "\304\276adov\303\275 stalagmit"] ::msgcat::mcset bg "point karren" [encoding convertfrom utf-8 "\320\272\320\260\321\200\320\270"] ::msgcat::mcset cz "point karren" [encoding convertfrom utf-8 "\305\241krapy"] ::msgcat::mcset de "point karren" [encoding convertfrom utf-8 "Karren"] ::msgcat::mcset el "point karren" [encoding convertfrom utf-8 "\316\272\316\254\317\201\317\201\316\265\316\275 - \316\263\317\205\316\274\316\275\317\214\317\202 \316\272\316\261\317\201\317\203\317\204\316\271\316\272\316\277\317\200\316\277\316\271\316\267\316\274\316\255\316\275\316\277\317\202 \316\262\317\201\316\254\317\207\316\277\317\202"] ::msgcat::mcset en "point karren" [encoding convertfrom utf-8 "karren"] ::msgcat::mcset en_UK "point karren" [encoding convertfrom utf-8 "karren"] ::msgcat::mcset en_US "point karren" [encoding convertfrom utf-8 "karren"] ::msgcat::mcset es "point karren" [encoding convertfrom utf-8 "lapiaz"] ::msgcat::mcset fr "point karren" [encoding convertfrom utf-8 "lapiez"] ::msgcat::mcset it "point karren" [encoding convertfrom utf-8 "karren"] ::msgcat::mcset mi "point karren" [encoding convertfrom utf-8 "awaawa"] ::msgcat::mcset pl "point karren" [encoding convertfrom utf-8 "\305\274\305\202obki krasowe"] ::msgcat::mcset pt "point karren" [encoding convertfrom utf-8 "lapi\303\241s"] ::msgcat::mcset pt_BR "point karren" [encoding convertfrom utf-8 "lapi\303\241s"] ::msgcat::mcset pt_PT "point karren" [encoding convertfrom utf-8 "lapi\303\241s"] ::msgcat::mcset ru "point karren" [encoding convertfrom utf-8 "\320\272\320\260\321\200\321\200\321\213"] ::msgcat::mcset sk "point karren" [encoding convertfrom utf-8 "\305\241krapy"] ::msgcat::mcset sq "point karren" [encoding convertfrom utf-8 "karreni"] ::msgcat::mcset bg "point label" [encoding convertfrom utf-8 "\320\265\321\202\320\270\320\272\320\265\321\202"] ::msgcat::mcset cz "point label" [encoding convertfrom utf-8 "pojmenov\303\241n\303\255"] ::msgcat::mcset de "point label" [encoding convertfrom utf-8 "Beschriftung"] ::msgcat::mcset el "point label" [encoding convertfrom utf-8 "\317\200\316\265\317\201\316\271\316\263\317\201\316\261\317\206\316\256"] ::msgcat::mcset en "point label" [encoding convertfrom utf-8 "label"] ::msgcat::mcset en_UK "point label" [encoding convertfrom utf-8 "label"] ::msgcat::mcset en_US "point label" [encoding convertfrom utf-8 "label"] ::msgcat::mcset es "point label" [encoding convertfrom utf-8 "etiqueta"] ::msgcat::mcset fr "point label" [encoding convertfrom utf-8 "libell\303\251"] ::msgcat::mcset it "point label" [encoding convertfrom utf-8 "etichetta"] ::msgcat::mcset mi "point label" [encoding convertfrom utf-8 "ingoa"] ::msgcat::mcset pl "point label" [encoding convertfrom utf-8 "nazwa"] ::msgcat::mcset pt "point label" [encoding convertfrom utf-8 "indica\303\247\303\243o"] ::msgcat::mcset pt_BR "point label" [encoding convertfrom utf-8 "indica\303\247\303\243o"] ::msgcat::mcset pt_PT "point label" [encoding convertfrom utf-8 "indica\303\247\303\243o"] ::msgcat::mcset ru "point label" [encoding convertfrom utf-8 "\321\202\320\265\320\272\321\201\321\202\320\276\320\262\320\260\321\217 \320\274\320\265\321\202\320\272\320\260"] ::msgcat::mcset sk "point label" [encoding convertfrom utf-8 "pomenovanie"] ::msgcat::mcset sq "point label" [encoding convertfrom utf-8 "mbishkrim-etiket"] ::msgcat::mcset bg "point low-end" [encoding convertfrom utf-8 "\321\205\320\276\321\200\320\270\320\267\320\276\320\275\321\202\320\260\320\273\320\275\320\276 \321\201\321\202\320\265\321\201\320\275\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point low-end" [encoding convertfrom utf-8 "nepr\305\257lezn\303\251 sn\303\255\305\276en\303\255"] ::msgcat::mcset de "point low-end" [encoding convertfrom utf-8 "Engstelle, zu flach"] ::msgcat::mcset el "point low-end" [encoding convertfrom utf-8 "\316\272\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \317\203\317\204\316\277\316\254\317\202 \316\273\317\214\316\263\317\211 \317\207\316\261\316\274\316\267\316\273\316\256\317\202 \316\277\317\201\316\277\317\206\316\256\317\202"] ::msgcat::mcset en "point low-end" [encoding convertfrom utf-8 "passage end, low"] ::msgcat::mcset en_UK "point low-end" [encoding convertfrom utf-8 "passage end, low"] ::msgcat::mcset en_US "point low-end" [encoding convertfrom utf-8 "passage end, low"] ::msgcat::mcset es "point low-end" [encoding convertfrom utf-8 "final bajo"] ::msgcat::mcset fr "point low-end" [encoding convertfrom utf-8 "passage bas"] ::msgcat::mcset it "point low-end" [encoding convertfrom utf-8 "chiude su laminatoio"] ::msgcat::mcset mi "point low-end" [encoding convertfrom utf-8 "putanga p\304\201paku mutunga"] ::msgcat::mcset pl "point low-end" [encoding convertfrom utf-8 "obni\305\274enie nie do przej\305\233cia"] ::msgcat::mcset pt "point low-end" [encoding convertfrom utf-8 "passagem com final baixo"] ::msgcat::mcset pt_BR "point low-end" [encoding convertfrom utf-8 "passagem com final baixo"] ::msgcat::mcset pt_PT "point low-end" [encoding convertfrom utf-8 "passagem com final baixo"] ::msgcat::mcset ru "point low-end" [encoding convertfrom utf-8 "\320\263\320\276\321\200\320\270\320\267\320\276\320\275\321\202\320\260\320\273\321\214\320\275\320\260\321\217 \321\203\320\267\320\276\321\201\321\202\321\214"] ::msgcat::mcset sk "point low-end" [encoding convertfrom utf-8 "neprielezn\303\251 zn\303\255\305\276enie"] ::msgcat::mcset sq "point low-end" [encoding convertfrom utf-8 "kalim I poshtem-fund"] ::msgcat::mcset bg "point moonmilk" [encoding convertfrom utf-8 "\320\277\320\265\321\211\320\265\321\200\320\275\320\276 \320\274\320\273\321\217\320\272\320\276"] ::msgcat::mcset cz "point moonmilk" [encoding convertfrom utf-8 "nickam\303\255nek"] ::msgcat::mcset de "point moonmilk" [encoding convertfrom utf-8 "Bergmilch"] ::msgcat::mcset el "point moonmilk" [encoding convertfrom utf-8 "\316\263\316\254\316\273\316\261 \317\203\317\200\316\267\316\273\316\261\316\257\316\277\317\205"] ::msgcat::mcset en "point moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset en_UK "point moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset en_US "point moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset es "point moonmilk" [encoding convertfrom utf-8 "mondmilch"] ::msgcat::mcset fr "point moonmilk" [encoding convertfrom utf-8 "mondmilch"] ::msgcat::mcset it "point moonmilk" [encoding convertfrom utf-8 "moonmilk"] ::msgcat::mcset mi "point moonmilk" [encoding convertfrom utf-8 "mirika marama"] ::msgcat::mcset pl "point moonmilk" [encoding convertfrom utf-8 "mi\304\231kkie nacieki"] ::msgcat::mcset pt "point moonmilk" [encoding convertfrom utf-8 "leite-de-lua"] ::msgcat::mcset pt_BR "point moonmilk" [encoding convertfrom utf-8 "leite-de-lua"] ::msgcat::mcset pt_PT "point moonmilk" [encoding convertfrom utf-8 "leite-de-lua"] ::msgcat::mcset ru "point moonmilk" [encoding convertfrom utf-8 "\320\273\321\203\320\275\320\275\320\276\320\265 \320\274\320\276\320\273\320\276\320\272\320\276"] ::msgcat::mcset sk "point moonmilk" [encoding convertfrom utf-8 "m\303\244kk\303\275 sinter"] ::msgcat::mcset sq "point moonmilk" [encoding convertfrom utf-8 "qumesht-hena"] ::msgcat::mcset bg "point narrow-end" [encoding convertfrom utf-8 "\320\275\320\265\320\277\321\200\320\276\321\205\320\276\320\264\320\270\320\274\320\276 \321\201\320\275\320\270\320\266\320\260\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "point narrow-end" [encoding convertfrom utf-8 "nepr\305\257lezn\303\251 z\303\272\305\276en\303\255"] ::msgcat::mcset de "point narrow-end" [encoding convertfrom utf-8 "Engstelle, zu schmal"] ::msgcat::mcset el "point narrow-end" [encoding convertfrom utf-8 "\316\272\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \317\203\317\204\316\277\316\254\317\202 \316\273\317\214\316\263\317\211 \317\203\317\204\316\265\316\275\317\216\316\274\316\261\317\204\316\277\317\202"] ::msgcat::mcset en "point narrow-end" [encoding convertfrom utf-8 "passage end, narrow"] ::msgcat::mcset en_UK "point narrow-end" [encoding convertfrom utf-8 "passage end, narrow"] ::msgcat::mcset en_US "point narrow-end" [encoding convertfrom utf-8 "passage end, narrow"] ::msgcat::mcset es "point narrow-end" [encoding convertfrom utf-8 "final estrecho"] ::msgcat::mcset fr "point narrow-end" [encoding convertfrom utf-8 "passage imp\303\251n\303\251trable"] ::msgcat::mcset it "point narrow-end" [encoding convertfrom utf-8 "chiude su strettoia"] ::msgcat::mcset mi "point narrow-end" [encoding convertfrom utf-8 "putanga kuiti mutunga"] ::msgcat::mcset pl "point narrow-end" [encoding convertfrom utf-8 "zw\304\231\305\274enie nie do przej\305\233cia"] ::msgcat::mcset pt "point narrow-end" [encoding convertfrom utf-8 "passagem com final estreito"] ::msgcat::mcset pt_BR "point narrow-end" [encoding convertfrom utf-8 "passagem com final estreito"] ::msgcat::mcset pt_PT "point narrow-end" [encoding convertfrom utf-8 "passagem com final estreito"] ::msgcat::mcset ru "point narrow-end" [encoding convertfrom utf-8 "\320\262\320\265\321\200\321\202\320\270\320\272\320\260\320\273\321\214\320\275\320\260\321\217 \321\203\320\267\320\276\321\201\321\202\321\214"] ::msgcat::mcset sk "point narrow-end" [encoding convertfrom utf-8 "neprielezn\303\251 z\303\272\305\276enie"] ::msgcat::mcset sq "point narrow-end" [encoding convertfrom utf-8 "kalim I ngushte-fund"] ::msgcat::mcset bg "point no-equipment" [encoding convertfrom utf-8 "\320\273\320\270\320\277\321\201\320\262\320\260 \320\265\320\272\320\270\320\277\320\270\321\200\320\276\320\262\320\272\320\260!"] ::msgcat::mcset cz "point no-equipment" [encoding convertfrom utf-8 "nevystrojen\303\251 m\303\255sto"] ::msgcat::mcset de "point no-equipment" [encoding convertfrom utf-8 "keine Ausr\303\274stung"] ::msgcat::mcset el "point no-equipment" [encoding convertfrom utf-8 "\317\207\317\211\317\201\316\257\317\202 \317\205\316\273\316\271\316\272\316\254"] ::msgcat::mcset en "point no-equipment" [encoding convertfrom utf-8 "no equipment!"] ::msgcat::mcset en_UK "point no-equipment" [encoding convertfrom utf-8 "no equipment!"] ::msgcat::mcset en_US "point no-equipment" [encoding convertfrom utf-8 "no equipment!"] ::msgcat::mcset es "point no-equipment" [encoding convertfrom utf-8 "sin equipar"] ::msgcat::mcset fr "point no-equipment" [encoding convertfrom utf-8 "pas d\342\200\231\303\251quipement"] ::msgcat::mcset it "point no-equipment" [encoding convertfrom utf-8 "senza armo"] ::msgcat::mcset mi "point no-equipment" [encoding convertfrom utf-8 "wahi a taonga mahi kore"] ::msgcat::mcset pl "point no-equipment" [encoding convertfrom utf-8 "miejsce bez punktu asekuracyjnego"] ::msgcat::mcset pt "point no-equipment" [encoding convertfrom utf-8 "local sem equipamento"] ::msgcat::mcset pt_BR "point no-equipment" [encoding convertfrom utf-8 "local sem equipamento"] ::msgcat::mcset pt_PT "point no-equipment" [encoding convertfrom utf-8 "local sem equipamento"] ::msgcat::mcset ru "point no-equipment" [encoding convertfrom utf-8 "\321\201\320\275\320\260\321\200\321\217\320\266\320\265\320\275\320\270\320\265 \320\276\321\202\321\203\321\202\321\201\321\202\320\262\321\203\320\265\321\202!"] ::msgcat::mcset sk "point no-equipment" [encoding convertfrom utf-8 "nevystrojen\303\251 miesto"] ::msgcat::mcset sq "point no-equipment" [encoding convertfrom utf-8 "vend pa pajisje"] ::msgcat::mcset bg "point paleo-material" [encoding convertfrom utf-8 "\320\277\320\260\320\273\320\265\320\276\320\275\321\202\320\276\320\273\320\276\320\263\320\270\321\207\320\275\320\260 \320\275\320\260\321\205\320\276\320\264\320\272\320\260"] ::msgcat::mcset cz "point paleo-material" [encoding convertfrom utf-8 "paleontologick\303\251 n\303\241lezy"] ::msgcat::mcset de "point paleo-material" [encoding convertfrom utf-8 "pal\303\244ontologischer Fund"] ::msgcat::mcset el "point paleo-material" [encoding convertfrom utf-8 "\317\200\316\261\316\273\316\261\316\271\316\277\316\275\317\204\316\277\316\273\316\277\316\263\316\271\316\272\317\214 \316\265\317\215\317\201\316\267\316\274\316\261"] ::msgcat::mcset en "point paleo-material" [encoding convertfrom utf-8 "paleo material"] ::msgcat::mcset en_UK "point paleo-material" [encoding convertfrom utf-8 "paleo material"] ::msgcat::mcset en_US "point paleo-material" [encoding convertfrom utf-8 "paleo material"] ::msgcat::mcset es "point paleo-material" [encoding convertfrom utf-8 "yacimiento (pal)"] ::msgcat::mcset fr "point paleo-material" [encoding convertfrom utf-8 "mat\303\251riel pal\303\251o"] ::msgcat::mcset it "point paleo-material" [encoding convertfrom utf-8 "materiale paleologico"] ::msgcat::mcset mi "point paleo-material" [encoding convertfrom utf-8 "taiao taonga o nehe"] ::msgcat::mcset pl "point paleo-material" [encoding convertfrom utf-8 "znaleziska paleontologiczne"] ::msgcat::mcset pt "point paleo-material" [encoding convertfrom utf-8 "material paleontol\303\263gico"] ::msgcat::mcset pt_BR "point paleo-material" [encoding convertfrom utf-8 "material paleontol\303\263gico"] ::msgcat::mcset pt_PT "point paleo-material" [encoding convertfrom utf-8 "material paleontol\303\263gico"] ::msgcat::mcset ru "point paleo-material" [encoding convertfrom utf-8 "\320\277\320\260\320\273\320\265\320\276-\320\275\320\260\321\205\320\276\320\264\320\272\320\260"] ::msgcat::mcset sk "point paleo-material" [encoding convertfrom utf-8 "paleontologick\303\251 n\303\241lezy"] ::msgcat::mcset sq "point paleo-material" [encoding convertfrom utf-8 "paleo-material"] ::msgcat::mcset bg "point passage-height" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "point passage-height" [encoding convertfrom utf-8 "v\303\275\305\241ka chodby"] ::msgcat::mcset de "point passage-height" [encoding convertfrom utf-8 "Raumh\303\266he"] ::msgcat::mcset el "point passage-height" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \317\203\317\204\316\277\316\254\317\202"] ::msgcat::mcset en "point passage-height" [encoding convertfrom utf-8 "passage height"] ::msgcat::mcset en_UK "point passage-height" [encoding convertfrom utf-8 "passage height"] ::msgcat::mcset en_US "point passage-height" [encoding convertfrom utf-8 "passage height"] ::msgcat::mcset es "point passage-height" [encoding convertfrom utf-8 "altura galer\303\255a"] ::msgcat::mcset fr "point passage-height" [encoding convertfrom utf-8 "hauteur du passage"] ::msgcat::mcset it "point passage-height" [encoding convertfrom utf-8 "altezza galleria"] ::msgcat::mcset mi "point passage-height" [encoding convertfrom utf-8 "ara teitei"] ::msgcat::mcset pl "point passage-height" [encoding convertfrom utf-8 "wysoko\305\233\304\207 korytarza"] ::msgcat::mcset pt "point passage-height" [encoding convertfrom utf-8 "altura da galeria"] ::msgcat::mcset pt_BR "point passage-height" [encoding convertfrom utf-8 "altura da galeria"] ::msgcat::mcset pt_PT "point passage-height" [encoding convertfrom utf-8 "altura da galeria"] ::msgcat::mcset ru "point passage-height" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "point passage-height" [encoding convertfrom utf-8 "v\303\275\305\241ka chodby"] ::msgcat::mcset sq "point passage-height" [encoding convertfrom utf-8 "lartesia e kalimit"] ::msgcat::mcset bg "point passage-height:both" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260\320\264 \320\270 \320\264\321\212\320\273\320\261\320\276\321\207\320\270\320\275\320\260 \320\277\320\276\320\264 \320\262\320\276\320\264\320\260\321\202\320\260"] ::msgcat::mcset cz "point passage-height:both" [encoding convertfrom utf-8 "v\303\275\305\241ka nad i pod hladinou"] ::msgcat::mcset de "point passage-height:both" [encoding convertfrom utf-8 "Raumh\303\266he gesamt"] ::msgcat::mcset el "point passage-height:both" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \316\272\316\261\316\271 \316\262\316\254\316\270\316\277\317\202 \317\203\317\204\316\277\316\254\317\202 \317\200\316\254\316\275\317\211 \316\272\316\261\316\271 \316\272\316\254\317\204\317\211 \316\261\317\200\317\214 \316\275\316\265\317\201\317\214"] ::msgcat::mcset en "point passage-height:both" [encoding convertfrom utf-8 "height above, depth below water"] ::msgcat::mcset en_UK "point passage-height:both" [encoding convertfrom utf-8 "height above, depth below water"] ::msgcat::mcset en_US "point passage-height:both" [encoding convertfrom utf-8 "height above, depth below water"] ::msgcat::mcset es "point passage-height:both" [encoding convertfrom utf-8 "altura y profundidad respecto nivel del mar"] ::msgcat::mcset fr "point passage-height:both" [encoding convertfrom utf-8 "hauteur au dessous et au dessus de l\342\200\231eau"] ::msgcat::mcset it "point passage-height:both" [encoding convertfrom utf-8 "altezza sopra e sotto il livello dell'acqua"] ::msgcat::mcset mi "point passage-height:both" [encoding convertfrom utf-8 "karewa ki runga ki raro"] ::msgcat::mcset pl "point passage-height:both" [encoding convertfrom utf-8 "wysoko\305\233\304\207 korytarza nad powierzchni\304\205 wody i g\305\202\304\231boko\305\233\304\207 poni\305\274ej poziomu wody"] ::msgcat::mcset pt "point passage-height:both" [encoding convertfrom utf-8 "altura acima e profundidade abaixo do n\303\255vel da \303\241gua"] ::msgcat::mcset pt_BR "point passage-height:both" [encoding convertfrom utf-8 "altura acima e profundidade abaixo do n\303\255vel da \303\241gua"] ::msgcat::mcset pt_PT "point passage-height:both" [encoding convertfrom utf-8 "altura acima e profundidade abaixo do n\303\255vel da \303\241gua"] ::msgcat::mcset ru "point passage-height:both" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \320\275\320\260\320\264 \320\270 \320\263\320\273\321\203\320\261\320\270\320\275\320\260 \320\275\320\270\320\266\320\265 \321\203\321\200\320\276\320\262\320\275\321\217 \320\262\320\276\320\264\321\213"] ::msgcat::mcset sk "point passage-height:both" [encoding convertfrom utf-8 "v\303\275\305\241ka nad a h\304\272bka pod hladinou"] ::msgcat::mcset sq "point passage-height:both" [encoding convertfrom utf-8 "lartesia mbi dhe nen nivelin e ujit"] ::msgcat::mcset bg "point passage-height:negative" [encoding convertfrom utf-8 "\320\264\321\212\320\273\320\261\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260 \320\277\320\276\320\264 \320\262\320\276\320\264\320\260\321\202\320\260"] ::msgcat::mcset cz "point passage-height:negative" [encoding convertfrom utf-8 "v\303\275\305\241ka chodby pod hladinou"] ::msgcat::mcset de "point passage-height:negative" [encoding convertfrom utf-8 "Raumh\303\266he nach unten"] ::msgcat::mcset el "point passage-height:negative" [encoding convertfrom utf-8 "\316\262\316\254\316\270\316\277\317\202 \317\203\317\204\316\277\316\254\317\202 \316\272\316\254\317\204\317\211 \316\261\317\200\317\214 \316\275\316\265\317\201\317\214"] ::msgcat::mcset en "point passage-height:negative" [encoding convertfrom utf-8 "depth below water level"] ::msgcat::mcset en_UK "point passage-height:negative" [encoding convertfrom utf-8 "depth below water level"] ::msgcat::mcset en_US "point passage-height:negative" [encoding convertfrom utf-8 "depth below water level"] ::msgcat::mcset es "point passage-height:negative" [encoding convertfrom utf-8 "profundidad bajo nivel del mar"] ::msgcat::mcset fr "point passage-height:negative" [encoding convertfrom utf-8 "hauteur en dessous de l\342\200\231eau"] ::msgcat::mcset it "point passage-height:negative" [encoding convertfrom utf-8 "profondit\303\240 sotto il livello dell'acqua"] ::msgcat::mcset mi "point passage-height:negative" [encoding convertfrom utf-8 "te h\305\215hunu a karewa ki raro"] ::msgcat::mcset pl "point passage-height:negative" [encoding convertfrom utf-8 "wysoko\305\233\304\207 korytarza pod powierzchni\304\205 wody"] ::msgcat::mcset pt "point passage-height:negative" [encoding convertfrom utf-8 "profundidade abaixo do n\303\255vel da \303\241gua"] ::msgcat::mcset pt_BR "point passage-height:negative" [encoding convertfrom utf-8 "profundidade abaixo do n\303\255vel da \303\241gua"] ::msgcat::mcset pt_PT "point passage-height:negative" [encoding convertfrom utf-8 "profundidade abaixo do n\303\255vel da \303\241gua"] ::msgcat::mcset ru "point passage-height:negative" [encoding convertfrom utf-8 "\320\263\320\273\321\203\320\261\320\270\320\275\320\260 \320\275\320\270\320\266\320\265 \321\203\321\200\320\276\320\262\320\275\321\217 \320\262\320\276\320\264\321\213"] ::msgcat::mcset sk "point passage-height:negative" [encoding convertfrom utf-8 "h\304\272bka pod hladinou"] ::msgcat::mcset sq "point passage-height:negative" [encoding convertfrom utf-8 "thellesia nen nivelin e ujit"] ::msgcat::mcset bg "point passage-height:positive" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260 \320\275\320\260\320\264 \320\262\320\276\320\264\320\260\321\202\320\260"] ::msgcat::mcset cz "point passage-height:positive" [encoding convertfrom utf-8 "v\303\275\305\241ka chodby nad hladinou"] ::msgcat::mcset de "point passage-height:positive" [encoding convertfrom utf-8 "Raumh\303\266he nach oben"] ::msgcat::mcset el "point passage-height:positive" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \317\203\317\204\316\277\316\254\317\202 \317\200\316\254\316\275\317\211 \316\261\317\200\317\214 \316\275\316\265\317\201\317\214"] ::msgcat::mcset en "point passage-height:positive" [encoding convertfrom utf-8 "height above water level"] ::msgcat::mcset en_UK "point passage-height:positive" [encoding convertfrom utf-8 "height above water level"] ::msgcat::mcset en_US "point passage-height:positive" [encoding convertfrom utf-8 "height above water level"] ::msgcat::mcset es "point passage-height:positive" [encoding convertfrom utf-8 "altura sobre nivel del mar"] ::msgcat::mcset fr "point passage-height:positive" [encoding convertfrom utf-8 "hauteur au-dessus de l\342\200\231eau"] ::msgcat::mcset it "point passage-height:positive" [encoding convertfrom utf-8 "altezza sopra il livello dell'acqua"] ::msgcat::mcset mi "point passage-height:positive" [encoding convertfrom utf-8 "te teitei a karewa ki runga"] ::msgcat::mcset pl "point passage-height:positive" [encoding convertfrom utf-8 "wysoko\305\233\304\207 korytarza nad powierzchni\304\205 wody"] ::msgcat::mcset pt "point passage-height:positive" [encoding convertfrom utf-8 "altura acima do n\303\255vel da \303\241gua"] ::msgcat::mcset pt_BR "point passage-height:positive" [encoding convertfrom utf-8 "altura acima do n\303\255vel da \303\241gua"] ::msgcat::mcset pt_PT "point passage-height:positive" [encoding convertfrom utf-8 "altura acima do n\303\255vel da \303\241gua"] ::msgcat::mcset ru "point passage-height:positive" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \320\275\320\260\320\264 \321\203\321\200\320\276\320\262\320\275\320\265\320\274 \320\262\320\276\320\264\321\213"] ::msgcat::mcset sk "point passage-height:positive" [encoding convertfrom utf-8 "v\303\275\305\241ka nad hladinou"] ::msgcat::mcset sq "point passage-height:positive" [encoding convertfrom utf-8 "lartesia mbi nivelin e ujit"] ::msgcat::mcset bg "point passage-height:unsigned" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\260 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "point passage-height:unsigned" [encoding convertfrom utf-8 "v\303\275\305\241ka chodby"] ::msgcat::mcset de "point passage-height:unsigned" [encoding convertfrom utf-8 "Raumh\303\266he"] ::msgcat::mcset el "point passage-height:unsigned" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \317\203\317\204\316\277\316\254\317\202"] ::msgcat::mcset en "point passage-height:unsigned" [encoding convertfrom utf-8 "passage height"] ::msgcat::mcset en_UK "point passage-height:unsigned" [encoding convertfrom utf-8 "passage height"] ::msgcat::mcset en_US "point passage-height:unsigned" [encoding convertfrom utf-8 "passage height"] ::msgcat::mcset es "point passage-height:unsigned" [encoding convertfrom utf-8 "altura galer\303\255a"] ::msgcat::mcset fr "point passage-height:unsigned" [encoding convertfrom utf-8 "hauteur du passage"] ::msgcat::mcset it "point passage-height:unsigned" [encoding convertfrom utf-8 "altezza galleria"] ::msgcat::mcset mi "point passage-height:unsigned" [encoding convertfrom utf-8 "ara teitei"] ::msgcat::mcset pl "point passage-height:unsigned" [encoding convertfrom utf-8 "wysoko\305\233\304\207 korytarza"] ::msgcat::mcset pt "point passage-height:unsigned" [encoding convertfrom utf-8 "altura da galeria"] ::msgcat::mcset pt_BR "point passage-height:unsigned" [encoding convertfrom utf-8 "altura da galeria"] ::msgcat::mcset pt_PT "point passage-height:unsigned" [encoding convertfrom utf-8 "altura da galeria"] ::msgcat::mcset ru "point passage-height:unsigned" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\260 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "point passage-height:unsigned" [encoding convertfrom utf-8 "v\303\275\305\241ka chodby"] ::msgcat::mcset sq "point passage-height:unsigned" [encoding convertfrom utf-8 "lartesia e kalimit-e pashenuar"] ::msgcat::mcset bg "point pebbles" [encoding convertfrom utf-8 "\320\272\320\260\320\274\321\212\321\207\320\265\321\202\320\260"] ::msgcat::mcset cz "point pebbles" [encoding convertfrom utf-8 "valouny"] ::msgcat::mcset de "point pebbles" [encoding convertfrom utf-8 "Kies"] ::msgcat::mcset el "point pebbles" [encoding convertfrom utf-8 "\317\207\316\261\316\273\316\257\316\272\316\271\316\261"] ::msgcat::mcset en "point pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset en_UK "point pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset en_US "point pebbles" [encoding convertfrom utf-8 "pebbles"] ::msgcat::mcset es "point pebbles" [encoding convertfrom utf-8 "cantos rodados"] ::msgcat::mcset fr "point pebbles" [encoding convertfrom utf-8 "galets"] ::msgcat::mcset it "point pebbles" [encoding convertfrom utf-8 "ciotoli"] ::msgcat::mcset mi "point pebbles" [encoding convertfrom utf-8 "nga k\305\215hatu iti"] ::msgcat::mcset pl "point pebbles" [encoding convertfrom utf-8 "okr\304\231glaki"] ::msgcat::mcset pt "point pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset pt_BR "point pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset pt_PT "point pebbles" [encoding convertfrom utf-8 "seixos"] ::msgcat::mcset ru "point pebbles" [encoding convertfrom utf-8 "\320\263\320\260\320\273\321\214\320\272\320\260"] ::msgcat::mcset sk "point pebbles" [encoding convertfrom utf-8 "okruhliaky"] ::msgcat::mcset sq "point pebbles" [encoding convertfrom utf-8 "gurralece"] ::msgcat::mcset bg "point pillar" [encoding convertfrom utf-8 "\321\201\321\202\320\260\320\273\320\260\320\272\321\202\320\276\320\275"] ::msgcat::mcset cz "point pillar" [encoding convertfrom utf-8 "stalagn\303\241t"] ::msgcat::mcset de "point pillar" [encoding convertfrom utf-8 "S\303\244ule"] ::msgcat::mcset el "point pillar" [encoding convertfrom utf-8 "\316\272\316\277\316\273\317\214\316\275\316\261"] ::msgcat::mcset en "point pillar" [encoding convertfrom utf-8 "pillar"] ::msgcat::mcset en_UK "point pillar" [encoding convertfrom utf-8 "pillar"] ::msgcat::mcset en_US "point pillar" [encoding convertfrom utf-8 "pillar"] ::msgcat::mcset es "point pillar" [encoding convertfrom utf-8 "pilar"] ::msgcat::mcset fr "point pillar" [encoding convertfrom utf-8 "pillier"] ::msgcat::mcset it "point pillar" [encoding convertfrom utf-8 "colonna"] ::msgcat::mcset mi "point pillar" [encoding convertfrom utf-8 "pou"] ::msgcat::mcset pl "point pillar" [encoding convertfrom utf-8 "stalagnat"] ::msgcat::mcset pt "point pillar" [encoding convertfrom utf-8 "coluna"] ::msgcat::mcset pt_BR "point pillar" [encoding convertfrom utf-8 "coluna"] ::msgcat::mcset pt_PT "point pillar" [encoding convertfrom utf-8 "coluna"] ::msgcat::mcset ru "point pillar" [encoding convertfrom utf-8 "\320\272\320\276\320\273\320\276\320\275\320\275\320\260"] ::msgcat::mcset sk "point pillar" [encoding convertfrom utf-8 "stalagn\303\241t"] ::msgcat::mcset sq "point pillar" [encoding convertfrom utf-8 "shtylle"] ::msgcat::mcset bg "point popcorn" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\260\320\273\320\270\321\202\320\270"] ::msgcat::mcset cz "point popcorn" [encoding convertfrom utf-8 "pizolity"] ::msgcat::mcset de "point popcorn" [encoding convertfrom utf-8 "Blumenkohlsinter"] ::msgcat::mcset el "point popcorn" [encoding convertfrom utf-8 "\316\274\316\261\316\275\316\271\317\204\316\254\317\201\316\271\316\261 \316\261\317\200\317\214 \317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\317\214 \317\205\316\273\316\271\316\272\317\214"] ::msgcat::mcset en "point popcorn" [encoding convertfrom utf-8 "popcorn"] ::msgcat::mcset en_UK "point popcorn" [encoding convertfrom utf-8 "popcorn"] ::msgcat::mcset en_US "point popcorn" [encoding convertfrom utf-8 "popcorn"] ::msgcat::mcset es "point popcorn" [encoding convertfrom utf-8 "coliflor"] ::msgcat::mcset fr "point popcorn" [encoding convertfrom utf-8 "choux-fleur"] ::msgcat::mcset it "point popcorn" [encoding convertfrom utf-8 "cavolfiore"] ::msgcat::mcset mi "point popcorn" [encoding convertfrom utf-8 "kanga p\304\201huuhuu"] ::msgcat::mcset pl "point popcorn" [encoding convertfrom utf-8 "pizolity"] ::msgcat::mcset pt "point popcorn" [encoding convertfrom utf-8 "couve-flor"] ::msgcat::mcset pt_BR "point popcorn" [encoding convertfrom utf-8 "couve-flor"] ::msgcat::mcset pt_PT "point popcorn" [encoding convertfrom utf-8 "couve-flor"] ::msgcat::mcset ru "point popcorn" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\260\320\273\320\270\321\202\321\213"] ::msgcat::mcset sk "point popcorn" [encoding convertfrom utf-8 "pizolity"] ::msgcat::mcset sq "point popcorn" [encoding convertfrom utf-8 "palagaqa-kokorroshka"] ::msgcat::mcset bg "point raft" [encoding convertfrom utf-8 "\320\275\320\260\321\201\320\270\320\277"] ::msgcat::mcset cz "point raft" [encoding convertfrom utf-8 "n\303\241plav"] ::msgcat::mcset de "point raft" [encoding convertfrom utf-8 "schwimmendes Kalkh\303\244utchen"] ::msgcat::mcset el "point raft" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\317\214 \317\205\316\273\316\271\316\272\317\214 \317\200\316\277\317\205 \316\265\317\200\316\271\317\200\316\273\316\255\316\265\316\271"] ::msgcat::mcset en "point raft" [encoding convertfrom utf-8 "calcite raft"] ::msgcat::mcset en_UK "point raft" [encoding convertfrom utf-8 "calcite raft"] ::msgcat::mcset en_US "point raft" [encoding convertfrom utf-8 "calcite raft"] ::msgcat::mcset es "point raft" [encoding convertfrom utf-8 "calcita flotante"] ::msgcat::mcset fr "point raft" [encoding convertfrom utf-8 "calcite flottante"] ::msgcat::mcset it "point raft" [encoding convertfrom utf-8 "calcite flottante"] ::msgcat::mcset mi "point raft" [encoding convertfrom utf-8 "m\305\215kihi o k\305\215hatu h\305\215honu"] ::msgcat::mcset pl "point raft" [encoding convertfrom utf-8 "nanios"] ::msgcat::mcset pt "point raft" [encoding convertfrom utf-8 "jangada"] ::msgcat::mcset pt_BR "point raft" [encoding convertfrom utf-8 "jangada"] ::msgcat::mcset pt_PT "point raft" [encoding convertfrom utf-8 "jangada"] ::msgcat::mcset ru "point raft" [encoding convertfrom utf-8 "\320\262\321\213\321\201\321\213\320\277\320\272\320\260"] ::msgcat::mcset sk "point raft" [encoding convertfrom utf-8 "n\303\241plav"] ::msgcat::mcset sq "point raft" [encoding convertfrom utf-8 "trap-skele"] ::msgcat::mcset bg "point raft-cone" [encoding convertfrom utf-8 "\320\275\320\260\321\201\320\270\320\277\320\265\320\275 \320\272\320\276\320\275\321\203\321\201"] ::msgcat::mcset cz "point raft-cone" [encoding convertfrom utf-8 "n\303\241plavov\303\275 ku\305\276el"] ::msgcat::mcset de "point raft-cone" [encoding convertfrom utf-8 "schwimmendes Kalkh\303\244utchen"] ::msgcat::mcset el "point raft-cone" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\271\317\204\316\271\316\272\317\214\317\202 \316\272\317\216\316\275\316\277\317\202 \317\200\316\277\317\205 \316\265\317\200\316\271\317\200\316\273\316\255\316\265\316\271"] ::msgcat::mcset en "point raft-cone" [encoding convertfrom utf-8 "raft cone"] ::msgcat::mcset en_UK "point raft-cone" [encoding convertfrom utf-8 "raft cone"] ::msgcat::mcset en_US "point raft-cone" [encoding convertfrom utf-8 "raft cone"] ::msgcat::mcset es "point raft-cone" [encoding convertfrom utf-8 "conos"] ::msgcat::mcset fr "point raft-cone" [encoding convertfrom utf-8 "cone"] ::msgcat::mcset it "point raft-cone" [encoding convertfrom utf-8 "calcite flottante"] ::msgcat::mcset mi "point raft-cone" [encoding convertfrom utf-8 "korere a m\305\215kihi k\305\215hatu h\305\215honu"] ::msgcat::mcset pl "point raft-cone" [encoding convertfrom utf-8 "nanios"] ::msgcat::mcset pt "point raft-cone" [encoding convertfrom utf-8 "cone de jangada"] ::msgcat::mcset pt_BR "point raft-cone" [encoding convertfrom utf-8 "cone de jangada"] ::msgcat::mcset pt_PT "point raft-cone" [encoding convertfrom utf-8 "cone de jangada"] ::msgcat::mcset ru "point raft-cone" [encoding convertfrom utf-8 "\320\262\321\213\321\201\321\213\320\277\320\275\320\276\320\271 \320\272\320\276\320\275\321\203\321\201"] ::msgcat::mcset sk "point raft-cone" [encoding convertfrom utf-8 "n\303\241plavov\303\275 ku\305\276e\304\276"] ::msgcat::mcset sq "point raft-cone" [encoding convertfrom utf-8 "rrjedhe uji konike"] ::msgcat::mcset bg "point remark" [encoding convertfrom utf-8 "\320\267\320\260\320\261\320\265\320\273\320\265\320\266\320\272\320\260"] ::msgcat::mcset cz "point remark" [encoding convertfrom utf-8 "pozn\303\241mka"] ::msgcat::mcset de "point remark" [encoding convertfrom utf-8 "Bemerkung"] ::msgcat::mcset el "point remark" [encoding convertfrom utf-8 "\317\203\317\207\317\214\316\273\316\271\316\277"] ::msgcat::mcset en "point remark" [encoding convertfrom utf-8 "remark"] ::msgcat::mcset en_UK "point remark" [encoding convertfrom utf-8 "remark"] ::msgcat::mcset en_US "point remark" [encoding convertfrom utf-8 "remark"] ::msgcat::mcset es "point remark" [encoding convertfrom utf-8 "nota"] ::msgcat::mcset fr "point remark" [encoding convertfrom utf-8 "remarque"] ::msgcat::mcset it "point remark" [encoding convertfrom utf-8 "nota"] ::msgcat::mcset mi "point remark" [encoding convertfrom utf-8 "korero"] ::msgcat::mcset pl "point remark" [encoding convertfrom utf-8 "uwaga"] ::msgcat::mcset pt "point remark" [encoding convertfrom utf-8 "anota\303\247\303\243o"] ::msgcat::mcset pt_BR "point remark" [encoding convertfrom utf-8 "anota\303\247\303\243o"] ::msgcat::mcset pt_PT "point remark" [encoding convertfrom utf-8 "anota\303\247\303\243o"] ::msgcat::mcset ru "point remark" [encoding convertfrom utf-8 "\320\267\320\260\320\274\320\265\321\202\320\272\320\260"] ::msgcat::mcset sk "point remark" [encoding convertfrom utf-8 "pozn\303\241mka"] ::msgcat::mcset sq "point remark" [encoding convertfrom utf-8 "shenim"] ::msgcat::mcset bg "point rimstone-dam" [encoding convertfrom utf-8 "\321\201\321\203\321\205\320\276 \321\201\320\270\320\275\321\202\321\200\320\276\320\262\320\276 \320\265\320\267\320\265\321\200\320\276"] ::msgcat::mcset cz "point rimstone-dam" [encoding convertfrom utf-8 "sintrov\303\241 hr\303\241zka"] ::msgcat::mcset de "point rimstone-dam" [encoding convertfrom utf-8 "Sinterbarriere"] ::msgcat::mcset el "point rimstone-dam" [encoding convertfrom utf-8 "\316\263\316\272\316\277\317\205\317\201 (\316\273\316\271\316\270\317\211\316\274\316\261\317\204\316\271\316\272\317\214 \317\206\317\201\316\254\316\263\316\274\316\261)"] ::msgcat::mcset en "point rimstone-dam" [encoding convertfrom utf-8 "rimstone dam"] ::msgcat::mcset en_UK "point rimstone-dam" [encoding convertfrom utf-8 "rimstone dam"] ::msgcat::mcset en_US "point rimstone-dam" [encoding convertfrom utf-8 "rimstone dam"] ::msgcat::mcset es "point rimstone-dam" [encoding convertfrom utf-8 "gour-presa"] ::msgcat::mcset fr "point rimstone-dam" [encoding convertfrom utf-8 "gours"] ::msgcat::mcset it "point rimstone-dam" [encoding convertfrom utf-8 "gour"] ::msgcat::mcset mi "point rimstone-dam" [encoding convertfrom utf-8 "k\305\215hatu matatara"] ::msgcat::mcset pl "point rimstone-dam" [encoding convertfrom utf-8 "naciekowa przegroda"] ::msgcat::mcset pt "point rimstone-dam" [encoding convertfrom utf-8 "travertino"] ::msgcat::mcset pt_BR "point rimstone-dam" [encoding convertfrom utf-8 "travertino"] ::msgcat::mcset pt_PT "point rimstone-dam" [encoding convertfrom utf-8 "travertino"] ::msgcat::mcset ru "point rimstone-dam" [encoding convertfrom utf-8 "\320\263\321\203\321\200\321\213 \320\261\320\265\320\267 \320\262\320\276\320\264\321\213"] ::msgcat::mcset sk "point rimstone-dam" [encoding convertfrom utf-8 "sintrov\303\241 hr\303\241dza"] ::msgcat::mcset sq "point rimstone-dam" [encoding convertfrom utf-8 "penda guri"] ::msgcat::mcset bg "point rimstone-pool" [encoding convertfrom utf-8 "\321\201\320\270\320\275\321\202\321\200\320\276\320\262\320\276 \320\265\320\267\320\265\321\200\320\276"] ::msgcat::mcset cz "point rimstone-pool" [encoding convertfrom utf-8 "sintrov\303\251 jez\303\255rko"] ::msgcat::mcset de "point rimstone-pool" [encoding convertfrom utf-8 "Sinterbecken"] ::msgcat::mcset el "point rimstone-pool" [encoding convertfrom utf-8 "\316\263\316\272\316\277\317\205\317\201 (\316\273\316\271\316\270\317\211\316\274\316\261\317\204\316\271\316\272\316\256 \316\273\316\265\316\272\316\254\316\275\316\267)"] ::msgcat::mcset en "point rimstone-pool" [encoding convertfrom utf-8 "rimstone pool"] ::msgcat::mcset en_UK "point rimstone-pool" [encoding convertfrom utf-8 "rimstone pool"] ::msgcat::mcset en_US "point rimstone-pool" [encoding convertfrom utf-8 "rimstone pool"] ::msgcat::mcset es "point rimstone-pool" [encoding convertfrom utf-8 "gour-poza"] ::msgcat::mcset fr "point rimstone-pool" [encoding convertfrom utf-8 "gour"] ::msgcat::mcset it "point rimstone-pool" [encoding convertfrom utf-8 "vasca"] ::msgcat::mcset mi "point rimstone-pool" [encoding convertfrom utf-8 "k\305\215hatu kopua wai"] ::msgcat::mcset pl "point rimstone-pool" [encoding convertfrom utf-8 "jeziorko naciekowe"] ::msgcat::mcset pt "point rimstone-pool" [encoding convertfrom utf-8 "lago travertino"] ::msgcat::mcset pt_BR "point rimstone-pool" [encoding convertfrom utf-8 "lago travertino"] ::msgcat::mcset pt_PT "point rimstone-pool" [encoding convertfrom utf-8 "lago travertino"] ::msgcat::mcset ru "point rimstone-pool" [encoding convertfrom utf-8 "\320\263\321\203\321\200\321\213 \321\201 \320\262\320\276\320\264\320\276\320\271"] ::msgcat::mcset sk "point rimstone-pool" [encoding convertfrom utf-8 "sintrov\303\251 jazierko"] ::msgcat::mcset sq "point rimstone-pool" [encoding convertfrom utf-8 "vaska uji"] ::msgcat::mcset bg "point root" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\265\320\275\320\270"] ::msgcat::mcset cz "point root" [encoding convertfrom utf-8 "ko\305\231eny"] ::msgcat::mcset de "point root" [encoding convertfrom utf-8 "Holzreste"] ::msgcat::mcset el "point root" [encoding convertfrom utf-8 "\317\201\316\257\316\266\316\265\317\202"] ::msgcat::mcset en "point root" [encoding convertfrom utf-8 "root"] ::msgcat::mcset en_UK "point root" [encoding convertfrom utf-8 "root"] ::msgcat::mcset en_US "point root" [encoding convertfrom utf-8 "root"] ::msgcat::mcset es "point root" [encoding convertfrom utf-8 "ra\303\255z"] ::msgcat::mcset fr "point root" [encoding convertfrom utf-8 "racine"] ::msgcat::mcset it "point root" [encoding convertfrom utf-8 "radice"] ::msgcat::mcset mi "point root" [encoding convertfrom utf-8 "pakiaka"] ::msgcat::mcset pl "point root" [encoding convertfrom utf-8 "korzenie"] ::msgcat::mcset pt "point root" [encoding convertfrom utf-8 "raiz"] ::msgcat::mcset pt_BR "point root" [encoding convertfrom utf-8 "raiz"] ::msgcat::mcset pt_PT "point root" [encoding convertfrom utf-8 "raiz"] ::msgcat::mcset ru "point root" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\275\320\270 \321\200\320\260\321\201\321\202\320\265\320\275\320\270\320\271"] ::msgcat::mcset sk "point root" [encoding convertfrom utf-8 "korene"] ::msgcat::mcset sq "point root" [encoding convertfrom utf-8 "rrenje"] ::msgcat::mcset bg "point rope" [encoding convertfrom utf-8 "\320\262\321\212\320\266\320\265"] ::msgcat::mcset cz "point rope" [encoding convertfrom utf-8 "lano"] ::msgcat::mcset de "point rope" [encoding convertfrom utf-8 "Seil"] ::msgcat::mcset el "point rope" [encoding convertfrom utf-8 "\317\203\317\207\316\277\316\271\316\275\316\257"] ::msgcat::mcset en "point rope" [encoding convertfrom utf-8 "rope"] ::msgcat::mcset en_UK "point rope" [encoding convertfrom utf-8 "rope"] ::msgcat::mcset en_US "point rope" [encoding convertfrom utf-8 "rope"] ::msgcat::mcset es "point rope" [encoding convertfrom utf-8 "cuerda"] ::msgcat::mcset fr "point rope" [encoding convertfrom utf-8 "corde"] ::msgcat::mcset it "point rope" [encoding convertfrom utf-8 "corda"] ::msgcat::mcset mi "point rope" [encoding convertfrom utf-8 "taura"] ::msgcat::mcset pl "point rope" [encoding convertfrom utf-8 "lina"] ::msgcat::mcset pt "point rope" [encoding convertfrom utf-8 "corda"] ::msgcat::mcset pt_BR "point rope" [encoding convertfrom utf-8 "corda"] ::msgcat::mcset pt_PT "point rope" [encoding convertfrom utf-8 "corda"] ::msgcat::mcset ru "point rope" [encoding convertfrom utf-8 "\320\273\320\270\320\275\320\265\320\271\320\275\320\260\321\217 \320\276\320\277\320\276\321\200\320\260"] ::msgcat::mcset sk "point rope" [encoding convertfrom utf-8 "lano"] ::msgcat::mcset sq "point rope" [encoding convertfrom utf-8 "litar"] ::msgcat::mcset bg "point rope-ladder" [encoding convertfrom utf-8 "\320\277\320\265\321\211\320\265\321\200\320\275\320\260 \321\201\321\202\321\212\320\273\320\261\320\260"] ::msgcat::mcset cz "point rope-ladder" [encoding convertfrom utf-8 "lanov\303\275 \305\276eb\305\231\303\255k"] ::msgcat::mcset de "point rope-ladder" [encoding convertfrom utf-8 "Drahtseilleiter"] ::msgcat::mcset el "point rope-ladder" [encoding convertfrom utf-8 "\316\261\316\275\316\265\316\274\317\214\317\203\316\272\316\261\316\273\316\261"] ::msgcat::mcset en "point rope-ladder" [encoding convertfrom utf-8 "rope ladder"] ::msgcat::mcset en_UK "point rope-ladder" [encoding convertfrom utf-8 "rope ladder"] ::msgcat::mcset en_US "point rope-ladder" [encoding convertfrom utf-8 "rope ladder"] ::msgcat::mcset es "point rope-ladder" [encoding convertfrom utf-8 "escala"] ::msgcat::mcset fr "point rope-ladder" [encoding convertfrom utf-8 "\303\251chelle de corde"] ::msgcat::mcset it "point rope-ladder" [encoding convertfrom utf-8 "scala di corda"] ::msgcat::mcset mi "point rope-ladder" [encoding convertfrom utf-8 "arawhata taura"] ::msgcat::mcset pl "point rope-ladder" [encoding convertfrom utf-8 "drabinka linowa"] ::msgcat::mcset pt "point rope-ladder" [encoding convertfrom utf-8 "escada de corda"] ::msgcat::mcset pt_BR "point rope-ladder" [encoding convertfrom utf-8 "escada de corda"] ::msgcat::mcset pt_PT "point rope-ladder" [encoding convertfrom utf-8 "escada de corda"] ::msgcat::mcset ru "point rope-ladder" [encoding convertfrom utf-8 "\320\263\320\270\320\261\320\272\320\260\321\217 \320\273\320\265\321\201\321\202\320\275\320\270\321\206\320\260"] ::msgcat::mcset sk "point rope-ladder" [encoding convertfrom utf-8 "lanov\303\275 rebr\303\255k"] ::msgcat::mcset sq "point rope-ladder" [encoding convertfrom utf-8 "shkalle litari"] ::msgcat::mcset bg "point sand" [encoding convertfrom utf-8 "\320\277\321\217\321\201\321\212\320\272"] ::msgcat::mcset cz "point sand" [encoding convertfrom utf-8 "p\303\255sek"] ::msgcat::mcset de "point sand" [encoding convertfrom utf-8 "Sand"] ::msgcat::mcset el "point sand" [encoding convertfrom utf-8 "\316\254\316\274\316\274\316\277\317\202"] ::msgcat::mcset en "point sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset en_UK "point sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset en_US "point sand" [encoding convertfrom utf-8 "sand"] ::msgcat::mcset es "point sand" [encoding convertfrom utf-8 "arena"] ::msgcat::mcset fr "point sand" [encoding convertfrom utf-8 "sable"] ::msgcat::mcset it "point sand" [encoding convertfrom utf-8 "sabbia"] ::msgcat::mcset mi "point sand" [encoding convertfrom utf-8 "onep\305\253"] ::msgcat::mcset pl "point sand" [encoding convertfrom utf-8 "piasek"] ::msgcat::mcset pt "point sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset pt_BR "point sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset pt_PT "point sand" [encoding convertfrom utf-8 "areia"] ::msgcat::mcset ru "point sand" [encoding convertfrom utf-8 "\320\277\320\265\321\201\320\276\320\272"] ::msgcat::mcset sk "point sand" [encoding convertfrom utf-8 "piesok"] ::msgcat::mcset sq "point sand" [encoding convertfrom utf-8 "rane"] ::msgcat::mcset bg "point scallop" [encoding convertfrom utf-8 "\321\204\320\260\321\201\320\265\321\202\320\272\320\270"] ::msgcat::mcset cz "point scallop" [encoding convertfrom utf-8 "erozn\303\255 \303\272tvary"] ::msgcat::mcset de "point scallop" [encoding convertfrom utf-8 "Flie\303\237facette"] ::msgcat::mcset el "point scallop" [encoding convertfrom utf-8 "\317\203\316\272\316\254\316\273\316\277\317\200 (\316\272\316\265\316\275\316\254 \316\264\316\271\316\254\316\262\317\201\317\211\317\203\316\267\317\202)"] ::msgcat::mcset en "point scallop" [encoding convertfrom utf-8 "scallop"] ::msgcat::mcset en_UK "point scallop" [encoding convertfrom utf-8 "scallop"] ::msgcat::mcset en_US "point scallop" [encoding convertfrom utf-8 "scallop"] ::msgcat::mcset es "point scallop" [encoding convertfrom utf-8 "cavitaciones"] ::msgcat::mcset fr "point scallop" [encoding convertfrom utf-8 "vagues d\342\200\231\303\251rosion (coups de gouge)"] ::msgcat::mcset it "point scallop" [encoding convertfrom utf-8 "scallop"] ::msgcat::mcset mi "point scallop" [encoding convertfrom utf-8 "anatipa"] ::msgcat::mcset pl "point scallop" [encoding convertfrom utf-8 "formy erozyjne"] ::msgcat::mcset pt "point scallop" [encoding convertfrom utf-8 "marcas de fluxo"] ::msgcat::mcset pt_BR "point scallop" [encoding convertfrom utf-8 "marcas de fluxo"] ::msgcat::mcset pt_PT "point scallop" [encoding convertfrom utf-8 "marcas de fluxo"] ::msgcat::mcset ru "point scallop" [encoding convertfrom utf-8 "\321\204\320\260\321\201\320\265\321\202\320\272\320\270"] ::msgcat::mcset sk "point scallop" [encoding convertfrom utf-8 "last\303\272rovit\303\251 jamky"] ::msgcat::mcset sq "point scallop" [encoding convertfrom utf-8 "guacat"] ::msgcat::mcset bg "point section" [encoding convertfrom utf-8 "\320\274\321\217\321\201\321\202\320\276 \320\275\320\260 \321\201\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point section" [encoding convertfrom utf-8 "p\305\231\303\255\304\215n\303\275 \305\231ez"] ::msgcat::mcset de "point section" [encoding convertfrom utf-8 "Schnitt"] ::msgcat::mcset el "point section" [encoding convertfrom utf-8 "\317\204\316\277\316\274\316\256"] ::msgcat::mcset en "point section" [encoding convertfrom utf-8 "section"] ::msgcat::mcset en_UK "point section" [encoding convertfrom utf-8 "section"] ::msgcat::mcset en_US "point section" [encoding convertfrom utf-8 "section"] ::msgcat::mcset es "point section" [encoding convertfrom utf-8 "secci\303\263n"] ::msgcat::mcset fr "point section" [encoding convertfrom utf-8 "section"] ::msgcat::mcset it "point section" [encoding convertfrom utf-8 "sezione"] ::msgcat::mcset mi "point section" [encoding convertfrom utf-8 "roherohenga"] ::msgcat::mcset pl "point section" [encoding convertfrom utf-8 "przkr\303\263j"] ::msgcat::mcset pt "point section" [encoding convertfrom utf-8 "se\303\247\303\243o"] ::msgcat::mcset pt_BR "point section" [encoding convertfrom utf-8 "se\303\247\303\243o"] ::msgcat::mcset pt_PT "point section" [encoding convertfrom utf-8 "sec\303\247\303\243o"] ::msgcat::mcset ru "point section" [encoding convertfrom utf-8 "\321\201\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "point section" [encoding convertfrom utf-8 "prie\304\215ny rez"] ::msgcat::mcset sq "point section" [encoding convertfrom utf-8 "pike-ndarje"] ::msgcat::mcset bg "point sink" [encoding convertfrom utf-8 "\320\277\320\276\320\275\320\276\321\200"] ::msgcat::mcset cz "point sink" [encoding convertfrom utf-8 "ponor"] ::msgcat::mcset de "point sink" [encoding convertfrom utf-8 "Schluckloch"] ::msgcat::mcset el "point sink" [encoding convertfrom utf-8 "\316\272\316\261\317\204\316\261\316\262\317\214\316\270\317\201\316\261"] ::msgcat::mcset en "point sink" [encoding convertfrom utf-8 "sink"] ::msgcat::mcset en_UK "point sink" [encoding convertfrom utf-8 "sink"] ::msgcat::mcset en_US "point sink" [encoding convertfrom utf-8 "sink"] ::msgcat::mcset es "point sink" [encoding convertfrom utf-8 "sumidero"] ::msgcat::mcset fr "point sink" [encoding convertfrom utf-8 "perte"] ::msgcat::mcset it "point sink" [encoding convertfrom utf-8 "perdita"] ::msgcat::mcset mi "point sink" [encoding convertfrom utf-8 "tapoko"] ::msgcat::mcset pl "point sink" [encoding convertfrom utf-8 "ponor"] ::msgcat::mcset pt "point sink" [encoding convertfrom utf-8 "sumidouro"] ::msgcat::mcset pt_BR "point sink" [encoding convertfrom utf-8 "sumidouro"] ::msgcat::mcset pt_PT "point sink" [encoding convertfrom utf-8 "sumidouro"] ::msgcat::mcset ru "point sink" [encoding convertfrom utf-8 "\321\201\321\202\320\276\320\272"] ::msgcat::mcset sk "point sink" [encoding convertfrom utf-8 "ponor"] ::msgcat::mcset sq "point sink" [encoding convertfrom utf-8 "pus"] ::msgcat::mcset bg "point snow" [encoding convertfrom utf-8 "\321\201\320\275\321\217\320\263"] ::msgcat::mcset cz "point snow" [encoding convertfrom utf-8 "sn\303\255h"] ::msgcat::mcset de "point snow" [encoding convertfrom utf-8 "Schnee"] ::msgcat::mcset el "point snow" [encoding convertfrom utf-8 "\317\207\316\271\317\216\316\275\316\271"] ::msgcat::mcset en "point snow" [encoding convertfrom utf-8 "snow"] ::msgcat::mcset en_UK "point snow" [encoding convertfrom utf-8 "snow"] ::msgcat::mcset en_US "point snow" [encoding convertfrom utf-8 "snow"] ::msgcat::mcset es "point snow" [encoding convertfrom utf-8 "nieve"] ::msgcat::mcset fr "point snow" [encoding convertfrom utf-8 "neige"] ::msgcat::mcset it "point snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset mi "point snow" [encoding convertfrom utf-8 "huka"] ::msgcat::mcset pl "point snow" [encoding convertfrom utf-8 "\305\233nieg"] ::msgcat::mcset pt "point snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset pt_BR "point snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset pt_PT "point snow" [encoding convertfrom utf-8 "neve"] ::msgcat::mcset ru "point snow" [encoding convertfrom utf-8 "\321\201\320\275\320\265\320\263"] ::msgcat::mcset sk "point snow" [encoding convertfrom utf-8 "sneh"] ::msgcat::mcset sq "point snow" [encoding convertfrom utf-8 "bore"] ::msgcat::mcset bg "point soda-straw" [encoding convertfrom utf-8 "\321\206\320\265\320\262\320\270\321\207\320\265\320\275 \321\201\321\202\320\260\320\273\320\260\320\272\321\202\320\270\321\202"] ::msgcat::mcset cz "point soda-straw" [encoding convertfrom utf-8 "br\304\215ka"] ::msgcat::mcset de "point soda-straw" [encoding convertfrom utf-8 "Makkaroni"] ::msgcat::mcset el "point soda-straw" [encoding convertfrom utf-8 "\316\274\316\261\316\272\316\261\317\201\317\214\316\275\316\271\316\261"] ::msgcat::mcset en "point soda-straw" [encoding convertfrom utf-8 "soda straw"] ::msgcat::mcset en_UK "point soda-straw" [encoding convertfrom utf-8 "soda straw"] ::msgcat::mcset en_US "point soda-straw" [encoding convertfrom utf-8 "soda straw"] ::msgcat::mcset es "point soda-straw" [encoding convertfrom utf-8 "fistulosa"] ::msgcat::mcset fr "point soda-straw" [encoding convertfrom utf-8 "fistuleuse"] ::msgcat::mcset it "point soda-straw" [encoding convertfrom utf-8 "tubolare"] ::msgcat::mcset mi "point soda-straw" [encoding convertfrom utf-8 "p\305\253 ngote"] ::msgcat::mcset pl "point soda-straw" [encoding convertfrom utf-8 "nacieki"] ::msgcat::mcset pt "point soda-straw" [encoding convertfrom utf-8 "canudos"] ::msgcat::mcset pt_BR "point soda-straw" [encoding convertfrom utf-8 "canudos"] ::msgcat::mcset pt_PT "point soda-straw" [encoding convertfrom utf-8 "tubulares"] ::msgcat::mcset ru "point soda-straw" [encoding convertfrom utf-8 "\321\201\321\202\320\260\320\273\320\260\320\272\321\202\320\270\321\202\321\213-\321\201\320\276\320\273\320\276\320\274\320\270\320\275\321\213"] ::msgcat::mcset sk "point soda-straw" [encoding convertfrom utf-8 "br\304\215k\303\241"] ::msgcat::mcset sq "point soda-straw" [encoding convertfrom utf-8 "shkopinje sode"] ::msgcat::mcset bg "point spring" [encoding convertfrom utf-8 "\320\270\320\267\320\262\320\276\321\200"] ::msgcat::mcset cz "point spring" [encoding convertfrom utf-8 "v\303\275v\304\233r"] ::msgcat::mcset de "point spring" [encoding convertfrom utf-8 "Quelle"] ::msgcat::mcset el "point spring" [encoding convertfrom utf-8 "\317\200\316\267\316\263\316\256"] ::msgcat::mcset en "point spring" [encoding convertfrom utf-8 "spring"] ::msgcat::mcset en_UK "point spring" [encoding convertfrom utf-8 "spring"] ::msgcat::mcset en_US "point spring" [encoding convertfrom utf-8 "spring"] ::msgcat::mcset es "point spring" [encoding convertfrom utf-8 "surgencia"] ::msgcat::mcset fr "point spring" [encoding convertfrom utf-8 "source"] ::msgcat::mcset it "point spring" [encoding convertfrom utf-8 "sorgente"] ::msgcat::mcset mi "point spring" [encoding convertfrom utf-8 "waipuna"] ::msgcat::mcset pl "point spring" [encoding convertfrom utf-8 "wywierzysko"] ::msgcat::mcset pt "point spring" [encoding convertfrom utf-8 "nascente"] ::msgcat::mcset pt_BR "point spring" [encoding convertfrom utf-8 "nascente"] ::msgcat::mcset pt_PT "point spring" [encoding convertfrom utf-8 "nascente"] ::msgcat::mcset ru "point spring" [encoding convertfrom utf-8 "\320\270\321\201\321\202\320\276\320\272"] ::msgcat::mcset sk "point spring" [encoding convertfrom utf-8 "v\303\275ver"] ::msgcat::mcset sq "point spring" [encoding convertfrom utf-8 "burim"] ::msgcat::mcset bg "point stalactite" [encoding convertfrom utf-8 "\321\201\321\202\320\260\320\273\320\260\320\272\321\202\320\270\321\202"] ::msgcat::mcset cz "point stalactite" [encoding convertfrom utf-8 "stalaktit"] ::msgcat::mcset de "point stalactite" [encoding convertfrom utf-8 "Stalaktit"] ::msgcat::mcset el "point stalactite" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\272\317\204\316\257\317\204\316\267\317\202"] ::msgcat::mcset en "point stalactite" [encoding convertfrom utf-8 "stalactite"] ::msgcat::mcset en_UK "point stalactite" [encoding convertfrom utf-8 "stalactite"] ::msgcat::mcset en_US "point stalactite" [encoding convertfrom utf-8 "stalactite"] ::msgcat::mcset es "point stalactite" [encoding convertfrom utf-8 "estalactita"] ::msgcat::mcset fr "point stalactite" [encoding convertfrom utf-8 "stalactite"] ::msgcat::mcset it "point stalactite" [encoding convertfrom utf-8 "stalattite"] ::msgcat::mcset mi "point stalactite" [encoding convertfrom utf-8 "k\305\215hatu ki te haere ki runga"] ::msgcat::mcset pl "point stalactite" [encoding convertfrom utf-8 "stalaktyt"] ::msgcat::mcset pt "point stalactite" [encoding convertfrom utf-8 "estalactite"] ::msgcat::mcset pt_BR "point stalactite" [encoding convertfrom utf-8 "estalactite"] ::msgcat::mcset pt_PT "point stalactite" [encoding convertfrom utf-8 "estalactite"] ::msgcat::mcset ru "point stalactite" [encoding convertfrom utf-8 "\321\201\321\202\320\260\320\273\320\260\320\272\321\202\320\270\321\202"] ::msgcat::mcset sk "point stalactite" [encoding convertfrom utf-8 "stalaktit"] ::msgcat::mcset sq "point stalactite" [encoding convertfrom utf-8 "stalaktit"] ::msgcat::mcset bg "point stalagmite" [encoding convertfrom utf-8 "\321\201\321\202\320\260\320\273\320\260\320\263\320\274\320\270\321\202"] ::msgcat::mcset cz "point stalagmite" [encoding convertfrom utf-8 "stalagmit"] ::msgcat::mcset de "point stalagmite" [encoding convertfrom utf-8 "Stalagmit"] ::msgcat::mcset el "point stalagmite" [encoding convertfrom utf-8 "\317\203\317\204\316\261\316\273\316\261\316\263\316\274\316\257\317\204\316\267\317\202"] ::msgcat::mcset en "point stalagmite" [encoding convertfrom utf-8 "stalagmite"] ::msgcat::mcset en_UK "point stalagmite" [encoding convertfrom utf-8 "stalagmite"] ::msgcat::mcset en_US "point stalagmite" [encoding convertfrom utf-8 "stalagmite"] ::msgcat::mcset es "point stalagmite" [encoding convertfrom utf-8 "estalagmita"] ::msgcat::mcset fr "point stalagmite" [encoding convertfrom utf-8 "stalagmite"] ::msgcat::mcset it "point stalagmite" [encoding convertfrom utf-8 "stalagmite"] ::msgcat::mcset mi "point stalagmite" [encoding convertfrom utf-8 "k\305\215hatu ki te haere ki raro"] ::msgcat::mcset pl "point stalagmite" [encoding convertfrom utf-8 "stalagmit"] ::msgcat::mcset pt "point stalagmite" [encoding convertfrom utf-8 "estalagmite"] ::msgcat::mcset pt_BR "point stalagmite" [encoding convertfrom utf-8 "estalagmite"] ::msgcat::mcset pt_PT "point stalagmite" [encoding convertfrom utf-8 "estalagmite"] ::msgcat::mcset ru "point stalagmite" [encoding convertfrom utf-8 "\321\201\321\202\320\260\320\273\320\260\320\263\320\274\320\270\321\202"] ::msgcat::mcset sk "point stalagmite" [encoding convertfrom utf-8 "stalagmit"] ::msgcat::mcset sq "point stalagmite" [encoding convertfrom utf-8 "stalagmit"] ::msgcat::mcset bg "point station" [encoding convertfrom utf-8 "\321\200\320\265\320\277\320\265\321\200\320\275\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "point station" [encoding convertfrom utf-8 "m\304\233\305\231i\304\215sk\303\275 bod"] ::msgcat::mcset de "point station" [encoding convertfrom utf-8 "Messpunkt"] ::msgcat::mcset el "point station" [encoding convertfrom utf-8 "\317\203\316\267\316\274\316\265\316\257\316\277 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "point station" [encoding convertfrom utf-8 "survey station"] ::msgcat::mcset en_UK "point station" [encoding convertfrom utf-8 "survey station"] ::msgcat::mcset en_US "point station" [encoding convertfrom utf-8 "survey station"] ::msgcat::mcset es "point station" [encoding convertfrom utf-8 "estaci\303\263n"] ::msgcat::mcset fr "point station" [encoding convertfrom utf-8 "station topo"] ::msgcat::mcset it "point station" [encoding convertfrom utf-8 "caposaldo"] ::msgcat::mcset mi "point station" [encoding convertfrom utf-8 "kaimataara"] ::msgcat::mcset pl "point station" [encoding convertfrom utf-8 "punkt pomiarowy"] ::msgcat::mcset pt "point station" [encoding convertfrom utf-8 "base"] ::msgcat::mcset pt_BR "point station" [encoding convertfrom utf-8 "base"] ::msgcat::mcset pt_PT "point station" [encoding convertfrom utf-8 "base"] ::msgcat::mcset ru "point station" [encoding convertfrom utf-8 "\320\277\320\270\320\272\320\265\321\202"] ::msgcat::mcset sk "point station" [encoding convertfrom utf-8 "mera\304\215sk\303\275 bod"] ::msgcat::mcset sq "point station" [encoding convertfrom utf-8 "stacioni I matjes"] ::msgcat::mcset bg "point station-name" [encoding convertfrom utf-8 "\320\270\320\274\320\265 \320\275\320\260 \321\200\320\265\320\277\320\265\321\200\320\275\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "point station-name" [encoding convertfrom utf-8 "\304\215\303\255slo m\304\233\305\231i\304\215sk\303\251ho bodu"] ::msgcat::mcset de "point station-name" [encoding convertfrom utf-8 "Messpunktname"] ::msgcat::mcset el "point station-name" [encoding convertfrom utf-8 "\317\214\316\275\316\277\316\274\316\261 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "point station-name" [encoding convertfrom utf-8 "survey station name"] ::msgcat::mcset en_UK "point station-name" [encoding convertfrom utf-8 "survey station name"] ::msgcat::mcset en_US "point station-name" [encoding convertfrom utf-8 "survey station name"] ::msgcat::mcset es "point station-name" [encoding convertfrom utf-8 "nombre estacion"] ::msgcat::mcset fr "point station-name" [encoding convertfrom utf-8 "station topo, nom"] ::msgcat::mcset it "point station-name" [encoding convertfrom utf-8 "node del caposaldo"] ::msgcat::mcset mi "point station-name" [encoding convertfrom utf-8 "kaimatara ingoa"] ::msgcat::mcset pl "point station-name" [encoding convertfrom utf-8 "numer punktu pomiarowego"] ::msgcat::mcset pt "point station-name" [encoding convertfrom utf-8 "nome de base"] ::msgcat::mcset pt_BR "point station-name" [encoding convertfrom utf-8 "nome de base"] ::msgcat::mcset pt_PT "point station-name" [encoding convertfrom utf-8 "nome de base"] ::msgcat::mcset ru "point station-name" [encoding convertfrom utf-8 "\320\275\320\276\320\274\320\265\321\200 \320\277\320\270\320\272\320\265\321\202\320\260"] ::msgcat::mcset sk "point station-name" [encoding convertfrom utf-8 "\304\215\303\255slo mera\304\215sk\303\251ho bodu"] ::msgcat::mcset sq "point station-name" [encoding convertfrom utf-8 "emri I stacionit-mates"] ::msgcat::mcset bg "point station:fixed" [encoding convertfrom utf-8 "\321\200\320\265\320\277\320\265\321\200\320\275\320\260 \321\202\320\276\321\207\320\272\320\260 (\321\201\321\202\320\260\320\261\320\270\320\273\320\270\320\267\320\270\321\200\320\260\320\275\320\260)"] ::msgcat::mcset cz "point station:fixed" [encoding convertfrom utf-8 "m\304\233\305\231i\304\215sk\303\275 bod (stabilizovan\303\275)"] ::msgcat::mcset de "point station:fixed" [encoding convertfrom utf-8 "dauerhafter Messpunkt"] ::msgcat::mcset el "point station:fixed" [encoding convertfrom utf-8 "\316\274\317\214\316\275\316\271\316\274\316\277 \317\203\316\267\316\274\316\265\316\257\316\277 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "point station:fixed" [encoding convertfrom utf-8 "fixed survey station"] ::msgcat::mcset en_UK "point station:fixed" [encoding convertfrom utf-8 "fixed survey station"] ::msgcat::mcset en_US "point station:fixed" [encoding convertfrom utf-8 "fixed survey station"] ::msgcat::mcset es "point station:fixed" [encoding convertfrom utf-8 "estaci\303\263n (fija)"] ::msgcat::mcset fr "point station:fixed" [encoding convertfrom utf-8 "station topo, fixe"] ::msgcat::mcset it "point station:fixed" [encoding convertfrom utf-8 "caposaldo fisso"] ::msgcat::mcset mi "point station:fixed" [encoding convertfrom utf-8 "kaimataara whakak\305\215hatu"] ::msgcat::mcset pl "point station:fixed" [encoding convertfrom utf-8 "punkt pomiarowy (zastabilizowany)"] ::msgcat::mcset pt "point station:fixed" [encoding convertfrom utf-8 "base fixa"] ::msgcat::mcset pt_BR "point station:fixed" [encoding convertfrom utf-8 "base fixa"] ::msgcat::mcset pt_PT "point station:fixed" [encoding convertfrom utf-8 "base fixa"] ::msgcat::mcset ru "point station:fixed" [encoding convertfrom utf-8 "\321\200\320\265\320\277\320\265\321\200"] ::msgcat::mcset sk "point station:fixed" [encoding convertfrom utf-8 "mera\304\215sk\303\275 bod (stabilizovan\303\275)"] ::msgcat::mcset sq "point station:fixed" [encoding convertfrom utf-8 "stacion mates I palevizshem"] ::msgcat::mcset bg "point station:natural" [encoding convertfrom utf-8 "\321\200\320\265\320\277\320\265\321\200\320\275\320\260 \321\202\320\276\321\207\320\272\320\260 (\320\265\321\201\321\202\320\265\321\201\321\202\320\262\320\265\320\275\320\260)"] ::msgcat::mcset cz "point station:natural" [encoding convertfrom utf-8 "m\304\233\305\231i\304\215sk\303\275 bod (p\305\231\303\255rodn\303\255)"] ::msgcat::mcset de "point station:natural" [encoding convertfrom utf-8 "nat\303\274rlicher Messpunkt"] ::msgcat::mcset el "point station:natural" [encoding convertfrom utf-8 "\317\203\316\267\316\274\316\265\316\257\316\277 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202 (\317\206\317\205\317\203\316\271\316\272\317\214)"] ::msgcat::mcset en "point station:natural" [encoding convertfrom utf-8 "natural survey station"] ::msgcat::mcset en_UK "point station:natural" [encoding convertfrom utf-8 "natural survey station"] ::msgcat::mcset en_US "point station:natural" [encoding convertfrom utf-8 "natural survey station"] ::msgcat::mcset es "point station:natural" [encoding convertfrom utf-8 "estaci\303\263n (natural)"] ::msgcat::mcset fr "point station:natural" [encoding convertfrom utf-8 "station topo, naturelle"] ::msgcat::mcset it "point station:natural" [encoding convertfrom utf-8 "caposaldo naturale"] ::msgcat::mcset mi "point station:natural" [encoding convertfrom utf-8 "kaimataara a papa"] ::msgcat::mcset pl "point station:natural" [encoding convertfrom utf-8 "punkt pomiarowy naturalny"] ::msgcat::mcset pt "point station:natural" [encoding convertfrom utf-8 "base natural"] ::msgcat::mcset pt_BR "point station:natural" [encoding convertfrom utf-8 "base natural"] ::msgcat::mcset pt_PT "point station:natural" [encoding convertfrom utf-8 "base natural"] ::msgcat::mcset ru "point station:natural" [encoding convertfrom utf-8 "\320\265\321\201\321\202\320\265\321\201\321\202\320\262\320\265\320\275\320\275\320\260\321\217 \321\202\320\276\321\207\320\272\320\260 \320\277\321\200\320\270\320\262\321\217\320\267\320\272\320\270"] ::msgcat::mcset sk "point station:natural" [encoding convertfrom utf-8 "mera\304\215sk\303\275 bod (pr\303\255rodn\303\275)"] ::msgcat::mcset sq "point station:natural" [encoding convertfrom utf-8 "stacion mates natyral"] ::msgcat::mcset bg "point station:painted" [encoding convertfrom utf-8 "\321\200\320\265\320\277\320\265\321\200\320\275\320\260 \321\202\320\276\321\207\320\272\320\260 (\320\261\320\276\321\217\320\264\320\270\321\201\320\260\320\275\320\260)"] ::msgcat::mcset cz "point station:painted" [encoding convertfrom utf-8 "m\304\233\305\231i\304\215sk\303\275 bod (zabarven\303\275)"] ::msgcat::mcset de "point station:painted" [encoding convertfrom utf-8 "farbig markierter Messpunkt"] ::msgcat::mcset el "point station:painted" [encoding convertfrom utf-8 "\317\203\316\267\316\274\316\265\316\257\316\277 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202 (\316\262\316\261\316\274\316\274\316\255\316\275\316\277)"] ::msgcat::mcset en "point station:painted" [encoding convertfrom utf-8 "painted survey station"] ::msgcat::mcset en_UK "point station:painted" [encoding convertfrom utf-8 "painted survey station"] ::msgcat::mcset en_US "point station:painted" [encoding convertfrom utf-8 "painted survey station"] ::msgcat::mcset es "point station:painted" [encoding convertfrom utf-8 "estaci\303\263n (pintada)"] ::msgcat::mcset fr "point station:painted" [encoding convertfrom utf-8 "station topo, peinte"] ::msgcat::mcset it "point station:painted" [encoding convertfrom utf-8 "caposaldo verniciato"] ::msgcat::mcset mi "point station:painted" [encoding convertfrom utf-8 "kaimataara tohi"] ::msgcat::mcset pl "point station:painted" [encoding convertfrom utf-8 "punkt pomiarowy (oznaczony farb\304\205)"] ::msgcat::mcset pt "point station:painted" [encoding convertfrom utf-8 "base pintada"] ::msgcat::mcset pt_BR "point station:painted" [encoding convertfrom utf-8 "base pintada"] ::msgcat::mcset pt_PT "point station:painted" [encoding convertfrom utf-8 "base pintada"] ::msgcat::mcset ru "point station:painted" [encoding convertfrom utf-8 "\320\275\320\260\321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \320\277\320\270\320\272\320\265\321\202"] ::msgcat::mcset sk "point station:painted" [encoding convertfrom utf-8 "mera\304\215sk\303\275 bod (zafarben\303\275)"] ::msgcat::mcset sq "point station:painted" [encoding convertfrom utf-8 "stacion mates I ngjyrosur"] ::msgcat::mcset bg "point station:temporary" [encoding convertfrom utf-8 "\320\262\321\200\320\265\320\274\320\265\320\275\320\275\320\260 \321\200\320\265\320\277\320\265\321\200\320\275\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "point station:temporary" [encoding convertfrom utf-8 "m\304\233\305\231i\304\215sk\303\275 bod (nestabilizovan\303\275)"] ::msgcat::mcset de "point station:temporary" [encoding convertfrom utf-8 "unmarkierter Messpunkt"] ::msgcat::mcset el "point station:temporary" [encoding convertfrom utf-8 "\317\200\317\201\316\277\317\203\317\211\317\201\316\271\316\275\317\214 \317\203\316\267\316\274\316\265\316\257\316\277 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "point station:temporary" [encoding convertfrom utf-8 "temporary survey station"] ::msgcat::mcset en_UK "point station:temporary" [encoding convertfrom utf-8 "temporary survey station"] ::msgcat::mcset en_US "point station:temporary" [encoding convertfrom utf-8 "temporary survey station"] ::msgcat::mcset es "point station:temporary" [encoding convertfrom utf-8 "estaci\303\263n topogr\303\241fica"] ::msgcat::mcset fr "point station:temporary" [encoding convertfrom utf-8 "station topo temporaire"] ::msgcat::mcset it "point station:temporary" [encoding convertfrom utf-8 "caposaldo termporaneo"] ::msgcat::mcset mi "point station:temporary" [encoding convertfrom utf-8 "kaimataara mo te w\304\201"] ::msgcat::mcset pl "point station:temporary" [encoding convertfrom utf-8 "punkt pomiarowy (niezastabilizowany)"] ::msgcat::mcset pt "point station:temporary" [encoding convertfrom utf-8 "base tempor\303\241ria"] ::msgcat::mcset pt_BR "point station:temporary" [encoding convertfrom utf-8 "base tempor\303\241ria"] ::msgcat::mcset pt_PT "point station:temporary" [encoding convertfrom utf-8 "base tempor\303\241ria"] ::msgcat::mcset ru "point station:temporary" [encoding convertfrom utf-8 "\320\262\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\271 \320\277\320\270\320\272\320\265\321\202"] ::msgcat::mcset sk "point station:temporary" [encoding convertfrom utf-8 "mera\304\215sk\303\275 bod (nestabilizovan\303\275)"] ::msgcat::mcset sq "point station:temporary" [encoding convertfrom utf-8 "stacion mates I perkohshem"] ::msgcat::mcset bg "point steps" [encoding convertfrom utf-8 "\321\201\321\202\321\212\320\277\320\260\320\273\320\260"] ::msgcat::mcset cz "point steps" [encoding convertfrom utf-8 "schody"] ::msgcat::mcset de "point steps" [encoding convertfrom utf-8 "Stufen"] ::msgcat::mcset el "point steps" [encoding convertfrom utf-8 "\317\203\316\272\316\261\316\273\316\277\317\200\316\254\317\204\316\271\316\261"] ::msgcat::mcset en "point steps" [encoding convertfrom utf-8 "steps"] ::msgcat::mcset en_UK "point steps" [encoding convertfrom utf-8 "steps"] ::msgcat::mcset en_US "point steps" [encoding convertfrom utf-8 "steps"] ::msgcat::mcset es "point steps" [encoding convertfrom utf-8 "escalones"] ::msgcat::mcset fr "point steps" [encoding convertfrom utf-8 "marches"] ::msgcat::mcset it "point steps" [encoding convertfrom utf-8 "scalini"] ::msgcat::mcset mi "point steps" [encoding convertfrom utf-8 "nga tapuae"] ::msgcat::mcset pl "point steps" [encoding convertfrom utf-8 "schody"] ::msgcat::mcset pt "point steps" [encoding convertfrom utf-8 "degraus"] ::msgcat::mcset pt_BR "point steps" [encoding convertfrom utf-8 "degraus"] ::msgcat::mcset pt_PT "point steps" [encoding convertfrom utf-8 "degraus"] ::msgcat::mcset ru "point steps" [encoding convertfrom utf-8 "\321\201\321\202\321\203\320\277\320\265\320\275\320\270"] ::msgcat::mcset sk "point steps" [encoding convertfrom utf-8 "schody"] ::msgcat::mcset sq "point steps" [encoding convertfrom utf-8 "shkalle"] ::msgcat::mcset bg "point traverse" [encoding convertfrom utf-8 "\321\202\321\200\320\260\320\262\320\265\321\200\321\201"] ::msgcat::mcset cz "point traverse" [encoding convertfrom utf-8 "traverz"] ::msgcat::mcset de "point traverse" [encoding convertfrom utf-8 "Querung"] ::msgcat::mcset el "point traverse" [encoding convertfrom utf-8 "\317\204\317\201\316\261\316\262\316\255\317\201\317\203\316\261"] ::msgcat::mcset en "point traverse" [encoding convertfrom utf-8 "traverse"] ::msgcat::mcset en_UK "point traverse" [encoding convertfrom utf-8 "traverse"] ::msgcat::mcset en_US "point traverse" [encoding convertfrom utf-8 "traverse"] ::msgcat::mcset es "point traverse" [encoding convertfrom utf-8 "pasamanos"] ::msgcat::mcset fr "point traverse" [encoding convertfrom utf-8 "travers\303\251e"] ::msgcat::mcset it "point traverse" [encoding convertfrom utf-8 "traverso"] ::msgcat::mcset mi "point traverse" [encoding convertfrom utf-8 "hikoi a tupari"] ::msgcat::mcset pl "point traverse" [encoding convertfrom utf-8 "trawers"] ::msgcat::mcset pt "point traverse" [encoding convertfrom utf-8 "travessia"] ::msgcat::mcset pt_BR "point traverse" [encoding convertfrom utf-8 "travessia"] ::msgcat::mcset pt_PT "point traverse" [encoding convertfrom utf-8 "travessia"] ::msgcat::mcset ru "point traverse" [encoding convertfrom utf-8 "\321\202\321\200\320\276\320\273\320\273\320\265\320\271"] ::msgcat::mcset sk "point traverse" [encoding convertfrom utf-8 "traverz"] ::msgcat::mcset sq "point traverse" [encoding convertfrom utf-8 "kalim anesore"] ::msgcat::mcset bg "point vegetable-debris" [encoding convertfrom utf-8 "\320\276\321\201\321\202\320\260\320\275\320\272\320\270 \320\276\321\202 \321\200\320\260\321\201\321\202\320\270\321\202\320\265\320\273\320\275\320\276\321\201\321\202"] ::msgcat::mcset cz "point vegetable-debris" [encoding convertfrom utf-8 "zbytky rostlin"] ::msgcat::mcset de "point vegetable-debris" [encoding convertfrom utf-8 "Pflanzenreste"] ::msgcat::mcset el "point vegetable-debris" [encoding convertfrom utf-8 "\317\206\317\205\317\204\316\271\316\272\316\254 \316\272\316\261\317\204\316\254\316\273\316\277\316\271\317\200\316\261"] ::msgcat::mcset en "point vegetable-debris" [encoding convertfrom utf-8 "vegetable debris"] ::msgcat::mcset en_UK "point vegetable-debris" [encoding convertfrom utf-8 "vegetable debris"] ::msgcat::mcset en_US "point vegetable-debris" [encoding convertfrom utf-8 "vegetable debris"] ::msgcat::mcset es "point vegetable-debris" [encoding convertfrom utf-8 "detritus vegetales"] ::msgcat::mcset fr "point vegetable-debris" [encoding convertfrom utf-8 "d\303\251bris v\303\251g\303\251taux"] ::msgcat::mcset it "point vegetable-debris" [encoding convertfrom utf-8 "detriti vegetali"] ::msgcat::mcset mi "point vegetable-debris" [encoding convertfrom utf-8 "otaota a hua whenua"] ::msgcat::mcset pl "point vegetable-debris" [encoding convertfrom utf-8 "szcz\304\205tki ro\305\233linne"] ::msgcat::mcset pt "point vegetable-debris" [encoding convertfrom utf-8 "restos vegetais"] ::msgcat::mcset pt_BR "point vegetable-debris" [encoding convertfrom utf-8 "restos vegetais"] ::msgcat::mcset pt_PT "point vegetable-debris" [encoding convertfrom utf-8 "restos vegetais"] ::msgcat::mcset ru "point vegetable-debris" [encoding convertfrom utf-8 "\320\276\321\201\321\202\320\260\320\275\320\272\320\270 \321\200\320\260\321\201\321\202\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270"] ::msgcat::mcset sk "point vegetable-debris" [encoding convertfrom utf-8 "zvy\305\241ky rastl\303\255n"] ::msgcat::mcset sq "point vegetable-debris" [encoding convertfrom utf-8 "mbetje perimesh"] ::msgcat::mcset bg "point wall-altitude" [encoding convertfrom utf-8 "\320\262\320\270\321\201\320\276\321\207\320\270\320\275\320\275\320\260 \320\276\321\202\320\274\320\265\321\202\320\272\320\260 \320\275\320\260 \321\201\321\202\320\265\320\275\320\260\321\202\320\260"] ::msgcat::mcset cz "point wall-altitude" [encoding convertfrom utf-8 "nadmo\305\231sk\303\241 v\303\275\305\241ka bodu na st\304\233n\304\233"] ::msgcat::mcset de "point wall-altitude" [encoding convertfrom utf-8 "H\303\266he \303\274ber Koordinatenursprung"] ::msgcat::mcset el "point wall-altitude" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202 \317\204\316\277\316\257\317\207\316\277\317\205"] ::msgcat::mcset en "point wall-altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset en_UK "point wall-altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset en_US "point wall-altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset es "point wall-altitude" [encoding convertfrom utf-8 "altura pared"] ::msgcat::mcset fr "point wall-altitude" [encoding convertfrom utf-8 "altitude"] ::msgcat::mcset it "point wall-altitude" [encoding convertfrom utf-8 "altezza"] ::msgcat::mcset mi "point wall-altitude" [encoding convertfrom utf-8 "teitei, tiketike"] ::msgcat::mcset pl "point wall-altitude" [encoding convertfrom utf-8 "wysoko\305\233\304\207 punktu pomiarowego npm"] ::msgcat::mcset pt "point wall-altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset pt_BR "point wall-altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset pt_PT "point wall-altitude" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset ru "point wall-altitude" [encoding convertfrom utf-8 "\320\262\321\213\321\201\320\276\321\202\320\275\320\260\321\217 \320\276\321\202\320\274\320\265\321\202\320\272\320\260 \321\201\321\202\320\265\320\275\321\213"] ::msgcat::mcset sk "point wall-altitude" [encoding convertfrom utf-8 "nadmorsk\303\241 v\303\275\305\241ka bodu na stene"] ::msgcat::mcset sq "point wall-altitude" [encoding convertfrom utf-8 "lartesia mbidetare e murit"] ::msgcat::mcset bg "point wall-calcite" [encoding convertfrom utf-8 "\320\277\320\276\320\262\320\273\320\265\320\272"] ::msgcat::mcset cz "point wall-calcite" [encoding convertfrom utf-8 "v\303\241pencov\303\275 povlak"] ::msgcat::mcset de "point wall-calcite" [encoding convertfrom utf-8 "Wandsinter"] ::msgcat::mcset el "point wall-calcite" [encoding convertfrom utf-8 "\316\261\317\203\316\262\316\265\317\203\317\204\316\257\317\204\316\267\317\202 \317\204\316\277\316\271\317\207\317\216\316\274\316\261\317\204\316\277\317\202"] ::msgcat::mcset en "point wall-calcite" [encoding convertfrom utf-8 "wall calcite"] ::msgcat::mcset en_UK "point wall-calcite" [encoding convertfrom utf-8 "wall calcite"] ::msgcat::mcset en_US "point wall-calcite" [encoding convertfrom utf-8 "wall calcite"] ::msgcat::mcset es "point wall-calcite" [encoding convertfrom utf-8 "calcita"] ::msgcat::mcset fr "point wall-calcite" [encoding convertfrom utf-8 "mur, calcite"] ::msgcat::mcset it "point wall-calcite" [encoding convertfrom utf-8 "calcite"] ::msgcat::mcset mi "point wall-calcite" [encoding convertfrom utf-8 "t\304\201ra a nga roimata a pakeho"] ::msgcat::mcset pl "point wall-calcite" [encoding convertfrom utf-8 "wapienna pow\305\202oka"] ::msgcat::mcset pt "point wall-calcite" [encoding convertfrom utf-8 "parede de calcita"] ::msgcat::mcset pt_BR "point wall-calcite" [encoding convertfrom utf-8 "parede de calcita"] ::msgcat::mcset pt_PT "point wall-calcite" [encoding convertfrom utf-8 "parede de calcite"] ::msgcat::mcset ru "point wall-calcite" [encoding convertfrom utf-8 "\320\275\320\260\321\201\321\202\320\265\320\275\320\275\321\213\320\271 \320\272\320\260\320\273\321\214\321\206\320\270\321\202"] ::msgcat::mcset sk "point wall-calcite" [encoding convertfrom utf-8 "v\303\241pencov\303\275 povlak"] ::msgcat::mcset sq "point wall-calcite" [encoding convertfrom utf-8 "kalcit-muri"] ::msgcat::mcset bg "point water" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\260"] ::msgcat::mcset cz "point water" [encoding convertfrom utf-8 "voda"] ::msgcat::mcset de "point water" [encoding convertfrom utf-8 "Wasser"] ::msgcat::mcset el "point water" [encoding convertfrom utf-8 "\316\275\316\265\317\201\317\214"] ::msgcat::mcset en "point water" [encoding convertfrom utf-8 "water"] ::msgcat::mcset en_UK "point water" [encoding convertfrom utf-8 "water"] ::msgcat::mcset en_US "point water" [encoding convertfrom utf-8 "water"] ::msgcat::mcset es "point water" [encoding convertfrom utf-8 "agua"] ::msgcat::mcset fr "point water" [encoding convertfrom utf-8 "eau"] ::msgcat::mcset it "point water" [encoding convertfrom utf-8 "acqua"] ::msgcat::mcset mi "point water" [encoding convertfrom utf-8 "wai"] ::msgcat::mcset pl "point water" [encoding convertfrom utf-8 "woda"] ::msgcat::mcset pt "point water" [encoding convertfrom utf-8 "\303\241gua"] ::msgcat::mcset pt_BR "point water" [encoding convertfrom utf-8 "\303\241gua"] ::msgcat::mcset pt_PT "point water" [encoding convertfrom utf-8 "\303\241gua"] ::msgcat::mcset ru "point water" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\260"] ::msgcat::mcset sk "point water" [encoding convertfrom utf-8 "voda"] ::msgcat::mcset sq "point water" [encoding convertfrom utf-8 "uje"] ::msgcat::mcset bg "point water-flow" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point water-flow" [encoding convertfrom utf-8 "vodn\303\255 tok"] ::msgcat::mcset de "point water-flow" [encoding convertfrom utf-8 "Gerinne"] ::msgcat::mcset el "point water-flow" [encoding convertfrom utf-8 "\317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "point water-flow" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_UK "point water-flow" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_US "point water-flow" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset es "point water-flow" [encoding convertfrom utf-8 "curso agua"] ::msgcat::mcset fr "point water-flow" [encoding convertfrom utf-8 "rivi\303\250re"] ::msgcat::mcset it "point water-flow" [encoding convertfrom utf-8 "corso d'acqua"] ::msgcat::mcset mi "point water-flow" [encoding convertfrom utf-8 "wairere"] ::msgcat::mcset pl "point water-flow" [encoding convertfrom utf-8 "ciek wodny"] ::msgcat::mcset pt "point water-flow" [encoding convertfrom utf-8 "fluxo de \303\241gua"] ::msgcat::mcset pt_BR "point water-flow" [encoding convertfrom utf-8 "fluxo de \303\241gua"] ::msgcat::mcset pt_PT "point water-flow" [encoding convertfrom utf-8 "fluxo de \303\241gua"] ::msgcat::mcset ru "point water-flow" [encoding convertfrom utf-8 "\320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "point water-flow" [encoding convertfrom utf-8 "vodn\303\275 tok"] ::msgcat::mcset sq "point water-flow" [encoding convertfrom utf-8 "rrjedhe uji"] ::msgcat::mcset bg "point water-flow:intermittent" [encoding convertfrom utf-8 "\320\275\320\265\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\320\276 \320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point water-flow:intermittent" [encoding convertfrom utf-8 "ob\304\215asn\303\275 vodn\303\255 tok"] ::msgcat::mcset de "point water-flow:intermittent" [encoding convertfrom utf-8 "zeitweises Gerinne"] ::msgcat::mcset el "point water-flow:intermittent" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\272\316\277\317\200\317\204\317\214\316\274\316\265\316\275\316\267 \317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "point water-flow:intermittent" [encoding convertfrom utf-8 "intermittent water flow"] ::msgcat::mcset en_UK "point water-flow:intermittent" [encoding convertfrom utf-8 "intermittent water flow"] ::msgcat::mcset en_US "point water-flow:intermittent" [encoding convertfrom utf-8 "intermittent water flow"] ::msgcat::mcset es "point water-flow:intermittent" [encoding convertfrom utf-8 "curso agua intermitente"] ::msgcat::mcset fr "point water-flow:intermittent" [encoding convertfrom utf-8 "rivi\303\250re, intermittente"] ::msgcat::mcset it "point water-flow:intermittent" [encoding convertfrom utf-8 "corso d'acqua temporaneo"] ::msgcat::mcset mi "point water-flow:intermittent" [encoding convertfrom utf-8 "wairere taumutumutu"] ::msgcat::mcset pl "point water-flow:intermittent" [encoding convertfrom utf-8 "okresowy ciek wodny"] ::msgcat::mcset pt "point water-flow:intermittent" [encoding convertfrom utf-8 "fluxo de \303\241gua intermitente"] ::msgcat::mcset pt_BR "point water-flow:intermittent" [encoding convertfrom utf-8 "fluxo de \303\241gua intermitente"] ::msgcat::mcset pt_PT "point water-flow:intermittent" [encoding convertfrom utf-8 "fluxo de \303\241gua intermitente"] ::msgcat::mcset ru "point water-flow:intermittent" [encoding convertfrom utf-8 "\320\275\320\265\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\321\213\320\271 \320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "point water-flow:intermittent" [encoding convertfrom utf-8 "ob\304\215asn\303\275 vodn\303\275 tok"] ::msgcat::mcset sq "point water-flow:intermittent" [encoding convertfrom utf-8 "rrjedhe uji me force"] ::msgcat::mcset bg "point water-flow:paleo" [encoding convertfrom utf-8 "\320\277\320\260\320\273\320\265\320\276 \321\200\320\265\321\207\320\275\320\276 \320\273\320\265\320\263\320\273\320\276"] ::msgcat::mcset cz "point water-flow:paleo" [encoding convertfrom utf-8 "paleo\305\231e\304\215i\305\241t\304\233"] ::msgcat::mcset de "point water-flow:paleo" [encoding convertfrom utf-8 "ehemaliges Gerinne"] ::msgcat::mcset el "point water-flow:paleo" [encoding convertfrom utf-8 "\317\200\316\261\316\273\316\261\316\271\316\277\317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "point water-flow:paleo" [encoding convertfrom utf-8 "paleo water flow (scallops)"] ::msgcat::mcset en_UK "point water-flow:paleo" [encoding convertfrom utf-8 "paleo water flow (scallops)"] ::msgcat::mcset en_US "point water-flow:paleo" [encoding convertfrom utf-8 "paleo water flow (scallops)"] ::msgcat::mcset es "point water-flow:paleo" [encoding convertfrom utf-8 "paleocurso agua"] ::msgcat::mcset fr "point water-flow:paleo" [encoding convertfrom utf-8 "rivi\303\250re fossile"] ::msgcat::mcset it "point water-flow:paleo" [encoding convertfrom utf-8 "paleocorso d'acqua"] ::msgcat::mcset mi "point water-flow:paleo" [encoding convertfrom utf-8 "wairere nehera"] ::msgcat::mcset pl "point water-flow:paleo" [encoding convertfrom utf-8 "stary ciek wodny"] ::msgcat::mcset pt "point water-flow:paleo" [encoding convertfrom utf-8 "paleo-fluxo de \303\241gua"] ::msgcat::mcset pt_BR "point water-flow:paleo" [encoding convertfrom utf-8 "paleo-fluxo de \303\241gua"] ::msgcat::mcset pt_PT "point water-flow:paleo" [encoding convertfrom utf-8 "paleo-fluxo de \303\241gua"] ::msgcat::mcset ru "point water-flow:paleo" [encoding convertfrom utf-8 "\320\277\320\260\320\273\320\265\320\276-\320\277\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "point water-flow:paleo" [encoding convertfrom utf-8 "paleorie\304\215isko"] ::msgcat::mcset sq "point water-flow:paleo" [encoding convertfrom utf-8 "rrjedhe uji e vjeter"] ::msgcat::mcset bg "point water-flow:permanent" [encoding convertfrom utf-8 "\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\320\276 \320\262\320\276\320\264\320\275\320\276 \321\202\320\265\321\207\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "point water-flow:permanent" [encoding convertfrom utf-8 "vodn\303\255 tok"] ::msgcat::mcset de "point water-flow:permanent" [encoding convertfrom utf-8 "st\303\244ndiges Gerinne"] ::msgcat::mcset el "point water-flow:permanent" [encoding convertfrom utf-8 "\316\274\317\214\316\275\316\271\316\274\316\267 \317\205\316\264\317\201\316\277\317\201\317\201\316\277\316\256"] ::msgcat::mcset en "point water-flow:permanent" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_UK "point water-flow:permanent" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset en_US "point water-flow:permanent" [encoding convertfrom utf-8 "water flow"] ::msgcat::mcset es "point water-flow:permanent" [encoding convertfrom utf-8 "curso agua"] ::msgcat::mcset fr "point water-flow:permanent" [encoding convertfrom utf-8 "rivi\303\250re, permanente"] ::msgcat::mcset it "point water-flow:permanent" [encoding convertfrom utf-8 "corso d'acqua permanente"] ::msgcat::mcset mi "point water-flow:permanent" [encoding convertfrom utf-8 "wairere"] ::msgcat::mcset pl "point water-flow:permanent" [encoding convertfrom utf-8 "ciek wodny"] ::msgcat::mcset pt "point water-flow:permanent" [encoding convertfrom utf-8 "fluxo de \303\241gua permanente"] ::msgcat::mcset pt_BR "point water-flow:permanent" [encoding convertfrom utf-8 "fluxo de \303\241gua permanente"] ::msgcat::mcset pt_PT "point water-flow:permanent" [encoding convertfrom utf-8 "fluxo de \303\241gua permanente"] ::msgcat::mcset ru "point water-flow:permanent" [encoding convertfrom utf-8 "\320\277\320\276\321\201\321\202\320\276\321\217\320\275\320\275\321\213\320\271 \320\262\320\276\320\264\320\276\321\202\320\276\320\272"] ::msgcat::mcset sk "point water-flow:permanent" [encoding convertfrom utf-8 "vodn\303\275 tok"] ::msgcat::mcset sq "point water-flow:permanent" [encoding convertfrom utf-8 "rrjedhe uji e perhershme"] ::msgcat::mcset bg "title carto" [encoding convertfrom utf-8 "\320\223\320\273. \320\272\320\260\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\207"] ::msgcat::mcset cz "title carto" [encoding convertfrom utf-8 "Kreslil"] ::msgcat::mcset de "title carto" [encoding convertfrom utf-8 "Zeichnung"] ::msgcat::mcset el "title carto" [encoding convertfrom utf-8 "\316\243\316\272\316\261\317\201\316\257\317\206\316\267\316\274\316\261"] ::msgcat::mcset en "title carto" [encoding convertfrom utf-8 "Drawn by"] ::msgcat::mcset en_UK "title carto" [encoding convertfrom utf-8 "Drawn by"] ::msgcat::mcset en_US "title carto" [encoding convertfrom utf-8 "Drawn by"] ::msgcat::mcset es "title carto" [encoding convertfrom utf-8 "Cartograf\303\255a"] ::msgcat::mcset fr "title carto" [encoding convertfrom utf-8 "Dessinateur"] ::msgcat::mcset it "title carto" [encoding convertfrom utf-8 "Cartografia"] ::msgcat::mcset mi "title carto" [encoding convertfrom utf-8 "Kaituhi"] ::msgcat::mcset pl "title carto" [encoding convertfrom utf-8 "rysowa\305\202"] ::msgcat::mcset pt "title carto" [encoding convertfrom utf-8 "Desenhada por"] ::msgcat::mcset pt_BR "title carto" [encoding convertfrom utf-8 "Desenhada por"] ::msgcat::mcset pt_PT "title carto" [encoding convertfrom utf-8 "Desenhada por"] ::msgcat::mcset ru "title carto" [encoding convertfrom utf-8 "\320\232\320\260\320\274\320\265\321\200\320\260\320\273\321\214\320\275\320\260\321\217 \320\276\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260"] ::msgcat::mcset sk "title carto" [encoding convertfrom utf-8 "Kreslil"] ::msgcat::mcset sq "title carto" [encoding convertfrom utf-8 "vizatuar nga"] ::msgcat::mcset bg "title carto (plural)" [encoding convertfrom utf-8 "\320\223\320\273. \320\272\320\260\321\200\321\202\320\270\321\200\320\276\320\262\320\260\321\207\320\270"] ::msgcat::mcset cz "title carto (plural)" [encoding convertfrom utf-8 "Kreslili"] ::msgcat::mcset de "title carto (plural)" [encoding convertfrom utf-8 "Zeichnung"] ::msgcat::mcset el "title carto (plural)" [encoding convertfrom utf-8 "\316\243\316\272\316\261\317\201\316\257\317\206\316\267\316\274\316\261"] ::msgcat::mcset en "title carto (plural)" [encoding convertfrom utf-8 "Drawn by"] ::msgcat::mcset en_UK "title carto (plural)" [encoding convertfrom utf-8 "Drawn by"] ::msgcat::mcset en_US "title carto (plural)" [encoding convertfrom utf-8 "Drawn by"] ::msgcat::mcset es "title carto (plural)" [encoding convertfrom utf-8 "Cartograf\303\255a"] ::msgcat::mcset fr "title carto (plural)" [encoding convertfrom utf-8 "Dessinateurs"] ::msgcat::mcset it "title carto (plural)" [encoding convertfrom utf-8 "Cartografia"] ::msgcat::mcset mi "title carto (plural)" [encoding convertfrom utf-8 "Kaituhi"] ::msgcat::mcset pl "title carto (plural)" [encoding convertfrom utf-8 "rysowali"] ::msgcat::mcset pt "title carto (plural)" [encoding convertfrom utf-8 "Desenhadas por"] ::msgcat::mcset pt_BR "title carto (plural)" [encoding convertfrom utf-8 "Desenhadas por"] ::msgcat::mcset pt_PT "title carto (plural)" [encoding convertfrom utf-8 "Desenhadas por"] ::msgcat::mcset ru "title carto (plural)" [encoding convertfrom utf-8 "\320\232\320\260\320\274\320\265\321\200\320\260\320\273\321\214\320\275\320\260\321\217 \320\276\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260"] ::msgcat::mcset sk "title carto (plural)" [encoding convertfrom utf-8 "Kreslili"] ::msgcat::mcset sq "title carto (plural)" [encoding convertfrom utf-8 "vizatuar nga"] ::msgcat::mcset bg "title cave depth" [encoding convertfrom utf-8 "\320\224\320\265\320\275\320\270\320\262\320\265\320\273\320\260\321\206\320\270\321\217"] ::msgcat::mcset cz "title cave depth" [encoding convertfrom utf-8 "P\305\231ev\303\275\305\241en\303\255"] ::msgcat::mcset de "title cave depth" [encoding convertfrom utf-8 "Niveaudifferenz"] ::msgcat::mcset el "title cave depth" [encoding convertfrom utf-8 "\316\222\316\254\316\270\316\277\317\202"] ::msgcat::mcset en "title cave depth" [encoding convertfrom utf-8 "Depth"] ::msgcat::mcset en_UK "title cave depth" [encoding convertfrom utf-8 "Depth"] ::msgcat::mcset en_US "title cave depth" [encoding convertfrom utf-8 "Depth"] ::msgcat::mcset es "title cave depth" [encoding convertfrom utf-8 "Desnivel"] ::msgcat::mcset fr "title cave depth" [encoding convertfrom utf-8 "Profondeur"] ::msgcat::mcset it "title cave depth" [encoding convertfrom utf-8 "Profondit\303\240"] ::msgcat::mcset mi "title cave depth" [encoding convertfrom utf-8 "H\305\215honu a ana, R\304\223t\305\215tanga"] ::msgcat::mcset pl "title cave depth" [encoding convertfrom utf-8 "przewy\305\274szenie"] ::msgcat::mcset pt "title cave depth" [encoding convertfrom utf-8 "Desn\303\255vel"] ::msgcat::mcset pt_BR "title cave depth" [encoding convertfrom utf-8 "Desn\303\255vel"] ::msgcat::mcset pt_PT "title cave depth" [encoding convertfrom utf-8 "Desn\303\255vel"] ::msgcat::mcset ru "title cave depth" [encoding convertfrom utf-8 "\320\223\320\273\321\203\320\261\320\270\320\275\320\260"] ::msgcat::mcset sk "title cave depth" [encoding convertfrom utf-8 "Prev\303\275\305\241enie"] ::msgcat::mcset sq "title cave depth" [encoding convertfrom utf-8 "thellesia"] ::msgcat::mcset bg "title cave length" [encoding convertfrom utf-8 "\320\224\321\212\320\273\320\266\320\270\320\275\320\260"] ::msgcat::mcset cz "title cave length" [encoding convertfrom utf-8 "D\303\251lka"] ::msgcat::mcset de "title cave length" [encoding convertfrom utf-8 "Gesamtl\303\244nge"] ::msgcat::mcset el "title cave length" [encoding convertfrom utf-8 "\316\234\316\256\316\272\316\277\317\202"] ::msgcat::mcset en "title cave length" [encoding convertfrom utf-8 "Length"] ::msgcat::mcset en_UK "title cave length" [encoding convertfrom utf-8 "Length"] ::msgcat::mcset en_US "title cave length" [encoding convertfrom utf-8 "Length"] ::msgcat::mcset es "title cave length" [encoding convertfrom utf-8 "Desarrollo"] ::msgcat::mcset fr "title cave length" [encoding convertfrom utf-8 "Longueur"] ::msgcat::mcset it "title cave length" [encoding convertfrom utf-8 "Sviluppo"] ::msgcat::mcset mi "title cave length" [encoding convertfrom utf-8 "Roa a ana"] ::msgcat::mcset pl "title cave length" [encoding convertfrom utf-8 "d\305\202ugo\305\233\304\207"] ::msgcat::mcset pt "title cave length" [encoding convertfrom utf-8 "Extens\303\243o"] ::msgcat::mcset pt_BR "title cave length" [encoding convertfrom utf-8 "Extens\303\243o"] ::msgcat::mcset pt_PT "title cave length" [encoding convertfrom utf-8 "Extens\303\243o"] ::msgcat::mcset ru "title cave length" [encoding convertfrom utf-8 "\320\224\320\273\320\270\320\275\320\260"] ::msgcat::mcset sk "title cave length" [encoding convertfrom utf-8 "D\304\272\305\276ka"] ::msgcat::mcset sq "title cave length" [encoding convertfrom utf-8 "gjatesia"] ::msgcat::mcset bg "title color-legend-altitude" [encoding convertfrom utf-8 "\320\222\320\270\321\201\320\276\321\207\320\270\320\275\320\275\320\260 \321\201\320\272\320\260\320\273\320\260"] ::msgcat::mcset cz "title color-legend-altitude" [encoding convertfrom utf-8 "Nadmo\305\231sk\303\251 v\303\275\305\241ky"] ::msgcat::mcset de "title color-legend-altitude" [encoding convertfrom utf-8 "H\303\266he des Titelfeldes"] ::msgcat::mcset el "title color-legend-altitude" [encoding convertfrom utf-8 "\316\245\317\210\316\277\316\274\316\265\317\204\317\201\316\271\316\272\316\254"] ::msgcat::mcset en "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset en_UK "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset en_US "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset es "title color-legend-altitude" [encoding convertfrom utf-8 "color (altitud)"] ::msgcat::mcset fr "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset it "title color-legend-altitude" [encoding convertfrom utf-8 "Profondit\303\240"] ::msgcat::mcset mi "title color-legend-altitude" [encoding convertfrom utf-8 "Teitei, Tiketike"] ::msgcat::mcset pl "title color-legend-altitude" [encoding convertfrom utf-8 "wysoko\305\233ci npm"] ::msgcat::mcset pt "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset pt_BR "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset pt_PT "title color-legend-altitude" [encoding convertfrom utf-8 "Altitudes"] ::msgcat::mcset ru "title color-legend-altitude" [encoding convertfrom utf-8 "\320\222\321\213\321\201\320\276\321\202\320\275\320\260\321\217 \321\210\320\272\320\260\320\273\320\260"] ::msgcat::mcset sk "title color-legend-altitude" [encoding convertfrom utf-8 "Nadmorsk\303\251 v\303\275\305\241ky"] ::msgcat::mcset sq "title color-legend-altitude" [encoding convertfrom utf-8 "titulli ngjyra-permbajtja-lartesia mbidetare"] ::msgcat::mcset bg "title color-legend-map" [encoding convertfrom utf-8 "\320\232\320\260\321\200\321\202\320\270"] ::msgcat::mcset cz "title color-legend-map" [encoding convertfrom utf-8 "Mapy"] ::msgcat::mcset de "title color-legend-map" [encoding convertfrom utf-8 "Karten"] ::msgcat::mcset el "title color-legend-map" [encoding convertfrom utf-8 "\316\247\316\254\317\201\317\204\316\265\317\202"] ::msgcat::mcset en "title color-legend-map" [encoding convertfrom utf-8 "Maps"] ::msgcat::mcset en_UK "title color-legend-map" [encoding convertfrom utf-8 "Maps"] ::msgcat::mcset en_US "title color-legend-map" [encoding convertfrom utf-8 "Maps"] ::msgcat::mcset es "title color-legend-map" [encoding convertfrom utf-8 "color (mapa)"] ::msgcat::mcset fr "title color-legend-map" [encoding convertfrom utf-8 "Cartes"] ::msgcat::mcset it "title color-legend-map" [encoding convertfrom utf-8 "Mappa"] ::msgcat::mcset mi "title color-legend-map" [encoding convertfrom utf-8 "Mahere whenua"] ::msgcat::mcset pl "title color-legend-map" [encoding convertfrom utf-8 "mapy"] ::msgcat::mcset pt "title color-legend-map" [encoding convertfrom utf-8 "Mapas"] ::msgcat::mcset pt_BR "title color-legend-map" [encoding convertfrom utf-8 "Mapas"] ::msgcat::mcset pt_PT "title color-legend-map" [encoding convertfrom utf-8 "Mapas"] ::msgcat::mcset ru "title color-legend-map" [encoding convertfrom utf-8 "\320\232\320\260\321\200\321\202\321\213"] ::msgcat::mcset sk "title color-legend-map" [encoding convertfrom utf-8 "Mapy"] ::msgcat::mcset sq "title color-legend-map" [encoding convertfrom utf-8 "hartat"] ::msgcat::mcset bg "title explo" [encoding convertfrom utf-8 "\320\230\320\267\321\201\320\273\320\265\320\264\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "title explo" [encoding convertfrom utf-8 "Objevil"] ::msgcat::mcset de "title explo" [encoding convertfrom utf-8 "Entdeckung"] ::msgcat::mcset el "title explo" [encoding convertfrom utf-8 "\316\225\316\276\316\265\317\201\316\265\317\205\316\275\316\267\317\204\316\256\317\202"] ::msgcat::mcset en "title explo" [encoding convertfrom utf-8 "Explored by"] ::msgcat::mcset en_UK "title explo" [encoding convertfrom utf-8 "Explored by"] ::msgcat::mcset en_US "title explo" [encoding convertfrom utf-8 "Explored by"] ::msgcat::mcset es "title explo" [encoding convertfrom utf-8 "Exploraci\303\263n"] ::msgcat::mcset fr "title explo" [encoding convertfrom utf-8 "Explorateur"] ::msgcat::mcset it "title explo" [encoding convertfrom utf-8 "Esplorazione"] ::msgcat::mcset mi "title explo" [encoding convertfrom utf-8 "Kaipokai whenua"] ::msgcat::mcset pl "title explo" [encoding convertfrom utf-8 "odkry\305\202"] ::msgcat::mcset pt "title explo" [encoding convertfrom utf-8 "Explorada por"] ::msgcat::mcset pt_BR "title explo" [encoding convertfrom utf-8 "Explorada por"] ::msgcat::mcset pt_PT "title explo" [encoding convertfrom utf-8 "Explorada por"] ::msgcat::mcset ru "title explo" [encoding convertfrom utf-8 "\320\230\321\201\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\320\265"] ::msgcat::mcset sk "title explo" [encoding convertfrom utf-8 "Objavil"] ::msgcat::mcset sq "title explo" [encoding convertfrom utf-8 "hulumtuar nga"] ::msgcat::mcset bg "title explo (plural)" [encoding convertfrom utf-8 "\320\230\320\267\321\201\320\273\320\265\320\264\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "title explo (plural)" [encoding convertfrom utf-8 "Objevili"] ::msgcat::mcset de "title explo (plural)" [encoding convertfrom utf-8 "Entdeckung"] ::msgcat::mcset el "title explo (plural)" [encoding convertfrom utf-8 "\316\225\316\276\316\265\317\201\316\265\317\205\316\275\316\267\317\204\316\255\317\202"] ::msgcat::mcset en "title explo (plural)" [encoding convertfrom utf-8 "Explored by"] ::msgcat::mcset en_UK "title explo (plural)" [encoding convertfrom utf-8 "Explored by"] ::msgcat::mcset en_US "title explo (plural)" [encoding convertfrom utf-8 "Explored by"] ::msgcat::mcset es "title explo (plural)" [encoding convertfrom utf-8 "Exploraci\303\263n"] ::msgcat::mcset fr "title explo (plural)" [encoding convertfrom utf-8 "Explorateurs"] ::msgcat::mcset it "title explo (plural)" [encoding convertfrom utf-8 "Esplorazione"] ::msgcat::mcset mi "title explo (plural)" [encoding convertfrom utf-8 "Kaipokai whenua"] ::msgcat::mcset pl "title explo (plural)" [encoding convertfrom utf-8 "odkryli"] ::msgcat::mcset pt "title explo (plural)" [encoding convertfrom utf-8 "Exploradas por"] ::msgcat::mcset pt_BR "title explo (plural)" [encoding convertfrom utf-8 "Exploradas por"] ::msgcat::mcset pt_PT "title explo (plural)" [encoding convertfrom utf-8 "Exploradas por"] ::msgcat::mcset ru "title explo (plural)" [encoding convertfrom utf-8 "\320\230\321\201\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\320\265"] ::msgcat::mcset sk "title explo (plural)" [encoding convertfrom utf-8 "Objavili"] ::msgcat::mcset sq "title explo (plural)" [encoding convertfrom utf-8 "hulumtuar nga"] ::msgcat::mcset bg "title legend" [encoding convertfrom utf-8 "\320\233\320\265\320\263\320\265\320\275\320\264\320\260"] ::msgcat::mcset cz "title legend" [encoding convertfrom utf-8 "Legenda"] ::msgcat::mcset de "title legend" [encoding convertfrom utf-8 "Legende"] ::msgcat::mcset el "title legend" [encoding convertfrom utf-8 "\316\244\316\257\317\204\316\273\316\277\317\202"] ::msgcat::mcset en "title legend" [encoding convertfrom utf-8 "Legend"] ::msgcat::mcset en_UK "title legend" [encoding convertfrom utf-8 "Legend"] ::msgcat::mcset en_US "title legend" [encoding convertfrom utf-8 "Legend"] ::msgcat::mcset es "title legend" [encoding convertfrom utf-8 "Leyenda"] ::msgcat::mcset fr "title legend" [encoding convertfrom utf-8 "L\303\251gende"] ::msgcat::mcset it "title legend" [encoding convertfrom utf-8 "Legenda"] ::msgcat::mcset mi "title legend" [encoding convertfrom utf-8 "Kaiwhakaatu"] ::msgcat::mcset pl "title legend" [encoding convertfrom utf-8 "legenda"] ::msgcat::mcset pt "title legend" [encoding convertfrom utf-8 "Legenda"] ::msgcat::mcset pt_BR "title legend" [encoding convertfrom utf-8 "Legenda"] ::msgcat::mcset pt_PT "title legend" [encoding convertfrom utf-8 "Legenda"] ::msgcat::mcset ru "title legend" [encoding convertfrom utf-8 "\320\243\321\201\320\273\320\276\320\262\320\275\321\213\320\265 \320\276\320\261\320\276\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "title legend" [encoding convertfrom utf-8 "Legenda"] ::msgcat::mcset sq "title legend" [encoding convertfrom utf-8 "permbajtja"] ::msgcat::mcset bg "title preview above" [encoding convertfrom utf-8 "\320\230\320\267\320\263\320\273\320\265\320\264 \320\276\321\202 \320\263\320\276\321\200\320\265"] ::msgcat::mcset cz "title preview above" [encoding convertfrom utf-8 "\133N\303\241hled horn\303\255ch vrstev]"] ::msgcat::mcset de "title preview above" [encoding convertfrom utf-8 "Vorschau oben"] ::msgcat::mcset el "title preview above" [encoding convertfrom utf-8 "\133\317\200\317\201\316\277\316\265\317\200\316\271\317\203\316\272\317\214\317\200\316\267\317\203\316\267 \317\200\316\254\316\275\317\211]"] ::msgcat::mcset en "title preview above" [encoding convertfrom utf-8 "\133Preview above]"] ::msgcat::mcset en_UK "title preview above" [encoding convertfrom utf-8 "\133Preview above]"] ::msgcat::mcset en_US "title preview above" [encoding convertfrom utf-8 "\133Preview above]"] ::msgcat::mcset es "title preview above" [encoding convertfrom utf-8 "Vista previa superior"] ::msgcat::mcset fr "title preview above" [encoding convertfrom utf-8 "\133Pr\303\251visualisation au-dessus]"] ::msgcat::mcset it "title preview above" [encoding convertfrom utf-8 "Anteprima sopra"] ::msgcat::mcset mi "title preview above" [encoding convertfrom utf-8 "Tuhi a ana ki runga"] ::msgcat::mcset pl "title preview above" [encoding convertfrom utf-8 "widok z g\303\263ry"] ::msgcat::mcset pt "title preview above" [encoding convertfrom utf-8 "\133Visualiza\303\247\303\243o acima]"] ::msgcat::mcset pt_BR "title preview above" [encoding convertfrom utf-8 "\133Visualiza\303\247\303\243o acima]"] ::msgcat::mcset pt_PT "title preview above" [encoding convertfrom utf-8 "\133Visualiza\303\247\303\243o acima]"] ::msgcat::mcset ru "title preview above" [encoding convertfrom utf-8 "\133\320\222\320\270\320\264 \320\262\321\213\321\210\320\265]"] ::msgcat::mcset sk "title preview above" [encoding convertfrom utf-8 "\133N\303\241h\304\276ad horn\303\275ch vrstiev]"] ::msgcat::mcset sq "title preview above" [encoding convertfrom utf-8 "parashiqimi lart"] ::msgcat::mcset bg "title preview below" [encoding convertfrom utf-8 "\320\230\320\267\320\263\320\273\320\265\320\264 \320\276\321\202 \320\264\320\276\320\273\321\203"] ::msgcat::mcset cz "title preview below" [encoding convertfrom utf-8 "\133N\303\241hled doln\303\255ch vrstev]"] ::msgcat::mcset de "title preview below" [encoding convertfrom utf-8 "Vorschau unten"] ::msgcat::mcset el "title preview below" [encoding convertfrom utf-8 "\133\317\200\317\201\316\277\316\265\317\200\316\271\317\203\316\272\317\214\317\200\316\267\317\203\316\267 \316\272\316\254\317\204\317\211]"] ::msgcat::mcset en "title preview below" [encoding convertfrom utf-8 "\133Preview below]"] ::msgcat::mcset en_UK "title preview below" [encoding convertfrom utf-8 "\133Preview below]"] ::msgcat::mcset en_US "title preview below" [encoding convertfrom utf-8 "\133Preview below]"] ::msgcat::mcset es "title preview below" [encoding convertfrom utf-8 "Vista previa inferior"] ::msgcat::mcset fr "title preview below" [encoding convertfrom utf-8 "\133Pr\303\251visualisation au-dessous]"] ::msgcat::mcset it "title preview below" [encoding convertfrom utf-8 "Anteprima sotto"] ::msgcat::mcset mi "title preview below" [encoding convertfrom utf-8 "Tuhi a ana ki raro"] ::msgcat::mcset pl "title preview below" [encoding convertfrom utf-8 "widok z do\305\202u"] ::msgcat::mcset pt "title preview below" [encoding convertfrom utf-8 "\133Visualiza\303\247\303\243o abaixo]"] ::msgcat::mcset pt_BR "title preview below" [encoding convertfrom utf-8 "\133Visualiza\303\247\303\243o abaixo]"] ::msgcat::mcset pt_PT "title preview below" [encoding convertfrom utf-8 "\133Visualiza\303\247\303\243o abaixo]"] ::msgcat::mcset ru "title preview below" [encoding convertfrom utf-8 "\133\320\222\320\270\320\264 \320\275\320\270\320\266\320\265]"] ::msgcat::mcset sk "title preview below" [encoding convertfrom utf-8 "\133N\303\241h\304\276ad spodn\303\275ch vrstiev]"] ::msgcat::mcset sq "title preview below" [encoding convertfrom utf-8 "parashiqimi perfundi"] ::msgcat::mcset bg "title surface bitmap" [encoding convertfrom utf-8 "\320\232\320\260\321\200\321\202\320\260 \320\275\320\260 \320\277\320\276\320\262\321\212\321\200\321\205\320\275\320\276\321\201\321\202\321\202\320\260"] ::msgcat::mcset cz "title surface bitmap" [encoding convertfrom utf-8 "\133Povrchov\303\241 mapa]"] ::msgcat::mcset de "title surface bitmap" [encoding convertfrom utf-8 "Erdoberfl\303\244che"] ::msgcat::mcset el "title surface bitmap" [encoding convertfrom utf-8 "\133\317\207\316\254\317\201\317\204\316\267\317\202 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202]"] ::msgcat::mcset en "title surface bitmap" [encoding convertfrom utf-8 "\133Surface Image]"] ::msgcat::mcset en_UK "title surface bitmap" [encoding convertfrom utf-8 "\133Surface Image]"] ::msgcat::mcset en_US "title surface bitmap" [encoding convertfrom utf-8 "\133Surface Image]"] ::msgcat::mcset es "title surface bitmap" [encoding convertfrom utf-8 "Mapa superficie"] ::msgcat::mcset fr "title surface bitmap" [encoding convertfrom utf-8 "\133Carte ext\303\251rieure]"] ::msgcat::mcset it "title surface bitmap" [encoding convertfrom utf-8 "Mappa superficie"] ::msgcat::mcset mi "title surface bitmap" [encoding convertfrom utf-8 "Konohi o te whenua"] ::msgcat::mcset pl "title surface bitmap" [encoding convertfrom utf-8 "mapa powierzchni"] ::msgcat::mcset pt "title surface bitmap" [encoding convertfrom utf-8 "\133Mapa de superf\303\255cie]"] ::msgcat::mcset pt_BR "title surface bitmap" [encoding convertfrom utf-8 "\133Mapa de superf\303\255cie]"] ::msgcat::mcset pt_PT "title surface bitmap" [encoding convertfrom utf-8 "\133Mapa de superf\303\255cie]"] ::msgcat::mcset ru "title surface bitmap" [encoding convertfrom utf-8 "\133\320\232\320\260\321\200\321\202\320\260 \320\277\320\276\320\262\320\265\321\200\321\205\320\275\320\276\321\201\321\202\320\270]"] ::msgcat::mcset sk "title surface bitmap" [encoding convertfrom utf-8 "\133Povrchov\303\241 mapa]"] ::msgcat::mcset sq "title surface bitmap" [encoding convertfrom utf-8 "harta e siperfaqes"] ::msgcat::mcset bg "title topo" [encoding convertfrom utf-8 "\320\232\320\260\321\200\321\202\320\270\321\200\320\260\320\273"] ::msgcat::mcset cz "title topo" [encoding convertfrom utf-8 "M\304\233\305\231il"] ::msgcat::mcset de "title topo" [encoding convertfrom utf-8 "Vermessung"] ::msgcat::mcset el "title topo" [encoding convertfrom utf-8 "\316\247\316\261\317\201\317\204\316\277\316\263\317\201\316\261\317\206\316\256\316\270\316\267\316\272\316\265 \316\261\317\200\317\214 \317\204\316\277\316\275"] ::msgcat::mcset en "title topo" [encoding convertfrom utf-8 "Surveyed by"] ::msgcat::mcset en_UK "title topo" [encoding convertfrom utf-8 "Surveyed by"] ::msgcat::mcset en_US "title topo" [encoding convertfrom utf-8 "Surveyed by"] ::msgcat::mcset es "title topo" [encoding convertfrom utf-8 "Topograf\303\255a"] ::msgcat::mcset fr "title topo" [encoding convertfrom utf-8 "Topographe"] ::msgcat::mcset it "title topo" [encoding convertfrom utf-8 "Topografia"] ::msgcat::mcset mi "title topo" [encoding convertfrom utf-8 "Kair\305\253ri"] ::msgcat::mcset pl "title topo" [encoding convertfrom utf-8 "mierzy\305\202"] ::msgcat::mcset pt "title topo" [encoding convertfrom utf-8 "Topografada por"] ::msgcat::mcset pt_BR "title topo" [encoding convertfrom utf-8 "Topografada por"] ::msgcat::mcset pt_PT "title topo" [encoding convertfrom utf-8 "Topografada por"] ::msgcat::mcset ru "title topo" [encoding convertfrom utf-8 "\320\241\321\212\320\265\320\274\320\272\320\260"] ::msgcat::mcset sk "title topo" [encoding convertfrom utf-8 "Zameral"] ::msgcat::mcset sq "title topo" [encoding convertfrom utf-8 "matur nga"] ::msgcat::mcset bg "title topo (plural)" [encoding convertfrom utf-8 "\320\232\320\260\321\200\321\202\320\270\321\200\320\260\320\273\320\270"] ::msgcat::mcset cz "title topo (plural)" [encoding convertfrom utf-8 "M\304\233\305\231ili"] ::msgcat::mcset de "title topo (plural)" [encoding convertfrom utf-8 "Vermessung"] ::msgcat::mcset el "title topo (plural)" [encoding convertfrom utf-8 "\316\247\316\261\317\201\317\204\316\277\316\263\317\201\316\261\317\206\316\256\316\270\316\267\316\272\316\265 \316\261\317\200\317\214 \317\204\316\277\317\205\317\202"] ::msgcat::mcset en "title topo (plural)" [encoding convertfrom utf-8 "Surveyed by"] ::msgcat::mcset en_UK "title topo (plural)" [encoding convertfrom utf-8 "Surveyed by"] ::msgcat::mcset en_US "title topo (plural)" [encoding convertfrom utf-8 "Surveyed by"] ::msgcat::mcset es "title topo (plural)" [encoding convertfrom utf-8 "Espeleometr\303\255a"] ::msgcat::mcset fr "title topo (plural)" [encoding convertfrom utf-8 "Topographes"] ::msgcat::mcset it "title topo (plural)" [encoding convertfrom utf-8 "Topografia"] ::msgcat::mcset mi "title topo (plural)" [encoding convertfrom utf-8 "Kair\305\253ri"] ::msgcat::mcset pl "title topo (plural)" [encoding convertfrom utf-8 "pomierzyli"] ::msgcat::mcset pt "title topo (plural)" [encoding convertfrom utf-8 "Topografadas por"] ::msgcat::mcset pt_BR "title topo (plural)" [encoding convertfrom utf-8 "Topografadas por"] ::msgcat::mcset pt_PT "title topo (plural)" [encoding convertfrom utf-8 "Topografadas por"] ::msgcat::mcset ru "title topo (plural)" [encoding convertfrom utf-8 "\320\241\321\212\320\265\320\274\320\272\320\260"] ::msgcat::mcset sk "title topo (plural)" [encoding convertfrom utf-8 "Zamerali"] ::msgcat::mcset sq "title topo (plural)" [encoding convertfrom utf-8 "matur nga"] ::msgcat::mcset bg "units ft" [encoding convertfrom utf-8 "\321\204\321\203\321\202\320\276\320\262\320\265"] ::msgcat::mcset cz "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset de "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset el "units ft" [encoding convertfrom utf-8 "\317\200\317\214\316\264\316\271\316\261"] ::msgcat::mcset en "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset en_UK "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset en_US "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset es "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset fr "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset it "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset mi "units ft" [encoding convertfrom utf-8 "wh\304\253ti"] ::msgcat::mcset pl "units ft" [encoding convertfrom utf-8 "ft (stopy)"] ::msgcat::mcset pt "units ft" [encoding convertfrom utf-8 "p\303\251s"] ::msgcat::mcset pt_BR "units ft" [encoding convertfrom utf-8 "p\303\251s"] ::msgcat::mcset pt_PT "units ft" [encoding convertfrom utf-8 "p\303\251s"] ::msgcat::mcset ru "units ft" [encoding convertfrom utf-8 "\321\204\321\203\321\202\320\276\320\262"] ::msgcat::mcset sk "units ft" [encoding convertfrom utf-8 "ft"] ::msgcat::mcset sq "units ft" [encoding convertfrom utf-8 "njesia matese-kembe"] ::msgcat::mcset bg "units m" [encoding convertfrom utf-8 "\320\274"] ::msgcat::mcset cz "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset de "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset el "units m" [encoding convertfrom utf-8 "\316\274"] ::msgcat::mcset en "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset en_UK "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset en_US "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset es "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset fr "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset it "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset mi "units m" [encoding convertfrom utf-8 "mehua"] ::msgcat::mcset pl "units m" [encoding convertfrom utf-8 "m (metry)"] ::msgcat::mcset pt "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset pt_BR "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset pt_PT "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset ru "units m" [encoding convertfrom utf-8 "\320\274"] ::msgcat::mcset sk "units m" [encoding convertfrom utf-8 "m"] ::msgcat::mcset sq "units m" [encoding convertfrom utf-8 "njesia matese-metri"] therion/xtherion/me_cmds2.tcl0000664000175000017500000034606012330222626015312 0ustar useruser## ## me_cmds2.tcl -- ## ## Map editor command processing 2. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- proc xth_me_cmds_get_option {ln opt} { set rxl [list [list "^\\s*$opt\\s+\\\[(\[^\\\]\]*)\\\]" "\["]\ [list "^\\s*$opt\\s+\\\"((\\\"\\\"|\[^\\\"])+)\\\"" "\""]\ [list "^\\s*$opt\\s+(\\S+)" {}]] set rln $ln set val {} set sep {} set res 0 foreach rx $rxl { if {[regexp [lindex $rx 0] $ln dump val]} { regsub [lindex $rx 0] $ln {} rln regsub {^\s*} $rln {} rln set sep [lindex $rx 1] set res 1 break } } return [list $val $rln $res] } proc xth_me_cmds_get_onoffauto {opt} { switch $opt { on {return 1} off {return 0} default {return -1} } } proc xth_me_cmds_get_bool {opt} { if {[lsearch {on 1 true yes} $opt] > -1} { return 1 } else { return 0 } } proc xth_me_cmds_update_line_ctrl {id} { global xth if {[string length $id] > 0} { $xth(ctrl,me,line).typl configure -state normal $xth(ctrl,me,line).typ configure -state normal $xth(ctrl,me,line).namel configure -state normal $xth(ctrl,me,line).name configure -state normal $xth(ctrl,me,line).optl configure -state normal $xth(ctrl,me,line).opt configure -state normal $xth(ctrl,me,line).rev configure -state normal $xth(ctrl,me,line).cls configure -state normal # $xth(ctrl,me,line).insp configure -state normal # $xth(ctrl,me,line).delp configure -state normal $xth(ctrl,me,line).theme configure -state normal $xth(ctrl,me,line).themetype configure -state normal $xth(ctrl,me,line).lpa configure -state normal $xth(ctrl,me,line).upd configure -state normal $xth(ctrl,me,line).trace configure -state normal $xth(ctrl,me,line).vector configure -state normal $xth(ctrl,me,line).lpa.m entryconfigure [mc "Insert point"] -state normal $xth(ctrl,me,line).lpa.m entryconfigure [mc "Delete point"] -state normal $xth(ctrl,me,line).pl.l configure -takefocus 1 \ -listvariable xth(me,cmds,$id,plist) set xth(ctrl,me,line,type) $xth(me,cmds,$id,type) set xth(ctrl,me,line,name) $xth(me,cmds,$id,name) set xth(ctrl,me,line,opts) $xth(me,cmds,$id,options) set xth(ctrl,me,line,reverse) $xth(me,cmds,$id,reverse) set xth(ctrl,me,line,close) $xth(me,cmds,$id,close) set at [lindex $xth(me,themes,list) $xth(me,acttheme)] set tx [lsearch -exact $xth(me,themes,$at,line,hidelist) $xth(me,cmds,$id,type)] if {$tx < 0} { set xth(ctrl,me,line,themetype) {} } else { set xth(ctrl,me,line,themetype) [lindex $xth(me,themes,$at,line,showlist) $tx] } xth_me_prev_cmd $xth(me,cmds,$id,data) catch {$xth(me,can) raise lnln$id line} catch {$xth(me,can) raise lnpt$id point} } else { set xth(ctrl,me,line,name) {} set xth(ctrl,me,line,reverse) 0 set xth(ctrl,me,line,close) 0 set xth(ctrl,me,line,type) $xth(me,dflt,line,type) set xth(ctrl,me,line,opts) $xth(me,dflt,line,options) $xth(ctrl,me,line).typl configure -state disabled $xth(ctrl,me,line).typ configure -state disabled $xth(ctrl,me,line).namel configure -state disabled $xth(ctrl,me,line).name configure -state disabled $xth(ctrl,me,line).optl configure -state disabled $xth(ctrl,me,line).opt configure -state disabled $xth(ctrl,me,line).rev configure -state disabled $xth(ctrl,me,line).cls configure -state disabled # $xth(ctrl,me,line).insp configure -state disabled # $xth(ctrl,me,line).delp configure -state disabled $xth(ctrl,me,line).theme configure -state disabled $xth(ctrl,me,line).themetype configure -state disabled $xth(ctrl,me,line).lpa configure -state disabled $xth(ctrl,me,line).upd configure -state disabled $xth(ctrl,me,line).trace configure -state disabled $xth(ctrl,me,line).vector configure -state disabled $xth(ctrl,me,line).lpa.m entryconfigure [mc "Insert point"] -state disabled $xth(ctrl,me,line).lpa.m entryconfigure [mc "Delete point"] -state disabled $xth(ctrl,me,line).pl.l configure -takefocus 0 \ -listvariable xth(ctrl,me,line,empty) $xth(ctrl,me,line).pl.l selection clear 0 end } } proc xth_me_cmds_update_area_ctrl {id} { global xth if {[string length $id] > 0} { $xth(ctrl,me,ac).typl configure -state normal $xth(ctrl,me,ac).typ configure -state normal $xth(ctrl,me,ac).theme configure -state normal $xth(ctrl,me,ac).themetype configure -state normal $xth(ctrl,me,ac).optl configure -state normal $xth(ctrl,me,ac).opt configure -state normal $xth(ctrl,me,ac).ins configure -state normal $xth(ctrl,me,ac).del configure -state normal $xth(ctrl,me,ac).insid configure -state normal $xth(ctrl,me,ac).inside configure -state normal $xth(ctrl,me,ac).upd configure -state normal $xth(ctrl,me,ac).shw configure -state normal $xth(ctrl,me,ac).ll.l configure -takefocus 1 \ -listvariable xth(me,cmds,$id,llist) $xth(ctrl,me,ac).ll.l selection clear 0 end $xth(ctrl,me,ac).ll.l selection set end end $xth(ctrl,me,ac).ll.l see end set xth(ctrl,me,ac,type) $xth(me,cmds,$id,type) set xth(ctrl,me,ac,name) $xth(me,cmds,$id,name) set xth(ctrl,me,ac,opts) $xth(me,cmds,$id,options) set at [lindex $xth(me,themes,list) $xth(me,acttheme)] set tx [lsearch -exact $xth(me,themes,$at,area,hidelist) $xth(me,cmds,$id,type)] if {$tx < 0} { set xth(ctrl,me,ac,themetype) {} } else { set xth(ctrl,me,ac,themetype) [lindex $xth(me,themes,$at,area,showlist) $tx] } set xth(ctrl,me,ac,insid) {} xth_me_prev_cmd $xth(me,cmds,$id,data) } else { set xth(ctrl,me,ac,name) {} set xth(ctrl,me,ac,insid) {} set xth(ctrl,me,ac,type) $xth(me,dflt,area,type) set xth(ctrl,me,ac,opts) $xth(me,dflt,area,options) $xth(ctrl,me,ac).typl configure -state disabled $xth(ctrl,me,ac).typ configure -state disabled $xth(ctrl,me,ac).theme configure -state disabled $xth(ctrl,me,ac).themetype configure -state disabled $xth(ctrl,me,ac).optl configure -state disabled $xth(ctrl,me,ac).opt configure -state disabled $xth(ctrl,me,ac).ins configure -state disabled $xth(ctrl,me,ac).del configure -state disabled $xth(ctrl,me,ac).insid configure -state disabled $xth(ctrl,me,ac).inside configure -state disabled $xth(ctrl,me,ac).upd configure -state disabled $xth(ctrl,me,ac).shw configure -state disabled $xth(ctrl,me,ac).ll.l configure -takefocus 0 \ -listvariable xth(ctrl,me,ac,empty) $xth(ctrl,me,ac).ll.l selection clear 0 end } } proc xth_me_cmds_move_lineptcp_xctrl {id ppid pid npid} { global xth set px [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] set py [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] if {$xth(me,cmds,$id,$pid,idp)} { set x [xth_me_real2canx $xth(me,cmds,$id,$pid,xp)] set y [xth_me_real2cany $xth(me,cmds,$id,$pid,yp)] $xth(me,can) coords $xth(me,canid,linept,pcp) [list \ [expr $x - $xth(gui,me,line,cpsize)] \ [expr $y - $xth(gui,me,line,cpsize)] \ [expr $x + $xth(gui,me,line,cpsize)] \ [expr $y + $xth(gui,me,line,cpsize)]] $xth(me,can) coords $xth(me,canid,linept,pcpl) $px $py $x $y } if {$xth(me,cmds,$id,$pid,idn)} { set x [xth_me_real2canx $xth(me,cmds,$id,$pid,xn)] set y [xth_me_real2cany $xth(me,cmds,$id,$pid,yn)] $xth(me,can) coords $xth(me,canid,linept,ncp) [list \ [expr $x - $xth(gui,me,line,cpsize)] \ [expr $y - $xth(gui,me,line,cpsize)] \ [expr $x + $xth(gui,me,line,cpsize)] \ [expr $y + $xth(gui,me,line,cpsize)]] $xth(me,can) coords $xth(me,canid,linept,ncpl) $px $py $x $y } if {($npid > 0) && $xth(me,cmds,$id,$npid,idp)} { set px [xth_me_real2canx $xth(me,cmds,$id,$npid,x)] set py [xth_me_real2cany $xth(me,cmds,$id,$npid,y)] set x [xth_me_real2canx $xth(me,cmds,$id,$npid,xp)] set y [xth_me_real2cany $xth(me,cmds,$id,$npid,yp)] $xth(me,can) coords $xth(me,canid,linept,nncp) [list \ [expr $x - $xth(gui,me,line,cpsize)] \ [expr $y - $xth(gui,me,line,cpsize)] \ [expr $x + $xth(gui,me,line,cpsize)] \ [expr $y + $xth(gui,me,line,cpsize)]] $xth(me,can) coords $xth(me,canid,linept,nncpl) $px $py $x $y } if {($ppid > 0) && $xth(me,cmds,$id,$ppid,idn)} { set px [xth_me_real2canx $xth(me,cmds,$id,$ppid,x)] set py [xth_me_real2cany $xth(me,cmds,$id,$ppid,y)] set x [xth_me_real2canx $xth(me,cmds,$id,$ppid,xn)] set y [xth_me_real2cany $xth(me,cmds,$id,$ppid,yn)] $xth(me,can) coords $xth(me,canid,linept,ppcp) [list \ [expr $x - $xth(gui,me,line,cpsize)] \ [expr $y - $xth(gui,me,line,cpsize)] \ [expr $x + $xth(gui,me,line,cpsize)] \ [expr $y + $xth(gui,me,line,cpsize)]] $xth(me,can) coords $xth(me,canid,linept,ppcpl) $px $py $x $y } xth_me_cmds_move_linept_size_xctrl $id $pid $xth(me,cmds,$id,$pid,rotation) \ $xth(me,cmds,$id,$pid,rs) $xth(me,cmds,$id,$pid,ls) xth_me_cmds_move_line_xctrl $id } proc xth_me_cmds_move_linept_xctrl {id pid} { global xth set x [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] set y [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] $xth(me,can) coords $xth(me,canid,linept,selector) [list \ [expr $x - 3 * $xth(gui,me,line,psize)] \ [expr $y - 3 * $xth(gui,me,line,psize)] \ [expr $x + 3 * $xth(gui,me,line,psize)] \ [expr $y + 3 * $xth(gui,me,line,psize)]] } proc xth_me_cmds_move_line_xctrl {id} { global xth set pid [lindex $xth(me,cmds,$id,xplist) 0] set rot [xth_me_cmds_get_default_rotation $id $pid] if {$xth(me,cmds,$id,reverse)} { set rot [expr $rot + 180.0] } set x [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] set y [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] $xth(me,can) coords $xth(me,canid,line,tick) [list $x $y \ [expr $x + sin($rot/180.0*3.14159265259) * $xth(gui,me,line,ticksize)] \ [expr $y - cos($rot/180.0*3.14159265259) * $xth(gui,me,line,ticksize)]] } proc xth_me_cmds_show_line_xctrl {id} { global xth if {[llength $xth(me,cmds,$id,xplist)] < 3} { xth_me_cmds_hide_line_xctrl return } xth_me_cmds_move_line_xctrl $id $xth(me,can) itemconfigure entirelinectrl -state normal $xth(me,can) raise entirelinectrl $xth(me,can) lower entirelinectrl point } proc xth_me_cmds_hide_line_xctrl {} { global xth $xth(me,can) itemconfigure entirelinectrl -state hidden } proc xth_me_cmds_show_linept_xctrl {id pid} { global xth set x [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] set y [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] set xl $xth(me,cmds,$id,xplist) $xth(me,can) raise linectrl $xth(me,can) lower linectrl point $xth(me,can) itemconfigure $xth(me,canid,linept,selector) -state normal xth_me_cmds_move_linept_xctrl $id $pid if {$xth(me,cmds,$id,$pid,idp)} { $xth(me,can) itemconfigure $xth(me,canid,linept,pcpl) -state normal $xth(me,can) itemconfigure $xth(me,canid,linept,pcp) -state normal } else { $xth(me,can) itemconfigure $xth(me,canid,linept,pcpl) -state hidden $xth(me,can) itemconfigure $xth(me,canid,linept,pcp) -state hidden } if {$xth(me,cmds,$id,$pid,idn)} { $xth(me,can) itemconfigure $xth(me,canid,linept,ncpl) -state normal $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -state normal } else { $xth(me,can) itemconfigure $xth(me,canid,linept,ncpl) -state hidden $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -state hidden } set ix [lsearch $xl $pid] set lix [expr [llength $xl] - 2] if {$ix > 0} { set ppid [lindex $xl [expr $ix - 1]] } elseif {$xth(me,cmds,$id,close) && ($lix > 0)} { set ppid [lindex $xl [expr $lix - 1]] } else { set ppid 0 } if {$ix < $lix} { set npid [lindex $xl [expr $ix + 1]] } elseif {$xth(me,cmds,$id,close) && ($lix > 0)} { set npid [lindex $xl 1] } else { set npid 0 } if {($npid > 0) && $xth(me,cmds,$id,$npid,idp)} { $xth(me,can) itemconfigure $xth(me,canid,linept,nncpl) -state normal $xth(me,can) itemconfigure $xth(me,canid,linept,nncp) -state normal } else { $xth(me,can) itemconfigure $xth(me,canid,linept,nncpl) -state hidden $xth(me,can) itemconfigure $xth(me,canid,linept,nncp) -state hidden } if {($ppid > 0) && $xth(me,cmds,$id,$ppid,idn)} { $xth(me,can) itemconfigure $xth(me,canid,linept,ppcpl) -state normal $xth(me,can) itemconfigure $xth(me,canid,linept,ppcp) -state normal } else { $xth(me,can) itemconfigure $xth(me,canid,linept,ppcpl) -state hidden $xth(me,can) itemconfigure $xth(me,canid,linept,ppcp) -state hidden } xth_me_cmds_move_lineptcp_xctrl $id $ppid $pid $npid $xth(me,can) raise pt$id.$pid $xth(me,can) bind $xth(me,canid,linept,pcp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,pcp) -fill yellow" $xth(me,can) bind $xth(me,canid,linept,pcp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,pcp) -fill red" $xth(me,can) bind $xth(me,canid,linept,pcp) <1> \ "xth_me_cmds_start_linecp_drag $xth(me,canid,linept,pcp) $id $ppid $pid $npid p %x %y" $xth(me,can) bind $xth(me,canid,linept,ncp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill yellow" $xth(me,can) bind $xth(me,canid,linept,ncp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill red" $xth(me,can) bind $xth(me,canid,linept,ncp) <1> \ "xth_me_cmds_start_linecp_drag $xth(me,canid,linept,ncp) $id $ppid $pid $npid n %x %y" $xth(me,can) bind $xth(me,canid,linept,ppcp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,ppcp) -fill yellow" $xth(me,can) bind $xth(me,canid,linept,ppcp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,ppcp) -fill magenta" $xth(me,can) bind $xth(me,canid,linept,ppcp) <1> \ "xth_me_cmds_start_linecp_drag $xth(me,canid,linept,ppcp) $id $ppid $pid $npid pp %x %y" $xth(me,can) bind $xth(me,canid,linept,nncp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,nncp) -fill yellow" $xth(me,can) bind $xth(me,canid,linept,nncp) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,nncp) -fill magenta" $xth(me,can) bind $xth(me,canid,linept,nncp) <1> \ "xth_me_cmds_start_linecp_drag $xth(me,canid,linept,nncp) $id $ppid $pid $npid nn %x %y" xth_me_cmds_configure_linept_size_xctrl $id $pid xth_me_cmds_move_linept_size_xctrl $id $pid $xth(me,cmds,$id,$pid,rotation) \ $xth(me,cmds,$id,$pid,rs) $xth(me,cmds,$id,$pid,ls) xth_me_cmds_move_line_xctrl $id } proc xth_me_cmds_hide_linept_xctrl {} { global xth $xth(me,can) itemconfigure linectrl -state hidden $xth(me,can) bind $xth(me,canid,linept,pcp) "" $xth(me,can) bind $xth(me,canid,linept,pcp) "" $xth(me,can) bind $xth(me,canid,linept,ncp) "" $xth(me,can) bind $xth(me,canid,linept,ncp) "" $xth(me,can) bind $xth(me,canid,linept,ppcp) "" $xth(me,can) bind $xth(me,canid,linept,ppcp) "" $xth(me,can) bind $xth(me,canid,linept,nncp) "" $xth(me,can) bind $xth(me,canid,linept,nncp) "" $xth(me,can) bind $xth(me,canid,linept,pcp) <1> "" $xth(me,can) bind $xth(me,canid,linept,ncp) <1> "" $xth(me,can) bind $xth(me,canid,linept,ppcp) <1> "" $xth(me,can) bind $xth(me,canid,linept,nncp) <1> "" xth_me_cmds_configure_linept_size_xctrl {} 0 } proc xth_me_cmds_update_linept_ctrl {id pid} { global xth if {[string length $id] > 0} { xth_me_cmds_show_line_xctrl $id } else { xth_me_cmds_hide_line_xctrl } if {([string length $id] > 0) && ($pid > 0)} { $xth(ctrl,me,linept).posl configure -state normal $xth(ctrl,me,linept).posx configure -state normal $xth(ctrl,me,linept).posy configure -state normal $xth(ctrl,me,linept).xp configure -state normal $xth(ctrl,me,linept).yp configure -state normal $xth(ctrl,me,linept).xn configure -state normal $xth(ctrl,me,linept).yn configure -state normal $xth(ctrl,me,linept).cbp configure -state normal $xth(ctrl,me,linept).cbn configure -state normal $xth(ctrl,me,linept).cbs configure -state normal $xth(ctrl,me,linept).rotc configure -state normal $xth(ctrl,me,linept).rot configure -state normal $xth(ctrl,me,linept).rszc configure -state normal $xth(ctrl,me,linept).rsz configure -state normal $xth(ctrl,me,linept).lszc configure -state normal $xth(ctrl,me,linept).lsz configure -state normal $xth(ctrl,me,linept).optl configure -state normal $xth(ctrl,me,linept).upd configure -state normal $xth(ctrl,me,line).lpa.m entryconfigure [mc "Delete point"] -state normal set xpid [lsearch -exact $xth(me,cmds,$id,xplist) $pid] if {($xpid > 0) && ($xpid < ([llength $xth(me,cmds,$id,xplist)] - 2))} { $xth(ctrl,me,line).lpa.m entryconfigure [mc "Split line"] -state normal } else { $xth(ctrl,me,line).lpa.m entryconfigure [mc "Split line"] -state disabled } $xth(ctrl,me,linept).oe.txt configure -state normal $xth(ctrl,me,linept).oe.txt delete 1.0 end $xth(ctrl,me,linept).oe.txt insert 1.0 $xth(me,cmds,$id,$pid,options) $xth(ctrl,me,linept).oe.txt mark set insert $xth(me,cmds,$id,$pid,optpos) $xth(ctrl,me,linept).oe.txt see $xth(me,cmds,$id,$pid,optpos) set xth(ctrl,me,linept,x) $xth(me,cmds,$id,$pid,x) set xth(ctrl,me,linept,y) $xth(me,cmds,$id,$pid,y) set xth(ctrl,me,linept,idn) $xth(me,cmds,$id,$pid,idn) set xth(ctrl,me,linept,idp) $xth(me,cmds,$id,$pid,idp) if $xth(me,cmds,$id,$pid,idp) { set xth(ctrl,me,linept,xp) $xth(me,cmds,$id,$pid,xp) set xth(ctrl,me,linept,yp) $xth(me,cmds,$id,$pid,yp) } else { set xth(ctrl,me,linept,xp) {} set xth(ctrl,me,linept,yp) {} } if $xth(me,cmds,$id,$pid,idn) { set xth(ctrl,me,linept,xn) $xth(me,cmds,$id,$pid,xn) set xth(ctrl,me,linept,yn) $xth(me,cmds,$id,$pid,yn) } else { set xth(ctrl,me,linept,xn) {} set xth(ctrl,me,linept,yn) {} } set xth(ctrl,me,linept,smooth) $xth(me,cmds,$id,$pid,smooth) set xth(ctrl,me,linept,rot) $xth(me,cmds,$id,$pid,rotation) if {[string length $xth(me,cmds,$id,$pid,rotation)] > 0} { set xth(ctrl,me,linept,rotid) 1 } else { set xth(ctrl,me,linept,rotid) 0 } set xth(ctrl,me,linept,rs) $xth(me,cmds,$id,$pid,rs) if {[string length $xth(me,cmds,$id,$pid,rs)] > 0} { set xth(ctrl,me,linept,rsid) 1 } else { set xth(ctrl,me,linept,rsid) 0 } set xth(ctrl,me,linept,ls) $xth(me,cmds,$id,$pid,ls) if {[string length $xth(me,cmds,$id,$pid,ls)] > 0} { set xth(ctrl,me,linept,lsid) 1 } else { set xth(ctrl,me,linept,lsid) 0 } xth_me_cmds_show_linept_xctrl $id $pid } else { set xth(ctrl,me,linept,x) {} set xth(ctrl,me,linept,y) {} set xth(ctrl,me,linept,xp) {} set xth(ctrl,me,linept,yp) {} set xth(ctrl,me,linept,xn) {} set xth(ctrl,me,linept,yn) {} set xth(ctrl,me,linept,idn) 0 set xth(ctrl,me,linept,idp) 0 set xth(ctrl,me,linept,smooth) 0 set xth(ctrl,me,linept,rot) {} set xth(ctrl,me,linept,rotid) 0 set xth(ctrl,me,linept,rs) {} set xth(ctrl,me,linept,rsid) 0 set xth(ctrl,me,linept,ls) {} set xth(ctrl,me,linept,lsid) 0 $xth(ctrl,me,linept).posl configure -state disabled $xth(ctrl,me,linept).posx configure -state disabled $xth(ctrl,me,linept).posy configure -state disabled $xth(ctrl,me,linept).xp configure -state disabled $xth(ctrl,me,linept).upd configure -state disabled $xth(ctrl,me,linept).yp configure -state disabled $xth(ctrl,me,linept).xn configure -state disabled $xth(ctrl,me,linept).yn configure -state disabled $xth(ctrl,me,linept).cbp configure -state disabled $xth(ctrl,me,linept).cbn configure -state disabled $xth(ctrl,me,linept).cbs configure -state disabled $xth(ctrl,me,linept).rotc configure -state disabled $xth(ctrl,me,linept).rot configure -state disabled $xth(ctrl,me,linept).rszc configure -state disabled $xth(ctrl,me,linept).rsz configure -state disabled $xth(ctrl,me,linept).lszc configure -state disabled $xth(ctrl,me,linept).lsz configure -state disabled $xth(ctrl,me,linept).optl configure -state disabled $xth(ctrl,me,linept).oe.txt configure -state normal $xth(ctrl,me,linept).oe.txt delete 1.0 end $xth(ctrl,me,linept).oe.txt see 1.0 $xth(ctrl,me,linept).oe.txt configure -state disabled $xth(ctrl,me,line).lpa.m entryconfigure [mc "Delete point"] -state disabled $xth(ctrl,me,line).lpa.m entryconfigure [mc "Split line"] -state disabled xth_me_cmds_hide_linept_xctrl } } proc xth_me_cmds_delete_linept {id pid} { global xth if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {[string length $pid] < 1} { set pid $xth(me,cmds,selpid) } if {$pid == 0} { return } set oldselpid $xth(me,cmds,selpid) if {$xth(me,unredook)} { xth_me_cmds_update {} } # ak mazeme prvy alebo posledny, tak zrusime close ak je nastaveny set closerem 0 if {$xth(me,cmds,$id,close) && ([llength $xth(me,cmds,$id,xplist)] > 2)} { set fpid [lindex $xth(me,cmds,$id,xplist) 0] set lpid [lindex $xth(me,cmds,$id,xplist) [expr [llength $xth(me,cmds,$id,xplist)] - 2]] if {$pid == $fpid} { set closerem 1 } elseif {$pid == $lpid} { set closerem 1 } } if {$closerem} { set closeremstr "set xth(me,cmds,$id,close) 0\nxth_me_cmds_update_line_vars $id $pid" set closeaddstr "set xth(me,cmds,$id,close) 1\nxth_me_cmds_update_line_vars $id $pid" } else { set closeremstr {} set closeaddstr {} } eval $closeremstr # odstrani ho zo zoznamu set ix [lsearch $xth(me,cmds,$id,xplist) $pid] set xth(me,cmds,$id,xplist) [lreplace $xth(me,cmds,$id,xplist) $ix $ix] set xth(me,cmds,$id,plist) [lreplace $xth(me,cmds,$id,plist) $ix $ix] $xth(me,can) delete pt$id.$pid $xth(me,can) delete ln$id.$pid xth_me_cmds_move_line $id if {$oldselpid == $pid} { set nwpid [lindex $xth(me,cmds,$id,xplist) $ix] } else { set nwpid $oldselpid } xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) # BUG FIX when deleting last point if {$nwpid == 0} { set xth(me,cmds,selpid) $nwpid } xth_me_cmds_select_linept $id $nwpid xth_me_unredo_action [mc "deleting line point"] \ "xth_me_cmds_undelete_linept $id $pid $ix\n$closeaddstr" \ "$closeremstr\nxth_me_cmds_delete_linept $id $pid" } proc xth_me_cmds_undelete_linept {id pid ix} { global xth set oldpid [lindex $xth(me,cmds,$id,xplist) $ix] set xth(me,cmds,$id,xplist) [linsert $xth(me,cmds,$id,xplist) $ix $pid] set xth(me,cmds,$id,plist) [linsert $xth(me,cmds,$id,plist) $ix {}] xth_me_cmds_update_linept_list $id $pid if {$ix > 0} { set ppid [lindex $xth(me,cmds,$id,xplist) [expr $ix - 1]] } else { set ppid 0 } xth_me_cmds_draw_linept $id $pid xth_me_cmds_draw_lineln $id $ppid $pid xth_me_cmds_move_line $id xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) xth_me_cmds_select_linept $id $pid } proc xth_me_cmds_create_line_point {id ix mode x y xp yp xn yn smooth rot rs ls opts optpos} { global xth incr xth(me,cmds,$id,lpid) set pid $xth(me,cmds,$id,lpid) set xth(me,cmds,$id,$pid,x) [expr double($x)] set xth(me,cmds,$id,$pid,y) [expr double($y)] if {([string length $xp] > 0) && ((![string equal $xp $x]) || (![string equal $yp $y]))} { set xth(me,cmds,$id,$pid,xp) [expr double($xp)] set xth(me,cmds,$id,$pid,yp) [expr double($yp)] set xth(me,cmds,$id,$pid,idp) 1 } else { set xth(me,cmds,$id,$pid,xp) {} set xth(me,cmds,$id,$pid,yp) {} set xth(me,cmds,$id,$pid,idp) 0 } if {([string length $xn] > 0) && ((![string equal $xn $x]) || (![string equal $yn $y]))} { set xth(me,cmds,$id,$pid,xn) [expr double($xn)] set xth(me,cmds,$id,$pid,yn) [expr double($yn)] set xth(me,cmds,$id,$pid,idn) 1 } else { set xth(me,cmds,$id,$pid,xn) {} set xth(me,cmds,$id,$pid,yn) {} set xth(me,cmds,$id,$pid,idn) 0 } if {[string length $smooth] < 1} { set xth(me,cmds,$id,$pid,smooth) -1 } else { set xth(me,cmds,$id,$pid,smooth) $smooth } if {[string length $rot] > 0} { set rot [expr double($rot)] } set xth(me,cmds,$id,$pid,rotation) $rot if {[string length $ls] > 0} { set ls [expr double($ls)] } set xth(me,cmds,$id,$pid,ls) $ls if {[string length $rs] > 0} { set rs [expr double($rs)] } set xth(me,cmds,$id,$pid,rs) $rs regsub {\s*$} $opts "" opts if {[string length $opts] > 0} { regsub {$} $opts "\n" opts } set xth(me,cmds,$id,$pid,options) $opts set xth(me,cmds,$id,$pid,optpos) $optpos # vlozi ho do zoznamu set xth(me,cmds,$id,plist) [linsert $xth(me,cmds,$id,plist) $ix {}] set xth(me,cmds,$id,xplist) [linsert $xth(me,cmds,$id,xplist) $ix $pid] xth_me_cmds_update_linept_list $id $pid # vytvori ho if {$ix > 0} { set ppid [lindex $xth(me,cmds,$id,xplist) [expr $ix - 1]] } else { set ppid 0 } xth_me_cmds_draw_lineln $id $ppid $pid xth_me_cmds_draw_linept $id $pid } proc xth_me_cmds_create_area_line {id ix mode txt} { global xth incr xth(me,cmds,$id,llid) set lid $xth(me,cmds,$id,llid) regsub {\s*$} $txt "" txt regsub {^\s*} $txt "" txt set xth(me,cmds,$id,$lid,txt) $txt # vlozi ho do zoznamu set xth(me,cmds,$id,llist) [linsert $xth(me,cmds,$id,llist) $ix $txt] set xth(me,cmds,$id,xllist) [linsert $xth(me,cmds,$id,xllist) $ix $lid] } proc xth_me_cmds_insert_area_lineid {id mx my} { global xth if {$xth(me,unredook)} { xth_me_cmds_update {} } if {[string length $xth(me,cmds,$id,name)] == 0} { set nn [format "l%d-%.0f-%.0f" $id [xth_me_can2realx [$xth(me,can) canvasx $mx]] [xth_me_can2realy [$xth(me,can) canvasy $my]]] set unspec "set xth(me,cmds,$id,name) {}\nxth_me_cmds_update_line_data $id\nxth_me_cmds_update_list $id" set respec "set xth(me,cmds,$id,name) [list $nn]\nxth_me_cmds_update_line_data $id\nxth_me_cmds_update_list $id" eval $respec } else { set nn $xth(me,cmds,$id,name) set unspec {} set respec {} } xth_me_cmds_insert_area_line $nn $unspec $respec } proc xth_me_cmds_insert_area_line {txt unspec respec} { global xth if {$xth(me,unredook)} { xth_me_cmds_update {} } regsub {\s*$} $txt "" txt regsub {^\s*} $txt "" txt if {[string length $txt] == 0} { return; } set id $xth(me,cmds,selid) set lid [lindex $xth(me,cmds,$id,xllist) [$xth(ctrl,me,ac).ll.l curselection]] set ix [lsearch $xth(me,cmds,$id,xllist) $lid] xth_me_cmds_create_area_line $id $ix 1 $txt set lid $xth(me,cmds,$id,llid) xth_me_cmds_update_area_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) $xth(ctrl,me,ac).ll.l selection clear 0 end $xth(ctrl,me,ac).ll.l selection set [expr $ix + 1] [expr $ix + 1] $xth(ctrl,me,ac).ll.l see [expr $ix + 1] xth_me_unredo_action [mc "inserting area border"] \ "xth_me_cmds_select $id\nxth_me_cmds_delete_area_line $id $lid\n$unspec" \ "xth_me_cmds_select $id\n$respec\nxth_me_cmds_undelete_area_line 1 $id $lid $ix" } proc xth_me_cmds_delete_area_line {id lid} { global xth if {[string length $id] < 1} { set id $xth(me,cmds,selid) } if {[string length $lid] < 1} { set lid [lindex $xth(me,cmds,$id,xllist) [$xth(ctrl,me,ac).ll.l curselection]] } if {$lid == 0} { return } if {$xth(me,unredook)} { xth_me_cmds_update {} } # odstrani ho zo zoznamu set ix [lsearch $xth(me,cmds,$id,xllist) $lid] set xth(me,cmds,$id,xllist) [lreplace $xth(me,cmds,$id,xllist) $ix $ix] set xth(me,cmds,$id,llist) [lreplace $xth(me,cmds,$id,llist) $ix $ix] xth_me_cmds_update_area_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) $xth(ctrl,me,ac).ll.l selection clear 0 end $xth(ctrl,me,ac).ll.l selection set $ix $ix $xth(ctrl,me,ac).ll.l see $ix xth_me_unredo_action [mc "deleting area border"] \ "xth_me_cmds_undelete_area_line 0 $id $lid $ix" \ "xth_me_cmds_delete_area_line $id $lid" } proc xth_me_cmds_undelete_area_line {cr id lid ix} { global xth set xth(me,cmds,$id,xllist) [linsert $xth(me,cmds,$id,xllist) $ix $lid] set xth(me,cmds,$id,llist) [linsert $xth(me,cmds,$id,llist) $ix $xth(me,cmds,$id,$lid,txt)] xth_me_cmds_update_area_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) $xth(ctrl,me,ac).ll.l selection clear 0 end $xth(ctrl,me,ac).ll.l selection set [expr $ix + $cr] [expr $ix + $cr] $xth(ctrl,me,ac).ll.l see [expr $ix + $cr] } proc xth_me_cmds_create_area {ix mode type opts lines} { global xth if {$mode} { xth_me_cmds_update {} } set id [xth_me_cmds_create 6 {} $ix] set xth(me,cmds,$id,llid) 0 set xth(me,cmds,$id,llist) {"end of area"} set xth(me,cmds,$id,xllist) {0} if {$mode && ([string length $opts] < 1)} { set opts $xth(me,dflt,area,options) } if {[string length $type] > 0} { set xth(me,cmds,$id,type) $type } else { set xth(me,cmds,$id,type) $xth(me,dflt,area,type) } foreach ln $lines { xth_me_cmds_create_area_line $id \ [expr [llength $xth(me,cmds,$id,xllist)] - 1] $mode $ln } # nastavit options regsub {^\s*} $opts "" opts regsub {\s*$} $opts "" opts set xth(me,cmds,$id,options) $opts xth_me_cmds_update_list $id xth_me_cmds_update_area_data $id if {$mode} { xth_me_unredo_action [mc "creating area"] \ "xth_me_cmds_delete $id\nxth_me_cmds_set_mode 0" \ "xth_me_cmds_undelete $id 0 [lsearch $xth(me,cmds,xlist) $id]\nxth_me_cmds_set_mode 3" xth_me_cmds_select $id xth_me_cmds_start_area_insert 0 } } proc xth_me_cmds_create_line {ix mode type opts lines} { global xth if {$mode} { xth_me_cmds_update {} } set id [xth_me_cmds_create 3 {} $ix] set xth(me,cmds,$id,lpid) 0 set xth(me,cmds,$id,plist) {"end of line"} set xth(me,cmds,$id,xplist) {0} if {$mode && ([string length $opts] < 1)} { set opts $xth(me,dflt,line,options) } if {[string length $type] > 0} { set xth(me,cmds,$id,type) $type } else { set xth(me,cmds,$id,type) $xth(me,dflt,line,type) } # nastavit meno set optl [xth_me_cmds_get_line_option $opts id] if {[lindex $optl 2]} { set xth(me,cmds,$id,name) [lindex $optl 0] set opts [lindex $optl 1] } # prejde vsetky riadky a pohlada meno tam set newlines {} foreach ln $lines { set optl [xth_me_cmds_get_option $ln id] if {[lindex $optl 2]} { set xth(me,cmds,$id,name) [lindex $optl 0] set ln [lindex $optl 1] if {[string length $ln] > 0} { lappend newlines $ln } } else { lappend newlines $ln } } set lines $newlines # nastavit reversion set xth(me,cmds,$id,reverse) 0 set optl [xth_me_cmds_get_line_option $opts reverse] if {[lindex $optl 2]} { #puts ">>$opts<< = >>$optl<<" set xth(me,cmds,$id,reverse) [xth_me_cmds_get_bool [lindex $optl 0]] set opts [lindex $optl 1] #puts "$xth(me,cmds,$id,reverse) >>$opts<<" } # prejde vsetky riadky a pohlada reverse tam set newlines {} foreach ln $lines { set optl [xth_me_cmds_get_option $ln reverse] if {[lindex $optl 2]} { set xth(me,cmds,$id,reverse) [xth_me_cmds_get_bool [lindex $optl 0]] set ln [lindex $optl 1] if {[string length $ln] > 0} { lappend newlines $ln } } else { lappend newlines $ln } } set lines $newlines # nastavit close set xth(me,cmds,$id,close) -1 set optl [xth_me_cmds_get_line_option $opts close] if {[lindex $optl 2]} { set xth(me,cmds,$id,close) [xth_me_cmds_get_onoffauto [lindex $optl 0]] set opts [lindex $optl 1] } # prejde vsetky riadky a pohlada reverse tam set newlines {} foreach ln $lines { set optl [xth_me_cmds_get_option $ln close] if {[lindex $optl 2]} { set xth(me,cmds,$id,close) [xth_me_cmds_get_onoffauto [lindex $optl 0]] set ln [lindex $optl 1] if {[string length $ln] > 0} { lappend newlines $ln } } else { lappend newlines $ln } } set lines $newlines # nastavit options regsub {^\s*} $opts "" opts regsub {\s*$} $opts "" opts set xth(me,cmds,$id,options) $opts # vlozi body set has_some 0 set opts {} set rsz {} set lsz {} set smth {} set rot {} foreach ln $lines { set what 0 set cmt 0 if {[regexp {^\s*\!?\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*(\#.*)?$} \ $ln dum x1 y1 x2 y2 x y cmt] && (![catch {expr $x * $y * $x1 * $y1 * $x2 * $y2}])} { set what 2 } elseif {[regexp {^\s*\!?\s*(\S+)\s+(\S+)\s*(\#.*)?$} $ln dum x y cmt] && (![catch {expr $x * $y}])} { set x1 {} set y1 {} set x2 {} set y2 {} set what 1 } elseif {$has_some} { # skusi jednotlive options rotation size r-size l-size smooth set cmt $ln set optl [xth_me_cmds_get_option $ln orientation] if {[lindex $optl 2]} { set rot [lindex $optl 0] set cmt [lindex $optl 1] } else { set optl [xth_me_cmds_get_option $ln orient] if {[lindex $optl 2]} { set rot [lindex $optl 0] set cmt [lindex $optl 1] } else { set optl [xth_me_cmds_get_option $ln smooth] if {[lindex $optl 2]} { set smth [xth_me_cmds_get_onoffauto [lindex $optl 0]] set cmt [lindex $optl 1] } else { set optl [xth_me_cmds_get_option $ln size] if {[lindex $optl 2]} { switch $xth(me,cmds,$id,type) { slope { set lsz [expr [lindex $optl 0]] } default { set rsz [expr [lindex $optl 0] / 2.0] set lsz [expr [lindex $optl 0] / 2.0] } } set cmt [lindex $optl 1] } else { set optl [xth_me_cmds_get_option $ln r-size] if {[lindex $optl 2]} { set rsz [lindex $optl 0] set cmt [lindex $optl 1] } else { set optl [xth_me_cmds_get_option $ln l-size] if {[lindex $optl 2]} { set lsz [lindex $optl 0] set cmt [lindex $optl 1] } } } } } } regsub {^\s*} $cmt {} cmt } else { regsub {^\s*} $ln {} ln set cmt $ln } if {$what == 0} { if {[string length $cmt] > 0} { if {[string length $opts] > 0} { set opts "$opts\n$cmt" } else { set opts "$cmt" } } } else { if {$has_some} { xth_me_cmds_create_line_point $id \ [expr [llength $xth(me,cmds,$id,xplist)] - 1] $mode \ $px $py $px2 $py2 $x1 $y1 $smth $rot $rsz $lsz $opts 1.0 set opts {} set rsz {} set lsz {} set smth {} set rot {} } set has_some 1 set px $x set py $y set px1 $x1 set py1 $y1 set px2 $x2 set py2 $y2 } } if {$has_some} { xth_me_cmds_create_line_point $id \ [expr [llength $xth(me,cmds,$id,xplist)] - 1] $mode \ $px $py $px2 $py2 {} {} $smth $rot $rsz $lsz $opts 1.0 } if {$mode == 1} { set xth(me,cmds,$id,close) 0 } else { xth_me_cmds_postprocess_line $id } xth_me_cmds_update_list $id xth_me_cmds_update_line_data $id if {$mode} { xth_me_unredo_action [mc "creating line"] \ "xth_me_cmds_delete $id\nxth_me_cmds_set_mode 0" \ "xth_me_cmds_undelete $id 0 [lsearch $xth(me,cmds,xlist) $id]\nxth_me_cmds_set_mode 2" xth_me_cmds_select $id xth_me_cmds_start_linept_insert } } proc xth_me_cmds_postprocess_line {id} { global xth set xl $xth(me,cmds,$id,xplist) set lix [expr [llength $xl] - 2] if {$lix < 0} { return } # overi uzavretie set postclose 0 if {$xth(me,cmds,$id,close) != 0} { if {($xth(me,cmds,$id,[lindex $xl 0],x) == $xth(me,cmds,$id,[lindex $xl $lix],x)) && \ ($xth(me,cmds,$id,[lindex $xl 0],y) == $xth(me,cmds,$id,[lindex $xl $lix],y)) && \ ($lix > 0)} { set xth(me,cmds,$id,close) 1 } else { if {$xth(me,cmds,$id,close) == 1} { set postclose 1 } set xth(me,cmds,$id,close) 0 } } if {$xth(me,cmds,$id,close)} { set fid [lindex $xl 0] set lid [lindex $xl $lix] if {$xth(me,cmds,$id,$fid,idn)} { set xth(me,cmds,$id,$lid,idn) $xth(me,cmds,$id,$fid,idn) set xth(me,cmds,$id,$lid,xn) $xth(me,cmds,$id,$fid,xn) set xth(me,cmds,$id,$lid,yn) $xth(me,cmds,$id,$fid,yn) } if {$xth(me,cmds,$id,$lid,idp)} { set xth(me,cmds,$id,$fid,idp) $xth(me,cmds,$id,$lid,idp) set xth(me,cmds,$id,$fid,xp) $xth(me,cmds,$id,$lid,xp) set xth(me,cmds,$id,$fid,yp) $xth(me,cmds,$id,$lid,yp) } } # overi smoothness if {$lix == 0} { set pid [lindex $xth(me,cmds,$id,xplist) 0] if {($xth(me,cmds,$id,$pid,smooth) == -1) && \ $xth(me,cmds,$id,$pid,idp) && \ $xth(me,cmds,$id,$pid,idn)} { set xth(me,cmds,$id,$pid,smooth) [xth_me_cmds_are_smooth \ $xth(me,cmds,$id,$pid,xp) $xth(me,cmds,$id,$pid,yp) \ $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y) \ $xth(me,cmds,$id,$pid,xn) $xth(me,cmds,$id,$pid,yn)] } elseif {$xth(me,cmds,$id,$pid,smooth) == -1} { set xth(me,cmds,$id,$pid,smooth) 0 } return } # prejde vsetky body set lid [lindex $xl $lix] set fid [lindex $xl 0] set cls $xth(me,cmds,$id,close) for {set ix 0} {$ix <= $lix} {incr ix} { set pid [lindex $xl $ix] if {($ix == 0) && $cls} { set idp $xth(me,cmds,$id,$lid,idp) } else { set idp $xth(me,cmds,$id,$pid,idp) } if {($ix == $lix) && $cls} { set idn $xth(me,cmds,$id,$fid,idn) } else { set idn $xth(me,cmds,$id,$pid,idn) } if {$idn && $idp && ($xth(me,cmds,$id,$pid,smooth) == -1)} { set x $xth(me,cmds,$id,$pid,x) set y $xth(me,cmds,$id,$pid,y) if {($ix == 0) && $cls} { set xp $xth(me,cmds,$id,$lid,xp) set yp $xth(me,cmds,$id,$lid,yp) } else { set xp $xth(me,cmds,$id,$pid,xp) set yp $xth(me,cmds,$id,$pid,yp) } if {($ix == $lix) && $cls} { set xn $xth(me,cmds,$id,$fid,xn) set yn $xth(me,cmds,$id,$fid,yn) } else { set xn $xth(me,cmds,$id,$pid,xn) set yn $xth(me,cmds,$id,$pid,yn) } set xth(me,cmds,$id,$pid,smooth) [xth_me_cmds_are_smooth $xp $yp $x $y $xn $yn] } elseif {$xth(me,cmds,$id,$pid,smooth) == -1} { set xth(me,cmds,$id,$pid,smooth) 0 } } if {$postclose} { xth_me_cmds_close_line $id 0 } } proc xth_me_cmds_update_area_data {id} { global xth set xl $xth(me,cmds,$id,xllist) set lix [expr [llength $xl] - 2] set d "area $xth(me,cmds,$id,type)" set xth(me,dflt,area,type) $xth(me,cmds,$id,type) # options if {[string length $xth(me,cmds,$id,options)] > 0} { set d "$d $xth(me,cmds,$id,options)" } set xth(me,dflt,area,options) $xth(me,cmds,$id,options) for {set ix 0} {$ix <= $lix} {incr ix} { set lid [lindex $xl $ix] set d "$d\n $xth(me,cmds,$id,$lid,txt)" } set xth(me,cmds,$id,data) "$d\nendarea" } proc xth_me_cmds_update_line_data {id} { global xth set xl $xth(me,cmds,$id,xplist) set lix [expr [llength $xl] - 2] set d "line $xth(me,cmds,$id,type)" set xth(me,dflt,line,type) $xth(me,cmds,$id,type) # id if {[string length $xth(me,cmds,$id,name)] > 0} { set d "$d -id $xth(me,cmds,$id,name)" } if {$lix > -1} { # close if {$xth(me,cmds,$id,close)} { set d "$d -close on" } elseif {($xth(me,cmds,$id,[lindex $xl 0],x) == $xth(me,cmds,$id,[lindex $xl $lix],x)) && \ ($xth(me,cmds,$id,[lindex $xl 0],y) == $xth(me,cmds,$id,[lindex $xl $lix],y))} { set d "$d -close off" } # reverse if {$xth(me,cmds,$id,reverse)} { set d "$d -reverse on" } } if {[string length $xth(me,cmds,$id,options)] > 0} { set d "$d $xth(me,cmds,$id,options)" } set xth(me,dflt,line,options) $xth(me,cmds,$id,options) set csbar $d set xth(me,cmds,$id,data_ln) "$d\nendline" set xth(me,cmds,$id,data_pt) {} for {set ix 0} {$ix <= $lix} {incr ix} { set cto 0 set pid [lindex $xl $ix] if {$ix == 0} { set crd [format " %s %s" $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y)] } else { if {$xth(me,cmds,$id,$pid,idp) || $xth(me,cmds,$id,$ppid,idn)} { if {$xth(me,cmds,$id,$ppid,idn)} { set x1 $xth(me,cmds,$id,$ppid,xn) set y1 $xth(me,cmds,$id,$ppid,yn) } else { set x1 $xth(me,cmds,$id,$ppid,x) set y1 $xth(me,cmds,$id,$ppid,y) } if {$xth(me,cmds,$id,$pid,idp)} { set x2 $xth(me,cmds,$id,$pid,xp) set y2 $xth(me,cmds,$id,$pid,yp) } else { set x2 $xth(me,cmds,$id,$pid,x) set y2 $xth(me,cmds,$id,$pid,y) } set crd [format " %s %s %s %s" $x1 $y1 $x2 $y2] set cto 1 } else { set crd " " } set crd "$crd [format "%s %s" $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y)]" } set ptd "$crd" # rotation lsize rsize smooth options if {[string length $xth(me,cmds,$id,$pid,rotation)] > 0} { set ptd "$ptd\n orientation $xth(me,cmds,$id,$pid,rotation)" } if {$cto && (! $xth(me,cmds,$id,$pid,smooth))} { set ptd "$ptd\n smooth off" } if {[string length $xth(me,cmds,$id,$pid,ls)] > 0} { set ptd "$ptd\n l-size $xth(me,cmds,$id,$pid,ls)" } if {[string length $xth(me,cmds,$id,$pid,rs)] > 0} { set ptd "$ptd\n r-size $xth(me,cmds,$id,$pid,rs)" } if {[string length $xth(me,cmds,$id,$pid,options)] > 0} { set popts $xth(me,cmds,$id,$pid,options) regsub {\s*$} $popts {} popts if {[string length $popts] > 0} { regsub -all -line {^\s*} $popts { } popts } set ptd "$ptd\n$popts" } lappend xth(me,cmds,$id,data_pt) $ptd set d "$d\n$ptd" set ppid $pid } set xth(me,cmds,$id,data) "$d\nendline" set xth(me,cmds,$id,sbar) $csbar catch { set ttype [lindex $csbar 1] if {([string length $ttype] > 0)} { set ttyp [ mc "line $ttype"] if {![string equal $ttype $ttyp]} { set nd [lreplace $csbar 1 1 "$ttype:$ttyp"] set xth(me,cmds,$id,sbar) "$nd" } } } } proc xth_me_cmds_are_smooth {xp yp x y xn yn} { set rv 1 set d1 [expr hypot($x - $xp,$y - $yp)] set d2 [expr hypot($xn - $x,$yn - $y)] if {($d2 > 0) && ($d1 > 0)} { set a1 [expr atan2($y - $yp, $x - $xp) / 3.14159265359 * 180.0]; set a2 [expr atan2($yn - $y, $xn - $x) / 3.14159265359 * 180.0]; if {($a2 - $a1) > 180.0} { set a2 [expr $a2 - 360.0] } if {($a2 - $a1) < -180.0} { set a2 [expr $a2 + 360.0] } if {($a2 > ($a1 + 5.0)) || ($a2 < ($a1 - 5.0))} { set rv 0 } } return $rv } proc xth_me_cmds_select_linept {id pid} { global xth if {$xth(me,unredook)} { xth_me_cmds_update {} } xth_me_cmds_update_linept_ctrl $id $pid set ix [lsearch $xth(me,cmds,$id,xplist) $pid] $xth(ctrl,me,line).pl.l selection clear 0 end $xth(ctrl,me,line).pl.l selection set $ix $ix $xth(ctrl,me,line).pl.l see $ix set xth(me,cmds,selpid) $pid } proc xth_me_cmds_toggle_line_close {} { global xth set id $xth(me,cmds,selid) set ncls $xth(ctrl,me,line,close) set xth(ctrl,me,line,close_tmp) $xth(ctrl,me,line,close) set xth(ctrl,me,line,close) $xth(me,cmds,$id,close) $xth(ctrl,me,line).cls configure -variable xth(ctrl,me,line,close_tmp) xth_me_cmds_update {} set xth(ctrl,me,line,close) $ncls if {$ncls && (!$xth(me,cmds,$id,close))} { xth_me_cmds_close_line $id } elseif {(!$ncls) && $xth(me,cmds,$id,close)} { xth_me_cmds_open_line $id } $xth(ctrl,me,line).cls configure -variable xth(ctrl,me,line,close) } proc xth_me_cmds_toggle_line_reverse {} { global xth set id $xth(me,cmds,selid) set nrev $xth(ctrl,me,line,reverse) set xth(ctrl,me,line,reverse_tmp) $xth(ctrl,me,line,reverse) set xth(ctrl,me,line,reverse) $xth(me,cmds,$id,reverse) $xth(ctrl,me,line).rev configure -variable xth(ctrl,me,line,reverse_tmp) xth_me_cmds_update {} set xth(ctrl,me,line,reverse) $nrev set xth(me,unredola) "line reversion" xth_me_cmds_update {} if {[llength $xth(me,cmds,$id,xplist)] > 1} { xth_me_cmds_move_lineln $id [lindex $xth(me,cmds,$id,xplist) 0] [lindex $xth(me,cmds,$id,xplist) 1] } $xth(ctrl,me,line).rev configure -variable xth(ctrl,me,line,reverse) } proc xth_me_cmds_toggle_linept {} { global xth set nidp $xth(ctrl,me,linept,idp) set xth(ctrl,me,linept,idp_tmp) $nidp set nidn $xth(ctrl,me,linept,idn) set xth(ctrl,me,linept,idn_tmp) $nidn set nsmooth $xth(ctrl,me,linept,smooth) set xth(ctrl,me,linept,smooth_tmp) $nsmooth set nrotid $xth(ctrl,me,linept,rotid) set xth(ctrl,me,linept,rotid_tmp) $nrotid set nrsid $xth(ctrl,me,linept,rsid) set xth(ctrl,me,linept,rsid_tmp) $nrsid set nlsid $xth(ctrl,me,linept,lsid) set xth(ctrl,me,linept,lsid_tmp) $nlsid set lpc $xth(ctrl,me,linept) $lpc.cbp configure -variable xth(ctrl,me,linept,idp_tmp) $lpc.cbn configure -variable xth(ctrl,me,linept,idn_tmp) $lpc.cbs configure -variable xth(ctrl,me,linept,smooth_tmp) $lpc.rotc configure -variable xth(ctrl,me,linept,rotid_tmp) $lpc.rszc configure -variable xth(ctrl,me,linept,rsid_tmp) $lpc.lszc configure -variable xth(ctrl,me,linept,lsid_tmp) update idletasks xth_me_cmds_update {} set id $xth(me,cmds,selid) set pid $xth(me,cmds,selpid) if {(!$nidp) && $xth(me,cmds,$id,$pid,idp)} { set xth(ctrl,me,linept,xp) {} set xth(ctrl,me,linept,yp) {} set xth(ctrl,me,linept,smooth) 0 } elseif {$nidp && (!$xth(me,cmds,$id,$pid,idp))} { set crds [xth_me_cmds_get_default_linept_cp 1 $id $pid] set xth(ctrl,me,linept,xp) [lindex $crds 0] set xth(ctrl,me,linept,yp) [lindex $crds 1] } if {(!$nidn) && $xth(me,cmds,$id,$pid,idn)} { set xth(ctrl,me,linept,xn) {} set xth(ctrl,me,linept,yn) {} set xth(ctrl,me,linept,smooth) 0 } elseif {$nidn && (!$xth(me,cmds,$id,$pid,idn))} { set crds [xth_me_cmds_get_default_linept_cp 0 $id $pid] set xth(ctrl,me,linept,xn) [lindex $crds 0] set xth(ctrl,me,linept,yn) [lindex $crds 1] } if {$nsmooth != $xth(me,cmds,$id,$pid,smooth)} { if {$nsmooth} { if {!$xth(me,cmds,$id,$pid,idp)} { set crds [xth_me_cmds_get_default_linept_cp 1 $id $pid] set xth(ctrl,me,linept,xp) [lindex $crds 0] set xth(ctrl,me,linept,yp) [lindex $crds 1] } if {!$xth(me,cmds,$id,$pid,idn)} { set crds [xth_me_cmds_get_default_linept_cp 0 $id $pid] set xth(ctrl,me,linept,xn) [lindex $crds 0] set xth(ctrl,me,linept,yn) [lindex $crds 1] } } set xth(ctrl,me,linept,smooth) $nsmooth } if {(!$nrotid) && ([string length $xth(me,cmds,$id,$pid,rotation)] > 0)} { set xth(ctrl,me,linept,rot) {} } elseif {$nrotid && ([string length $xth(me,cmds,$id,$pid,rotation)] < 1)} { set xth(ctrl,me,linept,rot) [xth_me_cmds_get_default_rotation $id $pid] } if {(!$nrsid) && ([string length $xth(me,cmds,$id,$pid,rs)] > 0)} { set xth(ctrl,me,linept,rs) {} } elseif {$nrsid && ([string length $xth(me,cmds,$id,$pid,rs)] < 1)} { set xth(ctrl,me,linept,rs) 40.0 } if {(!$nlsid) && ([string length $xth(me,cmds,$id,$pid,ls)] > 0)} { set xth(ctrl,me,linept,ls) {} } elseif {$nlsid && ([string length $xth(me,cmds,$id,$pid,ls)] < 1)} { set xth(ctrl,me,linept,ls) 40.0 } xth_me_cmds_update {} $lpc.cbp configure -variable xth(ctrl,me,linept,idp) $lpc.cbn configure -variable xth(ctrl,me,linept,idn) $lpc.cbs configure -variable xth(ctrl,me,linept,smooth) $lpc.rotc configure -variable xth(ctrl,me,linept,rotid) $lpc.rszc configure -variable xth(ctrl,me,linept,rsid) $lpc.lszc configure -variable xth(ctrl,me,linept,lsid) update idletasks } proc xth_me_cmds_update_line {id pid ntype nname nopts nrev nx ny nxp nyp \ nxn nyn nsmth nrot nrs nls nptopts nptoptpos} { global xth set otype $xth(me,cmds,$id,type) set oname $xth(me,cmds,$id,name) set oopts $xth(me,cmds,$id,options) set orev $xth(me,cmds,$id,reverse) set oline "$otype $oname $oopts $orev" if {$pid > 0} { set ox $xth(me,cmds,$id,$pid,x) set oy $xth(me,cmds,$id,$pid,y) set oxp $xth(me,cmds,$id,$pid,xp) set oyp $xth(me,cmds,$id,$pid,yp) set oxn $xth(me,cmds,$id,$pid,xn) set oyn $xth(me,cmds,$id,$pid,yn) set osmth $xth(me,cmds,$id,$pid,smooth) set orot $xth(me,cmds,$id,$pid,rotation) set ors $xth(me,cmds,$id,$pid,rs) set ols $xth(me,cmds,$id,$pid,ls) set optopts $xth(me,cmds,$id,$pid,options) set optoptpos $xth(me,cmds,$id,$pid,optpos) set olinept "$ox $oy $oxp $oyp $oxn $oyn $osmth $orot $ors $ols $optopts" } else { set ox {} set oy {} set oxp {} set oyp {} set oxn {} set oyn {} set osmth {} set orot {} set ors {} set ols {} set optopts {} set optoptpos {} set olinept "" } if {[string length $ntype] < 1} { set ntype $otype } set optsredo {} set optsundo {} if {$xth(gui,me,type_reset_options) && (![string equal $ntype $otype]) && [string equal $nopts $oopts]} { set nopts {} set nrs {} set nls {} set nrot {} foreach xpid $xth(me,cmds,$id,xplist) { if {$xpid > 0} { foreach item {rs ls rotation} { if {[string length $xth(me,cmds,$id,$xpid,$item)] > 0} { set optsredo "$optsredo set xth(me,cmds,$id,$xpid,$item) {}; " set optsundo "$optsundo set xth(me,cmds,$id,$xpid,$item) [list $xth(me,cmds,$id,$xpid,$item)]; " } } } } } if {[regexp {^([^ :]+)\:([^ :]+)$} $ntype dum xntype xstype]} { if {![string equal $xntype u]} { set ntype $xntype set nopts [regsub -all {(^|\s+)\-subtype\s+\S+} $nopts {}] set nopts [regsub -all {^\s+|\s+$} $nopts {}] set nopts "-subtype $xstype $nopts" } } # uprav options regsub {^\s*} $nopts "" nopts regsub {\s*$} $nopts "" nopts set nline "$ntype $nname $nopts $nrev" if {$pid > 0} { if {[catch {expr $nx}]} { set nx $ox } set nx [expr double($nx)] if {[catch {expr $ny}]} { set ny $oy } set ny [expr double($ny)] if {[string length $nxp] > 0} { if {[catch {expr $nxp}]} { set nxp $oxp } set nxp [expr double($nxp)] } if {[string length $nyp] > 0} { if {[catch {expr $nyp}]} { set nyp $oyp } set nyp [expr double($nyp)] } if {([string length $nxp] < 1) || ([string length $nyp] < 1)} { set nxp {} set nyp {} set nsmth 0 } if {[string length $nxn] > 0} { if {[catch {expr $nxn}]} { set nxn $oxn } set nxn [expr double($nxn)] } if {[string length $nyn] > 0} { if {[catch {expr $nyn}]} { set nyn $oyn } set nyn [expr double($nyn)] } if {([string length $nxn] < 1) || ([string length $nyn] < 1)} { set nxn {} set nyn {} set nsmth 0 } if {$nsmth} { set crds [xth_me_cmds_get_smoothed_cp 0 $nxp $nyp $nx $ny $nxn $nyn] set nxp [lindex $crds 0] set nyp [lindex $crds 1] set nxn [lindex $crds 2] set nyn [lindex $crds 3] } if {[string length $nrot] > 0} { if {[catch {expr $nrot}]} { set nrot $orot } elseif {($nrot < 0.0) || ($nrot >= 360.0)} { set nrot $orot } else { set nrot [expr double($nrot)] } } if {[string length $nrs] > 0} { if {[catch {expr $nrs}]} { set nrs $ors } elseif {$nrs <= 0.0} { set nrs $ors } else { set nrs [expr double($nrs)] } } if {[string length $nls] > 0} { if {[catch {expr $nls}]} { set nls $ols } elseif {$nls <= 0.0} { set nls $ols } else { set nls [expr double($nls)] } } # uprav options regsub {\s*$} $nptopts "" nptopts if {[string length $nptopts] > 0} { regsub {$} $nptopts "\n" nptopts } set nlinept "$nx $ny $nxp $nyp $nxn $nyn $nsmth $nrot $nrs $nls $nptopts" } else { set nlinept "" } # ak je v niecom rozdiel, tak to updatni if {![string equal "$nline $nlinept" "$oline $olinept"]} { #puts "new\n{$nline}\n===\n{$nlinept}\n===\nold\n{$oline}\n===\n{$olinept}\n===\n" xth_me_unredo_action [mc "line changes"] \ "xth_me_cmds_update_line $id $pid $otype [list $oname] [list $oopts] $orev {$ox} {$oy} {$oxp} {$oyp} {$oxn} {$oyn} {$osmth} {$orot} {$ors} {$ols} [list $optopts] {$optoptpos}; $optsundo xth_me_cmds_select {$id $pid}" \ "xth_me_cmds_update_line $id $pid $ntype [list $nname] [list $nopts] $nrev {$nx} {$ny} {$nxp} {$nyp} {$nxn} {$nyn} {$nsmth} {$nrot} {$nrs} {$nls} [list $nptopts] {$nptoptpos}; $optsredo xth_me_cmds_select {$id $pid}" set xth(me,cmds,$id,type) $ntype set xth(me,cmds,$id,name) $nname set xth(me,cmds,$id,options) $nopts set xth(me,cmds,$id,reverse) $nrev if {[string length $optsredo] > 0} { eval $optsredo } if {$pid > 0} { set xth(me,cmds,$id,$pid,x) $nx set xth(me,cmds,$id,$pid,y) $ny set xth(me,cmds,$id,$pid,xp) $nxp set xth(me,cmds,$id,$pid,yp) $nyp if {[string length "$nxp$nyp"] > 0} { set xth(me,cmds,$id,$pid,idp) 1 } else { set xth(me,cmds,$id,$pid,idp) 0 } set xth(me,cmds,$id,$pid,xn) $nxn set xth(me,cmds,$id,$pid,yn) $nyn if {[string length "$nxn$nyn"] > 0} { set xth(me,cmds,$id,$pid,idn) 1 } else { set xth(me,cmds,$id,$pid,idn) 0 } set xth(me,cmds,$id,$pid,smooth) $nsmth set xth(me,cmds,$id,$pid,rotation) $nrot set xth(me,cmds,$id,$pid,rs) $nrs set xth(me,cmds,$id,$pid,ls) $nls set xth(me,cmds,$id,$pid,options) $nptopts set xth(me,cmds,$id,$pid,optpos) $nptoptpos xth_me_cmds_update_linept_list $id $pid set cpid 0 if {$xth(me,cmds,$id,close)} { set fpid [lindex $xth(me,cmds,$id,xplist) 0] set lpid [lindex $xth(me,cmds,$id,xplist) [expr [llength $xth(me,cmds,$id,xplist)] - 2]] if {$pid == $fpid} { set cpid $lpid } elseif {$pid == $lpid} { set cpid $fpid } } if {$cpid > 0} { set xth(me,cmds,$id,$cpid,x) $nx set xth(me,cmds,$id,$cpid,y) $ny xth_me_cmds_move_linept $id $cpid set xth(me,cmds,$id,$cpid,xp) $nxp set xth(me,cmds,$id,$cpid,yp) $nyp set xth(me,cmds,$id,$cpid,idp) $xth(me,cmds,$id,$pid,idp) set xth(me,cmds,$id,$cpid,xn) $nxn set xth(me,cmds,$id,$cpid,yn) $nyn set xth(me,cmds,$id,$cpid,idn) $xth(me,cmds,$id,$pid,idn) set xth(me,cmds,$id,$cpid,smooth) $nsmth set ix [lsearch $xth(me,cmds,$id,xplist) $cpid] xth_me_cmds_update_linept_list $id $cpid } xth_me_cmds_move_linelnpt $id $pid } xth_me_cmds_update_line_data $id xth_me_cmds_update_list $id } } proc xth_me_cmds_update_line_vars {id pid} { global xth set xth(ctrl,me,line,type) $xth(me,cmds,$id,type) set xth(ctrl,me,line,name) $xth(me,cmds,$id,name) set xth(ctrl,me,line,opts) $xth(me,cmds,$id,options) set xth(ctrl,me,line,reverse) $xth(me,cmds,$id,reverse) set xth(ctrl,me,line,close) $xth(me,cmds,$id,close) set at [lindex $xth(me,themes,list) $xth(me,acttheme)] set tx [lsearch -exact $xth(me,themes,$at,line,hidelist) $xth(me,cmds,$id,type)] if {$tx < 0} { set xth(ctrl,me,line,themetype) {} } else { set xth(ctrl,me,line,themetype) [lindex $xth(me,themes,$at,line,showlist) $tx] } xth_me_cmds_update_linept_ctrl $id $pid } proc xth_me_cmds_update_area_vars {id} { global xth set xth(ctrl,me,ac,type) $xth(me,cmds,$id,type) set xth(ctrl,me,ac,opts) $xth(me,cmds,$id,options) set at [lindex $xth(me,themes,list) $xth(me,acttheme)] set tx [lsearch -exact $xth(me,themes,$at,area,hidelist) $xth(me,cmds,$id,type)] if {$tx < 0} { set xth(ctrl,me,ac,themetype) {} } else { set xth(ctrl,me,ac,themetype) [lindex $xth(me,themes,$at,area,showlist) $tx] } } proc xth_me_cmds_get_default_linept_cp {prv id pid} { global xth set x $xth(me,cmds,$id,$pid,x) set y $xth(me,cmds,$id,$pid,y) if {$prv} { if {$xth(me,cmds,$id,$pid,idn)} { set dx [expr $x - $xth(me,cmds,$id,$pid,xn)] set dy [expr $y - $xth(me,cmds,$id,$pid,yn)] } else { set dx 0.0 set dy 0.0 } } else { if {$xth(me,cmds,$id,$pid,idp)} { set dx [expr $x - $xth(me,cmds,$id,$pid,xp)] set dy [expr $y - $xth(me,cmds,$id,$pid,yp)] } else { set dx 0.0 set dy 0.0 } } set dd [expr hypot($dy, $dx)] set rd $dd if {$dd == 0.0} { set ppix [expr [lsearch $xth(me,cmds,$id,xplist) $pid] - 1] if {$ppix >= 0} { set ppid [lindex $xth(me,cmds,$id,xplist) $ppix] set xp $xth(me,cmds,$id,$ppid,x) set yp $xth(me,cmds,$id,$ppid,y) } else { set xp $x set yp $y } set npix [expr [lsearch $xth(me,cmds,$id,xplist) $pid] + 1] set npid [lindex $xth(me,cmds,$id,xplist) $npix] if {$npid > 0} { set xn $xth(me,cmds,$id,$npid,x) set yn $xth(me,cmds,$id,$npid,y) } else { set xn $x set yn $y } if {$prv} { set dx [expr $xp - $xn] set dy [expr $yp - $yn] } else { set dx [expr $xn - $xp] set dy [expr $yn - $yp] } set dd [expr hypot($dy, $dx)] } if {$dd == 0.0} { set dx 0.0 set dy 1.0 set dd 1.0 set rd 40.0 } if {$rd == 0.0} { if {$prv} { set ppix [expr [lsearch $xth(me,cmds,$id,xplist) $pid] - 1] if {$ppix >= 0} { set ppid [lindex $xth(me,cmds,$id,xplist) $ppix] if {$xth(me,cmds,$id,$ppid,idn)} { set rdx [expr $xth(me,cmds,$id,$ppid,xn) - $xth(me,cmds,$id,$ppid,x)] set rdy [expr $xth(me,cmds,$id,$ppid,yn) - $xth(me,cmds,$id,$ppid,y)] set rd [expr hypot($rdy,$rdx)] } } } else { set npix [expr [lsearch $xth(me,cmds,$id,xplist) $pid] + 1] set npid [lindex $xth(me,cmds,$id,xplist) $npix] if {$npid > 0} { if {$xth(me,cmds,$id,$npid,idp)} { set rdx [expr $xth(me,cmds,$id,$npid,xp) - $xth(me,cmds,$id,$npid,x)] set rdy [expr $xth(me,cmds,$id,$npid,yp) - $xth(me,cmds,$id,$npid,y)] set rd [expr hypot($rdy,$rdx)] } } } } if {$rd == 0.0} { set rd 40.0 } return [list [expr double([format "%.2f" [expr $x + $dx / $dd * $rd]])] \ [expr double([format "%.2f" [expr $y + $dy / $dd * $rd]])]] } proc xth_me_cmds_get_smoothed_cp {which xp yp x y xn yn} { set dxp [expr $x - $xp] set dyp [expr $y - $yp] set dp [expr hypot($dxp,$dyp)] set dxn [expr $xn - $x] set dyn [expr $yn - $y] set dn [expr hypot($dxn,$dyn)] if {($dp == 0.0) || ($dn == 0.0)} { return [list $xp $yp $xn $yn] } if {$which < 0} { set xp [expr $x - $dxn / $dn * $dp] set yp [expr $y - $dyn / $dn * $dp] } elseif {$which > 0} { set xn [expr $x + $dxp / $dp * $dn] set yn [expr $y + $dyp / $dp * $dn] } else { set dx [expr $xn - $xp] set dy [expr $yn - $yp] set d [expr hypot($dx,$dy)] if {$d == 0.0} { set dx [expr -1.0 * $dyp] set dy $dxp set d $dp } set xp [expr $x - $dx / $d * $dp] set yp [expr $y - $dy / $d * $dp] set xn [expr $x + $dx / $d * $dn] set yn [expr $y + $dy / $d * $dn] } return [list [expr double([format "%.2f" $xp])] \ [expr double([format "%.2f" $yp])] [expr double([format "%.2f" $xn])] \ [expr double([format "%.2f" $yn])]] } proc xth_me_cmds_get_default_rotation {id pid} { global xth set x $xth(me,cmds,$id,$pid,x) set y $xth(me,cmds,$id,$pid,y) set dp 0.0 set dn 0.0 if {$xth(me,cmds,$id,$pid,idp) || $xth(me,cmds,$id,$pid,idn)} { set xp $xth(me,cmds,$id,$pid,xp) set yp $xth(me,cmds,$id,$pid,yp) set dp [expr hypot($xp - $x, $yp - $y)] set xn $xth(me,cmds,$id,$pid,xn) set yn $xth(me,cmds,$id,$pid,yn) set dn [expr hypot($xn - $x, $yn - $y)] } else { set ppix [expr [lsearch $xth(me,cmds,$id,xplist) $pid] - 1] if {$ppix >= 0} { set ppid [lindex $xth(me,cmds,$id,xplist) $ppix] set xp $xth(me,cmds,$id,$ppid,x) set yp $xth(me,cmds,$id,$ppid,y) set dp [expr hypot($xp - $x, $yp - $y)] } else { set xp {} set yp {} } set npix [expr [lsearch $xth(me,cmds,$id,xplist) $pid] + 1] set npid [lindex $xth(me,cmds,$id,xplist) $npix] if {$npid > 0} { set xn $xth(me,cmds,$id,$npid,x) set yn $xth(me,cmds,$id,$npid,y) set dn [expr hypot($xn - $x, $yn - $y)] } else { set xn {} set yn {} } } if {($dp > 0.0) && ($dn > 0.0)} { if {$dp > $dn} { set xn [expr $x + ($xn - $x) / $dn * $dp] set yn [expr $y + ($yn - $y) / $dn * $dp] } else { set xp [expr $x + ($xp - $x) / $dp * $dn] set yp [expr $y + ($yp - $y) / $dp * $dn] } } if {[string length $xn] < 1} { set xn $x set yn $y } if {[string length $xp] < 1} { set xp $x set yp $y } set rr [expr 360.0 - atan2($yn - $yp,$xn - $xp) / 3.14159265359 * 180.0]; while {$rr >= 360.0} {set rr [expr $rr - 360.0]}; while {$rr < 0.0} {set rr [expr $rr + 360.0]}; return [format "%.1f" $rr] } proc xth_me_cmds_update_linept_list {id pid} { global xth set ix [lsearch $xth(me,cmds,$id,xplist) $pid] set xth(me,cmds,$id,plist) \ [lreplace $xth(me,cmds,$id,plist) $ix $ix [format "%7.2f %7.2f" $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y)]] } proc xth_me_cmds_close_line {id {unredo 1}} { global xth # prida bod ak treba, ak je novy, oznaci ho set xl $xth(me,cmds,$id,xplist) set lix [expr [llength $xl] - 2] set fpid [lindex $xl 0] set nwpid $xth(me,cmds,selpid) set olpid $xth(me,cmds,selpid) if {($lix < 2) || \ ($xth(me,cmds,$id,$fpid,x) != $xth(me,cmds,$id,[lindex $xl $lix],x)) || \ ($xth(me,cmds,$id,$fpid,y) != $xth(me,cmds,$id,[lindex $xl $lix],y))} { set oldurok $xth(me,unredook) set xth(me,unredook) 0 set iix [expr $lix + 1] xth_me_cmds_create_line_point $id $iix 0 \ $xth(me,cmds,$id,$fpid,x) $xth(me,cmds,$id,$fpid,y) $xth(me,cmds,$id,$fpid,xp) $xth(me,cmds,$id,$fpid,yp) \ $xth(me,cmds,$id,$fpid,xn) $xth(me,cmds,$id,$fpid,yn) $xth(me,cmds,$id,$fpid,smooth) {} {} {} {} 1.0 set xth(me,unredook) $oldurok set nwpid $xth(me,cmds,$id,lpid) xth_me_cmds_select_linept $id $nwpid set unpoint "xth_me_cmds_delete_linept $id $nwpid" set repoint "xth_me_cmds_undelete_linept $id $nwpid $iix" } else { set lpid [lindex $xl $lix] set unpoint "xth_me_cmds_select $id\nset xth(me,cmds,$id,$lpid,xp) {$xth(me,cmds,$id,$lpid,xp)}\nset xth(me,cmds,$id,$lpid,yp) {$xth(me,cmds,$id,$lpid,yp)}\nset xth(me,cmds,$id,$lpid,idp) {$xth(me,cmds,$id,$lpid,idp)}\nset xth(me,cmds,$id,$lpid,xn) {$xth(me,cmds,$id,$lpid,xn)}\nset xth(me,cmds,$id,$lpid,yn) {$xth(me,cmds,$id,$lpid,yn)}\nset xth(me,cmds,$id,$lpid,idn) {$xth(me,cmds,$id,$lpid,idn)}\nset xth(me,cmds,$id,$lpid,smooth) {$xth(me,cmds,$id,$lpid,smooth)}\nxth_me_cmds_move_linelnpt $id $lpid" set repoint "xth_me_cmds_select $id\nset xth(me,cmds,$id,$lpid,xp) {$xth(me,cmds,$id,$fpid,xp)}\nset xth(me,cmds,$id,$lpid,yp) {$xth(me,cmds,$id,$fpid,yp)}\nset xth(me,cmds,$id,$lpid,idp) {$xth(me,cmds,$id,$fpid,idp)}\nset xth(me,cmds,$id,$lpid,xn) {$xth(me,cmds,$id,$fpid,xn)}\nset xth(me,cmds,$id,$lpid,yn) {$xth(me,cmds,$id,$fpid,yn)}\nset xth(me,cmds,$id,$lpid,idn) {$xth(me,cmds,$id,$fpid,idn)}\nset xth(me,cmds,$id,$lpid,smooth) {$xth(me,cmds,$id,$fpid,smooth)}\nxth_me_cmds_move_linelnpt $id $lpid" eval $repoint } # nastavi close set xth(me,cmds,$id,close) 1 # update vars xth_me_cmds_update_line_vars $id $nwpid xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) if {$xth(me,cmds,mode) == 2} { set remode "xth_me_cmds_set_mode 0" set unmode "xth_me_cmds_set_mode 2" eval $remode } else { set remode "" set unmode "" } if {$unredo} { xth_me_unredo_action [mc "line closing"] \ "$unpoint\nset xth(me,cmds,$id,close) 0\nxth_me_cmds_update_line_vars $id $olpid\nxth_me_cmds_update_line_data $id\nxth_me_prev_cmd \$xth(me,cmds,$id,data)\n$unmode" \ "$repoint\nset xth(me,cmds,$id,close) 1\nxth_me_cmds_update_line_vars $id $nwpid\nxth_me_cmds_update_line_data $id\nxth_me_prev_cmd \$xth(me,cmds,$id,data)\n$remode" } } proc xth_me_cmds_open_line {id} { global xth set xth(me,cmds,$id,close) 0 xth_me_cmds_update_line_vars $id $xth(me,cmds,selpid) xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) xth_me_unredo_action [mc "line opening"] \ "xth_me_cmds_reclose_line $id" \ "xth_me_cmds_open_line $id" } proc xth_me_cmds_reclose_line {id} { global xth set xth(me,cmds,$id,close) 1 xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) xth_me_cmds_update_line_vars $id $xth(me,cmds,selpid) } proc xth_me_cmds_get_bezier_coords {x1 y1 c1x c1y c2x c2y x2 y2} { # if {[llength $x1] > 1} { # set tlen [lindex $x1 2] # set rotation [lindex $x1 1] # set x1 [lindex $x1 0] # } else { # set rotation {} # } if {[string length $c1x] < 1} { set c1x $x1 set c1y $y1 } if {[string length $c2x] < 1} { set c2x $x2 set c2y $y2 } set q 20 # if {[string length $rotation] > 0} { # set crds [list [expr $x1 + $tlen * sin(double($rotation)/180.0*3.14159265359)] \ # [expr $y1 + $tlen * cos(double($rotation)/180.0*3.14159265359)]] # } else { set crds {} # } for {set i 0} {$i <= $q} {incr i} { set t [expr $i.0 / $q.0] set t2 [expr pow($t,2.0)] set t3 [expr pow($t,3.0)] set t_ [expr 1.0 - $t] set t_2 [expr pow($t_,2.0)] set t_3 [expr pow($t_,3.0)] lappend crds [expr $t_3 * $x1 + 3.0 * $t * $t_2 * $c1x + 3.0 * $t2 * $t_ * $c2x + $t3 * $x2] \ [expr $t_3 * $y1 + 3.0 * $t * $t_2 * $c1y + 3.0 * $t2 * $t_ * $c2y + $t3 * $y2] } return $crds } proc xth_me_cmds_real2can_coords {crds} { set x 1 set r {} foreach c $crds { if $x { lappend r [xth_me_real2canx $c] set x 0 } else { lappend r [xth_me_real2cany $c] set x 1 } } return $r } proc xth_me_cmds_get_crds2state {id ppid pid} { global xth # set tlen [expr 0.01 * $xth(me,zoom) * $xth(gui,me,line,ticksize)] if {$ppid > 0} { # if {[lsearch $xth(me,cmds,$id,xplist) $ppid] == 0} { # set rot [xth_me_cmds_get_default_rotation $id $ppid] # set x1 [list $xth(me,cmds,$id,$ppid,x) $rot $tlen] # } else { # set rot {} set x1 $xth(me,cmds,$id,$ppid,x) # } set st normal if {$xth(me,cmds,$id,$ppid,idn) || $xth(me,cmds,$id,$pid,idp)} { set crds [xth_me_cmds_get_bezier_coords $x1 \ $xth(me,cmds,$id,$ppid,y) $xth(me,cmds,$id,$ppid,xn) \ $xth(me,cmds,$id,$ppid,yn) $xth(me,cmds,$id,$pid,xp) \ $xth(me,cmds,$id,$pid,yp) $xth(me,cmds,$id,$pid,x) \ $xth(me,cmds,$id,$pid,y)] } else { # if {[string length $rot] > 0} { # set crds [list [expr $xth(me,cmds,$id,$ppid,x) + $tlen * sin(double($rot)/180.0*3.14159265359)] \ # [expr $xth(me,cmds,$id,$ppid,y) + $tlen * cos(double($rot)/180.0*3.14159265359)]] # } else { set crds {} # } lappend crds $xth(me,cmds,$id,$ppid,x) $xth(me,cmds,$id,$ppid,y) \ $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y) } } else { set crds {0 0 10 10} set st hidden } return [list $st $crds] } proc xth_me_cmds_draw_lineln {id ppid pid} { global xth set st2crds [xth_me_cmds_get_crds2state $id $ppid $pid] set st [lindex $st2crds 0] set crds [lindex $st2crds 1] $xth(me,can) create line [xth_me_cmds_real2can_coords $crds] -width $xth(gui,me,line,width) -fill $xth(gui,me,activefill) \ -tags "line ln$id lnln$id ln$id.$pid command" -state $st xth_me_bind_area_drag ln$id.$pid {} $xth(me,can) bind ln$id.$pid <1> "xth_me_cmds_click_lineln {$id $pid} pt$id.$pid %x %y" set highlight_on "if {\$xth(me,cmds,selid) != $id} {\$xth(me,can) itemconfigure lnln$id -fill \$xth(gui,me,highlightfill)}" set highlight_off "if {\$xth(me,cmds,selid) != $id} {\$xth(me,can) itemconfigure lnln$id -fill \[$xth(me,can) itemcget pt$id.$pid -outline\]}" $xth(me,can) bind ln$id.$pid "$highlight_on\nxth_status_bar_push me; xth_status_bar_status me \"\$xth(me,cmds,$id,listix): \$xth(me,cmds,$id,sbar)\"" $xth(me,can) bind ln$id.$pid "$highlight_off\nxth_status_bar_pop me" $xth(me,can) bind ln$id.$pid <$xth(gui,rmb)> "xth_me_show_context_menu {$id $pid} %x %y" catch {$xth(me,can) lower ln$id.$pid point} } proc xth_me_cmds_move_lineln {id ppid pid} { global xth set st2crds [xth_me_cmds_get_crds2state $id $ppid $pid] set st [lindex $st2crds 0] set crds [lindex $st2crds 1] $xth(me,can) coords ln$id.$pid [xth_me_cmds_real2can_coords $crds] #$xth(me,can) itemconfigure ln$id.$pid -state $st } proc xth_me_cmds_draw_linept {id pid} { global xth $xth(me,can) create oval [expr [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] - $xth(gui,me,line,psize)] \ [expr [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] - $xth(gui,me,line,psize)] [expr [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] + $xth(gui,me,line,psize)] \ [expr [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] + $xth(gui,me,line,psize)] -width 1 -outline blue -fill $xth(gui,me,activefill) \ -tags "point ln$id lnpt$id pt$id.$pid command" set highlight_on "if {\$xth(me,cmds,selid) != $id} {\$xth(me,can) itemconfigure lnln$id -fill \$xth(gui,me,highlightfill)}" set highlight_off "if {\$xth(me,cmds,selid) != $id} {\$xth(me,can) itemconfigure lnln$id -fill \[$xth(me,can) itemcget pt$id.$pid -outline\]}" $xth(me,can) bind pt$id.$pid "$highlight_on\n$xth(me,can) itemconfigure pt$id.$pid -fill cyan; xth_status_bar_push me; xth_status_bar_status me \"\$xth(me,cmds,$id,listix): \[lindex \[regexp -inline -- {^\[^\\n\]*} \$xth(me,cmds,$id,data)\] 0\]\"" $xth(me,can) bind pt$id.$pid "$highlight_off\n$xth(me,can) itemconfigure pt$id.$pid -fill \[$xth(me,can) itemcget ln$id.$pid -fill\]; xth_status_bar_pop me" $xth(me,can) bind pt$id.$pid <1> "xth_me_cmds_click {$id $pid} pt$id.$pid \$xth(me,cmds,$id,$pid,x) \$xth(me,cmds,$id,$pid,y) %x %y" $xth(me,can) bind pt$id.$pid <$xth(gui,rmb)> "xth_me_show_context_menu {$id $pid} %x %y" $xth(me,can) bind pt$id.$pid "xth_me_cmds_special_select {$id $pid} %x %y" $xth(me,can) bind pt$id.$pid <$xth(kb_control)-1> "xth_me_cmds_click_area pt$id.$pid %x %y" } proc xth_me_cmds_move_linept {id pid} { global xth $xth(me,can) coords pt$id.$pid [expr [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] - $xth(gui,me,line,psize)] \ [expr [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] - $xth(gui,me,line,psize)] [expr [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] + $xth(gui,me,line,psize)] \ [expr [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] + $xth(gui,me,line,psize)] } proc xth_me_cmds_draw_line {id} { global xth set ppid 0 foreach pid $xth(me,cmds,$id,xplist) { if {($pid > 0)} { xth_me_cmds_draw_lineln $id $ppid $pid xth_me_cmds_draw_linept $id $pid } set ppid $pid } catch {$xth(me,can) raise lnpt$id point} } proc xth_me_cmds_move_line {id} { global xth set ppid 0 foreach pid $xth(me,cmds,$id,xplist) { if {($pid > 0)} { xth_me_cmds_move_lineln $id $ppid $pid xth_me_cmds_move_linept $id $pid } set ppid $pid } } proc xth_me_cmds_move_linelnpt {id pid} { global xth set xl $xth(me,cmds,$id,xplist) set ix [lsearch $xl $pid] if {($ix < 0) || ($pid == 0)} { return } set pix [expr $ix - 1] set nix [expr $ix + 1] set fix 0 set lix [expr [llength $xl] - 2] set cpid 0 set mpix 0 set mnix 0 if {$xth(me,cmds,$id,close)} { if {$ix == $fix} { set cpid [lindex $xl $lix] set pix [expr $lix - 1] set mpix 1 } elseif {$ix == $lix} { set cpid [lindex $xl $fix] set nix [expr $fix + 1] set mnix 1 } } xth_me_cmds_move_linept $id $pid if {$cpid > 0} { xth_me_cmds_move_linept $id $cpid } if {($pix >= $fix) && ($pix <= $lix)} { set ppid [lindex $xl $pix] } else { set ppid 0 } if {$mpix} { xth_me_cmds_move_lineln $id $ppid $cpid } else { xth_me_cmds_move_lineln $id $ppid $pid } if {($nix >= $fix) && ($nix <= $lix)} { set npid [lindex $xl $nix] if {$mnix} { xth_me_cmds_move_lineln $id $cpid $npid } else { xth_me_cmds_move_lineln $id $pid $npid } } } proc xth_me_cmds_start_create_linept {tagOrId x y mx my} { global xth set xth(me,lptc,id) $xth(me,cmds,selid) set id $xth(me,lptc,id) if {$xth(me,cmds,$id,ct) != 3} { return } set xl $xth(me,cmds,$id,xplist) set inspid $xth(me,cmds,inspid) set oldpid $xth(me,cmds,selpid) set ix [lsearch $xl $inspid] set xth(me,lptc,mx) $mx set xth(me,lptc,my) $my set xth(me,lptc,tagOrId) $tagOrId if {($ix == 0) && $xth(me,cmds,$id,close)} { set unclosecmd "xth_me_cmds_reclose_line $id" set reclosecmd "xth_me_cmds_open_line $id" set ook $xth(me,unredook) set xth(me,unredook) 0 eval $reclosecmd set xth(me,unredook) $ook } else { set unclosecmd "" set reclosecmd "" } xth_me_cmds_create_line_point $id $ix 0 $x $y {} {} {} {} 0 {} {} {} {} 1.0 xth_me_cmds_hide_linept_xctrl set pid $xth(me,cmds,$id,lpid) set pnpid [xth_me_cmds_get_line_pnpid $id $pid] set xth(me,lptc,ppid) [lindex $pnpid 0] set ppid $xth(me,lptc,ppid) set xth(me,lptc,npid) [lindex $pnpid 1] set npid $xth(me,lptc,npid) set xth(me,lptc,pid) $pid set xth(me,lptc,oldm) [$xth(me,can) bind $tagOrId ] set xth(me,lptc,oldr) [$xth(me,can) bind $tagOrId ] $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill yellow $xth(me,can) bind $tagOrId "xth_me_cmds_continue_linept_creation %x %y 1" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-Motion> "xth_me_cmds_continue_linept_creation %x %y 0" $xth(me,can) bind $tagOrId "xth_me_cmds_end_create_linept %x %y 1" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-ButtonRelease> "xth_me_cmds_end_create_linept %x %y 0" xth_me_cmds_continue_linept_creation $mx $my 1 xth_me_unredo_action [mc "inserting line point"] \ "xth_me_cmds_delete_linept $id $pid\n$unclosecmd\nxth_me_cmds_select_linept $id $oldpid" \ "$reclosecmd\nxth_me_cmds_undelete_linept $id $pid $ix" if {($ppid > 0) && $xth(me,cmds,$id,$ppid,idn)} { $xth(me,can) itemconfigure lineptppcp -state normal } if {($npid > 0) && $xth(me,cmds,$id,$npid,idp)} { $xth(me,can) itemconfigure lineptnncp -state normal } xth_me_cmds_continue_linept_creation $mx $my 1 } proc xth_me_cmds_continue_linept_creation {x y motionID} { global xth set id $xth(me,lptc,id) set pid $xth(me,lptc,pid) set ppid $xth(me,lptc,ppid) set npid $xth(me,lptc,npid) set dx [expr $x - $xth(me,lptc,mx)] set dy [expr $y - $xth(me,lptc,my)] set dst [expr hypot($dy,$dx)] if {$dst > $xth(gui,me,line,psize)} { set xn [xth_me_can2realx [$xth(me,can) canvasx $x]] set yn [xth_me_can2realy [$xth(me,can) canvasy $y]] set xth(me,cmds,$id,$pid,idn) 1 set xth(me,cmds,$id,$pid,xn) [expr double([format %.2f $xn])] set xth(me,cmds,$id,$pid,yn) [expr double([format %.2f $yn])] set xth(me,cmds,$id,$pid,idp) 1 set x $xth(me,cmds,$id,$pid,x) set y $xth(me,cmds,$id,$pid,y) set dx [expr $xn - $x] set dy [expr $yn - $y] $xth(me,can) itemconfigure lineptpcp -state normal $xth(me,can) itemconfigure lineptncp -state normal if {($ppid > 0) && $xth(me,cmds,$id,$ppid,idn)} { $xth(me,can) itemconfigure lineptppcp -state normal } set d [expr hypot($dy,$dx)] if {$motionID} { set xd $d set xth(me,lptc,xd) $d } else { if {[info exist xth(me,lptc,xd)]} { set xd $xth(me,lptc,xd) } else { set xd $d } } if {(!$motionID)} { set dx [expr $dx / $d * $xd] set dy [expr $dy / $d * $xd] } set xth(me,cmds,$id,$pid,xp) [expr double([format %.2f [expr $x - $dx]])] set xth(me,cmds,$id,$pid,yp) [expr double([format %.2f [expr $y - $dy]])] set xth(me,cmds,$id,$pid,smooth) 1 } else { set xth(me,cmds,$id,$pid,idn) 0 set xth(me,cmds,$id,$pid,xn) {} set xth(me,cmds,$id,$pid,yn) {} set xth(me,cmds,$id,$pid,idp) 0 set xth(me,cmds,$id,$pid,xp) {} set xth(me,cmds,$id,$pid,yp) {} $xth(me,can) itemconfigure lineptpcp -state hidden $xth(me,can) itemconfigure lineptncp -state hidden } xth_me_cmds_move_lineptcp_xctrl $id $ppid $pid $npid xth_me_cmds_move_line_xctrl $id xth_me_cmds_move_linelnpt $id $pid update idletasks } proc xth_me_cmds_end_create_linept {x y motionID} { global xth xth_me_cmds_continue_linept_creation $x $y $motionID set tagOrId $xth(me,lptc,tagOrId) set id $xth(me,lptc,id) set pid $xth(me,lptc,pid) $xth(me,can) bind $tagOrId $xth(me,lptc,oldm) $xth(me,can) bind $tagOrId $xth(me,lptc,oldr) $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-Motion> "" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-ButtonRelease> "" xth_me_cmds_hide_linept_xctrl set ook $xth(me,unredook) set xth(me,unredook) 0 if {$xth(me,cmds,$id,$pid,idn)} { $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill yellow } else { $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill red } xth_me_cmds_select_linept $id $pid xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) set xth(me,unredook) $ook } proc xth_me_cmds_end_line {} { set recmds "xth_me_cmds_set_mode 0" set uncmds "xth_me_cmds_set_mode 2" eval $recmds xth_me_unredo_action [mc "line ending"] $uncmds $recmds } proc xth_me_cmds_start_linept_insert {} { global xth set xth(me,cmds,inspid) $xth(me,cmds,selpid) xth_me_cmds_set_mode 2 } proc xth_me_cmds_start_area_insert {btn} { global xth if {$btn && ($xth(me,cmds,mode) == 3)} { xth_me_cmds_set_mode 0 } else { xth_me_cmds_set_mode 3 } } proc xth_me_cmds_get_line_pnpid {id pid} { global xth set xl $xth(me,cmds,$id,xplist) set ix [lsearch $xl $pid] set lix [expr [llength $xl] - 2] if {$ix > 0} { set ppid [lindex $xl [expr $ix - 1]] } elseif {$xth(me,cmds,$id,close) && ($lix > 0)} { set ppid [lindex $xl [expr $lix - 1]] } else { set ppid 0 } if {$ix < $lix} { set npid [lindex $xl [expr $ix + 1]] } elseif {$xth(me,cmds,$id,close) && ($lix > 0)} { set npid [lindex $xl 1] } else { set npid 0 } return [list $ppid $npid] } proc xth_me_cmds_start_linecp_drag {tagOrId id ppid pid npid which x y} { global xth xth_me_cmds_update {} set xth(me,lcpd,tagOrId) $tagOrId set xth(me,lcpd,id) $id set xth(me,lcpd,pid) $pid set xth(me,lcpd,ppid) $ppid set xth(me,lcpd,npid) $npid set xth(me,lcpd,which) $which set xth(me,lcpd,mx) $x set xth(me,lcpd,my) $y set lix [expr [llength $xth(me,cmds,$id,xplist)] - 2] if {$lix > 0} { set fpid [lindex $xth(me,cmds,$id,xplist) 0] set lpid [lindex $xth(me,cmds,$id,xplist) $lix] } set altpid 0 set altppid 0 set altnpid 0 if {($lix > 0) && $xth(me,cmds,$id,close)} { if {$pid == $fpid} { set altpid $lpid } elseif {$pid == $lpid} { set altpid $fpid } if {$ppid == $fpid} { set altppid $lpid } elseif {$ppid == $lpid} { set altppid $fpid } if {$npid == $fpid} { set altnpid $lpid } elseif {$npid == $lpid} { set altnpid $fpid } } set xth(me,lcpd,altpid) $altpid set xth(me,lcpd,altppid) $altppid set xth(me,lcpd,altnpid) $altnpid set xth(me,lcpd,oldenter) [$xth(me,can) bind $tagOrId ] $xth(me,can) bind $tagOrId "" set xth(me,lcpd,oldleave) [$xth(me,can) bind $tagOrId ] $xth(me,can) bind $tagOrId "" set xth(me,lcpd,oldfill) [$xth(me,can) itemcget $tagOrId -fill] $xth(me,can) itemconfigure $tagOrId -fill {} $xth(me,can) bind $tagOrId "xth_me_cmds_continue_linecp_drag %x %y 0" $xth(me,can) bind $tagOrId "xth_me_cmds_end_linecp_drag %x %y 0" set dragto 0 switch $which { x { set dragto 1 $xth(me,can) bind $tagOrId "xth_me_cmds_continue_linecp_drag %x %y 1" $xth(me,can) bind $tagOrId "xth_me_cmds_end_linecp_drag %x %y 1" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-Motion> "xth_me_cmds_continue_linecp_drag %x %y 0" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-ButtonRelease> "xth_me_cmds_end_linecp_drag %x %y 0" set xth(me,lcpd,oldmove,pcplstate) [$xth(me,can) itemcget $xth(me,canid,linept,pcpl) -state] $xth(me,can) itemconfigure $xth(me,canid,linept,pcpl) -state hidden set xth(me,lcpd,oldmove,ncplstate) [$xth(me,can) itemcget $xth(me,canid,linept,ncpl) -state] $xth(me,can) itemconfigure $xth(me,canid,linept,ncpl) -state hidden set xth(me,lcpd,oldmove,selstate) [$xth(me,can) itemcget $xth(me,canid,linept,selector) -state] $xth(me,can) itemconfigure $xth(me,canid,linept,selector) -state hidden set xth(me,lcpd,oldmove,pcpfill) [$xth(me,can) itemcget $xth(me,canid,linept,pcp) -fill] $xth(me,can) itemconfigure $xth(me,canid,linept,pcp) -fill {} set xth(me,lcpd,oldmove,ncpfill) [$xth(me,can) itemcget $xth(me,canid,linept,ncp) -fill] $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill {} $xth(me,can) itemconfigure $xth(me,canid,linept,fr) -width 1 -arrow none $xth(me,can) itemconfigure $xth(me,canid,linept,fl) -width 1 -arrow none set xth(me,lcpd,oldx) $xth(me,cmds,$id,$pid,x) set xth(me,lcpd,oldy) $xth(me,cmds,$id,$pid,y) set xth(me,lcpd,oldxp) $xth(me,cmds,$id,$pid,xp) set xth(me,lcpd,oldyp) $xth(me,cmds,$id,$pid,yp) set xth(me,lcpd,oldxn) $xth(me,cmds,$id,$pid,xn) set xth(me,lcpd,oldyn) $xth(me,cmds,$id,$pid,yn) } p { set xth(me,lcpd,oldxp) $xth(me,cmds,$id,$pid,xp) set xth(me,lcpd,oldyp) $xth(me,cmds,$id,$pid,yp) set xth(me,lcpd,oldxn) $xth(me,cmds,$id,$pid,xn) set xth(me,lcpd,oldyn) $xth(me,cmds,$id,$pid,yn) } n { set xth(me,lcpd,oldxp) $xth(me,cmds,$id,$pid,xp) set xth(me,lcpd,oldyp) $xth(me,cmds,$id,$pid,yp) set xth(me,lcpd,oldxn) $xth(me,cmds,$id,$pid,xn) set xth(me,lcpd,oldyn) $xth(me,cmds,$id,$pid,yn) } pp { set xth(me,lcpd,oldxpp) $xth(me,cmds,$id,$ppid,xn) set xth(me,lcpd,oldypp) $xth(me,cmds,$id,$ppid,yn) } nn { set xth(me,lcpd,oldxnn) $xth(me,cmds,$id,$npid,xp) set xth(me,lcpd,oldynn) $xth(me,cmds,$id,$npid,yp) } } xth_me_cmds_continue_linecp_drag $x $y $dragto $xth(me,can) configure -cursor {} } proc xth_me_cmds_continue_linecp_drag {x y dragto} { global xth set id $xth(me,lcpd,id) set pid $xth(me,lcpd,pid) set ppid $xth(me,lcpd,ppid) set npid $xth(me,lcpd,npid) set tagOrId $xth(me,lcpd,tagOrId) set altpid $xth(me,lcpd,altpid) set altppid $xth(me,lcpd,altppid) set altnpid $xth(me,lcpd,altnpid) set nx [expr double([format %.2f [xth_me_can2realx [$xth(me,can) canvasx $x]]])] set ny [expr double([format %.2f [xth_me_can2realy [$xth(me,can) canvasy $y]]])] set dts 0 if $dragto { set dtl [xth_me_cmds_drag_to $id $pid $x $y] if {[lindex $dtl 0]} { set nx [lindex $dtl 1] set ny [lindex $dtl 2] set dts 1 } } if $dts { $xth(me,can) itemconfigure $tagOrId -fill cyan } else { $xth(me,can) itemconfigure $tagOrId -fill {} } switch $xth(me,lcpd,which) { x { set xth(ctrl,me,linept,x) $nx set xth(me,cmds,$id,$pid,x) $nx set xth(ctrl,me,linept,y) $ny set xth(me,cmds,$id,$pid,y) $ny if {$altpid > 0} { set xth(me,cmds,$id,$altpid,y) $ny set xth(me,cmds,$id,$altpid,x) $nx } if {$xth(me,cmds,$id,$pid,idp)} { set nxp [expr double([format %.2f [expr $nx + $xth(me,lcpd,oldxp) - $xth(me,lcpd,oldx)]])] set nyp [expr double([format %.2f [expr $ny + $xth(me,lcpd,oldyp) - $xth(me,lcpd,oldy)]])] set xth(ctrl,me,linept,xp) $nxp set xth(me,cmds,$id,$pid,xp) $nxp set xth(ctrl,me,linept,yp) $nyp set xth(me,cmds,$id,$pid,yp) $nyp if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xp) $nxp set xth(me,cmds,$id,$altpid,yp) $nyp } } if {$xth(me,cmds,$id,$pid,idn)} { set nxn [expr double([format %.2f [expr $nx + $xth(me,lcpd,oldxn) - $xth(me,lcpd,oldx)]])] set nyn [expr double([format %.2f [expr $ny + $xth(me,lcpd,oldyn) - $xth(me,lcpd,oldy)]])] set xth(ctrl,me,linept,xn) $nxn set xth(me,cmds,$id,$pid,xn) $nxn set xth(ctrl,me,linept,yn) $nyn set xth(me,cmds,$id,$pid,yn) $nyn if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xn) $nxn set xth(me,cmds,$id,$altpid,yn) $nyn } } xth_me_cmds_move_linept_xctrl $id $pid xth_me_cmds_move_line_xctrl $id } p { set xth(ctrl,me,linept,xp) $nx set xth(me,cmds,$id,$pid,xp) $nx set xth(ctrl,me,linept,yp) $ny set xth(me,cmds,$id,$pid,yp) $ny if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xp) $nx set xth(me,cmds,$id,$altpid,yp) $ny } if {$xth(me,cmds,$id,$pid,idn) && $xth(me,cmds,$id,$pid,smooth)} { set ncn [xth_me_cmds_get_smoothed_cp 1 $nx $ny \ $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y) \ $xth(me,cmds,$id,$pid,xn) $xth(me,cmds,$id,$pid,yn)] set nxn [lindex $ncn 2] set nyn [lindex $ncn 3] set xth(ctrl,me,linept,xn) $nxn set xth(me,cmds,$id,$pid,xn) $nxn set xth(ctrl,me,linept,yn) $nyn set xth(me,cmds,$id,$pid,yn) $nyn if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xn) $nxn set xth(me,cmds,$id,$altpid,yn) $nyn } } } n { set xth(ctrl,me,linept,xn) $nx set xth(me,cmds,$id,$pid,xn) $nx set xth(ctrl,me,linept,yn) $ny set xth(me,cmds,$id,$pid,yn) $ny if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xn) $nx set xth(me,cmds,$id,$altpid,yn) $ny } if {$xth(me,cmds,$id,$pid,idp) && $xth(me,cmds,$id,$pid,smooth)} { set ncp [xth_me_cmds_get_smoothed_cp -1 \ $xth(me,cmds,$id,$pid,xp) $xth(me,cmds,$id,$pid,yp) \ $xth(me,cmds,$id,$pid,x) $xth(me,cmds,$id,$pid,y) \ $nx $ny] set nxp [lindex $ncp 0] set nyp [lindex $ncp 1] set xth(ctrl,me,linept,xp) $nxp set xth(me,cmds,$id,$pid,xp) $nxp set xth(ctrl,me,linept,yp) $nyp set xth(me,cmds,$id,$pid,yp) $nyp if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xp) $nxp set xth(me,cmds,$id,$altpid,yp) $nyp } } } pp { if {$xth(me,cmds,$id,$ppid,smooth)} { set ncp [xth_me_cmds_get_smoothed_cp 1 \ $xth(me,cmds,$id,$ppid,xp) $xth(me,cmds,$id,$ppid,yp) \ $xth(me,cmds,$id,$ppid,x) $xth(me,cmds,$id,$ppid,y) \ $nx $ny] set xth(me,cmds,$id,$ppid,xn) [lindex $ncp 2] set xth(me,cmds,$id,$ppid,yn) [lindex $ncp 3] } else { set xth(me,cmds,$id,$ppid,xn) $nx set xth(me,cmds,$id,$ppid,yn) $ny } if {$altppid > 0} { set xth(me,cmds,$id,$altppid,xn) $xth(me,cmds,$id,$ppid,xn) set xth(me,cmds,$id,$altppid,yn) $xth(me,cmds,$id,$ppid,yn) } } nn { if {$xth(me,cmds,$id,$npid,smooth)} { set ncp [xth_me_cmds_get_smoothed_cp -1 \ $nx $ny \ $xth(me,cmds,$id,$npid,x) $xth(me,cmds,$id,$npid,y) \ $xth(me,cmds,$id,$npid,xn) $xth(me,cmds,$id,$npid,yn)] set xth(me,cmds,$id,$npid,xp) [lindex $ncp 0] set xth(me,cmds,$id,$npid,yp) [lindex $ncp 1] } else { set xth(me,cmds,$id,$npid,xp) $nx set xth(me,cmds,$id,$npid,yp) $ny } if {$altnpid > 0} { set xth(me,cmds,$id,$altnpid,xp) $xth(me,cmds,$id,$npid,xp) set xth(me,cmds,$id,$altnpid,yp) $xth(me,cmds,$id,$npid,yp) } } } xth_me_cmds_move_lineptcp_xctrl $id $ppid $pid $npid xth_me_cmds_move_linelnpt $id $pid update idletasks } proc xth_me_cmds_end_linecp_drag {x y dragto} { global xth xth_me_cmds_continue_linecp_drag $x $y $dragto set id $xth(me,lcpd,id) set pid $xth(me,lcpd,pid) set ppid $xth(me,lcpd,ppid) set npid $xth(me,lcpd,npid) set altpid $xth(me,lcpd,altpid) set altppid $xth(me,lcpd,altppid) set altnpid $xth(me,lcpd,altnpid) set tagOrId $xth(me,lcpd,tagOrId) set movecmd "xth_me_cmds_move_lineptcp_xctrl $id $ppid $pid $npid\nxth_me_cmds_move_linept_xctrl $id $pid\nxth_me_cmds_move_linelnpt $id $pid" switch $xth(me,lcpd,which) { x { set xth(me,cmds,$id,$pid,x) $xth(me,lcpd,oldx) set xth(me,cmds,$id,$pid,y) $xth(me,lcpd,oldy) set xth(me,cmds,$id,$pid,xp) $xth(me,lcpd,oldxp) set xth(me,cmds,$id,$pid,yp) $xth(me,lcpd,oldyp) set xth(me,cmds,$id,$pid,xn) $xth(me,lcpd,oldxn) set xth(me,cmds,$id,$pid,yn) $xth(me,lcpd,oldyn) if {$altpid > 0} { set xth(me,cmds,$id,$altpid,x) $xth(me,lcpd,oldx) set xth(me,cmds,$id,$altpid,y) $xth(me,lcpd,oldy) set xth(me,cmds,$id,$altpid,xp) $xth(me,lcpd,oldxp) set xth(me,cmds,$id,$altpid,yp) $xth(me,lcpd,oldyp) set xth(me,cmds,$id,$altpid,xn) $xth(me,lcpd,oldxn) set xth(me,cmds,$id,$altpid,yn) $xth(me,lcpd,oldyn) } set xth(me,unredola) "moving line point" $xth(me,can) itemconfigure $xth(me,canid,linept,pcpl) -state $xth(me,lcpd,oldmove,pcplstate) $xth(me,can) itemconfigure $xth(me,canid,linept,ncpl) -state $xth(me,lcpd,oldmove,ncplstate) $xth(me,can) itemconfigure $xth(me,canid,linept,selector) -state $xth(me,lcpd,oldmove,selstate) $xth(me,can) itemconfigure $xth(me,canid,linept,pcp) -fill $xth(me,lcpd,oldmove,pcpfill) $xth(me,can) itemconfigure $xth(me,canid,linept,ncp) -fill $xth(me,lcpd,oldmove,ncpfill) $xth(me,can) itemconfigure $xth(me,canid,linept,fr) -width 5 -arrow last $xth(me,can) itemconfigure $xth(me,canid,linept,fl) -width 5 -arrow last } p { set xth(me,cmds,$id,$pid,xp) $xth(me,lcpd,oldxp) set xth(me,cmds,$id,$pid,yp) $xth(me,lcpd,oldyp) set xth(me,cmds,$id,$pid,xn) $xth(me,lcpd,oldxn) set xth(me,cmds,$id,$pid,yn) $xth(me,lcpd,oldyn) if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xp) $xth(me,lcpd,oldxp) set xth(me,cmds,$id,$altpid,yp) $xth(me,lcpd,oldyp) set xth(me,cmds,$id,$altpid,xn) $xth(me,lcpd,oldxn) set xth(me,cmds,$id,$altpid,yn) $xth(me,lcpd,oldyn) } set xth(me,unredola) "moving control pint" } n { set xth(me,cmds,$id,$pid,xp) $xth(me,lcpd,oldxp) set xth(me,cmds,$id,$pid,yp) $xth(me,lcpd,oldyp) set xth(me,cmds,$id,$pid,xn) $xth(me,lcpd,oldxn) set xth(me,cmds,$id,$pid,yn) $xth(me,lcpd,oldyn) if {$altpid > 0} { set xth(me,cmds,$id,$altpid,xp) $xth(me,lcpd,oldxp) set xth(me,cmds,$id,$altpid,yp) $xth(me,lcpd,oldyp) set xth(me,cmds,$id,$altpid,xn) $xth(me,lcpd,oldxn) set xth(me,cmds,$id,$altpid,yn) $xth(me,lcpd,oldyn) } set xth(me,unredola) "moving control pint" } pp { if {$altppid > 0} { set unaltcmd "set xth(me,cmds,$id,$altppid,xn) $xth(me,lcpd,oldxpp)\nset xth(me,cmds,$id,$altppid,yn) $xth(me,lcpd,oldypp)" set realtcmd "set xth(me,cmds,$id,$altppid,xn) $xth(me,cmds,$id,$ppid,xn)\nset xth(me,cmds,$id,$altppid,yn) $xth(me,cmds,$id,$ppid,yn)" } else { set unaltcmd "" set realtcmd "" } xth_me_unredo_action [mc "moving control point"] \ "xth_me_cmds_select {$id $pid}\nset xth(me,cmds,$id,$ppid,xn) $xth(me,lcpd,oldxpp)\nset xth(me,cmds,$id,$ppid,yn) $xth(me,lcpd,oldypp)\n$unaltcmd\n$movecmd\nxth_me_cmds_update_line_data $id\nxth_me_prev_cmd [list $xth(me,cmds,$id,data)]" \ "xth_me_cmds_select {$id $pid}\nset xth(me,cmds,$id,$ppid,xn) $xth(me,cmds,$id,$ppid,xn)\nset xth(me,cmds,$id,$ppid,yn) $xth(me,cmds,$id,$ppid,yn)\n$realtcmd\n$movecmd\nxth_me_cmds_update_line_data $id\nxth_me_prev_cmd [list $xth(me,cmds,$id,data)]" } nn { if {$altnpid > 0} { set unaltcmd "set xth(me,cmds,$id,$altnpid,xp) $xth(me,lcpd,oldxnn)\nset xth(me,cmds,$id,$altnpid,yp) $xth(me,lcpd,oldynn)" set realtcmd "set xth(me,cmds,$id,$altnpid,xp) $xth(me,cmds,$id,$npid,xp)\nset xth(me,cmds,$id,$altnpid,yp) $xth(me,cmds,$id,$npid,yp)" } else { set unaltcmd "" set realtcmd "" } xth_me_unredo_action [mc "moving control point"] \ "xth_me_cmds_select {$id $pid}\nset xth(me,cmds,$id,$npid,xp) $xth(me,lcpd,oldxnn)\nset xth(me,cmds,$id,$npid,yp) $xth(me,lcpd,oldynn)\n$unaltcmd\n$movecmd\nxth_me_cmds_update_line_data $id\nxth_me_prev_cmd [list $xth(me,cmds,$id,data)]" \ "xth_me_cmds_select {$id $pid}\nset xth(me,cmds,$id,$npid,xp) $xth(me,cmds,$id,$npid,xp)\nset xth(me,cmds,$id,$npid,yp) $xth(me,cmds,$id,$npid,yp)\n$realtcmd\n$movecmd\nxth_me_cmds_update_line_data $id\nxth_me_prev_cmd [list $xth(me,cmds,$id,data)]" } } $xth(me,can) bind $tagOrId $xth(me,lcpd,oldenter) $xth(me,can) bind $tagOrId $xth(me,lcpd,oldleave) $xth(me,can) itemconfigure $tagOrId -fill $xth(me,lcpd,oldfill) $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-Motion> "" $xth(me,can) bind $tagOrId <$xth(kb_control)-B1-ButtonRelease> "" $xth(me,can) configure -cursor crosshair xth_me_cmds_update_line_data $id xth_me_prev_cmd $xth(me,cmds,$id,data) xth_me_cmds_move_line_xctrl $id xth_me_cmds_update {} } proc xth_me_cmds_configure_linept_size_xctrl {id pid} { global xth if {([string length $id] > 0) && ($pid > 0)} { if {([string length $xth(me,cmds,$id,$pid,rs)] > 0)} { $xth(me,can) itemconfigure $xth(me,canid,linept,fr) -state normal $xth(me,can) bind $xth(me,canid,linept,fr) <1> \ "xth_me_cmds_start_linept_fdrag $xth(me,canid,linept,fr) $id $pid r %x %y" $xth(me,can) bind $xth(me,canid,linept,fr) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,fr) -fill #ffda00" $xth(me,can) bind $xth(me,canid,linept,fr) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,fr) -fill red" } else { $xth(me,can) bind $xth(me,canid,linept,fr) <1> "" $xth(me,can) bind $xth(me,canid,linept,fr) "" $xth(me,can) bind $xth(me,canid,linept,fr) "" $xth(me,can) itemconfigure $xth(me,canid,linept,fr) -state hidden } if {([string length $xth(me,cmds,$id,$pid,ls)] > 0) || \ (([string length $xth(me,cmds,$id,$pid,rotation)] > 0) && \ ([string length $xth(me,cmds,$id,$pid,rs)] < 1))} { $xth(me,can) itemconfigure $xth(me,canid,linept,fl) -state normal $xth(me,can) bind $xth(me,canid,linept,fl) <1> \ "xth_me_cmds_start_linept_fdrag $xth(me,canid,linept,fl) $id $pid l %x %y" $xth(me,can) bind $xth(me,canid,linept,fl) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,fl) -fill #ffda00" $xth(me,can) bind $xth(me,canid,linept,fl) \ "$xth(me,can) itemconfigure $xth(me,canid,linept,fl) -fill red" } else { $xth(me,can) bind $xth(me,canid,linept,fl) <1> "" $xth(me,can) bind $xth(me,canid,linept,fl) "" $xth(me,can) bind $xth(me,canid,linept,fl) "" $xth(me,can) itemconfigure $xth(me,canid,linept,fl) -state hidden } } else { $xth(me,can) bind $xth(me,canid,linept,fr) <1> "" $xth(me,can) bind $xth(me,canid,linept,fr) "" $xth(me,can) bind $xth(me,canid,linept,fr) "" $xth(me,can) itemconfigure $xth(me,canid,linept,fr) -state hidden $xth(me,can) bind $xth(me,canid,linept,fl) <1> "" $xth(me,can) bind $xth(me,canid,linept,fl) "" $xth(me,can) bind $xth(me,canid,linept,fl) "" $xth(me,can) itemconfigure $xth(me,canid,linept,fl) -state hidden } } proc xth_me_cmds_move_linept_size_xctrl {id pid rot rs ls} { global xth set rotng 1 if {[string length $rot] > 0} { set rot [expr double($rot) / 180.0 * 3.14159265359] set rotng 0 } else { set rot [expr double([xth_me_cmds_get_default_rotation $id $pid]) / 180 * 3.14159265359] } if {[string length $rs] > 0} { set rs [expr 0.01 * $rs * $xth(me,zoom)] } else { set rs 30.0 } if {[string length $ls] > 0} { set ls [expr 0.01 * $ls * $xth(me,zoom)] } else { set ls 30.0 } set x [xth_me_real2canx $xth(me,cmds,$id,$pid,x)] set y [xth_me_real2cany $xth(me,cmds,$id,$pid,y)] set ca [expr cos($rot)] set sa [expr sin($rot)] set yvx [expr $sa * $ls] set yvy [expr - $ca * $ls] set xvx [expr - $sa * $rs] set xvy [expr $ca * $rs] if {$xth(me,cmds,$id,reverse) && $rotng} { set xvx [expr -1.0 * $xvx] set xvy [expr -1.0 * $xvy] set yvx [expr -1.0 * $yvx] set yvy [expr -1.0 * $yvy] } $xth(me,can) coords $xth(me,canid,linept,fr) $x $y [expr $x + $xvx] [expr $y + $xvy] $xth(me,can) coords $xth(me,canid,linept,fl) $x $y [expr $x + $yvx] [expr $y + $yvy] update idletasks } proc xth_me_cmds_start_linept_fdrag {tagOrId id pid side x y} { global xth xth_me_cmds_update {} set xth(me,lptfd,tagOrId) $tagOrId set xth(me,lptfd,id) $id set xth(me,lptfd,pid) $pid set xth(me,lptfd,side) $side set dx [expr [xth_me_can2realx [$xth(me,can) canvasx $x]] - $xth(me,cmds,$id,$pid,x)] set dy [expr [xth_me_can2realy [$xth(me,can) canvasy $y]] - $xth(me,cmds,$id,$pid,y)] if {[string length $xth(me,cmds,$id,$pid,rotation)] == 0} { set xth(me,lptfd,rot) 0 } else { set xth(me,lptfd,rot) 1 set xth(me,lptfd,orot) [expr atan2($dy,$dx)] } if {[string length $xth(me,cmds,$id,$pid,[format "%ss" $side])] == 0} { set xth(me,lptfd,size) 0 } else { set xth(me,lptfd,size) 1 set xth(me,lptfd,osize) [expr hypot($dy,$dx)] } $xth(me,can) itemconfigure $tagOrId -fill #ffda00 set xth(me,lptfd,benter) [$xth(me,can) bind $tagOrId ] set xth(me,lptfd,bleave) [$xth(me,can) bind $tagOrId ] $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "xth_me_cmds_linept_fdrag %x %y" $xth(me,can) bind $tagOrId "xth_me_cmds_end_linept_fdrag %x %y" xth_me_cmds_linept_fdrag $x $y $xth(me,can) configure -cursor {} } proc xth_me_cmds_linept_fdrag {x y} { global xth set id $xth(me,lptfd,id) set pid $xth(me,lptfd,pid) set side $xth(me,lptfd,side) set dx [expr [xth_me_can2realx [$xth(me,can) canvasx $x]] - $xth(me,cmds,$id,$pid,x)] set dy [expr [xth_me_can2realy [$xth(me,can) canvasy $y]] - $xth(me,cmds,$id,$pid,y)] if $xth(me,lptfd,rot) { set rot [expr double($xth(me,cmds,$id,$pid,rotation)) - 180.0 / 3.14159265359 * (atan2($dy,$dx) - $xth(me,lptfd,orot))] if {$rot < 0.0} { set rot [expr 360.0 + $rot] } elseif {$rot >= 360.0} { set rot [expr $rot - 360.0] } set rot [format "%.1f" $rot] set xth(ctrl,me,linept,rot) $rot } if {$xth(me,lptfd,size)} { set cs [expr hypot($dy,$dx)] set ns [expr $xth(me,cmds,$id,$pid,[format "%ss" $side]) - $xth(me,lptfd,osize) + $cs] if {$ns <= 0.0} {set ns 0.1} set xth(ctrl,me,linept,[format "%ss" $side]) [format "%.1f" $ns] } xth_me_cmds_move_linept_size_xctrl $id $pid $xth(ctrl,me,linept,rot) $xth(ctrl,me,linept,rs) $xth(ctrl,me,linept,ls) xth_me_cmds_move_line_xctrl $id } proc xth_me_cmds_end_linept_fdrag {x y} { global xth xth_me_cmds_linept_fdrag $x $y set id $xth(me,lptfd,id) set pid $xth(me,lptfd,pid) set side $xth(me,lptfd,side) set tagOrId $xth(me,lptfd,tagOrId) $xth(me,can) configure -cursor crosshair if {$xth(me,lptfd,size)} { set xth(me,unredola) "line point resizing" } else { set xth(me,unredola) "line point rotation" } $xth(me,can) bind $tagOrId "" $xth(me,can) bind $tagOrId "" if {[lsearch [$xth(me,can) itemcget $tagOrId -tags] current] > -1} { $xth(me,can) itemconfigure $tagOrId -fill #ffda00 } $xth(me,can) bind $tagOrId $xth(me,lptfd,benter) $xth(me,can) bind $tagOrId $xth(me,lptfd,bleave) xth_me_cmds_update {} } proc xth_me_cmds_set_colors {} { global xth # najde id zaciatku a konca sucasneho scrapu set xid [lsearch $xth(me,cmds,xlist) $xth(me,cmds,selid)] set llen [llength $xth(me,cmds,xlist)] set cid $xid set dcol #fff222 set scol $xth(gui,me,pasivefill) if {$xth(me,cmds,$xth(me,cmds,selid),ct) == 4} { set col $dcol set ocol $scol } elseif {$xth(me,cmds,$xth(me,cmds,selid),ct) == 5} { set col $scol set ocol $dcol } else { set col $scol set ocol $scol } set xth(me,curscrap) {} set godown 1 if {$cid < 0} { set cid [expr $xid + 1] set godown 0 } while {(($cid >= 0) && ($cid < $llen)) || ($godown)} { set id [lindex $xth(me,cmds,xlist) $cid] switch $xth(me,cmds,$id,ct) { 2 { $xth(me,can) itemconfigure pt$id -outline $col -fill $col -state normal if {$xth(me,hinactives) && ($col == $dcol)} { $xth(me,can) itemconfigure pt$id -state hidden } } 3 { $xth(me,can) itemconfigure lnpt$id -outline $col -fill $col -state normal $xth(me,can) itemconfigure lnln$id -fill $col -state normal if {$xth(me,hinactives) && ($col == $dcol)} { $xth(me,can) itemconfigure ln$id -state hidden } } 4 - 5 { if {(![string equal $col $dcol]) && ($xth(me,cmds,$id,ct) == 4)} { set xth(me,curscrap) $xth(me,cmds,$id,name) # if {[string equal $xth(me,cmds,$id,projection) extended]} { # set xth(me,snai) -1 # } else { # set xth(me,snai) 1 # } set xth(me,snai) 1 } if {$cid != $xid} { set col $dcol } } } if {$godown} { incr cid -1 if {$cid < 0} { set cid [expr $xid + 1] set godown 0 set col $ocol } } else { incr cid 1 } } xth_app_title me } proc xth_me_cmds_show_current_area {} { global xth set id $xth(me,cmds,selid) if {$xth(me,cmds,$id,ct) != 6} { return } set xid [expr [lsearch $xth(me,cmds,xlist) $id] + 1] set llen [llength $xth(me,cmds,xlist)] set cid $xid set godown 1 if {$cid < 0} { set cid [expr $xid - 1] set godown 0 } set llist $xth(me,cmds,$id,llist) set llast [expr [llength $llist] - 1] set lcsel [$xth(ctrl,me,ac).ll.l curselection] set lsel {} if {([llength $lcsel] > 0) && ($lcsel < $llast)} { set lsel [lindex $llist $lcsel] } while {(($cid >= 0) && ($cid < $llen)) || ($godown)} { set oid [lindex $xth(me,cmds,xlist) $cid] switch $xth(me,cmds,$oid,ct) { 3 { foreach lnid $llist { if {[string equal $xth(me,cmds,$oid,name) $lnid]} { if {([llength $lsel] == 0) || [string equal $lsel $lnid]} { $xth(me,can) itemconfigure lnpt$oid -fill red $xth(me,can) itemconfigure lnln$oid -fill red } else { $xth(me,can) itemconfigure lnpt$oid -fill $xth(gui,me,pasivefill) $xth(me,can) itemconfigure lnln$oid -fill $xth(gui,me,pasivefill) } } } } 4 { return } 5 { if {$godown} { if {$cid != $xid} { set cid [expr $xid - 1] set godown 0 } } else return } } if {$godown} { incr cid 1 if {$cid >= $llen} { set cid [expr $xid - 1] set godown 0 } } else { incr cid -1 } } } proc xth_me_cmds_line_split {} { global xth xth_me_cmds_update {} set id $xth(me,cmds,selid) set pid $xth(me,cmds,selpid) set prev_center [xth_me_get_center] # najprv zisti ci mooze, ak nie tak exit if {$xth(me,cmds,$id,ct) != 3} { return } set px [lsearch -exact $xth(me,cmds,$id,xplist) $pid] set lpx [llength $xth(me,cmds,$id,xplist)] if {($px <= 0) || ($px >= ($lpx - 2))} { return } # vytvori dve nove ciary, close nastavene na false set xth(me,unredook) 0 set ix [lsearch $xth(me,cmds,xlist) $id] set id1 [xth_me_cmds_create 3 {} {}] set xth(me,cmds,$id1,lpid) 0 set xth(me,cmds,$id1,plist) {"end of line"} set xth(me,cmds,$id1,xplist) {0} set id2 [xth_me_cmds_create 3 {} {}] set xth(me,cmds,$id2,lpid) 0 set xth(me,cmds,$id2,plist) {"end of line"} set xth(me,cmds,$id2,xplist) {0} set xth(me,cmds,$id1,type) $xth(me,cmds,$id,type) set xth(me,cmds,$id2,type) $xth(me,cmds,$id,type) set xth(me,cmds,$id1,name) {} set xth(me,cmds,$id2,name) {} set xth(me,cmds,$id1,reverse) $xth(me,cmds,$id,reverse) set xth(me,cmds,$id2,reverse) $xth(me,cmds,$id,reverse) set xth(me,cmds,$id1,close) 0 set xth(me,cmds,$id2,close) 0 set xth(me,cmds,$id1,options) $xth(me,cmds,$id,options) set xth(me,cmds,$id2,options) $xth(me,cmds,$id,options) xth_me_cmds_update_list $id1 xth_me_cmds_update_list $id2 # povklada body set ix1 0 set ix2 0 for {set cx 0} {$cx < ($lpx - 1)} {incr cx} { set opid [lindex $xth(me,cmds,$id,xplist) $cx] if {$cx <= $px} { #vlozi ho do prvej xth_me_cmds_create_line_point $id1 $ix1 0 \ $xth(me,cmds,$id,$opid,x) $xth(me,cmds,$id,$opid,y) \ $xth(me,cmds,$id,$opid,xp) $xth(me,cmds,$id,$opid,yp) \ $xth(me,cmds,$id,$opid,xn) $xth(me,cmds,$id,$opid,yn) \ $xth(me,cmds,$id,$opid,smooth) $xth(me,cmds,$id,$opid,rotation) \ $xth(me,cmds,$id,$opid,rs) $xth(me,cmds,$id,$opid,ls) \ $xth(me,cmds,$id,$opid,options) 1.0 incr ix1 } if {$cx >= $px} { #vlozi ho do druhej xth_me_cmds_create_line_point $id2 $ix2 0 \ $xth(me,cmds,$id,$opid,x) $xth(me,cmds,$id,$opid,y) \ $xth(me,cmds,$id,$opid,xp) $xth(me,cmds,$id,$opid,yp) \ $xth(me,cmds,$id,$opid,xn) $xth(me,cmds,$id,$opid,yn) \ $xth(me,cmds,$id,$opid,smooth) $xth(me,cmds,$id,$opid,rotation) \ $xth(me,cmds,$id,$opid,rs) $xth(me,cmds,$id,$opid,ls) \ $xth(me,cmds,$id,$opid,options) 1.0 incr ix2 } } xth_me_cmds_update_line_data $id1 xth_me_cmds_update_line_data $id2 # zmaze originalnu set pid1 0 set pid2 [lindex $xth(me,cmds,$id2,xplist) 0] xth_me_cmds_delete $id xth_me_cmds_select [list $id2 $pid2] # scrollne sa tam, odkial sme zacinali xth_me_center_to $prev_center set xth(me,unredook) 1 # nastavi undo na zmazanie novych a undelete originalnej # a redo na undelete novych a zmazanie originalnej xth_me_unredo_action [mc "split line"] \ "xth_me_cmds_delete $id1; xth_me_cmds_delete $id2; xth_me_cmds_undelete $id $pid $ix; xth_me_center_to {$prev_center}" \ "xth_me_cmds_undelete $id1 $pid1 $ix; xth_me_cmds_undelete $id2 $pid2 $ix; xth_me_cmds_delete $id; xth_me_cmds_select {$id2 $pid2}; xth_me_center_to {$prev_center}" } # todo - zistovat, ci sme nad inymi, ako prave startovacimi pt a lnpt # pridat button na tracovanie a stop # pridat vytvorenie bezierovej krivky proc xth_me_image_get_color {x y {include {}} {exclude {}}} { global xth # najde obrazok na ktory sme klikli - ak taky ma, spocita suradnice a vrati RGB set iid {} foreach id [$xth(me,can) find overlapping [xth_me_real2canx $x] [xth_me_real2cany $y] [xth_me_real2canx $x] [xth_me_real2cany $y]] { set tags [$xth(me,can) itemcget $id -tags] if {[regexp {bgimg.*imgx(\d+)} $tags dum tmpiid]} { set iid $tmpiid } if {[regexp {command} $tags]} { if {([string length $include] > 0) && (!([regexp $include $tags])) && ([regexp $exclude $tags])} { return 1 } } } if {[string length $iid] == 0} { return {} } # calculate color set img $xth(me,imgs,$iid,image) set iw [image width $img] set ih [image height $img] set ix [expr round($x - [lindex $xth(me,imgs,$iid,position) 0])] set iy [expr round([lindex $xth(me,imgs,$iid,position) 1] - $y)] if {$ix < 0} {set ix 0} if {$ix >= $iw} {set ix [expr $iw - 1]} if {$iy < 0} {set iy 0} if {$iy >= $ih} {set iy [expr $ih - 1]} return [$img get $ix $iy] } proc xth_me_cmds_line_trace_stop {} { global xth set xth(ctrl,me,line,tracecontinue) 0 } proc xth_me_cmds_line_trace_start {} { global xth set xth(ctrl,me,line,tracedist) 0.0 xth_me_cmds_line_trace } proc xth_me_cmds_line_trace {} { global xth xth_me_cmds_update {} set xth(ctrl,me,line,tracecontinue) 1 if {$xth(ctrl,me,line,tracerow) > 0} { grid $xth(ctrl,me,line).trace -row $xth(ctrl,me,line,tracerow) -column 0 -sticky news grid $xth(ctrl,me,line).vector -row $xth(ctrl,me,line,tracerow) -column 1 -sticky news set xth(ctrl,me,line,tracebtnfg) [$xth(ctrl,me,line).trace cget -fg] set xth(ctrl,me,line,tracebtnbg) [$xth(ctrl,me,line).trace cget -bg] set xth(ctrl,me,line,tracebtnafg) [$xth(ctrl,me,line).trace cget -activeforeground] set xth(ctrl,me,line,tracebtnabg) [$xth(ctrl,me,line).trace cget -activebackground] set xth(ctrl,me,line,tracerow) 0 } set id $xth(me,cmds,selid) set npx [llength $xth(me,cmds,$id,xplist)] if {$npx < 3} {return} # zoberieme posledne 2 body na ciare set px0 [lindex $xth(me,cmds,$id,xplist) [expr $npx - 3]] set px1 [lindex $xth(me,cmds,$id,xplist) [expr $npx - 2]] set xth(me,cmds,selpid) 0 # spocitame ich vzdialenost set x0 $xth(me,cmds,$id,$px0,x) set y0 $xth(me,cmds,$id,$px0,y) set x1 $xth(me,cmds,$id,$px1,x) set y1 $xth(me,cmds,$id,$px1,y) set dx [expr $x1 - $x0] set dy [expr $y1 - $y0] set l [expr hypot($dx, $dy)] if {($x0 == $x1) && ($y0 == $y1)} { return } if {$l < 1.0} {set l 1.0} set tcol [xth_me_image_get_color $x1 $y1] if {[llength $tcol] != 3} {return} if {$xth(ctrl,me,line,tracedist) == 0.0} { set xth(ctrl,me,line,tracedist) $l set xth(ctrl,me,line,tracecolor) $tcol set dist $l } else { set dist $xth(ctrl,me,line,tracedist) set tcol $xth(ctrl,me,line,tracecolor) } xth_me_cmds_line_trace_point_cycle $dist $tcol return } proc xth_me_cmds_line_trace_point_cycle {dist tcol} { global xth set next [xth_me_cmds_line_trace_point $dist $tcol] set cont [expr [llength $next] > 0] if {(!$cont) && ($dist > 2.0)} { set next [xth_me_cmds_line_trace_point [expr $dist / 2.0] $tcol] set cont [expr [llength $next] > 0] } if {(!$cont)} { set next [xth_me_cmds_line_trace_point [expr $dist * 2.0] $tcol] set cont [expr [llength $next] > 0] } if {$cont && $xth(ctrl,me,line,tracecontinue) && ([llength $next] == 2)} { $xth(ctrl,me,line).trace configure -command {xth_me_cmds_line_trace_stop} -text [mc "Stop tracing"] \ -fg white -bg red -activeforeground white -activebackground red set lt 0 set ld 100 catch { set lt $xth(ctrl,me,line,traceltime) set ld $xth(ctrl,me,line,traceldelay) } set xth(ctrl,me,line,traceltime) [clock clicks -milliseconds] set cd [expr 100 - $xth(ctrl,me,line,traceltime) + $lt] if {$cd < 0} { set cd 0 } if {$cd > 100} { set cd 100 } set cd [expr int(0.95 * $ld + 0.05 * $cd)] set xth(ctrl,me,line,traceldelay) $cd after $cd "after idle \"xth_me_cmds_line_trace_point_cycle $dist [list $tcol]\"" } else { $xth(ctrl,me,line).trace configure -command {xth_me_cmds_line_trace} -text [mc "Continue tracing"] \ -fg $xth(ctrl,me,line,tracebtnfg) -bg $xth(ctrl,me,line,tracebtnbg) \ -activeforeground $xth(ctrl,me,line,tracebtnafg) -activebackground $xth(ctrl,me,line,tracebtnabg) } } proc xth_me_cmds_line_trace_point {dist tcol} { global xth set id $xth(me,cmds,selid) if {$xth(me,cmds,$id,ct) != 3} {return} set npx [llength $xth(me,cmds,$id,xplist)] if {$npx < 3} {return} if {$xth(me,cmds,$id,close)} {return} # zoberieme posledne 2 body na ciare set pxs [lindex $xth(me,cmds,$id,xplist) 0] set px0 [lindex $xth(me,cmds,$id,xplist) [expr $npx - 3]] set px1 [lindex $xth(me,cmds,$id,xplist) [expr $npx - 2]] set xth(me,cmds,selpid) 0 set itags "pt$id\\.$px1|ln$id\\.$px1" set etags "pt$id\\.\\d+|ln$id\\.\\d+" # spocitame ich vzdialenost set xs $xth(me,cmds,$id,$pxs,x) set ys $xth(me,cmds,$id,$pxs,y) set x0 $xth(me,cmds,$id,$px0,x) set y0 $xth(me,cmds,$id,$px0,y) set x1 $xth(me,cmds,$id,$px1,x) set y1 $xth(me,cmds,$id,$px1,y) set dx [expr $x1 - $x0] set dy [expr $y1 - $y0] set l [expr hypot($dx, $dy)] if {($x0 == $x1) && ($y0 == $y1)} { return } set dx [expr $dx / $l * $dist] set dy [expr $dy / $l * $dist] set resol 1.0 xth_me_center_to [list $x1 $y1] set da [expr atan2($resol, $dist)] set maxta [expr $da * (2.0 * $dist / $resol)] set minta [expr -1.0 * $maxta] set tR [lindex $tcol 0] set tG [lindex $tcol 1] set tB [lindex $tcol 2] if {[llength $tcol] == 0} { return } # spocitame polkruznicu set mode 0 set ta 0.0 set sa {} set ea {} set cstep 0.0 set goback 0 while {$mode >= 0} { set tx [expr $x1 + $dx * cos($ta) + $dy * sin($ta)] set ty [expr $y1 - $dx * sin($ta) + $dy * cos($ta)] set ccol [xth_me_image_get_color $tx $ty $itags $etags] if {[llength $ccol] != 3} { set ceq 0 } else { set dR [expr [lindex $ccol 0] - $tR] set dG [expr [lindex $ccol 1] - $tG] set dB [expr [lindex $ccol 2] - $tB] set ceq [expr [expr ($dR * $dR) + ($dG * $dG) + ($dB * $dB)] < 1600] } switch $mode { 0 { if {$ceq} { set sa $ta set ea $ta if {$ta == 0.0} { set mode 1 set goback 1 } elseif {$ta < 0.0} { set mode 1 } else { set mode 2 } } else { if {$ta == 0.0} { set ta $da } elseif {$ta < 0.0} { set ta [expr -1.0 * $ta + $da] } else { set ta [expr -1.0 * $ta] } } } 1 { # odratavame if {$ceq} { set sa $ta set ta [expr $ta - $da] } else { if $goback { set ta [expr $ea + $da] set mode 2 set goback 0 } else { set mode -1 } } } 2 { # priratavame if {$ceq} { set ea $ta set ta [expr $ta + $da] } else { if $goback { set ta [expr $sa - $da] set mode 1 set goback 0 } else { set mode -1 } } } } if {($ta > $maxta) || ($ta < $minta)} { set mode -1 } } if {[llength $sa] == 0} { return } # vypocitame bod set ta [expr 0.5 * ($sa + $ea)] set tx [expr $x1 + $dx * cos($ta) + $dy * sin($ta)] set ty [expr $y1 - $dx * sin($ta) + $dy * cos($ta)] set ok 0 set tryclose [expr ($npx > 3) && (hypot($x1 - $xs, $y1 - $ys) < $dist)] if {$tryclose} { set ttx $tx set tty $ty set tx $xs set ty $ys } while {!$ok} { set nin 0 set nto 0 for {set t 0.0} {$t <= $dist} {set t [expr $t + 1.0]} { set lx [expr $x1 + ($tx - $x1) / $dist * $t] set ly [expr $y1 + ($ty - $y1) / $dist * $t] if {$tryclose} { set ccol [xth_me_image_get_color $lx $ly] } else { set ccol [xth_me_image_get_color $lx $ly $itags $etags] } if {[llength $ccol] == 1} { return } elseif {[llength $ccol] == 0} { set ceq 0 } else { set dR [expr [lindex $ccol 0] - $tR] set dG [expr [lindex $ccol 1] - $tG] set dB [expr [lindex $ccol 2] - $tB] set ceq [expr [expr ($dR * $dR) + ($dG * $dG) + ($dB * $dB)] < 1600] } if {$ceq} {incr nin} incr nto } if {double($nin)/double($nto) < 0.5} { if {$tryclose} { set tryclose 0 set tx $ttx set ty $tty } else { return } } else { set ok 1 } } # vlozi bod na ciare if {$tryclose} { xth_me_cmds_close_line $id return 1 } else { xth_me_cmds_start_create_linept {} [format "%.2f" $tx] [format "%.2f" $ty] 0 0 xth_me_cmds_end_create_linept 0 0 0 return [list $tx $ty] } } proc xth_me_cmds_line_poly2bezier {} { global xth set id $xth(me,cmds,selid) if {$xth(me,cmds,$id,ct) != 3} {return} set npx [llength $xth(me,cmds,$id,xplist)] if {$npx < 4} {return} foreach x $xth(me,cmds,$id,xplist) { if {($x != 0) && ($xth(me,cmds,$id,$x,idn) || $xth(me,cmds,$id,$x,idp))} return } set cdir [pwd] cd $xth(me,fpath) set f [open "therion.bci" w] foreach x $xth(me,cmds,$id,xplist) { if {$x != 0} { puts $f "$xth(me,cmds,$id,$x,x) $xth(me,cmds,$id,$x,y)" } } close $f set f [open "therion.bco" w] close $f update idletasks catch { set thid [open "|$xth(gui,compcmd) -b" r] read $thid close $thid } set data {} catch { set f [open "therion.bco" r] while {![eof $f]} { set ln [gets $f] if {[regexp {\d+} $ln]} { lappend data $ln } } close $f } catch { file delete therion.bci file delete therion.bco } cd $cdir if {[llength $data] == 0} {return} set type $xth(me,cmds,$id,type) set opts " $xth(me,cmds,$id,options)" if {$xth(me,cmds,$id,reverse)} { set opts "$opts -reverse on" } if {$xth(me,cmds,$id,close)} { set opts "$opts -close on" } xth_me_cmds_delete $id xth_me_cmds_create_line 0 2 $type $opts $data xth_me_cmds_set_mode 0 return } therion/xtherion/source.tcl0000775000175000017500000000327411057012246015121 0ustar useruser#! /usr/bin/wish ## source.tcl -- ## ## Main script. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- set xth(debug) 1 #@ALL source ver.tcl source global.tcl source msgxth.tcl source msgusr.tcl #@XTHERION source therion.tcl #@SURVEX if 0 { source svx_global.tcl } #@ALL source about.tcl source init.tcl source syntax.tcl source sbar.tcl source scroll.tcl source help.tcl source ctrl.tcl source app.tcl source te.tcl source te_sdata.tcl source te_sdata2.tcl source te_import.tcl #@XTHERION source tools_imgs.tcl source me_imgs.tcl source me_cmds.tcl source me_cmds2.tcl source me_import.tcl source me_ss.tcl source me.tcl source cp_procs.tcl source bac.tcl source cp.tcl source tools.tcl source mapcal.tcl #@DEBUG if {![string equal $xth(gui,platform) windows]} { source console.tcl } else { source dbg.tcl } #@ALL source main.tcl therion/xtherion/msgxth.tcl0000664000175000017500000207240511542657020015140 0ustar useruser# file generated automatically - do not modify! ::msgcat::mcset bg "Drag to resize control panel." [encoding convertfrom utf-8 "\320\237\320\273\321\212\320\267\320\275\320\265\321\202\320\265, \320\267\320\260 \320\264\320\260 \320\277\321\200\320\276\320\274\320\265\320\275\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \320\272\320\276\320\275\321\202\321\200\320\276\320\273\320\275\320\270\321\217 \320\277\320\260\320\275\320\265\320\273"] ::msgcat::mcset cz "Drag to resize control panel." [encoding convertfrom utf-8 "Zm\304\233nit \305\241\303\255\305\231ku panelu."] ::msgcat::mcset de "Drag to resize control panel." [encoding convertfrom utf-8 "Ziehen um Gr\303\266\303\237e zu \303\244ndern."] ::msgcat::mcset el "Drag to resize control panel." [encoding convertfrom utf-8 "Drag \316\263\316\271\316\261 \317\200\317\201\316\277\317\203\316\261\317\201\316\274\316\277\316\263\316\256 \316\274\316\265\316\263\316\255\316\270\316\277\317\205\317\202 \317\200\316\257\316\275\316\261\316\272\316\261 \316\265\316\273\316\255\316\263\317\207\316\277\317\205."] ::msgcat::mcset en "Drag to resize control panel." [encoding convertfrom utf-8 "Drag to resize control panel."] ::msgcat::mcset es "Drag to resize control panel." [encoding convertfrom utf-8 "Arrastar para cambiar el tama\303\261o del panel de control."] ::msgcat::mcset it "Drag to resize control panel." [encoding convertfrom utf-8 "Trascina per ridimensionare il pannello dei controlli"] ::msgcat::mcset ru "Drag to resize control panel." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\321\202\320\260\321\201\320\272\320\270\320\262\320\260\320\271\321\202\320\265 \320\264\320\273\321\217 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\321\217 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\277\320\260\320\275\320\265\320\273\320\270"] ::msgcat::mcset sk "Drag to resize control panel." [encoding convertfrom utf-8 "Roz\305\241\303\255ri\305\245 alebo z\303\272\305\276i\305\245 okno kontroln\303\275ch panelov."] ::msgcat::mcset sq "Drag to resize control panel." [encoding convertfrom utf-8 "levize per te rritur dritaren kontrolluese"] ::msgcat::mcset bg "File" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273"] ::msgcat::mcset cz "File" [encoding convertfrom utf-8 "Soubor"] ::msgcat::mcset de "File" [encoding convertfrom utf-8 "Datei"] ::msgcat::mcset el "File" [encoding convertfrom utf-8 "\316\221\317\201\317\207\316\265\316\257\316\277"] ::msgcat::mcset en "File" [encoding convertfrom utf-8 "File"] ::msgcat::mcset es "File" [encoding convertfrom utf-8 "Archivo"] ::msgcat::mcset it "File" [encoding convertfrom utf-8 "File"] ::msgcat::mcset ru "File" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273"] ::msgcat::mcset sk "File" [encoding convertfrom utf-8 "S\303\272bor"] ::msgcat::mcset sq "File" [encoding convertfrom utf-8 "fajlli"] ::msgcat::mcset bg "Maximize" [encoding convertfrom utf-8 "\320\243\320\262\320\265\320\273\320\270\321\207\320\260\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "Maximize" [encoding convertfrom utf-8 "Maximalizovat"] ::msgcat::mcset de "Maximize" [encoding convertfrom utf-8 "Maximieren"] ::msgcat::mcset el "Maximize" [encoding convertfrom utf-8 "\316\234\316\265\316\263\316\271\317\203\317\204\316\277\317\200\316\277\316\257\316\267\317\203\316\267"] ::msgcat::mcset en "Maximize" [encoding convertfrom utf-8 "Maximize"] ::msgcat::mcset es "Maximize" [encoding convertfrom utf-8 "Maximizar"] ::msgcat::mcset it "Maximize" [encoding convertfrom utf-8 "Massimizza"] ::msgcat::mcset ru "Maximize" [encoding convertfrom utf-8 "\320\240\320\260\320\267\320\262\320\265\321\200\320\275\321\203\321\202\321\214"] ::msgcat::mcset sk "Maximize" [encoding convertfrom utf-8 "Maximalizova\305\245"] ::msgcat::mcset sq "Maximize" [encoding convertfrom utf-8 "rrite ne maksimum"] ::msgcat::mcset bg "Normalize" [encoding convertfrom utf-8 "\320\235\320\276\321\200\320\274\320\260\320\273\320\270\320\267\320\270\321\200\320\260\320\275\320\265"] ::msgcat::mcset cz "Normalize" [encoding convertfrom utf-8 "Norm\303\241ln\303\255 velikost"] ::msgcat::mcset de "Normalize" [encoding convertfrom utf-8 "Normalgr\303\266\303\237e"] ::msgcat::mcset el "Normalize" [encoding convertfrom utf-8 "\316\232\316\261\316\275\316\277\316\275\316\271\316\272\317\214 \316\274\316\255\316\263\316\265\316\270\316\277\317\202"] ::msgcat::mcset en "Normalize" [encoding convertfrom utf-8 "Normalize"] ::msgcat::mcset es "Normalize" [encoding convertfrom utf-8 "Normalizar"] ::msgcat::mcset it "Normalize" [encoding convertfrom utf-8 "Normalizza"] ::msgcat::mcset ru "Normalize" [encoding convertfrom utf-8 "\320\241\320\262\320\265\321\200\320\275\321\203\321\202\321\214"] ::msgcat::mcset sk "Normalize" [encoding convertfrom utf-8 "Norm\303\241lna ve\304\276kos\305\245"] ::msgcat::mcset sq "Normalize" [encoding convertfrom utf-8 "normalizo"] ::msgcat::mcset bg "Switch panels" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\277\320\260\320\275\320\265\320\273\320\260"] ::msgcat::mcset cz "Switch panels" [encoding convertfrom utf-8 "P\305\231eho\304\217 panely"] ::msgcat::mcset de "Switch panels" [encoding convertfrom utf-8 "Panel verschieben"] ::msgcat::mcset el "Switch panels" [encoding convertfrom utf-8 "\316\221\316\273\316\273\316\261\316\263\316\256 \317\200\316\261\317\201\316\254\316\270\317\205\317\201\316\277\317\205"] ::msgcat::mcset en "Switch panels" [encoding convertfrom utf-8 "Switch panels"] ::msgcat::mcset es "Switch panels" [encoding convertfrom utf-8 "Alternar paneles"] ::msgcat::mcset it "Switch panels" [encoding convertfrom utf-8 "Cambia posto al pannello"] ::msgcat::mcset ru "Switch panels" [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\272\320\273\321\216\321\207\320\270\321\202\321\214 \320\277\320\260\320\275\320\265\320\273\320\270"] ::msgcat::mcset sk "Switch panels" [encoding convertfrom utf-8 "Preho\304\217 panely"] ::msgcat::mcset sq "Switch panels" [encoding convertfrom utf-8 "nderro panelat"] ::msgcat::mcset bg "Toggle toolbar" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\277\320\260\320\275\320\265\320\273\320\260 \321\201 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\270"] ::msgcat::mcset cz "Toggle toolbar" [encoding convertfrom utf-8 "Vypnout/zapnout li\305\241tu n\303\241stroj\305\257"] ::msgcat::mcset de "Toggle toolbar" [encoding convertfrom utf-8 "Werkzeugleiste anzeigen/verbergen"] ::msgcat::mcset el "Toggle toolbar" [encoding convertfrom utf-8 "\316\225\316\274\317\206\316\254\316\275\316\271\317\203\316\267 / \316\274\316\267-\316\265\316\274\317\206\316\254\316\275\316\271\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \316\265\317\201\316\263\316\261\316\273\316\265\316\257\317\211\316\275"] ::msgcat::mcset it "Toggle toolbar" [encoding convertfrom utf-8 "Mostra/Nascondi la barra strumenti"] ::msgcat::mcset ru "Toggle toolbar" [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\272\320\273\321\216\321\207\320\270\321\202\321\214 \320\277\320\260\320\275\320\265\320\273\321\214 \320\270\320\275\321\201\321\202\321\200\321\203\320\274\320\265\320\275\321\202\320\276\320\262"] ::msgcat::mcset sk "Toggle toolbar" [encoding convertfrom utf-8 "Zapn\303\272\305\245/vypn\303\272\305\245 panel"] ::msgcat::mcset sq "Toggle toolbar" [encoding convertfrom utf-8 "dritarja aktivizuese"] ::msgcat::mcset bg "KBD encoding" [encoding convertfrom utf-8 "\320\232\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260 \320\275\320\260 \320\272\320\273\320\260\320\262\320\270\320\260\321\202\321\203\321\200\320\260\321\202\320\260"] ::msgcat::mcset cz "KBD encoding" [encoding convertfrom utf-8 "K\303\263dov\303\241n\303\255 kl\303\241vesnice"] ::msgcat::mcset de "KBD encoding" [encoding convertfrom utf-8 "Zeichensatz"] ::msgcat::mcset el "KBD encoding" [encoding convertfrom utf-8 "\316\232\317\211\316\264\316\271\316\272\316\277\317\200\316\277\316\257\316\267\317\203\316\267 \317\200\316\273\316\267\316\272\317\204\317\201\316\277\316\273\316\277\316\263\316\257\316\277\317\205"] ::msgcat::mcset en "KBD encoding" [encoding convertfrom utf-8 "KBD encoding"] ::msgcat::mcset es "KBD encoding" [encoding convertfrom utf-8 "Codificaci\303\263n teclado"] ::msgcat::mcset it "KBD encoding" [encoding convertfrom utf-8 "Encoding della tastiera"] ::msgcat::mcset ru "KBD encoding" [encoding convertfrom utf-8 "\320\232\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260 \320\272\320\273\320\260\320\262\320\270\320\260\321\202\321\203\321\200\321\213"] ::msgcat::mcset sk "KBD encoding" [encoding convertfrom utf-8 "K\303\263dovanie kl\303\241vesnice"] ::msgcat::mcset sq "KBD encoding" [encoding convertfrom utf-8 "KBD-kodimi"] ::msgcat::mcset bg "Window" [encoding convertfrom utf-8 "\320\237\321\200\320\276\320\267\320\276\321\200\320\265\321\206"] ::msgcat::mcset cz "Window" [encoding convertfrom utf-8 "Okno"] ::msgcat::mcset de "Window" [encoding convertfrom utf-8 "Fenster"] ::msgcat::mcset el "Window" [encoding convertfrom utf-8 "\316\240\316\261\317\201\316\254\316\270\317\205\317\201\316\277"] ::msgcat::mcset en "Window" [encoding convertfrom utf-8 "Window"] ::msgcat::mcset es "Window" [encoding convertfrom utf-8 "Ventana"] ::msgcat::mcset it "Window" [encoding convertfrom utf-8 "Finestra"] ::msgcat::mcset ru "Window" [encoding convertfrom utf-8 "\320\236\320\272\320\275\320\276"] ::msgcat::mcset sk "Window" [encoding convertfrom utf-8 "Okno"] ::msgcat::mcset sq "Window" [encoding convertfrom utf-8 "dritarja"] ::msgcat::mcset bg "Quit" [encoding convertfrom utf-8 "\320\230\320\267\321\205\320\276\320\264"] ::msgcat::mcset cz "Quit" [encoding convertfrom utf-8 "Konec"] ::msgcat::mcset de "Quit" [encoding convertfrom utf-8 "Beenden"] ::msgcat::mcset el "Quit" [encoding convertfrom utf-8 "\316\210\316\276\316\277\316\264\316\277\317\202"] ::msgcat::mcset en "Quit" [encoding convertfrom utf-8 "Quit"] ::msgcat::mcset es "Quit" [encoding convertfrom utf-8 "Salir"] ::msgcat::mcset it "Quit" [encoding convertfrom utf-8 "Esci"] ::msgcat::mcset ru "Quit" [encoding convertfrom utf-8 "\320\222\321\213\321\205\320\276\320\264"] ::msgcat::mcset sk "Quit" [encoding convertfrom utf-8 "Ukon\304\215i\305\245"] ::msgcat::mcset sq "Quit" [encoding convertfrom utf-8 "mbylle"] ::msgcat::mcset bg "Help" [encoding convertfrom utf-8 "\320\237\320\276\320\274\320\276\321\211"] ::msgcat::mcset cz "Help" [encoding convertfrom utf-8 "N\303\241pov\304\233da"] ::msgcat::mcset de "Help" [encoding convertfrom utf-8 "Hilfe"] ::msgcat::mcset el "Help" [encoding convertfrom utf-8 "\316\222\316\277\316\256\316\270\316\265\316\271\316\261"] ::msgcat::mcset en "Help" [encoding convertfrom utf-8 "Help"] ::msgcat::mcset es "Help" [encoding convertfrom utf-8 "Ayuda"] ::msgcat::mcset it "Help" [encoding convertfrom utf-8 "Aiuto"] ::msgcat::mcset ru "Help" [encoding convertfrom utf-8 "\320\237\320\276\320\274\320\276\321\211\321\214"] ::msgcat::mcset sk "Help" [encoding convertfrom utf-8 "Pomoc"] ::msgcat::mcset sq "Help" [encoding convertfrom utf-8 "ndihma"] ::msgcat::mcset bg "BAC calculator" [encoding convertfrom utf-8 "\320\220\320\273\320\272\320\276\321\205\320\276\320\273\320\265\320\275 \320\272\320\260\320\273\320\272\321\203\320\273\320\260\321\202\320\276\321\200"] ::msgcat::mcset cz "BAC calculator" [encoding convertfrom utf-8 "Alkohol tester"] ::msgcat::mcset de "BAC calculator" [encoding convertfrom utf-8 "Blutalkoholrechner"] ::msgcat::mcset el "BAC calculator" [encoding convertfrom utf-8 "\316\221\316\273\316\272\316\277\317\204\316\255\317\203\317\204"] ::msgcat::mcset en "BAC calculator" [encoding convertfrom utf-8 "BAC calculator"] ::msgcat::mcset es "BAC calculator" [encoding convertfrom utf-8 "Borrach\303\255metro"] ::msgcat::mcset it "BAC calculator" [encoding convertfrom utf-8 "Calcolatore BAC"] ::msgcat::mcset ru "BAC calculator" [encoding convertfrom utf-8 "\320\232\320\260\320\273\321\214\320\272\321\203\320\273\321\217\321\202\320\276\321\200 \320\260\320\273\320\272\320\276\320\263\320\276\320\273\321\217"] ::msgcat::mcset sk "BAC calculator" [encoding convertfrom utf-8 "Alkohol tester"] ::msgcat::mcset sq "BAC calculator" [encoding convertfrom utf-8 "llogaritesi I alkoolit"] ::msgcat::mcset bg "Biometric data" [encoding convertfrom utf-8 "\320\221\320\270\320\276\320\274\320\265\321\202\321\200\320\270\321\207\320\275\320\270 \320\264\320\260\320\275\320\275\320\270"] ::msgcat::mcset cz "Biometric data" [encoding convertfrom utf-8 "Biometrick\303\251 \303\272daje"] ::msgcat::mcset de "Biometric data" [encoding convertfrom utf-8 "Pers\303\266nliche Angaben"] ::msgcat::mcset el "Biometric data" [encoding convertfrom utf-8 "\316\222\316\271\316\277\316\274\316\265\317\204\317\201\316\271\316\272\316\254 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\316\261"] ::msgcat::mcset en "Biometric data" [encoding convertfrom utf-8 "Biometric data"] ::msgcat::mcset es "Biometric data" [encoding convertfrom utf-8 "Datos biom\303\251tricos"] ::msgcat::mcset it "Biometric data" [encoding convertfrom utf-8 "Dati biometrici"] ::msgcat::mcset ru "Biometric data" [encoding convertfrom utf-8 "\320\221\320\270\320\276\320\274\320\265\321\202\321\200\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\264\320\260\320\275\320\275\321\213\320\265"] ::msgcat::mcset sk "Biometric data" [encoding convertfrom utf-8 "Biometrick\303\251 \303\272daje"] ::msgcat::mcset sq "Biometric data" [encoding convertfrom utf-8 "shenimet biometrike"] ::msgcat::mcset bg "age" [encoding convertfrom utf-8 "\320\222\321\212\320\267\321\200\320\260\321\201\321\202"] ::msgcat::mcset cz "age" [encoding convertfrom utf-8 "v\304\233k"] ::msgcat::mcset de "age" [encoding convertfrom utf-8 "Alter"] ::msgcat::mcset el "age" [encoding convertfrom utf-8 "\316\267\316\273\316\271\316\272\316\257\316\261"] ::msgcat::mcset en "age" [encoding convertfrom utf-8 "age"] ::msgcat::mcset es "age" [encoding convertfrom utf-8 "edad"] ::msgcat::mcset it "age" [encoding convertfrom utf-8 "et\303\240"] ::msgcat::mcset ru "age" [encoding convertfrom utf-8 "\320\222\320\276\320\267\321\200\320\260\321\201\321\202"] ::msgcat::mcset sk "age" [encoding convertfrom utf-8 "vek"] ::msgcat::mcset sq "age" [encoding convertfrom utf-8 "mosha"] ::msgcat::mcset bg "years" [encoding convertfrom utf-8 "\320\223\320\276\320\264\320\270\320\275\320\270"] ::msgcat::mcset cz "years" [encoding convertfrom utf-8 "let"] ::msgcat::mcset de "years" [encoding convertfrom utf-8 "Jahre"] ::msgcat::mcset el "years" [encoding convertfrom utf-8 "\316\255\317\204\316\267"] ::msgcat::mcset en "years" [encoding convertfrom utf-8 "years"] ::msgcat::mcset es "years" [encoding convertfrom utf-8 "a\303\261os"] ::msgcat::mcset it "years" [encoding convertfrom utf-8 "anni"] ::msgcat::mcset ru "years" [encoding convertfrom utf-8 "\320\273\320\265\321\202"] ::msgcat::mcset sk "years" [encoding convertfrom utf-8 "rokov"] ::msgcat::mcset sq "years" [encoding convertfrom utf-8 "vitet"] ::msgcat::mcset bg "gender" [encoding convertfrom utf-8 "\320\237\320\276\320\273"] ::msgcat::mcset cz "gender" [encoding convertfrom utf-8 "pohlav\303\255"] ::msgcat::mcset de "gender" [encoding convertfrom utf-8 "Geschlecht"] ::msgcat::mcset el "gender" [encoding convertfrom utf-8 "\317\206\317\215\316\273\316\277"] ::msgcat::mcset en "gender" [encoding convertfrom utf-8 "gender"] ::msgcat::mcset es "gender" [encoding convertfrom utf-8 "sexo"] ::msgcat::mcset it "gender" [encoding convertfrom utf-8 "sesso"] ::msgcat::mcset ru "gender" [encoding convertfrom utf-8 "\320\237\320\276\320\273"] ::msgcat::mcset sk "gender" [encoding convertfrom utf-8 "pohlavie"] ::msgcat::mcset sq "gender" [encoding convertfrom utf-8 "gjinia"] ::msgcat::mcset bg "male" [encoding convertfrom utf-8 "\320\234\321\212\320\266"] ::msgcat::mcset cz "male" [encoding convertfrom utf-8 "mu\305\276"] ::msgcat::mcset de "male" [encoding convertfrom utf-8 "m\303\244nnlich"] ::msgcat::mcset el "male" [encoding convertfrom utf-8 "\316\261\317\201\317\203\316\265\316\275\316\271\316\272\317\214"] ::msgcat::mcset en "male" [encoding convertfrom utf-8 "male"] ::msgcat::mcset es "male" [encoding convertfrom utf-8 "hombre"] ::msgcat::mcset it "male" [encoding convertfrom utf-8 "maschio"] ::msgcat::mcset ru "male" [encoding convertfrom utf-8 "\320\274\321\203\320\266\321\207\320\270\320\275\320\260"] ::msgcat::mcset sk "male" [encoding convertfrom utf-8 "mu\305\276"] ::msgcat::mcset sq "male" [encoding convertfrom utf-8 "mashkull"] ::msgcat::mcset bg "female" [encoding convertfrom utf-8 "\320\226\320\265\320\275\320\260"] ::msgcat::mcset cz "female" [encoding convertfrom utf-8 "\305\276ena"] ::msgcat::mcset de "female" [encoding convertfrom utf-8 "weiblich"] ::msgcat::mcset el "female" [encoding convertfrom utf-8 "\316\270\317\205\316\273\316\271\316\272\317\214"] ::msgcat::mcset en "female" [encoding convertfrom utf-8 "female"] ::msgcat::mcset es "female" [encoding convertfrom utf-8 "mujer"] ::msgcat::mcset it "female" [encoding convertfrom utf-8 "femmina"] ::msgcat::mcset ru "female" [encoding convertfrom utf-8 "\320\266\320\265\320\275\321\211\320\270\320\275\320\260"] ::msgcat::mcset sk "female" [encoding convertfrom utf-8 "\305\276ena"] ::msgcat::mcset sq "female" [encoding convertfrom utf-8 "femer"] ::msgcat::mcset bg "height" [encoding convertfrom utf-8 "\320\240\321\212\321\201\321\202"] ::msgcat::mcset cz "height" [encoding convertfrom utf-8 "v\303\275\305\241ka"] ::msgcat::mcset de "height" [encoding convertfrom utf-8 "Gr\303\266\303\237e"] ::msgcat::mcset el "height" [encoding convertfrom utf-8 "\317\215\317\210\316\277\317\202"] ::msgcat::mcset en "height" [encoding convertfrom utf-8 "height"] ::msgcat::mcset es "height" [encoding convertfrom utf-8 "altura"] ::msgcat::mcset it "height" [encoding convertfrom utf-8 "altezza"] ::msgcat::mcset ru "height" [encoding convertfrom utf-8 "\320\240\320\276\321\201\321\202"] ::msgcat::mcset sk "height" [encoding convertfrom utf-8 "v\303\275\305\241ka"] ::msgcat::mcset sq "height" [encoding convertfrom utf-8 "gjatesia"] ::msgcat::mcset bg "weight" [encoding convertfrom utf-8 "\320\242\320\265\320\263\320\273\320\276"] ::msgcat::mcset cz "weight" [encoding convertfrom utf-8 "v\303\241ha"] ::msgcat::mcset de "weight" [encoding convertfrom utf-8 "Gewicht"] ::msgcat::mcset el "weight" [encoding convertfrom utf-8 "\316\262\316\254\317\201\316\277\317\202"] ::msgcat::mcset en "weight" [encoding convertfrom utf-8 "weight"] ::msgcat::mcset es "weight" [encoding convertfrom utf-8 "peso"] ::msgcat::mcset it "weight" [encoding convertfrom utf-8 "peso"] ::msgcat::mcset ru "weight" [encoding convertfrom utf-8 "\320\222\320\265\321\201"] ::msgcat::mcset sk "weight" [encoding convertfrom utf-8 "v\303\241ha"] ::msgcat::mcset sq "weight" [encoding convertfrom utf-8 "pesha"] ::msgcat::mcset bg "Consumption data" [encoding convertfrom utf-8 "\320\232\320\260\320\272\320\262\320\276 \321\201\321\202\320\265 \320\277\320\270\320\273\320\270"] ::msgcat::mcset cz "Consumption data" [encoding convertfrom utf-8 "\303\232daje o spot\305\231eb\304\233"] ::msgcat::mcset de "Consumption data" [encoding convertfrom utf-8 "Alkoholkonsum"] ::msgcat::mcset el "Consumption data" [encoding convertfrom utf-8 "\316\224\316\265\316\264\316\277\316\274\316\255\316\275\316\261 \316\272\316\261\317\204\316\261\316\275\316\254\316\273\317\211\317\203\316\267\317\202"] ::msgcat::mcset en "Consumption data" [encoding convertfrom utf-8 "Consumption data"] ::msgcat::mcset es "Consumption data" [encoding convertfrom utf-8 "Datos de ingesti\303\263n"] ::msgcat::mcset it "Consumption data" [encoding convertfrom utf-8 "Bevande assunte"] ::msgcat::mcset ru "Consumption data" [encoding convertfrom utf-8 "\320\245\320\260\321\200\320\260\320\272\321\202\320\265\321\200\320\270\321\201\321\202\320\270\320\272\320\260 \320\277\321\200\320\270\320\275\321\217\321\202\320\276\320\263\320\276"] ::msgcat::mcset sk "Consumption data" [encoding convertfrom utf-8 "\303\232daje o spotrebe"] ::msgcat::mcset sq "Consumption data" [encoding convertfrom utf-8 "shenimet e hargjimeve"] ::msgcat::mcset bg "volume" [encoding convertfrom utf-8 "\320\232\320\276\320\273\320\270\321\207\320\265\321\201\321\202\320\262\320\276"] ::msgcat::mcset cz "volume" [encoding convertfrom utf-8 "objem"] ::msgcat::mcset de "volume" [encoding convertfrom utf-8 "Menge"] ::msgcat::mcset el "volume" [encoding convertfrom utf-8 "\317\214\316\263\316\272\316\277\317\202"] ::msgcat::mcset en "volume" [encoding convertfrom utf-8 "volume"] ::msgcat::mcset es "volume" [encoding convertfrom utf-8 "volumen"] ::msgcat::mcset it "volume" [encoding convertfrom utf-8 "volume"] ::msgcat::mcset ru "volume" [encoding convertfrom utf-8 "\320\236\320\261\321\212\320\265\320\274"] ::msgcat::mcset sk "volume" [encoding convertfrom utf-8 "objem"] ::msgcat::mcset sq "volume" [encoding convertfrom utf-8 "volumi"] ::msgcat::mcset bg "alcohol level" [encoding convertfrom utf-8 "\320\232\320\276\320\275\321\206\320\265\320\275\321\202\321\200\320\260\321\206\320\270\321\217"] ::msgcat::mcset cz "alcohol level" [encoding convertfrom utf-8 "koncentrace alkoholu"] ::msgcat::mcset de "alcohol level" [encoding convertfrom utf-8 "Alkoholgehalt"] ::msgcat::mcset el "alcohol level" [encoding convertfrom utf-8 "\317\200\316\265\317\201\316\271\316\265\316\272\317\204\316\271\316\272\317\214\317\204\316\267\317\204\316\261 \317\203\316\265 \316\261\316\273\316\272\316\277\317\214\316\273"] ::msgcat::mcset en "alcohol level" [encoding convertfrom utf-8 "alcohol level"] ::msgcat::mcset es "alcohol level" [encoding convertfrom utf-8 "contenido alcoh\303\263lico"] ::msgcat::mcset it "alcohol level" [encoding convertfrom utf-8 "tasso alcolico"] ::msgcat::mcset ru "alcohol level" [encoding convertfrom utf-8 "\320\232\321\200\320\265\320\277\320\276\321\201\321\202\321\214"] ::msgcat::mcset sk "alcohol level" [encoding convertfrom utf-8 "koncentr\303\241cia"] ::msgcat::mcset sq "alcohol level" [encoding convertfrom utf-8 "sasia e alkoolit"] ::msgcat::mcset bg "time elapsed" [encoding convertfrom utf-8 "\320\234\320\270\320\275\320\260\320\273\320\276 \320\262\321\200\320\265\320\274\320\265"] ::msgcat::mcset cz "time elapsed" [encoding convertfrom utf-8 "uplynul\303\275 \304\215as"] ::msgcat::mcset de "time elapsed" [encoding convertfrom utf-8 "vergangene Zeit"] ::msgcat::mcset el "time elapsed" [encoding convertfrom utf-8 "\317\216\317\201\316\261 \317\200\316\277\317\205 \317\200\316\255\317\201\316\261\317\203\316\265"] ::msgcat::mcset en "time elapsed" [encoding convertfrom utf-8 "time elapsed"] ::msgcat::mcset es "time elapsed" [encoding convertfrom utf-8 "tiempo transcurrido"] ::msgcat::mcset it "time elapsed" [encoding convertfrom utf-8 "tempo trascorso"] ::msgcat::mcset ru "time elapsed" [encoding convertfrom utf-8 "\320\237\321\200\320\276\321\210\320\273\320\276 \320\262\321\200\320\265\320\274\320\265\320\275\320\270"] ::msgcat::mcset sk "time elapsed" [encoding convertfrom utf-8 "uplynut\303\275 \304\215as"] ::msgcat::mcset sq "time elapsed" [encoding convertfrom utf-8 "koha e duhur"] ::msgcat::mcset bg "Calculate" [encoding convertfrom utf-8 "\320\230\320\267\321\207\320\270\321\201\320\273\320\270"] ::msgcat::mcset cz "Calculate" [encoding convertfrom utf-8 "Vypo\304\215\303\255tat"] ::msgcat::mcset de "Calculate" [encoding convertfrom utf-8 "Berechne"] ::msgcat::mcset el "Calculate" [encoding convertfrom utf-8 "\317\205\317\200\316\277\316\273\316\277\316\263\316\271\317\203\316\274\317\214\317\202"] ::msgcat::mcset en "Calculate" [encoding convertfrom utf-8 "Calculate"] ::msgcat::mcset es "Calculate" [encoding convertfrom utf-8 "Calcular"] ::msgcat::mcset it "Calculate" [encoding convertfrom utf-8 "Calcola"] ::msgcat::mcset ru "Calculate" [encoding convertfrom utf-8 "\320\237\320\276\321\201\321\207\320\270\321\202\320\260\321\202\321\214"] ::msgcat::mcset sk "Calculate" [encoding convertfrom utf-8 "Vypo\304\215\303\255ta\305\245"] ::msgcat::mcset sq "Calculate" [encoding convertfrom utf-8 "llogarit"] ::msgcat::mcset bg "BAC" [encoding convertfrom utf-8 "\320\235\320\260\320\273\320\270\321\207\320\270\320\265 \320\275\320\260 \320\260\320\273\320\272\320\276\321\205\320\276\320\273 \320\262 \320\272\321\200\321\212\320\262\321\202\320\260"] ::msgcat::mcset cz "BAC" [encoding convertfrom utf-8 "Hladina alkoholu v krvi"] ::msgcat::mcset de "BAC" [encoding convertfrom utf-8 "Blutalkoholpegel"] ::msgcat::mcset el "BAC" [encoding convertfrom utf-8 "\316\240\316\265\317\201\316\271\316\265\316\272\317\204\316\271\316\272\317\214\317\204\316\267\317\204\316\261 \316\261\316\257\316\274\316\261\317\204\316\277\317\202 \317\203\316\265 \316\261\316\273\316\272\316\277\317\214\316\273"] ::msgcat::mcset en "BAC" [encoding convertfrom utf-8 "BAC"] ::msgcat::mcset es "BAC" [encoding convertfrom utf-8 "tasa alcoholemia"] ::msgcat::mcset it "BAC" [encoding convertfrom utf-8 "BAC"] ::msgcat::mcset ru "BAC" [encoding convertfrom utf-8 "BAC"] ::msgcat::mcset sk "BAC" [encoding convertfrom utf-8 "Hladina alkoholu"] ::msgcat::mcset sq "BAC" [encoding convertfrom utf-8 "perqindja e alkoolit ne gjak-BAC"] ::msgcat::mcset bg "ETA" [encoding convertfrom utf-8 "\320\222\321\200\320\265\320\274\320\265 \320\264\320\276 \320\270\320\267\321\202\321\200\320\265\320\267\320\275\321\217\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "ETA" [encoding convertfrom utf-8 "\304\214as do vyst\305\231\303\255zliv\304\233n\303\255"] ::msgcat::mcset el "ETA" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\274\316\265\316\275\317\214\316\274\316\265\316\275\316\267 \317\216\317\201\316\261 \316\254\317\206\316\271\316\276\316\267\317\202"] ::msgcat::mcset en "ETA" [encoding convertfrom utf-8 "ETA"] ::msgcat::mcset es "ETA" [encoding convertfrom utf-8 "TBE (Tiempo Bajada Estimado)"] ::msgcat::mcset it "ETA" [encoding convertfrom utf-8 "ETA"] ::msgcat::mcset ru "ETA" [encoding convertfrom utf-8 "ETA"] ::msgcat::mcset sk "ETA" [encoding convertfrom utf-8 "\304\214as do vytriezvenia"] ::msgcat::mcset sq "ETA" [encoding convertfrom utf-8 "ETA"] ::msgcat::mcset bg "hours" [encoding convertfrom utf-8 "\321\207\320\260\321\201\320\276\320\262\320\265"] ::msgcat::mcset cz "hours" [encoding convertfrom utf-8 "hodin"] ::msgcat::mcset de "hours" [encoding convertfrom utf-8 "Stunden"] ::msgcat::mcset el "hours" [encoding convertfrom utf-8 "\317\216\317\201\316\265\317\202"] ::msgcat::mcset en "hours" [encoding convertfrom utf-8 "hours"] ::msgcat::mcset es "hours" [encoding convertfrom utf-8 "horas"] ::msgcat::mcset it "hours" [encoding convertfrom utf-8 "ore"] ::msgcat::mcset ru "hours" [encoding convertfrom utf-8 "\321\207\320\260\321\201\320\276\320\262"] ::msgcat::mcset sk "hours" [encoding convertfrom utf-8 "hod\303\255n"] ::msgcat::mcset sq "hours" [encoding convertfrom utf-8 "oret"] ::msgcat::mcset bg "MRR" [encoding convertfrom utf-8 "MRR"] ::msgcat::mcset cz "MRR" [encoding convertfrom utf-8 "Rychlost odbour\303\241v\303\241n\303\255"] ::msgcat::mcset el "MRR" [encoding convertfrom utf-8 "MRR"] ::msgcat::mcset en "MRR" [encoding convertfrom utf-8 "MRR"] ::msgcat::mcset es "MRR" [encoding convertfrom utf-8 "tasa de descenso"] ::msgcat::mcset it "MRR" [encoding convertfrom utf-8 "MRR"] ::msgcat::mcset ru "MRR" [encoding convertfrom utf-8 "MRR"] ::msgcat::mcset sk "MRR" [encoding convertfrom utf-8 "R\303\275chlos\305\245 odbur\303\241vania"] ::msgcat::mcset sq "MRR" [encoding convertfrom utf-8 "MRR"] ::msgcat::mcset bg "Compiler" [encoding convertfrom utf-8 "\320\232\320\276\320\274\320\277\320\270\320\273\320\260\321\202\320\276\321\200"] ::msgcat::mcset cz "Compiler" [encoding convertfrom utf-8 "Kompil\303\241tor"] ::msgcat::mcset de "Compiler" [encoding convertfrom utf-8 "Compiler"] ::msgcat::mcset el "Compiler" [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\254\316\272\317\204\316\267\317\202"] ::msgcat::mcset en "Compiler" [encoding convertfrom utf-8 "Compiler"] ::msgcat::mcset es "Compiler" [encoding convertfrom utf-8 "Compilador"] ::msgcat::mcset it "Compiler" [encoding convertfrom utf-8 "Compilatore"] ::msgcat::mcset ru "Compiler" [encoding convertfrom utf-8 "\320\232\320\276\320\274\320\277\320\270\320\273\321\217\321\202\320\276\321\200"] ::msgcat::mcset sk "Compiler" [encoding convertfrom utf-8 "Kompil\303\241tor"] ::msgcat::mcset sq "Compiler" [encoding convertfrom utf-8 "kompilatori"] ::msgcat::mcset bg "Settings" [encoding convertfrom utf-8 "\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270"] ::msgcat::mcset cz "Settings" [encoding convertfrom utf-8 "Nastaven\303\255"] ::msgcat::mcset de "Settings" [encoding convertfrom utf-8 "Einstellungen"] ::msgcat::mcset el "Settings" [encoding convertfrom utf-8 "\316\241\317\205\316\270\316\274\316\257\317\203\316\265\316\271\317\202"] ::msgcat::mcset en "Settings" [encoding convertfrom utf-8 "Settings"] ::msgcat::mcset es "Settings" [encoding convertfrom utf-8 "Ajustes"] ::msgcat::mcset it "Settings" [encoding convertfrom utf-8 "Impostazioni"] ::msgcat::mcset ru "Settings" [encoding convertfrom utf-8 "\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270"] ::msgcat::mcset sk "Settings" [encoding convertfrom utf-8 "Nastavenia"] ::msgcat::mcset sq "Settings" [encoding convertfrom utf-8 "setingu"] ::msgcat::mcset bg "Survey structure" [encoding convertfrom utf-8 "\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\321\202\320\260"] ::msgcat::mcset cz "Survey structure" [encoding convertfrom utf-8 "Struktura m\304\233\305\231en\303\255 (survey)"] ::msgcat::mcset de "Survey structure" [encoding convertfrom utf-8 "Messdatenstruktur"] ::msgcat::mcset el "Survey structure" [encoding convertfrom utf-8 "\316\224\316\277\316\274\316\256 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "Survey structure" [encoding convertfrom utf-8 "Survey structure"] ::msgcat::mcset es "Survey structure" [encoding convertfrom utf-8 "Estructura de la poligonal"] ::msgcat::mcset it "Survey structure" [encoding convertfrom utf-8 "Struttura rilievi"] ::msgcat::mcset ru "Survey structure" [encoding convertfrom utf-8 "\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260 \321\201\321\212\320\265\320\274\320\272\320\270"] ::msgcat::mcset sk "Survey structure" [encoding convertfrom utf-8 "\305\240trukt\303\272ra d\303\241t"] ::msgcat::mcset sq "Survey structure" [encoding convertfrom utf-8 "struktura e matjeve"] ::msgcat::mcset bg "Survey info" [encoding convertfrom utf-8 "\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217"] ::msgcat::mcset cz "Survey info" [encoding convertfrom utf-8 "Info o m\304\233\305\231en\303\255 (survey)"] ::msgcat::mcset de "Survey info" [encoding convertfrom utf-8 "Infos zur Vermessung"] ::msgcat::mcset el "Survey info" [encoding convertfrom utf-8 "\316\240\316\273\316\267\317\201\316\277\317\206\316\277\317\201\316\257\316\265\317\202 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "Survey info" [encoding convertfrom utf-8 "Survey info"] ::msgcat::mcset es "Survey info" [encoding convertfrom utf-8 "Informaci\303\263n de la poligonal"] ::msgcat::mcset it "Survey info" [encoding convertfrom utf-8 "Informazioni rilievi"] ::msgcat::mcset ru "Survey info" [encoding convertfrom utf-8 "\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217"] ::msgcat::mcset sk "Survey info" [encoding convertfrom utf-8 "Inform\303\241cie"] ::msgcat::mcset sq "Survey info" [encoding convertfrom utf-8 "informatat e matjeve"] ::msgcat::mcset bg "Map structure" [encoding convertfrom utf-8 "\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260 \320\275\320\260 \320\272\320\260\321\200\321\202\320\260\321\202\320\260"] ::msgcat::mcset cz "Map structure" [encoding convertfrom utf-8 "Mapov\303\241 struktura"] ::msgcat::mcset de "Map structure" [encoding convertfrom utf-8 "Planstruktur"] ::msgcat::mcset el "Map structure" [encoding convertfrom utf-8 "\316\224\316\277\316\274\316\256 \316\261\317\200\316\277\317\204\317\215\317\200\317\211\317\203\316\267\317\202"] ::msgcat::mcset en "Map structure" [encoding convertfrom utf-8 "Map structure"] ::msgcat::mcset es "Map structure" [encoding convertfrom utf-8 "Estructura del mapa"] ::msgcat::mcset it "Map structure" [encoding convertfrom utf-8 "Struttura mappe"] ::msgcat::mcset ru "Map structure" [encoding convertfrom utf-8 "\320\241\321\202\321\200\321\203\320\272\321\202\321\203\321\200\320\260 \320\272\320\260\321\200\321\202\321\213"] ::msgcat::mcset sk "Map structure" [encoding convertfrom utf-8 "Mapov\303\241 \305\241trukt\303\272ra"] ::msgcat::mcset sq "Map structure" [encoding convertfrom utf-8 "struktura e hartes"] ::msgcat::mcset bg "Preview" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\264\320\262\320\260\321\200\320\270\321\202\320\265\320\273\320\265\320\275 \320\270\320\267\320\263\320\273\320\265\320\264"] ::msgcat::mcset cz "Preview" [encoding convertfrom utf-8 "N\303\241hled"] ::msgcat::mcset de "Preview" [encoding convertfrom utf-8 "Vorschau"] ::msgcat::mcset el "Preview" [encoding convertfrom utf-8 "\316\240\317\201\316\277\316\265\317\200\316\271\317\203\316\272\317\214\317\200\316\267\317\203\316\267"] ::msgcat::mcset it "Preview" [encoding convertfrom utf-8 "Anteprima"] ::msgcat::mcset ru "Preview" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\264\320\277\321\200\320\276\321\201\320\274\320\276\321\202\321\200"] ::msgcat::mcset sk "Preview" [encoding convertfrom utf-8 "N\303\241h\304\276ad"] ::msgcat::mcset sq "Preview" [encoding convertfrom utf-8 "parashiqimi"] ::msgcat::mcset bg "Working directory" [encoding convertfrom utf-8 "\320\240\320\260\320\261\320\276\321\202\320\275\320\260 \320\264\320\270\321\200\320\265\320\272\321\202\320\276\321\200\320\270\321\217"] ::msgcat::mcset cz "Working directory" [encoding convertfrom utf-8 "Pracovn\303\255 adres\303\241\305\231"] ::msgcat::mcset de "Working directory" [encoding convertfrom utf-8 "Arbeitsverzeichnis"] ::msgcat::mcset el "Working directory" [encoding convertfrom utf-8 "\316\246\316\254\316\272\316\265\316\273\316\277\317\202 \316\265\317\201\316\263\316\261\317\203\316\257\316\261\317\202"] ::msgcat::mcset en "Working directory" [encoding convertfrom utf-8 "Working directory"] ::msgcat::mcset es "Working directory" [encoding convertfrom utf-8 "Directorio actual"] ::msgcat::mcset it "Working directory" [encoding convertfrom utf-8 "Cartella di lavoro"] ::msgcat::mcset ru "Working directory" [encoding convertfrom utf-8 "\320\240\320\260\320\261\320\276\321\207\320\270\320\271 \320\272\320\260\321\202\320\260\320\273\320\276\320\263"] ::msgcat::mcset sk "Working directory" [encoding convertfrom utf-8 "Pracovn\303\275 adres\303\241r"] ::msgcat::mcset sq "Working directory" [encoding convertfrom utf-8 "direktorati i punes"] ::msgcat::mcset bg "Working directory path." [encoding convertfrom utf-8 "\320\237\321\212\321\202 \320\272\321\212\320\274 \321\200\320\260\320\261\320\276\321\202\320\275\320\260\321\202\320\260 \320\264\320\270\321\200\320\265\320\272\321\202\320\276\321\200\320\270\321\217"] ::msgcat::mcset cz "Working directory path." [encoding convertfrom utf-8 "Cesta k pracovn\303\255mu adres\303\241\305\231i."] ::msgcat::mcset de "Working directory path." [encoding convertfrom utf-8 "Pfad zum Arbeitsverzeichnis."] ::msgcat::mcset el "Working directory path." [encoding convertfrom utf-8 "\316\246\316\254\316\272\316\265\316\273\316\277\317\202 \316\265\317\201\316\263\316\261\317\203\316\257\316\261\317\202"] ::msgcat::mcset en "Working directory path." [encoding convertfrom utf-8 "Shows working directory path."] ::msgcat::mcset es "Working directory path." [encoding convertfrom utf-8 "Muestra el directorio actual."] ::msgcat::mcset it "Working directory path." [encoding convertfrom utf-8 "Path della cartella di lavoro"] ::msgcat::mcset ru "Working directory path." [encoding convertfrom utf-8 "\320\237\321\203\321\202\321\214 \320\272 \321\200\320\260\320\261\320\276\321\207\320\265\320\274\321\203 \320\272\320\260\321\202\320\260\320\273\320\276\320\263\321\203."] ::msgcat::mcset sk "Working directory path." [encoding convertfrom utf-8 "Cesta k pracovn\303\251mu adres\303\241ru."] ::msgcat::mcset sq "Working directory path." [encoding convertfrom utf-8 "tregon shtegun e direktoratit punues"] ::msgcat::mcset bg "Configuration file" [encoding convertfrom utf-8 "\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\276\320\275\320\265\320\275 \321\204\320\260\320\271\320\273"] ::msgcat::mcset cz "Configuration file" [encoding convertfrom utf-8 "Konfigura\304\215n\303\255 soubor"] ::msgcat::mcset de "Configuration file" [encoding convertfrom utf-8 "Konfigurationsdatei"] ::msgcat::mcset el "Configuration file" [encoding convertfrom utf-8 "\316\221\317\201\317\207\316\265\316\257\316\277 \317\203\317\207\316\267\316\274\316\261\317\204\316\271\317\203\316\274\316\277\317\215 (config)"] ::msgcat::mcset en "Configuration file" [encoding convertfrom utf-8 "Configuration file"] ::msgcat::mcset es "Configuration file" [encoding convertfrom utf-8 "Archivo configuraci\303\263n"] ::msgcat::mcset it "Configuration file" [encoding convertfrom utf-8 "File di configurazione"] ::msgcat::mcset ru "Configuration file" [encoding convertfrom utf-8 "\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\271 \321\204\320\260\320\271\320\273"] ::msgcat::mcset sk "Configuration file" [encoding convertfrom utf-8 "Konfigura\304\215n\303\275 s\303\272bor"] ::msgcat::mcset sq "Configuration file" [encoding convertfrom utf-8 "arkivi I konfiguracionit"] ::msgcat::mcset bg "Configuration file name." [encoding convertfrom utf-8 "\320\230\320\274\320\265 \320\275\320\260 \320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\276\320\275\320\275\320\270\321\217\321\202 \321\204\320\260\320\271\320\273"] ::msgcat::mcset cz "Configuration file name." [encoding convertfrom utf-8 "Jm\303\251no konfigura\304\215n\303\255ho souboru."] ::msgcat::mcset de "Configuration file name." [encoding convertfrom utf-8 "Name der Konfigurationsdatei."] ::msgcat::mcset el "Configuration file name." [encoding convertfrom utf-8 "\316\225\316\274\317\206\316\261\316\275\316\257\316\266\316\265\316\271 \317\204\316\277 \317\214\316\275\316\277\316\274\316\261 \317\204\316\277\317\205 \316\261\317\201\317\207\316\265\316\257\316\277\317\205 \317\203\317\207\316\267\316\274\316\261\317\204\316\271\317\203\316\274\316\277\317\215 (config)"] ::msgcat::mcset en "Configuration file name." [encoding convertfrom utf-8 "Shows configuration file name."] ::msgcat::mcset es "Configuration file name." [encoding convertfrom utf-8 "Muestra el nombre del archivo de configuraci\303\263n."] ::msgcat::mcset it "Configuration file name." [encoding convertfrom utf-8 "Nome del file di configurazione"] ::msgcat::mcset ru "Configuration file name." [encoding convertfrom utf-8 "\320\230\320\274\321\217 \320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\263\320\276 \321\204\320\260\320\271\320\273\320\260."] ::msgcat::mcset sk "Configuration file name." [encoding convertfrom utf-8 "Meno konfigura\304\215n\303\251ho s\303\272boru."] ::msgcat::mcset sq "Configuration file name." [encoding convertfrom utf-8 "tregon emrin e arkivit te konfiguracionit"] ::msgcat::mcset bg "Command line options" [encoding convertfrom utf-8 "\320\236\320\277\321\206\320\270\320\270 \320\275\320\260 \320\272\320\276\320\274\320\260\320\275\320\264\320\275\320\270\321\217\321\202 \321\200\320\265\320\264"] ::msgcat::mcset cz "Command line options" [encoding convertfrom utf-8 "Argumenty programu"] ::msgcat::mcset de "Command line options" [encoding convertfrom utf-8 "Kommandozeilenoptionen"] ::msgcat::mcset el "Command line options" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \316\265\316\275\317\204\316\277\316\273\316\256\317\202"] ::msgcat::mcset en "Command line options" [encoding convertfrom utf-8 "Command line options"] ::msgcat::mcset es "Command line options" [encoding convertfrom utf-8 "Opciones de l\303\255nea de comandos"] ::msgcat::mcset it "Command line options" [encoding convertfrom utf-8 "Opzioni del comando"] ::msgcat::mcset ru "Command line options" [encoding convertfrom utf-8 "\320\236\320\277\321\206\320\270\320\270 \320\272\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271 \321\201\321\202\321\200\320\276\320\272\320\270"] ::msgcat::mcset sk "Command line options" [encoding convertfrom utf-8 "Argumenty programu"] ::msgcat::mcset sq "Command line options" [encoding convertfrom utf-8 "opcionet e vijes komanduese"] ::msgcat::mcset bg "Therion command line options." [encoding convertfrom utf-8 "\320\236\320\277\321\206\320\270\320\270 \320\275\320\260 \320\272\320\276\320\274\320\260\320\275\320\264\320\275\320\270\321\217\321\202 \321\200\320\265\320\264 \320\275\320\260 \320\242\320\265\321\200\320\270\320\276\320\275"] ::msgcat::mcset cz "Therion command line options." [encoding convertfrom utf-8 "Argumenty therionu pro p\305\231\303\255kazovou \305\231\303\241dku."] ::msgcat::mcset de "Therion command line options." [encoding convertfrom utf-8 "Therion Kommandozeilenoptionen."] ::msgcat::mcset el "Therion command line options." [encoding convertfrom utf-8 "\316\225\316\264\317\216 \316\274\317\200\316\277\317\201\316\265\316\257\317\204\316\265 \316\275\316\261 \317\200\316\265\317\201\316\254\317\203\316\265\317\204\316\265 \317\204\316\271\317\202 \316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \316\265\316\275\317\204\316\277\316\273\316\256\317\202 \317\203\317\204\316\277 Therion"] ::msgcat::mcset en "Therion command line options." [encoding convertfrom utf-8 "Here you can pass command line options to Therion."] ::msgcat::mcset es "Therion command line options." [encoding convertfrom utf-8 "Aqu\303\255 se pueden pasar a therion opciones de l\303\255nea de comandos"] ::msgcat::mcset it "Therion command line options." [encoding convertfrom utf-8 "Opzioni del comando therion"] ::msgcat::mcset ru "Therion command line options." [encoding convertfrom utf-8 "\320\236\320\277\321\206\320\270\320\270 \320\272\320\276\320\274\320\260\320\275\320\264\320\275\320\276\320\271 \321\201\321\202\321\200\320\276\320\272\320\270 Therion."] ::msgcat::mcset sk "Therion command line options." [encoding convertfrom utf-8 "Argumenty programu v pr\303\255kazovom riadku."] ::msgcat::mcset sq "Therion command line options." [encoding convertfrom utf-8 "ketu ju mund te bartni vijen komanduese te arkivit tek Therion-i"] ::msgcat::mcset bg "Run therion." [encoding convertfrom utf-8 "\320\237\321\203\321\201\320\272\320\260\320\275\320\265 \320\275\320\260 therion"] ::msgcat::mcset cz "Run therion." [encoding convertfrom utf-8 "Spust\303\255 therion."] ::msgcat::mcset de "Run therion." [encoding convertfrom utf-8 "Therion ausf\303\274hren."] ::msgcat::mcset el "Run therion." [encoding convertfrom utf-8 "\316\225\316\272\317\204\316\255\316\273\316\265\317\203\316\267 \317\204\316\277\317\205 Therion"] ::msgcat::mcset en "Run therion." [encoding convertfrom utf-8 "Run therion."] ::msgcat::mcset es "Run therion." [encoding convertfrom utf-8 "Ejecutar therion."] ::msgcat::mcset it "Run therion." [encoding convertfrom utf-8 "Esegui therion"] ::msgcat::mcset ru "Run therion." [encoding convertfrom utf-8 "\320\227\320\260\320\277\321\203\321\201\320\272 therion."] ::msgcat::mcset sk "Run therion." [encoding convertfrom utf-8 "Spusti\305\245 therion."] ::msgcat::mcset sq "Run therion." [encoding convertfrom utf-8 "aktivizo Therion-in"] ::msgcat::mcset bg "Xpdf" [encoding convertfrom utf-8 "Xpdf"] ::msgcat::mcset cz "Xpdf" [encoding convertfrom utf-8 "Xpdf"] ::msgcat::mcset de "Xpdf" [encoding convertfrom utf-8 "Xpdf"] ::msgcat::mcset it "Xpdf" [encoding convertfrom utf-8 "Xpdf"] ::msgcat::mcset sk "Xpdf" [encoding convertfrom utf-8 "Xpdf"] ::msgcat::mcset sq "Xpdf" [encoding convertfrom utf-8 "Xpdf"] ::msgcat::mcset bg "Acrobat Reader" [encoding convertfrom utf-8 "Acrobat Reader"] ::msgcat::mcset cz "Acrobat Reader" [encoding convertfrom utf-8 "Acrobat Reader"] ::msgcat::mcset de "Acrobat Reader" [encoding convertfrom utf-8 "Acrobat Reader"] ::msgcat::mcset it "Acrobat Reader" [encoding convertfrom utf-8 "Acrobat Reader"] ::msgcat::mcset sk "Acrobat Reader" [encoding convertfrom utf-8 "Acrobat Reader"] ::msgcat::mcset sq "Acrobat Reader" [encoding convertfrom utf-8 "lexuesi I programit-Akrobat"] ::msgcat::mcset bg "PDF file path." [encoding convertfrom utf-8 "\320\237\321\212\321\202 \320\272\321\212\320\274 PDF \321\204\320\260\320\271\320\273"] ::msgcat::mcset cz "PDF file path." [encoding convertfrom utf-8 "Cesta k PDF souboru"] ::msgcat::mcset de "PDF file path." [encoding convertfrom utf-8 "Pfad zur PDF-Datei."] ::msgcat::mcset el "PDF file path." [encoding convertfrom utf-8 "\317\205\317\200\316\277\317\206\316\254\316\272\316\265\316\273\316\277\317\202 \317\204\316\277\317\205 .pdf"] ::msgcat::mcset it "PDF file path." [encoding convertfrom utf-8 "File PDF"] ::msgcat::mcset ru "PDF file path." [encoding convertfrom utf-8 "PDF-\321\204\320\260\320\271\320\273 \320\264\320\273\321\217 \320\277\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\260"] ::msgcat::mcset sk "PDF file path." [encoding convertfrom utf-8 "Cesta k PDF s\303\272boru."] ::msgcat::mcset sq "PDF file path." [encoding convertfrom utf-8 "arkivi-PDF"] ::msgcat::mcset bg "Survey informations." [encoding convertfrom utf-8 "\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217 \320\267\320\260 \320\272\320\260\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\321\202\320\260"] ::msgcat::mcset cz "Survey informations." [encoding convertfrom utf-8 "Informace o jednotliv\303\275ch m\304\233\305\231en\303\255ch (survey)."] ::msgcat::mcset de "Survey informations." [encoding convertfrom utf-8 "Infos zur Vermessung."] ::msgcat::mcset el "Survey informations." [encoding convertfrom utf-8 "\316\243\317\204\316\277\316\271\317\207\316\265\316\257\316\261 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "Survey informations." [encoding convertfrom utf-8 "Survey informations."] ::msgcat::mcset es "Survey informations." [encoding convertfrom utf-8 "Estad\303\255sticas de la poligonal."] ::msgcat::mcset it "Survey informations." [encoding convertfrom utf-8 "Informazioni del rilievo"] ::msgcat::mcset ru "Survey informations." [encoding convertfrom utf-8 "\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217 \320\276 \321\201\321\212\320\265\320\274\320\272\320\265."] ::msgcat::mcset sk "Survey informations." [encoding convertfrom utf-8 "Inform\303\241cie o \304\215astiach."] ::msgcat::mcset sq "Survey informations." [encoding convertfrom utf-8 "informatat e matjeve"] ::msgcat::mcset bg "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\320\237\320\276\321\202\321\200\320\265\320\261\320\270\321\202\320\265\320\273\321\201\320\272\320\270\321\217\321\202 \320\270\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201 \320\265 \320\275\320\265\320\260\320\272\321\202\320\270\320\262\320\265\320\275. \320\227\320\260 \320\264\320\260 \320\263\320\276 \320\260\320\272\321\202\320\270\320\262\320\270\321\200\320\260\321\202\320\265 \320\276\321\202\320\262\320\276\321\200\320\265\321\202\320\265 \321\201\321\212\321\211\320\265\321\201\321\202\320\262\321\203\320\262\320\260\321\211 \321\204\320\260\320\271\320\273 \320\270\320\273\320\270 \321\201\321\212\320\267\320\264\320\260\320\271\321\202\320\265 \320\275\320\276\320\262."] ::msgcat::mcset cz "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "U\305\276ivatelsk\303\251 rozhran\303\255 nen\303\255 aktivn\303\255. Pro jeho aktivaci otev\305\231ete existuj\303\255c\303\255 soubor nebo vytvo\305\231te nov\303\275."] ::msgcat::mcset de "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Fenster nicht aktiv. Um es zu benutzen, \303\266ffne eine existierende Datei oder lege eine neue an."] ::msgcat::mcset el "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\316\224\316\271\316\261\317\203\317\215\316\275\316\264\316\265\317\203\316\267 \317\207\317\201\316\256\317\203\317\204\316\267 \316\261\316\275\316\265\316\275\316\265\317\201\316\263\316\256. \316\223\316\271\316\261 \316\275\316\261 \316\265\316\275\316\265\317\201\316\263\316\277\317\200\316\277\316\271\316\267\316\270\316\265\316\257, \316\261\316\275\316\277\316\257\316\276\317\204\316\265 \317\205\317\200\316\254\317\201\317\207\316\277\316\275 \316\261\317\201\317\207\316\265\316\257\316\277 \316\256 \316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\256\317\203\317\204\316\265 \316\275\316\255\316\277."] ::msgcat::mcset en "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "User interface is not active. To activate it, open existing file or create new one."] ::msgcat::mcset es "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "El interfaz est\303\241 inactivo. Para activarlo, abre un archivo existente o crea uno nuevo."] ::msgcat::mcset it "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "L'interfaccia utente non \303\250 attiva. Per attivarla apri un file o creane uno"] ::msgcat::mcset ru "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\320\230\320\275\321\202\320\265\321\200\321\204\320\265\320\271\321\201 \320\275\320\265\320\260\320\272\321\202\320\270\320\262\320\265\320\275. \320\224\320\273\321\217 \320\260\320\272\321\202\320\270\320\262\320\260\321\206\320\270\320\270 \320\276\321\202\320\272\321\200\320\276\320\271\321\202\320\265 \321\201\321\203\321\211\320\265\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\271 \321\204\320\260\320\271\320\273 \320\270\320\273\320\270 \321\201\320\276\320\267\320\264\320\260\320\271\321\202\320\265 \320\275\320\276\320\262\321\213\320\271."] ::msgcat::mcset sk "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "XTherion moment\303\241lne nie je akt\303\255vny. Otvorte existuj\303\272ci konfigura\304\215n\303\275 s\303\272bor alebo vytvorte nov\303\275."] ::msgcat::mcset sq "User interface is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "interfejsi I perdoruesit nuk eshte aktiv. Ta aktivizosh, hape arkivin egzistues apo hape nje te ri."] ::msgcat::mcset bg "loading compiler..." [encoding convertfrom utf-8 "\320\227\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\272\320\276\320\274\320\277\320\270\320\273\320\260\321\202\320\276\321\200\320\260..."] ::msgcat::mcset cz "loading compiler..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m kompil\303\241tor..."] ::msgcat::mcset de "loading compiler..." [encoding convertfrom utf-8 "Lade Compiler..."] ::msgcat::mcset el "loading compiler..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \317\203\317\205\316\275\317\204\316\254\316\272\317\204\316\267..."] ::msgcat::mcset en "loading compiler..." [encoding convertfrom utf-8 "loading compiler..."] ::msgcat::mcset es "loading compiler..." [encoding convertfrom utf-8 "compilador..."] ::msgcat::mcset it "loading compiler..." [encoding convertfrom utf-8 "compilatore ..."] ::msgcat::mcset ru "loading compiler..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\272\320\276\320\274\320\277\320\270\320\273\321\217\321\202\320\276\321\200\320\260..."] ::msgcat::mcset sk "loading compiler..." [encoding convertfrom utf-8 "kompil\303\241tor..."] ::msgcat::mcset sq "loading compiler..." [encoding convertfrom utf-8 "duke lexuar kompiluesin\342\200\246"] ::msgcat::mcset bg "Running therion ..." [encoding convertfrom utf-8 "\320\241\321\202\320\260\321\200\321\202\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 therion ..."] ::msgcat::mcset cz "Running therion ..." [encoding convertfrom utf-8 "Prob\303\255h\303\241 kompilace ..."] ::msgcat::mcset de "Running therion ..." [encoding convertfrom utf-8 "Therion ausf\303\274hren ..."] ::msgcat::mcset el "Running therion ..." [encoding convertfrom utf-8 "\316\225\316\272\317\204\316\265\316\273\316\265\316\257\317\204\316\261\316\271 \317\204\316\277 Therion"] ::msgcat::mcset en "Running therion ..." [encoding convertfrom utf-8 "Running therion ..."] ::msgcat::mcset es "Running therion ..." [encoding convertfrom utf-8 "Ejecutando therion ..."] ::msgcat::mcset it "Running therion ..." [encoding convertfrom utf-8 "esecuzione therion ..."] ::msgcat::mcset ru "Running therion ..." [encoding convertfrom utf-8 "\320\227\320\260\320\277\321\203\321\201\320\272 therion ..."] ::msgcat::mcset sk "Running therion ..." [encoding convertfrom utf-8 "Prebieha v\303\275po\304\215et..."] ::msgcat::mcset sq "Running therion ..." [encoding convertfrom utf-8 "duke ve ne pune therion-in\342\200\246"] ::msgcat::mcset bg "RUNNING" [encoding convertfrom utf-8 "\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260"] ::msgcat::mcset cz "RUNNING" [encoding convertfrom utf-8 "PRACUJI"] ::msgcat::mcset de "RUNNING" [encoding convertfrom utf-8 "ARBEITE"] ::msgcat::mcset el "RUNNING" [encoding convertfrom utf-8 "\316\225\316\232\316\244\316\225\316\233\316\225\316\243\316\227"] ::msgcat::mcset en "RUNNING" [encoding convertfrom utf-8 "RUNNING"] ::msgcat::mcset es "RUNNING" [encoding convertfrom utf-8 "EJECUTANDO"] ::msgcat::mcset it "RUNNING" [encoding convertfrom utf-8 "ESECUZIONE"] ::msgcat::mcset ru "RUNNING" [encoding convertfrom utf-8 "\320\236\320\221\320\240\320\220\320\221\320\236\320\242\320\232\320\220"] ::msgcat::mcset sk "RUNNING" [encoding convertfrom utf-8 "V\303\235PO\304\214ET"] ::msgcat::mcset sq "RUNNING" [encoding convertfrom utf-8 "ne punim e siper"] ::msgcat::mcset bg "ERROR" [encoding convertfrom utf-8 "\320\223\321\200\320\265\321\210\320\272\320\260"] ::msgcat::mcset cz "ERROR" [encoding convertfrom utf-8 "CHYBA"] ::msgcat::mcset de "ERROR" [encoding convertfrom utf-8 "FEHLER"] ::msgcat::mcset el "ERROR" [encoding convertfrom utf-8 "\316\243\316\246\316\221\316\233\316\234\316\221"] ::msgcat::mcset en "ERROR" [encoding convertfrom utf-8 "ERROR"] ::msgcat::mcset es "ERROR" [encoding convertfrom utf-8 "ERROR"] ::msgcat::mcset it "ERROR" [encoding convertfrom utf-8 "ERRORE"] ::msgcat::mcset ru "ERROR" [encoding convertfrom utf-8 "\320\236\320\250\320\230\320\221\320\232\320\220"] ::msgcat::mcset sk "ERROR" [encoding convertfrom utf-8 "CHYBA"] ::msgcat::mcset sq "ERROR" [encoding convertfrom utf-8 "gabim"] ::msgcat::mcset bg "WARNING" [encoding convertfrom utf-8 "\320\222\320\275\320\270\320\274\320\260\320\275\320\270\320\265!"] ::msgcat::mcset de "WARNING" [encoding convertfrom utf-8 "WARNUNG"] ::msgcat::mcset bg "OK" [encoding convertfrom utf-8 "\320\236\320\232"] ::msgcat::mcset cz "OK" [encoding convertfrom utf-8 "OK"] ::msgcat::mcset de "OK" [encoding convertfrom utf-8 "OK"] ::msgcat::mcset el "OK" [encoding convertfrom utf-8 "\316\237\316\232"] ::msgcat::mcset en "OK" [encoding convertfrom utf-8 "OK"] ::msgcat::mcset es "OK" [encoding convertfrom utf-8 "OK"] ::msgcat::mcset it "OK" [encoding convertfrom utf-8 "OK"] ::msgcat::mcset ru "OK" [encoding convertfrom utf-8 "\320\243\320\241\320\237\320\225\320\245"] ::msgcat::mcset sk "OK" [encoding convertfrom utf-8 "OK"] ::msgcat::mcset sq "OK" [encoding convertfrom utf-8 "ne rregull-O.K."] ::msgcat::mcset bg "Reading therion log file ..." [encoding convertfrom utf-8 "\320\247\320\265\321\202\320\265\320\275\320\265 \320\275\320\260 \320\273\320\276\320\263-\321\204\320\260\320\271\320\273\320\260 \320\275\320\260 therion ..."] ::msgcat::mcset cz "Reading therion log file ..." [encoding convertfrom utf-8 "Na\304\215\303\255t\303\241m LOG soubor therionu ..."] ::msgcat::mcset de "Reading therion log file ..." [encoding convertfrom utf-8 "Lese Therion Logdatei ..."] ::msgcat::mcset el "Reading therion log file ..." [encoding convertfrom utf-8 "\316\221\316\275\316\254\316\263\316\275\317\211\317\203\316\267 \317\204\316\277\317\205 \316\261\317\201\317\207\316\265\316\257\316\277\317\205 log therion"] ::msgcat::mcset en "Reading therion log file ..." [encoding convertfrom utf-8 "Reading therion log file ..."] ::msgcat::mcset es "Reading therion log file ..." [encoding convertfrom utf-8 "Leyendo archivo log ..."] ::msgcat::mcset it "Reading therion log file ..." [encoding convertfrom utf-8 "Lettura file di log di therion ..."] ::msgcat::mcset ru "Reading therion log file ..." [encoding convertfrom utf-8 "\320\247\321\202\320\265\320\275\320\270\320\265 \320\273\320\276\320\263-\321\204\320\260\320\271\320\273\320\260 therion..."] ::msgcat::mcset sk "Reading therion log file ..." [encoding convertfrom utf-8 "Na\304\215it\303\241vam LOG s\303\272bor."] ::msgcat::mcset sq "Reading therion log file ..." [encoding convertfrom utf-8 "duke lexuar arkivin hyres te Therion-it"] ::msgcat::mcset bg "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\n\320\263\321\200\320\265\321\210\320\272\320\260 \320\277\321\200\320\270 \320\276\321\202\320\262\320\260\321\200\321\217\320\275\320\265\321\202\320\276 \320\275\320\260 \321\204\320\260\320\271\320\273\320\260 therion.log\n"] ::msgcat::mcset cz "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\nchyba p\305\231i otev\303\255r\303\241n\303\255 souboru therion.log\n"] ::msgcat::mcset de "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\nFehler beim \303\226ffnen von therion.log\n"] ::msgcat::mcset el "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\n\317\203\317\206\316\254\316\273\316\274\316\261 \316\272\316\261\317\204\316\261 \317\204\316\277 \316\254\316\275\316\277\316\271\316\263\316\274\316\261 \317\204\316\277\317\205 \316\261\317\201\317\207\316\265\316\257\316\277\317\205 therion.log\n"] ::msgcat::mcset en "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\nerror opening therion.log file\n"] ::msgcat::mcset es "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\nerror abriendo el archivo therion.log\n"] ::msgcat::mcset it "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\nerrore in apertura del file therion.log"] ::msgcat::mcset ru "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\n\320\276\321\210\320\270\320\261\320\272\320\260 \320\276\321\202\320\272\321\200\321\213\321\202\320\270\321\217 \321\204\320\260\320\271\320\273\320\260 therion.log\n"] ::msgcat::mcset sk "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "\nchyba pri \304\215\303\255tan\303\255 s\303\272boru therion.log\n"] ::msgcat::mcset sq "\nerror opening therion.log file\n" [encoding convertfrom utf-8 "gabim gjate hapjes se Therion-it.arkivin hyres/n"] ::msgcat::mcset bg "Show or hide this control panel" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\267\320\262\320\260\320\275\320\265/\321\201\320\272\321\200\320\270\320\262\320\260\320\275\320\265 \320\275\320\260 \320\272\320\276\320\275\321\202\321\200\320\276\320\273\320\275\320\270\321\217\321\202 \320\277\320\260\320\275\320\265\320\273"] ::msgcat::mcset cz "Show or hide this control panel" [encoding convertfrom utf-8 "Zobrazit/skr\303\275t ovl\303\241dac\303\255 panel"] ::msgcat::mcset de "Show or hide this control panel" [encoding convertfrom utf-8 "Dieses Panel anzeigen oder verbergen"] ::msgcat::mcset el "Show or hide this control panel" [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\263\316\271\316\261 \316\265\316\274\317\206\316\254\316\275\316\271\317\203\316\267 \316\256 \316\274\316\267-\316\265\316\274\317\206\316\254\316\275\316\271\317\203\316\267 \317\204\316\277\317\205 \317\200\316\257\316\275\316\261\316\272\316\261 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Show or hide this control panel" [encoding convertfrom utf-8 "Click to show or hide this control panel."] ::msgcat::mcset es "Show or hide this control panel" [encoding convertfrom utf-8 "Clicar para mostrar u ocultar este panel de control"] ::msgcat::mcset it "Show or hide this control panel" [encoding convertfrom utf-8 "Visualizza o nascondi questo pannello"] ::msgcat::mcset ru "Show or hide this control panel" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214 \320\270\320\273\320\270 \321\201\320\277\321\200\321\217\321\202\320\260\321\202\321\214 \320\277\320\260\320\275\320\265\320\273\321\214"] ::msgcat::mcset sk "Show or hide this control panel" [encoding convertfrom utf-8 "Stla\304\215te ak chcete zobrazi\305\245 alebo skry\305\245 tento panel"] ::msgcat::mcset sq "Show or hide this control panel" [encoding convertfrom utf-8 "kliko te hapesh ose te mbyllesh kete panel te kontrollit"] ::msgcat::mcset bg "loading map editor ..." [encoding convertfrom utf-8 "\320\227\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\260 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270 ..."] ::msgcat::mcset cz "loading map editor ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m mapov\303\275 editor..."] ::msgcat::mcset de "loading map editor ..." [encoding convertfrom utf-8 "Lade Karteneditor ..."] ::msgcat::mcset el "loading map editor ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \317\204\316\277\317\205 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256 \316\261\317\200\316\277\317\204\317\215\317\200\317\211\317\203\316\267\317\202..."] ::msgcat::mcset en "loading map editor ..." [encoding convertfrom utf-8 "loading map editor ..."] ::msgcat::mcset es "loading map editor ..." [encoding convertfrom utf-8 "editor de mapas..."] ::msgcat::mcset it "loading map editor ..." [encoding convertfrom utf-8 "editor di mappa ..."] ::msgcat::mcset ru "loading map editor ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\260 \320\272\320\260\321\200\321\202..."] ::msgcat::mcset sk "loading map editor ..." [encoding convertfrom utf-8 "Mapov\303\275 editor"] ::msgcat::mcset sq "loading map editor ..." [encoding convertfrom utf-8 "duke lexuar permiresuesin e hartave\342\200\246"] ::msgcat::mcset bg "Undo %s" [encoding convertfrom utf-8 "\320\236\321\202\320\274\321\217\320\275\320\260"] ::msgcat::mcset cz "Undo %s" [encoding convertfrom utf-8 "Zp\304\233t - %s"] ::msgcat::mcset de "Undo %s" [encoding convertfrom utf-8 "R\303\274ckg\303\244ngig %s"] ::msgcat::mcset el "Undo %s" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\257\317\201\316\265\317\203\316\267 %s"] ::msgcat::mcset en "Undo %s" [encoding convertfrom utf-8 "Undo %s"] ::msgcat::mcset es "Undo %s" [encoding convertfrom utf-8 "Deshacer %s"] ::msgcat::mcset it "Undo %s" [encoding convertfrom utf-8 "Indietro %s"] ::msgcat::mcset ru "Undo %s" [encoding convertfrom utf-8 "\320\236\321\202\320\274\320\265\320\275\320\270\321\202\321\214 %s"] ::msgcat::mcset sk "Undo %s" [encoding convertfrom utf-8 "Sp\303\244\305\245 - %s"] ::msgcat::mcset sq "Undo %s" [encoding convertfrom utf-8 "prishe %s"] ::msgcat::mcset bg "Redo %s" [encoding convertfrom utf-8 "\320\222\321\212\320\267\321\201\321\202\320\260\320\275\320\276\320\262\321\217\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "Redo %s" [encoding convertfrom utf-8 "Znovu - %s"] ::msgcat::mcset de "Redo %s" [encoding convertfrom utf-8 "Wiederholen %s"] ::msgcat::mcset el "Redo %s" [encoding convertfrom utf-8 "\316\225\317\200\316\261\316\275\316\254\316\273\316\267\317\210\316\267 %s"] ::msgcat::mcset en "Redo %s" [encoding convertfrom utf-8 "Redo %s"] ::msgcat::mcset es "Redo %s" [encoding convertfrom utf-8 "Rehacer %s"] ::msgcat::mcset it "Redo %s" [encoding convertfrom utf-8 "Rifai %s"] ::msgcat::mcset ru "Redo %s" [encoding convertfrom utf-8 "\320\222\320\265\321\200\320\275\321\203\321\202\321\214 %s"] ::msgcat::mcset sk "Redo %s" [encoding convertfrom utf-8 "Opakova\305\245- %s"] ::msgcat::mcset sq "Redo %s" [encoding convertfrom utf-8 "beje perseri %s"] ::msgcat::mcset bg "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- \320\275\321\217\320\272\320\276\320\273\320\272\320\276 \320\272\320\276\320\274\320\260\320\275\320\264\320\270 encoding \320\262\321\212\320\262 \321\204\320\260\320\271\320\273\320\260"] ::msgcat::mcset cz "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- v\303\255cen\303\241sobn\303\275 v\303\275skyt p\305\231\303\255kazu encoding v jednom souboru"] ::msgcat::mcset el "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- \317\200\316\277\316\273\316\273\316\261\317\200\316\273\316\255\317\202 \316\265\316\275\317\204\316\277\316\273\316\255\317\202 \316\272\317\211\316\264\316\271\316\272\316\277\317\200\316\277\316\257\316\267\317\203\316\267\317\202 \317\203\317\204\316\277 \316\261\317\201\317\207\316\265\316\257\316\277"] ::msgcat::mcset en "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- multiple encoding commands in file"] ::msgcat::mcset es "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- m\303\272ltiples comandos de codificaci\303\263n en el archivo"] ::msgcat::mcset it "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- encoding ripetuto nel file di comandi"] ::msgcat::mcset ru "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- \320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\276 \320\272\320\276\320\274\320\260\320\275\320\264 encoding \320\262 \321\204\320\260\320\271\320\273\320\265"] ::msgcat::mcset sk "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] -- viac encoding pr\303\255kazov v jednom s\303\272bore"] ::msgcat::mcset sq "%s \[%s\] -- multiple encoding commands in file" [encoding convertfrom utf-8 "%s \[%s\] \342\200\223shumezo komandat te deshifrimit ne arkiv"] ::msgcat::mcset bg "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- \320\275\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\320\260 \320\272\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260 -- %s"] ::msgcat::mcset cz "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- nezn\303\241m\303\251 k\303\263dov\303\241n\303\255 znak\305\257 -- %s"] ::msgcat::mcset el "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- \316\254\316\263\316\275\317\211\317\203\317\204\316\267 \316\272\317\211\316\264\316\271\316\272\316\277\317\200\316\277\316\257\316\267\317\203\316\267 -- %s"] ::msgcat::mcset en "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- unknown encoding -- %s"] ::msgcat::mcset es "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- codificaci\303\263n desconocida -- %s"] ::msgcat::mcset it "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- encoding non conosciuto -- %s"] ::msgcat::mcset ru "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- \320\275\320\265\320\270\320\267\320\262\320\265\321\201\321\202\320\275\320\260\321\217 \320\272\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260 -- %s"] ::msgcat::mcset sk "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] -- nezn\303\241me k\303\263dovanie znakov -- %s"] ::msgcat::mcset sq "%s \[%s\] -- unknown encoding -- %s" [encoding convertfrom utf-8 "%s \[%s\] \342\200\223 deshifrim I panjohur -- %s"] ::msgcat::mcset bg "adjusting area" [encoding convertfrom utf-8 "\321\200\320\265\320\263\321\203\320\273\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260"] ::msgcat::mcset cz "adjusting area" [encoding convertfrom utf-8 "p\305\231izp\305\257soben\303\255 pracovn\303\255 plochy"] ::msgcat::mcset de "adjusting area" [encoding convertfrom utf-8 "Fl\303\244che anpassen"] ::msgcat::mcset el "adjusting area" [encoding convertfrom utf-8 "\317\200\317\201\316\277\317\203\316\261\317\201\316\274\316\277\316\263\316\256 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "adjusting area" [encoding convertfrom utf-8 "adjusting area"] ::msgcat::mcset es "adjusting area" [encoding convertfrom utf-8 "ajustando \303\241rea"] ::msgcat::mcset it "adjusting area" [encoding convertfrom utf-8 "aggiustamento area"] ::msgcat::mcset ru "adjusting area" [encoding convertfrom utf-8 "\321\200\320\265\320\263\321\203\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\276\320\261\320\273\320\260\321\201\321\202\320\270"] ::msgcat::mcset sk "adjusting area" [encoding convertfrom utf-8 "prisp\303\264sobenie pracovnej plochy"] ::msgcat::mcset bg "zooming" [encoding convertfrom utf-8 "\320\274\320\260\321\211\320\260\320\261\320\270\321\200\320\260\320\275\320\265"] ::msgcat::mcset cz "zooming" [encoding convertfrom utf-8 "zoomov\303\241n\303\255"] ::msgcat::mcset de "zooming" [encoding convertfrom utf-8 "Zoomen"] ::msgcat::mcset el "zooming" [encoding convertfrom utf-8 "\316\274\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267"] ::msgcat::mcset en "zooming" [encoding convertfrom utf-8 "zooming"] ::msgcat::mcset es "zooming" [encoding convertfrom utf-8 "zooming"] ::msgcat::mcset it "zooming" [encoding convertfrom utf-8 "zooming"] ::msgcat::mcset ru "zooming" [encoding convertfrom utf-8 "\320\274\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265"] ::msgcat::mcset sk "zooming" [encoding convertfrom utf-8 "zoomovanie"] ::msgcat::mcset sq "zooming" [encoding convertfrom utf-8 "zmadhimi"] ::msgcat::mcset bg "Zoom %d %%" [encoding convertfrom utf-8 "\320\274\320\260\321\211\320\260\320\261 %d %%"] ::msgcat::mcset cz "Zoom %d %%" [encoding convertfrom utf-8 "Zoom %d %%"] ::msgcat::mcset de "Zoom %d %%" [encoding convertfrom utf-8 "Zoom %d %%"] ::msgcat::mcset el "Zoom %d %%" [encoding convertfrom utf-8 "\316\234\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267 %d %%"] ::msgcat::mcset en "Zoom %d %%" [encoding convertfrom utf-8 "Zoom %d %%"] ::msgcat::mcset es "Zoom %d %%" [encoding convertfrom utf-8 "Zoom %d %%"] ::msgcat::mcset it "Zoom %d %%" [encoding convertfrom utf-8 "Zomm %d %%"] ::msgcat::mcset ru "Zoom %d %%" [encoding convertfrom utf-8 "\320\234\320\260\321\201\321\210\321\202\320\260\320\261 %d %%"] ::msgcat::mcset sk "Zoom %d %%" [encoding convertfrom utf-8 "Zoom %d %%"] ::msgcat::mcset sq "Zoom %d %%" [encoding convertfrom utf-8 "zmadho %d %%"] ::msgcat::mcset bg "Zooming objects ..." [encoding convertfrom utf-8 "\320\234\320\260\321\211\320\260\320\261\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 \320\276\320\261\320\265\320\272\321\202\320\270 ..."] ::msgcat::mcset cz "Zooming objects ..." [encoding convertfrom utf-8 "Zoomov\303\241n\303\255 objekt\305\257 ..."] ::msgcat::mcset de "Zooming objects ..." [encoding convertfrom utf-8 "Zoome Objekte ..."] ::msgcat::mcset el "Zooming objects ..." [encoding convertfrom utf-8 "\316\234\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267 \316\261\316\275\317\204\316\271\316\272\316\265\316\271\316\274\316\255\316\275\317\211\316\275..."] ::msgcat::mcset en "Zooming objects ..." [encoding convertfrom utf-8 "Zooming objects ..."] ::msgcat::mcset es "Zooming objects ..." [encoding convertfrom utf-8 "Zoom sobre objetos ..."] ::msgcat::mcset it "Zooming objects ..." [encoding convertfrom utf-8 "Zoom degli oggetti ..."] ::msgcat::mcset ru "Zooming objects ..." [encoding convertfrom utf-8 "\320\234\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\276\320\261\321\212\320\265\320\272\321\202\320\276\320\262..."] ::msgcat::mcset sk "Zooming objects ..." [encoding convertfrom utf-8 "Zoomovanie objektov ..."] ::msgcat::mcset sq "Zooming objects ..." [encoding convertfrom utf-8 "objektet e zmadhimit\342\200\246"] ::msgcat::mcset bg "dragging image" [encoding convertfrom utf-8 "\320\237\320\273\321\212\320\267\320\263\320\260\320\275\320\265 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "dragging image" [encoding convertfrom utf-8 "p\305\231esouv\303\241n\303\255 obr\303\241zku"] ::msgcat::mcset de "dragging image" [encoding convertfrom utf-8 "Bild verschieben"] ::msgcat::mcset el "dragging image" [encoding convertfrom utf-8 "\316\274\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "dragging image" [encoding convertfrom utf-8 "dragging image"] ::msgcat::mcset es "dragging image" [encoding convertfrom utf-8 "arrastrando imagen"] ::msgcat::mcset it "dragging image" [encoding convertfrom utf-8 "trascinamento immagine"] ::msgcat::mcset ru "dragging image" [encoding convertfrom utf-8 "\320\277\320\265\321\200\320\265\321\202\320\260\321\201\320\272\320\270\320\262\320\260\320\275\320\270\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "dragging image" [encoding convertfrom utf-8 "Pres\303\272vanie obr\303\241zku"] ::msgcat::mcset sq "dragging image" [encoding convertfrom utf-8 "imazhi per tu vizatuar"] ::msgcat::mcset bg "Map Editor" [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270"] ::msgcat::mcset cz "Map Editor" [encoding convertfrom utf-8 "Mapov\303\275 editor"] ::msgcat::mcset de "Map Editor" [encoding convertfrom utf-8 "Karteneditor"] ::msgcat::mcset el "Map Editor" [encoding convertfrom utf-8 "\316\225\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256\317\202 \316\261\317\200\316\277\317\204\317\215\317\200\317\211\317\203\316\267\317\202"] ::msgcat::mcset en "Map Editor" [encoding convertfrom utf-8 "Map Editor"] ::msgcat::mcset es "Map Editor" [encoding convertfrom utf-8 "Editor de mapas"] ::msgcat::mcset it "Map Editor" [encoding convertfrom utf-8 "Editor di mappa"] ::msgcat::mcset ru "Map Editor" [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\272\320\260\321\200\321\202"] ::msgcat::mcset sk "Map Editor" [encoding convertfrom utf-8 "Mapov\303\275 Editor"] ::msgcat::mcset sq "Map Editor" [encoding convertfrom utf-8 "permiresuesi I hartave"] ::msgcat::mcset bg "File commands" [encoding convertfrom utf-8 "\320\232\320\276\320\274\320\260\320\275\320\264\320\270 \320\262\321\212\320\262 \321\204\320\260\320\271\320\273"] ::msgcat::mcset cz "File commands" [encoding convertfrom utf-8 "P\305\231\303\255kazy"] ::msgcat::mcset de "File commands" [encoding convertfrom utf-8 "Dateibefehle"] ::msgcat::mcset el "File commands" [encoding convertfrom utf-8 "\316\221\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\261"] ::msgcat::mcset en "File commands" [encoding convertfrom utf-8 "Objects"] ::msgcat::mcset es "File commands" [encoding convertfrom utf-8 "Objetos"] ::msgcat::mcset it "File commands" [encoding convertfrom utf-8 "Oggetti"] ::msgcat::mcset ru "File commands" [encoding convertfrom utf-8 "\320\232\320\276\320\274\320\260\320\275\320\264\321\213 \320\262 \321\204\320\260\320\271\320\273\320\265"] ::msgcat::mcset sk "File commands" [encoding convertfrom utf-8 "Pr\303\255kazy v s\303\272bore"] ::msgcat::mcset sq "File commands" [encoding convertfrom utf-8 "objektet"] ::msgcat::mcset bg "Search & Select" [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \320\270 \320\270\320\267\320\261\320\270\321\200\320\260\320\275\320\265"] ::msgcat::mcset cz "Search & Select" [encoding convertfrom utf-8 "Naj\303\255t & Vybrat"] ::msgcat::mcset de "Search & Select" [encoding convertfrom utf-8 "Suchen & ausw\303\244hlen"] ::msgcat::mcset el "Search & Select" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\272\316\261\316\271 \316\265\317\200\316\271\316\273\316\277\316\263\316\256"] ::msgcat::mcset en "Search & Select" [encoding convertfrom utf-8 "Search & Select"] ::msgcat::mcset es "Search & Select" [encoding convertfrom utf-8 "Buscar y Seleccionar"] ::msgcat::mcset it "Search & Select" [encoding convertfrom utf-8 "Cerca e seleziona"] ::msgcat::mcset ru "Search & Select" [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272 \320\270 \320\222\321\213\320\264\320\265\320\273\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "Search & Select" [encoding convertfrom utf-8 "H\304\276adaj a Vyber"] ::msgcat::mcset sq "Search & Select" [encoding convertfrom utf-8 "kerko dhe zgjidh"] ::msgcat::mcset bg "Command preview" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\263\320\273\320\265\320\264 \320\275\320\260 \320\272\320\276\320\274\320\260\320\275\320\264\320\260"] ::msgcat::mcset cz "Command preview" [encoding convertfrom utf-8 "N\303\241hled p\305\231\303\255kazu"] ::msgcat::mcset de "Command preview" [encoding convertfrom utf-8 "Kommandovorschau"] ::msgcat::mcset el "Command preview" [encoding convertfrom utf-8 "\316\240\317\201\316\277\316\265\317\200\316\271\317\203\316\272\317\214\317\200\316\267\317\203\316\267 \316\265\316\275\317\204\316\277\316\273\316\256\317\202"] ::msgcat::mcset en "Command preview" [encoding convertfrom utf-8 "Command preview"] ::msgcat::mcset es "Command preview" [encoding convertfrom utf-8 "Ver comandos"] ::msgcat::mcset it "Command preview" [encoding convertfrom utf-8 "Anteprima comando"] ::msgcat::mcset ru "Command preview" [encoding convertfrom utf-8 "\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200 \320\272\320\276\320\274\320\260\320\275\320\264\321\213"] ::msgcat::mcset sk "Command preview" [encoding convertfrom utf-8 "N\303\241h\304\276ad pr\303\255kazu"] ::msgcat::mcset sq "Command preview" [encoding convertfrom utf-8 "komanda e parashiqimit"] ::msgcat::mcset bg "Point control" [encoding convertfrom utf-8 "\320\242\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "Point control" [encoding convertfrom utf-8 "Bod"] ::msgcat::mcset de "Point control" [encoding convertfrom utf-8 "Punkte bearbeiten"] ::msgcat::mcset el "Point control" [encoding convertfrom utf-8 "\316\243\316\267\316\274\316\265\316\257\316\261"] ::msgcat::mcset en "Point control" [encoding convertfrom utf-8 "Points"] ::msgcat::mcset es "Point control" [encoding convertfrom utf-8 "Puntos"] ::msgcat::mcset it "Point control" [encoding convertfrom utf-8 "Punti"] ::msgcat::mcset ru "Point control" [encoding convertfrom utf-8 "\320\242\320\276\321\207\320\272\320\260"] ::msgcat::mcset sk "Point control" [encoding convertfrom utf-8 "Bod"] ::msgcat::mcset sq "Point control" [encoding convertfrom utf-8 "pikat"] ::msgcat::mcset bg "Line control" [encoding convertfrom utf-8 "\320\233\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "Line control" [encoding convertfrom utf-8 "K\305\231ivka"] ::msgcat::mcset de "Line control" [encoding convertfrom utf-8 "Linien bearbeiten"] ::msgcat::mcset el "Line control" [encoding convertfrom utf-8 "\316\223\317\201\316\261\316\274\316\274\316\255\317\202"] ::msgcat::mcset en "Line control" [encoding convertfrom utf-8 "Lines"] ::msgcat::mcset es "Line control" [encoding convertfrom utf-8 "L\303\255neas"] ::msgcat::mcset it "Line control" [encoding convertfrom utf-8 "Linee"] ::msgcat::mcset ru "Line control" [encoding convertfrom utf-8 "\320\233\320\270\320\275\320\270\321\217"] ::msgcat::mcset sk "Line control" [encoding convertfrom utf-8 "Krivka"] ::msgcat::mcset sq "Line control" [encoding convertfrom utf-8 "rjeshtat"] ::msgcat::mcset bg "Line point control" [encoding convertfrom utf-8 "\320\242\320\276\321\207\320\272\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "Line point control" [encoding convertfrom utf-8 "Bod k\305\231ivky"] ::msgcat::mcset de "Line point control" [encoding convertfrom utf-8 "Linienpunkte bearbeiten"] ::msgcat::mcset el "Line point control" [encoding convertfrom utf-8 "\316\243\316\267\316\274\316\265\316\257\316\261 \316\263\317\201\316\261\316\274\316\274\317\216\316\275"] ::msgcat::mcset en "Line point control" [encoding convertfrom utf-8 "Line points"] ::msgcat::mcset es "Line point control" [encoding convertfrom utf-8 "Puntos de l\303\255nea"] ::msgcat::mcset it "Line point control" [encoding convertfrom utf-8 "Punti della linea"] ::msgcat::mcset ru "Line point control" [encoding convertfrom utf-8 "\320\242\320\276\321\207\320\272\320\260 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "Line point control" [encoding convertfrom utf-8 "Bod krivky"] ::msgcat::mcset sq "Line point control" [encoding convertfrom utf-8 "pikat e rjeshtit"] ::msgcat::mcset bg "Area control" [encoding convertfrom utf-8 "\320\236\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "Area control" [encoding convertfrom utf-8 "Oblast"] ::msgcat::mcset de "Area control" [encoding convertfrom utf-8 "Fl\303\244chen bearbeiten"] ::msgcat::mcset el "Area control" [encoding convertfrom utf-8 "\316\225\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\265\317\202"] ::msgcat::mcset en "Area control" [encoding convertfrom utf-8 "Areas"] ::msgcat::mcset es "Area control" [encoding convertfrom utf-8 "Areas"] ::msgcat::mcset it "Area control" [encoding convertfrom utf-8 "Aree"] ::msgcat::mcset ru "Area control" [encoding convertfrom utf-8 "\320\236\320\261\320\273\320\260\321\201\321\202\321\214"] ::msgcat::mcset sk "Area control" [encoding convertfrom utf-8 "Plocha"] ::msgcat::mcset sq "Area control" [encoding convertfrom utf-8 "fushat"] ::msgcat::mcset bg "Scrap control" [encoding convertfrom utf-8 "\320\241\320\272\321\200\320\260\320\277"] ::msgcat::mcset cz "Scrap control" [encoding convertfrom utf-8 "Scrap"] ::msgcat::mcset de "Scrap control" [encoding convertfrom utf-8 "Skizze bearbeiten"] ::msgcat::mcset el "Scrap control" [encoding convertfrom utf-8 "\316\243\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "Scrap control" [encoding convertfrom utf-8 "Scraps"] ::msgcat::mcset es "Scrap control" [encoding convertfrom utf-8 "Croquis"] ::msgcat::mcset it "Scrap control" [encoding convertfrom utf-8 "Scrap"] ::msgcat::mcset ru "Scrap control" [encoding convertfrom utf-8 "\320\241\320\272\321\200\320\260\320\277"] ::msgcat::mcset sk "Scrap control" [encoding convertfrom utf-8 "Scrap"] ::msgcat::mcset sq "Scrap control" [encoding convertfrom utf-8 "mbeturinat"] ::msgcat::mcset bg "Text editor" [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\201\321\202\320\276\320\262 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200"] ::msgcat::mcset cz "Text editor" [encoding convertfrom utf-8 "Textov\303\275 editor"] ::msgcat::mcset de "Text editor" [encoding convertfrom utf-8 "Texteditor"] ::msgcat::mcset el "Text editor" [encoding convertfrom utf-8 "\316\225\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256\317\202 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset en "Text editor" [encoding convertfrom utf-8 "Text editor"] ::msgcat::mcset es "Text editor" [encoding convertfrom utf-8 "Editor de texto"] ::msgcat::mcset it "Text editor" [encoding convertfrom utf-8 "Editor di testo"] ::msgcat::mcset ru "Text editor" [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200"] ::msgcat::mcset sk "Text editor" [encoding convertfrom utf-8 "Textov\303\275 editor"] ::msgcat::mcset sq "Text editor" [encoding convertfrom utf-8 "permirsuesi I tekstit"] ::msgcat::mcset bg "Drawing area" [encoding convertfrom utf-8 "\320\227\320\276\320\275\320\260 \320\275\320\260 \321\207\320\265\321\200\321\202\320\260\320\275\320\265"] ::msgcat::mcset cz "Drawing area" [encoding convertfrom utf-8 "Kresl\303\255c\303\255 plocha"] ::msgcat::mcset de "Drawing area" [encoding convertfrom utf-8 "Zeichenfl\303\244che"] ::msgcat::mcset el "Drawing area" [encoding convertfrom utf-8 "\316\225\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261 \317\203\317\207\316\265\316\264\316\271\316\261\317\203\316\274\316\277\317\215"] ::msgcat::mcset en "Drawing area" [encoding convertfrom utf-8 "Drawing area"] ::msgcat::mcset es "Drawing area" [encoding convertfrom utf-8 "Area de dibujo"] ::msgcat::mcset it "Drawing area" [encoding convertfrom utf-8 "Area di disegno"] ::msgcat::mcset ru "Drawing area" [encoding convertfrom utf-8 "\320\227\320\276\320\275\320\260 \321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\270\321\217"] ::msgcat::mcset sk "Drawing area" [encoding convertfrom utf-8 "Pracovn\303\241 plocha"] ::msgcat::mcset sq "Drawing area" [encoding convertfrom utf-8 "fusha e vizatimit"] ::msgcat::mcset bg "Background images" [encoding convertfrom utf-8 "\320\244\320\276\320\275\320\276\320\262\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Background images" [encoding convertfrom utf-8 "Podkladov\303\251 obr\303\241zky"] ::msgcat::mcset de "Background images" [encoding convertfrom utf-8 "Hintergrundbilder"] ::msgcat::mcset el "Background images" [encoding convertfrom utf-8 "\316\225\316\271\316\272\317\214\316\275\316\265\317\202 \317\206\317\214\316\275\317\204\316\277\317\205"] ::msgcat::mcset en "Background images" [encoding convertfrom utf-8 "Background images"] ::msgcat::mcset es "Background images" [encoding convertfrom utf-8 "Im\303\241genes de fondo"] ::msgcat::mcset it "Background images" [encoding convertfrom utf-8 "Immagini di background"] ::msgcat::mcset ru "Background images" [encoding convertfrom utf-8 "\320\244\320\276\320\275\320\276\320\262\321\213\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "Background images" [encoding convertfrom utf-8 "Obr\303\241zky pozadia"] ::msgcat::mcset sq "Background images" [encoding convertfrom utf-8 "imazhet ne prapavije"] ::msgcat::mcset bg "Current drawing area." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\203\321\211\320\260 \320\267\320\276\320\275\320\260 \320\275\320\260 \321\207\320\265\321\200\321\202\320\260\320\275\320\265"] ::msgcat::mcset cz "Current drawing area." [encoding convertfrom utf-8 "Sou\304\215asn\303\241 kresl\303\255c\303\255 plocha."] ::msgcat::mcset de "Current drawing area." [encoding convertfrom utf-8 "Aktuelle Zeichenfl\303\244che"] ::msgcat::mcset el "Current drawing area." [encoding convertfrom utf-8 "\316\225\316\275\316\265\317\201\316\263\316\256 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261 \317\203\317\207\316\265\316\264\316\271\316\261\317\203\316\274\316\277\317\215"] ::msgcat::mcset en "Current drawing area." [encoding convertfrom utf-8 "Current drawing area."] ::msgcat::mcset es "Current drawing area." [encoding convertfrom utf-8 "Area de dibujo actual."] ::msgcat::mcset it "Current drawing area." [encoding convertfrom utf-8 "Area di disegno attiva"] ::msgcat::mcset ru "Current drawing area." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\203\321\211\320\260\321\217 \320\267\320\276\320\275\320\260 \321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\270\321\217."] ::msgcat::mcset sk "Current drawing area." [encoding convertfrom utf-8 "S\303\272\304\215asn\303\241 pracovn\303\241 plocha."] ::msgcat::mcset sq "Current drawing area." [encoding convertfrom utf-8 "fusha momentale e vizatimit"] ::msgcat::mcset bg "X min." [encoding convertfrom utf-8 "X min."] ::msgcat::mcset cz "X min." [encoding convertfrom utf-8 "X min."] ::msgcat::mcset el "X min." [encoding convertfrom utf-8 "\316\225\316\273\316\254\317\207\316\271\317\203\317\204\316\277 \316\247"] ::msgcat::mcset en "X min." [encoding convertfrom utf-8 "X min."] ::msgcat::mcset es "X min." [encoding convertfrom utf-8 "X min"] ::msgcat::mcset it "X min." [encoding convertfrom utf-8 "Minimo X"] ::msgcat::mcset ru "X min." [encoding convertfrom utf-8 "X min."] ::msgcat::mcset sk "X min." [encoding convertfrom utf-8 "Minimum X."] ::msgcat::mcset sq "X min." [encoding convertfrom utf-8 "minimum X."] ::msgcat::mcset bg "Y min." [encoding convertfrom utf-8 "Y min."] ::msgcat::mcset cz "Y min." [encoding convertfrom utf-8 "Y min."] ::msgcat::mcset el "Y min." [encoding convertfrom utf-8 "\316\225\316\273\316\254\317\207\316\271\317\203\317\204\316\277 \316\245"] ::msgcat::mcset en "Y min." [encoding convertfrom utf-8 "Y min."] ::msgcat::mcset es "Y min." [encoding convertfrom utf-8 "Y min"] ::msgcat::mcset it "Y min." [encoding convertfrom utf-8 "Minimo Y"] ::msgcat::mcset ru "Y min." [encoding convertfrom utf-8 "Y min."] ::msgcat::mcset sk "Y min." [encoding convertfrom utf-8 "Minimum Y."] ::msgcat::mcset sq "Y min." [encoding convertfrom utf-8 "minimum Y."] ::msgcat::mcset bg "X max." [encoding convertfrom utf-8 "X max."] ::msgcat::mcset cz "X max." [encoding convertfrom utf-8 "X max."] ::msgcat::mcset el "X max." [encoding convertfrom utf-8 "\316\234\316\255\316\263\316\271\317\203\317\204\316\277 \316\247"] ::msgcat::mcset en "X max." [encoding convertfrom utf-8 "X max."] ::msgcat::mcset es "X max." [encoding convertfrom utf-8 "X max"] ::msgcat::mcset it "X max." [encoding convertfrom utf-8 "Massimo X"] ::msgcat::mcset ru "X max." [encoding convertfrom utf-8 "X max."] ::msgcat::mcset sk "X max." [encoding convertfrom utf-8 "Maximum X."] ::msgcat::mcset sq "X max." [encoding convertfrom utf-8 "maksimum X."] ::msgcat::mcset bg "Y max." [encoding convertfrom utf-8 "Y max."] ::msgcat::mcset cz "Y max." [encoding convertfrom utf-8 "Y max."] ::msgcat::mcset el "Y max." [encoding convertfrom utf-8 "\316\234\316\255\316\263\316\271\317\203\317\204\316\277 \316\245"] ::msgcat::mcset en "Y max." [encoding convertfrom utf-8 "Y max."] ::msgcat::mcset es "Y max." [encoding convertfrom utf-8 "Y max"] ::msgcat::mcset it "Y max." [encoding convertfrom utf-8 "Massimo Y"] ::msgcat::mcset ru "Y max." [encoding convertfrom utf-8 "Y max."] ::msgcat::mcset sk "Y max." [encoding convertfrom utf-8 "Maximum Y."] ::msgcat::mcset sq "Y max." [encoding convertfrom utf-8 "maksimum Y."] ::msgcat::mcset bg "Adjust" [encoding convertfrom utf-8 "\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270"] ::msgcat::mcset cz "Adjust" [encoding convertfrom utf-8 "P\305\231izp\305\257sobit"] ::msgcat::mcset de "Adjust" [encoding convertfrom utf-8 "Anpassen"] ::msgcat::mcset el "Adjust" [encoding convertfrom utf-8 "\316\240\317\201\316\277\317\203\316\261\317\201\316\274\316\277\316\263\316\256"] ::msgcat::mcset en "Adjust" [encoding convertfrom utf-8 "Adjust"] ::msgcat::mcset es "Adjust" [encoding convertfrom utf-8 "Ajustar"] ::msgcat::mcset it "Adjust" [encoding convertfrom utf-8 "Ridimensiona"] ::msgcat::mcset ru "Adjust" [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214"] ::msgcat::mcset sk "Adjust" [encoding convertfrom utf-8 "Prisp\303\264sob"] ::msgcat::mcset sq "Adjust" [encoding convertfrom utf-8 "permireso"] ::msgcat::mcset bg "Adjust drawing area to given limits." [encoding convertfrom utf-8 "\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270 \320\267\320\276\320\275\320\260\321\202\320\260 \320\267\320\260 \321\207\320\265\321\200\321\202\320\260\320\275\320\265 \320\262 \320\267\320\260\320\264\320\260\320\264\320\265\320\275\320\270\321\202\320\265 \320\263\321\200\320\260\320\275\320\270\321\206\320\270"] ::msgcat::mcset cz "Adjust drawing area to given limits." [encoding convertfrom utf-8 "P\305\231izp\305\257sob\303\255 kresl\303\255c\303\255 plochu dan\303\275m limit\305\257m."] ::msgcat::mcset de "Adjust drawing area to given limits." [encoding convertfrom utf-8 "Zeichenfl\303\244che an Begrenzung anpassen."] ::msgcat::mcset el "Adjust drawing area to given limits." [encoding convertfrom utf-8 "\316\240\317\201\316\277\317\203\316\261\317\201\316\274\316\277\316\263\316\256 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \317\203\317\204\316\261 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\316\261 \317\214\317\201\316\271\316\261"] ::msgcat::mcset en "Adjust drawing area to given limits." [encoding convertfrom utf-8 "Adjust drawing area to given limits."] ::msgcat::mcset es "Adjust drawing area to given limits." [encoding convertfrom utf-8 "Ajustar el \303\241rea de dibujo a los l\303\255mites indicados."] ::msgcat::mcset it "Adjust drawing area to given limits." [encoding convertfrom utf-8 "Ridimensiona l'area di disegno ai limiti dati"] ::msgcat::mcset ru "Adjust drawing area to given limits." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214 \320\267\320\276\320\275\321\203 \321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\270\321\217 \320\262 \320\267\320\260\320\264\320\260\320\275\320\275\321\213\321\205 \320\263\321\200\320\260\320\275\320\270\321\206\320\260\321\205."] ::msgcat::mcset sk "Adjust drawing area to given limits." [encoding convertfrom utf-8 "Prisp\303\264sobi\305\245 pracovn\303\272 plochu dan\303\275m limitom."] ::msgcat::mcset sq "Adjust drawing area to given limits." [encoding convertfrom utf-8 "permireso fushen e vizatimit deri ne kufijt e dhene."] ::msgcat::mcset bg "Auto adjust" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\275\320\276 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\275\320\265"] ::msgcat::mcset cz "Auto adjust" [encoding convertfrom utf-8 "Auto p\305\231izp\305\257s."] ::msgcat::mcset de "Auto adjust" [encoding convertfrom utf-8 "Automatisch anpassen"] ::msgcat::mcset el "Auto adjust" [encoding convertfrom utf-8 "\316\221\317\205\317\204\317\214\316\274\316\261\317\204\316\267 \317\200\317\201\316\277\317\203\316\261\317\201\316\274\316\277\316\263\316\256"] ::msgcat::mcset en "Auto adjust" [encoding convertfrom utf-8 "Auto adjust"] ::msgcat::mcset es "Auto adjust" [encoding convertfrom utf-8 "Autoajustar"] ::msgcat::mcset it "Auto adjust" [encoding convertfrom utf-8 "Auto-ridimensiona"] ::msgcat::mcset ru "Auto adjust" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276"] ::msgcat::mcset sk "Auto adjust" [encoding convertfrom utf-8 "Automaticky"] ::msgcat::mcset sq "Auto adjust" [encoding convertfrom utf-8 "permiresimi automatik"] ::msgcat::mcset bg "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270 \320\260\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\275\320\276 \320\267\320\276\320\275\320\260\321\202\320\260 \320\267\320\260 \321\207\320\265\321\200\321\202\320\260\320\275\320\265"] ::msgcat::mcset cz "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "Automaticky p\305\231izp\305\257sob\303\255 kresl\303\255c\303\255 plochu v\305\241em objekt\305\257m."] ::msgcat::mcset de "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "Zeichenfl\303\244che an berechnete Begrenzung anpassen."] ::msgcat::mcset el "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "\316\240\317\201\316\277\317\203\316\261\317\201\316\274\316\277\316\263\316\256 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \317\203\317\204\316\261 \317\214\317\201\316\271\316\261 \317\200\316\277\317\205 \316\261\317\205\317\204\316\277\316\274\316\254\317\204\317\211\317\202 \316\277\317\201\316\257\317\203\317\204\316\267\316\272\316\261\316\275"] ::msgcat::mcset en "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "Adjust drawing area to automatically calculated limits."] ::msgcat::mcset es "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "Ajustar \303\241rea de dibujo autom\303\241ticamente."] ::msgcat::mcset it "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "Ridimensiona l'area di disegno ai limiti calcolati"] ::msgcat::mcset ru "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\270 \321\203\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214 \320\267\320\276\320\275\321\203 \321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\270\321\217."] ::msgcat::mcset sk "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "Automaticky prisp\303\264sobi\305\245 pracovn\303\272 plochu v\305\241etk\303\275m objektom."] ::msgcat::mcset sq "Adjust drawing area to automatically calculated limits." [encoding convertfrom utf-8 "permireso fushen e vizatimit ne kufirin e llogaritur automatikisht."] ::msgcat::mcset bg "zoom" [encoding convertfrom utf-8 "\320\274\320\260\321\211\320\260\320\261"] ::msgcat::mcset cz "zoom" [encoding convertfrom utf-8 "zoom"] ::msgcat::mcset de "zoom" [encoding convertfrom utf-8 "Zoom"] ::msgcat::mcset el "zoom" [encoding convertfrom utf-8 "\316\274\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267"] ::msgcat::mcset en "zoom" [encoding convertfrom utf-8 "zoom"] ::msgcat::mcset es "zoom" [encoding convertfrom utf-8 "zoom"] ::msgcat::mcset it "zoom" [encoding convertfrom utf-8 "zoom"] ::msgcat::mcset ru "zoom" [encoding convertfrom utf-8 "\320\274\320\260\321\201\321\210\321\202\320\260\320\261"] ::msgcat::mcset sk "zoom" [encoding convertfrom utf-8 "zoom"] ::msgcat::mcset sq "zoom" [encoding convertfrom utf-8 "zmadho"] ::msgcat::mcset bg "Zoom drawing area." [encoding convertfrom utf-8 "\320\234\320\260\321\211\320\260\320\261\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 \320\267\320\276\320\275\320\260\321\202\320\260 \320\267\320\260 \321\207\320\265\321\200\321\202\320\260\320\275\320\265"] ::msgcat::mcset cz "Zoom drawing area." [encoding convertfrom utf-8 "Zoom kresl\303\255c\303\255 plochy."] ::msgcat::mcset de "Zoom drawing area." [encoding convertfrom utf-8 "Zeichenfl\303\244che zoomen."] ::msgcat::mcset el "Zoom drawing area." [encoding convertfrom utf-8 "\316\210\316\273\316\265\316\263\317\207\316\277\317\202 \316\274\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267\317\202. \316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \317\203\317\204\316\277\316\275 \316\277\317\201\316\270\316\277\316\263\317\216\316\275\316\271\316\277 \316\263\316\271\316\261 \316\275\316\261 \316\264\316\265\316\257\317\204\316\265 \317\204\316\277 \316\274\316\265\316\275\316\277\317\215."] ::msgcat::mcset en "Zoom drawing area." [encoding convertfrom utf-8 "Zoom control. Click on rectangle to see menu."] ::msgcat::mcset es "Zoom drawing area." [encoding convertfrom utf-8 "Control del zoom. Clic en rect\303\241ngulo para ver men\303\272."] ::msgcat::mcset it "Zoom drawing area." [encoding convertfrom utf-8 "Zoom area di disegno"] ::msgcat::mcset ru "Zoom drawing area." [encoding convertfrom utf-8 "\320\234\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\320\276\320\262\320\260\321\202\321\214 \320\267\320\276\320\275\321\203 \321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\270\321\217."] ::msgcat::mcset sk "Zoom drawing area." [encoding convertfrom utf-8 "Zoom pracovnej plochy."] ::msgcat::mcset sq "Zoom drawing area." [encoding convertfrom utf-8 "kontrolli I zmadhimit. Kliko ne gjashtekendesh te shohesh menyn"] ::msgcat::mcset bg "loading commands module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\267\320\260 \320\272\320\276\320\274\320\260\320\275\320\264\320\270"] ::msgcat::mcset cz "loading commands module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m p\305\231\303\255kazov\303\275 modul ..."] ::msgcat::mcset de "loading commands module ..." [encoding convertfrom utf-8 "Lade Befehlsmodul ..."] ::msgcat::mcset el "loading commands module ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261 \316\265\316\275\317\204\316\277\316\273\317\216\316\275..."] ::msgcat::mcset en "loading commands module ..." [encoding convertfrom utf-8 "loading commands module ..."] ::msgcat::mcset es "loading commands module ..." [encoding convertfrom utf-8 "comandos ..."] ::msgcat::mcset it "loading commands module ..." [encoding convertfrom utf-8 "modulo comandi ..."] ::msgcat::mcset ru "loading commands module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \320\272\320\276\320\274\320\260\320\275\320\264..."] ::msgcat::mcset sk "loading commands module ..." [encoding convertfrom utf-8 "pr\303\255kazov\303\275 modul..."] ::msgcat::mcset sq "loading commands module ..." [encoding convertfrom utf-8 "duke lexuar modulin komandues\342\200\246"] ::msgcat::mcset bg "Select command." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\265\321\202\320\265 \320\272\320\276\320\274\320\260\320\275\320\264\320\260"] ::msgcat::mcset cz "Select command." [encoding convertfrom utf-8 "V\303\275b\304\233r p\305\231\303\255kazu."] ::msgcat::mcset de "Select command." [encoding convertfrom utf-8 "W\303\244hle Befehl."] ::msgcat::mcset el "Select command." [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \317\203\316\265 \316\274\316\271\316\261 \316\263\317\201\316\261\316\274\316\274\316\256 \316\263\316\271\316\261 \316\275\316\261 \317\203\317\205\316\273\316\273\316\255\316\276\316\265\317\204\316\265 \317\204\316\277 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\277 \317\203\317\204\316\277\316\275 \316\272\316\261\316\274\316\262\316\254 \316\272\316\261\316\271 \317\204\316\277 \316\261\316\275\317\204\316\257\316\270\316\265\317\204\316\277."] ::msgcat::mcset en "Select command." [encoding convertfrom utf-8 "Click a line to get corresponding object selected on canvas or vice versa."] ::msgcat::mcset es "Select command." [encoding convertfrom utf-8 "Al clicar una de las l\303\255neas, se resaltar\303\241 en la topo el objeto correspondiente, y viceversa."] ::msgcat::mcset it "Select command." [encoding convertfrom utf-8 "Seleziona comando."] ::msgcat::mcset ru "Select command." [encoding convertfrom utf-8 "\320\222\321\213\320\261\320\265\321\200\320\270\321\202\320\265 \320\272\320\276\320\274\320\260\320\275\320\264\321\203."] ::msgcat::mcset sk "Select command." [encoding convertfrom utf-8 "Vyber pr\303\255kaz."] ::msgcat::mcset sq "Select command." [encoding convertfrom utf-8 "kliko ne resht qe te fitosh objektin e deshiruar I zgjedhur ne pelhure ose anasjelltas."] ::msgcat::mcset bg "Action button." [encoding convertfrom utf-8 "\320\224\320\265\320\271\321\201\321\202\320\262\320\270\320\265"] ::msgcat::mcset cz "Action button." [encoding convertfrom utf-8 "Tla\304\215\303\255tko Akce."] ::msgcat::mcset de "Action button." [encoding convertfrom utf-8 "Aktionsknopf."] ::msgcat::mcset el "Action button." [encoding convertfrom utf-8 "\316\240\316\261\317\204\317\216\316\275\317\204\316\261\317\202 \316\265\316\264\317\216 \316\274\317\200\316\277\317\201\316\265\316\257\317\204\316\265 \316\275\316\261 \316\265\316\271\317\203\316\254\316\263\316\265\317\204\316\265 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\261 \316\274\316\265 \317\204\316\277 \317\200\316\277\316\275\317\204\316\257\316\272\316\271. \316\240\316\261\317\204\316\256\317\203\317\204\316\265 \317\204\316\267\316\275 \316\265\316\275\317\204\316\277\316\273\316\256 \316\275\316\261 \316\264\316\265\316\257\317\204\316\265 \317\204\316\277 \316\274\316\265\316\275\316\277\317\215."] ::msgcat::mcset en "Action button." [encoding convertfrom utf-8 "After clicking this button, you can insert objects by mouse. Click on action to see menu."] ::msgcat::mcset es "Action button." [encoding convertfrom utf-8 "Tras pulsar este bot\303\263n, se pueden insertar con el rat\303\263n puntos, lineas, etc. Clic en acci\303\263n para ver men\303\272."] ::msgcat::mcset it "Action button." [encoding convertfrom utf-8 "Bottone di azione."] ::msgcat::mcset ru "Action button." [encoding convertfrom utf-8 "\320\224\320\265\320\271\321\201\321\202\320\262\320\270\321\217."] ::msgcat::mcset sk "Action button." [encoding convertfrom utf-8 "Gomb\303\255k - akcia."] ::msgcat::mcset sq "Action button." [encoding convertfrom utf-8 "pasi te klikoni kete buton, ju mund te futni objekte me mi. kliko ne aksion qe te shohesh menyn."] ::msgcat::mcset bg "Switch mouse mode to select objects." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\270\320\275\320\265\321\202\320\265 \320\275\320\260 \320\274\320\270\321\210\320\272\320\260 \320\267\320\260 \320\264\320\260 \320\270\320\267\320\261\320\270\321\200\320\260\321\202\320\265 \320\276\320\261\320\265\320\272\321\202\320\270"] ::msgcat::mcset cz "Switch mouse mode to select objects." [encoding convertfrom utf-8 "P\305\231epnut\303\255 my\305\241i do v\303\275b\304\233rov\303\251ho m\303\263du."] ::msgcat::mcset de "Switch mouse mode to select objects." [encoding convertfrom utf-8 "Maus umschalten um Objekte auszuw\303\244hlen."] ::msgcat::mcset el "Switch mouse mode to select objects." [encoding convertfrom utf-8 "\316\221\317\206\316\277\317\215 \317\200\316\261\317\204\316\256\317\203\317\204\316\265 \316\265\316\264\317\216 \316\274\317\200\316\277\317\201\316\265\316\257\317\204\316\265 \316\275\316\261 \317\203\317\205\316\273\316\273\316\255\316\276\316\265\317\204\316\265 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\261 \317\203\317\204\316\277\316\275 \316\272\316\261\316\274\316\262\316\254 \316\274\316\265 \317\204\316\277 \317\200\316\277\316\275\317\204\316\257\316\272\316\271."] ::msgcat::mcset en "Switch mouse mode to select objects." [encoding convertfrom utf-8 "After clicking this button, you can select objects on canvas by mouse."] ::msgcat::mcset es "Switch mouse mode to select objects." [encoding convertfrom utf-8 "Tras clicar aqu\303\255, podr\303\241s seleccionar cosas en la topo con el rat\303\263n."] ::msgcat::mcset it "Switch mouse mode to select objects." [encoding convertfrom utf-8 "Cambia la modalit\303\240 del mouse per selezionare oggetti."] ::msgcat::mcset ru "Switch mouse mode to select objects." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\272\320\273\321\216\321\207\320\270\321\202\320\265\321\201\321\214 \320\275\320\260 \320\274\321\213\321\210\321\214, \321\207\321\202\320\276\320\261\321\213 \320\262\321\213\320\261\320\270\321\200\320\260\321\202\321\214 \320\276\320\261\321\212\320\265\320\272\321\202\321\213."] ::msgcat::mcset sk "Switch mouse mode to select objects." [encoding convertfrom utf-8 "Nastav m\303\263d my\305\241i na vyberanie objektov."] ::msgcat::mcset sq "Switch mouse mode to select objects." [encoding convertfrom utf-8 "pasi te klikosh kete buton, ju mund te zgjedhni objektet ne pelhure me mi."] ::msgcat::mcset bg "Action" [encoding convertfrom utf-8 "\320\224\320\265\320\271\321\201\321\202\320\262\320\270\320\265"] ::msgcat::mcset cz "Action" [encoding convertfrom utf-8 "Akce"] ::msgcat::mcset de "Action" [encoding convertfrom utf-8 "Aktion"] ::msgcat::mcset el "Action" [encoding convertfrom utf-8 "\316\225\316\275\317\204\316\277\316\273\316\256"] ::msgcat::mcset en "Action" [encoding convertfrom utf-8 "Action"] ::msgcat::mcset es "Action" [encoding convertfrom utf-8 "Acci\303\263n"] ::msgcat::mcset it "Action" [encoding convertfrom utf-8 "Azione"] ::msgcat::mcset ru "Action" [encoding convertfrom utf-8 "\320\224\320\265\320\271\321\201\321\202\320\262\320\270\320\265"] ::msgcat::mcset sk "Action" [encoding convertfrom utf-8 "Akcia"] ::msgcat::mcset sq "Action" [encoding convertfrom utf-8 "aksion"] ::msgcat::mcset bg "Configure action assigned to action button." [encoding convertfrom utf-8 "\320\224\320\265\320\271\321\201\321\202\320\262\320\270\320\265\321\202\320\276, \320\272\320\276\320\265\321\202\320\276 \320\270\320\267\320\261\320\265\321\200\320\265\321\202\320\265, \321\211\320\265 \320\261\321\212\320\264\320\265 \320\270\320\267\320\277\321\212\320\273\320\275\320\265\320\275\320\265, \320\272\320\273\320\270\320\272\320\260\320\271\320\272\320\270 \320\262/\321\203 \320\261\321\203\321\202\320\276\320\275\320\260 '\320\222\320\274\321\212\320\272\320\275\320\270 <\320\276\320\261\320\265\320\272\321\202>'"] ::msgcat::mcset cz "Configure action assigned to action button." [encoding convertfrom utf-8 "Nastav\303\255 akci pro tla\304\215\303\255tko akc\303\255."] ::msgcat::mcset de "Configure action assigned to action button." [encoding convertfrom utf-8 "Dem Aktionsknopf zugewiesene Aktion konfigurieren."] ::msgcat::mcset el "Configure action assigned to action button." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \316\265\316\275\317\204\316\277\316\273\316\256\317\202 \317\200\316\277\317\205 \316\270\316\261 \316\265\316\272\317\204\316\265\316\273\316\265\316\257\317\204\316\261\316\271 \316\272\316\254\316\275\316\277\316\275\317\204\316\261\317\202 \316\272\316\273\316\271\316\272 \317\203\317\204\316\277 \316\272\316\277\317\205\316\274\317\200\316\257 \316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 <\316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\277>"] ::msgcat::mcset en "Configure action assigned to action button." [encoding convertfrom utf-8 "Action you choose will be executed by clicking on Insert button."] ::msgcat::mcset es "Configure action assigned to action button." [encoding convertfrom utf-8 "Clic para ver men\303\272. La acci\303\263n que escojas ser\303\241 la que ejecute el bot\303\263n Insertar "] ::msgcat::mcset it "Configure action assigned to action button." [encoding convertfrom utf-8 "Configura l'azione assegnata al bottone d'azione."] ::msgcat::mcset ru "Configure action assigned to action button." [encoding convertfrom utf-8 "\320\222\321\213\320\261\320\265\321\200\320\270\321\202\320\265 \320\264\320\265\320\271\321\201\321\202\320\262\320\270\320\265, \320\275\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\275\320\276\320\265 \320\264\320\273\321\217 \320\272\320\275\320\276\320\277\320\272\320\270."] ::msgcat::mcset sk "Configure action assigned to action button." [encoding convertfrom utf-8 "Nakonfiguruj akciu pre gomb\303\255k - akcia."] ::msgcat::mcset sq "Configure action assigned to action button." [encoding convertfrom utf-8 "aksionin qe e zgjedhni do te egzekutohet me klikimin ne butonin Fute "] ::msgcat::mcset bg "Move up" [encoding convertfrom utf-8 "\320\235\320\260\320\263\320\276\321\200\320\265"] ::msgcat::mcset cz "Move up" [encoding convertfrom utf-8 "P\305\231esun v\303\275\305\241"] ::msgcat::mcset de "Move up" [encoding convertfrom utf-8 "Schiebe nach oben"] ::msgcat::mcset el "Move up" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \317\200\317\201\316\277\317\202 \317\204\316\261 \317\200\316\254\316\275\317\211"] ::msgcat::mcset en "Move up" [encoding convertfrom utf-8 "Move up"] ::msgcat::mcset es "Move up" [encoding convertfrom utf-8 "Arriba"] ::msgcat::mcset it "Move up" [encoding convertfrom utf-8 "Sposta s\303\271"] ::msgcat::mcset ru "Move up" [encoding convertfrom utf-8 "\320\222\320\262\320\265\321\200\321\205"] ::msgcat::mcset sk "Move up" [encoding convertfrom utf-8 "Presu\305\210 vy\305\241\305\241ie"] ::msgcat::mcset sq "Move up" [encoding convertfrom utf-8 "levize lart"] ::msgcat::mcset bg "Move file command up in the list." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\275\320\260\320\263\320\276\321\200\320\265 \320\262 \321\201\320\277\320\270\321\201\321\212\320\272\320\260 \321\204\320\260\320\271\320\273\320\260 \321\201 \320\272\320\276\320\274\320\260\320\275\320\264\320\270"] ::msgcat::mcset cz "Move file command up in the list." [encoding convertfrom utf-8 "P\305\231esune p\305\231\303\255kaz v\303\275\305\241 v seznamu p\305\231\303\255kaz\305\257."] ::msgcat::mcset de "Move file command up in the list." [encoding convertfrom utf-8 "In der Liste nach oben schieben."] ::msgcat::mcset el "Move file command up in the list." [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\261\316\275\317\204\316\271\316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205 \317\210\316\267\316\273\317\214\317\204\316\265\317\201\316\261 \317\203\317\204\316\267\316\275 \316\273\316\257\317\203\317\204\316\261. \316\247\317\201\316\256\317\203\316\271\316\274\316\277 \317\203\316\265 \317\200\316\265\317\201\316\257\317\200\317\204\317\211\317\203\316\267 \317\200\316\277\317\205 \316\265\316\257\316\275\316\261\316\271 \317\203\316\265 \316\273\316\254\316\270\316\277\317\202 \317\203\316\272\317\201\316\254\317\200 \317\204\316\277 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\277."] ::msgcat::mcset en "Move file command up in the list." [encoding convertfrom utf-8 "Move object up in the list. Use if object is in wrong scrap."] ::msgcat::mcset es "Move file command up in the list." [encoding convertfrom utf-8 "Desplaza el objeto hacia arriba en la lista. Usar si el objeto est\303\241 en lugar err\303\263neo."] ::msgcat::mcset it "Move file command up in the list." [encoding convertfrom utf-8 "Sposta il comando in s\303\271 nella lista."] ::msgcat::mcset ru "Move file command up in the list." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\274\320\265\321\201\321\202\320\270\321\202\321\214 \320\272\320\276\320\274\320\260\320\275\320\264\321\203 \320\262\320\262\320\265\321\200\321\205 \320\277\320\276 \321\204\320\260\320\271\320\273\321\203."] ::msgcat::mcset sk "Move file command up in the list." [encoding convertfrom utf-8 "Presu\305\210 pr\303\255kaz vy\305\241\305\241ie v zozname pr\303\255kazov."] ::msgcat::mcset sq "Move file command up in the list." [encoding convertfrom utf-8 "levize objektin lart ne liste. Perdor nese objekti eshte ne deponi te gabuar."] ::msgcat::mcset bg "Move down" [encoding convertfrom utf-8 "\320\235\320\260\320\264\320\276\320\273\321\203"] ::msgcat::mcset cz "Move down" [encoding convertfrom utf-8 "P\305\231esun n\303\255\305\276"] ::msgcat::mcset de "Move down" [encoding convertfrom utf-8 "Schiebe nach unten"] ::msgcat::mcset el "Move down" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \317\200\317\201\316\277\317\202 \317\204\316\261 \316\272\316\254\317\204\317\211"] ::msgcat::mcset en "Move down" [encoding convertfrom utf-8 "Move down"] ::msgcat::mcset es "Move down" [encoding convertfrom utf-8 "Abajo"] ::msgcat::mcset it "Move down" [encoding convertfrom utf-8 "Sposta gi\303\271"] ::msgcat::mcset ru "Move down" [encoding convertfrom utf-8 "\320\222\320\275\320\270\320\267"] ::msgcat::mcset sk "Move down" [encoding convertfrom utf-8 "Presu\305\210 ni\305\276\305\241ie"] ::msgcat::mcset sq "Move down" [encoding convertfrom utf-8 "levize poshte"] ::msgcat::mcset bg "Move file command down in the list." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\275\320\260\320\264\320\276\320\273\321\203 \320\262 \321\201\320\277\320\270\321\201\321\212\320\272\320\260 \321\204\320\260\320\271\320\273\320\260 \321\201 \320\272\320\276\320\274\320\260\320\275\320\264\320\270"] ::msgcat::mcset cz "Move file command down in the list." [encoding convertfrom utf-8 "P\305\231esune p\305\231\303\255kaz n\303\255\305\276 v seznamu p\305\231\303\255kaz\305\257."] ::msgcat::mcset de "Move file command down in the list." [encoding convertfrom utf-8 "In der Liste nach unten schieben."] ::msgcat::mcset el "Move file command down in the list." [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\261\316\275\317\204\316\271\316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205 \317\207\316\261\316\274\316\267\316\273\317\214\317\204\316\265\317\201\316\261 \317\203\317\204\316\267\316\275 \316\273\316\257\317\203\317\204\316\261. \316\247\317\201\316\256\317\203\316\271\316\274\316\277 \317\203\316\265 \317\200\316\265\317\201\316\257\317\200\317\204\317\211\317\203\316\267 \317\200\316\277\317\205 \316\265\316\257\316\275\316\261\316\271 \317\203\316\265 \316\273\316\254\316\270\316\277\317\202 \317\203\316\272\317\201\316\254\317\200 \317\204\316\277 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\277."] ::msgcat::mcset en "Move file command down in the list." [encoding convertfrom utf-8 "Move object down in the list. Use if object is in wrong scrap."] ::msgcat::mcset es "Move file command down in the list." [encoding convertfrom utf-8 "Desplaza el objeto hacia abajo en la lista. Usar si el objeto est\303\241 en lugar err\303\263neo."] ::msgcat::mcset it "Move file command down in the list." [encoding convertfrom utf-8 "Sposta il comando in gi\303\271 nella lista."] ::msgcat::mcset ru "Move file command down in the list." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\274\320\265\321\201\321\202\320\270\321\202\321\214 \320\272\320\276\320\274\320\260\320\275\320\264\321\203 \320\262\320\275\320\270\320\267 \320\277\320\276 \321\204\320\260\320\271\320\273\321\203."] ::msgcat::mcset sk "Move file command down in the list." [encoding convertfrom utf-8 "Presu\305\210 pr\303\255kaz ni\305\276\305\241ie v zozname pr\303\255kazov."] ::msgcat::mcset sq "Move file command down in the list." [encoding convertfrom utf-8 "levize objektin poshte ne liste. Perdore nese objekti eshte ne deponi te gabuar."] ::msgcat::mcset bg "Move file command to given position." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \321\204\320\260\320\271\320\273\320\260 \321\201 \320\272\320\276\320\274\320\260\320\275\320\264\320\270 \320\275\320\260 \321\203\320\272\320\260\320\267\320\260\320\275\320\260\321\202\320\260 \320\277\320\276\320\267\320\270\321\206\320\270\321\217"] ::msgcat::mcset cz "Move file command to given position." [encoding convertfrom utf-8 "P\305\231esunout p\305\231\303\255kaz na danou pozici v seznamu."] ::msgcat::mcset de "Move file command to given position." [encoding convertfrom utf-8 "Befehl an angegebene Position schieben."] ::msgcat::mcset el "Move file command to given position." [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\261\316\275\317\204\316\271\316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205 \317\203\316\265 \317\203\317\205\316\263\316\272\316\265\316\272\317\201\316\271\316\274\316\255\316\275\316\267 \316\270\316\255\317\203\316\267 (\316\270\316\255\317\203\316\267 = \316\261\317\201\316\271\316\270\316\274\317\214\317\202 \317\203\316\265 \316\272\316\254\316\270\316\265 \317\203\316\265\316\271\317\201\316\254)."] ::msgcat::mcset en "Move file command to given position." [encoding convertfrom utf-8 "Move object to given position (position = number on each line)."] ::msgcat::mcset es "Move file command to given position." [encoding convertfrom utf-8 "Mover el objeto a la posici\303\263n indicada (n\303\272mero al principio de cada l\303\255nea)."] ::msgcat::mcset it "Move file command to given position." [encoding convertfrom utf-8 "Sposta il comando nella posizione specificata."] ::msgcat::mcset ru "Move file command to given position." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\274\320\265\321\201\321\202\320\270\321\202\321\214 \320\272\320\276\320\274\320\260\320\275\320\264\321\203 \320\262 \321\203\320\272\320\260\320\267\320\260\320\275\320\275\321\203\321\216 \320\277\320\276\320\267\320\270\321\206\320\270\321\216 \320\262 \321\204\320\260\320\271\320\273\320\265."] ::msgcat::mcset sk "Move file command to given position." [encoding convertfrom utf-8 "Presu\305\210 pr\303\255kaz na dan\303\272 poz\303\255ciu v zozname."] ::msgcat::mcset sq "Move file command to given position." [encoding convertfrom utf-8 "levize objektin ne pozicion te dhanun( pozicioni = numri ne secilen rjesht)."] ::msgcat::mcset bg "Select destination scrap and position in it." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\265\321\202\320\265 \320\274\320\265\321\201\321\202\320\276\320\275\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\320\265\321\202\320\276 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277 \320\270 \320\277\320\276\320\267\320\270\321\206\320\270\321\217\321\202\320\260 \320\262 \320\275\320\265\320\263\320\276"] ::msgcat::mcset cz "Select destination scrap and position in it." [encoding convertfrom utf-8 "V\303\275b\304\233r c\303\255lov\303\251ho scrapu a pozice v n\304\233m."] ::msgcat::mcset de "Select destination scrap and position in it." [encoding convertfrom utf-8 "Zielskizze ausw\303\244hlen und positionieren."] ::msgcat::mcset el "Select destination scrap and position in it." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\255\316\276\316\265\317\204\316\265 \317\204\316\277 \317\203\316\272\317\201\316\261\317\200 \317\200\317\201\316\277\316\277\317\201\316\271\317\203\316\274\316\277\317\215 \316\272\316\261\316\271 \317\204\316\267\316\275 \316\270\316\255\317\203\316\267 \316\274\316\255\317\203\316\261 \317\203\316\265 \316\261\317\205\317\204\317\214."] ::msgcat::mcset en "Select destination scrap and position in it." [encoding convertfrom utf-8 "Select destination scrap and position in it."] ::msgcat::mcset es "Select destination scrap and position in it." [encoding convertfrom utf-8 "Seleccionar croquis de destino y la posici\303\263n en \303\251l."] ::msgcat::mcset it "Select destination scrap and position in it." [encoding convertfrom utf-8 "Selezione lo scrap di destinazione e posizionati in esso."] ::msgcat::mcset ru "Select destination scrap and position in it." [encoding convertfrom utf-8 "\320\243\320\272\320\260\320\266\320\270\321\202\320\265 \321\206\320\265\320\273\320\265\320\262\320\276\320\271 \321\201\320\272\321\200\320\260\320\277 \320\270 \320\277\320\276\320\267\320\270\321\206\320\270\321\216 \320\262 \320\275\320\265\320\274."] ::msgcat::mcset sk "Select destination scrap and position in it." [encoding convertfrom utf-8 "Nastav cie\304\276ov\303\275 scrap a poz\303\255ciu v \305\210om."] ::msgcat::mcset sq "Select destination scrap and position in it." [encoding convertfrom utf-8 "zgjedhe destinacionin per deponi dhe poziciono ne te."] ::msgcat::mcset bg "Update text" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270 \321\202\320\265\320\272\321\201\321\202\320\260"] ::msgcat::mcset cz "Update text" [encoding convertfrom utf-8 "Aktualizovat"] ::msgcat::mcset de "Update text" [encoding convertfrom utf-8 "Text aktualisieren"] ::msgcat::mcset el "Update text" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\275\316\255\317\211\317\203\316\267 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset en "Update text" [encoding convertfrom utf-8 "Update text"] ::msgcat::mcset es "Update text" [encoding convertfrom utf-8 "Actualizar texto"] ::msgcat::mcset it "Update text" [encoding convertfrom utf-8 "Aggiorna testo"] ::msgcat::mcset ru "Update text" [encoding convertfrom utf-8 "\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214 \321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset sk "Update text" [encoding convertfrom utf-8 "Aktualizuj text"] ::msgcat::mcset sq "Update text" [encoding convertfrom utf-8 "aktualizo tekstin"] ::msgcat::mcset bg "Press this button to save code you have written." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\267\320\260 \320\264\320\260 \320\267\320\260\320\277\320\260\320\267\320\270\321\202\320\265 \320\275\320\260\320\277\320\270\321\201\320\260\320\275\320\270\321\217\321\202 \320\272\320\276\320\264"] ::msgcat::mcset cz "Press this button to save code you have written." [encoding convertfrom utf-8 "Stiskn\304\233te toto tla\304\215\303\255tko pro ulo\305\276en\303\255 V\303\241mi zapsan\303\251ho k\303\263du."] ::msgcat::mcset de "Press this button to save code you have written." [encoding convertfrom utf-8 "Diesen Knopf dr\303\274cken, um Daten zu speichern."] ::msgcat::mcset el "Press this button to save code you have written." [encoding convertfrom utf-8 "\316\240\316\261\317\204\316\256\317\203\317\204\316\265 \317\204\316\277 \316\272\316\277\317\205\316\274\317\200\316\257 \316\275\316\261 \316\261\317\200\316\277\316\270\316\267\316\272\316\265\317\205\317\204\316\265\316\257 \316\277 \316\272\317\216\316\264\316\271\316\272\316\261\317\202 \317\200\316\277\317\205 \316\263\317\201\316\254\317\210\316\261\317\204\316\265"] ::msgcat::mcset en "Press this button to save code you have written." [encoding convertfrom utf-8 "Press this button to save code you have written."] ::msgcat::mcset es "Press this button to save code you have written." [encoding convertfrom utf-8 "Clicar aqu\303\255 para guardar los cambios hechos en el c\303\263digo."] ::msgcat::mcset it "Press this button to save code you have written." [encoding convertfrom utf-8 "Premi questo bottone per salvare il codice che hai scritto."] ::msgcat::mcset ru "Press this button to save code you have written." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\264\320\273\321\217 \321\201\320\276\321\205\321\200\320\260\320\275\320\265\320\275\320\270\321\217 \320\275\320\260\320\277\320\270\321\201\320\260\320\275\320\275\320\276\320\263\320\276 \320\272\320\276\320\264\320\260."] ::msgcat::mcset sk "Press this button to save code you have written." [encoding convertfrom utf-8 "Stla\304\215te toto tla\304\215\303\255tko pre ulo\305\276enie Vami zap\303\255san\303\251ho k\303\263du."] ::msgcat::mcset sq "Press this button to save code you have written." [encoding convertfrom utf-8 "shtype kete buton ta ruajsh kodin te cilin e ke shkru."] ::msgcat::mcset bg "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\267\320\260 \320\277\321\200\320\276\320\270\320\267\320\262\320\276\320\273\320\265\320\275 \321\202\320\265\320\272\321\201\321\202 \320\262 2D \321\204\320\260\320\271\320\273\320\260"] ::msgcat::mcset cz "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "Editor pro text ve 2D souborech."] ::msgcat::mcset de "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "Editor f\303\274r Freitext in Therion 2D Datei."] ::msgcat::mcset el "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "\316\247\317\201\316\267\317\203\316\271\316\274\316\277\317\200\316\277\316\271\316\265\316\257\317\204\316\265 \317\204\316\277\316\275 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256 \316\261\317\205\317\204\317\214 \316\263\316\271\316\261 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\316\257\316\261 \316\261\317\201\317\207\316\265\316\257\317\211\316\275 .th2"] ::msgcat::mcset en "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "Use this editor window to modify .th2 files."] ::msgcat::mcset es "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "Usa este editor para modificar los archivos .th2. Otros editores dar\303\241n problemas."] ::msgcat::mcset it "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "Editor di testo libero per il file 2D di therion."] ::msgcat::mcset ru "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\277\321\200\320\276\320\270\320\267\320\262\320\276\320\273\321\214\320\275\320\276\320\263\320\276 \321\202\320\265\320\272\321\201\321\202\320\260 \320\262 2D \321\204\320\260\320\271\320\273\320\265."] ::msgcat::mcset sk "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "Editor pre \305\241peci\303\241lne pr\303\255kazy v 2D s\303\272boroch."] ::msgcat::mcset sq "Editor for free text in therion 2D file." [encoding convertfrom utf-8 "perdore kete dritare per permiresim qe te modofikosh. Th2 arkivin."] ::msgcat::mcset bg "expression" [encoding convertfrom utf-8 "\320\270\320\267\321\200\320\260\320\267"] ::msgcat::mcset cz "expression" [encoding convertfrom utf-8 "v\303\275raz"] ::msgcat::mcset de "expression" [encoding convertfrom utf-8 "Muster"] ::msgcat::mcset el "expression" [encoding convertfrom utf-8 "\316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\263\316\271\316\261"] ::msgcat::mcset en "expression" [encoding convertfrom utf-8 "search for"] ::msgcat::mcset es "expression" [encoding convertfrom utf-8 "buscar"] ::msgcat::mcset it "expression" [encoding convertfrom utf-8 "testo"] ::msgcat::mcset ru "expression" [encoding convertfrom utf-8 "\320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "expression" [encoding convertfrom utf-8 "v\303\275raz"] ::msgcat::mcset sq "expression" [encoding convertfrom utf-8 "kerko per"] ::msgcat::mcset bg "Enter search expression." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \320\264\321\203\320\274\320\260/\320\270 \320\267\320\260 \321\202\321\212\321\200\321\201\320\265\320\275\320\265"] ::msgcat::mcset cz "Enter search expression." [encoding convertfrom utf-8 "Vlo\305\276te hledan\303\275 v\303\275raz."] ::msgcat::mcset de "Enter search expression." [encoding convertfrom utf-8 "Suchmuster eingeben."] ::msgcat::mcset el "Enter search expression." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\273\316\255\316\276\316\265\316\271\317\202 \316\263\316\271\316\261 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267"] ::msgcat::mcset en "Enter search expression." [encoding convertfrom utf-8 "Enter word(s) to search for."] ::msgcat::mcset es "Enter search expression." [encoding convertfrom utf-8 "Introducir palabra(s) a buscar."] ::msgcat::mcset it "Enter search expression." [encoding convertfrom utf-8 "Scrivi il testo da cercare."] ::msgcat::mcset ru "Enter search expression." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\270\321\201\320\272\320\260."] ::msgcat::mcset sk "Enter search expression." [encoding convertfrom utf-8 "Vlo\305\276te h\304\276adan\303\275 v\303\275raz."] ::msgcat::mcset sq "Enter search expression." [encoding convertfrom utf-8 "fute fjalin qe do ta kerkosh."] ::msgcat::mcset bg "regular expression" [encoding convertfrom utf-8 "\321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\265\320\275 \320\270\320\267\321\200\320\260\320\267"] ::msgcat::mcset cz "regular expression" [encoding convertfrom utf-8 "regul\303\241rn\303\255 v\303\275raz"] ::msgcat::mcset de "regular expression" [encoding convertfrom utf-8 "Regul\303\244rer Ausdruck"] ::msgcat::mcset el "regular expression" [encoding convertfrom utf-8 "\316\247\317\201\316\256\317\203\316\267 \316\274\317\200\316\261\316\273\316\261\316\275\317\204\316\255\317\201"] ::msgcat::mcset en "regular expression" [encoding convertfrom utf-8 "regular expression"] ::msgcat::mcset es "regular expression" [encoding convertfrom utf-8 "patr\303\263n regular (kob.*)"] ::msgcat::mcset it "regular expression" [encoding convertfrom utf-8 "espressione regolare"] ::msgcat::mcset ru "regular expression" [encoding convertfrom utf-8 "\321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\275\320\276\320\265 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "regular expression" [encoding convertfrom utf-8 "regul\303\241rny v\303\275raz"] ::msgcat::mcset sq "regular expression" [encoding convertfrom utf-8 "shprehje e rregullt"] ::msgcat::mcset bg "Search for regular expression." [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \320\277\320\276 \321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\265\320\275 \320\270\320\267\321\200\320\260\320\267"] ::msgcat::mcset cz "Search for regular expression." [encoding convertfrom utf-8 "Vyhled\303\241v\303\241n\303\255 regul\303\241rn\303\255ho v\303\275razu."] ::msgcat::mcset de "Search for regular expression." [encoding convertfrom utf-8 "Suche nach regul\303\244rem Ausdruck."] ::msgcat::mcset el "Search for regular expression." [encoding convertfrom utf-8 "\316\247\317\201\316\256\317\203\316\267 \316\274\317\200\316\261\316\273\316\261\316\275\317\204\316\255\317\201 \317\203\317\204\316\267\316\275 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 (\317\203\317\200\316\256.* \316\270\316\261 \316\262\317\201\316\265\316\271 \317\203\317\200\316\256\316\273\316\261\316\271\316\277, \317\203\317\200\316\256\316\273\316\261\316\271\316\261, \317\203\317\200\316\256\316\272\316\265\317\201)"] ::msgcat::mcset en "Search for regular expression." [encoding convertfrom utf-8 "Use wildcards on search (cav.* will find cave, cavern, cavalier...)"] ::msgcat::mcset es "Search for regular expression." [encoding convertfrom utf-8 "Usar comodines en la b\303\272squeda (kob.* encuentra koba, kobea, kobie, etc)."] ::msgcat::mcset it "Search for regular expression." [encoding convertfrom utf-8 "Cerca espressione regolare."] ::msgcat::mcset ru "Search for regular expression." [encoding convertfrom utf-8 "\320\230\321\201\320\272\320\260\321\202\321\214 \320\277\320\276 \321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\275\320\276\320\274\321\203 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\321\216."] ::msgcat::mcset sk "Search for regular expression." [encoding convertfrom utf-8 "Vyh\304\276ad\303\241vanie regul\303\241rneho v\303\275razu."] ::msgcat::mcset sq "Search for regular expression." [encoding convertfrom utf-8 "kerko per shprehje te rregullt."] ::msgcat::mcset bg "case sensitive" [encoding convertfrom utf-8 "\320\276\321\202\321\207\320\270\321\202\320\260 \321\201\320\265 \321\200\320\265\320\263\320\270\321\201\321\202\321\212\321\200\320\260"] ::msgcat::mcset cz "case sensitive" [encoding convertfrom utf-8 "rozli\305\241ovat velikost p\303\255smen"] ::msgcat::mcset de "case sensitive" [encoding convertfrom utf-8 "Gro\303\237- und Kleinschreibung ber\303\274cksichtigen"] ::msgcat::mcset el "case sensitive" [encoding convertfrom utf-8 "case sensitive"] ::msgcat::mcset en "case sensitive" [encoding convertfrom utf-8 "case sensitive"] ::msgcat::mcset es "case sensitive" [encoding convertfrom utf-8 "distinguir may\303\272sculas"] ::msgcat::mcset it "case sensitive" [encoding convertfrom utf-8 "case-sensitive"] ::msgcat::mcset ru "case sensitive" [encoding convertfrom utf-8 "\321\203\321\207\320\270\321\202\321\213\320\262\320\260\321\202\321\214 \321\200\320\265\320\263\320\270\321\201\321\202\321\200"] ::msgcat::mcset sk "case sensitive" [encoding convertfrom utf-8 "rozli\305\241ova\305\245 ve\304\276kos\305\245"] ::msgcat::mcset sq "case sensitive" [encoding convertfrom utf-8 "rast I ndjeshem-senzitiv"] ::msgcat::mcset bg "Case sensitive search." [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \321\201 \320\276\321\202\321\207\320\270\321\202\320\260\320\275\320\265 \320\275\320\260 \321\200\320\265\320\263\320\270\321\201\321\202\321\212\321\200\320\260"] ::msgcat::mcset cz "Case sensitive search." [encoding convertfrom utf-8 "Vyhled\303\241v\303\241n\303\255 s rozli\305\241en\303\255m velikosti p\303\255smen."] ::msgcat::mcset de "Case sensitive search." [encoding convertfrom utf-8 "Suche mit Gro\303\237- und Kleinbuchstaben."] ::msgcat::mcset el "Case sensitive search." [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 case sensitive"] ::msgcat::mcset en "Case sensitive search." [encoding convertfrom utf-8 "Case sensitive search."] ::msgcat::mcset es "Case sensitive search." [encoding convertfrom utf-8 "B\303\272squeda sensible a las may\303\272sculas."] ::msgcat::mcset it "Case sensitive search." [encoding convertfrom utf-8 "Ricerca case-sensistive"] ::msgcat::mcset ru "Case sensitive search." [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272 \321\201 \321\203\321\207\320\265\321\202\320\276\320\274 \321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\260."] ::msgcat::mcset sk "Case sensitive search." [encoding convertfrom utf-8 "Vyh\304\276ad\303\241vanie s rozli\305\241ovan\303\255m ve\304\276k\303\275ch a mal\303\275ch p\303\255smen."] ::msgcat::mcset sq "Case sensitive search." [encoding convertfrom utf-8 "kerko rast senzitiv"] ::msgcat::mcset bg "Find next" [encoding convertfrom utf-8 "\321\201\320\273\320\265\320\264\320\262\320\260\321\211"] ::msgcat::mcset cz "Find next" [encoding convertfrom utf-8 "Naj\303\255t dal\305\241\303\255"] ::msgcat::mcset de "Find next" [encoding convertfrom utf-8 "N\303\244chste Stelle finden"] ::msgcat::mcset el "Find next" [encoding convertfrom utf-8 "\316\225\317\215\317\201\316\265\317\203\316\267 \316\265\317\200\316\277\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset en "Find next" [encoding convertfrom utf-8 "Find next"] ::msgcat::mcset es "Find next" [encoding convertfrom utf-8 "Siguiente"] ::msgcat::mcset it "Find next" [encoding convertfrom utf-8 "Prossimo"] ::msgcat::mcset ru "Find next" [encoding convertfrom utf-8 "\320\241\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\271"] ::msgcat::mcset sk "Find next" [encoding convertfrom utf-8 "Nasleduj\303\272ci"] ::msgcat::mcset sq "Find next" [encoding convertfrom utf-8 "gjeje tjetren me radhe"] ::msgcat::mcset bg "Select next object matching expression." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\270\321\217\321\202 \320\276\320\261\320\265\320\272\321\202 \320\275\320\260 \321\202\321\212\321\200\321\201\320\265\320\275\320\265\321\202\320\276"] ::msgcat::mcset cz "Select next object matching expression." [encoding convertfrom utf-8 "Vybere dal\305\241\303\255 objekt odpov\303\255daj\303\255c\303\255 v\303\275razu."] ::msgcat::mcset de "Select next object matching expression." [encoding convertfrom utf-8 "N\303\244chstes Objekt ausw\303\244hlen, das auf Muster passt."] ::msgcat::mcset el "Select next object matching expression." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \316\265\317\200\317\214\316\274\316\265\316\275\316\277\317\205 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\277\317\205 \317\200\316\277\317\205 \317\204\316\261\316\271\317\201\316\271\316\254\316\266\316\265\316\271 \317\203\317\204\316\267\316\275 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267"] ::msgcat::mcset en "Select next object matching expression." [encoding convertfrom utf-8 "Select next object matching expression."] ::msgcat::mcset es "Select next object matching expression." [encoding convertfrom utf-8 "Selecionar siguiente objeto encontrado."] ::msgcat::mcset it "Select next object matching expression." [encoding convertfrom utf-8 "Seleziona il prossimo oggetto trovato"] ::msgcat::mcset ru "Select next object matching expression." [encoding convertfrom utf-8 "\320\222\321\213\320\261\321\200\320\260\321\202\321\214 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\271 \320\276\320\261\321\212\320\265\320\272\321\202, \321\201\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\271 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\321\216 \320\277\320\276\320\270\321\201\320\272\320\260."] ::msgcat::mcset sk "Select next object matching expression." [encoding convertfrom utf-8 "N\303\241jdi \304\217al\305\241\303\255 objekt zodpovedaj\303\272ci h\304\276adan\303\251mu v\303\275razu."] ::msgcat::mcset sq "Select next object matching expression." [encoding convertfrom utf-8 "zgjedhe objektin tjeter me radhe te shprehjes qe pershtatet"] ::msgcat::mcset bg "Find first" [encoding convertfrom utf-8 "\320\235\320\260\320\274\320\262\320\265\321\200\320\270 \320\277\321\212\321\200\320\262\320\270\321\217\321\202"] ::msgcat::mcset cz "Find first" [encoding convertfrom utf-8 "Naj\303\255t prvn\303\255"] ::msgcat::mcset de "Find first" [encoding convertfrom utf-8 "Finde erstes"] ::msgcat::mcset el "Find first" [encoding convertfrom utf-8 "\316\225\317\215\317\201\316\265\317\203\316\267 \317\200\317\201\317\216\317\204\316\277\317\205"] ::msgcat::mcset en "Find first" [encoding convertfrom utf-8 "Search"] ::msgcat::mcset es "Find first" [encoding convertfrom utf-8 "Buscar"] ::msgcat::mcset it "Find first" [encoding convertfrom utf-8 "Cerca"] ::msgcat::mcset ru "Find first" [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\262\321\213\320\271"] ::msgcat::mcset sk "Find first" [encoding convertfrom utf-8 "N\303\241jdi prv\303\275"] ::msgcat::mcset sq "Find first" [encoding convertfrom utf-8 "kerko te parin"] ::msgcat::mcset bg "Select first object matching expression." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \320\277\321\212\321\200\320\262\320\270\321\217\321\202 \320\276\320\261\320\265\320\272\321\202 \320\275\320\260 \321\202\321\212\321\200\321\201\320\265\320\275\320\265\321\202\320\276"] ::msgcat::mcset cz "Select first object matching expression." [encoding convertfrom utf-8 "Vybere prvn\303\255 objekt odpov\303\255daj\303\255c\303\255 v\303\275razu."] ::msgcat::mcset de "Select first object matching expression." [encoding convertfrom utf-8 "Erstes Objekt finden, das auf Muster passt."] ::msgcat::mcset el "Select first object matching expression." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \317\200\317\201\317\216\317\204\316\277\317\205 \316\261\316\275\317\204\316\271\316\272\316\265\316\257\316\274\316\265\316\275\316\277\317\205 \317\200\316\277\317\205 \317\204\316\261\316\271\317\201\316\271\316\254\316\266\316\265\316\271 \317\203\317\204\316\267\316\275 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267"] ::msgcat::mcset en "Select first object matching expression." [encoding convertfrom utf-8 "Selects first object matching expression."] ::msgcat::mcset es "Select first object matching expression." [encoding convertfrom utf-8 "Selecionar el primer objeto encontrado."] ::msgcat::mcset it "Select first object matching expression." [encoding convertfrom utf-8 "Seleziona il primo oggetto trovato"] ::msgcat::mcset ru "Select first object matching expression." [encoding convertfrom utf-8 "\320\222\321\213\320\261\321\200\320\260\321\202\321\214 \320\277\320\265\321\200\320\262\321\213\320\271 \320\276\320\261\321\212\320\265\320\272\321\202, \321\201\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\271 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\321\216 \320\277\320\276\320\270\321\201\320\272\320\260."] ::msgcat::mcset sk "Select first object matching expression." [encoding convertfrom utf-8 "N\303\241jdi prv\303\275 objekt zodpovedaj\303\272ci h\304\276adan\303\251mu v\303\275razu."] ::msgcat::mcset sq "Select first object matching expression." [encoding convertfrom utf-8 "zgjedh objektin e pare te shprehjes qe pershtatet"] ::msgcat::mcset bg "Show all" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\266\320\270 \320\262\321\201\320\270\321\207\320\272\320\276"] ::msgcat::mcset cz "Show all" [encoding convertfrom utf-8 "Zobrazit v\305\241e"] ::msgcat::mcset de "Show all" [encoding convertfrom utf-8 "Zeige alles"] ::msgcat::mcset el "Show all" [encoding convertfrom utf-8 "\316\225\316\274\317\206\316\254\316\275\316\271\317\203\316\267 \317\214\316\273\317\211\316\275"] ::msgcat::mcset en "Show all" [encoding convertfrom utf-8 "Show all"] ::msgcat::mcset es "Show all" [encoding convertfrom utf-8 "Mostrar todo"] ::msgcat::mcset it "Show all" [encoding convertfrom utf-8 "Tutti"] ::msgcat::mcset ru "Show all" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214 \320\262\321\201\320\265"] ::msgcat::mcset sk "Show all" [encoding convertfrom utf-8 "Ozna\304\215 v\305\241etky"] ::msgcat::mcset sq "Show all" [encoding convertfrom utf-8 "tregoji te gjitha"] ::msgcat::mcset bg "Highlight all objects matching expression." [encoding convertfrom utf-8 "\320\236\321\201\320\262\320\265\321\202\320\270 \320\262\321\201\320\270\321\207\320\272\320\270 \320\276\320\261\320\265\320\272\321\202\320\270, \321\201\321\212\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\320\260\321\211\320\270 \320\275\320\260 \321\202\321\212\321\200\321\201\320\265\320\275\320\265\321\202\320\276"] ::msgcat::mcset cz "Highlight all objects matching expression." [encoding convertfrom utf-8 "Zv\303\275razn\303\255 v\305\241echny objekty odpov\303\255daj\303\255c\303\255 v\303\275razu."] ::msgcat::mcset de "Highlight all objects matching expression." [encoding convertfrom utf-8 "Alle Objekte hervorheben, die auf Muster passen."] ::msgcat::mcset el "Highlight all objects matching expression." [encoding convertfrom utf-8 "\316\244\317\214\316\275\317\211\317\203\316\267 \317\214\316\273\317\211\316\275 \317\214\317\203\317\211\316\275 \317\204\316\261\316\271\317\201\316\271\316\254\316\266\316\277\317\205\316\275 \317\203\317\204\316\267\316\275 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267."] ::msgcat::mcset en "Highlight all objects matching expression." [encoding convertfrom utf-8 "Highlight all objects matching expression."] ::msgcat::mcset es "Highlight all objects matching expression." [encoding convertfrom utf-8 "Seleccionar todos los objetos encontrados."] ::msgcat::mcset it "Highlight all objects matching expression." [encoding convertfrom utf-8 "Evidenzia tutti gli oggetti trovati"] ::msgcat::mcset ru "Highlight all objects matching expression." [encoding convertfrom utf-8 "\320\237\320\276\320\264\321\201\320\262\320\265\321\202\320\270\321\202\321\214 \320\262\321\201\320\265 \320\276\320\261\321\212\320\265\320\272\321\202\321\213, \321\201\320\276\320\276\321\202\320\262\320\265\321\202\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\265 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\321\216 \320\277\320\276\320\270\321\201\320\272\320\260."] ::msgcat::mcset sk "Highlight all objects matching expression." [encoding convertfrom utf-8 "Zv\303\275razn\303\255 v\305\241etky objekty zodpovedaj\303\272ce h\304\276adan\303\251mu v\303\275razu."] ::msgcat::mcset sq "Highlight all objects matching expression." [encoding convertfrom utf-8 "zghedh te gjitha objektet qe pershtaten me shprehjen"] ::msgcat::mcset bg "Clear all" [encoding convertfrom utf-8 "\320\230\320\267\321\207\320\270\321\201\321\202\320\270 \320\262\321\201\320\270\321\207\320\272\320\276"] ::msgcat::mcset cz "Clear all" [encoding convertfrom utf-8 "Zru\305\241 v\303\275b\304\233r"] ::msgcat::mcset de "Clear all" [encoding convertfrom utf-8 "Alles l\303\266schen"] ::msgcat::mcset el "Clear all" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\257\317\201\316\265\317\203\316\267 \317\214\316\273\317\211\316\275"] ::msgcat::mcset en "Clear all" [encoding convertfrom utf-8 "Clear all"] ::msgcat::mcset es "Clear all" [encoding convertfrom utf-8 "Deseleccionar"] ::msgcat::mcset it "Clear all" [encoding convertfrom utf-8 "Cancella"] ::msgcat::mcset ru "Clear all" [encoding convertfrom utf-8 "\320\236\321\207\320\270\321\201\321\202\320\270\321\202\321\214 \320\262\321\201\320\265"] ::msgcat::mcset sk "Clear all" [encoding convertfrom utf-8 "Zru\305\241 v\303\275ber"] ::msgcat::mcset sq "Clear all" [encoding convertfrom utf-8 "fshij krejt"] ::msgcat::mcset bg "Clear highlighted objects." [encoding convertfrom utf-8 "\320\230\320\267\321\207\320\265\321\201\321\202\320\270 \320\276\321\201\320\262\320\265\321\202\321\217\320\262\320\260\320\275\320\265\321\202\320\276 \320\275\320\260 \320\262\321\201\320\270\321\207\320\272\320\270 \320\276\320\261\320\265\320\272\321\202\320\270"] ::msgcat::mcset cz "Clear highlighted objects." [encoding convertfrom utf-8 "Zru\305\241\303\255 zv\303\275razn\304\233n\303\255 vybran\303\275ch objekt\305\257."] ::msgcat::mcset de "Clear highlighted objects." [encoding convertfrom utf-8 "Hervorgehobene Objekte l\303\266schen."] ::msgcat::mcset el "Clear highlighted objects." [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\257\317\201\316\265\317\203\316\267 \317\204\317\211\316\275 \317\204\316\277\316\275\316\271\317\203\316\270\316\255\316\275\317\204\317\211\316\275"] ::msgcat::mcset en "Clear highlighted objects." [encoding convertfrom utf-8 "Clear highlighted objects."] ::msgcat::mcset es "Clear highlighted objects." [encoding convertfrom utf-8 "Deseleccionar todos los objetos resaltados."] ::msgcat::mcset it "Clear highlighted objects." [encoding convertfrom utf-8 "Togli l'evidenziazione degli oggetti."] ::msgcat::mcset ru "Clear highlighted objects." [encoding convertfrom utf-8 "\320\241\320\275\321\217\321\202\321\214 \320\277\320\276\320\264\321\201\320\262\320\265\321\202\320\272\321\203 \321\201\320\276 \320\262\321\201\320\265\321\205 \320\276\320\261\321\212\320\265\320\272\321\202\320\276\320\262."] ::msgcat::mcset sk "Clear highlighted objects." [encoding convertfrom utf-8 "Zru\305\241\303\255 zv\303\275raznenie vybrat\303\275ch objektov."] ::msgcat::mcset sq "Clear highlighted objects." [encoding convertfrom utf-8 "fshij objektet e zgjedhura-te hijezuara"] ::msgcat::mcset bg "loading images module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\267\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset cz "loading images module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m obr\303\241zkov\303\275 modul ..."] ::msgcat::mcset de "loading images module ..." [encoding convertfrom utf-8 "Lade Bildmodul ..."] ::msgcat::mcset el "loading images module ..." [encoding convertfrom utf-8 "\317\206\316\277\317\201\317\204\316\257\316\266\316\265\317\204\316\261\316\271 \316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261 \316\265\316\271\316\272\317\214\316\275\317\211\316\275..."] ::msgcat::mcset en "loading images module ..." [encoding convertfrom utf-8 "loading images module ..."] ::msgcat::mcset es "loading images module ..." [encoding convertfrom utf-8 "im\303\241genes ..."] ::msgcat::mcset it "loading images module ..." [encoding convertfrom utf-8 "modulo immagini ..."] ::msgcat::mcset ru "loading images module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\271..."] ::msgcat::mcset sk "loading images module ..." [encoding convertfrom utf-8 "nahr\303\241vam obr\303\241zkov\303\275 modul..."] ::msgcat::mcset sq "loading images module ..." [encoding convertfrom utf-8 "duke lexuar modulin e imazhit\342\200\246"] ::msgcat::mcset bg "Select background image." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \321\204\320\276\320\275\320\276\320\262\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Select background image." [encoding convertfrom utf-8 "V\303\275b\304\233r podkladov\303\251ho obr\303\241zku."] ::msgcat::mcset de "Select background image." [encoding convertfrom utf-8 "W\303\244hle Hintergrundbild."] ::msgcat::mcset el "Select background image." [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \317\203\317\204\316\277\316\275 \316\272\316\261\317\204\316\254\316\273\316\277\316\263\316\277 \316\275\316\261 \316\265\317\200\316\271\316\273\316\255\316\276\316\265\317\204\316\265 \317\204\316\267\316\275 \316\265\316\271\316\272\317\214\316\275\316\261 \317\200\316\277\317\205 \316\261\316\275\317\204\316\271\317\203\317\204\316\277\316\271\317\207\316\265\316\257."] ::msgcat::mcset en "Select background image." [encoding convertfrom utf-8 "Click on a line in the list to select correspondin image."] ::msgcat::mcset es "Select background image." [encoding convertfrom utf-8 "Al clicar un rengl\303\263n, seleccionar\303\241s la imagen de fondo correspondiente."] ::msgcat::mcset it "Select background image." [encoding convertfrom utf-8 "Seleziona l'immagine di background."] ::msgcat::mcset ru "Select background image." [encoding convertfrom utf-8 "\320\222\321\213\320\261\320\276\321\200 \321\204\320\276\320\275\320\276\320\262\320\276\320\263\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217."] ::msgcat::mcset sk "Select background image." [encoding convertfrom utf-8 "Ozna\304\215 obr\303\241zok na pozad\303\255."] ::msgcat::mcset sq "Select background image." [encoding convertfrom utf-8 "kliko rreshtin ne liste qe te zgjedhesh imazhin qe pershtatet."] ::msgcat::mcset bg "Insert new background image." [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\275\320\276\320\262\320\276 \321\204\320\276\320\275\320\276\320\262\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Insert new background image." [encoding convertfrom utf-8 "Vlo\305\276en\303\255 nov\303\251ho podkladov\303\251ho obr\303\241zku."] ::msgcat::mcset de "Insert new background image." [encoding convertfrom utf-8 "Neues Hintergrundbild einf\303\274gen."] ::msgcat::mcset el "Insert new background image." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\275\316\255\316\261\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202 \317\206\317\214\316\275\317\204\316\277\317\205 (\317\200.\317\207. \316\261\317\201\317\207\316\265\316\257\316\277 .xvi \316\256 \317\210\316\267\317\206\316\271\316\261\316\272\317\214 \317\203\317\207\316\255\316\264\316\271\316\277)"] ::msgcat::mcset en "Insert new background image." [encoding convertfrom utf-8 "Insert new background image (e.g., .xvi image or scanned sketch)."] ::msgcat::mcset es "Insert new background image." [encoding convertfrom utf-8 "Insertar nueva imagen de fondo (p. ej: un croquis escaneado de la libreta topo)."] ::msgcat::mcset it "Insert new background image." [encoding convertfrom utf-8 "Inserisci una nuova immagine di background."] ::msgcat::mcset ru "Insert new background image." [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \320\275\320\276\320\262\320\276\320\265 \321\204\320\276\320\275\320\276\320\262\320\276\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265."] ::msgcat::mcset sk "Insert new background image." [encoding convertfrom utf-8 "Vlo\305\276enie nov\303\251ho podkladov\303\251ho obr\303\241zku."] ::msgcat::mcset sq "Insert new background image." [encoding convertfrom utf-8 "fute imazhin e ri ne prapavije (p.sh., . xvi imazhin apo vizatimin e skanuar)."] ::msgcat::mcset bg "Remove" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\260\321\205\320\275\320\270"] ::msgcat::mcset cz "Remove" [encoding convertfrom utf-8 "Odstranit"] ::msgcat::mcset de "Remove" [encoding convertfrom utf-8 "Entferne"] ::msgcat::mcset el "Remove" [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\263\317\201\316\261\317\206\316\256"] ::msgcat::mcset en "Remove" [encoding convertfrom utf-8 "Remove"] ::msgcat::mcset es "Remove" [encoding convertfrom utf-8 "Eliminar"] ::msgcat::mcset it "Remove" [encoding convertfrom utf-8 "Rimuovi"] ::msgcat::mcset ru "Remove" [encoding convertfrom utf-8 "\320\243\320\261\321\200\320\260\321\202\321\214"] ::msgcat::mcset sk "Remove" [encoding convertfrom utf-8 "Odstr\303\241ni\305\245"] ::msgcat::mcset sq "Remove" [encoding convertfrom utf-8 "hiqe"] ::msgcat::mcset bg "Remove selected image." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\260\321\205\320\275\320\270 \320\270\320\267\320\261\321\200\320\260\320\275\320\276\321\202\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Remove selected image." [encoding convertfrom utf-8 "Odstran\303\255 vybran\303\275 obr\303\241zek."] ::msgcat::mcset de "Remove selected image." [encoding convertfrom utf-8 "Entferne ausgew\303\244hltes Bild."] ::msgcat::mcset el "Remove selected image." [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \316\265\317\200\316\271\316\273\316\265\316\263\316\274\316\255\316\275\316\267\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "Remove selected image." [encoding convertfrom utf-8 "Remove selected image."] ::msgcat::mcset es "Remove selected image." [encoding convertfrom utf-8 "Eliminar imagen seleccionada."] ::msgcat::mcset it "Remove selected image." [encoding convertfrom utf-8 "Rimuovi l'immagine selezionata."] ::msgcat::mcset ru "Remove selected image." [encoding convertfrom utf-8 "\320\243\320\261\321\200\320\260\321\202\321\214 \320\262\321\213\321\200\320\261\320\260\320\275\320\275\320\276\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265."] ::msgcat::mcset sk "Remove selected image." [encoding convertfrom utf-8 "Odstr\303\241ni ozna\304\215en\303\275 obr\303\241zok."] ::msgcat::mcset sq "Remove selected image." [encoding convertfrom utf-8 "hiqe imazhin e zgjedhur."] ::msgcat::mcset bg "visibility" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\266\320\270"] ::msgcat::mcset cz "visibility" [encoding convertfrom utf-8 "viditelnost"] ::msgcat::mcset de "visibility" [encoding convertfrom utf-8 "Sichtbarkeit"] ::msgcat::mcset el "visibility" [encoding convertfrom utf-8 "\316\277\317\201\316\261\317\204\317\214\317\204\316\267\317\204\316\261"] ::msgcat::mcset en "visibility" [encoding convertfrom utf-8 "visibility"] ::msgcat::mcset es "visibility" [encoding convertfrom utf-8 "visibilidad"] ::msgcat::mcset it "visibility" [encoding convertfrom utf-8 "visibilit\303\240"] ::msgcat::mcset ru "visibility" [encoding convertfrom utf-8 "\320\277\320\276\320\272\320\260\320\267\320\260\321\202\321\214"] ::msgcat::mcset sk "visibility" [encoding convertfrom utf-8 "vidite\304\276nos\305\245"] ::msgcat::mcset sq "visibility" [encoding convertfrom utf-8 "shiqueshmeria-vizibiliteti"] ::msgcat::mcset bg "Switch image visibility." [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\266\320\270/\321\201\320\272\321\200\320\270\320\271 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Switch image visibility." [encoding convertfrom utf-8 "P\305\231ep\303\255n\303\241 viditelnost obr\303\241zku."] ::msgcat::mcset de "Switch image visibility." [encoding convertfrom utf-8 "Bildsichtbarkeit umschalten."] ::msgcat::mcset el "Switch image visibility." [encoding convertfrom utf-8 "\316\221\316\273\316\273\316\261\316\263\316\256 \316\277\317\201\316\261\317\204\317\214\317\204\316\267\317\204\316\261\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "Switch image visibility." [encoding convertfrom utf-8 "Switch image visibility."] ::msgcat::mcset es "Switch image visibility." [encoding convertfrom utf-8 "Cambiar visibilidad de la imagen."] ::msgcat::mcset it "Switch image visibility." [encoding convertfrom utf-8 "Cambia la visibilit\303\240 dell'immagine."] ::msgcat::mcset ru "Switch image visibility." [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214/\321\201\320\277\321\200\321\217\321\202\320\260\321\202\321\214 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265."] ::msgcat::mcset sk "Switch image visibility." [encoding convertfrom utf-8 "Prep\303\255na\304\215 vidite\304\276nosti obr\303\241zku."] ::msgcat::mcset sq "Switch image visibility." [encoding convertfrom utf-8 "lesho shiqueshmerine-vizibilitetin e imazhit."] ::msgcat::mcset bg "Control gamma value." [encoding convertfrom utf-8 "\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\275\320\260 \320\263\320\260\320\274\320\260\321\202\320\260"] ::msgcat::mcset cz "Control gamma value." [encoding convertfrom utf-8 "Nastaven\303\255 hodnoty gamma."] ::msgcat::mcset de "Control gamma value." [encoding convertfrom utf-8 "Gammawert einstellen."] ::msgcat::mcset el "Control gamma value." [encoding convertfrom utf-8 "\316\241\317\205\316\270\316\274\316\257\317\203\316\265\316\271\317\202 \317\204\316\271\316\274\317\216\316\275 gamma."] ::msgcat::mcset en "Control gamma value." [encoding convertfrom utf-8 "Control gamma value."] ::msgcat::mcset es "Control gamma value." [encoding convertfrom utf-8 "Controlar el valor gamma."] ::msgcat::mcset it "Control gamma value." [encoding convertfrom utf-8 "Controlla il valore di gamma."] ::msgcat::mcset ru "Control gamma value." [encoding convertfrom utf-8 "\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\263\320\260\320\274\320\274\320\276\320\271."] ::msgcat::mcset sk "Control gamma value." [encoding convertfrom utf-8 "Nastavenie gamma korekcie obr\303\241zku (farebn\303\251ho podania)."] ::msgcat::mcset sq "Control gamma value." [encoding convertfrom utf-8 "kontrollo vleren-gamma"] ::msgcat::mcset bg "Reset" [encoding convertfrom utf-8 "\320\222\321\212\320\267\320\276\320\261\320\275\320\276\320\262\320\270"] ::msgcat::mcset cz "Reset" [encoding convertfrom utf-8 "Reset"] ::msgcat::mcset de "Reset" [encoding convertfrom utf-8 "Zur\303\274cksetzen"] ::msgcat::mcset el "Reset" [encoding convertfrom utf-8 "\316\225\317\200\316\261\316\275\316\261\317\206\316\277\317\201\316\254"] ::msgcat::mcset en "Reset" [encoding convertfrom utf-8 "Reset"] ::msgcat::mcset es "Reset" [encoding convertfrom utf-8 "Reajustar"] ::msgcat::mcset it "Reset" [encoding convertfrom utf-8 "Ripristina"] ::msgcat::mcset ru "Reset" [encoding convertfrom utf-8 "\320\241\320\261\321\200\320\276\321\201"] ::msgcat::mcset sk "Reset" [encoding convertfrom utf-8 "Reset"] ::msgcat::mcset sq "Reset" [encoding convertfrom utf-8 "reseto"] ::msgcat::mcset bg "Reset image gamma value." [encoding convertfrom utf-8 "\320\222\321\212\320\267\320\276\320\261\320\275\320\276\320\262\320\270 \320\275\320\260\321\201\321\202\320\276\320\271\320\272\320\270\321\202\320\265 \320\275\320\260 \320\263\320\260\320\274\320\260\321\202\320\260"] ::msgcat::mcset cz "Reset image gamma value." [encoding convertfrom utf-8 "Resetuje nastavenou hodnotu gamma."] ::msgcat::mcset de "Reset image gamma value." [encoding convertfrom utf-8 "Gammawert zur\303\274cksetzen."] ::msgcat::mcset el "Reset image gamma value." [encoding convertfrom utf-8 "\316\225\317\200\316\261\316\275\316\261\317\206\316\277\317\201\316\254 \317\204\316\271\316\274\316\256\317\202 gamma \317\204\316\267\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202."] ::msgcat::mcset en "Reset image gamma value." [encoding convertfrom utf-8 "Click here to go back to original gamma value."] ::msgcat::mcset es "Reset image gamma value." [encoding convertfrom utf-8 "Click aqu\303\255 para volver a los ajustes de gamma iniciales."] ::msgcat::mcset it "Reset image gamma value." [encoding convertfrom utf-8 "Ripristina il valore di gamma dell'immagine."] ::msgcat::mcset ru "Reset image gamma value." [encoding convertfrom utf-8 "\320\241\320\261\321\200\320\276\321\201\320\270\321\202\321\214 \320\267\320\275\320\260\321\207\320\265\320\275\320\270\320\265 \320\263\320\260\320\274\320\274\321\213 \320\264\320\273\321\217 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217."] ::msgcat::mcset sk "Reset image gamma value." [encoding convertfrom utf-8 "Resetuje nastaven\303\272 gamma korekciu obr\303\241zku."] ::msgcat::mcset sq "Reset image gamma value." [encoding convertfrom utf-8 "kliko ketu qe te kthehesh prapa tek vlera origjinale-gamma."] ::msgcat::mcset bg "Set image gamma value." [encoding convertfrom utf-8 "\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270 \320\263\320\260\320\274\320\260\321\202\320\260 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265\321\202\320\276"] ::msgcat::mcset cz "Set image gamma value." [encoding convertfrom utf-8 "Nastavuje hodnotu gamma obr\303\241zku."] ::msgcat::mcset de "Set image gamma value." [encoding convertfrom utf-8 "Setze Gammawert."] ::msgcat::mcset el "Set image gamma value." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \317\204\316\271\316\274\316\256\317\202 gamma \317\204\316\267\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202."] ::msgcat::mcset en "Set image gamma value." [encoding convertfrom utf-8 "Set image gamma value."] ::msgcat::mcset es "Set image gamma value." [encoding convertfrom utf-8 "Ajustar valor gamma de la imagen."] ::msgcat::mcset it "Set image gamma value." [encoding convertfrom utf-8 "Imposta il valore di gamma dell'immagine."] ::msgcat::mcset ru "Set image gamma value." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214 \320\263\320\260\320\274\320\274\321\203 \320\264\320\273\321\217 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217."] ::msgcat::mcset sk "Set image gamma value." [encoding convertfrom utf-8 "Nastavuje gamma korekciu obr\303\241zku."] ::msgcat::mcset sq "Set image gamma value." [encoding convertfrom utf-8 "vendos vleren gamma te imazhit."] ::msgcat::mcset bg "Current position of selected image." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\203\321\211\320\260 \320\277\320\276\320\267\320\270\321\206\320\270\321\217 \320\275\320\260 \320\270\320\267\320\261\321\200\320\260\320\275\320\276\321\202\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Current position of selected image." [encoding convertfrom utf-8 "Sou\304\215asn\303\241 pozice vybran\303\251ho obr\303\241zku."] ::msgcat::mcset de "Current position of selected image." [encoding convertfrom utf-8 "Gegenw\303\244rtige Position des ausgew\303\244hlten Bildes."] ::msgcat::mcset el "Current position of selected image." [encoding convertfrom utf-8 "\316\244\317\201\316\255\317\207\316\277\317\205\317\203\316\261 \316\270\316\255\317\203\316\267 \316\265\317\200\316\271\316\273\316\265\316\263\316\274\316\255\316\275\316\267\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "Current position of selected image." [encoding convertfrom utf-8 "Current position of selected image (pixels from canvas lower letf corner)."] ::msgcat::mcset es "Current position of selected image." [encoding convertfrom utf-8 "Posici\303\263n actual de la imagen seleccionada (medida en pixels desde la esquina inf. izq del lienzo)."] ::msgcat::mcset it "Current position of selected image." [encoding convertfrom utf-8 "Posizione dell'immagine selezionata."] ::msgcat::mcset ru "Current position of selected image." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\203\321\211\320\260\321\217 \320\277\320\276\320\267\320\270\321\206\320\270\321\217 \320\262\321\213\320\261\321\200\320\260\320\275\320\275\320\276\320\263\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217."] ::msgcat::mcset sk "Current position of selected image." [encoding convertfrom utf-8 "S\303\272\304\215asn\303\241 poz\303\255cia obr\303\241zku."] ::msgcat::mcset sq "Current position of selected image." [encoding convertfrom utf-8 "pozicioni momental I imazhit te zgjedhur(pikat apo pikselat prej pelhures kendi I poshtem I majte)."] ::msgcat::mcset bg "Move to" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270"] ::msgcat::mcset cz "Move to" [encoding convertfrom utf-8 "P\305\231esunout"] ::msgcat::mcset de "Move to" [encoding convertfrom utf-8 "Verschiebe nach"] ::msgcat::mcset el "Move to" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \317\200\317\201\316\277\317\202"] ::msgcat::mcset en "Move to" [encoding convertfrom utf-8 "Move to"] ::msgcat::mcset es "Move to" [encoding convertfrom utf-8 "Mover a"] ::msgcat::mcset it "Move to" [encoding convertfrom utf-8 "Sposta a"] ::msgcat::mcset ru "Move to" [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\274\320\265\321\201\321\202\320\270\321\202\321\214"] ::msgcat::mcset sk "Move to" [encoding convertfrom utf-8 "Presu\305\210 na"] ::msgcat::mcset sq "Move to" [encoding convertfrom utf-8 "levize tek"] ::msgcat::mcset bg "Move image to given position." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265\321\202\320\276 \320\275\320\260 \321\203\320\272\320\260\320\267\320\260\320\275\320\260\321\202\320\260 \320\277\320\276\320\267\320\270\321\206\320\270\321\217"] ::msgcat::mcset cz "Move image to given position." [encoding convertfrom utf-8 "P\305\231esune obr\303\241zek na zadanou pozici."] ::msgcat::mcset de "Move image to given position." [encoding convertfrom utf-8 "Verschiebe Bild an angegebene Position."] ::msgcat::mcset el "Move image to given position." [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\265\316\271\316\272\317\214\316\275\316\261\317\202 \317\203\317\204\316\267\316\275 \317\200\317\201\316\277\317\203\316\264\316\271\316\277\317\201\316\271\317\203\316\274\316\255\316\275\316\267 \316\270\316\255\317\203\316\267 (\316\267 \317\200\316\254\316\275\317\211 \316\261\317\201\316\271\317\203\317\204\316\265\317\201\316\254 \316\263\317\211\316\275\316\257\316\261 \316\270\316\261 \316\265\316\257\316\275\316\261\316\271 \317\203\317\204\316\277 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\316\277 \317\200\316\257\316\276\316\265\316\273)"] ::msgcat::mcset en "Move image to given position." [encoding convertfrom utf-8 "Move image to given position (image's upper left corner will be on given pixel)."] ::msgcat::mcset es "Move image to given position." [encoding convertfrom utf-8 "Mover imagen a la posici\303\263n indicada (la esquina sup. izda de la imagen aparecer\303\241 en ese pixel)."] ::msgcat::mcset it "Move image to given position." [encoding convertfrom utf-8 "Sposta l'immagine nella posizione specificata."] ::msgcat::mcset ru "Move image to given position." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\274\320\265\321\201\321\202\320\270\321\202\321\214 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\272 \321\203\320\272\320\260\320\267\320\260\320\275\320\275\320\276\320\271 \320\277\320\276\320\267\320\270\321\206\320\270\320\270."] ::msgcat::mcset sk "Move image to given position." [encoding convertfrom utf-8 "Presunie obr\303\241zok na zadan\303\272 poz\303\255ciu."] ::msgcat::mcset sq "Move image to given position." [encoding convertfrom utf-8 "levize imazhin ne poziten e dhene(kendi I eperm I majte I imazhit do te jete ne pikselin e japur)."] ::msgcat::mcset bg "New X coordinate of image." [encoding convertfrom utf-8 "\320\235\320\276\320\262\320\260 \320\245 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265\321\202\320\276"] ::msgcat::mcset cz "New X coordinate of image." [encoding convertfrom utf-8 "Nov\303\241 sou\305\231adnice X obr\303\241zku."] ::msgcat::mcset de "New X coordinate of image." [encoding convertfrom utf-8 "Neue X-Koordinate des Bildes."] ::msgcat::mcset el "New X coordinate of image." [encoding convertfrom utf-8 "\316\235\316\255\316\261 \317\203\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\247 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "New X coordinate of image." [encoding convertfrom utf-8 "New X coordinate of image."] ::msgcat::mcset es "New X coordinate of image." [encoding convertfrom utf-8 "Nueva coordenada X de la imagen."] ::msgcat::mcset it "New X coordinate of image." [encoding convertfrom utf-8 "Nuova coordinata X dell'immagine."] ::msgcat::mcset ru "New X coordinate of image." [encoding convertfrom utf-8 "\320\235\320\276\320\262\320\260\321\217 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 X."] ::msgcat::mcset sk "New X coordinate of image." [encoding convertfrom utf-8 "Nov\303\241 X s\303\272radnica obr\303\241zku."] ::msgcat::mcset sq "New X coordinate of image." [encoding convertfrom utf-8 "X-koordinata e re e imazhit"] ::msgcat::mcset bg "New Y coordinate of image." [encoding convertfrom utf-8 "\320\235\320\276\320\262\320\260 Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265\321\202\320\276"] ::msgcat::mcset cz "New Y coordinate of image." [encoding convertfrom utf-8 "Nov\303\241 sou\305\231adnice Y obr\303\241zku."] ::msgcat::mcset de "New Y coordinate of image." [encoding convertfrom utf-8 "Neue Y-Koordinate des Bildes."] ::msgcat::mcset el "New Y coordinate of image." [encoding convertfrom utf-8 "\316\235\316\255\316\261 \317\203\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\245 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "New Y coordinate of image." [encoding convertfrom utf-8 "New Y coordinate of image."] ::msgcat::mcset es "New Y coordinate of image." [encoding convertfrom utf-8 "Nueva coordenada Y de la imagen."] ::msgcat::mcset it "New Y coordinate of image." [encoding convertfrom utf-8 "Nuova coordinata Y dell'immagine."] ::msgcat::mcset ru "New Y coordinate of image." [encoding convertfrom utf-8 "\320\235\320\276\320\262\320\260\321\217 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 Y."] ::msgcat::mcset sk "New Y coordinate of image." [encoding convertfrom utf-8 "Nov\303\275 Y s\303\272radnica obr\303\241zku."] ::msgcat::mcset sq "New Y coordinate of image." [encoding convertfrom utf-8 "koordinata Y e re e imazhit."] ::msgcat::mcset bg "Move front" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\276\321\202\320\277\321\200\320\265\320\264"] ::msgcat::mcset cz "Move front" [encoding convertfrom utf-8 "Dop\305\231edu"] ::msgcat::mcset de "Move front" [encoding convertfrom utf-8 "Nach vorne verschieben"] ::msgcat::mcset el "Move front" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \317\200\317\201\316\277\317\202 \317\204\316\261 \316\274\317\200\317\201\316\277\317\202"] ::msgcat::mcset en "Move front" [encoding convertfrom utf-8 "Move front"] ::msgcat::mcset es "Move front" [encoding convertfrom utf-8 "Delante"] ::msgcat::mcset it "Move front" [encoding convertfrom utf-8 "Davanti"] ::msgcat::mcset ru "Move front" [encoding convertfrom utf-8 "\320\237\320\276\320\262\320\265\321\200\321\205 \320\262\321\201\320\265\321\205"] ::msgcat::mcset sk "Move front" [encoding convertfrom utf-8 "Navrch"] ::msgcat::mcset sq "Move front" [encoding convertfrom utf-8 "levize perpara"] ::msgcat::mcset bg "Move image in front of all images." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265\321\202\320\276 \320\277\321\200\320\265\320\264 \320\262\321\201\320\270\321\207\320\272\320\270 \320\276\321\201\321\202\320\260\320\275\320\260\320\273\320\270."] ::msgcat::mcset cz "Move image in front of all images." [encoding convertfrom utf-8 "P\305\231esune obr\303\241zek nad v\305\241echny ostatn\303\255."] ::msgcat::mcset de "Move image in front of all images." [encoding convertfrom utf-8 "Bild ganz nach vorne verschieben."] ::msgcat::mcset el "Move image in front of all images." [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\265\316\271\316\272\317\214\316\275\316\261\317\202 \317\203\317\204\316\267\316\275 \316\272\316\277\317\201\317\205\317\206\316\256"] ::msgcat::mcset en "Move image in front of all images." [encoding convertfrom utf-8 "Move image in front of all images."] ::msgcat::mcset es "Move image in front of all images." [encoding convertfrom utf-8 "Trae la imagen al frente de todas las im\303\241genes."] ::msgcat::mcset it "Move image in front of all images." [encoding convertfrom utf-8 "Sposta l'immagine davanti a tutte le immagini."] ::msgcat::mcset ru "Move image in front of all images." [encoding convertfrom utf-8 "\320\222\321\213\320\262\320\265\321\201\321\202\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\262\320\265\321\200\321\205 \320\262\321\201\320\265\321\205 \320\276\321\201\321\202\320\260\320\273\321\214\320\275\321\213\321\205."] ::msgcat::mcset sk "Move image in front of all images." [encoding convertfrom utf-8 "Presunie obr\303\241zok nad v\305\241etky ostatn\303\251."] ::msgcat::mcset sq "Move image in front of all images." [encoding convertfrom utf-8 "levize imazhin para te gjitha imazheve."] ::msgcat::mcset bg "Move back" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\275\320\260\320\267\320\260\320\264"] ::msgcat::mcset cz "Move back" [encoding convertfrom utf-8 "Dozadu"] ::msgcat::mcset de "Move back" [encoding convertfrom utf-8 "Nach hinten verschieben"] ::msgcat::mcset el "Move back" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \317\200\317\201\316\277\317\202 \317\204\316\261 \317\200\316\257\317\203\317\211"] ::msgcat::mcset en "Move back" [encoding convertfrom utf-8 "Move back"] ::msgcat::mcset es "Move back" [encoding convertfrom utf-8 "Detr\303\241s"] ::msgcat::mcset it "Move back" [encoding convertfrom utf-8 "Dietro"] ::msgcat::mcset ru "Move back" [encoding convertfrom utf-8 "\320\237\320\276\320\264 \320\262\321\201\320\265\320\274\320\270"] ::msgcat::mcset sk "Move back" [encoding convertfrom utf-8 "Naspodok"] ::msgcat::mcset sq "Move back" [encoding convertfrom utf-8 "levize prapa"] ::msgcat::mcset bg "Move image behind all images." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\274\320\265\321\201\321\202\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265\321\202\320\276 \320\276\321\202\320\267\320\260\320\264 \320\276\321\201\321\202\320\260\320\275\320\260\320\273\320\270\321\202\320\265"] ::msgcat::mcset cz "Move image behind all images." [encoding convertfrom utf-8 "P\305\231esune obr\303\241zek pod v\305\241echny ostatn\303\255."] ::msgcat::mcset de "Move image behind all images." [encoding convertfrom utf-8 "Bild ganz nach hinten verschieben."] ::msgcat::mcset el "Move image behind all images." [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \317\204\316\267\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202 \317\203\317\204\316\277 \317\206\317\214\316\275\317\204\316\277"] ::msgcat::mcset en "Move image behind all images." [encoding convertfrom utf-8 "Move image behind all images."] ::msgcat::mcset es "Move image behind all images." [encoding convertfrom utf-8 "Enviar la imagen detr\303\241s de todas las dem\303\241s."] ::msgcat::mcset it "Move image behind all images." [encoding convertfrom utf-8 "Sposta l'immagine davanti a tutte le immagini."] ::msgcat::mcset ru "Move image behind all images." [encoding convertfrom utf-8 "\320\222\321\213\320\262\320\265\321\201\321\202\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\267\320\260 \320\262\321\201\320\265\320\274\320\270 \320\276\321\201\321\202\320\260\320\273\321\214\320\275\321\213\320\274\320\270."] ::msgcat::mcset sk "Move image behind all images." [encoding convertfrom utf-8 "Presunie obr\303\241zok pod v\305\241etky ostatn\303\251."] ::msgcat::mcset sq "Move image behind all images." [encoding convertfrom utf-8 "levize imazhin prapa te gjitha imazheve."] ::msgcat::mcset bg "loading preview module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\267\320\260 \320\277\321\200\320\265\320\264\320\262\320\260\321\200\320\270\321\202\320\265\320\273\320\265\320\275 \320\277\321\200\320\265\320\263\320\273\320\265\320\264 ..."] ::msgcat::mcset cz "loading preview module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m zobrazovac\303\255 modul ..."] ::msgcat::mcset de "loading preview module ..." [encoding convertfrom utf-8 "Lade Vorschaumodul ..."] ::msgcat::mcset el "loading preview module ..." [encoding convertfrom utf-8 "\316\246\316\277\317\201\317\204\316\257\316\266\316\265\317\204\316\261\316\271 \316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261 \317\200\317\201\316\277\316\265\317\200\316\271\317\203\316\272\317\214\317\200\316\271\317\203\316\267\317\202..."] ::msgcat::mcset en "loading preview module ..." [encoding convertfrom utf-8 "loading preview module ..."] ::msgcat::mcset es "loading preview module ..." [encoding convertfrom utf-8 "ver comandos ..."] ::msgcat::mcset it "loading preview module ..." [encoding convertfrom utf-8 "modulo anteprima ..."] ::msgcat::mcset ru "loading preview module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \320\277\321\200\320\265\320\264\320\277\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\260..."] ::msgcat::mcset sk "loading preview module ..." [encoding convertfrom utf-8 "nahr\303\241vam n\303\241h\304\276adov\303\275 modul ..."] ::msgcat::mcset sq "loading preview module ..." [encoding convertfrom utf-8 "duke lexuar modulin e perkohshem\342\200\246"] ::msgcat::mcset bg "Update command" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270 \320\272\320\276\320\274\320\260\320\275\320\264\320\260\321\202\320\260"] ::msgcat::mcset cz "Update command" [encoding convertfrom utf-8 "Aktualizovat"] ::msgcat::mcset de "Update command" [encoding convertfrom utf-8 "Kommando aktualisieren"] ::msgcat::mcset el "Update command" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\275\316\255\317\211\317\203\316\267"] ::msgcat::mcset en "Update command" [encoding convertfrom utf-8 "Update command"] ::msgcat::mcset es "Update command" [encoding convertfrom utf-8 "Actualizar"] ::msgcat::mcset it "Update command" [encoding convertfrom utf-8 "Aggiorna comando"] ::msgcat::mcset ru "Update command" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214 \320\272\320\276\320\274\320\260\320\275\320\264\321\203"] ::msgcat::mcset sk "Update command" [encoding convertfrom utf-8 "Aktualizova\305\245"] ::msgcat::mcset sq "Update command" [encoding convertfrom utf-8 "urdheri-komanda e aktualizimit"] ::msgcat::mcset bg "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275, \320\260\320\272\320\276 \321\201\321\202\320\265 \320\275\320\260\320\277\321\200\320\260\320\262\320\270\320\273\320\270 \320\277\321\200\320\276\320\274\320\265\320\275\320\270 \320\270 \320\275\320\265 \320\263\320\270 \320\262\320\270\320\266\320\264\320\260\321\202\320\265 \321\202\321\203\320\272."] ::msgcat::mcset cz "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "Stiskn\304\233te toto tla\304\215\303\255tko, pokud jste n\304\233co zm\304\233nili a zm\304\233ny nejsou v tomto okn\304\233 viditeln\303\251."] ::msgcat::mcset de "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "Dr\303\274cke diesen Knopf, falls du etwas ge\303\244ndert hast und die \303\204nderungen nicht hier sehen kannst."] ::msgcat::mcset el "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "\316\240\316\261\317\204\316\256\317\203\317\204\316\265 \316\265\316\264\317\216 \316\261\316\275 \316\261\316\273\316\273\316\254\316\276\316\261\317\204\316\265 \316\272\316\254\317\204\316\271 \316\272\316\261\316\271 \316\264\316\265\316\275 \316\265\316\274\317\206\316\261\316\275\316\257\316\266\316\277\316\275\317\204\316\261\316\271 \316\265\316\264\317\216 \316\277\316\271 \316\261\316\273\316\273\316\261\316\263\316\255\317\202."] ::msgcat::mcset en "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "Press this button, if you have changed something and you can not see your changes here."] ::msgcat::mcset es "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "Clicar aqu\303\255 si has cambiado algo y no ves aqu\303\255 los resultados del cambio"] ::msgcat::mcset it "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "Premi questo bottone se hai fatto modifiche che non sono visualizzate."] ::msgcat::mcset ru "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203, \320\265\321\201\320\273\320\270 \320\262\321\213 \321\207\321\202\320\276-\321\202\320\276 \320\270\320\267\320\274\320\265\320\275\320\270\320\273\320\270, \320\275\320\276 \320\275\320\265 \321\203\320\262\320\270\320\264\320\265\320\273\320\270 \320\267\320\264\320\265\321\201\321\214 \321\201\320\262\320\276\320\270\321\205 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\271."] ::msgcat::mcset sk "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "Stla\304\215te toto tla\304\215\303\255tko, ak ste nie\304\215o zmenili a zmeny nie su v tomto okne vidite\304\276n\303\251."] ::msgcat::mcset sq "Press this button, if you have changed something and you can not see your changes here." [encoding convertfrom utf-8 "shtype kete buton, nese ke ndryshuar diqka te cilin ndryshim nuk mund ta shohesh ketu."] ::msgcat::mcset bg "Command preview." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\263\320\273\320\265\320\264 \320\275\320\260 \320\272\320\276\320\274\320\260\320\275\320\264\320\260\321\202\320\260."] ::msgcat::mcset cz "Command preview." [encoding convertfrom utf-8 "N\303\241hled p\305\231\303\255kazu."] ::msgcat::mcset de "Command preview." [encoding convertfrom utf-8 "Kommando Vorschau."] ::msgcat::mcset el "Command preview." [encoding convertfrom utf-8 "\316\225\316\264\317\216 \316\262\316\273\316\255\317\200\316\265\317\204\316\265 \316\277\316\273\316\277\316\272\316\273\316\267\317\201\317\211\316\274\316\255\316\275\316\265\317\202 \316\265\316\275\317\204\316\277\316\273\316\255\317\202 \316\274\316\265 \316\265\317\206\316\261\317\201\316\274\316\277\316\263\316\256 \316\265\317\200\316\271\316\273\316\277\316\263\317\216\316\275."] ::msgcat::mcset en "Command preview." [encoding convertfrom utf-8 "Here you can see complete commands with options applied."] ::msgcat::mcset es "Command preview." [encoding convertfrom utf-8 "Aqu\303\255 se pueden ver los comandos completos, opciones inclu\303\255das."] ::msgcat::mcset it "Command preview." [encoding convertfrom utf-8 "Anteprima comando."] ::msgcat::mcset ru "Command preview." [encoding convertfrom utf-8 "\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200 \320\272\320\276\320\274\320\260\320\275\320\264\321\213."] ::msgcat::mcset sk "Command preview." [encoding convertfrom utf-8 "N\303\241h\304\276ad pr\303\255kazu."] ::msgcat::mcset sq "Command preview." [encoding convertfrom utf-8 "ketu mund te shohesh komandat komplete me opcionet e vendosura."] ::msgcat::mcset bg "loading scrap module ..." [encoding convertfrom utf-8 "\320\227\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277 \320\274\320\276\320\264\321\203\320\273\320\260 ..."] ::msgcat::mcset cz "loading scrap module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m scrap modul ..."] ::msgcat::mcset de "loading scrap module ..." [encoding convertfrom utf-8 "Lade Skizzenmodul ..."] ::msgcat::mcset el "loading scrap module ..." [encoding convertfrom utf-8 "\317\206\316\277\317\201\317\204\316\257\316\266\316\265\317\204\316\261\316\271 \316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261 \317\204\317\211\316\275 \317\203\316\272\317\201\316\261\317\200..."] ::msgcat::mcset en "loading scrap module ..." [encoding convertfrom utf-8 "loading scrap module ..."] ::msgcat::mcset es "loading scrap module ..." [encoding convertfrom utf-8 "croquis ..."] ::msgcat::mcset it "loading scrap module ..." [encoding convertfrom utf-8 "modulo scrap ..."] ::msgcat::mcset ru "loading scrap module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \321\201\320\272\321\200\320\260\320\277-\320\274\320\276\320\264\321\203\320\273\321\217..."] ::msgcat::mcset sk "loading scrap module ..." [encoding convertfrom utf-8 "nahr\303\241vam scrap modul ..."] ::msgcat::mcset sq "loading scrap module ..." [encoding convertfrom utf-8 "duke lexuar modulin e deponise\342\200\246"] ::msgcat::mcset bg "Scrap name." [encoding convertfrom utf-8 "\320\230\320\274\320\265 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277."] ::msgcat::mcset cz "Scrap name." [encoding convertfrom utf-8 "N\303\241zev scrapu."] ::msgcat::mcset de "Scrap name." [encoding convertfrom utf-8 "Skizzenname."] ::msgcat::mcset el "Scrap name." [encoding convertfrom utf-8 "\316\214\316\275\316\277\316\274\316\261 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "Scrap name." [encoding convertfrom utf-8 "Scrap name."] ::msgcat::mcset es "Scrap name." [encoding convertfrom utf-8 "Nombre del croquis."] ::msgcat::mcset it "Scrap name." [encoding convertfrom utf-8 "Nome dello scrap."] ::msgcat::mcset ru "Scrap name." [encoding convertfrom utf-8 "\320\230\320\274\321\217 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset sk "Scrap name." [encoding convertfrom utf-8 "Identifik\303\241tor (meno) scrapu."] ::msgcat::mcset sq "Scrap name." [encoding convertfrom utf-8 "emri I deponise."] ::msgcat::mcset bg "projection" [encoding convertfrom utf-8 "\320\277\321\200\320\276\320\265\320\272\321\206\320\270\321\217"] ::msgcat::mcset cz "projection" [encoding convertfrom utf-8 "projekce"] ::msgcat::mcset de "projection" [encoding convertfrom utf-8 "Projektion"] ::msgcat::mcset el "projection" [encoding convertfrom utf-8 "\317\200\317\201\316\277\316\262\316\277\316\273\316\256"] ::msgcat::mcset en "projection" [encoding convertfrom utf-8 "projection"] ::msgcat::mcset es "projection" [encoding convertfrom utf-8 "proyecci\303\263n"] ::msgcat::mcset it "projection" [encoding convertfrom utf-8 "proiezione"] ::msgcat::mcset ru "projection" [encoding convertfrom utf-8 "\320\277\321\200\320\276\320\265\320\272\321\206\320\270\321\217"] ::msgcat::mcset sk "projection" [encoding convertfrom utf-8 "projekcia"] ::msgcat::mcset sq "projection" [encoding convertfrom utf-8 "projekcioni"] ::msgcat::mcset bg "Scrap projection." [encoding convertfrom utf-8 "\320\237\321\200\320\276\320\265\320\272\321\206\320\270\321\217 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset cz "Scrap projection." [encoding convertfrom utf-8 "Projekce scrapu."] ::msgcat::mcset de "Scrap projection." [encoding convertfrom utf-8 "Skizzenprojektion"] ::msgcat::mcset el "Scrap projection." [encoding convertfrom utf-8 "\316\240\317\201\316\277\316\262\316\277\316\273\316\256 \317\203\316\272\317\201\316\261\317\200 (\316\272\316\273\316\271\316\272 \317\203\317\204\316\277 \317\204\317\201\316\257\316\263\317\211\316\275\316\277 \316\263\316\271\316\261 \316\274\316\265\316\275\316\277\317\215)"] ::msgcat::mcset en "Scrap projection." [encoding convertfrom utf-8 "Scrap projection (clic on triangle to see menu)."] ::msgcat::mcset es "Scrap projection." [encoding convertfrom utf-8 "Proyecci\303\263n del croquis (Clic en tri\303\241ngulo para ver el men\303\272)."] ::msgcat::mcset it "Scrap projection." [encoding convertfrom utf-8 "Proiezione dello scrap."] ::msgcat::mcset ru "Scrap projection." [encoding convertfrom utf-8 "\320\237\321\200\320\276\320\265\320\272\321\206\320\270\321\217 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset sk "Scrap projection." [encoding convertfrom utf-8 "Projekcia scrapu."] ::msgcat::mcset sq "Scrap projection." [encoding convertfrom utf-8 "projeksioni I deponise (kliko ne trekendesh te shohesh menyne)."] ::msgcat::mcset bg "Other scrap options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270 \320\276\320\277\321\206\320\270\320\270 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset cz "Other scrap options." [encoding convertfrom utf-8 "Dal\305\241\303\255 volby pro scrap."] ::msgcat::mcset de "Other scrap options." [encoding convertfrom utf-8 "Andere Skizzenoptionen."] ::msgcat::mcset el "Other scrap options." [encoding convertfrom utf-8 "\316\206\316\273\316\273\316\265\317\202 \316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \317\204\317\211\316\275 \317\203\316\272\317\201\316\261\317\200 - \316\262\316\273\316\255\317\200\316\265\317\204\316\265 \317\204\316\277 thbook.pdf"] ::msgcat::mcset en "Other scrap options." [encoding convertfrom utf-8 "Other scrap options (more on this on thbook.pdf)"] ::msgcat::mcset es "Other scrap options." [encoding convertfrom utf-8 "Otras opciones del croquis. Consultar thbook.pdf"] ::msgcat::mcset it "Other scrap options." [encoding convertfrom utf-8 "Altre opzioni dello scrap"] ::msgcat::mcset ru "Other scrap options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270\320\265 \320\276\320\277\321\206\320\270\320\270 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset sk "Other scrap options." [encoding convertfrom utf-8 "Ostatn\303\251 mo\305\276nosti scrapu."] ::msgcat::mcset sq "Other scrap options." [encoding convertfrom utf-8 "opcionet tjera te deponise (me shume per kete ne librin e therion-it.pdf)"] ::msgcat::mcset bg "Scale" [encoding convertfrom utf-8 "\320\234\320\260\321\211\320\260\320\261"] ::msgcat::mcset cz "Scale" [encoding convertfrom utf-8 "M\304\233\305\231\303\255tko"] ::msgcat::mcset de "Scale" [encoding convertfrom utf-8 "Ma\303\237stab"] ::msgcat::mcset el "Scale" [encoding convertfrom utf-8 "\316\232\316\273\316\257\316\274\316\261\316\272\316\261\317\202"] ::msgcat::mcset it "Scale" [encoding convertfrom utf-8 "Scala"] ::msgcat::mcset ru "Scale" [encoding convertfrom utf-8 "\320\234\320\260\321\201\321\210\321\202\320\260\320\261"] ::msgcat::mcset sk "Scale" [encoding convertfrom utf-8 "Mierka"] ::msgcat::mcset sq "Scale" [encoding convertfrom utf-8 "matesi"] ::msgcat::mcset bg "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "\320\234\320\260\321\211\320\260\320\261\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260 - \320\275\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\270 \320\277\320\276\321\201\321\202\320\260\320\262\320\265\321\202\320\265 \321\201 \320\274\320\270\321\210\320\272\320\260\321\202\320\260 \321\202\320\276\321\207\320\272\320\260 \320\267\320\260 \320\274\320\260\321\211\320\260\320\261\320\270\321\200\320\260\320\275\320\265 \320\262/\321\203 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset cz "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "\305\240k\303\241lov\303\241n\303\255 scrapu - stiskni pro v\303\275b\304\233r kalibra\304\215n\303\255ch bod\305\257 obr\303\241zku."] ::msgcat::mcset de "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "Skizze skalieren - dr\303\274cken um Bildeinstellungspunkte zu klicken."] ::msgcat::mcset el "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "\316\232\316\261\316\273\316\271\317\200\317\201\316\254\317\201\316\271\317\203\316\274\316\261 \317\203\316\272\317\201\316\261\317\200 - \316\272\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\263\316\271\316\261 \316\275\316\261 \316\265\317\200\316\271\316\273\316\255\316\276\316\265\317\204\316\265 \317\204\316\261 \317\203\316\267\316\274\316\265\316\257\316\261 \316\263\316\271\316\261 \316\272\316\261\316\273\316\271\316\274\317\200\317\201\316\254\317\201\316\271\317\203\316\274\316\261."] ::msgcat::mcset it "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "Rescalamento - premi per selezionare i punti di calibrazione."] ::msgcat::mcset ru "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "\320\234\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \321\201\320\272\321\200\320\260\320\277\320\260 - \320\275\320\260\320\266\320\270\320\274\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\270 \320\262\321\213\321\201\321\202\320\260\320\262\320\270\321\202\320\265 \321\202\320\276\321\207\320\272\320\270 \320\274\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217 \320\274\321\213\321\210\321\214\321\216"] ::msgcat::mcset sk "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "\305\240k\303\241lovanie scrapu - po stla\304\215en\303\255 klikni na \305\241k\303\241lovacie body."] ::msgcat::mcset sq "Scrap scaling - push to click picture calibration points." [encoding convertfrom utf-8 "matja e deponise-shtyp te klikosh pikat kalibruese te fotos."] ::msgcat::mcset bg "Update scrap" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset cz "Update scrap" [encoding convertfrom utf-8 "Aktualizovat"] ::msgcat::mcset de "Update scrap" [encoding convertfrom utf-8 "Skizze aktualisieren"] ::msgcat::mcset el "Update scrap" [encoding convertfrom utf-8 "\316\225\316\275\316\267\316\274\316\255\317\201\317\211\317\203\316\267 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "Update scrap" [encoding convertfrom utf-8 "Update scrap"] ::msgcat::mcset es "Update scrap" [encoding convertfrom utf-8 "Actualizar"] ::msgcat::mcset it "Update scrap" [encoding convertfrom utf-8 "Aggiorna scrap"] ::msgcat::mcset ru "Update scrap" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset sk "Update scrap" [encoding convertfrom utf-8 "Aktualizuj scrap"] ::msgcat::mcset sq "Update scrap" [encoding convertfrom utf-8 "aktualizo deponine"] ::msgcat::mcset bg "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\267\320\260 \320\264\320\260 \320\277\321\200\320\270\320\273\320\276\320\266\320\270\321\202\320\265 \320\277\321\200\320\276\320\274\320\265\320\275\320\270\321\202\320\265 \320\262/\321\203 \321\202\320\265\320\272\321\203\321\211\320\270\321\217 \321\201\320\272\321\200\320\260\320\277."] ::msgcat::mcset cz "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "Stiskn\304\233te toto tla\304\215\303\255tko po uplatn\304\233n\303\255 zm\304\233n aktu\303\241ln\303\255ho scrapu."] ::msgcat::mcset de "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "Dr\303\274cke diesen Knopf, um deine \303\204nderungen auf diese Skizze anzuwenden."] ::msgcat::mcset el "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "\316\240\316\261\317\204\316\256\317\203\317\204\316\265 \316\265\316\264\317\216 \316\263\316\271\316\261 \316\275\316\261 \316\263\316\257\316\275\316\265\316\271 \316\265\317\206\316\261\317\201\316\274\316\277\316\263\316\256 \317\204\317\211\316\275 \316\261\316\273\316\273\316\261\316\263\317\216\316\275 \317\203\316\261\317\202 \317\203\317\204\316\277 \317\204\317\201\316\255\317\207\316\277\316\275 \317\203\316\272\317\201\316\261\317\200."] ::msgcat::mcset en "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "Press this button to apply your changes to current scrap."] ::msgcat::mcset es "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "Clicar aqu\303\255 tras modificar las propiedades del croquis."] ::msgcat::mcset it "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "Premi questo bottone per applicare le tue modifiche allo scrap."] ::msgcat::mcset ru "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\264\320\273\321\217 \320\262\320\262\320\265\320\264\320\265\320\275\320\270\321\217 \320\262 \320\264\320\265\320\271\321\201\321\202\320\262\320\270\320\265 \320\262\320\260\321\210\320\270\321\205 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\271 \320\264\320\273\321\217 \321\202\320\265\320\272\321\203\321\211\320\265\320\263\320\276 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "Stla\304\215te tento gomb\303\255k, aby sa va\305\241e zmeny v scrape ulo\305\276ili."] ::msgcat::mcset sq "Press this button to apply your changes to current scrap." [encoding convertfrom utf-8 "shtype kete buton qe te besh ndrimet ne deponine momentale."] ::msgcat::mcset bg "picture scale points" [encoding convertfrom utf-8 "\320\274\320\260\321\211\320\260\320\261\320\270\321\200\320\260\321\211\320\270 \321\202\320\276\321\207\320\272\320\270 \320\267\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "picture scale points" [encoding convertfrom utf-8 "body m\304\233\305\231\303\255tka (obr\303\241zek)"] ::msgcat::mcset de "picture scale points" [encoding convertfrom utf-8 "Bildskalierungspunkte"] ::msgcat::mcset el "picture scale points" [encoding convertfrom utf-8 "\317\203\316\267\316\274\316\265\316\257\316\261 \316\263\316\271\316\261 \316\272\316\261\316\273\316\271\316\274\317\200\317\201\316\254\317\201\316\271\317\203\316\274\316\261 (\317\200\316\257\316\276\316\265\316\273)"] ::msgcat::mcset en "picture scale points" [encoding convertfrom utf-8 "picture scale points (pixels)"] ::msgcat::mcset es "picture scale points" [encoding convertfrom utf-8 "puntos de escala (pixels)"] ::msgcat::mcset it "picture scale points" [encoding convertfrom utf-8 "punti nella scala del disegno"] ::msgcat::mcset ru "picture scale points" [encoding convertfrom utf-8 "\320\274\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\321\203\321\216\321\211\320\270\320\265 \321\202\320\276\321\207\320\272\320\270 \320\264\320\273\321\217 \320\272\320\260\321\200\321\202\320\270\320\275\320\272\320\270"] ::msgcat::mcset sk "picture scale points" [encoding convertfrom utf-8 "kalibra\304\215n\303\251 body (obrazovka)"] ::msgcat::mcset sq "picture scale points" [encoding convertfrom utf-8 "pikat matese te fotos-pikselat"] ::msgcat::mcset bg "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "\320\232\320\260\320\273\320\270\320\261\321\200\320\270\321\200\320\260\321\211\320\270 \321\202\320\276\321\207\320\272\320\270 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 (X1:Y1 - X2:Y2)"] ::msgcat::mcset cz "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Kalibra\304\215n\303\255 body na obr\303\241zku (X1:Y1 - X2:Y2)."] ::msgcat::mcset de "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Kalibrierungspunkte auf dem Bild (X1:Y1 - X2:Y2)."] ::msgcat::mcset el "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "\316\243\316\267\316\274\316\265\316\257\316\261 \316\272\316\261\316\273\316\271\316\274\317\200\317\201\316\261\317\201\316\257\317\203\316\274\316\261\317\204\316\277\317\202 \317\203\317\204\316\267\316\275 \316\265\316\271\316\272\317\214\316\275\316\261 (\316\2471:\316\2451 - \316\2472:\316\2452)."] ::msgcat::mcset en "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Calibration points on the picture (X1:Y1 - X2:Y2)."] ::msgcat::mcset es "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Puntos de calibraci\303\263n en la imagen (X1:Y1 - X2:Y2)."] ::msgcat::mcset it "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Punti di calibrazione sul disegno (X1:Y1 - X2:Y2)."] ::msgcat::mcset ru "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "\320\232\320\260\320\273\320\270\320\261\321\200\320\276\320\262\320\276\321\207\320\275\321\213\320\265 \321\202\320\276\321\207\320\272\320\270 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270\320\275\320\272\320\265 (X1:Y1 - X2:Y2)."] ::msgcat::mcset sk "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "S\303\272radnice kalibra\304\215n\303\275ch bodov na obrazovke (X1:Y1 - X2:Y2)"] ::msgcat::mcset sq "Calibration points on the picture (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "pikat e kalibrimit ne foto (X1:Y1 - X2:Y2)"] ::msgcat::mcset bg "X1 picture." [encoding convertfrom utf-8 "X1 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "X1 picture." [encoding convertfrom utf-8 "X1 obr\303\241zek."] ::msgcat::mcset de "X1 picture." [encoding convertfrom utf-8 "X1 Bild."] ::msgcat::mcset el "X1 picture." [encoding convertfrom utf-8 "\316\2471 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "X1 picture." [encoding convertfrom utf-8 "X1 picture."] ::msgcat::mcset es "X1 picture." [encoding convertfrom utf-8 "Punto de escala X1 en la imagen."] ::msgcat::mcset it "X1 picture." [encoding convertfrom utf-8 "X1 del disegno."] ::msgcat::mcset ru "X1 picture." [encoding convertfrom utf-8 "X1 \320\272\320\260\321\200\321\202\320\270\320\275\320\272\320\270."] ::msgcat::mcset sk "X1 picture." [encoding convertfrom utf-8 "X1 na obr\303\241zku."] ::msgcat::mcset sq "X1 picture." [encoding convertfrom utf-8 "x1 fotoja"] ::msgcat::mcset bg "Y1 picture." [encoding convertfrom utf-8 "Y1 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Y1 picture." [encoding convertfrom utf-8 "Y1 obr\303\241zek."] ::msgcat::mcset de "Y1 picture." [encoding convertfrom utf-8 "Y1 Bild."] ::msgcat::mcset el "Y1 picture." [encoding convertfrom utf-8 "\316\2451 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "Y1 picture." [encoding convertfrom utf-8 "Y1 picture."] ::msgcat::mcset es "Y1 picture." [encoding convertfrom utf-8 "Punto de escala Y1 en la imagen."] ::msgcat::mcset it "Y1 picture." [encoding convertfrom utf-8 "Y1 del disegno."] ::msgcat::mcset ru "Y1 picture." [encoding convertfrom utf-8 "Y1 \320\272\320\260\321\200\321\202\320\270\320\275\320\272\320\270."] ::msgcat::mcset sk "Y1 picture." [encoding convertfrom utf-8 "Y1 na obr\303\241zku."] ::msgcat::mcset sq "Y1 picture." [encoding convertfrom utf-8 "Y1 fotoja"] ::msgcat::mcset bg "X2 picture." [encoding convertfrom utf-8 "X2 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "X2 picture." [encoding convertfrom utf-8 "X2 obr\303\241zek."] ::msgcat::mcset de "X2 picture." [encoding convertfrom utf-8 "X2 Bild."] ::msgcat::mcset el "X2 picture." [encoding convertfrom utf-8 "\316\2472 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "X2 picture." [encoding convertfrom utf-8 "X2 picture."] ::msgcat::mcset es "X2 picture." [encoding convertfrom utf-8 "Punto de escala X2 en la imagen."] ::msgcat::mcset it "X2 picture." [encoding convertfrom utf-8 "X2 del disegno."] ::msgcat::mcset ru "X2 picture." [encoding convertfrom utf-8 "X2 \320\272\320\260\321\200\321\202\320\270\320\275\320\272\320\270."] ::msgcat::mcset sk "X2 picture." [encoding convertfrom utf-8 "X2 na obr\303\241zku."] ::msgcat::mcset sq "X2 picture." [encoding convertfrom utf-8 "X2 fotoja"] ::msgcat::mcset bg "Y2 picture." [encoding convertfrom utf-8 "Y2 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Y2 picture." [encoding convertfrom utf-8 "Y2 obr\303\241zek."] ::msgcat::mcset de "Y2 picture." [encoding convertfrom utf-8 "Y2 Bild."] ::msgcat::mcset el "Y2 picture." [encoding convertfrom utf-8 "\316\2452 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "Y2 picture." [encoding convertfrom utf-8 "Y2 picture."] ::msgcat::mcset es "Y2 picture." [encoding convertfrom utf-8 "Punto de escala Y2 en la imagen."] ::msgcat::mcset it "Y2 picture." [encoding convertfrom utf-8 "Y2 del disegno."] ::msgcat::mcset ru "Y2 picture." [encoding convertfrom utf-8 "Y2 \320\272\320\260\321\200\321\202\320\270\320\275\320\272\320\270."] ::msgcat::mcset sk "Y2 picture." [encoding convertfrom utf-8 "Y2 na obr\303\241zku."] ::msgcat::mcset sq "Y2 picture." [encoding convertfrom utf-8 "Y2 fotoja"] ::msgcat::mcset bg "real scale points" [encoding convertfrom utf-8 "\321\200\320\265\320\260\320\273\320\275\320\270 \320\274\320\260\321\211\320\260\320\261\320\270\321\200\320\260\321\211\320\270 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset cz "real scale points" [encoding convertfrom utf-8 "body m\304\233\305\231\303\255tka (skute\304\215n\303\251)"] ::msgcat::mcset de "real scale points" [encoding convertfrom utf-8 "Punkte f\303\274r Realma\303\237stab"] ::msgcat::mcset el "real scale points" [encoding convertfrom utf-8 "\317\200\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\316\254 \317\203\316\267\316\274\316\265\316\257\316\261 \316\263\316\271\316\261 \316\272\316\261\316\273\316\271\316\274\317\200\317\201\316\254\317\201\316\271\317\203\316\274\316\261"] ::msgcat::mcset en "real scale points" [encoding convertfrom utf-8 "real scale points"] ::msgcat::mcset es "real scale points" [encoding convertfrom utf-8 "puntos de escala (reales)"] ::msgcat::mcset it "real scale points" [encoding convertfrom utf-8 "punti nella scala effettiva"] ::msgcat::mcset ru "real scale points" [encoding convertfrom utf-8 "\321\200\320\265\320\260\320\273\321\214\320\275\321\213\320\265 \320\274\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\321\203\321\216\321\211\320\270\320\265 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset sk "real scale points" [encoding convertfrom utf-8 "kalibra\304\215n\303\251 body (skuto\304\215n\303\251)"] ::msgcat::mcset sq "real scale points" [encoding convertfrom utf-8 "pikat reale te matjes"] ::msgcat::mcset bg "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "\320\240\320\265\320\260\320\273\320\275\320\270 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\270 \320\275\320\260 \320\272\320\260\320\273\320\270\320\261\321\200\320\270\321\200\320\260\321\211\320\270\321\202\320\265 \321\202\320\276\321\207\320\272\320\270 (X1:Y1 - X2:Y2)."] ::msgcat::mcset cz "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Skute\304\215n\303\251 sou\305\231adnice kalibra\304\215n\303\255ch bod\305\257 (X1:Y1 - X2:Y2)."] ::msgcat::mcset de "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Realkoordinaten der Kalibrierungspunkte (X1:Y1 - X2:Y2)."] ::msgcat::mcset el "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "\316\240\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\316\255\317\202 \317\203\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\265\317\202 \317\203\316\267\316\274\316\265\316\257\317\211\316\275 \316\272\316\261\316\273\316\271\316\274\317\200\317\201\316\261\317\201\316\257\317\203\316\274\316\261\317\204\316\277\317\202 (\316\2471:\316\2451 - \316\2472:\316\2452)"] ::msgcat::mcset en "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Real coordinates of calibration points (X1:Y1 - X2:Y2)."] ::msgcat::mcset es "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Coordenadas reales de los puntos de calibraci\303\263n (X1:Y1 - X2:Y2)."] ::msgcat::mcset it "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Coordinate reali dei punti di calibrazione (x1:y1 - x2:y2)."] ::msgcat::mcset ru "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "\320\240\320\265\320\260\320\273\321\214\320\275\321\213\320\265 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\321\213 \320\272\320\260\320\273\320\270\320\261\321\200\320\276\320\262\320\276\321\207\320\275\321\213\321\205 \321\202\320\276\321\207\320\265\320\272 (X1:Y1 - X2:Y2)."] ::msgcat::mcset sk "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "Skuto\304\215n\303\251 s\303\272radnice kalibra\304\215n\303\275ch bodov (X1:Y1 - X2:Y2)."] ::msgcat::mcset sq "Real coordinates of calibration points (X1:Y1 - X2:Y2)." [encoding convertfrom utf-8 "koordinatat reale te pikave te kalibrimit (X1:Y1 - X2:Y2)."] ::msgcat::mcset bg "X1 real." [encoding convertfrom utf-8 "X1 \321\200\320\265\320\260\320\273\320\275\320\276."] ::msgcat::mcset cz "X1 real." [encoding convertfrom utf-8 "X1 skute\304\215n\303\275."] ::msgcat::mcset el "X1 real." [encoding convertfrom utf-8 "\316\240\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\317\214 \316\2471."] ::msgcat::mcset en "X1 real." [encoding convertfrom utf-8 "X1 real."] ::msgcat::mcset es "X1 real." [encoding convertfrom utf-8 "X1 real"] ::msgcat::mcset it "X1 real." [encoding convertfrom utf-8 "x1 reale."] ::msgcat::mcset ru "X1 real." [encoding convertfrom utf-8 "X1 \321\200\320\265\320\260\320\273\321\214\320\275\320\276\320\265."] ::msgcat::mcset sk "X1 real." [encoding convertfrom utf-8 "X1 skuto\304\215n\303\275"] ::msgcat::mcset sq "X1 real." [encoding convertfrom utf-8 "X1 I vertet-real"] ::msgcat::mcset bg "Y1 real." [encoding convertfrom utf-8 "Y1 \321\200\320\265\320\260\320\273\320\275\320\276."] ::msgcat::mcset cz "Y1 real." [encoding convertfrom utf-8 "Y1 skute\304\215n\303\275."] ::msgcat::mcset el "Y1 real." [encoding convertfrom utf-8 "\316\240\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\317\214 \316\2451."] ::msgcat::mcset en "Y1 real." [encoding convertfrom utf-8 "Y1 real."] ::msgcat::mcset es "Y1 real." [encoding convertfrom utf-8 "Y1 real"] ::msgcat::mcset it "Y1 real." [encoding convertfrom utf-8 "y1 reale."] ::msgcat::mcset ru "Y1 real." [encoding convertfrom utf-8 "Y1 \321\200\320\265\320\260\320\273\321\214\320\275\320\276\320\265."] ::msgcat::mcset sk "Y1 real." [encoding convertfrom utf-8 "Y1 skuto\304\215n\303\275"] ::msgcat::mcset sq "Y1 real." [encoding convertfrom utf-8 "Y1 I vertet-real"] ::msgcat::mcset bg "X2 real." [encoding convertfrom utf-8 "X2 \321\200\320\265\320\260\320\273\320\275\320\276."] ::msgcat::mcset cz "X2 real." [encoding convertfrom utf-8 "X2 skute\304\215n\303\275."] ::msgcat::mcset el "X2 real." [encoding convertfrom utf-8 "\316\240\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\317\214 \316\2471."] ::msgcat::mcset en "X2 real." [encoding convertfrom utf-8 "X2 real."] ::msgcat::mcset es "X2 real." [encoding convertfrom utf-8 "X2 real"] ::msgcat::mcset it "X2 real." [encoding convertfrom utf-8 "x2 reale."] ::msgcat::mcset ru "X2 real." [encoding convertfrom utf-8 "X2 \321\200\320\265\320\260\320\273\321\214\320\275\320\276\320\265."] ::msgcat::mcset sk "X2 real." [encoding convertfrom utf-8 "X2 skuto\304\215n\303\275"] ::msgcat::mcset sq "X2 real." [encoding convertfrom utf-8 "X2 I vertet-real"] ::msgcat::mcset bg "Y2 real." [encoding convertfrom utf-8 "Y2 \321\200\320\265\320\260\320\273\320\275\320\276."] ::msgcat::mcset cz "Y2 real." [encoding convertfrom utf-8 "Y2 skute\304\215n\303\275."] ::msgcat::mcset el "Y2 real." [encoding convertfrom utf-8 "\316\240\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\317\214 \316\2452"] ::msgcat::mcset en "Y2 real." [encoding convertfrom utf-8 "Y2 real."] ::msgcat::mcset es "Y2 real." [encoding convertfrom utf-8 "Y2 real"] ::msgcat::mcset it "Y2 real." [encoding convertfrom utf-8 "y2 reale."] ::msgcat::mcset ru "Y2 real." [encoding convertfrom utf-8 "Y2 \321\200\320\265\320\260\320\273\321\214\320\275\320\276\320\265."] ::msgcat::mcset sk "Y2 real." [encoding convertfrom utf-8 "Y2 skuto\304\215n\303\275"] ::msgcat::mcset sq "Y2 real." [encoding convertfrom utf-8 "Y2 I vertet-real"] ::msgcat::mcset bg "units" [encoding convertfrom utf-8 "\320\265\320\264\320\270\320\275\320\270\321\206\320\270"] ::msgcat::mcset cz "units" [encoding convertfrom utf-8 "jednotky"] ::msgcat::mcset de "units" [encoding convertfrom utf-8 "Einheiten"] ::msgcat::mcset el "units" [encoding convertfrom utf-8 "\316\274\316\277\316\275\316\254\316\264\316\265\317\202"] ::msgcat::mcset en "units" [encoding convertfrom utf-8 "units"] ::msgcat::mcset es "units" [encoding convertfrom utf-8 "unidades"] ::msgcat::mcset it "units" [encoding convertfrom utf-8 "unit\303\240"] ::msgcat::mcset ru "units" [encoding convertfrom utf-8 "\320\265\320\264\320\270\320\275\320\270\321\206\321\213"] ::msgcat::mcset sk "units" [encoding convertfrom utf-8 "jednotky"] ::msgcat::mcset sq "units" [encoding convertfrom utf-8 "njesite"] ::msgcat::mcset bg "Units of real coordinates." [encoding convertfrom utf-8 "\320\225\320\264\320\270\320\275\320\270\321\206\320\270 \320\275\320\260 \321\200\320\265\320\260\320\273\320\275\320\270\321\202\320\265 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\270."] ::msgcat::mcset cz "Units of real coordinates." [encoding convertfrom utf-8 "Jednotky re\303\241ln\303\275ch sou\305\231adnic."] ::msgcat::mcset de "Units of real coordinates." [encoding convertfrom utf-8 "Einheiten der Realkoordinaten."] ::msgcat::mcset el "Units of real coordinates." [encoding convertfrom utf-8 "\316\234\316\277\316\275\316\254\316\264\316\265\317\202 \317\200\317\201\316\261\316\263\316\274\316\261\317\204\316\271\316\272\317\216\316\275 \317\203\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\317\211\316\275."] ::msgcat::mcset en "Units of real coordinates." [encoding convertfrom utf-8 "Units of real coordinates."] ::msgcat::mcset es "Units of real coordinates." [encoding convertfrom utf-8 "Unidades de las coordenadas reales."] ::msgcat::mcset it "Units of real coordinates." [encoding convertfrom utf-8 "Unit\303\240 delle coordinate reali."] ::msgcat::mcset ru "Units of real coordinates." [encoding convertfrom utf-8 "\320\225\320\264\320\270\320\275\320\270\321\206\321\213 \320\270\320\267\320\274\320\265\321\200\320\265\320\275\320\270\321\217 \321\200\320\265\320\260\320\273\321\214\320\275\321\213\321\205 \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202."] ::msgcat::mcset sk "Units of real coordinates." [encoding convertfrom utf-8 "Jednotky re\303\241lnych s\303\272radn\303\255c."] ::msgcat::mcset sq "Units of real coordinates." [encoding convertfrom utf-8 "njesite e koordinatave te verteta."] ::msgcat::mcset bg "background sketches" [encoding convertfrom utf-8 "\320\244\320\276\320\275\320\276\320\262\320\260 \321\201\320\272\320\270\321\206\320\260."] ::msgcat::mcset cz "background sketches" [encoding convertfrom utf-8 "n\303\241\304\215rtky na pozad\303\255"] ::msgcat::mcset de "background sketches" [encoding convertfrom utf-8 "Hintergrundskizzen"] ::msgcat::mcset el "background sketches" [encoding convertfrom utf-8 "\316\243\317\207\316\255\316\264\316\271\316\261 \317\204\316\277\317\205 \317\206\317\214\316\275\317\204\316\277\317\205"] ::msgcat::mcset it "background sketches" [encoding convertfrom utf-8 "Immagini di background"] ::msgcat::mcset ru "background sketches" [encoding convertfrom utf-8 "\320\244\320\276\320\275\320\276\320\262\321\213\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "background sketches" [encoding convertfrom utf-8 "n\303\241\304\215rtky na pozad\303\255."] ::msgcat::mcset sq "background sketches" [encoding convertfrom utf-8 "skicat e prapavise."] ::msgcat::mcset bg "List of image files used as scrap background." [encoding convertfrom utf-8 "\320\241\320\277\320\270\321\201\321\212\320\272 \320\275\320\260 \320\263\321\200\320\260\321\204\320\270\321\207\320\275\320\270 \321\204\320\260\320\271\320\273\320\276\320\262\320\265, \320\270\320\267\320\277\320\276\320\273\320\267\320\262\320\260\320\275\320\270 \320\267\320\260 \321\204\320\276\320\275\320\276\320\262\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset cz "List of image files used as scrap background." [encoding convertfrom utf-8 "Seznam obr\303\241zk\305\257 pou\305\276it\303\275ch jako pozad\303\255 scrapu"] ::msgcat::mcset de "List of image files used as scrap background." [encoding convertfrom utf-8 "Liste der als Hintergrund verwendeten Bilder."] ::msgcat::mcset el "List of image files used as scrap background." [encoding convertfrom utf-8 "\316\232\316\261\317\204\316\254\316\273\316\277\316\263\316\277\317\202 \316\261\317\201\317\207\316\265\316\257\317\211\316\275 \316\265\316\271\316\272\317\214\316\275\317\211\316\275 \317\200\316\277\317\205 \317\207\317\201\316\267\317\203\316\271\316\274\316\277\317\200\316\277\316\271\316\277\317\215\316\275\317\204\316\261\316\271 \317\211\317\202 \317\206\317\214\316\275\317\204\316\277 \317\204\316\277\317\205 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "List of image files used as scrap background." [encoding convertfrom utf-8 "Files usati come background dello scrap"] ::msgcat::mcset ru "List of image files used as scrap background." [encoding convertfrom utf-8 "\320\241\320\277\320\270\321\201\320\276\320\272 \320\263\321\200\320\260\321\204\320\270\321\207\320\265\321\201\320\272\320\270\321\205 \321\204\320\260\320\271\320\273\320\276\320\262, \320\270\321\201\320\277\320\276\320\273\321\214\320\267\321\203\320\265\320\274\321\213\321\205 \320\262 \320\272\320\260\321\207\320\265\321\201\321\202\320\262\320\265 \321\204\320\276\320\275\320\276\320\262\321\213\321\205 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\271 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "List of image files used as scrap background." [encoding convertfrom utf-8 "Zoznam obr\303\241zkov pou\305\276it\303\275ch ako pozadie."] ::msgcat::mcset sq "List of image files used as scrap background." [encoding convertfrom utf-8 "lista e foto-arkivit te perdorura si prapavije e deponise."] ::msgcat::mcset bg "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275, \320\267\320\260 \320\264\320\260 \320\262\320\274\321\212\320\272\320\275\320\265\321\202\320\265 \321\201\320\272\320\270\321\206\320\260, \320\272\320\260\321\202\320\276 \320\272\320\273\320\270\320\272\320\275\320\265\321\202\320\265 \320\262\321\212\321\200\321\205\321\203 \320\275\320\265\321\217."] ::msgcat::mcset cz "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "Stiskn\304\233te toto tla\304\215\303\255tko a v\303\275b\304\233rem n\303\241\304\215rtku my\305\241\303\255 jej vlo\305\276te do scrapu."] ::msgcat::mcset de "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "Diesen Knopf dr\303\274cken um Skizze einzuf\303\274gen."] ::msgcat::mcset el "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "\316\240\316\261\317\204\316\256\317\203\317\204\316\265 \316\265\316\264\317\216 \316\263\316\271\316\261 \316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \316\274\316\265 \317\200\316\277\316\275\317\204\316\257\316\272\316\271"] ::msgcat::mcset it "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "Premi per inserire il disegno che scegli col mouse"] ::msgcat::mcset ru "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "\320\255\321\202\320\260 \320\272\320\275\320\276\320\277\320\272\320\260 \320\262\321\201\321\202\320\260\320\262\320\273\321\217\320\265\321\202 \321\204\320\276\320\275 \321\201\320\272\321\200\320\260\320\277\320\260 \320\262 \321\201\320\277\320\270\321\201\320\276\320\272"] ::msgcat::mcset sk "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "Po stla\304\215en\303\255 klikni na n\303\241\304\215rtok, ktor\303\275 treba vlo\305\276i\305\245 do scrapu."] ::msgcat::mcset sq "Press this button to insert sketch by clicking on it." [encoding convertfrom utf-8 "shtype kete buton te fusesh skicen duke klikuar ne te."] ::msgcat::mcset bg "Delete sketch from scrap." [encoding convertfrom utf-8 "\320\230\320\267\321\202\321\200\320\270\320\271 \321\201\320\272\320\270\321\206\320\260 \320\276\321\202 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset cz "Delete sketch from scrap." [encoding convertfrom utf-8 "Odstranit n\303\241\304\215rtek ze scrapu"] ::msgcat::mcset de "Delete sketch from scrap." [encoding convertfrom utf-8 "L\303\266sche Skizze."] ::msgcat::mcset el "Delete sketch from scrap." [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \316\261\317\200\317\214 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "Delete sketch from scrap." [encoding convertfrom utf-8 "Rimuovi un disegno dallo scrap"] ::msgcat::mcset ru "Delete sketch from scrap." [encoding convertfrom utf-8 "\320\255\321\202\320\260 \320\272\320\275\320\276\320\277\320\272\320\260 \321\203\320\264\320\260\320\273\321\217\320\265\321\202 \321\204\320\276\320\275 \321\201\320\272\321\200\320\260\320\277\320\260 \320\270\320\267 \321\201\320\277\320\270\321\201\320\272\320\260"] ::msgcat::mcset sk "Delete sketch from scrap." [encoding convertfrom utf-8 "Odstr\303\241\305\210 n\303\241\304\215rtok zo scrapu."] ::msgcat::mcset sq "Delete sketch from scrap." [encoding convertfrom utf-8 "fshije skicen nga deponia"] ::msgcat::mcset bg "loading point module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\267\320\260 \321\202\320\276\321\207\320\272\320\270 ..."] ::msgcat::mcset cz "loading point module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m point modul ..."] ::msgcat::mcset de "loading point module ..." [encoding convertfrom utf-8 "Lade Punktmodul ..."] ::msgcat::mcset el "loading point module ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261\317\202 \317\203\316\267\316\274\316\265\316\257\317\211\316\275\342\200\246"] ::msgcat::mcset en "loading point module ..." [encoding convertfrom utf-8 "loading point module ..."] ::msgcat::mcset es "loading point module ..." [encoding convertfrom utf-8 "puntos ..."] ::msgcat::mcset it "loading point module ..." [encoding convertfrom utf-8 "modolo punti ..."] ::msgcat::mcset ru "loading point module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \321\202\320\276\321\207\320\265\320\272..."] ::msgcat::mcset sk "loading point module ..." [encoding convertfrom utf-8 "nahr\303\241vam editor bodov ..."] ::msgcat::mcset sq "loading point module ..." [encoding convertfrom utf-8 "duke lexuar modulin e pikes\342\200\246"] ::msgcat::mcset bg "Update point" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "Update point" [encoding convertfrom utf-8 "Aktualizovat"] ::msgcat::mcset de "Update point" [encoding convertfrom utf-8 "Punkt aktualisieren"] ::msgcat::mcset el "Update point" [encoding convertfrom utf-8 "\316\225\316\275\316\267\316\274\316\255\317\201\317\211\317\203\316\267 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Update point" [encoding convertfrom utf-8 "Update point"] ::msgcat::mcset es "Update point" [encoding convertfrom utf-8 "Actualizar"] ::msgcat::mcset it "Update point" [encoding convertfrom utf-8 "Aggiorna punto"] ::msgcat::mcset ru "Update point" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214 \321\202\320\276\321\207\320\272\321\203"] ::msgcat::mcset sk "Update point" [encoding convertfrom utf-8 "Akualizuj bod"] ::msgcat::mcset sq "Update point" [encoding convertfrom utf-8 "pika e aktualizimit"] ::msgcat::mcset bg "Click this button to apply point changes." [encoding convertfrom utf-8 "\320\275\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\267\320\260 \320\277\321\200\320\270\320\273\320\260\320\263\320\260\320\275\320\265 \320\275\320\260 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\321\217\321\202\320\260 \320\262/\321\203 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Click this button to apply point changes." [encoding convertfrom utf-8 "Aktualizuje data t\303\275kaj\303\255c\303\255 se bodu."] ::msgcat::mcset de "Click this button to apply point changes." [encoding convertfrom utf-8 "Klicke diesen Knopf, um \303\204nderungen am Punkt anzuwenden."] ::msgcat::mcset el "Click this button to apply point changes." [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\263\316\271\316\261 \316\275\316\261 \316\263\316\257\316\275\316\265\316\271 \316\265\317\206\316\261\317\201\316\274\316\277\316\263\316\256 \317\204\317\211\316\275 \316\261\316\273\316\273\316\261\316\263\317\216\316\275 \317\200\316\277\317\205 \316\272\316\254\316\275\316\261\317\204\316\265 \317\203\317\204\316\261 \317\203\316\267\316\274\316\265\316\257\316\261"] ::msgcat::mcset en "Click this button to apply point changes." [encoding convertfrom utf-8 "Click this button to apply point changes."] ::msgcat::mcset es "Click this button to apply point changes." [encoding convertfrom utf-8 "Clicar aqu\303\255 tras modificar las propiedades del punto."] ::msgcat::mcset it "Click this button to apply point changes." [encoding convertfrom utf-8 "Premi il bottone per fare modifiche al punto."] ::msgcat::mcset ru "Click this button to apply point changes." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\264\320\273\321\217 \320\277\321\200\320\270\320\274\320\265\320\275\320\265\320\275\320\270\321\217 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Click this button to apply point changes." [encoding convertfrom utf-8 "Stla\304\215te aby sa aktualizovali zmenen\303\251 \303\272daje bodu."] ::msgcat::mcset sq "Click this button to apply point changes." [encoding convertfrom utf-8 "kliko kete buton te aktualizosh nderrimet e pikes."] ::msgcat::mcset bg "Point type." [encoding convertfrom utf-8 "\320\242\320\270\320\277 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Point type." [encoding convertfrom utf-8 "Typ bodu."] ::msgcat::mcset de "Point type." [encoding convertfrom utf-8 "Punkttyp."] ::msgcat::mcset el "Point type." [encoding convertfrom utf-8 "\316\225\316\257\316\264\316\277\317\202 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Point type." [encoding convertfrom utf-8 "Point type (click on triangle to see menu)."] ::msgcat::mcset es "Point type." [encoding convertfrom utf-8 "Tipo de punto. Clic en tri\303\241ngulo para ver men\303\272"] ::msgcat::mcset it "Point type." [encoding convertfrom utf-8 "Tipo di punto"] ::msgcat::mcset ru "Point type." [encoding convertfrom utf-8 "\320\242\320\270\320\277 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Point type." [encoding convertfrom utf-8 "Typ bodu."] ::msgcat::mcset sq "Point type." [encoding convertfrom utf-8 "lloji I pikave (kliko ne trekendesh te shohesh menun)."] ::msgcat::mcset bg "Point identifier." [encoding convertfrom utf-8 "\320\230\320\275\320\264\320\265\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Point identifier." [encoding convertfrom utf-8 "Identifik\303\241tor bodu."] ::msgcat::mcset de "Point identifier." [encoding convertfrom utf-8 "Punktbezeichner."] ::msgcat::mcset el "Point identifier." [encoding convertfrom utf-8 "ID \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Point identifier." [encoding convertfrom utf-8 "Point identifier."] ::msgcat::mcset es "Point identifier." [encoding convertfrom utf-8 "Nombre (ID) del punto."] ::msgcat::mcset it "Point identifier." [encoding convertfrom utf-8 "Identificatore del punto."] ::msgcat::mcset ru "Point identifier." [encoding convertfrom utf-8 "\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Point identifier." [encoding convertfrom utf-8 "Identifik\303\241tor bodu."] ::msgcat::mcset sq "Point identifier." [encoding convertfrom utf-8 "identifikuesi I pikes."] ::msgcat::mcset bg "Other point options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270 \320\276\320\277\321\206\320\270\320\270 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Other point options." [encoding convertfrom utf-8 "Dal\305\241\303\255 volby pro bod."] ::msgcat::mcset de "Other point options." [encoding convertfrom utf-8 "Andere Punktoptionen."] ::msgcat::mcset el "Other point options." [encoding convertfrom utf-8 "\316\206\316\273\316\273\316\265\317\202 \316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \316\263\316\271\316\261 \317\203\316\267\316\274\316\265\316\257\316\261"] ::msgcat::mcset en "Other point options." [encoding convertfrom utf-8 "Options allow giving special characteristics to points."] ::msgcat::mcset es "Other point options." [encoding convertfrom utf-8 "Las opciones permiten dar caracter\303\255sticas especiales a los puntos."] ::msgcat::mcset it "Other point options." [encoding convertfrom utf-8 "Altre opzioni del punto."] ::msgcat::mcset ru "Other point options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270\320\265 \320\276\320\277\321\206\320\270\320\270 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Other point options." [encoding convertfrom utf-8 "Ostatn\303\251 \305\241pecifik\303\241cie bodu."] ::msgcat::mcset sq "Other point options." [encoding convertfrom utf-8 "opcionet tjera te pikes."] ::msgcat::mcset bg "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "\320\235\320\260\320\277\321\200\320\270\320\274\320\265\321\200, \320\260\320\272\320\276 \321\202\320\270\320\277\321\212\321\202 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260 \320\265 label (\320\265\321\202\320\270\320\272\320\265\321\202), \321\202\321\203\320\272 \320\274\320\276\320\266\320\265\321\202\320\265 \320\264\320\260 \320\262\321\212\320\262\320\265\320\264\320\265\321\202\320\265: -text \042 , \321\202\320\276\320\262\320\260 \321\211\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\267\320\270: (P100)\042"] ::msgcat::mcset cz "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "P\305\231\303\255klad: pokud type je label, zadejte: -text \042this will be displayed (P100)\042"] ::msgcat::mcset de "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "d.h., wenn der Typ Beschriftung ist, schreibe hier: -text \042das wird hier angezeigt (P100)\042"] ::msgcat::mcset el "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "\316\224\316\267\316\273\316\261\316\264\316\256, \316\261\316\275 \317\204\316\277 \316\265\316\257\316\264\316\277\317\202 \316\265\316\257\316\275\316\261\316\271 \317\204\316\261\316\274\317\200\316\255\316\273\316\261, \316\265\316\264\317\216 \316\263\317\201\316\254\317\206\316\265\317\204\316\265: -text \042\316\261\317\205\317\204\317\214 \316\265\316\274\317\206\316\261\316\275\316\257\316\266\316\265\317\204\316\261\316\271 (P100)\042"] ::msgcat::mcset en "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "I.e, if type is label, write here: -text \042this will be displayed (P100)\042"] ::msgcat::mcset es "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "P.ej, si el tipo es label, escribe: -text \042lo que se ver\303\241 (P100)\042."] ::msgcat::mcset it "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "Cio\303\251, se il tipo \303\250 etichetta, scrivi: -text \042questo sar\303\240 visualizzato (P100)\042"] ::msgcat::mcset ru "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "\320\235\320\260\320\277\321\200\320\270\320\274\320\265\321\200, \320\265\321\201\320\273\320\270 \321\202\320\270\320\277 \321\202\320\276\321\207\320\272\320\270 label, \320\267\320\264\320\265\321\201\321\214 \320\274\320\276\320\266\320\275\320\276 \320\275\320\260\320\261\321\200\320\260\321\202\321\214: -text \042\321\215\321\202\320\276 \320\275\320\260\320\277\320\265\321\207\320\260\321\202\320\260\320\265\321\202\321\201\321\217 (P100)\042"] ::msgcat::mcset sk "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "Pr\303\255klad: ak je typ label, zadajte: -text \042tento text bude zobrazen\303\275\042"] ::msgcat::mcset sq "I.e, if type is label, write here: -text \042this will be displayed (P100)\042" [encoding convertfrom utf-8 "p.sh. nese lloji eshte etikete, shkruaj ketu: -teksti \042 kjo do te lajmerohet (P100)\042"] ::msgcat::mcset bg "Enter symbol orientation angle." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\217 \320\275\320\260 \321\201\320\270\320\274\320\262\320\276\320\273\320\260."] ::msgcat::mcset cz "Enter symbol orientation angle." [encoding convertfrom utf-8 "Zadejte orientaci bodu."] ::msgcat::mcset de "Enter symbol orientation angle." [encoding convertfrom utf-8 "Winkel der Symbolausrichtung angeben."] ::msgcat::mcset el "Enter symbol orientation angle." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\263\317\211\316\275\316\257\316\261\317\202 \317\200\317\201\316\277\317\203\316\261\316\275\316\261\317\204\316\277\316\273\316\271\317\203\316\274\316\277\317\215 \317\203\317\215\316\274\316\262\316\277\316\273\316\277\317\205."] ::msgcat::mcset en "Enter symbol orientation angle." [encoding convertfrom utf-8 "Enter symbol orientation angle."] ::msgcat::mcset es "Enter symbol orientation angle." [encoding convertfrom utf-8 "Introducir direcci\303\263n en que debe apuntar el s\303\255mbolo."] ::msgcat::mcset it "Enter symbol orientation angle." [encoding convertfrom utf-8 "Scrivi l'angolo di orientazione del simbolo."] ::msgcat::mcset ru "Enter symbol orientation angle." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\216 \321\201\320\270\320\274\320\262\320\276\320\273\320\260."] ::msgcat::mcset sk "Enter symbol orientation angle." [encoding convertfrom utf-8 "Zadajte orient\303\241ciu bodu."] ::msgcat::mcset sq "Enter symbol orientation angle." [encoding convertfrom utf-8 "fute simbolin e kendit te orientimit."] ::msgcat::mcset bg "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "\320\235\321\217\320\272\320\276\320\270 \321\202\320\270\320\277\320\276\320\262\320\265 \321\201\320\270\320\274\320\262\320\276\320\273\320\270 \321\202\321\200\321\217\320\261\320\262\320\260 \320\264\320\260 \320\261\321\212\320\264\320\260\321\202 \320\276\321\200\320\270\320\265\320\275\321\202\320\270\321\200\320\260\320\275\320\270 (\320\275\320\260\320\277\321\200\320\270\320\274\320\265\321\200 gradient). \320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\321\203\320\272 \320\267\320\260 \320\264\320\260 \320\270\320\274 \320\264\320\260\320\264\320\265\321\202\320\265 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \321\201 \320\277\320\276\320\274\320\276\321\211\321\202\320\260 \320\275\320\260 \320\274\320\270\321\210\320\272\320\260\321\202\320\260 \320\270\320\273\320\270 \320\272\320\273\320\260\320\262\320\270\320\260\321\202\321\203\321\200\320\260\321\202\320\260."] ::msgcat::mcset cz "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "Jsou symboly, kter\303\275m mus\303\255te specifikovat orientaci (nap\305\231. gradient). Zaklikn\304\233te tuto volbu a nastavte jim orientaci my\305\241\303\255 nebo z kl\303\241vesnice."] ::msgcat::mcset de "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "Es gibt Symbole, die eine Ausrichtung haben m\303\274ssen (z.B. Gef\303\244lle). Klicke hier, um sie mit der Maus oder der Tastatur auszurichten."] ::msgcat::mcset el "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "\316\232\316\254\317\200\316\277\316\271\316\261 \316\265\316\257\316\264\316\267 \317\203\317\205\316\274\316\262\317\214\316\273\317\211\316\275 \317\200\317\201\316\255\317\200\316\265\316\271 \316\275\316\261 \317\200\317\201\316\277\317\203\316\261\316\275\316\261\317\204\316\277\316\273\316\271\317\203\317\204\316\277\317\215\316\275 (\317\200.\317\207. \316\272\316\273\316\257\317\203\316\265\316\271\317\202). \316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\265\316\264\317\216 \316\275\316\261 \316\277\317\201\316\271\317\203\316\270\316\265\316\257 \316\277 \317\200\317\201\316\277\317\203\316\261\316\275\316\261\317\204\316\277\316\273\316\271\317\203\316\274\317\214\317\202 \316\265\316\257\317\204\316\265 \316\261\317\200\317\214 \317\204\316\277 \317\200\316\273\316\267\316\272\317\204\317\201\316\277\316\273\317\214\316\263\316\271\316\277 \316\265\316\257\317\204\316\265 \316\274\316\265 \317\204\316\277 \317\200\316\277\316\275\317\204\316\257\316\272\316\271."] ::msgcat::mcset en "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "Some symbol types must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard."] ::msgcat::mcset es "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "Hay tipos de s\303\255mbolo que deben ser orientados (p.ej, pendientes). Haz clic aqu\303\255 para orientarlos con rat\303\263n o teclado."] ::msgcat::mcset it "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "Ci sono tipi di simboli che sono orientati (per es. gradiente). Premi qui per orientarli col mouse o la tastiera"] ::msgcat::mcset ru "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "\320\235\320\265\320\272\320\276\321\202\320\276\321\200\321\213\320\265 \321\202\320\270\320\277\321\213 \321\201\320\270\320\274\320\262\320\276\320\273\320\276\320\262 \320\264\320\276\320\273\320\266\320\275\321\213 \320\261\321\213\321\202\321\214 \320\276\321\200\320\270\320\265\320\275\321\202\320\270\321\200\320\276\320\262\320\260\320\275\321\213 (\320\275\320\260\320\277\321\200\320\270\320\274\320\265\321\200 gradient). \320\235\320\260\320\266\320\274\320\270\321\202\320\265 \320\267\320\264\320\265\321\201\321\214 \320\264\320\273\321\217 \320\277\321\200\320\270\320\264\320\260\320\275\320\270\321\217 \320\270\320\274 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\320\270 \321\201 \320\277\320\276\320\274\320\276\321\211\321\214\321\216 \320\274\321\213\321\210\320\270 \320\270\320\273\320\270 \320\272\320\273\320\260\320\262\320\270\320\260\321\202\321\203\321\200\321\213."] ::msgcat::mcset sk "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "S\303\272 symboly, ktor\303\275m treba zada\305\245 orient\303\241ciu (napr. gradiet). Ozna\304\215te t\303\272to vo\304\276bu a nastavte orient\303\241ciu my\305\241ou alebo z kl\303\241vesnice."] ::msgcat::mcset sq "There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard." [encoding convertfrom utf-8 "disa lloje te simboleve duhet te orientohen (p.sh.:gradienti). Kliko ketu qe ti orientosh me mi apo tastature."] ::msgcat::mcset bg "x-size" [encoding convertfrom utf-8 "\321\205-\321\200\320\260\320\267\320\274\320\265\321\200"] ::msgcat::mcset cz "x-size" [encoding convertfrom utf-8 "x-rozsah"] ::msgcat::mcset de "x-size" [encoding convertfrom utf-8 "x-Gr\303\266\303\237e"] ::msgcat::mcset el "x-size" [encoding convertfrom utf-8 "\316\274\316\255\316\263\316\265\316\270\316\277\317\202 x"] ::msgcat::mcset en "x-size" [encoding convertfrom utf-8 "x-size"] ::msgcat::mcset es "x-size" [encoding convertfrom utf-8 "tama\303\261o-x"] ::msgcat::mcset it "x-size" [encoding convertfrom utf-8 "dim. x"] ::msgcat::mcset ru "x-size" [encoding convertfrom utf-8 "x-size"] ::msgcat::mcset sk "x-size" [encoding convertfrom utf-8 "ve\304\276kos\305\245-x"] ::msgcat::mcset sq "x-size" [encoding convertfrom utf-8 "madhesia-X"] ::msgcat::mcset bg "Set point size in main direction." [encoding convertfrom utf-8 "\320\243\320\272\320\260\320\266\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260 \320\262 \320\263\320\273\320\260\320\262\320\275\320\276\321\202\320\276 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265."] ::msgcat::mcset cz "Set point size in main direction." [encoding convertfrom utf-8 "Nastav\303\255 rozsah bodu v hlavn\303\255m sm\304\233ru."] ::msgcat::mcset de "Set point size in main direction." [encoding convertfrom utf-8 "Setze Punktgr\303\266\303\237e in Hauptrichtung."] ::msgcat::mcset el "Set point size in main direction." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \317\200\316\273\316\265\317\205\317\201\316\271\316\272\316\277\317\215 \316\274\316\265\316\263\316\255\316\270\316\277\317\205\317\202 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Set point size in main direction." [encoding convertfrom utf-8 "Set point size in main direction."] ::msgcat::mcset es "Set point size in main direction." [encoding convertfrom utf-8 "Ajustar tama\303\261o del punto en direcci\303\263n principal."] ::msgcat::mcset it "Set point size in main direction." [encoding convertfrom utf-8 "Imposta la dimensione del punto nella direzione principale."] ::msgcat::mcset ru "Set point size in main direction." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214 \321\200\320\260\320\267\320\274\320\265\321\200 \321\202\320\276\321\207\320\272\320\270 \320\262 \320\263\320\273\320\260\320\262\320\275\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Set point size in main direction." [encoding convertfrom utf-8 "Nastavte ve\304\276kos\305\245 bodu v hlavnom (X) smere."] ::msgcat::mcset sq "Set point size in main direction." [encoding convertfrom utf-8 "vene madhesine e pikes ne drejtimin kryesor."] ::msgcat::mcset bg "Enter point size in main direction." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260 \320\262 \320\263\320\273\320\260\320\262\320\275\320\276\321\202\320\276 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265."] ::msgcat::mcset cz "Enter point size in main direction." [encoding convertfrom utf-8 "Zadejte rozsah bodu v hlavn\303\255m sm\304\233ru."] ::msgcat::mcset de "Enter point size in main direction." [encoding convertfrom utf-8 "Punktgr\303\266\303\237e in Hauptrichtung eingeben."] ::msgcat::mcset el "Enter point size in main direction." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\200\316\273\316\265\317\205\317\201\316\271\316\272\316\277\317\215 \316\274\316\265\316\263\316\255\316\270\316\277\317\205\317\202 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Enter point size in main direction." [encoding convertfrom utf-8 "Enter point size in main direction."] ::msgcat::mcset es "Enter point size in main direction." [encoding convertfrom utf-8 "Introducir tama\303\261o del punto en direcci\303\263n principal."] ::msgcat::mcset it "Enter point size in main direction." [encoding convertfrom utf-8 "Scrivi la dimensione del punto nella direzione principale."] ::msgcat::mcset ru "Enter point size in main direction." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200 \321\202\320\276\321\207\320\272\320\270 \320\262 \320\263\320\273\320\260\320\262\320\275\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Enter point size in main direction." [encoding convertfrom utf-8 "Zadajte ve\304\276kos\305\245 bodu v hlavnom (X) smere."] ::msgcat::mcset sq "Enter point size in main direction." [encoding convertfrom utf-8 "fute madhesine e pikes ne drejtimin kryesor."] ::msgcat::mcset bg "y-size" [encoding convertfrom utf-8 "y-\321\200\320\260\320\267\320\274\320\265\321\200"] ::msgcat::mcset cz "y-size" [encoding convertfrom utf-8 "y-rozsah"] ::msgcat::mcset de "y-size" [encoding convertfrom utf-8 "y-Gr\303\266\303\237e"] ::msgcat::mcset el "y-size" [encoding convertfrom utf-8 "\316\274\316\255\316\263\316\265\316\270\316\277\317\202 y"] ::msgcat::mcset en "y-size" [encoding convertfrom utf-8 "y-size"] ::msgcat::mcset es "y-size" [encoding convertfrom utf-8 "tama\303\261o-y"] ::msgcat::mcset it "y-size" [encoding convertfrom utf-8 "dim. y"] ::msgcat::mcset ru "y-size" [encoding convertfrom utf-8 "y-size"] ::msgcat::mcset sk "y-size" [encoding convertfrom utf-8 "ve\304\276kos\305\245-y"] ::msgcat::mcset sq "y-size" [encoding convertfrom utf-8 "madhesia-Y"] ::msgcat::mcset bg "Set point size in side direction." [encoding convertfrom utf-8 "\320\243\320\272\320\260\320\266\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260 \320\262 \320\276\320\261\321\200\320\260\321\202\320\275\320\276\321\202\320\276 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265."] ::msgcat::mcset cz "Set point size in side direction." [encoding convertfrom utf-8 "Nastav\303\255 rozsah bodu ve vedlej\305\241\303\255m sm\304\233ru."] ::msgcat::mcset de "Set point size in side direction." [encoding convertfrom utf-8 "Setze Punktgr\303\266\303\237e in seitlicher Richtung."] ::msgcat::mcset el "Set point size in side direction." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \317\200\316\273\316\265\317\205\317\201\316\271\316\272\316\277\317\215 \316\274\316\265\316\263\316\255\316\270\316\277\317\205\317\202 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Set point size in side direction." [encoding convertfrom utf-8 "Set point size in side direction."] ::msgcat::mcset es "Set point size in side direction." [encoding convertfrom utf-8 "Ajustar tama\303\261o del punto en direcci\303\263n lateral."] ::msgcat::mcset it "Set point size in side direction." [encoding convertfrom utf-8 "Imposta la dimensione del punto nella direzione trasversale."] ::msgcat::mcset ru "Set point size in side direction." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\321\214 \321\200\320\260\320\267\320\274\320\265\321\200 \321\202\320\276\321\207\320\272\320\270 \320\262 \320\261\320\276\320\272\320\276\320\262\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Set point size in side direction." [encoding convertfrom utf-8 "Nastavte ve\304\276kos\305\245 bodu vo ved\304\276aj\305\241om smere."] ::msgcat::mcset sq "Set point size in side direction." [encoding convertfrom utf-8 "vene madhesine e pikes ne drejtim anesore."] ::msgcat::mcset bg "Enter point size in side direction." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260 \320\262 \320\276\320\261\321\200\320\260\321\202\320\275\320\276\321\202\320\276 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265."] ::msgcat::mcset cz "Enter point size in side direction." [encoding convertfrom utf-8 "Zadejte rozsah bodu ve vedlej\305\241\303\255m sm\304\233ru."] ::msgcat::mcset de "Enter point size in side direction." [encoding convertfrom utf-8 "Punktgr\303\266\303\237e in seitlicher Richtung eingeben."] ::msgcat::mcset el "Enter point size in side direction." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\200\316\273\316\265\317\205\317\201\316\271\316\272\316\277\317\215 \316\274\316\265\316\263\316\255\316\270\316\277\317\205\317\202 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Enter point size in side direction." [encoding convertfrom utf-8 "Enter point size in side direction."] ::msgcat::mcset es "Enter point size in side direction." [encoding convertfrom utf-8 "Introducir tama\303\261o del punto en direcci\303\263n lateral."] ::msgcat::mcset it "Enter point size in side direction." [encoding convertfrom utf-8 "Scrivi la dimensione del punto nella direzione trasversale."] ::msgcat::mcset ru "Enter point size in side direction." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200 \321\202\320\276\321\207\320\272\320\270 \320\262 \320\261\320\276\320\272\320\276\320\262\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Enter point size in side direction." [encoding convertfrom utf-8 "Zadajte ve\304\276kos\305\245 bodu vo ved\304\276aj\305\241om smere."] ::msgcat::mcset sq "Enter point size in side direction." [encoding convertfrom utf-8 "fute madhesine e pikes ne drejtim anesore."] ::msgcat::mcset bg "loading line module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\267\320\260 \320\273\320\270\320\275\320\270\320\270 ..."] ::msgcat::mcset cz "loading line module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m k\305\231ivkov\303\275 modul ..."] ::msgcat::mcset de "loading line module ..." [encoding convertfrom utf-8 "Lade Linienmodul ..."] ::msgcat::mcset el "loading line module ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261\317\202 \316\263\317\201\316\261\316\274\316\274\317\216\316\275..."] ::msgcat::mcset en "loading line module ..." [encoding convertfrom utf-8 "loading line module ..."] ::msgcat::mcset es "loading line module ..." [encoding convertfrom utf-8 "l\303\255neas ..."] ::msgcat::mcset it "loading line module ..." [encoding convertfrom utf-8 "modulo linee ..."] ::msgcat::mcset ru "loading line module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \320\273\320\270\320\275\320\270\320\271 ..."] ::msgcat::mcset sk "loading line module ..." [encoding convertfrom utf-8 "nahr\303\241vam modul kriviek ..."] ::msgcat::mcset sq "loading line module ..." [encoding convertfrom utf-8 "duke lexuar modulin e rrjeshtit\342\200\246"] ::msgcat::mcset bg "Line type." [encoding convertfrom utf-8 "\320\242\320\270\320\277 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217."] ::msgcat::mcset cz "Line type." [encoding convertfrom utf-8 "Typ k\305\231ivky."] ::msgcat::mcset de "Line type." [encoding convertfrom utf-8 "Linientyp."] ::msgcat::mcset el "Line type." [encoding convertfrom utf-8 "\316\225\316\257\316\264\316\277\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Line type." [encoding convertfrom utf-8 "Line type (click on triangle to see menu)."] ::msgcat::mcset es "Line type." [encoding convertfrom utf-8 "Tipo de l\303\255nea. Clic en tri\303\241ngulo para ver el men\303\272."] ::msgcat::mcset it "Line type." [encoding convertfrom utf-8 "Tipo di linea."] ::msgcat::mcset ru "Line type." [encoding convertfrom utf-8 "\320\242\320\270\320\277 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Line type." [encoding convertfrom utf-8 "Typ krivky."] ::msgcat::mcset sq "Line type." [encoding convertfrom utf-8 "lloji I rrjeshtit."] ::msgcat::mcset bg "id" [encoding convertfrom utf-8 "id - \320\270\320\275\320\264\320\265\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200"] ::msgcat::mcset cz "id" [encoding convertfrom utf-8 "id"] ::msgcat::mcset de "id" [encoding convertfrom utf-8 "id"] ::msgcat::mcset el "id" [encoding convertfrom utf-8 "ID"] ::msgcat::mcset en "id" [encoding convertfrom utf-8 "id"] ::msgcat::mcset es "id" [encoding convertfrom utf-8 "ID"] ::msgcat::mcset it "id" [encoding convertfrom utf-8 "Identificativo"] ::msgcat::mcset ru "id" [encoding convertfrom utf-8 "\320\230\320\264"] ::msgcat::mcset sk "id" [encoding convertfrom utf-8 "id"] ::msgcat::mcset sq "id" [encoding convertfrom utf-8 "ID-identifikimi"] ::msgcat::mcset bg "Line identifier." [encoding convertfrom utf-8 "\320\230\320\275\320\264\320\265\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "Line identifier." [encoding convertfrom utf-8 "Identifik\303\241tor k\305\231ivky."] ::msgcat::mcset de "Line identifier." [encoding convertfrom utf-8 "Linienbezeichner."] ::msgcat::mcset el "Line identifier." [encoding convertfrom utf-8 "ID \316\263\317\201\316\261\316\274\316\274\316\256\317\202."] ::msgcat::mcset en "Line identifier." [encoding convertfrom utf-8 "Line identifier."] ::msgcat::mcset es "Line identifier." [encoding convertfrom utf-8 "Nombre (ID) de la l\303\255nea."] ::msgcat::mcset it "Line identifier." [encoding convertfrom utf-8 "Identificativo della linea."] ::msgcat::mcset ru "Line identifier." [encoding convertfrom utf-8 "\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "Line identifier." [encoding convertfrom utf-8 "Identifik\303\241tor krivky."] ::msgcat::mcset sq "Line identifier." [encoding convertfrom utf-8 "identifikimi I rrjeshtit."] ::msgcat::mcset bg "Other line options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270 \320\276\320\277\321\206\320\270\320\270 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "Other line options." [encoding convertfrom utf-8 "Dal\305\241\303\255 volby pro k\305\231ivku."] ::msgcat::mcset de "Other line options." [encoding convertfrom utf-8 "Andere Linienoptionen."] ::msgcat::mcset el "Other line options." [encoding convertfrom utf-8 "\316\206\316\273\316\273\316\265\317\202 \316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202. \316\224\316\267\316\273\316\261\316\264\316\256 \316\263\316\271\316\261 \316\274\316\267-\316\265\316\274\317\206\316\254\316\275\316\271\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \316\263\317\201\316\254\317\206\316\265\317\204\316\265 \316\265\316\264\317\216: -subtype invisible. \316\222\316\273\316\255\317\200\316\265\317\204\316\265 \317\204\316\277 thbook.pdf"] ::msgcat::mcset en "Other line options." [encoding convertfrom utf-8 "Other line options. I.e., to make line invisible, write here: -subtype invisible. See thbook.pdf"] ::msgcat::mcset es "Other line options." [encoding convertfrom utf-8 "Otras opciones de l\303\255nea. P. ej: para hacerla invisible, escribe: -subtype invisible (consultar thbook.pdf)"] ::msgcat::mcset it "Other line options." [encoding convertfrom utf-8 "Altre opzioni della linea."] ::msgcat::mcset ru "Other line options." [encoding convertfrom utf-8 "\320\237\321\200\320\276\321\207\320\270\320\265 \320\276\320\277\321\206\320\270\320\270 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "Other line options." [encoding convertfrom utf-8 "\304\216al\305\241ie mo\305\276nosti pre krivku."] ::msgcat::mcset sq "Other line options." [encoding convertfrom utf-8 "opcionet tjera te rrjeshtit."] ::msgcat::mcset bg "reverse" [encoding convertfrom utf-8 "\320\276\320\261\321\200\320\260\321\202\320\275\320\260"] ::msgcat::mcset cz "reverse" [encoding convertfrom utf-8 "obr\303\241tit"] ::msgcat::mcset de "reverse" [encoding convertfrom utf-8 "Umkehren"] ::msgcat::mcset el "reverse" [encoding convertfrom utf-8 "\316\261\316\275\316\261\317\203\317\204\317\201\316\277\317\206\316\256"] ::msgcat::mcset en "reverse" [encoding convertfrom utf-8 "reverse"] ::msgcat::mcset es "reverse" [encoding convertfrom utf-8 "invertir"] ::msgcat::mcset it "reverse" [encoding convertfrom utf-8 "inverti"] ::msgcat::mcset ru "reverse" [encoding convertfrom utf-8 "\320\276\320\261\321\200\320\260\321\202\320\275\320\260\321\217"] ::msgcat::mcset sk "reverse" [encoding convertfrom utf-8 "oto\304\215i\305\245"] ::msgcat::mcset sq "reverse" [encoding convertfrom utf-8 "ktheje pas"] ::msgcat::mcset bg "Reverse line." [encoding convertfrom utf-8 "\320\236\320\261\321\212\321\200\320\275\320\270 \320\273\320\270\320\275\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "Reverse line." [encoding convertfrom utf-8 "Obr\303\241tit k\305\231ivku."] ::msgcat::mcset de "Reverse line." [encoding convertfrom utf-8 "Linie umkehren."] ::msgcat::mcset el "Reverse line." [encoding convertfrom utf-8 "\316\221\316\275\316\261\317\203\317\204\317\201\316\277\317\206\316\256 \316\263\317\201\316\261\316\274\316\274\316\256\317\202. \316\243\316\265 \317\200\316\265\317\201\316\257\317\200\317\204\317\211\317\203\316\267 \317\200\316\277\317\205 \317\204\316\261 \317\203\316\267\316\274\316\261\316\264\316\254\316\272\316\271\316\261 \316\265\316\257\316\275\316\261\316\271 \316\261\316\275\316\254\317\200\316\277\316\264\316\261, \316\272\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\265\316\264\317\216."] ::msgcat::mcset en "Reverse line." [encoding convertfrom utf-8 "Reverse line. If symbol's ticks are on bad side, click here."] ::msgcat::mcset es "Reverse line." [encoding convertfrom utf-8 "Invertir l\303\255nea. Si p.ej el s\303\255mbolo de resalte aparece al rev\303\251s, haz clic aqu\303\255."] ::msgcat::mcset it "Reverse line." [encoding convertfrom utf-8 "Inverti la linea."] ::msgcat::mcset ru "Reverse line." [encoding convertfrom utf-8 "\320\227\320\260\320\264\320\260\321\202\321\214 \320\276\320\261\321\200\320\260\321\202\320\275\320\276\320\265 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\264\320\273\321\217 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Reverse line." [encoding convertfrom utf-8 "Oto\304\215i\305\245 krivku."] ::msgcat::mcset sq "Reverse line." [encoding convertfrom utf-8 "rrjeshti I pasem-I kthyer"] ::msgcat::mcset bg "close" [encoding convertfrom utf-8 "\320\267\320\260\321\202\320\262\320\276\321\200\320\270"] ::msgcat::mcset cz "close" [encoding convertfrom utf-8 "zav\305\231\303\255t"] ::msgcat::mcset de "close" [encoding convertfrom utf-8 "schlie\303\237en"] ::msgcat::mcset el "close" [encoding convertfrom utf-8 "\316\272\316\273\316\265\316\257\317\203\316\271\316\274\316\277"] ::msgcat::mcset en "close" [encoding convertfrom utf-8 "close"] ::msgcat::mcset es "close" [encoding convertfrom utf-8 "cerrar"] ::msgcat::mcset it "close" [encoding convertfrom utf-8 "chiudi"] ::msgcat::mcset ru "close" [encoding convertfrom utf-8 "\320\267\320\260\320\274\320\272\320\275\321\203\321\202\321\214"] ::msgcat::mcset sk "close" [encoding convertfrom utf-8 "zavrie\305\245"] ::msgcat::mcset sq "close" [encoding convertfrom utf-8 "mbylle"] ::msgcat::mcset bg "Close line." [encoding convertfrom utf-8 "\320\227\320\260\321\202\320\262\320\276\321\200\320\270 \320\273\320\270\320\275\320\270\321\217\321\202\320\260 \321\201 \320\275\320\260\321\207\320\260\320\273\320\276\321\202\320\276 \320\270."] ::msgcat::mcset cz "Close line." [encoding convertfrom utf-8 "Uzav\305\231\303\255t k\305\231ivku."] ::msgcat::mcset de "Close line." [encoding convertfrom utf-8 "Linie schlie\303\237en."] ::msgcat::mcset el "Close line." [encoding convertfrom utf-8 "\316\232\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Close line." [encoding convertfrom utf-8 "Close line."] ::msgcat::mcset es "Close line." [encoding convertfrom utf-8 "Cerrar l\303\255nea (o sea, unir \303\272ltimo punto con el primero para definir un espacio cerrado)."] ::msgcat::mcset it "Close line." [encoding convertfrom utf-8 "Chiudi la linea."] ::msgcat::mcset ru "Close line." [encoding convertfrom utf-8 "\320\227\320\260\320\274\320\272\320\275\321\203\321\202\321\214 \320\273\320\270\320\275\320\270\321\216 \320\275\320\260 \320\265\321\221 \320\266\320\265 \320\275\320\260\321\207\320\260\320\273\320\276."] ::msgcat::mcset sk "Close line." [encoding convertfrom utf-8 "Uzavrie\305\245 krivku."] ::msgcat::mcset sq "Close line." [encoding convertfrom utf-8 "mbylle rrjeshtin."] ::msgcat::mcset bg "Edit line" [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\260\320\271 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "Edit line" [encoding convertfrom utf-8 "Editovat"] ::msgcat::mcset de "Edit line" [encoding convertfrom utf-8 "Linie bearbeiten"] ::msgcat::mcset el "Edit line" [encoding convertfrom utf-8 "\316\225\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\316\257\316\261 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Edit line" [encoding convertfrom utf-8 "Edit line"] ::msgcat::mcset es "Edit line" [encoding convertfrom utf-8 "Editar"] ::msgcat::mcset it "Edit line" [encoding convertfrom utf-8 "Edita"] ::msgcat::mcset ru "Edit line" [encoding convertfrom utf-8 "\320\237\321\200\320\260\320\262\320\270\321\202\321\214 \320\273\320\270\320\275\320\270\321\216"] ::msgcat::mcset sk "Edit line" [encoding convertfrom utf-8 "Upravi\305\245"] ::msgcat::mcset sq "Edit line" [encoding convertfrom utf-8 "permireso rrjeshtin"] ::msgcat::mcset bg "Insert/delete line point. Split line." [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\262\320\260\320\275\320\265/\321\202\321\200\320\270\320\265\320\275\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260. \320\240\320\260\320\267\320\264\320\265\320\273\321\217\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217."] ::msgcat::mcset cz "Insert/delete line point. Split line." [encoding convertfrom utf-8 "Vlo\305\276en\303\255/smaz\303\241n\303\255 bodu k\305\231ivky. Rozd\304\233len\303\255 k\305\231ivky."] ::msgcat::mcset de "Insert/delete line point. Split line." [encoding convertfrom utf-8 "Punkt auf Linie eingeben/l\303\266schen. Linie teilen."] ::msgcat::mcset el "Insert/delete line point. Split line." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\272\316\261\316\271 \316\264\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \317\203\316\267\316\274\316\265\316\257\317\211\316\275 \316\263\317\201\316\261\316\274\316\274\316\256\317\202. \316\224\316\271\316\261\316\257\317\201\316\265\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202."] ::msgcat::mcset en "Insert/delete line point. Split line." [encoding convertfrom utf-8 "Insert/delete line point. Split line."] ::msgcat::mcset es "Insert/delete line point. Split line." [encoding convertfrom utf-8 "Permite a\303\261adir o borrar puntos de la l\303\255nea, o cortar la l\303\255nea en dos."] ::msgcat::mcset it "Insert/delete line point. Split line." [encoding convertfrom utf-8 "Inserisci/rimuovi un punto della linea. Dividi la linea."] ::msgcat::mcset ru "Insert/delete line point. Split line." [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\272\320\260/\321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \321\202\320\276\321\207\320\272\320\270, \321\200\320\260\320\267\320\264\320\265\320\273\320\265\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Insert/delete line point. Split line." [encoding convertfrom utf-8 "Vlo\305\276enie/odstr\303\241nenie bodu krivky. Rozdelenie krivky."] ::msgcat::mcset sq "Insert/delete line point. Split line." [encoding convertfrom utf-8 "fute/fshije piken e rrjeshtit. Ndaje rrjeshtin."] ::msgcat::mcset bg "Click this button to apply line changes." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\267\320\260 \320\264\320\260 \320\277\321\200\320\270\320\273\320\276\320\266\320\270\321\202\320\265 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\321\217\321\202\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Click this button to apply line changes." [encoding convertfrom utf-8 "Aktualizuje k\305\231ivku."] ::msgcat::mcset de "Click this button to apply line changes." [encoding convertfrom utf-8 "Klicke diesen Knopf, um Linien\303\244nderungen anzuwenden."] ::msgcat::mcset el "Click this button to apply line changes." [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\263\316\271\316\261 \316\275\316\261 \316\263\316\257\316\275\316\265\316\271 \316\265\317\206\316\261\317\201\316\274\316\277\316\263\316\256 \317\204\317\211\316\275 \316\261\316\273\316\273\316\261\316\263\317\216\316\275 \317\203\317\204\316\267\316\275 \316\263\317\201\316\261\316\274\316\274\316\256."] ::msgcat::mcset en "Click this button to apply line changes." [encoding convertfrom utf-8 "Click this button to apply line changes."] ::msgcat::mcset es "Click this button to apply line changes." [encoding convertfrom utf-8 "Clicar aqu\303\255 tras modificar las propiedades de la l\303\255nea."] ::msgcat::mcset it "Click this button to apply line changes." [encoding convertfrom utf-8 "Primi questo bottone per fare modifiche alla linea."] ::msgcat::mcset ru "Click this button to apply line changes." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\264\320\273\321\217 \320\277\321\200\320\270\320\274\320\265\320\275\320\265\320\275\320\270\321\217 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\271 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Click this button to apply line changes." [encoding convertfrom utf-8 "Aktualizuje krivku."] ::msgcat::mcset sq "Click this button to apply line changes." [encoding convertfrom utf-8 "kliko kete buton te aktualizosh nderrimet e rrjeshtit."] ::msgcat::mcset bg "Select line point." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \320\265\320\264\320\275\320\260 \320\276\321\202 \321\202\320\276\321\207\320\272\320\270\321\202\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Select line point." [encoding convertfrom utf-8 "V\303\275b\304\233r bodu k\305\231ivky."] ::msgcat::mcset de "Select line point." [encoding convertfrom utf-8 "Punkt auf Linie ausw\303\244hlen."] ::msgcat::mcset el "Select line point." [encoding convertfrom utf-8 "\316\221\317\205\317\204\316\254 \316\265\316\257\316\275\316\261\316\271 \317\204\316\261 \316\265\317\200\316\271\316\273\316\265\316\263\316\274\316\255\316\275\316\261 \317\203\316\267\316\274\316\265\316\257\316\261 \316\263\317\201\316\261\316\274\316\274\317\216\316\275. \316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \317\203\316\265 \317\214\317\200\316\277\316\271\316\277 \317\203\316\261\317\202 \316\265\316\275\316\264\316\271\316\261\317\206\316\255\317\201\316\265\316\271 \316\263\316\271\316\261 \316\275\316\261 \316\265\316\274\317\206\316\261\316\275\316\271\317\203\317\204\316\265\316\257 \317\211\317\202 \316\265\317\200\316\271\316\273\316\265\316\263\316\274\316\255\316\275\316\277 \317\203\317\204\316\277\316\275 \316\272\316\261\316\274\316\262\316\254."] ::msgcat::mcset en "Select line point." [encoding convertfrom utf-8 "These are selected line points. Click on any to get it selected on canvas."] ::msgcat::mcset es "Select line point." [encoding convertfrom utf-8 "Lista de puntos que forman esta l\303\255nea. Clic para resaltar el punto en la topo."] ::msgcat::mcset it "Select line point." [encoding convertfrom utf-8 "Seleziona un punto della linea."] ::msgcat::mcset ru "Select line point." [encoding convertfrom utf-8 "\320\222\321\213\320\261\321\200\320\260\321\202\321\214 \320\276\320\264\320\275\321\203 \320\270\320\267 \321\202\320\276\321\207\320\265\320\272 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Select line point." [encoding convertfrom utf-8 "V\303\275ber bodu krivky."] ::msgcat::mcset sq "Select line point." [encoding convertfrom utf-8 "selekto piken e rrjeshtit."] ::msgcat::mcset bg "loading line point module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\273\320\270\320\275\320\265\320\271\320\275\320\270 \321\202\320\276\321\207\320\272\320\270 ..."] ::msgcat::mcset cz "loading line point module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m modul pro body k\305\231ivky ..."] ::msgcat::mcset de "loading line point module ..." [encoding convertfrom utf-8 "Lade Linienpunktmodul ..."] ::msgcat::mcset el "loading line point module ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261\317\202 \317\203\316\267\316\274\316\265\316\257\317\211\316\275 \316\263\317\201\316\261\316\274\316\274\317\216\316\275..."] ::msgcat::mcset en "loading line point module ..." [encoding convertfrom utf-8 "loading line point module ..."] ::msgcat::mcset es "loading line point module ..." [encoding convertfrom utf-8 "puntos de l\303\255nea ..."] ::msgcat::mcset it "loading line point module ..." [encoding convertfrom utf-8 "caricando il modulo dei punti di linea ..."] ::msgcat::mcset ru "loading line point module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \321\202\320\276\321\207\320\265\320\272 \320\273\320\270\320\275\320\270\320\270 ..."] ::msgcat::mcset sk "loading line point module ..." [encoding convertfrom utf-8 "nahr\303\241vam modul pre body krivky ..."] ::msgcat::mcset sq "loading line point module ..." [encoding convertfrom utf-8 "duke lexuar modulin e pikes se rrjeshtit."] ::msgcat::mcset bg "position" [encoding convertfrom utf-8 "\320\277\320\276\320\267\320\270\321\206\320\270\321\217"] ::msgcat::mcset cz "position" [encoding convertfrom utf-8 "pozice"] ::msgcat::mcset de "position" [encoding convertfrom utf-8 "Position"] ::msgcat::mcset el "position" [encoding convertfrom utf-8 "\316\270\316\255\317\203\316\267"] ::msgcat::mcset en "position" [encoding convertfrom utf-8 "position"] ::msgcat::mcset es "position" [encoding convertfrom utf-8 "posici\303\263n"] ::msgcat::mcset it "position" [encoding convertfrom utf-8 "posizione"] ::msgcat::mcset ru "position" [encoding convertfrom utf-8 "\320\277\320\276\320\267\320\270\321\206\320\270\321\217"] ::msgcat::mcset sk "position" [encoding convertfrom utf-8 "poloha"] ::msgcat::mcset sq "position" [encoding convertfrom utf-8 "pozicioni"] ::msgcat::mcset bg "Point position." [encoding convertfrom utf-8 "\320\237\320\276\320\267\320\270\321\206\320\270\321\217 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Point position." [encoding convertfrom utf-8 "Pozice bodu."] ::msgcat::mcset de "Point position." [encoding convertfrom utf-8 "Punktposition."] ::msgcat::mcset el "Point position." [encoding convertfrom utf-8 "\316\230\316\255\317\203\316\267 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Point position." [encoding convertfrom utf-8 "Point position."] ::msgcat::mcset es "Point position." [encoding convertfrom utf-8 "Posici\303\263n del punto."] ::msgcat::mcset it "Point position." [encoding convertfrom utf-8 "Posizione del punto."] ::msgcat::mcset ru "Point position." [encoding convertfrom utf-8 "\320\237\320\276\320\267\320\270\321\206\320\270\321\217 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Point position." [encoding convertfrom utf-8 "Poloha bodu."] ::msgcat::mcset sq "Point position." [encoding convertfrom utf-8 "pozicioni I pikes."] ::msgcat::mcset bg "Point X coordinate." [encoding convertfrom utf-8 "X \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Point X coordinate." [encoding convertfrom utf-8 "sou\305\231adnice X bodu."] ::msgcat::mcset de "Point X coordinate." [encoding convertfrom utf-8 "Punkt X-Koordinate."] ::msgcat::mcset el "Point X coordinate." [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\247 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Point X coordinate." [encoding convertfrom utf-8 "Point X coordinate."] ::msgcat::mcset es "Point X coordinate." [encoding convertfrom utf-8 "Coordenada X del punto."] ::msgcat::mcset it "Point X coordinate." [encoding convertfrom utf-8 "Coordinata X del punto."] ::msgcat::mcset ru "Point X coordinate." [encoding convertfrom utf-8 "X \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Point X coordinate." [encoding convertfrom utf-8 "X s\303\272radnica bodu."] ::msgcat::mcset sq "Point X coordinate." [encoding convertfrom utf-8 "pika X e koordinates."] ::msgcat::mcset bg "Point Y coordinate." [encoding convertfrom utf-8 "Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260\321\202\320\260."] ::msgcat::mcset cz "Point Y coordinate." [encoding convertfrom utf-8 "sou\305\231adnice Y bodu."] ::msgcat::mcset de "Point Y coordinate." [encoding convertfrom utf-8 "Punkt Y-Koordinate."] ::msgcat::mcset el "Point Y coordinate." [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\245 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Point Y coordinate." [encoding convertfrom utf-8 "Point Y coordinate."] ::msgcat::mcset es "Point Y coordinate." [encoding convertfrom utf-8 "coordenada Y del punto."] ::msgcat::mcset it "Point Y coordinate." [encoding convertfrom utf-8 "Coordinata Y del punto."] ::msgcat::mcset ru "Point Y coordinate." [encoding convertfrom utf-8 "Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Point Y coordinate." [encoding convertfrom utf-8 "Y s\303\272radnica bodu."] ::msgcat::mcset sq "Point Y coordinate." [encoding convertfrom utf-8 "pika Y e koordinates."] ::msgcat::mcset bg "Previous control point X coordinate." [encoding convertfrom utf-8 "X \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \320\277\321\200\320\265\320\264\320\270\321\210\320\275\320\260\321\202\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Previous control point X coordinate." [encoding convertfrom utf-8 "Sou\305\231adnice X p\305\231edchoz\303\255ho \305\231\303\255d\303\255c\303\255ho bodu."] ::msgcat::mcset de "Previous control point X coordinate." [encoding convertfrom utf-8 "Vorherige X-Koordinate eines Kontrollpunkts."] ::msgcat::mcset el "Previous control point X coordinate." [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\247 \317\200\317\201\316\277\316\267\316\263\316\277\317\215\316\274\316\265\316\275\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Previous control point X coordinate." [encoding convertfrom utf-8 "Previous control point X coordinate."] ::msgcat::mcset es "Previous control point X coordinate." [encoding convertfrom utf-8 "Coordenada X del punto de control anterior."] ::msgcat::mcset it "Previous control point X coordinate." [encoding convertfrom utf-8 "Coordinata X del punto di controllo precedente."] ::msgcat::mcset ru "Previous control point X coordinate." [encoding convertfrom utf-8 "X \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\277\321\200\320\265\320\264\321\213\320\264\321\203\321\211\320\265\320\271 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Previous control point X coordinate." [encoding convertfrom utf-8 "X s\303\272radnica predch\303\241dzaj\303\272ceho kontroln\303\251ho bodu."] ::msgcat::mcset sq "Previous control point X coordinate." [encoding convertfrom utf-8 "pika e kontrollit te meparshem te koordinates X"] ::msgcat::mcset bg "Previous control point Y coordinate." [encoding convertfrom utf-8 "Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \320\277\321\200\320\265\320\264\320\270\321\210\320\275\320\260\321\202\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Previous control point Y coordinate." [encoding convertfrom utf-8 "Sou\305\231adnice Y p\305\231edchoz\303\255ho \305\231\303\255d\303\255c\303\255ho bodu."] ::msgcat::mcset de "Previous control point Y coordinate." [encoding convertfrom utf-8 "Vorherige Y-Koordinate eines Kontrollpunkts."] ::msgcat::mcset el "Previous control point Y coordinate." [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\245 \317\200\317\201\316\277\316\267\316\263\316\277\317\215\316\274\316\265\316\275\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Previous control point Y coordinate." [encoding convertfrom utf-8 "Previous control point Y coordinate."] ::msgcat::mcset es "Previous control point Y coordinate." [encoding convertfrom utf-8 "Coordenada Y del punto de control anterior."] ::msgcat::mcset it "Previous control point Y coordinate." [encoding convertfrom utf-8 "Coordinata Y del punto di controllo precedente."] ::msgcat::mcset ru "Previous control point Y coordinate." [encoding convertfrom utf-8 "Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\277\321\200\320\265\320\264\321\213\320\264\321\203\321\211\320\265\320\271 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Previous control point Y coordinate." [encoding convertfrom utf-8 "Y s\303\272radnica predch\303\241dzaj\303\272ceho kontroln\303\251ho bodu."] ::msgcat::mcset sq "Previous control point Y coordinate." [encoding convertfrom utf-8 "pika e kontrollit te meparshem te koordinates-Y"] ::msgcat::mcset bg "Next control point X coordinate." [encoding convertfrom utf-8 "X \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\260\321\202\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Next control point X coordinate." [encoding convertfrom utf-8 "Sou\305\231adnice X n\303\241sleduj\303\255c\303\255ho \305\231\303\255d\303\255c\303\255ho bodu."] ::msgcat::mcset de "Next control point X coordinate." [encoding convertfrom utf-8 "N\303\244chste X-Koordinate eines Kontrollpunkts."] ::msgcat::mcset el "Next control point X coordinate." [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\247 \316\265\317\200\317\214\316\274\316\265\316\275\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Next control point X coordinate." [encoding convertfrom utf-8 "Next control point X coordinate."] ::msgcat::mcset es "Next control point X coordinate." [encoding convertfrom utf-8 "Coordenada X del siguiente punto de control."] ::msgcat::mcset it "Next control point X coordinate." [encoding convertfrom utf-8 "Coordinata X del prossimo punto."] ::msgcat::mcset ru "Next control point X coordinate." [encoding convertfrom utf-8 "X \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\265\320\271 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Next control point X coordinate." [encoding convertfrom utf-8 "X s\303\272radnica nasleduj\303\272ceho kontroln\303\251ho bodu."] ::msgcat::mcset sq "Next control point X coordinate." [encoding convertfrom utf-8 "pika e ardhshme kontrollit te coordinates X"] ::msgcat::mcset bg "Next control point Y coordinate." [encoding convertfrom utf-8 "Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \320\275\320\260 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\260\321\202\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Next control point Y coordinate." [encoding convertfrom utf-8 "Sou\305\231adnice Y n\303\241sleduj\303\255c\303\255ho \305\231\303\255d\303\255c\303\255ho bodu."] ::msgcat::mcset de "Next control point Y coordinate." [encoding convertfrom utf-8 "N\303\244chste Y-Koordinate eines Kontrollpunkts."] ::msgcat::mcset el "Next control point Y coordinate." [encoding convertfrom utf-8 "\316\243\317\205\316\275\317\204\316\265\317\204\316\261\316\263\316\274\316\255\316\275\316\267 \316\245 \316\265\317\200\317\214\316\274\316\265\316\275\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Next control point Y coordinate." [encoding convertfrom utf-8 "Next control point Y coordinate."] ::msgcat::mcset es "Next control point Y coordinate." [encoding convertfrom utf-8 "Coordenada Y del siguiente punto de control."] ::msgcat::mcset it "Next control point Y coordinate." [encoding convertfrom utf-8 "Coordinata Y del prossimo punto."] ::msgcat::mcset ru "Next control point Y coordinate." [encoding convertfrom utf-8 "Y \320\272\320\276\320\276\321\200\320\264\320\270\320\275\320\260\321\202\320\260 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\265\320\271 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Next control point Y coordinate." [encoding convertfrom utf-8 "Y s\303\272radnica nasleduj\303\272ceho kontroln\303\251ho bodu."] ::msgcat::mcset sq "Next control point Y coordinate." [encoding convertfrom utf-8 "pika e ardhshme kontrollit te coordinates Y"] ::msgcat::mcset bg "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "\320\237\320\276\321\201\321\202\320\260\320\262\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260 \320\267\320\260 \320\270\320\267\320\277\320\276\320\273\320\267\320\262\320\260\320\275\320\265 \320\275\320\260 \320\277\321\200\320\265\320\264\320\270\321\210\320\275\320\260\321\202\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "Za\305\241krtn\304\233te pokud chcete pro tvar k\305\231ivky pou\305\276\303\255t p\305\231edchoz\303\255 \305\231\303\255d\303\255c\303\255 bod."] ::msgcat::mcset de "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "Auswahl, ob vorheriger Kontrollpunkt benutzt wird."] ::msgcat::mcset el "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \316\263\316\271\316\261 \317\207\317\201\316\256\317\203\316\267 \317\200\317\201\316\277\316\267\316\263\316\277\317\215\316\274\316\265\316\275\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "Checkbox whether to use previous control point."] ::msgcat::mcset es "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "Usar punto de control anterior."] ::msgcat::mcset it "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "Checkbox per usare il punto di controllo precedente."] ::msgcat::mcset ru "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "\320\237\320\276\321\201\321\202\320\260\320\262\321\214\321\202\320\265 \320\263\320\260\320\273\320\276\321\207\320\272\321\203 \320\264\320\273\321\217 \320\270\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217 \320\277\321\200\320\265\320\264\321\213\320\264\321\203\321\211\320\265\320\271 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "Pou\305\276i predch\303\241dzaj\303\272ci kontroln\303\275 bod."] ::msgcat::mcset sq "Checkbox whether to use previous control point." [encoding convertfrom utf-8 "kutia-kontrollit a duhet te perdoret pika e kontrollit e meparshme"] ::msgcat::mcset bg "smooth" [encoding convertfrom utf-8 "\320\270\320\267\320\263\320\273\320\260\320\266\320\264\320\260\320\275\320\265"] ::msgcat::mcset cz "smooth" [encoding convertfrom utf-8 "uhladit"] ::msgcat::mcset de "smooth" [encoding convertfrom utf-8 "gegl\303\244ttet"] ::msgcat::mcset el "smooth" [encoding convertfrom utf-8 "\316\261\317\200\316\261\316\273\316\256"] ::msgcat::mcset en "smooth" [encoding convertfrom utf-8 "smooth"] ::msgcat::mcset es "smooth" [encoding convertfrom utf-8 "suavizar"] ::msgcat::mcset it "smooth" [encoding convertfrom utf-8 "regolarizza"] ::msgcat::mcset ru "smooth" [encoding convertfrom utf-8 "\321\201\320\263\320\273\320\260\320\264\320\270\321\202\321\214"] ::msgcat::mcset sk "smooth" [encoding convertfrom utf-8 "vyhladi\305\245"] ::msgcat::mcset sq "smooth" [encoding convertfrom utf-8 "e bute"] ::msgcat::mcset bg "Set line to be smooth in given point." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\265\321\202\320\265 \320\267\320\260 \320\270\320\267\320\263\320\273\320\260\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260 \320\262 \320\264\320\260\320\264\320\265\320\275\320\260\321\202\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Set line to be smooth in given point." [encoding convertfrom utf-8 "Nastav\303\255 hladkou k\305\231ivku v dan\303\251m bod\304\233."] ::msgcat::mcset de "Set line to be smooth in given point." [encoding convertfrom utf-8 "Setze Linie auf gegl\303\244ttet am gegebenen Punkt."] ::msgcat::mcset el "Set line to be smooth in given point." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \316\261\317\200\316\261\316\273\316\256\317\202 \316\272\316\261\316\274\317\200\317\215\316\273\316\267\317\202 \317\203\317\204\316\277 \316\265\317\200\317\214\316\274\316\265\316\275\316\277 \317\203\316\267\316\274\316\265\316\257\316\277 \317\204\316\267\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Set line to be smooth in given point." [encoding convertfrom utf-8 "Set line to be smooth in given point."] ::msgcat::mcset es "Set line to be smooth in given point." [encoding convertfrom utf-8 "Suavizar la l\303\255nea en el punto seleccionado."] ::msgcat::mcset it "Set line to be smooth in given point." [encoding convertfrom utf-8 "Imposta la linea ad essere regolare nelpunto specificato."] ::msgcat::mcset ru "Set line to be smooth in given point." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\264\320\273\321\217 \321\201\320\263\320\273\320\260\320\266\320\270\320\262\320\260\320\275\320\270\321\217 \320\273\320\270\320\275\320\270\320\270 \320\262 \320\264\320\260\320\275\320\275\320\276\320\271 \321\202\320\276\321\207\320\272\320\265."] ::msgcat::mcset sk "Set line to be smooth in given point." [encoding convertfrom utf-8 "Nastav\303\255 kontroln\303\251 body tak, aby krivka bola v danom bode hladk\303\241."] ::msgcat::mcset sq "Set line to be smooth in given point." [encoding convertfrom utf-8 "vene rrjeshtin per te qene I bute ne piken e dhanun"] ::msgcat::mcset bg "Checkbox whether to use next control point." [encoding convertfrom utf-8 "\320\237\320\276\321\201\321\202\320\260\320\262\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260 \320\267\320\260 \320\270\320\267\320\277\320\276\320\273\320\267\320\262\320\260\320\275\320\265 \320\275\320\260 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\260\321\202\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260."] ::msgcat::mcset cz "Checkbox whether to use next control point." [encoding convertfrom utf-8 "Za\305\241krtn\304\233te pokud chcete pro tvar k\305\231ivky pou\305\276\303\255t n\303\241sleduj\303\255c\303\255 \305\231\303\255d\303\255c\303\255 bod."] ::msgcat::mcset de "Checkbox whether to use next control point." [encoding convertfrom utf-8 "Auswahl, ob n\303\244chster Kontrollpunkt benutzt wird."] ::msgcat::mcset el "Checkbox whether to use next control point." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \316\263\316\271\316\261 \317\207\317\201\316\256\317\203\316\267 \316\265\317\200\317\214\316\274\316\265\316\275\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "Checkbox whether to use next control point." [encoding convertfrom utf-8 "Checkbox whether to use next control point."] ::msgcat::mcset es "Checkbox whether to use next control point." [encoding convertfrom utf-8 "Usar siguiente punto de control."] ::msgcat::mcset it "Checkbox whether to use next control point." [encoding convertfrom utf-8 "Checkbox per usare il prossimo punto di controllo."] ::msgcat::mcset ru "Checkbox whether to use next control point." [encoding convertfrom utf-8 "\320\237\320\276\321\201\321\202\320\260\320\262\321\214\321\202\320\265 \320\263\320\260\320\273\320\276\321\207\320\272\321\203 \320\264\320\273\321\217 \320\270\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\265\320\271 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270."] ::msgcat::mcset sk "Checkbox whether to use next control point." [encoding convertfrom utf-8 "Pou\305\276i nasleduj\303\272ci kontroln\303\275 bod."] ::msgcat::mcset sq "Checkbox whether to use next control point." [encoding convertfrom utf-8 "kutia-kontrollit a duhet te perdoret pika e kontrollit e ardhshme"] ::msgcat::mcset bg "orientation" [encoding convertfrom utf-8 "\320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\217"] ::msgcat::mcset cz "orientation" [encoding convertfrom utf-8 "orientace"] ::msgcat::mcset de "orientation" [encoding convertfrom utf-8 "Ausrichtung"] ::msgcat::mcset el "orientation" [encoding convertfrom utf-8 "\317\200\317\201\316\277\317\203\316\261\316\275\316\261\317\204\316\277\316\273\316\271\317\203\316\274\317\214\317\202"] ::msgcat::mcset en "orientation" [encoding convertfrom utf-8 "orientation"] ::msgcat::mcset es "orientation" [encoding convertfrom utf-8 "orientaci\303\263n"] ::msgcat::mcset it "orientation" [encoding convertfrom utf-8 "orientazione"] ::msgcat::mcset ru "orientation" [encoding convertfrom utf-8 "\320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\217"] ::msgcat::mcset sk "orientation" [encoding convertfrom utf-8 "orient\303\241cia"] ::msgcat::mcset sq "orientation" [encoding convertfrom utf-8 "orientimi"] ::msgcat::mcset bg "Set line point orientation." [encoding convertfrom utf-8 "\320\243\320\272\320\260\320\266\320\265\321\202\320\265 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\217\321\202\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Set line point orientation." [encoding convertfrom utf-8 "Nastav\303\255 orientaci bodu."] ::msgcat::mcset de "Set line point orientation." [encoding convertfrom utf-8 "Setze Ausrichtung des Linienpunkts."] ::msgcat::mcset el "Set line point orientation." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \317\200\317\201\316\277\317\203\316\261\316\275\316\261\317\204\316\277\316\273\316\271\317\203\316\274\316\277\317\215 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Set line point orientation." [encoding convertfrom utf-8 "Set line point orientation."] ::msgcat::mcset es "Set line point orientation." [encoding convertfrom utf-8 "Ajustar direcci\303\263n en que apunta un punto de la l\303\255nea (p.ej una pendiente)."] ::msgcat::mcset it "Set line point orientation." [encoding convertfrom utf-8 "Imposta l'orientazione del punto della linea."] ::msgcat::mcset ru "Set line point orientation." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\216 \321\202\320\276\321\207\320\272\320\270 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Set line point orientation." [encoding convertfrom utf-8 "Nastav\303\255 orient\303\241ciu symbolov v bode krivky."] ::msgcat::mcset sq "Set line point orientation." [encoding convertfrom utf-8 "vene orientimin e pikes se rrjeshtit"] ::msgcat::mcset bg "Enter line point orientation." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\217\321\202\320\260 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Enter line point orientation." [encoding convertfrom utf-8 "Zadejte orientaci bodu."] ::msgcat::mcset de "Enter line point orientation." [encoding convertfrom utf-8 "Ausrichtung des Linienpunkts eingeben."] ::msgcat::mcset el "Enter line point orientation." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\200\317\201\316\277\317\203\316\261\316\275\316\261\317\204\316\277\316\273\316\271\317\203\316\274\316\277\317\215 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Enter line point orientation." [encoding convertfrom utf-8 "Enter line point orientation."] ::msgcat::mcset es "Enter line point orientation." [encoding convertfrom utf-8 "Introducir direcci\303\263n se\303\261alada por el punto."] ::msgcat::mcset it "Enter line point orientation." [encoding convertfrom utf-8 "Scrivi l'orientazione del punto della linea."] ::msgcat::mcset ru "Enter line point orientation." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\276\321\200\320\270\320\265\320\275\321\202\320\260\321\206\320\270\321\216 \321\202\320\276\321\207\320\272\320\270 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Enter line point orientation." [encoding convertfrom utf-8 "Zadaj orient\303\241ciu symbolov v bode krivky."] ::msgcat::mcset sq "Enter line point orientation." [encoding convertfrom utf-8 "fute orientimin e pikes se rrjeshtit"] ::msgcat::mcset bg "r-size" [encoding convertfrom utf-8 "r-\321\200\320\260\320\267\320\274\320\265\321\200"] ::msgcat::mcset cz "r-size" [encoding convertfrom utf-8 "p-rozsah"] ::msgcat::mcset de "r-size" [encoding convertfrom utf-8 "r-Gr\303\266\303\237e"] ::msgcat::mcset el "r-size" [encoding convertfrom utf-8 "\316\264\316\271\316\254\317\203\317\204\316\261\317\203\316\267 (\316\264)"] ::msgcat::mcset en "r-size" [encoding convertfrom utf-8 "r-size"] ::msgcat::mcset es "r-size" [encoding convertfrom utf-8 "anchura-dcha"] ::msgcat::mcset it "r-size" [encoding convertfrom utf-8 "dim. destra"] ::msgcat::mcset ru "r-size" [encoding convertfrom utf-8 "r-size"] ::msgcat::mcset sk "r-size" [encoding convertfrom utf-8 "rozmer-p"] ::msgcat::mcset sq "r-size" [encoding convertfrom utf-8 "r-madhesia"] ::msgcat::mcset bg "Set line size in right direction." [encoding convertfrom utf-8 "\320\243\320\272\320\260\320\266\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260 \320\262 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\275\320\260\320\264\321\217\321\201\320\275\320\276."] ::msgcat::mcset cz "Set line size in right direction." [encoding convertfrom utf-8 "Nastav\303\255 rozsah k\305\231ivky v prav\303\251m sm\304\233ru."] ::msgcat::mcset de "Set line size in right direction." [encoding convertfrom utf-8 "Setze Liniengr\303\266\303\237e nach rechts."] ::msgcat::mcset el "Set line size in right direction." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \316\264\316\271\316\254\317\203\317\204\316\261\317\203\316\267\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \317\200\317\201\316\277\317\202 \317\204\316\261 \316\264\316\265\316\276\316\271\316\254"] ::msgcat::mcset en "Set line size in right direction." [encoding convertfrom utf-8 "Set line size in right direction."] ::msgcat::mcset es "Set line size in right direction." [encoding convertfrom utf-8 "Ajustar anchura de l\303\255nea (lado derecho de la l\303\255nea)."] ::msgcat::mcset it "Set line size in right direction." [encoding convertfrom utf-8 "Imposta la dimensione della linea a destra."] ::msgcat::mcset ru "Set line size in right direction." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200 \320\273\320\270\320\275\320\270\320\270 \320\262 \320\277\321\200\320\260\320\262\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Set line size in right direction." [encoding convertfrom utf-8 "Nastav\303\255 ve\304\276kos\305\245 symbolov napravo od krivky."] ::msgcat::mcset sq "Set line size in right direction." [encoding convertfrom utf-8 "cakto madhesine e rrjeshtit ne drejtim te djathte"] ::msgcat::mcset bg "Enter line size in right direction." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260 \320\262 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\275\320\260\320\264\321\217\321\201\320\275\320\276."] ::msgcat::mcset cz "Enter line size in right direction." [encoding convertfrom utf-8 "Zadejte rozsah k\305\231ivky v prav\303\251m sm\304\233ru."] ::msgcat::mcset de "Enter line size in right direction." [encoding convertfrom utf-8 "Liniengr\303\266\303\237e nach rechts eingeben."] ::msgcat::mcset el "Enter line size in right direction." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\264\316\271\316\254\317\203\317\204\316\261\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \317\200\317\201\316\277\317\202 \317\204\316\261 \316\264\316\265\316\276\316\271\316\254"] ::msgcat::mcset en "Enter line size in right direction." [encoding convertfrom utf-8 "Enter line size in right direction."] ::msgcat::mcset es "Enter line size in right direction." [encoding convertfrom utf-8 "Introducir anchura de l\303\255nea (lado derecho de la l\303\255nea)."] ::msgcat::mcset it "Enter line size in right direction." [encoding convertfrom utf-8 "Scrivi la dimensione della linea a destra."] ::msgcat::mcset ru "Enter line size in right direction." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200 \320\273\320\270\320\275\320\270\320\270 \320\262 \320\277\321\200\320\260\320\262\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Enter line size in right direction." [encoding convertfrom utf-8 "Zadaj ve\304\276kos\305\245 symbolov napravo od krivky."] ::msgcat::mcset sq "Enter line size in right direction." [encoding convertfrom utf-8 "fute madhesine e rjeshtit ne drejtim te djathte"] ::msgcat::mcset bg "l-size" [encoding convertfrom utf-8 "l-\321\200\320\260\320\267\320\274\320\265\321\200"] ::msgcat::mcset cz "l-size" [encoding convertfrom utf-8 "l-rozsah"] ::msgcat::mcset de "l-size" [encoding convertfrom utf-8 "l-Gr\303\266\303\237e"] ::msgcat::mcset el "l-size" [encoding convertfrom utf-8 "\316\264\316\271\316\254\317\203\317\204\316\261\317\203\316\267 (\316\261)"] ::msgcat::mcset en "l-size" [encoding convertfrom utf-8 "l-size"] ::msgcat::mcset es "l-size" [encoding convertfrom utf-8 "anchura-izda"] ::msgcat::mcset it "l-size" [encoding convertfrom utf-8 "dim. sinistra"] ::msgcat::mcset ru "l-size" [encoding convertfrom utf-8 "l-size"] ::msgcat::mcset sk "l-size" [encoding convertfrom utf-8 "rozmer-\304\276"] ::msgcat::mcset sq "l-size" [encoding convertfrom utf-8 "madhesia-l"] ::msgcat::mcset bg "Set line size in left direction." [encoding convertfrom utf-8 "\320\243\320\272\320\260\320\266\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260 \320\262 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\275\320\260\320\273\321\217\320\262\320\276."] ::msgcat::mcset cz "Set line size in left direction." [encoding convertfrom utf-8 "Nastav\303\255 rozsah k\305\231ivky v lev\303\251m sm\304\233ru."] ::msgcat::mcset de "Set line size in left direction." [encoding convertfrom utf-8 "Setze Liniengr\303\266\303\237e nach links."] ::msgcat::mcset el "Set line size in left direction." [encoding convertfrom utf-8 "\316\237\317\201\316\271\317\203\316\274\317\214\317\202 \316\264\316\271\316\254\317\203\317\204\316\261\317\203\316\267\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \317\200\317\201\316\277\317\202 \317\204\316\261 \316\261\317\201\316\271\317\203\317\204\316\265\317\201\316\254"] ::msgcat::mcset en "Set line size in left direction." [encoding convertfrom utf-8 "Set line size in left direction."] ::msgcat::mcset es "Set line size in left direction." [encoding convertfrom utf-8 "Ajustar anchura de l\303\255nea (lado izquierdo de la l\303\255nea). El tipo slope necesita este valor."] ::msgcat::mcset it "Set line size in left direction." [encoding convertfrom utf-8 "Imposta la dimensione della linea a sinistra."] ::msgcat::mcset ru "Set line size in left direction." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200 \320\273\320\270\320\275\320\270\320\270 \320\262 \320\273\320\265\320\262\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Set line size in left direction." [encoding convertfrom utf-8 "Nastav\303\255 ve\304\276kos\305\245 symbolov na\304\276avo od krivky."] ::msgcat::mcset sq "Set line size in left direction." [encoding convertfrom utf-8 "cakto madhesine e rjeshtit ne drejtim te majte"] ::msgcat::mcset bg "Enter line size in left direction." [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260 \320\262 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \320\275\320\260\320\273\321\217\320\262\320\276."] ::msgcat::mcset cz "Enter line size in left direction." [encoding convertfrom utf-8 "Zadejte rozsah k\305\231ivky v lev\303\251m sm\304\233ru."] ::msgcat::mcset de "Enter line size in left direction." [encoding convertfrom utf-8 "Liniengr\303\266\303\237e nach links eingeben."] ::msgcat::mcset el "Enter line size in left direction." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\264\316\271\316\254\317\203\317\204\316\261\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 \317\200\317\201\316\277\317\202 \317\204\316\261 \316\261\317\201\316\271\317\203\317\204\316\265\317\201\316\254"] ::msgcat::mcset en "Enter line size in left direction." [encoding convertfrom utf-8 "Enter line size in left direction."] ::msgcat::mcset es "Enter line size in left direction." [encoding convertfrom utf-8 "Introducir anchura de l\303\255nea (lado izquierdo de la l\303\255nea). El tipo slope necesita este valor."] ::msgcat::mcset it "Enter line size in left direction." [encoding convertfrom utf-8 "Scrivi la dimensione della linea a sinistra."] ::msgcat::mcset ru "Enter line size in left direction." [encoding convertfrom utf-8 "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \321\200\320\260\320\267\320\274\320\265\321\200 \320\273\320\270\320\275\320\270\320\270 \320\262 \320\273\320\265\320\262\320\276\320\274 \320\275\320\260\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\270."] ::msgcat::mcset sk "Enter line size in left direction." [encoding convertfrom utf-8 "Zadaj ve\304\276kos\305\245 symbolov na\304\276avo od krivky."] ::msgcat::mcset sq "Enter line size in left direction." [encoding convertfrom utf-8 "fute madhesine e rjeshtit ne drejtim te majte"] ::msgcat::mcset bg "Line point options editor." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\275\320\260 \320\276\320\277\321\206\320\270\320\270\321\202\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Line point options editor." [encoding convertfrom utf-8 "Volby bodu k\305\231ivky."] ::msgcat::mcset de "Line point options editor." [encoding convertfrom utf-8 "Linienpunktoptionen bearbeiten."] ::msgcat::mcset el "Line point options editor." [encoding convertfrom utf-8 "\316\225\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256\317\202 \316\265\317\200\316\271\316\273\316\277\316\263\317\216\316\275 \317\203\316\267\316\274\316\265\316\257\317\211\316\275 \316\263\317\201\316\261\316\274\316\274\317\216\316\275"] ::msgcat::mcset en "Line point options editor." [encoding convertfrom utf-8 "Line point options editor."] ::msgcat::mcset es "Line point options editor." [encoding convertfrom utf-8 "Editor de puntos pertenecientes a la l\303\255nea seleccionada. Consultar thbook.pdf"] ::msgcat::mcset it "Line point options editor." [encoding convertfrom utf-8 "Editor delle opzioni del punto della linea."] ::msgcat::mcset ru "Line point options editor." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\276\320\277\321\206\320\270\320\271 \321\202\320\276\321\207\320\272\320\270 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Line point options editor." [encoding convertfrom utf-8 "Editor \304\217al\305\241\303\255ch mo\305\276nost\303\255 bodu krivky."] ::msgcat::mcset sq "Line point options editor." [encoding convertfrom utf-8 "opcioni I editimit te pikes se rjeshtit"] ::msgcat::mcset bg "Click this button to apply line point changes." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\274\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\267\320\260 \320\277\321\200\320\270\320\273\320\260\320\263\320\260\320\275\320\265 \320\275\320\260 \320\277\321\200\320\276\320\274\320\265\320\275\320\270\321\202\320\265 \320\262/\321\203 \321\202\320\276\321\207\320\272\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Click this button to apply line point changes." [encoding convertfrom utf-8 "Aktualizovat bod k\305\231ivky."] ::msgcat::mcset de "Click this button to apply line point changes." [encoding convertfrom utf-8 "Klicke diesen Knopf, um \303\204nderungen am Linienpunkt anzuwenden."] ::msgcat::mcset el "Click this button to apply line point changes." [encoding convertfrom utf-8 "\316\240\316\261\317\204\316\256\317\203\317\204\316\265 \316\265\316\264\317\216 \316\263\316\271\316\261 \316\275\316\261 \316\263\316\257\316\275\316\265\316\271 \316\265\317\206\316\261\317\201\316\274\316\277\316\263\316\256 \317\204\317\211\316\275 \316\261\316\273\316\273\316\261\316\263\317\216\316\275 \317\203\317\204\316\277 \317\203\316\267\316\274\316\265\316\257\316\277 \317\204\316\267\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202."] ::msgcat::mcset en "Click this button to apply line point changes." [encoding convertfrom utf-8 "Click this button to apply line point changes."] ::msgcat::mcset es "Click this button to apply line point changes." [encoding convertfrom utf-8 "Clicar tras modificar las propiedades de los puntos de una l\303\255nea."] ::msgcat::mcset it "Click this button to apply line point changes." [encoding convertfrom utf-8 "Premi questo bottone per fare modifiche ai punti della linea."] ::msgcat::mcset ru "Click this button to apply line point changes." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\264\320\273\321\217 \320\277\321\200\320\270\320\274\320\265\320\275\320\265\320\275\320\270\321\217 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\271 \321\202\320\276\321\207\320\272\320\270 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Click this button to apply line point changes." [encoding convertfrom utf-8 "Aktializ\303\241cia bodu krivky."] ::msgcat::mcset sq "Click this button to apply line point changes." [encoding convertfrom utf-8 "kliko kete buton per te bere ndrimet e pikes se rjeshtit"] ::msgcat::mcset bg "Editor for line point options." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\267\320\260 \320\276\320\277\321\206\320\270\320\270\321\202\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217\321\202\320\260."] ::msgcat::mcset cz "Editor for line point options." [encoding convertfrom utf-8 "Editor voleb bodu k\305\231ivky."] ::msgcat::mcset de "Editor for line point options." [encoding convertfrom utf-8 "Edditor f\303\274r Linienpunktoptionen."] ::msgcat::mcset el "Editor for line point options." [encoding convertfrom utf-8 "\316\225\316\264\317\216 \316\274\317\200\316\277\317\201\316\265\316\257\317\204\316\265 \316\275\316\261 \316\265\316\271\317\203\316\254\316\263\316\265\317\204\316\265 \316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \316\263\316\271\316\261 \317\204\316\261 \317\203\316\267\316\274\316\265\316\257\316\261 \317\204\317\211\316\275 \316\263\317\201\316\261\316\274\316\274\317\216\316\275."] ::msgcat::mcset en "Editor for line point options." [encoding convertfrom utf-8 "Here you can enter options that will apply to line points."] ::msgcat::mcset es "Editor for line point options." [encoding convertfrom utf-8 "Aqu\303\255 se pueden meter opciones que afectar\303\241n a los puntos de esta l\303\255nea."] ::msgcat::mcset it "Editor for line point options." [encoding convertfrom utf-8 "Editor delle opzioni del punto della linea."] ::msgcat::mcset ru "Editor for line point options." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\276\320\277\321\206\320\270\320\271 \321\202\320\276\321\207\320\272\320\270 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Editor for line point options." [encoding convertfrom utf-8 "Editor \304\217al\305\241\303\255ch mo\305\276nost\303\255 bodu krivky."] ::msgcat::mcset sq "Editor for line point options." [encoding convertfrom utf-8 "ketu mund te futni opcionet te cilat do te vlejne per pikat e rrjeshtit"] ::msgcat::mcset bg "loading area module ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\274\320\276\320\264\321\203\320\273\320\260 \320\267\320\260 \320\276\320\261\320\273\320\260\321\201\321\202\320\270 ..."] ::msgcat::mcset cz "loading area module ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m modul pro oblasti ..."] ::msgcat::mcset de "loading area module ..." [encoding convertfrom utf-8 "Lade Fl\303\244chenmodul ..."] ::msgcat::mcset el "loading area module ..." [encoding convertfrom utf-8 "\317\206\316\277\317\201\317\204\316\257\316\266\316\265\317\204\316\261\316\271 \316\267 \316\265\316\275\317\214\317\204\316\267\317\204\316\261 \316\265\317\200\316\271\317\206\316\261\316\275\316\265\316\271\317\216\316\275..."] ::msgcat::mcset en "loading area module ..." [encoding convertfrom utf-8 "oading area module ..."] ::msgcat::mcset es "loading area module ..." [encoding convertfrom utf-8 "\303\241reas..."] ::msgcat::mcset it "loading area module ..." [encoding convertfrom utf-8 "modulo aree ..."] ::msgcat::mcset ru "loading area module ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\274\320\276\320\264\321\203\320\273\321\217 \320\276\320\261\320\273\320\260\321\201\321\202\320\265\320\271 ..."] ::msgcat::mcset sk "loading area module ..." [encoding convertfrom utf-8 "nahr\303\241vam modul pre plochy ..."] ::msgcat::mcset sq "loading area module ..." [encoding convertfrom utf-8 "duke lexuar modulin e fushes\342\200\246"] ::msgcat::mcset bg "Actual symbol theme." [encoding convertfrom utf-8 "\320\220\320\272\321\202\321\203\320\260\320\273\320\265\320\275 \320\275\320\260\320\261\320\270\321\200 \320\275\320\260 \321\201\320\270\320\274\320\262\320\276\320\273\320\270"] ::msgcat::mcset cz "Actual symbol theme." [encoding convertfrom utf-8 "Aktu\303\241ln\303\255 t\303\251ma symbol\305\257."] ::msgcat::mcset de "Actual symbol theme." [encoding convertfrom utf-8 "Aktueller Symbolsatz."] ::msgcat::mcset el "Actual symbol theme." [encoding convertfrom utf-8 "\316\243\317\215\316\274\316\262\316\277\316\273\316\277"] ::msgcat::mcset it "Actual symbol theme." [encoding convertfrom utf-8 "Simboli."] ::msgcat::mcset ru "Actual symbol theme." [encoding convertfrom utf-8 "\320\244\320\270\320\273\321\214\321\202\321\200 \320\263\321\200\321\203\320\277\320\277\321\213 \321\201\320\270\320\274\320\262\320\276\320\273\320\276\320\262."] ::msgcat::mcset sk "Actual symbol theme." [encoding convertfrom utf-8 "Aktu\303\241lna t\303\251ma symbolov."] ::msgcat::mcset sq "Actual symbol theme." [encoding convertfrom utf-8 "tema aktuale e simbolit."] ::msgcat::mcset bg "type" [encoding convertfrom utf-8 "\321\202\320\270\320\277"] ::msgcat::mcset cz "type" [encoding convertfrom utf-8 "typ"] ::msgcat::mcset de "type" [encoding convertfrom utf-8 "Typ"] ::msgcat::mcset el "type" [encoding convertfrom utf-8 "\316\265\316\257\316\264\316\277\317\202"] ::msgcat::mcset en "type" [encoding convertfrom utf-8 "type"] ::msgcat::mcset es "type" [encoding convertfrom utf-8 "tipo"] ::msgcat::mcset it "type" [encoding convertfrom utf-8 "tipo"] ::msgcat::mcset ru "type" [encoding convertfrom utf-8 "\321\202\320\270\320\277"] ::msgcat::mcset sk "type" [encoding convertfrom utf-8 "typ"] ::msgcat::mcset sq "type" [encoding convertfrom utf-8 "lloji"] ::msgcat::mcset bg "Area type." [encoding convertfrom utf-8 "\320\242\320\270\320\277 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260"] ::msgcat::mcset cz "Area type." [encoding convertfrom utf-8 "Typ oblasti."] ::msgcat::mcset de "Area type." [encoding convertfrom utf-8 "Fl\303\244chentyp."] ::msgcat::mcset el "Area type." [encoding convertfrom utf-8 "\316\225\316\257\316\264\316\277\317\202 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "Area type." [encoding convertfrom utf-8 "Area type (clic on triangle to see menu)."] ::msgcat::mcset es "Area type." [encoding convertfrom utf-8 "Tipo de \303\241rea. Clic en tri\303\241ngulo para ver el men\303\272."] ::msgcat::mcset it "Area type." [encoding convertfrom utf-8 "Tipo dell'area"] ::msgcat::mcset ru "Area type." [encoding convertfrom utf-8 "\320\242\320\270\320\277 \320\276\320\261\320\273\320\260\321\201\321\202\320\270."] ::msgcat::mcset sk "Area type." [encoding convertfrom utf-8 "Typ plochy."] ::msgcat::mcset sq "Area type." [encoding convertfrom utf-8 "lloji I fushes."] ::msgcat::mcset bg "options" [encoding convertfrom utf-8 "\320\276\320\277\321\206\320\270\320\270"] ::msgcat::mcset cz "options" [encoding convertfrom utf-8 "volby"] ::msgcat::mcset de "options" [encoding convertfrom utf-8 "Optionen"] ::msgcat::mcset el "options" [encoding convertfrom utf-8 "\316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202"] ::msgcat::mcset en "options" [encoding convertfrom utf-8 "options"] ::msgcat::mcset es "options" [encoding convertfrom utf-8 "opciones"] ::msgcat::mcset it "options" [encoding convertfrom utf-8 "opzioni"] ::msgcat::mcset ru "options" [encoding convertfrom utf-8 "\320\276\320\277\321\206\320\270\320\270"] ::msgcat::mcset sk "options" [encoding convertfrom utf-8 "mo\305\276nosti"] ::msgcat::mcset sq "options" [encoding convertfrom utf-8 "opcionet"] ::msgcat::mcset bg "Other area options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270 \320\276\320\277\321\206\320\270\320\270 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260."] ::msgcat::mcset cz "Other area options." [encoding convertfrom utf-8 "Dal\305\241\303\255 volby pro oblast."] ::msgcat::mcset de "Other area options." [encoding convertfrom utf-8 "Andere Fl\303\244chenoptionen."] ::msgcat::mcset el "Other area options." [encoding convertfrom utf-8 "\316\206\316\273\316\273\316\265\317\202 \316\265\317\200\316\271\316\273\316\277\316\263\316\255\317\202 \316\265\317\200\316\271\317\206\316\261\316\275\316\265\316\271\317\216\316\275. \316\222\316\273. thbook.pdf"] ::msgcat::mcset en "Other area options." [encoding convertfrom utf-8 "Other area options. See thbook.pdf"] ::msgcat::mcset es "Other area options." [encoding convertfrom utf-8 "Otras opciones de \303\241rea. Consultar thbook.pdf"] ::msgcat::mcset it "Other area options." [encoding convertfrom utf-8 "Altre opzioni dell'area."] ::msgcat::mcset ru "Other area options." [encoding convertfrom utf-8 "\320\224\321\200\321\203\320\263\320\270\320\265 \320\276\320\277\321\206\320\270\320\270 \320\276\320\261\320\273\320\260\321\201\321\202\320\270."] ::msgcat::mcset sk "Other area options." [encoding convertfrom utf-8 "\304\216al\305\241ie mo\305\276nosti plochy."] ::msgcat::mcset sq "Other area options." [encoding convertfrom utf-8 "opcionet tjera te fushes."] ::msgcat::mcset bg "Select lines" [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\276\321\200 \320\275\320\260 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset cz "Select lines" [encoding convertfrom utf-8 "Vyber k\305\231ivky"] ::msgcat::mcset de "Select lines" [encoding convertfrom utf-8 "Linien ausw\303\244hlen"] ::msgcat::mcset el "Select lines" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \316\263\317\201\316\261\316\274\316\274\317\216\316\275"] ::msgcat::mcset en "Select lines" [encoding convertfrom utf-8 "Select lines"] ::msgcat::mcset es "Select lines" [encoding convertfrom utf-8 "Seleccionar"] ::msgcat::mcset it "Select lines" [encoding convertfrom utf-8 "Selezione linee"] ::msgcat::mcset ru "Select lines" [encoding convertfrom utf-8 "\320\222\321\213\320\261\320\276\321\200 \320\273\320\270\320\275\320\270\320\271."] ::msgcat::mcset sk "Select lines" [encoding convertfrom utf-8 "Vyber krivky"] ::msgcat::mcset sq "Select lines" [encoding convertfrom utf-8 "selekto rjeshtat"] ::msgcat::mcset bg "Switch to insert line into area mode." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\262 \321\200\320\265\320\266\320\270\320\274 \320\277\320\276\321\201\321\202\320\260\320\262\321\217\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\320\270-\320\263\321\200\320\260\320\275\320\270\321\206\320\270 \320\262 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260."] ::msgcat::mcset cz "Switch to insert line into area mode." [encoding convertfrom utf-8 "V\303\275b\304\233r ohrani\304\215uj\303\255c\303\255ch k\305\231ivek oblasti."] ::msgcat::mcset el "Switch to insert line into area mode." [encoding convertfrom utf-8 "\316\221\317\206\316\277\317\215 \317\200\316\261\317\204\316\256\317\203\317\204\316\265 \316\265\316\264\317\216, \316\265\317\200\316\271\316\273\316\255\316\263\316\265\317\204\316\265 \316\274\316\265 \317\204\316\277 \317\200\316\277\316\275\317\204\316\257\316\272\316\271 \317\204\316\271\317\202 \316\263\317\201\316\261\316\274\316\274\316\255\317\202 \316\277\317\201\316\257\317\211\316\275 \317\204\316\267\317\202 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202 (\317\200\317\201\316\255\317\200\316\265\316\271 \316\275\316\261 \317\204\316\255\316\274\316\275\316\277\316\275\317\204\316\261\316\271)"] ::msgcat::mcset en "Switch to insert line into area mode." [encoding convertfrom utf-8 "After clicking here, select by mouse this area border lines (they must intersect)."] ::msgcat::mcset es "Switch to insert line into area mode." [encoding convertfrom utf-8 "Tras clicar aqu\303\255, con el rat\303\263n puedes seleccionar l\303\255neas que limiten un \303\241rea (deben cortarse entre s\303\255)."] ::msgcat::mcset it "Switch to insert line into area mode." [encoding convertfrom utf-8 "Cambia per inserire linee nell'area."] ::msgcat::mcset ru "Switch to insert line into area mode." [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\320\272\320\273\321\216\321\207\320\270\321\202\321\201\321\217 \320\262 \321\200\320\265\320\266\320\270\320\274 \320\262\321\201\321\202\320\260\320\262\320\272\320\270 \320\273\320\270\320\275\320\270\320\271-\320\263\321\200\320\260\320\275\320\270\321\206 \320\262 \320\276\320\261\320\273\320\260\321\201\321\202\321\214."] ::msgcat::mcset sk "Switch to insert line into area mode." [encoding convertfrom utf-8 "Po stla\304\215en\303\255 m\303\264\305\276ete za\304\215a\305\245 vklada\305\245 krivky ohrani\304\215uj\303\272ce plochu."] ::msgcat::mcset sq "Switch to insert line into area mode." [encoding convertfrom utf-8 "pasi te klikoni ketu, selekto me mi rjeshtat e kufirit te fushes (ato duhet te nderlidhen)"] ::msgcat::mcset bg "Delete ID from area." [encoding convertfrom utf-8 "\320\230\320\267\321\202\321\200\320\270\320\271 \320\273\320\270\320\275\320\270\321\217 \320\277\320\276 ID \320\276\321\202 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260."] ::msgcat::mcset cz "Delete ID from area." [encoding convertfrom utf-8 "Odstran\304\233n\303\255 objektu z oblasti."] ::msgcat::mcset de "Delete ID from area." [encoding convertfrom utf-8 "L\303\266sche ID aus Fl\303\244che."] ::msgcat::mcset el "Delete ID from area." [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\263\317\201\316\261\317\206\316\256 ID \316\261\317\200\317\214 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261"] ::msgcat::mcset en "Delete ID from area." [encoding convertfrom utf-8 "Delete selected line from list (will not be part of area borders)"] ::msgcat::mcset es "Delete ID from area." [encoding convertfrom utf-8 "Borrar la l\303\255nea seleccionada de la lista (dejar\303\241 de limitar este \303\241rea)."] ::msgcat::mcset it "Delete ID from area." [encoding convertfrom utf-8 "Rimuovi identificativo dall'area."] ::msgcat::mcset ru "Delete ID from area." [encoding convertfrom utf-8 "\320\243\320\264\320\260\320\273\320\270\321\202\321\214 \320\273\320\270\320\275\320\270\321\216 \320\277\320\276 \320\230\320\224 \320\270\320\267 \320\276\320\261\320\273\320\260\321\201\321\202\320\270."] ::msgcat::mcset sk "Delete ID from area." [encoding convertfrom utf-8 "Odstr\303\241ni\305\245 krivku z dan\303\275m ID z plochy."] ::msgcat::mcset sq "Delete ID from area." [encoding convertfrom utf-8 "fshije ID prej fushes"] ::msgcat::mcset bg "Insert ID" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\277\320\276 ID"] ::msgcat::mcset cz "Insert ID" [encoding convertfrom utf-8 "Vlo\305\276 ID"] ::msgcat::mcset de "Insert ID" [encoding convertfrom utf-8 "ID einf\303\274gen"] ::msgcat::mcset el "Insert ID" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 ID"] ::msgcat::mcset en "Insert ID" [encoding convertfrom utf-8 "Insert ID"] ::msgcat::mcset es "Insert ID" [encoding convertfrom utf-8 "Insertar ID"] ::msgcat::mcset it "Insert ID" [encoding convertfrom utf-8 "Identificativo"] ::msgcat::mcset ru "Insert ID" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \320\277\320\276 \320\230\320\224"] ::msgcat::mcset sk "Insert ID" [encoding convertfrom utf-8 "Vlo\305\276 ID"] ::msgcat::mcset sq "Insert ID" [encoding convertfrom utf-8 "fute ID-ne"] ::msgcat::mcset bg "Insert given id." [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\273\320\270\320\275\320\270\321\217-\320\263\321\200\320\260\320\275\320\270\321\206\320\260 \320\277\320\276 \320\267\320\260\320\264\320\260\320\264\320\265\320\275\320\276 ID."] ::msgcat::mcset cz "Insert given id." [encoding convertfrom utf-8 "Vlo\305\276\303\255 objekt s dan\303\275m ID."] ::msgcat::mcset de "Insert given id." [encoding convertfrom utf-8 "Angegebene ID einf\303\274gen."] ::msgcat::mcset el "Insert given id." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 ID \316\254\316\273\316\273\316\277 \316\261\317\200\317\214 \317\204\316\277 \317\200\317\201\316\277\316\272\316\261\316\270\316\277\317\201\316\271\317\203\316\274\316\255\316\275\316\277 \317\204\316\277\317\205 Xtherion"] ::msgcat::mcset en "Insert given id." [encoding convertfrom utf-8 "Insert given id instead of Xtherion default."] ::msgcat::mcset es "Insert given id." [encoding convertfrom utf-8 "Insertar nombre (ID) indicado, no el nombre que therion crea autom\303\241ticamente"] ::msgcat::mcset it "Insert given id." [encoding convertfrom utf-8 "Inserisci l'identificativo specificato"] ::msgcat::mcset ru "Insert given id." [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \320\273\320\270\320\275\320\270\321\216-\320\263\321\200\320\260\320\275\320\270\321\206\321\203 \320\277\320\276 \320\267\320\260\320\264\320\260\320\275\320\275\320\276\320\274\321\203 \320\230\320\224."] ::msgcat::mcset sk "Insert given id." [encoding convertfrom utf-8 "Vlo\305\276i\305\245 ID krivky do zoznamu kriviek ohrani\304\215uj\303\272cich plochu."] ::msgcat::mcset sq "Insert given id." [encoding convertfrom utf-8 "fute ID-n e dhene ne vend te X-therion"] ::msgcat::mcset bg "ID to insert." [encoding convertfrom utf-8 "ID \320\267\320\260 \320\262\320\274\321\212\320\272\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "ID to insert." [encoding convertfrom utf-8 "ID objektu ke vlo\305\276en\303\255."] ::msgcat::mcset de "ID to insert." [encoding convertfrom utf-8 "einzuf\303\274gende ID."] ::msgcat::mcset el "ID to insert." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 ID."] ::msgcat::mcset en "ID to insert." [encoding convertfrom utf-8 "ID to insert."] ::msgcat::mcset es "ID to insert." [encoding convertfrom utf-8 "Escribir el nombre (ID) a insertar."] ::msgcat::mcset it "ID to insert." [encoding convertfrom utf-8 "Identificativo da inserire."] ::msgcat::mcset ru "ID to insert." [encoding convertfrom utf-8 "\320\230\320\224 \320\273\320\270\320\275\320\270\320\270 \320\264\320\273\321\217 \320\262\321\201\321\202\320\260\320\262\320\272\320\270"] ::msgcat::mcset sk "ID to insert." [encoding convertfrom utf-8 "ID na vlo\305\276enie."] ::msgcat::mcset sq "ID to insert." [encoding convertfrom utf-8 "ID-ja per tu futur."] ::msgcat::mcset bg "Update" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270"] ::msgcat::mcset cz "Update" [encoding convertfrom utf-8 "Aktualizovat"] ::msgcat::mcset de "Update" [encoding convertfrom utf-8 "Aktualisieren"] ::msgcat::mcset el "Update" [encoding convertfrom utf-8 "\316\225\316\274\316\267\316\274\316\255\317\201\317\211\317\203\316\267"] ::msgcat::mcset en "Update" [encoding convertfrom utf-8 "Update"] ::msgcat::mcset es "Update" [encoding convertfrom utf-8 "Actualizar"] ::msgcat::mcset it "Update" [encoding convertfrom utf-8 "Aggiorna"] ::msgcat::mcset ru "Update" [encoding convertfrom utf-8 "\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214"] ::msgcat::mcset sk "Update" [encoding convertfrom utf-8 "Aktualizova\305\245"] ::msgcat::mcset sq "Update" [encoding convertfrom utf-8 "aktualizo"] ::msgcat::mcset bg "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "\320\235\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \321\202\320\276\320\267\320\270 \320\261\321\203\321\202\320\276\320\275 \320\267\320\260 \320\264\320\260 \320\277\321\200\320\270\320\273\320\276\320\266\320\270\321\202\320\265 \320\277\321\200\320\276\320\274\320\265\320\275\320\270\321\202\320\265, \320\275\320\260\320\277\321\200\320\260\320\262\320\265\320\275\320\270 \320\262 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260."] ::msgcat::mcset cz "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "Aktualizace oblasti."] ::msgcat::mcset de "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "Klicke diesen Knopf, um \303\204nderungen an einer Fl\303\244che anzuwenden."] ::msgcat::mcset el "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \316\275\316\261 \316\263\316\257\316\275\316\265\316\271 \316\265\317\206\316\261\317\201\316\274\316\277\316\263\316\256 \317\204\317\211\316\275 \316\261\316\273\316\273\316\261\316\263\317\216\316\275 \317\200\316\277\317\205 \316\272\316\254\316\275\316\261\317\204\316\265 \317\203\317\204\316\267\316\275 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261."] ::msgcat::mcset en "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "Click this button to apply changes you made to area."] ::msgcat::mcset es "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "Clicar aqu\303\255 despu\303\251s de modificar las propiedades de un \303\241rea."] ::msgcat::mcset it "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "Premi questo bottone per fare modifiche all'area."] ::msgcat::mcset ru "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "\320\235\320\260\320\266\320\274\320\270\321\202\320\265 \321\215\321\202\321\203 \320\272\320\275\320\276\320\277\320\272\321\203 \320\264\320\273\321\217 \320\277\321\200\320\270\320\274\320\265\320\275\320\265\320\275\320\270\321\217 \320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\271 \321\201\320\264\320\265\320\273\320\260\320\275\320\275\321\213\321\205 \320\264\320\273\321\217 \320\276\320\261\320\273\320\260\321\201\321\202\320\270."] ::msgcat::mcset sk "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "Aktualizova\305\245 plochu."] ::msgcat::mcset sq "Click this button to apply changes you made to area." [encoding convertfrom utf-8 "kliko kete buton te aktualizosh ndrimet te cilat I ke bere ne fushe"] ::msgcat::mcset bg "Show" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\266\320\270"] ::msgcat::mcset cz "Show" [encoding convertfrom utf-8 "Zobrazit"] ::msgcat::mcset de "Show" [encoding convertfrom utf-8 "Zeige"] ::msgcat::mcset el "Show" [encoding convertfrom utf-8 "\316\225\316\274\317\206\316\254\316\275\316\271\317\203\316\267"] ::msgcat::mcset en "Show" [encoding convertfrom utf-8 "Show"] ::msgcat::mcset es "Show" [encoding convertfrom utf-8 "Mostrar"] ::msgcat::mcset it "Show" [encoding convertfrom utf-8 "Mostra"] ::msgcat::mcset ru "Show" [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214"] ::msgcat::mcset sk "Show" [encoding convertfrom utf-8 "Zobrazi\305\245"] ::msgcat::mcset sq "Show" [encoding convertfrom utf-8 "trego"] ::msgcat::mcset bg "Show area border lines." [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\266\320\270 \320\263\321\200\320\260\320\275\320\270\321\206\320\270\321\202\320\265 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260."] ::msgcat::mcset cz "Show area border lines." [encoding convertfrom utf-8 "Zobraz\303\255 hranice oblasti."] ::msgcat::mcset de "Show area border lines." [encoding convertfrom utf-8 "Zeige Fl\303\244chenbegrenzungen."] ::msgcat::mcset el "Show area border lines." [encoding convertfrom utf-8 "\316\225\316\274\317\206\316\254\316\275\316\271\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\317\216\316\275 \316\277\317\201\316\257\317\211\316\275 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "Show area border lines." [encoding convertfrom utf-8 "Show area border lines."] ::msgcat::mcset es "Show area border lines." [encoding convertfrom utf-8 "Mostrar l\303\255neas l\303\255mite de \303\241rea."] ::msgcat::mcset it "Show area border lines." [encoding convertfrom utf-8 "Mostra le linee del bordo dell'area."] ::msgcat::mcset ru "Show area border lines." [encoding convertfrom utf-8 "\320\237\320\276\320\272\320\260\320\267\320\260\321\202\321\214 \320\273\320\270\320\275\320\270\320\270-\320\263\321\200\320\260\320\275\320\270\321\206\321\213 \320\264\320\273\321\217 \320\276\320\261\320\273\320\260\321\201\321\202\320\270."] ::msgcat::mcset sk "Show area border lines." [encoding convertfrom utf-8 "Zobraz hranice plochy."] ::msgcat::mcset sq "Show area border lines." [encoding convertfrom utf-8 "trego kufirin e vijave te fushes."] ::msgcat::mcset bg "Select line in area." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \320\273\320\270\320\275\320\270\321\217."] ::msgcat::mcset cz "Select line in area." [encoding convertfrom utf-8 "V\303\275b\304\233r k\305\231ivky ohrani\304\215uj\303\255c\303\255 oblast"] ::msgcat::mcset de "Select line in area." [encoding convertfrom utf-8 "W\303\244hle Linie in Fl\303\244che."] ::msgcat::mcset el "Select line in area." [encoding convertfrom utf-8 "\316\232\316\254\316\275\317\204\316\265 \316\272\316\273\316\271\316\272 \317\203\316\265 \316\277\317\200\316\277\316\271\316\261\316\264\316\256\317\200\316\277\317\204\316\265 \316\263\317\201\316\261\316\274\316\274\316\256 \317\204\316\277\317\205 \316\272\316\261\317\204\316\261\316\273\317\214\316\263\316\277\317\205 \316\263\316\271\316\261 \316\275\316\261 \316\265\317\200\316\271\316\273\316\265\317\207\316\270\316\265\316\257 \316\267 \316\261\316\275\317\204\316\257\317\203\317\204\316\277\316\271\317\207\316\267 \316\263\317\201\316\261\316\274\316\274\316\256 \316\277\317\201\316\257\316\277\317\205 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202 \317\203\317\204\316\277\316\275 \316\272\316\261\316\274\316\262\316\254."] ::msgcat::mcset en "Select line in area." [encoding convertfrom utf-8 "Click on any list line to get corresponding area border line selected on canvas."] ::msgcat::mcset es "Select line in area." [encoding convertfrom utf-8 "Cada rengl\303\263n de la lista corresponde a una l\303\255nea que limita esta \303\241rea"] ::msgcat::mcset it "Select line in area." [encoding convertfrom utf-8 "Seleziona una linea nell'area."] ::msgcat::mcset ru "Select line in area." [encoding convertfrom utf-8 "\320\222\321\213\320\261\320\276\321\200 \320\273\320\270\320\275\320\270\320\270."] ::msgcat::mcset sk "Select line in area." [encoding convertfrom utf-8 "Vyber hrani\304\215n\303\272 krivku."] ::msgcat::mcset sq "Select line in area." [encoding convertfrom utf-8 "kliko ne cilindo rrjesht te listes qe te kesh rrjeshtin kufizues te fushes pershtatese, I zgjedhur ne pelhure"] ::msgcat::mcset bg "loading main menu ..." [encoding convertfrom utf-8 "\320\227\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\263\320\273\320\260\320\262\320\275\320\276\321\202\320\276 \320\274\320\265\320\275\321\216 ..."] ::msgcat::mcset cz "loading main menu ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m hlavn\303\255 menu ..."] ::msgcat::mcset de "loading main menu ..." [encoding convertfrom utf-8 "Lade Hauptmen\303\274 ..."] ::msgcat::mcset el "loading main menu ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \316\272\317\215\317\201\316\271\316\277\317\205 \316\274\316\265\316\275\316\277\317\215"] ::msgcat::mcset en "loading main menu ..." [encoding convertfrom utf-8 "loading main menu ..."] ::msgcat::mcset es "loading main menu ..." [encoding convertfrom utf-8 "men\303\272 principal ..."] ::msgcat::mcset it "loading main menu ..." [encoding convertfrom utf-8 "men\303\271 principale ..."] ::msgcat::mcset ru "loading main menu ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\263\320\273\320\260\320\262\320\275\320\276\320\263\320\276 \320\274\320\265\320\275\321\216 ..."] ::msgcat::mcset sk "loading main menu ..." [encoding convertfrom utf-8 "nahr\303\241vam hlavn\303\251 menu ..."] ::msgcat::mcset sq "loading main menu ..." [encoding convertfrom utf-8 "duke lexuar menyn kryesore\342\200\246"] ::msgcat::mcset bg "Open (no pics)" [encoding convertfrom utf-8 "\320\236\321\202\320\262\320\276\321\200\320\270 (\320\261\320\265\320\267 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217)"] ::msgcat::mcset cz "Open (no pics)" [encoding convertfrom utf-8 "Otev\305\231\303\255t (bez obr\303\241zk\305\257)"] ::msgcat::mcset de "Open (no pics)" [encoding convertfrom utf-8 "\303\226ffne (keine Bilder)"] ::msgcat::mcset el "Open (no pics)" [encoding convertfrom utf-8 "\316\206\316\275\316\277\316\271\316\263\316\274\316\261 (\317\207\317\211\317\201\316\257\317\202 \316\265\316\271\316\272\317\214\316\275\316\265\317\202)"] ::msgcat::mcset en "Open (no pics)" [encoding convertfrom utf-8 "Open (no pics)"] ::msgcat::mcset es "Open (no pics)" [encoding convertfrom utf-8 "Abrir (sin im\303\241genes)"] ::msgcat::mcset it "Open (no pics)" [encoding convertfrom utf-8 "Apri (no pics)"] ::msgcat::mcset ru "Open (no pics)" [encoding convertfrom utf-8 "\320\236\321\202\320\272\321\200\321\213\321\202\321\214 (\320\261\320\265\320\267 \320\272\320\260\321\200\321\202\320\270\320\275\320\276\320\272)"] ::msgcat::mcset sk "Open (no pics)" [encoding convertfrom utf-8 "Otvori\305\245 (bez obr\303\241zkov)"] ::msgcat::mcset sq "Open (no pics)" [encoding convertfrom utf-8 "hape (pa foto)"] ::msgcat::mcset bg "Insert ..." [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 ..."] ::msgcat::mcset cz "Insert ..." [encoding convertfrom utf-8 "Vlo\305\276it ..."] ::msgcat::mcset de "Insert ..." [encoding convertfrom utf-8 "Einf\303\274gen ..."] ::msgcat::mcset el "Insert ..." [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256..."] ::msgcat::mcset en "Insert ..." [encoding convertfrom utf-8 "Insert ..."] ::msgcat::mcset es "Insert ..." [encoding convertfrom utf-8 "Insertar ..."] ::msgcat::mcset it "Insert ..." [encoding convertfrom utf-8 "Inserisci ..."] ::msgcat::mcset ru "Insert ..." [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\272\320\260"] ::msgcat::mcset sk "Insert ..." [encoding convertfrom utf-8 "Vlo\305\276i\305\245 ..."] ::msgcat::mcset sq "Insert ..." [encoding convertfrom utf-8 "fute\342\200\246"] ::msgcat::mcset bg "point" [encoding convertfrom utf-8 "\321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "point" [encoding convertfrom utf-8 "bod"] ::msgcat::mcset de "point" [encoding convertfrom utf-8 "Punkt"] ::msgcat::mcset el "point" [encoding convertfrom utf-8 "\317\203\316\267\316\274\316\265\316\257\316\277"] ::msgcat::mcset en "point" [encoding convertfrom utf-8 "point"] ::msgcat::mcset es "point" [encoding convertfrom utf-8 "punto"] ::msgcat::mcset it "point" [encoding convertfrom utf-8 "punto"] ::msgcat::mcset ru "point" [encoding convertfrom utf-8 "\321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset sk "point" [encoding convertfrom utf-8 "bod"] ::msgcat::mcset sq "point" [encoding convertfrom utf-8 "pika"] ::msgcat::mcset bg "line" [encoding convertfrom utf-8 "\320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "line" [encoding convertfrom utf-8 "k\305\231ivka"] ::msgcat::mcset de "line" [encoding convertfrom utf-8 "Linie"] ::msgcat::mcset el "line" [encoding convertfrom utf-8 "\316\263\317\201\316\261\316\274\316\274\316\256"] ::msgcat::mcset en "line" [encoding convertfrom utf-8 "line"] ::msgcat::mcset es "line" [encoding convertfrom utf-8 "l\303\255nea"] ::msgcat::mcset it "line" [encoding convertfrom utf-8 "linea"] ::msgcat::mcset ru "line" [encoding convertfrom utf-8 "\320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset sk "line" [encoding convertfrom utf-8 "krivku"] ::msgcat::mcset sq "line" [encoding convertfrom utf-8 "vija apo rjeshti"] ::msgcat::mcset bg "area" [encoding convertfrom utf-8 "\320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "area" [encoding convertfrom utf-8 "oblast"] ::msgcat::mcset de "area" [encoding convertfrom utf-8 "Fl\303\244che"] ::msgcat::mcset el "area" [encoding convertfrom utf-8 "\316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261"] ::msgcat::mcset en "area" [encoding convertfrom utf-8 "area"] ::msgcat::mcset es "area" [encoding convertfrom utf-8 "\303\241rea"] ::msgcat::mcset it "area" [encoding convertfrom utf-8 "area"] ::msgcat::mcset ru "area" [encoding convertfrom utf-8 "\320\276\320\261\320\273\320\260\321\201\321\202\321\214"] ::msgcat::mcset sk "area" [encoding convertfrom utf-8 "plochu"] ::msgcat::mcset sq "area" [encoding convertfrom utf-8 "fusha"] ::msgcat::mcset bg "scrap" [encoding convertfrom utf-8 "\321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset cz "scrap" [encoding convertfrom utf-8 "scrap"] ::msgcat::mcset de "scrap" [encoding convertfrom utf-8 "Skizze"] ::msgcat::mcset el "scrap" [encoding convertfrom utf-8 "\317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "scrap" [encoding convertfrom utf-8 "scrap"] ::msgcat::mcset es "scrap" [encoding convertfrom utf-8 "croquis"] ::msgcat::mcset it "scrap" [encoding convertfrom utf-8 "scrap"] ::msgcat::mcset ru "scrap" [encoding convertfrom utf-8 "\321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset sk "scrap" [encoding convertfrom utf-8 "scrap"] ::msgcat::mcset sq "scrap" [encoding convertfrom utf-8 "deponia"] ::msgcat::mcset bg "text" [encoding convertfrom utf-8 "\321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset cz "text" [encoding convertfrom utf-8 "text"] ::msgcat::mcset de "text" [encoding convertfrom utf-8 "Text"] ::msgcat::mcset el "text" [encoding convertfrom utf-8 "\316\272\316\265\316\257\316\274\316\265\316\275\316\277"] ::msgcat::mcset en "text" [encoding convertfrom utf-8 "text"] ::msgcat::mcset es "text" [encoding convertfrom utf-8 "texto"] ::msgcat::mcset it "text" [encoding convertfrom utf-8 "testo"] ::msgcat::mcset ru "text" [encoding convertfrom utf-8 "\321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset sk "text" [encoding convertfrom utf-8 "text"] ::msgcat::mcset sq "text" [encoding convertfrom utf-8 "teksti"] ::msgcat::mcset bg "Auto adjust area" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\275\320\260 \320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "Auto adjust area" [encoding convertfrom utf-8 "Auto p\305\231izp\305\257sobit"] ::msgcat::mcset de "Auto adjust area" [encoding convertfrom utf-8 "Fl\303\244che automatisch anpassen"] ::msgcat::mcset el "Auto adjust area" [encoding convertfrom utf-8 "\316\221\317\205\317\204\317\214\316\274\316\261\317\204\316\267 \317\201\317\215\316\270\316\274\316\271\317\203\316\267 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "Auto adjust area" [encoding convertfrom utf-8 "Auto adjust area"] ::msgcat::mcset es "Auto adjust area" [encoding convertfrom utf-8 "Autoajustar \303\241rea"] ::msgcat::mcset it "Auto adjust area" [encoding convertfrom utf-8 "Auto-ridimensiona area"] ::msgcat::mcset ru "Auto adjust area" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\277\320\276\320\264\320\263\320\276\320\275\320\272\320\260 \320\263\321\200\320\260\320\275\320\270\321\206 \320\267\320\276\320\275\321\213 \321\200\320\270\321\201\320\276\320\262\320\260\320\275\320\270\321\217."] ::msgcat::mcset sk "Auto adjust area" [encoding convertfrom utf-8 "Prisp\303\264sob plochu"] ::msgcat::mcset sq "Auto adjust area" [encoding convertfrom utf-8 "fusha automatikisht e pershtatur"] ::msgcat::mcset bg "Insert image" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Insert image" [encoding convertfrom utf-8 "Vlo\305\276it obr\303\241zek"] ::msgcat::mcset de "Insert image" [encoding convertfrom utf-8 "Bild einf\303\274gen"] ::msgcat::mcset el "Insert image" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "Insert image" [encoding convertfrom utf-8 "Insert image"] ::msgcat::mcset es "Insert image" [encoding convertfrom utf-8 "Insertar imagen"] ::msgcat::mcset it "Insert image" [encoding convertfrom utf-8 "Inserisci immagine"] ::msgcat::mcset ru "Insert image" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "Insert image" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 obr\303\241zok"] ::msgcat::mcset sq "Insert image" [encoding convertfrom utf-8 "fute imazhin"] ::msgcat::mcset bg "Zoom 100 %" [encoding convertfrom utf-8 "\320\234\320\260\321\211\320\260\320\261 100%"] ::msgcat::mcset cz "Zoom 100 %" [encoding convertfrom utf-8 "Zoom na 100 %"] ::msgcat::mcset el "Zoom 100 %" [encoding convertfrom utf-8 "\316\234\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267 100%"] ::msgcat::mcset en "Zoom 100 %" [encoding convertfrom utf-8 "Zoom 100 %"] ::msgcat::mcset es "Zoom 100 %" [encoding convertfrom utf-8 "Zoom 100%"] ::msgcat::mcset it "Zoom 100 %" [encoding convertfrom utf-8 "Zoom 100 %"] ::msgcat::mcset ru "Zoom 100 %" [encoding convertfrom utf-8 "\320\234\320\260\321\201\321\210\321\202\320\260\320\261 100 %"] ::msgcat::mcset sk "Zoom 100 %" [encoding convertfrom utf-8 "Zoom 100%"] ::msgcat::mcset sq "Zoom 100 %" [encoding convertfrom utf-8 "zmadho 100%"] ::msgcat::mcset bg "Mouse mode." [encoding convertfrom utf-8 "\320\240\320\265\320\266\320\270\320\274 '\320\274\320\270\321\210\320\272\320\260'."] ::msgcat::mcset cz "Mouse mode." [encoding convertfrom utf-8 "Klikac\303\255 re\305\276im."] ::msgcat::mcset de "Mouse mode." [encoding convertfrom utf-8 "Mausmodus."] ::msgcat::mcset el "Mouse mode." [encoding convertfrom utf-8 "\316\233\316\265\316\271\317\204\316\277\317\205\317\201\316\263\316\257\316\261 \317\200\316\277\316\275\317\204\316\271\316\272\316\271\316\277\317\215."] ::msgcat::mcset en "Mouse mode." [encoding convertfrom utf-8 "Mouse mode."] ::msgcat::mcset es "Mouse mode." [encoding convertfrom utf-8 "Modo rat\303\263n."] ::msgcat::mcset it "Mouse mode." [encoding convertfrom utf-8 "Modalit\303\240 del mouse."] ::msgcat::mcset ru "Mouse mode." [encoding convertfrom utf-8 "\320\240\320\265\320\266\320\270\320\274 \320\274\321\213\321\210\320\270."] ::msgcat::mcset sk "Mouse mode." [encoding convertfrom utf-8 "M\303\263d my\305\241i."] ::msgcat::mcset sq "Mouse mode." [encoding convertfrom utf-8 "miu ne funkcion"] ::msgcat::mcset bg "Current mouse position." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\203\321\211\320\260 \320\277\320\276\320\267\320\270\321\206\320\270\321\217 \320\275\320\260 \320\272\321\203\321\200\321\201\320\276\321\200\320\260."] ::msgcat::mcset cz "Current mouse position." [encoding convertfrom utf-8 "Aktu\303\241ln\303\255 pozice ukazatele my\305\241i."] ::msgcat::mcset de "Current mouse position." [encoding convertfrom utf-8 "Aktuelle Mausposition."] ::msgcat::mcset el "Current mouse position." [encoding convertfrom utf-8 "\316\244\317\201\316\255\317\207\316\277\317\205\317\203\316\261 \316\270\316\255\317\203\316\267 \317\200\316\277\316\275\317\204\316\271\316\272\316\271\316\277\317\215."] ::msgcat::mcset en "Current mouse position." [encoding convertfrom utf-8 "Current mouse position."] ::msgcat::mcset es "Current mouse position." [encoding convertfrom utf-8 "Posici\303\263n actual del rat\303\263n."] ::msgcat::mcset it "Current mouse position." [encoding convertfrom utf-8 "Posizione del mouse."] ::msgcat::mcset ru "Current mouse position." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\203\321\211\320\260\321\217 \320\277\320\276\320\267\320\270\321\206\320\270\321\217 \321\203\320\272\320\260\320\267\320\260\321\202\320\265\320\273\321\217 \320\274\321\213\321\210\320\270."] ::msgcat::mcset sk "Current mouse position." [encoding convertfrom utf-8 "Aktu\303\241lna poloha my\305\241i."] ::msgcat::mcset sq "Current mouse position." [encoding convertfrom utf-8 "pozicioni aktual I miut."] ::msgcat::mcset bg "loading line procs ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\277\321\200\320\276\321\206\320\265\320\264\321\203\321\200\320\270\321\202\320\265 \320\267\320\260 \320\273\320\270\320\275\320\270\321\217 ..."] ::msgcat::mcset cz "loading line procs ..." [encoding convertfrom utf-8 "zpracov\303\241v\303\241m k\305\231ivky ..."] ::msgcat::mcset el "loading line procs ..." [encoding convertfrom utf-8 "\317\206\317\214\317\201\317\204\316\271\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\271\316\272\317\216\316\275 \316\264\316\271\316\261\316\264\316\271\316\272\316\261\317\203\316\271\317\216\316\275..."] ::msgcat::mcset en "loading line procs ..." [encoding convertfrom utf-8 "loading line procs ..."] ::msgcat::mcset es "loading line procs ..." [encoding convertfrom utf-8 "procesos de l\303\255nea ..."] ::msgcat::mcset it "loading line procs ..." [encoding convertfrom utf-8 "procedure di linea ..."] ::msgcat::mcset ru "loading line procs ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \320\277\321\200\320\276\321\206\320\265\320\264\321\203\321\200 \320\264\320\273\321\217 \320\273\320\270\320\275\320\270\320\271 ..."] ::msgcat::mcset sk "loading line procs ..." [encoding convertfrom utf-8 "na\304\215itavam modul kriviek ..."] ::msgcat::mcset sq "loading line procs ..." [encoding convertfrom utf-8 "duke lexuar proceduren rjeshtit\342\200\246"] ::msgcat::mcset bg "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\260 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270 \320\275\320\265 \320\265 \320\260\320\272\321\202\320\270\320\262\320\265\320\275. \320\227\320\260 \320\260\320\272\321\202\320\270\320\262\320\270\321\200\320\260\320\275\320\265 \320\276\321\202\320\262\320\276\321\200\320\265\321\202\320\265 \321\201\321\212\321\211\320\265\321\201\321\202\320\262\321\203\320\262\320\260\321\211 \321\204\320\260\320\271\320\273 \320\270\320\273\320\270 \321\201\321\212\320\267\320\264\320\260\320\271\321\202\320\265 \320\275\320\276\320\262."] ::msgcat::mcset cz "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Mapov\303\275 editor nen\303\255 aktivn\303\255. Pro jeho aktivaci otev\305\231ete existuj\303\255c\303\255 soubor nebo vytvo\305\231te nov\303\275."] ::msgcat::mcset de "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Karteneditor ist nicht aktiv. Um ihn zu aktivieren, lade eine existierende Datei oder lege eine neue an."] ::msgcat::mcset el "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\316\237 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256\317\202 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \316\264\316\265\316\275 \316\265\316\257\316\275\316\261\316\271 \316\265\316\275\316\265\317\201\316\263\317\214\317\202. \316\223\316\271\316\261 \316\275\316\261 \317\204\316\277\316\275 \316\265\316\275\316\265\317\201\316\263\316\277\317\200\316\277\316\271\316\256\317\203\316\265\317\204\316\265, \316\261\316\275\316\277\316\257\316\276\317\204\316\265 \316\255\316\275\316\261 \316\261\317\201\317\207\316\265\316\257\316\277 \316\256 \316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\256\317\203\317\204\316\265 \316\275\316\255\316\277."] ::msgcat::mcset en "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Map editor is not active. To activate it, open existing file or create new one."] ::msgcat::mcset es "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "El editor de mapas est\303\241 inactivo. Para activarlo, abre un archivo existente o crea uno nuevo."] ::msgcat::mcset it "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "L'editor di mappa non \303\250 attivo. Per attivarlo apri un file o creane uno."] ::msgcat::mcset ru "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\272\320\260\321\200\321\202\321\213 \320\275\320\265 \320\260\320\272\321\202\320\270\320\262\320\265\320\275. \320\224\320\273\321\217 \320\260\320\272\321\202\320\270\320\262\320\260\321\206\320\270\320\270 \320\276\321\202\320\272\321\200\320\276\320\271\321\202\320\265 \321\201\321\203\321\211\320\265\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\271 \321\204\320\260\320\271\320\273 \320\270\320\273\320\270 \321\201\320\276\320\267\320\264\320\260\320\271\321\202\320\265 \320\275\320\276\320\262\321\213\320\271."] ::msgcat::mcset sk "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Mapov\303\275 editor nie je akt\303\255vny. Otvorte existuj\303\272ci s\303\272bor alebo vytvorte nov\303\275."] ::msgcat::mcset sq "Map editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "permiresuesi I hartes nuk eshte aktiv. Qe ta aktivizosh, hape fajlin egzistues ose krijo nje te ri"] ::msgcat::mcset bg "Insert line" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "Insert line" [encoding convertfrom utf-8 "Vlo\305\276it k\305\231ivku"] ::msgcat::mcset de "Insert line" [encoding convertfrom utf-8 "Linie einf\303\274gen"] ::msgcat::mcset el "Insert line" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Insert line" [encoding convertfrom utf-8 "Insert line"] ::msgcat::mcset es "Insert line" [encoding convertfrom utf-8 "Insertar l\303\255nea"] ::msgcat::mcset it "Insert line" [encoding convertfrom utf-8 "Inserisci linea"] ::msgcat::mcset ru "Insert line" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \320\273\320\270\320\275\320\270\321\216"] ::msgcat::mcset sk "Insert line" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 krivku"] ::msgcat::mcset sq "Insert line" [encoding convertfrom utf-8 "fute rjeshtin-vijen"] ::msgcat::mcset bg "Insert scrap" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset cz "Insert scrap" [encoding convertfrom utf-8 "Vlo\305\276it scrap"] ::msgcat::mcset de "Insert scrap" [encoding convertfrom utf-8 "Skizze einf\303\274gen"] ::msgcat::mcset el "Insert scrap" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "Insert scrap" [encoding convertfrom utf-8 "Insert scrap"] ::msgcat::mcset es "Insert scrap" [encoding convertfrom utf-8 "Insertar croquis"] ::msgcat::mcset it "Insert scrap" [encoding convertfrom utf-8 "Inserisci scrap"] ::msgcat::mcset ru "Insert scrap" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset sk "Insert scrap" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 scrap"] ::msgcat::mcset sq "Insert scrap" [encoding convertfrom utf-8 "fute deponin"] ::msgcat::mcset bg "Insert text" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset cz "Insert text" [encoding convertfrom utf-8 "Vlo\305\276it text"] ::msgcat::mcset de "Insert text" [encoding convertfrom utf-8 "Text einf\303\274gen"] ::msgcat::mcset el "Insert text" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset en "Insert text" [encoding convertfrom utf-8 "Insert text"] ::msgcat::mcset es "Insert text" [encoding convertfrom utf-8 "Insertar texto"] ::msgcat::mcset it "Insert text" [encoding convertfrom utf-8 "Inserisci testo"] ::msgcat::mcset ru "Insert text" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset sk "Insert text" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 text"] ::msgcat::mcset sq "Insert text" [encoding convertfrom utf-8 "fute tekstin"] ::msgcat::mcset bg "Insert area" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "Insert area" [encoding convertfrom utf-8 "Vlo\305\276it oblast"] ::msgcat::mcset de "Insert area" [encoding convertfrom utf-8 "Fl\303\244che einf\303\274gen"] ::msgcat::mcset el "Insert area" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "Insert area" [encoding convertfrom utf-8 "Insert area"] ::msgcat::mcset es "Insert area" [encoding convertfrom utf-8 "Insertar \303\241rea"] ::msgcat::mcset it "Insert area" [encoding convertfrom utf-8 "Inserisci area"] ::msgcat::mcset ru "Insert area" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \320\276\320\261\320\273\320\260\321\201\321\202\321\214"] ::msgcat::mcset sk "Insert area" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 plochu"] ::msgcat::mcset sq "Insert area" [encoding convertfrom utf-8 "fute fushen"] ::msgcat::mcset bg "Delete" [encoding convertfrom utf-8 "\320\230\320\267\321\202\321\200\320\270\320\271"] ::msgcat::mcset cz "Delete" [encoding convertfrom utf-8 "Smazat"] ::msgcat::mcset de "Delete" [encoding convertfrom utf-8 "L\303\266sche"] ::msgcat::mcset el "Delete" [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\263\317\201\316\261\317\206\316\256"] ::msgcat::mcset en "Delete" [encoding convertfrom utf-8 "Delete"] ::msgcat::mcset es "Delete" [encoding convertfrom utf-8 "Borrar"] ::msgcat::mcset it "Delete" [encoding convertfrom utf-8 "Rimuovi"] ::msgcat::mcset ru "Delete" [encoding convertfrom utf-8 "\320\243\320\264\320\260\320\273\320\270\321\202\321\214"] ::msgcat::mcset sk "Delete" [encoding convertfrom utf-8 "Odstr\303\241ni\305\245"] ::msgcat::mcset sq "Delete" [encoding convertfrom utf-8 "fshije"] ::msgcat::mcset bg "deleting" [encoding convertfrom utf-8 "\320\270\320\267\321\202\321\200\320\270\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "deleting" [encoding convertfrom utf-8 "maz\303\241n\303\255"] ::msgcat::mcset de "deleting" [encoding convertfrom utf-8 "l\303\266sche"] ::msgcat::mcset el "deleting" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\263\317\201\316\261\317\206\316\256"] ::msgcat::mcset en "deleting" [encoding convertfrom utf-8 "deleting"] ::msgcat::mcset es "deleting" [encoding convertfrom utf-8 "borrando"] ::msgcat::mcset it "deleting" [encoding convertfrom utf-8 "rimuovendo"] ::msgcat::mcset ru "deleting" [encoding convertfrom utf-8 "\321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "deleting" [encoding convertfrom utf-8 "mazanie"] ::msgcat::mcset sq "deleting" [encoding convertfrom utf-8 "duke fshire"] ::msgcat::mcset bg "moving command" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\274\320\265\321\201\321\202\320\262\320\260\320\275\320\265 \320\275\320\260 \320\272\320\276\320\274\320\260\320\275\320\264\320\260"] ::msgcat::mcset cz "moving command" [encoding convertfrom utf-8 "p\305\231esun p\305\231\303\255kazu"] ::msgcat::mcset de "moving command" [encoding convertfrom utf-8 "Verschiebebefehl"] ::msgcat::mcset el "moving command" [encoding convertfrom utf-8 "\316\265\316\275\317\204\316\277\316\273\316\256 \316\274\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "moving command" [encoding convertfrom utf-8 "moving command"] ::msgcat::mcset es "moving command" [encoding convertfrom utf-8 "desplazando comando"] ::msgcat::mcset it "moving command" [encoding convertfrom utf-8 "comando di spostamento"] ::msgcat::mcset ru "moving command" [encoding convertfrom utf-8 "\320\277\320\265\321\200\320\265\320\274\320\265\321\211\320\265\320\275\320\270\320\265 \320\272\320\276\320\274\320\260\320\275\320\264"] ::msgcat::mcset sk "moving command" [encoding convertfrom utf-8 "presun pr\303\255kazu"] ::msgcat::mcset sq "moving command" [encoding convertfrom utf-8 "komanda e levizjes"] ::msgcat::mcset bg "creating endscrap" [encoding convertfrom utf-8 "\321\201\321\212\320\267\320\264\320\260\320\262\320\260\320\275\320\265 \320\272\321\200\320\260\320\271 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset cz "creating endscrap" [encoding convertfrom utf-8 "vytvo\305\231en\303\255 konce scrapu"] ::msgcat::mcset de "creating endscrap" [encoding convertfrom utf-8 "Erzeuge Skizzenende"] ::msgcat::mcset el "creating endscrap" [encoding convertfrom utf-8 "\316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\257\316\261 \317\204\316\255\316\273\316\277\317\205\317\202 \317\203\316\272\317\201\316\261\317\200 (endscrap)"] ::msgcat::mcset en "creating endscrap" [encoding convertfrom utf-8 "creating endscrap"] ::msgcat::mcset es "creating endscrap" [encoding convertfrom utf-8 "creando l\303\255nea final de croquis (endscrap)"] ::msgcat::mcset it "creating endscrap" [encoding convertfrom utf-8 "creazione endscrap"] ::msgcat::mcset ru "creating endscrap" [encoding convertfrom utf-8 "\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\272\320\276\320\275\321\206\320\260 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "creating endscrap" [encoding convertfrom utf-8 "vytvorenie konca scrapu"] ::msgcat::mcset sq "creating endscrap" [encoding convertfrom utf-8 "duke kriju fundin e deponise"] ::msgcat::mcset bg "scrap changes" [encoding convertfrom utf-8 "\320\277\321\200\320\276\320\274\321\217\320\275\320\260 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset cz "scrap changes" [encoding convertfrom utf-8 "zm\304\233na parametr\305\257 scrapu"] ::msgcat::mcset de "scrap changes" [encoding convertfrom utf-8 "Skizzen\303\244nderung"] ::msgcat::mcset el "scrap changes" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\255\317\202 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "scrap changes" [encoding convertfrom utf-8 "scrap changes"] ::msgcat::mcset es "scrap changes" [encoding convertfrom utf-8 "cambios del croquis (scrap)"] ::msgcat::mcset it "scrap changes" [encoding convertfrom utf-8 "modifiche dello scrap"] ::msgcat::mcset ru "scrap changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "scrap changes" [encoding convertfrom utf-8 "zmena parametrov scrapu"] ::msgcat::mcset sq "scrap changes" [encoding convertfrom utf-8 "ndryshimet ne deponi"] ::msgcat::mcset bg "creating scrap" [encoding convertfrom utf-8 "\321\201\321\212\320\267\320\264\320\260\320\262\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset cz "creating scrap" [encoding convertfrom utf-8 "vytvo\305\231en\303\255 scrapu"] ::msgcat::mcset de "creating scrap" [encoding convertfrom utf-8 "Erzeuge Skizze"] ::msgcat::mcset el "creating scrap" [encoding convertfrom utf-8 "\316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\257\316\261 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset en "creating scrap" [encoding convertfrom utf-8 "creating scrap"] ::msgcat::mcset es "creating scrap" [encoding convertfrom utf-8 "creando croquis (scrap)"] ::msgcat::mcset it "creating scrap" [encoding convertfrom utf-8 "creazione scrap"] ::msgcat::mcset ru "creating scrap" [encoding convertfrom utf-8 "\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "creating scrap" [encoding convertfrom utf-8 "vytvorenie scrapu"] ::msgcat::mcset sq "creating scrap" [encoding convertfrom utf-8 "duke kriju deponin"] ::msgcat::mcset bg "creating text" [encoding convertfrom utf-8 "\321\201\321\212\320\267\320\264\320\260\320\262\320\260\320\275\320\265 \320\275\320\260 \321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset cz "creating text" [encoding convertfrom utf-8 "vytvo\305\231en\303\255 textu"] ::msgcat::mcset de "creating text" [encoding convertfrom utf-8 "Erzeuge Text"] ::msgcat::mcset el "creating text" [encoding convertfrom utf-8 "\316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\257\316\261 \316\264\316\277\316\272\316\271\316\274\316\256\317\202"] ::msgcat::mcset en "creating text" [encoding convertfrom utf-8 "creating text"] ::msgcat::mcset es "creating text" [encoding convertfrom utf-8 "creando texto"] ::msgcat::mcset it "creating text" [encoding convertfrom utf-8 "creazione testo"] ::msgcat::mcset ru "creating text" [encoding convertfrom utf-8 "\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \321\202\320\265\320\272\321\201\321\202\320\260"] ::msgcat::mcset sk "creating text" [encoding convertfrom utf-8 "vytvorenie textu"] ::msgcat::mcset sq "creating text" [encoding convertfrom utf-8 "duke kriju tekstin"] ::msgcat::mcset bg "text changes" [encoding convertfrom utf-8 "\320\277\321\200\320\276\320\274\321\217\320\275\320\260 \320\275\320\260 \321\202\320\265\320\272\321\201\321\202"] ::msgcat::mcset cz "text changes" [encoding convertfrom utf-8 "zm\304\233na textu"] ::msgcat::mcset de "text changes" [encoding convertfrom utf-8 "Text\303\244nderungen"] ::msgcat::mcset el "text changes" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\255\317\202 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset en "text changes" [encoding convertfrom utf-8 "text changes"] ::msgcat::mcset es "text changes" [encoding convertfrom utf-8 "cambios de texto"] ::msgcat::mcset it "text changes" [encoding convertfrom utf-8 "modifiche del testo"] ::msgcat::mcset ru "text changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \321\202\320\265\320\272\321\201\321\202\320\260"] ::msgcat::mcset sk "text changes" [encoding convertfrom utf-8 "zmena textu"] ::msgcat::mcset sq "text changes" [encoding convertfrom utf-8 "ndrimet e tekstit"] ::msgcat::mcset bg "end point insertion" [encoding convertfrom utf-8 "\321\201\320\273\320\260\320\263\320\260\320\275\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260 \320\267\320\260 \320\272\321\200\320\260\320\271"] ::msgcat::mcset cz "end point insertion" [encoding convertfrom utf-8 "konec vkl\303\241d\303\241n\303\255 bod\305\257"] ::msgcat::mcset de "end point insertion" [encoding convertfrom utf-8 "Endpunkt eingef\303\274gt"] ::msgcat::mcset el "end point insertion" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\204\316\265\316\273\316\271\316\272\316\277\317\215 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "end point insertion" [encoding convertfrom utf-8 "end point insertion"] ::msgcat::mcset es "end point insertion" [encoding convertfrom utf-8 "final de inserci\303\263n de punto"] ::msgcat::mcset it "end point insertion" [encoding convertfrom utf-8 "inserimento punto finale"] ::msgcat::mcset ru "end point insertion" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \320\272\320\276\320\275\320\265\321\207\320\275\320\276\320\271 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset sk "end point insertion" [encoding convertfrom utf-8 "koniec vkladania bodov"] ::msgcat::mcset sq "end point insertion" [encoding convertfrom utf-8 "perfundo futjet e pikave"] ::msgcat::mcset bg "select object" [encoding convertfrom utf-8 "\320\270\320\267\320\261\320\276\321\200 \320\275\320\260 \320\276\320\261\320\265\320\272\321\202"] ::msgcat::mcset cz "select object" [encoding convertfrom utf-8 "ozna\304\215 objekt"] ::msgcat::mcset de "select object" [encoding convertfrom utf-8 "Objekt ausw\303\244hlen"] ::msgcat::mcset el "select object" [encoding convertfrom utf-8 "\316\265\317\200\316\271\316\273\316\277\316\263\316\256 \316\261\316\275\317\204\316\271\316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset it "select object" [encoding convertfrom utf-8 "seleziona oggetto"] ::msgcat::mcset ru "select object" [encoding convertfrom utf-8 "\320\262\321\213\320\261\320\276\321\200 \320\276\320\261\321\212\320\265\320\272\321\202\320\260"] ::msgcat::mcset sk "select object" [encoding convertfrom utf-8 "ozna\304\215 objekt"] ::msgcat::mcset sq "select object" [encoding convertfrom utf-8 "selekto objektin"] ::msgcat::mcset bg "Insert" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270"] ::msgcat::mcset cz "Insert" [encoding convertfrom utf-8 "Vlo\305\276it"] ::msgcat::mcset de "Insert" [encoding convertfrom utf-8 "Einf\303\274gen"] ::msgcat::mcset el "Insert" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256"] ::msgcat::mcset en "Insert" [encoding convertfrom utf-8 "Insert"] ::msgcat::mcset es "Insert" [encoding convertfrom utf-8 "Insertar"] ::msgcat::mcset it "Insert" [encoding convertfrom utf-8 "Inserisci"] ::msgcat::mcset ru "Insert" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\272\320\260"] ::msgcat::mcset sk "Insert" [encoding convertfrom utf-8 "Vlo\305\276i\305\245"] ::msgcat::mcset sq "Insert" [encoding convertfrom utf-8 "fute"] ::msgcat::mcset bg "insert point" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\275\320\270 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "insert point" [encoding convertfrom utf-8 "vlo\305\276 bod"] ::msgcat::mcset de "insert point" [encoding convertfrom utf-8 "Punkt einf\303\274gen"] ::msgcat::mcset el "insert point" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset it "insert point" [encoding convertfrom utf-8 "inserisci punto"] ::msgcat::mcset ru "insert point" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset sk "insert point" [encoding convertfrom utf-8 "vlo\305\276 bod"] ::msgcat::mcset sq "insert point" [encoding convertfrom utf-8 "fute piken"] ::msgcat::mcset bg "insert line point" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\275\320\270 \321\202\320\276\321\207\320\272\320\260 \320\276\321\202 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "insert line point" [encoding convertfrom utf-8 "vlo\305\276 bod k\305\231ivky"] ::msgcat::mcset de "insert line point" [encoding convertfrom utf-8 "Linienpunkt einf\303\274gen"] ::msgcat::mcset el "insert line point" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset it "insert line point" [encoding convertfrom utf-8 "inserisci punto di linea"] ::msgcat::mcset ru "insert line point" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \321\202\320\276\321\207\320\272\320\270 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "insert line point" [encoding convertfrom utf-8 "vlo\305\276 bod krivky"] ::msgcat::mcset sq "insert line point" [encoding convertfrom utf-8 "fute piken e rjeshtit"] ::msgcat::mcset bg "insert area border" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\275\320\270 \320\263\321\200\320\260\320\275\320\270\321\206\320\260 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "insert area border" [encoding convertfrom utf-8 "vlo\305\276 hranici plochy"] ::msgcat::mcset de "insert area border" [encoding convertfrom utf-8 "Fl\303\244chenrand einf\303\274gen"] ::msgcat::mcset el "insert area border" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\277\317\201\316\257\317\211\316\275 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset it "insert area border" [encoding convertfrom utf-8 "inserisci bordo dell'area"] ::msgcat::mcset ru "insert area border" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \320\263\321\200\320\260\320\275\320\270\321\206\321\213 \320\276\320\261\320\273\320\260\321\201\321\202\320\270"] ::msgcat::mcset sk "insert area border" [encoding convertfrom utf-8 "vlo\305\276 okraj plochy"] ::msgcat::mcset sq "insert area border" [encoding convertfrom utf-8 "fute kufirin e fushes"] ::msgcat::mcset bg "Select" [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270"] ::msgcat::mcset cz "Select" [encoding convertfrom utf-8 "Vyber"] ::msgcat::mcset de "Select" [encoding convertfrom utf-8 "Ausw\303\244hlen"] ::msgcat::mcset el "Select" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256"] ::msgcat::mcset en "Select" [encoding convertfrom utf-8 "Select"] ::msgcat::mcset es "Select" [encoding convertfrom utf-8 "Seleccionar"] ::msgcat::mcset it "Select" [encoding convertfrom utf-8 "Seleziona"] ::msgcat::mcset ru "Select" [encoding convertfrom utf-8 "\320\222\321\213\320\261\320\276\321\200"] ::msgcat::mcset sk "Select" [encoding convertfrom utf-8 "Vybra\305\245"] ::msgcat::mcset sq "Select" [encoding convertfrom utf-8 "selekto"] ::msgcat::mcset bg "scale scrap" [encoding convertfrom utf-8 "\320\274\320\260\321\211\320\260\320\261\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset cz "scale scrap" [encoding convertfrom utf-8 "m\304\233\305\231\303\255tko scrapu"] ::msgcat::mcset de "scale scrap" [encoding convertfrom utf-8 "Skizze skalieren"] ::msgcat::mcset el "scale scrap" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\256 \316\272\316\273\316\257\316\274\316\261\316\272\316\261 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "scale scrap" [encoding convertfrom utf-8 "riscala lo scrap"] ::msgcat::mcset ru "scale scrap" [encoding convertfrom utf-8 "\320\274\320\260\321\201\321\210\321\202\320\260\320\261\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "scale scrap" [encoding convertfrom utf-8 "mierka scrapu"] ::msgcat::mcset sq "scale scrap" [encoding convertfrom utf-8 "deponia e matjeve"] ::msgcat::mcset bg "insert sketch" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\262\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\320\270\321\206\320\260"] ::msgcat::mcset cz "insert sketch" [encoding convertfrom utf-8 "vlo\305\276 n\303\241\304\215rtek"] ::msgcat::mcset de "insert sketch" [encoding convertfrom utf-8 "Skizze einf\303\274gen"] ::msgcat::mcset el "insert sketch" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\317\207\316\265\316\264\316\257\316\277\317\205"] ::msgcat::mcset it "insert sketch" [encoding convertfrom utf-8 "inserisci disegno"] ::msgcat::mcset ru "insert sketch" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \321\204\320\276\320\275\320\260"] ::msgcat::mcset sk "insert sketch" [encoding convertfrom utf-8 "vlo\305\276 n\303\241\304\215rtok"] ::msgcat::mcset sq "insert sketch" [encoding convertfrom utf-8 "fute skicen"] ::msgcat::mcset bg "creating point" [encoding convertfrom utf-8 "\321\201\321\212\320\267\320\264\320\260\320\262\320\260\320\275\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "creating point" [encoding convertfrom utf-8 "vytvo\305\231en\303\255 bodu"] ::msgcat::mcset de "creating point" [encoding convertfrom utf-8 "Punkt erzeugen"] ::msgcat::mcset el "creating point" [encoding convertfrom utf-8 "\316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\257\316\261 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "creating point" [encoding convertfrom utf-8 "creating point"] ::msgcat::mcset es "creating point" [encoding convertfrom utf-8 "creando punto"] ::msgcat::mcset it "creating point" [encoding convertfrom utf-8 "creazione punto"] ::msgcat::mcset ru "creating point" [encoding convertfrom utf-8 "\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset sk "creating point" [encoding convertfrom utf-8 "vytvorenie bodu"] ::msgcat::mcset sq "creating point" [encoding convertfrom utf-8 "duke kriju piken"] ::msgcat::mcset bg "area changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202\321\202\320\260"] ::msgcat::mcset cz "area changes" [encoding convertfrom utf-8 "zm\304\233na parametr\305\257 oblasti"] ::msgcat::mcset de "area changes" [encoding convertfrom utf-8 "Fl\303\244chen\303\244nderungen"] ::msgcat::mcset el "area changes" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\255\317\202 \316\265\317\200\316\271\317\206\316\261\316\275\316\265\316\271\317\216\316\275"] ::msgcat::mcset en "area changes" [encoding convertfrom utf-8 "area changes"] ::msgcat::mcset es "area changes" [encoding convertfrom utf-8 "cambios de \303\241rea"] ::msgcat::mcset it "area changes" [encoding convertfrom utf-8 "modifiche di area"] ::msgcat::mcset ru "area changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \320\276\320\261\320\273\320\260\321\201\321\202\320\270"] ::msgcat::mcset sk "area changes" [encoding convertfrom utf-8 "zmena parametrov plochy"] ::msgcat::mcset sq "area changes" [encoding convertfrom utf-8 "ndrimet e fushes"] ::msgcat::mcset bg "point changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "point changes" [encoding convertfrom utf-8 "zm\304\233na parametr\305\257 bodu"] ::msgcat::mcset de "point changes" [encoding convertfrom utf-8 "Punkt\303\244nderungen"] ::msgcat::mcset el "point changes" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\255\317\202 \317\203\316\267\316\274\316\265\316\257\317\211\316\275"] ::msgcat::mcset en "point changes" [encoding convertfrom utf-8 "point changes"] ::msgcat::mcset es "point changes" [encoding convertfrom utf-8 "cambios de punto"] ::msgcat::mcset it "point changes" [encoding convertfrom utf-8 "modifiche di punto"] ::msgcat::mcset ru "point changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset sk "point changes" [encoding convertfrom utf-8 "zmena parametrov bodu"] ::msgcat::mcset sq "point changes" [encoding convertfrom utf-8 "ndrimet e pikes"] ::msgcat::mcset bg "Scrap sketch not inserted." [encoding convertfrom utf-8 "\320\235\320\265 \320\265 \320\262\320\274\321\212\320\272\320\275\320\260\321\202\320\260 \321\201\320\272\320\270\321\206\320\260 \320\262 \321\201\320\272\321\200\320\260\320\277\320\260."] ::msgcat::mcset cz "Scrap sketch not inserted." [encoding convertfrom utf-8 "N\303\241\304\215rtek nebyl vlo\305\276en."] ::msgcat::mcset de "Scrap sketch not inserted." [encoding convertfrom utf-8 "Skizze nicht eingef\303\274gt."] ::msgcat::mcset el "Scrap sketch not inserted." [encoding convertfrom utf-8 "\316\264\316\265\316\275 \316\265\316\271\317\203\316\256\317\207\316\270\316\267 \317\203\317\207\316\255\316\264\316\271\316\277 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "Scrap sketch not inserted." [encoding convertfrom utf-8 "Disegno non inerito."] ::msgcat::mcset ru "Scrap sketch not inserted." [encoding convertfrom utf-8 "\320\244\320\276\320\275 \321\201\320\272\321\200\320\260\320\277\320\260 \320\275\320\265 \320\262\321\201\321\202\320\260\320\262\320\273\320\265\320\275."] ::msgcat::mcset sk "Scrap sketch not inserted." [encoding convertfrom utf-8 "N\303\241\304\215rtok nebol vlo\305\276en\303\275."] ::msgcat::mcset sq "Scrap sketch not inserted." [encoding convertfrom utf-8 "skica e deponise nuk eshte futur"] ::msgcat::mcset bg "inserting scrap sketch" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\262\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\320\270\321\206\320\260 \320\262 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset cz "inserting scrap sketch" [encoding convertfrom utf-8 "vkl\303\241d\303\241m n\303\241\304\215rtek"] ::msgcat::mcset de "inserting scrap sketch" [encoding convertfrom utf-8 "F\303\274ge Skizze ein"] ::msgcat::mcset el "inserting scrap sketch" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "inserting scrap sketch" [encoding convertfrom utf-8 "inserimento disegno"] ::msgcat::mcset ru "inserting scrap sketch" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \321\204\320\276\320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "inserting scrap sketch" [encoding convertfrom utf-8 "vlo\305\276enie n\303\241\304\215rtku"] ::msgcat::mcset sq "inserting scrap sketch" [encoding convertfrom utf-8 "duke future skicen e deponise"] ::msgcat::mcset bg "deleting scrap sketch" [encoding convertfrom utf-8 "\320\270\320\267\321\202\321\200\320\270\320\262\320\260\320\275\320\265 \320\275\320\260 \321\201\320\272\320\270\321\206\320\260 \320\276\321\202 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset cz "deleting scrap sketch" [encoding convertfrom utf-8 "odstra\305\210uji n\303\241\304\215rtek"] ::msgcat::mcset de "deleting scrap sketch" [encoding convertfrom utf-8 "L\303\266sche Skizze"] ::msgcat::mcset el "deleting scrap sketch" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \317\203\317\207\316\265\316\264\316\257\316\277\317\205 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "deleting scrap sketch" [encoding convertfrom utf-8 "rimozione disegno"] ::msgcat::mcset ru "deleting scrap sketch" [encoding convertfrom utf-8 "\321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \321\204\320\276\320\275\320\260 \321\201\320\272\321\200\320\260\320\277\320\260"] ::msgcat::mcset sk "deleting scrap sketch" [encoding convertfrom utf-8 "odstr\303\241nenie n\303\241\304\215rtku"] ::msgcat::mcset sq "deleting scrap sketch" [encoding convertfrom utf-8 "duke fshire skicen e deponise"] ::msgcat::mcset bg "toggle image visibility" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\262\320\260\320\275\320\265 \320\275\320\260 \320\262\320\270\320\264\320\270\320\274\320\276\321\201\321\202\321\202\320\260 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "toggle image visibility" [encoding convertfrom utf-8 "p\305\231epnut\303\255 viditelnosti obr\303\241zku"] ::msgcat::mcset de "toggle image visibility" [encoding convertfrom utf-8 "Bildsichtbarkeit umschalten"] ::msgcat::mcset el "toggle image visibility" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\256 \316\277\317\201\316\261\317\204\317\214\317\204\316\267\317\204\316\261\317\202 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "toggle image visibility" [encoding convertfrom utf-8 "toggle image visibility"] ::msgcat::mcset es "toggle image visibility" [encoding convertfrom utf-8 "Cambiar visibilidad de la imagen"] ::msgcat::mcset it "toggle image visibility" [encoding convertfrom utf-8 "cambia visibilit\303\240 immagine"] ::msgcat::mcset ru "toggle image visibility" [encoding convertfrom utf-8 "\320\277\320\265\321\200\320\265\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265 \320\262\320\270\320\264\320\270\320\274\320\276\321\201\321\202\320\270 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "toggle image visibility" [encoding convertfrom utf-8 "prepni vidite\304\276nos\305\245 obr\303\241zku"] ::msgcat::mcset sq "toggle image visibility" [encoding convertfrom utf-8 "shikueshmeria e toggle-imazhit"] ::msgcat::mcset bg "grid - spacing %s" [encoding convertfrom utf-8 "\320\274\321\200\320\265\320\266\320\260 - \321\201\321\202\321\212\320\277\320\272\320\260 %s"] ::msgcat::mcset cz "grid - spacing %s" [encoding convertfrom utf-8 "m\305\231\303\255\305\276ka - odstup %s"] ::msgcat::mcset de "grid - spacing %s" [encoding convertfrom utf-8 "Gitterweite - %s"] ::msgcat::mcset el "grid - spacing %s" [encoding convertfrom utf-8 "\317\200\316\273\316\255\316\263\316\274\316\261 - \316\274\316\255\316\263\316\265\316\270\316\277\317\202 %s"] ::msgcat::mcset en "grid - spacing %s" [encoding convertfrom utf-8 "grid - spacing %s"] ::msgcat::mcset es "grid - spacing %s" [encoding convertfrom utf-8 "anchura cuadr\303\255cula %s"] ::msgcat::mcset it "grid - spacing %s" [encoding convertfrom utf-8 "reticolato - passo %s"] ::msgcat::mcset ru "grid - spacing %s" [encoding convertfrom utf-8 "\321\201\320\265\321\202\320\272\320\260 - \321\210\320\260\320\263 %s"] ::msgcat::mcset sk "grid - spacing %s" [encoding convertfrom utf-8 "sie\305\245 - rozostupy %s"] ::msgcat::mcset sq "grid - spacing %s" [encoding convertfrom utf-8 "%s hapesira e katroreve"] ::msgcat::mcset bg "station - %s" [encoding convertfrom utf-8 "\321\200\320\265\320\277\320\265\321\200 %s"] ::msgcat::mcset cz "station - %s" [encoding convertfrom utf-8 "m\304\233\305\231i\304\215sk\303\275 bod - %s"] ::msgcat::mcset de "station - %s" [encoding convertfrom utf-8 "Messpunkt - %s"] ::msgcat::mcset el "station - %s" [encoding convertfrom utf-8 "\317\203\316\267\316\274\316\265\316\257\316\277 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202 - %s"] ::msgcat::mcset en "station - %s" [encoding convertfrom utf-8 "station - %s"] ::msgcat::mcset es "station - %s" [encoding convertfrom utf-8 "estaci\303\263n %s"] ::msgcat::mcset it "station - %s" [encoding convertfrom utf-8 "caposaldo - %s"] ::msgcat::mcset ru "station - %s" [encoding convertfrom utf-8 "\320\277\320\270\320\272\320\265\321\202 - %s"] ::msgcat::mcset sk "station - %s" [encoding convertfrom utf-8 "m\304\233ra\304\215sk\303\275 bod - %s"] ::msgcat::mcset sq "station - %s" [encoding convertfrom utf-8 "stacioni - %s"] ::msgcat::mcset bg "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "\320\235\320\276\320\262\320\270\321\217\321\202 *.th2 \321\201\320\265 \320\275\321\203\320\266\320\264\320\260\320\265 \320\276\321\202 \321\201\321\212\321\205\321\200\320\260\320\275\321\217\320\262\320\260\320\275\320\265 \320\277\321\200\320\265\320\264\320\270 \320\264\320\260 \321\201\320\265 \320\262\320\274\321\212\320\272\320\275\320\265 \321\204\320\276\320\275\320\276\320\262\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265. \320\224\320\260 \321\201\320\265 \320\227\320\260\320\277\320\270\321\210\320\270 \321\201\320\265\320\263\320\260?"] ::msgcat::mcset cz "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "Nov\303\275 *.th2 soubor mus\303\255 b\303\275t ulo\305\276en p\305\231ed vlo\305\276en\303\255m podkladov\303\251ho obr\303\241zku. Ulo\305\276it nyn\303\255?"] ::msgcat::mcset de "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "Neue *.th2-Datei muss gespeichert werden, bevor ein Hintergrundbild eingef\303\274gt werden kann. Jetzt speichern?"] ::msgcat::mcset el "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "\316\244\316\277 \316\275\316\255\316\277 \316\261\317\201\317\207\316\265\316\257\316\277 *.th2 \317\200\317\201\316\255\317\200\316\265\316\271 \316\275\316\261 \316\261\317\200\316\277\316\270\316\267\316\272\316\265\317\205\317\204\316\265\316\257 \317\200\317\201\316\271\316\275 \316\265\316\271\317\203\316\261\317\207\316\270\316\265\316\257 \316\265\316\271\316\272\317\214\316\275\316\261 \317\206\317\214\316\275\317\204\316\277\317\205. \316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267 \317\204\317\216\317\201\316\261;"] ::msgcat::mcset en "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "New *.th2 file needs to be saved before inserting background image. Save it now?"] ::msgcat::mcset es "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "Hay que guardar el nuevo archivo .th2 antes de cargar una imagen de fondo. \302\277Guardar ahora?"] ::msgcat::mcset it "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "Il nuovo file *.th2 deve essere salvato prima di inserire immagini di background. Salvala ora?"] ::msgcat::mcset ru "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "\320\235\320\276\320\262\321\213\320\271 *.th2 \321\204\320\260\320\271\320\273 \320\275\321\203\320\266\320\264\320\260\320\265\321\202\321\201\321\217 \320\262 \321\201\320\276\321\205\321\200\320\260\320\275\320\265\320\275\320\270\320\270 \320\277\320\265\321\200\320\265\320\264 \320\262\321\201\321\202\320\260\320\262\320\272\320\276\320\271 \321\204\320\276\320\275\320\276\320\262\320\276\320\263\320\276 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217. \320\227\320\260\320\277\320\270\321\201\320\260\321\202\321\214 \321\201\320\265\320\271\321\207\320\260\321\201?"] ::msgcat::mcset sk "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "Pred vlo\305\276en\303\255m obr\303\241zku mus\303\255te nov\303\275 *.th2 s\303\272bor ulo\305\276i\305\245. Chcete tak urobi\305\245?"] ::msgcat::mcset sq "New *.th2 file needs to be saved before inserting background image. Save it now?" [encoding convertfrom utf-8 "arkivi I ri *.th2 duhet te ruhet para se te futet imazhi I prapavise.Te ruhet tani?"] ::msgcat::mcset bg "inserting image" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\262\320\260\320\275\320\265 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "inserting image" [encoding convertfrom utf-8 "vkl\303\241d\303\241m obr\303\241zek"] ::msgcat::mcset de "inserting image" [encoding convertfrom utf-8 "Bild einf\303\274gen"] ::msgcat::mcset el "inserting image" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "inserting image" [encoding convertfrom utf-8 "inserting image"] ::msgcat::mcset es "inserting image" [encoding convertfrom utf-8 "insertando imagen"] ::msgcat::mcset it "inserting image" [encoding convertfrom utf-8 "inserimento immagine"] ::msgcat::mcset ru "inserting image" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "inserting image" [encoding convertfrom utf-8 "vklad\303\241m obr\303\241zok"] ::msgcat::mcset sq "inserting image" [encoding convertfrom utf-8 "duke futur imazhin"] ::msgcat::mcset bg "removing image" [encoding convertfrom utf-8 "\320\274\320\260\321\205\320\260\320\275\320\265 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "removing image" [encoding convertfrom utf-8 "odstra\305\210uji obr\303\241zek"] ::msgcat::mcset de "removing image" [encoding convertfrom utf-8 "Bild entfernen"] ::msgcat::mcset el "removing image" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "removing image" [encoding convertfrom utf-8 "removing image"] ::msgcat::mcset es "removing image" [encoding convertfrom utf-8 "eliminando imagen"] ::msgcat::mcset it "removing image" [encoding convertfrom utf-8 "rimozione immagine"] ::msgcat::mcset ru "removing image" [encoding convertfrom utf-8 "\321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "removing image" [encoding convertfrom utf-8 "odstr\303\241nenie obr\303\241zku"] ::msgcat::mcset sq "removing image" [encoding convertfrom utf-8 "duke hequr imazhin"] ::msgcat::mcset bg "moving image" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\274\320\265\321\201\321\202\320\262\320\260\320\275\320\265 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "moving image" [encoding convertfrom utf-8 "p\305\231esunuji obr\303\241zek"] ::msgcat::mcset de "moving image" [encoding convertfrom utf-8 "Bild verschieben"] ::msgcat::mcset el "moving image" [encoding convertfrom utf-8 "\316\274\316\265\317\204\316\261\316\272\316\257\316\275\316\267\317\203\316\267 \316\265\316\271\316\272\317\214\316\275\316\261\317\202"] ::msgcat::mcset en "moving image" [encoding convertfrom utf-8 "moving image"] ::msgcat::mcset es "moving image" [encoding convertfrom utf-8 "moviendo imagen"] ::msgcat::mcset it "moving image" [encoding convertfrom utf-8 "spostamento immagine"] ::msgcat::mcset ru "moving image" [encoding convertfrom utf-8 "\320\277\320\265\321\200\320\265\320\274\320\265\321\211\320\265\320\275\320\270\320\265 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "moving image" [encoding convertfrom utf-8 "posun obr\303\241zku"] ::msgcat::mcset sq "moving image" [encoding convertfrom utf-8 "duke levizur imazhin"] ::msgcat::mcset bg "gamma correction" [encoding convertfrom utf-8 "\320\272\320\276\321\200\320\265\320\272\321\206\320\270\321\217 \320\275\320\260 \320\263\320\260\320\274\320\260\321\202\320\260"] ::msgcat::mcset cz "gamma correction" [encoding convertfrom utf-8 "gamma korekce"] ::msgcat::mcset de "gamma correction" [encoding convertfrom utf-8 "Gammakorrektur"] ::msgcat::mcset el "gamma correction" [encoding convertfrom utf-8 "gamma correction"] ::msgcat::mcset en "gamma correction" [encoding convertfrom utf-8 "gamma correction"] ::msgcat::mcset es "gamma correction" [encoding convertfrom utf-8 "corecci\303\263n gamma"] ::msgcat::mcset it "gamma correction" [encoding convertfrom utf-8 "gamma"] ::msgcat::mcset ru "gamma correction" [encoding convertfrom utf-8 "\320\272\320\276\321\200\321\200\320\265\320\272\321\206\320\270\321\217 \320\263\320\260\320\274\320\274\321\213"] ::msgcat::mcset sk "gamma correction" [encoding convertfrom utf-8 "gamma korekcia"] ::msgcat::mcset sq "gamma correction" [encoding convertfrom utf-8 "korekcioni gamma"] ::msgcat::mcset bg "Insert point" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "Insert point" [encoding convertfrom utf-8 "Vlo\305\276it bod"] ::msgcat::mcset de "Insert point" [encoding convertfrom utf-8 "Punkt einf\303\274gen"] ::msgcat::mcset el "Insert point" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Insert point" [encoding convertfrom utf-8 "Insert point"] ::msgcat::mcset es "Insert point" [encoding convertfrom utf-8 "Insertar punto"] ::msgcat::mcset it "Insert point" [encoding convertfrom utf-8 "Inserisci punto"] ::msgcat::mcset ru "Insert point" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214 \321\202\320\276\321\207\320\272\321\203"] ::msgcat::mcset sk "Insert point" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 bod"] ::msgcat::mcset sq "Insert point" [encoding convertfrom utf-8 "fute piken"] ::msgcat::mcset bg "Delete point" [encoding convertfrom utf-8 "\320\230\320\267\321\202\321\200\320\270\320\271 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "Delete point" [encoding convertfrom utf-8 "Smazat bod"] ::msgcat::mcset de "Delete point" [encoding convertfrom utf-8 "Punkt l\303\266schen"] ::msgcat::mcset el "Delete point" [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset en "Delete point" [encoding convertfrom utf-8 "Delete point"] ::msgcat::mcset es "Delete point" [encoding convertfrom utf-8 "Borrar punto"] ::msgcat::mcset it "Delete point" [encoding convertfrom utf-8 "Rimuovi"] ::msgcat::mcset ru "Delete point" [encoding convertfrom utf-8 "\320\243\320\264\320\260\320\273\320\270\321\202\321\214 \321\202\320\276\321\207\320\272\321\203"] ::msgcat::mcset sk "Delete point" [encoding convertfrom utf-8 "Odstr\303\241ni\305\245 bod"] ::msgcat::mcset sq "Delete point" [encoding convertfrom utf-8 "fshije piken"] ::msgcat::mcset bg "Split line" [encoding convertfrom utf-8 "\320\240\320\260\320\267\320\264\320\265\320\273\320\270 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "Split line" [encoding convertfrom utf-8 "Rozd\304\233lit k\305\231ivku"] ::msgcat::mcset de "Split line" [encoding convertfrom utf-8 "Linie teilen"] ::msgcat::mcset el "Split line" [encoding convertfrom utf-8 "\316\224\316\271\316\261\316\257\317\201\316\265\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "Split line" [encoding convertfrom utf-8 "Split line"] ::msgcat::mcset es "Split line" [encoding convertfrom utf-8 "Cortar l\303\255nea"] ::msgcat::mcset it "Split line" [encoding convertfrom utf-8 "Dividi"] ::msgcat::mcset ru "Split line" [encoding convertfrom utf-8 "\320\240\320\260\320\267\320\264\320\265\320\273\320\270\321\202\321\214 \320\273\320\270\320\275\320\270\321\216"] ::msgcat::mcset sk "Split line" [encoding convertfrom utf-8 "Rozdeli\305\245 krivku"] ::msgcat::mcset sq "Split line" [encoding convertfrom utf-8 "ndaje rjeshtin-vijen"] ::msgcat::mcset bg "deleting line point" [encoding convertfrom utf-8 "\320\230\320\267\321\202\321\200\320\270\320\271 \321\202\320\276\321\207\320\272\320\260 \320\276\321\202 \320\273\320\270\320\275\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "deleting line point" [encoding convertfrom utf-8 "mazan\303\255 bodu na k\305\231ivce"] ::msgcat::mcset de "deleting line point" [encoding convertfrom utf-8 "Linienpunkt l\303\266schen"] ::msgcat::mcset el "deleting line point" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \317\203\316\267\316\274\316\265\316\257\316\277\317\205 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "deleting line point" [encoding convertfrom utf-8 "deleting line point"] ::msgcat::mcset es "deleting line point" [encoding convertfrom utf-8 "borrando punto de l\303\255nea"] ::msgcat::mcset it "deleting line point" [encoding convertfrom utf-8 "rimozione punto di linea"] ::msgcat::mcset ru "deleting line point" [encoding convertfrom utf-8 "\320\243\320\264\320\260\320\273\320\270\321\202\321\214 \321\202\320\276\321\207\320\272\321\203 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "deleting line point" [encoding convertfrom utf-8 "mazanie bodu na \304\215iare"] ::msgcat::mcset sq "deleting line point" [encoding convertfrom utf-8 "duke fshire piken e rjeshtit-vijes"] ::msgcat::mcset bg "inserting area border" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\262\320\260\320\275\320\265 \320\275\320\260 \320\263\321\200\320\260\320\275\320\270\321\206\320\260 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "inserting area border" [encoding convertfrom utf-8 "vlo\305\276en\303\255 hranice oblasti"] ::msgcat::mcset de "inserting area border" [encoding convertfrom utf-8 "Fl\303\244chenrand einf\303\274gen"] ::msgcat::mcset el "inserting area border" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\277\317\201\316\257\316\277\317\205 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "inserting area border" [encoding convertfrom utf-8 "inserting area border"] ::msgcat::mcset es "inserting area border" [encoding convertfrom utf-8 "insertando l\303\255mite de \303\241rea"] ::msgcat::mcset it "inserting area border" [encoding convertfrom utf-8 "inserimento bordo area"] ::msgcat::mcset ru "inserting area border" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \320\263\321\200\320\260\320\275\320\270\321\206\321\213 \320\276\320\261\320\273\320\260\321\201\321\202\320\270"] ::msgcat::mcset sk "inserting area border" [encoding convertfrom utf-8 "vlo\305\276enie okraja plochy"] ::msgcat::mcset sq "inserting area border" [encoding convertfrom utf-8 "duke future kufirin e fushes"] ::msgcat::mcset bg "deleting area border" [encoding convertfrom utf-8 "\320\270\320\267\321\202\321\200\320\270\320\262\320\260\320\275\320\265 \320\275\320\260 \320\263\320\260\320\275\320\270\321\206\320\260 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "deleting area border" [encoding convertfrom utf-8 "mazan\303\255 hranice oblasti"] ::msgcat::mcset de "deleting area border" [encoding convertfrom utf-8 "Fl\303\244chenrand l\303\266schen"] ::msgcat::mcset el "deleting area border" [encoding convertfrom utf-8 "\317\214\317\201\316\271\316\277 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "deleting area border" [encoding convertfrom utf-8 "deleting area border"] ::msgcat::mcset es "deleting area border" [encoding convertfrom utf-8 "borrando l\303\255mite de \303\241rea"] ::msgcat::mcset it "deleting area border" [encoding convertfrom utf-8 "rimozione bordo area"] ::msgcat::mcset ru "deleting area border" [encoding convertfrom utf-8 "\321\203\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\263\321\200\320\260\320\275\320\270\321\206\321\213 \320\276\320\261\320\273\320\260\321\201\321\202\320\270"] ::msgcat::mcset sk "deleting area border" [encoding convertfrom utf-8 "mazanie okraja plochy"] ::msgcat::mcset sq "deleting area border" [encoding convertfrom utf-8 "duke fshire kufirin e fushes"] ::msgcat::mcset bg "creating area" [encoding convertfrom utf-8 "\321\201\321\212\320\267\320\264\320\260\320\262\320\260\320\275\320\265 \320\275\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset cz "creating area" [encoding convertfrom utf-8 "vytvo\305\231en\303\255 oblasti"] ::msgcat::mcset de "creating area" [encoding convertfrom utf-8 "Fl\303\244che erzeugen"] ::msgcat::mcset el "creating area" [encoding convertfrom utf-8 "\316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\257\316\261 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset en "creating area" [encoding convertfrom utf-8 "creating area"] ::msgcat::mcset es "creating area" [encoding convertfrom utf-8 "creando \303\241rea"] ::msgcat::mcset it "creating area" [encoding convertfrom utf-8 "creazione area"] ::msgcat::mcset ru "creating area" [encoding convertfrom utf-8 "\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\276\320\261\320\273\320\260\321\201\321\202\320\270"] ::msgcat::mcset sk "creating area" [encoding convertfrom utf-8 "vytvorenie plochy"] ::msgcat::mcset sq "creating area" [encoding convertfrom utf-8 "duke kriju fushen"] ::msgcat::mcset bg "creating line" [encoding convertfrom utf-8 "\321\201\321\212\320\267\320\264\320\260\320\262\320\260\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "creating line" [encoding convertfrom utf-8 "vytvo\305\231en\303\255 k\305\231ivky"] ::msgcat::mcset de "creating line" [encoding convertfrom utf-8 "Linie erzeugen"] ::msgcat::mcset el "creating line" [encoding convertfrom utf-8 "\316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\257\316\261 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "creating line" [encoding convertfrom utf-8 "creating line"] ::msgcat::mcset es "creating line" [encoding convertfrom utf-8 "creando l\303\255nea"] ::msgcat::mcset it "creating line" [encoding convertfrom utf-8 "creazione linea"] ::msgcat::mcset ru "creating line" [encoding convertfrom utf-8 "\321\201\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "creating line" [encoding convertfrom utf-8 "vytvorenie krivky"] ::msgcat::mcset sq "creating line" [encoding convertfrom utf-8 "duke kriju vijen apo rrjeshtin"] ::msgcat::mcset bg "line changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "line changes" [encoding convertfrom utf-8 "zm\304\233na parametr\305\257 k\305\231ivky"] ::msgcat::mcset de "line changes" [encoding convertfrom utf-8 "Linien\303\244nderung"] ::msgcat::mcset el "line changes" [encoding convertfrom utf-8 "\316\261\316\273\316\273\316\261\316\263\316\255\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "line changes" [encoding convertfrom utf-8 "line changes"] ::msgcat::mcset es "line changes" [encoding convertfrom utf-8 "cambios de l\303\255nea"] ::msgcat::mcset it "line changes" [encoding convertfrom utf-8 "modifiche di linea"] ::msgcat::mcset ru "line changes" [encoding convertfrom utf-8 "\320\270\320\267\320\274\320\265\320\275\320\265\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "line changes" [encoding convertfrom utf-8 "zmena parametrov krivky"] ::msgcat::mcset sq "line changes" [encoding convertfrom utf-8 "ndrimet e vijes"] ::msgcat::mcset bg "line closing" [encoding convertfrom utf-8 "\320\267\320\260\321\202\320\262\320\260\321\200\321\217\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "line closing" [encoding convertfrom utf-8 "uzav\305\231en\303\255 k\305\231ivky"] ::msgcat::mcset de "line closing" [encoding convertfrom utf-8 "Linie schlie\303\237en"] ::msgcat::mcset el "line closing" [encoding convertfrom utf-8 "\316\272\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "line closing" [encoding convertfrom utf-8 "line closing"] ::msgcat::mcset es "line closing" [encoding convertfrom utf-8 "cerrando l\303\255nea"] ::msgcat::mcset it "line closing" [encoding convertfrom utf-8 "chiusura linea"] ::msgcat::mcset ru "line closing" [encoding convertfrom utf-8 "\320\267\320\260\320\274\321\213\320\272\320\260\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "line closing" [encoding convertfrom utf-8 "uzavretie krivky"] ::msgcat::mcset sq "line closing" [encoding convertfrom utf-8 "mbyllja e vijes-rjeshtit"] ::msgcat::mcset bg "line opening" [encoding convertfrom utf-8 "\320\276\321\202\320\262\320\260\321\200\321\217\320\275\320\265 (\321\200\320\260\320\267\320\264\320\265\320\273\321\217\320\275\320\265) \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "line opening" [encoding convertfrom utf-8 "otev\305\231en\303\255 k\305\231ivky"] ::msgcat::mcset de "line opening" [encoding convertfrom utf-8 "Linie \303\266ffnen"] ::msgcat::mcset el "line opening" [encoding convertfrom utf-8 "\316\254\316\275\316\277\316\271\316\263\316\274\316\261 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "line opening" [encoding convertfrom utf-8 "line opening"] ::msgcat::mcset es "line opening" [encoding convertfrom utf-8 "abriendo l\303\255nea"] ::msgcat::mcset it "line opening" [encoding convertfrom utf-8 "apertura linea"] ::msgcat::mcset ru "line opening" [encoding convertfrom utf-8 "\321\200\320\260\320\267\320\274\321\213\320\272\320\260\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "line opening" [encoding convertfrom utf-8 "otvorenie krivky"] ::msgcat::mcset sq "line opening" [encoding convertfrom utf-8 "hapja e vijes-rjeshtit"] ::msgcat::mcset bg "inserting line point" [encoding convertfrom utf-8 "\320\262\320\274\321\212\320\272\320\262\320\260\320\275\320\265 \320\275\320\260 \321\202\320\276\321\207\320\272\320\260 \320\262 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "inserting line point" [encoding convertfrom utf-8 "vlo\305\276en\303\255 bodu k\305\231ivky"] ::msgcat::mcset de "inserting line point" [encoding convertfrom utf-8 "Linienpunkt einf\303\274gen"] ::msgcat::mcset el "inserting line point" [encoding convertfrom utf-8 "\316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\203\316\267\316\274\316\265\316\257\316\277 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "inserting line point" [encoding convertfrom utf-8 "inserting line point"] ::msgcat::mcset es "inserting line point" [encoding convertfrom utf-8 "insertando punto en la l\303\255nea"] ::msgcat::mcset it "inserting line point" [encoding convertfrom utf-8 "inserimento punto di linea"] ::msgcat::mcset ru "inserting line point" [encoding convertfrom utf-8 "\320\262\321\201\321\202\320\260\320\262\320\272\320\260 \321\202\320\276\321\207\320\272\320\270 \320\262 \320\273\320\270\320\275\320\270\321\216"] ::msgcat::mcset sk "inserting line point" [encoding convertfrom utf-8 "vlo\305\276enie bodu krivky"] ::msgcat::mcset sq "inserting line point" [encoding convertfrom utf-8 "duke futur piken e vijes"] ::msgcat::mcset bg "line ending" [encoding convertfrom utf-8 "\320\267\320\260\320\262\321\212\321\200\321\210\320\262\320\260\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "line ending" [encoding convertfrom utf-8 "ukon\304\215en\303\255 k\305\231ivky"] ::msgcat::mcset de "line ending" [encoding convertfrom utf-8 "Linienende"] ::msgcat::mcset el "line ending" [encoding convertfrom utf-8 "\317\204\316\255\316\273\316\277\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "line ending" [encoding convertfrom utf-8 "line ending"] ::msgcat::mcset es "line ending" [encoding convertfrom utf-8 "finalizando l\303\255nea"] ::msgcat::mcset it "line ending" [encoding convertfrom utf-8 "fine linea"] ::msgcat::mcset ru "line ending" [encoding convertfrom utf-8 "\320\267\320\260\320\262\320\265\321\200\321\210\320\265\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "line ending" [encoding convertfrom utf-8 "ukon\304\215enie krivky"] ::msgcat::mcset sq "line ending" [encoding convertfrom utf-8 "rjeshti ne perfundim"] ::msgcat::mcset bg "moving control point" [encoding convertfrom utf-8 "\320\277\321\200\320\265\320\274\320\265\321\201\321\202\320\262\320\260\320\275\320\265 \320\275\320\260 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\320\262\320\260\321\211\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "moving control point" [encoding convertfrom utf-8 "posun \305\231\303\255d\303\255c\303\255ho bodu"] ::msgcat::mcset de "moving control point" [encoding convertfrom utf-8 "Verschiebe Kontrollpunkt"] ::msgcat::mcset el "moving control point" [encoding convertfrom utf-8 "\316\274\316\265\317\204\316\261\316\262\316\261\316\273\316\273\317\214\316\274\316\265\316\275\316\277 \317\203\316\267\316\274\316\265\316\257\316\277 \316\265\316\273\316\255\316\263\317\207\316\277\317\205"] ::msgcat::mcset en "moving control point" [encoding convertfrom utf-8 "moving control point"] ::msgcat::mcset es "moving control point" [encoding convertfrom utf-8 "moviendo punto de control"] ::msgcat::mcset it "moving control point" [encoding convertfrom utf-8 "spostamento punto di controllo"] ::msgcat::mcset ru "moving control point" [encoding convertfrom utf-8 "\320\277\320\265\321\200\320\265\320\274\320\265\321\211\320\265\320\275\320\270\320\265 \321\203\320\277\321\200\320\260\320\262\320\273\321\217\321\216\321\211\320\265\320\271 \321\202\320\276\321\207\320\272\320\270"] ::msgcat::mcset sk "moving control point" [encoding convertfrom utf-8 "posun kontroln\303\251ho bodu"] ::msgcat::mcset sq "moving control point" [encoding convertfrom utf-8 "duke levize piken e kontrollit"] ::msgcat::mcset bg "split line" [encoding convertfrom utf-8 "\321\200\320\260\320\267\320\264\320\265\320\273\321\217\320\275\320\265 \320\275\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset cz "split line" [encoding convertfrom utf-8 "rozd\304\233lit k\305\231ivku"] ::msgcat::mcset de "split line" [encoding convertfrom utf-8 "Linie teilen"] ::msgcat::mcset el "split line" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\257\317\201\316\265\317\203\316\267 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset en "split line" [encoding convertfrom utf-8 "split line"] ::msgcat::mcset es "split line" [encoding convertfrom utf-8 "cortar l\303\255nea"] ::msgcat::mcset it "split line" [encoding convertfrom utf-8 "dividi la linea"] ::msgcat::mcset ru "split line" [encoding convertfrom utf-8 "\321\200\320\260\320\267\320\264\320\265\320\273\320\265\320\275\320\270\320\265 \320\273\320\270\320\275\320\270\320\270"] ::msgcat::mcset sk "split line" [encoding convertfrom utf-8 "rozdelenie \304\215iary"] ::msgcat::mcset sq "split line" [encoding convertfrom utf-8 "ndarja e pikes-rjeshtit"] ::msgcat::mcset bg "loading text editor ..." [encoding convertfrom utf-8 "\320\267\320\260\321\200\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\320\270\321\217 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200 ..."] ::msgcat::mcset cz "loading text editor ..." [encoding convertfrom utf-8 "nahr\303\241v\303\241m text editor ..."] ::msgcat::mcset de "loading text editor ..." [encoding convertfrom utf-8 "Lade Texteditor ..."] ::msgcat::mcset el "loading text editor ..." [encoding convertfrom utf-8 "\316\206\316\275\316\277\316\271\316\263\316\274\316\261 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205..."] ::msgcat::mcset en "loading text editor ..." [encoding convertfrom utf-8 "loading text editor ..."] ::msgcat::mcset es "loading text editor ..." [encoding convertfrom utf-8 "editor de texto ..."] ::msgcat::mcset it "loading text editor ..." [encoding convertfrom utf-8 "editor di testo ..."] ::msgcat::mcset ru "loading text editor ..." [encoding convertfrom utf-8 "\320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\260 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\260 ..."] ::msgcat::mcset sk "loading text editor ..." [encoding convertfrom utf-8 "na\304\215\303\255tavam textov\303\275 editor"] ::msgcat::mcset sq "loading text editor ..." [encoding convertfrom utf-8 "duke lexuar editorin e tekstit\342\200\246"] ::msgcat::mcset bg "Text Editor" [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\201\321\202\320\276\320\262 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200"] ::msgcat::mcset cz "Text Editor" [encoding convertfrom utf-8 "Text editor"] ::msgcat::mcset de "Text Editor" [encoding convertfrom utf-8 "Texteditor"] ::msgcat::mcset el "Text Editor" [encoding convertfrom utf-8 "\316\225\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256\317\202 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset en "Text Editor" [encoding convertfrom utf-8 "Text Editor"] ::msgcat::mcset es "Text Editor" [encoding convertfrom utf-8 "Editor de texto"] ::msgcat::mcset it "Text Editor" [encoding convertfrom utf-8 "Editor di testo"] ::msgcat::mcset ru "Text Editor" [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\271 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200"] ::msgcat::mcset sk "Text Editor" [encoding convertfrom utf-8 "Textov\303\275 editor"] ::msgcat::mcset sq "Text Editor" [encoding convertfrom utf-8 "editori I tekstit"] ::msgcat::mcset bg "Files" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273\320\276\320\262\320\265"] ::msgcat::mcset cz "Files" [encoding convertfrom utf-8 "Soubory"] ::msgcat::mcset de "Files" [encoding convertfrom utf-8 "Dateien"] ::msgcat::mcset el "Files" [encoding convertfrom utf-8 "\316\221\317\201\317\207\316\265\316\257\316\261"] ::msgcat::mcset en "Files" [encoding convertfrom utf-8 "Files"] ::msgcat::mcset es "Files" [encoding convertfrom utf-8 "Archivos"] ::msgcat::mcset it "Files" [encoding convertfrom utf-8 "File"] ::msgcat::mcset ru "Files" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273\321\213"] ::msgcat::mcset sk "Files" [encoding convertfrom utf-8 "S\303\272bory"] ::msgcat::mcset sq "Files" [encoding convertfrom utf-8 "fajlat-arkivi"] ::msgcat::mcset bg "Data table" [encoding convertfrom utf-8 "\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \321\201 \320\264\320\260\320\275\320\275\320\270"] ::msgcat::mcset cz "Data table" [encoding convertfrom utf-8 "Datov\303\241 tabulka"] ::msgcat::mcset de "Data table" [encoding convertfrom utf-8 "Datentabelle"] ::msgcat::mcset el "Data table" [encoding convertfrom utf-8 "\316\240\316\257\316\275\316\261\316\272\316\261\317\202 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\317\211\316\275"] ::msgcat::mcset en "Data table" [encoding convertfrom utf-8 "Data table"] ::msgcat::mcset es "Data table" [encoding convertfrom utf-8 "Tabla de datos"] ::msgcat::mcset it "Data table" [encoding convertfrom utf-8 "Tabella dei dati"] ::msgcat::mcset ru "Data table" [encoding convertfrom utf-8 "\320\242\320\260\320\261\320\273\320\270\321\206\320\260 \320\264\320\260\320\275\320\275\321\213\321\205"] ::msgcat::mcset sk "Data table" [encoding convertfrom utf-8 "D\303\241tov\303\241 tabu\304\276ka"] ::msgcat::mcset sq "Data table" [encoding convertfrom utf-8 "tabela e te dhenave"] ::msgcat::mcset bg "Search & Replace" [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \320\270 \320\267\320\260\320\274\321\217\320\275\320\260"] ::msgcat::mcset cz "Search & Replace" [encoding convertfrom utf-8 "Naj\303\255t & Nahradit"] ::msgcat::mcset de "Search & Replace" [encoding convertfrom utf-8 "Suchen & ersetzen"] ::msgcat::mcset el "Search & Replace" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\272\316\261\316\271 \316\261\316\275\317\204\316\271\316\272\316\261\317\204\316\254\317\203\317\204\316\261\317\203\316\267"] ::msgcat::mcset en "Search & Replace" [encoding convertfrom utf-8 "Search & Replace"] ::msgcat::mcset es "Search & Replace" [encoding convertfrom utf-8 "Buscar y cambiar"] ::msgcat::mcset it "Search & Replace" [encoding convertfrom utf-8 "Cerca e sostituisci"] ::msgcat::mcset ru "Search & Replace" [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272 \320\270 \320\227\320\260\320\274\320\265\320\275\320\260"] ::msgcat::mcset sk "Search & Replace" [encoding convertfrom utf-8 "N\303\241jdi a Nahra\304\217"] ::msgcat::mcset sq "Search & Replace" [encoding convertfrom utf-8 "kerko dhe ndero vendin"] ::msgcat::mcset bg "Switch open files." [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\276\321\202\320\262\320\276\321\200\320\265\320\275\320\270\321\217\321\202 \321\204\320\260\320\271\320\273"] ::msgcat::mcset cz "Switch open files." [encoding convertfrom utf-8 "P\305\231ep\303\255na\304\215 otev\305\231en\303\275ch soubor\305\257."] ::msgcat::mcset de "Switch open files." [encoding convertfrom utf-8 "Ge\303\266ffnete Dateien wechseln."] ::msgcat::mcset el "Switch open files." [encoding convertfrom utf-8 "\316\227 \316\273\316\257\317\203\317\204\316\261 \316\264\316\265\316\257\317\207\316\275\316\265\316\271 \317\204\316\261 \316\261\316\275\316\277\316\271\316\272\317\204\316\254 \316\261\317\201\317\207\316\265\316\257\316\261. \316\225\317\200\316\271\316\273\316\255\316\276\316\265\317\204\316\265 \316\261\317\205\317\204\317\214 \317\200\316\277\317\205 \317\203\316\261\317\202 \316\265\316\275\316\264\316\271\316\261\317\206\316\255\317\201\316\265\316\271."] ::msgcat::mcset en "Switch open files." [encoding convertfrom utf-8 "This list shows open files. Click on the one you are interested."] ::msgcat::mcset es "Switch open files." [encoding convertfrom utf-8 "Esta lista muestra los archivos abiertos. Haz clic en el que te interese."] ::msgcat::mcset it "Switch open files." [encoding convertfrom utf-8 "Cambia tra i file aperti."] ::msgcat::mcset ru "Switch open files." [encoding convertfrom utf-8 "\320\237\320\276\320\274\320\265\320\275\321\217\321\202\321\214 \320\276\321\202\320\272\321\200\321\213\321\202\321\213\320\271 \321\204\320\260\320\271\320\273."] ::msgcat::mcset sk "Switch open files." [encoding convertfrom utf-8 "Prep\303\255na\304\215 medzi otvoren\303\275mi s\303\272bormi."] ::msgcat::mcset sq "Switch open files." [encoding convertfrom utf-8 "kjo liste tregon fajlat e hapura. Kliko ne ate te cilen je I interesuar."] ::msgcat::mcset bg "Encoding" [encoding convertfrom utf-8 "\320\232\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260"] ::msgcat::mcset cz "Encoding" [encoding convertfrom utf-8 "K\303\263dov\303\241n\303\255"] ::msgcat::mcset de "Encoding" [encoding convertfrom utf-8 "Zeichenkodierung"] ::msgcat::mcset el "Encoding" [encoding convertfrom utf-8 "\316\232\317\211\316\264\316\271\316\272\316\277\317\203\316\265\316\273\316\257\316\264\316\261"] ::msgcat::mcset en "Encoding" [encoding convertfrom utf-8 "Encoding"] ::msgcat::mcset es "Encoding" [encoding convertfrom utf-8 "Codificaci\303\263n"] ::msgcat::mcset it "Encoding" [encoding convertfrom utf-8 "Encoding"] ::msgcat::mcset ru "Encoding" [encoding convertfrom utf-8 "\320\232\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260"] ::msgcat::mcset sk "Encoding" [encoding convertfrom utf-8 "K\303\263dovanie"] ::msgcat::mcset sq "Encoding" [encoding convertfrom utf-8 "de-kodimi"] ::msgcat::mcset bg "Change to" [encoding convertfrom utf-8 "\320\237\321\200\320\276\320\274\320\265\320\275\320\270 \320\275\320\260"] ::msgcat::mcset cz "Change to" [encoding convertfrom utf-8 "Zm\304\233nit na"] ::msgcat::mcset de "Change to" [encoding convertfrom utf-8 "\303\204ndern in"] ::msgcat::mcset el "Change to" [encoding convertfrom utf-8 "\316\221\316\273\316\273\316\261\316\263\316\256 \317\203\316\265"] ::msgcat::mcset en "Change to" [encoding convertfrom utf-8 "Change to"] ::msgcat::mcset es "Change to" [encoding convertfrom utf-8 "Cambiar a"] ::msgcat::mcset it "Change to" [encoding convertfrom utf-8 "Cambia a"] ::msgcat::mcset ru "Change to" [encoding convertfrom utf-8 "\320\230\320\267\320\274\320\265\320\275\320\270\321\202\321\214 \320\275\320\260"] ::msgcat::mcset sk "Change to" [encoding convertfrom utf-8 "Zmeni\305\245 na"] ::msgcat::mcset sq "Change to" [encoding convertfrom utf-8 "ndero ne"] ::msgcat::mcset bg "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "\320\227\320\260 \320\267\320\260\320\264\320\260\320\262\320\275\320\265 \320\275\320\260 \320\272\320\276\320\264\320\270\321\200\320\260\320\276\320\262\320\272\320\260\321\202\320\260 \320\275\320\260 \321\204\320\260\320\271\320\273\320\260, \320\262\321\212\320\262\320\265\320\264\320\265\321\202\320\265 \320\270\320\274\320\265\321\202\320\276 \320\275\320\260 \320\272\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\260\321\202\320\260 \320\270 \320\275\320\260\321\202\320\270\321\201\320\275\320\265\321\202\320\265 \320\261\321\203\321\202\320\276\320\275\320\260 <\320\237\321\200\320\276\320\274\321\217\320\275\320\260>"] ::msgcat::mcset cz "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "Nastaven\303\255 k\303\263dov\303\241n\303\255 - vyberte k\303\263dov\303\241n\303\255 a stiskn\304\233te tla\304\215\303\255tko ."] ::msgcat::mcset de "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "Um Zeichenkodierung zu \303\244ndern, gebe den Namen der Kodierung ein und dr\303\274cke den Knopf."] ::msgcat::mcset el "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "\316\223\316\271\316\261 \317\201\317\215\316\270\316\274\316\271\317\203\316\267 \316\272\317\211\316\264\316\271\316\272\316\277\317\203\316\265\316\273\316\257\316\264\316\261\317\202, \316\265\316\271\317\203\316\254\316\263\316\265\317\204\316\265 \317\214\316\275\316\277\316\274\316\261 \316\272\316\261\316\271 \317\200\316\261\317\204\316\256\317\203\317\204\316\265 \317\204\316\277 \316\272\316\277\317\205\316\274\317\200\316\257 <\316\221\316\273\316\273\316\261\316\263\316\256>"] ::msgcat::mcset en "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "To set file encoding, type encoding name and press button."] ::msgcat::mcset es "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "Para ajustar la codificaci\303\263n, escoje la que quieras y pulsa ."] ::msgcat::mcset it "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "Per impostare l'encoding, scrivi il nome dell'encoding e premi il bottone "] ::msgcat::mcset ru "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "\320\224\320\273\321\217 \320\267\320\260\320\264\320\260\320\275\320\270\321\217 \320\272\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\270 \321\204\320\260\320\271\320\273\320\260 \320\262\320\262\320\265\320\264\320\270\321\202\320\265 \320\270\320\274\321\217 \320\272\320\276\320\264\320\270\321\200\320\276\320\262\320\272\320\270 \320\270 \320\275\320\260\320\266\320\274\320\270\321\202\320\265 \320\272\320\275\320\276\320\277\320\272\321\203 <\320\230\320\267\320\274\320\265\320\275\320\270\321\202\321\214>."] ::msgcat::mcset sk "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "Na nastavenie k\303\263dovania, vlo\305\276te identifik\303\241tor k\303\263dovania a stla\304\215te ."] ::msgcat::mcset sq "To set file encoding, type encoding name and press button." [encoding convertfrom utf-8 "per te vendos fajlin per dekodim, shtype emrin per dekodim dhe kliko butonin "] ::msgcat::mcset bg "Scan data format" [encoding convertfrom utf-8 "\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270 \321\204\320\276\321\200\320\274\320\260\321\202\320\260 \320\275\320\260 \320\264\320\260\320\275\320\275\320\270\321\202\320\265"] ::msgcat::mcset cz "Scan data format" [encoding convertfrom utf-8 "Skenovat form\303\241t dat"] ::msgcat::mcset de "Scan data format" [encoding convertfrom utf-8 "Datenformat einlesen"] ::msgcat::mcset el "Scan data format" [encoding convertfrom utf-8 "\316\210\316\273\316\265\316\263\317\207\316\277\317\202 \316\274\316\277\317\201\317\206\316\256\317\202 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\317\211\316\275"] ::msgcat::mcset en "Scan data format" [encoding convertfrom utf-8 "Scan data format"] ::msgcat::mcset es "Scan data format" [encoding convertfrom utf-8 "Escanear formato de datos"] ::msgcat::mcset it "Scan data format" [encoding convertfrom utf-8 "Imposta formato dati"] ::msgcat::mcset ru "Scan data format" [encoding convertfrom utf-8 "\320\236\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\321\214 \321\204\320\276\321\200\320\274\320\260\321\202 \320\264\320\260\320\275\320\275\321\213\321\205"] ::msgcat::mcset sk "Scan data format" [encoding convertfrom utf-8 "N\303\241jdi form\303\241t d\303\241t"] ::msgcat::mcset sq "Scan data format" [encoding convertfrom utf-8 "skano formatin e shenimeve"] ::msgcat::mcset bg "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\275\320\276 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\270 \321\204\320\276\321\200\320\274\320\260\321\202\320\260 \320\275\320\260 \320\264\320\260\320\275\320\275\320\270\321\202\320\265 \320\270 \320\277\321\200\320\265\321\203\321\201\321\202\321\200\320\276\320\271 \320\277\320\276\320\273\320\265\321\202\320\260\321\202\320\260 \320\267\320\260 \320\262\321\212\320\262\320\265\320\266\320\264\320\260\320\275\320\265."] ::msgcat::mcset cz "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "P\305\231e\304\215te form\303\241t dat v souboru a uprav\303\255 pole pro vkl\303\241d\303\241n\303\255 m\304\233\305\231en\303\255."] ::msgcat::mcset de "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "Datenformat einlesen und Messdateneditor anpassen."] ::msgcat::mcset el "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "\316\225\316\273\316\255\316\263\317\207\316\265\316\271 \317\204\316\267\316\275 \317\203\316\265\316\271\317\201\316\254 \317\204\317\211\316\275 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\317\211\316\275 \316\272\316\261\316\271 \316\276\316\261\316\275\316\261\317\203\317\205\316\275\317\204\316\254\317\203\317\203\316\265\316\271 \316\261\317\205\317\204\317\214\316\274\316\261\317\204\316\261 \317\204\316\261 textbox \316\263\316\271\316\261 \316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\317\211\316\275."] ::msgcat::mcset en "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "Scans data order and rebuilds data insertion textboxes accordingly."] ::msgcat::mcset es "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "Ajusta las casillas al orden en que has tomado tus datos."] ::msgcat::mcset it "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "Imposta il formato dati e ricostruisci la tabella inserimento dati."] ::msgcat::mcset ru "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\270 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\270\321\202\321\214 \321\204\320\276\321\200\320\274\320\260\321\202 \320\264\320\260\320\275\320\275\321\213\321\205 \320\270 \320\277\320\265\321\200\320\265\321\201\321\202\321\200\320\276\320\270\321\202\321\214 \320\277\320\276\320\273\321\217 \320\262\320\262\320\276\320\264\320\260."] ::msgcat::mcset sk "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "Na\304\215\303\255ta form\303\241t d\303\241t z predch\303\241dzaj\303\272cich riadkov a pr\303\255slu\305\241ne zmen\303\255 panel na vkladanie d\303\241t."] ::msgcat::mcset sq "Scan data format and rebuild centerline data insertion tool." [encoding convertfrom utf-8 "skanon formatin e shenimeve dhe rinderton tekst-katroret per futjen e shenimeve net e njejten kohe"] ::msgcat::mcset bg "Enter station names" [encoding convertfrom utf-8 "\320\222\321\212\320\262\320\265\320\266\320\264\320\260\320\275\320\265 \320\275\320\260 \320\270\320\274\320\265\321\202\320\276 \320\275\320\260 \321\200\320\265\320\277\320\265\321\200\320\260\320\275\320\260\321\202\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset cz "Enter station names" [encoding convertfrom utf-8 "Zad\303\241vat n\303\241zvy bod\305\257"] ::msgcat::mcset de "Enter station names" [encoding convertfrom utf-8 "Messpunktnamen eingeben"] ::msgcat::mcset el "Enter station names" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\277\316\275\316\277\316\274\316\254\317\204\317\211\316\275 \317\203\316\267\316\274\316\265\316\257\317\211\316\275 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202"] ::msgcat::mcset en "Enter station names" [encoding convertfrom utf-8 "Enter station names"] ::msgcat::mcset es "Enter station names" [encoding convertfrom utf-8 "Nombrar estaciones"] ::msgcat::mcset it "Enter station names" [encoding convertfrom utf-8 "Scrivi nomi capisaldi"] ::msgcat::mcset ru "Enter station names" [encoding convertfrom utf-8 "\320\222\320\262\320\276\320\264 \320\275\320\276\320\274\320\265\321\200\320\260 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\265\320\263\320\276 \320\277\320\270\320\272\320\265\321\202\320\260"] ::msgcat::mcset sk "Enter station names" [encoding convertfrom utf-8 "Zad\303\241vanie n\303\241zvov bodov"] ::msgcat::mcset sq "Enter station names" [encoding convertfrom utf-8 "futi emrat e stacioneve"] ::msgcat::mcset bg "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "\320\241\320\273\320\276\320\266\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260, \320\260\320\272\320\276 \320\270\321\201\320\272\320\260\321\202\320\265 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\270\321\202\320\265 \320\270\320\274\320\265\320\275\320\260 \320\275\320\260 \321\200\320\265\320\277\320\265\321\200\320\270 \320\264\320\260 \321\201\320\265 \320\262\321\212\320\262\320\265\320\266\320\264\320\260\321\202 \320\260\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\275\320\276."] ::msgcat::mcset cz "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "Za\305\241krtn\304\233te pokud chcete zad\303\241vat n\303\241zev pro ka\305\276d\303\275 m\304\233\305\231i\304\215sk\303\275 bod."] ::msgcat::mcset de "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "Ankreuzen, wenn du Messpunktnamen f\303\274r jede Strecke eingeben willst."] ::msgcat::mcset el "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\255\316\276\317\204\316\265 \316\263\316\271\316\261 \316\265\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \317\204\317\211\316\275 \316\277\316\275\316\277\316\274\316\254\317\204\317\211\316\275 \317\204\317\211\316\275 \317\203\316\267\316\274\316\265\316\257\317\211\316\275 \317\207\316\261\317\201\317\204\316\277\316\263\317\201\316\254\317\206\316\267\317\203\316\267\317\202 \316\263\316\271\316\261 \317\204\316\277 \316\272\316\254\316\270\316\265 \316\264\316\271\316\254\316\275\317\205\317\203\316\274\316\261."] ::msgcat::mcset en "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "Check if you want to insert station names for each shot."] ::msgcat::mcset es "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "Marcar si se quiere dar un nombre a cada tirada topo."] ::msgcat::mcset it "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "Attiva per inserire i nomi dei capisaldi per ogni tratta."] ::msgcat::mcset ru "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\276\321\202\320\274\320\265\321\202\320\272\321\203, \320\265\321\201\320\273\320\270 \321\205\320\276\321\202\320\270\321\202\320\265, \321\207\321\202\320\276\320\261\321\213 \320\277\321\200\320\276\320\270\321\201\321\205\320\276\320\264\320\270\320\273 \320\260\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\321\201\320\272\320\270\320\271 \320\262\320\262\320\276\320\264 \320\275\320\276\320\274\320\265\321\200\320\260 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\265\320\263\320\276 \320\277\320\270\320\272\320\265\321\202\320\260."] ::msgcat::mcset sk "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "Za\305\241krtnite pokia\304\276 chcete vklada\305\245 aj men\303\241 bodov pre ka\305\276d\303\272 z\303\241meru."] ::msgcat::mcset sq "Check if you want to insert station names for each shot." [encoding convertfrom utf-8 "kontrollo nese deshiron ti fusesh emrat e stacioneve per secilin foto"] ::msgcat::mcset bg "Auto format selection" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\320\275 \320\270\320\267\320\261\320\276\321\200 \320\275\320\260 \321\204\320\276\321\200\320\274\320\260\321\202."] ::msgcat::mcset cz "Auto format selection" [encoding convertfrom utf-8 "Auto form\303\241tov\303\241n\303\255 v\303\275b\304\233ru"] ::msgcat::mcset de "Auto format selection" [encoding convertfrom utf-8 "Auswahl formatieren"] ::msgcat::mcset el "Auto format selection" [encoding convertfrom utf-8 "\316\221\317\205\317\204\317\214\316\274\316\261\317\204\316\267 \316\274\316\277\317\201\317\206\316\277\317\200\316\277\316\257\316\267\317\203\316\267 \316\265\317\200\316\271\316\273\316\277\316\263\316\256\317\202"] ::msgcat::mcset en "Auto format selection" [encoding convertfrom utf-8 "Auto format selection"] ::msgcat::mcset es "Auto format selection" [encoding convertfrom utf-8 "Autoformatear selecci\303\263n"] ::msgcat::mcset it "Auto format selection" [encoding convertfrom utf-8 "Selezione formato automatico."] ::msgcat::mcset ru "Auto format selection" [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\265\321\201\321\202\321\200\320\276\320\270\321\202\321\214 \320\262\321\213\320\264\320\265\320\273\320\265\320\275\320\275\321\213\320\265 \320\264\320\260\320\275\320\275\321\213\320\265"] ::msgcat::mcset sk "Auto format selection" [encoding convertfrom utf-8 "Naform\303\241tuj v\303\275ber"] ::msgcat::mcset sq "Auto format selection" [encoding convertfrom utf-8 "zgjedhja automatike e formatit"] ::msgcat::mcset bg "Format selection to given table." [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\276\321\200 \320\275\320\260 \321\204\320\276\321\200\320\274\320\260\321\202 \320\267\320\260 \320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\260 \321\202\320\260\320\261\320\273\320\270\321\206\320\260"] ::msgcat::mcset cz "Format selection to given table." [encoding convertfrom utf-8 "Naform\303\241tuje v\303\275b\304\233r do tabulky."] ::msgcat::mcset de "Format selection to given table." [encoding convertfrom utf-8 "Formatiere Auswahl zur gegebenen Tabelle."] ::msgcat::mcset el "Format selection to given table." [encoding convertfrom utf-8 "\316\234\316\277\317\201\317\206\316\277\317\200\316\277\316\257\316\267\317\203\316\267 \316\265\317\200\316\271\316\273\316\277\316\263\316\256\317\202 \317\203\317\215\316\274\317\206\317\211\316\275\316\261 \316\274\316\265 \317\204\316\277 \316\264\316\265\316\264\316\277\316\274\316\255\316\275\316\277 \317\200\316\257\316\275\316\261\316\272\316\261."] ::msgcat::mcset en "Format selection to given table." [encoding convertfrom utf-8 "Format selection to given table."] ::msgcat::mcset es "Format selection to given table." [encoding convertfrom utf-8 "Formatea la seleccion (ajusta tabuladores, etc)."] ::msgcat::mcset it "Format selection to given table." [encoding convertfrom utf-8 "Imposta selezione alla tabella specificata."] ::msgcat::mcset ru "Format selection to given table." [encoding convertfrom utf-8 "\320\237\321\200\320\270\320\262\320\265\321\201\321\202\320\270 \320\262\321\213\320\264\320\265\320\273\320\265\320\275\320\275\321\213\320\265 \320\264\320\260\320\275\320\275\321\213\320\265 \320\272 \320\267\320\260\320\264\320\260\320\275\320\275\320\276\320\274\321\203 \321\204\320\276\321\200\320\274\320\260\321\202\321\203."] ::msgcat::mcset sk "Format selection to given table." [encoding convertfrom utf-8 "Naform\303\241tuje v\303\275ber do d\303\241tovej tabu\304\276ky."] ::msgcat::mcset sq "Format selection to given table." [encoding convertfrom utf-8 "zgjedhja e formatit per tabelen e dhene"] ::msgcat::mcset bg "search" [encoding convertfrom utf-8 "\321\202\321\212\321\200\321\201\320\265\320\275\320\265"] ::msgcat::mcset cz "search" [encoding convertfrom utf-8 "hledat"] ::msgcat::mcset de "search" [encoding convertfrom utf-8 "Suche"] ::msgcat::mcset el "search" [encoding convertfrom utf-8 "\316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267"] ::msgcat::mcset en "search" [encoding convertfrom utf-8 "search"] ::msgcat::mcset es "search" [encoding convertfrom utf-8 "buscar"] ::msgcat::mcset it "search" [encoding convertfrom utf-8 "cerca"] ::msgcat::mcset ru "search" [encoding convertfrom utf-8 "\320\277\320\276\320\270\321\201\320\272"] ::msgcat::mcset sk "search" [encoding convertfrom utf-8 "h\304\276adaj"] ::msgcat::mcset sq "search" [encoding convertfrom utf-8 "kerko"] ::msgcat::mcset bg "Search expression." [encoding convertfrom utf-8 "\320\230\320\267\321\200\320\260\320\267 \320\267\320\260 \321\202\321\212\321\200\321\201\320\265\320\275\320\265"] ::msgcat::mcset cz "Search expression." [encoding convertfrom utf-8 "Hledan\303\275 v\303\275raz."] ::msgcat::mcset de "Search expression." [encoding convertfrom utf-8 "Suche Muster."] ::msgcat::mcset el "Search expression." [encoding convertfrom utf-8 "\316\240\316\273\316\267\316\272\317\204\317\201\316\277\316\273\316\277\316\263\316\256\317\203\316\265\317\204\316\265 \317\204\316\271\317\202 \316\273\316\255\316\276\316\265\316\271\317\202 \316\263\316\271\316\261 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267."] ::msgcat::mcset en "Search expression." [encoding convertfrom utf-8 "Enter word(s) to search for."] ::msgcat::mcset es "Search expression." [encoding convertfrom utf-8 "Introducir palabra(s) a buscar."] ::msgcat::mcset it "Search expression." [encoding convertfrom utf-8 "Testo da cercare."] ::msgcat::mcset ru "Search expression." [encoding convertfrom utf-8 "\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\277\320\276\320\270\321\201\320\272\320\260."] ::msgcat::mcset sk "Search expression." [encoding convertfrom utf-8 "H\304\276adan\303\275 v\303\275raz."] ::msgcat::mcset sq "Search expression." [encoding convertfrom utf-8 "shkruaje fjalen per tu kerkuar"] ::msgcat::mcset bg "replace" [encoding convertfrom utf-8 "\320\267\320\260\320\274\321\217\320\275\320\260"] ::msgcat::mcset cz "replace" [encoding convertfrom utf-8 "nahradit"] ::msgcat::mcset de "replace" [encoding convertfrom utf-8 "Ersetze"] ::msgcat::mcset el "replace" [encoding convertfrom utf-8 "\316\221\316\275\317\204\316\271\316\272\316\261\317\204\316\254\317\203\317\204\316\261\317\203\316\267"] ::msgcat::mcset en "replace" [encoding convertfrom utf-8 "replace"] ::msgcat::mcset es "replace" [encoding convertfrom utf-8 "cambiar"] ::msgcat::mcset it "replace" [encoding convertfrom utf-8 "sostituisci"] ::msgcat::mcset ru "replace" [encoding convertfrom utf-8 "\320\267\320\260\320\274\320\265\320\275\320\260"] ::msgcat::mcset sk "replace" [encoding convertfrom utf-8 "nahradi\305\245"] ::msgcat::mcset sq "replace" [encoding convertfrom utf-8 "ndero vendin"] ::msgcat::mcset bg "Check whether to replace found expression." [encoding convertfrom utf-8 "\320\241\320\273\320\276\320\266\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260, \320\260\320\272\320\276 \320\270\321\201\320\272\320\260\321\202\320\265 \320\264\320\260 \321\201\320\265 \320\270\320\267\320\262\321\212\321\200\321\210\320\270 \320\267\320\260\320\274\321\217\320\275\320\260."] ::msgcat::mcset cz "Check whether to replace found expression." [encoding convertfrom utf-8 "Za\305\241krtn\304\233te pokud chcete nahradit nalezen\303\251 v\303\275razy."] ::msgcat::mcset el "Check whether to replace found expression." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\255\316\276\317\204\316\265 \316\263\316\271\316\261 \316\261\316\275\317\204\316\271\316\272\316\261\317\204\316\254\317\203\317\204\316\261\317\203\316\267 \317\204\316\267\317\202 \316\265\317\205\317\201\316\265\316\270\316\265\316\257\317\203\316\261\317\202 \317\200\316\265\317\201\316\257\317\200\317\204\317\211\317\203\316\267\317\202."] ::msgcat::mcset en "Check whether to replace found expression." [encoding convertfrom utf-8 "Check whether to replace found expression."] ::msgcat::mcset es "Check whether to replace found expression." [encoding convertfrom utf-8 "Marcar para cambiar los lo encontrado por lo que se escriba aqu\303\255."] ::msgcat::mcset it "Check whether to replace found expression." [encoding convertfrom utf-8 "Attiva per sostituire il testo trovato."] ::msgcat::mcset ru "Check whether to replace found expression." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\276\321\202\320\274\320\265\321\202\320\272\321\203, \320\265\321\201\320\273\320\270 \321\205\320\276\321\202\320\270\321\202\320\265 \320\277\321\200\320\276\320\270\320\267\320\262\320\265\321\201\321\202\320\270 \320\267\320\260\320\274\320\265\320\275\321\203."] ::msgcat::mcset sk "Check whether to replace found expression." [encoding convertfrom utf-8 "Za\305\241krtn\303\272\305\245 pokia\304\276 sa m\303\241 n\303\241jden\303\275 v\303\275raz nahradi\305\245 in\303\275m."] ::msgcat::mcset sq "Check whether to replace found expression." [encoding convertfrom utf-8 "kontrollo a duhet te ndrohet fjalia e gjetur"] ::msgcat::mcset bg "Replace expression." [encoding convertfrom utf-8 "\320\230\320\267\321\200\320\260\320\267 \320\267\320\260 \320\267\320\260\320\274\321\217\320\275\320\260."] ::msgcat::mcset cz "Replace expression." [encoding convertfrom utf-8 "\305\230et\304\233zec, kter\303\275m bude v\303\275raz nahrazen."] ::msgcat::mcset de "Replace expression." [encoding convertfrom utf-8 "Ersetze Muster."] ::msgcat::mcset el "Replace expression." [encoding convertfrom utf-8 "\316\244\316\261 \316\261\317\200\316\277\317\204\316\265\316\273\316\255\317\203\316\274\316\261\317\204\316\261 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267\317\202 \316\270\316\261 \316\261\316\275\317\204\316\271\316\272\316\261\317\204\316\261\317\203\317\204\316\261\316\270\316\277\317\215\316\275 \316\261\317\200\317\214 \317\204\316\277 \317\203\317\205\316\263\316\272\316\265\316\272\317\201\316\271\316\274\316\255\316\275\316\277 \316\272\316\265\316\257\316\274\316\265\316\275\316\277."] ::msgcat::mcset en "Replace expression." [encoding convertfrom utf-8 "Search results will be replaced by the string entered here."] ::msgcat::mcset es "Replace expression." [encoding convertfrom utf-8 "Los resultados de la b\303\272squeda ser\303\241n cambiados por lo que escribas aqu\303\255."] ::msgcat::mcset it "Replace expression." [encoding convertfrom utf-8 "Sostituisci testo."] ::msgcat::mcset ru "Replace expression." [encoding convertfrom utf-8 "\320\222\321\213\321\200\320\260\320\266\320\265\320\275\320\270\320\265 \320\267\320\260\320\274\320\265\320\275\321\213."] ::msgcat::mcset sk "Replace expression." [encoding convertfrom utf-8 "V\303\275raz na nahradenie."] ::msgcat::mcset sq "Replace expression." [encoding convertfrom utf-8 "rezultatet e gjetura do te ndrohen nga fjalia e future ketu"] ::msgcat::mcset bg "case sensitive search" [encoding convertfrom utf-8 "\320\264\320\260 \321\201\320\265 \320\276\321\202\321\207\320\270\321\202\320\260 \321\200\320\265\320\263\320\270\321\201\321\202\321\212\321\200\320\260"] ::msgcat::mcset cz "case sensitive search" [encoding convertfrom utf-8 "rozli\305\241ovat velikost p\303\255smen"] ::msgcat::mcset de "case sensitive search" [encoding convertfrom utf-8 "Gro\303\237- und Kleinschreibung bei Suche ber\303\274cksichtigen"] ::msgcat::mcset el "case sensitive search" [encoding convertfrom utf-8 "case sensitive \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267"] ::msgcat::mcset en "case sensitive search" [encoding convertfrom utf-8 "case sensitive search"] ::msgcat::mcset es "case sensitive search" [encoding convertfrom utf-8 "sensible a may\303\272sculas"] ::msgcat::mcset it "case sensitive search" [encoding convertfrom utf-8 "ricerca case-sensitive"] ::msgcat::mcset ru "case sensitive search" [encoding convertfrom utf-8 "\321\203\321\207\320\270\321\202\321\213\320\262\320\260\321\202\321\214 \321\200\320\265\320\263\320\270\321\201\321\202\321\200"] ::msgcat::mcset sk "case sensitive search" [encoding convertfrom utf-8 "rozli\305\241ova\305\245 mal\303\251 a ve\304\276k\303\251"] ::msgcat::mcset sq "case sensitive search" [encoding convertfrom utf-8 "kerkimi -rast sensitiv"] ::msgcat::mcset bg "Check if search should be case sensitive." [encoding convertfrom utf-8 "\320\241\320\273\320\276\320\266\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260 \320\267\320\260 \320\264\320\260 \321\201\320\265 \320\270\320\267\320\262\321\212\321\200\321\210\320\270 \321\202\321\212\321\200\321\201\320\265\320\275\320\265 \321\201 \320\276\321\202\321\207\320\270\321\202\320\260\320\275\320\265 \320\275\320\260 \321\200\320\265\320\263\320\270\321\201\321\202\321\212\321\200\320\260."] ::msgcat::mcset cz "Check if search should be case sensitive." [encoding convertfrom utf-8 "Vyhled\303\241v\303\241n\303\255 s rozli\305\241en\303\255m velikosti p\303\255smen."] ::msgcat::mcset de "Check if search should be case sensitive." [encoding convertfrom utf-8 "Ankreuzen, wenn Suche Gro\303\237- und Kleinschreibung ber\303\274cksichtigen soll."] ::msgcat::mcset el "Check if search should be case sensitive." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\255\316\276\316\265\317\204\316\265 \316\261\316\275 \316\267 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \317\200\317\201\316\255\317\200\316\265\316\271 \316\275\316\261 \316\265\316\257\316\275\316\261\316\271 case sensitive."] ::msgcat::mcset en "Check if search should be case sensitive." [encoding convertfrom utf-8 "Check if search should be case sensitive."] ::msgcat::mcset es "Check if search should be case sensitive." [encoding convertfrom utf-8 "Marcar para que la b\303\272squeda distinga entre may\303\272sculas y min\303\272sculas."] ::msgcat::mcset it "Check if search should be case sensitive." [encoding convertfrom utf-8 "Attiva se la ricerca deve essere case-sensitive."] ::msgcat::mcset ru "Check if search should be case sensitive." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\276\321\202\320\274\320\265\321\202\320\272\321\203, \321\207\321\202\320\276\320\261\321\213 \320\277\320\276\320\270\321\201\320\272 \320\277\321\200\320\276\320\270\321\201\321\205\320\276\320\264\320\270\320\273 \321\201 \321\203\321\207\320\265\321\202\320\276\320\274 \321\200\320\265\320\263\320\270\321\201\321\202\321\200\320\260."] ::msgcat::mcset sk "Check if search should be case sensitive." [encoding convertfrom utf-8 "Za\305\241krtnite pokia\304\276 pri h\304\276adan\303\255 chcete rozli\305\241ova\305\245 mal\303\251 a ve\304\276k\303\251 p\303\255smen\303\241."] ::msgcat::mcset sq "Check if search should be case sensitive." [encoding convertfrom utf-8 "kontrollo nese kerkimi do te jete rast-sensitiv"] ::msgcat::mcset bg "regular expressions" [encoding convertfrom utf-8 "\321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\275\320\270 \320\270\320\267\321\200\320\260\320\267\320\270"] ::msgcat::mcset cz "regular expressions" [encoding convertfrom utf-8 "regul\303\241rn\303\255 v\303\275razy"] ::msgcat::mcset de "regular expressions" [encoding convertfrom utf-8 "Regul\303\244rer Ausdruck."] ::msgcat::mcset el "regular expressions" [encoding convertfrom utf-8 "\316\272\316\261\316\275\316\277\316\275\316\271\316\272\317\214 \317\203\317\205\316\275\317\204\316\261\316\272\317\204\316\271\316\272\317\214 (\317\207\317\201\316\256\317\203\316\267 \316\274\317\200\316\261\316\273\316\261\316\275\317\204\316\255\317\201 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267\317\202)"] ::msgcat::mcset en "regular expressions" [encoding convertfrom utf-8 "regular expressions"] ::msgcat::mcset es "regular expressions" [encoding convertfrom utf-8 "patr\303\263n regular"] ::msgcat::mcset it "regular expressions" [encoding convertfrom utf-8 "esperssioni regolari"] ::msgcat::mcset ru "regular expressions" [encoding convertfrom utf-8 "\321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\275\321\213\320\265 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\321\217"] ::msgcat::mcset sk "regular expressions" [encoding convertfrom utf-8 "regul\303\241rny v\303\275raz"] ::msgcat::mcset sq "regular expressions" [encoding convertfrom utf-8 "shprehje te rregullta"] ::msgcat::mcset bg "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "\320\241\320\273\320\276\320\266\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260 \320\267\320\260 \320\264\320\260 \321\201\320\265 \320\276\320\261\321\200\320\260\320\261\320\276\321\202\320\262\320\260\321\202 \321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\275\320\270\321\202\320\265 \320\270\320\267\321\200\320\260\320\267\320\270 \320\277\321\200\320\270 \321\202\321\212\321\200\321\201\320\265\320\275\320\265 \320\270 \320\267\320\260\320\274\321\217\320\275\320\260."] ::msgcat::mcset cz "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "Za\305\241krtn\304\233te pokud chcete vyhled\303\241vat nebo nahrazovat pomoc\303\255 regul\303\241rn\303\255ch v\303\275raz\305\257."] ::msgcat::mcset de "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "Ankreuzen, ob Suchen und Ersetzen regul\303\244ren Ausdruck nutzen soll."] ::msgcat::mcset el "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\255\316\276\317\204\316\265 \316\263\316\271\316\261 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\274\316\265 \316\272\316\261\316\275\316\277\316\275\316\271\316\272\317\214 \317\203\317\205\316\275\317\204\316\261\316\272\317\204\316\271\316\272\317\214(\317\207\317\201\316\256\317\203\316\267 \316\274\317\200\316\261\316\273\316\261\316\275\317\204\316\255\317\201 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267\317\202)"] ::msgcat::mcset en "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "Check whether to search using regular expressions."] ::msgcat::mcset es "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "B\303\272squeda usando comodines."] ::msgcat::mcset it "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "Attiva per ricerca e sostituzione con espressioni regolari."] ::msgcat::mcset ru "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\276\321\202\320\274\320\265\321\202\320\272\321\203, \321\207\321\202\320\276\320\261\321\213 \320\276\320\261\321\200\320\260\320\261\320\260\321\202\321\213\320\262\320\260\321\202\321\214 \321\200\320\265\320\263\321\203\320\273\321\217\321\200\320\275\321\213\320\265 \320\262\321\213\321\200\320\260\320\266\320\265\320\275\320\270\321\217 \320\277\321\200\320\270 \320\277\320\276\320\270\321\201\320\272\320\265 \320\270 \320\267\320\260\320\274\320\265\320\275\320\265."] ::msgcat::mcset sk "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "Za\305\241krtnite ak sa m\303\241 h\304\276adanie a nahradenie vykon\303\241va\305\245 v m\303\263de regul\303\241rnych v\303\275razov."] ::msgcat::mcset sq "Check whether to evaluate search and replace as regular expressions." [encoding convertfrom utf-8 "kontrollo a do te kerkosh duke perdor shprehje te zakonta-rregullta"] ::msgcat::mcset bg "search selection only" [encoding convertfrom utf-8 "\321\202\321\212\321\200\321\201\320\265\320\275\320\265 \321\201\320\260\320\274\320\276 \320\262 \320\270\320\267\320\261\321\200\320\260\320\275\320\276\321\202\320\276"] ::msgcat::mcset cz "search selection only" [encoding convertfrom utf-8 "pouze ve vybran\303\251m textu"] ::msgcat::mcset de "search selection only" [encoding convertfrom utf-8 "Nur in Auwahl suchen"] ::msgcat::mcset el "search selection only" [encoding convertfrom utf-8 "\316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\274\317\214\316\275\316\277 \317\203\316\265 \316\265\317\200\316\271\316\273\316\277\316\263\316\256"] ::msgcat::mcset en "search selection only" [encoding convertfrom utf-8 "search selection only"] ::msgcat::mcset es "search selection only" [encoding convertfrom utf-8 "selecci\303\263n solo"] ::msgcat::mcset it "search selection only" [encoding convertfrom utf-8 "cerca solo nella selezione"] ::msgcat::mcset ru "search selection only" [encoding convertfrom utf-8 "\320\270\321\201\320\272\320\260\321\202\321\214 \320\262 \320\262\321\213\320\264\320\265\320\273\320\265\320\275\320\275\320\276\320\274"] ::msgcat::mcset sk "search selection only" [encoding convertfrom utf-8 "iba vo vybratom texte"] ::msgcat::mcset sq "search selection only" [encoding convertfrom utf-8 "kerko vetem selekcionet"] ::msgcat::mcset bg "Check whether to do search only in selected text." [encoding convertfrom utf-8 "\320\241\320\273\320\276\320\266\320\265\321\202\320\265 \320\276\321\202\320\261\320\265\320\273\321\217\320\267\320\272\320\260 \320\267\320\260 \320\264\320\260 \320\260\320\265 \321\202\321\212\321\200\321\201\320\270 \321\201\320\260\320\274\320\276 \320\262 \320\270\320\267\320\261\321\200\320\260\320\275\320\270\321\217\321\202 \321\202\320\265\320\272\321\201\321\202."] ::msgcat::mcset cz "Check whether to do search only in selected text." [encoding convertfrom utf-8 "Za\305\241krtn\304\233te pokud chcete vyhled\303\241vat pouze ve vybran\303\251m textu."] ::msgcat::mcset de "Check whether to do search only in selected text." [encoding convertfrom utf-8 "Ankreuzen, wenn nur im ausgew\303\244hlten Text gesucht werden soll."] ::msgcat::mcset el "Check whether to do search only in selected text." [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\255\316\276\316\265\317\204\316\265 \316\263\316\271\316\261 \316\275\316\261 \316\263\316\257\316\275\316\265\316\271 \316\267 \316\261\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\274\317\214\316\275\316\277 \317\203\317\204\316\277 \316\265\317\200\316\271\316\273\316\265\316\263\316\274\316\255\316\275\316\277 \316\272\316\265\316\257\316\274\316\265\316\275\316\277."] ::msgcat::mcset en "Check whether to do search only in selected text." [encoding convertfrom utf-8 "Check whether to do search only in selected text."] ::msgcat::mcset es "Check whether to do search only in selected text." [encoding convertfrom utf-8 "Marcar para buscar solo dentro del texto seleccionado."] ::msgcat::mcset it "Check whether to do search only in selected text." [encoding convertfrom utf-8 "Attiva per cercare solo nel testo selezionato."] ::msgcat::mcset ru "Check whether to do search only in selected text." [encoding convertfrom utf-8 "\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\270\321\202\320\265 \320\276\321\202\320\274\320\265\321\202\320\272\321\203, \321\207\321\202\320\276\320\261\321\213 \320\270\321\201\320\272\320\260\321\202\321\214 \321\202\320\276\320\273\321\214\320\272\320\276 \320\262 \320\262\321\213\320\264\320\265\320\273\320\265\320\275\320\275\320\276\320\274 \321\202\320\265\320\272\321\201\321\202\320\265."] ::msgcat::mcset sk "Check whether to do search only in selected text." [encoding convertfrom utf-8 "Za\305\241krtnite pokia\304\276 hladanie m\303\241 prebehn\303\272\305\245 len v ozna\304\215enom texte."] ::msgcat::mcset sq "Check whether to do search only in selected text." [encoding convertfrom utf-8 "kontrollo a do te perdoresh kerkimin vetem ne tekstin e selekcionuar"] ::msgcat::mcset bg "First" [encoding convertfrom utf-8 "\320\237\321\212\321\200\320\262\320\270"] ::msgcat::mcset cz "First" [encoding convertfrom utf-8 "Prvn\303\255"] ::msgcat::mcset de "First" [encoding convertfrom utf-8 "Erstes"] ::msgcat::mcset el "First" [encoding convertfrom utf-8 "\316\240\317\201\317\216\317\204\316\277"] ::msgcat::mcset en "First" [encoding convertfrom utf-8 "First"] ::msgcat::mcset es "First" [encoding convertfrom utf-8 "Buscar"] ::msgcat::mcset it "First" [encoding convertfrom utf-8 "Primo"] ::msgcat::mcset ru "First" [encoding convertfrom utf-8 "\320\237\320\265\321\200\320\262\321\213\320\271"] ::msgcat::mcset sk "First" [encoding convertfrom utf-8 "Prv\303\275"] ::msgcat::mcset sq "First" [encoding convertfrom utf-8 "e para"] ::msgcat::mcset bg "Search or replace first expression in the file." [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \320\270\320\273\320\270 \320\267\320\260\320\274\321\217\320\275\320\260 \320\275\320\260 \320\277\321\212\321\200\320\262\320\270\321\217\321\202 \320\270\320\267\321\200\320\260\320\267 \320\262\321\212\320\262 \321\204\320\260\320\271\320\273\320\260."] ::msgcat::mcset cz "Search or replace first expression in the file." [encoding convertfrom utf-8 "Najde nebo nahrad\303\255 prvn\303\255 v\303\275raz v souboru."] ::msgcat::mcset de "Search or replace first expression in the file." [encoding convertfrom utf-8 "Suche oder ersetze erstes Muster in der Datei."] ::msgcat::mcset el "Search or replace first expression in the file." [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\256 \316\261\316\275\317\204\316\271\316\272\316\261\317\204\316\254\317\203\317\204\316\261\317\203\316\267 \317\200\317\201\317\216\317\204\316\267\317\202 \317\200\316\265\317\201\316\257\317\200\317\204\317\211\317\203\316\267\317\202 \317\203\317\204\316\277 \316\261\317\201\317\207\316\265\316\257\316\277."] ::msgcat::mcset en "Search or replace first expression in the file." [encoding convertfrom utf-8 "Search or replace first expression in the file."] ::msgcat::mcset es "Search or replace first expression in the file." [encoding convertfrom utf-8 "Buscar o reemplazar el primer resultado."] ::msgcat::mcset it "Search or replace first expression in the file." [encoding convertfrom utf-8 "Cerca o sostituisci la prima istanza del testo nel file."] ::msgcat::mcset ru "Search or replace first expression in the file." [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272 \320\270\320\273\320\270 \320\267\320\260\320\274\320\265\320\275\320\260 \320\277\320\265\321\200\320\262\320\276\320\263\320\276 \320\262\321\205\320\276\320\266\320\264\320\265\320\275\320\270\321\217 \320\262 \321\204\320\260\320\271\320\273\320\265."] ::msgcat::mcset sk "Search or replace first expression in the file." [encoding convertfrom utf-8 "N\303\241jte popr\303\255pade nahrad\303\255 prv\303\275 v\303\275skyt h\304\276adan\303\251ho v\303\275razu v s\303\272bore."] ::msgcat::mcset sq "Search or replace first expression in the file." [encoding convertfrom utf-8 "kerko ose ndro shprehjet e para ne fajlla"] ::msgcat::mcset bg "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \320\270\320\273\320\270 \320\267\320\260\320\274\321\217\320\275\320\260 \320\275\320\260 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\270\321\217\321\202 \320\270\320\267\321\200\320\260\320\267 \321\201\320\273\320\265\320\264 \320\272\321\203\321\200\321\201\320\276\321\200\320\260 \320\262\321\212\320\262 \321\204\320\260\320\271\320\273\320\260."] ::msgcat::mcset cz "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "Najde nebo nahrad\303\255 n\303\241sleduj\303\255c\303\255 v\303\275raz v souboru."] ::msgcat::mcset de "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "Suche oder ersetze n\303\244chstes Muster nach dem Cursor in der Datei."] ::msgcat::mcset el "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\256 \316\261\316\275\317\204\316\271\316\272\316\261\317\204\316\254\317\203\317\204\316\261\317\203\316\267 \316\265\317\200\317\214\316\274\316\265\316\275\316\267\317\202 \317\200\316\265\317\201\316\257\317\200\317\204\317\211\317\203\316\267\317\202 \316\274\316\265\317\204\316\254 \317\204\316\277\316\275 \316\272\316\277\317\215\317\201\317\203\316\277\317\201\316\261."] ::msgcat::mcset en "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "Search or replace next expression after the cursor in the file."] ::msgcat::mcset es "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "Buscar o reemplazar el siguiente resultado."] ::msgcat::mcset it "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "Cerca o sostituisci la prossima istanza del testo nel file dopo il cursore."] ::msgcat::mcset ru "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272 \320\270\320\273\320\270 \320\267\320\260\320\274\320\265\320\275\320\260 \321\201\320\273\320\265\320\264\321\203\321\216\321\211\320\265\320\263\320\276 \320\277\320\276\321\201\320\273\320\265 \320\272\321\203\321\200\321\201\320\276\321\200\320\260 \320\262\321\205\320\276\320\266\320\264\320\265\320\275\320\270\321\217 \320\262 \321\204\320\260\320\271\320\273\320\265."] ::msgcat::mcset sk "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "N\303\241jdi alebo nahra\304\217 nasleduj\303\272ci v\303\275raz v s\303\272bore."] ::msgcat::mcset sq "Search or replace next expression after the cursor in the file." [encoding convertfrom utf-8 "kerko ose ndroje shprehjen e ardhshme pas kursorit ne fajll"] ::msgcat::mcset bg "All" [encoding convertfrom utf-8 "\320\222\321\201\320\270\321\207\320\272\320\276"] ::msgcat::mcset cz "All" [encoding convertfrom utf-8 "V\305\241e"] ::msgcat::mcset de "All" [encoding convertfrom utf-8 "Alles"] ::msgcat::mcset el "All" [encoding convertfrom utf-8 "\316\214\316\273\316\261"] ::msgcat::mcset en "All" [encoding convertfrom utf-8 "All"] ::msgcat::mcset es "All" [encoding convertfrom utf-8 "Todo"] ::msgcat::mcset it "All" [encoding convertfrom utf-8 "Tutti"] ::msgcat::mcset ru "All" [encoding convertfrom utf-8 "\320\222\321\201\320\265"] ::msgcat::mcset sk "All" [encoding convertfrom utf-8 "V\305\241etko"] ::msgcat::mcset sq "All" [encoding convertfrom utf-8 "te gjithat"] ::msgcat::mcset bg "Search or replace all expressions in the file." [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265 \320\270\320\273\320\270 \320\267\320\260\320\274\321\217\320\275\320\260 \320\275\320\260 \320\262\321\201\320\270\321\207\320\272\320\270 \320\270\320\267\321\200\320\260\320\267\320\270 \320\262\321\212\320\262 \321\204\320\260\320\271\320\273\320\260."] ::msgcat::mcset cz "Search or replace all expressions in the file." [encoding convertfrom utf-8 "Najde nebo nahrad\303\255 v\305\241echny v\303\275razy v souboru."] ::msgcat::mcset de "Search or replace all expressions in the file." [encoding convertfrom utf-8 "Suche oder ersetze alle Muster in der Datei."] ::msgcat::mcset el "Search or replace all expressions in the file." [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267 \316\256 \316\261\316\275\317\204\316\271\316\272\316\261\317\204\316\254\317\203\317\204\316\261\317\203\316\267 \317\214\316\273\317\211\316\275 \317\204\317\211\316\275 \317\200\316\265\317\201\316\271\317\200\317\204\317\216\317\203\316\265\317\211\316\275 \317\203\317\204\316\277 \316\261\317\201\317\207\316\265\316\257\316\277."] ::msgcat::mcset en "Search or replace all expressions in the file." [encoding convertfrom utf-8 "Search or replace all expressions in the file."] ::msgcat::mcset es "Search or replace all expressions in the file." [encoding convertfrom utf-8 "Buscar o reemplazar todos los resultados."] ::msgcat::mcset it "Search or replace all expressions in the file." [encoding convertfrom utf-8 "Cerca o sostituisci tuute le frasi nel file."] ::msgcat::mcset ru "Search or replace all expressions in the file." [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272 \320\270\320\273\320\270 \320\267\320\260\320\274\320\265\320\275\320\260 \320\262\321\201\320\265\321\205 \320\262\321\205\320\276\320\266\320\264\320\265\320\275\320\270\320\271 \320\262 \321\204\320\260\320\271\320\273\320\265."] ::msgcat::mcset sk "Search or replace all expressions in the file." [encoding convertfrom utf-8 "N\303\241jdi alebo nahra\304\217 v\305\241etky v\303\275razy v s\303\272bore."] ::msgcat::mcset sq "Search or replace all expressions in the file." [encoding convertfrom utf-8 "kerko ose ndroji te gjitha shprehjet ne fajlla"] ::msgcat::mcset bg "Clear" [encoding convertfrom utf-8 "\320\230\320\267\321\207\320\270\321\201\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "Clear" [encoding convertfrom utf-8 "Zru\305\241it"] ::msgcat::mcset de "Clear" [encoding convertfrom utf-8 "L\303\266schen"] ::msgcat::mcset el "Clear" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\257\317\201\316\265\317\203\316\267"] ::msgcat::mcset en "Clear" [encoding convertfrom utf-8 "Clear"] ::msgcat::mcset es "Clear" [encoding convertfrom utf-8 "Deseleccionar"] ::msgcat::mcset it "Clear" [encoding convertfrom utf-8 "Cancella"] ::msgcat::mcset ru "Clear" [encoding convertfrom utf-8 "\320\236\321\207\320\270\321\201\321\202\320\272\320\260"] ::msgcat::mcset sk "Clear" [encoding convertfrom utf-8 "Vy\304\215isti"] ::msgcat::mcset sq "Clear" [encoding convertfrom utf-8 "e paster"] ::msgcat::mcset bg "Clear all highlights in the file." [encoding convertfrom utf-8 "\320\230\320\267\321\207\320\270\321\201\321\202\320\262\320\260\320\275\320\265 \320\275\320\260 \320\262\321\201\320\270\321\207\320\272\320\270 \320\276\321\201\320\262\320\265\321\202\320\265\320\275\320\270 \321\202\320\265\320\272\321\201\321\202\320\276\320\262\320\270 \321\203\321\207\320\260\321\201\321\202\321\212\321\206\320\270 \320\262\321\212\320\262 \321\204\320\260\320\271\320\273\320\260."] ::msgcat::mcset cz "Clear all highlights in the file." [encoding convertfrom utf-8 "Zru\305\241\303\255 zv\303\275razn\304\233n\303\255 nalezen\303\275ch v\303\275raz\305\257 v souboru."] ::msgcat::mcset de "Clear all highlights in the file." [encoding convertfrom utf-8 "L\303\266sche alle Hervorhebungen in der Datei."] ::msgcat::mcset el "Clear all highlights in the file." [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\257\317\201\316\265\317\203\316\267 \317\214\316\273\317\211\316\275 \317\204\317\211\316\275 \317\204\316\277\316\275\316\271\317\203\316\270\316\255\316\275\317\204\317\211\316\275."] ::msgcat::mcset en "Clear all highlights in the file." [encoding convertfrom utf-8 "Clear all highlights in the file."] ::msgcat::mcset es "Clear all highlights in the file." [encoding convertfrom utf-8 "Deseleccionar todo lo seleccionado."] ::msgcat::mcset it "Clear all highlights in the file." [encoding convertfrom utf-8 "Cancella tutte le evidenziazioni nel file."] ::msgcat::mcset ru "Clear all highlights in the file." [encoding convertfrom utf-8 "\320\236\321\207\320\270\321\201\321\202\320\272\320\260 \320\262\321\201\320\265\321\205 \320\277\320\276\320\264\321\201\320\262\320\265\321\207\320\265\320\275\320\275\321\213\321\205 \321\203\321\207\320\260\321\201\321\202\320\272\320\276\320\262 \321\202\320\265\320\272\321\201\321\202\320\260."] ::msgcat::mcset sk "Clear all highlights in the file." [encoding convertfrom utf-8 "Zru\305\241\303\255 zv\303\275raznenie n\303\241jden\303\275ch v\303\275razov v s\303\272bore."] ::msgcat::mcset sq "Clear all highlights in the file." [encoding convertfrom utf-8 "fshij te gjitha selekcionimet apo hijezimet ne fajlla"] ::msgcat::mcset bg "Opening %s ..." [encoding convertfrom utf-8 "\320\236\321\202\320\262\320\260\321\200\321\217\320\275\320\265 %s ..."] ::msgcat::mcset cz "Opening %s ..." [encoding convertfrom utf-8 "Otev\303\255r\303\241m %s ..."] ::msgcat::mcset de "Opening %s ..." [encoding convertfrom utf-8 "\303\226ffne %s ..."] ::msgcat::mcset el "Opening %s ..." [encoding convertfrom utf-8 "\316\206\316\275\316\277\316\271\316\263\316\274\316\261 \317\204\316\277\317\205 %s ..."] ::msgcat::mcset en "Opening %s ..." [encoding convertfrom utf-8 "Opening %s ..."] ::msgcat::mcset es "Opening %s ..." [encoding convertfrom utf-8 "Abriendo %s ..."] ::msgcat::mcset it "Opening %s ..." [encoding convertfrom utf-8 "Apertura %s ..."] ::msgcat::mcset ru "Opening %s ..." [encoding convertfrom utf-8 "\320\236\321\202\320\272\321\200\321\213\321\202\320\270\320\265 %s ..."] ::msgcat::mcset sk "Opening %s ..." [encoding convertfrom utf-8 "Otev\303\241ram %s ..."] ::msgcat::mcset sq "Opening %s ..." [encoding convertfrom utf-8 "duke hap %s \342\200\246"] ::msgcat::mcset bg "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273\321\212\321\202 %s \320\275\320\265 \320\265 \321\201\321\212\321\205\321\200\320\260\320\275\320\265\320\275. \320\224\320\260 \320\263\320\276 \321\201\321\212\321\205\321\200\320\260\320\275\321\217 \321\201\320\265\320\263\320\260?"] ::msgcat::mcset cz "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "Soubor %s nen\303\255 ulo\305\276en. Ulo\305\276it nyn\303\255?"] ::msgcat::mcset de "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "datei %s nicht gespeichert. Speichere jetzt?"] ::msgcat::mcset el "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "\316\244\316\277 \316\261\317\201\317\207\316\265\316\257\316\277 %s \316\264\316\265\316\275 \316\255\317\207\316\265\316\271 \316\261\317\200\316\277\316\270\316\267\316\272\316\265\317\205\317\204\316\265\316\257. \316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267 \317\204\317\216\317\201\316\261;"] ::msgcat::mcset en "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "File %s is not saved. Save it now?"] ::msgcat::mcset es "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "El archivo %s no ha sido guardado. \302\277Guardar ahora?"] ::msgcat::mcset it "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "Il file %s non \303\250 salvato. Salva ora?"] ::msgcat::mcset ru "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273 %s \320\275\320\265 \321\201\320\276\321\205\321\200\320\260\320\275\320\265\320\275. \320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214 \320\265\320\263\320\276 \321\201\320\265\320\271\321\207\320\260\321\201?"] ::msgcat::mcset sk "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "S\303\272bor %s nie je ulo\305\276en\303\275. Ulo\305\276i\305\245 teraz?"] ::msgcat::mcset sq "File %s is not saved. Save it now?" [encoding convertfrom utf-8 "fajlli %s nuk eshte I ruajtur. Ta ruajm tani?"] ::msgcat::mcset bg "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273\321\212\321\202 %s \320\265 \320\270\320\267\320\274\320\265\320\275\320\265\320\275 \320\276\321\202 \320\264\321\200\321\203\320\263\320\276 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265. \320\224\320\260 \320\263\320\276 \321\201\321\212\321\205\321\200\320\260\320\275\321\217 \320\262\321\212\320\277\321\200\320\265\320\272\320\270 \321\202\320\276\320\262\320\260?"] ::msgcat::mcset cz "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "Soubor %s byl modifikov\303\241n mimo xtherion. P\305\231esto ulo\305\276it?"] ::msgcat::mcset de "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "Datei %s wurde au\303\237erhalb von Xtherion ge\303\244ndert. Trotzdem speichern?"] ::msgcat::mcset el "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "\316\244\316\277 \316\261\317\201\317\207\316\265\316\257\316\277 %s \317\204\317\201\316\277\317\200\316\277\317\200\316\277\316\271\316\256\316\270\316\267\316\272\316\265 \316\265\316\272\317\204\317\214\317\202 xtherion. \316\235\316\261 \316\261\317\200\316\277\316\270\316\267\316\272\316\265\317\205\317\204\316\265\316\257 \317\214\317\200\317\211\317\202 \316\272\316\261\316\271 \316\275\316\261'\316\275\316\261\316\271;"] ::msgcat::mcset en "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "File %s was modified outside xtherion. Save it anyway?"] ::msgcat::mcset es "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "El archivo %s ha sido modificado fuera de xtherion. \302\277Guardar de todos modos?"] ::msgcat::mcset it "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "Il file %s \303\250 stato modificato fuori da xtherion. Salva comunque?"] ::msgcat::mcset ru "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "\320\244\320\260\320\271\320\273 %s \320\261\321\213\320\273 \320\270\320\267\320\274\320\265\320\275\320\265\320\275 \320\264\321\200\321\203\320\263\320\270\320\274 \320\277\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\320\265\320\274. \320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214 \320\275\320\265 \321\201\320\274\320\276\321\202\321\200\321\217 \320\275\320\260 \321\215\321\202\320\276?"] ::msgcat::mcset sk "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "S\303\272bor %s bol modifikovan\303\275 mimo programu. Ulo\305\276i\305\245 aj tak?"] ::msgcat::mcset sq "File %s was modified outside xtherion. Save it anyway?" [encoding convertfrom utf-8 "fajlli %s eshte ndryshuar jashte x therion-it. Ta ruajm sido qe te jete?"] ::msgcat::mcset bg "Saving %s ..." [encoding convertfrom utf-8 "\320\241\321\212\321\205\321\200\320\260\320\275\320\265\320\275\320\270\320\265 %s ..."] ::msgcat::mcset cz "Saving %s ..." [encoding convertfrom utf-8 "Ukl\303\241d\303\241m %s ..."] ::msgcat::mcset de "Saving %s ..." [encoding convertfrom utf-8 "Speichere %s ..."] ::msgcat::mcset el "Saving %s ..." [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267 \317\204\316\277\317\205 %s ..."] ::msgcat::mcset en "Saving %s ..." [encoding convertfrom utf-8 "Saving %s ..."] ::msgcat::mcset es "Saving %s ..." [encoding convertfrom utf-8 "Guardando %s ..."] ::msgcat::mcset it "Saving %s ..." [encoding convertfrom utf-8 "Salvataggio %s ..."] ::msgcat::mcset ru "Saving %s ..." [encoding convertfrom utf-8 "\320\241\320\276\321\205\321\200\320\260\320\275\320\265\320\275\320\270\320\265 %s ..."] ::msgcat::mcset sk "Saving %s ..." [encoding convertfrom utf-8 "Uklad\303\241m %s ..."] ::msgcat::mcset sq "Saving %s ..." [encoding convertfrom utf-8 "duke ruajtur %s. . ."] ::msgcat::mcset bg "New" [encoding convertfrom utf-8 "\320\235\320\276\320\262"] ::msgcat::mcset cz "New" [encoding convertfrom utf-8 "Nov\303\275"] ::msgcat::mcset de "New" [encoding convertfrom utf-8 "Neu"] ::msgcat::mcset el "New" [encoding convertfrom utf-8 "\316\235\316\255\316\277"] ::msgcat::mcset en "New" [encoding convertfrom utf-8 "New"] ::msgcat::mcset es "New" [encoding convertfrom utf-8 "Nuevo"] ::msgcat::mcset it "New" [encoding convertfrom utf-8 "Nuovo"] ::msgcat::mcset ru "New" [encoding convertfrom utf-8 "\320\235\320\276\320\262\321\213\320\271"] ::msgcat::mcset sk "New" [encoding convertfrom utf-8 "Nov\303\275"] ::msgcat::mcset sq "New" [encoding convertfrom utf-8 "e re"] ::msgcat::mcset bg "Open" [encoding convertfrom utf-8 "\320\236\321\202\320\262\320\276\321\200\320\270"] ::msgcat::mcset cz "Open" [encoding convertfrom utf-8 "Otev\305\231\303\255t..."] ::msgcat::mcset de "Open" [encoding convertfrom utf-8 "\303\226ffnen"] ::msgcat::mcset el "Open" [encoding convertfrom utf-8 "\316\206\316\275\316\277\316\271\316\263\316\274\316\261"] ::msgcat::mcset en "Open" [encoding convertfrom utf-8 "Open"] ::msgcat::mcset es "Open" [encoding convertfrom utf-8 "Abrir"] ::msgcat::mcset it "Open" [encoding convertfrom utf-8 "Apri"] ::msgcat::mcset ru "Open" [encoding convertfrom utf-8 "\320\236\321\202\320\272\321\200\321\213\321\202\321\214"] ::msgcat::mcset sk "Open" [encoding convertfrom utf-8 "Otvori\305\245"] ::msgcat::mcset sq "Open" [encoding convertfrom utf-8 "hape"] ::msgcat::mcset bg "Save" [encoding convertfrom utf-8 "\320\227\320\260\320\277\320\270\321\210\320\270"] ::msgcat::mcset cz "Save" [encoding convertfrom utf-8 "Ulo\305\276it"] ::msgcat::mcset de "Save" [encoding convertfrom utf-8 "Speichern"] ::msgcat::mcset el "Save" [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267"] ::msgcat::mcset en "Save" [encoding convertfrom utf-8 "Save"] ::msgcat::mcset es "Save" [encoding convertfrom utf-8 "Guardar"] ::msgcat::mcset it "Save" [encoding convertfrom utf-8 "Salva"] ::msgcat::mcset ru "Save" [encoding convertfrom utf-8 "\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214"] ::msgcat::mcset sk "Save" [encoding convertfrom utf-8 "Ulo\305\276i\305\245"] ::msgcat::mcset sq "Save" [encoding convertfrom utf-8 "ruaje"] ::msgcat::mcset bg "Save as" [encoding convertfrom utf-8 "\320\227\320\260\320\277\320\270\321\210\320\270 \320\272\320\260\321\202\320\276"] ::msgcat::mcset cz "Save as" [encoding convertfrom utf-8 "Ulo\305\276it jako..."] ::msgcat::mcset de "Save as" [encoding convertfrom utf-8 "Speichern als"] ::msgcat::mcset el "Save as" [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267 \317\211\317\202..."] ::msgcat::mcset en "Save as" [encoding convertfrom utf-8 "Save as"] ::msgcat::mcset es "Save as" [encoding convertfrom utf-8 "Guardar como"] ::msgcat::mcset it "Save as" [encoding convertfrom utf-8 "Salva come"] ::msgcat::mcset ru "Save as" [encoding convertfrom utf-8 "\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214 \320\272\320\260\320\272"] ::msgcat::mcset sk "Save as" [encoding convertfrom utf-8 "Ulo\305\276i\305\245 ako"] ::msgcat::mcset sq "Save as" [encoding convertfrom utf-8 "ruaje si"] ::msgcat::mcset bg "Save all" [encoding convertfrom utf-8 "\320\227\320\260\320\277\320\270\321\210\320\270 \320\262\321\201\320\270\321\207\320\272\320\270"] ::msgcat::mcset cz "Save all" [encoding convertfrom utf-8 "Ulo\305\276it v\305\241e"] ::msgcat::mcset de "Save all" [encoding convertfrom utf-8 "Speichere alles"] ::msgcat::mcset el "Save all" [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267 \317\214\316\273\317\211\316\275"] ::msgcat::mcset en "Save all" [encoding convertfrom utf-8 "Save all"] ::msgcat::mcset es "Save all" [encoding convertfrom utf-8 "Guardar todo"] ::msgcat::mcset it "Save all" [encoding convertfrom utf-8 "Salva tutti"] ::msgcat::mcset ru "Save all" [encoding convertfrom utf-8 "\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214 \320\262\321\201\321\221"] ::msgcat::mcset sk "Save all" [encoding convertfrom utf-8 "Ulo\305\276i\305\245 v\305\241etko"] ::msgcat::mcset sq "Save all" [encoding convertfrom utf-8 "ruaji te gjitha"] ::msgcat::mcset bg "Auto save" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\321\201\321\212\321\205\321\200\320\260\320\275\320\265\320\275\320\270\320\265"] ::msgcat::mcset cz "Auto save" [encoding convertfrom utf-8 "Automaticky ukl\303\241dat"] ::msgcat::mcset de "Auto save" [encoding convertfrom utf-8 "Automatisch speichern"] ::msgcat::mcset el "Auto save" [encoding convertfrom utf-8 "\316\221\317\205\317\204\317\214\316\274\316\261\317\204\316\267 \316\261\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267"] ::msgcat::mcset en "Auto save" [encoding convertfrom utf-8 "Auto save"] ::msgcat::mcset es "Auto save" [encoding convertfrom utf-8 "Autoguardar"] ::msgcat::mcset it "Auto save" [encoding convertfrom utf-8 "Auto salva"] ::msgcat::mcset ru "Auto save" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\321\201\320\276\321\205\321\200\320\260\320\275\320\265\320\275\320\270\320\265"] ::msgcat::mcset sk "Auto save" [encoding convertfrom utf-8 "Uklada\305\245 automaticky"] ::msgcat::mcset sq "Auto save" [encoding convertfrom utf-8 "ruajtja automatike"] ::msgcat::mcset bg "Import" [encoding convertfrom utf-8 "\320\222\320\275\320\260\321\201\321\217\320\275\320\265"] ::msgcat::mcset cz "Import" [encoding convertfrom utf-8 "Import"] ::msgcat::mcset de "Import" [encoding convertfrom utf-8 "Importieren"] ::msgcat::mcset el "Import" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256..."] ::msgcat::mcset it "Import" [encoding convertfrom utf-8 "Importa"] ::msgcat::mcset ru "Import" [encoding convertfrom utf-8 "\320\230\320\274\320\277\320\276\321\200\321\202"] ::msgcat::mcset sk "Import" [encoding convertfrom utf-8 "Import"] ::msgcat::mcset sq "Import" [encoding convertfrom utf-8 "importi"] ::msgcat::mcset bg "Next" [encoding convertfrom utf-8 "\320\241\320\273\320\265\320\264\320\262\320\260\321\211"] ::msgcat::mcset cz "Next" [encoding convertfrom utf-8 "N\303\241sleduj\303\255c\303\255"] ::msgcat::mcset de "Next" [encoding convertfrom utf-8 "N\303\244chstes"] ::msgcat::mcset el "Next" [encoding convertfrom utf-8 "\316\225\317\200\317\214\316\274\316\265\316\275\316\277"] ::msgcat::mcset en "Next" [encoding convertfrom utf-8 "Next"] ::msgcat::mcset es "Next" [encoding convertfrom utf-8 "Siguiente"] ::msgcat::mcset it "Next" [encoding convertfrom utf-8 "Prossima"] ::msgcat::mcset ru "Next" [encoding convertfrom utf-8 "\320\241\320\273\320\265\320\264\321\203\321\216\321\211\320\270\320\271"] ::msgcat::mcset sk "Next" [encoding convertfrom utf-8 "Nasleduj\303\272ci"] ::msgcat::mcset sq "Next" [encoding convertfrom utf-8 "tjetra"] ::msgcat::mcset bg "Previous" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\264\320\270\321\210\320\265\320\275"] ::msgcat::mcset cz "Previous" [encoding convertfrom utf-8 "P\305\231edchoz\303\255"] ::msgcat::mcset de "Previous" [encoding convertfrom utf-8 "Vorheriges"] ::msgcat::mcset el "Previous" [encoding convertfrom utf-8 "\316\240\317\201\316\277\316\267\316\263\316\277\317\215\316\274\316\265\316\275\316\277"] ::msgcat::mcset en "Previous" [encoding convertfrom utf-8 "Previous"] ::msgcat::mcset es "Previous" [encoding convertfrom utf-8 "Anterior"] ::msgcat::mcset it "Previous" [encoding convertfrom utf-8 "Precedente"] ::msgcat::mcset ru "Previous" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\264\321\213\320\264\321\203\321\211\320\270\320\271"] ::msgcat::mcset sk "Previous" [encoding convertfrom utf-8 "Predch\303\241dzaj\303\272ci"] ::msgcat::mcset sq "Previous" [encoding convertfrom utf-8 "e perparmja"] ::msgcat::mcset bg "Edit" [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\260\320\275\320\265"] ::msgcat::mcset cz "Edit" [encoding convertfrom utf-8 "Editovat"] ::msgcat::mcset de "Edit" [encoding convertfrom utf-8 "Bearbeiten"] ::msgcat::mcset el "Edit" [encoding convertfrom utf-8 "\316\224\316\271\317\214\317\201\316\270\317\211\317\203\316\267"] ::msgcat::mcset en "Edit" [encoding convertfrom utf-8 "Edit"] ::msgcat::mcset es "Edit" [encoding convertfrom utf-8 "Editar"] ::msgcat::mcset it "Edit" [encoding convertfrom utf-8 "Edita"] ::msgcat::mcset ru "Edit" [encoding convertfrom utf-8 "\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\321\202\321\214"] ::msgcat::mcset sk "Edit" [encoding convertfrom utf-8 "Upravi\305\245"] ::msgcat::mcset sq "Edit" [encoding convertfrom utf-8 "permireso"] ::msgcat::mcset bg "Undo" [encoding convertfrom utf-8 "\320\236\321\202\320\274\321\217\320\275\320\260"] ::msgcat::mcset cz "Undo" [encoding convertfrom utf-8 "Zp\304\233t"] ::msgcat::mcset de "Undo" [encoding convertfrom utf-8 "R\303\274ckg\303\244ngig"] ::msgcat::mcset el "Undo" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\257\317\201\316\265\317\203\316\267"] ::msgcat::mcset en "Undo" [encoding convertfrom utf-8 "Undo"] ::msgcat::mcset es "Undo" [encoding convertfrom utf-8 "Deshacer"] ::msgcat::mcset it "Undo" [encoding convertfrom utf-8 "Indietro"] ::msgcat::mcset ru "Undo" [encoding convertfrom utf-8 "\320\236\321\202\320\274\320\265\320\275\320\270\321\202\321\214"] ::msgcat::mcset sk "Undo" [encoding convertfrom utf-8 "Sp\303\244\305\245"] ::msgcat::mcset sq "Undo" [encoding convertfrom utf-8 "prishe-undo"] ::msgcat::mcset bg "Redo" [encoding convertfrom utf-8 "\320\222\321\212\320\267\321\201\321\202\320\260\320\275\320\276\320\262\321\217\320\262\320\260\320\275\320\265"] ::msgcat::mcset cz "Redo" [encoding convertfrom utf-8 "Opakovat"] ::msgcat::mcset de "Redo" [encoding convertfrom utf-8 "Wiederholen"] ::msgcat::mcset el "Redo" [encoding convertfrom utf-8 "\316\225\317\200\316\261\316\275\316\254\316\273\316\267\317\210\316\267"] ::msgcat::mcset en "Redo" [encoding convertfrom utf-8 "Redo"] ::msgcat::mcset es "Redo" [encoding convertfrom utf-8 "Rehacer"] ::msgcat::mcset it "Redo" [encoding convertfrom utf-8 "Rifai"] ::msgcat::mcset ru "Redo" [encoding convertfrom utf-8 "\320\222\320\265\321\200\320\275\321\203\321\202\321\214"] ::msgcat::mcset sk "Redo" [encoding convertfrom utf-8 "Opakova\305\245"] ::msgcat::mcset sq "Redo" [encoding convertfrom utf-8 "beje prape-redo"] ::msgcat::mcset bg "Cut" [encoding convertfrom utf-8 "\320\230\320\267\321\200\320\265\320\266\320\270"] ::msgcat::mcset cz "Cut" [encoding convertfrom utf-8 "Vyjmout"] ::msgcat::mcset de "Cut" [encoding convertfrom utf-8 "Ausschneiden"] ::msgcat::mcset el "Cut" [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\272\316\277\317\200\316\256"] ::msgcat::mcset en "Cut" [encoding convertfrom utf-8 "Cut"] ::msgcat::mcset es "Cut" [encoding convertfrom utf-8 "Cortar"] ::msgcat::mcset it "Cut" [encoding convertfrom utf-8 "Taglia"] ::msgcat::mcset ru "Cut" [encoding convertfrom utf-8 "\320\222\321\213\321\200\320\265\320\267\320\260\321\202\321\214"] ::msgcat::mcset sk "Cut" [encoding convertfrom utf-8 "Vystrihn\303\272\305\245"] ::msgcat::mcset sq "Cut" [encoding convertfrom utf-8 "preje"] ::msgcat::mcset bg "Copy" [encoding convertfrom utf-8 "\320\232\320\276\320\277\320\270\321\200\320\260\320\271"] ::msgcat::mcset cz "Copy" [encoding convertfrom utf-8 "Kop\303\255rovat"] ::msgcat::mcset de "Copy" [encoding convertfrom utf-8 "Kopieren"] ::msgcat::mcset el "Copy" [encoding convertfrom utf-8 "\316\221\316\275\317\204\316\271\316\263\317\201\316\261\317\206\316\256"] ::msgcat::mcset en "Copy" [encoding convertfrom utf-8 "Copy"] ::msgcat::mcset es "Copy" [encoding convertfrom utf-8 "Copiar"] ::msgcat::mcset it "Copy" [encoding convertfrom utf-8 "Copia"] ::msgcat::mcset ru "Copy" [encoding convertfrom utf-8 "\320\232\320\276\320\277\320\270\321\200\320\276\320\262\320\260\321\202\321\214"] ::msgcat::mcset sk "Copy" [encoding convertfrom utf-8 "Kop\303\255rova\305\245"] ::msgcat::mcset sq "Copy" [encoding convertfrom utf-8 "kopjo"] ::msgcat::mcset bg "Paste" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270"] ::msgcat::mcset cz "Paste" [encoding convertfrom utf-8 "Vlo\305\276it"] ::msgcat::mcset de "Paste" [encoding convertfrom utf-8 "Einf\303\274gen"] ::msgcat::mcset el "Paste" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\272\317\214\316\273\316\273\316\267\317\203\316\267"] ::msgcat::mcset en "Paste" [encoding convertfrom utf-8 "Paste"] ::msgcat::mcset es "Paste" [encoding convertfrom utf-8 "Pegar"] ::msgcat::mcset it "Paste" [encoding convertfrom utf-8 "Incolla"] ::msgcat::mcset ru "Paste" [encoding convertfrom utf-8 "\320\222\321\201\321\202\320\260\320\262\320\270\321\202\321\214"] ::msgcat::mcset sk "Paste" [encoding convertfrom utf-8 "Vlo\305\276i\305\245"] ::msgcat::mcset sq "Paste" [encoding convertfrom utf-8 "vendose-paste"] ::msgcat::mcset bg "Select all" [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \320\262\321\201\320\270\321\207\320\272\320\276"] ::msgcat::mcset cz "Select all" [encoding convertfrom utf-8 "Vybrat v\305\241e"] ::msgcat::mcset de "Select all" [encoding convertfrom utf-8 "Alles ausw\303\244hlen"] ::msgcat::mcset el "Select all" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \317\214\316\273\317\211\316\275"] ::msgcat::mcset en "Select all" [encoding convertfrom utf-8 "Select all"] ::msgcat::mcset es "Select all" [encoding convertfrom utf-8 "Seleccionar todo"] ::msgcat::mcset it "Select all" [encoding convertfrom utf-8 "Seleziona tutto"] ::msgcat::mcset ru "Select all" [encoding convertfrom utf-8 "\320\222\321\213\320\264\320\265\320\273\320\270\321\202\321\214 \320\262\321\201\321\221"] ::msgcat::mcset sk "Select all" [encoding convertfrom utf-8 "Vyber v\305\241etko"] ::msgcat::mcset sq "Select all" [encoding convertfrom utf-8 "zghedhi-selekciono te gjitha"] ::msgcat::mcset bg "Auto indent" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\274\320\260\321\202\320\270\321\207\320\265\320\275 \320\276\321\202\321\201\321\202\321\212\320\277"] ::msgcat::mcset cz "Auto indent" [encoding convertfrom utf-8 "Automaticky odsazovat"] ::msgcat::mcset de "Auto indent" [encoding convertfrom utf-8 "Automatisch einr\303\274cken"] ::msgcat::mcset el "Auto indent" [encoding convertfrom utf-8 "\316\221\317\205\317\204\317\214\316\274\316\261\317\204\316\267 \317\200\316\261\317\201\316\261\316\263\317\201\316\261\317\206\316\277\317\200\316\277\316\257\316\267\317\203\316\267"] ::msgcat::mcset en "Auto indent" [encoding convertfrom utf-8 "Auto indent"] ::msgcat::mcset es "Auto indent" [encoding convertfrom utf-8 "Autoindentar"] ::msgcat::mcset it "Auto indent" [encoding convertfrom utf-8 "Indentazione automatica"] ::msgcat::mcset ru "Auto indent" [encoding convertfrom utf-8 "\320\220\320\262\321\202\320\276\320\276\321\202\321\201\321\202\321\203\320\277"] ::msgcat::mcset sk "Auto indent" [encoding convertfrom utf-8 "Automatick\303\251 odsadenie"] ::msgcat::mcset sq "Auto indent" [encoding convertfrom utf-8 "indenti automatik"] ::msgcat::mcset bg "Processing line %s ..." [encoding convertfrom utf-8 "\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\262\320\260\320\275\320\265 \320\275\320\260 \321\200\320\265\320\264 %s ..."] ::msgcat::mcset cz "Processing line %s ..." [encoding convertfrom utf-8 "Zpracov\303\241v\303\241m \305\231\303\241dek %s ..."] ::msgcat::mcset de "Processing line %s ..." [encoding convertfrom utf-8 "Verarbeite Zeile %s ..."] ::msgcat::mcset el "Processing line %s ..." [encoding convertfrom utf-8 "\316\225\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\316\257\316\261 \316\263\317\201\316\261\316\274\316\274\316\256\317\202 %s ..."] ::msgcat::mcset en "Processing line %s ..." [encoding convertfrom utf-8 "Processing line %s ..."] ::msgcat::mcset es "Processing line %s ..." [encoding convertfrom utf-8 "Procesando l\303\255nea %s ..."] ::msgcat::mcset it "Processing line %s ..." [encoding convertfrom utf-8 "Elaborazione linea %s ..."] ::msgcat::mcset ru "Processing line %s ..." [encoding convertfrom utf-8 "\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260 \321\201\321\202\321\200\320\276\320\272\320\270 %s ..."] ::msgcat::mcset sk "Processing line %s ..." [encoding convertfrom utf-8 "Sprac\303\272vam riadok %s ..."] ::msgcat::mcset sq "Processing line %s ..." [encoding convertfrom utf-8 "rrjeshti %s ne proces\342\200\246"] ::msgcat::mcset bg "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\270\321\217\321\202 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\275\320\265 \320\265 \320\260\320\272\321\202\320\270\320\262\320\265\320\275. \320\227\320\260 \320\260\320\272\321\202\320\270\320\262\320\270\321\200\320\260\320\275\320\265 \320\276\321\202\320\262\320\276\321\200\320\265\321\202\320\265 \321\201\321\212\321\211\320\265\321\201\321\202\320\262\321\203\320\262\320\260\321\211 \321\204\320\260\320\271\320\273 \320\270\320\273\320\270 \321\201\321\212\320\267\320\264\320\260\320\271\321\202\320\265 \320\275\320\276\320\262."] ::msgcat::mcset cz "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Textov\303\275 editor nen\303\255 aktivn\303\255. Pro jeho aktivaci otev\305\231ete existuj\303\255c\303\255 soubor nebo vytvo\305\231te nov\303\275."] ::msgcat::mcset de "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Texteditor ist nicht aktiv. Um ihn zu aktivieren, \303\266ffne eine existierende Datei oder lege eine neue an."] ::msgcat::mcset el "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\316\237 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256\317\202 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205 \316\264\316\265\316\275 \316\265\316\257\316\275\316\261\316\271 \316\265\316\275\316\265\317\201\316\263\317\214\317\202. \316\223\316\271\316\261 \316\275\316\261 \317\204\316\277\316\275 \316\265\316\275\316\265\317\201\316\263\316\277\317\200\316\277\316\271\316\256\317\203\316\265\317\204\316\265, \316\261\316\275\316\277\316\257\316\276\317\204\316\265 \316\261\317\201\317\207\316\265\316\257\316\277, \316\256 \316\264\316\267\316\274\316\271\316\277\317\205\317\201\316\263\316\256\317\203\317\204\316\265 \316\275\316\255\316\277."] ::msgcat::mcset en "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Text editor is not active. To activate it, open existing file or create new one."] ::msgcat::mcset es "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "El editor de texto est\303\241 inactivo. Para activarlo, abre un archivo existente o crea uno nuevo."] ::msgcat::mcset it "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "L'editor di testo non \303\250 attivo. Per attivarlo apri un file o creane uno."] ::msgcat::mcset ru "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "\320\242\320\265\320\272\321\201\321\202\320\276\320\262\321\213\320\271 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\275\320\265\320\260\320\272\321\202\320\270\320\262\320\265\320\275. \320\224\320\273\321\217 \320\260\320\272\321\202\320\270\320\262\320\260\321\206\320\270\320\270 \320\276\321\202\320\272\321\200\320\276\320\271\321\202\320\265 \321\201\321\203\321\211\320\265\321\201\321\202\320\262\321\203\321\216\321\211\320\270\320\271 \321\204\320\260\320\271\320\273 \320\270\320\273\320\270 \321\201\320\276\320\267\320\264\320\260\320\271\321\202\320\265 \320\275\320\276\320\262\321\213\320\271."] ::msgcat::mcset sk "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "Textov\303\275 editor nie je akt\303\255vny. Otvorte existuj\303\272ci s\303\272bor alebo vytvorte nov\303\275."] ::msgcat::mcset sq "Text editor is not active. To activate it, open existing file or create new one." [encoding convertfrom utf-8 "editori I tekstit nuk eshte aktiv. Qe ta aktivizosh, hape fajllin egzistues ose krijo nje tjeter."] ::msgcat::mcset bg "Control..." [encoding convertfrom utf-8 "\320\232\320\276\320\275\321\202\321\200\320\276\320\273 ..."] ::msgcat::mcset cz "Control..." [encoding convertfrom utf-8 "Ovl\303\241d\303\241n\303\255..."] ::msgcat::mcset de "Control..." [encoding convertfrom utf-8 "Kontrollfeld..."] ::msgcat::mcset el "Control..." [encoding convertfrom utf-8 "\316\210\316\273\316\265\316\263\317\207\316\277\317\202..."] ::msgcat::mcset en "Control..." [encoding convertfrom utf-8 "Control..."] ::msgcat::mcset es "Control..." [encoding convertfrom utf-8 "Control"] ::msgcat::mcset it "Control..." [encoding convertfrom utf-8 "Controlli ..."] ::msgcat::mcset ru "Control..." [encoding convertfrom utf-8 "\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265..."] ::msgcat::mcset sk "Control..." [encoding convertfrom utf-8 "Ovl\303\241danie..."] ::msgcat::mcset sq "Control..." [encoding convertfrom utf-8 "kontrolli. . ."] ::msgcat::mcset bg "BAC calculator..." [encoding convertfrom utf-8 "\320\232\320\260\320\273\320\272\321\203\320\273\320\260\321\202\320\276\321\200 \320\275\320\260 \320\260\320\273\320\272\320\276\321\205\320\276\320\273 ..."] ::msgcat::mcset cz "BAC calculator..." [encoding convertfrom utf-8 "Alkohol tester..."] ::msgcat::mcset de "BAC calculator..." [encoding convertfrom utf-8 "Blutalkoholrechner"] ::msgcat::mcset el "BAC calculator..." [encoding convertfrom utf-8 "\316\221\316\273\316\272\316\277\317\204\316\255\317\203\317\204..."] ::msgcat::mcset en "BAC calculator..." [encoding convertfrom utf-8 "BAC calculator..."] ::msgcat::mcset es "BAC calculator..." [encoding convertfrom utf-8 "Borrach\303\255metro"] ::msgcat::mcset it "BAC calculator..." [encoding convertfrom utf-8 "Calcolatore BAC ..."] ::msgcat::mcset ru "BAC calculator..." [encoding convertfrom utf-8 "\320\232\320\260\320\273\321\214\320\272\321\203\320\273\321\217\321\202\320\276\321\200 \320\260\320\273\320\272\320\276\320\263\320\276\320\273\321\217..."] ::msgcat::mcset sk "BAC calculator..." [encoding convertfrom utf-8 "Alkohol tester..."] ::msgcat::mcset sq "BAC calculator..." [encoding convertfrom utf-8 "matesi I alkoolit-BAC"] ::msgcat::mcset bg "Calibrate bitmap..." [encoding convertfrom utf-8 "\320\232\320\260\320\273\320\270\320\261\321\200\320\270\321\200\320\260\320\275\320\265 \320\275\320\260 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\265 ..."] ::msgcat::mcset de "Calibrate bitmap..." [encoding convertfrom utf-8 "Bild kalibrieren..."] ::msgcat::mcset it "Calibrate bitmap..." [encoding convertfrom utf-8 "Mappa georeferenziata..."] ::msgcat::mcset bg "About..." [encoding convertfrom utf-8 "\320\227\320\260 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\260\321\202\320\260 ..."] ::msgcat::mcset cz "About..." [encoding convertfrom utf-8 "O programu..."] ::msgcat::mcset de "About..." [encoding convertfrom utf-8 "\303\234ber..."] ::msgcat::mcset el "About..." [encoding convertfrom utf-8 "\316\243\317\207\316\265\317\204\316\271\316\272\316\254..."] ::msgcat::mcset en "About..." [encoding convertfrom utf-8 "About..."] ::msgcat::mcset es "About..." [encoding convertfrom utf-8 "Acerca de..."] ::msgcat::mcset it "About..." [encoding convertfrom utf-8 "Versione ..."] ::msgcat::mcset ru "About..." [encoding convertfrom utf-8 "\320\236 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\265..."] ::msgcat::mcset sk "About..." [encoding convertfrom utf-8 "O programe..."] ::msgcat::mcset sq "About..." [encoding convertfrom utf-8 "per programin\342\200\246"] ::msgcat::mcset bg "Search" [encoding convertfrom utf-8 "\320\242\321\212\321\200\321\201\320\265\320\275\320\265"] ::msgcat::mcset cz "Search" [encoding convertfrom utf-8 "Hledat"] ::msgcat::mcset de "Search" [encoding convertfrom utf-8 "Suche"] ::msgcat::mcset el "Search" [encoding convertfrom utf-8 "\316\221\316\275\316\261\316\266\316\256\317\204\316\267\317\203\316\267"] ::msgcat::mcset en "Search" [encoding convertfrom utf-8 "Search"] ::msgcat::mcset es "Search" [encoding convertfrom utf-8 "Buscar"] ::msgcat::mcset it "Search" [encoding convertfrom utf-8 "Cerca"] ::msgcat::mcset ru "Search" [encoding convertfrom utf-8 "\320\237\320\276\320\270\321\201\320\272"] ::msgcat::mcset sk "Search" [encoding convertfrom utf-8 "H\304\276ada\305\245"] ::msgcat::mcset sq "Search" [encoding convertfrom utf-8 "kerko"] ::msgcat::mcset bg "Close" [encoding convertfrom utf-8 "\320\227\320\260\321\202\320\262\320\276\321\200\320\270"] ::msgcat::mcset cz "Close" [encoding convertfrom utf-8 "Zav\305\231\303\255t"] ::msgcat::mcset de "Close" [encoding convertfrom utf-8 "Schlie\303\237en"] ::msgcat::mcset el "Close" [encoding convertfrom utf-8 "\316\232\316\273\316\265\316\257\317\203\316\271\316\274\316\277"] ::msgcat::mcset en "Close" [encoding convertfrom utf-8 "Close"] ::msgcat::mcset es "Close" [encoding convertfrom utf-8 "Cerrar"] ::msgcat::mcset it "Close" [encoding convertfrom utf-8 "Chiudi"] ::msgcat::mcset ru "Close" [encoding convertfrom utf-8 "\320\227\320\260\320\272\321\200\321\213\321\202\321\214"] ::msgcat::mcset sk "Close" [encoding convertfrom utf-8 "Zavrie\305\245"] ::msgcat::mcset sq "Close" [encoding convertfrom utf-8 "mbyll"] ::msgcat::mcset bg "theme all-symbols" [encoding convertfrom utf-8 "\320\262\321\201\320\270\321\207\320\272\320\270 \321\201\320\270\320\274\320\262\320\276\320\273\320\270"] ::msgcat::mcset cz "theme all-symbols" [encoding convertfrom utf-8 "v\305\241echny symboly"] ::msgcat::mcset de "theme all-symbols" [encoding convertfrom utf-8 "Alle Zeichen"] ::msgcat::mcset el "theme all-symbols" [encoding convertfrom utf-8 "\317\214\316\273\316\261"] ::msgcat::mcset it "theme all-symbols" [encoding convertfrom utf-8 "tutti"] ::msgcat::mcset ru "theme all-symbols" [encoding convertfrom utf-8 "\320\262\321\201\320\265"] ::msgcat::mcset sk "theme all-symbols" [encoding convertfrom utf-8 "v\305\241etky symboly"] ::msgcat::mcset sq "theme all-symbols" [encoding convertfrom utf-8 "tematizo te gjitha simbolet-shenjat"] ::msgcat::mcset bg "New file" [encoding convertfrom utf-8 "\320\235\320\276\320\262 \321\204\320\260\320\271\320\273"] ::msgcat::mcset de "New file" [encoding convertfrom utf-8 "Neue Datei"] ::msgcat::mcset el "New file" [encoding convertfrom utf-8 "\316\235\316\255\316\277 \316\261\317\201\317\207\316\265\316\257\316\277"] ::msgcat::mcset it "New file" [encoding convertfrom utf-8 "Nuovo"] ::msgcat::mcset sk "New file" [encoding convertfrom utf-8 "Nov\303\275 s\303\272bor"] ::msgcat::mcset sq "New file" [encoding convertfrom utf-8 "arkivi-fajlli I ri"] ::msgcat::mcset bg "Open file" [encoding convertfrom utf-8 "\320\236\321\202\320\262\320\276\321\200\320\270 \321\204\320\260\320\271\320\273"] ::msgcat::mcset de "Open file" [encoding convertfrom utf-8 "Datei \303\266ffnen"] ::msgcat::mcset el "Open file" [encoding convertfrom utf-8 "\316\206\316\275\316\277\316\271\316\263\316\274\316\261"] ::msgcat::mcset it "Open file" [encoding convertfrom utf-8 "Apri"] ::msgcat::mcset sk "Open file" [encoding convertfrom utf-8 "Otvori\305\245 s\303\272bor"] ::msgcat::mcset sq "Open file" [encoding convertfrom utf-8 "hape fajllin"] ::msgcat::mcset bg "Save file" [encoding convertfrom utf-8 "\320\227\320\260\320\277\320\270\321\210\320\270 \321\204\320\260\320\271\320\273"] ::msgcat::mcset de "Save file" [encoding convertfrom utf-8 "Datei speichern"] ::msgcat::mcset el "Save file" [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267"] ::msgcat::mcset it "Save file" [encoding convertfrom utf-8 "Salva"] ::msgcat::mcset sk "Save file" [encoding convertfrom utf-8 "Ulo\305\276i\305\245 s\303\272bor"] ::msgcat::mcset sq "Save file" [encoding convertfrom utf-8 "ruaje fajllin"] ::msgcat::mcset bg "Save file as" [encoding convertfrom utf-8 "\320\227\320\260\320\277\320\270\321\210\320\270 \321\204\320\260\320\271\320\273 \320\272\320\260\321\202\320\276"] ::msgcat::mcset de "Save file as" [encoding convertfrom utf-8 "Datei speichern als"] ::msgcat::mcset el "Save file as" [encoding convertfrom utf-8 "\316\221\317\200\316\277\316\270\316\256\316\272\316\265\317\205\317\203\316\267 \317\211\317\202"] ::msgcat::mcset it "Save file as" [encoding convertfrom utf-8 "Salva come"] ::msgcat::mcset sk "Save file as" [encoding convertfrom utf-8 "Ulo\305\276i\305\245 s\303\272bor ako"] ::msgcat::mcset sq "Save file as" [encoding convertfrom utf-8 "ruaje fajllin si"] ::msgcat::mcset bg "Close file" [encoding convertfrom utf-8 "\320\227\320\260\321\202\320\262\320\276\321\200\320\270 \321\204\320\260\320\271\320\273"] ::msgcat::mcset de "Close file" [encoding convertfrom utf-8 "Datei schlie\303\237en"] ::msgcat::mcset el "Close file" [encoding convertfrom utf-8 "\316\232\316\273\316\265\316\257\317\203\316\271\316\274\316\277 \316\261\317\201\317\207\316\265\316\257\316\277\317\205"] ::msgcat::mcset it "Close file" [encoding convertfrom utf-8 "Chiudi"] ::msgcat::mcset sk "Close file" [encoding convertfrom utf-8 "Zatvori\305\245 s\303\272bor"] ::msgcat::mcset sq "Close file" [encoding convertfrom utf-8 "mbylle fajllin"] ::msgcat::mcset bg "Switch to text editor" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\275\320\260 \321\202\320\265\320\272\321\201\321\202\320\276\320\262 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200"] ::msgcat::mcset de "Switch to text editor" [encoding convertfrom utf-8 "Zum Texteditor wechseln"] ::msgcat::mcset el "Switch to text editor" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\254\316\262\316\261\317\203\316\267 \317\203\316\265 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256 \316\272\316\265\316\271\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset it "Switch to text editor" [encoding convertfrom utf-8 "Editor di testi"] ::msgcat::mcset sk "Switch to text editor" [encoding convertfrom utf-8 "Prepn\303\272\305\245 na textov\303\275 editor"] ::msgcat::mcset sq "Switch to text editor" [encoding convertfrom utf-8 "kalo tek editori i tekstit"] ::msgcat::mcset bg "Switch to map editor" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\275\320\260 \321\200\320\265\320\264\320\260\320\272\321\202\320\276\321\200 \320\275\320\260 \320\272\320\260\321\200\321\202\320\270"] ::msgcat::mcset de "Switch to map editor" [encoding convertfrom utf-8 "Zum Karteneditor wechseln"] ::msgcat::mcset el "Switch to map editor" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\254\316\262\316\261\317\203\316\267 \317\203\316\265 \316\265\317\200\316\265\316\276\316\265\317\201\316\263\316\261\317\203\317\204\316\256 \317\203\317\207\316\265\316\264\316\257\316\277\317\205"] ::msgcat::mcset it "Switch to map editor" [encoding convertfrom utf-8 "Editor di mappe"] ::msgcat::mcset sk "Switch to map editor" [encoding convertfrom utf-8 "Prepn\303\272\305\245 na mapov\303\275 editor"] ::msgcat::mcset sq "Switch to map editor" [encoding convertfrom utf-8 "kalo tek editori I hartes"] ::msgcat::mcset bg "Switch to compiler" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\275\320\260 \320\272\320\276\320\274\320\277\320\270\320\273\320\260\321\202\320\276\321\200"] ::msgcat::mcset de "Switch to compiler" [encoding convertfrom utf-8 "Zum Compiler wechseln"] ::msgcat::mcset el "Switch to compiler" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\254\316\262\316\261\317\203\316\267 \317\203\316\265 \317\203\317\205\316\275\317\204\316\254\316\272\317\204\316\267"] ::msgcat::mcset it "Switch to compiler" [encoding convertfrom utf-8 "Compilatore"] ::msgcat::mcset sk "Switch to compiler" [encoding convertfrom utf-8 "Prepn\303\272\305\245 na kompil\303\241tor"] ::msgcat::mcset sq "Switch to compiler" [encoding convertfrom utf-8 "kalo tek kompilatori"] ::msgcat::mcset bg "Compile" [encoding convertfrom utf-8 "\320\232\320\276\320\274\320\277\320\270\320\273\320\270\321\200\320\260\320\271"] ::msgcat::mcset cz "Compile" [encoding convertfrom utf-8 "Kompilovat"] ::msgcat::mcset de "Compile" [encoding convertfrom utf-8 "Compilieren"] ::msgcat::mcset el "Compile" [encoding convertfrom utf-8 "\316\243\317\215\316\275\317\204\316\261\316\276\316\267"] ::msgcat::mcset en "Compile" [encoding convertfrom utf-8 "Compile"] ::msgcat::mcset es "Compile" [encoding convertfrom utf-8 "Compilar"] ::msgcat::mcset it "Compile" [encoding convertfrom utf-8 "Compila"] ::msgcat::mcset ru "Compile" [encoding convertfrom utf-8 "\320\232\320\276\320\274\320\277\320\270\320\273\320\270\321\200\320\276\320\262\320\260\321\202\321\214"] ::msgcat::mcset sk "Compile" [encoding convertfrom utf-8 "Kompilova\305\245"] ::msgcat::mcset sq "Compile" [encoding convertfrom utf-8 "kompilo"] ::msgcat::mcset bg "Switch to select mode" [encoding convertfrom utf-8 "\320\237\321\200\320\265\320\262\320\272\320\273\321\216\321\207\320\270 \320\275\320\260 \321\200\320\265\320\266\320\270\320\274 '\320\230\320\267\320\261\320\270\321\200\320\260\320\275\320\265'"] ::msgcat::mcset de "Switch to select mode" [encoding convertfrom utf-8 "In Auswahlmodus wechseln"] ::msgcat::mcset el "Switch to select mode" [encoding convertfrom utf-8 "\316\234\316\265\317\204\316\254\316\262\316\261\317\203\316\267 \317\203\316\265 \316\273\316\265\316\271\317\204\316\277\317\205\317\201\316\263\316\257\316\261 \316\265\317\200\316\271\316\273\316\277\316\263\316\256\317\202"] ::msgcat::mcset it "Switch to select mode" [encoding convertfrom utf-8 "Modalit\303\240 di selezione"] ::msgcat::mcset sk "Switch to select mode" [encoding convertfrom utf-8 "Prepn\303\272\305\245 do m\303\263du na v\303\275ber objektu"] ::msgcat::mcset sq "Switch to select mode" [encoding convertfrom utf-8 "kalo tek moduli per selekcionim"] ::msgcat::mcset bg "Select next scrap" [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\270\321\217\321\202 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset de "Select next scrap" [encoding convertfrom utf-8 "N\303\244chste Skizze ausw\303\244hlen"] ::msgcat::mcset el "Select next scrap" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \316\265\317\200\317\214\316\274\316\265\316\275\316\277\317\205 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "Select next scrap" [encoding convertfrom utf-8 "Seleziona il prossimo scrap"] ::msgcat::mcset sk "Select next scrap" [encoding convertfrom utf-8 "Vyber nasleduj\303\272ci scrap"] ::msgcat::mcset sq "Select next scrap" [encoding convertfrom utf-8 "zgjedhe deponin e ardhshme"] ::msgcat::mcset bg "Select next area" [encoding convertfrom utf-8 "\320\230\320\267\320\261\320\265\321\200\320\270 \321\201\320\273\320\265\320\264\320\262\320\260\321\211\320\260\321\202\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset de "Select next area" [encoding convertfrom utf-8 "N\303\244chste Fl\303\244che ausw\303\244hlen"] ::msgcat::mcset el "Select next area" [encoding convertfrom utf-8 "\316\225\317\200\316\271\316\273\316\277\316\263\316\256 \316\265\317\200\317\214\316\274\316\265\316\275\316\267\317\202 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset it "Select next area" [encoding convertfrom utf-8 "Seleziona la prossima area"] ::msgcat::mcset sk "Select next area" [encoding convertfrom utf-8 "Vyber nasleduj\303\272cu plochu"] ::msgcat::mcset sq "Select next area" [encoding convertfrom utf-8 "zgjedhe-selekto fushen e ardhshme"] ::msgcat::mcset bg "Zoom in" [encoding convertfrom utf-8 "\320\237\321\200\320\270\320\261\320\273\320\270\320\266\320\270"] ::msgcat::mcset de "Zoom in" [encoding convertfrom utf-8 "Vergr\303\266\303\237ern"] ::msgcat::mcset el "Zoom in" [encoding convertfrom utf-8 "\316\234\316\265\316\263\316\255\316\270\317\205\316\275\317\203\316\267"] ::msgcat::mcset it "Zoom in" [encoding convertfrom utf-8 "Zoom in"] ::msgcat::mcset sk "Zoom in" [encoding convertfrom utf-8 "Zv\303\244\304\215\305\241i\305\245"] ::msgcat::mcset sq "Zoom in" [encoding convertfrom utf-8 "zmadho"] ::msgcat::mcset bg "Zoom out" [encoding convertfrom utf-8 "\320\236\321\202\320\264\320\260\320\273\320\265\321\207\320\270"] ::msgcat::mcset de "Zoom out" [encoding convertfrom utf-8 "Verkleinern"] ::msgcat::mcset el "Zoom out" [encoding convertfrom utf-8 "\316\243\316\274\316\257\316\272\317\201\317\205\316\275\317\203\316\267"] ::msgcat::mcset it "Zoom out" [encoding convertfrom utf-8 "Zoom out"] ::msgcat::mcset sk "Zoom out" [encoding convertfrom utf-8 "Zmen\305\241i\305\245"] ::msgcat::mcset sq "Zoom out" [encoding convertfrom utf-8 "zvogelo"] ::msgcat::mcset bg "Insert new scrap" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\275\320\276\320\262 \321\201\320\272\321\200\320\260\320\277"] ::msgcat::mcset de "Insert new scrap" [encoding convertfrom utf-8 "Neue Skizze einf\303\274gen"] ::msgcat::mcset el "Insert new scrap" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\275\316\255\316\277\317\205 \317\203\316\272\317\201\316\261\317\200"] ::msgcat::mcset it "Insert new scrap" [encoding convertfrom utf-8 "Inserisci un nuovo scrap"] ::msgcat::mcset sk "Insert new scrap" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 nov\303\275 scrap"] ::msgcat::mcset sq "Insert new scrap" [encoding convertfrom utf-8 "fute deponin e re"] ::msgcat::mcset bg "Insert new point" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\275\320\276\320\262\320\260 \321\202\320\276\321\207\320\272\320\260"] ::msgcat::mcset de "Insert new point" [encoding convertfrom utf-8 "Neuen Punkt einf\303\274gen"] ::msgcat::mcset el "Insert new point" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\275\316\255\316\277\317\205 \317\203\316\267\316\274\316\265\316\257\316\277\317\205"] ::msgcat::mcset it "Insert new point" [encoding convertfrom utf-8 "Inserisci un nuovo punto"] ::msgcat::mcset sk "Insert new point" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 nov\303\275 bod"] ::msgcat::mcset sq "Insert new point" [encoding convertfrom utf-8 "fute piken e re"] ::msgcat::mcset bg "Insert new line" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\275\320\276\320\262\320\260 \320\273\320\270\320\275\320\270\321\217"] ::msgcat::mcset de "Insert new line" [encoding convertfrom utf-8 "Neue Linie einf\303\274gen"] ::msgcat::mcset el "Insert new line" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\275\316\255\316\261\317\202 \316\263\317\201\316\261\316\274\316\274\316\256\317\202"] ::msgcat::mcset it "Insert new line" [encoding convertfrom utf-8 "Inserisci una nuova linea"] ::msgcat::mcset sk "Insert new line" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 nov\303\272 krivku"] ::msgcat::mcset sq "Insert new line" [encoding convertfrom utf-8 "fute rrjeshtin e ri"] ::msgcat::mcset bg "Insert new area" [encoding convertfrom utf-8 "\320\222\320\274\321\212\320\272\320\275\320\270 \320\275\320\276\320\262\320\260 \320\276\320\261\320\273\320\260\321\201\321\202"] ::msgcat::mcset de "Insert new area" [encoding convertfrom utf-8 "Neue Fl\303\244che einf\303\274gen"] ::msgcat::mcset el "Insert new area" [encoding convertfrom utf-8 "\316\225\316\271\317\203\316\261\316\263\317\211\316\263\316\256 \316\275\316\255\316\261\317\202 \316\265\317\200\316\271\317\206\316\254\316\275\316\265\316\271\316\261\317\202"] ::msgcat::mcset it "Insert new area" [encoding convertfrom utf-8 "Inserisci una nuova area"] ::msgcat::mcset sk "Insert new area" [encoding convertfrom utf-8 "Vlo\305\276i\305\245 nov\303\272 plochu"] ::msgcat::mcset sq "Insert new area" [encoding convertfrom utf-8 "fute fushen e re"] ::msgcat::mcset bg "Delete selected object" [encoding convertfrom utf-8 "\320\230\320\267\321\202\321\200\320\270\320\271 \320\270\320\267\320\261\321\200\320\260\320\275\320\270\321\217\321\202 \320\276\320\261\320\265\320\272\321\202"] ::msgcat::mcset de "Delete selected object" [encoding convertfrom utf-8 "Ausgew\303\244hltes Objekt l\303\266schen"] ::msgcat::mcset el "Delete selected object" [encoding convertfrom utf-8 "\316\264\316\271\316\261\316\263\317\201\316\261\317\206\316\256 \316\265\317\200\316\271\316\273\316\265\316\263\316\274\316\255\316\275\316\277\317\205"] ::msgcat::mcset it "Delete selected object" [encoding convertfrom utf-8 "Rimuovi l'oggetto selezionato"] ::msgcat::mcset sk "Delete selected object" [encoding convertfrom utf-8 "Zma\305\276 ozna\304\215en\303\251 objekty"] ::msgcat::mcset sq "Delete selected object" [encoding convertfrom utf-8 "fshije objektin e selektuar"] ::msgcat::mcset bg "theme basic-symbols" [encoding convertfrom utf-8 "\320\276\321\201\320\275\320\276\320\262\320\275\320\270 \321\201\320\270\320\274\320\262\320\276\320\273\320\270"] ::msgcat::mcset cz "theme basic-symbols" [encoding convertfrom utf-8 "z\303\241kladn\303\255 symboly"] ::msgcat::mcset de "theme basic-symbols" [encoding convertfrom utf-8 "Grundsymbole"] ::msgcat::mcset el "theme basic-symbols" [encoding convertfrom utf-8 "\316\262\316\261\317\203\316\271\316\272\316\254 \317\203\317\215\316\274\316\262\316\277\316\273\316\261"] ::msgcat::mcset it "theme basic-symbols" [encoding convertfrom utf-8 "base"] ::msgcat::mcset ru "theme basic-symbols" [encoding convertfrom utf-8 "\320\276\321\201\320\275\320\276\320\262\320\275\321\213\320\265"] ::msgcat::mcset sk "theme basic-symbols" [encoding convertfrom utf-8 "z\303\241kladn\303\251 symboly"] ::msgcat::mcset sq "theme basic-symbols" [encoding convertfrom utf-8 "tema simbolet-baze"] ::msgcat::mcset bg "theme passage-fills" [encoding convertfrom utf-8 "\321\200\320\265\320\273\320\265\321\204 \320\275\320\260 \320\263\320\260\320\273\320\265\321\200\320\270\321\217\321\202\320\260"] ::msgcat::mcset cz "theme passage-fills" [encoding convertfrom utf-8 "v\303\275pl\305\210"] ::msgcat::mcset de "theme passage-fills" [encoding convertfrom utf-8 "Gangf\303\274llungen"] ::msgcat::mcset el "theme passage-fills" [encoding convertfrom utf-8 "\316\263\316\255\316\274\316\271\317\203\316\274\316\261 \317\203\317\204\316\277\317\216\316\275"] ::msgcat::mcset it "theme passage-fills" [encoding convertfrom utf-8 "riempimenti"] ::msgcat::mcset ru "theme passage-fills" [encoding convertfrom utf-8 "\321\200\320\265\320\273\321\214\320\265\321\204 \321\205\320\276\320\264\320\260"] ::msgcat::mcset sk "theme passage-fills" [encoding convertfrom utf-8 "v\303\275pl\305\210"] ::msgcat::mcset sq "theme passage-fills" [encoding convertfrom utf-8 "tema mbushjet e kalimeve"] ::msgcat::mcset bg "theme speleothems" [encoding convertfrom utf-8 "\321\201\320\277\320\265\320\273\320\265\320\276\321\204\320\276\321\200\320\274\320\270"] ::msgcat::mcset cz "theme speleothems" [encoding convertfrom utf-8 "v\303\275zdoba"] ::msgcat::mcset de "theme speleothems" [encoding convertfrom utf-8 "Sinter"] ::msgcat::mcset el "theme speleothems" [encoding convertfrom utf-8 "\317\203\317\200\316\267\316\273\316\261\316\271\316\277\316\270\316\255\316\274\316\261\317\204\316\261"] ::msgcat::mcset it "theme speleothems" [encoding convertfrom utf-8 "speleotemi"] ::msgcat::mcset ru "theme speleothems" [encoding convertfrom utf-8 "\321\201\320\277\320\265\320\273\320\265\320\276-\321\204\320\276\321\200\320\274\321\213"] ::msgcat::mcset sk "theme speleothems" [encoding convertfrom utf-8 "v\303\275zdoba"] ::msgcat::mcset sq "theme speleothems" [encoding convertfrom utf-8 "speleo-tema"] ::msgcat::mcset bg "theme equipement" [encoding convertfrom utf-8 "\320\265\320\272\320\270\320\277\320\270\321\200\320\260\320\275\320\265"] ::msgcat::mcset cz "theme equipement" [encoding convertfrom utf-8 "vystrojen\303\255"] ::msgcat::mcset de "theme equipement" [encoding convertfrom utf-8 "Ausr\303\274stung"] ::msgcat::mcset el "theme equipement" [encoding convertfrom utf-8 "\316\265\316\276\316\277\317\200\316\273\316\271\317\203\316\274\317\214\317\202"] ::msgcat::mcset it "theme equipement" [encoding convertfrom utf-8 "armo"] ::msgcat::mcset ru "theme equipement" [encoding convertfrom utf-8 "\320\276\320\261\320\276\321\200\321\203\320\264\320\276\320\262\320\260\320\275\320\270\320\265"] ::msgcat::mcset sk "theme equipement" [encoding convertfrom utf-8 "vystrojenie"] ::msgcat::mcset sq "theme equipement" [encoding convertfrom utf-8 "tema pajisjet"] therion/xtherion/me_import.tcl0000664000175000017500000006673511133066726015633 0ustar useruser#TODO: + add more objects in DXF export # + add SVG import using tcldom library set utldbg 0 set xth(ptopoxvi_resolution) 200 set xth(ptopoxvi_scale) 200 set xth(ptopoxvi_grid) 1.0 set xth(ptopoxvi_projection) PLAN proc xth_me_pt2xvitrans {x y} { global xth upvar l_scale scale upvar l_minx minx upvar l_maxx maxx upvar l_miny miny upvar l_maxy maxy upvar l_def ldef if {[catch {set x [expr double($x) * $scale]}]} return {} if {[catch {set y [expr double($y) * $scale]}]} return {} if {!$ldef} { set ldef 1 set minx $x set miny $y set maxx $x set maxy $y } else { if {$minx > $x} {set minx $x} if {$maxx < $x} {set maxx $x} if {$miny > $y} {set miny $y} if {$maxy < $y} {set maxy $y} } return [list [format "%.2f" $x] [format "%.2f" $y]] } proc xth_me_ptopo2xvi {fname} { global xth # create bitmap set xviname $fname set dp $xth(gui,main).ptopoxvidlg Dialog $dp -title [mc "XVI properties"] -parent $xth(gui,main) -default 0 set df [$dp getframe] Label $df.l1 -text [mc "Scale 1 : "] Entry $df.e1 -textvariable xth(ptopoxvi_scale) -width 8 Label $df.l2 -text [mc "Resolution (dpi)"] Entry $df.e2 -textvariable xth(ptopoxvi_resolution) -width 8 Label $df.l3 -text [mc "Grid spacing (m)"] Entry $df.e3 -textvariable xth(ptopoxvi_grid) -width 8 radiobutton $df.p -text "Plan" -variable xth(ptopoxvi_projection) -value PLAN radiobutton $df.x -text "Extended elevation" -variable xth(ptopoxvi_projection) -value ELEVATION grid $df.l1 -column 0 -row 0 -sticky nes -padx 2 -pady 2 grid $df.e1 -column 1 -row 0 -sticky news -padx 2 -pady 2 grid $df.l2 -column 0 -row 1 -sticky nes -padx 2 -pady 2 grid $df.e2 -column 1 -row 1 -sticky news -padx 2 -pady 2 grid $df.l3 -column 0 -row 2 -sticky nes -padx 2 -pady 2 grid $df.e3 -column 1 -row 2 -sticky news -padx 2 -pady 2 grid $df.p -column 0 -columnspan 2 -row 3 -sticky nws -padx 2 grid $df.x -column 0 -columnspan 2 -row 4 -sticky nws -padx 2 $dp add -name ok $dp draw destroy $dp if {[catch {set xth(ptopoxvi_resolution) [expr int($xth(ptopoxvi_resolution))]}]} { set xth(ptopoxvi_resolution) 200 } if {[catch {set xth(ptopoxvi_scale) [expr int($xth(ptopoxvi_scale))]}]} { set xth(ptopoxvi_scale) 200 } if {[catch {set xth(ptopoxvi_grid) [expr double($xth(ptopoxvi_grid))]}]} { set xth(ptopoxvi_grid) 1 } # read pocket topo file and write XVI file if {[string equal $xth(ptopoxvi_projection) PLAN]} { set projid p } else { set projid e } set xvifname "[file rootname $fname]_$projid.xvi" set xvifnum 0 while {[file exists $xvifname]} { set xvifname "[file rootname $fname]_$projid$xvifnum.xvi" incr xvifnum } set fi [open $fname r] set indata 0 set inpolyline 0 set inshots 0 set instations 0 set XVIstations {} set XVIshots {} set XVIgrid {} set polylines {} set l_minx 0 set l_maxx 0 set l_miny 0 set l_maxy 0 set l_def 0 set l_scale [expr 1.0 / double($xth(ptopoxvi_scale)) * 100.0 / 2.54 * double($xth(ptopoxvi_resolution))] while {![eof $fi]} { gets $fi ln if {[string equal $ln $xth(ptopoxvi_projection)]} { set indata 1 } elseif {[string equal $ln PLAN] || [string equal $ln ELEVATION]} { set indata 0 } if {$indata} { switch -- [lindex $ln 0] { STATIONS { set inpolyline 0 set inshots 0 set instations 1 } SHOTS { set inpolyline 0 set inshots 1 set instations 0 } POLYLINE { set inpolyline 1 set inshots 0 set instations 0 append polylines "\n[string tolower [lindex $ln 1]]" } } if {$instations} { if {[llength $ln] == 3} { set stc [xth_me_pt2xvitrans [lindex $ln 0] [lindex $ln 1]] if {[llength $stc] == 2} { append XVIstations " {[list [lindex $stc 0] [lindex $stc 1] [lindex $ln 2]]}\n" } } } if {$inshots} { if {[llength $ln] == 4} { set stc1 [xth_me_pt2xvitrans [lindex $ln 0] [lindex $ln 1]] set stc2 [xth_me_pt2xvitrans [lindex $ln 2] [lindex $ln 3]] if {([llength $stc1] == 2) && ([llength $stc2] == 2)} { append XVIshots " {[list [lindex $stc1 0] [lindex $stc1 1] [lindex $stc2 0] [lindex $stc2 1]]}\n" } } } if {$inpolyline} { if {[llength $ln] == 2} { set stc [xth_me_pt2xvitrans [lindex $ln 0] [lindex $ln 1]] if {[llength $stc] == 2} { append polylines " [list [lindex $stc 0] [lindex $stc 1]]" } } } } } close $fi if {$l_def} { set gsize [expr $xth(ptopoxvi_grid) * $l_scale] set l_minx [expr $l_minx - 0.5 * $gsize] set l_maxx [expr $l_maxx] set l_miny [expr $l_miny - 0.5 * $gsize] set l_maxy [expr $l_maxy] set XVIsketchlines {} set pll [split $polylines "\n"] foreach pl $pll { if {[llength $pl] == 3} { append XVIsketchlines " {[list [lindex $pl 0] [lindex $pl 1] [lindex $pl 2]]}\n" } elseif {[llength $pl] > 3} { append XVIsketchlines " {$pl}\n" } } set fo [open $xvifname w] puts $fo "set XVIgrids {$xth(ptopoxvi_grid) m}" puts $fo "set XVIstations {\n$XVIstations}" puts $fo "set XVIshots {\n$XVIshots}" puts $fo "set XVIsketchlines {\n$XVIsketchlines}" puts $fo "set XVIgrid {[list $l_minx $l_miny $gsize 0.0 0.0 $gsize [expr int(($l_maxx - $l_minx) / $gsize) + 1] [expr int(($l_maxy - $l_miny) / $gsize) + 1]]}" close $fo return $xvifname } return {} } proc xth_me_import_check_outline {coutline pt} { set px [expr double([lindex $pt 0])] set py [expr double([lindex $pt 1])] if {[llength $coutline] == 4} { if {[lindex $coutline 0] > $px} {lset coutline 0 $px} if {[lindex $coutline 1] > $py} {lset coutline 1 $py} if {[lindex $coutline 2] < $px} {lset coutline 2 $px} if {[lindex $coutline 3] < $py} {lset coutline 3 $py} } else { set coutline [list $px $py $px $py] } return $coutline } set xthmeimpcdlp {} proc xth_me_import_check_distance {cdist p2} { global xthmeimpcdlp if {[llength $xthmeimpcdlp] == 0} { set xthmeimpcdlp $p2 return $cdist } set p1 $xthmeimpcdlp set ndist [expr hypot(double([lindex $p1 0]) - double([lindex $p2 0]),double([lindex $p1 1]) - double([lindex $p2 1]))] if {($ndist > 0.0) && (($ndist < $cdist) || ($cdist < 0.0))} { return $ndist } else { return $cdist } } proc xth_me_import_dxf {fnm} { global xth utldbg set rv(olist) {} set fid [open $fnm r] set cmd 0 set val 0 set curcmd {} set cursec {} set x0 0.0 set x1 0.0 set lastcmdn 0 set lastcmd {} set curcmdn 0 set outcmdn -1 set outline {} set distance -1.0 set curdat {} set curseq {} set polylinevx 0 set nofitpoint 1 set hasx0 0 set hasx1 0 incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) scrap set rv(odata,$outcmdn,opts) {} set rv(odata,$outcmdn,data) {} if $utldbg { puts -nonewline "reading $fnm ..." } else { xth_status_bar_push me xth_status_bar_status me "reading $fnm ..." } set line_number 0 while {![eof $fid]} { set cmd $val gets $fid val incr line_number if {($line_number % 1000) == 0} { if $utldbg { puts -nonewline "." } else { xth_status_bar_status me "reading $fnm ... (line $line_number)" } } regsub {^\s+} $val {} val regsub {\s+$} $val {} val if {([string length $cursec] == 0) && [string equal $cmd 0] && [string equal -nocase $val SECTION]} { set cursec UNKNOWN set curcmd {} } elseif {[string equal $cmd 2] && [string equal $cursec UNKNOWN] && [regexp {^([A-Z]+)$} $val dum newsec]} { set cursec [string toupper $newsec] } elseif {([string length $cursec] > 0) && [string equal $cmd 0] && [regexp {^((3D)?[A-Z]+)$} $val dum newcmd]} { set lastcmd $curcmd incr curcmdn set curcmd {} set curdat {} set newcmd [string toupper $newcmd] if {[string equal $newcmd ENDSEC]} { set curcmd {} set cursec {} } else { switch -- $newcmd { POLYLINE { set curseq $newcmd set polylinevx 0 } SEQEND { set curseq {} } } set curcmd $newcmd } } # parse entities if {[string equal $cursec ENTITIES]} { set postprocess 0 switch -- $cmd { 10 {set x0 [expr double($val)]; set hasx0 1} 11 {set x1 [expr double($val)]; set hasx1 1} 20 {set y0 [expr double($val)]; if {$hasx0} {set postprocess 1}; set hasx0 0} 21 {set y1 [expr double($val)]; if {$hasx1} {set postprocess 1}; set hasx1 0} 40 {set n40 [expr double($val)]} 50 {set n50 [expr double($val)]} 51 {set n51 [expr double($val)]; set postprocess 1} } set cmdinserted 0 if {$postprocess} { switch -- $curcmd { CIRCLE { if {[string equal $cmd 20]} { set cpoint [list $x0 $y0] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] incr outcmdn lappend rv(olist) $outcmdn lappend curdat $cpoint set rv(odata,$outcmdn,type) point set rv(odata,$outcmdn,opts) "#CIRCLE" set rv(odata,$outcmdn,data) $curdat } } POINT { if {[string equal $cmd 20]} { set cpoint [list $x0 $y0] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] incr outcmdn lappend rv(olist) $outcmdn lappend curdat $cpoint set rv(odata,$outcmdn,type) point set rv(odata,$outcmdn,opts) "#POINT" set rv(odata,$outcmdn,data) $curdat } } ARC { #TODO: Fit arc with bezier curve, not line if {[string equal $cmd 51]} { if {$n50 > $n51} {set n51 [expr $n51 + 360.0]} set rstep [expr ($n51 - $n50) / (round(($n51 - $n50) / 10.0) + 1)] set curdat {} for {set cr $n50} {$cr < $n51} {set cr [expr $cr + $rstep]} { set crr [expr $cr / 180.0 * 3.14159265359] set cpoint [list [expr $x0 + $n40 * cos($crr)] [expr $y0 + $n40 * sin($crr)]] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] lappend curdat $cpoint } set cr $n51 set crr [expr $cr / 180.0 * 3.14159265359] set cpoint [list [expr $x0 + $n40 * cos($crr)] [expr $y0 + $n40 * sin($crr)]] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] lappend curdat $cpoint incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) line set rv(odata,$outcmdn,opts) "#ARC" set rv(odata,$outcmdn,data) $curdat } } VERTEX { if {[string equal $cmd 20]} { set cpoint [list $x0 $y0] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] if {[string equal $curseq POLYLINE]} { if {$polylinevx == 0} { incr outcmdn lappend rv(olist) $outcmdn lappend curdat $cpoint set rv(odata,$outcmdn,type) line set rv(odata,$outcmdn,opts) "#POLYLINE" set rv(odata,$outcmdn,data) $curdat } if {![string equal [lindex $rv(odata,$outcmdn,data) end] $cpoint]} { lappend rv(odata,$outcmdn,data) $cpoint } incr polylinevx } else { incr outcmdn lappend rv(olist) $outcmdn lappend curdat $cpoint set rv(odata,$outcmdn,type) point set rv(odata,$outcmdn,opts) "#VERTEX" set rv(odata,$outcmdn,data) $curdat } } } LWPOLYLINE { if {[string equal $cmd 20]} { set cpoint [list $x0 $y0] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] lappend curdat $cpoint } if {[llength $curdat] == 2} { incr outcmdn lappend rv(olist) $outcmdn lappend curdat $cpoint set rv(odata,$outcmdn,type) line set rv(odata,$outcmdn,opts) "#LWPOLYLINE" set rv(odata,$outcmdn,data) $curdat } elseif {[llength $curdat] > 2} { set rv(odata,$outcmdn,data) $curdat } } SPLINE { if {[string equal $cmd 20] || [string equal $cmd 21]} { if {[llength $curdat] == 0} { set nofitpoint 1 } set cpoint {} if {[string equal $cmd 20]} { if {$nofitpoint} { set cpoint [list $x0 $y0] } } else { if {$nofitpoint} { if {[llength $curdat] >= 2} { incr outcmdn -1 set rv(olist) [lrange $rv(olist) 0 end-1] } set curdat {} set nofitpoint 0 } set cpoint [list $x1 $y1] } if {([llength $cpoint] > 0) && (![string equal [lindex $curdat end] $cpoint])} { set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] lappend curdat $cpoint if {[llength $curdat] == 2} { incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) line set rv(odata,$outcmdn,opts) "#SPLINE" set rv(odata,$outcmdn,data) $curdat } elseif {[llength $curdat] > 2} { if {$nofitpoint && ([llength $curdat] > 3)} { if {([llength [lindex $curdat end]] == 2) && ([llength [lindex $curdat end-1]] == 2) && ([llength [lindex $curdat end-2]] == 2)} { set curdat [lreplace $curdat end-2 end "[lindex $curdat end-2] [lindex $curdat end-1] [lindex $curdat end]"] } } if {(!$nofitpoint) && ([llength $curdat] > 2)} { set pp0 [lindex $curdat end-2] set pp1 [lindex $curdat end-1] set pp2 [lindex $curdat end] set p0x [lindex $pp0 end-1] set p0y [lindex $pp0 end] set p1x [lindex $pp1 end-1] set p1y [lindex $pp1 end] set p2x [lindex $pp2 end-1] set p2y [lindex $pp2 end] set l1 [expr hypot($p1x - $p0x, $p1y - $p0y)] set l2 [expr hypot($p2x - $p1x, $p2y - $p1y)] if {($l1 > 0.0) && ($l2 > 0.0)} { set n1x [expr ($p1x - $p0x) / $l1] set n1y [expr ($p1y - $p0y) / $l1] set n2x [expr ($p2x - $p1x) / $l2] set n2y [expr ($p2y - $p1y) / $l2] set nx [expr $l2 * $n1x + $l1 * $n2x] set ny [expr $l2 * $n1y + $l1 * $n2y] set nl [expr hypot($nx, $ny)] if {$nl > 0.0} { set nx [expr $nx / $nl] set ny [expr $ny / $nl] set c1x [expr $p1x - 0.33 * $l1 * $nx] set c1y [expr $p1y - 0.33 * $l1 * $ny] set c2x [expr $p1x + 0.33 * $l2 * $nx] set c2y [expr $p1y + 0.33 * $l2 * $ny] set p1path [lindex $curdat end-1] if {[llength $p1path] == 6} { set p1path [list [lindex $p1path 0] [lindex $p1path 1] $c1x $c1y $p1x $p1y] } else { set p1path [list [expr 0.5 * ($c1x + $p0x)] [expr 0.5 * ($c1y + $p0y)] $c1x $c1y $p1x $p1y] } set p2path [list $c2x $c2y [expr 0.5 * ($c2x + $p2x)] [expr 0.5 * ($c2y + $p2y)] $p2x $p2y] set curdat [lreplace $curdat end-1 end $p1path $p2path] } } } set rv(odata,$outcmdn,data) $curdat } } } } LINE { if {[string equal $cmd 20]} { set cpoint [list $x0 $y0] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] lappend curdat $cpoint } elseif {[string equal $cmd 21]} { set cpoint [list $x1 $y1] set distance [xth_me_import_check_distance $distance $cpoint] set outline [xth_me_import_check_outline $outline $cpoint] if {($outcmdn >= 0) && [string equal $lastcmd LINE] && [string equal [lindex $rv(odata,$outcmdn,data) end] [lindex $curdat 0]]} { if {![string equal [lindex $rv(odata,$outcmdn,data) end] $cpoint]} { lappend rv(odata,$outcmdn,data) $cpoint } } else { incr outcmdn lappend rv(olist) $outcmdn lappend curdat $cpoint set rv(odata,$outcmdn,type) line set rv(odata,$outcmdn,opts) "#LINE" set rv(odata,$outcmdn,data) $curdat } } } } } } } close $fid if $utldbg { puts "done." } else { xth_status_bar_pop me } incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) endscrap set rv(odata,$outcmdn,opts) {} set rv(odata,$outcmdn,data) {} set rv(dist) $distance set rv(bbox) $outline return [array get rv] } proc xth_xml_get_flag {flags flag} { if {[regexp "(^|\\s)\\s*$flag\\s*\\=\\s*\\\"(\[^\\\"\]*)\\\"" $flags dum dum1 data]} { return $data } elseif {[regexp "(^|\\s)\\s*$flag\\s*\\=\\s*\\\'(\[^\\\'\]*)\\\'" $flags dum dum1 data]} { return $data } else { return {} } } proc xth_xml_clear_flag {flagsVar flag} { upvar 1 $flagsVar flags regsub "(^|\\s)\\s*$flag\\s*\\=\\s*\\\"(\[^\\\"\]*)\\\"" $flags {} flags regsub "(^|\\s)\\s*$flag\\s*\\=\\s*\\\'(\[^\\\'\]*)\\\'" $flags {} flags } proc xth_me_impsvg_trans {xVar yVar distVar outVar matrix} { upvar 1 $xVar x $yVar y $distVar distance $outVar outline set nx [expr double($x) * [lindex $matrix 0] + double($y) * [lindex $matrix 2] + [lindex $matrix 4]] set ny [expr double($x) * [lindex $matrix 1] + double($y) * [lindex $matrix 3] + [lindex $matrix 5]] set x $nx set y [expr -1.0 * $ny] set distance [xth_me_import_check_distance $distance [list $x $y]] set outline [xth_me_import_check_outline $outline [list $x $y]] } proc xth_me_impsvg_mm {A B} { set m0 [expr [lindex $A 0] * [lindex $B 0] + [lindex $A 2] * [lindex $B 1]] set m1 [expr [lindex $A 1] * [lindex $B 0] + [lindex $A 3] * [lindex $B 1]] set m2 [expr [lindex $A 0] * [lindex $B 2] + [lindex $A 2] * [lindex $B 3]] set m3 [expr [lindex $A 1] * [lindex $B 2] + [lindex $A 3] * [lindex $B 3]] set m4 [expr [lindex $A 0] * [lindex $B 4] + [lindex $A 2] * [lindex $B 5] + [lindex $A 4]] set m5 [expr [lindex $A 1] * [lindex $B 4] + [lindex $A 3] * [lindex $B 5] + [lindex $A 5]] return [list $m0 $m1 $m2 $m3 $m4 $m5] } proc xth_me_impsvg_push_transform {cmatrixVar lmatrixVar transformStr} { upvar 1 $cmatrixVar cmatrix $lmatrixVar lmatrix set nmatrix $cmatrix regsub {\)} $transformStr ")\n" transformStr set tl [split $transformStr "\n"] foreach t $tl { if {[regexp -nocase {(\w+)\(([E\+\-\d\.\,]+)\)} $t dum type param]} { set paraml [split $param ","] set xmatrix {1.0 0.0 0.0 1.0 0.0 0.0} switch -- $type { translate { if {[llength $paraml] == 2} { set xmatrix [list 1.0 0.0 0.0 1.0 [expr double([lindex $paraml 0])] [expr double([lindex $paraml 1])]] } } scale { if {[llength $paraml] == 2} { set xmatrix [list [expr double([lindex $paraml 0])] 0.0 0.0 [expr double([lindex $paraml 1])] 0.0 0.0] } } rotate { } skewX { } skewY { } matrix { if {[llength $paraml] == 6} { set xmatrix [list [expr double([lindex $paraml 0])] [expr double([lindex $paraml 1])] [expr double([lindex $paraml 2])] [expr double([lindex $paraml 3])] [expr double([lindex $paraml 4])] [expr double([lindex $paraml 5])]] } } } set nmatrix [xth_me_impsvg_mm $nmatrix $xmatrix] } } lappend lmatrix $cmatrix set cmatrix $nmatrix } proc xth_me_impsvg_pop_transform {cmatrixVar lmatrixVar} { upvar 1 $cmatrixVar cmatrix $lmatrixVar lmatrix if {[llength $lmatrix] > 0} { set cmatrix [lindex $lmatrix end] set lmatrix [lrange $lmatrix 0 end-1] } } proc xth_me_import_svg {fnm} { global xth utldbg set rv(olist) {} set outcmdn -1 set outline {} set distance -1.0 set cmatrix {1.0 0.0 0.0 1.0 0.0 0.0} set lmatrix {} incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) scrap set rv(odata,$outcmdn,opts) {} set rv(odata,$outcmdn,data) {} if $utldbg { puts -nonewline "reading $fnm ..." } else { xth_status_bar_push me xth_status_bar_status me "reading $fnm ..." } set fid [open $fnm r] set dat [read $fid] close $fid if $utldbg { puts -nonewline " done.\nparsing $fnm ..." } else { xth_status_bar_status me "parsing $fnm ..." } regsub -all {\n} $dat {} dat regsub -all {\s*(\<[^\>]*\>)([^\<]*)} $dat "\\1\n\\2\n" dat set data [split $dat "\n"] if !$utldbg { xth_me_progbar_show [llength $data] } set cdn 0 set insvg 0 set indef 0 foreach itm $data { incr cdn if {$cdn % 10 == 0} { if $utldbg { puts -nonewline "." } else { xth_me_progbar_prog $cdn } } # set tag type set tagtype data if {[regexp {^\s*\<\s*(\/?)(\w+)([^\>]*)\>\s*$} $itm dum slash1 tagid flags]} { if {[string length $slash1] > 0} { set tagtype end } elseif {[regexp {\/\>\s*$} $itm]} { set tagtype single } else { set tagtype start } } switch $tagtype { start { # parse start tag switch -- $tagid { svg { if {!$insvg} {set insvg 1} } defs { if {!$indef} {set indef 1} } g { xth_me_impsvg_push_transform cmatrix lmatrix [xth_xml_get_flag $flags transform] } } } end { # parse end tag switch -- $tagid { svg { if {$insvg} {set insvg 0} } defs { if {$indef} {set indef 0} } g { xth_me_impsvg_pop_transform cmatrix lmatrix } } } single { # parse single tag switch -- $tagid { path { if {$insvg && (!$indef)} { set pdata [xth_xml_get_flag $flags d] xth_xml_clear_flag flags d regsub -nocase -all {([mlcz])} $pdata "\n\\1" pdata set pdatal [split $pdata "\n"] set curdat {} foreach lni $pdatal { if {[regexp -nocase {^\s*(M|L)\s+([e\+\-\d\.]+),([e\+\-\d\.]+)\s*$} $lni dum dum1 x y]} { xth_me_impsvg_trans x y distance outline $cmatrix lappend curdat [list $x $y] } elseif {[regexp -nocase {^\s*C\s+([e\+\-\d\.]+),([e\+\-\d\.]+)\s+([e\+\-\d\.]+),([e\+\-\d\.]+)\s+([e\+\-\d\.]+),([e\+\-\d\.]+)\s*$} $lni dum c1x c1y c2x c2y x y]} { xth_me_impsvg_trans c1x c1y distance outline $cmatrix xth_me_impsvg_trans c2x c2y distance outline $cmatrix xth_me_impsvg_trans x y distance outline $cmatrix lappend curdat [list $c1x $c1y $c2x $c2y $x $y] } } if {[llength $curdat] > 1} { incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) line regsub -all {\s+} $flags { } flags set rv(odata,$outcmdn,opts) "# $flags #" set rv(odata,$outcmdn,data) $curdat } } } } } data { } } } if $utldbg { puts " done." } else { xth_status_bar_pop me } incr outcmdn lappend rv(olist) $outcmdn set rv(odata,$outcmdn,type) endscrap set rv(odata,$outcmdn,opts) {} set rv(odata,$outcmdn,data) {} set rv(dist) $distance set rv(bbox) $outline return [array get rv] } proc xth_me_import_file_trans {data sc dx dy} { set next 0 set res {} foreach pt $data { if $next {append res "\n"} switch [llength $pt] { 2 { append res "[expr $sc * ([lindex $pt 0] - $dx)]\t[expr $sc * ([lindex $pt 1] - $dy)]" } 6 { append res "[expr $sc * ([lindex $pt 0] - $dx)]\t[expr $sc * ([lindex $pt 1] - $dy)]" append res "\t[expr $sc * ([lindex $pt 2] - $dx)]\t[expr $sc * ([lindex $pt 3] - $dy)]" append res "\t[expr $sc * ([lindex $pt 4] - $dx)]\t[expr $sc * ([lindex $pt 5] - $dy)]" } } set next 1 } return $res } proc xth_me_import_file {fnm fmt} { global xth xthmeimpcdlp set xthmeimpcdlp {} # if file name not specified, load it from dialog if {[string length $fnm] == 0} { set fnm [tk_getOpenFile -filetypes {{{SVG files} {*.svg}} {{DXF files} {*.dxf}} {{All files} *}} \ -parent $xth(gui,main) \ -initialdir $xth(gui,initdir) -defaultextension ".svg"] } if {[string length $fnm] == 0} { return } else { set xth(gui,initdir) [file dirname $fnm] } # detect file format from file name if format not specified if {[string length $fmt] == 0} { if {[regexp -nocase {\.dxf} $fnm]} { set fmt dxf } if {[regexp -nocase {\.svg} $fnm]} { set fmt svg } } # import objects switch $fmt { dxf {set objects [xth_me_import_dxf $fnm]} svg {set objects [xth_me_import_svg $fnm]} default { set objects [xth_me_import_svg $fnm] } } array set objs $objects # calculate scrap transformation matrix set dx [expr [lindex $objs(bbox) 2] - [lindex $objs(bbox) 0]] set dy [expr [lindex $objs(bbox) 3] - [lindex $objs(bbox) 1]] set dd $dx set md $objs(dist) if {$dy > $dd} {set dd $dy} set sc [expr $xth(import,size) / $dd] if {($md * $sc) < $xth(import,mind)} {set sc [expr $xth(import,mind) / $md]} if {[info exists xth(import,sscl)]} { set sc $xth(import,sscl)] } set dx [lindex $objs(bbox) 0] set dy [lindex $objs(bbox) 1] # calculate scrap options (-scale and -cs if applicable) set sc0 [expr $sc * ([lindex $objs(bbox) 0] - $dx)] set sc1 [expr $sc * ([lindex $objs(bbox) 1] - $dy)] set sc2 [expr $sc * ([lindex $objs(bbox) 2] - $dx)] set sc3 [expr $sc * ([lindex $objs(bbox) 3] - $dy)] set scrapopts {} switch $fmt { dxf { set sc4 [expr [lindex $objs(bbox) 0] * $xth(import,dxf,scale)] set sc5 [expr [lindex $objs(bbox) 1] * $xth(import,dxf,scale)] set sc6 [expr [lindex $objs(bbox) 2] * $xth(import,dxf,scale)] set sc7 [expr [lindex $objs(bbox) 3] * $xth(import,dxf,scale)] if {[string length $xth(import,dxf,cs)] > 0} { append scrapopts "-cs $xth(import,dxf,cs) " } } svg { set sc4 [expr [lindex $objs(bbox) 0] * $xth(import,svg,scale)] set sc5 [expr [lindex $objs(bbox) 1] * $xth(import,svg,scale)] set sc6 [expr [lindex $objs(bbox) 2] * $xth(import,svg,scale)] set sc7 [expr [lindex $objs(bbox) 3] * $xth(import,svg,scale)] if {[string length $xth(import,svg,cs)] > 0} { append scrapopts "-cs $xth(import,svg,cs) " } } default { set sc4 [expr [lindex $objs(bbox) 0] * $xth(import,default,scale)] set sc5 [expr [lindex $objs(bbox) 1] * $xth(import,default,scale)] set sc6 [expr [lindex $objs(bbox) 2] * $xth(import,default,scale)] set sc7 [expr [lindex $objs(bbox) 3] * $xth(import,default,scale)] if {[string length $xth(import,default,cs)] > 0} { append scrapopts "-cs $xth(import,default,cs) " } } } append scrapopts "-scale \[$sc0 $sc1 $sc2 $sc3 $sc4 $sc5 $sc6 $sc7\] " # create objects global utldbg if $utldbg { foreach obj $objs(olist) { switch $objs(odata,$obj,type) { scrap { puts "\nscrap import $scrapopts $objs(odata,$obj,opts)" } point { puts "\npoint [xth_me_import_file_trans $objs(odata,$obj,data) $sc $dx $dy] u:point $objs(odata,$obj,opts)" } line { puts "\nline u:line $objs(odata,$obj,opts)\n[xth_me_import_file_trans $objs(odata,$obj,data) $sc $dx $dy]\nendline" } endscrap { puts "\nendscrap" } default { puts "" } } } } else { xth_status_bar_push me xth_status_bar_status me [mc "Importing objects ..."] xth_me_progbar_show [llength $objs(olist)] set scount 0 set ocount 0 set xth(me,unredook) 0 foreach obj $objs(olist) { incr ocount xth_me_progbar_prog $ocount set pos [expr [llength $xth(me,cmds,xlist)] - 1] switch $objs(odata,$obj,type) { scrap { xth_me_cmds_create_scrap $pos 0 import$scount "$scrapopts $objs(odata,$obj,opts)" incr scount } point { set coords [xth_me_import_file_trans $objs(odata,$obj,data) $sc $dx $dy] xth_me_cmds_create_point $pos 0 [lindex $coords 0] [lindex $coords 1] "u:point" $objs(odata,$obj,opts) } line { set coords [xth_me_import_file_trans $objs(odata,$obj,data) $sc $dx $dy] xth_me_cmds_create_line $pos 0 "u:line" $objs(odata,$obj,opts) [split $coords "\n"] } endscrap { xth_me_cmds_create_endscrap $pos 0 {} } } } xth_me_cmds_select [lindex $xth(me,cmds,xlist) $pos] xth_me_area_auto_adjust xth_me_progbar_hide xth_status_bar_pop me set xth(me,unredook) 1 } } if $utldbg { set xth(gui,main) . #xth_me_import_svg test.svg #xth_me_import_dxf map1.dxf xth_me_import_file map1.dxf {} exit } therion/xtherion/xtherion.ini0000664000175000017500000001271012330253720015445 0ustar useruser## This TCL script is loaded whenever xtherion is started. You can ## modify some settings here. Only some variables are listed here. ## If you have specific needs, don't hesitate to ask authors. ## directory where xtherion starts # set xth(gui,initdir) "" ## Enable/disable toolbar at startup # set xth(gui,toolbar) 1 ## Set template for text editor # set xth(te,template) { #survey ... -title "..." # centreline # team "..." # team "..." # date ... # units clino compass grad # data normal from to compass clino length # ... ... ... ... ... # endcentreline #endsurvey # } ## prefered language for messages # ::msgcat::mclocale en ## Enable/disable balloon hints # set xth(gui,balloons) 0 ## Enable/disable auto save at startup # set xth(gui,auto_save) 0 ## Enable/disable creation of configuration backup files after successful ## compilation. Second parameter is backup file extension. # set xth(gui,auto_backup) 0 # set xth(gui,auto_backup_ext) "~" ## input keyboard encoding # set xth(app,sencoding) iso8859-2 ## default text file encoding # set xth(app,fencoding) iso8859-2 ## starting toolbar width (in pixels) for text editor (te), map editor (me) ## compiler (cp) or all applications (all) # set xth(app,all,tbwidth) 256 # set xth(app,te,tbwidth) 256 # set xth(app,me,tbwidth) 256 # set xth(app,cp,tbwidth) 256 ## supported keyboard encodings # set xth(kbencodings) {iso8859-1 iso8859-2 cp1250 cp1251 macCentEuro unicode} ## editor font # set xth(gui,efont) {fixed -20} ## label font # set xth(gui,lfont) {helvetica -12 bold} ## show compilation progess # set xth(gui,compshow) 0 ## translate types in dropdown menus # set xth(gui,me,type_dropdown_trans) 1 ## reset options string on type change # set xth(gui,me,type_reset_options) 1 ## size of object type combobox # set xth(gui,me,typelistwidth) 16 ## size of scrap scaling square # set xth(gui,me,scrap,psize) 4 ## size of point # set xth(gui,me,point,psize) 4 ## size of line point # set xth(gui,me,line,psize) 4 ## line width # set xth(gui,me,line,width) 3 ## size of line control point # set xth(gui,me,line,cpsize) 4 ## width of line between point and control point # set xth(gui,me,line,clwidth) 2 ## size of start line tick # set xth(gui,me,line,ticksize) 10 ## width of start line tick # set xth(gui,me,line,tickwidth) 3 ## whether inactive scraps should be hidden by default # set xth(me,hinactives) 0 ## DXF/SVG import settings ## size of imported image in pixels # set xth(import,size) 1024.0 ## minimal distance betweend nearest points (in pixels) # set xth(import,mind) 8.0 ## exact screen scale (number of pixels to 1 unit in imported file), ## (overrides previous two values) # set xth(import,sscl) 1.0 ## scale of DXF file (meters per unit) # set xth(import,dxf,scale) 1.0 ## default coordinate system for DXF file # set xth(import,dxf,cs) {} ## scale of SVG file (meters per unit) # set xth(import,svg,scale) 0.1 ## default coordinate system for SVG file # set xth(import,svg,cs) UTM34 ## XVI settings ## grid color # set xth(gui,xvi_grid_clr) #00D0D0 ## station outline color # set xth(gui,xvi_station_oclr) black ## station fill color # set xth(gui,xvi_station_fclr) black ## station size (radius) # set xth(gui,xvi_station_size) 3.0 ## survey shot color # set xth(gui,xvi_shot_clr) gray50 ## walls outline color # set xth(gui,xvi_walls_fclr) gray60 ## walls fill color # set xth(gui,xvi_walls_fclr) gray80 ## walls fill pattern # set xth(gui,xvi_walls_fptn) gray12 ## sketch line width # set xth(gui,xvi_sketch_line_width) 1 ## Formats of items in centerline data table ## default format # set xth(datafmt,unknown) {4s} ## survey stations # set xth(datafmt,station) {4s} ## lengths (tape, length, dxyz, etc...) # set xth(datafmt,length) {6.2fx {-}} ## counter # set xth(datafmt,counter) {6.2f {-}} ## bearing (compass) # set xth(datafmt,bearing) {5.1fx {-}} ## gradient (clino) # set xth(datafmt,gradient) {{5.1fx} {up down -}} ## depth # set xth(datafmt,depth) {6.2fx {-}} ## dimensions (up, down, etc...) # set xth(datafmt,dimensions) {4.1fx {-}} ## To specify formatting for custom data item us # set xth(datafmt,XXX,format) 4.1f ## where XXX is compass, gradient or any other data item. ## To specify special values, use # set xth(datafmt,XXX,special) 4.1f # dzach layout improvements if 0 { option add *Text.highlightThickness 1 option add *Text.highlightBackground #008080 option add *Text.highlightColor #ff8000 option add *Entry.highlightThickness 1 option add *Entry.highlightBackground #008080 option add *Entry.highlightColor #ff8000 option add *Entry.relief flat option add *Listbox.highlightThickness 1 option add *Listbox.highlightBackground #008080 option add *Listbox.highlightColor #ff8000 option add *Listbox.relief flat option add *Scrollbar.width 14 option add *Radiobutton*offRelief flat #option add *me.Background #e0f0f0 set xth(gui,sbwidth) 15;#[.def.scrollbar cget -width] set xth(gui,ecolorbg) #ffffff set xth(gui,ecolorfg) black set xth(gui,ecolorselbg) #808080 set xth(gui,ecolorselfg) #fff000 # - dzach map colors set xth(gui,me,emptybg) #b0c2c2 set xth(gui,me,mapbg) #f0f0f0 set xth(gui,me,dselclr) #ffc000 set xth(gui,me,highlightfill) #00b000 set xth(gui,efont) {courier -12} set xth(gui,me,point,psize) 5 set xth(gui,me,line,psize) 3 set xth(gui,me,line,width) 2 set xth(gui,me,line,cpsize) 4 set xth(gui,me,line,clwidth) 1 } therion/xtherion/bac.tcl0000775000175000017500000002151710627343136014355 0ustar useruser#! /usr/bin/wish # TODO: # vstup hodiny : minuty proc xth_bac_check {number from to wgt} { set rw 0 if [catch {expr double($number)}] { set rw 1 } else { set num [expr double($number)] if {($num < $from) || ($num > $to)} { set rw 1 } } if {$rw} { $wgt configure -fg red return 0 } else { $wgt configure -fg black return 1 } } proc xth_bac_hm2h {h} { if {[regexp {(.+)\:(.+)} $h dum hh mm]} { if {[catch { set h [expr double($hh) + double($mm) / 60.0] return $h }]} { return $h } } else { return $h } } proc xth_bac_h2hm {h} { catch { set hh [expr int(floor($h))] set mm [expr int($h*60.0) % 60] if {$mm != 0.0} { set h [format "%d:%02d" $hh $mm] } else { set h $hh } } return $h } proc xth_bac_calculate {} { global xth set xth(bac,BAC) "" set xth(bac,ETA) "" set xth(bac,MRS) "" set f $xth(gui,bacw) $f.rdle configure -bg $xth(bac,bg) -fg black set gender xth(bac,gender) set nok 0 if [xth_bac_check $xth(bac,age) 0 1e10 $f.bdal] {set age $xth(bac,age)} else {set nok 1} if [xth_bac_check $xth(bac,height) 0 1e10 $f.bdhl] {set height $xth(bac,height)} else {set nok 1} if [xth_bac_check $xth(bac,weight) 0 1e10 $f.bdwl] {set weight $xth(bac,weight)} else {set nok 1} if [xth_bac_check $xth(bac,volume) 0 1e10 $f.cdvl] {set volume $xth(bac,volume)} else {set nok 1} if [xth_bac_check $xth(bac,level) 0 100 $f.cdll] {set level $xth(bac,level)} else {set nok 1} set xth(bac,time) [xth_bac_hm2h $xth(bac,time)] if [xth_bac_check $xth(bac,time) 0 1e10 $f.cdtl] {set elapsedTime [expr double($xth(bac,time))]} else {set nok 1} set xth(bac,time) [xth_bac_h2hm $xth(bac,time)] if $nok return set ALCOHOL_DENSITY 0.79 set ingested [expr double($volume) * double($level) * 0.01 * $ALCOHOL_DENSITY] # in g/hr set METABOLIC_REMOVAL_RATE 7.0 set remaining [expr $ingested - ($METABOLIC_REMOVAL_RATE * $elapsedTime)] if {$remaining < 0.0} {set remaining 0} if $xth(bac,gender) { set HEIGHT_FACTOR 0.1074 set WEIGHT_FACTOR 0.3362 set AGE_FACTOR 0.09516 set BODY_WATER_CONST 2.447 } else { set HEIGHT_FACTOR 0.1069 set WEIGHT_FACTOR 0.2466 set AGE_FACTOR 0 set BODY_WATER_CONST 2.097 } set h [expr $HEIGHT_FACTOR * $height] set w [expr $WEIGHT_FACTOR * $weight] set a [expr $AGE_FACTOR * $age] set bodyWater [expr ($h - $a + $w + $BODY_WATER_CONST) * 1000.0] set WATER_CONTENT_OF_BLOOD 0.8157 set BAC [expr 100.0 * ($remaining / ($bodyWater / $WATER_CONTENT_OF_BLOOD))] set MRS [expr 100.0 * ($METABOLIC_REMOVAL_RATE / ($bodyWater / $WATER_CONTENT_OF_BLOOD))] set maxRemaining [expr ($bodyWater / $WATER_CONTENT_OF_BLOOD) * 0.0002] if {$maxRemaining < $remaining} { set ETA [expr ($remaining - $maxRemaining) / $METABOLIC_REMOVAL_RATE] } else { set ETA 0.0 } set xth(bac,BAC) [format "%.3f" $BAC] set xth(bac,ETA) [format "%d:%02d" [expr int(floor($ETA))] [expr int($ETA*60.0) % 60]] set xth(bac,MRS) [format "%.3f" $MRS] if {$BAC < 0.02} { $f.rdle configure -bg green -fg black } else { $f.rdle configure -bg red -fg white } } proc xth_bac_init {} { global xth set f $xth(gui,bacw) toplevel $f wm transient $f $xth(gui,main) wm title $f [mc "BAC calculator"] Label $f.bdl -text [mc "Biometric data"] -anchor center -font $xth(gui,lfont) Label $f.bdal -text [mc "age"] -anchor e -font $xth(gui,lfont) Entry $f.bdae -font $xth(gui,lfont) -width 5 -textvariable xth(bac,age) Label $f.bdau -text [mc "years"] -anchor w -font $xth(gui,lfont) Label $f.bdgl -text [mc "gender"] -anchor e -font $xth(gui,lfont) radiobutton $f.bdgm -text [mc "male"] -anchor w \ -font $xth(gui,lfont) -variable xth(bac,gender) -value 1 radiobutton $f.bdgf -text [mc "female"] -anchor w \ -font $xth(gui,lfont) -variable xth(bac,gender) -value 0 Label $f.bdhl -text [mc "height"] -anchor e -font $xth(gui,lfont) Entry $f.bdhe -font $xth(gui,lfont) -width 5 -textvariable xth(bac,height) Label $f.bdhu -text "cm" -anchor w -font $xth(gui,lfont) Label $f.bdwl -text [mc "weight"] -anchor e -font $xth(gui,lfont) Entry $f.bdwe -font $xth(gui,lfont) -width 5 -textvariable xth(bac,weight) Label $f.bdwu -text "kg" -anchor w -font $xth(gui,lfont) Separator $f.s1 -orient horizontal Label $f.cdl -text [mc "Consumption data"] -anchor center -font $xth(gui,lfont) Label $f.cdvl -text [mc "volume"] -anchor e -font $xth(gui,lfont) Entry $f.cdve -font $xth(gui,lfont) -width 5 -textvariable xth(bac,volume) Label $f.cdvu -text "ml" -anchor w -font $xth(gui,lfont) Label $f.cdll -text [mc "alcohol level"] -anchor e -font $xth(gui,lfont) Entry $f.cdle -font $xth(gui,lfont) -width 5 -textvariable xth(bac,level) Label $f.cdlu -text "%" -anchor w -font $xth(gui,lfont) Label $f.cdtl -text [mc "time elapsed"] -anchor e -font $xth(gui,lfont) Entry $f.cdte -font $xth(gui,lfont) -width 5 -textvariable xth(bac,time) Label $f.cdtu -text [mc "hours"] -anchor w -font $xth(gui,lfont) Button $f.calc -text [mc "Calculate"] -anchor center -font $xth(gui,lfont) \ -command xth_bac_calculate Label $f.rdll -text [mc "BAC"] -anchor e -font $xth(gui,lfont) Entry $f.rdle -font $xth(gui,lfont) -width 5 -textvariable xth(bac,BAC) \ -editable 0 Label $f.rdlu -text "%" -anchor w -font $xth(gui,lfont) Label $f.rdtl -text [mc "ETA"] -anchor e -font $xth(gui,lfont) Entry $f.rdte -font $xth(gui,lfont) -width 5 -textvariable xth(bac,ETA) \ -editable 0 Label $f.rdtu -text [mc "hours"] -anchor w -font $xth(gui,lfont) Label $f.rdml -text [mc "MRR"] -anchor e -font $xth(gui,lfont) Entry $f.rdme -font $xth(gui,lfont) -width 5 -textvariable xth(bac,MRS) \ -editable 0 Label $f.rdmu -text "%/h" -anchor w -font $xth(gui,lfont) Button $f.cls -text [mc "Close"] -anchor center -font $xth(gui,lfont) \ -command "destroy $f" grid columnconf $f 0 -weight 0 grid columnconf $f 1 -weight 1 grid columnconf $f 2 -weight 0 grid $f.bdl -column 0 -row 0 -columnspan 3 -sticky news grid $f.cdl -column 0 -row 7 -columnspan 3 -sticky news grid $f.bdal -column 0 -row 1 -columnspan 1 -sticky news grid $f.bdgl -column 0 -row 2 -rowspan 2 -sticky news grid $f.bdhl -column 0 -row 4 -columnspan 1 -sticky news grid $f.bdwl -column 0 -row 5 -columnspan 1 -sticky news grid $f.cdvl -column 0 -row 8 -columnspan 1 -sticky news grid $f.cdll -column 0 -row 9 -columnspan 1 -sticky news grid $f.cdtl -column 0 -row 10 -columnspan 1 -sticky news grid $f.rdll -column 0 -row 12 -columnspan 1 -sticky news grid $f.rdtl -column 0 -row 13 -columnspan 1 -sticky news grid $f.rdml -column 0 -row 14 -columnspan 1 -sticky news grid $f.bdae -column 1 -row 1 -columnspan 1 -sticky news grid $f.bdgf -column 1 -row 3 -columnspan 2 -sticky news grid $f.bdgm -column 1 -row 2 -columnspan 2 -sticky news grid $f.bdhe -column 1 -row 4 -columnspan 1 -sticky news grid $f.bdwe -column 1 -row 5 -columnspan 1 -sticky news grid $f.cdve -column 1 -row 8 -columnspan 1 -sticky news grid $f.cdle -column 1 -row 9 -columnspan 1 -sticky news grid $f.cdte -column 1 -row 10 -columnspan 1 -sticky news grid $f.rdle -column 1 -row 12 -columnspan 1 -sticky news grid $f.rdte -column 1 -row 13 -columnspan 1 -sticky news grid $f.rdme -column 1 -row 14 -columnspan 1 -sticky news grid $f.bdau -column 2 -row 1 -columnspan 1 -sticky news grid $f.bdhu -column 2 -row 4 -columnspan 1 -sticky news grid $f.bdwu -column 2 -row 5 -columnspan 1 -sticky news grid $f.cdvu -column 2 -row 8 -columnspan 1 -sticky news grid $f.cdlu -column 2 -row 9 -columnspan 1 -sticky news grid $f.cdtu -column 2 -row 10 -columnspan 1 -sticky news grid $f.rdlu -column 2 -row 12 -columnspan 1 -sticky news grid $f.rdtu -column 2 -row 13 -columnspan 1 -sticky news grid $f.rdmu -column 2 -row 14 -columnspan 1 -sticky news grid $f.s1 -row 6 -column 0 -columnspan 3 -sticky news -pady 3 -padx 3 grid $f.calc -row 11 -column 0 -columnspan 3 -sticky news -pady 3 -padx 3 grid $f.cls -row 15 -column 0 -columnspan 3 -sticky news -pady 3 -padx 3 set xth(bac,bg) [$f.rdle cget -bg] set sw [winfo screenwidth .] set sh [winfo screenheight .] update idletasks wm geometry $f -$sw-$sh set x [expr {($sw - [winfo width $f])/2}] set y [expr {($sh - [winfo height $f])/2}] wm geometry $f +$x+$y update idletasks } if 0 { package require BWidget source ver.tcl source global.tcl wm withdraw . set xth(gui,bacw) .f xth_bac_init } else { set xth(bac,age) "" set xth(bac,height) "" set xth(bac,weight) "" set xth(bac,volume) "" set xth(bac,level) "" set xth(bac,time) "" } set xth(bac,gender) 1 set xth(bac,BAC) "" set xth(bac,ETA) "" set xth(bac,MRS) "" if 0 { set xth(bac,age) "25" set xth(bac,height) "193" set xth(bac,weight) "90" set xth(bac,volume) "500" set xth(bac,level) "5.5" set xth(bac,time) "0" } therion/xtherion/te_sdata.tcl0000664000175000017500000004031211057011534015373 0ustar useruserproc xth_te_sdata_scan {} { global xth if {$xth(te,fcurr) < 0} { return [list [expr 2 * $xth(gui,etabsize)] {from to compass clino tape}] } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt # let's find the index set seli [$w tag ranges sel] if {[llength $seli] > 0} { set i [lindex $seli 0] } else { set i [$w index insert] } regexp {(\d+)\.} $i dum cln incr cln set i [$w index $cln.0] regexp {(\d+)\.} $i dum cln set dind [format \x25[expr 2 * $xth(gui,etabsize)]s " "] set dqts {from to compass clino tape} set scan_data { if {[regexp {(\s*)data\s+\w+\s+(.*)} $slns dum dind dqts]} { regexp {^([^\#]+)} $dqts dum dqts set endscan 1 } } set sln $cln set slns "" set endscan 0 while {($sln > 1) && (!$endscan)} { incr sln -1 if {[regexp {\S} $slns]} { set clns [$w get $sln.0 $sln.end] if {[regexp {(.*)\\\s*$} $clns dum vlns]} { set slns "$vlns$slns" } else { eval $scan_data set slns $clns } } else { set slns [$w get $sln.0 $sln.end] } } if {!$endscan} { eval $scan_data } return [list [string length $dind] $dqts] } proc xth_te_sdata_buid {qts indc} { global xth set cf $xth(ctrl,te,sdata).sdf catch {destroy $cf} frame $cf grid $cf -in $xth(ctrl,te,sdata) -column 0 -row 1 -sticky nsew grid columnconf $cf 0 -weight 0 grid columnconf $cf 1 -weight 1 grid columnconf $cf 2 -weight 0 set nent 0 set invd 0 set sent 0 set grow 0 foreach qtt $qts { switch $qtt { newline { if {(!$invd) && ($nent > 0)} { frame $cf.nlf grid columnconf $cf.nlf 0 -weight 1 grid columnconf $cf.nlf 1 -weight 1 Button $cf.nlf.s$grow -text "Start series" -font $xth(gui,lfont) Button $cf.nlf.b$grow -text "Break series" -font $xth(gui,lfont) grid $cf.nlf.s$grow -column 0 -row 0 -sticky news grid $cf.nlf.b$grow -column 1 -row 0 -sticky news grid $cf.nlf -in $cf -column 0 -columnspan 3 -row $grow \ -sticky news set xth(te,sdata,invd,ssb) $cf.nlf.s$grow set xth(te,sdata,invd,bsb) $cf.nlf.b$grow set xth(te,sdata,invd,ent) $nent set invd 1 incr grow } } default { # zistime typ if {[info exists xth(datafmt,$qtt,format)]} { set tqtt $qtt } else { set tqtt "unknown" } set xth(te,sdata,$nent,qtt) $tqtt set xth(te,sdata,$nent,format) $xth(datafmt,$tqtt,format) set xth(te,sdata,$nent,cvalue) "" set xth(te,sdata,$nent,special) $xth(datafmt,$tqtt,special) set xth(te,sdata,$nent,de) $cf.de$grow set xth(te,sdata,$nent,fe) $cf.fe$grow set xth(te,sdata,$nent,nextde) $cf.de$grow set xth(te,sdata,$nent,nextvde) $cf.de$grow Label $cf.l$grow -text $qtt -anchor e -font $xth(gui,lfont) Entry $cf.de$grow -font $xth(gui,lfont) \ -textvariable xth(te,sdata,$nent,cvalue) Entry $cf.fe$grow -font $xth(gui,lfont) -width 6 \ -textvariable xth(te,sdata,$nent,format) bind $cf.de$grow <> "focus $cf.de$grow; $cf.de$grow icursor 0; $cf.de$grow selection range 0 end" bind $cf.de$grow "event generate \$xth(te,sdata,$nent,nextde) <> -when tail" bind $cf.de$grow "event generate \$xth(te,sdata,$nent,nextvde) <> -when tail" bind $cf.de$grow "event generate \$xth(te,sdata,$nent,nextvde) <> -when tail" grid $cf.l$grow -in $cf -column 0 -row $grow -sticky news grid $cf.de$grow -in $cf -column 1 -row $grow -sticky news grid $cf.fe$grow -in $cf -column 2 -row $grow -sticky news incr grow incr nent } } } set xth(te,sdata,nent) $nent set xth(te,sdata,indc) $indc set xth(te,sdata,invd) $invd xth_te_sdata_bind } proc xth_te_sdata_incr_station {ss} { return [xth_incr_station_name $ss 1] } proc xth_te_sdata_incr {} { global xth if {$xth(te,sdata,incr,station) != -1} { set xth(te,sdata,$xth(te,sdata,incr,station),cvalue) \ [xth_te_sdata_incr_station \ $xth(te,sdata,$xth(te,sdata,incr,station),cvalue)] } else { if {$xth(te,sdata,incr,from) != -1} { if {$xth(te,sdata,incr,to) != -1} { set xth(te,sdata,$xth(te,sdata,incr,from),cvalue) \ $xth(te,sdata,$xth(te,sdata,incr,to),cvalue) } } if {$xth(te,sdata,incr,to) != -1} { set xth(te,sdata,$xth(te,sdata,incr,to),cvalue) \ [xth_te_sdata_incr_station \ $xth(te,sdata,$xth(te,sdata,incr,to),cvalue)] } } } proc xth_te_sdata_cspc {itm} { if {[regexp {^\s*[^\"\[]\S*\s+\S+} $itm]} { #" set itm "\[$itm\]" } return $itm } proc xth_te_sdata_bind {} { global xth if {! [info exists xth(te,sdata,nent)]} { return } elseif {$xth(te,sdata,nent) < 1} { return } set xth(te,sdata,incr,station) -1 set xth(te,sdata,incr,from) -1 set xth(te,sdata,incr,to) -1 for {set i 0} {$i < $xth(te,sdata,nent)} {incr i} { if {$i != [expr $xth(te,sdata,nent) - 1]} { set xth(te,sdata,$i,nextde) $xth(te,sdata,[expr $i + 1],de) set xth(te,sdata,$i,nextvde) $xth(te,sdata,[expr $i + 1],de) } else { set xth(te,sdata,$i,nextde) $xth(te,sdata,0,de) set xth(te,sdata,$i,nextvde) $xth(te,sdata,0,de) } set sx [lsearch {from to station} $xth(te,sdata,$i,qtt)] if {$sx != -1} { set xth(te,sdata,incr,[lindex {from to station} $sx]) $i } } if {! $xth(te,sdata,es)} { for {set i 0} {$i < $xth(te,sdata,nent)} {incr i} { if {[lsearch {station from to} $xth(te,sdata,$i,qtt)] == -1} { for {set j 1} {$j < $xth(te,sdata,nent)} {incr j} { set jj [expr ($i + $j) % $xth(te,sdata,nent)] if {[lsearch {station from to} $xth(te,sdata,$jj,qtt)] == -1} { set xth(te,sdata,$i,nextvde) $xth(te,sdata,$jj,de) set j $xth(te,sdata,nent) } } } } } # now let's bind enter keys if {$xth(te,sdata,invd)} { set wtw1 "" set wtw2 "" set clw "" for {set iet 0} {$iet < $xth(te,sdata,nent)} {incr iet} { if {$iet < $xth(te,sdata,invd,ent)} { append wtw1 " \[xth_te_sdata_cspc \$xth(te,sdata,$iet,cvalue)\]" } else { append wtw2 " \[xth_te_sdata_cspc \$xth(te,sdata,$iet,cvalue)\]" } if {[lsearch {from to station} $xth(te,sdata,$iet,qtt)] == -1} { append clw "set xth(te,sdata,$iet,cvalue) \"\"\n" } } set enter_cmd "xth_te_sdata_insert \"$wtw2\" 2 insert\nxth_te_sdata_insert \"$wtw1\" 1 insert\nxth_te_sdata_incr\n$clw" append enter_cmd "event generate \$xth(te,sdata,[expr $xth(te,sdata,nent) - 1],nextvde) <> -when tail" bind $xth(te,sdata,[expr $xth(te,sdata,nent) - 1],de) $enter_cmd bind $xth(te,sdata,[expr $xth(te,sdata,nent) - 1],de) $enter_cmd set enter_cmd "xth_te_sdata_insert \"$wtw1\" 1 insert\nxth_te_sdata_incr\n$clw" append enter_cmd "event generate \$xth(te,sdata,[expr $xth(te,sdata,nent) - 1],nextvde) <> -when tail" $xth(te,sdata,invd,ssb) configure -command $enter_cmd set enter_cmd "xth_te_sdata_insert \"break\" 3 insert\n$clw" append enter_cmd "event generate \$xth(te,sdata,0,de) <> -when tail" $xth(te,sdata,invd,bsb) configure -command $enter_cmd } else { set wtw "" set clw "" for {set iet 0} {$iet < $xth(te,sdata,nent)} {incr iet} { append wtw " \[xth_te_sdata_cspc \$xth(te,sdata,$iet,cvalue)\]" if {[lsearch {from to station} $xth(te,sdata,$iet,qtt)] == -1} { append clw "set xth(te,sdata,$iet,cvalue) \"\"\n" } } set enter_cmd "xth_te_sdata_insert \"$wtw\" 0 insert\nxth_te_sdata_incr\n$clw" append enter_cmd "event generate \$xth(te,sdata,[expr $xth(te,sdata,nent) - 1],nextvde) <> -when tail" bind $xth(te,sdata,[expr $xth(te,sdata,nent) - 1],de) $enter_cmd bind $xth(te,sdata,[expr $xth(te,sdata,nent) - 1],de) $enter_cmd } } $xth(ctrl,te,sdata).sfb configure -command { set dil [xth_te_sdata_scan] xth_te_sdata_buid [lindex $dil 1] [lindex $dil 0] } $xth(ctrl,te,sdata).sfs configure -command xth_te_sdata_bind proc xth_te_sdata_insert {data invd iidx} { global xth if {$xth(te,fcurr) < 0} { return } if {! [info exists xth(te,sdata,nent)]} { return } elseif {$xth(te,sdata,nent) < 1} { return } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt set xth(me,sdata,err_notenought) 0 set err 0 # if {$xth(gui,etabsize) > 0} { # set tabspc [format \x25$xth(gui,etabsize)s " "] # } else { set tabspc " " # } set sent 0 set eent $xth(te,sdata,nent) switch $invd { 1 { set eent $xth(te,sdata,invd,ent) } 2 { set sent $xth(te,sdata,invd,ent) } } set txt "" set fst "" set iet $sent set tmp $data set ldata {} while {[string length $tmp] > 0} { if {[regexp {\S+} $tmp itm]} { lappend ldata $itm } regsub {\s*\S*\s*} $tmp {} tmp } if {([llength $ldata] < $eent) && (!$xth(te,sdata,invd))} { set xth(me,sdata,err_notenought) 1 } foreach itm $ldata { set postwrt 0 set tobreak 0 if {$iet < $eent} { if {[lsearch -exact $xth(te,sdata,$iet,special) $itm] != -1} { set postwrt 1 } else { set curfmt $xth(te,sdata,$iet,format) set extfmt 0 if {[regsub {fx(\s*)$} $curfmt {f\1} curfmt]} { set extfmt 1 } # puts "$itm -> $fst\x25$curfmt" if {[catch {append txt [format "$fst\x25$curfmt" $itm]}]} { set postwrt 1 # puts "error" set err 1 } elseif {$extfmt == 1} { if {[regexp {\.?0+\s*$} $txt txtextend]} { set teel [string length $txtextend] regsub {\.?0+\s*$} $txt [format \x25[expr $teel]s " "] txt } } } } else { # ak je dlhsie, uz neformatuj # puts $data set unfdata $data for {set ufi 0} {$ufi < $eent} {incr ufi} { regsub {^\s*\S+\s*} $unfdata "" unfdata } append txt $fst $unfdata # append txt [format $fst\x25$xth(datafmt,unknown,format) $itm] # set err 1 set tobreak 1 } if {$postwrt == 1} { if {[regexp {(\d+)\.?(\d*)} $xth(te,sdata,$iet,format) dum nfln nzadc]} { set nitm $itm if {[string length nzadc] > 0} { append nitm [format \x25[expr $nzadc + 1]s " "] } append txt [format $fst\x25[expr $nfln]s $nitm] } else { append txt [format $fst\x25$xth(datafmt,unknown,format) $itm] } } set fst $tabspc incr iet if {$tobreak} { break } } set cind $xth(te,sdata,indc) if {($invd == 2) && (!$err)} { if {[regexp {\d+} $xth(te,sdata,0,format) plusindc]} { incr cind [expr $plusindc + 1] } else { incr cind [expr 2 * $xth(gui,etabsize)] } } if {($invd == 3) || $err} { set txt $data regsub {^\s+} $txt "" txt regsub {\s+$} $txt "" txt } if {$cind > 0} { set txt [format \x25[expr $cind + [string length $txt]]s $txt] } if {[string compare $iidx insert] == 0} { xth_te_insert_text $w "\n$txt" } else { $w insert $iidx $txt } catch { $w edit separator } return $err } proc xth_te_sdata_auto_format {} { global xth if {$xth(te,fcurr) < 0} { return } if {! [info exists xth(te,sdata,nent)]} { return } elseif {$xth(te,sdata,nent) < 1} { return } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt set s [$w tag ranges sel] if {[llength $s] < 2} { return } set eline -1 set sline 0 regexp {(\d+)\.} [lindex $s 0] dum sline regexp {(\d+)\.} [lindex $s 1] dum eline # $w tag remove sel 1.0 end set ict 1 for {set cline $sline} {$cline <= $eline} {incr cline} { set txt [$w get $cline.0 $cline.end] if {[regexp {\S+} $txt]} { set orig [$w get $cline.0 $cline.end] $w delete $cline.0 $cline.end if {$xth(te,sdata,invd)} { set formatres [xth_te_sdata_insert $txt $ict $cline.0] if {$formatres == 0} { if {$ict == 1} { set ict 2 } else { set ict 1 } } else { if {[regexp {^\s*break\s*$} $txt]} { set xth(me,sdata,err_notenought) 0 set ict 1 } } } else { set formatres [xth_te_sdata_insert $txt 0 $cline.0] } # an error occured if {$formatres || $xth(me,sdata,err_notenought)} { # puts "inserting >>$orig<<" $w delete $cline.0 $cline.end $w insert $cline.0 $orig } } } $w see insert } proc te_sr_reset {} { global xth if {$xth(te,fcurr) < 0} { return } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt set has_sel 0 if {$xth(ctrl,te,sr,selection_io)} { set seli [$w tag ranges sel] if {[llength $seli] > 0} { set xth(ctrl,te,sr,selection_start) [lindex $seli 0] set xth(ctrl,te,sr,selection_end) [lindex $seli 1] set xth(ctrl,te,sr,search_end) [lindex $seli 1] $w mark set insert [lindex $seli 0] set has_sel 1 } else { set xth(ctrl,te,sr,selection_io) 0 update idletasks } } if {!$has_sel} { set xth(ctrl,te,sr,selection_start) {} set xth(ctrl,te,sr,selection_end) {} set xth(ctrl,te,sr,search_end) end $w mark set insert 1.0 } } proc te_sr_first {} { global xth if {$xth(te,fcurr) < 0} { return } if {[string length $xth(ctrl,te,sr,search)] == 0} { return } catch { $w edit separator } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt te_sr_clear te_sr_reset if {![te_sr_next_next]} { bell } catch { $w edit separator } focus $w } proc te_sr_next_next {} { global xth if {$xth(te,fcurr) < 0} { return } if {[string length $xth(ctrl,te,sr,search)] == 0} { return } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt # prehlada text od pozicie kurzora po koniec (vyberu) # najde text - (zameni ho) - vyznaci ho a kurzor nastavi za neho set cnt 0 set fndcmd "set fnd \[$w search -count cnt" if {!$xth(ctrl,te,sr,case_io)} { append fndcmd " -nocase" } if {$xth(ctrl,te,sr,regular_io)} { append fndcmd " -regexp" } append fndcmd { $xth(ctrl,te,sr,search) insert $xth(ctrl,te,sr,search_end)]} eval $fndcmd if {[string length $fnd] > 0} { $w mark set insert "$fnd + $cnt chars" $w mark set xthsrend "$fnd + $cnt chars" # do replace if necessary if {$xth(ctrl,te,sr,replace_io)} { set ostr [$w get $fnd xthsrend] $w delete $fnd xthsrend #puts "<<$ostr" set nstr $xth(ctrl,te,sr,replace) if {$xth(ctrl,te,sr,regular_io)} { set repcmd {regsub} if {!$xth(ctrl,te,sr,case_io)} { append repcmd " -nocase" } append repcmd { $xth(ctrl,te,sr,search) $ostr $xth(ctrl,te,sr,replace) nstr} eval $repcmd } #puts ">>$nstr" $w insert $fnd $nstr } $w tag add xthsr $fnd xthsrend $w tag configure xthsr -background $xth(gui,escolorbg) -foreground $xth(gui,escolorfg) $w see insert return 1 } else { # uz sme nic nenasli return 0 } } proc te_sr_next {} { global xth if {$xth(te,fcurr) < 0} { return } if {[string length $xth(ctrl,te,sr,search)] == 0} { return } catch { $w edit separator } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt if {![te_sr_next_next]} { bell } catch { $w edit separator } focus $w } proc te_sr_all {} { global xth if {$xth(te,fcurr) < 0} { return } if {[string length $xth(ctrl,te,sr,search)] == 0} { return } catch { $w edit separator } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt te_sr_clear te_sr_reset if {![te_sr_next_next]} { bell } else { while {[te_sr_next_next]} {} } catch { $w edit separator } focus $w } proc te_sr_clear {} { global xth if {$xth(te,fcurr) < 0} { return } set w $xth(te,[lindex $xth(te,flist) $xth(te,fcurr)],frame).txt $w tag remove xthsr 1.0 end focus $w } therion/xtherion/cp.tcl0000664000175000017500000003613011037130406014212 0ustar useruser## ## cp.tcl -- ## ## The compiler module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- xth_app_create cp [mc "Compiler"] xth_ctrl_add cp stp [mc "Settings"] xth_ctrl_add cp dat [mc "Survey structure"] xth_ctrl_add cp info [mc "Survey info"] xth_ctrl_add cp ms [mc "Map structure"] set xth(cp,preview) 0 set xth(cp,preview,acroread) 0 set xth(cp,preview,acroreadpath) {} set xth(cp,preview,xpdf) 0 set xth(cp,preview,xpdfpath) {} set xth(th_exit_number_last) 0 switch $xth(gui,platform) { windows { if {[string length $xth(gui,appctrlcmd)] > 0} { set xth(cp,preview) 1 set xth(cp,preview,acroread) 1 } } unix { set xth(cp,preview) 1 set xth(cp,preview,xpdf) 1 } } if {$xth(cp,preview)} { xth_ctrl_add cp pview [mc "Preview"] } xth_ctrl_finish cp # create config editor set xth(cp,editor) $xth(gui,cp).af.apps.ed frame $xth(cp,editor) set txb $xth(cp,editor) text $txb.txt -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" if {$xth(gui,text_undo)} { $txb.txt configure -undo 1 -maxundo -1 } scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news bind $txb.txt <$xth(kb_control)-Key-x> "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-c> "tk_textCopy $txb.txt" bind $txb.txt <$xth(kb_control)-Key-v> "tk_textPaste $txb.txt" bind $txb.txt <$xth(kb_control)-Key-z> "catch {$txb.txt edit undo}" bind $txb.txt <$xth(kb_control)-Key-y> "catch {$txb.txt edit redo}" if {$xth(gui,bindinsdel)} { bind $txb.txt { %W delete insert %W see insert } bind $txb.txt "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-Insert> "tk_textCopy $txb.txt" bind $txb.txt "tk_textPaste $txb.txt" # catch { # bind $txb.txt "tk_textCut $txb.txt" # bind $txb.txt <$xth(kb_control)-Key-KP_Insert> "tk_textCopy $txb.txt" # bind $txb.txt "tk_textPaste $txb.txt" # } } # nechame tab, return originalny if {[info exists xth(gui,te)]} { # bind $txb.txt <$xth(kb_control)-Key-a> "xth_te_text_select_all %W" # bind $txb.txt <$xth(kb_control)-Key-i> "xth_te_text_auto_indent %W" bind $txb.txt $xth(te,bind,text_tab) bind $txb.txt $xth(te,bind,text_return) } else { bind $txb.txt $xth(gui,bind,text_tab) bind $txb.txt $xth(gui,bind,text_return) } # create log window set xth(cp,log) $xth(gui,cp).af.apps.log frame $xth(cp,log) set txb $xth(cp,log) text $txb.txt -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news bind $txb.txt <$xth(kb_control)-Key-x> "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-c> "tk_textCopy $txb.txt" bind $txb.txt <$xth(kb_control)-Key-v> "tk_textPaste $txb.txt" if {$xth(gui,bindinsdel)} { bind $txb.txt { %W delete insert %W see insert } bind $txb.txt "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-Insert> "tk_textCopy $txb.txt" bind $txb.txt "tk_textPaste $txb.txt" # catch { # bind $txb.txt "tk_textCut $txb.txt" # bind $txb.txt <$xth(kb_control)-Key-KP_Insert> "tk_textCopy $txb.txt" # bind $txb.txt "tk_textPaste $txb.txt" # } } xth_status_bar cp $txb.txt "Therion log file." # pack editor and log widow grid columnconf $xth(gui,cp).af.apps 0 -weight 1 grid rowconf $xth(gui,cp).af.apps 0 -weight 1 grid rowconf $xth(gui,cp).af.apps 1 -weight 1 grid $xth(cp,editor) -column 0 -row 0 -sticky news grid $xth(cp,log) -column 0 -row 1 -sticky news # create setup control Label $xth(ctrl,cp,stp).wl -text [mc "Working directory"] -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar cp $xth(ctrl,cp,stp).wl [mc "Working directory path."] Entry $xth(ctrl,cp,stp).we -font $xth(gui,lfont) -state disabled \ -editable off -textvariable xth(cp,fpath) xth_status_bar cp $xth(ctrl,cp,stp).we [mc "Working directory path."] Label $xth(ctrl,cp,stp).fl -text [mc "Configuration file"] -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar cp $xth(ctrl,cp,stp).fl [mc "Configuration file name."] Entry $xth(ctrl,cp,stp).fe -font $xth(gui,lfont) -state disabled \ -editable off -textvariable xth(cp,fname) xth_status_bar cp $xth(ctrl,cp,stp).fe [mc "Configuration file name."] Label $xth(ctrl,cp,stp).optl -text [mc "Command line options"] -anchor w -font $xth(gui,lfont) -state disabled xth_status_bar cp $xth(ctrl,cp,stp).optl [mc "Therion command line options."] Entry $xth(ctrl,cp,stp).opte -font $xth(gui,lfont) -state disabled \ -textvariable xth(cp,opts) xth_status_bar cp $xth(ctrl,cp,stp).opte [mc "Therion command line options."] Button $xth(ctrl,cp,stp).go -text [mc "Compile"] -anchor center -font $xth(gui,lfont) \ -state disabled -command {xth_cp_compile} -width 4 Label $xth(ctrl,cp,stp).gores -text "" -anchor center -font $xth(gui,lfont) \ -state disabled -width 4 -relief sunken set xth(cp,resfg) [$xth(ctrl,cp,stp).gores cget -fg] set xth(cp,resbg) [$xth(ctrl,cp,stp).gores cget -bg] xth_status_bar cp $xth(ctrl,cp,stp).go [mc "Run therion."] grid columnconf $xth(ctrl,cp,stp) 0 -weight 1 grid columnconf $xth(ctrl,cp,stp) 1 -weight 1 grid $xth(ctrl,cp,stp).wl -row 0 -column 0 -columnspan 2 -sticky news grid $xth(ctrl,cp,stp).we -row 1 -column 0 -columnspan 2 -sticky news grid $xth(ctrl,cp,stp).fl -row 2 -column 0 -columnspan 2 -sticky news grid $xth(ctrl,cp,stp).fe -row 3 -column 0 -columnspan 2 -sticky news grid $xth(ctrl,cp,stp).optl -row 4 -column 0 -columnspan 2 -sticky news grid $xth(ctrl,cp,stp).opte -row 5 -column 0 -columnspan 2 -sticky news grid $xth(ctrl,cp,stp).go -row 6 -column 0 -sticky news grid $xth(ctrl,cp,stp).gores -row 6 -column 1 -sticky ew # create preview controls if {$xth(cp,preview)} { set crow 0 grid columnconf $xth(ctrl,cp,pview) 0 -weight 1 grid columnconf $xth(ctrl,cp,pview) 1 -weight 1 if {$xth(cp,preview,xpdf)} { Label $xth(ctrl,cp,pview).xpdfl -text [mc "Xpdf"] -anchor w -font $xth(gui,lfont) -state normal xth_status_bar cp $xth(ctrl,cp,pview).xpdfl [mc "PDF file path."] Entry $xth(ctrl,cp,pview).xpdfe -font $xth(gui,lfont) -state normal \ -editable on -textvariable xth(cp,preview,xpdfpath) xth_status_bar cp $xth(ctrl,cp,pview).xpdfe [mc "PDF file path."] grid $xth(ctrl,cp,pview).xpdfl -row $crow -column 0 -columnspan 2 -sticky news incr crow grid $xth(ctrl,cp,pview).xpdfe -row $crow -column 0 -columnspan 2 -sticky news incr crow } if {$xth(cp,preview,acroread)} { Label $xth(ctrl,cp,pview).acroreadl -text [mc "Acrobat Reader"] -anchor w -font $xth(gui,lfont) -state normal xth_status_bar cp $xth(ctrl,cp,pview).acroreadl [mc "PDF file path."] Entry $xth(ctrl,cp,pview).acroreade -font $xth(gui,lfont) -state normal \ -editable on -textvariable xth(cp,preview,acroreadpath) xth_status_bar cp $xth(ctrl,cp,pview).acroreade [mc "PDF file path."] grid $xth(ctrl,cp,pview).acroreadl -row $crow -column 0 -columnspan 2 -sticky news incr crow grid $xth(ctrl,cp,pview).acroreade -row $crow -column 0 -columnspan 2 -sticky news incr crow } } # create objects control set clbox $xth(ctrl,cp,dat) #### set sw [ScrolledWindow $clbox.sw -relief sunken -borderwidth 2] scrollbar $clbox.sv -orient vert -command "$clbox.t yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $clbox.sh -orient horiz -command "$clbox.t xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) ###set tr [Tree $sw.t -relief flat -height 16 -selectcommand xth_cp_data_tree_select] set tr [Tree $clbox.t -relief flat -height 16 -selectcommand xth_cp_data_tree_select \ -yscrollcommand "$clbox.sv set" \ -xscrollcommand "$clbox.sh set"] set xth(ctrl,cp,datrestore) {} ###$sw setwidget $tr $tr bindText xth_cp_data_tree_enter $tr bindText xth_cp_data_tree_leave $tr bindText xth_cp_data_tree_double_click $tr bindImage xth_cp_data_tree_enter $tr bindImage xth_cp_data_tree_leave $tr bindImage xth_cp_data_tree_double_click ### pack $sw -side top -expand yes -fill both grid columnconf $clbox 0 -weight 1 grid rowconf $clbox 0 -weight 1 grid $tr -column 0 -row 0 -sticky news grid $clbox.sv -column 1 -row 0 -sticky news grid $clbox.sh -column 0 -row 1 -sticky news # init survey info set txb $xth(ctrl,cp,info) text $txb.txt -height 4 -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news xth_status_bar me $txb.txt [mc "Survey informations."] bind $txb.txt <$xth(kb_control)-Key-x> "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-c> "tk_textCopy $txb.txt" bind $txb.txt <$xth(kb_control)-Key-v> "tk_textPaste $txb.txt" if {$xth(gui,bindinsdel)} { bind $txb.txt { %W delete insert %W see insert } bind $txb.txt "tk_textCut $txb.txt" bind $txb.txt <$xth(kb_control)-Key-Insert> "tk_textCopy $txb.txt" bind $txb.txt "tk_textPaste $txb.txt" # catch { # bind $txb.txt "tk_textCut $txb.txt" # bind $txb.txt <$xth(kb_control)-Key-KP_Insert> "tk_textCopy $txb.txt" # bind $txb.txt "tk_textPaste $txb.txt" # } } # create map structure control set clbox $xth(ctrl,cp,ms) ###set sw [ScrolledWindow $clbox.sw -relief sunken -borderwidth 2] scrollbar $clbox.sv -orient vert -command "$clbox.t yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $clbox.sh -orient horiz -command "$clbox.t xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) set tr [Tree $clbox.t -relief flat -height 16 \ -yscrollcommand "$clbox.sv set" \ -xscrollcommand "$clbox.sh set"] set xth(ctrl,cp,msrestore) {} ###$sw setwidget $tr $tr bindText xth_cp_map_tree_enter $tr bindText xth_cp_map_tree_leave $tr bindText xth_cp_map_tree_double_click $tr bindImage xth_cp_map_tree_enter $tr bindImage xth_cp_map_tree_leave $tr bindImage xth_cp_map_tree_double_click ###pack $sw -side top -expand yes -fill both grid columnconf $clbox 0 -weight 1 grid rowconf $clbox 0 -weight 1 grid $tr -column 0 -row 0 -sticky news grid $clbox.sv -column 1 -row 0 -sticky news grid $clbox.sh -column 0 -row 1 -sticky news # load menu $xth(cp,menu,file) add command -label [mc "New"] -command {} \ -font $xth(gui,lfont) -underline 0 -state normal -command {xth_cp_new_file} $xth(cp,menu,file) add command -label [mc "Open"] -underline 0 \ -accelerator "$xth(gui,controlk)-o" -state normal \ -font $xth(gui,lfont) -command { xth_cp_open_file {} } $xth(cp,menu,file) add command -label [mc "Save as"] -underline 5 \ -state disabled -font $xth(gui,lfont) -command xth_cp_save_as $xth(cp,menu,file) add command -label [mc "Close"] -underline 0 \ -accelerator "$xth(gui,controlk)-w" -state disabled \ -font $xth(gui,lfont) \ -command xth_cp_close_file set xth(cp,menu,edit) $xth(cp,menu).edit menu $xth(cp,menu,edit) -tearoff 0 $xth(cp,menu) add cascade -label [mc "Edit"] -state disabled \ -font $xth(gui,lfont) -menu $xth(cp,menu,edit) -underline 0 if {$xth(gui,text_undo)} { $xth(cp,menu,edit) add command -label [mc "Undo"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-z" -command "xth_app_clipboard undo" $xth(cp,menu,edit) add command -label [mc "Redo"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-y" -command "xth_app_clipboard redo" $xth(cp,menu,edit) add separator } $xth(cp,menu,edit) add command -label [mc "Cut"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-x" -command "xth_app_clipboard cut" $xth(cp,menu,edit) add command -label [mc "Copy"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-c" -command "xth_app_clipboard copy" $xth(cp,menu,edit) add command -label [mc "Paste"] -font $xth(gui,lfont) \ -accelerator "$xth(gui,controlk)-v" -command "xth_app_clipboard paste" set xth(cp,fopen) 0 set xth(cp,cursor) 1.0 set xth(cp,fname) "" set xth(cp,opts) "" set xth(cp,fpath) "" xth_ctrl_minimize cp dat xth_ctrl_minimize cp info xth_ctrl_minimize cp ms if {$xth(cp,preview)} { xth_ctrl_minimize cp pview } set xth(ctrl,cp,datlist) {} set xth(ctrl,cp,maplist) {} xth_status_bar_status cp [mc "User interface is not active. To activate it, open existing file or create new one."] therion/xtherion/err.log0000664000175000017500000000000011051114210014351 0ustar userusertherion/xtherion/about.tcl0000664000175000017500000000543311656751162014743 0ustar useruser## ## about.tcl -- ## ## Application module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- set xth(about,image_id) [image create photo -data $xth(about,image_data)] set xth(about,infotime) 2500 proc xth_about_status {str} { global xth set xth(about,status) "$str" update idletasks } proc xth_about_show {btnid} { global xth if {[winfo exists $xth(gui,about)]} xth_about_hide xth_about_status "" set w $xth(gui,about) toplevel $w -relief raised -bg black -bd 3 -cursor $xth(gui,cursor) wm transient $w wm withdraw $w set sw [winfo screenwidth .] set sh [winfo screenheight .] wm overrideredirect $w 1 label $w.image -bd 0 -relief sunken -background black -fg white -image $xth(about,image_id) pack $w.image -side top -expand 1 -fill both label $w.status -relief flat -background black -foreground white \ -textvariable xth(about,status) -font $xth(gui,lfont) -anchor center pack $w.status -side top -expand 1 -fill both label $w.i1 -bd 0 -relief sunken -background black -fg white -text "xtherion\n$xth(about,ver)" \ -font $xth(gui,lfont) -anchor center pack $w.i1 -side top -expand 1 -fill both -pady 5 if {$btnid} { button $w.close -text "Close" -font $xth(gui,lfont) -anchor center \ -command xth_about_hide -width 5 pack $w.close -side top -fill none -anchor center -pady 5 focus $w.close } wm geometry $xth(gui,about) -$sw-$sh wm deiconify $xth(gui,about) update idletasks set x [expr {($sw - [winfo width $xth(gui,about)])/2}] set y [expr {($sh - [winfo height $xth(gui,about)])/2}] wm geometry $xth(gui,about) +$x+$y $w configure -bg black $w.image configure -image $xth(about,image_id) $w.i1 configure -text "xtherion $xth(about,ver)\n\u00A9 2002-2011 Stacho Mudrak" update idletasks } proc xth_about_hide {} { global xth destroy $xth(gui,about) focus $xth(gui,main) } therion/xtherion/help.tcl0000664000175000017500000001001511051022770014532 0ustar useruser## ## help.tcl -- ## ## Help menu and its functions. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- set hm "$xth(gui,main).hmenu" set xth(gui,menu,help) $hm menu $hm -tearoff 0 $hm add command -label [mc "Control..."] -underline 0 -font $xth(gui,lfont) \ -command xth_help_control_show $hm add command -label [mc "BAC calculator..."] -underline 0 -font $xth(gui,lfont) \ -command xth_bac_init $hm add command -label [mc "Calibrate bitmap..."] -underline 0 -font $xth(gui,lfont) \ -command xth_calibrate_bitmap $hm add command -label [mc "About..."] -underline 0 -font $xth(gui,lfont) \ -command { xth_about_show 1 xth_about_status $xth(prj,title) } proc xth_help_control_show {} { global xth if {[winfo exists $xth(gui,main).help_control]} { focus $xth(gui,main).help_control } else { xth_help_control_init } } proc xth_help_control_search {} { } proc xth_help_control_init {} { global xth set f $xth(gui,main).help_control toplevel $f wm transient $f $xth(gui,main) wm title $f "Xtherion control" set ff $f.lf frame $ff Entry $ff.se -font $xth(gui,lfont) Button $ff.sb -text [mc "Search"] -anchor center -font $xth(gui,lfont) \ -command xth_help_control_search -width 8 Button $ff.cb -text [mc "Close"] -anchor center -font $xth(gui,lfont) \ -command "destroy $f" -width 8 grid columnconf $ff 2 -weight 1 # grid columnconf $ff 0 -weight 1 # grid columnconf $ff 1 -weight 0 # grid columnconf $ff 1 -weight 0 # grid $ff.se -column 0 -row 0 -sticky news # grid $ff.sb -column 1 -row 0 -sticky news grid $ff.cb -column 2 -row 0 -sticky news set txb $f.tf frame $txb text $txb.txt -wrap none -font $xth(gui,lfont) \ -relief sunken -state disabled \ -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $txb 0 -weight 1 grid rowconf $txb 0 -weight 1 grid $txb.txt -column 0 -row 0 -sticky news grid $txb.sv -column 1 -row 0 -sticky news grid $txb.sh -column 0 -row 1 -sticky news grid rowconf $f 0 -weight 1 grid columnconf $f 0 -weight 1 grid rowconf $f 1 -weight 0 grid $txb -column 0 -row 0 -sticky news grid $ff -column 0 -row 1 -sticky news set sw [winfo screenwidth .] set sh [winfo screenheight .] update idletasks wm geometry $f +0+0 wm geometry $f 640x480 wm minsize $f 320 240 set x [expr {($sw - [winfo width $f])/2}] set y [expr {($sh - [winfo height $f])/2}] wm geometry $f +$x+$y update idletasks $txb.txt configure -state normal set hlptxt [ mc "xtherion_help_control" ] if {[string length $hlptxt] < 100} { set tmploc ::msgcat::mclocale ::msgcat::mclocale en set hlptxt [ mc "xtherion_help_control" ] ::msgcat::mclocale $tmploc } $txb.txt insert end $hlptxt $txb.txt configure -state disabled } therion/xtherion/sbar.tcl0000664000175000017500000000527112330235345014546 0ustar useruser## ## sbar.tcl -- ## ## Status bar module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- proc xth_status_bar {aname widg stext} { global xth if {$xth(gui,balloons)} { DynamicHelp::add $widg -type balloon -text $stext } set anml $aname foreach aname $anml { set sbar $xth(gui,$aname).sf.sbar set widgx "$aname$widg" set xth(gui,sbar,$widgx,exp) 0 bind $widg "+ if {\$xth(gui,sbar,$widgx,exp) == 0} {catch {set xth(gui,sbar,$widgx,exp) 1; set xth(gui,sbar,$widgx,otext) \[$sbar cget -text\]; $sbar configure -text [list $stext]}}" bind $widg "+ if {\$xth(gui,sbar,$widgx,exp) == 0} {catch {set xth(gui,sbar,$widgx,exp) 1; set xth(gui,sbar,$widgx,otext) \[$sbar cget -text\]; $sbar configure -text [list $stext]}}" bind $widg "+ if {\$xth(gui,sbar,$widgx,exp) == 1} {catch {$sbar configure -text \$xth(gui,sbar,$widgx,otext); set xth(gui,sbar,$widgx,exp) 0}}" bind $widg "+ if {\$xth(gui,sbar,$widgx,exp) == 1} {catch {$sbar configure -text \$xth(gui,sbar,$widgx,otext); set xth(gui,sbar,$widgx,exp) 0}}" } } proc xth_status_bar_push aname { global xth catch { set sbar $xth(gui,$aname).sf.sbar if {![info exists xth(gui,sbar,$aname)]} { set xth(gui,sbar,$aname) [$sbar cget -text] } else { set xth(gui,sbar,$aname) [lappend $xth(gui,sbar,$aname) [$sbar cget -text]] } } } proc xth_status_bar_pop aname { global xth catch { set sbar $xth(gui,$aname).sf.sbar if {! [info exists xth(gui,sbar,$aname)]} { set xth(gui,sbar,$aname) "" } else { $sbar configure -text [lindex $xth(gui,sbar,$aname) 0] set xth(gui,sbar,$aname) [lreplace $xth(gui,sbar,$aname) 0 0] } } } proc xth_status_bar_status {aname txt} { global xth catch { set sbar $xth(gui,$aname).sf.sbar $sbar configure -text $txt update idletasks } } therion/xtherion/dbg.tcl0000775000175000017500000000335510625665160014366 0ustar useruser#! /usr/bin/wish proc xth_dbg_dbg {} { global xth set f $xth(gui,dbg) $f.cmd configure -values [linsert [$f.cmd cget -values] 0 $xth(ctrl,dbg,cmd)] set tmp {} if {[regexp {^\s*\$} $xth(ctrl,dbg,cmd)]} { set tmpcmd "set tmp $xth(ctrl,dbg,cmd)" } else { set tmpcmd "set tmp \[$xth(ctrl,dbg,cmd)\]" } $f.txt delete 1.0 end set xth(ctrl,dbg,cmd) {} eval $tmpcmd $f.txt insert 1.0 $tmp } proc xth_dbg_init {} { global xth set f $xth(gui,dbg) toplevel $f wm title $f "Debug window" ComboBox $f.cmd -font $xth(gui,lfont) -height 8 \ -textvariable xth(ctrl,dbg,cmd) -command xth_dbg_dbg # initialize text editor set txb $f text $txb.txt -height 12 -wrap none -font $xth(gui,efont) \ -bg $xth(gui,ecolorbg) \ -fg $xth(gui,ecolorfg) -insertbackground $xth(gui,ecolorfg) \ -relief sunken -selectbackground $xth(gui,ecolorselbg) \ -selectforeground $xth(gui,ecolorselfg) \ -selectborderwidth 0 \ -yscrollcommand "$txb.sv set" \ -xscrollcommand "$txb.sh set" scrollbar $txb.sv -orient vert -command "$txb.txt yview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) scrollbar $txb.sh -orient horiz -command "$txb.txt xview" \ -takefocus 0 -width $xth(gui,sbwidth) -borderwidth $xth(gui,sbwidthb) grid columnconf $f 0 -weight 1 grid columnconf $f 1 -weight 0 grid rowconf $f 1 -weight 1 grid $f.cmd -column 0 -row 0 -columnspan 2 -sticky news grid $f.txt -column 0 -row 1 -sticky news grid $f.sv -column 1 -row 1 -sticky news grid $f.sh -column 0 -row 2 -sticky news wm geometry $f 480x320+100+100 update idletasks } if 0 { package require BWidget source ver.tcl source global.tcl wm withdraw . xth_dbg_init } else { xth_dbg_init } therion/xtherion/syntax.tcl0000664000175000017500000000561610625665160015157 0ustar useruser## ## syntax.tcl -- ## ## Syntax module. ## ## Copyright (C) 2002 Stacho Mudrak ## ## $Date: $ ## $RCSfile: $ ## $Revision: $ ## ## -------------------------------------------------------------------- ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## -------------------------------------------------------------------- # prepare the syntax commands foreach cmd $xth(icmds) { set xth(cmd,$cmd) 2 set xth(endcmd,$cmd) end$cmd set xth(endcmd,end$cmd) "" set xth(cmd,end$cmd) -2 } foreach cmd $xth(cmds) { set xth(cmd,$cmd) 1 set xth(endcmd,$cmd) end$cmd set xth(endcmd,end$cmd) "" set xth(cmd,end$cmd) -1 } set xth(datafmts) [list \ "unknown $xth(datafmt,unknown)" \ "station $xth(datafmt,station)" \ "from $xth(datafmt,station)" \ "to $xth(datafmt,station)" \ "compass $xth(datafmt,bearing)" \ "backcompass $xth(datafmt,bearing)" \ "bearing $xth(datafmt,bearing)" \ "backbearing $xth(datafmt,bearing)" \ "tape $xth(datafmt,length)" \ "length $xth(datafmt,length)" \ "count $xth(datafmt,counter)" \ "counter $xth(datafmt,counter)" \ "fromcount $xth(datafmt,counter)" \ "tocount $xth(datafmt,counter)" \ "fromcounter $xth(datafmt,counter)" \ "tocounter $xth(datafmt,counter)" \ "gradient $xth(datafmt,gradient)" \ "clino $xth(datafmt,gradient)" \ "backgradient $xth(datafmt,gradient)" \ "backclino $xth(datafmt,gradient)" \ "depth $xth(datafmt,depth)" \ "fromdepth $xth(datafmt,depth)" \ "todepth $xth(datafmt,depth)" \ "depthchange $xth(datafmt,depth)" \ "dx $xth(datafmt,length)" \ "dy $xth(datafmt,length)" \ "dz $xth(datafmt,length)" \ "northing $xth(datafmt,length)" \ "easting $xth(datafmt,length)" \ "altitude $xth(datafmt,length)" \ "up $xth(datafmt,dimensions)" \ "down $xth(datafmt,dimensions)" \ "left $xth(datafmt,dimensions)" \ "right $xth(datafmt,dimensions)" \ "ceiling $xth(datafmt,dimensions)" \ "floor $xth(datafmt,dimensions)" \ ] foreach datafmt $xth(datafmts) { set qt [lindex $datafmt 0] set xth(datafmt,$qt,format) [lindex $datafmt 1] set xth(datafmt,$qt,special) [lindex $datafmt 2] } therion/xtherion/console.tcl0000664000175000017500000021216411221133516015255 0ustar useruser# console.tcl -- # # Console package for the plugin, based on Jeff Hobbs' TkCon work. # Copyright 1996-1997 Jeffrey Hobbs. # # Additional copyright of modifications (c) 1995-1997 # Sun Microsystems, Inc. # # This software is copyrighted by the Regents of the University of # California, Sun Microsystems, Inc., and other parties. The following # terms apply to all files associated with the software unless explicitly # disclaimed in individual files. # # The authors hereby grant permission to use, copy, modify, distribute, # and license this software and its documentation for any purpose, provided # that existing copyright notices are retained in all copies and that this # notice is included verbatim in any distributions. No written agreement, # license, or royalty fee is required for any of the authorized uses. # Modifications to this software may be copyrighted by their authors # and need not follow the licensing terms described here, provided that # the new terms are clearly indicated on the first page of each file where # they apply. # # IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY # FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES # ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY # DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE # IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE # NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR # MODIFICATIONS. # # GOVERNMENT USE: If you are acquiring this software on behalf of the # U.S. government, the Government shall have only "Restricted Rights" # in the software and related documentation as defined in the Federal # Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you # are acquiring the software on behalf of the Department of Defense, the # software shall be classified as "Commercial Computer Software" and the # Government shall have only "Restricted Rights" as defined in Clause # 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the # authors grant the U.S. Government and others acting in its behalf # permission to use and distribute the software in accordance with the # terms specified in this license. # # SCCS: @(#) console.tcl 1.14 97/10/16 18:58:44 # ##------------------------------------------------------------------------ ## PROCEDURE ## console ## ## DESCRIPTION ## Implements a console mega-widget ## ## ARGUMENTS ## console ## ## OPTIONS ## (Any frame widget option may be used in addition to these) ## ## -blinkcolor color DEFAULT: yellow ## Specifies the background blink color for brace highlighting. ## This doubles as the highlight color for the find box. ## ## -blinkrange TCL_BOOLEAN DEFAULT: 1 ## When doing electric brace matching, specifies whether to blink ## the entire range or just the matching braces. ## ## -blinktime delay DEFAULT: 500 ## For electric brace matching, specifies the amount of time to ## blink the background for. ## ## -cols ## DEFAULT: 80 ## Specifies the startup width of the console. ## ## -grabputs TCL_BOOLEAN DEFAULT: 1 ## Whether this console should grab the "puts" default output ## ## -lightbrace TCL_BOOLEAN DEFAULT: 1 ## Specifies whether to activate electric brace matching. ## ## -lightcmd TCL_BOOLEAN DEFAULT: 1 ## Specifies whether to highlight recognized commands. ## ## -proccolor color DEFAULT: darkgreen ## Specifies the color to highlight recognized procs. ## ## -promptcolor color DEFAULT: brown ## Specifies the prompt color. ## ## -rows ## DEFAULT: 20 ## Specifies the startup height of the console. ## ## -stdincolor color DEFAULT: black ## Specifies the color for "stdin". ## This doubles as the console foreground color. ## ## -stdoutcolor color DEFAULT: blue ## Specifies the color for "stdout". ## ## -stderrcolor color DEFAULT: red ## Specifies the color for "stderr". ## ## -scrollypos left|right DEFAULT: right ## Specified position of the console scrollbar relative to the text. ## ## -showmultiple TCL_BOOLEAN DEFAULT: 1 ## For file/proc/var completion, specifies whether to display ## completions when multiple choices are possible. ## ## -showmenu TCL_BOOLEAN DEFAULT: 1 ## Specifies whether to show the menubar. ## ## -subhistory TCL_BOOLEAN DEFAULT: 1 ## Specifies whether to allow substitution in the history. ## ## RETURNS: the window pathname ## ## BINDINGS (these are the bindings for Console, used in the text widget) ## ## <> ## <> ## <> ## <> ## <> ## ## <> ## <> ## <> ## <> ## <> ## ## <> ## <> ## <> ## <> ## <> ## <> ## ## <> ## <> ## <> ## <> ## <> ## <> ## ## METHODS ## These are the methods that the console megawidget recognizes. ## ## configure ?option? ?value option value ...? ## cget option ## Standard tk widget routines. ## ## load ?filename? ## Loads the named file into the current interpreter. ## If no file is specified, it pops up the file requester. ## ## save ?filename? ## Saves the console buffer to the named file. ## If no file is specified, it pops up the file requester. ## ## clear ?percentage? ## Clears a percentage of the console buffer (1-100). If no ## percentage is specified, the entire buffer is cleared. ## ## error ## Displays the last error in the interpreter in a dialog box. ## ## hide ## Withdraws the console from the screen ## ## history ?-newline? ## Prints out the history without numbers (basically providing a ## list of the commands you've used). ## ## show ## Deiconifies and raises the console ## ## subwidget widget ## Returns the true widget path of the specified widget. Valid ## widgets are console, scrolly, menubar. ## ## NAMESPACE & STATE ## The megawidget creates a global array with the classname, and a ## global array which is the name of each megawidget created. The latter ## array is deleted when the megawidget is destroyed. ## The procedure console and those beginning with Console are ## used. Also, when a widget is created, commands named .$widgetname ## and Console$widgetname are created. ## ## EXAMPLE USAGE: ## ## console .con -rows 24 -showmenu false ## ##------------------------------------------------------------------------ set xth(gui,dbg) . package require Tk proc megawidget {CLASS} { upvar \#0 $CLASS class foreach o [array names class -*] { foreach {name cname val} $class($o) { if [string match -* $name] continue option add *$CLASS.$name [uplevel \#0 [list subst $val]] widgetDefault } } set class(class) $CLASS bind $CLASS "catch {${CLASS}_destroy %W}" ;proc $CLASS:eval {w method args} { upvar \#0 $w data set class [winfo class $w] if [string match {} [set arg [info command ${class}_$method]]] { set arg [info command ${class}_$method*] } set num [llength $arg] if {$num==1} { return [uplevel $arg [list $w] $args] } elseif {$num} { return -code error "ambiguous option \"$method\"" } elseif {[catch {uplevel [list $data(cmd) $method] $args} err]} { return -code error $err } else { return $err } } ;proc ${CLASS}_destroy w { upvar \#0 $w data catch { [winfo class $w]:destroy $w } catch { rename $w {} } catch { rename $data(cmd) {} } catch { unset data } } ;proc ${CLASS}_cget {w args} { if {[llength $args] != 1} { return -code error "wrong \# args: should be \"$w cget option\"" } upvar \#0 $w data [winfo class $w] class if {[info exists class($args)] && [string match -* $class($args)]} { set args $class($args) } if [string match {} [set arg [array names data $args]]] { set arg [array names data ${args}*] } set num [llength $arg] if {$num==1} { return $data($arg) } elseif {$num} { return -code error "ambiguous option \"$args\"" } elseif {[catch {$data(cmd) cget $args} err]} { return -code error $err } else { return $err } } ;proc ${CLASS}_configure {w args} { upvar \#0 $w data [winfo class $w] class set num [llength $args] if {$num==1} { if {[info exists class($args)] && [string match -* $class($args)]} { set args $class($args) } if [string match {} [set arg [array names data $args]]] { set arg [array names data ${args}*] } set num [llength $arg] if {$num==1} { return [list $arg $class($arg) $data($arg)] } elseif {$num} { return -code error "ambiguous option \"$args\"" } elseif {[catch {$data(cmd) config $args} err]} { return -code error $err } else { return $err } } elseif {$num} { for {set i 0} {$i<$num} {incr i} { set key [lindex $args $i] if {[info exists class($key)] && [string match -* $class($key)]} { set key $class($key) } if [string match {} [set arg [array names data $key]]] { set arg [array names data $key*] } set val [lindex $args [incr i]] set len [llength $arg] if {$len==1} { $class(class):configure $w $arg $val } elseif {$len} { return -code error "ambiguous option \"$args\"" } elseif {[catch {$data(cmd) configure $key $val} err]} { return -code error $err } } return } else { set conf [$data(cmd) config] foreach i [array names data -*] { lappend conf "$i $class($i) [list $data($i)]" } return [lsort $conf] } } ;proc $CLASS:configure {w key value} { puts "$w: $key configured to [list $value]" } return $CLASS } foreach pkg [info loaded {}] { set file [lindex $pkg 0] set name [lindex $pkg 1] if {![catch {set version [package require $name]}]} { if {[string match {} [package ifneeded $name $version]]} { package ifneeded $name $version "load [list $file $name]" } } } catch {unset file name version} set Console(WWW) [info exists embed_args] array set Console { -blinkcolor {blinkColor BlinkColor yellow} -proccolor {procColor ProcColor darkgreen} -promptcolor {promptColor PromptColor brown} -stdincolor {stdinColor StdinColor black} -stdoutcolor {stdoutColor StdoutColor blue} -stderrcolor {stderrColor StderrColor red} -blinkrange {blinkRange BlinkRange 1} -blinktime {blinkTime BlinkTime 500} -cols {columns Columns 80} -grabputs {grabPuts GrabPuts 1} -lightbrace {lightBrace LightBrace 1} -lightcmd {lightCmd LightCmd 1} -rows {rows Rows 20} -scrollypos {scrollYPos ScrollYPos right} -showmultiple {showMultiple ShowMultiple 1} -showmenu {showMenu ShowMenu 1} -subhistory {subhistory SubHistory 1} active {} version 1.2 release {February 1997} contact {jhobbs@cs.uoregon.edu} docs {http://www.sunlabs.com/tcl/plugin/} slavealias { console } slaveprocs { alias dir dump lremove puts echo unknown tcl_unknown which } } if [string compare unix $tcl_platform(platform)] { set Console(-font) {font Font {Courier 14}} } else { set Console(-font) {font Font fixed} } if $Console(WWW) { set Console(-prompt) {prompt Prompt {\[history nextid\] % }} } else { set Console(-prompt) {prompt Prompt \ {(\[file tail \[pwd\]\]) \[history nextid\] % }} } megawidget Console set ConsoleDialog(version) $Console(version) megawidget ConsoleDialog proc console_dialog {w args} { set CLASS ConsoleDialog upvar \#0 $w data $CLASS class toplevel $w -class $CLASS wm withdraw $w wm title $w "Console $class(version)" ## User definable options foreach o [array names class -*] { if [string match -* $class($o)] continue set data($o) [option get $w [lindex $class($o) 0] $CLASS] } ## Private variables array set data [list class $CLASS cmd $CLASS$w \ console $w.con \ ] pack [console $data(console)] -fill both -exp 1 rename $w .$w rename $data(console) $data(cmd) if {[string comp {} $args] && \ [catch {eval ConsoleDialog_configure $w $args} err]} { catch {destroy $w} catch {unset data} return -code error $err } ;proc $w args "eval $CLASS:eval [list $w] \$args" ## FIX TEST!!! ;proc $data(console) args "eval $CLASS:eval [list $w] \$args" return $w } ;proc ConsoleDialog_subwidget {w widget} { upvar \#0 $w data switch -- $widget { console { return $data($widget) } default { return -code error "No $data(class) subwidget \"$widget\"" } } } ;proc ConsoleDialog:configure {w key val} { upvar \#0 $w data set truth {^(1|yes|true|on)$} switch -- $key { } } ;proc ConsoleDialog_hide w { if [winfo exists $w] {wm withdraw $w} } ;proc ConsoleDialog_show w { if [winfo exists $w] {wm deiconify $w; raise $w} } ## console - # ARGS: w - widget pathname of the Console console # args # Calls: ConsoleInitUI # Outputs: errors found in Console resource file ## proc console {W args} { global Console set CLASS Console upvar \#0 $W data $CLASS class frame $W -class $CLASS ## User definable options foreach o [array names class -*] { if [string match -* $class($o)] continue set data($o) [option get $W [lindex $class($o) 0] $CLASS] } global auto_path tcl_pkgPath tcl_interactive set tcl_interactive 1 ## Private variables array set data { appname {} cmdbuf {} cmdsave {} errorInfo {} event 1 histid 0 find {} find,case 0 find,reg 0 } array set data [list class $CLASS cmd $CLASS$W \ menubar $W.bar \ console $W.text \ scrolly $W.sy \ ] rename $W $data(cmd) if {[string comp {} $args] && \ [catch {eval ${CLASS}_configure $W $args} err]} { catch {destroy $W} catch {unset data} return -code error $err } ;proc $W args "eval $CLASS:eval [list $W] \$args" if {!$Console(WWW)} { if {![info exists tcl_pkgPath]} { set dir [file join [file dirname [info nameofexec]] lib] if [string comp {} [info commands @scope]] { set dir [file join $dir itcl] } catch {source [file join $dir pkgIndex.tcl]} } catch {tclPkgUnknown dummy-name dummy-version} } ## Menus frame $data(menubar) -relief raised -bd 2 set c [text $data(console) -font $data(-font) -wrap char -setgrid 1 \ -yscrollcomm [list $W.sy set] -foreground $data(-stdincolor) \ -width $data(-cols) -height $data(-rows)] bindtags $W [list $W all] bindtags $c [list $c PreCon Console PostCon $W all] scrollbar $data(scrolly) -takefocus 0 -bd 1 -command "$c yview" ConsoleInitMenus $W if $data(-showmenu) { pack $data(menubar) -fill x } pack $data(scrolly) -side $data(-scrollypos) -fill y pack $c -fill both -expand 1 Console:prompt $W "console display active\n" foreach col {prompt stdout stderr stdin proc} { $c tag configure $col -foreground $data(-${col}color) } $c tag configure blink -background $data(-blinkcolor) $c tag configure find -background $data(-blinkcolor) bind $c { set W [winfo toplevel %W] scan [wm geometry $W] "%%dx%%d" $W\(-cols\) $W\(-rows\) } if {$data(-grabputs) && [lsearch $class(active) $W] == -1} { set class(active) [linsert $class(active) 0 $W] } return $W } ;proc Console:configure { W key val } { upvar \#0 $W data global Console set truth {^(1|yes|true|on)$} switch -- $key { -blinkcolor { $data(console) tag config blink -background $val $data(console) tag config find -background $val } -proccolor { $data(console) tag config proc -foreground $val } -promptcolor { $data(console) tag config prompt -foreground $val } -stdincolor { $data(console) tag config stdin -foreground $val $data(console) config -foreground $val } -stdoutcolor { $data(console) tag config stdout -foreground $val } -stderrcolor { $data(console) tag config stderr -foreground $val } -blinktime { if ![regexp {[0-9]+} $val] { return -code error "$key option requires an integer value" } } -cols { if [winfo exists $data(console)] { $data(console) config -width $val } } -font { $data(console) config -font $val } -grabputs { set val [regexp -nocase $truth $val] if $val { set Console(active) [linsert $Console(active) 0 $W] } else { set Console(active) [lremove -all $Console(active) $W] } } -lightbrace { set val [regexp -nocase $truth $val] } -lightcmd { set val [regexp -nocase $truth $val] } -prompt { if [catch {uplevel \#0 [list subst $val]} err] { return -code error "\"$val\" threw an error:\n$err" } } -rows { if [winfo exists $data(console)] { $data(console) config -height $val } } -scrollypos { if [regexp {^(left|right)$} $val junk val] { if [winfo exists $data(scrolly)] { pack config $data(scrolly) -side $val } } else { return -code error "bad option \"$val\": must be left or right" } } -showmultiple { set val [regexp -nocase $truth $val] } -showmenu { set val [regexp -nocase $truth $val] if [winfo exists $data(menubar)] { if $val { pack $data(menubar) -fill x -before $data(console) \ -before $data(scrolly) } else { pack forget $data(menubar) } } } -subhistory { set val [regexp -nocase $truth $val] } } set data($key) $val } ;proc Console:destroy W { global Console set Console(active) [lremove $Console(active) $W] } ## ConsoleEval - evaluates commands input into console window ## This is the first stage of the evaluating commands in the console. ## They need to be broken up into consituent commands (by ConsoleCmdSep) in ## case a multiple commands were pasted in, then each is eval'ed (by ## ConsoleEvalCmd) in turn. Any uncompleted command will not be eval'ed. # ARGS: w - console text widget # Calls: ConsoleCmdGet, ConsoleCmdSep, ConsoleEvalCmd ## ;proc ConsoleEval {w} { ConsoleCmdSep [ConsoleCmdGet $w] cmds cmd $w mark set insert end-1c $w insert end \n if [llength $cmds] { foreach c $cmds {ConsoleEvalCmd $w $c} $w insert insert $cmd {} } elseif {[info complete $cmd] && ![regexp {[^\\]\\$} $cmd]} { ConsoleEvalCmd $w $cmd } $w see insert } ## ConsoleEvalCmd - evaluates a single command, adding it to history # ARGS: w - console text widget # cmd - the command to evaluate # Calls: Console:prompt # Outputs: result of command to stdout (or stderr if error occured) # Returns: next event number ## ;proc ConsoleEvalCmd {w cmd} { ## HACK to get $W as we need it set W [winfo parent $w] upvar \#0 $W data $w mark set output end if [string comp {} $cmd] { set err 0 if $data(-subhistory) { set ev [ConsoleEvalSlave history nextid] incr ev -1 if {[string match !! $cmd]} { set err [catch {ConsoleEvalSlave history event $ev} cmd] if !$err {$w insert output $cmd\n stdin} } elseif {[regexp {^!(.+)$} $cmd dummy event]} { ## Check last event because history event is broken set err [catch {ConsoleEvalSlave history event $ev} cmd] if {!$err && ![string match ${event}* $cmd]} { set err [catch {ConsoleEvalSlave history event $event} cmd] } if !$err {$w insert output $cmd\n stdin} } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $cmd dummy old new]} { if ![set err [catch {ConsoleEvalSlave history event $ev} cmd]] { regsub -all -- $old $cmd $new cmd $w insert output $cmd\n stdin } } } if $err { $w insert output $cmd\n stderr } else { if [string match {} $data(appname)] { if [catch {ConsoleEvalSlave eval $cmd} res] { set data(errorInfo) [ConsoleEvalSlave set errorInfo] set err 1 } } else { if [catch [list ConsoleEvalAttached $cmd] res] { if [catch {ConsoleEvalAttached set errorInfo} err] { set data(errorInfo) {Error attempting to retrieve errorInfo} } else { set data(errorInfo) $err } set err 1 } } ConsoleEvalSlave history add $cmd if $err { $w insert output $res\n stderr } elseif {[string comp {} $res]} { $w insert output $res\n stdout } } } Console:prompt $W set data(event) [ConsoleEvalSlave history nextid] } ## ConsoleEvalSlave - evaluates the args in the associated slave ## args should be passed to this procedure like they would be at ## the command line (not like to 'eval'). # ARGS: args - the command and args to evaluate ## ;proc ConsoleEvalSlave {args} { uplevel \#0 $args } ## ConsoleEvalAttached ## ;proc ConsoleEvalAttached {args} { eval uplevel \#0 $args } ## ConsoleCmdGet - gets the current command from the console widget # ARGS: w - console text widget # Returns: text which compromises current command line ## ;proc ConsoleCmdGet w { if [string match {} [$w tag nextrange prompt limit end]] { $w tag add stdin limit end-1c return [$w get limit end-1c] } } ## ConsoleCmdSep - separates multiple commands into a list and remainder # ARGS: cmd - (possible) multiple command to separate # list - varname for the list of commands that were separated. # rmd - varname of any remainder (like an incomplete final command). # If there is only one command, it's placed in this var. # Returns: constituent command info in varnames specified by list & rmd. ## ;proc ConsoleCmdSep {cmd ls rmd} { upvar $ls cmds $rmd tmp set tmp {} set cmds {} foreach cmd [split [set cmd] \n] { if [string comp {} $tmp] { append tmp \n$cmd } else { append tmp $cmd } if {[info complete $tmp] && ![regexp {[^\\]\\$} $tmp]} { lappend cmds $tmp set tmp {} } } if {[string comp {} [lindex $cmds end]] && [string match {} $tmp]} { set tmp [lindex $cmds end] set cmds [lreplace $cmds end end] } } ## Console:prompt - displays the prompt in the console widget # ARGS: w - console text widget # Outputs: prompt (specified in data(-prompt)) to console ## ;proc Console:prompt {W {pre {}} {post {}} {prompt {}}} { upvar \#0 $W data set w $data(console) if [string comp {} $pre] { $w insert end $pre stdout } set i [$w index end-1c] if [string comp {} $data(appname)] { $w insert end ">$data(appname)< " prompt } if [string comp {} $prompt] { $w insert end $prompt prompt } else { $w insert end [ConsoleEvalSlave subst $data(-prompt)] prompt } $w mark set output $i $w mark set insert end $w mark set limit insert $w mark gravity limit left if [string comp {} $post] { $w insert end $post stdin } $w see end } ## ConsoleAbout - gives about info for Console ## ;proc ConsoleAbout W { global Console set w $W.about if [winfo exists $w] { wm deiconify $w } else { global tk_patchLevel tcl_patchLevel tcl_platform toplevel $w wm title $w "About Console v$Console(version)" button $w.b -text Dismiss -command [list wm withdraw $w] text $w.text -height 9 -bd 1 -width 60 pack $w.b -fill x -side bottom pack $w.text -fill both -side left -expand 1 $w.text tag config center -justify center global tcl_platform if {[string comp unix $tcl_platform(platform)] || [info tclversion] >= 8} { $w.text tag config title -justify center -font {Courier 18 bold} } else { $w.text tag config title -justify center -font *Courier*Bold*18* } $w.text insert 1.0 "About Console v$Console(version)\n\n" title \ "Copyright 1995-1997 Jeffrey Hobbs, $Console(contact)\ \nhttp://www.cs.uoregon.edu/~jhobbs/\ \nRelease Date: v$Console(version), $Console(release)\ \nDocumentation available at:\n$Console(docs)\ \nUsing: Tcl v$tcl_patchLevel / Tk v$tk_patchLevel" center } } ## ConsoleInitMenus - inits the menubar and popup for the console # ARGS: W - console ## ;proc ConsoleInitMenus {W} { upvar \#0 $W data set w $data(menubar) set text $data(console) if [catch {menu $w.pop -tearoff 0}] { label $w.label -text "Menus not available in plugin mode" pack $w.label return } bind [winfo toplevel $w] "tk_popup $w.pop %X %Y" bind $text "tk_popup $w.pop %X %Y" pack [menubutton $w.con -text "Console" -un 0 -menu $w.con.m] -side left $w.pop add cascade -label "Console" -un 0 -menu $w.pop.con pack [menubutton $w.edit -text "Edit" -un 0 -menu $w.edit.m] -side left $w.pop add cascade -label "Edit" -un 0 -menu $w.pop.edit pack [menubutton $w.pref -text "Prefs" -un 0 -menu $w.pref.m] -side left $w.pop add cascade -label "Prefs" -un 0 -menu $w.pop.pref pack [menubutton $w.hist -text "History" -un 0 -menu $w.hist.m] -side left $w.pop add cascade -label "History" -un 0 -menu $w.pop.hist pack [menubutton $w.help -text "Help" -un 0 -menu $w.help.m] -side right $w.pop add cascade -label "Help" -un 0 -menu $w.pop.help ## Console Menu ## foreach m [list [menu $w.con.m -disabledfore $data(-promptcolor)] \ [menu $w.pop.con -disabledfore $data(-promptcolor)]] { $m add command -label "Console $W" -state disabled $m add command -label "Close Console " -un 0 \ -acc [event info <>] -command [list destroy $W] $m add command -label "Clear Console " -un 1 \ -acc [event info <>] -command [list Console_clear $W] $m add separator $m add command -label "Quit" -un 0 -acc [event info <>] \ -command exit } ## Edit Menu ## foreach m [list [menu $w.edit.m] [menu $w.pop.edit]] { $m add command -label "Cut" -un 1 \ -acc [lindex [event info <>] 0] \ -command [list ConsoleCut $text] $m add command -label "Copy" -un 1 \ -acc [lindex [event info <>] 0] \ -command [list ConsoleCopy $text] $m add command -label "Paste" -un 0 \ -acc [lindex [event info <>] 0] \ -command [list ConsolePaste $text] $m add separator $m add command -label "Find" -un 0 -acc [event info <>] \ -command [list ConsoleFindBox $W] } ## Prefs Menu ## foreach m [list [menu $w.pref.m] [menu $w.pop.pref]] { $m add checkbutton -label "Brace Highlighting" -var $W\(-lightbrace\) $m add checkbutton -label "Command Highlighting" -var $W\(-lightcmd\) $m add checkbutton -label "Grab Puts Output" -var $W\(-grabputs\) \ -command "Console:configure $W -grabputs \[set $W\(-grabputs\)\]" $m add checkbutton -label "History Substitution" -var $W\(-subhistory\) $m add checkbutton -label "Show Multiple Matches" -var $W\(-showmultiple\) $m add checkbutton -label "Show Menubar" -var $W\(-showmenu\) \ -command "Console:configure $W -showmenu \[set $W\(-showmenu\)\]" $m add cascade -label Scrollbar -un 0 -menu $m.scroll ## Scrollbar Menu ## set m [menu $m.scroll -tearoff 0] $m add radio -label "Left" -var $W\(-scrollypos\) -value left \ -command [list Console:configure $W -scrollypos left] $m add radio -label "Right" -var $W\(-scrollypos\) -value right \ -command [list Console:configure $W -scrollypos right] } ## History Menu ## foreach m [list $w.hist.m $w.pop.hist] { menu $m -disabledfore $data(-promptcolor) \ -postcommand [list ConsoleHistoryMenu $W $m] } ## Help Menu ## foreach m [list [menu $w.help.m] [menu $w.pop.help]] { $m config -disabledfore $data(-promptcolor) $m add command -label "About " -un 0 -acc [event info <>] \ -command [list ConsoleAbout $W] } bind $W <> exit #bind $W <> ConsoleNew bind $W <> [list destroy $W] bind $W <> [list ConsoleAbout $W] bind $W <> [list ConsoleHelp $W] bind $W <> [list ConsoleFindBox $W] ## Menu items need null PostCon bindings to avoid the TagProc ## foreach ev [bind $W] { bind PostCon $ev { # empty } } } ## ConsoleHistoryMenu - dynamically build the menu for attached interpreters ## # ARGS: w - menu widget ## ;proc ConsoleHistoryMenu {W w} { upvar \#0 $W data if ![winfo exists $w] return set id [ConsoleEvalSlave history nextid] if {$data(histid)==$id} return set data(histid) $id $w delete 0 end set con $data(console) while {($id>$data(histid)-10) && \ ![catch {ConsoleEvalSlave history event [incr id -1]} tmp]} { set lbl [lindex [split $tmp "\n"] 0] if {[string len $lbl]>32} { set lbl [string range $tmp 0 30]... } $w add command -label "$id: $lbl" -command " $con delete limit end $con insert limit [list $tmp] $con see end ConsoleEval $con " } } ## ConsoleFindBox - creates minimal dialog interface to ConsoleFind # ARGS: w - text widget # str - optional seed string for data(find) ## ;proc ConsoleFindBox {W {str {}}} { upvar \#0 $W data set t $data(console) set base $W.find if ![winfo exists $base] { toplevel $base wm withdraw $base wm title $base "Console Find" pack [frame $base.f] -fill x -expand 1 label $base.f.l -text "Find:" entry $base.f.e -textvar $W\(find\) pack [frame $base.opt] -fill x checkbutton $base.opt.c -text "Case Sensitive" -variable $W\(find,case\) checkbutton $base.opt.r -text "Use Regexp" -variable $W\(find,reg\) pack $base.f.l -side left pack $base.f.e $base.opt.c $base.opt.r -side left -fill both -expand 1 pack [frame $base.sep -bd 2 -relief sunken -height 4] -fill x pack [frame $base.btn] -fill both button $base.btn.fnd -text "Find" -width 6 button $base.btn.clr -text "Clear" -width 6 button $base.btn.dis -text "Dismiss" -width 6 eval pack [winfo children $base.btn] -padx 4 -pady 2 -side left -fill both focus $base.f.e bind $base.f.e [list $base.btn.fnd invoke] bind $base.f.e [list $base.btn.dis invoke] } $base.btn.fnd config -command "Console_find $W \$data(find) \ -case \$data(find,case) -reg \$data(find,reg)" $base.btn.clr config -command " $t tag remove find 1.0 end set data(find) {} " $base.btn.dis config -command " $t tag remove find 1.0 end wm withdraw $base " if [string comp {} $str] { set data(find) $str $base.btn.fnd invoke } if {[string comp normal [wm state $base]]} { wm deiconify $base } else { raise $base } $base.f.e select range 0 end } ## Console_find - searches in text widget for $str and highlights it ## If $str is empty, it just deletes any highlighting # ARGS: W - console widget # str - string to search for # -case TCL_BOOLEAN whether to be case sensitive DEFAULT: 0 # -regexp TCL_BOOLEAN whether to use $str as pattern DEFAULT: 0 ## ;proc ConsoleFind {W str args} { upvar \#0 $W data set t $data(console) $t tag remove find 1.0 end set truth {^(1|yes|true|on)$} set opts {} foreach {key val} $args { switch -glob -- $key { -c* { if [regexp -nocase $truth $val] { set case 1 } } -r* { if [regexp -nocase $truth $val] { lappend opts -regexp } } default { return -code error "Unknown option $key" } } } if ![info exists case] { lappend opts -nocase } if [string match {} $str] return $t mark set findmark 1.0 while {[string comp {} [set ix [eval $t search $opts -count numc -- \ [list $str] findmark end]]]} { $t tag add find $ix ${ix}+${numc}c $t mark set findmark ${ix}+1c } catch {$t see find.first} return [expr [llength [$t tag ranges find]]/2] } ## Console:savecommand - saves a command in a buffer for later retrieval # ## ;proc Console:savecommand {w} { upvar \#0 [winfo parent $w] data set tmp $data(cmdsave) set data(cmdsave) [ConsoleCmdGet $w] if {[string match {} $data(cmdsave)]} { set data(cmdsave) $tmp } else { $w delete limit end-1c } $w insert limit $tmp $w see end } ## Console_load - sources a file into the console # ARGS: fn - (optional) filename to source in # Returns: selected filename ({} if nothing was selected) ## ;proc Console_load {W {fn {}}} { if {[string match {} $fn] && ([catch {tk_getOpenFile} fn] || [string match {} $fn])} return ConsoleEvalAttached [list source $fn] } ## Console_save - saves the console buffer to a file ## This does not eval in a slave because it's not necessary # ARGS: w - console text widget # fn - (optional) filename to save to ## ;proc Console_save {W {fn {}}} { upvar \#0 $W data if {[string match {} $fn] && ([catch {tk_getSaveFile} fn] || [string match {} $fn])} return if [catch {open $fn w} fid] { return -code error "Save Error: Unable to open '$fn' for writing\n$fid" } puts $fid [$data(console) get 1.0 end-1c] close $fid } ## clear - clears the buffer of the console (not the history though) ## ;proc Console_clear {W {pcnt 100}} { upvar \#0 $W data set data(tmp) [ConsoleCmdGet $data(console)] if {![regexp {^[0-9]*$} $pcnt] || $pcnt < 1 || $pcnt > 100} { return -code error \ "invalid percentage to clear: must be 1-100 (100 default)" } elseif {$pcnt == 100} { $data(console) delete 1.0 end } else { set tmp [expr $pcnt/100.0*[$data(console) index end]] $data(console) delete 1.0 "$tmp linestart" } Console:prompt $W {} $data(tmp) } ;proc Console_error {W} { ## Outputs stack caused by last error. upvar \#0 $W data set info $data(errorInfo) if [string match {} $info] { set info {errorInfo empty} } catch {destroy $W.error} set w [toplevel $W.error] wm title $w "Console Last Error" button $w.close -text Dismiss -command [list destroy $w] scrollbar $w.sy -takefocus 0 -bd 1 -command [list $w.text yview] text $w.text -font $data(-font) -yscrollcommand [list $w.sy set] pack $w.close -side bottom -fill x pack $w.sy -side right -fill y pack $w.text -fill both -expand 1 $w.text insert 1.0 $info $w.text config -state disabled } ## Console_event - searches for history based on a string ## Search forward (next) if $int>0, otherwise search back (prev) # ARGS: W - console widget ## ;proc Console_event {W int {str {}}} { upvar \#0 $W data if !$int return set w $data(console) set nextid [ConsoleEvalSlave history nextid] if [string comp {} $str] { ## String is not empty, do an event search set event $data(event) if {$int < 0 && $event == $nextid} { set data(cmdbuf) $str } set len [string len $data(cmdbuf)] incr len -1 if {$int > 0} { ## Search history forward while {$event < $nextid} { if {[incr event] == $nextid} { $w delete limit end $w insert limit $data(cmdbuf) break } elseif {![catch {ConsoleEvalSlave history event $event} res] \ && ![string comp $data(cmdbuf) [string range $res 0 $len]]} { $w delete limit end $w insert limit $res break } } set data(event) $event } else { ## Search history reverse while {![catch {ConsoleEvalSlave history event [incr event -1]} res]} { if {![string comp $data(cmdbuf) [string range $res 0 $len]]} { $w delete limit end $w insert limit $res set data(event) $event break } } } } else { ## String is empty, just get next/prev event if {$int > 0} { ## Goto next command in history if {$data(event) < $nextid} { $w delete limit end if {[incr data(event)] == $nextid} { $w insert limit $data(cmdbuf) } else { $w insert limit [ConsoleEvalSlave history event $data(event)] } } } else { ## Goto previous command in history if {$data(event) == $nextid} { set data(cmdbuf) [ConsoleCmdGet $w] } if [catch {ConsoleEvalSlave history event [incr data(event) -1]} res] { incr data(event) } else { $w delete limit end $w insert limit $res } } } $w mark set insert end $w see end } ;proc Console_history {W args} { set sub {\2} if [string match -n* $args] { append sub "\n" } set h [ConsoleEvalSlave history] regsub -all "( *\[0-9\]+ |\t)(\[^\n\]*\n?)" $h $sub h return $h } ## ## Some procedures to make up for lack of built-in shell commands ## ## puts ## This allows me to capture all stdout/stderr to the console window # ARGS: same as usual # Outputs: the string with a color-coded text tag ## if ![catch {rename puts tcl_puts}] { ;proc puts args { global Console set w [lindex $Console(active) 0].text if {[llength $Console(active)] && [winfo exists $w]} { set len [llength $args] if {$len==1} { eval $w insert output $args stdout {\n} stdout $w see output } elseif {$len==2 && \ [regexp {(stdout|stderr|-nonewline)} [lindex $args 0] junk tmp]} { if [string comp $tmp -nonewline] { eval $w insert output [lreplace $args 0 0] $tmp {\n} $tmp } else { eval $w insert output [lreplace $args 0 0] stdout } $w see output } elseif {$len==3 && \ [regexp {(stdout|stderr)} [lreplace $args 2 2] junk tmp]} { if [string comp [lreplace $args 1 2] -nonewline] { eval $w insert output [lrange $args 1 1] $tmp } else { eval $w insert output [lreplace $args 0 1] $tmp } $w see output } else { global errorCode errorInfo if [catch "tcl_puts $args" msg] { regsub tcl_puts $msg puts msg regsub -all tcl_puts $errorInfo puts errorInfo error $msg } return $msg } if $len update } else { global errorCode errorInfo if [catch "tcl_puts $args" msg] { regsub tcl_puts $msg puts msg regsub -all tcl_puts $errorInfo puts errorInfo error $msg } return $msg } } } ## echo ## Relaxes the one string restriction of 'puts' # ARGS: any number of strings to output to stdout ## proc echo args { puts [concat $args] } ## alias - akin to the csh alias command ## If called with no args, then it dumps out all current aliases ## If called with one arg, returns the alias of that arg (or {} if none) # ARGS: newcmd - (optional) command to bind alias to # args - command and args being aliased ## proc alias {{newcmd {}} args} { if [string match {} $newcmd] { set res {} foreach a [interp aliases] { lappend res [list $a -> [interp alias {} $a]] } return [join $res \n] } elseif {[string match {} $args]} { interp alias {} $newcmd } else { eval interp alias [list {} $newcmd {}] $args } } ## dump - outputs variables/procedure/widget info in source'able form. ## Accepts glob style pattern matching for the names # ARGS: type - type of thing to dump: must be variable, procedure, widget # OPTS: -nocomplain # don't complain if no vars match something # -filter pattern # specifies a glob filter pattern to be used by the variable # method as an array filter pattern (it filters down for # nested elements) and in the widget method as a config # option filter pattern # -- forcibly ends options recognition # Returns: the values of the requested items in a 'source'able form ## proc dump {type args} { set whine 1 set code ok while {[string match -* $args]} { switch -glob -- [lindex $args 0] { -n* { set whine 0; set args [lreplace $args 0 0] } -f* { set fltr [lindex $args 1]; set args [lreplace $args 0 1] } -- { set args [lreplace $args 0 0]; break } default { return -code error "unknown option \"[lindex $args 0]\"" } } } if {$whine && [string match {} $args]} { return -code error "wrong \# args: [lindex [info level 0] 0]\ ?-nocomplain? ?-filter pattern? ?--? pattern ?pattern ...?" } set res {} switch -glob -- $type { c* { # command # outpus commands by figuring out, as well as possible, what it is # this does not attempt to auto-load anything foreach arg $args { if [string comp {} [set cmds [info comm $arg]]] { foreach cmd [lsort $cmds] { if {[lsearch -exact [interp aliases] $cmd] > -1} { append res "\#\# ALIAS: $cmd => [interp alias {} $cmd]\n" } elseif {[string comp {} [info procs $cmd]]} { if {[catch {dump p -- $cmd} msg] && $whine} { set code error } append res $msg\n } else { append res "\#\# COMMAND: $cmd\n" } } } elseif $whine { append res "\#\# No known command $arg\n" set code error } } } v* { # variable # outputs variables value(s), whether array or simple. if ![info exists fltr] { set fltr * } foreach arg $args { if {[string match {} [set vars [uplevel info vars [list $arg]]]]} { if {[uplevel info exists $arg]} { set vars $arg } elseif $whine { append res "\#\# No known variable $arg\n" set code error continue } else continue } foreach var [lsort $vars] { upvar $var v if {[array exists v]} { set nest {} append res "array set $var \{\n" foreach i [lsort [array names v $fltr]] { upvar 0 v\($i\) __ary if {[array exists __ary]} { append nest "\#\# NESTED ARRAY ELEMENT: $i\n" append nest "upvar 0 [list $var\($i\)] __ary;\ [dump v -filter $fltr __ary]\n" } else { append res " [list $i]\t[list $v($i)]\n" } } append res "\}\n$nest" } else { append res [list set $var $v]\n } } } } p* { # procedure foreach arg $args { if {[string comp {} [set ps [info proc $arg]]] || ([auto_load $arg] && [string comp {} [set ps [info proc $arg]]])} { foreach p [lsort $ps] { set as {} foreach a [info args $p] { if {[info default $p $a tmp]} { lappend as [list $a $tmp] } else { lappend as $a } } append res [list proc $p $as [info body $p]]\n } } elseif $whine { append res "\#\# No known proc $arg\n" set code error } } } w* { # widget ## The user should have Tk loaded if [string match {} [info command winfo]] { return -code error "winfo not present, cannot dump widgets" } if ![info exists fltr] { set fltr .* } foreach arg $args { if [string comp {} [set ws [info command $arg]]] { foreach w [lsort $ws] { if [winfo exists $w] { if [catch {$w configure} cfg] { append res "\#\# Widget $w does not support configure method" set code error } else { append res "\#\# [winfo class $w] $w\n$w configure" foreach c $cfg { if {[llength $c] != 5} continue if {[regexp -nocase -- $fltr $c]} { append res " \\\n\t[list [lindex $c 0] [lindex $c 4]]" } } append res \n } } } } elseif $whine { append res "\#\# No known widget $arg\n" set code error } } } default { return -code error "bad [lindex [info level 0] 0] option\ \"$type\":\ must be procedure, variable, widget" } } return -code $code [string trimr $res \n] } ## which - tells you where a command is found # ARGS: cmd - command name # Returns: where command is found (internal / external / unknown) ## proc which cmd { if {[string comp {} [info commands $cmd]] || ([auto_load $cmd] && [string comp {} [info commands $cmd]])} { if {[lsearch -exact [interp aliases] $cmd] > -1} { return "$cmd:\taliased to [alias $cmd]" } elseif {[string comp {} [info procs $cmd]]} { return "$cmd:\tinternal proc" } else { return "$cmd:\tinternal command" } } elseif {[string comp {} [auto_execok $cmd]]} { return [auto_execok $cmd] } else { return -code error "$cmd:\tunknown command" } } ## dir - directory list # ARGS: args - names/glob patterns of directories to list # OPTS: -all - list hidden files as well (Unix dot files) # -long - list in full format "permissions size date filename" # -full - displays / after directories and link paths for links # Returns: a directory listing ## proc dir {args} { array set s { all 0 full 0 long 0 0 --- 1 --x 2 -w- 3 -wx 4 r-- 5 r-x 6 rw- 7 rwx } while {[string match \-* [lindex $args 0]]} { set str [lindex $args 0] set args [lreplace $args 0 0] switch -glob -- $str { -a* {set s(all) 1} -f* {set s(full) 1} -l* {set s(long) 1} -- break default { return -code error \ "unknown option \"$str\", should be one of: -all, -full, -long" } } } set sep [string trim [file join . .] .] if [string match {} $args] { set args . } foreach arg $args { if {[file isdir $arg]} { set arg [string trimr $arg $sep]$sep if $s(all) { lappend out [list $arg [lsort [glob -nocomplain -- $arg.* $arg*]]] } else { lappend out [list $arg [lsort [glob -nocomplain -- $arg*]]] } } else { lappend out [list [file dirname $arg]$sep \ [lsort [glob -nocomplain -- $arg]]] } } if $s(long) { set old [clock scan {1 year ago}] set fmt "%s%9d %s %s\n" foreach o $out { set d [lindex $o 0] append res $d:\n foreach f [lindex $o 1] { file lstat $f st set f [file tail $f] if $s(full) { switch -glob $st(type) { d* { append f $sep } l* { append f "@ -> [file readlink $d$sep$f]" } default { if [file exec $d$sep$f] { append f * } } } } if [string match file $st(type)] { set mode - } else { set mode [string index $st(type) 0] } foreach j [split [format %o [expr $st(mode)&0777]] {}] { append mode $s($j) } if {$st(mtime)>$old} { set cfmt {%b %d %H:%M} } else { set cfmt {%b %d %Y} } append res [format $fmt $mode $st(size) \ [clock format $st(mtime) -format $cfmt] $f] } append res \n } } else { foreach o $out { set d [lindex $o 0] append res $d:\n set i 0 foreach f [lindex $o 1] { if {[string len [file tail $f]] > $i} { set i [string len [file tail $f]] } } set i [expr $i+2+$s(full)] ## This gets the number of cols in the Console console widget set j [expr 64/$i] set k 0 foreach f [lindex $o 1] { set f [file tail $f] if $s(full) { switch -glob [file type $d$sep$f] { d* { append f $sep } l* { append f @ } default { if [file exec $d$sep$f] { append f * } } } } append res [format "%-${i}s" $f] if {[incr k]%$j == 0} {set res [string trimr $res]\n} } append res \n\n } } return [string trimr $res] } interp alias {} ls {} dir ## lremove - remove items from a list # OPTS: -all remove all instances of each item # ARGS: l a list to remove items from # args items to remove ## proc lremove {args} { set all 0 if [string match \-a* [lindex $args 0]] { set all 1 set args [lreplace $args 0 0] } set l [lindex $args 0] eval append is [lreplace $args 0 0] foreach i $is { if {[set ix [lsearch -exact $l $i]] == -1} continue set l [lreplace $l $ix $ix] if $all { while {[set ix [lsearch -exact $l $i]] != -1} { set l [lreplace $l $ix $ix] } } } return $l } ## Unknown changed to get output into Console window # unknown: # Invoked automatically whenever an unknown command is encountered. # Works through a list of "unknown handlers" that have been registered # to deal with unknown commands. Extensions can integrate their own # handlers into the "unknown" facility via "unknown_handle". # # If a handler exists that recognizes the command, then it will # take care of the command action and return a valid result or a # Tcl error. Otherwise, it should return "-code continue" (=2) # and responsibility for the command is passed to the next handler. # # Arguments: # args - A list whose elements are the words of the original # command, including the command name. #proc unknown args { # global unknown_handler_order unknown_handlers errorInfo errorCode # # # # # Be careful to save error info now, and restore it later # # for each handler. Some handlers generate their own errors # # and disrupt handling. # # # set savedErrorCode $errorCode # set savedErrorInfo $errorInfo # # if {![info exists unknown_handler_order] || ![info exists unknown_handlers]} { # set unknown_handlers(tcl) tcl_unknown # set unknown_handler_order tcl # } # # foreach handler $unknown_handler_order { # set status [catch {uplevel $unknown_handlers($handler) $args} result] # # if {$status == 1} { # # # # Strip the last five lines off the error stack (they're # # from the "uplevel" command). # # # set new [split $errorInfo \n] # set new [join [lrange $new 0 [expr [llength $new] - 6]] \n] # return -code $status -errorcode $errorCode \ # -errorinfo $new $result # # } elseif {$status != 4} { # return -code $status $result # } # # set errorCode $savedErrorCode # set errorInfo $savedErrorInfo # } # # set name [lindex $args 0] # return -code error "invalid command name \"$name\"" #} # ## tcl_unknown: ## Invoked when a Tcl command is invoked that doesn't exist in the ## interpreter: ## ## 1. See if the autoload facility can locate the command in a ## Tcl script file. If so, load it and execute it. ## 2. If the command was invoked interactively at top-level: ## (a) see if the command exists as an executable UNIX program. ## If so, "exec" the command. ## (b) see if the command requests csh-like history substitution ## in one of the common forms !!, !, or ^old^new. If ## so, emulate csh's history substitution. ## (c) see if the command is a unique abbreviation for another ## command. If so, invoke the command. ## ## Arguments: ## args - A list whose elements are the words of the original ## command, including the command name. # #proc tcl_unknown args { # global auto_noexec auto_noload env unknown_pending tcl_interactive Console # global errorCode errorInfo # # # Save the values of errorCode and errorInfo variables, since they # # may get modified if caught errors occur below. The variables will # # be restored just before re-executing the missing command. # # set savedErrorCode $errorCode # set savedErrorInfo $errorInfo # set name [lindex $args 0] # if ![info exists auto_noload] { # # # # Make sure we're not trying to load the same proc twice. # # # if [info exists unknown_pending($name)] { # unset unknown_pending($name) # if {[array size unknown_pending] == 0} { # unset unknown_pending # } # return -code error "self-referential recursion in \"unknown\" for command \"$name\""; # } # set unknown_pending($name) pending; # set ret [catch {auto_load $name} msg] # unset unknown_pending($name); # if $ret { # return -code $ret -errorcode $errorCode \ # "error while autoloading \"$name\": $msg" # } # if ![array size unknown_pending] { # unset unknown_pending # } # if $msg { # set errorCode $savedErrorCode # set errorInfo $savedErrorInfo # set code [catch {uplevel $args} msg] # if {$code == 1} { # # # # Strip the last five lines off the error stack (they're # # from the "uplevel" command). # # # # set new [split $errorInfo \n] # set new [join [lrange $new 0 [expr [llength $new] - 6]] \n] # return -code error -errorcode $errorCode \ # -errorinfo $new $msg # } else { # return -code $code $msg # } # } # } # if {[info level] == 1 && [string match {} [info script]] \ # && [info exists tcl_interactive] && $tcl_interactive} { # if ![info exists auto_noexec] { # set new [auto_execok $name] # if {$new != ""} { # set errorCode $savedErrorCode # set errorInfo $savedErrorInfo # return [uplevel exec [list $new] [lrange $args 1 end]] # #return [uplevel exec >&@stdout <@stdin $new [lrange $args 1 end]] # } # } # set errorCode $savedErrorCode # set errorInfo $savedErrorInfo # ## # ## History substitution moved into ConsoleEvalCmd # ## # set cmds [info commands $name*] # if {[llength $cmds] == 1} { # return [uplevel [lreplace $args 0 0 $cmds]] # } # if {[llength $cmds]} { # if {$name == ""} { # return -code error "empty command name \"\"" # } else { # return -code error \ # "ambiguous command name \"$name\": [lsort $cmds]" # } # } # } # return -code continue #} switch -glob $tcl_platform(platform) { win* { set META Alt } mac* { set META Command } default { set META Meta } } # ConsoleClipboardKeysyms -- # This procedure is invoked to identify the keys that correspond to # the "copy", "cut", and "paste" functions for the clipboard. # # Arguments: # copy - Name of the key (keysym name plus modifiers, if any, # such as "Meta-y") used for the copy operation. # cut - Name of the key used for the cut operation. # paste - Name of the key used for the paste operation. ;proc ConsoleClipboardKeysyms {copy cut paste} { bind Console <$copy> {ConsoleCopy %W} bind Console <$cut> {ConsoleCut %W} bind Console <$paste> {ConsolePaste %W} } ;proc ConsoleCut w { if [string match $w [selection own -displayof $w]] { clipboard clear -displayof $w catch { clipboard append -displayof $w [selection get -displayof $w] if [$w compare sel.first >= limit] {$w delete sel.first sel.last} } } } ;proc ConsoleCopy w { if [string match $w [selection own -displayof $w]] { clipboard clear -displayof $w catch {clipboard append -displayof $w [selection get -displayof $w]} } } ;proc ConsolePaste w { if ![catch {selection get -displayof $w -selection CLIPBOARD} tmp] { if [$w compare insert < limit] {$w mark set insert end} $w insert insert $tmp $w see insert if [string match *\n* $tmp] {ConsoleEval $w} } } ## Get all Text bindings into Console except Unix cut/copy/paste ## and newline insertion foreach ev [lremove [bind Text] { \ \ }] { bind Console $ev [bind Text $ev] } foreach {ev key} { <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> } { event add $ev $key bind Console $key {} } catch {unset ev key} ## Redefine for Console what we need ## event delete <> ConsoleClipboardKeysyms bind Console {catch {ConsoleInsert %W [selection get -displayof %W]}} bind Console {+ catch { eval %W tag remove sel [%W tag nextrange prompt sel.first sel.last] %W mark set insert sel.first } } bind Console <> { if [%W compare insert > limit] {Console:expand %W path} break } bind Console <> { if [%W compare insert > limit] {Console:expand %W proc} } bind Console <> { if [%W compare insert > limit] {Console:expand %W var} } bind Console <> { if [%W compare insert >= limit] { ConsoleInsert %W \t } } bind Console <> { ConsoleEval %W } bind Console { if {[string comp {} [%W tag nextrange sel 1.0 end]] \ && [%W compare sel.first >= limit]} { %W delete sel.first sel.last } elseif {[%W compare insert >= limit]} { %W delete insert %W see insert } } bind Console { if {[string comp {} [%W tag nextrange sel 1.0 end]] \ && [%W compare sel.first >= limit]} { %W delete sel.first sel.last } elseif {[%W compare insert != 1.0] && [%W compare insert > limit]} { %W delete insert-1c %W see insert } } bind Console [bind Console ] bind Console { ConsoleInsert %W %A } bind Console { if [%W compare {limit linestart} == {insert linestart}] { tkTextSetCursor %W limit } else { tkTextSetCursor %W {insert linestart} } } bind Console { if [%W compare insert < limit] break %W delete insert } bind Console <> { if [%W compare insert < limit] break if [%W compare insert == {insert lineend}] { %W delete insert } else { %W delete insert {insert lineend} } } bind Console <> { Console_clear [winfo parent %W] } bind Console <> { if [%W compare {insert linestart} != {limit linestart}] { tkTextSetCursor %W [tkTextUpDownLine %W -1] } else { Console_event [winfo parent %W] -1 } } bind Console <> { if [%W compare {insert linestart} != {end-1c linestart}] { tkTextSetCursor %W [tkTextUpDownLine %W 1] } else { Console_event [winfo parent %W] 1 } } bind Console <> { Console_event [winfo parent %W] 1 } bind Console <> { Console_event [winfo parent %W] -1 } bind Console <> { Console_event [winfo parent %W] -1 [ConsoleCmdGet %W] } bind Console <> { Console_event [winfo parent %W] 1 [ConsoleCmdGet %W] } bind Console <> { ## Transpose current and previous chars if [%W compare insert > limit] { tkTextTranspose %W } } bind Console <> { ## Clear command line (Unix shell staple) %W delete limit end } bind Console <> { ## Save command buffer (swaps with current command) Console:savecommand %W } catch {bind Console { tkTextScrollPages %W -1 }} catch {bind Console { tkTextScrollPages %W -1 }} catch {bind Console { tkTextScrollPages %W 1 }} catch {bind Console { tkTextScrollPages %W 1 }} bind Console <$META-d> { if [%W compare insert >= limit] { %W delete insert {insert wordend} } } bind Console <$META-BackSpace> { if [%W compare {insert -1c wordstart} >= limit] { %W delete {insert -1c wordstart} insert } } bind Console <$META-Delete> { if [%W compare insert >= limit] { %W delete insert {insert wordend} } } bind Console { if {(!$tkPriv(mouseMoved) || $tk_strictMotif) \ && ![catch {selection get -displayof %W} tkPriv(junk)]} { if [%W compare @%x,%y < limit] { %W insert end $tkPriv(junk) } else { %W insert @%x,%y $tkPriv(junk) } if [string match *\n* $tkPriv(junk)] {ConsoleEval %W} } } ## ## End Console bindings ## ## ## Bindings for doing special things based on certain keys ## bind PostCon { if [string comp \\ [%W get insert-2c]] { ConsoleMatchPair %W \( \) limit } } bind PostCon { if [string comp \\ [%W get insert-2c]] { ConsoleMatchPair %W \[ \] limit } } bind PostCon { if [string comp \\ [%W get insert-2c]] { ConsoleMatchPair %W \{ \} limit } } bind PostCon { if [string comp \\ [%W get insert-2c]] { ConsoleMatchQuote %W limit } } bind PostCon { if [string comp {} %A] { ConsoleTagProc %W } } ## ConsoleTagProc - tags a procedure in the console if it's recognized ## This procedure is not perfect. However, making it perfect wastes ## too much CPU time... Also it should check the existence of a command ## in whatever is the connected slave, not the master interpreter. ## ;proc ConsoleTagProc w { upvar \#0 [winfo parent $w] data if !$data(-lightcmd) return set i [$w index "insert-1c wordstart"] set j [$w index "insert-1c wordend"] if {[string comp {} \ [ConsoleEvalAttached info command [list [$w get $i $j]]]]} { $w tag add proc $i $j } else { $w tag remove proc $i $j } } ## ConsoleMatchPair - blinks a matching pair of characters ## c2 is assumed to be at the text index 'insert'. ## This proc is really loopy and took me an hour to figure out given ## all possible combinations with escaping except for escaped \'s. ## It doesn't take into account possible commenting... Oh well. If ## anyone has something better, I'd like to see/use it. This is really ## only efficient for small contexts. # ARGS: w - console text widget # c1 - first char of pair # c2 - second char of pair # Calls: Console:blink ## ;proc ConsoleMatchPair {w c1 c2 {lim 1.0}} { upvar \#0 [winfo parent $w] data if {!$data(-lightbrace) || $data(-blinktime)<100} return if [string comp {} [set ix [$w search -back $c1 insert $lim]]] { while {[string match {\\} [$w get $ix-1c]] && [string comp {} [set ix [$w search -back $c1 $ix-1c $lim]]]} {} set i1 insert-1c while {[string comp {} $ix]} { set i0 $ix set j 0 while {[string comp {} [set i0 [$w search $c2 $i0 $i1]]]} { append i0 +1c if {[string match {\\} [$w get $i0-2c]]} continue incr j } if {!$j} break set i1 $ix while {$j && [string comp {} [set ix [$w search -back $c1 $ix $lim]]]} { if {[string match {\\} [$w get $ix-1c]]} continue incr j -1 } } if [string match {} $ix] { set ix [$w index $lim] } } else { set ix [$w index $lim] } if $data(-blinkrange) { Console:blink $w $data(-blinktime) $ix [$w index insert] } else { Console:blink $w $data(-blinktime) $ix $ix+1c \ [$w index insert-1c] [$w index insert] } } ## ConsoleMatchQuote - blinks between matching quotes. ## Blinks just the quote if it's unmatched, otherwise blinks quoted string ## The quote to match is assumed to be at the text index 'insert'. # ARGS: w - console text widget # Calls: Console:blink ## ;proc ConsoleMatchQuote {w {lim 1.0}} { upvar \#0 [winfo parent $w] data if {!$data(-lightbrace) || $data(-blinktime)<100} return set i insert-1c set j 0 while {[string comp {} [set i [$w search -back \" $i $lim]]]} { if {[string match {\\} [$w get $i-1c]]} continue if {!$j} {set i0 $i} incr j } if [expr $j%2] { if $data(-blinkrange) { Console:blink $w $data(-blinktime) $i0 [$w index insert] } else { Console:blink $w $data(-blinktime) $i0 $i0+1c \ [$w index insert-1c] [$w index insert] } } else { Console:blink $w $data(-blinktime) [$w index insert-1c] [$w index insert] } } ## Console:blink - blinks between 2 indices for a specified duration. # ARGS: w - console text widget # delay - millisecs to blink for # args - indices of regions to blink # Outputs: blinks selected characters in $w ## ;proc Console:blink {w delay args} { eval $w tag add blink $args after $delay eval $w tag remove blink $args return } ## ConsoleInsert ## Insert a string into a text console at the point of the insertion cursor. ## If there is a selection in the text, and it covers the point of the ## insertion cursor, then delete the selection before inserting. # ARGS: w - text window in which to insert the string # s - string to insert (usually just a single char) # Outputs: $s to text widget ## ;proc ConsoleInsert {w s} { if {[string match {} $s] || [string match disabled [$w cget -state]]} { return } if [$w comp insert < limit] { $w mark set insert end } catch { if {[$w comp sel.first <= insert] && [$w comp sel.last >= insert]} { $w delete sel.first sel.last } } $w insert insert $s $w see insert } ## Console:expand - # ARGS: w - text widget in which to expand str # type - type of expansion (path / proc / variable) # Calls: ConsoleExpand(Pathname|Procname|Variable) # Outputs: The string to match is expanded to the longest possible match. # If data(-showmultiple) is non-zero and the user longest match # equaled the string to expand, then all possible matches are # output to stdout. Triggers bell if no matches are found. # Returns: number of matches found ## ;proc Console:expand {w type} { set exp "\[^\\]\[ \t\n\r\[\{\"\$]" set tmp [$w search -back -regexp $exp insert-1c limit-1c] if [string compare {} $tmp] {append tmp +2c} else {set tmp limit} if [$w compare $tmp >= insert] return set str [$w get $tmp insert] switch -glob $type { pa* { set res [ConsoleExpandPathname $str] } pr* { set res [ConsoleExpandProcname $str] } v* { set res [ConsoleExpandVariable $str] } default {set res {}} } set len [llength $res] if $len { $w delete $tmp insert $w insert $tmp [lindex $res 0] if {$len > 1} { upvar \#0 [winfo parent $w] data if {$data(-showmultiple) && ![string comp [lindex $res 0] $str]} { puts stdout [lreplace $res 0 0] } } } else bell return [incr len -1] } ## ConsoleExpandPathname - expand a file pathname based on $str ## This is based on UNIX file name conventions # ARGS: str - partial file pathname to expand # Calls: ConsoleExpandBestMatch # Returns: list containing longest unique match followed by all the # possible further matches ## ;proc ConsoleExpandPathname str { set pwd [ConsoleEvalAttached pwd] if [catch {ConsoleEvalAttached [list cd [file dirname $str]]} err] { return -code error $err } if [catch {lsort [ConsoleEvalAttached glob [file tail $str]*]} m] { set match {} } else { if {[llength $m] > 1} { global tcl_platform if [string match windows $tcl_platform(platform)] { ## Windows is screwy because it's case insensitive set tmp [ConsoleExpandBestMatch [string tolower $m] \ [string tolower [file tail $str]]] } else { set tmp [ConsoleExpandBestMatch $m [file tail $str]] } if [string match ?*/* $str] { set tmp [file dirname $str]/$tmp } elseif {[string match /* $str]} { set tmp /$tmp } regsub -all { } $tmp {\\ } tmp set match [linsert $m 0 $tmp] } else { ## This may look goofy, but it handles spaces in path names eval append match $m if [file isdir $match] {append match /} if [string match ?*/* $str] { set match [file dirname $str]/$match } elseif {[string match /* $str]} { set match /$match } regsub -all { } $match {\\ } match ## Why is this one needed and the ones below aren't!! set match [list $match] } } ConsoleEvalAttached [list cd $pwd] return $match } ## ConsoleExpandProcname - expand a tcl proc name based on $str # ARGS: str - partial proc name to expand # Calls: ConsoleExpandBestMatch # Returns: list containing longest unique match followed by all the # possible further matches ## ;proc ConsoleExpandProcname str { set match [ConsoleEvalAttached info commands $str*] if {[llength $match] > 1} { regsub -all { } [ConsoleExpandBestMatch $match $str] {\\ } str set match [linsert $match 0 $str] } else { regsub -all { } $match {\\ } match } return $match } ## ConsoleExpandVariable - expand a tcl variable name based on $str # ARGS: str - partial tcl var name to expand # Calls: ConsoleExpandBestMatch # Returns: list containing longest unique match followed by all the # possible further matches ## ;proc ConsoleExpandVariable str { if [regexp {([^\(]*)\((.*)} $str junk ary str] { ## Looks like they're trying to expand an array. set match [ConsoleEvalAttached array names $ary $str*] if {[llength $match] > 1} { set vars $ary\([ConsoleExpandBestMatch $match $str] foreach var $match {lappend vars $ary\($var\)} return $vars } else {set match $ary\($match\)} ## Space transformation avoided for array names. } else { set match [ConsoleEvalAttached info vars $str*] if {[llength $match] > 1} { regsub -all { } [ConsoleExpandBestMatch $match $str] {\\ } str set match [linsert $match 0 $str] } else { regsub -all { } $match {\\ } match } } return $match } ## ConsoleExpandBestMatch2 - finds the best unique match in a list of names ## Improves upon the speed of the below proc only when $l is small ## or $e is {}. $e is extra for compatibility with proc below. # ARGS: l - list to find best unique match in # Returns: longest unique match in the list ## ;proc ConsoleExpandBestMatch2 {l {e {}}} { set s [lindex $l 0] if {[llength $l]>1} { set i [expr [string length $s]-1] foreach l $l { while {$i>=0 && [string first $s $l]} { set s [string range $s 0 [incr i -1]] } } } return $s } ## ConsoleExpandBestMatch - finds the best unique match in a list of names ## The extra $e in this argument allows us to limit the innermost loop a ## little further. This improves speed as $l becomes large or $e becomes long. # ARGS: l - list to find best unique match in # e - currently best known unique match # Returns: longest unique match in the list ## ;proc ConsoleExpandBestMatch {l {e {}}} { set ec [lindex $l 0] if {[llength $l]>1} { set e [string length $e]; incr e -1 set ei [string length $ec]; incr ei -1 foreach l $l { while {$ei>=$e && [string first $ec $l]} { set ec [string range $ec 0 [incr ei -1]] } } } return $ec } ## ConsoleResource - re'source's this script into current console ## Meant primarily for my development of this program. It follows ## links until the ultimate source is found. ## set Console(SCRIPT) [info script] if !$Console(WWW) { while {[string match link [file type $Console(SCRIPT)]]} { set link [file readlink $Console(SCRIPT)] if [string match relative [file pathtype $link]] { set Console(SCRIPT) [file join [file dirname $Console(SCRIPT)] $link] } else { set Console(SCRIPT) $link } } catch {unset link} if [string match relative [file pathtype $Console(SCRIPT)]] { set Console(SCRIPT) [file join [pwd] $Console(SCRIPT)] } } ;proc Console:resource {} { global Console uplevel \#0 [list source $Console(SCRIPT)] } ## This automatically starts a console ## catch {destroy .c} pack [console .c] -fill both -expand 1 if {[info exists ::Name]} { wm title . "Console: $::Name" wm iconify . #wm geometry . +10+10 } if {$Console(WWW)} { . configure -width [getattr width] -height [getattr height] } therion/xtherion/mkall.tcl0000664000175000017500000000364412071372120014714 0ustar useruserproc append_file {fnm} { global oid set fid [open $fnm r] while {![eof $fid]} { gets $fid ln if {![regexp {^\s*\#\#} $ln]} { puts $oid $ln } } puts $oid "\n\n\n\n" close $fid } proc append_all_file {fnm} { global oid set fid [open $fnm r] fcopy $fid $oid puts $oid "\n\n\n\n" close $fid } set what [lindex $argv 0] switch $what { survex { set oid [open "svxedit" w] puts $oid "#!/usr/bin/wish" puts $oid {## ## svxedit -- ## ## Survex svx files editor. ## ## Copyright (C) 2002 Stacho Mudrak ## ##} } default { case $tcl_platform(platform) { windows { set oid [open "xtherion.tcl" w] } default { set oid [open "xtherion" w] puts $oid "#!/bin/sh" puts $oid "# the next line restarts with wish \\" puts $oid "exec wish \"\$0\" \"\$@\"" } } puts $oid {## ## xtherion -- ## ## Therion user interface. ## ## Copyright (C) 2002 Stacho Mudrak ## ##} set what xtherion } } append_all_file licence.tcl puts $oid "\n\n\nset xth(debug) 0" catch { set fid [open ../thversion.h r] gets $fid verl regexp {\d+\.\d+(\.\d+)?} $verl vver close $fid set fid [open ver.tcl w] fconfigure $fid -translation lf puts $fid "set xth(about,ver) $vver" close $fid } set fid [open source.tcl r] set toappend 0 while {![eof $fid]} { gets $fid fl if {[regexp {^\s*\#\@(\S+)\s*$} $fl dum current]} { if {[string equal -nocase $what $current]} { set toappend 1 } elseif {[string equal -nocase "ALL" $current]} { set toappend 1 } else { set toappend 0 } } if {![regexp {^\s*\#} $fl]} { if {[regexp {^\s*source\s+(\S+)} $fl dum afname] && $toappend} { append_file $afname } } } close $fid close $oid case $tcl_platform(platform) { unix { catch {exec chmod 775 xtherion} catch {exec chmod 775 svxedit} } windows { } } exit 0therion/xtherion/lang/0000775000175000017500000000000012426431545014035 5ustar userusertherion/xtherion/lang/xtexts.txt0000664000175000017500000043536111542657016016152 0ustar userusertherion: Drag to resize control panel. bg: Плъзнете, за да промените размера на ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ð½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» cz: ZmÄ›nit šířku panelu. de: Ziehen um Größe zu ändern. el: Drag για Ï€ÏοσαÏμογή μεγέθους πίνακα ελέγχου. en: Drag to resize control panel. es: Arrastar para cambiar el tamaño del panel de control. it: Trascina per ridimensionare il pannello dei controlli ru: ПеретаÑкивайте Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° панели sk: RozšíriÅ¥ alebo zúžiÅ¥ okno kontrolných panelov. sq: levize per te rritur dritaren kontrolluese therion: File bg: Файл cz: Soubor de: Datei el: ΑÏχείο en: File es: Archivo it: File ru: Файл sk: Súbor sq: fajlli therion: Maximize bg: Увеличаване cz: Maximalizovat de: Maximieren el: Μεγιστοποίηση en: Maximize es: Maximizar it: Massimizza ru: Развернуть sk: MaximalizovaÅ¥ sq: rrite ne maksimum therion: Normalize bg: Ðормализиране cz: Normální velikost de: Normalgröße el: Κανονικό μέγεθος en: Normalize es: Normalizar it: Normalizza ru: Свернуть sk: Normálna veľkosÅ¥ sq: normalizo therion: Switch panels bg: Превключи панела cz: PÅ™ehoÄ panely de: Panel verschieben el: Αλλαγή παÏάθυÏου en: Switch panels es: Alternar paneles it: Cambia posto al pannello ru: Переключить панели sk: PrehoÄ panely sq: nderro panelat therion: Toggle toolbar bg: Превключи панела Ñ Ð¸Ð½Ñтрументи cz: Vypnout/zapnout liÅ¡tu nástrojů de: Werkzeugleiste anzeigen/verbergen el: Εμφάνιση / μη-εμφάνιση γÏαμμής εÏγαλείων it: Mostra/Nascondi la barra strumenti ru: Переключить панель инÑтрументов sk: Zapnúť/vypnúť panel sq: dritarja aktivizuese therion: KBD encoding bg: Кодировка на клавиатурата cz: Kódování klávesnice de: Zeichensatz el: Κωδικοποίηση πληκτÏολογίου en: KBD encoding es: Codificación teclado it: Encoding della tastiera ru: Кодировка клавиатуры sk: Kódovanie klávesnice sq: KBD-kodimi therion: Window bg: Прозорец cz: Okno de: Fenster el: ΠαÏάθυÏο en: Window es: Ventana it: Finestra ru: Окно sk: Okno sq: dritarja therion: Quit bg: Изход cz: Konec de: Beenden el: Έξοδος en: Quit es: Salir it: Esci ru: Выход sk: UkonÄiÅ¥ sq: mbylle therion: Help bg: Помощ cz: NápovÄ›da de: Hilfe el: Βοήθεια en: Help es: Ayuda it: Aiuto ru: Помощь sk: Pomoc sq: ndihma therion: BAC calculator bg: Ðлкохолен калкулатор cz: Alkohol tester de: Blutalkoholrechner el: Αλκοτέστ en: BAC calculator es: Borrachímetro it: Calcolatore BAC ru: КалькулÑтор Ð°Ð»ÐºÐ¾Ð³Ð¾Ð»Ñ sk: Alkohol tester sq: llogaritesi I alkoolit therion: Biometric data bg: Биометрични данни cz: Biometrické údaje de: Persönliche Angaben el: ΒιομετÏικά δεδομένα en: Biometric data es: Datos biométricos it: Dati biometrici ru: БиометричеÑкие данные sk: Biometrické údaje sq: shenimet biometrike therion: age bg: ВъзраÑÑ‚ cz: vÄ›k de: Alter el: ηλικία en: age es: edad it: età ru: ВозраÑÑ‚ sk: vek sq: mosha therion: years bg: Години cz: let de: Jahre el: έτη en: years es: años it: anni ru: лет sk: rokov sq: vitet therion: gender bg: Пол cz: pohlaví de: Geschlecht el: φÏλο en: gender es: sexo it: sesso ru: Пол sk: pohlavie sq: gjinia therion: male bg: Мъж cz: muž de: männlich el: αÏσενικό en: male es: hombre it: maschio ru: мужчина sk: muž sq: mashkull therion: female bg: Жена cz: žena de: weiblich el: θυλικό en: female es: mujer it: femmina ru: женщина sk: žena sq: femer therion: height bg: РъÑÑ‚ cz: výška de: Größe el: Ïψος en: height es: altura it: altezza ru: РоÑÑ‚ sk: výška sq: gjatesia therion: weight bg: Тегло cz: váha de: Gewicht el: βάÏος en: weight es: peso it: peso ru: Ð’ÐµÑ sk: váha sq: pesha therion: Consumption data bg: Какво Ñте пили cz: Údaje o spotÅ™ebÄ› de: Alkoholkonsum el: Δεδομένα κατανάλωσης en: Consumption data es: Datos de ingestión it: Bevande assunte ru: ХарактериÑтика принÑтого sk: Údaje o spotrebe sq: shenimet e hargjimeve therion: volume bg: КоличеÑтво cz: objem de: Menge el: όγκος en: volume es: volumen it: volume ru: Объем sk: objem sq: volumi therion: alcohol level bg: ÐšÐ¾Ð½Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ñ†Ð¸Ñ cz: koncentrace alkoholu de: Alkoholgehalt el: πεÏιεκτικότητα σε αλκοόλ en: alcohol level es: contenido alcohólico it: tasso alcolico ru: КрепоÑть sk: koncentrácia sq: sasia e alkoolit therion: time elapsed bg: Минало време cz: uplynulý Äas de: vergangene Zeit el: ÏŽÏα που πέÏασε en: time elapsed es: tiempo transcurrido it: tempo trascorso ru: Прошло времени sk: uplynutý Äas sq: koha e duhur therion: Calculate bg: ИзчиÑли cz: VypoÄítat de: Berechne el: υπολογισμός en: Calculate es: Calcular it: Calcola ru: ПоÑчитать sk: VypoÄítaÅ¥ sq: llogarit therion: BAC bg: Ðаличие на алкохол в кръвта cz: Hladina alkoholu v krvi de: Blutalkoholpegel el: ΠεÏιεκτικότητα αίματος σε αλκοόλ en: BAC es: tasa alcoholemia it: BAC ru: BAC sk: Hladina alkoholu sq: perqindja e alkoolit ne gjak-BAC therion: ETA bg: Време до изтрезнÑване cz: ÄŒas do vystřízlivÄ›ní el: Αναμενόμενη ÏŽÏα άφιξης en: ETA es: TBE (Tiempo Bajada Estimado) it: ETA ru: ETA sk: ÄŒas do vytriezvenia sq: ETA therion: hours bg: чаÑове cz: hodin de: Stunden el: ÏŽÏες en: hours es: horas it: ore ru: чаÑов sk: hodín sq: oret therion: MRR bg: MRR cz: Rychlost odbourávání el: MRR en: MRR es: tasa de descenso it: MRR ru: MRR sk: RýchlosÅ¥ odburávania sq: MRR therion: Compiler bg: Компилатор cz: Kompilátor de: Compiler el: Συντάκτης en: Compiler es: Compilador it: Compilatore ru: КомпилÑтор sk: Kompilátor sq: kompilatori therion: Settings bg: ÐаÑтройки cz: Nastavení de: Einstellungen el: Ρυθμίσεις en: Settings es: Ajustes it: Impostazioni ru: ÐаÑтройки sk: Nastavenia sq: setingu therion: Survey structure bg: Структура на картировката cz: Struktura měření (survey) de: Messdatenstruktur el: Δομή χαÏτογÏάφησης en: Survey structure es: Estructura de la poligonal it: Struttura rilievi ru: Структура Ñъемки sk: Å truktúra dát sq: struktura e matjeve therion: Survey info bg: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ cz: Info o měření (survey) de: Infos zur Vermessung el: ΠληÏοφοÏίες χαÏτογÏάφησης en: Survey info es: Información de la poligonal it: Informazioni rilievi ru: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ sk: Informácie sq: informatat e matjeve therion: Map structure bg: Структура на картата cz: Mapová struktura de: Planstruktur el: Δομή αποτÏπωσης en: Map structure es: Estructura del mapa it: Struttura mappe ru: Структура карты sk: Mapová Å¡truktúra sq: struktura e hartes therion: Preview bg: Предварителен изглед cz: Náhled de: Vorschau el: ΠÏοεπισκόπηση it: Anteprima ru: ПредпроÑмотр sk: Náhľad sq: parashiqimi therion: Working directory bg: Работна Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ cz: Pracovní adresář de: Arbeitsverzeichnis el: Φάκελος εÏγασίας en: Working directory es: Directorio actual it: Cartella di lavoro ru: Рабочий каталог sk: Pracovný adresár sq: direktorati i punes therion: Working directory path. bg: Път към работната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ cz: Cesta k pracovnímu adresáři. de: Pfad zum Arbeitsverzeichnis. el: Φάκελος εÏγασίας en: Shows working directory path. es: Muestra el directorio actual. it: Path della cartella di lavoro ru: Путь к рабочему каталогу. sk: Cesta k pracovnému adresáru. sq: tregon shtegun e direktoratit punues therion: Configuration file bg: Конфигурационен файл cz: KonfiguraÄní soubor de: Konfigurationsdatei el: ΑÏχείο ÏƒÏ‡Î·Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï (config) en: Configuration file es: Archivo configuración it: File di configurazione ru: Конфигурационный файл sk: KonfiguraÄný súbor sq: arkivi I konfiguracionit therion: Configuration file name. bg: Име на конфигурационниÑÑ‚ файл cz: Jméno konfiguraÄního souboru. de: Name der Konfigurationsdatei. el: Εμφανίζει το όνομα του αÏχείου ÏƒÏ‡Î·Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï (config) en: Shows configuration file name. es: Muestra el nombre del archivo de configuración. it: Nome del file di configurazione ru: Ð˜Ð¼Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð³Ð¾ файла. sk: Meno konfiguraÄného súboru. sq: tregon emrin e arkivit te konfiguracionit therion: Command line options bg: Опции на командниÑÑ‚ ред cz: Argumenty programu de: Kommandozeilenoptionen el: Επιλογές γÏαμμής εντολής en: Command line options es: Opciones de línea de comandos it: Opzioni del comando ru: Опции командной Ñтроки sk: Argumenty programu sq: opcionet e vijes komanduese therion: Therion command line options. bg: Опции на командниÑÑ‚ ред на Терион cz: Argumenty therionu pro příkazovou řádku. de: Therion Kommandozeilenoptionen. el: Εδώ μποÏείτε να πεÏάσετε τις επιλογές γÏαμμής εντολής στο Therion en: Here you can pass command line options to Therion. es: Aquí se pueden pasar a therion opciones de línea de comandos it: Opzioni del comando therion ru: Опции командной Ñтроки Therion. sk: Argumenty programu v príkazovom riadku. sq: ketu ju mund te bartni vijen komanduese te arkivit tek Therion-i therion: Run therion. bg: ПуÑкане на therion cz: Spustí therion. de: Therion ausführen. el: Εκτέλεση του Therion en: Run therion. es: Ejecutar therion. it: Esegui therion ru: ЗапуÑк therion. sk: SpustiÅ¥ therion. sq: aktivizo Therion-in therion: Xpdf bg: Xpdf cz: Xpdf de: Xpdf it: Xpdf sk: Xpdf sq: Xpdf therion: Acrobat Reader bg: Acrobat Reader cz: Acrobat Reader de: Acrobat Reader it: Acrobat Reader sk: Acrobat Reader sq: lexuesi I programit-Akrobat therion: PDF file path. bg: Път към PDF файл cz: Cesta k PDF souboru de: Pfad zur PDF-Datei. el: υποφάκελος του .pdf it: File PDF ru: PDF-файл Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра sk: Cesta k PDF súboru. sq: arkivi-PDF therion: Survey informations. bg: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° картировката cz: Informace o jednotlivých měřeních (survey). de: Infos zur Vermessung. el: Στοιχεία χαÏτογÏάφησης en: Survey informations. es: Estadísticas de la poligonal. it: Informazioni del rilievo ru: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñъемке. sk: Informácie o Äastiach. sq: informatat e matjeve therion: User interface is not active. To activate it, open existing file or create new one. bg: ПотребителÑкиÑÑ‚ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ðµ неактивен. За да го активирате отворете ÑъщеÑтвуващ файл или Ñъздайте нов. cz: Uživatelské rozhraní není aktivní. Pro jeho aktivaci otevÅ™ete existující soubor nebo vytvoÅ™te nový. de: Fenster nicht aktiv. Um es zu benutzen, öffne eine existierende Datei oder lege eine neue an. el: ΔιασÏνδεση χÏήστη ανενεÏγή. Για να ενεÏγοποιηθεί, ανοίξτε υπάÏχον αÏχείο ή δημιουÏγήστε νέο. en: User interface is not active. To activate it, open existing file or create new one. es: El interfaz está inactivo. Para activarlo, abre un archivo existente o crea uno nuevo. it: L'interfaccia utente non è attiva. Per attivarla apri un file o creane uno ru: Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²ÐµÐ½. Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ откройте ÑущеÑтвующий файл или Ñоздайте новый. sk: XTherion momentálne nie je aktívny. Otvorte existujúci konfiguraÄný súbor alebo vytvorte nový. sq: interfejsi I perdoruesit nuk eshte aktiv. Ta aktivizosh, hape arkivin egzistues apo hape nje te ri. therion: loading compiler... bg: Зареждане на компилатора... cz: nahrávám kompilátor... de: Lade Compiler... el: φόÏτιση συντάκτη... en: loading compiler... es: compilador... it: compilatore ... ru: загрузка компилÑтора... sk: kompilátor... sq: duke lexuar kompiluesin… therion: Running therion ... bg: Стартиране на therion ... cz: Probíhá kompilace ... de: Therion ausführen ... el: Εκτελείται το Therion en: Running therion ... es: Ejecutando therion ... it: esecuzione therion ... ru: ЗапуÑк therion ... sk: Prebieha výpoÄet... sq: duke ve ne pune therion-in… therion: RUNNING bg: Обработка cz: PRACUJI de: ARBEITE el: ΕΚΤΕΛΕΣΗ en: RUNNING es: EJECUTANDO it: ESECUZIONE ru: ОБРÐБОТКРsk: VÃPOÄŒET sq: ne punim e siper therion: ERROR bg: Грешка cz: CHYBA de: FEHLER el: ΣΦΑΛΜΑ en: ERROR es: ERROR it: ERRORE ru: ОШИБКРsk: CHYBA sq: gabim therion: WARNING bg: Внимание! de: WARNUNG therion: OK bg: ОК cz: OK de: OK el: ΟΚ en: OK es: OK it: OK ru: УСПЕХ sk: OK sq: ne rregull-O.K. therion: Reading therion log file ... bg: Четене на лог-файла на therion ... cz: NaÄítám LOG soubor therionu ... de: Lese Therion Logdatei ... el: Ανάγνωση του αÏχείου log therion en: Reading therion log file ... es: Leyendo archivo log ... it: Lettura file di log di therion ... ru: Чтение лог-файла therion... sk: NaÄitávam LOG súbor. sq: duke lexuar arkivin hyres te Therion-it therion: \nerror opening therion.log file\n bg: \nгрешка при отварÑнето на файла therion.log\n cz: \nchyba pÅ™i otevírání souboru therion.log\n de: \nFehler beim Öffnen von therion.log\n el: \nσφάλμα κατα το άνοιγμα του αÏχείου therion.log\n en: \nerror opening therion.log file\n es: \nerror abriendo el archivo therion.log\n it: \nerrore in apertura del file therion.log ru: \nошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° therion.log\n sk: \nchyba pri Äítaní súboru therion.log\n sq: gabim gjate hapjes se Therion-it.arkivin hyres/n therion: Show or hide this control panel bg: Показване/Ñкриване на контролниÑÑ‚ панел cz: Zobrazit/skrýt ovládací panel de: Dieses Panel anzeigen oder verbergen el: Κάντε κλικ για εμφάνιση ή μη-εμφάνιση του πίνακα ελέγχου en: Click to show or hide this control panel. es: Clicar para mostrar u ocultar este panel de control it: Visualizza o nascondi questo pannello ru: Показать или ÑпрÑтать панель sk: StlaÄte ak chcete zobraziÅ¥ alebo skryÅ¥ tento panel sq: kliko te hapesh ose te mbyllesh kete panel te kontrollit therion: loading map editor ... bg: Зареждане на редактора на карти ... cz: nahrávám mapový editor... de: Lade Karteneditor ... el: φόÏτιση του επεξεÏγαστή αποτÏπωσης... en: loading map editor ... es: editor de mapas... it: editor di mappa ... ru: загрузка редактора карт... sk: Mapový editor sq: duke lexuar permiresuesin e hartave… therion: Undo %s bg: ОтмÑна cz: ZpÄ›t - %s de: Rückgängig %s el: ΑναίÏεση %s en: Undo %s es: Deshacer %s it: Indietro %s ru: Отменить %s sk: Späť - %s sq: prishe %s therion: Redo %s bg: ВъзÑтановÑване cz: Znovu - %s de: Wiederholen %s el: Επανάληψη %s en: Redo %s es: Rehacer %s it: Rifai %s ru: Вернуть %s sk: OpakovaÅ¥- %s sq: beje perseri %s therion: %s \[%s\] -- multiple encoding commands in file bg: %s \[%s\] -- нÑколко команди encoding във файла cz: %s \[%s\] -- vícenásobný výskyt příkazu encoding v jednom souboru el: %s \[%s\] -- πολλαπλές εντολές κωδικοποίησης στο αÏχείο en: %s \[%s\] -- multiple encoding commands in file es: %s \[%s\] -- múltiples comandos de codificación en el archivo it: %s \[%s\] -- encoding ripetuto nel file di comandi ru: %s \[%s\] -- неÑколько команд encoding в файле sk: %s \[%s\] -- viac encoding príkazov v jednom súbore sq: %s \[%s\] –shumezo komandat te deshifrimit ne arkiv therion: %s \[%s\] -- unknown encoding -- %s bg: %s \[%s\] -- неизвеÑтна кодировка -- %s cz: %s \[%s\] -- neznámé kódování znaků -- %s el: %s \[%s\] -- άγνωστη κωδικοποίηση -- %s en: %s \[%s\] -- unknown encoding -- %s es: %s \[%s\] -- codificación desconocida -- %s it: %s \[%s\] -- encoding non conosciuto -- %s ru: %s \[%s\] -- неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° -- %s sk: %s \[%s\] -- neznáme kódovanie znakov -- %s sq: %s \[%s\] – deshifrim I panjohur -- %s therion: adjusting area bg: регулиране на облаÑтта cz: pÅ™izpůsobení pracovní plochy de: Fläche anpassen el: Ï€ÏοσαÏμογή επιφάνειας en: adjusting area es: ajustando área it: aggiustamento area ru: регулирование облаÑти sk: prispôsobenie pracovnej plochy therion: zooming bg: мащабиране cz: zoomování de: Zoomen el: μεγέθυνση en: zooming es: zooming it: zooming ru: маÑштабирование sk: zoomovanie sq: zmadhimi therion: Zoom %d %% bg: мащаб %d %% cz: Zoom %d %% de: Zoom %d %% el: Μεγέθυνση %d %% en: Zoom %d %% es: Zoom %d %% it: Zomm %d %% ru: МаÑштаб %d %% sk: Zoom %d %% sq: zmadho %d %% therion: Zooming objects ... bg: Мащабиране на обекти ... cz: Zoomování objektů ... de: Zoome Objekte ... el: Μεγέθυνση αντικειμένων... en: Zooming objects ... es: Zoom sobre objetos ... it: Zoom degli oggetti ... ru: МаÑштабирование объектов... sk: Zoomovanie objektov ... sq: objektet e zmadhimit… therion: dragging image bg: Плъзгане на изображение cz: pÅ™esouvání obrázku de: Bild verschieben el: μετακίνηση εικόνας en: dragging image es: arrastrando imagen it: trascinamento immagine ru: перетаÑкивание Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: Presúvanie obrázku sq: imazhi per tu vizatuar therion: Map Editor bg: Редактор на карти cz: Mapový editor de: Karteneditor el: ΕπεξεÏγαστής αποτÏπωσης en: Map Editor es: Editor de mapas it: Editor di mappa ru: Редактор карт sk: Mapový Editor sq: permiresuesi I hartave therion: File commands bg: Команди във файл cz: Příkazy de: Dateibefehle el: Αντικείμενα en: Objects es: Objetos it: Oggetti ru: Команды в файле sk: Príkazy v súbore sq: objektet therion: Search & Select bg: ТърÑене и избиране cz: Najít & Vybrat de: Suchen & auswählen el: Αναζήτηση και επιλογή en: Search & Select es: Buscar y Seleccionar it: Cerca e seleziona ru: ПоиÑк и Выделение sk: Hľadaj a Vyber sq: kerko dhe zgjidh therion: Command preview bg: Преглед на команда cz: Náhled příkazu de: Kommandovorschau el: ΠÏοεπισκόπηση εντολής en: Command preview es: Ver comandos it: Anteprima comando ru: ПроÑмотр команды sk: Náhľad príkazu sq: komanda e parashiqimit therion: Point control bg: Точка cz: Bod de: Punkte bearbeiten el: Σημεία en: Points es: Puntos it: Punti ru: Точка sk: Bod sq: pikat therion: Line control bg: Ð›Ð¸Ð½Ð¸Ñ cz: KÅ™ivka de: Linien bearbeiten el: ΓÏαμμές en: Lines es: Líneas it: Linee ru: Ð›Ð¸Ð½Ð¸Ñ sk: Krivka sq: rjeshtat therion: Line point control bg: Точка на Ð»Ð¸Ð½Ð¸Ñ cz: Bod kÅ™ivky de: Linienpunkte bearbeiten el: Σημεία γÏαμμών en: Line points es: Puntos de línea it: Punti della linea ru: Точка линии sk: Bod krivky sq: pikat e rjeshtit therion: Area control bg: ОблаÑÑ‚ cz: Oblast de: Flächen bearbeiten el: Επιφάνειες en: Areas es: Areas it: Aree ru: ОблаÑть sk: Plocha sq: fushat therion: Scrap control bg: Скрап cz: Scrap de: Skizze bearbeiten el: ΣκÏαπ en: Scraps es: Croquis it: Scrap ru: Скрап sk: Scrap sq: mbeturinat therion: Text editor bg: ТекÑтов редактор cz: Textový editor de: Texteditor el: ΕπεξεÏγαστής κειμένου en: Text editor es: Editor de texto it: Editor di testo ru: Редактор sk: Textový editor sq: permirsuesi I tekstit therion: Drawing area bg: Зона на чертане cz: Kreslící plocha de: Zeichenfläche el: Επιφάνεια ÏƒÏ‡ÎµÎ´Î¹Î±ÏƒÎ¼Î¿Ï en: Drawing area es: Area de dibujo it: Area di disegno ru: Зона риÑÐ¾Ð²Ð°Ð½Ð¸Ñ sk: Pracovná plocha sq: fusha e vizatimit therion: Background images bg: Фоново изображение cz: Podkladové obrázky de: Hintergrundbilder el: Εικόνες φόντου en: Background images es: Imágenes de fondo it: Immagini di background ru: Фоновые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: Obrázky pozadia sq: imazhet ne prapavije therion: Current drawing area. bg: Текуща зона на чертане cz: SouÄasná kreslící plocha. de: Aktuelle Zeichenfläche el: ΕνεÏγή επιφάνεια ÏƒÏ‡ÎµÎ´Î¹Î±ÏƒÎ¼Î¿Ï en: Current drawing area. es: Area de dibujo actual. it: Area di disegno attiva ru: Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð·Ð¾Ð½Ð° риÑованиÑ. sk: SúÄasná pracovná plocha. sq: fusha momentale e vizatimit therion: X min. bg: X min. cz: X min. el: Ελάχιστο Χ en: X min. es: X min it: Minimo X ru: X min. sk: Minimum X. sq: minimum X. therion: Y min. bg: Y min. cz: Y min. el: Ελάχιστο Î¥ en: Y min. es: Y min it: Minimo Y ru: Y min. sk: Minimum Y. sq: minimum Y. therion: X max. bg: X max. cz: X max. el: Μέγιστο Χ en: X max. es: X max it: Massimo X ru: X max. sk: Maximum X. sq: maksimum X. therion: Y max. bg: Y max. cz: Y max. el: Μέγιστο Î¥ en: Y max. es: Y max it: Massimo Y ru: Y max. sk: Maximum Y. sq: maksimum Y. therion: Adjust bg: Определи cz: PÅ™izpůsobit de: Anpassen el: ΠÏοσαÏμογή en: Adjust es: Ajustar it: Ridimensiona ru: УÑтановить sk: Prispôsob sq: permireso therion: Adjust drawing area to given limits. bg: Определи зоната за чертане в зададените граници cz: PÅ™izpůsobí kreslící plochu daným limitům. de: Zeichenfläche an Begrenzung anpassen. el: ΠÏοσαÏμογή επιφάνειας σχεδίου στα δεδομένα ÏŒÏια en: Adjust drawing area to given limits. es: Ajustar el área de dibujo a los límites indicados. it: Ridimensiona l'area di disegno ai limiti dati ru: УÑтановить зону риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² заданных границах. sk: PrispôsobiÅ¥ pracovnú plochu daným limitom. sq: permireso fushen e vizatimit deri ne kufijt e dhene. therion: Auto adjust bg: Ðвтоматично определÑне cz: Auto pÅ™izpůs. de: Automatisch anpassen el: Αυτόματη Ï€ÏοσαÏμογή en: Auto adjust es: Autoajustar it: Auto-ridimensiona ru: Ðвто sk: Automaticky sq: permiresimi automatik therion: Adjust drawing area to automatically calculated limits. bg: Определи автоматично зоната за чертане cz: Automaticky pÅ™izpůsobí kreslící plochu vÅ¡em objektům. de: Zeichenfläche an berechnete Begrenzung anpassen. el: ΠÏοσαÏμογή επιφάνειας σχεδίου στα ÏŒÏια που αυτομάτως οÏίστηκαν en: Adjust drawing area to automatically calculated limits. es: Ajustar área de dibujo automáticamente. it: Ridimensiona l'area di disegno ai limiti calcolati ru: ÐвтоматичеÑки уÑтановить зону риÑованиÑ. sk: Automaticky prispôsobiÅ¥ pracovnú plochu vÅ¡etkým objektom. sq: permireso fushen e vizatimit ne kufirin e llogaritur automatikisht. therion: zoom bg: мащаб cz: zoom de: Zoom el: μεγέθυνση en: zoom es: zoom it: zoom ru: маÑштаб sk: zoom sq: zmadho therion: Zoom drawing area. bg: Мащабиране на зоната за чертане cz: Zoom kreslící plochy. de: Zeichenfläche zoomen. el: Έλεγχος μεγέθυνσης. Κάντε κλικ στον οÏθογώνιο για να δείτε το μενοÏ. en: Zoom control. Click on rectangle to see menu. es: Control del zoom. Clic en rectángulo para ver menú. it: Zoom area di disegno ru: МаÑштабировать зону риÑованиÑ. sk: Zoom pracovnej plochy. sq: kontrolli I zmadhimit. Kliko ne gjashtekendesh te shohesh menyn therion: loading commands module ... bg: зареждане на модула за команди cz: nahrávám příkazový modul ... de: Lade Befehlsmodul ... el: φόÏτιση ενότητα εντολών... en: loading commands module ... es: comandos ... it: modulo comandi ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´... sk: príkazový modul... sq: duke lexuar modulin komandues… therion: Select command. bg: Изберете команда cz: VýbÄ›r příkazu. de: Wähle Befehl. el: Κάντε κλικ σε μια γÏαμμή για να συλλέξετε το αντικείμενο στον καμβά και το αντίθετο. en: Click a line to get corresponding object selected on canvas or vice versa. es: Al clicar una de las líneas, se resaltará en la topo el objeto correspondiente, y viceversa. it: Seleziona comando. ru: Выберите команду. sk: Vyber príkaz. sq: kliko ne resht qe te fitosh objektin e deshiruar I zgjedhur ne pelhure ose anasjelltas. therion: Action button. bg: ДейÑтвие cz: TlaÄítko Akce. de: Aktionsknopf. el: Πατώντας εδώ μποÏείτε να εισάγετε αντικείμενα με το ποντίκι. Πατήστε την εντολή να δείτε το μενοÏ. en: After clicking this button, you can insert objects by mouse. Click on action to see menu. es: Tras pulsar este botón, se pueden insertar con el ratón puntos, lineas, etc. Clic en acción para ver menú. it: Bottone di azione. ru: ДейÑтвиÑ. sk: Gombík - akcia. sq: pasi te klikoni kete buton, ju mund te futni objekte me mi. kliko ne aksion qe te shohesh menyn. therion: Switch mouse mode to select objects. bg: Преминете на мишка за да избирате обекти cz: PÅ™epnutí myÅ¡i do výbÄ›rového módu. de: Maus umschalten um Objekte auszuwählen. el: Î‘Ï†Î¿Ï Ï€Î±Ï„Î®ÏƒÏ„Îµ εδώ μποÏείτε να συλλέξετε αντικείμενα στον καμβά με το ποντίκι. en: After clicking this button, you can select objects on canvas by mouse. es: Tras clicar aquí, podrás seleccionar cosas en la topo con el ratón. it: Cambia la modalità del mouse per selezionare oggetti. ru: ПереключитеÑÑŒ на мышь, чтобы выбирать объекты. sk: Nastav mód myÅ¡i na vyberanie objektov. sq: pasi te klikosh kete buton, ju mund te zgjedhni objektet ne pelhure me mi. therion: Action bg: ДейÑтвие cz: Akce de: Aktion el: Εντολή en: Action es: Acción it: Azione ru: ДейÑтвие sk: Akcia sq: aksion therion: Configure action assigned to action button. bg: ДейÑтвието, което изберете, ще бъде изпълнене, кликайки в/у бутона 'Вмъкни <обект>' cz: Nastaví akci pro tlaÄítko akcí. de: Dem Aktionsknopf zugewiesene Aktion konfigurieren. el: ΟÏισμός εντολής που θα εκτελείται κάνοντας κλικ στο κουμπί Εισαγωγή <αντικείμενο> en: Action you choose will be executed by clicking on Insert button. es: Clic para ver menú. La acción que escojas será la que ejecute el botón Insertar it: Configura l'azione assegnata al bottone d'azione. ru: Выберите дейÑтвие, назначенное Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸. sk: Nakonfiguruj akciu pre gombík - akcia. sq: aksionin qe e zgjedhni do te egzekutohet me klikimin ne butonin Fute therion: Move up bg: Ðагоре cz: PÅ™esun výš de: Schiebe nach oben el: Μετακίνηση Ï€Ïος τα πάνω en: Move up es: Arriba it: Sposta sù ru: Вверх sk: Presuň vyššie sq: levize lart therion: Move file command up in the list. bg: ПремеÑти нагоре в ÑпиÑъка файла Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ cz: PÅ™esune příkaz výš v seznamu příkazů. de: In der Liste nach oben schieben. el: Μετακίνηση αντικειμένου ψηλότεÏα στην λίστα. ΧÏήσιμο σε πεÏίπτωση που είναι σε λάθος σκÏάπ το αντικείμενο. en: Move object up in the list. Use if object is in wrong scrap. es: Desplaza el objeto hacia arriba en la lista. Usar si el objeto está en lugar erróneo. it: Sposta il comando in sù nella lista. ru: ПеремеÑтить команду вверх по файлу. sk: Presuň príkaz vyššie v zozname príkazov. sq: levize objektin lart ne liste. Perdor nese objekti eshte ne deponi te gabuar. therion: Move down bg: Ðадолу cz: PÅ™esun níž de: Schiebe nach unten el: Μετακίνηση Ï€Ïος τα κάτω en: Move down es: Abajo it: Sposta giù ru: Вниз sk: Presuň nižšie sq: levize poshte therion: Move file command down in the list. bg: ПремеÑти надолу в ÑпиÑъка файла Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ cz: PÅ™esune příkaz níž v seznamu příkazů. de: In der Liste nach unten schieben. el: Μετακίνηση αντικειμένου χαμηλότεÏα στην λίστα. ΧÏήσιμο σε πεÏίπτωση που είναι σε λάθος σκÏάπ το αντικείμενο. en: Move object down in the list. Use if object is in wrong scrap. es: Desplaza el objeto hacia abajo en la lista. Usar si el objeto está en lugar erróneo. it: Sposta il comando in giù nella lista. ru: ПеремеÑтить команду вниз по файлу. sk: Presuň príkaz nižšie v zozname príkazov. sq: levize objektin poshte ne liste. Perdore nese objekti eshte ne deponi te gabuar. therion: Move file command to given position. bg: ПремеÑти файла Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ на указаната Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ cz: PÅ™esunout příkaz na danou pozici v seznamu. de: Befehl an angegebene Position schieben. el: Μετακίνηση αντικειμένου σε συγκεκÏιμένη θέση (θέση = αÏιθμός σε κάθε σειÏά). en: Move object to given position (position = number on each line). es: Mover el objeto a la posición indicada (número al principio de cada línea). it: Sposta il comando nella posizione specificata. ru: ПеремеÑтить команду в указанную позицию в файле. sk: Presuň príkaz na danú pozíciu v zozname. sq: levize objektin ne pozicion te dhanun( pozicioni = numri ne secilen rjesht). therion: Select destination scrap and position in it. bg: Изберете меÑтоназначението на Ñкрап и позициÑта в него cz: VýbÄ›r cílového scrapu a pozice v nÄ›m. de: Zielskizze auswählen und positionieren. el: Επιλέξετε το σκÏαπ Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ±Î¹ την θέση μέσα σε αυτό. en: Select destination scrap and position in it. es: Seleccionar croquis de destino y la posición en él. it: Selezione lo scrap di destinazione e posizionati in esso. ru: Укажите целевой Ñкрап и позицию в нем. sk: Nastav cieľový scrap a pozíciu v ňom. sq: zgjedhe destinacionin per deponi dhe poziciono ne te. therion: Update text bg: Обнови текÑта cz: Aktualizovat de: Text aktualisieren el: Ανανέωση κειμένου en: Update text es: Actualizar texto it: Aggiorna testo ru: Сохранить текÑÑ‚ sk: Aktualizuj text sq: aktualizo tekstin therion: Press this button to save code you have written. bg: ÐатиÑнете този бутон за да запазите напиÑаниÑÑ‚ код cz: StisknÄ›te toto tlaÄítko pro uložení Vámi zapsaného kódu. de: Diesen Knopf drücken, um Daten zu speichern. el: Πατήστε το κουμπί να αποθηκευτεί ο κώδικας που γÏάψατε en: Press this button to save code you have written. es: Clicar aquí para guardar los cambios hechos en el código. it: Premi questo bottone per salvare il codice che hai scritto. ru: Ðажмите Ñту кнопку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ð¿Ð¸Ñанного кода. sk: StlaÄte toto tlaÄítko pre uloženie Vami zapísaného kódu. sq: shtype kete buton ta ruajsh kodin te cilin e ke shkru. therion: Editor for free text in therion 2D file. bg: Редактор за произволен текÑÑ‚ в 2D файла cz: Editor pro text ve 2D souborech. de: Editor für Freitext in Therion 2D Datei. el: ΧÏησιμοποιείτε τον επεξεÏγαστή αυτό για επεξεÏγασία αÏχείων .th2 en: Use this editor window to modify .th2 files. es: Usa este editor para modificar los archivos .th2. Otros editores darán problemas. it: Editor di testo libero per il file 2D di therion. ru: Редактор произвольного текÑта в 2D файле. sk: Editor pre Å¡peciálne príkazy v 2D súboroch. sq: perdore kete dritare per permiresim qe te modofikosh. Th2 arkivin. therion: expression bg: израз cz: výraz de: Muster el: αναζήτηση για en: search for es: buscar it: testo ru: выражение sk: výraz sq: kerko per therion: Enter search expression. bg: Въведете дума/и за търÑене cz: Vložte hledaný výraz. de: Suchmuster eingeben. el: Εισαγωγή λέξεις για αναζήτηση en: Enter word(s) to search for. es: Introducir palabra(s) a buscar. it: Scrivi il testo da cercare. ru: Введите выражение поиÑка. sk: Vložte hľadaný výraz. sq: fute fjalin qe do ta kerkosh. therion: regular expression bg: регулÑрен израз cz: regulární výraz de: Regulärer Ausdruck el: ΧÏήση Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï en: regular expression es: patrón regular (kob.*) it: espressione regolare ru: регулÑрное выражение sk: regulárny výraz sq: shprehje e rregullt therion: Search for regular expression. bg: ТърÑене по регулÑрен израз cz: Vyhledávání regulárního výrazu. de: Suche nach regulärem Ausdruck. el: ΧÏήση Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï ÏƒÏ„Î·Î½ αναζήτηση (σπή.* θα βÏει σπήλαιο, σπήλαια, σπήκεÏ) en: Use wildcards on search (cav.* will find cave, cavern, cavalier...) es: Usar comodines en la búsqueda (kob.* encuentra koba, kobea, kobie, etc). it: Cerca espressione regolare. ru: ИÑкать по регулÑрному выражению. sk: Vyhľadávanie regulárneho výrazu. sq: kerko per shprehje te rregullt. therion: case sensitive bg: отчита Ñе региÑтъра cz: rozliÅ¡ovat velikost písmen de: Groß- und Kleinschreibung berücksichtigen el: case sensitive en: case sensitive es: distinguir mayúsculas it: case-sensitive ru: учитывать региÑтр sk: rozliÅ¡ovaÅ¥ veľkosÅ¥ sq: rast I ndjeshem-senzitiv therion: Case sensitive search. bg: ТърÑене Ñ Ð¾Ñ‚Ñ‡Ð¸Ñ‚Ð°Ð½Ðµ на региÑтъра cz: Vyhledávání s rozliÅ¡ením velikosti písmen. de: Suche mit Groß- und Kleinbuchstaben. el: Αναζήτηση case sensitive en: Case sensitive search. es: Búsqueda sensible a las mayúsculas. it: Ricerca case-sensistive ru: ПоиÑк Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра. sk: Vyhľadávanie s rozliÅ¡ovaním veľkých a malých písmen. sq: kerko rast senzitiv therion: Find next bg: Ñледващ cz: Najít další de: Nächste Stelle finden el: ΕÏÏεση επομένου en: Find next es: Siguiente it: Prossimo ru: Следующий sk: Nasledujúci sq: gjeje tjetren me radhe therion: Select next object matching expression. bg: Избери ÑледващиÑÑ‚ обект на търÑенето cz: Vybere další objekt odpovídající výrazu. de: Nächstes Objekt auswählen, das auf Muster passt. el: Επιλογή επόμενου αντικείμενου που ταιÏιάζει στην αναζήτηση en: Select next object matching expression. es: Selecionar siguiente objeto encontrado. it: Seleziona il prossimo oggetto trovato ru: Выбрать Ñледующий объект, ÑоответÑтвующий выражению поиÑка. sk: Nájdi Äalší objekt zodpovedajúci hľadanému výrazu. sq: zgjedhe objektin tjeter me radhe te shprehjes qe pershtatet therion: Find first bg: Ðамвери първиÑÑ‚ cz: Najít první de: Finde erstes el: ΕÏÏεση Ï€Ïώτου en: Search es: Buscar it: Cerca ru: Первый sk: Nájdi prvý sq: kerko te parin therion: Select first object matching expression. bg: Избери първиÑÑ‚ обект на търÑенето cz: Vybere první objekt odpovídající výrazu. de: Erstes Objekt finden, das auf Muster passt. el: Επιλογή Ï€Ïώτου αντικείμενου που ταιÏιάζει στην αναζήτηση en: Selects first object matching expression. es: Selecionar el primer objeto encontrado. it: Seleziona il primo oggetto trovato ru: Выбрать первый объект, ÑоответÑтвующий выражению поиÑка. sk: Nájdi prvý objekt zodpovedajúci hľadanému výrazu. sq: zgjedh objektin e pare te shprehjes qe pershtatet therion: Show all bg: Покажи вÑичко cz: Zobrazit vÅ¡e de: Zeige alles el: Εμφάνιση όλων en: Show all es: Mostrar todo it: Tutti ru: Показать вÑе sk: OznaÄ vÅ¡etky sq: tregoji te gjitha therion: Highlight all objects matching expression. bg: ОÑвети вÑички обекти, ÑъответÑтващи на търÑенето cz: Zvýrazní vÅ¡echny objekty odpovídající výrazu. de: Alle Objekte hervorheben, die auf Muster passen. el: Τόνωση όλων όσων ταιÏιάζουν στην αναζήτηση. en: Highlight all objects matching expression. es: Seleccionar todos los objetos encontrados. it: Evidenzia tutti gli oggetti trovati ru: ПодÑветить вÑе объекты, ÑоответÑтвующие выражению поиÑка. sk: Zvýrazní vÅ¡etky objekty zodpovedajúce hľadanému výrazu. sq: zghedh te gjitha objektet qe pershtaten me shprehjen therion: Clear all bg: ИзчиÑти вÑичко cz: ZruÅ¡ výbÄ›r de: Alles löschen el: ΑναίÏεση όλων en: Clear all es: Deseleccionar it: Cancella ru: ОчиÑтить вÑе sk: ZruÅ¡ výber sq: fshij krejt therion: Clear highlighted objects. bg: ИзчеÑти оÑветÑването на вÑички обекти cz: Zruší zvýraznÄ›ní vybraných objektů. de: Hervorgehobene Objekte löschen. el: ΑναίÏεση των τονισθέντων en: Clear highlighted objects. es: Deseleccionar todos los objetos resaltados. it: Togli l'evidenziazione degli oggetti. ru: СнÑть подÑветку Ñо вÑех объектов. sk: Zruší zvýraznenie vybratých objektov. sq: fshij objektet e zgjedhura-te hijezuara therion: loading images module ... bg: зареждане на модула за Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ cz: nahrávám obrázkový modul ... de: Lade Bildmodul ... el: φοÏτίζεται η ενότητα εικόνων... en: loading images module ... es: imágenes ... it: modulo immagini ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹... sk: nahrávam obrázkový modul... sq: duke lexuar modulin e imazhit… therion: Select background image. bg: Избери фоново изображение cz: VýbÄ›r podkladového obrázku. de: Wähle Hintergrundbild. el: Κάντε κλικ στον κατάλογο να επιλέξετε την εικόνα που αντιστοιχεί. en: Click on a line in the list to select correspondin image. es: Al clicar un renglón, seleccionarás la imagen de fondo correspondiente. it: Seleziona l'immagine di background. ru: Выбор фонового изображениÑ. sk: OznaÄ obrázok na pozadí. sq: kliko rreshtin ne liste qe te zgjedhesh imazhin qe pershtatet. therion: Insert new background image. bg: Вмъкни ново фоново изображение cz: Vložení nového podkladového obrázku. de: Neues Hintergrundbild einfügen. el: Εισαγωγή νέας εικόνας φόντου (Ï€.χ. αÏχείο .xvi ή ψηφιακό σχέδιο) en: Insert new background image (e.g., .xvi image or scanned sketch). es: Insertar nueva imagen de fondo (p. ej: un croquis escaneado de la libreta topo). it: Inserisci una nuova immagine di background. ru: Ð’Ñтавить новое фоновое изображение. sk: Vloženie nového podkladového obrázku. sq: fute imazhin e ri ne prapavije (p.sh., . xvi imazhin apo vizatimin e skanuar). therion: Remove bg: Премахни cz: Odstranit de: Entferne el: ΔιαγÏαφή en: Remove es: Eliminar it: Rimuovi ru: Убрать sk: OdstrániÅ¥ sq: hiqe therion: Remove selected image. bg: Премахни избраното изображение cz: Odstraní vybraný obrázek. de: Entferne ausgewähltes Bild. el: ΔιαγÏαφή επιλεγμένης εικόνας en: Remove selected image. es: Eliminar imagen seleccionada. it: Rimuovi l'immagine selezionata. ru: Убрать вырбанное изображение. sk: Odstráni oznaÄený obrázok. sq: hiqe imazhin e zgjedhur. therion: visibility bg: Покажи cz: viditelnost de: Sichtbarkeit el: οÏατότητα en: visibility es: visibilidad it: visibilità ru: показать sk: viditeľnosÅ¥ sq: shiqueshmeria-vizibiliteti therion: Switch image visibility. bg: Покажи/Ñкрий изображение cz: PÅ™epíná viditelnost obrázku. de: Bildsichtbarkeit umschalten. el: Αλλαγή οÏατότητας εικόνας en: Switch image visibility. es: Cambiar visibilidad de la imagen. it: Cambia la visibilità dell'immagine. ru: Показать/ÑпрÑтать изображение. sk: PrepínaÄ viditeľnosti obrázku. sq: lesho shiqueshmerine-vizibilitetin e imazhit. therion: Control gamma value. bg: Управление на гамата cz: Nastavení hodnoty gamma. de: Gammawert einstellen. el: Ρυθμίσεις τιμών gamma. en: Control gamma value. es: Controlar el valor gamma. it: Controlla il valore di gamma. ru: Управление гаммой. sk: Nastavenie gamma korekcie obrázku (farebného podania). sq: kontrollo vleren-gamma therion: Reset bg: Възобнови cz: Reset de: Zurücksetzen el: ΕπαναφοÏά en: Reset es: Reajustar it: Ripristina ru: Ð¡Ð±Ñ€Ð¾Ñ sk: Reset sq: reseto therion: Reset image gamma value. bg: Възобнови наÑтойките на гамата cz: Resetuje nastavenou hodnotu gamma. de: Gammawert zurücksetzen. el: ΕπαναφοÏά τιμής gamma της εικόνας. en: Click here to go back to original gamma value. es: Click aquí para volver a los ajustes de gamma iniciales. it: Ripristina il valore di gamma dell'immagine. ru: СброÑить значение гаммы Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. sk: Resetuje nastavenú gamma korekciu obrázku. sq: kliko ketu qe te kthehesh prapa tek vlera origjinale-gamma. therion: Set image gamma value. bg: Определи гамата на изображението cz: Nastavuje hodnotu gamma obrázku. de: Setze Gammawert. el: ΟÏισμός τιμής gamma της εικόνας. en: Set image gamma value. es: Ajustar valor gamma de la imagen. it: Imposta il valore di gamma dell'immagine. ru: УÑтановить гамму Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. sk: Nastavuje gamma korekciu obrázku. sq: vendos vleren gamma te imazhit. therion: Current position of selected image. bg: Текуща Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° избраното изображение cz: SouÄasná pozice vybraného obrázku. de: Gegenwärtige Position des ausgewählten Bildes. el: ΤÏέχουσα θέση επιλεγμένης εικόνας en: Current position of selected image (pixels from canvas lower letf corner). es: Posición actual de la imagen seleccionada (medida en pixels desde la esquina inf. izq del lienzo). it: Posizione dell'immagine selezionata. ru: Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ изображениÑ. sk: SúÄasná pozícia obrázku. sq: pozicioni momental I imazhit te zgjedhur(pikat apo pikselat prej pelhures kendi I poshtem I majte). therion: Move to bg: ПремеÑти cz: PÅ™esunout de: Verschiebe nach el: Μετακίνηση Ï€Ïος en: Move to es: Mover a it: Sposta a ru: ПеремеÑтить sk: Presuň na sq: levize tek therion: Move image to given position. bg: ПремеÑти изображението на указаната Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ cz: PÅ™esune obrázek na zadanou pozici. de: Verschiebe Bild an angegebene Position. el: Μετακίνηση εικόνας στην Ï€ÏοσδιοÏισμένη θέση (η πάνω αÏιστεÏά γωνία θα είναι στο δεδομένο πίξελ) en: Move image to given position (image's upper left corner will be on given pixel). es: Mover imagen a la posición indicada (la esquina sup. izda de la imagen aparecerá en ese pixel). it: Sposta l'immagine nella posizione specificata. ru: ПеремеÑтить изображение к указанной позиции. sk: Presunie obrázok na zadanú pozíciu. sq: levize imazhin ne poziten e dhene(kendi I eperm I majte I imazhit do te jete ne pikselin e japur). therion: New X coordinate of image. bg: Ðова Ð¥ координата на изображението cz: Nová souÅ™adnice X obrázku. de: Neue X-Koordinate des Bildes. el: Îέα συντεταγμένη Χ εικόνας en: New X coordinate of image. es: Nueva coordenada X de la imagen. it: Nuova coordinata X dell'immagine. ru: ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð° X. sk: Nová X súradnica obrázku. sq: X-koordinata e re e imazhit therion: New Y coordinate of image. bg: Ðова Y координата на изображението cz: Nová souÅ™adnice Y obrázku. de: Neue Y-Koordinate des Bildes. el: Îέα συντεταγμένη Î¥ εικόνας en: New Y coordinate of image. es: Nueva coordenada Y de la imagen. it: Nuova coordinata Y dell'immagine. ru: ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð° Y. sk: Nový Y súradnica obrázku. sq: koordinata Y e re e imazhit. therion: Move front bg: ПремеÑти отпред cz: DopÅ™edu de: Nach vorne verschieben el: Μετακίνηση Ï€Ïος τα μπÏος en: Move front es: Delante it: Davanti ru: Поверх вÑех sk: Navrch sq: levize perpara therion: Move image in front of all images. bg: ПремеÑти изображението пред вÑички оÑтанали. cz: PÅ™esune obrázek nad vÅ¡echny ostatní. de: Bild ganz nach vorne verschieben. el: Μετακίνηση εικόνας στην κοÏυφή en: Move image in front of all images. es: Trae la imagen al frente de todas las imágenes. it: Sposta l'immagine davanti a tutte le immagini. ru: ВывеÑти изображение поверх вÑех оÑтальных. sk: Presunie obrázok nad vÅ¡etky ostatné. sq: levize imazhin para te gjitha imazheve. therion: Move back bg: ПремеÑти назад cz: Dozadu de: Nach hinten verschieben el: Μετακίνηση Ï€Ïος τα πίσω en: Move back es: Detrás it: Dietro ru: Под вÑеми sk: Naspodok sq: levize prapa therion: Move image behind all images. bg: ПремеÑти изображението отзад оÑтаналите cz: PÅ™esune obrázek pod vÅ¡echny ostatní. de: Bild ganz nach hinten verschieben. el: Μετακίνηση της εικόνας στο φόντο en: Move image behind all images. es: Enviar la imagen detrás de todas las demás. it: Sposta l'immagine davanti a tutte le immagini. ru: ВывеÑти изображение за вÑеми оÑтальными. sk: Presunie obrázok pod vÅ¡etky ostatné. sq: levize imazhin prapa te gjitha imazheve. therion: loading preview module ... bg: зареждане на модула за предварителен преглед ... cz: nahrávám zobrazovací modul ... de: Lade Vorschaumodul ... el: ΦοÏτίζεται η ενότητα Ï€Ïοεπισκόπισης... en: loading preview module ... es: ver comandos ... it: modulo anteprima ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра... sk: nahrávam náhľadový modul ... sq: duke lexuar modulin e perkohshem… therion: Update command bg: Обнови командата cz: Aktualizovat de: Kommando aktualisieren el: Ανανέωση en: Update command es: Actualizar it: Aggiorna comando ru: Обновить команду sk: AktualizovaÅ¥ sq: urdheri-komanda e aktualizimit therion: Press this button, if you have changed something and you can not see your changes here. bg: ÐатиÑнете този бутон, ако Ñте направили промени и не ги виждате тук. cz: StisknÄ›te toto tlaÄítko, pokud jste nÄ›co zmÄ›nili a zmÄ›ny nejsou v tomto oknÄ› viditelné. de: Drücke diesen Knopf, falls du etwas geändert hast und die Änderungen nicht hier sehen kannst. el: Πατήστε εδώ αν αλλάξατε κάτι και δεν εμφανίζονται εδώ οι αλλαγές. en: Press this button, if you have changed something and you can not see your changes here. es: Clicar aquí si has cambiado algo y no ves aquí los resultados del cambio it: Premi questo bottone se hai fatto modifiche che non sono visualizzate. ru: Ðажмите Ñту кнопку, еÑли вы что-то изменили, но не увидели здеÑÑŒ Ñвоих изменений. sk: StlaÄte toto tlaÄítko, ak ste nieÄo zmenili a zmeny nie su v tomto okne viditeľné. sq: shtype kete buton, nese ke ndryshuar diqka te cilin ndryshim nuk mund ta shohesh ketu. therion: Command preview. bg: Преглед на командата. cz: Náhled příkazu. de: Kommando Vorschau. el: Εδώ βλέπετε ολοκληÏωμένες εντολές με εφαÏμογή επιλογών. en: Here you can see complete commands with options applied. es: Aquí se pueden ver los comandos completos, opciones incluídas. it: Anteprima comando. ru: ПроÑмотр команды. sk: Náhľad príkazu. sq: ketu mund te shohesh komandat komplete me opcionet e vendosura. therion: loading scrap module ... bg: Зареждане на Ñкрап модула ... cz: nahrávám scrap modul ... de: Lade Skizzenmodul ... el: φοÏτίζεται η ενότητα των σκÏαπ... en: loading scrap module ... es: croquis ... it: modulo scrap ... ru: загрузка Ñкрап-модулÑ... sk: nahrávam scrap modul ... sq: duke lexuar modulin e deponise… therion: Scrap name. bg: Име на Ñкрап. cz: Název scrapu. de: Skizzenname. el: Όνομα σκÏαπ en: Scrap name. es: Nombre del croquis. it: Nome dello scrap. ru: Ð˜Ð¼Ñ Ñкрапа. sk: Identifikátor (meno) scrapu. sq: emri I deponise. therion: projection bg: Ð¿Ñ€Ð¾ÐµÐºÑ†Ð¸Ñ cz: projekce de: Projektion el: Ï€Ïοβολή en: projection es: proyección it: proiezione ru: Ð¿Ñ€Ð¾ÐµÐºÑ†Ð¸Ñ sk: projekcia sq: projekcioni therion: Scrap projection. bg: ÐŸÑ€Ð¾ÐµÐºÑ†Ð¸Ñ Ð½Ð° Ñкрапа. cz: Projekce scrapu. de: Skizzenprojektion el: ΠÏοβολή σκÏαπ (κλικ στο Ï„Ïίγωνο για μενοÏ) en: Scrap projection (clic on triangle to see menu). es: Proyección del croquis (Clic en triángulo para ver el menú). it: Proiezione dello scrap. ru: ÐŸÑ€Ð¾ÐµÐºÑ†Ð¸Ñ Ñкрапа. sk: Projekcia scrapu. sq: projeksioni I deponise (kliko ne trekendesh te shohesh menyne). therion: Other scrap options. bg: Други опции на Ñкрапа. cz: Další volby pro scrap. de: Andere Skizzenoptionen. el: Άλλες επιλογές των σκÏαπ - βλέπετε το thbook.pdf en: Other scrap options (more on this on thbook.pdf) es: Otras opciones del croquis. Consultar thbook.pdf it: Altre opzioni dello scrap ru: Другие опции Ñкрапа. sk: Ostatné možnosti scrapu. sq: opcionet tjera te deponise (me shume per kete ne librin e therion-it.pdf) therion: Scale bg: Мащаб cz: Měřítko de: Maßstab el: Κλίμακας it: Scala ru: МаÑштаб sk: Mierka sq: matesi therion: Scrap scaling - push to click picture calibration points. bg: Мащабиране на Ñкрапа - натиÑнете този бутон и поÑтавете Ñ Ð¼Ð¸ÑˆÐºÐ°Ñ‚Ð° точка за мащабиране в/у Ñкрапа. cz: Å kálování scrapu - stiskni pro výbÄ›r kalibraÄních bodů obrázku. de: Skizze skalieren - drücken um Bildeinstellungspunkte zu klicken. el: ΚαλιπÏάÏισμα σκÏαπ - κάντε κλικ για να επιλέξετε τα σημεία για καλιμπÏάÏισμα. it: Rescalamento - premi per selezionare i punti di calibrazione. ru: МаÑштабирование Ñкрапа - нажимте Ñту кнопку и выÑтавите точки маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ñ‹ÑˆÑŒÑŽ sk: Å kálovanie scrapu - po stlaÄení klikni na Å¡kálovacie body. sq: matja e deponise-shtyp te klikosh pikat kalibruese te fotos. therion: Update scrap bg: Обнови Ñкрапа cz: Aktualizovat de: Skizze aktualisieren el: ΕνημέÏωση σκÏαπ en: Update scrap es: Actualizar it: Aggiorna scrap ru: Обновить Ñкрап sk: Aktualizuj scrap sq: aktualizo deponine therion: Press this button to apply your changes to current scrap. bg: ÐатиÑнете този бутон за да приложите промените в/у Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ñкрап. cz: StisknÄ›te toto tlaÄítko po uplatnÄ›ní zmÄ›n aktuálního scrapu. de: Drücke diesen Knopf, um deine Änderungen auf diese Skizze anzuwenden. el: Πατήστε εδώ για να γίνει εφαÏμογή των αλλαγών σας στο Ï„Ïέχον σκÏαπ. en: Press this button to apply your changes to current scrap. es: Clicar aquí tras modificar las propiedades del croquis. it: Premi questo bottone per applicare le tue modifiche allo scrap. ru: Ðажмите Ñту кнопку Ð´Ð»Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² дейÑтвие ваших изменений Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ñкрапа sk: StlaÄte tento gombík, aby sa vaÅ¡e zmeny v scrape uložili. sq: shtype kete buton qe te besh ndrimet ne deponine momentale. therion: picture scale points bg: мащабиращи точки за изображение cz: body měřítka (obrázek) de: Bildskalierungspunkte el: σημεία για καλιμπÏάÏισμα (πίξελ) en: picture scale points (pixels) es: puntos de escala (pixels) it: punti nella scala del disegno ru: маÑштабирующие точки Ð´Ð»Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¸ sk: kalibraÄné body (obrazovka) sq: pikat matese te fotos-pikselat therion: Calibration points on the picture (X1:Y1 - X2:Y2). bg: Калибриращи точки на изображение (X1:Y1 - X2:Y2) cz: KalibraÄní body na obrázku (X1:Y1 - X2:Y2). de: Kalibrierungspunkte auf dem Bild (X1:Y1 - X2:Y2). el: Σημεία καλιμπÏαÏίσματος στην εικόνα (Χ1:Î¥1 - Χ2:Î¥2). en: Calibration points on the picture (X1:Y1 - X2:Y2). es: Puntos de calibración en la imagen (X1:Y1 - X2:Y2). it: Punti di calibrazione sul disegno (X1:Y1 - X2:Y2). ru: Калибровочные точки на картинке (X1:Y1 - X2:Y2). sk: Súradnice kalibraÄných bodov na obrazovke (X1:Y1 - X2:Y2) sq: pikat e kalibrimit ne foto (X1:Y1 - X2:Y2) therion: X1 picture. bg: X1 на изображение cz: X1 obrázek. de: X1 Bild. el: Χ1 εικόνας en: X1 picture. es: Punto de escala X1 en la imagen. it: X1 del disegno. ru: X1 картинки. sk: X1 na obrázku. sq: x1 fotoja therion: Y1 picture. bg: Y1 на изображение cz: Y1 obrázek. de: Y1 Bild. el: Î¥1 εικόνας en: Y1 picture. es: Punto de escala Y1 en la imagen. it: Y1 del disegno. ru: Y1 картинки. sk: Y1 na obrázku. sq: Y1 fotoja therion: X2 picture. bg: X2 на изображение cz: X2 obrázek. de: X2 Bild. el: Χ2 εικόνας en: X2 picture. es: Punto de escala X2 en la imagen. it: X2 del disegno. ru: X2 картинки. sk: X2 na obrázku. sq: X2 fotoja therion: Y2 picture. bg: Y2 на изображение cz: Y2 obrázek. de: Y2 Bild. el: Î¥2 εικόνας en: Y2 picture. es: Punto de escala Y2 en la imagen. it: Y2 del disegno. ru: Y2 картинки. sk: Y2 na obrázku. sq: Y2 fotoja therion: real scale points bg: реални мащабиращи точки cz: body měřítka (skuteÄné) de: Punkte für Realmaßstab el: Ï€Ïαγματικά σημεία για καλιμπÏάÏισμα en: real scale points es: puntos de escala (reales) it: punti nella scala effettiva ru: реальные маÑштабирующие точки sk: kalibraÄné body (skutoÄné) sq: pikat reale te matjes therion: Real coordinates of calibration points (X1:Y1 - X2:Y2). bg: Реални координати на калибриращите точки (X1:Y1 - X2:Y2). cz: SkuteÄné souÅ™adnice kalibraÄních bodů (X1:Y1 - X2:Y2). de: Realkoordinaten der Kalibrierungspunkte (X1:Y1 - X2:Y2). el: ΠÏαγματικές συντεταγμένες σημείων καλιμπÏαÏίσματος (Χ1:Î¥1 - Χ2:Î¥2) en: Real coordinates of calibration points (X1:Y1 - X2:Y2). es: Coordenadas reales de los puntos de calibración (X1:Y1 - X2:Y2). it: Coordinate reali dei punti di calibrazione (x1:y1 - x2:y2). ru: Реальные координаты калибровочных точек (X1:Y1 - X2:Y2). sk: SkutoÄné súradnice kalibraÄných bodov (X1:Y1 - X2:Y2). sq: koordinatat reale te pikave te kalibrimit (X1:Y1 - X2:Y2). therion: X1 real. bg: X1 реално. cz: X1 skuteÄný. el: ΠÏαγματικό Χ1. en: X1 real. es: X1 real it: x1 reale. ru: X1 реальное. sk: X1 skutoÄný sq: X1 I vertet-real therion: Y1 real. bg: Y1 реално. cz: Y1 skuteÄný. el: ΠÏαγματικό Î¥1. en: Y1 real. es: Y1 real it: y1 reale. ru: Y1 реальное. sk: Y1 skutoÄný sq: Y1 I vertet-real therion: X2 real. bg: X2 реално. cz: X2 skuteÄný. el: ΠÏαγματικό Χ1. en: X2 real. es: X2 real it: x2 reale. ru: X2 реальное. sk: X2 skutoÄný sq: X2 I vertet-real therion: Y2 real. bg: Y2 реално. cz: Y2 skuteÄný. el: ΠÏαγματικό Î¥2 en: Y2 real. es: Y2 real it: y2 reale. ru: Y2 реальное. sk: Y2 skutoÄný sq: Y2 I vertet-real therion: units bg: единици cz: jednotky de: Einheiten el: μονάδες en: units es: unidades it: unità ru: единицы sk: jednotky sq: njesite therion: Units of real coordinates. bg: Единици на реалните координати. cz: Jednotky reálných souÅ™adnic. de: Einheiten der Realkoordinaten. el: Μονάδες Ï€Ïαγματικών συντεταγμένων. en: Units of real coordinates. es: Unidades de las coordenadas reales. it: Unità delle coordinate reali. ru: Единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ñ‹Ñ… координат. sk: Jednotky reálnych súradníc. sq: njesite e koordinatave te verteta. therion: background sketches bg: Фонова Ñкица. cz: náÄrtky na pozadí de: Hintergrundskizzen el: Σχέδια του φόντου it: Immagini di background ru: Фоновые Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: náÄrtky na pozadí. sq: skicat e prapavise. therion: List of image files used as scrap background. bg: СпиÑък на графични файлове, използвани за фонови Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Ñкрапа. cz: Seznam obrázků použitých jako pozadí scrapu de: Liste der als Hintergrund verwendeten Bilder. el: Κατάλογος αÏχείων εικόνων που χÏησιμοποιοÏνται ως φόντο του σκÏαπ it: Files usati come background dello scrap ru: СпиÑок графичеÑких файлов, иÑпользуемых в качеÑтве фоновых изображений Ñкрапа sk: Zoznam obrázkov použitých ako pozadie. sq: lista e foto-arkivit te perdorura si prapavije e deponise. therion: Press this button to insert sketch by clicking on it. bg: ÐатиÑнете този бутон, за да вмъкнете Ñкица, като кликнете върху неÑ. cz: StisknÄ›te toto tlaÄítko a výbÄ›rem náÄrtku myší jej vložte do scrapu. de: Diesen Knopf drücken um Skizze einzufügen. el: Πατήστε εδώ για εισαγωγή σχεδίου με ποντίκι it: Premi per inserire il disegno che scegli col mouse ru: Эта кнопка вÑтавлÑет фон Ñкрапа в ÑпиÑок sk: Po stlaÄení klikni na náÄrtok, ktorý treba vložiÅ¥ do scrapu. sq: shtype kete buton te fusesh skicen duke klikuar ne te. therion: Delete sketch from scrap. bg: Изтрий Ñкица от Ñкрапа. cz: Odstranit náÄrtek ze scrapu de: Lösche Skizze. el: ΔιαγÏαφή σχεδίου από σκÏαπ it: Rimuovi un disegno dallo scrap ru: Эта кнопка удалÑет фон Ñкрапа из ÑпиÑка sk: Odstráň náÄrtok zo scrapu. sq: fshije skicen nga deponia therion: loading point module ... bg: зареждане на модула за точки ... cz: nahrávám point modul ... de: Lade Punktmodul ... el: φόÏτιση ενότητας σημείων… en: loading point module ... es: puntos ... it: modolo punti ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ‚Ð¾Ñ‡ÐµÐº... sk: nahrávam editor bodov ... sq: duke lexuar modulin e pikes… therion: Update point bg: Обнови точка cz: Aktualizovat de: Punkt aktualisieren el: ΕνημέÏωση σημείου en: Update point es: Actualizar it: Aggiorna punto ru: Обновить точку sk: Akualizuj bod sq: pika e aktualizimit therion: Click this button to apply point changes. bg: натиÑнете този бутон за прилагане на изменениÑта в/у точката. cz: Aktualizuje data týkající se bodu. de: Klicke diesen Knopf, um Änderungen am Punkt anzuwenden. el: Κάντε κλικ για να γίνει εφαÏμογή των αλλαγών που κάνατε στα σημεία en: Click this button to apply point changes. es: Clicar aquí tras modificar las propiedades del punto. it: Premi il bottone per fare modifiche al punto. ru: Ðажмите Ñту кнопку Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ точки. sk: StlaÄte aby sa aktualizovali zmenené údaje bodu. sq: kliko kete buton te aktualizosh nderrimet e pikes. therion: Point type. bg: Тип на точката. cz: Typ bodu. de: Punkttyp. el: Είδος σημείου en: Point type (click on triangle to see menu). es: Tipo de punto. Clic en triángulo para ver menú it: Tipo di punto ru: Тип точки. sk: Typ bodu. sq: lloji I pikave (kliko ne trekendesh te shohesh menun). therion: Point identifier. bg: Индетификатор на точката. cz: Identifikátor bodu. de: Punktbezeichner. el: ID σημείου en: Point identifier. es: Nombre (ID) del punto. it: Identificatore del punto. ru: Идентификатор точки. sk: Identifikátor bodu. sq: identifikuesi I pikes. therion: Other point options. bg: Други опции на точката. cz: Další volby pro bod. de: Andere Punktoptionen. el: Άλλες επιλογές για σημεία en: Options allow giving special characteristics to points. es: Las opciones permiten dar características especiales a los puntos. it: Altre opzioni del punto. ru: Другие опции точки. sk: Ostatné Å¡pecifikácie bodu. sq: opcionet tjera te pikes. therion: I.e, if type is label, write here: -text \042this will be displayed (P100)\042 bg: Ðапример, ако типът на точката е label (етикет), тук можете да въведете: -text \042 , това ще изобрази: (P100)\042 cz: Příklad: pokud type je label, zadejte: -text \042this will be displayed (P100)\042 de: d.h., wenn der Typ Beschriftung ist, schreibe hier: -text \042das wird hier angezeigt (P100)\042 el: Δηλαδή, αν το είδος είναι ταμπέλα, εδώ γÏάφετε: -text \042αυτό εμφανίζεται (P100)\042 en: I.e, if type is label, write here: -text \042this will be displayed (P100)\042 es: P.ej, si el tipo es label, escribe: -text \042lo que se verá (P100)\042. it: Cioé, se il tipo è etichetta, scrivi: -text \042questo sarà visualizzato (P100)\042 ru: Ðапример, еÑли тип точки label, здеÑÑŒ можно набрать: -text \042Ñто напечатаетÑÑ (P100)\042 sk: Príklad: ak je typ label, zadajte: -text \042tento text bude zobrazený\042 sq: p.sh. nese lloji eshte etikete, shkruaj ketu: -teksti \042 kjo do te lajmerohet (P100)\042 therion: Enter symbol orientation angle. bg: Въведете Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð° Ñимвола. cz: Zadejte orientaci bodu. de: Winkel der Symbolausrichtung angeben. el: Εισαγωγή γωνίας Ï€ÏÎ¿ÏƒÎ±Î½Î±Ï„Î¿Î»Î¹ÏƒÎ¼Î¿Ï ÏƒÏμβολου. en: Enter symbol orientation angle. es: Introducir dirección en que debe apuntar el símbolo. it: Scrivi l'angolo di orientazione del simbolo. ru: Введите ориентацию Ñимвола. sk: Zadajte orientáciu bodu. sq: fute simbolin e kendit te orientimit. therion: There are symbol types which must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard. bg: ÐÑкои типове Ñимволи трÑбва да бъдат ориентирани (например gradient). ÐатиÑнете тук за да им дадете направление Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° на мишката или клавиатурата. cz: Jsou symboly, kterým musíte specifikovat orientaci (napÅ™. gradient). ZakliknÄ›te tuto volbu a nastavte jim orientaci myší nebo z klávesnice. de: Es gibt Symbole, die eine Ausrichtung haben müssen (z.B. Gefälle). Klicke hier, um sie mit der Maus oder der Tastatur auszurichten. el: Κάποια είδη συμβόλων Ï€Ïέπει να Ï€ÏοσανατολιστοÏν (Ï€.χ. κλίσεις). Κάντε κλικ εδώ να οÏισθεί ο Ï€Ïοσανατολισμός είτε από το πληκτÏολόγιο είτε με το ποντίκι. en: Some symbol types must be orientated (i.e: gradients). Click here to giv'em orientation by mouse or keyboard. es: Hay tipos de símbolo que deben ser orientados (p.ej, pendientes). Haz clic aquí para orientarlos con ratón o teclado. it: Ci sono tipi di simboli che sono orientati (per es. gradiente). Premi qui per orientarli col mouse o la tastiera ru: Ðекоторые типы Ñимволов должны быть ориентированы (например gradient). Ðажмите здеÑÑŒ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼ ориентации Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ мыши или клавиатуры. sk: Sú symboly, ktorým treba zadaÅ¥ orientáciu (napr. gradiet). OznaÄte túto voľbu a nastavte orientáciu myÅ¡ou alebo z klávesnice. sq: disa lloje te simboleve duhet te orientohen (p.sh.:gradienti). Kliko ketu qe ti orientosh me mi apo tastature. therion: x-size bg: Ñ…-размер cz: x-rozsah de: x-Größe el: μέγεθος x en: x-size es: tamaño-x it: dim. x ru: x-size sk: veľkosÅ¥-x sq: madhesia-X therion: Set point size in main direction. bg: Укажете размера на точката в главното направление. cz: Nastaví rozsah bodu v hlavním smÄ›ru. de: Setze Punktgröße in Hauptrichtung. el: ΟÏισμός πλευÏÎ¹ÎºÎ¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ σημείου en: Set point size in main direction. es: Ajustar tamaño del punto en dirección principal. it: Imposta la dimensione del punto nella direzione principale. ru: УÑтановить размер точки в главном направлении. sk: Nastavte veľkosÅ¥ bodu v hlavnom (X) smere. sq: vene madhesine e pikes ne drejtimin kryesor. therion: Enter point size in main direction. bg: Въведете размера на точката в главното направление. cz: Zadejte rozsah bodu v hlavním smÄ›ru. de: Punktgröße in Hauptrichtung eingeben. el: Εισαγωγή πλευÏÎ¹ÎºÎ¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ σημείου en: Enter point size in main direction. es: Introducir tamaño del punto en dirección principal. it: Scrivi la dimensione del punto nella direzione principale. ru: Введите размер точки в главном направлении. sk: Zadajte veľkosÅ¥ bodu v hlavnom (X) smere. sq: fute madhesine e pikes ne drejtimin kryesor. therion: y-size bg: y-размер cz: y-rozsah de: y-Größe el: μέγεθος y en: y-size es: tamaño-y it: dim. y ru: y-size sk: veľkosÅ¥-y sq: madhesia-Y therion: Set point size in side direction. bg: Укажете размера на точката в обратното направление. cz: Nastaví rozsah bodu ve vedlejším smÄ›ru. de: Setze Punktgröße in seitlicher Richtung. el: ΟÏισμός πλευÏÎ¹ÎºÎ¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ σημείου en: Set point size in side direction. es: Ajustar tamaño del punto en dirección lateral. it: Imposta la dimensione del punto nella direzione trasversale. ru: УÑтановить размер точки в боковом направлении. sk: Nastavte veľkosÅ¥ bodu vo vedľajÅ¡om smere. sq: vene madhesine e pikes ne drejtim anesore. therion: Enter point size in side direction. bg: Въведете размера на точката в обратното направление. cz: Zadejte rozsah bodu ve vedlejším smÄ›ru. de: Punktgröße in seitlicher Richtung eingeben. el: Εισαγωγή πλευÏÎ¹ÎºÎ¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ σημείου en: Enter point size in side direction. es: Introducir tamaño del punto en dirección lateral. it: Scrivi la dimensione del punto nella direzione trasversale. ru: Введите размер точки в боковом направлении. sk: Zadajte veľkosÅ¥ bodu vo vedľajÅ¡om smere. sq: fute madhesine e pikes ne drejtim anesore. therion: loading line module ... bg: зареждане на модула за линии ... cz: nahrávám kÅ™ivkový modul ... de: Lade Linienmodul ... el: φόÏτιση ενότητας γÏαμμών... en: loading line module ... es: líneas ... it: modulo linee ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð»Ð¸Ð½Ð¸Ð¹ ... sk: nahrávam modul kriviek ... sq: duke lexuar modulin e rrjeshtit… therion: Line type. bg: Тип на линиÑ. cz: Typ kÅ™ivky. de: Linientyp. el: Είδος γÏαμμής en: Line type (click on triangle to see menu). es: Tipo de línea. Clic en triángulo para ver el menú. it: Tipo di linea. ru: Тип линии. sk: Typ krivky. sq: lloji I rrjeshtit. therion: id bg: id - индетификатор cz: id de: id el: ID en: id es: ID it: Identificativo ru: Ид sk: id sq: ID-identifikimi therion: Line identifier. bg: Индетификатор на Ð»Ð¸Ð½Ð¸Ñ cz: Identifikátor kÅ™ivky. de: Linienbezeichner. el: ID γÏαμμής. en: Line identifier. es: Nombre (ID) de la línea. it: Identificativo della linea. ru: Идентификатор линии sk: Identifikátor krivky. sq: identifikimi I rrjeshtit. therion: Other line options. bg: Други опции на линиÑта cz: Další volby pro kÅ™ivku. de: Andere Linienoptionen. el: Άλλες επιλογές γÏαμμής. Δηλαδή για μη-εμφάνιση γÏαμμής γÏάφετε εδώ: -subtype invisible. Βλέπετε το thbook.pdf en: Other line options. I.e., to make line invisible, write here: -subtype invisible. See thbook.pdf es: Otras opciones de línea. P. ej: para hacerla invisible, escribe: -subtype invisible (consultar thbook.pdf) it: Altre opzioni della linea. ru: Прочие опции линии sk: ÄŽalÅ¡ie možnosti pre krivku. sq: opcionet tjera te rrjeshtit. therion: reverse bg: обратна cz: obrátit de: Umkehren el: αναστÏοφή en: reverse es: invertir it: inverti ru: Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ sk: otoÄiÅ¥ sq: ktheje pas therion: Reverse line. bg: Обърни линиÑта cz: Obrátit kÅ™ivku. de: Linie umkehren. el: ΑναστÏοφή γÏαμμής. Σε πεÏίπτωση που τα σημαδάκια είναι ανάποδα, κάντε κλικ εδώ. en: Reverse line. If symbol's ticks are on bad side, click here. es: Invertir línea. Si p.ej el símbolo de resalte aparece al revés, haz clic aquí. it: Inverti la linea. ru: Задать обратное направление Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸. sk: OtoÄiÅ¥ krivku. sq: rrjeshti I pasem-I kthyer therion: close bg: затвори cz: zavřít de: schließen el: κλείσιμο en: close es: cerrar it: chiudi ru: замкнуть sk: zavrieÅ¥ sq: mbylle therion: Close line. bg: Затвори линиÑта Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ñ‚Ð¾ и. cz: Uzavřít kÅ™ivku. de: Linie schließen. el: Κλείσιμο γÏαμμής en: Close line. es: Cerrar línea (o sea, unir último punto con el primero para definir un espacio cerrado). it: Chiudi la linea. ru: Замкнуть линию на её же начало. sk: UzavrieÅ¥ krivku. sq: mbylle rrjeshtin. therion: Edit line bg: Редактирай Ð»Ð¸Ð½Ð¸Ñ cz: Editovat de: Linie bearbeiten el: ΕπεξεÏγασία γÏαμμής en: Edit line es: Editar it: Edita ru: Править линию sk: UpraviÅ¥ sq: permireso rrjeshtin therion: Insert/delete line point. Split line. bg: Вмъкване/триене на точка. РазделÑне на линиÑ. cz: Vložení/smazání bodu kÅ™ivky. RozdÄ›lení kÅ™ivky. de: Punkt auf Linie eingeben/löschen. Linie teilen. el: Εισαγωγή και διαγÏαφή σημείων γÏαμμής. ΔιαίÏεση γÏαμμής. en: Insert/delete line point. Split line. es: Permite añadir o borrar puntos de la línea, o cortar la línea en dos. it: Inserisci/rimuovi un punto della linea. Dividi la linea. ru: Ð’Ñтавка/удаление точки, разделение линии. sk: Vloženie/odstránenie bodu krivky. Rozdelenie krivky. sq: fute/fshije piken e rrjeshtit. Ndaje rrjeshtin. therion: Click this button to apply line changes. bg: ÐатиÑнете този бутон за да приложите изменениÑта на линиÑта. cz: Aktualizuje kÅ™ivku. de: Klicke diesen Knopf, um Linienänderungen anzuwenden. el: Κάντε κλικ για να γίνει εφαÏμογή των αλλαγών στην γÏαμμή. en: Click this button to apply line changes. es: Clicar aquí tras modificar las propiedades de la línea. it: Primi questo bottone per fare modifiche alla linea. ru: Ðажмите Ñту кнопку Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ линии. sk: Aktualizuje krivku. sq: kliko kete buton te aktualizosh nderrimet e rrjeshtit. therion: Select line point. bg: Избери една от точките на линиÑта. cz: VýbÄ›r bodu kÅ™ivky. de: Punkt auf Linie auswählen. el: Αυτά είναι τα επιλεγμένα σημεία γÏαμμών. Κάντε κλικ σε όποιο σας ενδιαφέÏει για να εμφανιστεί ως επιλεγμένο στον καμβά. en: These are selected line points. Click on any to get it selected on canvas. es: Lista de puntos que forman esta línea. Clic para resaltar el punto en la topo. it: Seleziona un punto della linea. ru: Выбрать одну из точек линии. sk: Výber bodu krivky. sq: selekto piken e rrjeshtit. therion: loading line point module ... bg: зареждане на модула линейни точки ... cz: nahrávám modul pro body kÅ™ivky ... de: Lade Linienpunktmodul ... el: φόÏτιση ενότητας σημείων γÏαμμών... en: loading line point module ... es: puntos de línea ... it: caricando il modulo dei punti di linea ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ‚Ð¾Ñ‡ÐµÐº линии ... sk: nahrávam modul pre body krivky ... sq: duke lexuar modulin e pikes se rrjeshtit. therion: position bg: Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ cz: pozice de: Position el: θέση en: position es: posición it: posizione ru: Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ sk: poloha sq: pozicioni therion: Point position. bg: ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° точката. cz: Pozice bodu. de: Punktposition. el: Θέση σημείου en: Point position. es: Posición del punto. it: Posizione del punto. ru: ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸. sk: Poloha bodu. sq: pozicioni I pikes. therion: Point X coordinate. bg: X координата на точката. cz: souÅ™adnice X bodu. de: Punkt X-Koordinate. el: Συντεταγμένη Χ σημείου en: Point X coordinate. es: Coordenada X del punto. it: Coordinata X del punto. ru: X координата точки. sk: X súradnica bodu. sq: pika X e koordinates. therion: Point Y coordinate. bg: Y координата на точката. cz: souÅ™adnice Y bodu. de: Punkt Y-Koordinate. el: Συντεταγμένη Î¥ σημείου en: Point Y coordinate. es: coordenada Y del punto. it: Coordinata Y del punto. ru: Y координата точки. sk: Y súradnica bodu. sq: pika Y e koordinates. therion: Previous control point X coordinate. bg: X координата на предишната управлÑваща точка. cz: SouÅ™adnice X pÅ™edchozího řídícího bodu. de: Vorherige X-Koordinate eines Kontrollpunkts. el: Συντεταγμένη Χ Ï€ÏοηγοÏμενου σημείου ελέγχου en: Previous control point X coordinate. es: Coordenada X del punto de control anterior. it: Coordinata X del punto di controllo precedente. ru: X координата предыдущей управлÑющей точки. sk: X súradnica predchádzajúceho kontrolného bodu. sq: pika e kontrollit te meparshem te koordinates X therion: Previous control point Y coordinate. bg: Y координата на предишната управлÑваща точка. cz: SouÅ™adnice Y pÅ™edchozího řídícího bodu. de: Vorherige Y-Koordinate eines Kontrollpunkts. el: Συντεταγμένη Î¥ Ï€ÏοηγοÏμενου σημείου ελέγχου en: Previous control point Y coordinate. es: Coordenada Y del punto de control anterior. it: Coordinata Y del punto di controllo precedente. ru: Y координата предыдущей управлÑющей точки. sk: Y súradnica predchádzajúceho kontrolného bodu. sq: pika e kontrollit te meparshem te koordinates-Y therion: Next control point X coordinate. bg: X координата на Ñледващата управлÑваща точка. cz: SouÅ™adnice X následujícího řídícího bodu. de: Nächste X-Koordinate eines Kontrollpunkts. el: Συντεταγμένη Χ επόμενου σημείου ελέγχου en: Next control point X coordinate. es: Coordenada X del siguiente punto de control. it: Coordinata X del prossimo punto. ru: X координата Ñледующей управлÑющей точки. sk: X súradnica nasledujúceho kontrolného bodu. sq: pika e ardhshme kontrollit te coordinates X therion: Next control point Y coordinate. bg: Y координата на Ñледващата управлÑваща точка. cz: SouÅ™adnice Y následujícího řídícího bodu. de: Nächste Y-Koordinate eines Kontrollpunkts. el: Συντεταγμένη Î¥ επόμενου σημείου ελέγχου en: Next control point Y coordinate. es: Coordenada Y del siguiente punto de control. it: Coordinata Y del prossimo punto. ru: Y координата Ñледующей управлÑющей точки. sk: Y súradnica nasledujúceho kontrolného bodu. sq: pika e ardhshme kontrollit te coordinates Y therion: Checkbox whether to use previous control point. bg: ПоÑтавете отбелÑзка за използване на предишната управлÑваща точка. cz: ZaÅ¡krtnÄ›te pokud chcete pro tvar kÅ™ivky použít pÅ™edchozí řídící bod. de: Auswahl, ob vorheriger Kontrollpunkt benutzt wird. el: Επιλογή για χÏήση Ï€ÏοηγοÏμενου σημείου ελέγχου en: Checkbox whether to use previous control point. es: Usar punto de control anterior. it: Checkbox per usare il punto di controllo precedente. ru: ПоÑтавьте галочку Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ управлÑющей точки. sk: Použi predchádzajúci kontrolný bod. sq: kutia-kontrollit a duhet te perdoret pika e kontrollit e meparshme therion: smooth bg: изглаждане cz: uhladit de: geglättet el: απαλή en: smooth es: suavizar it: regolarizza ru: Ñгладить sk: vyhladiÅ¥ sq: e bute therion: Set line to be smooth in given point. bg: УÑтановете за изглаждане на линиÑта в дадената точка. cz: Nastaví hladkou kÅ™ivku v daném bodÄ›. de: Setze Linie auf geglättet am gegebenen Punkt. el: ΟÏισμός απαλής καμπÏλης στο επόμενο σημείο της γÏαμμής en: Set line to be smooth in given point. es: Suavizar la línea en el punto seleccionado. it: Imposta la linea ad essere regolare nelpunto specificato. ru: УÑтановите Ð´Ð»Ñ ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¸ в данной точке. sk: Nastaví kontrolné body tak, aby krivka bola v danom bode hladká. sq: vene rrjeshtin per te qene I bute ne piken e dhanun therion: Checkbox whether to use next control point. bg: ПоÑтавете отбелÑзка за използване на Ñледващата управлÑваща точка. cz: ZaÅ¡krtnÄ›te pokud chcete pro tvar kÅ™ivky použít následující řídící bod. de: Auswahl, ob nächster Kontrollpunkt benutzt wird. el: Επιλογή για χÏήση επόμενου σημείου ελέγχου en: Checkbox whether to use next control point. es: Usar siguiente punto de control. it: Checkbox per usare il prossimo punto di controllo. ru: ПоÑтавьте галочку Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñледующей управлÑющей точки. sk: Použi nasledujúci kontrolný bod. sq: kutia-kontrollit a duhet te perdoret pika e kontrollit e ardhshme therion: orientation bg: Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ cz: orientace de: Ausrichtung el: Ï€Ïοσανατολισμός en: orientation es: orientación it: orientazione ru: Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ sk: orientácia sq: orientimi therion: Set line point orientation. bg: Укажете ориентациÑта на точка на линиÑта. cz: Nastaví orientaci bodu. de: Setze Ausrichtung des Linienpunkts. el: ΟÏισμός Ï€ÏÎ¿ÏƒÎ±Î½Î±Ï„Î¿Î»Î¹ÏƒÎ¼Î¿Ï ÏƒÎ·Î¼ÎµÎ¯Î¿Ï… γÏαμμής en: Set line point orientation. es: Ajustar dirección en que apunta un punto de la línea (p.ej una pendiente). it: Imposta l'orientazione del punto della linea. ru: УÑтановите ориентацию точки линии. sk: Nastaví orientáciu symbolov v bode krivky. sq: vene orientimin e pikes se rrjeshtit therion: Enter line point orientation. bg: Въведете ориентациÑта на точка на линиÑта. cz: Zadejte orientaci bodu. de: Ausrichtung des Linienpunkts eingeben. el: Εισαγωγή Ï€ÏÎ¿ÏƒÎ±Î½Î±Ï„Î¿Î»Î¹ÏƒÎ¼Î¿Ï ÏƒÎ·Î¼ÎµÎ¯Î¿Ï… γÏαμμής en: Enter line point orientation. es: Introducir dirección señalada por el punto. it: Scrivi l'orientazione del punto della linea. ru: Введите ориентацию точки линии. sk: Zadaj orientáciu symbolov v bode krivky. sq: fute orientimin e pikes se rrjeshtit therion: r-size bg: r-размер cz: p-rozsah de: r-Größe el: διάσταση (δ) en: r-size es: anchura-dcha it: dim. destra ru: r-size sk: rozmer-p sq: r-madhesia therion: Set line size in right direction. bg: Укажете размера на линиÑта в направление надÑÑно. cz: Nastaví rozsah kÅ™ivky v pravém smÄ›ru. de: Setze Liniengröße nach rechts. el: ΟÏισμός διάστασης γÏαμμής Ï€Ïος τα δεξιά en: Set line size in right direction. es: Ajustar anchura de línea (lado derecho de la línea). it: Imposta la dimensione della linea a destra. ru: УÑтановите размер линии в правом направлении. sk: Nastaví veľkosÅ¥ symbolov napravo od krivky. sq: cakto madhesine e rrjeshtit ne drejtim te djathte therion: Enter line size in right direction. bg: Въведете размера на линиÑта в направление надÑÑно. cz: Zadejte rozsah kÅ™ivky v pravém smÄ›ru. de: Liniengröße nach rechts eingeben. el: Εισαγωγή διάσταση γÏαμμής Ï€Ïος τα δεξιά en: Enter line size in right direction. es: Introducir anchura de línea (lado derecho de la línea). it: Scrivi la dimensione della linea a destra. ru: Введите размер линии в правом направлении. sk: Zadaj veľkosÅ¥ symbolov napravo od krivky. sq: fute madhesine e rjeshtit ne drejtim te djathte therion: l-size bg: l-размер cz: l-rozsah de: l-Größe el: διάσταση (α) en: l-size es: anchura-izda it: dim. sinistra ru: l-size sk: rozmer-ľ sq: madhesia-l therion: Set line size in left direction. bg: Укажете размера на линиÑта в направление налÑво. cz: Nastaví rozsah kÅ™ivky v levém smÄ›ru. de: Setze Liniengröße nach links. el: ΟÏισμός διάστασης γÏαμμής Ï€Ïος τα αÏιστεÏά en: Set line size in left direction. es: Ajustar anchura de línea (lado izquierdo de la línea). El tipo slope necesita este valor. it: Imposta la dimensione della linea a sinistra. ru: УÑтановите размер линии в левом направлении. sk: Nastaví veľkosÅ¥ symbolov naľavo od krivky. sq: cakto madhesine e rjeshtit ne drejtim te majte therion: Enter line size in left direction. bg: Въведете размера на линиÑта в направление налÑво. cz: Zadejte rozsah kÅ™ivky v levém smÄ›ru. de: Liniengröße nach links eingeben. el: Εισαγωγή διάσταση γÏαμμής Ï€Ïος τα αÏιστεÏά en: Enter line size in left direction. es: Introducir anchura de línea (lado izquierdo de la línea). El tipo slope necesita este valor. it: Scrivi la dimensione della linea a sinistra. ru: Введите размер линии в левом направлении. sk: Zadaj veľkosÅ¥ symbolov naľavo od krivky. sq: fute madhesine e rjeshtit ne drejtim te majte therion: Line point options editor. bg: Редактор на опциите на точка на линиÑта. cz: Volby bodu kÅ™ivky. de: Linienpunktoptionen bearbeiten. el: ΕπεξεÏγαστής επιλογών σημείων γÏαμμών en: Line point options editor. es: Editor de puntos pertenecientes a la línea seleccionada. Consultar thbook.pdf it: Editor delle opzioni del punto della linea. ru: Редактор опций точки линии. sk: Editor Äalších možností bodu krivky. sq: opcioni I editimit te pikes se rjeshtit therion: Click this button to apply line point changes. bg: ÐатиÑмете този бутон за прилагане на промените в/у точка на линиÑта. cz: Aktualizovat bod kÅ™ivky. de: Klicke diesen Knopf, um Änderungen am Linienpunkt anzuwenden. el: Πατήστε εδώ για να γίνει εφαÏμογή των αλλαγών στο σημείο της γÏαμμής. en: Click this button to apply line point changes. es: Clicar tras modificar las propiedades de los puntos de una línea. it: Premi questo bottone per fare modifiche ai punti della linea. ru: Ðажмите Ñту кнопку Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ точки линии. sk: Aktializácia bodu krivky. sq: kliko kete buton per te bere ndrimet e pikes se rjeshtit therion: Editor for line point options. bg: Редактор за опциите на точка на линиÑта. cz: Editor voleb bodu kÅ™ivky. de: Edditor für Linienpunktoptionen. el: Εδώ μποÏείτε να εισάγετε επιλογές για τα σημεία των γÏαμμών. en: Here you can enter options that will apply to line points. es: Aquí se pueden meter opciones que afectarán a los puntos de esta línea. it: Editor delle opzioni del punto della linea. ru: Редактор опций точки линии. sk: Editor Äalších možností bodu krivky. sq: ketu mund te futni opcionet te cilat do te vlejne per pikat e rrjeshtit therion: loading area module ... bg: зареждане на модула за облаÑти ... cz: nahrávám modul pro oblasti ... de: Lade Flächenmodul ... el: φοÏτίζεται η ενότητα επιφανειών... en: oading area module ... es: áreas... it: modulo aree ... ru: загрузка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¾Ð±Ð»Ð°Ñтей ... sk: nahrávam modul pre plochy ... sq: duke lexuar modulin e fushes… therion: Actual symbol theme. bg: Ðктуален набир на Ñимволи cz: Aktuální téma symbolů. de: Aktueller Symbolsatz. el: ΣÏμβολο it: Simboli. ru: Фильтр группы Ñимволов. sk: Aktuálna téma symbolov. sq: tema aktuale e simbolit. therion: type bg: тип cz: typ de: Typ el: είδος en: type es: tipo it: tipo ru: тип sk: typ sq: lloji therion: Area type. bg: Тип на облаÑтта cz: Typ oblasti. de: Flächentyp. el: Είδος επιφάνειας en: Area type (clic on triangle to see menu). es: Tipo de área. Clic en triángulo para ver el menú. it: Tipo dell'area ru: Тип облаÑти. sk: Typ plochy. sq: lloji I fushes. therion: options bg: опции cz: volby de: Optionen el: επιλογές en: options es: opciones it: opzioni ru: опции sk: možnosti sq: opcionet therion: Other area options. bg: Други опции на облаÑтта. cz: Další volby pro oblast. de: Andere Flächenoptionen. el: Άλλες επιλογές επιφανειών. Βλ. thbook.pdf en: Other area options. See thbook.pdf es: Otras opciones de área. Consultar thbook.pdf it: Altre opzioni dell'area. ru: Другие опции облаÑти. sk: ÄŽalÅ¡ie možnosti plochy. sq: opcionet tjera te fushes. therion: Select lines bg: Избор на линии cz: Vyber kÅ™ivky de: Linien auswählen el: Επιλογή γÏαμμών en: Select lines es: Seleccionar it: Selezione linee ru: Выбор линий. sk: Vyber krivky sq: selekto rjeshtat therion: Switch to insert line into area mode. bg: Превключи в режим поÑтавÑне на линии-граници в облаÑтта. cz: VýbÄ›r ohraniÄujících kÅ™ivek oblasti. el: Î‘Ï†Î¿Ï Ï€Î±Ï„Î®ÏƒÏ„Îµ εδώ, επιλέγετε με το ποντίκι τις γÏαμμές οÏίων της επιφάνειας (Ï€Ïέπει να τέμνονται) en: After clicking here, select by mouse this area border lines (they must intersect). es: Tras clicar aquí, con el ratón puedes seleccionar líneas que limiten un área (deben cortarse entre sí). it: Cambia per inserire linee nell'area. ru: ПереключитÑÑ Ð² режим вÑтавки линий-границ в облаÑть. sk: Po stlaÄení môžete zaÄaÅ¥ vkladaÅ¥ krivky ohraniÄujúce plochu. sq: pasi te klikoni ketu, selekto me mi rjeshtat e kufirit te fushes (ato duhet te nderlidhen) therion: Delete ID from area. bg: Изтрий Ð»Ð¸Ð½Ð¸Ñ Ð¿Ð¾ ID от облаÑтта. cz: OdstranÄ›ní objektu z oblasti. de: Lösche ID aus Fläche. el: ΔιαγÏαφή ID από επιφάνεια en: Delete selected line from list (will not be part of area borders) es: Borrar la línea seleccionada de la lista (dejará de limitar este área). it: Rimuovi identificativo dall'area. ru: Удалить линию по ИД из облаÑти. sk: OdstrániÅ¥ krivku z daným ID z plochy. sq: fshije ID prej fushes therion: Insert ID bg: Вмъкни по ID cz: Vlož ID de: ID einfügen el: Εισαγωγή ID en: Insert ID es: Insertar ID it: Identificativo ru: Ð’Ñтавить по ИД sk: Vlož ID sq: fute ID-ne therion: Insert given id. bg: Вмъкни линиÑ-граница по зададено ID. cz: Vloží objekt s daným ID. de: Angegebene ID einfügen. el: Εισαγωγή ID άλλο από το Ï€ÏοκαθοÏισμένο του Xtherion en: Insert given id instead of Xtherion default. es: Insertar nombre (ID) indicado, no el nombre que therion crea automáticamente it: Inserisci l'identificativo specificato ru: Ð’Ñтавить линию-границу по заданному ИД. sk: VložiÅ¥ ID krivky do zoznamu kriviek ohraniÄujúcich plochu. sq: fute ID-n e dhene ne vend te X-therion therion: ID to insert. bg: ID за вмъкване cz: ID objektu ke vložení. de: einzufügende ID. el: Εισαγωγή ID. en: ID to insert. es: Escribir el nombre (ID) a insertar. it: Identificativo da inserire. ru: ИД линии Ð´Ð»Ñ Ð²Ñтавки sk: ID na vloženie. sq: ID-ja per tu futur. therion: Update bg: Обнови cz: Aktualizovat de: Aktualisieren el: ΕμημέÏωση en: Update es: Actualizar it: Aggiorna ru: Обновить sk: AktualizovaÅ¥ sq: aktualizo therion: Click this button to apply changes you made to area. bg: ÐатиÑнете този бутон за да приложите промените, направени в облаÑтта. cz: Aktualizace oblasti. de: Klicke diesen Knopf, um Änderungen an einer Fläche anzuwenden. el: Κάντε κλικ να γίνει εφαÏμογή των αλλαγών που κάνατε στην επιφάνεια. en: Click this button to apply changes you made to area. es: Clicar aquí después de modificar las propiedades de un área. it: Premi questo bottone per fare modifiche all'area. ru: Ðажмите Ñту кнопку Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ñделанных Ð´Ð»Ñ Ð¾Ð±Ð»Ð°Ñти. sk: AktualizovaÅ¥ plochu. sq: kliko kete buton te aktualizosh ndrimet te cilat I ke bere ne fushe therion: Show bg: Покажи cz: Zobrazit de: Zeige el: Εμφάνιση en: Show es: Mostrar it: Mostra ru: Показать sk: ZobraziÅ¥ sq: trego therion: Show area border lines. bg: Покажи границите на облаÑтта. cz: Zobrazí hranice oblasti. de: Zeige Flächenbegrenzungen. el: Εμφάνιση γÏαμμών οÏίων επιφάνειας en: Show area border lines. es: Mostrar líneas límite de área. it: Mostra le linee del bordo dell'area. ru: Показать линии-границы Ð´Ð»Ñ Ð¾Ð±Ð»Ð°Ñти. sk: Zobraz hranice plochy. sq: trego kufirin e vijave te fushes. therion: Select line in area. bg: Избери линиÑ. cz: VýbÄ›r kÅ™ivky ohraniÄující oblast de: Wähle Linie in Fläche. el: Κάντε κλικ σε οποιαδήποτε γÏαμμή του καταλόγου για να επιλεχθεί η αντίστοιχη γÏαμμή οÏίου επιφάνειας στον καμβά. en: Click on any list line to get corresponding area border line selected on canvas. es: Cada renglón de la lista corresponde a una línea que limita esta área it: Seleziona una linea nell'area. ru: Выбор линии. sk: Vyber hraniÄnú krivku. sq: kliko ne cilindo rrjesht te listes qe te kesh rrjeshtin kufizues te fushes pershtatese, I zgjedhur ne pelhure therion: loading main menu ... bg: Зареждане на главното меню ... cz: nahrávám hlavní menu ... de: Lade Hauptmenü ... el: φόÏτιση κÏÏιου Î¼ÎµÎ½Î¿Ï en: loading main menu ... es: menú principal ... it: menù principale ... ru: загрузка главного меню ... sk: nahrávam hlavné menu ... sq: duke lexuar menyn kryesore… therion: Open (no pics) bg: Отвори (без изображениÑ) cz: Otevřít (bez obrázků) de: Öffne (keine Bilder) el: Άνοιγμα (χωÏίς εικόνες) en: Open (no pics) es: Abrir (sin imágenes) it: Apri (no pics) ru: Открыть (без картинок) sk: OtvoriÅ¥ (bez obrázkov) sq: hape (pa foto) therion: Insert ... bg: Вмъкни ... cz: Vložit ... de: Einfügen ... el: Εισαγωγή... en: Insert ... es: Insertar ... it: Inserisci ... ru: Ð’Ñтавка sk: VložiÅ¥ ... sq: fute… therion: point bg: точка cz: bod de: Punkt el: σημείο en: point es: punto it: punto ru: точка sk: bod sq: pika therion: line bg: Ð»Ð¸Ð½Ð¸Ñ cz: kÅ™ivka de: Linie el: γÏαμμή en: line es: línea it: linea ru: Ð»Ð¸Ð½Ð¸Ñ sk: krivku sq: vija apo rjeshti therion: area bg: облаÑÑ‚ cz: oblast de: Fläche el: επιφάνεια en: area es: área it: area ru: облаÑть sk: plochu sq: fusha therion: scrap bg: Ñкрап cz: scrap de: Skizze el: σκÏαπ en: scrap es: croquis it: scrap ru: Ñкрап sk: scrap sq: deponia therion: text bg: текÑÑ‚ cz: text de: Text el: κείμενο en: text es: texto it: testo ru: текÑÑ‚ sk: text sq: teksti therion: Auto adjust area bg: Ðвтоматична наÑтройка на облаÑÑ‚ cz: Auto pÅ™izpůsobit de: Fläche automatisch anpassen el: Αυτόματη ÏÏθμιση επιφάνειας en: Auto adjust area es: Autoajustar área it: Auto-ridimensiona area ru: Ðвтоподгонка границ зоны риÑованиÑ. sk: Prispôsob plochu sq: fusha automatikisht e pershtatur therion: Insert image bg: Вмъкни изображение cz: Vložit obrázek de: Bild einfügen el: Εισαγωγή εικόνας en: Insert image es: Insertar imagen it: Inserisci immagine ru: Ð’Ñтавить изображение sk: VložiÅ¥ obrázok sq: fute imazhin therion: Zoom 100 % bg: Мащаб 100% cz: Zoom na 100 % el: Μεγέθυνση 100% en: Zoom 100 % es: Zoom 100% it: Zoom 100 % ru: МаÑштаб 100 % sk: Zoom 100% sq: zmadho 100% therion: Mouse mode. bg: Режим 'мишка'. cz: Klikací režim. de: Mausmodus. el: ΛειτουÏγία ποντικιοÏ. en: Mouse mode. es: Modo ratón. it: Modalità del mouse. ru: Режим мыши. sk: Mód myÅ¡i. sq: miu ne funkcion therion: Current mouse position. bg: Текуща Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° курÑора. cz: Aktuální pozice ukazatele myÅ¡i. de: Aktuelle Mausposition. el: ΤÏέχουσα θέση ποντικιοÏ. en: Current mouse position. es: Posición actual del ratón. it: Posizione del mouse. ru: Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ Ð¼Ñ‹ÑˆÐ¸. sk: Aktuálna poloha myÅ¡i. sq: pozicioni aktual I miut. therion: loading line procs ... bg: зареждане на процедурите за Ð»Ð¸Ð½Ð¸Ñ ... cz: zpracovávám kÅ™ivky ... el: φόÏτιση γÏαμμικών διαδικασιών... en: loading line procs ... es: procesos de línea ... it: procedure di linea ... ru: загрузка процедур Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¹ ... sk: naÄitavam modul kriviek ... sq: duke lexuar proceduren rjeshtit… therion: Map editor is not active. To activate it, open existing file or create new one. bg: Редактора на карти не е активен. За активиране отворете ÑъщеÑтвуващ файл или Ñъздайте нов. cz: Mapový editor není aktivní. Pro jeho aktivaci otevÅ™ete existující soubor nebo vytvoÅ™te nový. de: Karteneditor ist nicht aktiv. Um ihn zu aktivieren, lade eine existierende Datei oder lege eine neue an. el: Ο επεξεÏγαστής σχεδίου δεν είναι ενεÏγός. Για να τον ενεÏγοποιήσετε, ανοίξτε ένα αÏχείο ή δημιουÏγήστε νέο. en: Map editor is not active. To activate it, open existing file or create new one. es: El editor de mapas está inactivo. Para activarlo, abre un archivo existente o crea uno nuevo. it: L'editor di mappa non è attivo. Per attivarlo apri un file o creane uno. ru: Редактор карты не активен. Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ откройте ÑущеÑтвующий файл или Ñоздайте новый. sk: Mapový editor nie je aktívny. Otvorte existujúci súbor alebo vytvorte nový. sq: permiresuesi I hartes nuk eshte aktiv. Qe ta aktivizosh, hape fajlin egzistues ose krijo nje te ri therion: Insert line bg: Вмъкни Ð»Ð¸Ð½Ð¸Ñ cz: Vložit kÅ™ivku de: Linie einfügen el: Εισαγωγή γÏαμμής en: Insert line es: Insertar línea it: Inserisci linea ru: Ð’Ñтавить линию sk: VložiÅ¥ krivku sq: fute rjeshtin-vijen therion: Insert scrap bg: Вмъкни Ñкрап cz: Vložit scrap de: Skizze einfügen el: Εισαγωγή σκÏαπ en: Insert scrap es: Insertar croquis it: Inserisci scrap ru: Ð’Ñтавить Ñкрап sk: VložiÅ¥ scrap sq: fute deponin therion: Insert text bg: Вмъкни текÑÑ‚ cz: Vložit text de: Text einfügen el: Εισαγωγή κειμένου en: Insert text es: Insertar texto it: Inserisci testo ru: Ð’Ñтавить текÑÑ‚ sk: VložiÅ¥ text sq: fute tekstin therion: Insert area bg: Вмъкни облаÑÑ‚ cz: Vložit oblast de: Fläche einfügen el: Εισαγωγή επιφάνειας en: Insert area es: Insertar área it: Inserisci area ru: Ð’Ñтавить облаÑть sk: VložiÅ¥ plochu sq: fute fushen therion: Delete bg: Изтрий cz: Smazat de: Lösche el: ΔιαγÏαφή en: Delete es: Borrar it: Rimuovi ru: Удалить sk: OdstrániÅ¥ sq: fshije therion: deleting bg: изтриване cz: mazání de: lösche el: διαγÏαφή en: deleting es: borrando it: rimuovendo ru: удаление sk: mazanie sq: duke fshire therion: moving command bg: премеÑтване на команда cz: pÅ™esun příkazu de: Verschiebebefehl el: εντολή μετακίνησης en: moving command es: desplazando comando it: comando di spostamento ru: перемещение команд sk: presun príkazu sq: komanda e levizjes therion: creating endscrap bg: Ñъздаване край на Ñкрапа cz: vytvoÅ™ení konce scrapu de: Erzeuge Skizzenende el: δημιουÏγία τέλους σκÏαπ (endscrap) en: creating endscrap es: creando línea final de croquis (endscrap) it: creazione endscrap ru: Ñоздание конца Ñкрапа sk: vytvorenie konca scrapu sq: duke kriju fundin e deponise therion: scrap changes bg: промÑна на Ñкрапа cz: zmÄ›na parametrů scrapu de: Skizzenänderung el: αλλαγές σκÏαπ en: scrap changes es: cambios del croquis (scrap) it: modifiche dello scrap ru: изменение Ñкрапа sk: zmena parametrov scrapu sq: ndryshimet ne deponi therion: creating scrap bg: Ñъздаване на Ñкрап cz: vytvoÅ™ení scrapu de: Erzeuge Skizze el: δημιουÏγία σκÏαπ en: creating scrap es: creando croquis (scrap) it: creazione scrap ru: Ñоздание Ñкрапа sk: vytvorenie scrapu sq: duke kriju deponin therion: creating text bg: Ñъздаване на текÑÑ‚ cz: vytvoÅ™ení textu de: Erzeuge Text el: δημιουÏγία δοκιμής en: creating text es: creando texto it: creazione testo ru: Ñоздание текÑта sk: vytvorenie textu sq: duke kriju tekstin therion: text changes bg: промÑна на текÑÑ‚ cz: zmÄ›na textu de: Textänderungen el: αλλαγές κειμένου en: text changes es: cambios de texto it: modifiche del testo ru: изменение текÑта sk: zmena textu sq: ndrimet e tekstit therion: end point insertion bg: Ñлагане на точка за край cz: konec vkládání bodů de: Endpunkt eingefügt el: εισαγωγή Ï„ÎµÎ»Î¹ÎºÎ¿Ï ÏƒÎ·Î¼ÎµÎ¯Î¿Ï… en: end point insertion es: final de inserción de punto it: inserimento punto finale ru: вÑтавка конечной точки sk: koniec vkladania bodov sq: perfundo futjet e pikave therion: select object bg: избор на обект cz: oznaÄ objekt de: Objekt auswählen el: επιλογή αντικειμένου it: seleziona oggetto ru: выбор объекта sk: oznaÄ objekt sq: selekto objektin therion: Insert bg: Вмъкни cz: Vložit de: Einfügen el: Εισαγωγή en: Insert es: Insertar it: Inserisci ru: Ð’Ñтавка sk: VložiÅ¥ sq: fute therion: insert point bg: вмъкни точка cz: vlož bod de: Punkt einfügen el: εισαγωγή σημείου it: inserisci punto ru: вÑтавка точки sk: vlož bod sq: fute piken therion: insert line point bg: вмъкни точка от Ð»Ð¸Ð½Ð¸Ñ cz: vlož bod kÅ™ivky de: Linienpunkt einfügen el: εισαγωγή σημείου γÏαμμής it: inserisci punto di linea ru: вÑтавка точки линии sk: vlož bod krivky sq: fute piken e rjeshtit therion: insert area border bg: вмъкни граница на облаÑÑ‚ cz: vlož hranici plochy de: Flächenrand einfügen el: εισαγωγή οÏίων επιφάνειας it: inserisci bordo dell'area ru: вÑтавка границы облаÑти sk: vlož okraj plochy sq: fute kufirin e fushes therion: Select bg: Избери cz: Vyber de: Auswählen el: Επιλογή en: Select es: Seleccionar it: Seleziona ru: Выбор sk: VybraÅ¥ sq: selekto therion: scale scrap bg: мащабиране на Ñкрап cz: měřítko scrapu de: Skizze skalieren el: αλλαγή κλίμακα σκÏαπ it: riscala lo scrap ru: маÑштабирование Ñкрапа sk: mierka scrapu sq: deponia e matjeve therion: insert sketch bg: вмъкване на Ñкица cz: vlož náÄrtek de: Skizze einfügen el: εισαγωγή σχεδίου it: inserisci disegno ru: вÑтавка фона sk: vlož náÄrtok sq: fute skicen therion: creating point bg: Ñъздаване на точка cz: vytvoÅ™ení bodu de: Punkt erzeugen el: δημιουÏγία σημείου en: creating point es: creando punto it: creazione punto ru: Ñоздание точки sk: vytvorenie bodu sq: duke kriju piken therion: area changes bg: изменение на облаÑтта cz: zmÄ›na parametrů oblasti de: Flächenänderungen el: αλλαγές επιφανειών en: area changes es: cambios de área it: modifiche di area ru: изменение облаÑти sk: zmena parametrov plochy sq: ndrimet e fushes therion: point changes bg: изменение на точка cz: zmÄ›na parametrů bodu de: Punktänderungen el: αλλαγές σημείων en: point changes es: cambios de punto it: modifiche di punto ru: изменение точки sk: zmena parametrov bodu sq: ndrimet e pikes therion: Scrap sketch not inserted. bg: Ðе е вмъкната Ñкица в Ñкрапа. cz: NáÄrtek nebyl vložen. de: Skizze nicht eingefügt. el: δεν εισήχθη σχέδιο σκÏαπ it: Disegno non inerito. ru: Фон Ñкрапа не вÑтавлен. sk: NáÄrtok nebol vložený. sq: skica e deponise nuk eshte futur therion: inserting scrap sketch bg: вмъкване на Ñкица в Ñкрапа cz: vkládám náÄrtek de: Füge Skizze ein el: εισαγωγή σχεδίου σκÏαπ it: inserimento disegno ru: вÑтавка фона Ñкрапа sk: vloženie náÄrtku sq: duke future skicen e deponise therion: deleting scrap sketch bg: изтриване на Ñкица от Ñкрапа cz: odstraňuji náÄrtek de: Lösche Skizze el: διαγÏαφή σχεδίου σκÏαπ it: rimozione disegno ru: удаление фона Ñкрапа sk: odstránenie náÄrtku sq: duke fshire skicen e deponise therion: toggle image visibility bg: превключване на видимоÑтта на изображение cz: pÅ™epnutí viditelnosti obrázku de: Bildsichtbarkeit umschalten el: αλλαγή οÏατότητας εικόνας en: toggle image visibility es: Cambiar visibilidad de la imagen it: cambia visibilità immagine ru: переключение видимоÑти Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: prepni viditeľnosÅ¥ obrázku sq: shikueshmeria e toggle-imazhit therion: grid - spacing %s bg: мрежа - Ñтъпка %s cz: mřížka - odstup %s de: Gitterweite - %s el: πλέγμα - μέγεθος %s en: grid - spacing %s es: anchura cuadrícula %s it: reticolato - passo %s ru: Ñетка - шаг %s sk: sieÅ¥ - rozostupy %s sq: %s hapesira e katroreve therion: station - %s bg: репер %s cz: měřiÄský bod - %s de: Messpunkt - %s el: σημείο χαÏτογÏάφησης - %s en: station - %s es: estación %s it: caposaldo - %s ru: пикет - %s sk: mÄ›raÄský bod - %s sq: stacioni - %s therion: New *.th2 file needs to be saved before inserting background image. Save it now? bg: ÐовиÑÑ‚ *.th2 Ñе нуждае от ÑъхранÑване преди да Ñе вмъкне фоново изображение. Да Ñе Запиши Ñега? cz: Nový *.th2 soubor musí být uložen pÅ™ed vložením podkladového obrázku. Uložit nyní? de: Neue *.th2-Datei muss gespeichert werden, bevor ein Hintergrundbild eingefügt werden kann. Jetzt speichern? el: Το νέο αÏχείο *.th2 Ï€Ïέπει να αποθηκευτεί Ï€Ïιν εισαχθεί εικόνα φόντου. Αποθήκευση τώÏα; en: New *.th2 file needs to be saved before inserting background image. Save it now? es: Hay que guardar el nuevo archivo .th2 antes de cargar una imagen de fondo. ¿Guardar ahora? it: Il nuovo file *.th2 deve essere salvato prima di inserire immagini di background. Salvala ora? ru: Ðовый *.th2 файл нуждаетÑÑ Ð² Ñохранении перед вÑтавкой фонового изображениÑ. ЗапиÑать ÑейчаÑ? sk: Pred vložením obrázku musíte nový *.th2 súbor uložiÅ¥. Chcete tak urobiÅ¥? sq: arkivi I ri *.th2 duhet te ruhet para se te futet imazhi I prapavise.Te ruhet tani? therion: inserting image bg: вмъкване на изображение cz: vkládám obrázek de: Bild einfügen el: εισαγωγή εικόνας en: inserting image es: insertando imagen it: inserimento immagine ru: вÑтавка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: vkladám obrázok sq: duke futur imazhin therion: removing image bg: махане на изображение cz: odstraňuji obrázek de: Bild entfernen el: διαγÏαφή εικόνας en: removing image es: eliminando imagen it: rimozione immagine ru: удаление Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: odstránenie obrázku sq: duke hequr imazhin therion: moving image bg: премеÑтване на изображение cz: pÅ™esunuji obrázek de: Bild verschieben el: μετακίνηση εικόνας en: moving image es: moviendo imagen it: spostamento immagine ru: перемещение Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: posun obrázku sq: duke levizur imazhin therion: gamma correction bg: ÐºÐ¾Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð° гамата cz: gamma korekce de: Gammakorrektur el: gamma correction en: gamma correction es: corección gamma it: gamma ru: ÐºÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð³Ð°Ð¼Ð¼Ñ‹ sk: gamma korekcia sq: korekcioni gamma therion: Insert point bg: Вмъкни точка cz: Vložit bod de: Punkt einfügen el: Εισαγωγή σημείου en: Insert point es: Insertar punto it: Inserisci punto ru: Ð’Ñтавить точку sk: VložiÅ¥ bod sq: fute piken therion: Delete point bg: Изтрий точка cz: Smazat bod de: Punkt löschen el: ΔιαγÏαφή σημείου en: Delete point es: Borrar punto it: Rimuovi ru: Удалить точку sk: OdstrániÅ¥ bod sq: fshije piken therion: Split line bg: Раздели Ð»Ð¸Ð½Ð¸Ñ cz: RozdÄ›lit kÅ™ivku de: Linie teilen el: ΔιαίÏεση γÏαμμής en: Split line es: Cortar línea it: Dividi ru: Разделить линию sk: RozdeliÅ¥ krivku sq: ndaje rjeshtin-vijen therion: deleting line point bg: Изтрий точка от линиÑта cz: mazaní bodu na kÅ™ivce de: Linienpunkt löschen el: διαγÏαφή σημείου γÏαμμής en: deleting line point es: borrando punto de línea it: rimozione punto di linea ru: Удалить точку линии sk: mazanie bodu na Äiare sq: duke fshire piken e rjeshtit-vijes therion: inserting area border bg: Вмъкване на граница на облаÑÑ‚ cz: vložení hranice oblasti de: Flächenrand einfügen el: εισαγωγή οÏίου επιφάνειας en: inserting area border es: insertando límite de área it: inserimento bordo area ru: вÑтавка границы облаÑти sk: vloženie okraja plochy sq: duke future kufirin e fushes therion: deleting area border bg: изтриване на ганица на облаÑÑ‚ cz: mazaní hranice oblasti de: Flächenrand löschen el: ÏŒÏιο επιφάνειας en: deleting area border es: borrando límite de área it: rimozione bordo area ru: удаление границы облаÑти sk: mazanie okraja plochy sq: duke fshire kufirin e fushes therion: creating area bg: Ñъздаване на облаÑÑ‚ cz: vytvoÅ™ení oblasti de: Fläche erzeugen el: δημιουÏγία επιφάνειας en: creating area es: creando área it: creazione area ru: Ñоздание облаÑти sk: vytvorenie plochy sq: duke kriju fushen therion: creating line bg: Ñъздаване на Ð»Ð¸Ð½Ð¸Ñ cz: vytvoÅ™ení kÅ™ivky de: Linie erzeugen el: δημιουÏγία γÏαμμής en: creating line es: creando línea it: creazione linea ru: Ñоздание линии sk: vytvorenie krivky sq: duke kriju vijen apo rrjeshtin therion: line changes bg: изменение на Ð»Ð¸Ð½Ð¸Ñ cz: zmÄ›na parametrů kÅ™ivky de: Linienänderung el: αλλαγές γÏαμμής en: line changes es: cambios de línea it: modifiche di linea ru: изменение линии sk: zmena parametrov krivky sq: ndrimet e vijes therion: line closing bg: затварÑне на Ð»Ð¸Ð½Ð¸Ñ cz: uzavÅ™ení kÅ™ivky de: Linie schließen el: κλείσιμο γÏαμμής en: line closing es: cerrando línea it: chiusura linea ru: замыкание линии sk: uzavretie krivky sq: mbyllja e vijes-rjeshtit therion: line opening bg: отварÑне (разделÑне) на Ð»Ð¸Ð½Ð¸Ñ cz: otevÅ™ení kÅ™ivky de: Linie öffnen el: άνοιγμα γÏαμμής en: line opening es: abriendo línea it: apertura linea ru: размыкание линии sk: otvorenie krivky sq: hapja e vijes-rjeshtit therion: inserting line point bg: вмъкване на точка в Ð»Ð¸Ð½Ð¸Ñ cz: vložení bodu kÅ™ivky de: Linienpunkt einfügen el: εισαγωγή σημείο γÏαμμής en: inserting line point es: insertando punto en la línea it: inserimento punto di linea ru: вÑтавка точки в линию sk: vloženie bodu krivky sq: duke futur piken e vijes therion: line ending bg: завършване на Ð»Ð¸Ð½Ð¸Ñ cz: ukonÄení kÅ™ivky de: Linienende el: τέλος γÏαμμής en: line ending es: finalizando línea it: fine linea ru: завершение линии sk: ukonÄenie krivky sq: rjeshti ne perfundim therion: moving control point bg: премеÑтване на управлÑваща точка cz: posun řídícího bodu de: Verschiebe Kontrollpunkt el: μεταβαλλόμενο σημείο ελέγχου en: moving control point es: moviendo punto de control it: spostamento punto di controllo ru: перемещение управлÑющей точки sk: posun kontrolného bodu sq: duke levize piken e kontrollit therion: split line bg: разделÑне на Ð»Ð¸Ð½Ð¸Ñ cz: rozdÄ›lit kÅ™ivku de: Linie teilen el: διαίÏεση γÏαμμής en: split line es: cortar línea it: dividi la linea ru: разделение линии sk: rozdelenie Äiary sq: ndarja e pikes-rjeshtit therion: loading text editor ... bg: зареждане на текÑÑ‚Ð¾Ð²Ð¸Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€ ... cz: nahrávám text editor ... de: Lade Texteditor ... el: Άνοιγμα επεξεÏγαστή κειμένου... en: loading text editor ... es: editor de texto ... it: editor di testo ... ru: загрузка текÑтового редактора ... sk: naÄítavam textový editor sq: duke lexuar editorin e tekstit… therion: Text Editor bg: ТекÑтов редактор cz: Text editor de: Texteditor el: ΕπεξεÏγαστής κειμένου en: Text Editor es: Editor de texto it: Editor di testo ru: ТекÑтовой редактор sk: Textový editor sq: editori I tekstit therion: Files bg: Файлове cz: Soubory de: Dateien el: ΑÏχεία en: Files es: Archivos it: File ru: Файлы sk: Súbory sq: fajlat-arkivi therion: Data table bg: Таблица Ñ Ð´Ð°Ð½Ð½Ð¸ cz: Datová tabulka de: Datentabelle el: Πίνακας δεδομένων en: Data table es: Tabla de datos it: Tabella dei dati ru: Таблица данных sk: Dátová tabuľka sq: tabela e te dhenave therion: Search & Replace bg: ТърÑене и замÑна cz: Najít & Nahradit de: Suchen & ersetzen el: Αναζήτηση και αντικατάσταση en: Search & Replace es: Buscar y cambiar it: Cerca e sostituisci ru: ПоиÑк и Замена sk: Nájdi a NahraÄ sq: kerko dhe ndero vendin therion: Switch open files. bg: Превключи отворениÑÑ‚ файл cz: PÅ™epínaÄ otevÅ™ených souborů. de: Geöffnete Dateien wechseln. el: Η λίστα δείχνει τα ανοικτά αÏχεία. Επιλέξετε αυτό που σας ενδιαφέÏει. en: This list shows open files. Click on the one you are interested. es: Esta lista muestra los archivos abiertos. Haz clic en el que te interese. it: Cambia tra i file aperti. ru: ПоменÑть открытый файл. sk: PrepínaÄ medzi otvorenými súbormi. sq: kjo liste tregon fajlat e hapura. Kliko ne ate te cilen je I interesuar. therion: Encoding bg: Кодировка cz: Kódování de: Zeichenkodierung el: Κωδικοσελίδα en: Encoding es: Codificación it: Encoding ru: Кодировка sk: Kódovanie sq: de-kodimi therion: Change to bg: Промени на cz: ZmÄ›nit na de: Ändern in el: Αλλαγή σε en: Change to es: Cambiar a it: Cambia a ru: Изменить на sk: ZmeniÅ¥ na sq: ndero ne therion: To set file encoding, type encoding name and press button. bg: За задавне на кодираовката на файла, въведете името на кодировката и натиÑнете бутона <ПромÑна> cz: Nastavení kódování - vyberte kódování a stisknÄ›te tlaÄítko . de: Um Zeichenkodierung zu ändern, gebe den Namen der Kodierung ein und drücke den Knopf. el: Για ÏÏθμιση κωδικοσελίδας, εισάγετε όνομα και πατήστε το κουμπί <Αλλαγή> en: To set file encoding, type encoding name and press button. es: Para ajustar la codificación, escoje la que quieras y pulsa . it: Per impostare l'encoding, scrivi il nome dell'encoding e premi il bottone ru: Ð”Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ файла введите Ð¸Ð¼Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ и нажмите кнопку <Изменить>. sk: Na nastavenie kódovania, vložte identifikátor kódovania a stlaÄte . sq: per te vendos fajlin per dekodim, shtype emrin per dekodim dhe kliko butonin therion: Scan data format bg: Определи формата на данните cz: Skenovat formát dat de: Datenformat einlesen el: Έλεγχος μοÏφής δεδομένων en: Scan data format es: Escanear formato de datos it: Imposta formato dati ru: Определить формат данных sk: Nájdi formát dát sq: skano formatin e shenimeve therion: Scan data format and rebuild centerline data insertion tool. bg: Ðвтоматично определи формата на данните и преуÑтрой полетата за въвеждане. cz: PÅ™eÄte formát dat v souboru a upraví pole pro vkládání měření. de: Datenformat einlesen und Messdateneditor anpassen. el: Ελέγχει την σειÏά των δεδομένων και ξανασυντάσσει αυτόματα τα textbox για εισαγωγή δεδομένων. en: Scans data order and rebuilds data insertion textboxes accordingly. es: Ajusta las casillas al orden en que has tomado tus datos. it: Imposta il formato dati e ricostruisci la tabella inserimento dati. ru: ÐвтоматичеÑки определить формат данных и переÑтроить Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°. sk: NaÄíta formát dát z predchádzajúcich riadkov a prísluÅ¡ne zmení panel na vkladanie dát. sq: skanon formatin e shenimeve dhe rinderton tekst-katroret per futjen e shenimeve net e njejten kohe therion: Enter station names bg: Въвеждане на името на репераната точка cz: Zadávat názvy bodů de: Messpunktnamen eingeben el: Εισαγωγή ονομάτων σημείων χαÏτογÏάφησης en: Enter station names es: Nombrar estaciones it: Scrivi nomi capisaldi ru: Ввод номера Ñледующего пикета sk: Zadávanie názvov bodov sq: futi emrat e stacioneve therion: Check if you want to insert station names for each shot. bg: Сложете отбелÑзка, ако иÑкате Ñледващите имена на репери да Ñе въвеждат автоматично. cz: ZaÅ¡krtnÄ›te pokud chcete zadávat název pro každý měřiÄský bod. de: Ankreuzen, wenn du Messpunktnamen für jede Strecke eingeben willst. el: Επιλέξτε για εισαγωγή των ονομάτων των σημείων χαÏτογÏάφησης για το κάθε διάνυσμα. en: Check if you want to insert station names for each shot. es: Marcar si se quiere dar un nombre a cada tirada topo. it: Attiva per inserire i nomi dei capisaldi per ogni tratta. ru: УÑтановите отметку, еÑли хотите, чтобы проиÑходил автоматичеÑкий ввод номера Ñледующего пикета. sk: ZaÅ¡krtnite pokiaľ chcete vkladaÅ¥ aj mená bodov pre každú zámeru. sq: kontrollo nese deshiron ti fusesh emrat e stacioneve per secilin foto therion: Auto format selection bg: Ðвтоматичен избор на формат. cz: Auto formátování výbÄ›ru de: Auswahl formatieren el: Αυτόματη μοÏφοποίηση επιλογής en: Auto format selection es: Autoformatear selección it: Selezione formato automatico. ru: ПереÑтроить выделенные данные sk: Naformátuj výber sq: zgjedhja automatike e formatit therion: Format selection to given table. bg: Избор на формат за определена таблица cz: Naformátuje výbÄ›r do tabulky. de: Formatiere Auswahl zur gegebenen Tabelle. el: ΜοÏφοποίηση επιλογής σÏμφωνα με το δεδομένο πίνακα. en: Format selection to given table. es: Formatea la seleccion (ajusta tabuladores, etc). it: Imposta selezione alla tabella specificata. ru: ПривеÑти выделенные данные к заданному формату. sk: Naformátuje výber do dátovej tabuľky. sq: zgjedhja e formatit per tabelen e dhene therion: search bg: търÑене cz: hledat de: Suche el: αναζήτηση en: search es: buscar it: cerca ru: поиÑк sk: hľadaj sq: kerko therion: Search expression. bg: Израз за търÑене cz: Hledaný výraz. de: Suche Muster. el: ΠληκτÏολογήσετε τις λέξεις για αναζήτηση. en: Enter word(s) to search for. es: Introducir palabra(s) a buscar. it: Testo da cercare. ru: Выражение поиÑка. sk: Hľadaný výraz. sq: shkruaje fjalen per tu kerkuar therion: replace bg: замÑна cz: nahradit de: Ersetze el: Αντικατάσταση en: replace es: cambiar it: sostituisci ru: замена sk: nahradiÅ¥ sq: ndero vendin therion: Check whether to replace found expression. bg: Сложете отбелÑзка, ако иÑкате да Ñе извърши замÑна. cz: ZaÅ¡krtnÄ›te pokud chcete nahradit nalezené výrazy. el: Επιλέξτε για αντικατάσταση της ευÏεθείσας πεÏίπτωσης. en: Check whether to replace found expression. es: Marcar para cambiar los lo encontrado por lo que se escriba aquí. it: Attiva per sostituire il testo trovato. ru: УÑтановите отметку, еÑли хотите произвеÑти замену. sk: ZaÅ¡krtnúť pokiaľ sa má nájdený výraz nahradiÅ¥ iným. sq: kontrollo a duhet te ndrohet fjalia e gjetur therion: Replace expression. bg: Израз за замÑна. cz: ŘetÄ›zec, kterým bude výraz nahrazen. de: Ersetze Muster. el: Τα αποτελέσματα αναζήτησης θα αντικατασταθοÏν από το συγκεκÏιμένο κείμενο. en: Search results will be replaced by the string entered here. es: Los resultados de la búsqueda serán cambiados por lo que escribas aquí. it: Sostituisci testo. ru: Выражение замены. sk: Výraz na nahradenie. sq: rezultatet e gjetura do te ndrohen nga fjalia e future ketu therion: case sensitive search bg: да Ñе отчита региÑтъра cz: rozliÅ¡ovat velikost písmen de: Groß- und Kleinschreibung bei Suche berücksichtigen el: case sensitive αναζήτηση en: case sensitive search es: sensible a mayúsculas it: ricerca case-sensitive ru: учитывать региÑтр sk: rozliÅ¡ovaÅ¥ malé a veľké sq: kerkimi -rast sensitiv therion: Check if search should be case sensitive. bg: Сложете отбелÑзка за да Ñе извърши търÑене Ñ Ð¾Ñ‚Ñ‡Ð¸Ñ‚Ð°Ð½Ðµ на региÑтъра. cz: Vyhledávání s rozliÅ¡ením velikosti písmen. de: Ankreuzen, wenn Suche Groß- und Kleinschreibung berücksichtigen soll. el: Επιλέξετε αν η αναζήτηση Ï€Ïέπει να είναι case sensitive. en: Check if search should be case sensitive. es: Marcar para que la búsqueda distinga entre mayúsculas y minúsculas. it: Attiva se la ricerca deve essere case-sensitive. ru: УÑтановите отметку, чтобы поиÑк проиÑходил Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра. sk: ZaÅ¡krtnite pokiaľ pri hľadaní chcete rozliÅ¡ovaÅ¥ malé a veľké písmená. sq: kontrollo nese kerkimi do te jete rast-sensitiv therion: regular expressions bg: регулÑрни изрази cz: regulární výrazy de: Regulärer Ausdruck. el: κανονικό συντακτικό (χÏήση Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï Î±Î½Î±Î¶Î®Ï„Î·ÏƒÎ·Ï‚) en: regular expressions es: patrón regular it: esperssioni regolari ru: регулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ sk: regulárny výraz sq: shprehje te rregullta therion: Check whether to evaluate search and replace as regular expressions. bg: Сложете отбелÑзка за да Ñе обработват регулÑрните изрази при търÑене и замÑна. cz: ZaÅ¡krtnÄ›te pokud chcete vyhledávat nebo nahrazovat pomocí regulárních výrazů. de: Ankreuzen, ob Suchen und Ersetzen regulären Ausdruck nutzen soll. el: Επιλέξτε για αναζήτηση με κανονικό συντακτικό(χÏήση Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï Î±Î½Î±Î¶Î®Ï„Î·ÏƒÎ·Ï‚) en: Check whether to search using regular expressions. es: Búsqueda usando comodines. it: Attiva per ricerca e sostituzione con espressioni regolari. ru: УÑтановите отметку, чтобы обрабатывать регулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ поиÑке и замене. sk: ZaÅ¡krtnite ak sa má hľadanie a nahradenie vykonávaÅ¥ v móde regulárnych výrazov. sq: kontrollo a do te kerkosh duke perdor shprehje te zakonta-rregullta therion: search selection only bg: търÑене Ñамо в избраното cz: pouze ve vybraném textu de: Nur in Auwahl suchen el: αναζήτηση μόνο σε επιλογή en: search selection only es: selección solo it: cerca solo nella selezione ru: иÑкать в выделенном sk: iba vo vybratom texte sq: kerko vetem selekcionet therion: Check whether to do search only in selected text. bg: Сложете отбелÑзка за да ае търÑи Ñамо в избраниÑÑ‚ текÑÑ‚. cz: ZaÅ¡krtnÄ›te pokud chcete vyhledávat pouze ve vybraném textu. de: Ankreuzen, wenn nur im ausgewählten Text gesucht werden soll. el: Επιλέξετε για να γίνει η αναζήτηση μόνο στο επιλεγμένο κείμενο. en: Check whether to do search only in selected text. es: Marcar para buscar solo dentro del texto seleccionado. it: Attiva per cercare solo nel testo selezionato. ru: УÑтановите отметку, чтобы иÑкать только в выделенном текÑте. sk: ZaÅ¡krtnite pokiaľ hladanie má prebehnúť len v oznaÄenom texte. sq: kontrollo a do te perdoresh kerkimin vetem ne tekstin e selekcionuar therion: First bg: Първи cz: První de: Erstes el: ΠÏώτο en: First es: Buscar it: Primo ru: Первый sk: Prvý sq: e para therion: Search or replace first expression in the file. bg: ТърÑене или замÑна на първиÑÑ‚ израз във файла. cz: Najde nebo nahradí první výraz v souboru. de: Suche oder ersetze erstes Muster in der Datei. el: Αναζήτηση ή αντικατάσταση Ï€Ïώτης πεÏίπτωσης στο αÏχείο. en: Search or replace first expression in the file. es: Buscar o reemplazar el primer resultado. it: Cerca o sostituisci la prima istanza del testo nel file. ru: ПоиÑк или замена первого Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð² файле. sk: Nájte poprípade nahradí prvý výskyt hľadaného výrazu v súbore. sq: kerko ose ndro shprehjet e para ne fajlla therion: Search or replace next expression after the cursor in the file. bg: ТърÑене или замÑна на ÑледващиÑÑ‚ израз Ñлед курÑора във файла. cz: Najde nebo nahradí následující výraz v souboru. de: Suche oder ersetze nächstes Muster nach dem Cursor in der Datei. el: Αναζήτηση ή αντικατάσταση επόμενης πεÏίπτωσης μετά τον κοÏÏσοÏα. en: Search or replace next expression after the cursor in the file. es: Buscar o reemplazar el siguiente resultado. it: Cerca o sostituisci la prossima istanza del testo nel file dopo il cursore. ru: ПоиÑк или замена Ñледующего поÑле курÑора Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð² файле. sk: Nájdi alebo nahraÄ nasledujúci výraz v súbore. sq: kerko ose ndroje shprehjen e ardhshme pas kursorit ne fajll therion: All bg: Ð’Ñичко cz: VÅ¡e de: Alles el: Όλα en: All es: Todo it: Tutti ru: Ð’Ñе sk: VÅ¡etko sq: te gjithat therion: Search or replace all expressions in the file. bg: ТърÑене или замÑна на вÑички изрази във файла. cz: Najde nebo nahradí vÅ¡echny výrazy v souboru. de: Suche oder ersetze alle Muster in der Datei. el: Αναζήτηση ή αντικατάσταση όλων των πεÏιπτώσεων στο αÏχείο. en: Search or replace all expressions in the file. es: Buscar o reemplazar todos los resultados. it: Cerca o sostituisci tuute le frasi nel file. ru: ПоиÑк или замена вÑех вхождений в файле. sk: Nájdi alebo nahraÄ vÅ¡etky výrazy v súbore. sq: kerko ose ndroji te gjitha shprehjet ne fajlla therion: Clear bg: ИзчиÑване cz: ZruÅ¡it de: Löschen el: ΑναίÏεση en: Clear es: Deseleccionar it: Cancella ru: ОчиÑтка sk: VyÄisti sq: e paster therion: Clear all highlights in the file. bg: ИзчиÑтване на вÑички оÑветени текÑтови учаÑтъци във файла. cz: Zruší zvýraznÄ›ní nalezených výrazů v souboru. de: Lösche alle Hervorhebungen in der Datei. el: ΑναίÏεση όλων των τονισθέντων. en: Clear all highlights in the file. es: Deseleccionar todo lo seleccionado. it: Cancella tutte le evidenziazioni nel file. ru: ОчиÑтка вÑех подÑвеченных учаÑтков текÑта. sk: Zruší zvýraznenie nájdených výrazov v súbore. sq: fshij te gjitha selekcionimet apo hijezimet ne fajlla therion: Opening %s ... bg: ОтварÑне %s ... cz: Otevírám %s ... de: Öffne %s ... el: Άνοιγμα του %s ... en: Opening %s ... es: Abriendo %s ... it: Apertura %s ... ru: Открытие %s ... sk: Oteváram %s ... sq: duke hap %s … therion: File %s is not saved. Save it now? bg: Файлът %s не е Ñъхранен. Да го ÑÑŠÑ…Ñ€Ð°Ð½Ñ Ñега? cz: Soubor %s není uložen. Uložit nyní? de: datei %s nicht gespeichert. Speichere jetzt? el: Το αÏχείο %s δεν έχει αποθηκευτεί. Αποθήκευση τώÏα; en: File %s is not saved. Save it now? es: El archivo %s no ha sido guardado. ¿Guardar ahora? it: Il file %s non è salvato. Salva ora? ru: Файл %s не Ñохранен. Сохранить его ÑейчаÑ? sk: Súbor %s nie je uložený. UložiÅ¥ teraz? sq: fajlli %s nuk eshte I ruajtur. Ta ruajm tani? therion: File %s was modified outside xtherion. Save it anyway? bg: Файлът %s е изменен от друго приложение. Да го ÑÑŠÑ…Ñ€Ð°Ð½Ñ Ð²ÑŠÐ¿Ñ€ÐµÐºÐ¸ това? cz: Soubor %s byl modifikován mimo xtherion. PÅ™esto uložit? de: Datei %s wurde außerhalb von Xtherion geändert. Trotzdem speichern? el: Το αÏχείο %s Ï„Ïοποποιήθηκε εκτός xtherion. Îα αποθηκευτεί όπως και να'ναι; en: File %s was modified outside xtherion. Save it anyway? es: El archivo %s ha sido modificado fuera de xtherion. ¿Guardar de todos modos? it: Il file %s è stato modificato fuori da xtherion. Salva comunque? ru: Файл %s был изменен другим приложением. Сохранить не ÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто? sk: Súbor %s bol modifikovaný mimo programu. UložiÅ¥ aj tak? sq: fajlli %s eshte ndryshuar jashte x therion-it. Ta ruajm sido qe te jete? therion: Saving %s ... bg: Съхранение %s ... cz: Ukládám %s ... de: Speichere %s ... el: Αποθήκευση του %s ... en: Saving %s ... es: Guardando %s ... it: Salvataggio %s ... ru: Сохранение %s ... sk: Ukladám %s ... sq: duke ruajtur %s. . . therion: New bg: Ðов cz: Nový de: Neu el: Îέο en: New es: Nuevo it: Nuovo ru: Ðовый sk: Nový sq: e re therion: Open bg: Отвори cz: Otevřít... de: Öffnen el: Άνοιγμα en: Open es: Abrir it: Apri ru: Открыть sk: OtvoriÅ¥ sq: hape therion: Save bg: Запиши cz: Uložit de: Speichern el: Αποθήκευση en: Save es: Guardar it: Salva ru: Сохранить sk: UložiÅ¥ sq: ruaje therion: Save as bg: Запиши като cz: Uložit jako... de: Speichern als el: Αποθήκευση ως... en: Save as es: Guardar como it: Salva come ru: Сохранить как sk: UložiÅ¥ ako sq: ruaje si therion: Save all bg: Запиши вÑички cz: Uložit vÅ¡e de: Speichere alles el: Αποθήκευση όλων en: Save all es: Guardar todo it: Salva tutti ru: Сохранить вÑÑ‘ sk: UložiÅ¥ vÅ¡etko sq: ruaji te gjitha therion: Auto save bg: ÐвтоÑъхранение cz: Automaticky ukládat de: Automatisch speichern el: Αυτόματη αποθήκευση en: Auto save es: Autoguardar it: Auto salva ru: ÐвтоÑохранение sk: UkladaÅ¥ automaticky sq: ruajtja automatike therion: Import bg: ВнаÑÑне cz: Import de: Importieren el: Εισαγωγή... it: Importa ru: Импорт sk: Import sq: importi therion: Next bg: Следващ cz: Následující de: Nächstes el: Επόμενο en: Next es: Siguiente it: Prossima ru: Следующий sk: Nasledujúci sq: tjetra therion: Previous bg: Предишен cz: PÅ™edchozí de: Vorheriges el: ΠÏοηγοÏμενο en: Previous es: Anterior it: Precedente ru: Предыдущий sk: Predchádzajúci sq: e perparmja therion: Edit bg: Редактиране cz: Editovat de: Bearbeiten el: ΔιόÏθωση en: Edit es: Editar it: Edita ru: Редактировать sk: UpraviÅ¥ sq: permireso therion: Undo bg: ОтмÑна cz: ZpÄ›t de: Rückgängig el: ΑναίÏεση en: Undo es: Deshacer it: Indietro ru: Отменить sk: Späť sq: prishe-undo therion: Redo bg: ВъзÑтановÑване cz: Opakovat de: Wiederholen el: Επανάληψη en: Redo es: Rehacer it: Rifai ru: Вернуть sk: OpakovaÅ¥ sq: beje prape-redo therion: Cut bg: Изрежи cz: Vyjmout de: Ausschneiden el: Αποκοπή en: Cut es: Cortar it: Taglia ru: Вырезать sk: Vystrihnúť sq: preje therion: Copy bg: Копирай cz: Kopírovat de: Kopieren el: ΑντιγÏαφή en: Copy es: Copiar it: Copia ru: Копировать sk: KopírovaÅ¥ sq: kopjo therion: Paste bg: Вмъкни cz: Vložit de: Einfügen el: Επικόλληση en: Paste es: Pegar it: Incolla ru: Ð’Ñтавить sk: VložiÅ¥ sq: vendose-paste therion: Select all bg: Избери вÑичко cz: Vybrat vÅ¡e de: Alles auswählen el: Επιλογή όλων en: Select all es: Seleccionar todo it: Seleziona tutto ru: Выделить вÑÑ‘ sk: Vyber vÅ¡etko sq: zghedhi-selekciono te gjitha therion: Auto indent bg: Ðвтоматичен отÑтъп cz: Automaticky odsazovat de: Automatisch einrücken el: Αυτόματη παÏαγÏαφοποίηση en: Auto indent es: Autoindentar it: Indentazione automatica ru: ÐвтоотÑтуп sk: Automatické odsadenie sq: indenti automatik therion: Processing line %s ... bg: Обработване на ред %s ... cz: Zpracovávám řádek %s ... de: Verarbeite Zeile %s ... el: ΕπεξεÏγασία γÏαμμής %s ... en: Processing line %s ... es: Procesando línea %s ... it: Elaborazione linea %s ... ru: Обработка Ñтроки %s ... sk: Spracúvam riadok %s ... sq: rrjeshti %s ne proces… therion: Text editor is not active. To activate it, open existing file or create new one. bg: ТекÑтовиÑÑ‚ редактор не е активен. За активиране отворете ÑъщеÑтвуващ файл или Ñъздайте нов. cz: Textový editor není aktivní. Pro jeho aktivaci otevÅ™ete existující soubor nebo vytvoÅ™te nový. de: Texteditor ist nicht aktiv. Um ihn zu aktivieren, öffne eine existierende Datei oder lege eine neue an. el: Ο επεξεÏγαστής κειμένου δεν είναι ενεÏγός. Για να τον ενεÏγοποιήσετε, ανοίξτε αÏχείο, ή δημιουÏγήστε νέο. en: Text editor is not active. To activate it, open existing file or create new one. es: El editor de texto está inactivo. Para activarlo, abre un archivo existente o crea uno nuevo. it: L'editor di testo non è attivo. Per attivarlo apri un file o creane uno. ru: ТекÑтовый редактор неактивен. Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ откройте ÑущеÑтвующий файл или Ñоздайте новый. sk: Textový editor nie je aktívny. Otvorte existujúci súbor alebo vytvorte nový. sq: editori I tekstit nuk eshte aktiv. Qe ta aktivizosh, hape fajllin egzistues ose krijo nje tjeter. therion: Control... bg: Контрол ... cz: Ovládání... de: Kontrollfeld... el: Έλεγχος... en: Control... es: Control it: Controlli ... ru: Управление... sk: Ovládanie... sq: kontrolli. . . therion: BAC calculator... bg: Калкулатор на алкохол ... cz: Alkohol tester... de: Blutalkoholrechner el: Αλκοτέστ... en: BAC calculator... es: Borrachímetro it: Calcolatore BAC ... ru: КалькулÑтор алкоголÑ... sk: Alkohol tester... sq: matesi I alkoolit-BAC therion: Calibrate bitmap... bg: Калибриране на изображение ... de: Bild kalibrieren... it: Mappa georeferenziata... therion: About... bg: За програмата ... cz: O programu... de: Über... el: Σχετικά... en: About... es: Acerca de... it: Versione ... ru: О программе... sk: O programe... sq: per programin… therion: Search bg: ТърÑене cz: Hledat de: Suche el: Αναζήτηση en: Search es: Buscar it: Cerca ru: ПоиÑк sk: HľadaÅ¥ sq: kerko therion: Close bg: Затвори cz: Zavřít de: Schließen el: Κλείσιμο en: Close es: Cerrar it: Chiudi ru: Закрыть sk: ZavrieÅ¥ sq: mbyll therion: theme all-symbols bg: вÑички Ñимволи cz: vÅ¡echny symboly de: Alle Zeichen el: όλα it: tutti ru: вÑе sk: vÅ¡etky symboly sq: tematizo te gjitha simbolet-shenjat therion: New file bg: Ðов файл de: Neue Datei el: Îέο αÏχείο it: Nuovo sk: Nový súbor sq: arkivi-fajlli I ri therion: Open file bg: Отвори файл de: Datei öffnen el: Άνοιγμα it: Apri sk: OtvoriÅ¥ súbor sq: hape fajllin therion: Save file bg: Запиши файл de: Datei speichern el: Αποθήκευση it: Salva sk: UložiÅ¥ súbor sq: ruaje fajllin therion: Save file as bg: Запиши файл като de: Datei speichern als el: Αποθήκευση ως it: Salva come sk: UložiÅ¥ súbor ako sq: ruaje fajllin si therion: Close file bg: Затвори файл de: Datei schließen el: Κλείσιμο αÏχείου it: Chiudi sk: ZatvoriÅ¥ súbor sq: mbylle fajllin therion: Switch to text editor bg: Превключи на текÑтов редактор de: Zum Texteditor wechseln el: Μετάβαση σε επεξεÏγαστή κειμένου it: Editor di testi sk: Prepnúť na textový editor sq: kalo tek editori i tekstit therion: Switch to map editor bg: Превключи на редактор на карти de: Zum Karteneditor wechseln el: Μετάβαση σε επεξεÏγαστή σχεδίου it: Editor di mappe sk: Prepnúť na mapový editor sq: kalo tek editori I hartes therion: Switch to compiler bg: Превключи на компилатор de: Zum Compiler wechseln el: Μετάβαση σε συντάκτη it: Compilatore sk: Prepnúť na kompilátor sq: kalo tek kompilatori therion: Compile bg: Компилирай cz: Kompilovat de: Compilieren el: ΣÏνταξη en: Compile es: Compilar it: Compila ru: Компилировать sk: KompilovaÅ¥ sq: kompilo therion: Switch to select mode bg: Превключи на режим 'Избиране' de: In Auswahlmodus wechseln el: Μετάβαση σε λειτουÏγία επιλογής it: Modalità di selezione sk: Prepnúť do módu na výber objektu sq: kalo tek moduli per selekcionim therion: Select next scrap bg: Избери ÑледващиÑÑ‚ Ñкрап de: Nächste Skizze auswählen el: Επιλογή επόμενου σκÏαπ it: Seleziona il prossimo scrap sk: Vyber nasledujúci scrap sq: zgjedhe deponin e ardhshme therion: Select next area bg: Избери Ñледващата облаÑÑ‚ de: Nächste Fläche auswählen el: Επιλογή επόμενης επιφάνειας it: Seleziona la prossima area sk: Vyber nasledujúcu plochu sq: zgjedhe-selekto fushen e ardhshme therion: Zoom in bg: Приближи de: Vergrößern el: Μεγέθυνση it: Zoom in sk: ZväÄÅ¡iÅ¥ sq: zmadho therion: Zoom out bg: Отдалечи de: Verkleinern el: ΣμίκÏυνση it: Zoom out sk: ZmenÅ¡iÅ¥ sq: zvogelo therion: Insert new scrap bg: Вмъкни нов Ñкрап de: Neue Skizze einfügen el: Εισαγωγή νέου σκÏαπ it: Inserisci un nuovo scrap sk: VložiÅ¥ nový scrap sq: fute deponin e re therion: Insert new point bg: Вмъкни нова точка de: Neuen Punkt einfügen el: Εισαγωγή νέου σημείου it: Inserisci un nuovo punto sk: VložiÅ¥ nový bod sq: fute piken e re therion: Insert new line bg: Вмъкни нова Ð»Ð¸Ð½Ð¸Ñ de: Neue Linie einfügen el: Εισαγωγή νέας γÏαμμής it: Inserisci una nuova linea sk: VložiÅ¥ novú krivku sq: fute rrjeshtin e ri therion: Insert new area bg: Вмъкни нова облаÑÑ‚ de: Neue Fläche einfügen el: Εισαγωγή νέας επιφάνειας it: Inserisci una nuova area sk: VložiÅ¥ novú plochu sq: fute fushen e re therion: Delete selected object bg: Изтрий избраниÑÑ‚ обект de: Ausgewähltes Objekt löschen el: διαγÏαφή επιλεγμένου it: Rimuovi l'oggetto selezionato sk: Zmaž oznaÄené objekty sq: fshije objektin e selektuar therion: theme basic-symbols bg: оÑновни Ñимволи cz: základní symboly de: Grundsymbole el: βασικά σÏμβολα it: base ru: оÑновные sk: základné symboly sq: tema simbolet-baze therion: theme passage-fills bg: релеф на галериÑта cz: výplň de: Gangfüllungen el: γέμισμα στοών it: riempimenti ru: рельеф хода sk: výplň sq: tema mbushjet e kalimeve therion: theme speleothems bg: Ñпелеоформи cz: výzdoba de: Sinter el: σπηλαιοθέματα it: speleotemi ru: Ñпелео-формы sk: výzdoba sq: speleo-tema therion: theme equipement bg: екипиране cz: vystrojení de: Ausrüstung el: εξοπλισμός it: armo ru: оборудование sk: vystrojenie sq: tema pajisjet therion/xtherion/lang/Makefile0000664000175000017500000000007110625665302015472 0ustar useruserall: perl process.pl update: perl process.pl update therion/xtherion/lang/process.pl0000775000175000017500000001543310720537200016047 0ustar useruser#!/usr/bin/perl ## usage: ## ./process.pl - generate .tcl sources from xtexts.txt ## ./process.pl update - find new strings to translate and load all ## xtexts_xy.txt into xtexts.txt ## ./process.pl export[-empty] xy - export xtexts_xy.txt with texts ## for translation. If export-empty is used, only untranslated strings ## are exported @trans_sources = ( "../app.tcl", "../bac.tcl", "../cp.tcl", "../cp_procs.tcl", "../ctrl.tcl", "../me.tcl", "../me_cmds.tcl", "../me_imgs.tcl", "../me_cmds2.tcl", "../te.tcl", "../help.tcl", "../init.tcl", "../tools.tcl", "../global.tcl", ); sub read_lang_file { # nacita subor do hashu a vrati na neho referenciu my $fn = shift; my $lcode = shift; my $src = shift; open(INP,"$fn") || die("error: can't open $fn for input\n"); if (defined($lcode)) { $lcode = check_language($lcode); } else { $lcode = ""; } my %res; if (defined($src)) { %res = %{$src}; } else { %res = (); } my $itm = ""; my $lnum = 0; my $cmnt = ""; while ($ln = ) { $lnum++; # print "LINE: $ln"; if ($ln =~ /^\s*(\#.*)/) { $cmnt .= "$1\n"; # print "COMMENT\n"; next; } elsif ($ln =~ /^\s*therion\:\s*(.*\S)\s*$/) { $itm = $1; $res{$itm}{therion} = $lnum; $res{$itm}{"therion-cmnt"} = $cmnt; $cmnt = ""; # print "THERION: $itm\n"; } elsif (($ln =~ /^\s*(\w+)\:\s*(.*\S)\s*$/) && (length($itm) > 0)) { ($lng, $trn) = ($1, $2); $clng = check_language($lng); if (length($lng) == 0) { warn("warning: invalid language \"$lng\" ($fn:$lnum)\n"); } if ((length($lcode) == 0) || (substr($clng,0,2) eq $lcode)) { $res{$itm}{$clng} = $trn; $res{$itm}{"$clng-cmnt"} = $cmnt; } $cmnt = ""; # print "LANGUAGE: $clng => $trn\n"; } elsif ($ln !~ /^\s*$/) { warn("warning: error parsing $fn:$lnum\n"); } } close(INP); return \%res; } sub check_language { my $lng = shift; if ($lng =~ /^([A-Za-z]{2})([\_\-]{1}([A-Za-z]{2})){0,1}$/) { if (length($3) > 0) { return (lc($1) . "_" . uc($3)) } else { return (lc($1)) } } else { return ""; } } sub write_lang_file { my $fn = shift; my $href = shift; my %hr = %{$href}; open(OUT,">$fn") || die("error: can't open $fn for output\n"); my %sh = (); for $key (keys %hr) { # print "SORTING: $key -> $hr{$key}{therion}\n"; $sh{$hr{$key}{therion}} = $key; } @nkeys = sort {$a <=> $b} (keys %sh); for $key (@nkeys) { print OUT $hr{$sh{$key}}{"therion-cmnt"}; print OUT "therion: $sh{$key}\n"; for $lkey (sort keys %{$hr{$sh{$key}}}) { if (($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { print OUT $hr{$sh{$key}}{"$lkey-cmnt"}; print OUT "$lkey: ". $hr{$sh{$key}}{$lkey} ."\n"; } } print OUT "\n"; } close(OUT); } sub str2esc { $str = shift; $ret = ""; for($i = 0; $i < length($str); $i++) { $co = ord(substr($str,$i,1)); if (($co > 31) && ($co < 128)) { $ret .= chr($co); } else { $ret .= sprintf("\\%o", $co); } } return $ret; } sub write_sources { my $href = shift; my %hr = %{$href}; open(OUT,">../msgxth.tcl") || die("error: can't open ../msgxth.tcl for output\n"); print OUT "# file generated automatically - do not modify!\n\n"; my %sh = (); for $key (keys %hr) { $sh{$hr{$key}{therion}} = $key; } my @nkeys = sort {$a <=> $b} (keys %sh); for $key (@nkeys) { for $lkey (sort keys %{$hr{$sh{$key}}}) { if (($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { print OUT " ::msgcat::mcset $lkey \"$sh{$key}\" [encoding convertfrom utf-8 \"". str2esc($hr{$sh{$key}}{$lkey}) ."\"]\n"; } } print OUT "\n"; } close(OUT); } sub update_todo_list { my $href = shift; my %hr = %{$href}; # prejde vsetky kluce a priradi im vysoke cisla my $maxnm = -1; foreach $key (keys %hr) { if ($hr{$key}{therion} > $maxnm) { $maxnm = $hr{$key}{therion}; } } $maxnm = -1 - $maxnm; foreach $key (keys %hr) { $hr{$key}{therion} += $maxnm; } my $i = 0; foreach $fn (@trans_sources) { print "updating definitions from $fn ..."; open(INP,"$fn") || die("error: can't open $fn for input\n"); my @lines = ; close(INP); my $ln = join('',@lines); $ln =~ s/\[mc\ /\n\[mc\ /sg; @lines = split(/\n/,$ln); foreach $ln (@lines) { $i++; if ($ln =~ /^\[mc\ \"(.*)\"/) { $hr{$1}{therion} = $i; } } print " done\n"; } #vypise warningy foreach $key (keys %hr) { if ($hr{$key}{therion} < 0) { warn("warning: expression \"$key\" doesn't need to be translated\n"); } } return \%hr; } sub backup_file { my $fn = shift; open(INP,"$fn") || die("error: can't open $fn for input\n"); my @lines = ; close(INP); open(OUT,">$fn~") || die("error: can't open $fn~ for output\n"); print OUT @lines; close(OUT); } sub export_language { (my $fn, my $lng, my $href, my $onlyempty) = (shift, shift, shift, shift); my %hr = %{$href}; open(OUT,">$fn") || die("error: can't open $fn for output\n"); my %sh = (); for $key (keys %hr) { $sh{$hr{$key}{therion}} = $key; } my @nkeys = sort {$a <=> $b} (keys %sh); for $key (@nkeys) { my $toexp = 1; if ($onlyempty) { for $lkey (sort keys %{$hr{$sh{$key}}}) { if ((substr($lkey,0,2) eq $lng) && ($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { $toexp = 0; } } } if ($toexp) { print OUT $hr{$sh{$key}}{"therion-cmnt"}; print OUT "therion: $sh{$key}\n"; my $posc = "$lng:\n"; for $lkey (sort keys %{$hr{$sh{$key}}}) { if ((substr($lkey,0,2) eq $lng) && ($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { print OUT $hr{$sh{$key}}{"$lkey-cmnt"}; print OUT "$lkey: ". $hr{$sh{$key}}{$lkey} ."\n"; $posc = ""; } } print OUT $posc; print OUT "\n"; } } close(OUT); } $rf = read_lang_file("xtexts.txt"); # ak update if ($ARGV[0] =~ /^update$/i) { opendir(CDR,"."); @updfiles = grep /^xtexts\_[a-z]{2}\.txt$/, readdir(CDR); foreach $ufn (@updfiles) { my $lcode = substr($ufn,7,2); print "updating $lcode translations ..."; $rf = read_lang_file($ufn,$lcode,$rf); backup_file("$ufn"); unlink($ufn) || $quietdel || warn("warning: can't delete $ufn\n"); print " done\n"; } closedir(CDR); backup_file("xtexts.txt"); $rf = update_todo_list($rf); write_lang_file("xtexts.txt",$rf); write_sources($rf); } elsif ($ARGV[0] =~ /^export(\-empty)?$/i) { my $onlyempty = $1; my $lng = check_language($ARGV[1]); if (length($lng) != 2) { die("error: invalid language \"$ARGV[1]\"\n"); } export_language("xtexts_$lng.txt",$lng,$rf,$onlyempty); } else { write_sources($rf); } therion/xtherion/mapcal.tcl0000664000175000017500000001476211221135014015047 0ustar useruserset xth(calib_dir) "" set xth(calib_res) 96 set xth(calib_fmt) png set xth(calib_msg) "Wait please" proc xth_calibrate_bitmap {} { global xth tcl_platform if {[string length $xth(calib_dir)] == 0} { set xth(calib_dir) $xth(gui,initdir) } # identify image set ipath identify set cpath convert if {[string equal $tcl_platform(platform) windows]} { package require registry set win32registry {HKEY_LOCAL_MACHINE\SOFTWARE\Therion} if {[catch { set ipath "[file join [registry get $win32registry InstallDir] bin identify.exe]" set cpath "[file join [registry get $win32registry InstallDir] bin convert.exe]" }]} { set win32registry {HKEY_CURRENT_USER\SOFTWARE\Therion} catch { set ipath "[file join [registry get $win32registry InstallDir] bin identify.exe]" set cpath "[file join [registry get $win32registry InstallDir] bin convert.exe]" } } } # load bitmap and its size using identify set fname [tk_getOpenFile -filetypes {{{Images} {.png .jpg .jpeg .gif .pdf}} {{All files} {*}}} \ -parent $xth(gui,main) \ -initialdir $xth(calib_dir)] if {[string length $fname] == 0} return set xth(calib_dir) [file dirname $fname] if {[string equal -nocase .pdf [file extension $fname]]} { # create bitmap set pdfname $fname set dp $xth(gui,main).resoldlg Dialog $dp -title "Image resolution" -parent $xth(gui,main) -default 0 set df [$dp getframe] Label $df.l -text "Resolution (dpi)" Entry $df.e -textvariable xth(calib_res) radiobutton $df.p -text "PNG" -variable xth(calib_fmt) -value png radiobutton $df.j -text "JPEG" -variable xth(calib_fmt) -value jpg pack $df.l $df.e $df.p $df.j -side left -fill both -expand yes -padx 4 -pady 4 $dp add -name ok $dp draw destroy $dp if {[catch {set xth(calib_res) [expr int($xth(calib_res))]}]} { set xth(calib_res) 96 } xth_calibrate_prog_show "Rastering PDF image..." set fname "[file rootname $fname].$xth(calib_fmt)" catch {exec $cpath -density $xth(calib_res)x$xth(calib_res) $pdfname -quality 95 $fname} xth_calibrate_prog_hide } else { set pdfname "[file rootname $fname].pdf" if {![file exists $pdfname]} { set pdfname [tk_getOpenFile -filetypes {{{PDF files} {.pdf}} {{All files} {*}}} \ -parent $xth(gui,main) \ -initialdir $xth(calib_dir)] } if {[string length $pdfname] == 0} return } xth_calibrate_prog_show "Reading bitmap..." catch {exec $ipath -format {%w\n%h\n} $fname > $fname.tmp} xth_calibrate_prog_hide set fid [open $fname.tmp r] gets $fid imgw gets $fid imgh close $fid file delete -force -- $fname.tmp # load corresponding pdf file xth_calibrate_prog_show "Reading calibration data..." catch { set fid [open $pdfname r] fconfigure $fid -eofchar {} set goon 1 while {(![eof $fid])} { gets $fid cln if {[regexp {\/thCalibrate0 \(} $cln]} { break } } close $fid xth_calibrate_prog_hide # find calibration points set HD -1.0 xth_calibrate_prog_show "Writing map file..." for {set i 0} {$i < 9} {incr i} { set rx "\\/thCalibrate$i" set X($i) 0.0 set Y($i) 0.0 set L($i) 0.0 set F($i) 0.0 append rx {\s+\([^)]*X=([\+\-\.\d]+)[^)]*Y=([\+\-\.\d]+)[^)]*L=([\+\-\.\d]+)[^)]*F=([\+\-\.\d]+)} regexp $rx $cln dum X($i) Y($i) L($i) F($i) } regexp {\/thCalibrate\s+\([^)]*HS=([\+\-\.\d]+)[^)]*VS=([\+\-\.\d]+)[^)]*HD=([\+\-\.\d]+)} $cln dum HS VS HD set geo_err 1 set fid [open err.log w] for {set i 0} {$i < 9} {incr i} { set geo_err [expr $geo_err && ($L($i) == 0.0) && ($F($i) == 0.0)] } set geo_err [expr $geo_err || ($HD <= 0.0)] if {$geo_err} { xth_calibrate_show_err "Georeferencing of map is not correct!" return } # write map file set fid [open "[file rootname $fname].map" w] puts $fid {OziExplorer Map Data File Version 2.2} puts $fid [file tail $fname] puts $fid $fname puts $fid {1 ,Map Code,} puts $fid {WGS 84,, 0.0000, 0.0000,WGS 84} puts $fid {Reserved 1} puts $fid {Reserved 2} puts $fid {Magnetic Variation,,,E} puts $fid {Map Projection,Mercator,PolyCal,No,AutoCalOnly,No,BSBUseWPX,No} for {set i 0} {$i < 9} {incr i} { set imgx [expr $imgw - int(double($imgw) * ($HS - $X($i)) / $HS)] set imgy [expr int(double($imgh) * ($VS - $Y($i)) / $VS)] puts $fid "Point0[expr $i + 1],xy,$imgx,$imgy,in, deg,[ll2ozi $F($i) $L($i)], grid, , , ,N" set mmx($i) $imgx set mmy($i) $imgy } # Point01,xy, 0, 0,in, deg, 48, 12.39601,N, 17, 1.25473,E, grid, , , ,N for {set i 10} {$i <= 30} {incr i} { puts $fid "Point$i,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N" } puts $fid {Projection Setup,,,,,,,,,,} puts $fid {Map Feature = MF ; Map Comment = MC These follow if they exist} puts $fid {Track File = TF These follow if they exist} puts $fid {Moving Map Parameters = MM? These follow if they exist} puts $fid {MM0,Yes} puts $fid {MMPNUM,4} puts $fid "MMPXY,1,$mmx(5),$mmy(5)" puts $fid "MMPXY,2,$mmx(7),$mmy(7)" puts $fid "MMPXY,3,$mmx(2),$mmy(2)" puts $fid "MMPXY,4,$mmx(0),$mmy(0)" puts $fid "MMPLL,1, $L(5), $F(5)" puts $fid "MMPLL,2, $L(7), $F(7)" puts $fid "MMPLL,3, $L(2), $F(2)" puts $fid "MMPLL,4, $L(0), $F(0)" puts $fid "MM1B,[expr $HD / abs(double($mmx(7)) - double($mmx(5)))]" puts $fid {MOP,Map Open Position,0,0} puts $fid "IWH,Map Image Width/Height,$imgw,$imgh" close $fid } xth_calibrate_prog_hide } proc xth_calibrate_show_err {msg} { global xth set dp $xth(gui,main).messagedlg MessageDlg $dp -parent $xth(gui,main) -message $msg -type ok -icon error } proc xth_calibrate_prog_show {msg} { global xth set dp $xth(gui,main).progdlg set xth(calib_msg) $msg ProgressDlg $dp -parent $xth(gui,main) -title "Wait..." \ -type infinite \ -width 30 \ -textvariable xth(calib_msg) update after 200 } proc xth_calibrate_prog_hide {} { global xth set dp $xth(gui,main).progdlg destroy $dp } proc ll2ozi {lat lon} { set latD [expr int($lat)] set latM [expr 60.0 * ($lat - double($latD))] if {$lat >= 0.0} {set latH N} else {set latH S} set lonD [expr int($lon)] set lonM [expr 60.0 * ($lon - double($lonD))] if {$lon >= 0.0} {set lonH E} else {set lonE W} return "$latD,$latM,$latH,$lonD,$lonM,$lonH" } if 0 { package require BWidget set xth(gui,main) .x toplevel .x set xth(gui,initdir) . xth_calibrate_bitmap exit } therion/thlibrarydata.cxx0000664000175000017500000002526612302220637014634 0ustar useruser/** * @file librarydata.cxx * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #include "thdatabase.h" #include "thobjectsrc.h" #include "thinfnan.h" #include "thchencdata.h" #include "thlayout.h" #include "thlang.h" #include "thgrade.h" void thlibrary_init_grades() { thgrade * pgrade; thbuffer oname; pgrade = (thgrade *) thdb.create("grade", thobjectsrc("therion",0)); oname = "BCRA3"; pgrade->set(thcmd_option_desc(TT_DATAOBJECT_NAME,1),oname,0,0); oname = "BCRA grade 3"; pgrade->set(thcmd_option_desc(TT_DATAOBJECT_TITLE,1),oname,TT_UTF_8,0); pgrade->dls_length = 0.25; pgrade->dls_bearing = 1.25; pgrade->dls_gradient = 1.25; pgrade->dls_counter = thnan; pgrade->dls_depth = thnan; pgrade->dls_dx = thnan; pgrade->dls_dy = thnan; pgrade->dls_dz = thnan; pgrade->dls_x = 0.25; pgrade->dls_y = 0.25; pgrade->dls_z = 0.25; thdb.insert(pgrade); pgrade = (thgrade *) thdb.create("grade", thobjectsrc("therion",0)); oname = "BCRA5"; pgrade->set(thcmd_option_desc(TT_DATAOBJECT_NAME,1),oname,0,0); oname = "BCRA grade 5"; pgrade->set(thcmd_option_desc(TT_DATAOBJECT_TITLE,1),oname,TT_UTF_8,0); pgrade->dls_length = 0.05; pgrade->dls_bearing = 0.5; pgrade->dls_gradient = 0.5; pgrade->dls_counter = thnan; pgrade->dls_depth = thnan; pgrade->dls_dx = thnan; pgrade->dls_dy = thnan; pgrade->dls_dz = thnan; pgrade->dls_x = 0.05; pgrade->dls_y = 0.05; pgrade->dls_z = 0.05; thdb.insert(pgrade); } void thlibrary_init_layouts() { thlayout * playout; thbuffer oname; playout = (thlayout *) thdb.create("layout", thobjectsrc("therion",0)); oname = "AUT"; playout->set(thcmd_option_desc(TT_DATAOBJECT_NAME,1),oname,TT_UTF_8,0); oname = "Austrian symbol set"; playout->set(thcmd_option_desc(TT_DATAOBJECT_TITLE,1),oname,TT_UTF_8,0); playout->def_scale = 0; playout->scale = 0.005; playout->def_base_scale = 0; playout->base_scale = 0.005; playout->def_rotate = 0; playout->rotate = 0; playout->def_page_setup = 0; playout->hsize = 0.18; playout->vsize = 0.222; playout->paphs = 0.21; playout->papvs = 0.297; playout->paghs = 0.2; playout->pagvs = 0.287; playout->marts = 0.005; playout->marls = 0.005; playout->color_map_bg.defined = 0; playout->color_map_bg.R = 1; playout->color_map_bg.G = 1; playout->color_map_bg.B = 1; playout->color_map_bg.A = 1; playout->color_map_fg.defined = 0; playout->color_crit = 0; playout->color_map_fg.R = 1; playout->color_map_fg.G = 1; playout->color_map_fg.B = 1; playout->color_map_fg.A = 1; playout->color_preview_below.defined = 0; playout->color_preview_below.R = 0.5; playout->color_preview_below.G = 0.5; playout->color_preview_below.B = 0.5; playout->color_preview_below.A = 1; playout->color_preview_above.defined = 0; playout->color_preview_above.R = 0; playout->color_preview_above.G = 0; playout->color_preview_above.B = 0; playout->color_preview_above.A = 1; playout->def_overlap = 0; playout->overlap = 0.01; playout->def_scale_bar = 0; playout->scale_bar = -1; playout->def_transparency = 0; playout->transparency = true; playout->def_sketches = 0; playout->sketches = false; playout->def_legend = 0; playout->legend = TT_LAYOUT_LEGEND_OFF; playout->def_survey_level = 0; playout->survey_level = 0; playout->def_color_legend = 0; playout->legend = 1; playout->def_legend_width = 0; playout->legend_width = 0.14; playout->def_legend_columns = 0; playout->legend_columns = 2; playout->def_map_header = 0; playout->map_header = 3; playout->map_header_x = 100; playout->map_header_y = 0; playout->def_debug = 0; playout->debug = 0; playout->def_max_explos = 0; playout->max_explos = -1; playout->def_max_topos = 0; playout->max_topos = -1; playout->def_max_cartos = 0; playout->max_cartos = -1; playout->def_max_copys = 0; playout->max_copys = -1; playout->def_explo_lens = 0; playout->explo_lens = 2; playout->def_topo_lens = 0; playout->topo_lens = 2; playout->def_lang = 0; playout->lang = THLANG_EN; playout->def_units = 0; playout->units.units = 1; playout->def_layers = 0; playout->layers = true; playout->def_map_header_bg = 0; playout->map_header_bg = false; playout->def_opacity = 0; playout->opacity = 0.75; playout->def_surface_opacity = 0; playout->surface_opacity = 0.75; playout->def_surface= 0; playout->surface = 0; playout->def_color_labels= 0; playout->color_labels = false; playout->def_grid_coords = 0; playout->grid_coords = 1; playout->def_north= 0; playout->north = 1; playout->def_grid = 0; playout->grid = 1; playout->def_page_grid = 0; playout->page_grid = false; playout->def_origin = 0; playout->def_origin_label = 0; playout->olx = "0"; playout->oly = "0"; playout->def_doc_title = 0; playout->doc_title = ""; playout->def_doc_comment = 0; playout->doc_comment = ""; playout->def_doc_author = 0; playout->doc_author = ""; playout->def_doc_subject = 0; playout->doc_subject = ""; playout->def_doc_keywords = 0; playout->doc_keywords = ""; playout->def_excl_pages = 0; playout->excl_pages = false; playout->excl_list = NULL; playout->def_grid_size = 0; playout->def_grid_origin = 0; playout->def_nav_factor = 0; playout->navf = 30; playout->def_nav_size = 0; playout->navsx = 2; playout->navsy = 2; playout->def_own_pages = 0; playout->ownp = 0; playout->def_title_pages = 0; playout->titlep = false; playout->def_page_numbers = 0; playout->pgsnum = true; oname = "AUT"; playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,1),oname,TT_UTF_8,0); playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,0),NULL,TT_UTF_8,0); playout->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR; playout->last_line->smid = SYMX_WATER; playout->last_line->sclr = thlayout_color(0.180000,0.190000,0.570000); playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,0),NULL,TT_UTF_8,0); playout->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR; playout->last_line->smid = SYMX_SPELEOTHEMS; playout->last_line->sclr = thlayout_color(0.870000,0.390000,0.230000); playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,0),NULL,TT_UTF_8,0); playout->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR; playout->last_line->smid = SYMX_SEDIMENTS; playout->last_line->sclr = thlayout_color(0.500000,0.420000,0.390000); playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,0),NULL,TT_UTF_8,0); playout->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR; playout->last_line->smid = SYMX_CENTERLINE; playout->last_line->sclr = thlayout_color(0.950000,0.000000,0.000000); playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,0),NULL,TT_UTF_8,0); playout->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR; playout->last_line->smid = SYMX_ICE; playout->last_line->sclr = thlayout_color(0.000000,0.680000,0.940000); playout->def_tex_lines = 2; thdb.insert(playout); playout = (thlayout *) thdb.create("layout", thobjectsrc("therion",0)); oname = "SCR200"; playout->set(thcmd_option_desc(TT_DATAOBJECT_NAME,1),oname,TT_UTF_8,0); oname = "Computer screen layout"; playout->set(thcmd_option_desc(TT_DATAOBJECT_TITLE,1),oname,TT_UTF_8,0); playout->def_scale = 2; playout->scale = 0.005; playout->def_base_scale = 0; playout->base_scale = 0.005; playout->def_rotate = 0; playout->rotate = 0; playout->def_page_setup = 2; playout->hsize = 0.24; playout->vsize = 0.1399; playout->paphs = 0.27; playout->papvs = 0.2025; playout->paghs = 0.26; playout->pagvs = 0.1925; playout->marts = 0.005; playout->marls = 0.005; playout->color_map_bg.defined = 0; playout->color_map_bg.R = 1; playout->color_map_bg.G = 1; playout->color_map_bg.B = 1; playout->color_map_bg.A = 1; playout->color_map_fg.defined = 0; playout->color_crit = 0; playout->color_map_fg.R = 1; playout->color_map_fg.G = 1; playout->color_map_fg.B = 1; playout->color_map_fg.A = 1; playout->color_preview_below.defined = 0; playout->color_preview_below.R = 0.5; playout->color_preview_below.G = 0.5; playout->color_preview_below.B = 0.5; playout->color_preview_below.A = 1; playout->color_preview_above.defined = 0; playout->color_preview_above.R = 0; playout->color_preview_above.G = 0; playout->color_preview_above.B = 0; playout->color_preview_above.A = 1; playout->def_overlap = 2; playout->overlap = 0.01; playout->def_scale_bar = 0; playout->scale_bar = -1; playout->def_transparency = 0; playout->transparency = true; playout->def_sketches = 0; playout->sketches = false; playout->def_legend = 0; playout->legend = TT_LAYOUT_LEGEND_OFF; playout->def_survey_level = 0; playout->survey_level = 0; playout->def_color_legend = 0; playout->legend = 1; playout->def_legend_width = 0; playout->legend_width = 0.14; playout->def_legend_columns = 0; playout->legend_columns = 2; playout->def_map_header = 0; playout->map_header = 3; playout->map_header_x = 100; playout->map_header_y = 0; playout->def_debug = 0; playout->debug = 0; playout->def_max_explos = 0; playout->max_explos = -1; playout->def_max_topos = 0; playout->max_topos = -1; playout->def_max_cartos = 0; playout->max_cartos = -1; playout->def_max_copys = 0; playout->max_copys = -1; playout->def_explo_lens = 0; playout->explo_lens = 2; playout->def_topo_lens = 0; playout->topo_lens = 2; playout->def_lang = 0; playout->lang = THLANG_EN; playout->def_units = 0; playout->units.units = 1; playout->def_layers = 0; playout->layers = true; playout->def_map_header_bg = 0; playout->map_header_bg = false; playout->def_opacity = 0; playout->opacity = 0.75; playout->def_surface_opacity = 0; playout->surface_opacity = 0.75; playout->def_surface= 0; playout->surface = 0; playout->def_color_labels= 0; playout->color_labels = false; playout->def_grid_coords = 0; playout->grid_coords = 1; playout->def_north= 0; playout->north = 1; playout->def_grid = 0; playout->grid = 1; playout->def_page_grid = 0; playout->page_grid = false; playout->def_origin = 0; playout->def_origin_label = 2; playout->olx = "100"; playout->oly = "100"; playout->def_doc_title = 0; playout->doc_title = ""; playout->def_doc_comment = 0; playout->doc_comment = ""; playout->def_doc_author = 0; playout->doc_author = ""; playout->def_doc_subject = 0; playout->doc_subject = ""; playout->def_doc_keywords = 0; playout->doc_keywords = ""; playout->def_excl_pages = 0; playout->excl_pages = false; playout->excl_list = NULL; playout->def_grid_size = 2; playout->gxs = 10; playout->gys = 10; playout->gzs = 10; playout->def_grid_origin = 0; playout->def_nav_factor = 2; playout->navf = 25; playout->def_nav_size = 2; playout->navsx = 2; playout->navsy = 2; playout->def_own_pages = 0; playout->ownp = 0; playout->def_title_pages = 0; playout->titlep = false; playout->def_page_numbers = 0; playout->pgsnum = true; oname = "SKBB"; playout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,1),oname,TT_UTF_8,0); playout->def_tex_lines = 2; thdb.insert(playout); } therion/thlookup.h0000664000175000017500000001063612346052744013301 0ustar useruser/** * @file thlookup.h * Map / model color lookup module. */ /* Copyright (C) 2012 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thlookup_h #define thlookup_h #include "thdataobject.h" #include "thlocale.h" #include /** * lookup command options tokens. */ enum { TT_LOOKUP_UNKNOWN = 2000, TT_LOOKUP_TYPE = 2001, TT_LOOKUP_SCALE = 2001, TT_LOOKUP_TITLE = 2002, }; /** * Lookup command options parsing table. */ static const thstok thtt_lookup_opt[] = { {"scale", TT_LOOKUP_SCALE}, {"title", TT_LOOKUP_TITLE}, {"type", TT_LOOKUP_TYPE}, {NULL, TT_LOOKUP_UNKNOWN}, }; /** * lookup scale tokens. */ enum { TT_LOOKUP_SCALE_UNKNOWN = 0, TT_LOOKUP_SCALE_CONTINUOUS, TT_LOOKUP_SCALE_DISCRETE, }; /** * lookup scale token table. */ static const thstok thtt_lookup_scale[] = { {"continuous", TT_LOOKUP_SCALE_CONTINUOUS}, {"discrete", TT_LOOKUP_SCALE_DISCRETE}, {NULL, TT_LOOKUP_SCALE_UNKNOWN} }; /** * lookup type tokens. */ enum { TT_LOOKUP_TYPE_UNKNOWN = 0, TT_LOOKUP_TYPE_DATE, TT_LOOKUP_TYPE_NUMERIC, TT_LOOKUP_TYPE_STRING, }; /** * lookup grid token table. */ static const thstok thtt_lookup_types[] = { {"date", TT_LOOKUP_TYPE_DATE}, {"numeric", TT_LOOKUP_TYPE_NUMERIC}, {"string", TT_LOOKUP_TYPE_STRING}, {NULL, TT_LOOKUP_TYPE_UNKNOWN} }; /** * Supported color lookup schemes. */ enum { TT_LOOKUP_COLORSCHEME_UNKNOWN = 0, TT_LOOKUP_COLORSCHEME_HSV, }; /** * Lookup table row. */ struct thlookup_table_row { double m_valueDbl, m_valueDblFrom; thdate m_valueDate; const char * m_valueString; const char * m_label; thlayout_color m_color; thlookup_table_row() : m_valueDbl(thnan), m_valueDblFrom(thnan), m_valueString(""), m_label("") {} void parse(char ** args); }; typedef std::list thlookup_table_list; /** * lookup class. */ class thlookup : public thdataobject { public: int m_type, m_scale, m_colorscheme; thlookup_table_list m_table; const char * m_title; /** * Standard constructor. */ thlookup(); /** * Standard destructor. */ ~thlookup(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thlookup";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); thcmd_option_desc get_default_cod(int id); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Get context for object. */ virtual int get_context(); /** * Automatically lookup range. */ virtual void auto_set(double from, double to); virtual void auto_set(class thdate fromto); /** * Get color from the scale. */ virtual thlayout_color get_color(thdate d); virtual thlayout_color get_color(double d); }; #endif therion/thdatastation.cxx0000664000175000017500000000244110625655142014650 0ustar useruser/** * @file thdatastation.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdatastation.h" #include "thexception.h" #include "thchenc.h" int thdatastation::get_class_id() { return TT_DATASTATION_CMD; } bool thdatastation::is(int class_id) { if (class_id == TT_DATASTATION_CMD) return true; else return thdataobject::is(class_id); } void thdatastation::self_delete() { delete this; } therion/thdb2dlp.cxx0000664000175000017500000001245211564456570013516 0ustar useruser/** * @file thdb2dpt.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2dlp.h" #include "thdb2dpt.h" #include "thline.h" #include "thparse.h" #include "thinfnan.h" #include "thexpmap.h" thdb2dlp::thdb2dlp () { this->nextlp = NULL; this->prevlp = NULL; this->point = NULL; this->cp1 = NULL; this->cp2 = NULL; this->subtype = TT_LINE_SUBTYPE_UNKNOWN; this->smooth = TT_AUTO; this->smooth_orig = TT_AUTO; this->mark = NULL; this->orient = thnan; this->rsize = thnan; this->lsize = thnan; this->tags = TT_LINEPT_TAG_NONE; this->adjust = TT_LINE_ADJUST_NONE; } void thdb2dlp::export_prevcp_mp(class thexpmapmpxs * out) { double dx, dy; this->get_prevcp(dx,dy); fprintf(out->file,"(%g,%g)", thxmmxst(out, (this->point->xt + dx), (this->point->yt + dy))); } void thdb2dlp::export_nextcp_mp(class thexpmapmpxs * out) { double dx, dy; this->get_nextcp(dx,dy); fprintf(out->file,"(%g,%g)", thxmmxst(out, (this->point->xt + dx), (this->point->yt + dy))); } bool thdb2dlp::get_prevcp(double & dx, double & dy) { bool postprocess = false; dx = 0.0; dy = -1.0; if ((this->cp2 != NULL) && ((this->cp2->xt != this->point->xt) || (this->cp2->yt != this->point->yt))) { dx = this->cp2->xt - this->point->xt; dy = this->cp2->yt - this->point->yt; postprocess = true; } else if ((this->cp1 != NULL) && ((this->cp1->xt != this->point->xt) || (this->cp1->yt != this->point->yt))) { dx = this->cp1->xt - this->point->xt; dy = this->cp1->yt - this->point->yt; postprocess = true; } else if ((this->prevlp != NULL) && ((this->prevlp->point->xt != this->point->xt) || (this->prevlp->point->yt != this->point->yt))){ dx = this->prevlp->point->xt - this->point->xt; dy = this->prevlp->point->yt - this->point->yt; postprocess = true; } else if (this->nextlp != NULL) { if ((this->nextlp->cp1 != NULL) && ((this->nextlp->cp1->xt != this->point->xt) || (this->nextlp->cp1->yt != this->point->yt))) { dx = this->point->xt - this->nextlp->cp1->xt; dy = this->point->yt - this->nextlp->cp1->yt; postprocess = true; } else if ((this->nextlp->cp2 != NULL) && ((this->nextlp->cp2->xt != this->point->xt) || (this->nextlp->cp2->yt != this->point->yt))) { dx = this->point->xt - this->nextlp->cp2->xt; dy = this->point->yt - this->nextlp->cp2->yt; postprocess = true; } else { dx = this->point->xt - this->nextlp->point->xt; dy = this->point->yt - this->nextlp->point->yt; postprocess = true; } } return postprocess; } bool thdb2dlp::get_nextcp(double & dx, double & dy) { bool postprocess = false; dx = 0.0; dy = 1.0; if (this->nextlp != NULL) { if ((this->nextlp->cp1 != NULL) && ((this->nextlp->cp1->xt != this->point->xt) || (this->nextlp->cp1->yt != this->point->yt))) { dx = this->nextlp->cp1->xt - this->point->xt; dy = this->nextlp->cp1->yt - this->point->yt; postprocess = true; } else if ((this->nextlp->cp2 != NULL) && ((this->nextlp->cp2->xt != this->point->xt) || (this->nextlp->cp2->yt != this->point->yt))) { dx = this->nextlp->cp2->xt - this->point->xt; dy = this->nextlp->cp2->yt - this->point->yt; postprocess = true; } else { dx = this->nextlp->point->xt - this->point->xt; dy = this->nextlp->point->yt - this->point->yt; postprocess = true; } } else if ((this->cp2 != NULL) && ((this->cp2->xt != this->point->xt) || (this->cp2->yt != this->point->yt))) { dx = this->point->xt - this->cp2->xt; dy = this->point->yt - this->cp2->yt; postprocess = true; } else if ((this->cp1 != NULL) && ((this->cp1->xt != this->point->xt) || (this->cp1->yt != this->point->yt))) { dx = this->point->xt - this->cp1->xt; dy = this->point->yt - this->cp1->yt; postprocess = true; } else if ((this->prevlp != NULL) && ((this->prevlp->point->xt != this->point->xt) || (this->prevlp->point->yt != this->point->yt))) { dx = this->point->xt - this->prevlp->point->xt; dy = this->point->yt - this->prevlp->point->yt; postprocess = true; } return postprocess; } double thdb2dlp::get_rotation() { double dx,dy,x,y; this->get_nextcp(x,y); this->get_prevcp(dx,dy); x -= dx; y -= dy; return (atan2(y,x) / 3.14159265358 * 180); } therion/Makefile0000664000175000017500000014344212450020341012705 0ustar useruser# common therion objects export OUTDIR = . CMNOBJECTS = thdate.o extern/shpopen.o extern/dbfopen.o \ thexception.o thbuffer.o thmbuffer.o thlogfile.o thtmpdir.o thlocale.o \ thparse.o thcmdline.o thconfig.o thinput.o thchenc.o thdatabase.o \ thdataobject.o thdatareader.o thsurvey.o thendsurvey.o thdata.o \ thperson.o thtf.o thtfangle.o thtflength.o thtfpwf.o \ thdataleg.o thobjectname.o thinfnan.o thlayout.o thcomment.o \ thinit.o thdb1d.o thsvxctrl.o thdatastation.o thobjectid.o \ thobjectsrc.o thgrade.o thlibrary.o thgeomag.o thbezier.o \ thexport.o thexporter.o thselector.o extern/img.o \ thexpmodel.o thdb2d00.o thscrapis.o thcs.o thcsdata.o thexptable.o \ thdb2d.o thscrap.o thendscrap.o th2ddataobject.o thdb2dprj.o \ thdb2dpt.o thdb2dlp.o thdb2dab.o thdb2dji.o thdb2dmi.o thdb2dcp.o \ thdb2dxm.o thdb2dxs.o thscraplo.o thscraplp.o thscrapen.o \ thpoint.o thline.o tharea.o thlegenddata.o thmpost.o thsymbolsets.o \ thjoin.o thmap.o thexpmap.o thlayoutln.o thlayoutclr.o thexpsys.o thexpuni.o \ thconvert.o thpdf.o thpdfdbg.o thpdfdata.o thtexfonts.o \ thsymbolset.o thlang.o thmapstat.o thexpdb.o thpic.o thsketch.o thproj.o \ extern/lxMath.o extern/lxFile.o thdb3d.o thsurface.o thimport.o thsvg.o thepsparse.o \ thtrans.o thwarpp.o thwarppt.o thwarppme.o thwarp.o thexpshp.o thattr.o thtex.o \ extern/poly2tri/common/shapes.o extern/poly2tri/sweep/advancing_front.o extern/poly2tri/sweep/sweep.o extern/poly2tri/sweep/cdt.o extern/poly2tri/sweep/sweep_context.o \ therion.o extern/proj4/libproj.a # PLATFORM CONFIG # PLATFORM LINUX ##CXX = c++ ##CC = gcc ##POBJECTS = ##LOCHEXE = loch/loch ##CXXPFLAGS = -DTHLINUX ##CCPFLAGS = -DTHLINUX ##LDPFLAGS = -s ##export THPLATFORM = LINUX ##THXTHMKCMD = ./therion ##OUTDIR = $(abspath $(PWD)/../therion.bin) # PLATFORM DEBIAN CXX = c++ CC = gcc POBJECTS = LOCHEXE = loch/loch CXXPFLAGS = -DTHLINUX CCPFLAGS = -DTHLINUX LDPFLAGS = -s export THPLATFORM = LINUX THXTHMKCMD = ./therion # PLATFORM WIN32 ##CXX = c++ ##CC = gcc ##POBJECTS = extern/getopt.o extern/getopt1.o therion.res extern/getline.o ##LOCHEXE = loch/loch ##CXXPFLAGS = -DTHWIN32 ##CCPFLAGS = -DTHWIN32 ##LDPFLAGS = -static-libgcc -static -s ##export THPLATFORM = WIN32 ##THXTHMKCMD = therion ##OUTDIR = $(abspath $(PWD)/../therion.bin) # PLATFORM MACOSX ##CXX = c++ ##CC = cc ##LOCHEXE = loch/loch ##POBJECTS = extern/getopt.o extern/getopt1.o extern/getline.o ##CXXPFLAGS = -DTHMACOSX ##CCPFLAGS = -DTHMACOSX ##LDPFLAGS = ##export THPLATFORM = MACOSX ##THXTHMKCMD = ./therion # PLATFORM ENDCONFIG # BUILD CONFIG # BUILD OZONE ##CCBFLAGS = -O3 ##CXXBFLAGS = -O3 ##LDBFLAGS = $(LDPFLAGS) # BUILD OXYGEN CCBFLAGS = -O2 CXXBFLAGS = -O2 LDBFLAGS = $(LDPFLAGS) # BUILD RELEASE ##CCBFLAGS = ##CXXBFLAGS = ##LDBFLAGS = $(LDPFLAGS) # BUILD DEBUG ##CCBFLAGS = -ggdb ##CXXBFLAGS = -ggdb -DTHDEBUG ##LDBFLAGS = # BUILD ENDCONFIG # compiler settings CXXFLAGS = -Wall $(CXXPFLAGS) $(CXXBFLAGS) CCFLAGS = -DIMG_API_VERSION=1 -Wall $(CCPFLAGS) $(CCBFLAGS) OBJECTS = $(addprefix $(OUTDIR)/,$(POBJECTS)) $(addprefix $(OUTDIR)/,$(CMNOBJECTS)) # linker settings LIBS = LDFLAGS = $(LDBFLAGS) $(OUTDIR)/%.o : %.cxx $(CXX) -c $(CXXFLAGS) -o $@ $< $(OUTDIR)/%.o : %.cc $(CXX) -c $(CXXFLAGS) -o $@ $< $(OUTDIR)/%.o : %.c $(CC) -c $(CCFLAGS) -o $@ $< all: outdirs $(OUTDIR)/therion doc xtherion/xtherion $(LOCHEXE) outdirs: mkdir -p $(OUTDIR)/extern/proj4 mkdir -p $(OUTDIR)/extern/poly2tri/sweep/ mkdir -p $(OUTDIR)/extern/poly2tri/common/ mkdir -p $(OUTDIR)/loch mkdir -p $(OUTDIR)/xtherion mkdir -p $(OUTDIR)/thbook $(OUTDIR)/extern/proj4/libproj.a: extern/proj4/*.c extern/proj4/*.h make -C ./extern/proj4 $(OUTDIR)/therion: $(OBJECTS) $(CXX) -Wall -o $(OUTDIR)/therion $(OBJECTS) $(LDFLAGS) $(LIBS) $(OUTDIR)/therion.res: therion.rc windres -i therion.rc -J rc -o $(OUTDIR)/therion.res -O coff init: ./therion --print-init-file > therion.ini install: all tclsh makeinstall.tcl $(THPLATFORM) minor-release: perl makerelease.pl archive: clean perl makearchive2.pl release: clean perl makearchive.pl binary: all doc perl makebinary.pl $(THPLATFORM) depend: perl makedepend.pl > Makefile.dep perl maketest.pl Makefile.dep perl makefile.pl mv Makefile.dep Makefile $(CXX) -MM $(CXXFLAGS) *.cxx >> Makefile perl makedepend2.pl library: $(THXTHMKCMD) --print-library-src thlibrarydata.thcfg > thlibrarydata.log $(THXTHMKCMD) --print-xtherion-src > xtherion/therion.tcl perl makelibrary.pl thlibrarydata.log > thlibrarydata.tmp perl maketest.pl thlibrarydata.tmp perl makefile.pl mv thlibrarydata.tmp thlibrarydata.cxx thlibrarydata.cxx: thlang/texts.txt make library xtherion/xtherion: xtherion/*.tcl make -C ./xtherion loch/loch: loch/*.h loch/*.cxx loch/*.c make -C ./loch doc: $(OUTDIR)/thbook/thbook.pdf thbook: $(OUTDIR)/thbook/thbook.pdf samples: $(OUTDIR)/samples.doc/index.tex $(OUTDIR)/samples.doc/index.tex: make -C samples touch thbook/version.tex make -C thbook $(OUTDIR)/thbook/thbook.pdf: thbook/*.tex make -C thbook clean: make -C ./xtherion clean make -C ./loch clean make -C ./samples clean make -C ./extern/proj4 clean perl makefile.pl rm -q therion ./xtherion/xtherion ./xtherion/xtherion.tcl therion.exe *~ *.log *.o thchencdata/*~ .xtherion.dat ./xtherion/ver.tcl perl makefile.pl rm -q xtherion/*~ .xth_thconfig_xth xtherion/screendump thlang/*~ perl makefile.pl rm -q extern/*.o extern/*~ extern/poly2tri/common/*.o extern/poly2tri/sweep/*.o samples/*~ samples/*.log perl makefile.pl rm -q symbols.html therion.res perl makefile.pl rm -q tri/*.o tri/*~ perl makefile.pl rm -q tex/*~ perl makefile.pl rm -q mpost/*~ examples/*~ examples/therion.log perl makefile.pl rm -q core symbols.xhtml cave.kml perl makefile.pl rm -q data.3d data.svx data.pos data.pts data.err data.plt perl makefile.pl rm -q cave.3d cave.lox cave.thm cave.pdf cave.sql cave.xhtml therion.tcl cave_a.pdf cave_m.pdf cave.vrml cave.wrl cave.3dmf cave.svg cave.tlx perl makefile.pl rm -q ./thbook/*~ ./thbook/thbook.log ./thbook/thbook.pdf ./lib/*~ ./mpost/*~ ./tex/*~ perl makefile.pl rmdir -q doc thTMPDIR samples.doc symbols cave.shp tests/.doc thmpost.h: mpost/*.mp make -C ./mpost thsymbolsetlist.h: thsymbolsetlist.pl mpost/thTrans.mp perl thsymbolsetlist.pl thtex.h: tex/*.tex make -C ./tex thcsdata.h: thcsdata.tcl tclsh thcsdata.tcl update: make -C ./thlang update unixify: clean tclsh makeunixify.tcl thlangdata.cxx: thlang/texts.txt make -C ./thlang config-debug: perl makeconfig.pl BUILD DEBUG make -C ./loch config-debug config-release: perl makeconfig.pl BUILD RELEASE make -C ./loch config-release config-oxygen: perl makeconfig.pl BUILD OXYGEN make -C ./loch config-oxygen config-ozone: perl makeconfig.pl BUILD OZONE make -C ./loch config-ozone config-debian: perl makeconfig.pl PLATFORM DEBIAN make -C ./loch config-debian config-linux: perl makeconfig.pl PLATFORM LINUX make -C ./loch config-linux config-win32: perl makeconfig.pl PLATFORM WIN32 make -C ./loch config-win32 config-macosx: perl makeconfig.pl PLATFORM MACOSX make -C ./loch config-macosx # external sources $(OUTDIR)/extern/lxMath.o: loch/lxMath.h loch/lxMath.cxx $(CXX) -c $(CXXFLAGS) -o $(OUTDIR)/extern/lxMath.o loch/lxMath.cxx $(OUTDIR)/extern/lxFile.o: loch/lxFile.h loch/lxFile.cxx $(CXX) -c $(CXXFLAGS) -o $(OUTDIR)/extern/lxFile.o loch/lxFile.cxx extern/getopt.o: extern/getopt.c extern/getopt.h extern/getopt1.o: extern/getopt1.c extern/img.o: extern/img.c extern/img.h extern/poly2tri/common/shapes.o: extern/poly2tri/common/shapes.cc extern/poly2tri/common/shapes.h extern/poly2tri/sweep/advancing_front.o: extern/poly2tri/sweep/advancing_front.cc extern/poly2tri/sweep/sweep.o: extern/poly2tri/sweep/sweep.cc extern/poly2tri/sweep/cdt.o: extern/poly2tri/sweep/cdt.cc extern/poly2tri/sweep/sweep_context.o: extern/poly2tri/sweep/sweep_context.cc # DEPENDENCIES $(OUTDIR)/th2ddataobject.o: th2ddataobject.cxx th2ddataobject.h thdataobject.h \ thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thexception.h thsymbolset.h thsymbolsetlist.h $(OUTDIR)/tharea.o: tharea.cxx tharea.h th2ddataobject.h thdataobject.h \ thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thexception.h thexpmap.h thexport.h thsymbolset.h thsymbolsetlist.h \ thlayout.h thlocale.h thlang.h thlangdata.h thline.h $(OUTDIR)/thattr.o: thattr.cxx thattr.h thmbuffer.h thchenc.h thchencdata.h \ thparse.h thbuffer.h extern/shapefil.h thexception.h therion.h $(OUTDIR)/thbezier.o: thbezier.cxx thbezier.h $(OUTDIR)/thbuffer.o: thbuffer.cxx thbuffer.h $(OUTDIR)/thchenc.o: thchenc.cxx thchenc.h thchencdata.h thparse.h thbuffer.h \ thmbuffer.h thchencdata.cxx therion.h thexception.h $(OUTDIR)/thchencdata.o: thchencdata.cxx $(OUTDIR)/thcmdline.o: thcmdline.cxx thcmdline.h therion.h thlogfile.h thbuffer.h \ thconfig.h thmbuffer.h thinput.h thparse.h thexporter.h thexport.h \ thobjectsrc.h thselector.h thtmpdir.h extern/getopt.h $(OUTDIR)/thcomment.o: thcomment.cxx thcomment.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thdata.h thtfangle.h \ thtf.h thtflength.h thtfpwf.h thexception.h $(OUTDIR)/thconfig.o: thconfig.cxx thconfig.h thbuffer.h thmbuffer.h thinput.h \ thparse.h thexporter.h thexport.h thobjectsrc.h thselector.h therion.h \ thlang.h thlangdata.h thchenc.h thchencdata.h thexception.h thdatabase.h \ thdataobject.h thperson.h thdate.h thdataleg.h thobjectname.h thinfnan.h \ thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h thattr.h thdb2d.h \ thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thdatareader.h \ thcsdata.h thproj.h thlogfile.h thinit.h thgeomag.h thgeomagdata.h \ thlayout.h thsymbolset.h thsymbolsetlist.h thlocale.h thcomment.h \ thdata.h thtfangle.h thtf.h thtflength.h thtfpwf.h thsketch.h thpic.h \ thcs.h $(OUTDIR)/thconvert.o: thconvert.cxx thpdfdbg.h thexception.h therion.h thbuffer.h \ thpdfdata.h thepsparse.h thtexfonts.h $(OUTDIR)/thcs.o: thcs.cxx thcs.h thcsdata.h thparse.h thbuffer.h thmbuffer.h \ thexception.h therion.h extern/proj4/proj_api.h thdatabase.h \ thdataobject.h thperson.h thdate.h thdataleg.h thobjectname.h \ thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h \ thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h \ thscrapen.h thscraplp.h $(OUTDIR)/thcsdata.o: thcsdata.cxx thcsdata.h thparse.h thbuffer.h thmbuffer.h $(OUTDIR)/thdata.o: thdata.cxx thdata.h thdataleg.h thparse.h thbuffer.h \ thmbuffer.h thobjectname.h therion.h thobjectsrc.h thinfnan.h \ thdataobject.h thdatabase.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thtfangle.h thtf.h \ thtflength.h thtfpwf.h thexception.h thsurvey.h thlayout.h thsymbolset.h \ thsymbolsetlist.h thlocale.h thgrade.h thcsdata.h thdatareader.h \ thinput.h $(OUTDIR)/thdatabase.o: thdatabase.cxx thdatabase.h thdataobject.h thperson.h \ thparse.h thbuffer.h thmbuffer.h thdate.h thdataleg.h thobjectname.h \ therion.h thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thsurvey.h thtfpwf.h thendsurvey.h \ thexception.h thdata.h thtfangle.h thtf.h thtflength.h thcmdline.h \ thdatastation.h thlookup.h thlocale.h thgrade.h thcomment.h thlayout.h \ thsymbolset.h thsymbolsetlist.h thscrap.h thsketch.h thpic.h thtrans.h \ th2ddataobject.h thpoint.h thline.h tharea.h thjoin.h thmap.h thimport.h \ thsurface.h thendscrap.h $(OUTDIR)/thdataleg.o: thdataleg.cxx thdataleg.h thparse.h thbuffer.h thmbuffer.h \ thobjectname.h therion.h thobjectsrc.h thinfnan.h thcs.h thcsdata.h $(OUTDIR)/thdataobject.o: thdataobject.cxx thdataobject.h thdatabase.h thmbuffer.h \ thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h thparse.h \ thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thexception.h thsurvey.h thtfpwf.h \ thconfig.h thinput.h thexporter.h thexport.h thselector.h thcsdata.h \ thdata.h thtfangle.h thtf.h thtflength.h thproj.h thcs.h $(OUTDIR)/thdatareader.o: thdatareader.cxx thdatareader.h thdatabase.h \ thdataobject.h thperson.h thparse.h thbuffer.h thmbuffer.h thdate.h \ thdataleg.h thobjectname.h therion.h thobjectsrc.h thinfnan.h thdb1d.h \ thobjectid.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thinput.h \ thexception.h $(OUTDIR)/thdatastation.o: thdatastation.cxx thdatastation.h thdataobject.h \ thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thexception.h $(OUTDIR)/thdate.o: thdate.cxx thdate.h thparse.h thbuffer.h thmbuffer.h \ thexception.h therion.h $(OUTDIR)/thdb1d.o: thdb1d.cxx thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thbuffer.h thmbuffer.h thobjectname.h therion.h thobjectsrc.h \ thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h thsurvey.h \ thdataobject.h thdatabase.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thtfpwf.h thsvxctrl.h \ thexception.h thdata.h thtfangle.h thtf.h thtflength.h thpoint.h \ th2ddataobject.h thlogfile.h thsurface.h thlocale.h thinit.h thinput.h \ thconfig.h thexporter.h thexport.h thselector.h thtrans.h thcs.h \ thcsdata.h $(OUTDIR)/thdb2d.o: thdb2d.cxx thdb2d.h thinfnan.h thdb2dprj.h thparse.h thbuffer.h \ thmbuffer.h thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h \ thdb2dlp.h thdb2dab.h thobjectname.h therion.h thobjectsrc.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thdb1d.h thobjectid.h thdataleg.h \ thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h thexception.h \ thdatabase.h thdataobject.h thtfangle.h thtf.h tharea.h th2ddataobject.h \ thmap.h thjoin.h thpoint.h thline.h thscrap.h thsketch.h thpic.h \ thtrans.h thsurvey.h thtfpwf.h thlogfile.h thlayout.h thsymbolset.h \ thsymbolsetlist.h thlocale.h thexpmap.h thexport.h thlang.h thlangdata.h \ thconfig.h thinput.h thexporter.h thselector.h thtmpdir.h thinit.h $(OUTDIR)/thdb2d00.o: thdb2d00.cxx thdb2d.h thinfnan.h thdb2dprj.h thparse.h \ thbuffer.h thmbuffer.h thmapstat.h thdate.h thperson.h thlegenddata.h \ thdb2dpt.h thdb2dlp.h thdb2dab.h thobjectname.h therion.h thobjectsrc.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thdb1d.h thobjectid.h \ thdataleg.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thexception.h thdatabase.h thdataobject.h thtfangle.h thtf.h tharea.h \ th2ddataobject.h thmap.h thjoin.h thpoint.h thline.h thscrap.h \ thsketch.h thpic.h thtrans.h thsurvey.h thtfpwf.h thlogfile.h thlayout.h \ thsymbolset.h thsymbolsetlist.h thlocale.h thconfig.h thinput.h \ thexporter.h thexport.h thselector.h $(OUTDIR)/thdb2dab.o: thdb2dab.cxx thdb2dab.h thobjectname.h thmbuffer.h therion.h \ thobjectsrc.h $(OUTDIR)/thdb2dcp.o: thdb2dcp.cxx thdb2dcp.h thdb2dpt.h $(OUTDIR)/thdb2dji.o: thdb2dji.cxx thdb2dji.h thobjectname.h thmbuffer.h therion.h \ thdatabase.h thdataobject.h thperson.h thparse.h thbuffer.h thdate.h \ thdataleg.h thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dmi.h \ thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h \ thscrapen.h thscraplp.h thexception.h $(OUTDIR)/thdb2dlp.o: thdb2dlp.cxx thdb2dlp.h thdb2dpt.h thline.h th2ddataobject.h \ thdataobject.h thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h \ thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h \ thdb2dprj.h thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thexpmap.h thexport.h \ thsymbolset.h thsymbolsetlist.h thlayout.h thlocale.h thlang.h \ thlangdata.h $(OUTDIR)/thdb2dmi.o: thdb2dmi.cxx thdb2dmi.h thobjectname.h thmbuffer.h therion.h \ thobjectsrc.h thparse.h thbuffer.h thexception.h $(OUTDIR)/thdb2dprj.o: thdb2dprj.cxx thdb2dprj.h thparse.h thbuffer.h thmbuffer.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thinfnan.h $(OUTDIR)/thdb2dpt.o: thdb2dpt.cxx thdb2dpt.h thexpmap.h thexport.h thparse.h \ thbuffer.h thmbuffer.h thobjectsrc.h thsymbolset.h thsymbolsetlist.h \ thlayoutclr.h thlayout.h thdataobject.h thdatabase.h thdb1d.h \ thobjectid.h thinfnan.h thdataleg.h thobjectname.h therion.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thscrapen.h thscraplp.h thlocale.h thlang.h thlangdata.h $(OUTDIR)/thdb2dxm.o: thdb2dxm.cxx thdb2dxm.h thdb2dmi.h thobjectname.h thmbuffer.h \ therion.h thobjectsrc.h thparse.h thbuffer.h $(OUTDIR)/thdb2dxs.o: thdb2dxs.cxx thdb2dxs.h thdb2dmi.h thobjectname.h thmbuffer.h \ therion.h thobjectsrc.h thparse.h thbuffer.h $(OUTDIR)/thdb3d.o: thdb3d.cxx thdb3d.h loch/lxMath.h $(OUTDIR)/thendscrap.o: thendscrap.cxx thendscrap.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thexception.h $(OUTDIR)/thendsurvey.o: thendsurvey.cxx thendsurvey.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thexception.h $(OUTDIR)/thepsparse.o: thepsparse.cxx thepsparse.h thpdfdbg.h thexception.h \ therion.h thbuffer.h thpdfdata.h thtexfonts.h thconvert.h $(OUTDIR)/therion.o: therion.cxx therion.h thlogfile.h thbuffer.h thtmpdir.h \ thcmdline.h thconfig.h thmbuffer.h thinput.h thparse.h thexporter.h \ thexport.h thobjectsrc.h thselector.h thchenc.h thchencdata.h \ thdatabase.h thdataobject.h thperson.h thdate.h thdataleg.h \ thobjectname.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thattr.h thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h \ thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h \ thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h \ thscraplp.h thdatareader.h thexception.h thlibrary.h thinit.h thgrade.h \ thdata.h thtfangle.h thtf.h thtflength.h thtfpwf.h thlayout.h \ thsymbolset.h thsymbolsetlist.h thlocale.h thpoint.h th2ddataobject.h \ thline.h tharea.h thversion.h thtexfonts.h thlang.h thlangdata.h \ thbezier.h $(OUTDIR)/thexception.o: thexception.cxx thexception.h therion.h thbuffer.h $(OUTDIR)/thexpdb.o: thexpdb.cxx thexpdb.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thexception.h therion.h thscrap.h \ thdataobject.h thdatabase.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thobjectname.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thdb2d.h thdb2dprj.h thmapstat.h thdate.h thperson.h thlegenddata.h \ thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h \ thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h \ thscraplp.h thsketch.h thpic.h thtrans.h thmap.h thdata.h thtfangle.h \ thtf.h thtflength.h thtfpwf.h thinit.h thinput.h thsurvey.h $(OUTDIR)/thexpmap.o: thexpmap.cxx thexpmap.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thsymbolset.h thsymbolsetlist.h thlayoutclr.h \ thlayout.h thdataobject.h thdatabase.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thobjectname.h therion.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thscrapen.h thscraplp.h thlocale.h thlang.h thlangdata.h thexporter.h \ thexception.h thtmpdir.h thscrap.h thsketch.h thpic.h thtrans.h \ thpoint.h th2ddataobject.h thline.h tharea.h thmap.h thconfig.h \ thinput.h thselector.h thinit.h thlogfile.h thconvert.h thpdf.h \ thpdfdata.h thepsparse.h thmpost.h thtex.h thcmdline.h thtexfonts.h \ thsurvey.h thtfpwf.h thcsdata.h thproj.h thsurface.h thtflength.h thtf.h \ thsvg.h extern/img.h thcs.h $(OUTDIR)/thexpmodel.o: thexpmodel.cxx thexpmodel.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thexception.h therion.h thdatabase.h \ thdataobject.h thperson.h thdate.h thdataleg.h thobjectname.h thinfnan.h \ thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h thattr.h thchenc.h \ thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h \ thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h \ thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h \ thscraplp.h thdata.h thtfangle.h thtf.h thtflength.h thtfpwf.h \ thsurvey.h extern/img.h thscrap.h thsketch.h thpic.h thtrans.h \ thsurface.h loch/lxFile.h thconfig.h thinput.h thexporter.h thselector.h \ thcsdata.h thproj.h thcs.h $(OUTDIR)/thexport.o: thexport.cxx thexport.h thparse.h thbuffer.h thmbuffer.h \ thobjectsrc.h thexception.h therion.h thconfig.h thinput.h thexporter.h \ thselector.h thdatabase.h thdataobject.h thperson.h thdate.h thdataleg.h \ thobjectname.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h \ thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h \ thscrapen.h thscraplp.h thcs.h thcsdata.h $(OUTDIR)/thexporter.o: thexporter.cxx thexporter.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thexception.h therion.h thconfig.h thinput.h \ thselector.h thdatabase.h thdataobject.h thperson.h thdate.h thdataleg.h \ thobjectname.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h \ thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h \ thscrapen.h thscraplp.h thexpmodel.h thexpmap.h thsymbolset.h \ thsymbolsetlist.h thlayout.h thlocale.h thlang.h thlangdata.h thexpdb.h \ thexpsys.h thexptable.h $(OUTDIR)/thexpshp.o: thexpshp.cxx thexpmap.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thsymbolset.h thsymbolsetlist.h thlayoutclr.h \ thlayout.h thdataobject.h thdatabase.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thobjectname.h therion.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thscrapen.h thscraplp.h thlocale.h thlang.h thlangdata.h thexporter.h \ thexception.h thmap.h thsketch.h thpic.h thconfig.h thinput.h \ thselector.h thtmpdir.h thinit.h thlogfile.h thcmdline.h thsurvey.h \ thtfpwf.h thsurface.h thtflength.h thtf.h extern/shapefil.h thexpmodel.h \ thcsdata.h thcs.h thexpshp.h thscrap.h thtrans.h thpoint.h \ th2ddataobject.h thline.h tharea.h $(OUTDIR)/thexpsys.o: thexpsys.cxx thexpsys.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thexception.h therion.h thdatabase.h \ thdataobject.h thperson.h thdate.h thdataleg.h thobjectname.h thinfnan.h \ thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h thattr.h thchenc.h \ thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h \ thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h \ thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h \ thscraplp.h $(OUTDIR)/thexptable.o: thexptable.cxx thexptable.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thattr.h thchenc.h thchencdata.h thexception.h \ therion.h thdatabase.h thdataobject.h thperson.h thdate.h thdataleg.h \ thobjectname.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thdata.h \ thtfangle.h thtf.h thtflength.h thtfpwf.h thexporter.h thinit.h \ thinput.h thsurvey.h thscrap.h thsketch.h thpic.h thtrans.h thpoint.h \ th2ddataobject.h thcsdata.h thproj.h thconfig.h thselector.h thcs.h $(OUTDIR)/thexpuni.o: thexpuni.cxx thexpmap.h thexport.h thparse.h thbuffer.h \ thmbuffer.h thobjectsrc.h thsymbolset.h thsymbolsetlist.h thlayoutclr.h \ thlayout.h thdataobject.h thdatabase.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thobjectname.h therion.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thscrapen.h thscraplp.h thlocale.h thlang.h thlangdata.h thexporter.h \ thexception.h thmap.h thsketch.h thpic.h thconfig.h thinput.h \ thselector.h thtmpdir.h thcsdata.h thinit.h thlogfile.h thcmdline.h \ thsurvey.h thtfpwf.h thsurface.h thtflength.h thtf.h extern/shapefil.h \ thexpmodel.h thexpuni.h thscrap.h thtrans.h thpoint.h th2ddataobject.h \ thline.h tharea.h thproj.h thcs.h $(OUTDIR)/thgeomag.o: thgeomag.cxx thgeomagdata.h $(OUTDIR)/thgrade.o: thgrade.cxx thgrade.h thdataobject.h thdatabase.h thmbuffer.h \ thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h thparse.h \ thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thdata.h thtfangle.h thtf.h \ thtflength.h thtfpwf.h thexception.h $(OUTDIR)/thimport.o: thimport.cxx thimport.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thexception.h \ thdata.h thtfangle.h thtf.h thtflength.h thtfpwf.h thsurvey.h \ thendsurvey.h extern/img.h $(OUTDIR)/thinfnan.o: thinfnan.cxx thinfnan.h $(OUTDIR)/thinit.o: thinit.cxx thinit.h thbuffer.h thmbuffer.h thinput.h thparse.h \ thchenc.h thchencdata.h therion.h thconfig.h thexporter.h thexport.h \ thobjectsrc.h thselector.h thexception.h thtexfonts.h thlang.h \ thlangdata.h thlocale.h thtmpdir.h thcs.h thcsdata.h $(OUTDIR)/thinput.o: thinput.cxx thinput.h thbuffer.h thmbuffer.h thparse.h \ thchenc.h thchencdata.h therion.h thexception.h $(OUTDIR)/thjoin.o: thjoin.cxx thjoin.h thdataobject.h thdatabase.h thmbuffer.h \ thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h thparse.h \ thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thexception.h $(OUTDIR)/thlang.o: thlang.cxx thlang.h thlangdata.h thparse.h thbuffer.h \ thmbuffer.h thlangdata.cxx thinit.h thinput.h thconfig.h thexporter.h \ thexport.h thobjectsrc.h thselector.h thdatabase.h thdataobject.h \ thperson.h thdate.h thdataleg.h thobjectname.h therion.h thinfnan.h \ thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h thattr.h thchenc.h \ thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h \ thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h \ thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h \ thscraplp.h thexception.h $(OUTDIR)/thlangdata.o: thlangdata.cxx $(OUTDIR)/thlayout.o: thlayout.cxx thlayout.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thsymbolset.h \ thsymbolsetlist.h thlocale.h thexception.h thdata.h thtfangle.h thtf.h \ thtflength.h thtfpwf.h thpdfdata.h thepsparse.h thlang.h thlangdata.h \ thcsdata.h thconfig.h thinput.h thexporter.h thexport.h thselector.h $(OUTDIR)/thlayoutclr.o: thlayoutclr.cxx thlayoutclr.h thparse.h thbuffer.h \ thmbuffer.h thdatabase.h thdataobject.h thperson.h thdate.h thdataleg.h \ thobjectname.h therion.h thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h \ thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h \ thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thscrapen.h thscraplp.h thexception.h $(OUTDIR)/thlayoutln.o: thlayoutln.cxx thlayoutln.h thlayoutclr.h thlayout.h \ thdataobject.h thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h \ thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h \ thdb2dprj.h thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h \ thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h \ thdb2dxm.h thscraplo.h thscrapen.h thscraplp.h thsymbolset.h \ thsymbolsetlist.h thlocale.h $(OUTDIR)/thlegenddata.o: thlegenddata.cxx thlegenddata.h $(OUTDIR)/thlibrary.o: thlibrary.cxx thlibrary.h thlibrarydata.cxx thdatabase.h \ thdataobject.h thperson.h thparse.h thbuffer.h thmbuffer.h thdate.h \ thdataleg.h thobjectname.h therion.h thobjectsrc.h thinfnan.h thdb1d.h \ thobjectid.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thlayout.h thsymbolset.h thsymbolsetlist.h thlocale.h thlang.h \ thlangdata.h thgrade.h thdata.h thtfangle.h thtf.h thtflength.h \ thtfpwf.h $(OUTDIR)/thlibrarydata.o: thlibrarydata.cxx thdatabase.h thdataobject.h thperson.h \ thparse.h thbuffer.h thmbuffer.h thdate.h thdataleg.h thobjectname.h \ therion.h thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thlayout.h thsymbolset.h \ thsymbolsetlist.h thlocale.h thlang.h thlangdata.h thgrade.h thdata.h \ thtfangle.h thtf.h thtflength.h thtfpwf.h $(OUTDIR)/thline.o: thline.cxx thline.h th2ddataobject.h thdataobject.h \ thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thexception.h thexpmap.h thexport.h thsymbolset.h thsymbolsetlist.h \ thlayout.h thlocale.h thlang.h thlangdata.h thtflength.h thtf.h \ thtexfonts.h thscrap.h thsketch.h thpic.h thtrans.h $(OUTDIR)/thlocale.o: thlocale.cxx thlocale.h thparse.h thbuffer.h thmbuffer.h \ thexception.h therion.h thlang.h thlangdata.h thinit.h thinput.h $(OUTDIR)/thlogfile.o: thlogfile.cxx thlogfile.h thbuffer.h therion.h $(OUTDIR)/thlookup.o: thlookup.cxx thlookup.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thlocale.h \ thexception.h thdata.h thtfangle.h thtf.h thtflength.h thtfpwf.h \ thpdfdata.h thepsparse.h thsymbolset.h thsymbolsetlist.h thlang.h \ thlangdata.h thcsdata.h thconfig.h thinput.h thexporter.h thexport.h \ thselector.h $(OUTDIR)/thmap.o: thmap.cxx thmap.h thdataobject.h thdatabase.h thmbuffer.h \ thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h thparse.h \ thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thexception.h thscrap.h thsketch.h \ thpic.h thtrans.h thtflength.h thtf.h $(OUTDIR)/thmapstat.o: thmapstat.cxx thmapstat.h thdate.h thperson.h thlegenddata.h \ thscrap.h thdataobject.h thdatabase.h thmbuffer.h thbuffer.h thdb1d.h \ thobjectid.h thinfnan.h thdataleg.h thparse.h thobjectname.h therion.h \ thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thdb2d.h thdb2dprj.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thsketch.h thpic.h thtrans.h \ thdata.h thtfangle.h thtf.h thtflength.h thtfpwf.h thmap.h thlayout.h \ thsymbolset.h thsymbolsetlist.h thlocale.h thlang.h thlangdata.h \ thversion.h thtexfonts.h thsurvey.h thconfig.h thinput.h thexporter.h \ thexport.h thselector.h thcs.h thcsdata.h $(OUTDIR)/thmbuffer.o: thmbuffer.cxx thmbuffer.h $(OUTDIR)/thmpost.o: thmpost.cxx thmpost.h $(OUTDIR)/thobjectid.o: thobjectid.cxx thobjectid.h $(OUTDIR)/thobjectname.o: thobjectname.cxx thobjectname.h thmbuffer.h therion.h \ thexception.h thbuffer.h thparse.h thdatabase.h thdataobject.h \ thperson.h thdate.h thdataleg.h thobjectsrc.h thinfnan.h thdb1d.h \ thobjectid.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thsurvey.h thtfpwf.h $(OUTDIR)/thobjectsrc.o: thobjectsrc.cxx thobjectsrc.h $(OUTDIR)/thparse.o: thparse.cxx thparse.h thbuffer.h thmbuffer.h therion.h \ thlang.h thlangdata.h thtexfonts.h thinfnan.h thdatabase.h \ thdataobject.h thperson.h thdate.h thdataleg.h thobjectname.h \ thobjectsrc.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thlegenddata.h \ thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h \ thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h \ thscraplp.h thtflength.h thtf.h thexception.h $(OUTDIR)/thpdf.o: thpdf.cxx thpdfdbg.h thexception.h therion.h thbuffer.h \ thpdfdata.h thepsparse.h thtexfonts.h thlang.h thlangdata.h thparse.h \ thmbuffer.h thversion.h thchenc.h thchencdata.h $(OUTDIR)/thpdfdata.o: thpdfdata.cxx thpdfdata.h thepsparse.h thlang.h thlangdata.h \ thparse.h thbuffer.h thmbuffer.h $(OUTDIR)/thpdfdbg.o: thpdfdbg.cxx thpdfdbg.h thexception.h therion.h thbuffer.h \ thpdfdata.h thepsparse.h $(OUTDIR)/thperson.o: thperson.cxx thperson.h thdatabase.h thdataobject.h thparse.h \ thbuffer.h thmbuffer.h thdate.h thdataleg.h thobjectname.h therion.h \ thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h thdb2dmi.h \ thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h thlayoutclr.h \ thscrapen.h thscraplp.h thexception.h $(OUTDIR)/thpic.o: thpic.cxx thpic.h thbuffer.h thdatabase.h thdataobject.h \ thperson.h thparse.h thmbuffer.h thdate.h thdataleg.h thobjectname.h \ therion.h thobjectsrc.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thinit.h thinput.h thtmpdir.h \ thexception.h $(OUTDIR)/thpoint.o: thpoint.cxx thpoint.h th2ddataobject.h thdataobject.h \ thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h \ thexception.h thexpmap.h thexport.h thsymbolset.h thsymbolsetlist.h \ thlayout.h thlocale.h thlang.h thlangdata.h thtflength.h thtf.h \ thtexfonts.h thscrap.h thsketch.h thpic.h thtrans.h $(OUTDIR)/thproj.o: thproj.cxx thexception.h therion.h thbuffer.h \ extern/proj4/proj_api.h $(OUTDIR)/thscrap.o: thscrap.cxx thscrap.h thdataobject.h thdatabase.h thmbuffer.h \ thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h thparse.h \ thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thsketch.h thpic.h thtrans.h \ thexception.h thtflength.h thtf.h th2ddataobject.h thline.h thpoint.h \ thscrapis.h thsurvey.h thtfpwf.h thsymbolset.h thsymbolsetlist.h \ thcsdata.h $(OUTDIR)/thscrapen.o: thscrapen.cxx thscrapen.h $(OUTDIR)/thscrapis.o: thscrapis.cxx thscrapis.h thdb3d.h loch/lxMath.h thscrap.h \ thdataobject.h thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thsketch.h thpic.h \ thtrans.h thpoint.h th2ddataobject.h thline.h thconfig.h thinput.h \ thexporter.h thexport.h thselector.h extern/poly2tri/poly2tri.h \ extern/poly2tri/common/shapes.h extern/poly2tri/sweep/cdt.h \ extern/poly2tri/sweep/advancing_front.h \ extern/poly2tri/sweep/../common/shapes.h \ extern/poly2tri/sweep/sweep_context.h extern/poly2tri/sweep/sweep.h \ thsurvey.h thtfpwf.h $(OUTDIR)/thscraplo.o: thscraplo.cxx thscraplo.h $(OUTDIR)/thscraplp.o: thscraplp.cxx thscraplp.h thdb1d.h thobjectid.h thinfnan.h \ thdataleg.h thparse.h thbuffer.h thmbuffer.h thobjectname.h therion.h \ thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h \ thscrap.h thdataobject.h thdatabase.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thsketch.h thpic.h thtrans.h \ thexpmap.h thexport.h thsymbolset.h thsymbolsetlist.h thlayout.h \ thlocale.h thlang.h thlangdata.h $(OUTDIR)/thselector.o: thselector.cxx thselector.h thexception.h therion.h \ thbuffer.h thconfig.h thmbuffer.h thinput.h thparse.h thexporter.h \ thexport.h thobjectsrc.h thdatabase.h thdataobject.h thperson.h thdate.h \ thdataleg.h thobjectname.h thinfnan.h thdb1d.h thobjectid.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thsurvey.h thtfpwf.h \ th2ddataobject.h thscrap.h thsketch.h thpic.h thtrans.h thmap.h $(OUTDIR)/thsketch.o: thsketch.cxx therion.h thsketch.h thpic.h thscrap.h \ thdataobject.h thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thparse.h thobjectname.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thtrans.h \ thwarpp.h thwarp.h thwarppme.h thwarppdef.h thwarppt.h thconfig.h \ thinput.h thexporter.h thexport.h thselector.h $(OUTDIR)/thsurface.o: thsurface.cxx thsurface.h thdb3d.h loch/lxMath.h \ thdataobject.h thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thparse.h thobjectname.h therion.h thobjectsrc.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thtflength.h thtf.h \ thexception.h thcsdata.h thdatareader.h thinput.h $(OUTDIR)/thsurvey.o: thsurvey.cxx thsurvey.h thdataobject.h thdatabase.h \ thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thinfnan.h thdataleg.h \ thparse.h thobjectname.h therion.h thobjectsrc.h thdb3d.h loch/lxMath.h \ thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h \ thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thtfpwf.h \ thexception.h thtfangle.h thtf.h thdata.h thtflength.h $(OUTDIR)/thsvg.o: thsvg.cxx thepsparse.h thpdfdbg.h thexception.h therion.h \ thbuffer.h thpdfdata.h thversion.h thlegenddata.h $(OUTDIR)/thsvxctrl.o: thsvxctrl.cxx thsvxctrl.h thdataleg.h thparse.h thbuffer.h \ thmbuffer.h thobjectname.h therion.h thobjectsrc.h thinfnan.h \ thdatabase.h thdataobject.h thperson.h thdate.h thdb1d.h thobjectid.h \ thdb3d.h loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h \ thdb2dprj.h thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h \ thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h \ thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thtmpdir.h thdata.h \ thtfangle.h thtf.h thtflength.h thtfpwf.h thexception.h thinit.h \ thinput.h thconfig.h thexporter.h thexport.h thselector.h thsurvey.h \ thcs.h thcsdata.h thlogfile.h extern/img.h $(OUTDIR)/thsymbolset.o: thsymbolset.cxx thsymbolset.h thsymbolsetlist.h \ thlayoutclr.h thparse.h thbuffer.h thmbuffer.h thpoint.h \ th2ddataobject.h thdataobject.h thdatabase.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thobjectname.h therion.h thobjectsrc.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thscrapen.h thscraplp.h thline.h tharea.h \ thexception.h thpdfdata.h thepsparse.h thlayout.h thlocale.h \ thtexfonts.h thlang.h thlangdata.h thtmpdir.h thcmdline.h thmpost.h \ thinit.h thinput.h thsymbolsets.h thlogfile.h $(OUTDIR)/thsymbolsets.o: thsymbolsets.cxx thsymbolsets.h thsymbolsetlist.h $(OUTDIR)/thtex.o: thtex.cxx thtex.h $(OUTDIR)/thtexenc.o: thtexenc.cxx $(OUTDIR)/thtexfonts.o: thtexfonts.cxx thtexfonts.h thtexenc.cxx thpdfdbg.h \ thexception.h therion.h thbuffer.h thinit.h thmbuffer.h thinput.h \ thparse.h thpdfdata.h thepsparse.h $(OUTDIR)/thtf.o: thtf.cxx thtf.h thexception.h therion.h thbuffer.h thparse.h \ thmbuffer.h $(OUTDIR)/thtfangle.o: thtfangle.cxx thparse.h thbuffer.h thmbuffer.h thtfangle.h \ thtf.h thexception.h therion.h thinfnan.h $(OUTDIR)/thtflength.o: thtflength.cxx thtflength.h thtf.h thparse.h thbuffer.h \ thmbuffer.h thexception.h therion.h $(OUTDIR)/thtfpwf.o: thtfpwf.cxx thtfpwf.h thexception.h therion.h thbuffer.h \ thinfnan.h thparse.h thmbuffer.h $(OUTDIR)/thtmpdir.o: thtmpdir.cxx thtmpdir.h thbuffer.h therion.h thinit.h \ thmbuffer.h thinput.h thparse.h $(OUTDIR)/thtrans.o: thtrans.cxx thtrans.h thinfnan.h thdatabase.h thdataobject.h \ thperson.h thparse.h thbuffer.h thmbuffer.h thdate.h thdataleg.h \ thobjectname.h therion.h thobjectsrc.h thdb1d.h thobjectid.h thdb3d.h \ loch/lxMath.h thattr.h thchenc.h thchencdata.h thdb2d.h thdb2dprj.h \ thmapstat.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h $(OUTDIR)/thwarp.o: thwarp.cxx thwarp.h thpic.h thsketch.h thdb1d.h thobjectid.h \ thinfnan.h thdataleg.h thparse.h thbuffer.h thmbuffer.h thobjectname.h \ therion.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h thchenc.h \ thchencdata.h thscrap.h thdataobject.h thdatabase.h thdb2d.h thdb2dprj.h \ thmapstat.h thdate.h thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h \ thdb2dab.h thdb2dji.h thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h \ thscraplo.h thlayoutln.h thlayoutclr.h thscrapen.h thscraplp.h thtrans.h \ th2ddataobject.h thpoint.h thconfig.h thinput.h thexporter.h thexport.h \ thselector.h $(OUTDIR)/thwarpp.o: thwarpp.cxx thwarpp.h thwarp.h thpic.h thsketch.h thwarppme.h \ thwarppdef.h therion.h thtrans.h thinfnan.h thwarppt.h thdataobject.h \ thdatabase.h thmbuffer.h thbuffer.h thdb1d.h thobjectid.h thdataleg.h \ thparse.h thobjectname.h thobjectsrc.h thdb3d.h loch/lxMath.h thattr.h \ thchenc.h thchencdata.h thdb2d.h thdb2dprj.h thmapstat.h thdate.h \ thperson.h thlegenddata.h thdb2dpt.h thdb2dlp.h thdb2dab.h thdb2dji.h \ thdb2dmi.h thdb2dcp.h thdb2dxs.h thdb2dxm.h thscraplo.h thlayoutln.h \ thlayoutclr.h thscrapen.h thscraplp.h thscrap.h th2ddataobject.h \ thpoint.h thconfig.h thinput.h thexporter.h thexport.h thselector.h $(OUTDIR)/thwarppme.o: thwarppme.cxx thinfnan.h thwarppme.h thwarppdef.h therion.h \ thtrans.h $(OUTDIR)/thwarppt.o: thwarppt.cxx thwarppt.h thtrans.h thinfnan.h thwarppme.h \ thwarppdef.h therion.h therion/thsvxctrl.h0000664000175000017500000000353712042433106013463 0ustar useruser/** * @file thsvxctrl.h * Survex controler. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thsvxctrl_h #define thsvxctrl_h #include #include "thdataleg.h" #include "thobjectsrc.h" #include typedef std::map < unsigned long, thobjectsrc * > thsvxctrl_src_maptype; ///< Source map type. /** * Survex controler. */ class thsvxctrl { thdataleg pdl; double meridian_convergence, lastleggridmc; int lastleggridmccs; unsigned long svxf_ln; thsvxctrl_src_maptype src_map; FILE * svxf; void write_survey_leg(thdataleg * legp); void write_survey_fix(thdatafix * fixp); void write_double(double dd); void transcript_log_file(class thdatabase * dbp, const char * lfnm); public: /** * Standard constructor. */ thsvxctrl(); /** * Destructor. */ ~thsvxctrl(); /** * Process survey data in given database. */ void process_survey_data(class thdatabase * dbp); }; #endif therion/thdataobject.h0000664000175000017500000002143212337637543014072 0ustar useruser/** * @file thdataobject.h * Main data class module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdataobject_h #define thdataobject_h #include "thdatabase.h" #include "thperson.h" #include "thparse.h" #include "thdate.h" #include "thdataleg.h" #include #include /** * Command tokens. */ enum { TT_UNKNOWN_CMD, TT_DATAOBJECT_CMD, TT_DATASTATION_CMD, TT_2DDATAOBJECT_CMD, TT_SURVEY_CMD, TT_ENDSURVEY_CMD, TT_GRADE_CMD, TT_LAYOUT_CMD, TT_COMMENT_CMD, TT_SCRAP_CMD, TT_ENDSCRAP_CMD, TT_POINT_CMD, TT_LINE_CMD, TT_AREA_CMD, TT_JOIN_CMD, TT_MAP_CMD, TT_SURFACE_CMD, TT_DATA_CMD, TT_IMPORT_CMD, TT_SKETCH_CMD, TT_LOOKUP_CMD, }; /** * Command parsing table. */ static const thstok thtt_commands[] = { {"area", TT_AREA_CMD}, {"centerline", TT_DATA_CMD}, {"centreline", TT_DATA_CMD}, {"comment", TT_COMMENT_CMD}, {"endscrap", TT_ENDSCRAP_CMD}, {"endsurvey", TT_ENDSURVEY_CMD}, {"grade", TT_GRADE_CMD}, {"import", TT_IMPORT_CMD}, {"join", TT_JOIN_CMD}, {"layout", TT_LAYOUT_CMD}, {"line", TT_LINE_CMD}, {"lookup", TT_LOOKUP_CMD}, {"map", TT_MAP_CMD}, {"point", TT_POINT_CMD}, {"scrap", TT_SCRAP_CMD}, {"sketch", TT_SKETCH_CMD}, {"surface", TT_SURFACE_CMD}, {"survey", TT_SURVEY_CMD}, {NULL, TT_UNKNOWN_CMD}, }; /** * Dataobject command options tokens. */ enum { TT_DATAOBJECT_UNKNOWN = 1000, TT_DATAOBJECT_NAME = 1001, TT_DATAOBJECT_TITLE = 1002, TT_DATAOBJECT_AUTHOR = 1003, TT_DATAOBJECT_COPYRIGHT = 1004, TT_DATAOBJECT_STNS = 1005, TT_DATAOBJECT_CS = 1006, TT_DATAOBJECT_ATTR = 1007, }; /** * Dataobject command options parsing table. */ static const thstok thtt_dataobject_opt[] = { {"attr", TT_DATAOBJECT_ATTR}, {"author", TT_DATAOBJECT_AUTHOR}, {"copyright", TT_DATAOBJECT_COPYRIGHT}, {"cs", TT_DATAOBJECT_CS}, {"id", TT_DATAOBJECT_NAME}, {"station-names", TT_DATAOBJECT_STNS}, {"title", TT_DATAOBJECT_TITLE}, {NULL, TT_DATAOBJECT_UNKNOWN}, }; /** * Option description class. */ class thcmd_option_desc { public: int id, ///< Option identifier. nargs; ///< Number of option arguments. /** * Standard constructor. */ thcmd_option_desc() : id(TT_DATAOBJECT_UNKNOWN), nargs(1) {} /** * Constructor. * * @param oid Option id. */ thcmd_option_desc(int oid) : id(oid), nargs(1) {} /** * Constructor. * * @param oid Option id. * @param nas Number of arguments. */ thcmd_option_desc(int oid, int nas) : id(oid), nargs(nas) {} }; /** * Dataobject author class. */ class thdataobject_author { /** * Comparison operator. */ friend bool operator < (const thdataobject_author & a1, const thdataobject_author & a2); public: thperson name; ///< Author's name unsigned long rev; ///< Object's revision. /** * Standard constructor. */ thdataobject_author() : name(), rev(0) {} /** * Default constructor. */ thdataobject_author(thperson an, unsigned long rv) : name(an), rev(rv) {} }; /* * * Dataobject copyright class. */ class thdataobject_copyright { /** * Comparison operator. */ friend bool operator < (const thdataobject_copyright & c1, const thdataobject_copyright & c2); public: const char * name; ///< Author's name unsigned long rev; ///< Object's revision. /** * Standard constructor. */ thdataobject_copyright() : name(""), rev(0) {} /** * Default constructor. */ thdataobject_copyright(const char * nn, unsigned long rv) : name(nn), rev(rv) {} }; typedef std::map thdo_author_map_type; ///< Author's map type typedef std::map thdo_copyright_map_type; ///< Copyright's map type /** * Main data object class. * * Father object of all data object. Main database item. */ class thdataobject { public: friend class thdatabase; friend class thdb1d; friend class thdb2d; friend class thselector; class thdatabase * db; const char * name, ///< Object name. * title, ///< Object title. * stnpref, ///< Station names prefix; * stnsuff; ///< Station names suffix; unsigned long id; ///< Object identifier. bool selected, ///< Whether object is selected. tmp_bool; ///< Temporary variable for some algorithms unsigned long selected_number, ///< Number of selection. tmp_ulong; ///< Temporary variable for some algorithms thdataobject * nsptr, ///< Next object in survey. * psptr; ///< Previous object in survey. class thsurvey * fsptr; ///< Father survey ptr. unsigned long revision; ///< Object revision. thobjectsrc source; ///< Object source. thperson dotmp_person; ///< Temporary person. thdate dotmp_date; ///< Temporary date. thdataobject_author dotmp_author; ///< Temporary author. thdataobject_copyright dotmp_copyright; ///< Temporary author. thdo_author_map_type author_map; ///< Author map. thdo_copyright_map_type copyright_map; ///< Copyright map. int cs; ///< Coordinate system. thobjectsrc cs_source; ///< Coordinate system source. public: /** * Standard constructor. */ thdataobject(); /** * Standard destructor. */ virtual ~thdataobject(); /** * Assign database to object. */ void assigndb(thdatabase * pdb); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thdataobject";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Whether multiple ends. */ virtual bool get_cmd_ends_state(); /** * Whether cmd is end. */ virtual bool get_cmd_ends_match(char * cmd); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Returns object id. */ virtual int get_id(); /** * Return object name. */ virtual const char * get_name(); /** * Return object title. */ const char * get_title(); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Get context for object. */ virtual int get_context(); /** * Print object contents into file. */ void self_print(FILE * outf); /** * Print object contents into file. */ virtual void self_print_properties(FILE * outf); /** * Write object source to exception description. */ virtual void throw_source(); /** * Complete object settings. * * This method is called, before object is inserted into database, * or configuration is ended. */ virtual void start_insert(); /** * Return father survey. */ class thsurvey * get_father_survey() {return this->fsptr;} /** * Whether object is selected. */ bool is_selected() {return this->selected;} /** * Is inside other survey. */ bool is_in_survey(thsurvey * psearch); /** * Convert coordinates according to current CS specification. */ void convert_cs(char * src_x, char * src_y, double & dst_x, double & dst_y); /** * Parse object attributes. */ void parse_attribute(char * name, char * value); }; #endif therion/thtfangle.h0000664000175000017500000000346210625655142013406 0ustar useruser/** * @file thtfangle.h * Units transformation class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtfangle_h #define thtfangle_h #include "thtf.h" #include "thparse.h" enum {TT_TFU_DEG, TT_TFU_DMS, TT_TFU_GRAD, TT_TFU_MIN, TT_TFU_PERC, TT_TFU_UNKNOWN_ANGLE}; static const thstok thtt_tfunits_angle[] = { {"deg", TT_TFU_DEG}, {"degree", TT_TFU_DEG}, {"degrees", TT_TFU_DEG}, {"grad", TT_TFU_GRAD}, {"grads", TT_TFU_GRAD}, {"mil",TT_TFU_GRAD}, {"mils", TT_TFU_GRAD}, {"min", TT_TFU_MIN}, {"minute", TT_TFU_MIN}, {"minutes", TT_TFU_MIN}, {"percent", TT_TFU_PERC}, {"percentage", TT_TFU_PERC}, {NULL, TT_TFU_UNKNOWN_ANGLE}, }; /** * Angle transformation class. */ class thtfangle : public thtf { public: bool allow_percentage; /** * Parse units factor. */ thtfangle(); virtual void parse_units(char * ustr); virtual double transform(double value); }; #endif therion/therion.cxx0000664000175000017500000002202711575403562013455 0ustar useruser/** * @file therion.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "therion.h" #include "thlogfile.h" #include "thtmpdir.h" #include "thcmdline.h" #include "thconfig.h" #include "thinput.h" #include "thchenc.h" #include "thdatabase.h" #include "thdatareader.h" #include "thexception.h" #include "thlibrary.h" #include "thinit.h" #include "thgrade.h" #include "thlayout.h" #include "thobjectsrc.h" #include "thpoint.h" #include "thline.h" #include "tharea.h" #include "thversion.h" #include "thtexfonts.h" #include "thlang.h" #include "thbezier.h" #include "thsymbolset.h" #include #include #include #include extern const thstok thtt__texts []; int therion_exit_state = 2; bool thverbose_mode = true; bool thtext_inline = false; char * thexecute_cmd = NULL; const char * thhelp_text = "\ntherion [-q] [-L] [-l log-file]\n" "\t[-s source-file] [-p search-path]\n" "\t[-d] [-x] [cfg-file]\n\n" "therion [-h|--help]\n" " [-v|--version]\n" " [--print-encodings]\n" " [--print-init-file]\n" " [--print-tex-encodings]\n" " [--print-environment]\n" " [--print-symbols]\n\n"; const char * thversion_text = THVERSION; const char * thversion_format = "therion %s"; void thprintf(const char *format, ...) { va_list args; va_start(args, format); thlog.vprintf(format, &args); va_end(args); if (thverbose_mode) { va_start(args, format); vfprintf(stdout, format, args); va_end(args); } } void thprintf2err(const char *format, ...) { va_list args; va_start(args, format); thlog.vprintf(format, &args); va_end(args); va_start(args, format); vfprintf(stderr, format, args); va_end(args); } void thprint_environment() { thprintf("\n\nINIT=%s\n",thcfg.get_initialization_path()); thprintf("SOURCE=%s\n\n",thcfg.get_search_path()); thprintf("CAVERN=%s\n",thini.get_path_cavern()); thprintf("METAPOST=%s\n",thini.get_path_mpost()); thprintf("PDFTEX=%s\n",thini.get_path_pdftex()); thprintf("IDENTIFY=%s\n",thini.get_path_identify()); thprintf("CONVERT=%s\n",thini.get_path_convert()); } void thprint_xtherion() { bool already_exported; int i, j, l; const char * lngstr, *trnstr, * tsrc; thbuffer tdst; std::string tss; thprintf("set xth(point_types) {\n"); for(i = 0; thtt_point_types[i].tok != TT_POINT_TYPE_UNKNOWN; i++) { already_exported = false; for(j = 0; j < i; j++) { if (thtt_point_types[i].tok == thtt_point_types[j].tok) { already_exported = true; break; } } if (!already_exported) { thprintf("\t%s\n",thtt_point_types[i].s); } } thprintf("}\n\nset xth(line_types) {\n"); for(i = 0; thtt_line_types[i].tok != TT_LINE_TYPE_UNKNOWN; i++) { already_exported = false; for(j = 0; j < i; j++) { if (thtt_line_types[i].tok == thtt_line_types[j].tok) { already_exported = true; break; } } if (!already_exported) { thprintf("\t%s\n",thtt_line_types[i].s); } } thprintf("}\n\nset xth(area_types) {\n"); for(i = 0; thtt_area_types[i].tok != TT_AREA_TYPE_UNKNOWN; i++) { already_exported = false; for(j = 0; j < i; j++) { if (thtt_area_types[i].tok == thtt_area_types[j].tok) { already_exported = true; break; } } if (!already_exported) { thprintf("\t%s\n",thtt_area_types[i].s); } } thprintf("}\n"); tss = ""; const thstok * x = thlang_get_text_table(); while (x->s != NULL) { tsrc = x->s; l = 0; lngstr = thlang_getid(l); while (strlen(lngstr) > 0) { trnstr = thT(tsrc, l); if (strcmp(trnstr, tsrc) != 0) { thdecode_tcl(&tdst, trnstr); tss += "::msgcat::mcset "; tss += lngstr; tss += " \""; tss += tsrc; tss += "\" [encoding convertfrom utf-8 \""; tss += tdst.get_buffer(); tss += "\"]\n"; } l++; lngstr = thlang_getid(l); } x = &(x[1]); } thprintf("\n%s", tss.c_str()); } void thprint_xth_lines() { } void thpause_exit() { #ifdef THWIN32 if (thverbose_mode && (!(thcfg.generate_xthcfg))) { thprintf("Press ENTER to exit!"); getchar(); } #endif } void thexit(int exit_code) { if (exit_code == EXIT_FAILURE) thcfg.xth_save(); exit(exit_code); } int main(int argc, char * argv[]) { #ifndef THDEBUG #ifndef THMSVC try { #endif #endif time_t tmUserStart = time(NULL); // turn off buffering setvbuf(stdout,NULL,_IONBF,0); thcfg.assign_db(&thdb); // set some system parameters thexecute_cmd = argv[0]; // process command line thcmdln.process(argc, argv); // print some help messages and exit if demanded if (thcmdln.get_version_disp_state()) { thprintf(thversion_format, thversion_text); thprintf("\n"); thexit(EXIT_SUCCESS); } if (thcmdln.m_bezier) { thbezier_main(); thexit(EXIT_SUCCESS); } if (thcmdln.get_help_disp_state()) { thprintf(thhelp_text); thexit(EXIT_SUCCESS); } switch (thcmdln.get_print_state()) { case THPS_ENCODINGS: thprint_encodings(); thexit(EXIT_SUCCESS); case THPS_TEX_ENCODINGS: print_tex_encodings(); thexit(EXIT_SUCCESS); case THPS_INIT_FILE: thprint_init_file(); thexit(EXIT_SUCCESS); case THPS_XTHERION_SRC: thprint_xtherion(); thexit(EXIT_SUCCESS); } // print version information thprintf(thversion_format, thversion_text); thprintf("\n"); // load initialization file thini.load(); // initialize database thdb.clear(); // load therion library thlibrary_init(); switch (thcmdln.get_print_state()) { case THPS_SYMBOLS: export_all_symbols(); thexit(EXIT_SUCCESS); } // load configuration from file thcfg.load(); switch (thcmdln.get_print_state()) { case THPS_PATHS: thprint_environment(); thexit(EXIT_SUCCESS); } // load input thconfig_src_list * sources = thcfg.get_sources(); thconfig_src_list::iterator srcit; if (sources->size() == 0) therror(("source files not specified")); #ifndef THDEBUG thprintf("reading source files ... "); thtext_inline = true; #endif for(srcit = sources->begin(); srcit != sources->end(); srcit++) { #ifdef THDEBUG thprintf("\nreading input -- %s\n", srcit->fname); #endif thdbreader.read(srcit->fname, srcit->startln, srcit->endln, thcfg.get_search_path(), &thdb); #ifdef THDEBUG thprintf("input read\n"); #endif } #ifndef THDEBUG thprintf("done\n"); thtext_inline = false; #endif // After reading printing switch (thcmdln.get_print_state()) { case THPS_LIB_SRC: thdb.self_print_library(); thexit(EXIT_SUCCESS); } // process 2D references thdb.preprocess(); // process survey data thdb.db1d.process_data(); // process 2D references thdb.db2d.process_references(); // selecting objects for output #ifdef THDEBUG thprintf("\n\nselecting export objects\n"); #else thprintf("selecting export objects ... "); thtext_inline = true; #endif thcfg.select_data(); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif // make export thcfg.export_data(); // save configuration thcfg.save(); thcfg.xth_save(); #ifdef THDEBUG thprintf("\n\nlisting database\n"); if (thverbose_mode) thdb.self_print(stdout); thdb.self_print(thlog.get_fileh()); thprintf("\ndatabase listed\n\n"); #endif // write the CPU time thprintf("compilation time: %.0f sec\n", difftime(time(NULL), tmUserStart)); #ifdef THDEBUG thprintf("\n"); #endif // log statistics thdb.db1d.print_loops(); thdb.db2d.log_distortions(); //#ifdef THMSVC // getchar(); //#endif //exit the program return(EXIT_SUCCESS); #ifndef THDEBUG #ifndef THMSVC } catch(...) { if (strlen(thexc.get_buffer()) == 0) { therror(("unknown exception")); } else { therror((thexc.get_desc())); } } #endif #endif } therion/thimport.h0000664000175000017500000000773710721450262013302 0ustar useruser/** * @file thimport.h * import module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thimport_h #define thimport_h #include "thdataobject.h" /** * import command options tokens. */ enum { TT_IMPORT_UNKNOWN = 2000, TT_IMPORT_FORMAT = 2001, TT_IMPORT_FILTER = 2002, TT_IMPORT_SURVEYS = 2003, TT_IMPORT_CALIB = 2004, }; /** * import command options parsing table. */ static const thstok thtt_import_opt[] = { {"calibrate", TT_IMPORT_CALIB}, {"filter", TT_IMPORT_FILTER}, {"fmt", TT_IMPORT_FORMAT}, {"format", TT_IMPORT_FORMAT}, {"surveys", TT_IMPORT_SURVEYS}, {NULL, TT_IMPORT_UNKNOWN}, }; enum { TT_IMPORT_FMT_UNKNOWN, TT_IMPORT_FMT_3D, TT_IMPORT_FMT_PLT, TT_IMPORT_FMT_XYZ, }; /** * import types parsing table. */ static const thstok thtt_import_fmts[] = { {"3d", TT_IMPORT_FMT_3D}, {"plt", TT_IMPORT_FMT_PLT}, {"xyz", TT_IMPORT_FMT_XYZ}, {NULL, TT_IMPORT_FMT_UNKNOWN}, }; enum { TT_IMPORT_SURVEYS_UNKNOWN, TT_IMPORT_SURVEYS_CREATE, TT_IMPORT_SURVEYS_USE, TT_IMPORT_SURVEYS_IGNORE, }; /** * import types parsing table. */ static const thstok thtt_import_surveys[] = { {"create", TT_IMPORT_SURVEYS_CREATE}, {"ignore", TT_IMPORT_SURVEYS_IGNORE}, {"use", TT_IMPORT_SURVEYS_USE}, {NULL, TT_IMPORT_SURVEYS_UNKNOWN}, }; /** * import class. */ class thimport : public thdataobject { public: // insert here real properties int format, surveys; const char * fname, * filter; thobjectsrc mysrc; double calib_x, calib_y, calib_z; /** * Standard constructor. */ thimport(); /** * Standard destructor. */ virtual ~thimport(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thimport";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Get context for object. */ virtual int get_context(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); void set_file_name(char * fnm); void import_file(); void import_file_img(); void parse_calib(char * spec, int enc); const char * station_name(const char * sn, const char separator, struct thsst * sst); }; #endif therion/thdb2dji.cxx0000664000175000017500000000472210625655142013477 0ustar useruser/** * @file thdb2dji.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2dji.h" #include "thdatabase.h" #include "thexception.h" #include "thdb2dpt.h" #include "thdb2dlp.h" #include "thdataobject.h" thdb2dji::thdb2dji() { this->prev_item = NULL; this->next_item = NULL; this->prev_list = NULL; this->next_list = NULL; this->prev_list_item = NULL; this->next_list_item = NULL; this->name.clear(); this->mark = NULL; this->is_active = false; this->point = NULL; this->cp1 = NULL; this->cp2 = NULL; this->line_point = NULL; this->object = NULL; } void thdb2dji::parse_item(char * istr) { /* thdb.buff_tmp.strcpy(istr); char * p_name = thdb.buff_tmp.get_buffer(), * s_name = "", * tmpch; tmpch = p_name; size_t snl = strlen(istr), sni; for(sni = 0; sni < snl; sni++, tmpch++) if (*tmpch == '@') { *tmpch = 0; s_name = tmpch + 1; break; } thsplit_strings(& thdb.db2d.mbf, p_name, ':'); */ thsplit_strings(& thdb.db2d.mbf, istr, ':'); int npar = thdb.db2d.mbf.get_size(); char ** pars = thdb.db2d.mbf.get_buffer(); if ((npar < 1) && (npar > 2)) ththrow(("invalid join item -- %s",istr)) if (npar == 2) { this->mark = thdb.strstore(pars[1]); if (!th_is_keyword(this->mark)) ththrow(("line mark not a keyword -- %s",istr)) } /* thdb.buff_enc.strcpy(pars[0]); if (strlen(s_name) > 0) { thdb.buff_enc += "@"; thdb.buff_enc += s_name; }*/ // thparse_objectname(this->name, & thdb.buff_stations, thdb.buff_enc.get_buffer()); thparse_objectname(this->name, & thdb.buff_stations, pars[0]); } therion/thjoin.cxx0000664000175000017500000000720510721450474013275 0ustar useruser/** * @file thjoin.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thjoin.h" #include "thexception.h" #include "thchenc.h" #include "thparse.h" thjoin::thjoin() { this->smooth = TT_TRUE; this->count = 1; this->proj = NULL; this->proj_next_join = NULL; this->proj_prev_join = NULL; this->first_item = NULL; this->last_item = NULL; } thjoin::~thjoin() { } int thjoin::get_class_id() { return TT_JOIN_CMD; } bool thjoin::is(int class_id) { if (class_id == TT_JOIN_CMD) return true; else return thdataobject::is(class_id); } int thjoin::get_cmd_nargs() { return 2; } const char * thjoin::get_cmd_end() { return NULL; } const char * thjoin::get_cmd_name() { return "join"; } thcmd_option_desc thjoin::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_join_opt); if (id == TT_JOIN_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else return thcmd_option_desc(id); } void thjoin::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { double dv; int sv; switch (cod.id) { // replace this by real properties setting case TT_JOIN_SMOOTH: this->smooth = thmatch_token(*args, thtt_bool); if (this->smooth == TT_UNKNOWN_BOOL) ththrow(("invalid switch -- %s",*args)) break; case TT_JOIN_COUNT: thparse_double(sv,dv,*args); if ((sv != TT_SV_NUMBER) || (dv <= 1.0) || (dv != double(int(dv)))) ththrow(("invalid join count -- %s",*args)) this->count = int(dv); break; // if not found, try to set fathers properties default: if (cod.id < 1000) this->parse_item(*args); else thdataobject::set(cod, args, argenc, indataline); } } void thjoin::self_delete() { delete this; } void thjoin::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thjoin:\n"); fprintf(outf,"\tsmooth: %d\n",this->smooth); if (this->first_item != NULL) { fprintf(outf,"\tjoined items:\n"); thdb2dji * cbl = this->first_item; while (cbl != NULL) { fprintf(outf,"\t\t"); fprintf(outf,cbl->name); if (cbl->mark != NULL) fprintf(outf,":%s",cbl->mark); fprintf(outf,"\n"); cbl = cbl->next_item; } } // insert intended print of object properties here } void thjoin::parse_item(char * istr) { thdb2dji * citem = this->db->db2d.insert_join_item(); citem->parse_item(istr); if (this->last_item == NULL) { this->first_item = citem; this->last_item = citem; } else { this->last_item->next_item = citem; citem->prev_item = this->last_item; this->last_item = citem; } } int thjoin::get_context() { return (THCTX_SURVEY | THCTX_NONE | THCTX_SCRAP); } therion/thdb1d.cxx.orig0000664000175000017500000032752212447635032014120 0ustar useruser/** * @file thdb1d.cxx */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb1d.h" #include "thsurvey.h" #include "thobjectname.h" #include #include "thsvxctrl.h" #include "thdataobject.h" #include "thdatabase.h" #include "thdataleg.h" #include "thexception.h" #include "thdata.h" #include "thinfnan.h" #include #include #include "thpoint.h" #include "thlogfile.h" #include "thsurface.h" #include "thlocale.h" #include "thinit.h" #include "thconfig.h" #include "thtrans.h" #include "loch/lxMath.h" #include "thcs.h" #ifdef THMSVC #define hypot _hypot #endif //#define THUSESVX //#define THDEBUG thdb1d::thdb1d() { this->db = NULL; this->tree_legs = NULL; this->num_tree_legs = 0; this->lsid = 0; this->nlength = 0.0; this->tree_arrows = NULL; this->tree_nodes = NULL; this->min_year = thnan; this->max_year = thnan; this->d3_data_parsed = false; } void thdb1ds::export_mp_flags(FILE * out) { fprintf(out, "ATTR__stationflag_splay := %s;\n", (this->is_temporary() ? "true" : "false")); } void thdb1ds::set_temporary(const char * name) { temps = TT_TEMPSTATION_NONE; if (name != NULL) { switch (name[0]) { case '.': temps = TT_TEMPSTATION_FEATURE; break; case '-': temps = TT_TEMPSTATION_WALL; break; } } } thdb1d::~thdb1d() { if (this->tree_legs != NULL) delete [] this->tree_legs; if (this->tree_arrows != NULL) delete [] this->tree_arrows; if (this->tree_nodes != NULL) delete [] this->tree_nodes; } void thdb1d::assigndb(thdatabase * dbptr) { this->db = dbptr; } void thdb1d::scan_data() { thdb_object_list_type::iterator obi = this->db->object_list.begin(); thdataleg_list::iterator lei; thdatafix_list::iterator fii; thdatamark_list::iterator mii; thdatass_list::iterator ssi; thdataextend_list::iterator xi; thdataequate_list::iterator eqi; thstdims_list::iterator di; double meridian_convergence = thcfg.get_outcs_convergence(), declin, leggridmc, lastleggridmc(0.0); int lastleggridmccs = TTCS_LOCAL; thdata * dp; unsigned used_declination = 0; unsigned long prevlsid; double dcc, sindecl, cosdecl, tmpx, tmpy; thdb1ds * tsp1, * tsp2; // Temporary stations. this->min_year = thnan; this->max_year = thnan; obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); if (dp->date.is_defined()) { double syear, eyear; syear = dp->date.get_start_year(); eyear = syear; if (dp->date.is_interval()) eyear = dp->date.get_end_year(); if (thisnan(this->min_year)) { this->min_year = syear; this->max_year = eyear; } else { if (this->min_year > syear) this->min_year = syear; if (this->max_year < eyear) this->max_year = eyear; } } bool dpdeclindef; double dpdeclin; dpdeclin = 0.0; dpdeclindef = false; if (dp->date.is_defined() && (thcfg.get_outcs_mag_decl(dp->date.get_average_year(), dpdeclin))) dpdeclindef = true; // scan data shots lei = dp->leg_list.begin(); try { while(lei != dp->leg_list.end()) { if (lei->is_valid) { // thdataleg * lf = &(*lei); lei->from.id = this->insert_station(lei->from, lei->psurvey, dp, 3); lei->to.id = this->insert_station(lei->to, lei->psurvey, dp, 3); if (((strcmp(lei->from.name,".") == 0) || (strcmp(lei->from.name,"-") == 0)) && ((strcmp(lei->to.name,".") == 0) || (strcmp(lei->to.name,"-") == 0))) ththrow(("shot between stations without names not allowed")) if ((strcmp(lei->from.name,"-") == 0) || (strcmp(lei->to.name,"-") == 0) || (strcmp(lei->from.name,".") == 0) || (strcmp(lei->to.name,".") == 0)) { lei->flags |= TT_LEGFLAG_SPLAY; lei->walls = TT_FALSE; } this->leg_vec.push_back(thdb1dl(&(*lei),dp,lei->psurvey)); // check station marks tsp1 = &(this->station_vec[lei->from.id - 1]); tsp2 = &(this->station_vec[lei->to.id - 1]); if (lei->s_mark > (unsigned int)tsp1->mark) tsp1->mark = lei->s_mark; if (lei->s_mark > (unsigned int)tsp2->mark) tsp2->mark = lei->s_mark; // set underground station flag if ((lei->flags & TT_LEGFLAG_SURFACE) == 0) { tsp1->flags |= TT_STATIONFLAG_UNDERGROUND; tsp2->flags |= TT_STATIONFLAG_UNDERGROUND; } // check the length if ((lei->data_type == TT_DATATYPE_NORMAL) || (lei->data_type == TT_DATATYPE_DIVING) || (lei->data_type == TT_DATATYPE_CYLPOLAR)) { if (thisnan(lei->length) && (!thisnan(lei->tocounter)) && (!thisnan(lei->fromcounter))) { lei->length = lei->tocounter - lei->fromcounter; lei->length_sd = lei->counter_sd; } } // check depth change if (lei->data_type == TT_DATATYPE_DIVING) { if (!thisnan(lei->depthchange)) dcc = lei->depthchange; else dcc = lei->todepth - lei->fromdepth; lei->depthchange = dcc; if (fabs(dcc) > lei->length) ththrow(("length reading is less than change in depth")) } // check backwards compass reading if ((lei->data_type == TT_DATATYPE_NORMAL) || (lei->data_type == TT_DATATYPE_DIVING) || (lei->data_type == TT_DATATYPE_CYLPOLAR)) { if (!thisnan(lei->backbearing)) { if (thisnan(lei->bearing)) { lei->backbearing -= 180.0; if (lei->backbearing < 0) lei->backbearing += 360.0; lei->bearing = lei->backbearing; } else { lei->backbearing -= 180.0; if (lei->backbearing < 0) lei->backbearing += 360.0; // calculate average of two angles //lei->bearing += lei->backbearing; //lei->bearing = lei->bearing / 2.0; double sumx, sumy; sumx = cos((90.0 - lei->bearing)/180.0*THPI) + cos((90.0 - lei->backbearing)/180.0*THPI); sumy = sin((90.0 - lei->bearing)/180.0*THPI) + sin((90.0 - lei->backbearing)/180.0*THPI); lei->bearing = 90.0 - (atan2(sumy, sumx) / THPI * 180.0); if (lei->bearing < 0.0) lei->bearing += 360.0; } } } // check backwards gradient reading if (lei->data_type == TT_DATATYPE_NORMAL) { if (!thisnan(lei->backgradient)) { if (thisnan(lei->gradient)) { lei->backgradient = - lei->backgradient; lei->gradient = lei->backgradient; } else { if ((thisinf(lei->gradient) == 0) && (thisinf(lei->backgradient) == 0)) { lei->backgradient = - lei->backgradient; lei->gradient += lei->backgradient; lei->gradient = lei->gradient / 2.0; } else { if (thisinf(lei->gradient) != -thisinf(lei->backgradient)) ththrow(("invalid plumbed shot")) } } } } // calculate leg total length and std switch (lei->data_type) { case TT_DATATYPE_NORMAL: lei->total_length = lei->length; lei->total_bearing = (thisnan(lei->bearing) ? 0.0 : lei->bearing); if (!lei->direction) { lei->total_bearing += 180.0; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; } lei->total_gradient = (thisinf(lei->gradient) == 1 ? 90.0 : (thisinf(lei->gradient) == -1 ? -90.0 : lei->gradient)); if (!lei->direction) lei->total_gradient *= -1.0; lei->total_dz = lei->total_length * cos(lei->total_gradient/180*THPI); lei->total_dx = lei->total_dz * sin(lei->total_bearing/180*THPI); lei->total_dy = lei->total_dz * cos(lei->total_bearing/180*THPI); lei->total_dz = lei->total_length * sin(lei->total_gradient/180*THPI); lei->plumbed = (thisinf(lei->gradient) != 0); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->gradient == -90.0) || (lei->gradient == 90.0); } break; case TT_DATATYPE_DIVING: lei->total_length = lei->length; lei->total_bearing = (thisnan(lei->bearing) ? 0.0 : lei->bearing); if (!lei->direction) { lei->total_bearing += 180.0; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; } lei->total_gradient = asin(lei->depthchange / lei->length) / THPI * 180.0; if (!lei->direction) lei->total_gradient *= -1.0; lei->total_dz = lei->total_length * cos(lei->total_gradient/180*THPI); lei->total_dx = lei->total_dz * sin(lei->total_bearing/180*THPI); lei->total_dy = lei->total_dz * cos(lei->total_bearing/180*THPI); lei->total_dz = lei->total_length * sin(lei->total_gradient/180*THPI); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->depthchange == lei->length) && (lei->depthchange != 0.0); } break; case TT_DATATYPE_CYLPOLAR: lei->total_length = sqrt(thnanpow2(lei->length) + thnanpow2(lei->depthchange)); lei->total_bearing = (thisnan(lei->bearing) ? 0.0 : lei->bearing); if (!lei->direction) { lei->total_bearing += 180.0; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; } lei->total_gradient = atan2(lei->depthchange, lei->length) / THPI * 180.0; if (!lei->direction) lei->total_gradient *= -1.0; lei->total_dz = lei->total_length * cos(lei->total_gradient/180*THPI); lei->total_dx = lei->total_dz * sin(lei->total_bearing/180*THPI); lei->total_dy = lei->total_dz * cos(lei->total_bearing/180*THPI); lei->total_dz = lei->total_length * sin(lei->total_gradient/180*THPI); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->length == 0.0) && (lei->depthchange != 0.0); } break; case TT_DATATYPE_CARTESIAN: lei->total_dx = (lei->direction ? 1.0 : -1.0) * lei->dx; lei->total_dy = (lei->direction ? 1.0 : -1.0) * lei->dy; lei->total_dz = (lei->direction ? 1.0 : -1.0) * lei->dz; lei->total_length = thdxyz2length(lei->total_dx,lei->total_dy,lei->total_dz); lei->total_bearing = thdxyz2bearing(lei->total_dx,lei->total_dy,lei->total_dz); lei->total_gradient = thdxyz2clino(lei->total_dx,lei->total_dy,lei->total_dz); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->dx == 0.0) && (lei->dy == 0.0) && (lei->dz != 0.0); } break; } leggridmc = 0.0; if (lei->gridcs != TTCS_LOCAL) { if (lei->gridcs != lastleggridmccs) { if (lei->gridcs == thcfg.outcs) { lastleggridmc = meridian_convergence; } else { lastleggridmc = thcfg.get_cs_convergence(lei->gridcs); } lastleggridmccs = lei->gridcs; } leggridmc = lastleggridmc; } if ((leggridmc != 0.0) || (meridian_convergence != 0.0) || (!thisnan(lei->declination)) || dpdeclindef) { declin = meridian_convergence - leggridmc; if (!thisnan(lei->declination)) { declin += lei->declination; used_declination |= 2; } else if (dpdeclindef) { lei->implicit_declination = dpdeclin; declin += dpdeclin; used_declination |= 4; } else { used_declination |= 1; } lei->total_bearing += declin; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; if (lei->total_bearing < 0.0) lei->total_bearing += 360.0; cosdecl = cos(declin/180*THPI); sindecl = sin(declin/180*THPI); tmpx = lei->total_dx; tmpy = lei->total_dy; lei->total_dx = (cosdecl * tmpx) + (sindecl * tmpy); lei->total_dy = (cosdecl * tmpy) - (sindecl * tmpx); } lei->adj_dx = lei->total_dx; lei->adj_dy = lei->total_dy; lei->adj_dz = lei->total_dz; lei->calc_total_stds(); } lei++; } } catch (...) threthrow(("%s [%d]", lei->srcf.name, lei->srcf.line)); // scan data fixes fii = dp->fix_list.begin(); thdb1ds * tmps; unsigned olevel, nlevel; try { while(fii != dp->fix_list.end()) { fii->station.id = this->insert_station(fii->station, fii->psurvey, dp, 2); tmps = &(this->station_vec[fii->station.id - 1]); tmps->flags |= TT_STATIONFLAG_FIXED; if (fii->srcf.context != NULL) { if (tmps->fixcontext != NULL) { if (tmps->fixcontext->fsptr == NULL) olevel = 0; else olevel = tmps->fixcontext->fsptr->level; if (fii->srcf.context->fsptr == NULL) nlevel = 0; else nlevel = fii->srcf.context->fsptr->level; if (nlevel <= olevel) { tmps->fixcontext = fii->srcf.context; } } else { tmps->fixcontext = fii->srcf.context; } } fii++; } } catch (...) threthrow(("%s [%d]", fii->srcf.name, fii->srcf.line)); } obi++; } // process equates separately obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); // scan data equates eqi = dp->equate_list.begin(); try { while(eqi != dp->equate_list.end()) { prevlsid = this->lsid; eqi->station.id = this->insert_station(eqi->station, eqi->psurvey, dp, 1); if ((prevlsid < eqi->station.id) && (eqi->station.survey != NULL)) thwarning(("%s [%d] -- equate used to define new station (%s@%s)", eqi->srcf.name, eqi->srcf.line, eqi->station.name, eqi->station.survey)); eqi++; } } catch (...) threthrow(("%s [%d]", eqi->srcf.name, eqi->srcf.line)); } obi++; } // after scanning obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_SURVEY_CMD) { thsurvey * srv = (thsurvey *) (*obi); if (!srv->entrance.is_empty()) { srv->entrance.id = this->get_station_id(srv->entrance, srv); if (srv->entrance.id == 0) { if (srv->entrance.survey == NULL) ththrow(("station doesn't exist -- %s", srv->entrance.name)) else ththrow(("station doesn't exist -- %s@%s", srv->entrance.name, srv->entrance.survey)) } // set entrance flag & comment to given station this->station_vec[srv->entrance.id-1].flags |= TT_STATIONFLAG_ENTRANCE; if (strlen(srv->title) > 0) this->station_vec[srv->entrance.id-1].comment = srv->title; else this->station_vec[srv->entrance.id-1].comment = srv->name; } } if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); // scan data stations ssi = dp->ss_list.begin(); try { while(ssi != dp->ss_list.end()) { ssi->station.id = this->get_station_id(ssi->station, ssi->psurvey); if (ssi->station.id == 0) { if (ssi->station.survey == NULL) ththrow(("station doesn't exist -- %s", ssi->station.name)) else ththrow(("station doesn't exist -- %s@%s", ssi->station.name, ssi->station.survey)) } // set station flags and comment else { if (ssi->comment != NULL) this->station_vec[ssi->station.id-1].comment = ssi->comment; this->station_vec[ssi->station.id-1].explored = ssi->explored; this->station_vec[ssi->station.id-1].flags |= ssi->flags; // set station attributes this->m_station_attr.insert_object(NULL, (long) ssi->station.id); thdatass_attr_map::iterator ami; for(ami = ssi->attr.begin(); ami != ssi->attr.end(); ami++) { this->m_station_attr.insert_attribute(ami->first.c_str(), ami->second); } } ssi++; } } catch (...) threthrow(("%s [%d]", ssi->srcf.name, ssi->srcf.line)); // scan data marks mii = dp->mark_list.begin(); try { while(mii != dp->mark_list.end()) { mii->station.id = this->get_station_id(mii->station, mii->psurvey); if (mii->station.id == 0) { if (mii->station.survey == NULL) ththrow(("station doesn't exist -- %s", mii->station.name)) else ththrow(("station doesn't exist -- %s@%s", mii->station.name, mii->station.survey)) } // set station flags and comment else { thdb1ds * markst = &(this->station_vec[mii->station.id - 1]); markst->mark_station = true; if (markst->mark < mii->mark) markst->mark = mii->mark; } mii++; } } catch (...) threthrow(("%s [%d]", mii->srcf.name, mii->srcf.line)); // scan extends xi = dp->extend_list.begin(); try { while(xi != dp->extend_list.end()) { if (!xi->to.is_empty()) { xi->to.id = this->get_station_id(xi->to, xi->psurvey); if (xi->to.id == 0) { if (xi->to.survey == NULL) ththrow(("station doesn't exist -- %s", xi->to.name)) else ththrow(("station doesn't exist -- %s@%s", xi->to.name, xi->to.survey)) } } xi->from.id = this->get_station_id(xi->from, xi->psurvey); if (xi->from.id == 0) { if (xi->from.survey == NULL) ththrow(("station doesn't exist -- %s", xi->from.name)) else ththrow(("station doesn't exist -- %s@%s", xi->from.name, xi->from.survey)) } xi++; } } catch (...) threthrow(("%s [%d]", xi->srcf.name, xi->srcf.line)); // scan dimensions di = dp->dims_list.begin(); try { while(di != dp->dims_list.end()) { di->station.id = this->get_station_id(di->station, di->psurvey); if (di->station.id == 0) { if (di->station.survey == NULL) ththrow(("station doesn't exist -- %s", di->station.name)) else ththrow(("station doesn't exist -- %s@%s", di->station.name, di->station.survey)) } di++; } } catch (...) threthrow(("%s [%d]", di->srcf.name, di->srcf.line)); dp->complete_dimensions(); } obi++; } if (((used_declination & 1) != 0) && ((used_declination & 4) != 0)) thwarning(("unable to determine magnetic declination for undated surveys")) thcfg.log_outcs(this->min_year, this->max_year); } void thdb1d::process_data() { this->scan_data(); this->find_loops(); this->close_loops(); if (thini.loopc == THINIT_LOOPC_SURVEX) { thsvxctrl survex; try { survex.process_survey_data(this->db); } catch (...) { thwarning((thexc.get_desc())) } } this->process_survey_stat(); this->postprocess_objects(); this->process_xelev(); } unsigned long thdb1d::get_station_id(thobjectname on, thsurvey * ps) { unsigned long csurvey_id = this->db->get_survey_id(on.survey, ps); thdb1d_station_map_type::iterator sti; sti = this->station_map.find(thobjectid(on.name, csurvey_id)); if (sti == this->station_map.end()) return 0; else return sti->second; } void thdb1ds::set_parent_data(class thdata * pd, unsigned pd_priority) { if (pd_priority > this->data_priority) { this->data.clear(); this->data_priority = pd_priority; } if (pd_priority == this->data_priority) this->data.push_back(pd); } unsigned long thdb1d::insert_station(class thobjectname on, class thsurvey * ps, class thdata * pd, unsigned pd_priority) { bool is_temp = false; if ((strcmp(on.name,"-") == 0) || (strcmp(on.name,".") == 0)) { is_temp = true; } // first insert object into database ps = this->db->get_survey(on.survey, ps); unsigned long csurvey_id = (ps == NULL) ? 0 : ps->id; on.survey = NULL; if (!is_temp) { thdb1d_station_map_type::iterator sti; sti = this->station_map.find(thobjectid(on.name, csurvey_id)); if (sti != this->station_map.end()) { this->station_vec[sti->second - 1].set_parent_data(pd,pd_priority); return sti->second; } if (!(this->db->insert_datastation(on, ps))) { if (on.survey != NULL) ththrow(("object already exist -- %s@%s", on.name, on.survey)) else ththrow(("object already exist -- %s", on.name)) } } this->lsid++; this->station_vec.push_back(thdb1ds(on.name, ps)); thdb1ds * cstation = &(this->station_vec[this->lsid - 1]); if (!is_temp) { this->station_map[thobjectid(on.name, csurvey_id)] = this->lsid; } else { cstation->set_temporary(on.name); } cstation->set_parent_data(pd,pd_priority); return this->lsid; } void thdb1d::self_print(FILE * outf) { unsigned int sid; fprintf(outf,"survey stations\n"); thdb1ds * sp; for (sid = 0; sid < this->lsid; sid++) { sp = & (this->station_vec[sid]); fprintf(outf,"\t%d:%ld\t%s@%s\t%.2f\t%.2f\t%.2f", sid + 1, sp->uid, sp->name, sp->survey->full_name, sp->x, sp->y, sp->z); fprintf(outf,"\tflags:"); if (sp->flags & TT_STATIONFLAG_ENTRANCE) fprintf(outf,"E"); if (sp->flags & TT_STATIONFLAG_CONT) fprintf(outf,"C"); if (sp->flags & TT_STATIONFLAG_FIXED) fprintf(outf,"F"); if (sp->flags & TT_STATIONFLAG_UNDERGROUND) fprintf(outf,"U"); fprintf(outf,"\tmark:"); switch (sp->mark) { case TT_DATAMARK_FIXED: fprintf(outf,"fixed"); break; case TT_DATAMARK_PAINTED: fprintf(outf,"painted"); break; case TT_DATAMARK_TEMP: fprintf(outf,"temporary"); break; case TT_DATAMARK_NATURAL: fprintf(outf,"natural"); break; } if (sp->comment != NULL) fprintf(outf,"\t\"%s\"", sp->comment); fprintf(outf,"\n"); } fprintf(outf,"end -- survey stations\n"); } unsigned long thdb1d::get_tree_size() { if (this->tree_legs == NULL) this->process_tree(); return this->num_tree_legs; } thdb1dl ** thdb1d::get_tree_legs() { if (this->tree_legs == NULL) this->process_tree(); return this->tree_legs; } void thdb1d_equate_nodes(thdb1d * thisdb, thdb1d_tree_node * n1, thdb1d_tree_node * n2) { if (n1->uid == n2->uid) return; thdb1d_tree_node * n3; if (n1->is_fixed && n2->is_fixed) { ththrow(("equate of two fixed stations -- %s@%s and %s@%s", thisdb->station_vec[n1->id - 1].name, thisdb->station_vec[n1->id - 1].survey->get_full_name(), thisdb->station_vec[n2->id - 1].name, thisdb->station_vec[n2->id - 1].survey->get_full_name())); } if (n1->id == n2->id) { ththrow(("equate of two identical stations -- %s@%s and %s@%s", thisdb->station_vec[n1->id - 1].name, thisdb->station_vec[n1->id - 1].survey->get_full_name(), thisdb->station_vec[n2->id - 1].name, thisdb->station_vec[n2->id - 1].survey->get_full_name())); } // vymeni ich ak uid1 nie je fixed if ((n2->is_fixed) && (!n1->is_fixed)) { n3 = n1; n1 = n2; n2 = n3; } // priradi uid1 do uid2 n2->uid = n1->uid; n3 = n2->prev_eq; while (n3 != NULL) { n3->uid = n1->uid; n3 = n3->prev_eq; } n3 = n2->next_eq; while (n3 != NULL) { n3->uid = n1->uid; n3 = n3->next_eq; } // teraz spojme n1->prev s n2->next while (n1->prev_eq != NULL) { n1 = n1->prev_eq; } while (n2->next_eq != NULL) { n2 = n2->next_eq; } n1->prev_eq = n2; n2->next_eq = n1; } void thdb1d::process_tree() { size_t tn_legs = this->leg_vec.size(); size_t tn_stations = this->station_vec.size(); if ((tn_legs < 0) || (tn_stations < 0)) return; #ifdef THDEBUG thprintf("\n\nscanning centreline tree\n"); #else thprintf("scanning centreline tree ... "); thtext_inline = true; #endif thdb1d_tree_node * nodes = new thdb1d_tree_node [tn_stations]; this->tree_nodes = nodes; thdb1d_tree_arrow * arrows = new thdb1d_tree_arrow [2 * tn_legs]; this->tree_arrows = arrows; thdb1d_tree_node * n1, * n2, * n3, * current_node = NULL; thdb1d_tree_arrow * a1, * a2; unsigned long i, ii; bool any_fixed = false; // let's parse all nodes for(i = 0, ii = 1, n1 = nodes; i < tn_stations; i++, n1++, ii++) { n1->id = ii; n1->uid = ii; n1->is_fixed = ((this->station_vec[i].flags & TT_STATIONFLAG_FIXED) != 0); // if (n1->is_fixed) // thprintf("FX: %s@%s\n", this->station_vec[i].name, this->station_vec[i].survey->full_name); if (n1->is_fixed) any_fixed = true; } // let's parse all equates thdb_object_list_type::iterator obi = this->db->object_list.begin(); thdataequate_list::iterator eqi; thdata * dp; int last_eq = -1; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); eqi = dp->equate_list.begin(); last_eq = -1; while(eqi != dp->equate_list.end()) { if (eqi->eqid != last_eq) { n1 = nodes + (eqi->station.id - 1); last_eq = eqi->eqid; } else { n2 = nodes + (eqi->station.id - 1); thdb1d_equate_nodes(this,n1,n2); } eqi++; } } obi++; } // now let's equate infer legs, zero lengthed thdb1d_leg_vec_type::iterator iil; for(iil = this->leg_vec.begin(); iil != this->leg_vec.end(); iil++) { if (iil->leg->infer_equates) { if (iil->leg->total_length == 0.0) { thdb1d_equate_nodes(this, nodes + (iil->leg->from.id - 1), nodes + (iil->leg->to.id - 1)); } } } // write uid into original database for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { this->station_vec[i].uid = n1->uid; } // go leg by leg and fill arrows for(iil = this->leg_vec.begin(), a1 = arrows; iil != this->leg_vec.end(); iil++) { if (iil->leg->infer_equates) if (iil->leg->total_length == 0.0) continue; a2 = a1 + 1; a1->negative = a2; a1->leg = &(*iil); a1->start_node = nodes + (nodes[iil->leg->from.id - 1].uid - 1); a1->end_node = nodes + (nodes[iil->leg->to.id - 1].uid - 1); // if ((iil->leg->data_type == TT_DATATYPE_NOSURVEY) && // ((!a1->start_node->is_fixed) || (!a1->end_node->is_fixed))) { //// thprintf("%s@%s - %s@%s\n", iil->leg->from.name, iil->leg->from.survey, iil->leg->to.name, iil->leg->to.survey); // ththrow(("unsurveyed shot between unfixed stations -- %s [%d]", // iil->leg->srcf.name, iil->leg->srcf.line // )); // } if (iil->leg->data_type == TT_DATATYPE_NOSURVEY) { a1->is_nosurvey = true; a2->is_nosurvey = true; } // hide splay-ed flags from extended elevation2 //if ((iil->leg->flags && TT_LEGFLAG_SPLAY) != 0) { // iil->leg->extend |= TT_EXTENDFLAG_HIDE; // a2->extend |= TT_EXTENDFLAG_HIDE; // a1->extend |= TT_EXTENDFLAG_HIDE; //} a2->negative = a1; a2->leg = a1->leg; a2->start_node = a1->end_node; a2->end_node = a1->start_node; a2->is_reversed = true; // assign nodes a1->next_arrow = a1->start_node->first_arrow; a1->start_node->first_arrow = a1; a2->next_arrow = a2->start_node->first_arrow; a2->start_node->first_arrow = a2; a1->start_node->narrows++; a2->start_node->narrows++; a1 += 2; } // process the tree // 1. set all nodes without legs as attached for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { if (n1->id != n1->uid) n1->is_attached = true; else if ((n1->first_arrow == NULL) && (n1->is_fixed)) n1->is_attached = true; } unsigned long series = 0, component = 0, tarrows = 0, last_series = 0; bool component_break = true; this->tree_legs = new thdb1dl* [tn_legs]; thdb1dl ** current_leg = this->tree_legs; while (tarrows < tn_legs) { if (component_break) { // let's find starting node n2 = NULL; n3 = NULL; bool n2null = true; for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { if (!n1->is_attached) { if (n2null) { n2 = n1; n3 = n1; n2null = false; } if (n1->is_fixed) { n2 = n1; break; } } } // something is wrong if (n2 == NULL) { ththrow(("a software BUG is present (" __FILE__ ":%d)", __LINE__)); //#ifdef THDEBUG // thprintf("warning -- not all stations connected to the network\n"); //#endif break; } if ((!n2->is_fixed) && (any_fixed || (component > 0))) { ththrow(("can not connect %s@%s to centerline network", this->station_vec[n3->id - 1].name, this->station_vec[n3->id - 1].survey->get_full_name())); } current_node = n2; current_node->is_attached = true; component++; if (series == last_series) series++; component_break = false; #ifdef THDEBUG thprintf("component %d -- %d (%s@%s)\n", component, current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } // end of tremaux // let's make move if (current_node->last_arrow == NULL) current_node->last_arrow = current_node->first_arrow; else current_node->last_arrow = current_node->last_arrow->next_arrow; // skip discovery arrows or nosurvey arrows, if station on the other site is not connected while ((current_node->last_arrow != NULL) && ( (current_node->last_arrow->is_discovery) || ((current_node->last_arrow->is_nosurvey) && (!current_node->last_arrow->end_node->is_attached)) )) current_node->last_arrow = current_node->last_arrow->next_arrow; if (current_node->last_arrow == NULL) { // go back if (current_node->back_arrow == NULL) component_break = true; else { current_node = current_node->back_arrow->end_node; #ifdef THDEBUG thprintf("%d (%s@%s) <-\n", current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } } else { // go forward // check if not already discovered current_node->last_arrow->negative->is_discovery = true; tarrows++; *current_leg = current_node->last_arrow->leg; #ifdef THDEBUG thdb1dl * prev_leg = *current_leg; #endif (*current_leg)->reverse = current_node->last_arrow->is_reversed; (*current_leg)->series_id = series; last_series = series; (*current_leg)->component_id = component; current_leg++; #ifdef THDEBUG thprintf("-> %d (%s@%s) [%d %s %d, series %d, arrow %d]\n", current_node->last_arrow->end_node->id, this->station_vec[current_node->last_arrow->end_node->id - 1].name, this->station_vec[current_node->last_arrow->end_node->id - 1].survey->get_full_name(), prev_leg->leg->from.id, (prev_leg->reverse ? "<=" : "=>"), prev_leg->leg->to.id, series, tarrows); #endif if (!current_node->last_arrow->end_node->is_attached) { current_node->last_arrow->end_node->back_arrow = current_node->last_arrow->negative; current_node = current_node->last_arrow->end_node; current_node->is_attached = true; if (current_node->narrows != 2) series++; } else series++; } } this->num_tree_legs = tarrows; #ifdef THDEBUG thprintf("\nend of scanning data tree\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif } void thdb1d__scan_survey_station_limits(thsurvey * ss, thdb1ds * st, bool is_under) { if (st->is_temporary()) return; if (ss->stat.station_state == 0) { if (is_under) ss->stat.station_state = 2; else ss->stat.station_state = 1; ss->stat.station_top = st; ss->stat.station_bottom = st; ss->stat.station_south = st; ss->stat.station_north = st; ss->stat.station_east = st; ss->stat.station_west = st; } else if (is_under && (ss->stat.station_state == 1)) { ss->stat.station_state = 2; ss->stat.station_top = st; ss->stat.station_bottom = st; ss->stat.station_south = st; ss->stat.station_north = st; ss->stat.station_east = st; ss->stat.station_west = st; } else if (is_under || (ss->stat.station_state == 1)) { ss->stat.station_state = 2; if (ss->stat.station_top->z < st->z) ss->stat.station_top = st; if (ss->stat.station_bottom->z > st->z) ss->stat.station_bottom = st; if (ss->stat.station_east->x < st->x) ss->stat.station_east = st; if (ss->stat.station_west->x > st->x) ss->stat.station_west = st; if (ss->stat.station_north->y < st->y) ss->stat.station_north = st; if (ss->stat.station_south->y > st->y) ss->stat.station_south = st; } } void thdb1d__scan_data_station_limits(thdata * ss, thdb1ds * st, bool is_under) { if (ss->stat_st_state == 0) { if (is_under) ss->stat_st_state = 2; else ss->stat_st_state = 1; ss->stat_st_top = st; ss->stat_st_bottom = st; // ss->stat_st_south = st; // ss->stat_st_north = st; // ss->stat_st_east = st; // ss->stat_st_west = st; } else if (is_under && (ss->stat_st_state == 1)) { ss->stat_st_state = 2; ss->stat_st_top = st; ss->stat_st_bottom = st; // ss->stat_st_south = st; // ss->stat_st_north = st; // ss->stat_st_east = st; // ss->stat_st_west = st; } else if (is_under || (ss->stat_st_state == 1)) { ss->stat_st_state = 2; if (ss->stat_st_top->z < st->z) ss->stat_st_top = st; if (ss->stat_st_bottom->z > st->z) ss->stat_st_bottom = st; // if (ss->stat_st_east->x < st->x) // ss->stat_st_east = st; // if (ss->stat_st_west->x > st->x) // ss->stat_st_west = st; // if (ss->stat_st_north->y < st->y) // ss->stat_st_north = st; // if (ss->stat_st_south->y > st->y) // ss->stat_st_south = st; } } void thdb1d::process_survey_stat() { #ifdef THDEBUG thprintf("\n\ncalculating basic statistics\n"); #else thprintf("calculating basic statistics ... "); thtext_inline = true; #endif thsurvey * ss; // prejde vsetky legy a spocita ich a dlzky pre kazde survey // do ktoreho patria thdb1d_leg_vec_type::iterator lit = this->leg_vec.begin(); while (lit != this->leg_vec.end()) { // skusi ci je duplikovane if ((lit->leg->flags & TT_LEGFLAG_SPLAY) != 0) lit->data->stat_splaylength += lit->leg->total_length; else if ((lit->leg->flags & TT_LEGFLAG_DUPLICATE) != 0) lit->data->stat_dlength += lit->leg->total_length; // ak nie skusi ci je surface else if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) lit->data->stat_slength += lit->leg->total_length; // inak prida do length else { lit->data->stat_length += lit->leg->total_length; this->nlength += lit->leg->total_length; // check if approximate length if ((lit->leg->flags & TT_LEGFLAG_APPROXIMATE) != 0) lit->data->stat_alength += lit->leg->total_length; } // stations if ((lit->leg->flags & TT_LEGFLAG_SPLAY) == 0) { if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) { thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->from.id - 1]), false); thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->to.id - 1]), false); } else { thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->from.id - 1]), true); thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->to.id - 1]), true); } } ss = lit->survey; while (ss != NULL) { // skusi ci nie je splay if ((lit->leg->flags & TT_LEGFLAG_SPLAY) != 0) ss->stat.length_splay += lit->leg->total_length; // skusi ci je duplikovane else if ((lit->leg->flags & TT_LEGFLAG_DUPLICATE) != 0) ss->stat.length_duplicate += lit->leg->total_length; // ak nie skusi ci je surface else if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) ss->stat.length_surface += lit->leg->total_length; // inak prida do length else { if ((lit->leg->flags & TT_LEGFLAG_APPROXIMATE) != 0) ss->stat.length_approx += lit->leg->total_length; ss->stat.length += lit->leg->total_length; } if ((lit->leg->flags & TT_LEGFLAG_SPLAY) == 0) { if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) { thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->from.id - 1]), false); thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->to.id - 1]), false); } else { thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->from.id - 1]), true); thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->to.id - 1]), true); } } ss->stat.num_shots++; ss = ss->fsptr; } lit++; } // prejde vsetky stations a spocita ich a nastavi limitne stations // pricom ak najde prvu povrchovu, tak nastvi vsetky s nou // ak najde podzemnu a ma niekde povrchovu -> nastavi podzemnu thdb1d_station_vec_type::iterator sit = this->station_vec.begin(); while (sit != this->station_vec.end()) { ss = sit->survey; while (ss != NULL) { if (!thisnan(sit->explored)) ss->stat.length_explored += sit->explored; if ((sit->flags & TT_STATIONFLAG_ENTRANCE) > 0) { ss->stat.num_entrances++; } ss->stat.num_stations++; ss = ss->fsptr; } sit++; } // prejde vsetky continuations a prepocita explore length thdb_object_list_type::iterator obi = this->db->object_list.begin(); thpoint * pt; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_POINT_CMD) { pt = (thpoint *)(*obi); ss = pt->fsptr; if ((pt->type == TT_POINT_TYPE_CONTINUATION) && (!thisnan(pt->xsize))) { while (ss != NULL) { ss->stat.length_explored += pt->xsize; ss = ss->fsptr; } } } obi++; } #ifdef THDEBUG thprintf("\nend of basic statistics calculation\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif } struct thlc_leg { unsigned long from_uid, to_uid, from_id, to_id; thlc_leg * prev_series_leg, * next_series_leg; thdb1dl * dbleg; }; struct thlc_cross { unsigned long id, station_uid, narrows, dm_dist; bool is_fixed, dm_target; thlc_cross * dm_cross, * dm_next; struct thlc_cross_arrow * first_arrow, * last_arrow, * dm_arrow; }; struct thlc_series { unsigned long from, to, numlegs, id; thlc_cross * from_cross, * to_cross; thlc_leg * first_leg, * last_leg; bool is_active; }; struct thlc_cross_arrow { thlc_cross * target; thlc_cross_arrow * prev_arrow, * next_arrow; thlc_series * series; bool reverse; }; struct thlc_loop { thlc_cross * from_cross, * to_cross; thlc_cross_arrow * first_arrow, * last_arrow; unsigned long minid, size, id; #ifdef THDEBUG bool is_new; long old_id; #endif }; bool operator < ( const struct thlc_loop & l1, const struct thlc_loop & l2) { bool direction; thlc_cross_arrow * l1a, * l2a; if (l1.size < l2.size) return true; else if (l1.size > l2.size) return false; // neostava nam nic ine ako porovnavat po seriach if (l1.from_cross->id != l1.to_cross->id) { // l1 otovreny okruh if (l2.from_cross->id == l2.to_cross->id) return false; if (l1.minid < l2.minid) return true; if (l1.minid > l2.minid) return false; if (l1.to_cross->id == l2.to_cross->id) direction = true; else direction = false; // porovname seriu za seriou, vratime false ak nebude mensia l1a = l1.first_arrow; l2a = (direction ? l2.first_arrow : l2.last_arrow); while ((l1a != NULL) && (l2a != NULL)) { if (l1a->series->id > l2a->series->id) return false; if (l1a->series->id < l2a->series->id) return true; l1a = l1a->next_arrow; l2a = (direction ? l2a->next_arrow : l2a->prev_arrow); if ((l1a == NULL) && (l2a != NULL)) return true; if ((l1a != NULL) && (l2a == NULL)) return false; } //#ifdef THDEBUG // thprintf("LOOP EQUAL: %ld == %ld\n", l1.id, l2.id); //#endif return false; } else { // l1 uzavrety okruh if (l2.from_cross->id != l2.to_cross->id) return true; if (l1.minid < l2.minid) return true; if (l1.minid > l2.minid) return false; // v obidvoch najde minid hranu a na zaklade jej orientacie // urci direction v dvojke l1a = l1.first_arrow; while (l1a->series->id != l1.minid) { l1a = l1a->next_arrow; } l2a = l2.first_arrow; while (l2a->series->id != l2.minid) { l2a = l2a->next_arrow; } if (l1a->reverse != l2a->reverse) direction = false; else direction = true; #define nextstep {\ l1a = l1a->next_arrow; \ if (l1a == NULL) l1a = l1.first_arrow; \ l2a = (direction ? l2a->next_arrow : l2a->prev_arrow); \ if (l2a == NULL) l2a = (direction ? l2.first_arrow : l2.last_arrow); \ if ((l1a->series->id == l1.minid) && (l2a->series->id != l2.minid)) \ return true; \ if ((l1a->series->id != l1.minid) && (l2a->series->id == l2.minid)) \ return false; \ if (l1a->series->id < l2a->series->id) return true; \ if (l1a->series->id > l2a->series->id) return false; \ } nextstep; while (l1a->series->id != l1.minid) nextstep; //#ifdef THDEBUG // thprintf("LOOP EQUAL: %ld == %ld\n", l1.id, l2.id); //#endif return false; } } long chledala_chledala(thlc_cross * kde, unsigned long kde_size, thlc_cross * co, thlc_cross * odkial, std::list & vysledok) { long result = -1; unsigned long i; thlc_cross * cc, * lastcc; #ifdef THDEBUG thprintf("\nLOOP SEARCH: %ld -> %ld\n", odkial->id, co == NULL ? -1 : long(co->id)); #endif // initiaze targets if (co == NULL) { for (i = 0; i < kde_size; i++) { cc = &(kde[i]); cc->dm_target = cc->is_fixed; } } else { for (i = 0; i < kde_size; i++) kde[i].dm_target = false; co->dm_target = true; } // reset other tree variables for (i = 0; i < kde_size; i++) { cc = &(kde[i]); cc->dm_arrow = NULL; cc->dm_dist = 0; cc->dm_cross = NULL; } lastcc = odkial; lastcc->dm_next = NULL; cc = odkial; // modified Djikstra-Moore algorithm thlc_cross_arrow * ca; thlc_cross * cmin_cross = NULL, * nc; bool vykasli_sa; unsigned long cmin = 0; #define check_cmin(cross) {\ if (cross->dm_target) {\ if (cmin_cross == NULL) { \ cmin = cross->dm_dist; \ cmin_cross = cross; \ } else if (cmin > cross->dm_dist) {\ cmin = cross->dm_dist; \ cmin_cross = cross; \ } \ } \ } while (cc != NULL) { ca = cc->first_arrow; while ((ca != NULL) && (!cc->dm_target)) { if ((ca->series->is_active) && (ca->target->id != odkial->id)) { if (ca->target->dm_cross != NULL) { // sme vo vrchole, v ktorom sme uz boli, takze iba skontrolujeme, // ci tam nie sme rychlejsie if (ca->target->dm_dist > (cc->dm_dist + ca->series->numlegs)) { ca->target->dm_arrow = ca; ca->target->dm_cross = cc; ca->target->dm_dist = cc->dm_dist + ca->series->numlegs; check_cmin(ca->target); } } else { // dostali sme sa do noveho vrcholu, nastavime mu co treba a // pridame si ho do vrcholov na preskumanie ca->target->dm_arrow = ca; ca->target->dm_cross = cc; ca->target->dm_dist = cc->dm_dist + ca->series->numlegs; check_cmin(ca->target); lastcc->dm_next = ca->target; lastcc = lastcc->dm_next; lastcc->dm_next = NULL; } } ca = ca->next_arrow; } // skontroluje, ci ma zmysel este hladat if (cmin_cross != NULL) { nc = cc->dm_next; vykasli_sa = true; while (nc != NULL) { vykasli_sa = vykasli_sa && (cmin <= nc->dm_dist); nc = nc->dm_next; } if (vykasli_sa) cc->dm_next = NULL; } cc = cc->dm_next; } if (cmin_cross != NULL) { result = cmin; cc = cmin_cross; ca = cc->dm_arrow; while (ca != NULL) { vysledok.insert(vysledok.begin(),*ca); #ifdef THDEBUG thprintf("%d - %d : %s%d\n", ca->reverse ? ca->series->to : ca->series->from, ca->reverse ? ca->series->from : ca->series->to, ca->reverse ? "R" : "N", ca->series->id ); #endif cc = cc->dm_cross; ca = cc->dm_arrow; } } return result; } void thdb1d::find_loops() { size_t nlegs = this->get_tree_size(), nstations = this->station_vec.size(), numseries, i, lastcross, nseries, nloops; thdb1dl ** legs = this->get_tree_legs(), ** curleg, * cleg; thdb1d_tree_node * nodes = this->get_tree_nodes(), * from_node; long * crossst = NULL, * curcrossst, lastlegseries, currentcross; #ifdef THDEBUG thprintf("\n\nsearching for centerline loops\n"); #else thprintf("searching for centerline loops ... "); thtext_inline = true; #endif if (nstations > 0) crossst = new long [nstations]; thlc_leg * lclegs = NULL, * clcleg = NULL, * prevlcleg = NULL; if (nlegs > 0) lclegs = new thlc_leg [nlegs]; thlc_cross * lccrosses = NULL, * clccross; thlc_cross_arrow * lccrossarrows = NULL, * cca; thlc_series tmpseries, * curseries, * prevseries; std::vector lcseries; thdb1d_loop tdbloop; #ifdef THDEBUG thdb1d_loop_list_type::iterator dbli; #endif thdb1d_loop_leg tdbloopleg, * ptdbl; std::list from2fixv, to2fixv, closev, loopsv; std::list::iterator it; std::set::iterator lsi; #ifdef THDEBUG std::list all_loop_list; unsigned long prev_set_size; std::list::iterator lli; #endif std::set all_loop_set; long from2fixl, to2fixl, closel; thlc_cross_arrow tmpca; thlc_loop tmploop; // resetuje crossst lastcross = 0; #define setcrossst(uid) {\ currentcross = crossst[uid-1];\ if (currentcross < 0) {\ crossst[uid-1] = lastcross;\ currentcross = lastcross;\ lastcross++;\ }} for (i = 0, curcrossst = crossst; i < nstations; i++, curcrossst++) *curcrossst = -1; curleg = legs; i = 0; lastlegseries = -1; curseries = NULL; numseries = 0; clcleg = lclegs; while ((nlegs > 0) && ((*curleg)->leg->data_type == TT_DATATYPE_NOSURVEY)) { nlegs--; curleg++; } if (nlegs == 0) goto LC_COORD_CALC; while (i < nlegs) { while ((nlegs > i) && ((*curleg)->leg->data_type == TT_DATATYPE_NOSURVEY)) { nlegs--; curleg++; } if (nlegs == i) break; // nastavi clcleg cleg = (*curleg); clcleg->dbleg = cleg; clcleg->next_series_leg = NULL; if (cleg->reverse) { clcleg->from_id = cleg->leg->to.id; clcleg->to_id = cleg->leg->from.id; } else { clcleg->from_id = cleg->leg->from.id; clcleg->to_id = cleg->leg->to.id; } clcleg->from_uid = this->station_vec[clcleg->from_id - 1].uid; clcleg->to_uid = this->station_vec[clcleg->to_id - 1].uid; if (clcleg->from_uid == clcleg->to_uid) { ththrow(("shot between two equal stations -- %s@%s and %s@%s", this->station_vec[clcleg->from_id - 1].name, this->station_vec[clcleg->from_id - 1].survey->get_full_name(), this->station_vec[clcleg->to_id - 1].name, this->station_vec[clcleg->to_id - 1].survey->get_full_name())); } from_node = &(nodes[clcleg->from_uid - 1]); if ((lastlegseries != long(cleg->series_id)) || from_node->is_fixed || (from_node->narrows != 2)) { // zacina sa ina seria lcseries.push_back(tmpseries); curseries = &(lcseries[numseries]); curseries->id = numseries; if (numseries > 0) { prevseries = &(lcseries[long(numseries) - 1]);; } else { prevseries = NULL; } numseries++; clcleg->prev_series_leg = NULL; curseries->first_leg = clcleg; curseries->last_leg = clcleg; curseries->numlegs = 1; setcrossst(clcleg->from_uid); curseries->from = currentcross; if (prevseries != NULL) { setcrossst(prevlcleg->to_uid); prevseries->to = currentcross; } } else { // nezacina sa ina seria curseries->last_leg = clcleg; clcleg->prev_series_leg = prevlcleg; prevlcleg->next_series_leg = clcleg; curseries->numlegs++; } lastlegseries = long(cleg->series_id); curleg++; prevlcleg = clcleg; clcleg++; i++; } if (curseries != NULL) { setcrossst(prevlcleg->to_uid); curseries->to = currentcross; }; nseries = lcseries.size(); lccrosses = new thlc_cross [lastcross]; for (i = 0, curcrossst = crossst; i < nstations; i++, curcrossst++) { if (*curcrossst > -1) { clccross = &(lccrosses[*curcrossst]); clccross->id = *curcrossst; clccross->station_uid = i + 1; clccross->narrows = 0; clccross->first_arrow = NULL; clccross->last_arrow = NULL; clccross->is_fixed = nodes[i].is_fixed; } } // vytvori strom krizovatiek i = 0; lccrossarrows = new thlc_cross_arrow [2 * nseries]; cca = lccrossarrows; while (i < nseries) { curseries = &(lcseries[i]); curseries->from_cross = &(lccrosses[curseries->from]); curseries->to_cross = &(lccrosses[curseries->to]); cca->prev_arrow = NULL; cca->next_arrow = NULL; if (curseries->from_cross->last_arrow == NULL) { curseries->from_cross->first_arrow = cca; } else { cca->prev_arrow = curseries->from_cross->last_arrow; curseries->from_cross->last_arrow->next_arrow = cca; } curseries->from_cross->last_arrow = cca; curseries->from_cross->narrows++; cca->target = curseries->to_cross; cca->series = curseries; cca->reverse = false; cca++; cca->prev_arrow = NULL; cca->next_arrow = NULL; if (curseries->to_cross->last_arrow == NULL) { curseries->to_cross->first_arrow = cca; } else { cca->prev_arrow = curseries->to_cross->last_arrow; curseries->to_cross->last_arrow->next_arrow = cca; } curseries->to_cross->last_arrow = cca; curseries->to_cross->narrows++; cca->target = curseries->from_cross; cca->series = curseries; cca->reverse = true; cca++; i++; } #ifdef THDEBUG thprintf("\n\n\nLOOP CLOSURE DEBUG\n"); thprintf("\nCROSSES:\n"); for (i = 0; i < lastcross; i++) { thprintf("%ld: %s %ld [",i, lccrosses[i].is_fixed ? "F" : "V", lccrosses[i].narrows); cca = lccrosses[i].first_arrow; while (cca != NULL) { thprintf("%s%ld", cca->prev_arrow == NULL ? "" : " ", cca->target->id); cca = cca->next_arrow; } thprintf("] %s@%s\n", this->station_vec[lccrosses[i].station_uid - 1].name, this->station_vec[lccrosses[i].station_uid - 1].survey->name); } thprintf("\nSERIES:\n"); for (i = 0; i < nseries; i++) { thprintf("%ld: %ld - %ld [%ld legs",i,lcseries[i].from,lcseries[i].to,lcseries[i].numlegs); clcleg = lcseries[i].first_leg; if (clcleg != NULL) { thprintf(": %s@%s", this->station_vec[clcleg->from_uid - 1].name, this->station_vec[clcleg->from_uid - 1].survey->name); } while (clcleg != NULL) { thprintf(" - %s@%s", this->station_vec[clcleg->to_uid - 1].name, this->station_vec[clcleg->to_uid - 1].survey->name); clcleg = clcleg->next_series_leg; } thprintf("]\n"); } #endif // najde okruhy nloops = 0; // urobi preprocessing serii for(i = 0; i < nseries; i++) { curseries = &(lcseries[i]); curseries->is_active = true; // ak neni fixnuty a ma len jeden arrow - deaktivujeme if (((!(curseries->from_cross->is_fixed)) && (curseries->from_cross->narrows == 1)) || ((!(curseries->to_cross->is_fixed)) && (curseries->to_cross->narrows == 1))) curseries->is_active = false; // ak ma oba konce fixnute alebo totozne, spravi z nej okruh if ((curseries->from_cross->is_fixed && curseries->to_cross->is_fixed) || (curseries->from == curseries->to)) { tmpca.series = curseries; tmpca.reverse = false; tmpca.prev_arrow = NULL; tmpca.next_arrow = NULL; tmploop.first_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow = tmploop.first_arrow; tmploop.from_cross = curseries->from_cross; tmploop.to_cross = curseries->to_cross; tmploop.minid = curseries->id; tmploop.size = curseries->numlegs; tmploop.id = nloops++; #ifdef THDEBUG prev_set_size = all_loop_set.size(); #endif all_loop_set.insert(tmploop); #ifdef THDEBUG lsi = all_loop_set.find(tmploop); tmploop.old_id = lsi->id; if (prev_set_size < all_loop_set.size()) tmploop.is_new = true; else tmploop.is_new = false; all_loop_list.insert(all_loop_list.end(),tmploop); #endif curseries->is_active = false; } } // najde okruh ku kazdej serii for (i = 0; i < nseries; i++) { curseries = &(lcseries[i]); if (!curseries->is_active) continue; curseries->is_active = false; //#ifdef THDEBUG // thprintf("\nNEW SERIES: %ld -> %ld", curseries->from, curseries->to); //#endif // najde najblizsi pevny bod ku from from2fixv.clear(); if (!curseries->from_cross->is_fixed) from2fixl = chledala_chledala(lccrosses, lastcross, NULL, curseries->from_cross, from2fixv); else from2fixl = 0; // najde najblizsti pevny bod ku to to2fixv.clear(); if (!curseries->to_cross->is_fixed) to2fixl = chledala_chledala(lccrosses, lastcross, NULL, curseries->to_cross, to2fixv); else to2fixl = 0; // najde najkratsiu cestu z from do to closev.clear(); closel = chledala_chledala(lccrosses, lastcross, curseries->from_cross, curseries->to_cross, closev); // vytvori okruh if (((from2fixl >= 0) && (to2fixl >= 0)) || (closel > 0)) { // vlozime do okruhu sucasnu hranu tmpca.series = curseries; tmpca.reverse = false; tmpca.prev_arrow = NULL; tmpca.next_arrow = NULL; tmploop.first_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow = tmploop.first_arrow; tmploop.from_cross = curseries->from_cross; tmploop.to_cross = curseries->to_cross; tmploop.minid = curseries->id; tmploop.size = curseries->numlegs; tmploop.id = nloops++; #define checktmploop(ca) {\ if (tmploop.minid > ca.series->id) \ tmploop.minid = ca.series->id; \ tmploop.size += ca.series->numlegs; \ } if ((closel > 0) && (((from2fixl + to2fixl) >= closel) || (from2fixl < 0) || (to2fixl < 0))) { // vytvorime uzavrety okruh it = closev.begin(); while (it != closev.end()) { tmpca = *it; tmploop.last_arrow->next_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow->next_arrow->prev_arrow = tmploop.last_arrow; tmploop.last_arrow = tmploop.last_arrow->next_arrow; tmploop.last_arrow->next_arrow = NULL; checktmploop(tmpca); it++; } tmploop.from_cross = curseries->from_cross; tmploop.to_cross = curseries->from_cross; #ifdef THDEBUG prev_set_size = all_loop_set.size(); #endif all_loop_set.insert(tmploop); #ifdef THDEBUG lsi = all_loop_set.find(tmploop); tmploop.old_id = lsi->id; if (prev_set_size < all_loop_set.size()) tmploop.is_new = true; else tmploop.is_new = false; all_loop_list.insert(all_loop_list.end(),tmploop); #endif } else { // vytvorime otvoreny okruh it = from2fixv.begin(); while (it != from2fixv.end()) { tmpca = *it; tmpca.reverse = !tmpca.reverse; if (tmpca.reverse) tmploop.from_cross = tmpca.series->to_cross; else tmploop.from_cross = tmpca.series->from_cross; tmploop.first_arrow->prev_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.first_arrow->prev_arrow->next_arrow = tmploop.first_arrow; tmploop.first_arrow = tmploop.first_arrow->prev_arrow; tmploop.first_arrow->prev_arrow = NULL; checktmploop(tmpca); it++; } it = to2fixv.begin(); while (it != to2fixv.end()) { tmpca = *it; if (tmpca.reverse) tmploop.to_cross = tmpca.series->from_cross; else tmploop.to_cross = tmpca.series->to_cross; tmploop.last_arrow->next_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow->next_arrow->prev_arrow = tmploop.last_arrow; tmploop.last_arrow = tmploop.last_arrow->next_arrow; tmploop.last_arrow->next_arrow = NULL; checktmploop(tmpca); it++; } #ifdef THDEBUG prev_set_size = all_loop_set.size(); #endif all_loop_set.insert(tmploop); #ifdef THDEBUG lsi = all_loop_set.find(tmploop); tmploop.old_id = lsi->id; if (prev_set_size < all_loop_set.size()) tmploop.is_new = true; else tmploop.is_new = false; all_loop_list.insert(all_loop_list.end(),tmploop); #endif } } curseries->is_active = true; } #ifdef THDEBUG // vypise okruhy na zaklade serii lli = all_loop_list.begin(); i = 0; thprintf("\nSERIES LOOPS:\n"); while (lli != all_loop_list.end()) { lsi = all_loop_set.find(*lli); thprintf("%ld[%ld] %s %s %ld: ", lli->id, lli->old_id, lli->is_new ? "NEW" : "OLD" , lli->from_cross->id != lli->to_cross->id ? "OPN" : "CLS", lli->size); cca = lli->first_arrow; if (cca->reverse) { thprintf("%d(%s@%s)", cca->series->to, this->station_vec[cca->series->to_cross->station_uid - 1].name, this->station_vec[cca->series->to_cross->station_uid - 1].survey->name); } else { thprintf("%d(%s@%s)", cca->series->from, this->station_vec[cca->series->from_cross->station_uid - 1].name, this->station_vec[cca->series->from_cross->station_uid - 1].survey->name); } while (cca != NULL) { if (cca->reverse) { thprintf("[%d(%s@%s)] - %d(%s@%s)", cca->series->to, this->station_vec[cca->series->to_cross->station_uid - 1].name, this->station_vec[cca->series->to_cross->station_uid - 1].survey->name, cca->series->from, this->station_vec[cca->series->from_cross->station_uid - 1].name, this->station_vec[cca->series->from_cross->station_uid - 1].survey->name); } else { thprintf("[%d(%s@%s)] - %d(%s@%s)", cca->series->from, this->station_vec[cca->series->from_cross->station_uid - 1].name, this->station_vec[cca->series->from_cross->station_uid - 1].survey->name, cca->series->to, this->station_vec[cca->series->to_cross->station_uid - 1].name, this->station_vec[cca->series->to_cross->station_uid - 1].survey->name); } cca = cca->next_arrow; } thprintf("\n"); lli++; i++; } #endif // zapise si okruhy do premennych databazy lsi = all_loop_set.begin(); while (lsi != all_loop_set.end()) { // vypise ci je open alebo close, nastavi tdbloop.from = &(this->station_vec[lsi->from_cross->station_uid - 1]); tdbloop.to = &(this->station_vec[lsi->to_cross->station_uid - 1]); if (tdbloop.from->uid == tdbloop.to->uid) tdbloop.open = false; else tdbloop.open = true; tdbloop.nlegs = 0; tdbloop.first_leg = NULL; tdbloop.last_leg = NULL; cca = lsi->first_arrow; while (cca != NULL) { clcleg = cca->reverse ? cca->series->last_leg : cca->series->first_leg; while (clcleg != NULL) { tdbloopleg.leg = clcleg->dbleg->leg; tdbloopleg.reverse = clcleg->dbleg->reverse; if (cca->reverse) tdbloopleg.reverse = !tdbloopleg.reverse; ptdbl = &(* this->loop_leg_list.insert(this->loop_leg_list.end(),tdbloopleg)); if (tdbloop.nlegs == 0) { tdbloop.first_leg = ptdbl; tdbloop.last_leg = ptdbl; ptdbl->next_leg = NULL; ptdbl->prev_leg = NULL; } else { tdbloop.last_leg->next_leg = ptdbl; ptdbl->prev_leg = tdbloop.last_leg; ptdbl->next_leg = NULL; tdbloop.last_leg = ptdbl; } tdbloop.nlegs++; clcleg = cca->reverse ? clcleg->prev_series_leg : clcleg->next_series_leg; } cca = cca->next_arrow; } this->loop_list.insert(this->loop_list.end(), tdbloop); lsi++; } #ifdef THDEBUG thprintf("\nSHOT LOOPS:\n"); dbli = this->loop_list.begin(); i = 0; while (dbli != this->loop_list.end()) { thprintf("%ld %s %ld: %s@%s", i, dbli->open ? "OPN" : "CLS", dbli->nlegs, dbli->from->name, dbli->from->survey->name); ptdbl = dbli->first_leg; while (ptdbl != NULL) { if (ptdbl->reverse) { thprintf(" - %s@%s", this->station_vec[this->station_vec[ptdbl->leg->from.id - 1].uid - 1].name, this->station_vec[this->station_vec[ptdbl->leg->from.id - 1].uid - 1].survey->name); } else { thprintf(" - %s@%s", this->station_vec[this->station_vec[ptdbl->leg->to.id - 1].uid - 1].name, this->station_vec[this->station_vec[ptdbl->leg->to.id - 1].uid - 1].survey->name); } ptdbl = ptdbl->next_leg; } thprintf("\n"); dbli++; i++; } #endif LC_COORD_CALC: if (crossst != NULL) delete [] crossst; if (lclegs != NULL) delete [] lclegs; if (lccrosses != NULL) delete [] lccrosses; if (lccrossarrows != NULL) delete [] lccrossarrows; #ifdef THDEBUG thprintf("\nEND OF LOOP CLOSURE DEBUG\n"); #endif #ifdef THDEBUG thprintf("\nend of loops searching\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif } void thdb1d::close_loops() { unsigned long nlegs = this->get_tree_size(), nstations = this->station_vec.size(); long i; #ifdef THDEBUG thprintf("\n\ncalculating station coordinates\n"); #else thprintf("calculating station coordinates ... "); thtext_inline = true; #endif // * priradi suradnice UID fixnym bodom thdata * dp; bool anyfixed = false; thdb_object_list_type::iterator obi = this->db->object_list.begin(); thdatafix_list::iterator fii; thdb1ds * ps; thdataobject * cx1, * cx2; thdb1ds * tmps; double avg_error = 0.0, avg_error_sum = 0.0; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); fii = dp->fix_list.begin(); while(fii != dp->fix_list.end()) { tmps = &(this->station_vec[fii->station.id - 1]); cx1 = tmps->fixcontext; cx2 = fii->srcf.context; if (((cx1 == NULL) && (cx2 == NULL)) || ((cx1 != NULL) && (cx2 != NULL) && (cx1->id == cx2->id))) { ps = &(this->station_vec[this->station_vec[fii->station.id - 1].uid - 1]); ps->placed = 1; ps->fixed = true; anyfixed = true; ps->x = fii->x; ps->y = fii->y; ps->z = fii->z; if (!thisnan(fii->sdx)) { ps->sdx = fii->sdx; ps->sdy = fii->sdy; ps->sdz = fii->sdz; } } fii++; } } obi++; } // * zrata okruhy (err_(dx|dy|dz), (err|src)_length) // * a potom vyrovna okruhy (nastavi legs) double src_dx, src_dy, src_dz, dst_dx, dst_dy, dst_dz, sum_length, dx, dy, dz, sum_sdx, sum_sdy, sum_sdz, sumlegs, err_dx, err_dy, err_dz; thdb1d_loop_list_type::iterator li; thdb1d_loop_leg * ll; unsigned mode; #ifdef THDEBUG #define nmodes 3 #else #define nmodes 2 #endif for (mode = 0; mode < nmodes; mode++) { li = this->loop_list.begin(); while (li != this->loop_list.end()) { sum_sdx = 0.0; sum_sdy = 0.0; sum_sdz = 0.0; src_dx = 0.0; src_dy = 0.0; src_dz = 0.0; if (li->open) { dst_dx = li->to->x - li->from->x; dst_dy = li->to->y - li->from->y; dst_dz = li->to->z - li->from->z; if (!li->from->adjusted) { sum_sdx += li->from->sdx * li->from->sdx; sum_sdx += li->from->sdy * li->from->sdy; sum_sdx += li->from->sdz * li->from->sdz; } if (!li->to->adjusted) { sum_sdx += li->to->sdx * li->to->sdx; sum_sdx += li->to->sdy * li->to->sdy; sum_sdx += li->to->sdz * li->to->sdz; } } else { dst_dx = 0.0; dst_dy = 0.0; dst_dz = 0.0; } // prvy prechod - spocita chyby a sumu odchylok sumlegs = 0.0; sum_length = 0.0; ll = li->first_leg; while (ll != NULL) { if (ll->reverse) { dx = - ll->leg->adj_dx; dy = - ll->leg->adj_dy; dz = - ll->leg->adj_dz; } else { dx = ll->leg->adj_dx; dy = ll->leg->adj_dy; dz = ll->leg->adj_dz; } sum_length += ll->leg->total_length; if (ll->leg->adjusted) { dst_dx -= dx; dst_dy -= dy; dst_dz -= dz; } else { src_dx += dx; src_dy += dy; src_dz += dz; if (!ll->leg->plumbed) { sum_sdx += ll->leg->total_sdx; sum_sdy += ll->leg->total_sdy; } sum_sdz += ll->leg->total_sdz; } sumlegs += 1.0; ll = ll->next_leg; } // zapise do statistiky #ifdef THDEBUG if (mode == 2) { thprintf("CORRECTION: %7.4f%% -> %7.4f%%\n", li->src_length > 0 ? 100.0 * li->err_length / li->src_length : 0.0, li->src_length > 0 ? 100.0 * sqrt(pow(dst_dx - src_dx,2.0) + pow(dst_dy - src_dy,2.0) + pow(dst_dz - src_dz,2.0)) / li->src_length : 0.0); } else #endif if (mode == 0) { li->src_length = sum_length; li->err_dx = dst_dx - src_dx; li->err_dy = dst_dy - src_dy; li->err_dz = dst_dz - src_dz; li->err_length = sqrt(li->err_dx * li->err_dx + li->err_dy * li->err_dy + li->err_dz * li->err_dz); if (sum_length > 0.0) { avg_error += 100.0 * sumlegs * (li->err_length / sum_length); avg_error_sum += sumlegs; } // vyrovna okruh } else { err_dx = dst_dx - src_dx; err_dy = dst_dy - src_dy; err_dz = dst_dz - src_dz; // ak je okruh otvoreny a std > 0, adjustne koncove body if (li->open) { if (!li->from->adjusted) { if (sum_sdx > 0.0) li->from->x -= err_dx * li->from->sdx / sum_sdx; if (sum_sdy > 0.0) li->from->y -= err_dy * li->from->sdy / sum_sdy; if (sum_sdz > 0.0) li->from->z -= err_dz * li->from->sdz / sum_sdz; li->from->adjusted = true; } if (!li->to->adjusted) { if (sum_sdx > 0.0) li->to->x += err_dx * li->to->sdx / sum_sdx; if (sum_sdy > 0.0) li->to->y += err_dy * li->to->sdy / sum_sdy; if (sum_sdz > 0.0) li->to->z += err_dz * li->to->sdz / sum_sdz; li->to->adjusted = true; } } ll = li->first_leg; while (ll != NULL) { if (!ll->leg->adjusted) { #define ORIENT (ll->reverse ? -1.0 : 1.0) if (sum_sdx > 0.0) ll->leg->adj_dx += ORIENT * err_dx * (ll->leg->plumbed ? 0.0 : ll->leg->total_sdx) / sum_sdx; else ll->leg->adj_dx += ORIENT * err_dx / sumlegs; if (sum_sdy > 0.0) ll->leg->adj_dy += ORIENT * err_dy * (ll->leg->plumbed ? 0.0 : ll->leg->total_sdy) / sum_sdy; else ll->leg->adj_dy += ORIENT * err_dy / sumlegs; if (sum_sdz > 0.0) ll->leg->adj_dz += ORIENT * err_dz * ll->leg->total_sdz / sum_sdz; else ll->leg->adj_dz += ORIENT * err_dz / sumlegs; ll->leg->adjusted = true; #ifdef THDEBUG thprintf("ADJLEG %s@%s - %s@%s: %.2f,%.2f,%.2f -> %.2f,%.2f,%.2f\n", this->station_vec[ll->leg->from.id - 1].name, this->station_vec[ll->leg->from.id - 1].survey->name, this->station_vec[ll->leg->to.id - 1].name, this->station_vec[ll->leg->to.id - 1].survey->name, ll->leg->total_dx, ll->leg->total_dy, ll->leg->total_dz, ll->leg->adj_dx, ll->leg->adj_dy, ll->leg->adj_dz); #endif } ll = ll->next_leg; } } // koniec vyrovnavanie li++; } // koniec cyklu okruhov } // koniec modoveho cyklu // * spocita suradnice UID bodom, tak ze prejde vsetky legy a // * poojde z UID na UID thdb1ds * froms, * tos; thdb1dl ** legs = this->get_tree_legs(), * cleg; long unrecover = -1; for (i = 0; (unsigned long) i < nlegs; i++) { legs[i]->leg->adjusted = false; } for (i = 0; (unsigned long) i < nlegs; i++) { cleg = legs[i]; if (cleg->reverse) { froms = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); } else { froms = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); } if (cleg->leg->data_type == TT_DATATYPE_NOSURVEY) { // ak je no-survey, nastavi mu total statistiku cleg->leg->total_dx = tos->x - froms->x; cleg->leg->total_dy = tos->y - froms->y; cleg->leg->total_dz = tos->z - froms->z; // najprv horizontalnu dlzku cleg->leg->total_length = hypot(cleg->leg->total_dx, cleg->leg->total_dy); cleg->leg->total_bearing = atan2(cleg->leg->total_dx, cleg->leg->total_dy) / THPI * 180.0; if (cleg->leg->total_bearing < 0.0) cleg->leg->total_bearing += 360.0; cleg->leg->total_gradient = atan2(cleg->leg->total_dz, cleg->leg->total_length) / THPI * 180.0; // potom celkovu dlzku cleg->leg->total_length = hypot(cleg->leg->total_length, cleg->leg->total_dz); continue; } if ((i == 0) && (!anyfixed)) { froms->placed = 1; froms->x = 0.0; froms->y = 0.0; froms->z = 0.0; } #ifdef THDEBUG thprintf("LEG: %s@%s [%ld] (from %s@%s [%ld])\n", tos->name, tos->survey->name, tos->uid, froms->name, froms->survey->name, froms->uid ); #endif if (froms->placed == 0) ththrow(("a software BUG is present (" __FILE__ ":%d)", __LINE__)); if (tos->placed == 0) { tos->placed += 1; if (cleg->reverse) { tos->x = froms->x - cleg->leg->adj_dx; tos->y = froms->y - cleg->leg->adj_dy; tos->z = froms->z - cleg->leg->adj_dz; } else { tos->x = froms->x + cleg->leg->adj_dx; tos->y = froms->y + cleg->leg->adj_dy; tos->z = froms->z + cleg->leg->adj_dz; } } else { tos->placed += 1; err_dx = (tos->x - froms->x) - (cleg->reverse ? -1.0 : 1.0) * cleg->leg->adj_dx; err_dy = (tos->y - froms->y) - (cleg->reverse ? -1.0 : 1.0) * cleg->leg->adj_dy; err_dz = (tos->z - froms->z) - (cleg->reverse ? -1.0 : 1.0) * cleg->leg->adj_dz; double err = hypot(hypot(err_dx, err_dy), err_dz); if ((err >= 1e-4) && (i > unrecover)) { #ifdef THDEBUG thprintf("ERRLEG %s@%s - %s@%s: %.2f,%.2f,%.2f\n", froms->name, froms->survey->name, tos->name, tos->survey->name, err_dx, err_dy, err_dz); #endif // mame problem - musime spravit nasledovne thdb1ds * errst, * lastst; errst = tos; lastst = tos; long start_i, end_i; start_i = 0; end_i = i; sumlegs = 0.0; sum_sdx = 0.0; sum_sdy = 0.0; sum_sdz = 0.0; // 1. najst zamery, na ktore chyby rozlozime for (i = end_i; i >= start_i; i--) { cleg = legs[i]; if (cleg->reverse) { froms = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); } else { froms = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); } if ((!cleg->leg->adjusted) && (tos->uid == lastst->uid)) { sumlegs += 1.0; if (!cleg->leg->plumbed) { sum_sdx += cleg->leg->total_sdx; sum_sdy += cleg->leg->total_sdy; } sum_sdz += cleg->leg->total_sdz; cleg->leg->to_be_adjusted = true; } else { cleg->leg->to_be_adjusted = false; } if (tos->uid == lastst->uid) { lastst = froms; if ((froms->placed > 1) || (froms->fixed) || (froms->uid == errst->uid)) { start_i = i; } } if (tos->placed > 0) tos->placed--; } // 2. rozlozit chybu na zamery for (i = start_i; i <= end_i; i++) { cleg = legs[i]; if (cleg->leg->to_be_adjusted) { #define ORIENT2 (cleg->reverse ? -1.0 : 1.0) #ifdef THDEBUG thprintf("ADJLEG %s@%s - %s@%s: %.2f,%.2f,%.2f", this->station_vec[cleg->leg->from.id - 1].name, this->station_vec[cleg->leg->from.id - 1].survey->name, this->station_vec[cleg->leg->to.id - 1].name, this->station_vec[cleg->leg->to.id - 1].survey->name, cleg->leg->adj_dx, cleg->leg->adj_dy, cleg->leg->adj_dz); #endif if (sum_sdx > 0.0) cleg->leg->adj_dx += ORIENT2 * err_dx * (cleg->leg->plumbed ? 0.0 : cleg->leg->total_sdx) / sum_sdx; else cleg->leg->adj_dx += ORIENT2 * err_dx / sumlegs; if (sum_sdy > 0.0) cleg->leg->adj_dy += ORIENT2 * err_dy * (cleg->leg->plumbed ? 0.0 : cleg->leg->total_sdy) / sum_sdy; else cleg->leg->adj_dy += ORIENT2 * err_dy / sumlegs; if (sum_sdz > 0.0) cleg->leg->adj_dz += ORIENT2 * err_dz * cleg->leg->total_sdz / sum_sdz; else cleg->leg->adj_dz += ORIENT2 * err_dz / sumlegs; cleg->leg->adjusted = true; #ifdef THDEBUG thprintf(" -> %.2f,%.2f,%.2f\n", cleg->leg->adj_dx, cleg->leg->adj_dy, cleg->leg->adj_dz); #endif } } // 3. ratat este raz i = start_i - 1; if (sumlegs < 1.0) { #ifdef THDEBUG thprintf("ERRLEG UNRECOVERED!\n"); #endif unrecover = end_i; } } } } // * potom priradi suradnice nie UID bodom for(i = 0; (unsigned long)i < nstations; i++) { ps = &(this->station_vec[i]); froms = &(this->station_vec[ps->uid - 1]); if (ps->placed == 0) { ps->placed++; ps->x = froms->x; ps->y = froms->y; ps->z = froms->z; if (ps->placed == 0) { // ththrow(("a software BUG is present (" __FILE__ ":%d)", __LINE__)); ththrow(("can not connect %s@%s to centerline network", this->station_vec[i].name, this->station_vec[i].survey->get_full_name())); } } } #ifdef THDEBUG thprintf("\nend of station coordinates calculation\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif if (avg_error_sum > 0.0) { thprintf("average loop error: %.2f%%\n", (avg_error / avg_error_sum)); } } struct thdb1d_lpr { thdb1d_loop * li; double err; }; int comp_lpr(const void * l1, const void * l2) { if (((thdb1d_lpr*)l1)->err > ((thdb1d_lpr*)l2)->err) return -1; else if (((thdb1d_lpr*)l1)->err < ((thdb1d_lpr*)l2)->err) return 1; else return 0; } void thdb1d::print_loops() { thdb1d_loop_list_type::iterator lii = this->loop_list.begin(); if (lii == this->loop_list.end()) return; unsigned long i, nloops; thdb1d_loop * li; nloops = this->loop_list.size(); thdb1d_lpr * lpr = new thdb1d_lpr [nloops]; i = 0; while (lii != this->loop_list.end()) { lpr[i].li = &(*lii); if (lii->src_length > 0.0) lpr[i].err = lii->err_length / lii->src_length; else lpr[i].err = 0.0; i++; lii++; } qsort(lpr,nloops,sizeof(thdb1d_lpr),comp_lpr); thdb1d_loop_leg * ll; thsurvey * ss; int totlen = 6 - strlen(thdeflocale.format_length_units()) + 1; thdb1ds * ps, * prev_ps, * first_ps; unsigned long psid, prev_psid, first_psid; thlog.printf("\n\n######################### loop errors ##########################\n"); thlog.printf( "REL-ERR ABS-ERR TOTAL-L STS X-ERROR Y-ERROR Z-ERROR STATIONS\n"); for (i = 0; i < nloops; i++) { li = lpr[i].li; thlog.printf("%6.2f%% %s%s %s%s %3ld %s%s %s%s %s%s [", li->src_length > 0.0 ? 100.0 * li->err_length / li->src_length : 0.0, thdeflocale.format_length(li->err_length,1,totlen), thdeflocale.format_length_units(), thdeflocale.format_length(li->src_length,1,totlen), thdeflocale.format_length_units(), li->nlegs, thdeflocale.format_length(li->err_dx,1,totlen), thdeflocale.format_length_units(), thdeflocale.format_length(li->err_dy,1,totlen), thdeflocale.format_length_units(), thdeflocale.format_length(li->err_dz,1,totlen), thdeflocale.format_length_units()); ll = li->first_leg; ss = NULL; if (ll->reverse) psid = ll->leg->to.id; else psid = ll->leg->from.id; ps = &(this->station_vec[psid - 1]); first_ps = ps; first_psid = psid; thlog.printf("%s", ps->name); if ((ss == NULL) || (ss->id != ps->survey->id)) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } prev_ps = ps; prev_psid = psid; while (ll != NULL) { if (ll->reverse) psid = ll->leg->to.id; else psid = ll->leg->from.id; if (prev_psid != psid) { ps = &(this->station_vec[psid - 1]); thlog.printf(" = %s", ps->name); if (ss->id != ps->survey->id) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } } if (ll->reverse) psid = ll->leg->from.id; else psid = ll->leg->to.id; ps = &(this->station_vec[psid - 1]); thlog.printf(" - %s", ps->name); if (ss->id != ps->survey->id) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } if ((ll->next_leg == NULL) && (!li->open)) { if (first_psid != psid) { psid = first_psid; ps = &(this->station_vec[psid - 1]); thlog.printf(" = %s", ps->name); if (ss->id != ps->survey->id) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } } } prev_ps = ps; prev_psid = psid; ll = ll->next_leg; } thlog.printf("]\n"); } thlog.printf("##################### end of loop errors #######################\n"); delete [] lpr; } thdb3ddata * thdb1d::get_3d_surface() { this->get_3d(); return &(this->d3_surface); } thdb3ddata * thdb1d::get_3d_splay() { this->get_3d(); return &(this->d3_splay); } thdb3ddata * thdb1d::get_3d_walls() { this->get_3d(); return &(this->d3_walls); } thdb3ddata * thdb1d::get_3d() { // vrati 3D data - ale len tie, ktore su oznacene if (this->d3_data_parsed) return &(this->d3_data); this->d3_data_parsed = true; unsigned long nlegs = this->get_tree_size(), nstat = this->station_vec.size(), i, last_st, cur_st; if (nstat <= 0) return &(this->d3_data); // najprv tam vlozi meracske bodiky thdb3dvx ** station_in = new thdb3dvx* [nstat]; // najprv podzemne data for (i = 0; i < nstat; i++) station_in[i] = NULL; #define get_3d_check_station(id) { \ if (station_in[id] == NULL) { \ station_in[id] = this->d3_data.insert_vertex( \ this->station_vec[id].x, \ this->station_vec[id].y, \ this->station_vec[id].z, \ (void *) &(this->station_vec[id])); \ } \ } // polygony tam vlozi ako linestripy (data poojdu na thdb1dl) last_st = nstat; thdb3dfc * fc = NULL, * secfc = NULL, * endsfc = NULL; thdb3dvx * fsecvx[10], * tsecvx[10]; thdb1dl ** tlegs = this->get_tree_legs(); double secx[10], secy[10], secXx, secXy, secXz, secYx, secYy, secYz; thdb1ds * fromst, * tost; int secn, j, prevj, nextj; for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected() && (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) == 0) && (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) == 0)) { cur_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; get_3d_check_station(cur_st); if (cur_st != last_st) { fc = this->d3_data.insert_face(THDB3DFC_LINE_STRIP); fc->insert_vertex(station_in[cur_st], (void *) *tlegs); } last_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; get_3d_check_station(last_st); fc->insert_vertex(station_in[last_st], (void *) *tlegs); // tu vygeneruje LRUD obalku if ((*tlegs)->leg->walls == TT_FALSE) goto SKIP_WALLS; #define secpt(N,X,Y) secx[N] = X; secy[N] = Y; switch ((*tlegs)->leg->shape) { case TT_DATALEG_SHAPE_DIAMOND: secpt(0,0.5,0.0); secpt(1,1.0,0.5); secpt(2,0.5,1.0); secpt(3,0.0,0.5); secn = 4; break; case TT_DATALEG_SHAPE_OCTAGON: secpt(0,0.292893218813,0.0); secpt(1,0.707106781167,0.0); secpt(2,1.0,0.292893218813); secpt(3,1.0,0.707106781167); secpt(4,0.707106781167,1.0); secpt(5,0.292893218813,1.0); secpt(6,0.0,0.707106781167); secpt(7,0.0,0.292893218813); secn = 8; break; case TT_DATALEG_SHAPE_TRIANGLE: secpt(0,0.0,0.0); secpt(1,1.0,0.0); secpt(2,0.5,1.0); secn = 3; break; case TT_DATALEG_SHAPE_TUNNEL: secpt(0,0.0,0.0); secpt(1,1.0,0.0); secpt(2,0.904508497187,0.61803398875); secpt(3,0.654508497187,1.0); secpt(4,0.345491502823,1.0); secpt(5,0.095491502823,0.61803398875); secn = 6; break; case TT_DATALEG_SHAPE_RECTANGLE: default: secpt(0,0.0,0.0); secpt(1,1.0,0.0); secpt(2,1.0,1.0); secpt(3,0.0,1.0); secn = 4; break; } // spocitame si X a Y section vectors secXx = cos((*tlegs)->leg->total_bearing / 180.0 * THPI); secXy = -sin((*tlegs)->leg->total_bearing / 180.0 * THPI); secXz = 0; if (fabs((*tlegs)->leg->total_gradient) < (*tlegs)->leg->vtresh) { secYx = 0.0; secYy = 0.0; secYz = 1.0; } else { secYx = -sin((*tlegs)->leg->total_gradient / 180.0 * THPI) * sin((*tlegs)->leg->total_bearing / 180.0 * THPI); secYy = -sin((*tlegs)->leg->total_gradient / 180.0 * THPI) * cos((*tlegs)->leg->total_bearing / 180.0 * THPI); secYz = cos((*tlegs)->leg->total_gradient / 180.0 * THPI); } secfc = this->d3_walls.insert_face(THDB3DFC_TRIANGLE_STRIP); endsfc = this->d3_walls.insert_face(THDB3DFC_TRIANGLES); // vypocitame a vlozime body aj s normalami fromst = &(this->station_vec[(*tlegs)->leg->from.id - 1]); tost = &(this->station_vec[(*tlegs)->leg->to.id - 1]); //#define SYMPASSAGES for(j = 0; j < secn; j++) { fsecvx[j] = this->d3_walls.insert_vertex( #ifdef SYMPASSAGES fromst->x - (*tlegs)->leg->from_left * secXx - (*tlegs)->leg->from_down * secYx + secx[j] * ((*tlegs)->leg->from_left + (*tlegs)->leg->from_right) * secXx + secy[j] * ((*tlegs)->leg->from_up + (*tlegs)->leg->from_down) * secYx, fromst->y - (*tlegs)->leg->from_left * secXy - (*tlegs)->leg->from_down * secYy + secx[j] * ((*tlegs)->leg->from_left + (*tlegs)->leg->from_right) * secXy + secy[j] * ((*tlegs)->leg->from_up + (*tlegs)->leg->from_down) * secYy, fromst->z - (*tlegs)->leg->from_left * secXz - (*tlegs)->leg->from_down * secYz + secx[j] * ((*tlegs)->leg->from_left + (*tlegs)->leg->from_right) * secXz + secy[j] * ((*tlegs)->leg->from_up + (*tlegs)->leg->from_down) * secYz, #else fromst->x + (secx[j] < 0.5 ? (*tlegs)->leg->from_left : (*tlegs)->leg->from_right) * (secx[j] - 0.5) / 0.5 * secXx + (secy[j] < 0.5 ? (*tlegs)->leg->from_down : (*tlegs)->leg->from_up) * (secy[j] - 0.5) / 0.5 * secYx, fromst->y + (secx[j] < 0.5 ? (*tlegs)->leg->from_left : (*tlegs)->leg->from_right) * (secx[j] - 0.5) / 0.5 * secXy + (secy[j] < 0.5 ? (*tlegs)->leg->from_down : (*tlegs)->leg->from_up) * (secy[j] - 0.5) / 0.5 * secYy, fromst->z + (secx[j] < 0.5 ? (*tlegs)->leg->from_left : (*tlegs)->leg->from_right) * (secx[j] - 0.5) / 0.5 * secXz + (secy[j] < 0.5 ? (*tlegs)->leg->from_down : (*tlegs)->leg->from_up) * (secy[j] - 0.5) / 0.5 * secYz, #endif NULL); tsecvx[j] = this->d3_walls.insert_vertex( #ifdef SYMPASSAGES tost->x - (*tlegs)->leg->to_left * secXx - (*tlegs)->leg->to_down * secYx + secx[j] * ((*tlegs)->leg->to_left + (*tlegs)->leg->to_right) * secXx + secy[j] * ((*tlegs)->leg->to_up + (*tlegs)->leg->to_down) * secYx, tost->y - (*tlegs)->leg->to_left * secXy - (*tlegs)->leg->to_down * secYy + secx[j] * ((*tlegs)->leg->to_left + (*tlegs)->leg->to_right) * secXy + secy[j] * ((*tlegs)->leg->to_up + (*tlegs)->leg->to_down) * secYy, tost->z - (*tlegs)->leg->to_left * secXz - (*tlegs)->leg->to_down * secYz + secx[j] * ((*tlegs)->leg->to_left + (*tlegs)->leg->to_right) * secXz + secy[j] * ((*tlegs)->leg->to_up + (*tlegs)->leg->to_down) * secYz, #else tost->x + (secx[j] < 0.5 ? (*tlegs)->leg->to_left : (*tlegs)->leg->to_right) * (secx[j] - 0.5) / 0.5 * secXx + (secy[j] < 0.5 ? (*tlegs)->leg->to_down : (*tlegs)->leg->to_up) * (secy[j] - 0.5) / 0.5 * secYx, tost->y + (secx[j] < 0.5 ? (*tlegs)->leg->to_left : (*tlegs)->leg->to_right) * (secx[j] - 0.5) / 0.5 * secXy + (secy[j] < 0.5 ? (*tlegs)->leg->to_down : (*tlegs)->leg->to_up) * (secy[j] - 0.5) / 0.5 * secYy, tost->z + (secx[j] < 0.5 ? (*tlegs)->leg->to_left : (*tlegs)->leg->to_right) * (secx[j] - 0.5) / 0.5 * secXz + (secy[j] < 0.5 ? (*tlegs)->leg->to_down : (*tlegs)->leg->to_up) * (secy[j] - 0.5) / 0.5 * secYz, #endif NULL); } // spocitame normaly na vrcholoch prevj = secn - 1; for(j = 0; j < secn; j++) { nextj = j + 1; if (nextj == secn) nextj = 0; // zrata normalu medzi vrcholmi prevj - j - nextj lxVec v1, v2, v3; v1 = lxVec(fsecvx[j]->x - fsecvx[prevj]->x, fsecvx[j]->y - fsecvx[prevj]->y, fsecvx[j]->z - fsecvx[prevj]->z); v2 = lxVec(fsecvx[j]->x - fsecvx[nextj]->x, fsecvx[j]->y - fsecvx[nextj]->y, fsecvx[j]->z - fsecvx[nextj]->z); v3 = lxVec(fsecvx[j]->x - tsecvx[j]->x, fsecvx[j]->y - tsecvx[j]->y, fsecvx[j]->z - tsecvx[j]->z); v1 = v1 ^ v3; v1.Normalize(); v2 = v2 ^ v3; v2.Normalize(); v3 = v1 - v2; v3.Normalize(); fsecvx[j]->insert_normal(v3.x, v3.y, v3.z); v1 = lxVec(tsecvx[j]->x - tsecvx[prevj]->x, tsecvx[j]->y - tsecvx[prevj]->y, tsecvx[j]->z - tsecvx[prevj]->z); v2 = lxVec(tsecvx[j]->x - tsecvx[nextj]->x, tsecvx[j]->y - tsecvx[nextj]->y, tsecvx[j]->z - tsecvx[nextj]->z); v3 = lxVec(tsecvx[j]->x - fsecvx[j]->x, tsecvx[j]->y - fsecvx[j]->y, tsecvx[j]->z - fsecvx[j]->z); v1 = v1 ^ v3; v1.Normalize(); v2 = v2 ^ v3; v2.Normalize(); v3 = v2 - v1; v3.Normalize(); tsecvx[j]->insert_normal(v3.x, v3.y, v3.z); if (j > 1) { endsfc->insert_vertex(fsecvx[0],NULL); endsfc->insert_vertex(fsecvx[j - 1],NULL); endsfc->insert_vertex(fsecvx[j],NULL); endsfc->insert_vertex(tsecvx[0],NULL); endsfc->insert_vertex(tsecvx[j],NULL); endsfc->insert_vertex(tsecvx[j - 1],NULL); } prevj = j; } // vlozime triangle strip for(j = 0; j < secn; j++) { secfc->insert_vertex(fsecvx[j],NULL); secfc->insert_vertex(tsecvx[j],NULL); } secfc->insert_vertex(fsecvx[0],NULL); secfc->insert_vertex(tsecvx[0],NULL); // koniec generovania LRUD obalky SKIP_WALLS:; } } // potom povrchove data for (i = 0; i < nstat; i++) station_in[i] = NULL; #undef get_3d_check_station #define get_3d_check_station(id) { \ if (station_in[id] == NULL) { \ station_in[id] = this->d3_surface.insert_vertex( \ this->station_vec[id].x, \ this->station_vec[id].y, \ this->station_vec[id].z, \ (void *) &(this->station_vec[id])); \ } \ } // polygony tam vlozi ako linestripy (data poojdu na thdb1dl) last_st = nstat; fc = NULL; tlegs = this->get_tree_legs(); for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected() && (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) != 0) && (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) == 0)) { cur_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; get_3d_check_station(cur_st); if (cur_st != last_st) { fc = this->d3_surface.insert_face(THDB3DFC_LINE_STRIP); fc->insert_vertex(station_in[cur_st], (void *) *tlegs); } last_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; get_3d_check_station(last_st); fc->insert_vertex(station_in[last_st], (void *) *tlegs); } } // potom splay data for (i = 0; i < nstat; i++) station_in[i] = NULL; #undef get_3d_check_station #define get_3d_check_station(id) { \ if (station_in[id] == NULL) { \ station_in[id] = this->d3_splay.insert_vertex( \ this->station_vec[id].x, \ this->station_vec[id].y, \ this->station_vec[id].z, \ (void *) &(this->station_vec[id])); \ } \ } // polygony tam vlozi ako linestripy (data poojdu na thdb1dl) last_st = nstat; fc = NULL; tlegs = this->get_tree_legs(); for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected() && (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) != 0)) { cur_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; get_3d_check_station(cur_st); if (cur_st != last_st) { fc = this->d3_splay.insert_face(THDB3DFC_LINE_STRIP); fc->insert_vertex(station_in[cur_st], (void *) *tlegs); } last_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; get_3d_check_station(last_st); fc->insert_vertex(station_in[last_st], (void *) *tlegs); } } // meracske body tam vlozi ako body (data na dbdb1ds) delete [] station_in; return &(this->d3_data); } void thdb1d::postprocess_objects() { thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: ((thsurface*)(*obi))->check_stations(); break; } obi++; } // zrata priemerne dlzky shotov pre vsetky stations kvuoli interpolacii thdb1d_tree_arrow * arrow; thdb1d_tree_node * node, * nodes = this->get_tree_nodes(); thdb1ds * s; double numl; for(unsigned long i = 0; i < this->station_vec.size(); i++) { s = &(this->station_vec[i]); if (s->uid < (i + 1)) { s->asl = this->station_vec[s->uid - 1].asl; } else { s->asl = 0.0; numl = 0; node = &(nodes[i]); arrow = node->first_arrow; while (arrow != NULL) { if ((arrow->leg->leg->flags & TT_LEGFLAG_SURFACE) == 0) { s->asl += arrow->leg->leg->total_length; numl += 1.0; } arrow = arrow->next_arrow; } if (s->asl == 0.0) s->asl = thnan; else s->asl /= numl; } } } void thdb1d::process_xelev() { unsigned long tn_legs = this->leg_vec.size(); unsigned long tn_stations = this->station_vec.size(); if ((tn_legs < 0) || (tn_stations < 0)) return; #ifdef THDEBUG thprintf("\n\nprocessing extended elevation\n"); #else thprintf("processing extended elevation ... "); thtext_inline = true; #endif // PREPROCESS thdataextend_list::iterator xi; thdb1ds * st1; thdata * dp; thdb1d_tree_node * nodes = this->get_tree_nodes(), * from_node, * to_node; thdb1d_tree_arrow * carrow; thbuffer tmpbf; thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_DATA_CMD: try { dp = (thdata *)(*obi); xi = dp->extend_list.begin(); while(xi != dp->extend_list.end()) { if (!xi->to.is_empty()) { // find shot to apply extend to from_node = nodes + (nodes[xi->from.id - 1].uid - 1); to_node = nodes + (nodes[xi->to.id - 1].uid - 1); carrow = from_node->first_arrow; while (carrow != NULL) { if (carrow->end_node->uid == to_node->uid) break; carrow = carrow->next_arrow; } if (carrow == NULL) { tmpbf = xi->from.name; if (xi->from.survey != NULL) { tmpbf += "@"; tmpbf += xi->from.survey; } tmpbf += " - "; tmpbf += xi->to.name; if (xi->to.survey != NULL) { tmpbf += "@"; tmpbf += xi->to.survey; } ththrow(("survey shot not found -- %s", tmpbf.get_buffer())) } else { // the leg is in carrow - set its extend if ((xi->extend & TT_EXTENDFLAG_DIRECTION) != 0) { carrow->leg->leg->extend &= ~TT_EXTENDFLAG_DIRECTION; carrow->extend &= ~TT_EXTENDFLAG_DIRECTION; } carrow->extend |= xi->extend; switch (xi->extend) { case TT_EXTENDFLAG_LEFT: if (carrow->is_reversed) carrow->leg->leg->extend |= TT_EXTENDFLAG_RIGHT; else carrow->leg->leg->extend |= TT_EXTENDFLAG_LEFT; break; case TT_EXTENDFLAG_RIGHT: if (carrow->is_reversed) carrow->leg->leg->extend |= TT_EXTENDFLAG_LEFT; else carrow->leg->leg->extend |= TT_EXTENDFLAG_RIGHT; break; case TT_EXTENDFLAG_VERTICAL: carrow->leg->leg->extend |= TT_EXTENDFLAG_VERTICAL; carrow->negative->extend |= TT_EXTENDFLAG_VERTICAL; break; default: carrow->leg->leg->extend |= xi->extend; } } } else { // add station extend attribute st1 = &(this->station_vec[xi->from.id - 1]); from_node = nodes + (nodes[xi->from.id - 1].uid - 1); if ((xi->extend & TT_EXTENDFLAG_DIRECTION) != 0) { st1->extend &= ~TT_EXTENDFLAG_DIRECTION; } st1->extend |= xi->extend; if ((xi->extend & TT_EXTENDFLAG_IGNORE) != 0) { carrow = from_node->first_arrow; while (carrow != NULL) { carrow->leg->leg->extend |= TT_EXTENDFLAG_IGNORE; carrow->extend |= TT_EXTENDFLAG_IGNORE; carrow->negative->extend |= TT_EXTENDFLAG_IGNORE; carrow = carrow->next_arrow; } } if ((xi->extend & TT_EXTENDFLAG_HIDE) != 0) { carrow = from_node->first_arrow; while (carrow != NULL) { carrow->leg->leg->extend |= TT_EXTENDFLAG_HIDE; carrow->extend |= TT_EXTENDFLAG_HIDE; carrow->negative->extend |= TT_EXTENDFLAG_HIDE; carrow = carrow->next_arrow; } } if (xi->extend == TT_EXTENDFLAG_BREAK) { carrow = from_node->first_arrow; while (carrow != NULL) { carrow->extend |= TT_EXTENDFLAG_BREAK; carrow = carrow->next_arrow; } } } xi++; } } catch (...) threthrow(("%s [%d]", xi->srcf.name, xi->srcf.line)); break; } obi++; } // PREPARE tree for new tremaux // is_attached to false unsigned long i; thdb1d_tree_node * n1, * current_node = NULL; thdb1d_tree_arrow * a1, * a2; // vsetky is discovery na false a1 = this->tree_arrows; for(i = 0; i < tn_legs; i++) { a1->is_discovery = false; a1++; a1->is_discovery = false; a1++; } // poojde v modoch normal/ignoreignore // FIND ROOT STATION AND FIRST SHOT // + traverse all stations // + find start in survey in highest level // + find top entrance // + find top station // // SHOT: // + find free start shot // + find free non ignore shot (ak nie ignoreignore) // EXTEND FROM ROOT // until everything is calculated unsigned long tarrows = 0; bool component_break = true; bool ignorant_mode = false, just_started = true; int default_left(1), go_left; // -1 - left, 1 - right, 0 - vertical int start_level, clevel; double cxx = 0.0; while (tarrows < tn_legs) { if (component_break) { for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { n1->is_attached = false; } a1 = this->tree_arrows; start_level = 0; a2 = NULL; for(i = 0; i < 2 * tn_legs; i++) { if (!a1->is_discovery) { // only ignore shots left clevel = 0; if ((a1->leg->leg->extend & TT_EXTENDFLAG_IGNORE) == 0) { // non ignore shots left clevel = 1; // dead end station if (a1->start_node->narrows == 1) clevel = 2; // entrance station left if ((this->station_vec[(a1->is_reversed ? (a1->leg->leg->to.id) : (a1->leg->leg->from.id)) - 1].flags & TT_STATIONFLAG_ENTRANCE) != 0) clevel = 3; // start station left if ((this->station_vec[a1->start_node->uid - 1].extend & TT_EXTENDFLAG_START) != 0) clevel = 4; // start shot left if ((a1->extend & TT_EXTENDFLAG_START) != 0) clevel = 5; if (a1->start_node->xx_touched) clevel = 6; } if (clevel > start_level) { start_level = clevel; a2 = a1; } else if ((clevel == start_level) && ((a2 == NULL) || (this->station_vec[a1->start_node->uid - 1].z > this->station_vec[a2->start_node->uid - 1].z))) { a2 = a1; } } a1++; } if (start_level == 0) ignorant_mode = true; // set up current_node & current_node->last_arrow if (a2 == NULL) { thwarning(("not all shots attached to extended elevation")); break; } current_node = a2->start_node; current_node->last_arrow = a2; current_node->is_attached = true; current_node->back_arrow = NULL; cxx = current_node->xx; component_break = false; if (!current_node->xx_touched) { switch (this->station_vec[current_node->uid - 1].extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_LEFT: case TT_EXTENDFLAG_REVERSE: current_node->xx_left = -1; break; case TT_EXTENDFLAG_VERTICAL: current_node->xx_left = 0; break; } } default_left = current_node->xx_left; just_started = true; #ifdef THDEBUG thprintf("START -- %d (%s@%s)\n", current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } if (just_started) { just_started = false; } else { // let's make move bool try_first; try_first = true; if (current_node->last_arrow == NULL) { try_first = false; current_node->last_arrow = current_node->first_arrow; } // find arrow that is not discovery and not ignored (if not ignorant mode) while (current_node->last_arrow != NULL) { if ((!current_node->last_arrow->is_discovery) && (ignorant_mode || (((current_node->last_arrow->extend & TT_EXTENDFLAG_IGNORE) == 0) && ((current_node->last_arrow->extend & TT_EXTENDFLAG_BREAK) == 0)))) break; current_node->last_arrow = current_node->last_arrow->next_arrow; if (try_first && (current_node->last_arrow == NULL)) { try_first = false; current_node->last_arrow = current_node->first_arrow; } } } if (current_node->last_arrow == NULL) { // go back if (current_node->back_arrow == NULL) component_break = true; else { current_node = current_node->back_arrow->end_node; cxx = current_node->xx; default_left = current_node->xx_left; #ifdef THDEBUG thprintf("%d (%s@%s) <-\n", current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } } else { // go forward current_node->last_arrow->is_discovery = true; current_node->last_arrow->negative->is_discovery = true; tarrows++; // set start x if (current_node->last_arrow->is_reversed) current_node->last_arrow->leg->leg->txx = cxx; else current_node->last_arrow->leg->leg->fxx = cxx; // change cxx switch (this->station_vec[current_node->last_arrow->end_node->uid - 1].extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_REVERSE: default_left = -default_left; break; case TT_EXTENDFLAG_LEFT: default_left = -1; break; case TT_EXTENDFLAG_RIGHT: default_left = 1; break; case TT_EXTENDFLAG_VERTICAL: default_left = 0; break; } current_node->last_arrow->end_node->xx_left = default_left; go_left = default_left; if ((current_node->last_arrow->extend & (TT_EXTENDFLAG_LEFT | TT_EXTENDFLAG_RIGHT | TT_EXTENDFLAG_REVERSE | TT_EXTENDFLAG_VERTICAL)) == 0) { switch (current_node->last_arrow->leg->leg->extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_LEFT: go_left = -1; if (current_node->last_arrow->is_reversed) go_left = -go_left; break; case TT_EXTENDFLAG_RIGHT: go_left = 1; if (current_node->last_arrow->is_reversed) go_left = -go_left; break; case TT_EXTENDFLAG_REVERSE: go_left = -go_left; break; case TT_EXTENDFLAG_VERTICAL: go_left = 0; break; } } else { switch (current_node->last_arrow->extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_REVERSE: go_left = -go_left; break; case TT_EXTENDFLAG_LEFT: go_left = -1; break; case TT_EXTENDFLAG_RIGHT: go_left = 1; break; case TT_EXTENDFLAG_VERTICAL: go_left = 0; break; } } cxx += double(go_left) * hypot(current_node->last_arrow->leg->leg->total_dx, current_node->last_arrow->leg->leg->total_dy); // set end x if (current_node->last_arrow->is_reversed) current_node->last_arrow->leg->leg->fxx = cxx; else current_node->last_arrow->leg->leg->txx = cxx; #ifdef THDEBUG thprintf("-> %d (%s@%s)\n", current_node->last_arrow->end_node->id, this->station_vec[current_node->last_arrow->end_node->id - 1].name, this->station_vec[current_node->last_arrow->end_node->id - 1].survey->get_full_name()); #endif if (!current_node->last_arrow->end_node->is_attached) { current_node->last_arrow->end_node->back_arrow = current_node->last_arrow->negative; current_node = current_node->last_arrow->end_node; current_node->xx = cxx; if (!current_node->extendx_ok) { current_node->extendx = cxx; current_node->extendx_ok = true; } current_node->is_attached = true; current_node->xx_touched = true; } else { cxx = current_node->xx; } } } // END OF TREMAUX #ifdef THDEBUG thprintf("\nend of extended elevation\n"); #else thprintf("done\n"); thtext_inline = false; #endif } therion/thexpdb.cxx0000664000175000017500000003370312255621612013440 0ustar useruser/** * @file thexpdb.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexpdb.h" #include "thexception.h" #include "thscrap.h" #include "thmap.h" #include "thdatabase.h" #include "thdb1d.h" #include "thdata.h" #include "thinit.h" #include "thsurvey.h" #include #include "thchenc.h" #include #include "thinfnan.h" thexpdb::thexpdb() { this->format = TT_EXPDB_FMT_UNKNOWN; this->encoding = TT_UNKNOWN_ENCODING; } void thexpdb::parse_options(int & argx, int nargs, char ** args) { int optid = thmatch_token(args[argx], thtt_expdb_opt); int optx = argx; switch (optid) { case TT_EXPDB_OPT_FORMAT: argx++; if (argx >= nargs) ththrow(("missing format -- \"%s\"",args[optx])) this->format = thmatch_token(args[argx], thtt_expdb_fmt); if (this->format == TT_EXPDB_FMT_UNKNOWN) ththrow(("unknown format -- \"%s\"", args[argx])) argx++; break; case TT_EXPDB_OPT_ENCODING: argx++; if (argx >= nargs) ththrow(("missing encoding -- \"%s\"",args[optx])) this->encoding = thmatch_token(args[argx], thtt_encoding); if (this->encoding == TT_UNKNOWN_ENCODING) ththrow(("unknown encoding -- \"%s\"", args[argx])) argx++; break; default: thexport::parse_options(argx, nargs, args); break; } } void thexpdb::dump_header(FILE * xf) { thexport::dump_header(xf); //fprintf(xf,"export\tmodel"); } void thexpdb::dump_body(FILE * xf) { thexport::dump_body(xf); if (this->format != TT_EXPDB_FMT_UNKNOWN) fprintf(xf," -format %s", thmatch_string(this->format, thtt_expdb_fmt)); if (this->encoding != TT_UNKNOWN_ENCODING) fprintf(xf," -encoding %s", thmatch_string(this->encoding, thtt_encoding)); } void thexpdb::process_db(class thdatabase * dbp) { this->db = dbp; if (this->format == TT_EXPDB_FMT_UNKNOWN) { this->format = TT_EXPDB_FMT_SQL; // TODO: format parsing according to extension } switch (this->format) { case TT_EXPDB_FMT_SQL: this->export_sql_file(dbp); break; } } void thexpdb::export_sql_file(class thdatabase * dbp) { int enc = this->encoding; if (enc == TT_UNKNOWN_ENCODING) enc = thini.get_encoding(THINIT_ENCODING_SQL); const char * fnm = this->get_output("cave.sql"); unsigned long i, ni; ni = dbp->db1d.get_tree_size(); #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif FILE * sqlf; sqlf = fopen(fnm,"w"); if (sqlf == NULL) { thwarning(("can't open %s for output",fnm)) return; } thdb_object_list_type::iterator oi; thdataleg_list::iterator lei; thdata_team_set_type::iterator ti; std::map personmap; std::map::iterator personmapit; long personx, shotx; //char * tmpstr; thdb1ds * st, * st2; thsurvey * sp; thdata * dp; thmap * mapp; thscrap * scrapp; int pass; double adx, ady, adz; unsigned survey_name = 1, survey_full_name = 1, centreline_title = 1, survey_title = 1, person_name = 1, person_surname = 1, // station_type = 4, station_name = 4; //station_comment = 4, // survey #define IF_PRINTING if (pass == 1) #define ENCODESTR(str) {\ if (str != NULL) \ thdecode(&(dbp->buff_enc),enc,str); \ else \ dbp->buff_enc = ""; \ thdecode_sql(&(dbp->buff_tmp),dbp->buff_enc.get_buffer());} #define ESTR (dbp->buff_tmp.get_buffer()) #define CHECK_STRLEN(var,str) {if (strlen(str) > var) var = strlen(str);} #define INSERTPERSON \ personmapit = personmap.find(*ti); \ if (personmapit == personmap.end()) { \ personmap[*ti] = ++personx; \ ENCODESTR(ti->get_n1()); \ IF_PRINTING fprintf(sqlf,"insert into PERSON values (%ld, %s, ", \ personx, ESTR); \ else CHECK_STRLEN(person_name,ESTR); \ ENCODESTR(ti->get_n2()); \ IF_PRINTING fprintf(sqlf,"%s);\n", ESTR); \ else CHECK_STRLEN(person_surname, ESTR); \ personmapit = personmap.find(*ti); \ } for (pass = 0; pass < 2; pass++) { oi = dbp->object_list.begin(); personx = 0; personmap.clear(); shotx = 0; IF_PRINTING { // fprintf(sqlf,"begin transaction;\ncreate table SURVEY " fprintf(sqlf,"create table SURVEY " "(ID integer, PARENT_ID integer, NAME varchar(%d), " "FULL_NAME varchar(%d), TITLE varchar(%d));\n", survey_name, survey_full_name, survey_title); fprintf(sqlf,"create table CENTRELINE " "(ID integer, SURVEY_ID integer, TITLE varchar(%d), TOPO_DATE date, " "EXPLO_DATE date, LENGTH real, SURFACE_LENGTH real, " "DUPLICATE_LENGTH real);\n", centreline_title); fprintf(sqlf,"create table PERSON " "(ID integer, NAME varchar(%d), SURNAME varchar(%d));\n", person_name, person_surname); fprintf(sqlf,"create table EXPLO " "(PERSON_ID integer, CENTRELINE_ID integer);\n"); fprintf(sqlf,"create table TOPO " "(PERSON_ID integer, CENTRELINE_ID integer);\n"); fprintf(sqlf,"create table STATION " "(ID integer, NAME varchar(%d), SURVEY_ID integer, " "X real, Y real, Z real);\n", station_name); fprintf(sqlf,"create table STATION_FLAG " "(STATION_ID integer, FLAG char(3));\n"); fprintf(sqlf,"create table SHOT " "(ID integer, FROM_ID integer, TO_ID integer, " "CENTRELINE_ID integer, " "LENGTH real, BEARING real, GRADIENT real, " "ADJ_LENGTH real, ADJ_BEARING real, ADJ_GRADIENT real, " "ERR_LENGTH real, ERR_BEARING real, ERR_GRADIENT real" ");\n"); fprintf(sqlf,"create table SHOT_FLAG " "(SHOT_ID integer, FLAG char(3));\n"); fprintf(sqlf,"create table MAPS " "(ID integer, SURVEY_ID integer, NAME varchar(%d), TITLE varchar(%d), PROJID integer, LENGTH real, DEPTH real);\n", survey_name, survey_title); fprintf(sqlf,"create table SCRAPS " "(ID integer, SURVEY_ID integer, NAME varchar(%d), PROJID integer);\n", survey_name); fprintf(sqlf,"create table MAPITEMS " "(ID integer, TYPE integer, ITEMID integer);\n"); } // END OF TABLE HEADERS // PRINTING DATA FROM OBJECTS while (oi != dbp->object_list.end()) { switch ((*oi)->get_class_id()) { case TT_SURVEY_CMD: sp = (thsurvey *)(*oi); ENCODESTR(sp->title); IF_PRINTING { fprintf(sqlf,"insert into SURVEY values " "(%ld, %ld, '%s', '%s', %s);\n ", sp->id, (sp->fsptr != NULL ? sp->fsptr->id : 0), sp->name, sp->full_name, ESTR ); } else { CHECK_STRLEN(survey_name,sp->name); CHECK_STRLEN(survey_full_name,sp->full_name); CHECK_STRLEN(survey_title,ESTR); } break; // SURVEY case TT_SCRAP_CMD: scrapp = (thscrap *)(*oi); IF_PRINTING { fprintf(sqlf,"insert into SCRAPS values " "(%ld, %ld, '%s', %d);\n ", scrapp->id, (scrapp->fsptr != NULL ? scrapp->fsptr->id : 0), scrapp->name, scrapp->proj->id); } else { CHECK_STRLEN(survey_name,scrapp->name); } break; case TT_MAP_CMD: mapp = (thmap *)(*oi); mapp->stat.scanmap(mapp); ENCODESTR(mapp->title); IF_PRINTING { fprintf(sqlf,"insert into MAPS values " "(%ld, %ld, '%s', %s, %d, %.3lf, %.3lf);\n ", mapp->id, (mapp->fsptr != NULL ? mapp->fsptr->id : 0), mapp->name, ESTR, mapp->projection_id, mapp->stat.get_length(), mapp->stat.get_depth() ); thdb2dmi * cit = mapp->first_item; while (cit != NULL) { fprintf(sqlf,"insert into MAPITEMS values " "(%ld, %d, %ld);\n ", mapp->id, cit->type, cit->object->id); cit = cit->next_item; } } else { CHECK_STRLEN(survey_name,mapp->name); CHECK_STRLEN(survey_title,ESTR); } break; case TT_DATA_CMD: dp = (thdata *)(*oi); ENCODESTR(dp->title); IF_PRINTING { fprintf(sqlf,"insert into CENTRELINE values " "(%ld, %ld, %s, ", dp->id, dp->fsptr->id, ESTR); fprintf(sqlf,"%s, ", dp->date.get_str(TT_DATE_FMT_SQL_SINGLE)); fprintf(sqlf,"%s, ", dp->discovery_date.get_str(TT_DATE_FMT_SQL_SINGLE)); fprintf(sqlf,"%.2f, %.2f, %.2f);\n ", dp->stat_length, dp->stat_slength, dp->stat_dlength); } else { CHECK_STRLEN(centreline_title,ESTR); } for(ti = dp->team_set.begin(); ti != dp->team_set.end(); ti++) { INSERTPERSON; IF_PRINTING { fprintf(sqlf,"insert into TOPO values (%ld, %ld);\n ", personmapit->second, dp->id); } } for(ti = dp->discovery_team_set.begin(); ti != dp->discovery_team_set.end(); ti++) { INSERTPERSON; IF_PRINTING { fprintf(sqlf,"insert into EXPLO values (%ld, %ld);\n ", personmapit->second, dp->id); } } for(lei = dp->leg_list.begin(); lei != dp->leg_list.end(); lei++) { if (lei->is_valid) { IF_PRINTING { st = &(dbp->db1d.station_vec[lei->from.id - 1]); st2 = &(dbp->db1d.station_vec[lei->to.id - 1]); adx = st2->x - st->x; ady = st2->y - st->y; adz = st2->z - st->z; fprintf(sqlf,"insert into SHOT values (" "%ld, %ld, %ld, %ld, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f);\n", ++shotx, lei->from.id, lei->to.id, dp->id, lei->total_length, lei->total_bearing, lei->total_gradient, thdxyz2length(adx, ady, adz), thdxyz2bearing(adx, ady, adz), thdxyz2clino(adx, ady, adz), thdxyz2length(adx - lei->total_dx, ady - lei->total_dy, adz - lei->total_dz), thdxyz2bearing(adx - lei->total_dx, ady - lei->total_dy, adz - lei->total_dz), thdxyz2clino(adx - lei->total_dx, ady - lei->total_dy, adz - lei->total_dz) ); if ((lei->flags & TT_LEGFLAG_SURFACE) != TT_LEGFLAG_NONE) fprintf(sqlf,"insert into SHOT_FLAG values(%ld, 'srf');\n", shotx); if ((lei->flags & TT_LEGFLAG_DUPLICATE) != TT_LEGFLAG_NONE) fprintf(sqlf,"insert into SHOT_FLAG values(%ld, 'dpl');\n", shotx); } } } break; // DATA } oi++; } // END PRINTING DATA FROM OBJECTS ni = dbp->db1d.station_vec.size(); for(i = 0; i < ni; i++) { st = &(dbp->db1d.station_vec[i]); ENCODESTR(st->name); IF_PRINTING { fprintf(sqlf,"insert into STATION values " "(%ld, %s, %ld, %.2f, %.2f, %.2f);\n", (i+1), ESTR, st->survey->id, st->x, st->y, st->z); if ((st->flags & TT_STATIONFLAG_ENTRANCE) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'ent');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_CONT) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'con');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_FIXED) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'fix');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_SPRING) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'spr');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_SINK) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'sin');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_DOLINE) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'dol');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_DIG) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'dig');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_AIRDRAUGHT) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'air');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_OVERHANG) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'ove');\n", (i+1)); if ((st->flags & TT_STATIONFLAG_ARCH) != TT_STATIONFLAG_NONE) fprintf(sqlf,"insert into STATION_FLAG values(%ld, 'arc');\n", (i+1)); } else { CHECK_STRLEN(station_name,ESTR); } //ENCODESTR(st->comment); //tmpstr = thmatch_string(st->mark,thtt_datamark); //IF_PRINTING { // fprintf(sqlf,"'%s', %s);\n", // tmpstr, ESTR); //} else { // CHECK_STRLEN(station_type,tmpstr); // CHECK_STRLEN(station_comment,ESTR); //} } } // END OF PASS CYCLE //fprintf(sqlf,"commit transaction;\n"); fclose(sqlf); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } therion/thwarpp.h0000664000175000017500000000472710644734404013124 0ustar useruser/** * @file thwarp.h * Plaquette morphing. */ /* Copyright (C) 2007 Marco Corvi, Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thwarpp_h #define thwarpp_h #define THERION #include "thwarp.h" #include "thwarppme.h" #include "thwarppt.h" #include "thdataobject.h" /** * Sketch station structure. */ struct thsketchst { thmorph_type code; //!< station code double x, y; //!< station image coords thobjectname station; //!< station survey name thobjectsrc source; }; /** * Sketch leg structure. */ struct thsketchlg { thmorph_type code; //!< leg code thobjectname from; //!< station survey name thobjectname to; //!< station survey name thobjectsrc source; }; typedef std::list thsketchst_list; typedef std::list thsketchlg_list; class thwarpp : public thwarp { private: thpic mpic, upic; ///< Morphed picture. thvec2 m_origin; //!< Survey origin thsketchst_list stations; //!< List of sketch stations. thsketchlg_list legs; //!< List of legs private: /** get the scrap (pointer) for this sketch * @return the scrap pointer (NULL on failure) */ thscrap * get_scrap(); /** process the points and insert them in the warp transform * @param tw the warp transform * @param ph this picture height */ void process_station_vector( thwarptrans & tw, double ph ); /** process the legs and insert them in the warp transform * @param tw the warp transform */ void process_leg_vector( thwarptrans & tw ); public: virtual ~thwarpp(); virtual thpic * morph(thsketch * sketch, double scale); virtual void self_delete(); }; #endif therion/thdate.h0000664000175000017500000001003012340602513012656 0ustar useruser/** * @file thdate.h * Date class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdate_h #define thdate_h #define thdate__bufflen 255 /** * Convert date into decimal year. */ double thdate_d2y(int year, int month, int day, int hour, int min, double sec); /** * Convert decimal year into date. */ void thdate_y2d(double dy, int & year, int & month, int & day, int & hour, int & min, double & sec); /** * Date formats. */ enum { TT_DATE_FMT_ISO, TT_DATE_FMT_LOCALE, TT_DATE_FMT_LOCALE_LONG, TT_DATE_FMT_Y, TT_DATE_FMT_UTF8_ISO, TT_DATE_FMT_UTF8_Y, TT_DATE_FMT_SQL_SINGLE, }; /** * Date class. * * Date is in fact a time interval. */ class thdate { public: int syear, ///< Start date year smonth, ///< Start date month sday, ///< Stard date day shour, ///< Star date hour smin, ///< Star date minute eyear, ///< End date year emonth, ///< End date month eday, ///< End date month ehour, ///< End date hour emin; ///< End date minute double ssec, ///< Start date seconds esec; ///< End date seconds char dstr[thdate__bufflen]; ///< String for given date. friend bool operator < (const thdate &, const thdate &); ///< Less operator. friend bool operator <= (const thdate &, const thdate &); ///< Less operator. friend bool operator > (const thdate &, const thdate &); ///< Greater operator. friend bool operator >= (const thdate &, const thdate &); ///< Greater operator. friend bool operator == (const thdate &, const thdate &); ///< Equal operator. friend bool operator != (const thdate &, const thdate &); ///< Not equal operator. /** * Compare two dates if first is less than sencond, item by item. */ static bool is_less(int y1, int m1, int d1, int h1, int n1, double s1, int y2, int m2, int d2, int h2, int n2, double s2); /** * Compare two dates if first is greater than sencond, item by item. */ static bool is_greater(int y1, int m1, int d1, int h1, int n1, double s1, int y2, int m2, int d2, int h2, int n2, double s2); /** * Create string representation of date. */ void print_str(int fmt); /** * Reset the date. */ void reset(); void reset_current(); /** * Standard constructor. */ thdate(); /** * Standard destructor. */ ~thdate(); /** * Parse string to date. */ void parse(const char * src); /** * Return true, if date is a time interval. */ bool is_interval(); /** * Return true, if date is a defined. */ bool is_defined(); /** * Join two dates together. */ void join(thdate & dt); /** * Return string representation of date. */ char * get_str(int fmt = TT_DATE_FMT_ISO); /** * Return start year as double value. */ double get_start_year(); /** * Return end year as double value. */ double get_end_year(); /** * Return end average as double value. */ double get_average_year(); /** * Set date years. */ void set_years(double sy, double ey); void set_file_date(char * fname); }; #endif therion/th2ddataobject.h0000664000175000017500000001123011113706714014277 0ustar useruser/** * @file th2ddataobject.h * 2ddataobject module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef th2ddataobject_h #define th2ddataobject_h #include "thdataobject.h" /** * Point scale tokens. */ enum { TT_2DOBJ_SCALE_UNKNOWN, TT_2DOBJ_SCALE_XS, TT_2DOBJ_SCALE_S, TT_2DOBJ_SCALE_M, TT_2DOBJ_SCALE_L, TT_2DOBJ_SCALE_XL, }; /** * Point scale parsing table. */ static const thstok thtt_2dobj_scales[] = { {"L", TT_2DOBJ_SCALE_L}, {"M", TT_2DOBJ_SCALE_M}, {"S", TT_2DOBJ_SCALE_S}, {"XL", TT_2DOBJ_SCALE_XL}, {"XS", TT_2DOBJ_SCALE_XS}, {"huge", TT_2DOBJ_SCALE_XL}, {"l", TT_2DOBJ_SCALE_L}, {"large", TT_2DOBJ_SCALE_L}, {"m", TT_2DOBJ_SCALE_M}, {"normal", TT_2DOBJ_SCALE_M}, {"s", TT_2DOBJ_SCALE_S}, {"small", TT_2DOBJ_SCALE_S}, {"tiny", TT_2DOBJ_SCALE_XS}, {"xl", TT_2DOBJ_SCALE_XL}, {"xs", TT_2DOBJ_SCALE_XS}, {NULL, TT_2DOBJ_SCALE_UNKNOWN}, }; /** * 2ddataobject command options tokens. */ enum { TT_2DOBJ_UNKNOWN = 2000, TT_2DOBJ_SCALE = 2001, TT_2DOBJ_CLIP = 2002, TT_2DOBJ_PLACE = 2003, TT_2DOBJ_VISIBILITY = 2004, TT_2DOBJ_CONTEXT = 2005, }; /** * Default 2D object tags. */ enum { TT_2DOBJ_TAG_NONE = 0, TT_2DOBJ_TAG_CLIP_AUTO = 1024, TT_2DOBJ_TAG_CLIP_ON = 2048, TT_2DOBJ_TAG_VISIBILITY_ON = 4096, }; enum { TT_2DOBJ_PLACE_BOTTOM = 0, TT_2DOBJ_PLACE_DEFAULT_BOTTOM = 1, TT_2DOBJ_PLACE_DEFAULT = 3, TT_2DOBJ_PLACE_DEFAULT_TOP = 4, TT_2DOBJ_PLACE_TOP = 5, TT_2DOBJ_PLACE_UNKNOWN = 6, }; /** * 2ddataobject command options parsing table. */ static const thstok thtt_2ddataobject_opt[] = { {"clip", TT_2DOBJ_CLIP}, {"context", TT_2DOBJ_CONTEXT}, {"place", TT_2DOBJ_PLACE}, {"scale", TT_2DOBJ_SCALE}, {"visibility", TT_2DOBJ_VISIBILITY}, {"visible", TT_2DOBJ_VISIBILITY}, {NULL, TT_2DOBJ_UNKNOWN}, }; /** * 2ddataobject place options. */ static const thstok thtt_2ddataobject_place[] = { {"bottom", TT_2DOBJ_PLACE_BOTTOM}, {"default", TT_2DOBJ_PLACE_DEFAULT}, {"top", TT_2DOBJ_PLACE_TOP}, {NULL, TT_2DOBJ_PLACE_UNKNOWN}, }; /** * 2ddataobject class. */ class th2ddataobject : public thdataobject { public: const char * m_subtype_str; th2ddataobject * pscrapoptr, ///< Previos object in the scrap. * nscrapoptr; ///< Next object in the scrap. class thscrap * fscrapptr; ///< Father scrap pointer. int scale; ///< 2D map object scaling. unsigned tags; ///< 2D map object tags. int place, context; /** * Standard constructor. */ th2ddataobject(); /** * Standard destructor. */ ~th2ddataobject(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "th2ddataobject";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * Get context for object. */ virtual int get_context(); /** * Export object to metapost file. */ virtual bool export_mp(class thexpmapmpxs * out); /** * Export object to metapost file. */ virtual bool export_mp_end(class thexpmapmpxs * out); /** * Parse user defined subtype. */ void parse_u_subtype(const char * subtype); }; void th2dsplitTT(char * src, char ** type, char ** subtype); #endif therion/thexptable.cxx0000664000175000017500000004154312065357116014147 0ustar useruser/** * @file thexptable.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexptable.h" #include "thexception.h" #include "thdatabase.h" #include "thdb1d.h" #include "thdata.h" #include "thexporter.h" #include "thinit.h" #include "thsurvey.h" #include "thscrap.h" #include "thdb1d.h" #include "thpoint.h" #include #include "thchenc.h" #include #include "thinfnan.h" #include "thcsdata.h" #include "thproj.h" #include "thconfig.h" #include "thcs.h" thexptable::thexptable() { this->format = TT_EXPTABLE_FMT_UNKNOWN; this->encoding = TT_UTF_8; this->expattr = true; this->exploc = false; this->filter = true; this->surveys = true; } void thexptable::parse_options(int & argx, int nargs, char ** args) { int sv; int optid = thmatch_token(args[argx], thtt_exptable_opt); int optx = argx; switch (optid) { case TT_EXPTABLE_OPT_ATTRIBUTES: argx++; if (argx >= nargs) ththrow(("missing attributes switch -- \"%s\"",args[optx])) sv = thmatch_token(args[argx], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid attributes switch -- \"%s\"", args[argx])) this->expattr = (sv == TT_TRUE); argx++; break; case TT_EXPTABLE_OPT_LOCATION: argx++; if (argx >= nargs) ththrow(("missing location switch -- \"%s\"",args[optx])) sv = thmatch_token(args[argx], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid location switch -- \"%s\"", args[argx])) this->exploc = (sv == TT_TRUE); argx++; break; case TT_EXPTABLE_OPT_FILTER: argx++; if (argx >= nargs) ththrow(("missing filter switch -- \"%s\"",args[optx])) sv = thmatch_token(args[argx], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid filter switch -- \"%s\"", args[argx])) this->filter = (sv == TT_TRUE); argx++; break; case TT_EXPTABLE_OPT_SURVEYS: argx++; if (argx >= nargs) ththrow(("missing surveys switch -- \"%s\"",args[optx])) sv = thmatch_token(args[argx], thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid surveys switch -- \"%s\"", args[argx])) this->surveys = (sv == TT_TRUE); argx++; break; case TT_EXPTABLE_OPT_FORMAT: argx++; if (argx >= nargs) ththrow(("missing format -- \"%s\"",args[optx])) this->format = thmatch_token(args[argx], thtt_exptable_fmt); if (this->format == TT_EXPTABLE_FMT_UNKNOWN) ththrow(("unknown format -- \"%s\"", args[argx])) argx++; break; case TT_EXPTABLE_OPT_ENCODING: argx++; if (argx >= nargs) ththrow(("missing encoding -- \"%s\"",args[optx])) this->encoding = thmatch_token(args[argx], thtt_encoding); if (this->encoding == TT_UNKNOWN_ENCODING) ththrow(("unknown encoding -- \"%s\"", args[argx])) argx++; break; default: thexport::parse_options(argx, nargs, args); break; } } void thexptable::dump_header(FILE * xf) { thexport::dump_header(xf); } void thexptable::dump_body(FILE * xf) { thexport::dump_body(xf); if (this->format != TT_EXPTABLE_FMT_UNKNOWN) fprintf(xf," -format %s", thmatch_string(this->format, thtt_exptable_fmt)); if (this->encoding != TT_UNKNOWN_ENCODING) fprintf(xf," -encoding %s", thmatch_string(this->encoding, thtt_encoding)); } void thexptable::export_survey_entraces(thsurvey * survey) { thdataobject * obj; thdb1ds * st; double tmpd; const char * xl = NULL; const char * yl = NULL; if (this->exploc) { xl = ""; yl = ""; } bool is_cave = (survey->entrance.id != 0); if (!survey->is_selected()) return; if (survey->stat.num_entrances == 0) return; // insert survey attributes if ((survey->level > 1) && (this->surveys || is_cave)) { this->m_table.insert_object(NULL); this->m_table.get_object()->m_tree_level = (this->surveys ? (size_t)(survey->level - 2) : 0); this->m_table.get_object()->m_tree_node_id = (this->surveys ? survey->get_reverse_full_name() : ""); this->m_table.insert_attribute("Title", ths2txt((strlen(survey->title) > 0) ? survey->title : survey->name).c_str()); this->m_table.insert_attribute("Length",(long)(survey->stat.length + 0.5)); if (!is_cave) this->m_table.get_attribute()->set_flag(THATTRFLAG_HIDDEN, true); if (survey->stat.station_top != NULL) { tmpd = survey->stat.station_top->z - survey->stat.station_bottom->z; if (tmpd > survey->stat.length) tmpd = survey->stat.length; this->m_table.insert_attribute("Depth",(long)(tmpd + 0.5)); } else { this->m_table.insert_attribute("Depth",""); } if (survey->stat.length_explored > 0.0) { this->m_table.insert_attribute("Explored", (long)(survey->stat.length_explored + 0.5)); if (!is_cave) this->m_table.get_attribute()->set_flag(THATTRFLAG_HIDDEN, true); } else { this->m_table.insert_attribute("Explored", ""); } if (((survey->stat.num_entrances > 0) && ((!exploc) || (survey->stat.num_entrances == 1) || (!this->surveys))) && (survey->entrance.id > 0)) { st = &(this->db->db1d.station_vec[survey->entrance.id - 1]); this->add_coordinates(st->x, st->y, st->z, xl, yl, ""); } else { this->add_coordinates(thnan, thnan, thnan, xl, yl, ""); } if (this->expattr) this->m_table.copy_attributes(this->db->attr.get_object(survey->id)); } if (!is_cave) { for(obj = survey->foptr; obj != NULL; obj = obj->nsptr) { if (obj->get_class_id() == TT_SURVEY_CMD) { this->export_survey_entraces((thsurvey *) obj); } } } // insert entrances within this survey size_t nstat = this->db->db1d.station_vec.size(), i; if (this->surveys || (!is_cave)) { for(i = 0; i < nstat; i++) { st = &(this->db->db1d.station_vec[i]); if ((st->flags & TT_STATIONFLAG_ENTRANCE) != 0) { if (((exploc) && (survey->entrance.id > 0) && (survey->stat.num_entrances > 1) && (st->survey->is_in_survey(survey))) || ((survey->entrance.id == 0) && (st->survey->id == survey->id))) { this->m_table.insert_object(NULL); this->m_table.get_object()->m_tree_level = (this->surveys ? (size_t)(survey->level - 1) : 0); std::string * tmps = get_tmp_string(); *tmps = survey->get_reverse_full_name(); *tmps += "."; this->m_table.get_object()->m_tree_node_id = (this->surveys ? tmps->c_str() : ""); this->m_table.insert_attribute("Title", ths2txt(st->comment).c_str()); this->m_table.insert_attribute("Length",""); this->m_table.insert_attribute("Depth",""); if (st->explored > 0.0) { this->m_table.insert_attribute("Explored", (long)(st->explored + 0.5)); } else { this->m_table.insert_attribute("Explored", ""); } this->add_coordinates(st->x, st->y, st->z, xl, yl, ""); if (this->expattr) this->m_table.copy_attributes(this->db->db1d.m_station_attr.get_object((long)i+1)); } } } } } void thexptable::process_db(class thdatabase * dbp) { this->db = dbp; if (this->format == TT_EXPTABLE_FMT_UNKNOWN) { this->format = TT_EXPTABLE_FMT_HTML; thexp_set_ext_fmt(".txt", TT_EXPTABLE_FMT_TXT) thexp_set_ext_fmt(".html", TT_EXPTABLE_FMT_HTML) thexp_set_ext_fmt(".htm", TT_EXPTABLE_FMT_HTML) thexp_set_ext_fmt(".dbf", TT_EXPTABLE_FMT_DBF) thexp_set_ext_fmt(".kml", TT_EXPTABLE_FMT_KML) } const char * fname; if ((this->cs == TTCS_LOCAL) && (thcfg.outcs != TTCS_LOCAL)) this->cs = thcfg.outcs; switch (this->format) { case TT_EXPTABLE_FMT_DBF: fname = this->get_output("table.dbf"); break; case TT_EXPTABLE_FMT_HTML: fname = this->get_output("table.html"); break; case TT_EXPTABLE_FMT_KML: this->cs = TTCS_LONG_LAT; this->exploc = true; fname = this->get_output("table.kml"); break; default: fname = this->get_output("table.txt"); } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fname); #else thprintf("writing %s ... ", fname); thtext_inline = true; #endif const char * survey = NULL; thsurvey * srv; thdb1ds * st; thdb_object_list_type::iterator oi; thpoint * pt; double tmpd; switch (this->export_mode) { case TT_EXP_CAVELIST: this->export_survey_entraces(this->db->fsurveyptr); this->m_table.m_tree = true; break; case TT_EXP_CONTLIST: { // check all stations and points unsigned long nstat = (unsigned long)dbp->db1d.station_vec.size(), i; for(oi = this->db->object_list.begin(); oi != this->db->object_list.end(); oi++) { if ((*oi)->get_class_id() == TT_POINT_CMD) { pt = (thpoint*)(*oi); if ((pt->type == TT_POINT_TYPE_CONTINUATION) && ((pt->text != NULL) || (!this->filter)) && (pt->fsptr->is_selected())) { this->db->db2d.process_projection(pt->fscrapptr->proj); this->m_table.insert_object(NULL); this->m_table.insert_attribute("Comment",ths2txt(pt->text).c_str()); if (!thisnan(pt->xsize)) this->m_table.insert_attribute("Explored",pt->xsize); else this->m_table.insert_attribute("Explored",(const char *)NULL); if (pt->station_name.id != 0) { st = &(dbp->db1d.station_vec[pt->station_name.id - 1]); } else { st = pt->fscrapptr->get_nearest_station(pt->point); } if (st != NULL) { srv = st->survey; } else { srv = pt->fsptr; } if (strlen(srv->get_title()) > 0) { survey = st->survey->get_title(); } else { survey = st->survey->get_full_name(); if (strlen(survey) == 0) survey = NULL; } this->m_table.insert_attribute("Survey", ths2txt(survey).c_str()); this->m_table.insert_attribute("Station", st != NULL ? st->name : NULL); if (this->format == TT_EXPTABLE_FMT_KML) { this->add_coordinates(pt->point->xt + pt->fscrapptr->proj->rshift_x, pt->point->yt + pt->fscrapptr->proj->rshift_y, pt->point->at); } if (this->expattr) this->m_table.copy_attributes(this->db->attr.get_object(pt->id)); } } } for(i = 0; i < nstat; i++) { st = &(dbp->db1d.station_vec[i]); if (((st->flags & TT_STATIONFLAG_CONT) != 0) && ((st->comment != NULL) || (!this->filter)) && (st->survey->is_selected())) { this->m_table.insert_object(NULL); this->m_table.insert_attribute("Comment",ths2txt(st->comment).c_str()); if (!thisnan(st->explored)) this->m_table.insert_attribute("Explored",st->explored); else this->m_table.insert_attribute("Explored",(const char *)NULL); if (strlen(st->survey->get_title()) > 0) { survey = st->survey->get_title(); } else { survey = st->survey->get_full_name(); if (strlen(survey) == 0) survey = NULL; } this->m_table.insert_attribute("Survey", ths2txt(survey).c_str()); this->m_table.insert_attribute("Station", st->name); if (this->format == TT_EXPTABLE_FMT_KML) { this->add_coordinates(st->x, st->y, st->z); } if (this->expattr) this->m_table.copy_attributes(this->db->db1d.m_station_attr.get_object(i+1)); } } } break; case TT_EXP_SURVEYLIST: // todo add survey data //title //explored length //id //approx. //surface //duplicate for(oi = this->db->object_list.begin(); oi != this->db->object_list.end(); oi++) { if (((*oi)->get_class_id() == TT_SURVEY_CMD) && (strlen((*oi)->name) > 0)) { srv = (thsurvey*)(*oi); if (srv->is_selected()) { this->m_table.insert_object(NULL); this->m_table.get_object()->m_tree_level = (size_t)(srv->level - 2); this->m_table.get_object()->m_tree_node_id = srv->get_reverse_full_name(); this->m_table.insert_attribute("Title", ths2txt((strlen(srv->title) > 0) ? srv->title : srv->name).c_str()); this->m_table.insert_attribute("Length",(long)(srv->stat.length + 0.5)); if (srv->stat.station_top != NULL) { tmpd = srv->stat.station_top->z - srv->stat.station_bottom->z; if (tmpd > srv->stat.length) tmpd = srv->stat.length; this->m_table.insert_attribute("Depth",(long)(tmpd + 0.5)); } else { this->m_table.insert_attribute("Depth",0.0); } this->m_table.insert_attribute("Explored", (long)(srv->stat.length_explored + 0.5)); this->m_table.insert_attribute("Approx.", (long)(srv->stat.length_approx + 0.5)); this->m_table.insert_attribute("Duplicate", (long)(srv->stat.length_duplicate + 0.5)); this->m_table.insert_attribute("Surface", (long)(srv->stat.length_surface + 0.5)); this->m_table.insert_attribute("Shots", (long)(srv->stat.num_shots)); this->m_table.insert_attribute("Stations", (long)(srv->stat.num_stations)); //this->m_table.insert_attribute("ID", srv->get_full_name()); if (this->expattr) this->m_table.copy_attributes(this->db->attr.get_object(srv->id)); } } } this->m_table.m_tree = true; break; } switch (this->format) { case TT_EXPTABLE_FMT_TXT: this->m_table.export_txt(fname, this->encoding); break; case TT_EXPTABLE_FMT_HTML: this->m_table.export_html(fname, this->encoding); break; case TT_EXPTABLE_FMT_DBF: this->m_table.export_dbf(fname, this->encoding); break; case TT_EXPTABLE_FMT_KML: this->m_table.export_kml(fname, (this->export_mode == TT_EXP_CONTLIST) ? "Comment" : "Title"); break; } #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } std::string * thexptable::get_tmp_string() { return &(* this->m_str_list.insert(this->m_str_list.end(),std::string(""))); } void thexptable::add_coordinates(double x, double y, double z, const char * xlabel, const char * ylabel, const char * zlabel) { double tx(thnan), ty(thnan), tz(thnan); if (!(thisnan(x) || thisnan(y) || thisnan(z))) { if (thcfg.outcs == TTCS_LOCAL) { tx = x; ty = y; tz = z; } else { thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(this->cs)->params, x, y, z, tx, ty, tz); if (thcs_get_data(this->cs)->dms) { tx = tx / THPI * 180.0; ty = ty / THPI * 180.0; } } } if (xlabel != NULL) { if (strlen(xlabel) == 0) { xlabel = "X"; if (thcs_get_data(this->cs)->dms) { if (thcs_get_data(this->cs)->swap) xlabel = "Latitude"; else xlabel = "Longitude"; } } if (thisnan(tx)) this->m_table.insert_attribute(xlabel, ""); else { this->m_table.insert_attribute(xlabel, tx); if (thcs_get_data(this->cs)->dms) this->m_table.get_field(xlabel)->m_double_format = "%.8f"; } } if (ylabel != NULL) { if (strlen(ylabel) == 0) { ylabel = "Y"; if (thcs_get_data(this->cs)->dms) { if (thcs_get_data(this->cs)->swap) ylabel = "Longitude"; else ylabel = "Latitude"; } } if (thisnan(ty)) this->m_table.insert_attribute(ylabel, ""); else { this->m_table.insert_attribute(ylabel, ty); if (thcs_get_data(this->cs)->dms) this->m_table.get_field(ylabel)->m_double_format = "%.8f"; } } if (zlabel != NULL) { if (strlen(zlabel) == 0) { zlabel = "Altitude"; } if (thisnan(tz)) this->m_table.insert_attribute(zlabel, ""); else this->m_table.insert_attribute(zlabel, tz); } } therion/COPYING0000664000175000017500000004313107777756224012332 0ustar useruser GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. therion/thgrade.h0000664000175000017500000000637110721450274013046 0ustar useruser/** * @file thgrade.h * Survey grade module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thgrade_h #define thgrade_h #include "thdataobject.h" #include "thdata.h" /** * grade command options tokens. */ enum { TT_GRADE_UNKNOWN = 2000, TT_GRADE_OPTION = 2001, }; /** * grade command options parsing table. */ static const thstok thtt_grade_opt[] = { {NULL, TT_GRADE_UNKNOWN}, }; /** * grade class. */ class thgrade : public thdataobject { static thdata data; void update_sd_from_data(bool alsonan = false); ///< Update these data. public: void set_sd(int nargs, char ** args); ///< Set SD. public: double dls_length, dls_gradient, dls_bearing, dls_counter, dls_depth, dls_dx, dls_dy, dls_dz, dls_x, dls_y, dls_z; /** * Standard constructor. */ thgrade(); /** * Standard destructor. */ virtual ~thgrade(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thgrade";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * Print object in C++ format. */ void self_print_library(); /** * Get context for object. */ virtual int get_context(); /** * Update data SD. */ void update_data_sd(thdata * dp); /** * Start insertion into database. */ void start_insert(); }; #endif therion/thcomment.h0000664000175000017500000000540512337637101013424 0ustar useruser/** * @file thcomment.h * Survey comment module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thcomment_h #define thcomment_h #include "thdataobject.h" #include "thdata.h" /** * comment command options tokens. */ enum { TT_COMMENT_UNKNOWN = 2000, TT_COMMENT_OPTION = 2001, }; /** * comment command options parsing table. */ static const thstok thtt_comment_opt[] = { {NULL, TT_COMMENT_UNKNOWN}, }; /** * comment class. */ class thcomment : public thdataobject { public: /** * Standard constructor. */ thcomment(); /** * Standard destructor. */ virtual ~thcomment(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thcomment";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * Get context for object. */ virtual int get_context(); }; #endif therion/thdatareader.cxx0000664000175000017500000001737511026520774014443 0ustar useruser/** * @file thdatareader.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdatareader.h" #include "thexception.h" #include "thobjectsrc.h" unsigned long thdatareader__get_opos(bool inlineid, bool cfgid) { unsigned long opos = 0; if (inlineid) opos |= THOP_INLINE; else opos &= ~THOP_INLINE; if (cfgid) opos |= THOP_CONFIGURE; else opos &= ~THOP_CONFIGURE; return opos; } void thdatareader::read(const char * ifname, long lnstart, long lnend, const char * spath, thdatabase * dbptr) { thdataobject * objptr = NULL; // pointer to the newly created object thcmd_option_desc optd; // option descriptor bool inside_cmd = false; bool configure_cmd = false; bool advanced_end_search = false; char * ln, * opt, ** opts; const char * endlnopt = NULL; int ai, ait, ant; bool special_lines_only; unsigned long lnn; special_lines_only = ((lnend >= lnstart) && (lnstart > 0)); this->inp.report_missing = true; this->inp.set_file_name(ifname); this->inp.cmd_sensitivity_on(); this->inp.set_search_path(spath); this->inp.set_file_suffix(".th:.th2"); this->inp.sp_scan_on(); this->inp.reset(); if ((special_lines_only) && (lnstart > 1)) this->inp.set_input_sensitivity(false); thobjectsrc osrc; #ifndef THMSVC try { #endif while ((ln = this->inp.read_line()) != NULL) { lnn = this->inp.get_cif_line_number(); if (this->inp.is_first_file() && (special_lines_only) && (((long)lnn < lnstart) || ((long)lnn > lnend))) { if ((long)(lnn + 1) == lnstart) this->inp.set_input_sensitivity(true); if ((long)lnn > lnend) this->inp.set_input_sensitivity(false); continue; } // let's test source fname osrc.line = this->inp.get_cif_line_number(); if (strcmp(osrc.name, this->inp.get_cif_name()) != 0) osrc.name = dbptr->strstore(this->inp.get_cif_name(), true); dbptr->csrc.line = osrc.line; dbptr->csrc.name = osrc.name; // now different behavoiour whether we're inside or outside command if (inside_cmd) { thsplit_word(&this->bf1, &this->bf2, ln); // if end_command option, set turn off inside_cmd // and insert object into database if ((advanced_end_search && objptr->get_cmd_ends_match(this->bf1.get_buffer())) || (strcmp(this->bf1.get_buffer(), endlnopt) == 0)) { inside_cmd = false; //this->inp.cmd_sensitivity_on(); if (!configure_cmd) dbptr->insert(objptr); else { objptr->start_insert(); configure_cmd = false; } continue; } // let's parse if an option line optd = objptr->get_cmd_option_desc(this->bf1.get_buffer()); if (optd.id != TT_DATAOBJECT_UNKNOWN) { thsplit_args(&this->mbf1, this->bf2.get_buffer()); if (this->mbf1.get_size() < optd.nargs) ththrow(("not enough option arguments -- %s -- must be %d", this->bf1.get_buffer(), optd.nargs)); optd.nargs = this->mbf1.get_size(); objptr->set(optd, this->mbf1.get_buffer(), this->inp.get_cif_encoding(), thdatareader__get_opos(inside_cmd,configure_cmd)); continue; } // if data line (!) set data option optd.id = 0; optd.nargs = 1; opt = ln; while(strcmp(opt,"!") < 0) opt++; if (*opt == '!') opt++; objptr->set(optd, & opt, this->inp.get_cif_encoding(), thdatareader__get_opos(inside_cmd,configure_cmd)); } else { // first, let's parse arguments thsplit_args(&this->mbf1, this->inp.get_value()); ant = this->mbf1.get_size(); opts = this->mbf1.get_buffer(); // check if command // if no => throw exception if (strcmp(this->inp.get_cmd(),"revise") == 0) configure_cmd = true; else if (strcmp(this->inp.get_cmd(),"equate") == 0) { dbptr->insert_equate(ant, opts); continue; } else { objptr = dbptr->create(this->inp.get_cmd(), osrc); if (objptr == NULL) ththrow(("unknown command -- %s", this->inp.get_cmd())) else dbptr->check_context(objptr); switch(objptr->get_class_id()) { case TT_LAYOUT_CMD: ththrow(("layout definition not allowed in input files")) break; } } // analyze the commands options if (configure_cmd) { // let's find an object objptr = dbptr->revise(*opts, dbptr->get_current_survey(), osrc); if (objptr == NULL) ththrow(("object does not exist -- %s", *opts)) ai = 1; opts++; } else { if (ant < objptr->get_cmd_nargs()) ththrow(("not enough command arguments -- must be %d", objptr->get_cmd_nargs())); optd.nargs = 1; // set obligatory arguments for (ai = 0; ai < objptr->get_cmd_nargs(); ai++, opts++) { optd.id = ai + 1; objptr->set(optd, opts, this->inp.get_cif_encoding(), thdatareader__get_opos(inside_cmd,configure_cmd)); } } ait = ai; while (ait < ant) { optd = objptr->get_cmd_option_desc(*opts + 1); if (configure_cmd && (optd.id == TT_DATAOBJECT_NAME)) ththrow(("object name configuration not allowed")) if (optd.id == TT_DATAOBJECT_UNKNOWN) { optd.id = ++ai; optd.nargs = 1; } else { if ((ait + optd.nargs) >= ant) ththrow(("not enough option arguments -- %s -- must be %d", *opts, optd.nargs)); opts++; ait++; } objptr->set(optd, opts, this->inp.get_cif_encoding(), thdatareader__get_opos(inside_cmd,configure_cmd)); opts += optd.nargs; ait += optd.nargs; } // if multi line, set that we're inside the command // and switch of sensitivity // else insert object into database if ((endlnopt = objptr->get_cmd_end()) == NULL) if (!configure_cmd) dbptr->insert(objptr); else { objptr->start_insert(); configure_cmd = false; } else { if (configure_cmd) endlnopt = "endrevise"; advanced_end_search = objptr->get_cmd_ends_state(); inside_cmd = true; //this->inp.cmd_sensitivity_off(); } } } #ifndef THMSVC } // put everything into try block and throw exception, if error catch (...) threthrow(("%s [%d]", this->inp.get_cif_name(), this->inp.get_cif_line_number())) #endif dbptr->end_insert(); } thdatareader thdbreader; therion/thdb2dmi.h0000664000175000017500000000503010625655142013120 0ustar useruser/** * @file thdb2dpt.h * 2D map item class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2dmi_h #define thdb2dmi_h #include #include "thobjectname.h" #include "thobjectsrc.h" #include "thparse.h" /** * Type of map items. * * Note order is important. */ enum { TT_MAPITEM_UNKNOWN = 0, TT_MAPITEM_BELOW = 1, TT_MAPITEM_ABOVE = 2, TT_MAPITEM_BESIDE = 3, TT_MAPITEM_NORMAL = 4, TT_MAPITEM_NONE = 5, }; /** * Projection parsing table. */ static const thstok thtt_2dmi[] = { {"above", TT_MAPITEM_ABOVE}, {"below", TT_MAPITEM_BELOW}, {"none", TT_MAPITEM_NONE}, // {"beside", TT_MAPITEM_BESIDE}, {NULL, TT_MAPITEM_UNKNOWN} }; struct thdb2dmi_shift { double m_x, m_y, m_prev_x, m_prev_y; int m_preview; thdb2dmi_shift() : m_x(0.0), m_y(0.0), m_prev_x(0.0), m_prev_y(0.0), m_preview(TT_MAPITEM_UNKNOWN) {} bool is_active() const; thdb2dmi_shift add(const thdb2dmi_shift & s); }; bool operator == (const thdb2dmi_shift & s1, const thdb2dmi_shift & s2); bool operator < (const thdb2dmi_shift & s1, const thdb2dmi_shift & s2); /** * 2D map item class. */ class thdb2dmi { public: thobjectsrc source; ///< ??? int type; ///< Type of map item. thdb2dmi * next_item, ///< Next map item. * prev_item; ///< Prev map item. unsigned itm_level; ///< Item level. thobjectname name; ///< Item name. class thsurvey * psurvey; ///< Item parent survey. class thdataobject * object; ///< Parsed object pointer. thdb2dmi_shift m_shift; ///< Map shift specification. thdb2dmi(); ///< Default constructor. }; typedef std::list thdb2dmi_list; ///< Items list. #endif therion/thdata.h0000664000175000017500000002111312042425452012662 0ustar useruser/** * @file thdata.h * Main survey data module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdata_h #define thdata_h #include #include "thdataleg.h" #include "thdataobject.h" #include "thdate.h" #include "thperson.h" #include "thtfangle.h" #include "thtflength.h" #include "thtfpwf.h" /** * data command options tokens. */ enum { TT_DATA_UNKNOWN = 2000, TT_DATA_DATE = 2001, TT_DATA_TEAM = 2002, TT_DATA_UNITS = 2003, TT_DATA_CALIBRATE = 2004, TT_DATA_DECLINATION = 2005, TT_DATA_INFER = 2006, TT_DATA_SD = 2007, TT_DATA_INSTRUMENT = 2008, TT_DATA_DATA = 2009, TT_DATA_BREAK = 2010, TT_DATA_MARK = 2011, TT_DATA_STATION = 2012, TT_DATA_FLAGS = 2013, TT_DATA_EQUATE = 2014, TT_DATA_FIX = 2015, TT_DATA_GRADE = 2016, TT_DATA_DISCOVERY_DATE = 2017, TT_DATA_DISCOVERY_TEAM = 2018, TT_DATA_GROUP = 2019, TT_DATA_ENDGROUP = 2020, TT_DATA_SHAPE = 2021, TT_DATA_VTRESH = 2022, TT_DATA_WALLS = 2023, TT_DATA_EXTEND = 2024, TT_DATA_GRID_ANGLE = 2025, }; /** * data command options parsing table. */ static const thstok thtt_data_opt[] = { {"break", TT_DATA_BREAK}, {"calibrate", TT_DATA_CALIBRATE}, {"data", TT_DATA_DATA}, {"date", TT_DATA_DATE}, {"declination", TT_DATA_DECLINATION}, {"endgroup", TT_DATA_ENDGROUP}, {"equate", TT_DATA_EQUATE}, {"explo-date", TT_DATA_DISCOVERY_DATE}, {"explo-team", TT_DATA_DISCOVERY_TEAM}, {"extend", TT_DATA_EXTEND}, {"fix", TT_DATA_FIX}, {"flags", TT_DATA_FLAGS}, {"grade", TT_DATA_GRADE}, {"grid-angle", TT_DATA_GRID_ANGLE}, {"group", TT_DATA_GROUP}, {"infer", TT_DATA_INFER}, {"instrument", TT_DATA_INSTRUMENT}, {"mark", TT_DATA_MARK}, {"sd", TT_DATA_SD}, // {"shape", TT_DATA_SHAPE}, {"station", TT_DATA_STATION}, {"team", TT_DATA_TEAM}, {"units", TT_DATA_UNITS}, {"vthreshold", TT_DATA_VTRESH}, {"walls", TT_DATA_WALLS}, {NULL, TT_DATA_UNKNOWN}, }; /** * Team person's set type. */ typedef std::set thdata_team_set_type; /** * Maximal number of various data items. */ #define THDATA_MAX_ITEMS 22 /** * Main survey data class. */ class thdata : public thdataobject { public: thdata * cgroup, * ugroup; // dlu - data leg units thtflength dlu_length, dlu_counter, dlu_depth, dlu_dx, dlu_dy, dlu_dz, dlu_x, dlu_y, dlu_z, dlu_sdlength, dlu_up, dlu_down, dlu_left, dlu_right; thtfangle dlu_bearing, dlu_gradient, dlu_declination, dlu_sdangle; // dlc - data calibration thtfpwf dlc_length, dlc_gradient, dlc_bearing, dlc_counter, dlc_depth, dlc_dx, dlc_dy, dlc_dz, dlc_x, dlc_y, dlc_z, dlc_default, dlc_up, dlc_down, dlc_left, dlc_right; // dls - data standard deviation and declination double dls_length, dls_gradient, dls_bearing, dls_counter, dls_depth, dls_dx, dls_dy, dls_dz, dls_x, dls_y, dls_z, dl_declination, dl_survey_declination; // statistics double stat_length, stat_dlength, stat_splaylength, stat_slength, stat_alength; class thdb1ds * stat_st_top, * stat_st_bottom; int stat_st_state; // dli - data leg infers bool dli_plumbs, dli_equates, dl_direction; // what is inserted bool di_station, di_from, di_to, di_length, di_bearing, di_gradient, di_backbearing, di_backgradient, di_depth, di_fromdepth, di_todepth, di_depthchange, di_count, di_fromcount, di_tocount, di_dx, di_dy, di_dz, di_direction, di_newline, di_interleaved, di_up, di_down, di_left, di_right; bool dl_survey_declination_on, dl_declination_north_grid; int d_type, ///< Type of data. d_order[THDATA_MAX_ITEMS], ///< Data order. d_nitems, ///< Number of items. d_current, ///< Currently inserted item. d_mark, ///< Station mark type. d_shape, ///< Walls shape. d_walls, ///< Walls switch. d_flags, ///< Leg flags. d_last_equate, ///< Last data equate. d_extend; ///< Extend flags. double d_vtresh; ///< Vertical treshold. void reset_data_sd(); ///< Reset data sd void reset_data(); ///< Reset data type and order. thdataleg_list::iterator cd_leg, pd_leg; // Current data leg. bool cd_leg_def, pd_leg_def; // Whether these legs are defined. void set_data_calibration(int nargs, char ** args); ///< Data calibration. void set_data_units(int nargs, char ** args); ///< Set data units. void set_data_declination(int nargs, char ** args); ///< Set data declination. void set_data_infer(int nargs, char ** args); ///< Set infers. void set_data_instrument(int nargs, char ** args); ///< Set instrument. void set_data_sd(int nargs, char ** args); ///< Set data SD. void set_data_grade(int nargs, char ** args); ///< Set data grade. void set_data_data(int nargs, char ** args); ///< Set data type and order. void insert_data_leg(int nargs, char ** args); ///< Insert data leg. void complete_interleaved_data(); ///< Complete data (if interleaved). void set_data_fix(int nargs, char ** args); ///< Add fixed station to data. void set_data_equate(int nargs, char ** args); ///< Add equivalency. void set_data_flags(int nargs, char ** args); ///< Set data leg flags. void set_data_extend(int nargs, char ** args); ///< Set default extend void set_data_station(int nargs, char ** args, int argenc); ///< Set station comment and flags. void set_data_mark(int nargs, char ** args); ///< Set type of station mark. void set_data_vtresh(int nargs, char ** args); ///< Set vertical treshold void set_survey_declination(); ///< Set survey declination. void start_group(); void end_group(); public: thdate date, ///< Survey date. discovery_date; ///< Discovery date. thdata_team_set_type team_set, ///< Team person set. discovery_team_set; ///< Discovery team person set. thdataleg_list leg_list; ///< Main data structure. thdatafix_list fix_list; ///< Fix list. thdatamark_list mark_list; ///< List of station marks. thdataequate_list equate_list; ///< Equate list. thdataextend_list extend_list; ///< Equate list. thdatass_list ss_list; ///< Stations list. thstdims_list dims_list; ///< Dimensions list. /** * Standard constructor. */ thdata(); /** * Standard destructor. */ virtual ~thdata(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Whether multiple ends. */ virtual bool get_cmd_ends_state(); /** * Whether cmd is end. */ virtual bool get_cmd_ends_match(char * cmd); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Return class name. */ virtual const char * get_class_name() {return "thdata";}; /** * Print object contents into file. */ virtual void self_print_properties(FILE * outf); /** * Called before insertion into database. */ virtual void start_insert(); /** * Complete dimensions. */ void complete_dimensions(); }; #endif therion/thmpost.h0000664000175000017500000000032712340611142013111 0ustar useruser/** * @file thmpost.h * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #ifndef thmpost_h #define thmpost_h /** * Metapost source file. */ extern const char * thmpost_library; #endif therion/thinfnan.cxx0000664000175000017500000000206610625655142013611 0ustar useruser/** * @file thinfnan.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thinfnan.h" void thnan_update(double & oval, double uval) { if (thisnan(oval)) oval = uval; } therion/therion.ini0000664000175000017500000000176011577061152013430 0ustar useruser### Output character encodings ### # encoding-default ASCII # encoding-sql ASCII ### Default regional settings ### # language en_UK # units metric ### Prefered loop closure method # loop-closure survex ### Paths to called executable files ### # mpost-path "mpost" # mpost-options "-tex=etex" # pdftex-path "pdfetex" # cavern-path "cavern" # convert-path "convert" # identify-path "identify" ### Search paths for source and configuration files ### # source-path "" ### Tex initialization ### # tex-env off # tex-fonts # tex-fonts raw cmr10 cmti10 cmbx10 cmss10 cmssi10 # tex-fonts xl2 csr10 csti10 csbx10 csss10 csssi10 ### PDF fonts initialization # otf2pfb off # pdf-fonts ### Path to temporary directory ### # tmp-path "" ### User defined coordinate system ### # cs-def [other options] ### Command to remove temporary directory ### # tmp-remove "" therion/thobjectid.cxx0000664000175000017500000000232010625655142014114 0ustar useruser/** * @file thobjectid.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thobjectid.h" #include bool operator < (const thobjectid & o1, const thobjectid & o2) { if (o1.sid < o2.sid) return true; else if ((o1.sid == o2.sid) && (strcmp(o1.name,o2.name) < 0)) return true; else return false; } therion/makerelease.pl0000664000175000017500000000047711046570542014075 0ustar useruserif (open(VFL,"thversion.h")) { @verfl = ; $verfl[0] =~ /(\d+)\.(\d+)(\.(\d+))?/; ($v1,$v2) = ($1,$2); close(VFL); $v2++; } else { $v1 = 0; $v2 = 0; } open(VFL,">thversion.h"); print VFL "#define THVERSION \"$v1.$v2\"\n"; close(VFL); open(VFL,">thbook/version.tex"); print VFL "$v1.$v2"; close(VFL); therion/thtrans.h0000664000175000017500000001716310625655142013120 0ustar useruser/** * @file thtrans.h * Transformation structures. */ /* Copyright (C) 2006-2007 Stacho Mudrak, Marco Corvi * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtrans_2_h #define thtrans_2_h #include // sqrt #include "thinfnan.h" // NaN #include #include #include struct thline2; // forward declaration /** 2D vector * */ struct thvec2 { double m_x, m_y; //!< coordinates thvec2() : m_x(0.0), m_y(0.0) {} //!< default cstr thvec2(double x, double y) : m_x(x), m_y(y) {} //!< cstr thvec2( thline2 & l1, thline2 & l2 ); //!< intersection of two lines thvec2 operator += (const thvec2 & v); //!< vector addition thvec2 operator -= (const thvec2 & v); //!< vector difference thvec2 operator *= (const double & c); //!< multiplication by a scalar thvec2 operator /= (const double & c); //!< division by a scalar void minimize(thvec2 v); //!< min( this, v ) void maximize(thvec2 v); //!< max( this, v ) double length(); //!< |V| = sqrt( V * V ) double length2() const { return m_x*m_x + m_y*m_y; } //!< V * V double orientation(); //!< orientation in degrees void reset(); //!< V = 0 void normalize(); //!< V / |V| thvec2 orthogonal() { return thvec2( m_y, -m_x); } //!< V^ (anticlockwise orthogonal vector) bool is_nan() const { return thisnan(m_x) || thisnan(m_y); } }; /** 2 x 2 matrix with real coefficient *
 *       m_xx  m_xy
 *       m_yx  m_yy 
 * 
*/ struct thmat2 { double m_xx, m_xy, m_yx, m_yy; //!< matric coefficients thmat2() : m_xx(1.0), m_xy(0.0), m_yx(0.0), m_yy(1.0) {} //!< cstr thmat2(double xx, double xy, double yx, double yy) : m_xx(xx), m_xy(xy), m_yx(yx), m_yy(yy) {} thmat2 operator *= (const double & c); //!< multiplication by a scalar thmat2 operator /= (const double & c); //!< division by a scalar thmat2 inverse(); //!< inverse matrix double determinant() { return m_xx*m_yy - m_xy*m_yx; } //!< determinant double trace() { return m_xx + m_yy; } //!< trace void reset(); //!< M = Identity matrix }; /** line in the 2D plane, with equation *
 *     m_a * X + m_b * Y + m_c = 0
 * 
*/ struct thline2 { double m_a, m_b, m_c; //!< coefficients of the line thline2() : m_a(0.0), m_b(0.0), m_c(0.0) {} //!< cstr thline2(double a, double b, double c) : m_a(a), m_b(b), m_c(c) {} thline2(thvec2 from, thvec2 to); //!< cstr: line joining two vectors double eval(thvec2 p); //!< evalate the line eq. on the vector }; /** linear algebra operations */ thvec2 operator - (const thvec2 & v); // -V thvec2 operator + (const thvec2 & v1, const thvec2 & v2); // V1 + V2 thvec2 operator - (const thvec2 & v1, const thvec2 & v2); // V1 - V2 double operator * (const thvec2 & v1, const thvec2 & v2); // V1 * V2 double operator ^ (const thvec2 & v1, const thvec2 & v2); // V1 ^ V2 = V1 * (V2^) thvec2 operator * (const double & c, const thvec2 & v); // c * V1 thvec2 operator * (const thvec2 & v, const double & c); // V1 * c thvec2 operator / (const thvec2 & v, const double & c); // V1 / c thvec2 operator * (const thmat2 & m, const thvec2 & v); // M * V1 thmat2 operator * (const double & c, const thmat2 & m); // c * M thmat2 operator * (const thmat2 & m, const double & c); // M * c thmat2 operator / (const thmat2 & m, const double & c); // M / c /** * 3x3 matrix */ struct thmat3 { double m_xx, m_xy, m_xz; //!< first row double m_yx, m_yy, m_yz; //!< second row double m_zx, m_zy, m_zz; //!< second row /** default cstr: set the matrix to the identity */ thmat3() : m_xx(1.0), m_xy(0.0), m_xz(0.0) , m_yx(0.0), m_yy(1.0), m_yz(0.0) , m_zx(0.0), m_zy(0.0), m_zz(1.0) { } /** cstr with the nine matrix elements, row-wise */ thmat3(double xx, double xy, double xz, double yx, double yy, double yz, double zx, double zy, double zz) : m_xx(xx), m_xy(xy), m_xz(xz) , m_yx(yx), m_yy(yy), m_yz(yz) , m_zx(zx), m_zy(zy), m_zz(zz) { } /** set the matrix to the identity */ void reset(); /** compute the inverse matrix * @return the inverse matrix */ thmat3 inverse(); }; /** linear transformation point */ struct thlintrans_pt { thvec2 m_src; //!< point in the source domain thvec2 m_tgt; //!< point in the target domain thlintrans_pt() {} /** cstr */ thlintrans_pt(thvec2 src, thvec2 tgt) : m_src(src) , m_tgt(tgt) { } }; /** list of linear-transform points */ typedef std::list thlintrans_pt_list; /** * Linear transformation. Rotate, zoom, shift. */ struct thlintrans { thmat2 m_fmat; //!< forward matrix thmat2 m_bmat; //!< backward matrix thvec2 m_shift; double m_rot, m_scale; thlintrans_pt_list m_initpts; thlintrans(); void reset(); void init(thmat2 A, thvec2 b); void init(thvec2 src, thvec2 dst); void init(thvec2 srcX, thvec2 srcY, thvec2 dstX, thvec2 dstY); void insert_point(thvec2 src, thvec2 dst); void init_points(); void init_backward(); thvec2 forward(thvec2 src); thvec2 backward(thvec2 dst); }; /** * Linear zooming transformation. */ struct thlinzoomtrans { bool m_valid, m_single; thvec2 m_from, m_to; double m_fl, m_fr, m_tl, m_tr; int m_flc, m_frc, m_tlc, m_trc; thline2 m_line_from, m_line_to, m_line; double m_orient_from, m_orient_to, m_line_l; thlinzoomtrans(); void init_points(thvec2 from, thvec2 to); void init_from(thvec2 src, double dst); void init_to(thvec2 src, double dst); void init(); thvec2 forward(thvec2 src); }; /** * Morphing transformation. */ struct thmorphtrans { thlintrans_pt_list m_initpts; void reset(); void insert_point(thvec2 src, thvec2 dst); thvec2 forward(thvec2 src); thvec2 backward(thvec2 dst, thvec2 ini = thvec2(0,0)); }; /** * Advanced morphing transformation. */ struct thmorph2trans { struct thmorph2trans_members * m; double m_eps; thmorph2trans(); ~thmorph2trans(); void reset(); void insert_point(thvec2 src, thvec2 dst, long id); void insert_line(long from, long to); void insert_lines_from_db(); void insert_zoom_point(thvec2 src, double dst, long id); void init(double eps = 0.01); thvec2 forward(thvec2 src); thvec2 backward(thvec2 dst, thvec2 ini = thvec2(0,0)); }; #endif therion/thlibrary.cxx0000664000175000017500000000212110625655142013774 0ustar useruser/** * @file thlibrary.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thlibrary.h" #include "thlibrarydata.cxx" void thlibrary_init() { thlibrary_init_grades(); thlibrary_init_layouts(); } therion/makerelease2.pl0000664000175000017500000000056712041762714014157 0ustar useruserif (open(VFL,"thversion.h")) { @verfl = ; $verfl[0] =~ /(\d+)\.(\d+)(\.(\d+))?/; ($v1,$v2,$v3) = ($1,$2,$4); if (!$v3) { $v3 = 0; } close(VFL); $v3++; } else { $v1 = 0; $v2 = 0; $v3 = 0; } open(VFL,">thversion.h"); print VFL "#define THVERSION \"$v1.$v2.$v3\"\n"; close(VFL); open(VFL,">thbook/version.tex"); print VFL "$v1.$v2.$v3"; close(VFL); therion/thlang.cxx0000664000175000017500000000744712341110621013252 0ustar useruser/** * @file thlang.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thlang.h" #include "thparse.h" #include "thlangdata.cxx" #include "thinit.h" #include "thconfig.h" #include "thdatabase.h" #include "thexception.h" #include struct thlang_str { int m_lang; const char * m_text; thlang_str(int lang, const char * text) : m_lang(lang), m_text(text) {} }; bool operator < (const struct thlang_str & s1, const struct thlang_str & s2) { if (s1.m_lang < s2.m_lang) return true; if (s1.m_lang > s2.m_lang) return false; if (strcmp(s1.m_text, s2.m_text) < 0) return true; return false; } bool operator == (const struct thlang_str & s1, const struct thlang_str & s2) { if ((s1.m_lang == s2.m_lang) && (strcmp(s1.m_text, s2.m_text) == 0)) return true; return false; } typedef std::map thlang_str_map; thlang_str_map ulang_map; int thlang_parse(char * str) { return thmatch_token(str, thtt_lang); } const char * thlang_getid(int id) { if (id < 0) { return "en"; } const char * rv = thmatch_string(thlang_getlang(id), thtt_lang); return rv; } const char * thlang_getcxxid(int id) { if (id < 0) return "THLANG_UNKNOWN"; else return thlang__cxxids[id]; } const thstok * thlang_get_text_table() { return &(thtt__texts[0]); } void thlang_set_translation(char * lang, char * text, char * translation) { int lang_id; lang_id = thlang_parse(lang); if (lang_id == THLANG_UNKNOWN) ththrow(("unknown language -- %s", lang)); int text_id; text_id = thmatch_token(text, thtt__texts); if (text_id == -1) { if ( (strncmp(text,"point u:",8) == 0) || (strncmp(text,"line u:",7) == 0) || (strncmp(text,"area u:",7) == 0)) { ulang_map[thlang_str(lang_id, thdb.strstore(text, true))] = thdb.strstore(translation); } else ththrow(("unknown text -- %s", text)) } else { thlang__translations[text_id][lang_id] = thdb.strstore(translation); } } const char * thT(const char * txt, int lng) { if (lng == THLANG_SYSTEM) return txt; int sv = thmatch_token(txt,thtt__texts); const char * trans; lng = thlang_getlang(lng); // najde ci ho mame v danom jazyku if (sv == -1) { thlang_str_map::iterator it = ulang_map.find(thlang_str(lng, txt)); if ((it == ulang_map.end()) && (thlang__alternatives[lng] != THLANG_UNKNOWN)) it = ulang_map.find(thlang_str(thlang__alternatives[lng], txt)); if (it == ulang_map.end()) return txt; else return it->second; } trans = thlang__translations[sv][lng]; if ((trans == NULL) && (thlang__alternatives[lng] != THLANG_UNKNOWN)) { trans = thlang__translations[sv][thlang__alternatives[lng]]; } if (trans != NULL) return trans; else return txt; } int thlang_getlang(int lng) { if (lng == THLANG_UNKNOWN) lng = thcfg.lang; if (lng == THLANG_UNKNOWN) lng = thini.lang; if (lng == THLANG_UNKNOWN) lng = THLANG_EN; return lng; } therion/geomag/0000775000175000017500000000000012447770402012514 5ustar userusertherion/geomag/igrf2c.py0000775000175000017500000000355412446064747014263 0ustar useruser#!/usr/bin/python3 # Martin Budaj 2014 import sys if len(sys.argv) == 1: print('usage: %s ' % sys.argv[0]) sys.exit(1) def get_values(d): return d[3:len(d)-1] def iround(d): if '.' in d: return d.rstrip('0').rstrip('.') else: return d data = dict() max_n = 0 with open(sys.argv[1]) as fin: for l in fin: if l.startswith(('#', 'c/s')): continue l = l.rstrip() ldata = l.split() if ldata[0] == 'g/h': assert(ldata[1] == 'n' and ldata[2] == 'm') years = get_values(ldata) elif ldata[0] in ('g', 'h'): n = int(ldata[1]) m = int(ldata[2]) data[ldata[0],n,m] = list(get_values(ldata)) data[ldata[0]+'_delta',n,m] = ldata[len(ldata)-1], max_n = max(max_n, n, m) else: raise ValueError('data line in unknown format!') with open('../thgeomagdata.h','w') as fout: fout.write('''// generated by geomag/igrf2c.py #ifndef thgeomagdata_h #define thgeomagdata_h ''') for gh in ('g', 'h', 'g_delta', 'h_delta'): if 'delta' in gh: isdelta = True suffix = 'D' yy = (0,) else: isdelta = False suffix = '[%d]' % len(years) yy = range(0,len(years)) fout.write('static const double thgeomag_%sNM%s[%d][%d] = {\n' % (gh[0].upper(),suffix,max_n+1,max_n+1)) for y in yy: if not isdelta: fout.write('{\n') for n in range(0,max_n+1): fout.write(' {') for m in range(0,max_n+1): fout.write('%s, ' % (iround(data[gh,n,m][y]) if (gh,n,m) in data else '0')) fout.write('},\n') if not isdelta: fout.write('},\n') fout.write('};\n') fout.write( '''#define thgeomag_maxmindex %d #define thgeomag_step %d #define thgeomag_minyear %d #define thgeomag_maxdeg %d #endif ''' % (len(years)-1, float(years[1])-float(years[0]), float(years[0]), max_n)) print('OK: ../thgeomagdata.h created') therion/geomag/igrf11coeffs.txt0000664000175000017500000010603411330650102015520 0ustar useruserg/h n m 1900.0 1905.0 1910.0 1915.0 1920.0 1925.0 1930.0 1935.0 1940.0 1945.0 1950.0 1955.0 1960.0 1965.0 1970.0 1975.0 1980.0 1985.0 1990.0 1995.0 2000.0 2005.0 2010.0 SV g 1 0 -31543 -31464 -31354 -31212 -31060 -30926 -30805 -30715 -30654 -30594 -30554 -30500 -30421 -30334 -30220 -30100 -29992 -29873 -29775 -29692 -29619.4 -29554.63 -29496.5 11.4 g 1 1 -2298 -2298 -2297 -2306 -2317 -2318 -2316 -2306 -2292 -2285 -2250 -2215 -2169 -2119 -2068 -2013 -1956 -1905 -1848 -1784 -1728.2 -1669.05 -1585.9 16.7 h 1 1 5922 5909 5898 5875 5845 5817 5808 5812 5821 5810 5815 5820 5791 5776 5737 5675 5604 5500 5406 5306 5186.1 5077.99 4945.1 -28.8 g 2 0 -677 -728 -769 -802 -839 -893 -951 -1018 -1106 -1244 -1341 -1440 -1555 -1662 -1781 -1902 -1997 -2072 -2131 -2200 -2267.7 -2337.24 -2396.6 -11.3 g 2 1 2905 2928 2948 2956 2959 2969 2980 2984 2981 2990 2998 3003 3002 2997 3000 3010 3027 3044 3059 3070 3068.4 3047.69 3026.0 -3.9 h 2 1 -1061 -1086 -1128 -1191 -1259 -1334 -1424 -1520 -1614 -1702 -1810 -1898 -1967 -2016 -2047 -2067 -2129 -2197 -2279 -2366 -2481.6 -2594.50 -2707.7 -23.0 g 2 2 924 1041 1176 1309 1407 1471 1517 1550 1566 1578 1576 1581 1590 1594 1611 1632 1663 1687 1686 1681 1670.9 1657.76 1668.6 2.7 h 2 2 1121 1065 1000 917 823 728 644 586 528 477 381 291 206 114 25 -68 -200 -306 -373 -413 -458.0 -515.43 -575.4 -12.9 g 3 0 1022 1037 1058 1084 1111 1140 1172 1206 1240 1282 1297 1302 1302 1297 1287 1276 1281 1296 1314 1335 1339.6 1336.30 1339.7 1.3 g 3 1 -1469 -1494 -1524 -1559 -1600 -1645 -1692 -1740 -1790 -1834 -1889 -1944 -1992 -2038 -2091 -2144 -2180 -2208 -2239 -2267 -2288.0 -2305.83 -2326.3 -3.9 h 3 1 -330 -357 -389 -421 -445 -462 -480 -494 -499 -499 -476 -462 -414 -404 -366 -333 -336 -310 -284 -262 -227.6 -198.86 -160.5 8.6 g 3 2 1256 1239 1223 1212 1205 1202 1205 1215 1232 1255 1274 1288 1289 1292 1278 1260 1251 1247 1248 1249 1252.1 1246.39 1231.7 -2.9 h 3 2 3 34 62 84 103 119 133 146 163 186 206 216 224 240 251 262 271 284 293 302 293.4 269.72 251.7 -2.9 g 3 3 572 635 705 778 839 881 907 918 916 913 896 882 878 856 838 830 833 829 802 759 714.5 672.51 634.2 -8.1 h 3 3 523 480 425 360 293 229 166 101 43 -11 -46 -83 -130 -165 -196 -223 -252 -297 -352 -427 -491.1 -524.72 -536.8 -2.1 g 4 0 876 880 884 887 889 891 896 903 914 944 954 958 957 957 952 946 938 936 939 940 932.3 920.55 912.6 -1.4 g 4 1 628 643 660 678 695 711 727 744 762 776 792 796 800 804 800 791 782 780 780 780 786.8 797.96 809.0 2.0 h 4 1 195 203 211 218 220 216 205 188 169 144 136 133 135 148 167 191 212 232 247 262 272.6 282.07 286.4 0.4 g 4 2 660 653 644 631 616 601 584 565 550 544 528 510 504 479 461 438 398 361 325 290 250.0 210.65 166.6 -8.9 h 4 2 -69 -77 -90 -109 -134 -163 -195 -226 -252 -276 -278 -274 -278 -269 -266 -265 -257 -249 -240 -236 -231.9 -225.23 -211.2 3.2 g 4 3 -361 -380 -400 -416 -424 -426 -422 -415 -405 -421 -408 -397 -394 -390 -395 -405 -419 -424 -423 -418 -403.0 -379.86 -357.1 4.4 h 4 3 -210 -201 -189 -173 -153 -130 -109 -90 -72 -55 -37 -23 3 13 26 39 53 69 84 97 119.8 145.15 164.4 3.6 g 4 4 134 146 160 178 199 217 234 249 265 304 303 290 269 252 234 216 199 170 141 122 111.3 100.00 89.7 -2.3 h 4 4 -75 -65 -55 -51 -57 -70 -90 -114 -141 -178 -210 -230 -255 -269 -279 -288 -297 -297 -299 -306 -303.8 -305.36 -309.2 -0.8 g 5 0 -184 -192 -201 -211 -221 -230 -237 -241 -241 -253 -240 -229 -222 -219 -216 -218 -218 -214 -214 -214 -218.8 -227.00 -231.1 -0.5 g 5 1 328 328 327 327 326 326 327 329 334 346 349 360 362 358 359 356 357 355 353 352 351.4 354.41 357.2 0.5 h 5 1 -210 -193 -172 -148 -122 -96 -72 -51 -33 -12 3 15 16 19 26 31 46 47 46 46 43.8 42.72 44.7 0.5 g 5 2 264 259 253 245 236 226 218 211 208 194 211 230 242 254 262 264 261 253 245 235 222.3 208.95 200.3 -1.5 h 5 2 53 56 57 58 58 58 60 64 71 95 103 110 125 128 139 148 150 150 154 165 171.9 180.25 188.9 1.5 g 5 3 5 -1 -9 -16 -23 -28 -32 -33 -33 -20 -20 -23 -26 -31 -42 -59 -74 -93 -109 -118 -130.4 -136.54 -141.2 -0.7 h 5 3 -33 -32 -33 -34 -38 -44 -53 -64 -75 -67 -87 -98 -117 -126 -139 -152 -151 -154 -153 -143 -133.1 -123.45 -118.1 0.9 g 5 4 -86 -93 -102 -111 -119 -125 -131 -136 -141 -142 -147 -152 -156 -157 -160 -159 -162 -164 -165 -166 -168.6 -168.05 -163.1 1.3 h 5 4 -124 -125 -126 -126 -125 -122 -118 -115 -113 -119 -122 -121 -114 -97 -91 -83 -78 -75 -69 -55 -39.3 -19.57 0.1 3.7 g 5 5 -16 -26 -38 -51 -62 -69 -74 -76 -76 -82 -76 -69 -63 -62 -56 -49 -48 -46 -36 -17 -12.9 -13.55 -7.7 1.4 h 5 5 3 11 21 32 43 51 58 64 69 82 80 78 81 81 83 88 92 95 97 107 106.3 103.85 100.9 -0.6 g 6 0 63 62 62 61 61 61 60 59 57 59 54 47 46 45 43 45 48 53 61 68 72.3 73.60 72.8 -0.3 g 6 1 61 60 58 57 55 54 53 53 54 57 57 57 58 61 64 66 66 65 65 67 68.2 69.56 68.6 -0.3 h 6 1 -9 -7 -5 -2 0 3 4 4 4 6 -1 -9 -10 -11 -12 -13 -15 -16 -16 -17 -17.4 -20.33 -20.8 -0.1 g 6 2 -11 -11 -11 -10 -10 -9 -9 -8 -7 6 4 3 1 8 15 28 42 51 59 68 74.2 76.74 76.0 -0.3 h 6 2 83 86 89 93 96 99 102 104 105 100 99 96 99 100 100 99 93 88 82 72 63.7 54.75 44.2 -2.1 g 6 3 -217 -221 -224 -228 -233 -238 -242 -246 -249 -246 -247 -247 -237 -228 -212 -198 -192 -185 -178 -170 -160.9 -151.34 -141.4 1.9 h 6 3 2 4 5 8 11 14 19 25 33 16 33 48 60 68 72 75 71 69 69 67 65.1 63.63 61.5 -0.4 g 6 4 -58 -57 -54 -51 -46 -40 -32 -25 -18 -25 -16 -8 -1 4 2 1 4 4 3 -1 -5.9 -14.58 -22.9 -1.6 h 6 4 -35 -32 -29 -26 -22 -18 -16 -15 -15 -9 -12 -16 -20 -32 -37 -41 -43 -48 -52 -58 -61.2 -63.53 -66.3 -0.5 g 6 5 59 57 54 49 44 39 32 25 18 21 12 7 -2 1 3 6 14 16 18 19 16.9 14.58 13.1 -0.2 h 6 5 36 32 28 23 18 13 8 4 0 -16 -12 -12 -11 -8 -6 -4 -2 -1 1 1 0.7 0.24 3.1 0.8 g 6 6 -90 -92 -95 -98 -101 -103 -104 -106 -107 -104 -105 -107 -113 -111 -112 -111 -108 -102 -96 -93 -90.4 -86.36 -77.9 1.8 h 6 6 -69 -67 -65 -62 -57 -52 -46 -40 -33 -39 -30 -24 -17 -7 1 11 17 21 24 36 43.8 50.94 54.9 0.5 g 7 0 70 70 71 72 73 73 74 74 74 70 65 65 67 75 72 71 72 74 77 77 79.0 79.88 80.4 0.2 g 7 1 -55 -54 -54 -54 -54 -54 -54 -53 -53 -40 -55 -56 -56 -57 -57 -56 -59 -62 -64 -72 -74.0 -74.46 -75.0 -0.1 h 7 1 -45 -46 -47 -48 -49 -50 -51 -52 -52 -45 -35 -50 -55 -61 -70 -77 -82 -83 -80 -69 -64.6 -61.14 -57.8 0.6 g 7 2 0 0 1 2 2 3 4 4 4 0 2 2 5 4 1 1 2 3 2 1 0.0 -1.65 -4.7 -0.6 h 7 2 -13 -14 -14 -14 -14 -14 -15 -17 -18 -18 -17 -24 -28 -27 -27 -26 -27 -27 -26 -25 -24.2 -22.57 -21.2 0.3 g 7 3 34 33 32 31 29 27 25 23 20 0 1 10 15 13 14 16 21 24 26 28 33.3 38.73 45.3 1.4 h 7 3 -10 -11 -12 -12 -13 -14 -14 -14 -14 2 0 -4 -6 -2 -4 -5 -5 -2 0 4 6.2 6.82 6.6 -0.2 g 7 4 -41 -41 -40 -38 -37 -35 -34 -33 -31 -29 -40 -32 -32 -26 -22 -14 -12 -6 -1 5 9.1 12.30 14.0 0.3 h 7 4 -1 0 1 2 4 5 6 7 7 6 10 8 7 6 8 10 16 20 21 24 24.0 25.35 24.9 -0.1 g 7 5 -21 -20 -19 -18 -16 -14 -12 -11 -9 -10 -7 -11 -7 -6 -2 0 1 4 5 4 6.9 9.37 10.4 0.1 h 7 5 28 28 28 28 28 29 29 29 29 28 36 28 23 26 23 22 18 17 17 17 14.8 10.93 7.0 -0.8 g 7 6 18 18 18 19 19 19 18 18 17 15 5 9 17 13 13 12 11 10 9 8 7.3 5.42 1.6 -0.8 h 7 6 -12 -12 -13 -15 -16 -17 -18 -19 -20 -17 -18 -20 -18 -23 -23 -23 -23 -23 -23 -24 -25.4 -26.32 -27.7 -0.3 g 7 7 6 6 6 6 6 6 6 6 5 29 19 18 8 1 -2 -5 -2 0 0 -2 -1.2 1.94 4.9 0.4 h 7 7 -22 -22 -22 -22 -22 -21 -20 -19 -19 -22 -16 -18 -17 -12 -11 -12 -10 -7 -4 -6 -5.8 -4.64 -3.4 0.2 g 8 0 11 11 11 11 11 11 11 11 11 13 22 11 15 13 14 14 18 21 23 25 24.4 24.80 24.3 -0.1 g 8 1 8 8 8 8 7 7 7 7 7 7 15 9 6 5 6 6 6 6 5 6 6.6 7.62 8.2 0.1 h 8 1 8 8 8 8 8 8 8 8 8 12 5 10 11 7 7 6 7 8 10 11 11.9 11.20 10.9 0.0 g 8 2 -4 -4 -4 -4 -3 -3 -3 -3 -3 -8 -4 -6 -4 -4 -2 -1 0 0 -1 -6 -9.2 -11.73 -14.5 -0.5 h 8 2 -14 -15 -15 -15 -15 -15 -15 -15 -14 -21 -22 -15 -14 -12 -15 -16 -18 -19 -19 -21 -21.5 -20.88 -20.0 0.2 g 8 3 -9 -9 -9 -9 -9 -9 -9 -9 -10 -5 -1 -14 -11 -14 -13 -12 -11 -11 -10 -9 -7.9 -6.88 -5.7 0.3 h 8 3 7 7 6 6 6 6 5 5 5 -12 0 5 7 9 6 4 4 5 6 8 8.5 9.83 11.9 0.5 g 8 4 1 1 1 2 2 2 2 1 1 9 11 6 2 0 -3 -8 -7 -9 -12 -14 -16.6 -18.11 -19.3 -0.3 h 8 4 -13 -13 -13 -13 -14 -14 -14 -15 -15 -7 -21 -23 -18 -16 -17 -19 -22 -23 -22 -23 -21.5 -19.71 -17.4 0.4 g 8 5 2 2 2 3 4 4 5 6 6 7 15 10 10 8 5 4 4 4 3 9 9.1 10.17 11.6 0.3 h 8 5 5 5 5 5 5 5 5 5 5 2 -8 3 4 4 6 6 9 11 12 15 15.5 16.22 16.7 0.1 g 8 6 -9 -8 -8 -8 -7 -7 -6 -6 -5 -10 -13 -7 -5 -1 0 0 3 4 4 6 7.0 9.36 10.9 0.2 h 8 6 16 16 16 16 17 17 18 18 19 18 17 23 23 24 21 18 16 14 12 11 8.9 7.61 7.1 -0.1 g 8 7 5 5 5 6 6 7 8 8 9 7 5 6 10 11 11 10 6 4 2 -5 -7.9 -11.25 -14.1 -0.5 h 8 7 -5 -5 -5 -5 -5 -5 -5 -5 -5 3 -4 -4 1 -3 -6 -10 -13 -15 -16 -16 -14.9 -12.76 -10.8 0.4 g 8 8 8 8 8 8 8 8 8 7 7 2 -1 9 8 4 3 1 -1 -4 -6 -7 -7.0 -4.87 -3.7 0.2 h 8 8 -18 -18 -18 -18 -19 -19 -19 -19 -19 -11 -17 -13 -20 -17 -16 -17 -15 -11 -10 -4 -2.1 -0.06 1.7 0.4 g 9 0 8 8 8 8 8 8 8 8 8 5 3 4 4 8 8 7 5 5 4 4 5.0 5.58 5.4 0.0 g 9 1 10 10 10 10 10 10 10 10 10 -21 -7 9 6 10 10 10 10 10 9 9 9.4 9.76 9.4 0.0 h 9 1 -20 -20 -20 -20 -20 -20 -20 -20 -21 -27 -24 -11 -18 -22 -21 -21 -21 -21 -20 -20 -19.7 -20.11 -20.5 0.0 g 9 2 1 1 1 1 1 1 1 1 1 1 -1 -4 0 2 2 2 1 1 1 3 3.0 3.58 3.4 0.0 h 9 2 14 14 14 14 14 14 14 15 15 17 19 12 12 15 16 16 16 15 15 15 13.4 12.69 11.6 0.0 g 9 3 -11 -11 -11 -11 -11 -11 -12 -12 -12 -11 -25 -5 -9 -13 -12 -12 -12 -12 -12 -10 -8.4 -6.94 -5.3 0.0 h 9 3 5 5 5 5 5 5 5 5 5 29 12 7 2 7 6 7 9 9 11 12 12.5 12.67 12.8 0.0 g 9 4 12 12 12 12 12 12 12 11 11 3 10 2 1 10 10 10 9 9 9 8 6.3 5.01 3.1 0.0 h 9 4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -9 2 6 0 -4 -4 -4 -5 -6 -7 -6 -6.2 -6.72 -7.2 0.0 g 9 5 1 1 1 1 1 1 1 1 1 16 5 4 4 -1 -1 -1 -3 -3 -4 -8 -8.9 -10.76 -12.4 0.0 h 9 5 -2 -2 -2 -2 -2 -2 -2 -3 -3 4 2 -2 -3 -5 -5 -5 -6 -6 -7 -8 -8.4 -8.16 -7.4 0.0 g 9 6 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -5 1 -1 -1 0 -1 -1 -1 -2 -1 -1.5 -1.25 -0.8 0.0 h 9 6 8 8 8 8 9 9 9 9 9 9 8 10 9 10 10 10 9 9 9 8 8.4 8.10 8.0 0.0 g 9 7 2 2 2 2 2 2 3 3 3 -4 -2 2 -2 5 3 4 7 7 7 10 9.3 8.76 8.4 0.0 h 9 7 10 10 10 10 10 10 10 11 11 6 8 7 8 10 11 11 10 9 8 5 3.8 2.92 2.2 0.0 g 9 8 -1 0 0 0 0 0 0 0 1 -3 3 2 3 1 1 1 2 1 1 -2 -4.3 -6.66 -8.4 0.0 h 9 8 -2 -2 -2 -2 -2 -2 -2 -2 -2 1 -11 -6 0 -4 -2 -3 -6 -7 -7 -8 -8.2 -7.73 -6.1 0.0 g 9 9 -1 -1 -1 -1 -1 -1 -2 -2 -2 -4 8 5 -1 -2 -1 -2 -5 -5 -6 -8 -8.2 -9.22 -10.1 0.0 h 9 9 2 2 2 2 2 2 2 2 2 8 -7 5 5 1 1 1 2 2 2 3 4.8 6.01 7.0 0.0 g 10 0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -8 -3 1 -2 -3 -3 -4 -4 -3 -3 -2.6 -2.17 -2.0 0.0 g 10 1 -4 -4 -4 -4 -4 -4 -4 -4 -4 11 4 -5 -3 -3 -3 -3 -4 -4 -4 -6 -6.0 -6.12 -6.3 0.0 h 10 1 2 2 2 2 2 2 2 2 2 5 13 -4 4 2 1 1 1 1 2 1 1.7 2.19 2.8 0.0 g 10 2 2 2 2 2 2 2 2 2 2 1 -1 -1 4 2 2 2 2 3 2 2 1.7 1.42 0.9 0.0 h 10 2 1 1 1 1 1 1 1 1 1 1 -2 0 1 1 1 1 0 0 1 0 0.0 0.10 -0.1 0.0 g 10 3 -5 -5 -5 -5 -5 -5 -5 -5 -5 2 13 2 0 -5 -5 -5 -5 -5 -5 -4 -3.1 -2.35 -1.1 0.0 h 10 3 2 2 2 2 2 2 2 2 2 -20 -10 -8 0 2 3 3 3 3 3 4 4.0 4.46 4.7 0.0 g 10 4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -5 -4 -3 -1 -2 -1 -2 -2 -2 -2 -1 -0.5 -0.15 -0.2 0.0 h 10 4 6 6 6 6 6 6 6 6 6 -1 2 -2 2 6 4 4 6 6 6 5 4.9 4.76 4.4 0.0 g 10 5 6 6 6 6 6 6 6 6 6 -1 4 7 4 4 6 5 5 5 4 4 3.7 3.06 2.5 0.0 h 10 5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -3 -4 -5 -4 -4 -4 -4 -4 -4 -5 -5.9 -6.58 -7.2 0.0 g 10 6 4 4 4 4 4 4 4 4 4 8 12 4 6 4 4 4 3 3 3 2 1.0 0.29 -0.3 0.0 h 10 6 0 0 0 0 0 0 0 0 0 6 6 1 1 0 0 -1 0 0 0 -1 -1.2 -1.01 -1.0 0.0 g 10 7 0 0 0 0 0 0 0 0 0 -1 3 -2 1 0 1 1 1 1 1 2 2.0 2.06 2.2 0.0 h 10 7 -2 -2 -2 -2 -2 -2 -2 -1 -1 -4 -3 -3 -1 -2 -1 -1 -1 -1 -2 -2 -2.9 -3.47 -4.0 0.0 g 10 8 2 2 2 1 1 1 1 2 2 -3 2 6 -1 2 0 0 2 2 3 5 4.2 3.77 3.1 0.0 h 10 8 4 4 4 4 4 4 4 4 4 -2 6 7 6 3 3 3 4 4 3 1 0.2 -0.86 -2.0 0.0 g 10 9 2 2 2 2 3 3 3 3 3 5 10 -2 2 2 3 3 3 3 3 1 0.3 -0.21 -1.0 0.0 h 10 9 0 0 0 0 0 0 0 0 0 0 11 -1 0 0 1 1 0 0 -1 -2 -2.2 -2.31 -2.0 0.0 g 10 10 0 0 0 0 0 0 0 0 0 -2 3 0 0 0 -1 -1 0 0 0 0 -1.1 -2.09 -2.8 0.0 h 10 10 -6 -6 -6 -6 -6 -6 -6 -6 -6 -2 8 -3 -7 -6 -4 -5 -6 -6 -6 -7 -7.4 -7.93 -8.3 0.0 g 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7 2.95 3.0 0.0 g 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.7 -1.60 -1.5 0.0 h 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.26 0.1 0.0 g 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.88 -2.1 0.0 h 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.44 1.7 0.0 g 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 1.44 1.6 0.0 h 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.77 -0.6 0.0 g 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.31 -0.5 0.0 h 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.27 -1.8 0.0 g 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.29 0.5 0.0 h 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.90 0.9 0.0 g 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.79 -0.8 0.0 h 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.58 -0.4 0.0 g 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.53 0.4 0.0 h 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.8 -2.69 -2.5 0.0 g 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.7 1.80 1.8 0.0 h 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.08 -1.3 0.0 g 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.16 0.2 0.0 h 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.2 -1.58 -2.1 0.0 g 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0.96 0.8 0.0 h 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.90 -1.9 0.0 g 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.0 3.99 3.8 0.0 h 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.39 -1.8 0.0 g 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.2 -2.15 -2.1 0.0 g 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.29 -0.2 0.0 h 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.55 -0.8 0.0 g 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.21 0.3 0.0 h 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.23 0.3 0.0 g 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.89 1.0 0.0 h 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 2.38 2.2 0.0 g 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.38 -0.7 0.0 h 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.63 -2.5 0.0 g 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.96 0.9 0.0 h 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.61 0.5 0.0 g 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.30 -0.1 0.0 h 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.40 0.6 0.0 g 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.46 0.5 0.0 h 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.01 0.0 0.0 g 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.35 -0.4 0.0 h 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.02 0.1 0.0 g 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.36 -0.4 0.0 h 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.28 0.3 0.0 g 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 0.08 0.2 0.0 h 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.87 -0.9 0.0 g 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.49 -0.8 0.0 h 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.34 -0.2 0.0 g 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.08 0.0 0.0 h 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.88 0.8 0.0 g 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.16 -0.2 0.0 g 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.88 -0.9 0.0 h 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.76 -0.8 0.0 g 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.30 0.3 0.0 h 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.33 0.3 0.0 g 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.28 0.4 0.0 h 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.8 1.72 1.7 0.0 g 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.43 -0.4 0.0 h 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.54 -0.6 0.0 g 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.18 1.1 0.0 h 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0 -1.07 -1.2 0.0 g 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.37 -0.3 0.0 h 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.04 -0.1 0.0 g 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.75 0.8 0.0 h 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.63 0.5 0.0 g 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.26 -0.2 0.0 h 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.21 0.1 0.0 g 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.35 0.4 0.0 h 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0.53 0.5 0.0 g 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.05 0.0 0.0 h 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.38 0.4 0.0 g 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.41 0.4 0.0 h 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.22 -0.2 0.0 g 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 -0.10 -0.3 0.0 h 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.57 -0.5 0.0 g 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 -0.18 -0.3 0.0 h 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.82 -0.8 0.0 therion/geomag/igrf12coeffs.txt0000664000175000017500000011311212445623214015530 0ustar useruser# 12th Generation International Geomagnetic Reference Field Schmidt semi-normalised spherical harmonic coefficients, degree n=1,13 # in units nanoTesla for IGRF and definitive DGRF main-field models (degree n=1,8 nanoTesla/year for secular variation (SV)) c/s deg ord IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF IGRF SV g/h n m 1900.0 1905.0 1910.0 1915.0 1920.0 1925.0 1930.0 1935.0 1940.0 1945.0 1950.0 1955.0 1960.0 1965.0 1970.0 1975.0 1980.0 1985.0 1990.0 1995.0 2000.0 2005.0 2010.0 2015.0 2015-20 g 1 0 -31543 -31464 -31354 -31212 -31060 -30926 -30805 -30715 -30654 -30594 -30554 -30500 -30421 -30334 -30220 -30100 -29992 -29873 -29775 -29692 -29619.4 -29554.63 -29496.57 -29442.0 10.3 g 1 1 -2298 -2298 -2297 -2306 -2317 -2318 -2316 -2306 -2292 -2285 -2250 -2215 -2169 -2119 -2068 -2013 -1956 -1905 -1848 -1784 -1728.2 -1669.05 -1586.42 -1501.0 18.1 h 1 1 5922 5909 5898 5875 5845 5817 5808 5812 5821 5810 5815 5820 5791 5776 5737 5675 5604 5500 5406 5306 5186.1 5077.99 4944.26 4797.1 -26.6 g 2 0 -677 -728 -769 -802 -839 -893 -951 -1018 -1106 -1244 -1341 -1440 -1555 -1662 -1781 -1902 -1997 -2072 -2131 -2200 -2267.7 -2337.24 -2396.06 -2445.1 -8.7 g 2 1 2905 2928 2948 2956 2959 2969 2980 2984 2981 2990 2998 3003 3002 2997 3000 3010 3027 3044 3059 3070 3068.4 3047.69 3026.34 3012.9 -3.3 h 2 1 -1061 -1086 -1128 -1191 -1259 -1334 -1424 -1520 -1614 -1702 -1810 -1898 -1967 -2016 -2047 -2067 -2129 -2197 -2279 -2366 -2481.6 -2594.50 -2708.54 -2845.6 -27.4 g 2 2 924 1041 1176 1309 1407 1471 1517 1550 1566 1578 1576 1581 1590 1594 1611 1632 1663 1687 1686 1681 1670.9 1657.76 1668.17 1676.7 2.1 h 2 2 1121 1065 1000 917 823 728 644 586 528 477 381 291 206 114 25 -68 -200 -306 -373 -413 -458.0 -515.43 -575.73 -641.9 -14.1 g 3 0 1022 1037 1058 1084 1111 1140 1172 1206 1240 1282 1297 1302 1302 1297 1287 1276 1281 1296 1314 1335 1339.6 1336.30 1339.85 1350.7 3.4 g 3 1 -1469 -1494 -1524 -1559 -1600 -1645 -1692 -1740 -1790 -1834 -1889 -1944 -1992 -2038 -2091 -2144 -2180 -2208 -2239 -2267 -2288.0 -2305.83 -2326.54 -2352.3 -5.5 h 3 1 -330 -357 -389 -421 -445 -462 -480 -494 -499 -499 -476 -462 -414 -404 -366 -333 -336 -310 -284 -262 -227.6 -198.86 -160.40 -115.3 8.2 g 3 2 1256 1239 1223 1212 1205 1202 1205 1215 1232 1255 1274 1288 1289 1292 1278 1260 1251 1247 1248 1249 1252.1 1246.39 1232.10 1225.6 -0.7 h 3 2 3 34 62 84 103 119 133 146 163 186 206 216 224 240 251 262 271 284 293 302 293.4 269.72 251.75 244.9 -0.4 g 3 3 572 635 705 778 839 881 907 918 916 913 896 882 878 856 838 830 833 829 802 759 714.5 672.51 633.73 582.0 -10.1 h 3 3 523 480 425 360 293 229 166 101 43 -11 -46 -83 -130 -165 -196 -223 -252 -297 -352 -427 -491.1 -524.72 -537.03 -538.4 1.8 g 4 0 876 880 884 887 889 891 896 903 914 944 954 958 957 957 952 946 938 936 939 940 932.3 920.55 912.66 907.6 -0.7 g 4 1 628 643 660 678 695 711 727 744 762 776 792 796 800 804 800 791 782 780 780 780 786.8 797.96 808.97 813.7 0.2 h 4 1 195 203 211 218 220 216 205 188 169 144 136 133 135 148 167 191 212 232 247 262 272.6 282.07 286.48 283.3 -1.3 g 4 2 660 653 644 631 616 601 584 565 550 544 528 510 504 479 461 438 398 361 325 290 250.0 210.65 166.58 120.4 -9.1 h 4 2 -69 -77 -90 -109 -134 -163 -195 -226 -252 -276 -278 -274 -278 -269 -266 -265 -257 -249 -240 -236 -231.9 -225.23 -211.03 -188.7 5.3 g 4 3 -361 -380 -400 -416 -424 -426 -422 -415 -405 -421 -408 -397 -394 -390 -395 -405 -419 -424 -423 -418 -403.0 -379.86 -356.83 -334.9 4.1 h 4 3 -210 -201 -189 -173 -153 -130 -109 -90 -72 -55 -37 -23 3 13 26 39 53 69 84 97 119.8 145.15 164.46 180.9 2.9 g 4 4 134 146 160 178 199 217 234 249 265 304 303 290 269 252 234 216 199 170 141 122 111.3 100.00 89.40 70.4 -4.3 h 4 4 -75 -65 -55 -51 -57 -70 -90 -114 -141 -178 -210 -230 -255 -269 -279 -288 -297 -297 -299 -306 -303.8 -305.36 -309.72 -329.5 -5.2 g 5 0 -184 -192 -201 -211 -221 -230 -237 -241 -241 -253 -240 -229 -222 -219 -216 -218 -218 -214 -214 -214 -218.8 -227.00 -230.87 -232.6 -0.2 g 5 1 328 328 327 327 326 326 327 329 334 346 349 360 362 358 359 356 357 355 353 352 351.4 354.41 357.29 360.1 0.5 h 5 1 -210 -193 -172 -148 -122 -96 -72 -51 -33 -12 3 15 16 19 26 31 46 47 46 46 43.8 42.72 44.58 47.3 0.6 g 5 2 264 259 253 245 236 226 218 211 208 194 211 230 242 254 262 264 261 253 245 235 222.3 208.95 200.26 192.4 -1.3 h 5 2 53 56 57 58 58 58 60 64 71 95 103 110 125 128 139 148 150 150 154 165 171.9 180.25 189.01 197.0 1.7 g 5 3 5 -1 -9 -16 -23 -28 -32 -33 -33 -20 -20 -23 -26 -31 -42 -59 -74 -93 -109 -118 -130.4 -136.54 -141.05 -140.9 -0.1 h 5 3 -33 -32 -33 -34 -38 -44 -53 -64 -75 -67 -87 -98 -117 -126 -139 -152 -151 -154 -153 -143 -133.1 -123.45 -118.06 -119.3 -1.2 g 5 4 -86 -93 -102 -111 -119 -125 -131 -136 -141 -142 -147 -152 -156 -157 -160 -159 -162 -164 -165 -166 -168.6 -168.05 -163.17 -157.5 1.4 h 5 4 -124 -125 -126 -126 -125 -122 -118 -115 -113 -119 -122 -121 -114 -97 -91 -83 -78 -75 -69 -55 -39.3 -19.57 -0.01 16.0 3.4 g 5 5 -16 -26 -38 -51 -62 -69 -74 -76 -76 -82 -76 -69 -63 -62 -56 -49 -48 -46 -36 -17 -12.9 -13.55 -8.03 4.1 3.9 h 5 5 3 11 21 32 43 51 58 64 69 82 80 78 81 81 83 88 92 95 97 107 106.3 103.85 101.04 100.2 0.0 g 6 0 63 62 62 61 61 61 60 59 57 59 54 47 46 45 43 45 48 53 61 68 72.3 73.60 72.78 70.0 -0.3 g 6 1 61 60 58 57 55 54 53 53 54 57 57 57 58 61 64 66 66 65 65 67 68.2 69.56 68.69 67.7 -0.1 h 6 1 -9 -7 -5 -2 0 3 4 4 4 6 -1 -9 -10 -11 -12 -13 -15 -16 -16 -17 -17.4 -20.33 -20.90 -20.8 0.0 g 6 2 -11 -11 -11 -10 -10 -9 -9 -8 -7 6 4 3 1 8 15 28 42 51 59 68 74.2 76.74 75.92 72.7 -0.7 h 6 2 83 86 89 93 96 99 102 104 105 100 99 96 99 100 100 99 93 88 82 72 63.7 54.75 44.18 33.2 -2.1 g 6 3 -217 -221 -224 -228 -233 -238 -242 -246 -249 -246 -247 -247 -237 -228 -212 -198 -192 -185 -178 -170 -160.9 -151.34 -141.40 -129.9 2.1 h 6 3 2 4 5 8 11 14 19 25 33 16 33 48 60 68 72 75 71 69 69 67 65.1 63.63 61.54 58.9 -0.7 g 6 4 -58 -57 -54 -51 -46 -40 -32 -25 -18 -25 -16 -8 -1 4 2 1 4 4 3 -1 -5.9 -14.58 -22.83 -28.9 -1.2 h 6 4 -35 -32 -29 -26 -22 -18 -16 -15 -15 -9 -12 -16 -20 -32 -37 -41 -43 -48 -52 -58 -61.2 -63.53 -66.26 -66.7 0.2 g 6 5 59 57 54 49 44 39 32 25 18 21 12 7 -2 1 3 6 14 16 18 19 16.9 14.58 13.10 13.2 0.3 h 6 5 36 32 28 23 18 13 8 4 0 -16 -12 -12 -11 -8 -6 -4 -2 -1 1 1 0.7 0.24 3.02 7.3 0.9 g 6 6 -90 -92 -95 -98 -101 -103 -104 -106 -107 -104 -105 -107 -113 -111 -112 -111 -108 -102 -96 -93 -90.4 -86.36 -78.09 -70.9 1.6 h 6 6 -69 -67 -65 -62 -57 -52 -46 -40 -33 -39 -30 -24 -17 -7 1 11 17 21 24 36 43.8 50.94 55.40 62.6 1.0 g 7 0 70 70 71 72 73 73 74 74 74 70 65 65 67 75 72 71 72 74 77 77 79.0 79.88 80.44 81.6 0.3 g 7 1 -55 -54 -54 -54 -54 -54 -54 -53 -53 -40 -55 -56 -56 -57 -57 -56 -59 -62 -64 -72 -74.0 -74.46 -75.00 -76.1 -0.2 h 7 1 -45 -46 -47 -48 -49 -50 -51 -52 -52 -45 -35 -50 -55 -61 -70 -77 -82 -83 -80 -69 -64.6 -61.14 -57.80 -54.1 0.8 g 7 2 0 0 1 2 2 3 4 4 4 0 2 2 5 4 1 1 2 3 2 1 0.0 -1.65 -4.55 -6.8 -0.5 h 7 2 -13 -14 -14 -14 -14 -14 -15 -17 -18 -18 -17 -24 -28 -27 -27 -26 -27 -27 -26 -25 -24.2 -22.57 -21.20 -19.5 0.4 g 7 3 34 33 32 31 29 27 25 23 20 0 1 10 15 13 14 16 21 24 26 28 33.3 38.73 45.24 51.8 1.3 h 7 3 -10 -11 -12 -12 -13 -14 -14 -14 -14 2 0 -4 -6 -2 -4 -5 -5 -2 0 4 6.2 6.82 6.54 5.7 -0.2 g 7 4 -41 -41 -40 -38 -37 -35 -34 -33 -31 -29 -40 -32 -32 -26 -22 -14 -12 -6 -1 5 9.1 12.30 14.00 15.0 0.1 h 7 4 -1 0 1 2 4 5 6 7 7 6 10 8 7 6 8 10 16 20 21 24 24.0 25.35 24.96 24.4 -0.3 g 7 5 -21 -20 -19 -18 -16 -14 -12 -11 -9 -10 -7 -11 -7 -6 -2 0 1 4 5 4 6.9 9.37 10.46 9.4 -0.6 h 7 5 28 28 28 28 28 29 29 29 29 28 36 28 23 26 23 22 18 17 17 17 14.8 10.93 7.03 3.4 -0.6 g 7 6 18 18 18 19 19 19 18 18 17 15 5 9 17 13 13 12 11 10 9 8 7.3 5.42 1.64 -2.8 -0.8 h 7 6 -12 -12 -13 -15 -16 -17 -18 -19 -20 -17 -18 -20 -18 -23 -23 -23 -23 -23 -23 -24 -25.4 -26.32 -27.61 -27.4 0.1 g 7 7 6 6 6 6 6 6 6 6 5 29 19 18 8 1 -2 -5 -2 0 0 -2 -1.2 1.94 4.92 6.8 0.2 h 7 7 -22 -22 -22 -22 -22 -21 -20 -19 -19 -22 -16 -18 -17 -12 -11 -12 -10 -7 -4 -6 -5.8 -4.64 -3.28 -2.2 -0.2 g 8 0 11 11 11 11 11 11 11 11 11 13 22 11 15 13 14 14 18 21 23 25 24.4 24.80 24.41 24.2 0.2 g 8 1 8 8 8 8 7 7 7 7 7 7 15 9 6 5 6 6 6 6 5 6 6.6 7.62 8.21 8.8 0.0 h 8 1 8 8 8 8 8 8 8 8 8 12 5 10 11 7 7 6 7 8 10 11 11.9 11.20 10.84 10.1 -0.3 g 8 2 -4 -4 -4 -4 -3 -3 -3 -3 -3 -8 -4 -6 -4 -4 -2 -1 0 0 -1 -6 -9.2 -11.73 -14.50 -16.9 -0.6 h 8 2 -14 -15 -15 -15 -15 -15 -15 -15 -14 -21 -22 -15 -14 -12 -15 -16 -18 -19 -19 -21 -21.5 -20.88 -20.03 -18.3 0.3 g 8 3 -9 -9 -9 -9 -9 -9 -9 -9 -10 -5 -1 -14 -11 -14 -13 -12 -11 -11 -10 -9 -7.9 -6.88 -5.59 -3.2 0.5 h 8 3 7 7 6 6 6 6 5 5 5 -12 0 5 7 9 6 4 4 5 6 8 8.5 9.83 11.83 13.3 0.1 g 8 4 1 1 1 2 2 2 2 1 1 9 11 6 2 0 -3 -8 -7 -9 -12 -14 -16.6 -18.11 -19.34 -20.6 -0.2 h 8 4 -13 -13 -13 -13 -14 -14 -14 -15 -15 -7 -21 -23 -18 -16 -17 -19 -22 -23 -22 -23 -21.5 -19.71 -17.41 -14.6 0.5 g 8 5 2 2 2 3 4 4 5 6 6 7 15 10 10 8 5 4 4 4 3 9 9.1 10.17 11.61 13.4 0.4 h 8 5 5 5 5 5 5 5 5 5 5 2 -8 3 4 4 6 6 9 11 12 15 15.5 16.22 16.71 16.2 -0.2 g 8 6 -9 -8 -8 -8 -7 -7 -6 -6 -5 -10 -13 -7 -5 -1 0 0 3 4 4 6 7.0 9.36 10.85 11.7 0.1 h 8 6 16 16 16 16 17 17 18 18 19 18 17 23 23 24 21 18 16 14 12 11 8.9 7.61 6.96 5.7 -0.3 g 8 7 5 5 5 6 6 7 8 8 9 7 5 6 10 11 11 10 6 4 2 -5 -7.9 -11.25 -14.05 -15.9 -0.4 h 8 7 -5 -5 -5 -5 -5 -5 -5 -5 -5 3 -4 -4 1 -3 -6 -10 -13 -15 -16 -16 -14.9 -12.76 -10.74 -9.1 0.3 g 8 8 8 8 8 8 8 8 8 7 7 2 -1 9 8 4 3 1 -1 -4 -6 -7 -7.0 -4.87 -3.54 -2.0 0.3 h 8 8 -18 -18 -18 -18 -19 -19 -19 -19 -19 -11 -17 -13 -20 -17 -16 -17 -15 -11 -10 -4 -2.1 -0.06 1.64 2.1 0.0 g 9 0 8 8 8 8 8 8 8 8 8 5 3 4 4 8 8 7 5 5 4 4 5.0 5.58 5.50 5.4 0.0 g 9 1 10 10 10 10 10 10 10 10 10 -21 -7 9 6 10 10 10 10 10 9 9 9.4 9.76 9.45 8.8 0.0 h 9 1 -20 -20 -20 -20 -20 -20 -20 -20 -21 -27 -24 -11 -18 -22 -21 -21 -21 -21 -20 -20 -19.7 -20.11 -20.54 -21.6 0.0 g 9 2 1 1 1 1 1 1 1 1 1 1 -1 -4 0 2 2 2 1 1 1 3 3.0 3.58 3.45 3.1 0.0 h 9 2 14 14 14 14 14 14 14 15 15 17 19 12 12 15 16 16 16 15 15 15 13.4 12.69 11.51 10.8 0.0 g 9 3 -11 -11 -11 -11 -11 -11 -12 -12 -12 -11 -25 -5 -9 -13 -12 -12 -12 -12 -12 -10 -8.4 -6.94 -5.27 -3.3 0.0 h 9 3 5 5 5 5 5 5 5 5 5 29 12 7 2 7 6 7 9 9 11 12 12.5 12.67 12.75 11.8 0.0 g 9 4 12 12 12 12 12 12 12 11 11 3 10 2 1 10 10 10 9 9 9 8 6.3 5.01 3.13 0.7 0.0 h 9 4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -9 2 6 0 -4 -4 -4 -5 -6 -7 -6 -6.2 -6.72 -7.14 -6.8 0.0 g 9 5 1 1 1 1 1 1 1 1 1 16 5 4 4 -1 -1 -1 -3 -3 -4 -8 -8.9 -10.76 -12.38 -13.3 0.0 h 9 5 -2 -2 -2 -2 -2 -2 -2 -3 -3 4 2 -2 -3 -5 -5 -5 -6 -6 -7 -8 -8.4 -8.16 -7.42 -6.9 0.0 g 9 6 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -5 1 -1 -1 0 -1 -1 -1 -2 -1 -1.5 -1.25 -0.76 -0.1 0.0 h 9 6 8 8 8 8 9 9 9 9 9 9 8 10 9 10 10 10 9 9 9 8 8.4 8.10 7.97 7.8 0.0 g 9 7 2 2 2 2 2 2 3 3 3 -4 -2 2 -2 5 3 4 7 7 7 10 9.3 8.76 8.43 8.7 0.0 h 9 7 10 10 10 10 10 10 10 11 11 6 8 7 8 10 11 11 10 9 8 5 3.8 2.92 2.14 1.0 0.0 g 9 8 -1 0 0 0 0 0 0 0 1 -3 3 2 3 1 1 1 2 1 1 -2 -4.3 -6.66 -8.42 -9.1 0.0 h 9 8 -2 -2 -2 -2 -2 -2 -2 -2 -2 1 -11 -6 0 -4 -2 -3 -6 -7 -7 -8 -8.2 -7.73 -6.08 -4.0 0.0 g 9 9 -1 -1 -1 -1 -1 -1 -2 -2 -2 -4 8 5 -1 -2 -1 -2 -5 -5 -6 -8 -8.2 -9.22 -10.08 -10.5 0.0 h 9 9 2 2 2 2 2 2 2 2 2 8 -7 5 5 1 1 1 2 2 2 3 4.8 6.01 7.01 8.4 0.0 g 10 0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -8 -3 1 -2 -3 -3 -4 -4 -3 -3 -2.6 -2.17 -1.94 -1.9 0.0 g 10 1 -4 -4 -4 -4 -4 -4 -4 -4 -4 11 4 -5 -3 -3 -3 -3 -4 -4 -4 -6 -6.0 -6.12 -6.24 -6.3 0.0 h 10 1 2 2 2 2 2 2 2 2 2 5 13 -4 4 2 1 1 1 1 2 1 1.7 2.19 2.73 3.2 0.0 g 10 2 2 2 2 2 2 2 2 2 2 1 -1 -1 4 2 2 2 2 3 2 2 1.7 1.42 0.89 0.1 0.0 h 10 2 1 1 1 1 1 1 1 1 1 1 -2 0 1 1 1 1 0 0 1 0 0.0 0.10 -0.10 -0.4 0.0 g 10 3 -5 -5 -5 -5 -5 -5 -5 -5 -5 2 13 2 0 -5 -5 -5 -5 -5 -5 -4 -3.1 -2.35 -1.07 0.5 0.0 h 10 3 2 2 2 2 2 2 2 2 2 -20 -10 -8 0 2 3 3 3 3 3 4 4.0 4.46 4.71 4.6 0.0 g 10 4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -5 -4 -3 -1 -2 -1 -2 -2 -2 -2 -1 -0.5 -0.15 -0.16 -0.5 0.0 h 10 4 6 6 6 6 6 6 6 6 6 -1 2 -2 2 6 4 4 6 6 6 5 4.9 4.76 4.44 4.4 0.0 g 10 5 6 6 6 6 6 6 6 6 6 -1 4 7 4 4 6 5 5 5 4 4 3.7 3.06 2.45 1.8 0.0 h 10 5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -3 -4 -5 -4 -4 -4 -4 -4 -4 -5 -5.9 -6.58 -7.22 -7.9 0.0 g 10 6 4 4 4 4 4 4 4 4 4 8 12 4 6 4 4 4 3 3 3 2 1.0 0.29 -0.33 -0.7 0.0 h 10 6 0 0 0 0 0 0 0 0 0 6 6 1 1 0 0 -1 0 0 0 -1 -1.2 -1.01 -0.96 -0.6 0.0 g 10 7 0 0 0 0 0 0 0 0 0 -1 3 -2 1 0 1 1 1 1 1 2 2.0 2.06 2.13 2.1 0.0 h 10 7 -2 -2 -2 -2 -2 -2 -2 -1 -1 -4 -3 -3 -1 -2 -1 -1 -1 -1 -2 -2 -2.9 -3.47 -3.95 -4.2 0.0 g 10 8 2 2 2 1 1 1 1 2 2 -3 2 6 -1 2 0 0 2 2 3 5 4.2 3.77 3.09 2.4 0.0 h 10 8 4 4 4 4 4 4 4 4 4 -2 6 7 6 3 3 3 4 4 3 1 0.2 -0.86 -1.99 -2.8 0.0 g 10 9 2 2 2 2 3 3 3 3 3 5 10 -2 2 2 3 3 3 3 3 1 0.3 -0.21 -1.03 -1.8 0.0 h 10 9 0 0 0 0 0 0 0 0 0 0 11 -1 0 0 1 1 0 0 -1 -2 -2.2 -2.31 -1.97 -1.2 0.0 g 10 10 0 0 0 0 0 0 0 0 0 -2 3 0 0 0 -1 -1 0 0 0 0 -1.1 -2.09 -2.80 -3.6 0.0 h 10 10 -6 -6 -6 -6 -6 -6 -6 -6 -6 -2 8 -3 -7 -6 -4 -5 -6 -6 -6 -7 -7.4 -7.93 -8.31 -8.7 0.0 g 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7 2.95 3.05 3.1 0.0 g 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.7 -1.60 -1.48 -1.5 0.0 h 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.26 0.13 -0.1 0.0 g 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.88 -2.03 -2.3 0.0 h 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.44 1.67 2.0 0.0 g 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 1.44 1.65 2.0 0.0 h 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.77 -0.66 -0.7 0.0 g 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.31 -0.51 -0.8 0.0 h 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.27 -1.76 -1.1 0.0 g 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.29 0.54 0.6 0.0 h 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.90 0.85 0.8 0.0 g 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.79 -0.79 -0.7 0.0 h 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.58 -0.39 -0.2 0.0 g 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.53 0.37 0.2 0.0 h 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.8 -2.69 -2.51 -2.2 0.0 g 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.7 1.80 1.79 1.7 0.0 h 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.08 -1.27 -1.4 0.0 g 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.16 0.12 -0.2 0.0 h 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.2 -1.58 -2.11 -2.5 0.0 g 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0.96 0.75 0.4 0.0 h 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.90 -1.94 -2.0 0.0 g 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.0 3.99 3.75 3.5 0.0 h 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.39 -1.86 -2.4 0.0 g 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.2 -2.15 -2.12 -1.9 0.0 g 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.29 -0.21 -0.2 0.0 h 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.55 -0.87 -1.1 0.0 g 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.21 0.30 0.4 0.0 h 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.23 0.27 0.4 0.0 g 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.89 1.04 1.2 0.0 h 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 2.38 2.13 1.9 0.0 g 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.38 -0.63 -0.8 0.0 h 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.63 -2.49 -2.2 0.0 g 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.96 0.95 0.9 0.0 h 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.61 0.49 0.3 0.0 g 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.30 -0.11 0.1 0.0 h 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.40 0.59 0.7 0.0 g 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.46 0.52 0.5 0.0 h 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.01 0.00 -0.1 0.0 g 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.35 -0.39 -0.3 0.0 h 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.02 0.13 0.3 0.0 g 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.36 -0.37 -0.4 0.0 h 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.28 0.27 0.2 0.0 g 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 0.08 0.21 0.2 0.0 h 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.87 -0.86 -0.9 0.0 g 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.49 -0.77 -0.9 0.0 h 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.34 -0.23 -0.1 0.0 g 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.08 0.04 0.0 0.0 h 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.88 0.87 0.7 0.0 g 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.16 -0.09 0.0 0.0 g 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.88 -0.89 -0.9 0.0 h 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.76 -0.87 -0.9 0.0 g 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.30 0.31 0.4 0.0 h 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.33 0.30 0.4 0.0 g 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.28 0.42 0.5 0.0 h 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.8 1.72 1.66 1.6 0.0 g 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.43 -0.45 -0.5 0.0 h 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.54 -0.59 -0.5 0.0 g 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.18 1.08 1.0 0.0 h 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0 -1.07 -1.14 -1.2 0.0 g 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.37 -0.31 -0.2 0.0 h 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.04 -0.07 -0.1 0.0 g 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.75 0.78 0.8 0.0 h 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.63 0.54 0.4 0.0 g 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.26 -0.18 -0.1 0.0 h 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.21 0.10 -0.1 0.0 g 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.35 0.38 0.3 0.0 h 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0.53 0.49 0.4 0.0 g 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.05 0.02 0.1 0.0 h 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.38 0.44 0.5 0.0 g 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.41 0.42 0.5 0.0 h 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.22 -0.25 -0.3 0.0 g 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 -0.10 -0.26 -0.4 0.0 h 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.57 -0.53 -0.4 0.0 g 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 -0.18 -0.26 -0.3 0.0 h 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.82 -0.79 -0.8 0.0 therion/geomag/test/0000775000175000017500000000000012447624651013477 5ustar userusertherion/geomag/test/sample_out_IGRF11.txt0000664000175000017500000000530711327634202017353 0ustar useruserDate Coord-System Altitude Latitude Longitude D_deg D_min I_deg I_min H_nT X_nT Y_nT Z_nT F_nT dD_min dI_min dH_nT dX_nT dY_nT dZ_nT dF_nT 2014.5 D K100 70.3 30.8 13d 51m 78d 55m 9987.9 9697.4 2391.4 51022.3 51990.7 10.9 1.0 -10.4 -17.7 28.1 29.0 26.5 2013,10,7 D K100 70.3 30.8 13d 43m 78d 55m 9995.6 9710.4 2370.8 51001.0 51971.3 10.8 1.0 -10.5 -17.7 28.1 29.0 26.5 2012.5 C K6470 70.3 30.8 13d 35m 79d 4m 9814.3 9539.5 2306.2 50782.2 51721.9 11.0 1.1 -10.6 -17.7 28.0 28.7 26.2 2011.5 D M1042 70.3 30.8 14d 11m 78d 53m 10430.7 10112.6 2556.5 53095.2 54110.0 10.6 1.1 -11.1 -18.7 28.6 31.2 28.5 2010.5 D F30000 70.3 30.8 13d 56m 78d 52m 10407.4 10101.0 2506.6 52883.3 53897.6 10.6 1.1 -11.1 -18.6 28.5 31.0 28.3 2013.7 D F30000 -70.3 -30.8 0d -37m -60d 28m 19004.1 19003.0 -201.8 -33538.8 38548.7 -1.8 0.5 -34.1 -34.2 -9.8 70.7 -78.3 2013.7 D F30000 -70,18,0 -30,48,0 0d -37m -60d 28m 19004.1 19003.0 -201.8 -33538.8 38548.7 -1.8 0.5 -34.1 -34.2 -9.8 70.7 -78.3 2013.7 D F30000 43,22,1 -30,8, -11d 17m 59d 30m 23372.8 22921.2 -4572.1 39688.4 46059.3 10.5 -3.7 33.8 47.1 63.8 -40.1 -17.4 2013,4,7 D F30000 43,22,1 -54,36,9 -17d 52m 64d 15m 21481.2 20444.5 -6592.7 44546.1 49455.0 9.6 -5.8 42.2 58.6 44.6 -102.9 -74.3 2013,2,2 D K1.3 48.123 16.123 3d 33m 64d 25m 20929.8 20889.5 1297.7 43706.9 48459.7 7.4 0.3 9.0 6.2 45.3 27.2 28.4 2014,11,19 D K1.3 48.123 16.123 3d 46m 64d 25m 20946.0 20900.6 1378.9 43755.7 48510.8 7.3 0.2 9.2 6.2 45.3 27.2 28.5 2014.8849 D K1.3 48.123 16.123 3d 46m 64d 25m 20946.0 20900.6 1378.9 43755.7 48510.8 7.3 0.2 9.2 6.2 45.3 27.2 28.5 2013,4,7 D F0 43,22,1 -54,36,9 -17d 54m 64d 15m 21580.7 20536.2 -6632.4 44740.5 49673.3 9.7 -5.8 42.4 59.0 44.9 -103.3 -74.6 2010,1,1 D F30000 43,22,1 -54,36,9 -18d 24m 64d 34m 21344.7 20253.2 -6738.2 44881.7 49698.8 9.8 -5.7 41.6 58.6 44.6 -102.9 -74.9 2010,1,1 D F0 0.0 0.0 -6d 6m -29d 10m 27693.0 27535.9 -2945.7 -15457.8 31715.1 8.0 -8.1 -1.1 5.6 64.2 -85.4 40.7 2015,1,1 D F0 0.0 0.0 -5d 26m -29d 51m 27688.8 27564.1 -2624.8 -15884.7 31921.7 8.0 -8.0 -0.4 5.6 64.2 -85.4 42.2 therion/geomag/test/test.py0000775000175000017500000000224612446061375015034 0ustar useruser#!/usr/bin/python import re,datetime,math,geomag units = {'K':1000, 'M':1, 'F':.3048} def deg2rad(s): m = re.match(r'(-?)(\d+)\,(\d+)\,(\d*)',s) if m: tmp = float(m.group(2))+float(m.group(3))/60+float('0'+m.group(4))/3600 if m.group(1) == '-': tmp = -tmp else: tmp = float(s) return tmp/180*math.pi for i,l in enumerate(open('sample_out_IGRF11.txt')): if i==0: continue print '% 2s ' % i, (dat, cs, alt, lat, lon, dd, dm) = l.split()[:7] if cs == 'C': print ' (skipping geocentric coordinates)' continue m = re.match(r'(\d{4}),(\d{1,2}),(\d{1,2})',dat) if m: dat = datetime.datetime(*(int(d) for d in m.groups())) dat = dat.year + (float(dat.timetuple().tm_yday-1) / datetime.datetime(dat.year,12,31).timetuple().tm_yday) else: dat = float(dat) alt = units[alt[0]] * float(alt[1:]) lat = deg2rad(lat) lon = deg2rad(lon) decl = geomag.thgeomag(lat,lon,alt,dat) if decl < 0: res = '-' else: res = '' decl = abs(decl) res += "%dd %dm" % (int(decl),round((decl-int(decl)) * 60)) correct = "%s %s" % (dd,dm) if res == correct: print ' ', else: print '! ', print "%s %s" % (res, correct) therion/geomag/test/geomag.i0000664000175000017500000000011711331610200015057 0ustar useruser%module geomag %{ #include "../../thgeomag.h" %} %include "../../thgeomag.h" therion/geomag/test/build.sh0000775000175000017500000000022512446056547015136 0ustar useruser#!/bin/sh swig -python -c++ geomag.i g++ -shared -fPIC ../../thgeomag.cxx geomag_wrap.cxx -I /usr/include/python2.7 -o _geomag.so rm *wrap* ./test.pytherion/thdb2dcp.cxx0000664000175000017500000000255211575361120013471 0ustar useruser/** * @file thdb2dcp.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2dcp.h" thdb2dcp::thdb2dcp() { this->point = NULL; this->pt = NULL; this->prevcp = NULL; this->nextcp = NULL; this->st = NULL; // this->xst = NULL; this->is_attached = false; this->used_in_attachement = false; this->is_sticky = 0; this->tx = 0.0; this->ty = 0.0; this->dx = 0.0; this->dy = 0.0; this->oxt = 0.0; this->oyt = 0.0; this->tz = 0.0; this->ta = 0.0; } therion/thdb2dji.h0000664000175000017500000000342210721225442013111 0ustar useruser/** * @file thdb2dpt.h * 2D join item class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2dji_h #define thdb2dji_h #include #include "thobjectname.h" /** * 2D join item class. */ class thdb2dji { public: thdb2dji * next_item, ///< Next join item. * prev_item, ///< Prev join item. * prev_list, ///< Previous join list. * next_list, ///< Next join list. * prev_list_item, ///< Prev list item. * next_list_item; ///< Next list item. thobjectname name; ///< Item name. const char * mark; ///< Point mark. bool is_active; ///< Whether join item is active. class thdb2dpt * point, * cp1, * cp2; class thdb2dlp * line_point; class thdataobject * object; thdb2dji(); ///< Default constructor. void parse_item(char * istr); ///< Parse join item. }; typedef std::list thdb2dji_list; ///< Joins list. #endif therion/thexport.h0000664000175000017500000000620712042444006013275 0ustar useruser/** * @file thexport.h * Export class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexport_h #define thexport_h #include #ifndef THMSVC #include #endif #include "thparse.h" #include "thobjectsrc.h" /** * General export options. */ enum { TT_EXP_OPT_UNKNOWN = 0, ///< Unknown option TT_EXP_OPT_OUTPUT, ///< Output option. TT_EXP_OPT_CS, ///< Output coordinate system. }; /** * Options parsing table. */ static const thstok thtt_exp_opt[] = { {"-cs", TT_EXP_OPT_CS}, {"-o", TT_EXP_OPT_OUTPUT}, {"-output", TT_EXP_OPT_OUTPUT}, {NULL, TT_EXP_OPT_UNKNOWN} }; /** * Main export class. */ class thexport { public: friend class thexporter; class thconfig * cfgptr; ///< Current config pointer. int export_mode; ///< Export mode. thobjectsrc src; ///< Export source. class thdatabase * db; ///< Exported database. const char * outpt; ///< Output file name. thbuffer cfgpath; ///< Config path. bool outpt_def; ///< Whether output file defined. int cs; ///< Output coordinate system. public: thexport(); ///< Default constructor. virtual ~thexport(); void assign_config(class thconfig * cptr); ///< ??? /** * Parse format and options. */ virtual void parse(int nargs, char ** args); /** * Parse export arguments. */ virtual void parse_arguments(int & argx, int nargs, char ** args); /** * Parse export options. */ virtual void parse_options(int & argx, int nargs, char ** args); /** * Dump object into file. */ virtual void dump(FILE * xf); /** * Dump object into file. */ virtual void dump_body(FILE * xf); /** * Dump object into file. */ virtual void dump_header(FILE * xf); /** * Make export. */ virtual void process_db(class thdatabase * dbp) = 0; /** * Return path to output file. */ virtual const char * get_output(const char * defname); }; #ifdef THMSVC #define strcasecmp _stricmp #endif #define thexp_set_ext_fmt(extension,cformat) { \ if (strlen(this->outpt) > strlen(extension)) { \ if (strcasecmp(&(this->outpt[strlen(this->outpt) - strlen(extension)]), extension) == 0) { \ this->format = cformat; \ } \ } \ } #endif therion/tharea.cxx0000664000175000017500000001533512043475722013253 0ustar useruser/* * @file tharea.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "tharea.h" #include "thexception.h" #include "thobjectname.h" #include "thchenc.h" #include "thexpmap.h" #include "thline.h" tharea::tharea() { this->type = TT_AREA_TYPE_UNKNOWN; this->place = TT_2DOBJ_PLACE_DEFAULT_BOTTOM; this->first_line = NULL; this->last_line = NULL; this->m_outline_line = NULL; } tharea::~tharea() { if (this->m_outline_line != NULL) delete this->m_outline_line; } void tharea::start_insert() { if (this->type == TT_AREA_TYPE_U) { if (this->m_subtype_str == NULL) ththrow(("missing subtype specification for area of user defined type")) this->db->db2d.register_u_symbol(this->get_class_id(), this->m_subtype_str); } } int tharea::get_class_id() { return TT_AREA_CMD; } bool tharea::is(int class_id) { if (class_id == TT_AREA_CMD) return true; else return th2ddataobject::is(class_id); } int tharea::get_cmd_nargs() { return 1; } const char * tharea::get_cmd_end() { return "endarea"; } const char * tharea::get_cmd_name() { return "area"; } thcmd_option_desc tharea::get_cmd_option_desc(const char * opts) { // int id = thmatch_token(opts, thtt_area_opt); // if (id == TT_AREA_UNKNOWN) return th2ddataobject::get_cmd_option_desc(opts); // else // return thcmd_option_desc(id); } void tharea::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { char * type, * subtype; if (cod.id == 1) cod.id = TT_AREA_TYPE; switch (cod.id) { case 0: thsplit_args(& this->db->db2d.mbf, *args); this->insert_border_line(this->db->db2d.mbf.get_size(), this->db->db2d.mbf.get_buffer()); break; case TT_AREA_TYPE: th2dsplitTT(*args, &type, &subtype); this->parse_type(type); if (strlen(subtype) > 0) this->parse_subtype(subtype); break; default: th2ddataobject::set(cod, args, argenc, indataline); } } void tharea::parse_type(char * tstr) { this->type = thmatch_token(tstr, thtt_area_types); if (this->type == TT_AREA_TYPE_UNKNOWN) ththrow(("unknown area type -- %s", tstr)) if (this->type == TT_AREA_TYPE_DIMENSIONS) ththrow(("area dimensions is not supported as ordinary type")) } void tharea::parse_subtype(char * ststr) { if (this->type == TT_AREA_TYPE_UNKNOWN) ththrow(("area type must be specified before subtype")) if (this->type == TT_AREA_TYPE_U) { this->parse_u_subtype(ststr); return; } else ththrow(("invalid type - subtype combination")) } void tharea::self_delete() { delete this; } void tharea::self_print_properties(FILE * outf) { th2ddataobject::self_print_properties(outf); fprintf(outf,"tharea:\n"); fprintf(outf,"\ttype: %d\n",this->type); if (this->first_line != NULL) { fprintf(outf,"\tborder lines:\n"); thdb2dab * cbl = this->first_line; while (cbl != NULL) { fprintf(outf,"\t\t"); fprintf(outf,cbl->name); fprintf(outf,"\n"); cbl = cbl->next_line; } } } void tharea::insert_border_line(int npars, char ** pars) { thdb2dab * bl; if (npars != 1) ththrow(("one line name per line allowed")) bl = this->db->db2d.insert_border_line(); bl->source = this->db->csrc; thparse_objectname(bl->name,& this->db->buff_stations,*pars); if (this->last_line == NULL) { this->first_line = bl; this->last_line = bl; bl->next_line = NULL; bl->prev_line = NULL; } else { this->last_line->next_line = bl; bl->prev_line = this->last_line; this->last_line = bl; } } bool tharea::export_mp(class thexpmapmpxs * out) { int macroid = SYMA_WATER, omacroid; #define tharea_type_export_mp(type,mid) case type: \ macroid = mid; \ break; switch (this->type) { tharea_type_export_mp(TT_AREA_TYPE_SAND, SYMA_SAND) tharea_type_export_mp(TT_AREA_TYPE_DEBRIS, SYMA_DEBRIS) tharea_type_export_mp(TT_AREA_TYPE_SUMP, SYMA_SUMP) tharea_type_export_mp(TT_AREA_TYPE_WATER, SYMA_WATER) tharea_type_export_mp(TT_AREA_TYPE_BLOCKS, SYMA_BLOCKS) tharea_type_export_mp(TT_AREA_TYPE_SNOW, SYMA_SNOW) tharea_type_export_mp(TT_AREA_TYPE_ICE, SYMA_ICE) tharea_type_export_mp(TT_AREA_TYPE_CLAY, SYMA_CLAY) tharea_type_export_mp(TT_AREA_TYPE_PEBBLES, SYMA_PEBBLES) tharea_type_export_mp(TT_AREA_TYPE_BEDROCK, SYMA_BEDROCK) tharea_type_export_mp(TT_AREA_TYPE_FLOWSTONE, SYMA_FLOWSTONE) tharea_type_export_mp(TT_AREA_TYPE_MOONMILK, SYMA_MOONMILK) tharea_type_export_mp(TT_AREA_TYPE_U, SYMA_U) } omacroid = macroid; if (this->context >= 0) macroid = this->context; if (!out->symset->is_assigned(macroid)) return(false); if (this->first_line == NULL) return(false); if (out->file == NULL) return(true); th2ddataobject::export_mp(out); thdb_revision_set_type::iterator ri = this->db->revision_set.find(threvision(this->id, 0)); fprintf(out->file,"current_src := \"%s [%ld]\";\n", ri->srcf.name, ri->srcf.line); fprintf(out->file,"string area_border[];\n"); thdb2dab * bl = this->first_line; int blnum = 1; while (bl != NULL) { fprintf(out->file,"area_border[%d] := \"%s\";\n", blnum, bl->line->name); bl = bl->next_line; blnum++; } if (this->type == TT_AREA_TYPE_U) { out->symset->export_mp_symbol_options(out->file, -1); fprintf(out->file,"a_u_%s(buildcycle(",this->m_subtype_str); this->db->db2d.use_u_symbol(this->get_class_id(), this->m_subtype_str); } else { out->symset->export_mp_symbol_options(out->file, omacroid); fprintf(out->file,"%s(buildcycle(",out->symset->get_mp_macro(omacroid)); } this->first_line->line->export_path_mp(out); bl = this->first_line->next_line; while (bl != NULL) { fprintf(out->file,",\n"); bl->line->export_path_mp(out); bl = bl->next_line; } fprintf(out->file,"));\n"); th2ddataobject::export_mp_end(out); return(false); } therion/thbezier.h0000664000175000017500000000433511575403650013246 0ustar useruser/** * @file thbezier.h * Bezier curve manipulation class. */ /* Copyright (C) 2007 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thbezier_h #define thbezier_h #include #include #include struct thbezier_point { double m_x, m_y, m_z; bool m_valid; thbezier_point() : m_x(0.0), m_y(0.0), m_z(0.0), m_valid(false) {} thbezier_point(double x, double y, double z = 0.0) : m_x(x), m_y(y), m_z(z), m_valid(true) {} }; struct thbezier_segment { thbezier_point m_cp1, m_cp2, m_p; }; struct thbezier_curve { std::list m_segments; std::list::iterator m_current_segment; void clear(); size_t get_length() {return this->m_segments.size();} thbezier_segment * insert_segment(); thbezier_segment * get_first_segment(); thbezier_segment * get_current_segment(); thbezier_segment * get_next_segment(); void copy_polyline(struct thbezier_polyline * line, double err); }; struct thbezier_polyline { std::list m_points; std::list::iterator m_current_point; void clear(); size_t get_length() {return this->m_points.size();} thbezier_point * insert_point(); thbezier_point * get_first_point(); thbezier_point * get_current_point(); thbezier_point * get_next_point(); void copy_curve(struct thbezier_curve * curve, double err); }; void thbezier_main(); #endif therion/makeconvert2.pl0000775000175000017500000000175610576400772014227 0ustar useruser#!/usr/bin/perl @ls = `ls -1 -R`; @flist = (); $cdir = '.'; foreach $ln (@ls) { if ($ln =~ /(.*)\:$/) { $cdir = $1; } elsif ($ln =~ /\S/) { $ln =~ s/^\s+//; $ln =~ s/\s+$//; if ($ln =~ /(\.th$|\.th2$)/) { push @flist, "$cdir/$ln"; } } } foreach $fn (@flist) { open(FL,"$fn"); @fls = ; close(FL); @flso = (); $toconv = 1; $numch = 0; foreach $fln (@fls) { if ($fln =~ /endcenterline/) { $toconv = 0; } if ($fln =~ /^\s*centerline\s*$/) { $toconv = 0; } if ($fln =~ /^\s*enddata/) { $numch++; $fln =~ s/data/centerline/; } if ($fln =~ /^\s*data\s*$/) { $numch++; $fln =~ s/data/centerline/; } if ($fln =~ /^\s*data\s*(\s+)$/) { if ($1 =~ /^\-/) { $numch++; $fln =~ s/data/centerline/; } } push @flso,$fln; } if ($toconv && ($numch > 0)) { print "$fn ($numch changes)\n"; open(FL,">$fn"); print FL "@flso"; close(FL); } }therion/tex/0000775000175000017500000000000012426431236012051 5ustar userusertherion/tex/Makefile0000664000175000017500000000002507662271312013511 0ustar useruserall: perl gentex.pl therion/tex/gentex.pl0000775000175000017500000000177411131615272013710 0ustar useruser#!/usr/bin/perl sub encodecxx { $str = shift; $str =~ s/\x0D//g; $str =~ s/\x0C//g; $str =~ s/\x0A//g; $str =~ s/\\/\\\\/g; $str =~ s/\n/\\n/g; $str =~ s/\t/\\t/g; $str =~ s/\"/\\"/g; return $str; } print "reading therion.tex\n"; $thtex_library = ""; open(INPT,"therion.tex"); while ($ln = ) { $thtex_library .= "\n\"" . encodecxx($ln) . "\\n\""; } close(INPT); open(OUTPT,">../thtex.h"); print OUTPT <../thtex.cxx"); print OUTPT <}% \newbox\xxx \newbox\mapbox \newbox\navbox \newcount\pointerE \newcount\pointerW \newcount\pointerN \newcount\pointerS \newtoks\pointerU \newtoks\pointerD \newcount\pagenum \newtoks\pagename \newtoks\pagelabel \newtoks\opacity \opacity{0.7} \newtoks\surfaceopacity \surfaceopacity{0.7} \newif\ifpagenumbering \pagenumberingfalse \newtoks\bgcolor \newif\iflegendbgfill \let\ne\noexpand \def\notdef{notdef} % hyperlinks \def\flatlink#1#2#3#4#5{% \setbox\xxx=\hbox{}\wd\xxx=#3bp\ht\xxx=#4bp% \rlap{\kern#1bp\raise#2bp\hbox{% \vbox to0bp{\vss\hbox to 0bp{% \pdfstartlink attr {/Border [0 0 0]} goto name {#5}% \box\xxx\pdfendlink\hss}}}}}% \def\textlink#1#2{% \pdfstartlink attr {/Border [0 0 0]} goto name {#2}#1\pdfendlink}% \def\includechars#1:#2\endinclude{\pdfincludechars#1{#2}} \newbox\tmpboxa \newbox\tmpboxb \newdimen\legendsymbolwd \newdimen\legendsymbolht \legendsymbolht=12pt \newdimen\tmpdimen \def\legendsymbolbox#1#2{% \setbox\tmpboxa=\hbox{\pdfrefxform#1}% \setbox\tmpboxb=\hbox{\the\legendtextsize(}% \legendsymbolwd=\wd\tmpboxa \legendsymbolht=\ht\tmpboxa \advance\legendsymbolht by -\ht\tmpboxb \advance\legendsymbolht by -1dd \tmpdimen=\hsize \advance\tmpdimen by 10pt \divide\tmpdimen by\legendcolumns \advance\tmpdimen by-10pt \hbox to \tmpdimen{% \box\tmpboxa\kern10pt\raise\legendsymbolht\vtop{% \advance\tmpdimen by -\legendsymbolwd \advance\tmpdimen by -10pt \hsize=\tmpdimen\rightskip=0pt plus \tmpdimen minus 0pt\relax\the\legendtextsize #2\vskip1dd}\hss}% } \def\colorlegendbox#1#2#3{% \setbox\xxx=\hbox to 36bp{\PL{q #1 #2 #3 rg 0 0 36 24 re f Q}\hfil}% \ht\xxx=25bp\dp\xxx=0bp \immediate\pdfxform\xxx } \let\PL\pdfliteral \newdimen\xcorr \newdimen\ycorr \def\PB#1#2#3{\rlap{\kern#1bp\raise#2bp\hbox{\pdfrefxform#3}}} %placebox \def\gridcoord#1#2{\hbox to0pt{% \ifnum#1=1\hss\fi \ifnum#1=4\hss\fi \ifnum#1=7\hss\fi \ifnum#1=8\hss\fi \ifnum#1=2\hss\fi \vbox to0pt{% \ifnum#1>3\vss\fi \kern2pt% \hbox{\kern2pt#2\kern2pt}% \kern2pt% \ifnum#1<7\vss\fi }% \ifnum#1=3\hss\fi \ifnum#1=6\hss\fi \ifnum#1=9\hss\fi \ifnum#1=8\hss\fi \ifnum#1=2\hss\fi }% } \def\PBcorr#1#2#3{% \xcorr=#1bp\advance\xcorr by\extraW\advance\xcorr by\overlap% \ycorr=#2bp\advance\ycorr by\extraS\advance\ycorr by\overlap% \rlap{\kern\xcorr\raise\ycorr\hbox{\pdfrefxform#3}}} %placebox \def\bitmap#1#2#3#4#5#6#7{% \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}% \rlap{\pdfrefximage#7}% \pdfliteral{Q}% } \def\bitmapcorr#1#2#3#4#5#6#7{% \xcorr=0bp\advance\xcorr by\extraW\advance\xcorr by\overlap \ycorr=0bp\advance\ycorr by\extraS\advance\ycorr by\overlap \dimtobp{\xcorr}\edef\wdth{\tmpdef}% \dimtobp{\ycorr}\edef\hght{\tmpdef}% \pdfliteral{q 1 0 0 1 \wdth\space\hght\space cm #1 #2 #3 #4 #5 #6 cm}% two-step transformation to avoid overflow \rlap{\pdfrefximage#7}% \pdfliteral{Q}% } \newdimen\tmpdimenX \newdimen\tmpdimenY \def\calibrX#1{\tmpdimen=#1\advance\tmpdimen by\overlap\advance\tmpdimen by\extraW} \def\calibrY#1{\tmpdimen=#1\advance\tmpdimen by\overlap\advance\tmpdimen by\extraS} \def\TITLE#1{\eject\hbox{}\vskip5cm\centerline{\size[24]#1}\vfil\eject} % processing of the E-W-N-S references \def\showpointer#1{\ifnum\the#1=0\else\the#1\fi} % processing of the up and down references \def\showpointerlist#1{\edef\test{\the#1}\ifx\test\notdef\else \expandafter\process\the#1\endarg\fi} \def\process#1||#2\endarg{ \expandafter\processpointeritem#1\endarg% \if@#2@\def\next##1\endarg{} \else\let\next=\process\fi \next#2\endarg} \def\processpointeritem#1|#2|#3\endarg{\hbox{\textlink{\arr\ #2 (#1)}{#3}}} \def\arr{} % to be redefined in the \dopage macro \def\pagesetup#1#2#3#4#5#6{ \pdfpagewidth#1 \pdfpageheight#2 \hsize#3 \vsize#4 \pdfhorigin#5 \pdfvorigin#6 \hoffset0pt \voffset0pt\relax } \def\linestyle{1 J 1 j 1.5 w} \def\framed#1{% \dimtobp{\wd#1}\edef\wdth{\tmpdef}% \dimtobp{\ht#1}\edef\hght{\tmpdef}% \hbox to \wd#1{\rlap{\box#1}\PL{q \linestyle\space 0 0 \wdth\space\hght\space re S Q}\hfill}% } {\catcode`\p=12\catcode`\t=12\gdef\SKIPPT#1pt{#1}} \def\dimtobp#1{% \tmpdimen=#1% \tmpdimen=0.996264\tmpdimen \edef\tmpdef{\the\tmpdimen}% \edef\tmpdef{\expandafter\SKIPPT\tmpdef}% } \def\color[#1 #2 #3]{% \tmpdimen=#1pt% \divide\tmpdimen100 \edef\tmpdef{\the\tmpdimen}% \edef\tmpdef{\expandafter\SKIPPT\tmpdef}% \pdfliteral{\tmpdef}% \tmpdimen=#2pt% \divide\tmpdimen100 \edef\tmpdef{\the\tmpdimen}% \edef\tmpdef{\expandafter\SKIPPT\tmpdef}% \pdfliteral{\tmpdef}% \tmpdimen=#3pt% \divide\tmpdimen100 \edef\tmpdef{\the\tmpdimen}% \edef\tmpdef{\expandafter\SKIPPT\tmpdef}% \pdfliteral{\tmpdef}% \pdfliteral{rg} } % actual placing of the page elements \def\dopage{% \vbox{\centerline{\framed{\mapbox}} \bigskip \line{% \vbox to \ht\navbox{ \hbox{\size[20]\the\pagelabel \ifpagenumbering\space(\the\pagenum)\fi \space\size[16]\the\pagename} \ifpagenumbering \medskip \hbox{\qquad\qquad \vtop{% \hbox to 0pt{\hss\showpointer\pointerN\hss} \hbox to 0pt{\llap{\showpointer\pointerW\hskip0.7em}% \raise1pt\hbox to 0pt{\hss$\updownarrow$\hss}% \raise1pt\hbox to 0pt{\hss$\leftrightarrow$\hss}% \rlap{\hskip0.7em\showpointer\pointerE}} \hbox to 0pt{\hss\showpointer\pointerS\hss} }\qquad\qquad \vtop{ \def\arr{$\uparrow$} \showpointerlist\pointerU \def\arr{$\downarrow$} \showpointerlist\pointerD } } \fi \vss } \hss \vbox to \ht\navbox{ \ifnortharrow\hbox to 0pt{\hss\northarrow\qquad}\fi \vss \ifscalebar\hbox to 0pt{\hss\scalebar\qquad}\fi } \box\navbox } } } \newif\iflegend \newif\ifcolorlegend \newtoks\legendcontent \newtoks\cavename \newtoks\comment \newtoks\legendtitle \newtoks\colorlegendtitle \newif\ifnortharrow \newif\ifscalebar \newtoks\explotitle \newtoks\explodate \newtoks\exploteam \newtoks\topotitle \newtoks\topodate \newtoks\topoteam \newtoks\cartotitle \newtoks\cartodate \newtoks\cartoteam \newtoks\copyrights \newtoks\cavelength \newtoks\cavedepth \newtoks\cavelengthtitle \newtoks\cavedepthtitle \newtoks\cavemaxx \newtoks\caveminx \newtoks\cavemaxy \newtoks\caveminy \newtoks\cavemaxz \newtoks\caveminz \newtoks\thversion \newtoks\outcscode \newtoks\outcsname \newtoks\northdir \newtoks\magdecl \newtoks\gridconv \newtoks\currentdate \newtoks\legendtextcolor\legendtextcolor={\color[0 0 0]} \newtoks\legendtextsize\legendtextsize={\size[12]} \newtoks\legendtextheadersize\legendtextheadersize={\size[26]} \newtoks\legendtextsectionsize\legendtextsectionsize={\size[14]} \def\scalebar{\pdfrefxform\THWscalebar} \def\northarrow{\pdfrefxform\THWnortharrow} \newdimen\legendwidth %\legendwidth=14cm \newcount\legendcolumns \legendcolumns=2 \legendcontent={% \hsize=\legendwidth \color[0 0 0]\the\legendtextcolor \ifnortharrow\vbox to 0pt{\line{\hfil\northarrow}\vss}\fi \edef\tmp{\the\cavename} \ifx\tmp\empty \else {\the\legendtextheadersize\the\cavename}\vskip1cm \fi \ifscalebar\scalebar\vskip1cm\fi {\rightskip=0pt plus 3em\parskip=3bp \edef\tmp{\the\comment} \ifx\tmp\empty \else {\the\legendtextsize\the\comment} \par\medskip \fi \everypar{\hangindent=2em\hangafter=1} \edef\tmp{\the\cavelength} \ifx\tmp\empty \else {\the\legendtextsize\si\the\cavelengthtitle: \ss\the\cavelength\par} \fi \edef\tmp{\the\cavedepth} \ifx\tmp\empty \else {\the\legendtextsize\si\the\cavedepthtitle: \ss\the\cavedepth\par} \fi \edef\tmp{\the\exploteam} \ifx\tmp\empty \else {\the\legendtextsize\si\the\explotitle: \ss\the\exploteam\quad\si\the\explodate\par} \fi \edef\tmp{\the\topoteam} \ifx\tmp\empty \else {\the\legendtextsize\si\the\topotitle: \ss\the\topoteam\quad\si\the\topodate\par} \fi \edef\tmp{\the\cartoteam} \ifx\tmp\empty \else {\the\legendtextsize\si\the\cartotitle: \ss\the\cartoteam\quad\si\the\cartodate\par} \fi \edef\tmp{\the\copyrights} \ifx\tmp\empty \else {\the\legendtextsize\ss\the\copyrights\par} \fi } \formattedlegend \color[0 0 0] } \def\maplayout{ \legendbox{NW}{\the\legendcontent} \legendbox{NE}{\northarrow} } \def\formattedlegend{% \ifcolorlegend \vskip1cm{\the\legendtextsectionsize\the\colorlegendtitle}\bigskip \insertcolorlegend \fi \iflegend \vskip1cm{\the\legendtextsectionsize\the\legendtitle}\bigskip \insertlegend \fi} \let\atlaslegend=\formattedlegend \def\atlastitlepages{ \edef\tmp{\the\cavename} \ifx\tmp\empty \else \TITLE{\the\cavename} \fi {\rightskip=0pt plus 3em\parskip=3bp \edef\tmp{\the\comment} \ifx\tmp\empty \else {\size[12]\the\comment} \par\medskip \fi \everypar{\hangindent=2em\hangafter=1} \edef\tmp{\the\exploteam} \ifx\tmp\empty \else {\size[12]\si\the\explotitle: \ss\the\exploteam\par} \fi \edef\tmp{\the\topoteam} \ifx\tmp\empty \else {\size[12]\si\the\topotitle: \ss\the\topoteam\par} \fi \edef\tmp{\the\cartoteam} \ifx\tmp\empty \else {\size[12]\si\the\cartotitle: \ss\the\cartoteam\par} \fi \edef\tmp{\the\copyrights} \ifx\tmp\empty \else {\size[12]\ss\the\copyrights\par} \fi \edef\tmp{\the\cavelength} \ifx\tmp\empty \else {\the\legendtextsize\si\the\cavelengthtitle: \ss\the\cavelength\par} \fi \edef\tmp{\the\cavedepth} \ifx\tmp\empty \else {\the\legendtextsize\si\the\cavedepthtitle: \ss\the\cavedepth\par} \fi } } \newdimen\sx \newdimen\sy \newdimen\sxd \newdimen\syd \def\LEGN{N} \def\LEGE{E} \def\LEGW{W} \def\LEGS{S} \def\LEGNE{NE} \def\LEGNW{NW} \def\LEGSE{SE} \def\LEGSW{SW} \def\LEGC{C} \newdimen\extraN \extraN=0mm \newdimen\extraS \extraS=0mm \newdimen\extraE \extraE=0mm \newdimen\extraW \extraW=0mm \newdimen\adjustedHS \newdimen\adjustedVS \newdimen\adjustedX \newdimen\adjustedY \newdimen\framethickness\framethickness=0cm \def\legendbox#1#2#3#4{% \unskip \setbox\tmpboxa=\vbox{#4}% \sx=\wd\tmpboxa \sy=\ht\tmpboxa \advance\sy by \dp\tmpboxa \sxd=\hsize \divide\sxd by 100 \sxd=#1\sxd \syd=\vsize \divide\syd by 100 \syd=#2\syd \edef\test{#3}% \ifx\test\LEGN \divide\sx by 2 \advance\sxd by -\sx \advance\syd by -\sy \else\ifx\test\LEGW \divide\sy by 2 \advance\syd by -\sy \else\ifx\test\LEGE \advance\sxd by -\sx \divide\sy by 2 \advance\syd by -\sy \else\ifx\test\LEGS \divide\sx by 2 \advance\sxd by -\sx \else\ifx\test\LEGNW \advance\syd by -\sy \else\ifx\test\LEGNE \advance\sxd by -\sx \advance\syd by -\sy \else\ifx\test\LEGSW \else\ifx\test\LEGSE \advance\sxd by -\sx \else\ifx\test\LEGC \divide\sx by 2 \advance\sxd by -\sx \divide\sy by 2 \advance\syd by -\sy \fi\fi\fi\fi\fi\fi\fi\fi\fi % \ifdim\sxd<-\extraW \global\extraW=-\sxd\fi \ifdim\syd<-\extraS \global\extraS=-\syd\fi \sx=\wd\tmpboxa \sy=\ht\tmpboxa \advance\sy by \dp\tmpboxa \advance\sx by \sxd \advance\sx by -\hsize \advance\sy by \syd \advance\sy by -\vsize \ifdim\sx>\extraE \global\extraE=\sx \fi \ifdim\sy>\extraN \global\extraN=\sy \fi % \unskip % \advance\sxd by \extraW -- presunute do thpdf.cxx % \advance\syd by \extraS % vypln pod legendou \iflegendbgfill \begingroup \advance\sxd-1cm \advance\syd-1cm \sx=\wd\tmpboxa \advance\sx by 2cm \dimtobp{\sxd}\edef\shiftx{\tmpdef}% \dimtobp{\syd}\edef\shifty{\tmpdef}% % \dimtobp{\wd\tmpboxa}\edef\wdth{\tmpdef}% \dimtobp{\sx}\edef\wdth{\tmpdef}% \sy=\ht\tmpboxa \advance\sy by \dp\tmpboxa \advance\sy by 2 cm \dimtobp{\sy}\edef\hght{\tmpdef}% \rlap{\PL{q \the\bgcolor\space rg \shiftx\space \shifty\space \wdth\space \hght\space re f Q}}% \endgroup \fi % \advance\syd by \dp\tmpboxa \rlap{\kern\sxd\raise\syd\box\tmpboxa}% \ignorespaces } \def\loadpicture#1{\pdfximage{#1}\pdfrefximage\pdflastximage} \def\insertmaps{% \color[0 0 0] \input th_formdef \input th_pagedef \input th_pages \immediate\write-1{ \the\count10 \space numeric registers used out of \ifx\eTeXversion\undefined256\else32768\fi} } \def\insertlegend{% \input th_legend } \def\insertcolorlegend{% \input th_legendcolor } \def\insertkeyplan#1#2{% \tmpdimen=#1 \tmpdimen=2\tmpdimen \setbox0=\hbox{\pdfximage width \tmpdimen {#2}\pdfrefximage\pdflastximage} % \pdfxform0\keyplan=\pdflastxform \setbox1=\hbox to #1 {\copy0\hss} \setbox2=\hbox to #1 {\hss\box0} \eject \ifodd\pageno\hbox{}\vfil\eject\fi \line{\hss\pdfxform1\pdfrefxform\pdflastxform} \vfil \eject \line{\pdfxform2\pdfrefxform\pdflastxform\hss} \vfil \eject } \newcount\stopcount \newcount\stoprow \newcount\rows \newcount\rowstmp \newcount\i \newcount\j \def\placemaps{ \message{ [Warning: \string\placemaps\space is deprecated; use \string\insertmaps] } \insertmaps } %% Petr Olsak's multicolumn macros (slightly modified) \newdimen\colsep \colsep=1em % horiz. mezera mezi sloupci \newcount\tempnum % pracovní promìnná \splittopskip=\baselineskip \def\roundtolines #1{%% zaokrouhlí na celé násobky vel. øádku \divide #1 by\baselineskip \multiply #1 by\baselineskip} \def\corrsize #1{%% #1 := #1 + \splittopskip - \topskip \advance #1 by \splittopskip \advance #1 by-\topskip} \def\begmulti#1{\par\bigskip\penalty0 \def\Ncols{#1} \setbox0=\vbox\bgroup\penalty0 %% \hsize := ¹íøka sloupce = (\hsize+\colsep) / n - \colsep \advance\hsize by\colsep \divide\hsize by\Ncols \advance\hsize by-\colsep} \def\endmulti{\vfil\egroup \setbox1=\vsplit0 to0pt %% \dimen1 := velikost zbylého místa na stránce \ifdim\pagegoal=\maxdimen \dimen1=\vsize \corrsize{\dimen1} \else \dimen1=\pagegoal \advance\dimen1 by-\pagetotal \fi \ifdim \dimen1<2\baselineskip \vfil\break \dimen1=\vsize \corrsize{\dimen1} \fi %% \dimen0 := vý¹ka n sloupcové sazby po rozdìlení do sloupcù %% = (\ht0 + (n-1)\baselineskip) / n, zaokruhleno na øádky \dimen0=\Ncols\baselineskip \advance\dimen0 by-\baselineskip \advance\dimen0 by \ht0 \divide\dimen0 by\Ncols \roundtolines{\dimen0} %% Rozdìlit sazbu n sloupcù do stránek nebo nerozdìlit ? \ifdim \dimen0>\dimen1 \splitpart \else \makecolumns{\dimen0} \fi \ifvoid0 \else \errmessage{Lost text in multiple columns?} \fi \bigskip} \def\makecolumns#1{\setbox1=\hbox{}\tempnum=0 \loop \ifnum\Ncols>\tempnum \setbox1=\hbox{\unhbox1 \vsplit0 to#1 \hss} \advance\tempnum by1 \repeat \hbox{}\nobreak\vskip-\splittopskip \nointerlineskip \line{\unhbox1\unskip}} \def\splitpart{\roundtolines{\dimen1} \makecolumns{\dimen1} \advance\dimen0 by-\dimen1 %% \dimen0 := vý¹ka _zbylé_ n sloupcové sazby %% \dimen1 := prázdné místo na stránce = (cca) \vsize \vfil\break \dimen1=\vsize \corrsize{\dimen1} %% Rozdìlit zbylou sazbu n sloupcù do více stránek ? \ifvoid0 \else \ifdim \dimen0>\dimen1 \splitpart \else \makecolumns{\dimen0} \fi \fi} %% end of multicolumn macros \input th_enc \input th_texts \input th_resources \input th_fontdef \nonstopmode therion/thexpshp.cxx0000664000175000017500000005557412010660372013652 0ustar useruser/** * @file thexpshp.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexpmap.h" #include "thexporter.h" #include "thexception.h" #include "thdatabase.h" #include "thdb2d.h" #include "thdb2dmi.h" #include "thlayout.h" #include "thmap.h" #include "thsketch.h" #include "thconfig.h" #include #include "thtmpdir.h" #ifndef THMSVC #include #include #else #include #define mkdir _mkdir #define getcwd _getcwd #define chdir _chdir #define putenv _putenv #define hypot _hypot #define S_ISDIR(v) (((v) | _S_IFDIR) != 0) #endif #include "thchenc.h" #include "thdb1d.h" #include "thinit.h" #include "thlogfile.h" #include "thcmdline.h" #include "thsurvey.h" #include "thchenc.h" #include #include "thmapstat.h" #include "thsurface.h" #include #include "loch/lxMath.h" #include "extern/shapefil.h" #include "thexpmodel.h" #include "thcsdata.h" #include #include #include #include #include "thcs.h" #ifdef THMSVC #define snprintf _snprintf #define strcasecmp _stricmp #endif #include "thexpshp.h" thexpshpf::thexpshpf() { this->m_fnm = "default"; this->m_fpath = NULL; this->m_is_open = false; this->m_xshp = NULL; this->m_type = SHPT_NULL; this->m_object_id = -1; this->m_num_objects = 0; } bool thexpshpf::open() { if (this->m_is_open) return true; // set file path this->m_is_open = false; thbuffer fp; fp = this->m_xshp->m_dirname; fp += "/"; fp += this->m_fnm; this->m_fpath = thdb.strstore(fp); this->m_hndl = SHPCreate(this->m_fpath, this->m_type); if (this->m_hndl == NULL) return false; this->m_is_open = true; return true; } void thexpshpf::close() { if (this->m_is_open) { SHPClose(this->m_hndl); std::string dbfname(this->m_fpath); dbfname += ".dbf"; int enc = TT_UTF_8; if (this->m_xshp != NULL) { if (this->m_xshp->m_expmap != NULL) enc = this->m_xshp->m_expmap->encoding; if (this->m_xshp->m_expmodel != NULL) enc = this->m_xshp->m_expmodel->encoding; } this->m_attributes.export_dbf(dbfname.c_str(), enc); if ((thcfg.outcs != TTCS_LOCAL) && (strlen(thcs_get_data(thcfg.outcs)->prjspec) > 0)) { FILE * prjf; std::string prjname(this->m_fpath); prjname += ".prj"; prjf = fopen(prjname.c_str(), "w"); fprintf(prjf, "%s", thcs_get_data(thcfg.outcs)->prjspec); fclose(prjf); } } } void thexpshpf::init(thexpshp * xshp, const char * fnm, int type) { this->m_fnm = fnm; this->m_fpath = NULL; this->m_xshp = xshp; this->m_type = type; } thexpshp::thexpshp() { this->m_dirname = NULL; this->m_xproj = NULL; this->m_expmap = NULL; this->m_expmodel = NULL; this->m_fscrap.init(this, "outline2d", SHPT_POLYGONZ); this->m_fpoints.init(this, "points2d", SHPT_POINTZ); this->m_flines.init(this, "lines2d", SHPT_ARCZ); this->m_fareas.init(this, "areas2d", SHPT_POLYGONZ); this->m_fstations3D.init(this, "stations3d", SHPT_POINTZ); this->m_fshots3D.init(this, "shots3d", SHPT_ARCZ); this->m_fwalls3D.init(this, "walls3d", SHPT_MULTIPATCH); } bool thexpshp::open(const char * dirname) { // create directory #ifdef THWIN32 if (mkdir(dirname) != 0) { #else if (mkdir(dirname,0046750) != 0) { #endif struct #ifdef THMSVC _stat #else stat #endif buf; #ifdef THMSVC _stat #else stat #endif (dirname,&buf); if ((errno == EEXIST) && (S_ISDIR(buf.st_mode))) { // directory already exists } else { return false; } } // save dir name this->m_dirname = dirname; return true; } void thexpshp::close() { this->m_fscrap.close(); this->m_fstations3D.close(); this->m_fshots3D.close(); this->m_fwalls3D.close(); this->m_fpoints.close(); this->m_flines.close(); this->m_fareas.close(); } void thexpshpf::object_clear() { this->m_point_list.clear(); this->m_part_list.clear(); } void thexpshpf::object_insert() { this->m_object_id = -1; if (!this->open()) return; size_t l = this->m_point_list.size(); if (l == 0) return; size_t lp = this->m_part_list.size(); int * apstart, * aptype; double * ax, * ay, * az, * am; ax = new double [l]; ay = new double [l]; az = new double [l]; am = new double [l]; size_t i; std::list::iterator ipoint; std::list::iterator ipart; for (i = 0, ipoint = this->m_point_list.begin(); ipoint != this->m_point_list.end(); ipoint++, i++) { ax[i] = ipoint->m_x; ay[i] = ipoint->m_y; az[i] = ipoint->m_z; am[i] = ipoint->m_m; } if (lp > 0) { apstart = new int [lp]; aptype = new int [lp]; for (i = 0, ipart = this->m_part_list.begin(); ipart != this->m_part_list.end(); ipart++, i++) { apstart[i] = ipart->m_start; aptype[i] = ipart->m_type; } } else { apstart = NULL; aptype = NULL; } SHPObject * obj; obj = SHPCreateObject( this->m_type, -1, (int) lp, apstart, aptype, (int) l, ax, ay, az, am); this->m_object_id = SHPWriteObject(this->m_hndl, -1, obj); if (this->m_object_id > -1) this->m_attributes.insert_object(NULL, this->m_object_id); SHPDestroyObject(obj); if (lp > 0) { delete [] apstart; delete [] aptype; } delete [] ax; delete [] ay; delete [] az; delete [] am; this->m_num_objects++; this->object_clear(); } void thexpshpf::polygon_start_ring(bool outer) { this->m_ring_list.clear(); this->m_ring_outer = outer; thexpshpf_part p; p.m_start = (int) this->m_point_list.size(); if (outer) p.m_type = SHPP_OUTERRING; else p.m_type = SHPP_INNERRING; this->m_part_list.push_back(p); } void thexpshpf::tristrip_start() { this->m_ring_list.clear(); thexpshpf_part p; p.m_start = (int) this->m_point_list.size(); p.m_type = SHPP_TRISTRIP; this->m_part_list.push_back(p); } // insert points from bezier curve void insert_line_segment(thline * ln, bool reverse, std::list & lst, long startp = 0, long endp = -1) { thdb2dlp * cpt, * prevpt; thdb2dpt * cp1, * cp2; double t, tt, ttt, t_, tt_, ttt_, nx, ny, nz, na, px, py; long pnum; prevpt = NULL; if (reverse) cpt = ln->last_point; else cpt = ln->first_point; pnum = 0; while (cpt != NULL) { // insert bezier curve if (pnum == startp) prevpt = NULL; if ((pnum >= startp) && ((endp < 0) || (pnum <= endp))) { if (prevpt != NULL) { px = prevpt->point->xt; py = prevpt->point->yt; if (reverse) { cp1 = prevpt->cp2; cp2 = prevpt->cp1; } else { cp1 = cpt->cp1; cp2 = cpt->cp2; } if ((cp1 != NULL) && (cp2 == NULL)) cp2 = cp1; if ((cp1 == NULL) && (cp2 != NULL)) cp1 = cp2; if ((cp1 != NULL) && (cp2 != NULL)) { for(t = 0.05; t < 1.0; t += 0.05) { tt = t * t; ttt = tt * t; t_ = 1.0 - t; tt_ = t_ * t_; ttt_ = tt_ * t_; nx = ttt_ * prevpt->point->xt + 3.0 * t * tt_ * cp1->xt + 3.0 * tt * t_ * cp2->xt + ttt * cpt->point->xt; ny = ttt_ * prevpt->point->yt + 3.0 * t * tt_ * cp1->yt + 3.0 * tt * t_ * cp2->yt + ttt * cpt->point->yt; nz = t_ * cpt->point->zt + t * prevpt->point->zt; na = t_ * cpt->point->at + t * prevpt->point->at; // resolution 0.1 m if (hypot(nx - px, ny - py) > 0.1) { lst.push_back(thexpshpf_data(nx + ln->fscrapptr->proj->rshift_x, ny + ln->fscrapptr->proj->rshift_y, nz + ln->fscrapptr->proj->rshift_z, na)); px = nx; py = ny; } } } } } // insert point it self if ((pnum >= startp) && ((endp < 0) || (pnum <= endp))) lst.push_back(thexpshpf_data(cpt->point->xt + ln->fscrapptr->proj->rshift_x, cpt->point->yt + ln->fscrapptr->proj->rshift_y, cpt->point->zt + ln->fscrapptr->proj->rshift_z, cpt->point->at)); // next point prevpt = cpt; if (reverse) cpt = cpt->prevlp; else cpt = cpt->nextlp; pnum++; } } void thexpshpf::polygon_insert_line(thline * ln, bool reverse) { insert_line_segment(ln, reverse, this->m_ring_list); } void thexpshpf::point_insert(double x, double y, double z, double m) { this->m_point_list.push_back(thexpshpf_data(x,y,z,m)); } void thexpshpf::polygon_close_ring() { // check polygon orientation double area; std::list::iterator i, iprev; if (this->m_ring_list.size() < 2) return; iprev = this->m_ring_list.end(); iprev--; area = 0.0; for (i = this->m_ring_list.begin(); i != this->m_ring_list.end(); i++) { area += iprev->m_x * i->m_y - iprev->m_y * i->m_x; iprev = i; } area *= 0.5; bool reverse = ((area > 0) && m_ring_outer) || ((area < 0) && (!m_ring_outer)); // according to orientation, insert points to point list if (reverse) { for(i = this->m_ring_list.end(); i != this->m_ring_list.begin(); ) { i--; this->m_point_list.push_back(*i); } } else { for(i = this->m_ring_list.begin(); i != this->m_ring_list.end(); i++) { this->m_point_list.push_back(*i); } } } void thexpshp::xscrap2d(thscrap * scrap, thdb2dxm * xmap, thdb2dxs * xbasic) { thbuffer stnbuff; // export scrap outline this->m_fscrap.object_clear(); thscraplo * lo = scrap->get_outline(), * lo2; while (lo != NULL) { if (lo->line->outline != TT_LINE_OUTLINE_NONE) { lo2 = lo; this->m_fscrap.polygon_start_ring(lo->line->outline == TT_LINE_OUTLINE_OUT); while (lo2 != NULL) { this->m_fscrap.polygon_insert_line(lo2->line, lo2->mode == TT_OUTLINE_REVERSED); lo2 = lo2->next_line; } this->m_fscrap.polygon_close_ring(); } lo = lo->next_outline; } this->m_fscrap.object_insert(); if (this->m_fscrap.m_object_id > -1) { // system attributes this->m_fscrap.m_attributes.insert_attribute("_ID", (long) scrap->id); this->m_fscrap.m_attributes.insert_attribute("_NAME", scrap->name); this->m_fscrap.m_attributes.insert_attribute("_TITLE", scrap->title); this->m_fscrap.m_attributes.insert_attribute("_MAP_ID", (long) xmap->map->id); this->m_fscrap.m_attributes.insert_attribute("_MAP_LEVEL", (long) xmap->output_number); this->m_fscrap.m_attributes.insert_attribute("_MAP_TITLE", xmap->map->title); this->m_fscrap.m_attributes.insert_attribute("_SURVEY", scrap->fsptr->get_full_name()); if (this->m_xproj->type == TT_2DPROJ_PLAN) this->m_fscrap.m_attributes.insert_attribute("_Z", scrap->z + this->m_xproj->shift_z); // user defined attributes this->m_fscrap.m_attributes.copy_attributes(thdb.attr.get_object(scrap->id)); } // export centerline thscraplp * slp; slp = scrap->get_polygon(); while (slp != NULL) { if (slp->lnio) { this->m_flines.point_insert(slp->lnx1 + scrap->proj->rshift_x, slp->lny1 + scrap->proj->rshift_y, slp->lnz1 + scrap->proj->rshift_z); this->m_flines.point_insert(slp->lnx2 + scrap->proj->rshift_x, slp->lny2 + scrap->proj->rshift_y, slp->lnz2 + scrap->proj->rshift_z); this->m_flines.object_insert(); this->m_flines.m_attributes.insert_attribute("_SCRAP_ID",(long) scrap->id); this->m_flines.m_attributes.insert_attribute("_TYPE","centerline"); } else { this->m_fpoints.point_insert(slp->stx + scrap->proj->rshift_x, slp->sty + scrap->proj->rshift_y, slp->stz + scrap->proj->rshift_z); this->m_fpoints.object_insert(); this->m_fpoints.m_attributes.insert_attribute("_SCRAP_ID",(long) scrap->id); this->m_fpoints.m_attributes.insert_attribute("_TYPE","station"); this->m_fpoints.m_attributes.insert_attribute("_NAME",slp->station->name); this->m_fpoints.m_attributes.insert_attribute("_COMMENT",slp->station->comment); } slp = slp->next_item; } // export objects th2ddataobject * obj; thpoint * ppt; thline * pln; tharea * parea; obj = scrap->ls2doptr; long sp, cp, symid; int csubtype; thdb2dlp * lp; char typefc[2]; typefc[1] = 0; std::string tststr, tstr; const char * ststr; while (obj != NULL) { switch (obj->get_class_id()) { case TT_POINT_CMD: ppt = ((thpoint*)obj); this->m_fpoints.point_insert(ppt->point->xt + scrap->proj->rshift_x, ppt->point->yt + scrap->proj->rshift_y, ppt->point->zt + scrap->proj->rshift_z, ppt->point->at); this->m_fpoints.object_insert(); this->m_fpoints.m_attributes.insert_attribute("_SCRAP_ID",(long) ppt->fscrapptr->id); this->m_fpoints.m_attributes.insert_attribute("_TYPE",thmatch_string(ppt->type, thtt_point_types)); tstr = thmatch_string(ppt->type, thtt_point_types); tststr = tstr; ststr = thmatch_string(ppt->subtype, thtt_point_subtypes); if ((ppt->type != TT_POINT_TYPE_U) && (ststr != NULL)) { tststr += ":"; tststr += ststr; } symid = thsymbolset__get_id("point", tststr.c_str()); if (symid < 0) symid = thsymbolset__get_id("point", tstr.c_str()); if (symid < 0) symid = 0; typefc[0] = thsymbolset__fontchar[symid]; this->m_fpoints.m_attributes.insert_attribute("_TYPEFC",(const char *)typefc); this->m_fpoints.m_attributes.insert_attribute("_TYPEFCR", thisnan(ppt->orient) ? 0.0 : 360.0 - ppt->orient); this->m_fpoints.m_attributes.insert_attribute("_SUBTYPE", ppt->type != TT_POINT_TYPE_U ? (thmatch_string(ppt->subtype, thtt_point_subtypes)) : ppt->m_subtype_str); this->m_fpoints.m_attributes.copy_attributes(thdb.attr.get_object(ppt->id)); switch (ppt->type) { case TT_POINT_TYPE_LABEL: case TT_POINT_TYPE_REMARK: if ((ppt->text != NULL) && (strlen(ppt->text) > 0)) this->m_fpoints.m_attributes.insert_attribute("_TEXT",ppt->text); break; case TT_POINT_TYPE_STATION: if (ppt->station_name.id > 0) { thdb1ds * st = &(thdb.db1d.station_vec[ppt->station_name.id - 1]); this->m_fpoints.m_attributes.insert_attribute("_STNAME",st->name); this->m_fpoints.m_attributes.insert_attribute("_STSURVEY",st->survey->get_full_name()); } break; } break; case TT_LINE_CMD: pln = ((thline*)obj); sp = 0; cp = 1; lp = pln->first_point; if (lp == NULL) break; csubtype = lp->subtype; lp = lp->nextlp; while (lp != NULL) { if ((lp->subtype != csubtype) || (lp->nextlp == NULL)) { insert_line_segment(pln, false, this->m_flines.m_point_list, sp, cp); this->m_flines.object_insert(); this->m_flines.m_attributes.insert_attribute("_SCRAP_ID",(long) pln->fscrapptr->id); this->m_flines.m_attributes.insert_attribute("_TYPE",thmatch_string(pln->type, thtt_line_types)); this->m_flines.m_attributes.insert_attribute("_SUBTYPE", pln->type != TT_LINE_TYPE_U ? (thmatch_string(csubtype, thtt_line_subtypes)) : pln->m_subtype_str); this->m_flines.m_attributes.copy_attributes(thdb.attr.get_object(pln->id)); switch (pln->type) { case TT_LINE_TYPE_LABEL: if ((pln->text != NULL) && (strlen(pln->text) > 0)) this->m_flines.m_attributes.insert_attribute("_TEXT",pln->text); break; } csubtype = lp->subtype; sp = cp; } lp = lp->nextlp; cp++; } break; case TT_AREA_CMD: parea = ((tharea*)obj); if (parea->m_outline_line == NULL) break; this->m_fareas.object_clear(); this->m_fareas.polygon_start_ring(true); this->m_fareas.polygon_insert_line(parea->m_outline_line, false); this->m_fareas.polygon_close_ring(); this->m_fareas.object_insert(); if (this->m_fareas.m_object_id > -1) { // system attributes this->m_fareas.m_attributes.insert_attribute("_SCRAP_ID",(long) parea->fscrapptr->id); this->m_fareas.m_attributes.insert_attribute("_TYPE",thmatch_string(parea->type, thtt_area_types)); this->m_fareas.m_attributes.insert_attribute("_SUBTYPE",parea->m_subtype_str); this->m_fareas.m_attributes.copy_attributes(thdb.attr.get_object(parea->id)); } break; } obj = obj->pscrapoptr; } } void thexpmap::export_shp(class thdb2dxm * maps, class thdb2dprj * prj) { if (maps == NULL) { thwarning(("%s [%d] -- no selected projection data -- %s", this->src.name, this->src.line, this->projstr)) return; } thdb.db2d.process_areas_in_projection(prj); const char * fnm = this->get_output("cave.shp"); thexpshp xs; xs.m_xproj = prj; xs.m_expmap = this; if (!xs.open(fnm)) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif thdb2dxm * cmap = maps; thdb2dxs * cbm; thdb2dmi * cmi; while (cmap != NULL) { cbm = cmap->first_bm; while (cbm != NULL) { cmi = cbm->bm->last_item; if (cbm->mode == TT_MAPITEM_NORMAL) { while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) xs.xscrap2d((thscrap *) cmi->object, cmap, cbm); cmi = cmi->prev_item; } } cbm = cbm->next_item; } cmap = cmap->next_item; } xs.close(); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmodel::export_shp_file(class thdatabase * dbp) { const char * fnm = this->get_output("cave.shp"); thexpshp xs; xs.m_expmodel = this; if (!xs.open(fnm)) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif // stations thdb1ds * st; size_t nst = dbp->db1d.station_vec.size(), i; for(i = 0; i < nst; i++) { st = &(dbp->db1d.station_vec[i]); xs.m_fstations3D.point_insert(st->x, st->y, st->z); xs.m_fstations3D.object_insert(); xs.m_fstations3D.m_attributes.insert_attribute("_ID", (long) (i+1)); xs.m_fstations3D.m_attributes.insert_attribute("_UID", (long) st->uid); xs.m_fstations3D.m_attributes.insert_attribute("_NAME", st->name); xs.m_fstations3D.m_attributes.insert_attribute("_SURVEY", st->survey->get_full_name()); xs.m_fstations3D.m_attributes.insert_attribute("_SURFACE", long(((st->flags | TT_STATIONFLAG_UNDERGROUND) == 0) ? 1 : 0)); xs.m_fstations3D.m_attributes.insert_attribute("_FIXED", long(((st->flags | TT_STATIONFLAG_FIXED) != 0) ? 1 : 0)); xs.m_fstations3D.m_attributes.insert_attribute("_ENTRANCE", long(((st->flags | TT_STATIONFLAG_ENTRANCE) != 0) ? 1 : 0)); xs.m_fstations3D.m_attributes.insert_attribute("_CONTINUATION", long(((st->flags | TT_STATIONFLAG_CONT) != 0) ? 1 : 0)); if ((st->comment != NULL) && (strlen(st->comment) > 0)) xs.m_fstations3D.m_attributes.insert_attribute("_COMMENT", st->comment); xs.m_fstations3D.m_attributes.copy_attributes(dbp->db1d.m_station_attr.get_object(i+1)); } // shots thdb1dl * lg; thdb1ds * st2; // stations size_t nleg = dbp->db1d.leg_vec.size(); for(i = 0; i < nleg; i++) { lg = &(dbp->db1d.leg_vec[i]); st = &(dbp->db1d.station_vec[lg->leg->from.id - 1]); st2 = &(dbp->db1d.station_vec[lg->leg->to.id - 1]); xs.m_fshots3D.point_insert(st->x, st->y, st->z); xs.m_fshots3D.point_insert(st2->x, st2->y, st2->z); xs.m_fshots3D.object_insert(); xs.m_fshots3D.m_attributes.insert_attribute("_FROM", (long) lg->leg->from.id); xs.m_fshots3D.m_attributes.insert_attribute("_TO", (long) lg->leg->to.id); xs.m_fshots3D.m_attributes.insert_attribute("_SURVEY", lg->leg->psurvey->get_full_name()); xs.m_fshots3D.m_attributes.insert_attribute("_SURFACE", long(((lg->leg->flags | TT_LEGFLAG_SURFACE) != 0) ? 1 : 0)); xs.m_fshots3D.m_attributes.insert_attribute("_DUPLICATE", long(((lg->leg->flags | TT_LEGFLAG_DUPLICATE) != 0) ? 1 : 0)); xs.m_fshots3D.m_attributes.insert_attribute("_APPROXIMATE", long(((lg->leg->flags | TT_LEGFLAG_APPROXIMATE) != 0) ? 1 : 0)); xs.m_fshots3D.m_attributes.insert_attribute("_SPLAY", long(((lg->leg->flags | TT_LEGFLAG_SPLAY) != 0) ? 1 : 0)); } // walls if (((this->items & TT_EXPMODEL_ITEM_WALLS) != 0) && ((this->wallsrc & TT_WSRC_MAPS) != 0)) { // 3D DATA thdb2dprjpr prjid = dbp->db2d.parse_projection("plan",false); thscrap * cs; thdb3ddata * d3d; if (!prjid.newprj) { thdb.db2d.process_projection(prjid.prj); cs = prjid.prj->first_scrap; while(cs != NULL) { if (cs->fsptr->is_selected()) { d3d = cs->get_3d_outline(); if ((d3d != NULL) && (d3d->nfaces > 0)) { thdb3dfc * fcp; thdb3dfx * fxp; for(i = 0, fcp = d3d->firstfc; fcp != NULL; fcp = fcp->next, i++) { switch (fcp->type) { case THDB3DFC_TRIANGLE_STRIP: xs.m_fwalls3D.tristrip_start(); for(fxp = fcp->firstfx; fxp->next != NULL; fxp = fxp->next) { xs.m_fwalls3D.point_insert(fxp->vertex->x,fxp->vertex->y,fxp->vertex->z); } break; case THDB3DFC_TRIANGLES: for(fxp = fcp->firstfx; fxp != NULL; fxp = fxp->next->next->next) { xs.m_fwalls3D.tristrip_start(); xs.m_fwalls3D.point_insert(fxp->vertex->x,fxp->vertex->y,fxp->vertex->z); xs.m_fwalls3D.point_insert(fxp->next->vertex->x,fxp->next->vertex->y,fxp->next->vertex->z); xs.m_fwalls3D.point_insert(fxp->next->next->vertex->x,fxp->next->next->vertex->y,fxp->next->next->vertex->z); } break; } } xs.m_fwalls3D.object_insert(); xs.m_fwalls3D.m_attributes.insert_attribute("_ID",(long)cs->id); xs.m_fwalls3D.m_attributes.insert_attribute("_NAME",cs->name); xs.m_fwalls3D.m_attributes.insert_attribute("_SURVEY",cs->fsptr->get_full_name()); } } cs = cs->proj_next_scrap; } } } // WALLS xs.close(); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } therion/thlibrary.h0000664000175000017500000000206310625655142013426 0ustar useruser/** * @file thlibrary.h * Therion library initialization. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thlibrary_h #define thlibrary_h void thlibrary_init(); #endif therion/thsurface.h0000664000175000017500000000732610721450216013411 0ustar useruser/** * @file thsurface.h * surface module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thsurface_h #define thsurface_h #include "thdb3d.h" #include "thdataobject.h" #include "thobjectname.h" #include "thtflength.h" /** * surface command options tokens. */ enum { TT_SURFACE_UNKNOWN = 2000, TT_SURFACE_PICTURE = 2001, TT_SURFACE_GRID = 2002, TT_SURFACE_GRID_UNITS = 2003, TT_SURFACE_GRID_FLIP = 2004, }; /** * surface command options parsing table. */ static const thstok thtt_surface_opt[] = { {"bitmap", TT_SURFACE_PICTURE}, {"grid", TT_SURFACE_GRID}, {"grid-flip", TT_SURFACE_GRID_FLIP}, {"grid-units", TT_SURFACE_GRID_UNITS}, {NULL, TT_SURFACE_UNKNOWN}, }; /** * surface class. */ class thsurface : public thdataobject { public: // insert here real properties const char * pict_name; bool pict_stations; thobjectname s1, s2; class thsurvey * ssurvey; double pict_X1, pict_Y1, pict_X2, pict_Y2, pict_x1, pict_y1, pict_x2, pict_y2, grid_ox, grid_oy, grid_dx, grid_dy, calib_x, calib_y, calib_s, calib_r, calib_xx, calib_yy, calib_xy, calib_yx, pict_dpi, pict_height, pict_width; long grid_nx, grid_ny, grid_counter, grid_size; int grid_flip, pict_type; thtflength grid_units; double * grid; thdb3ddata d3d; bool d3dok; void parse_grid(char * spec); void parse_grid_setup(char ** args); void parse_picture(char ** args); void calibrate(); /** * Standard constructor. */ thsurface(); /** * Standard destructor. */ virtual ~thsurface(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thsurface";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * check stations. */ void check_stations(); virtual void start_insert(); thdb3ddata * get_3d(); }; #endif therion/thexport.cxx0000664000175000017500000000676712042467130013666 0ustar useruser/** * @file thexport.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexport.h" #include "thexception.h" #include "thconfig.h" #include "thdatabase.h" #include "thexporter.h" #include "thcs.h" #include thexport::thexport() { this->outpt = ""; this->outpt_def = false; this->export_mode = 0; this->cs = TTCS_LOCAL; } thexport::~thexport() {} void thexport::assign_config(class thconfig * cptr) { this->cfgptr = cptr; this->cfgpath = cptr->cfg_file.get_cif_path(); } void thexport::parse(int nargs, char ** args) { int ax = 0, oax; this->parse_arguments(ax, nargs, args); while (ax < nargs) { oax = ax; this->parse_options(ax, nargs, args); if (oax == ax) ththrow(("unknown option -- \"%s\"", args[ax])) } } void thexport::parse_arguments(int & argx, int nargs, char ** args) { } void thexport::parse_options(int & argx, int nargs, char ** args) { int optid = thmatch_token(args[argx], thtt_exp_opt); int optx = argx; switch (optid) { case TT_EXP_OPT_OUTPUT: argx++; if (argx >= nargs) ththrow(("missing output file name -- \"%s\"",args[optx])) if (strlen(args[argx]) > 0) { this->outpt = this->cfgptr->get_db()->strstore(args[argx]); outpt_def = true; } else ththrow(("empty file name not allowed -- \"%s\"",args[optx])) argx++; break; case TT_EXP_OPT_CS: argx++; if (argx >= nargs) ththrow(("missing coordiate system -- \"%s\"",args[optx])) { int id = thcs_parse(args[argx]); if (id == TTCS_UNKNOWN) { ththrow(("unknown coordinate system -- %s", args[argx])); } if ((thcfg.outcs != id) && (id == TTCS_LOCAL)) ththrow(("mixing local and global coordinate system -- %s", args[argx])); this->cs = id; } argx++; break; default: break; } } void thexport::dump(FILE * xf) { this->dump_header(xf); this->dump_body(xf); fprintf(xf,"\n"); } void thexport::dump_header(FILE * xf) { fprintf(xf,"export %s", thmatch_string(this->export_mode, thtt_exporter)); } void thexport::dump_body(FILE * xf) { if (this->outpt_def) { thdecode_arg(&(this->cfgptr->bf1), this->outpt); fprintf(xf," -output %s",this->cfgptr->bf1.get_buffer()); } } const char * thexport::get_output(const char * defname) { static thbuffer outptfname; outptfname = this->cfgpath.get_buffer(); if (this->outpt_def) { if (thpath_is_absolute(this->outpt)) return this->outpt; else outptfname += this->outpt; } else { outptfname += defname; } return outptfname.get_buffer(); } therion/thexception.h0000664000175000017500000000516510721173156013763 0ustar useruser/** * @file thexception.h * String exception class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thexception_h #define thexception_h #include "therion.h" #include "thbuffer.h" /** * Exception throwing macro. */ // thexc.strcpy(""); #ifdef THDEBUG #define ththrow(P) {\ thexc.strcpy("");\ thexc.appspf("("__FILE__":%d): ", __LINE__);\ thexc.appspf P;\ throw(0);\ } #else #define ththrow(P) {\ thexc.strcpy("");\ thexc.appspf P;\ throw(0);\ } #endif /** * Exception rethrowing macro. */ #ifdef THDEBUG #define threthrow(P) {\ if (*(thexc.get_buffer()) == 0)\ thexc.strcpy("unknown exception");\ thexc.insspf(" -- ");\ thexc.insspf P;\ thexc.insspf("("__FILE__":%d): ", __LINE__);\ throw(0);\ } #else #define threthrow(P) {\ if (*(thexc.get_buffer()) == 0)\ thexc.strcpy("unknown exception");\ thexc.insspf(" -- ");\ thexc.insspf P;\ throw(0);\ } #endif /** * Exception throwing macro without buffer reset. */ #ifdef THDEBUG #define threthrow2(P) {\ if (*(thexc.get_buffer()) == 0)\ thexc.strcpy("unknown exception");\ thexc.appspf(" -- ");\ thexc.appspf("("__FILE__":%d): ", __LINE__);\ thexc.appspf P;\ throw(0);\ } #else #define threthrow2(P) {\ if (*(thexc.get_buffer()) == 0)\ thexc.strcpy("unknown exception");\ thexc.appspf(" -- ");\ thexc.appspf P;\ throw(0);\ } #endif /** * Therion exception class. */ class thexception : public thbuffer { public: /** * Append sprinted string. */ void appspf(const char * format, ...); /** * Insert sprinted string. */ void insspf(const char * format, ...); /** * Return exception description. */ char * get_desc(); }; extern thexception thexc; #endif therion/thobjectname.h0000664000175000017500000000410410721226670014064 0ustar useruser/** * @file thobjectname.h * Object name class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thobjectname_h #define thobjectname_h #include "thmbuffer.h" #include "therion.h" /** * Survey station class. */ class thobjectname { public: const char * name, ///< Object name. * survey; ///< Survey name. class thsurvey * psurvey; ///< Parent survey. unsigned long id; ///< Object identifier. /** * Standard constructor. */ thobjectname(); /** * Two argument contructor. */ thobjectname(char * n, char * s) : name(n), survey(s), id(0) {} /** * Clear station. */ void clear(); /** * Return true if empty. */ bool is_empty(); /** * Print object name with survey into str. */ char * print_name(); /** * Print object name with survey up to given level into str. */ char * print_full_name(int slevel = -1); }; void thparse_objectname(thobjectname & ds, thmbuffer * sstore, char * src, class thdataobject * psobj = NULL); char * thobjectname__print_full_name(const char * oname, class thsurvey * psrv, int slevel = -1); void fprintf(FILE * fh, thobjectname & ds); #endif therion/thinfnan.h0000664000175000017500000000535010625655142013235 0ustar useruser/** * @file thinfnan.h * Therion number constants. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thinfnan_h #define thinfnan_h #include // nan handling #ifdef NAN #ifdef THLINUX #define thnan NAN #define thisnan isnan #else #define thnan -9e99 #define thisnan(number) (number == thnan) #endif #else #define thnan -9e99 #define thisnan(number) (number == thnan) #endif // infinity handling #ifdef INFINITY #ifdef THLINUX #define thinf INFINITY #define thisinf isinf #else #define thinf 1e100 #define thisinf(number) (number >= thinf ? 1 : (number <= -thinf ? -1 : 0)) #endif #else #define thinf 1e100 #define thisinf(number) (number >= thinf ? 1 : (number <= -thinf ? -1 : 0)) #endif /** * Update double variable if nan. * * @param oval Original value * @param uval Update value */ void thnan_update(double & oval, double uval); /** * A inf nan printing macro. * * -Inf -> -999.999 * Inf -> 999.999 * NaN -> 1000.0001 */ #define thinn(cislo) (thisnan(cislo) ? 1000.0001 : \ (thisinf(cislo) == 1 ? 999.999 : \ (thisinf(cislo) == -1 ? -999.999 : cislo))) // infnan.h #endif /** * Print number in nan format. */ #define thprintinfnan(cislo) {\ if (thisnan(cislo)) \ thprintf("thnan"); \ else if (thisinf(cislo) == 1) \ thprintf("thinf"); \ else if (thisinf(cislo) == -1) \ thprintf("-thinf"); \ else \ thprintf("%lg",cislo);} #define THPI 3.1415926535898 #define thnanpow2(cislo) ((thisnan(cislo) ? 0.0 : cislo) * (thisnan(cislo) ? 0.0 : cislo)) #define thdxyz2length(dx,dy,dz) (sqrt(thnanpow2(dx) + thnanpow2(dy) + thnanpow2(dz))) #define thdxyz2b(dx,dy,dz) (270 - (atan2(dy,dx) / THPI * 180.0 + 180)) #define thdxyz2bearing(dx,dy,dz) (thdxyz2b(dx,dy,dz) < 0.0 ? thdxyz2b(dx,dy,dz) + 360.0 : thdxyz2b(dx,dy,dz)) #define thdxyz2clino(dx,dy,dz) (atan2(dz,sqrt(thnanpow2(dx) + thnanpow2(dy))) / THPI * 180.0) therion/thdb2d00.cxx0000664000175000017500000005162510721223730013307 0ustar useruser/** * @file thdb2d00.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2d.h" #include "thexception.h" #include "thdatabase.h" #include "thparse.h" #include "thtfangle.h" #include "tharea.h" #include "thmap.h" #include "thjoin.h" #include "thpoint.h" #include "thline.h" #include "thscrap.h" #include "thsurvey.h" #include "thlogfile.h" #include #include "thlayout.h" #include "thconfig.h" #include #include "thmapstat.h" void thdb2d::insert_basic_maps(thdb2dxm * fmap, thmap * map, int mode, int level, thdb2dmi_shift shift) { thdb2dxs * xs, * txs = NULL; thdb2dmi * mi; bool found = false; if (map->is_basic) { xs = fmap->first_bm; while ((!found) && (xs != NULL)) { if ((xs->bm->id == map->id) && (xs->m_shift == shift)) { found = true; txs = xs; } xs = xs->next_item; } if (!found) { xs = this->insert_xs(); txs = xs; xs->bm = map; xs->fmap = fmap; xs->m_shift = shift; if (fmap->first_bm == NULL) { fmap->first_bm = xs; fmap->last_bm = xs; } else { fmap->last_bm->next_item = xs; xs->prev_item = fmap->last_bm; fmap->last_bm = xs; } } thdb2dxs_target_item tmp_target(map->projection_id, map->id, shift); thdb2dxs_target_map::iterator ti; ti = this->m_target_map.find(tmp_target); if (ti == this->m_target_map.end()) { this->m_target_map[tmp_target] = txs; txs->m_target = txs; } else { txs->m_target = ti->second; } // if (txs->mode < mode) { if (txs->mode != TT_MAPITEM_NORMAL) { txs->mode = mode; txs->m_shift = shift; // mi = map->first_item; // if (map->selection_mode < mode) { // if (map->selection_mode != TT_MAPITEM_NORMAL) { // map->selection_mode = mode; // map->selection_xs = txs; // } if (txs->m_target->mode != TT_MAPITEM_NORMAL) { txs->m_target = txs; this->m_target_map[tmp_target] = txs; } // while (mi != NULL) { // if ((mi->type == TT_MAPITEM_NORMAL) && (((thscrap*)(mi->object))->selection_mode < mode)) { // ((thscrap*)(mi->object))->selection_mode = mode; // ((thscrap*)(mi->object))->selection_xs = txs; // } // mi = mi->next_item; // } } } // prejde vsetky referencie mi = map->first_item; while (mi != NULL) { if (mode == TT_MAPITEM_NORMAL) { if (((mi->type != TT_MAPITEM_NORMAL) || (!map->is_basic)) && ((mi->type == TT_MAPITEM_NORMAL) || (level == 0))) { this->insert_basic_maps(fmap,(thmap *)mi->object,mi->type,level+1, shift.add(mi->m_shift)); } if ((mi->type == TT_MAPITEM_NORMAL) && (mi->m_shift.is_active()) && (mi->m_shift.m_preview != TT_MAPITEM_NONE)) { this->insert_basic_maps(fmap,(thmap *)mi->object, mi->m_shift.m_preview, level+1, shift); } } else { if ((mi->type == TT_MAPITEM_NORMAL) && (!map->is_basic)) this->insert_basic_maps(fmap,(thmap *)mi->object,mode,level+1, shift); } mi = mi->next_item; } } int thdb2d_compxm(const void * ee1, const void * ee2) { thdb2dxm ** e1 = (thdb2dxm **) ee1, ** e2 = (thdb2dxm **) ee2; if (thisnan((*e1)->map->z)) return -1; if (thisnan((*e2)->map->z)) return 1; if ((*e1)->map->z < (*e2)->map->z) { return -1; } else if ((*e1)->map->z == (*e2)->map->z) return 0; else return 1; } int thdb2d_compscrap(const void * ee1, const void * ee2) { thscrap * e1, * e2; e1 = *((thscrap **) ee1); e2 = *((thscrap **) ee2); if (thisnan(e1->z)) return 1; if (thisnan(e2->z)) return -1; if (e1->z > e2->z) { return -1; } else if (e1->z == e2->z) return 0; else return 1; } thdb2dxm * thdb2d::insert_maps(thdb2dxm * selection,thdb2dxm * insert_after, thmap * map, unsigned long selection_level, int level, int title_level, int map_level) { thdb2dxm * cxm = NULL; thdb2dmi * mi; if ((level == title_level) || (level == map_level) || (map->is_basic)) { cxm = this->insert_xm(); cxm->map = map; cxm->selection_level = selection_level; if (insert_after == NULL) { cxm->next_item = selection; if (selection != NULL) selection->prev_item = cxm; selection = cxm; } else { cxm->next_item = insert_after->next_item; if (insert_after->next_item != NULL) insert_after->prev_item = cxm; insert_after->next_item = cxm; cxm->prev_item = insert_after; } if (level == title_level) cxm->title = true; if ((level == map_level) || (map->is_basic)) cxm->expand = true; } // ak treba, preskuma pod nim if ((!map->is_basic) && ((level < map_level) || (map_level < 0))) { mi = map->first_item; while (mi != NULL) { if (mi->type == TT_MAPITEM_NORMAL) { if (cxm == NULL) selection = this->insert_maps(selection,insert_after,(thmap *) mi->object, selection_level, level+1, title_level, map_level); else selection = this->insert_maps(selection,cxm,(thmap *) mi->object, selection_level, level+1, title_level, map_level); } mi = mi->next_item; } } return selection; } /* goto DEBUG_SKIP_SELECTION; while (obi != this->db->object_list.end()) { if (((*obi)->get_class_id() == TT_MAP_CMD) && (((thmap*)(*obi))->projection_id == prj->id) && ((*obi)->is_selected())) { nmaps++; pmap = (thmap*)(*obi); if (nmaps == 2) { onemap = false; if ((map_level > 0) && (!prev_pmap->is_basic)) chapters = true; else chapters = false; } if (!chapters) { if (nmaps == 1) { onemap = true; if ((map_level > 1) && (!pmap->is_basic)) { // prejde vsetky pod a zisti, ci je nejaka nie basic pmapitem = pmap->first_item; while ((!chapters) && (pmapitem != NULL)) { if ((!((thmap *)(pmapitem->object))->is_basic) && (pmapitem->type == TT_MAPITEM_NORMAL)) { chapters = true; } pmapitem = pmapitem->next_item; } } } else { if ((map_level > 0) && (!pmap->is_basic)) chapters = true; } } prev_pmap = pmap; } obi++; } // prida kapitoly a podkapitoly obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if (((*obi)->get_class_id() == TT_MAP_CMD) && (((thmap*)(*obi))->projection_id == prj->id) && ((*obi)->is_selected())) { cxm = selection; if (cxm != 0) { while ((cxm != NULL) && (cxm->selection_level <= (*obi)->selected_number)) { cxm = cxm->next_item; } } if (chapters && onemap) { selection = this->insert_maps(selection,cxm,(thmap*)(*obi), (*obi)->selected_number,0,1,map_level); } else if (chapters) { selection = this->insert_maps(selection,cxm,(thmap*)(*obi), (*obi)->selected_number,0,0,map_level); } else { selection = this->insert_maps(selection,cxm,(thmap*)(*obi), (*obi)->selected_number,0,-1,map_level); } } obi++; } DEBUG_SKIP_SELECTION: */ thdb2dxm * thdb2d::select_projection(thdb2dprj * prj) { // najde vsetky mapy ktore mame oznacene, resp. vyberie vsetky zakladne thdb2dxm * selection = NULL, * cxm, * lxm = NULL, * * new_selection, **nsi; thdb2dxs * pcxs; unsigned long nmaps = 0, imap, nscraps = 0, iscr; // bool chapters = false, onemap = false; // thmap * pmap, * prev_pmap; // thdb2dmi * pmapitem; this->reset_selection(); thdb_object_list_type::iterator obi = this->db->object_list.begin(); // prejde vsetky oznacene objekty a pooznacuje mapy thselector_list::iterator ii = thcfg.selector.data.begin(); cxm = selection; while (ii != thcfg.selector.data.end()) { if ((!ii->unselect) && (ii->optr != NULL) && (ii->optr->get_class_id() == TT_MAP_CMD) && (((thmap*)(ii->optr))->projection_id == prj->id)) { selection = this->insert_maps(selection,cxm,(thmap*)(ii->optr), ii->number,0, ((ii->map_level >= 0) && (ii->chapter_level > ii->map_level) ? ii->map_level : ii->chapter_level),ii->map_level); prj->stat.scanmap((thmap*)(ii->optr)); prj->stat.addstat(&(((thmap*)(ii->optr))->stat)); while ((cxm != NULL) && (cxm->next_item != NULL)) cxm = cxm->next_item; } ii++; } // no map selected, let's add all basic maps if (selection == NULL) { nmaps = 0; obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if (((*obi)->get_class_id() == TT_MAP_CMD) && (((thmap*)(*obi))->projection_id == prj->id) && (((thmap*)(*obi))->is_basic) && (((thmap*)(*obi))->fsptr != NULL) && (((thmap*)(*obi))->fsptr->is_selected())) { prj->stat.scanmap((thmap*)(*obi)); prj->stat.addstat(&(((thmap*)(*obi))->stat)); cxm = this->insert_xm(); cxm->title = false; cxm->expand = true; cxm->map = (thmap*)(*obi); cxm->map->calc_z(); nmaps++; if (selection == NULL) { selection = cxm; lxm = cxm; } else { lxm->next_item = cxm; cxm->prev_item = lxm; lxm = cxm; } } obi++; } // add centerline to map, even some basic maps exists //if (nmaps > 0) { // thscrap * scrapp; // thmap * mapp; // thdb2dmi * xcitem; // scrapp = new thscrap; // scrapp->centerline_io = true; // scrapp->fsptr = NULL; // scrapp->db = &(thdb); // scrapp->proj = prj; // thdb.object_list.push_back(scrapp); // mapp = new thmap; // mapp->db = &(thdb); // mapp->fsptr = NULL; // thdb.object_list.push_back(mapp); // xcitem = thdb.db2d.insert_map_item(); // xcitem->itm_level = mapp->last_level; // xcitem->source = thdb.csrc; // xcitem->psurvey = NULL; // xcitem->type = TT_MAPITEM_NORMAL; // xcitem->object = scrapp; // mapp->first_item = xcitem; // mapp->last_item = xcitem; // cxm = this->insert_xm(); // cxm->title = false; // cxm->expand = true; // cxm->map = mapp; // prj->stat.scanmap(mapp); // prj->stat.addstat(&(mapp->stat)); // cxm->next_item = selection; // selection->prev_item = cxm; // selection = cxm; // nmaps++; //} if ((selection == NULL) && ( (prj->type == TT_2DPROJ_PLAN) || (prj->type == TT_2DPROJ_EXTEND) || (prj->type == TT_2DPROJ_ELEV))) { // podme vytvorit jednu mapu a vlozit do nej // vsetky surveye thscrap * scrapp; thmap * mapp; thdb2dmi * xcitem; // najprv spocitame scrapy nscraps = 0; obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if (((*obi)->get_class_id() == TT_SCRAP_CMD) && (((thscrap*)(*obi))->proj->id == prj->id) && (((thscrap*)(*obi))->fsptr != NULL) && (((thscrap*)(*obi))->fsptr->is_selected())) { nscraps++; } obi++; } mapp = new thmap; mapp->id = ++this->db->objid; mapp->projection_id = prj->id; mapp->db = &(thdb); mapp->fsptr = NULL; thdb.object_list.push_back(mapp); // ak nemame ani jeden scrap, vytvorime mapu z centerlajnu if (nscraps == 0) { scrapp = new thscrap; scrapp->centerline_io = true; scrapp->fsptr = NULL; scrapp->db = &(thdb); scrapp->proj = prj; thdb.object_list.push_back(scrapp); xcitem = thdb.db2d.insert_map_item(); xcitem->itm_level = mapp->last_level; xcitem->source = thdb.csrc; xcitem->psurvey = NULL; xcitem->type = TT_MAPITEM_NORMAL; xcitem->object = scrapp; mapp->first_item = xcitem; mapp->last_item = xcitem; } // do tej mapy povkladame vsetky scrapy, ktore // v danej projekcii mame zoradene podla Ztka a kazde // na novom levely nscraps = 0; obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if (((*obi)->get_class_id() == TT_SCRAP_CMD) && (((thscrap*)(*obi))->proj->id == prj->id) && (((thscrap*)(*obi))->fsptr != NULL) && (((thscrap*)(*obi))->fsptr->is_selected())) { xcitem = thdb.db2d.insert_map_item(); if (mapp->first_item == NULL) { mapp->first_item = xcitem; mapp->last_item = xcitem; } else { mapp->last_item->next_item = xcitem; xcitem->prev_item = mapp->last_item; mapp->last_item = xcitem; } xcitem->itm_level = ++mapp->last_level; xcitem->source = thdb.csrc; xcitem->psurvey = NULL; xcitem->type = TT_MAPITEM_NORMAL; xcitem->object = (thscrap*)(*obi); nscraps++; } obi++; } if (nscraps > 1) { // zoradime scrapy podla z-ka thscrap ** sss = new thscrap* [nscraps]; xcitem = mapp->first_item; //->next_item; for(iscr = 0; iscr < nscraps; iscr++) { sss[iscr] = (thscrap *) xcitem->object; xcitem = xcitem->next_item; } qsort(sss, nscraps, sizeof(thscrap*), thdb2d_compscrap); xcitem = mapp->first_item; //->next_item; for(iscr = 0; iscr < nscraps; iscr++) { xcitem->object = sss[iscr]; xcitem = xcitem->next_item; } delete [] sss; // vyhodime z mapy prvy scrap // mapp->first_item = mapp->first_item->next_item; // mapp->first_item->prev_item = NULL; } cxm = this->insert_xm(); cxm->title = false; cxm->expand = true; cxm->map = mapp; prj->stat.scanmap(mapp); prj->stat.addstat(&(mapp->stat)); selection = cxm; } if (nmaps > 1) { // zoradi mapy new_selection = new thdb2dxm* [nmaps]; for (imap = 0, cxm = selection, nsi = new_selection; imap < nmaps; imap++, cxm = cxm->next_item, nsi++) { *nsi = cxm; } qsort(new_selection,nmaps,sizeof(thdb2dxm*),thdb2d_compxm); for (imap = 0, nsi = new_selection; imap < nmaps; imap++, nsi++) { if (imap == 0) { selection = *nsi; (*nsi)->prev_item = NULL; } else { lxm->next_item = *nsi; (*nsi)->prev_item = lxm; } (*nsi)->next_item = NULL; lxm = *nsi; } delete [] new_selection; } } // thdb2dxs cxs, cxs2, cxs3; unsigned long on = 0; if (selection != NULL) { // prida do map zakladne mapy cxm = selection; while (cxm != NULL) { if (cxm->expand) { cxm->output_number = ++on; this->insert_basic_maps(cxm,cxm->map,TT_MAPITEM_NORMAL,0); } cxm = cxm->next_item; } } if (selection != NULL) { cxm = selection; while (cxm != NULL) { pcxs = cxm->first_bm; while (pcxs != NULL) { // ak je fmap zakladna, tak OK a PON = ON // inak PON = ++on thdb2dxs_target_item tmp_target(pcxs->bm->projection_id, pcxs->bm->id, pcxs->m_shift); pcxs->m_target = this->m_target_map[tmp_target]; if (pcxs->m_target->preview_output_number == 0) { if ((pcxs->m_target->mode == TT_MAPITEM_NORMAL) && pcxs->m_target->fmap->map->is_basic) pcxs->m_target->preview_output_number = pcxs->m_target->fmap->output_number; else pcxs->m_target->preview_output_number = ++on; } // if (pcxs->bm->selection_xs->preview_output_number == 0) { // if ((pcxs->bm->selection_mode == TT_MAPITEM_NORMAL) && // pcxs->bm->selection_xs->fmap->map->is_basic) // pcxs->bm->selection_xs->preview_output_number = // pcxs->bm->selection_xs->fmap->output_number; // else // pcxs->bm->selection_xs->preview_output_number = ++on; // } pcxs = pcxs->next_item; } cxm = cxm->next_item; } } return selection; } void thdb2d::reset_selection() { this->m_target_map.clear(); thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_MAP_CMD: ((thmap *)(*obi))->selection_mode = TT_MAPITEM_UNKNOWN; break; // case TT_SCRAP_CMD: // ((thscrap *)(*obi))->selection_mode = TT_MAPITEM_UNKNOWN; // ((thscrap *)(*obi))->selection_xs = NULL; // break; } obi++; } } const char * thdb2dscan_survey_title(thsurvey * fptr, long & min) { long newmin = 0, tmpmin; if (fptr == NULL) { return ""; } const char * newname = fptr->title, * tmpname; if (strlen(newname) == 0) newname = fptr->name; thdataobject * o; thsurvey * s = fptr, * ss; while (s != NULL) { o = s->foptr; while (o != NULL) { while ((o != NULL) && (o->get_class_id() != TT_SURVEY_CMD)) o = o->nsptr; ss = (thsurvey *) o; if (ss != NULL) { tmpname = thdb2dscan_survey_title(ss, tmpmin); // printf("SCAN %s: %d\n", ss->name, tmpmin); s->num1 += tmpmin; if (tmpmin > newmin) { newmin = tmpmin; newname = tmpname; } o = o->nsptr; } } // printf("TOP %s: %d\n", s->name, s->num1); if (s->num1 > newmin) { // if (newmin != 0) // printf("OLD %s: %d\n", newname, newmin); newmin = s->num1; newname = s->title; // printf("NEW %s: %d\n", newname, newmin); if (strlen(newname) == 0) newname = s->name; } while ((o != NULL) && (o->get_class_id() != TT_SURVEY_CMD)) o = o->nsptr; s = (thsurvey *) o; } min = newmin; // if (min > 0) printf("RETURN %s: %d\n", newname, newmin); return newname; } const char * thdb2d::get_projection_title(thdb2dprj * prj) { // krok cislo jedna - prejde celu selection - ak najde jednu oznacenu // mapu - tak zoberie jej title //alebo name long dum; const char * rv = NULL; unsigned long nmaps = 0; thselector_list::iterator ii = thcfg.selector.data.begin(); while (ii != thcfg.selector.data.end()) { if ((!ii->unselect) && (ii->optr != NULL) && (ii->optr->get_class_id() == TT_MAP_CMD) && (((thmap*)(ii->optr))->projection_id == prj->id)) { nmaps++; if (nmaps > 1) { rv = NULL; break; } if (strlen(((thmap*)(ii->optr))->title) > 0) { rv = ((thmap*)(ii->optr))->title; } //else { // rv = ((thmap*)(ii->optr))->name; //} } ii++; } if (rv != NULL) return rv; // prescanuje vsetky objekty a surveyom priradi pocet scrapov, ktore // sa z nich exportovali thdb_object_list_type::iterator obi = this->db->object_list.begin(), obi2; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_SURVEY_CMD) { ((thsurvey*)(*obi))->num1 = 0; } obi++; } obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if (((*obi)->get_class_id() == TT_SCRAP_CMD) && (((thscrap*)(*obi))->proj->id == prj->id) && (((thscrap*)(*obi))->exported)) { if (((thscrap*)(*obi))->fsptr != NULL) { ((thscrap*)(*obi))->fsptr->num1++; } else if (((thscrap*)(*obi))->centerline_survey != NULL) { ((thscrap*)(*obi))->centerline_survey->num1++; } else { // prejde vsetky oznacene a da im num1 = 1 obi2 = this->db->object_list.begin(); while (obi2 != this->db->object_list.end()) { if (((*obi2)->get_class_id() == TT_SURVEY_CMD) && ((*obi2)->selected)) { ((thsurvey*)(*obi2))->num1 = 1; } obi2++; } } } obi++; } // rekurzivne prejde vsetky surveye a najde najnizsie take // co ma v sebe najviac scrapov a zoberie jeho nazov dum = 0; rv = thdb2dscan_survey_title(this->db->fsurveyptr, dum); return rv; } therion/thmbuffer.h0000664000175000017500000000514510721205226013403 0ustar useruser/** * @file thmbuffer.h * Multiple string buffer class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thmbuffer_h #define thmbuffer_h #include /** * Multiple string buffer class. */ class thmbuffer { long size, ///< Number of items in buffer. max_size, ///< Maximal number of items in buffer. free_size; char * free_ptr; ///< Pointer to the free string position. char ** buf; ///< Access array. /** * Memory allocation class. */ class mblock { public: char * data; ///< Pointer to the memory block. size_t size; ///< Size of the block. mblock * next_ptr; ///< Pointer to the next block. /** * Constructor. * * Allocates also necessary memory. */ mblock(size_t min_size, size_t last_size); /** * Destructor. * * Dealocates data memory. */ ~mblock(); }; mblock * first_ptr, ///< Pointer to the first memory block. * last_ptr; ///< Pointer to the last memory block. public: /** * Standard constructor. */ thmbuffer(); /** * Destructor. */ ~thmbuffer(); /** * Clear the buffer contents. */ void clear(); /** * Append new string to the buffer. * * @param src Source string. */ char * append(const char * src); /** * Append n characters from string as a new string to the buffer. * * @param src Source string. * @param n Source size. */ char * appendn(const char * src, size_t n); /** * Return number of items in buffer. */ long get_size(); /** * Return pointer to the array of items. */ char ** get_buffer(); }; #endif therion/thmapstat.h0000664000175000017500000000534012046526432013432 0ustar useruser/** * @file thmapstat.h * Multiple string buffer class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thmapstat_h #define thmapstat_h #include #include #include #include "thdate.h" #include "thperson.h" #include "thlegenddata.h" class thmapstat_data { public: friend bool operator < (const thmapstat_data & c1, const thmapstat_data & c2); thdate date; double crit; thmapstat_data(); }; class thmapstat_copyright { public: friend bool operator < (const thmapstat_copyright & c1, const thmapstat_copyright & c2); const char * str; }; class thmapstat_dataptr { public: friend bool operator < (const thmapstat_dataptr & c1, const thmapstat_dataptr & c2); class thdata * ptr; thmapstat_dataptr(); }; // person map type /person, datum, kriterium/ // copyright map type /copyright, datum, kriterium/ // data map type /dataid/ typedef std::map thmapstat_personmap; typedef std::map thmapstat_copyrightmap; typedef std::map thmapstat_datamap; class thmapstat { public: bool scanned; thmapstat_personmap discovered_by, surveyed_by, drawn_by; thdate drawn_date, surveyed_date, discovered_date; thmapstat_copyrightmap copyright; thmapstat_datamap data; /** * Standard constructor. */ thmapstat(); /** * Scan authors and copyrights and data. */ void scanmap(class thmap * map); /** * Add data from another objects. */ void addobj(class thdataobject * obj); void addstat(thmapstat * source); void adddata(thmapstat_datamap * dm); void resetdata(); void export_pdftex(FILE * f, class thlayout * layout, legenddata * ldata); double get_length(); double get_depth(); }; #endif therion/thline.h0000664000175000017500000002406112047265066012715 0ustar useruser/** * @file thline.h * line module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thline_h #define thline_h #include "th2ddataobject.h" /** * line command options tokens. */ enum { TT_LINE_UNKNOWN = 3000, TT_LINE_TYPE = 3001, TT_LINE_SUBTYPE = 3002, TT_LINE_REVERSE = 3003, TT_LINE_CLOSED = 3004, TT_LINE_SMOOTH = 3005, TT_LINE_OUTLINE = 3006, TT_LINE_MARK = 3007, TT_LINE_RSIZE = 3008, TT_LINE_LSIZE = 3009, TT_LINE_ORIENT = 3010, TT_LINE_SIZE = 3011, TT_LINE_GRADIENT = 3012, TT_LINE_BORDER = 3013, TT_LINE_ALTITUDE = 3014, TT_LINE_DIRECTION = 3015, TT_LINE_HEAD = 3016, TT_LINE_TEXT = 3017, TT_LINE_ADJUST = 3018, TT_LINE_HEIGHT = 3019, }; enum { // tags pre slope TT_LINE_TAG_BORDER = 1, // tags pre contour TT_LINE_TAG_GRADIENT_CENTER = 1, TT_LINE_TAG_GRADIENT_POINT = 2, TT_LINE_TAG_GRADIENT_NONE = 4, // tags pre section TT_LINE_TAG_DIRECTION_BEGIN = 1, TT_LINE_TAG_DIRECTION_END = 2, TT_LINE_TAG_DIRECTION_POINT = 4, // tags pre arrow TT_LINE_TAG_HEAD_BEGIN = 1, TT_LINE_TAG_HEAD_END = 2, }; /** * line command options parsing table. */ static const thstok thtt_line_opt[] = { {"adjust", TT_LINE_ADJUST}, {"altitude", TT_LINE_ALTITUDE}, {"border", TT_LINE_BORDER}, {"close", TT_LINE_CLOSED}, {"direction", TT_LINE_DIRECTION}, {"gradient", TT_LINE_GRADIENT}, {"head", TT_LINE_HEAD}, {"height", TT_LINE_HEIGHT}, {"l-size",TT_LINE_LSIZE}, {"mark", TT_LINE_MARK}, {"orient", TT_LINE_ORIENT}, {"orientation", TT_LINE_ORIENT}, {"outline", TT_LINE_OUTLINE}, {"r-size",TT_LINE_RSIZE}, {"reverse", TT_LINE_REVERSE}, {"size",TT_LINE_SIZE}, {"smooth",TT_LINE_SMOOTH}, {"subtype", TT_LINE_SUBTYPE}, {"text",TT_LINE_TEXT}, {NULL, TT_LINE_UNKNOWN}, }; /** * Line outlines. */ enum { TT_LINE_OUTLINE_UNKNOWN, TT_LINE_OUTLINE_IN, TT_LINE_OUTLINE_OUT, TT_LINE_OUTLINE_NONE, }; /** * line outlines parsing table. */ static const thstok thtt_line_outlines[] = { {"in", TT_LINE_OUTLINE_IN}, {"none", TT_LINE_OUTLINE_NONE}, {"out", TT_LINE_OUTLINE_OUT}, {NULL, TT_LINE_OUTLINE_UNKNOWN}, }; /** * Line point adjustments. */ enum { TT_LINE_ADJUST_UNKNOWN, TT_LINE_ADJUST_HORIZONTAL, TT_LINE_ADJUST_VERTICAL, TT_LINE_ADJUST_NONE, }; /** * line adjusts parsing table. */ static const thstok thtt_line_adjusts[] = { {"horizontal", TT_LINE_ADJUST_HORIZONTAL}, {"none", TT_LINE_ADJUST_NONE}, {"vertical", TT_LINE_ADJUST_VERTICAL}, {NULL, TT_LINE_ADJUST_UNKNOWN}, }; /** * Line types. */ enum { TT_LINE_TYPE_UNKNOWN, TT_LINE_TYPE_U, TT_LINE_TYPE_WALL, TT_LINE_TYPE_PIT, TT_LINE_TYPE_CHIMNEY, TT_LINE_TYPE_ROCK_BORDER, TT_LINE_TYPE_SURVEY, TT_LINE_TYPE_ROCK_EDGE, TT_LINE_TYPE_FLOWSTONE, TT_LINE_TYPE_MOONMILK, TT_LINE_TYPE_BORDER, TT_LINE_TYPE_SLOPE, TT_LINE_TYPE_CONTOUR, TT_LINE_TYPE_OVERHANG, TT_LINE_TYPE_SECTION, TT_LINE_TYPE_ARROW, TT_LINE_TYPE_LABEL, TT_LINE_TYPE_CEILING_STEP, TT_LINE_TYPE_FLOOR_STEP, TT_LINE_TYPE_WATER_FLOW, TT_LINE_TYPE_GRADIENT, TT_LINE_TYPE_CEILING_MEANDER, TT_LINE_TYPE_FLOOR_MEANDER, TT_LINE_TYPE_MAP_CONNECTION, TT_LINE_TYPE_HANDRAIL, TT_LINE_TYPE_FIXED_LADDER, TT_LINE_TYPE_ROPE_LADDER, TT_LINE_TYPE_VIA_FERRATA, TT_LINE_TYPE_ROPE, TT_LINE_TYPE_STEPS, }; /** * Line types parsing table. */ static const thstok thtt_line_types[] = { {"arrow", TT_LINE_TYPE_ARROW}, {"border", TT_LINE_TYPE_BORDER}, {"ceiling-meander", TT_LINE_TYPE_CEILING_MEANDER}, {"ceiling-step", TT_LINE_TYPE_CEILING_STEP}, {"chimney", TT_LINE_TYPE_CHIMNEY}, {"contour", TT_LINE_TYPE_CONTOUR}, {"fixed-ladder", TT_LINE_TYPE_FIXED_LADDER}, {"floor-meander", TT_LINE_TYPE_FLOOR_MEANDER}, {"floor-step", TT_LINE_TYPE_FLOOR_STEP}, {"flowstone", TT_LINE_TYPE_FLOWSTONE}, {"gradient", TT_LINE_TYPE_GRADIENT}, {"handrail", TT_LINE_TYPE_HANDRAIL}, {"label", TT_LINE_TYPE_LABEL}, {"map-connection", TT_LINE_TYPE_MAP_CONNECTION}, {"moonmilk", TT_LINE_TYPE_MOONMILK}, {"overhang", TT_LINE_TYPE_OVERHANG}, {"pit", TT_LINE_TYPE_PIT}, {"pitch", TT_LINE_TYPE_PIT}, {"rock-border", TT_LINE_TYPE_ROCK_BORDER}, {"rock-edge", TT_LINE_TYPE_ROCK_EDGE}, {"rope", TT_LINE_TYPE_ROPE}, {"rope-ladder", TT_LINE_TYPE_ROPE_LADDER}, {"section", TT_LINE_TYPE_SECTION}, {"slope", TT_LINE_TYPE_SLOPE}, {"steps", TT_LINE_TYPE_STEPS}, {"survey", TT_LINE_TYPE_SURVEY}, {"u",TT_LINE_TYPE_U}, {"via-ferrata",TT_LINE_TYPE_VIA_FERRATA}, {"wall", TT_LINE_TYPE_WALL}, {"water-flow", TT_LINE_TYPE_WATER_FLOW}, {NULL, TT_LINE_TYPE_UNKNOWN}, }; /** * Line subtypes. */ enum { TT_LINE_SUBTYPE_UNKNOWN, TT_LINE_SUBTYPE_TEMPORARY, TT_LINE_SUBTYPE_INVISIBLE, TT_LINE_SUBTYPE_VISIBLE, TT_LINE_SUBTYPE_BEDROCK, TT_LINE_SUBTYPE_SAND, TT_LINE_SUBTYPE_CLAY, TT_LINE_SUBTYPE_PEBBLES, TT_LINE_SUBTYPE_DEBRIS, TT_LINE_SUBTYPE_BLOCKS, TT_LINE_SUBTYPE_ICE, TT_LINE_SUBTYPE_UNDERLYING, TT_LINE_SUBTYPE_UNSURVEYED, TT_LINE_SUBTYPE_PRESUMED, TT_LINE_SUBTYPE_PERMANENT, TT_LINE_SUBTYPE_INTERMITTENT, TT_LINE_SUBTYPE_CONJECTURAL, TT_LINE_SUBTYPE_CAVE, TT_LINE_SUBTYPE_SURFACE, TT_LINE_SUBTYPE_OVERLYING, TT_LINE_SUBTYPE_PIT, TT_LINE_SUBTYPE_MOONMILK, TT_LINE_SUBTYPE_FLOWSTONE, }; /** * Line subtypes parsing table. */ static const thstok thtt_line_subtypes[] = { {"bedrock", TT_LINE_SUBTYPE_BEDROCK}, {"blocks",TT_LINE_SUBTYPE_BLOCKS}, {"cave",TT_LINE_SUBTYPE_CAVE}, {"clay",TT_LINE_SUBTYPE_CLAY}, {"conjectural",TT_LINE_SUBTYPE_CONJECTURAL}, {"debris",TT_LINE_SUBTYPE_DEBRIS}, {"flowstone",TT_LINE_SUBTYPE_FLOWSTONE}, {"ice",TT_LINE_SUBTYPE_ICE}, {"intermittent",TT_LINE_SUBTYPE_INTERMITTENT}, {"invisible", TT_LINE_SUBTYPE_INVISIBLE}, {"moonmilk",TT_LINE_SUBTYPE_MOONMILK}, {"overlying",TT_LINE_SUBTYPE_OVERLYING}, {"pebbles",TT_LINE_SUBTYPE_PEBBLES}, {"permanent",TT_LINE_SUBTYPE_PERMANENT}, {"pit",TT_LINE_SUBTYPE_PIT}, {"presumed",TT_LINE_SUBTYPE_PRESUMED}, {"sand",TT_LINE_SUBTYPE_SAND}, {"surface",TT_LINE_SUBTYPE_SURFACE}, {"temporary",TT_LINE_SUBTYPE_TEMPORARY}, {"underlying",TT_LINE_SUBTYPE_UNDERLYING}, {"unsurveyed",TT_LINE_SUBTYPE_UNSURVEYED}, {"visible", TT_LINE_SUBTYPE_VISIBLE}, {NULL, TT_LINE_SUBTYPE_UNKNOWN}, }; /** * line class. */ class thline : public th2ddataobject { public: friend class thdb2d; int type, ///< Line type. outline, ///< Line outline. closed, ///< How line is closed. csubtype; ///< Current subtype. const char * text; ///< Label text. bool reverse; ///< Whether line should be reversed. bool is_closed; ///< Whether line is closed. double m_height; ///< Height of a pit. class thdb2dlp * first_point, ///< First line point. * last_point; ///< Last line point. void parse_type(char * ss); ///< Parse line type. void parse_subtype(char * ss); ///< Parse line subtype. void parse_border(char * ss); ///< Parse line type. void parse_size(int w, char * ss); ///< Parse line size. void parse_gradient(char * ss); ///< Parse line subtype. void parse_direction(char * ss); ///< Parse line direction. void parse_altitude(char * ss); ///< Parse wall altitude void parse_head(char * ss); ///< Parse line head. void parse_adjust(char * ss); ///< Parse line head. void parse_height(char * ss); ///< Parse pit/chimney height. void parse_text(char * ss); ///< Parse line text. void insert_line_point(int nargs, char ** args, double * nums = NULL); ///< Insert line point. void insert_point_mark(char * ss); ///< Insert line point mark. void preprocess(); ///< Reverse if necessary and close. /** * Standard constructor. */ thline(); /** * Standard destructor. */ ~thline(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thline";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * Return marked line station. */ class thdb2dlp * get_marked_station(const char * mark); /** * Export to metapost file. */ virtual bool export_mp(class thexpmapmpxs * out); /** * Export only path to metapost file. */ virtual unsigned export_path_mp(class thexpmapmpxs * out, int from = 0, int to = -1, int dbglevel = -1); virtual void start_insert(); }; #endif therion/makedepend.pl0000664000175000017500000000035510576400772013713 0ustar useruser# read make file open(MF,"Makefile"); @mflines = ; close(MF); # backup makefile open(MFB,">Makefile~"); print MFB @mflines; close(MFB); foreach $ln (@mflines) { print $ln; if ($ln =~ /^\s*\#\s*DEPENDENCIES/) { last; } } therion/thlang/0000775000175000017500000000000012426431401012520 5ustar userusertherion/thlang/texts.txt0000664000175000017500000014176012302217212014434 0ustar userusertherion: point station bg: реперна точка cz: měřiÄský bod de: Messpunkt el: σημείο χαÏτογÏάφησης en: survey station es: estación fr: station topo it: caposaldo mi: kaimataara pl: punkt pomiarowy pt: base ru: пикет sk: meraÄský bod sq: stacioni I matjes therion: point station:temporary bg: временна реперна точка cz: měřiÄský bod (nestabilizovaný) de: unmarkierter Messpunkt el: Ï€ÏοσωÏινό σημείο χαÏτογÏάφησης en: temporary survey station es: estación topográfica fr: station topo temporaire it: caposaldo termporaneo mi: kaimataara mo te wÄ pl: punkt pomiarowy (niezastabilizowany) pt: base temporária ru: временный пикет sk: meraÄský bod (nestabilizovaný) sq: stacion mates I perkohshem therion: point station:painted bg: реперна точка (боÑдиÑана) cz: měřiÄský bod (zabarvený) de: farbig markierter Messpunkt el: σημείο χαÏτογÏάφησης (βαμμένο) en: painted survey station es: estación (pintada) fr: station topo, peinte it: caposaldo verniciato mi: kaimataara tohi pl: punkt pomiarowy (oznaczony farbÄ…) pt: base pintada ru: нариÑованный пикет sk: meraÄský bod (zafarbený) sq: stacion mates I ngjyrosur therion: point station:natural bg: реперна точка (еÑтеÑтвена) cz: měřiÄský bod (přírodní) de: natürlicher Messpunkt el: σημείο χαÏτογÏάφησης (φυσικό) en: natural survey station es: estación (natural) fr: station topo, naturelle it: caposaldo naturale mi: kaimataara a papa pl: punkt pomiarowy naturalny pt: base natural ru: еÑтеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° привÑзки sk: meraÄský bod (prírodný) sq: stacion mates natyral therion: point station:fixed bg: реперна точка (Ñтабилизирана) cz: měřiÄský bod (stabilizovaný) de: dauerhafter Messpunkt el: μόνιμο σημείο χαÏτογÏάφησης en: fixed survey station es: estación (fija) fr: station topo, fixe it: caposaldo fisso mi: kaimataara whakakÅhatu pl: punkt pomiarowy (zastabilizowany) pt: base fixa ru: репер sk: meraÄský bod (stabilizovaný) sq: stacion mates I palevizshem therion: point flag:entrance bg: вход cz: vchod de: Eingang el: είσοδος en: entrance es: boca fr: entrée it: ingresso mi: ana ngutu pl: wejÅ›cie pt: entrada ru: вход sk: vchod sq: hyrja therion: point flag:sink bg: понор cz: ponor de: Schluckloch el: καταβόθÏα en: sink es: sumidero fr: perte it: perdita mi: tapoko pl: ponor pt: sumidouro ru: Ñток sk: ponor sq: pus therion: point flag:spring bg: извор cz: vývÄ›r de: Quelle el: πηγή en: spring es: surgencia fr: source it: sorgente mi: waipuna pl: wywierzysko pt: nascente ru: иÑток sk: výver sq: burim therion: point flag:doline cz: závrt en: doline sk: závrt therion: point flag:dig bg: изкоп cz: sonda de: Grabung el: διάνοιξη en: dig fr: désobstruction it: disostruzione mi: kari pl: wykop sk: sonda sq: mihje therion: point flag:continuation bg: възможно продължение cz: možné pokraÄování de: Fortsetzung el: πιθανή συνέχεια en: possible continuation es: continuación fr: suite possible it: possibile prosecuzione mi: roanga taea pl: możliwa kontynuacja pt: possível continuação ru: возможное продолжение sk: možné pokraÄovanie sq: vazhdim I mundshem therion: point flag:air-draught bg: въздушно течение cz: průvan de: Luftzug el: Ïοή αέÏα en: air draught es: corriente aire fr: courant d’air it: corrente d'aria mi: tawhiri pl: przewiew pt: presença de vento ru: ток воздуха sk: prievan sq: rrymim i ajrit therion: point flag:arch en: arch sk: skalný oblúk therion: point flag:overhang bg: Ñкална площадка cz: pÅ™evis de: Überhang el: Ï€Ïοέκταση οÏοφής en: overhang es: extraplomo fr: surplomb it: sporgenza mi: tauwharenga pl: przewieszka pt_BR: projeção pt_PT: projecção ru: навиÑание потолка sk: previs sq: varese therion: line survey bg: антена cz: polygonový tah de: Messzug el: γÏαμμή χαÏτογÏάφησης en: survey lines es: poligonal fr: visée topo it: poligonale mi: ruri rÄrangi pl: ciÄ…g pomiarowy pt: linha de topografia ru: нитка хода sk: polygónový Å¥ah sq: vijat matese-vrojtuese therion: point station-name bg: име на реперна точка cz: Äíslo měřiÄského bodu de: Messpunktname el: όνομα σημείου χαÏτογÏάφησης en: survey station name es: nombre estacion fr: station topo, nom it: node del caposaldo mi: kaimatara ingoa pl: numer punktu pomiarowego pt: nome de base ru: номер пикета sk: Äíslo meraÄského bodu sq: emri I stacionit-mates therion: point entrance bg: вход cz: vchod de: Eingang el: είσοδος en: entrance es: boca fr: entrée it: ingresso mi: ana ngutu pl: wejÅ›cie pt: entrada ru: вход sk: vchod sq: hyrja therion: line map-connection bg: Ñвързване на карти cz: spojení map de: zusammenhängende Pläne el: ένωση χαÏτών en: map connection fr: jonction de carte it: riporto di mappa mi: mahere whenua ki te hui pl: połączenie map ru: Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ‹Ð½Ð¾Ñа sk: prepojenie máp sq: lidhjet ne harta therion: line wall bg: Ñтена cz: stÄ›na de: Wand el: τοίχος en: wall es: pared fr: mur it: parete mi: tarÄ pl: Å›ciana pt: parede ru: Ñтена sk: stena sq: muri therion: line wall:bedrock bg: Ñтена (оÑновна Ñкала) cz: stÄ›na de: Wand zum Deckgebirge el: τοίχος en: wall es: pared fr: mur it: roccia mi: tarÄ pl: Å›ciana pt: parede ru: Ñтена sk: stena sq: shkembi-muri therion: line wall:underlying bg: по-ниÑко разположена Ñтена cz: stÄ›na nižší úrovnÄ› de: Wand unterlagernder Gang el: υποκείμενος τοίχος en: underlying wall es: pared subyacente fr: mur sousjacent it: parete:sottostante mi: tÄra ki raro pl: Å›ciana poÅ‚ożona niżej pt: parede subjacente ru: нижераÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ñтена sk: stena nižšej úrovne sq: muri I shtrire therion: line wall:overlying de: überlagerter Wandverlauf en: overlying wall it: parete:sovrastante mi: tÄra ki runga pl: Å›ciana poÅ‚ożona wyżej sk: stena vyššej úrovne therion: line wall:unsurveyed bg: окомерна Ñкица на Ñтените cz: nezaměřená stÄ›na de: Wand unvermessen el: τοίχος (μη χαÏτογÏαφημένος) en: unsurveyed wall es: pared no topografiada fr: mur non topographié it: parete:stimata mi: ka rÅ«ri tÄra pl: Å›ciana nie pomierzona pt: parede não-topografada ru: Ð³Ð»Ð°Ð·Ð¾Ð¼ÐµÑ€Ð½Ð°Ñ Ñъемка Ñтен sk: nezameraná stena sq: muri I pamatur therion: line wall:presumed bg: предполагаема Ñтена cz: pÅ™edpokládaná stÄ›na de: Wand geschätzt el: τοίχος υποθετικός en: presumed wall es: pared supuesta fr: mur supposé it: parete:presunta mi: tÄra whakaaro pl: niewidoczna Å›ciana pt: parede presumida ru: Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð¾Ð³Ð°ÐµÐ¼Ð°Ñ Ñтена sk: predpokladaná stena sq: muri I supozuar therion: line wall:pit de: Eingangsschacht en: entrance pit it: parete:pozzo mi: rua pl: studnia wstÄ™pna sk: vstupná priepasÅ¥ therion: line wall:blocks bg: Ñтена - блокаж cz: zával de: Wand aus Versturz el: ογκόλιθοι en: blocks, breakdown es: bloques fr: effrondrement it: massi mi: pakaru pl: Å›ciana utworzona przez zawalisko pt: desmoronamento ru: глыбы sk: stena tvorená závalom sq: blloqe therion: line wall:debris bg: чакъл cz: Å¡tÄ›rk de: Wand aus Schutt el: χαλάσματα en: debris es: derrubios fr: débris de roche it: detriti mi: otaota pl: Å›ciana utworzona przez żwir pt: escombros ru: щебень sk: stena tvorená suÅ¥ou sq: depozitime/mbetje gurresh therion: line wall:pebbles bg: камъчета cz: valouny de: Wand aus Kies el: χαλίκια en: pebbles es: cantos rodados fr: cailloux it: ciotoli mi: nga kÅhatu iti pl: Å›ciana utworzona przez okrÄ™glaki pt: seixos ru: галька sk: stena tvorená okruhliakmi sq: gurralece therion: line wall:sand bg: пÑÑък cz: písek de: Wand aus Sand el: άμμος en: sand es: arena fr: sable it: sabbia mi: onepÅ« pl: Å›ciana utworzona przez piasek pt: areia ru: пеÑок sk: stena tvorená pieskom sq: rane therion: line wall:clay bg: глина cz: bahno de: Wand aus Lehm el: άÏγιλος en: clay es: arcilla fr: argile it: argilla mi: oneuku pl: Å›ciana z gliny pt: lama ru: глина sk: stena tvorená ílom sq: argjil therion: line wall:ice bg: лед/фирн cz: led de: Wand aus Eis el: πάγος en: ice es: hielo fr: glace it: ghiaccio mi: kÅpaka pl: Å›ciana z lodu pt: gelo ru: лед, фирн sk: stena tvorená ľadom sq: akull therion: line wall:flowstone de: Wand aus Sinter en: flowstone wall it: colata mi: tÄra a pari kÅhatu pl: Å›ciana z nacieków sk: stena tvorená sintrom therion: line wall:moonmilk de: Wand aus Bergmilch en: moonmilk wall it: moonmilk mi: tÄra a mirika marama pl: Å›ciana z miÄ™kkich nacieków sk: stena tvorená mäkkým sintrom therion: point wall-altitude bg: виÑочинна отметка на Ñтената cz: nadmoÅ™ská výška bodu na stÄ›nÄ› de: Höhe über Koordinatenursprung el: Ïψος τοίχου en: altitude es: altura pared fr: altitude it: altezza mi: teitei, tiketike pl: wysokość punktu pomiarowego npm pt: altura ru: выÑÐ¾Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ° Ñтены sk: nadmorská výška bodu na stene sq: lartesia mbidetare e murit therion: point altitude bg: н.м. виÑочина cz: nadmoÅ™ská výška bodu v chodbÄ› de: Höhe über Koordinatenursprung el: Ïψος en: altitude es: altura fr: altitude it: quota mi: teitei, tiketike pl: wysokość punktu pomiarowego npm pt: altura ru: выÑÐ¾Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ° sk: nadmorská výška bodu v chodbe sq: lartesia mbidetare therion: point section bg: мÑÑто на Ñечение cz: příÄný Å™ez de: Schnitt el: τομή en: section es: sección fr: section it: sezione mi: roherohenga pl: przkrój pt_BR: seção pt_PT: secção ru: Ñечение sk: prieÄny rez sq: pike-ndarje therion: line section bg: напречно Ñечение cz: příÄný Å™ez de: Schnittlinie el: τομή en: cross-section es: sección fr: section it: sezione trasversale mi: taha papahanga pl: przekrój pt: corte ru: выноÑÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ ÑÐµÑ‡ÐµÐ½Ð¸Ñ sk: prieÄny rez sq: kryq-ndarje therion: point passage-height bg: виÑочина на галериÑта cz: výška chodby de: Raumhöhe el: Ïψος στοάς en: passage height es: altura galería fr: hauteur du passage it: altezza galleria mi: ara teitei pl: wysokość korytarza pt: altura da galeria ru: выÑота хода sk: výška chodby sq: lartesia e kalimit therion: point passage-height:unsigned bg: виÑочина на галериÑта cz: výška chodby de: Raumhöhe el: Ïψος στοάς en: passage height es: altura galería fr: hauteur du passage it: altezza galleria mi: ara teitei pl: wysokość korytarza pt: altura da galeria ru: выÑота хода sk: výška chodby sq: lartesia e kalimit-e pashenuar therion: point passage-height:positive bg: виÑочина на галериÑта над водата cz: výška chodby nad hladinou de: Raumhöhe nach oben el: Ïψος στοάς πάνω από νεÏÏŒ en: height above water level es: altura sobre nivel del mar fr: hauteur au-dessus de l’eau it: altezza sopra il livello dell'acqua mi: te teitei a karewa ki runga pl: wysokość korytarza nad powierzchniÄ… wody pt: altura acima do nível da água ru: выÑота над уровнем воды sk: výška nad hladinou sq: lartesia mbi nivelin e ujit therion: point passage-height:negative bg: дълбочина на галериÑта под водата cz: výška chodby pod hladinou de: Raumhöhe nach unten el: βάθος στοάς κάτω από νεÏÏŒ en: depth below water level es: profundidad bajo nivel del mar fr: hauteur en dessous de l’eau it: profondità sotto il livello dell'acqua mi: te hÅhunu a karewa ki raro pl: wysokość korytarza pod powierzchniÄ… wody pt: profundidade abaixo do nível da água ru: глубина ниже ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð¾Ð´Ñ‹ sk: hĺbka pod hladinou sq: thellesia nen nivelin e ujit therion: point passage-height:both bg: виÑочина над и дълбочина под водата cz: výška nad i pod hladinou de: Raumhöhe gesamt el: Ïψος και βάθος στοάς πάνω και κάτω από νεÏÏŒ en: height above, depth below water es: altura y profundidad respecto nivel del mar fr: hauteur au dessous et au dessus de l’eau it: altezza sopra e sotto il livello dell'acqua mi: karewa ki runga ki raro pl: wysokość korytarza nad powierzchniÄ… wody i głębokość poniżej poziomu wody pt: altura acima e profundidade abaixo do nível da água ru: выÑота над и глубина ниже ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²Ð¾Ð´Ñ‹ sk: výška nad a hĺbka pod hladinou sq: lartesia mbi dhe nen nivelin e ujit therion: point air-draught bg: въздушно течение cz: průvan de: Luftzug el: Ïοή αέÏα en: air draught es: corriente aire fr: courant d’air it: corrente d'aria mi: tawhiri pl: przewiew pt: presença de vento ru: ток воздуха sk: prievan sq: rrymim i ajrit therion: point air-draught:winter bg: зимен въздушно течение cz: zimní průvan de: Luftzug im Winter el: χειμεÏινή Ïοή αέÏα en: winter air draught fr: courant d’air d’hiver it: circolazione invernale mi: tawhiri a takurua pl: przewiew w zimie ru: ток воздуха зимний sk: zimný prievan sq: rrymim ajri-dimeror therion: point air-draught:summer bg: летен въздушно течение cz: letní průvan de: Luftzug im Sommer el: θεÏινή Ïοή αέÏα en: summer air draught fr: courant d’air d’été it: circolazione estiva mi: tawhiri a raumati pl: przewiew w lecie ru: ток воздуха летний sk: letný prievan sq: rrymim ajri-veror therion: point date bg: дата на наблюдението cz: datum pozorování de: Datum el: ημεÏομηνία en: date of observation es: fecha fr: date it: data d'osservazione mi: rÄ o te titiro pl: data obserwacji pt: data de observação ru: дата Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ sk: dátum pozorovania sq: data e vrojtimit therion: point dig bg: изкоп cz: sonda de: Grabung el: διάνοιξη en: dig fr: désobstruction it: disostruzione mi: kari pl: wykop sk: sonda sq: mihje therion: point continuation bg: възможно продължение cz: možné pokraÄování de: Fortsetzung el: πιθανή συνέχεια en: possible continuation es: continuación fr: suite possible it: possibile prosecuzione mi: roanga taea pl: możliwa kontynuacja pt: possível continuação ru: возможное продолжение sk: možné pokraÄovanie sq: vazhdim I mundshem therion: point narrow-end bg: непроходимо Ñнижаване cz: neprůlezné zúžení de: Engstelle, zu schmal el: κλείσιμο στοάς λόγω στενώματος en: passage end, narrow es: final estrecho fr: passage impénétrable it: chiude su strettoia mi: putanga kuiti mutunga pl: zwężenie nie do przejÅ›cia pt: passagem com final estreito ru: Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑƒÐ·Ð¾Ñть sk: neprielezné zúženie sq: kalim I ngushte-fund therion: point low-end bg: хоризонтално ÑтеÑнение cz: neprůlezné snížení de: Engstelle, zu flach el: κλείσιμο στοάς λόγω χαμηλής οÏοφής en: passage end, low es: final bajo fr: passage bas it: chiude su laminatoio mi: putanga pÄpaku mutunga pl: obniżenie nie do przejÅ›cia pt: passagem com final baixo ru: Ð³Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑƒÐ·Ð¾Ñть sk: neprielezné zníženie sq: kalim I poshtem-fund therion: point flowstone-choke bg: блокирано от натеци cz: zasintrovaný konec de: Fortsetzung zugesintert el: κλείσιμο στοάς λόγο ÏƒÏ„Î±Î»Î±Î³Î¼Î¹Ï„Î¹ÎºÎ¿Ï Î±Ï€Î¿Î¸Î­Î¼Î±Ï„Î¿Ï‚ en: flowstone choke es: colmatado por concreción fr: trémie calcifiée it: chiude su colata mi: nati pari kÅhatu pl: koniec zamkniÄ™ty naciekami pt: obstrução por escorrimento ru: блокировано натеками sk: zasintrený koniec sq: mbyllje me gurre-rrjedhes therion: point breakdown-choke bg: затворено от Ñрутище cz: zavalený konec de: Fortsetzung verstürzt el: κλείσιμο στοάς λόγο χαλάσματος en: breakdown choke es: colmatado por derrumbe fr: trémie it: chiude su frana mi: nati pakaru pl: koniec zawalony pt: obstrução por desmoronamento ru: блокировано обвалом sk: zavalený koniec sq: gurre rrjedhes-fund therion: point clay-choke de: Fortsetzung verlehmt en: clay choke it: chiude su riempimento mi: uku pari pl: koniec zamkniÄ™ty glinÄ… sk: koniec uzavretý ílom therion: line floor-step bg: праг cz: stupeň de: Bodenstufe el: σκαλοπάτι en: floor step es: resalte fr: marche it: gradino mi: tapuae pl: próg pt: degrau ru: уÑтуп пола sk: stupeň sq: shkalle ne dysheme therion: line overhang bg: Ñкална площадка cz: pÅ™evis de: Überhang el: Ï€Ïοέκταση οÏοφής en: overhang es: extraplomo fr: surplomb it: sporgenza mi: tauwharenga pl: przewieszka pt_BR: projeção pt_PT: projecção ru: навиÑание потолка sk: previs sq: varese therion: line floor-meander bg: меандър, канал в пода cz: meandr ve dnÄ› de: Bodenmäander el: μαίανδÏος δαπέδου en: floor meander es: meandro fr: méandre au sol it: meandro mi: kopiko pl: meander w dnie pt: meandro no piso ru: меандр, канал в полу sk: meander v dne sq: rrjedhe uji gjarperore therion: line pit bg: кладенец cz: propast de: Schacht el: πηγάδι en_UK: pitch en_US: pit es: pozo fr: puits it: pozzo mi: tupari pl: studnia pt: desnível ru: колодец sk: priepasÅ¥ sq: ngjitje therion: line ceiling-step bg: ниша в тавана cz: zmÄ›na výšky stropu de: Deckenstufe el: σκαλοπάτι οÏοφής en: ceiling step es: resalte inverso fr: marche de plafond it: gradino a soffitto mi: tapuae ki te tuanui pl: zmiana wysokoÅ›ci stropu pt_BR: degrau no teto pt_PT: degrau no tecto ru: уÑтуп потолка sk: zmena výšky stropu sq: shkalle ne tavan therion: line ceiling-meander bg: меандър, канал в тавана cz: stropní meandr de: Deckenmäander el: μαίανδÏος οÏοφής en: ceiling meander es: meandro inverso fr: méandre de plafond it: canale di volta mi: kopiko tuanui pl: meander w stropie pt_BR: meandro no teto pt_PT: meandro no tecto ru: меандр, канал в потолке sk: stropný meander sq: rrjedhe uji gjarperore ne tavan therion: line chimney bg: комин cz: komín de: Schlot el: καμινάδα en: chimney es: chimenea fr: cheminée it: camino mi: tumera pl: komin pt: chaminé ru: труба sk: komín sq: oxhak therion: line gradient bg: наклон на галериÑта cz: sklon chodby de: Gefälle el: κλίση στοάς en: passage gradient es: gradiente fr: pente it: scivolo mi: heke pl: nachylenie korytarza pt: declividade da galeria ru: уклон хода sk: sklon chodby sq: pjertesia e kalimit therion: point gradient bg: наклон на галериÑта cz: sklon chodby de: Gefälle el: κλίση στοάς en: passage gradient es: gradiente fr: pente it: scivolo mi: harapaki putanga pl: nachylenie korytarza pt: declividade da galeria ru: уклон хода sk: sklon chodby sq: pjertesia e kalimit therion: point height bg: виÑочина на праг/комин/кладенец cz: výška stupnÄ›/komínu/hloubka propasti de: Höhe der Stufe oder des Schlotes oder Tiefe des Schachts el: Ïψος σκαλοπατιοÏ/καμινάδας ή βάθος Ï€Î·Î³Î±Î´Î¹Î¿Ï en: pit/chimney/step depth/height es: altura resalte/chimenea/profundidad pozo fr: hauteur d’une marche/d’une cheminée/profondeur it: altezza mi: papa tapuae/tumera/teitei rua/hÅhonu pl: wysokość progu/komina/głębokość studni pt: altura do chão para degrau/chaminé/desnível ru: выÑота уÑтупа/трубы/колодца sk: hĺbka/výška priepasti/stupňa/komína sq: lartesia e shkalles ne dysheme/oxhaku/thellesia e leshimit therion: point dimensions bg: размери на галериÑта cz: rozmÄ›ry de: Ausdehnung el: διαστάσεις en: dimensions es: dimensiones fr: proportions it: dimensione mi: rahinga, meiha pl: rozmiary pt: dimensões ru: размеры хода sk: rozmery sq: dimenzionet therion: point height:unsigned bg: виÑочина на ниша в тавана cz: výška stupnÄ› de: Höhe der Bodenstufe el: Ïψος ÏƒÎºÎ±Î»Î¿Ï€Î±Ï„Î¹Î¿Ï en: floor step height es: altura resalte fr: hauteur d’une marche it: altezza camino mi: teitei papa tapuae pl: wysokość progu pt: altura do degrau no chão ru: выÑота уÑтупа sk: výška stupňa sq: lartesia e shkalles se dyshemes therion: point height:positive bg: виÑочина на комин cz: výška komínu de: Höhe des Schlotes el: Ïψος καμινάδας en: chimney height es: altura chimenea fr: hauteur d’une cheminée it: altezza camino mi: teitei tumera pl: wysokość komina pt: altura da chaminé ru: выÑота трубы sk: výška komína sq: lartesia e oxhakut therion: point height:negative bg: Дълбочина на кладенец cz: hloubka propasti de: Tiefe des Schachts el: βάθος Ï€Î·Î³Î±Î´Î¹Î¿Ï en: pit depth es: profundidad pozo fr: profondeur it: prodondità pozzo mi: rua hÅhonu pl: głębokosc studni pt: profundidade do desnível ru: выÑота колодца sk: hĺbka priepasti sq: thellesia e leshimit therion: line contour bg: контур cz: vrstevnice de: Höhenlinie el: ισοϋψής en: contour es: contorno fr: contour it: contorno mi: koru pl: poziomica pt: contorno ru: контур sk: vrstevnica sq: kontura therion: line slope bg: Ñклон cz: svah de: Hangform el: κλίση en: slope es: pendiente fr: pente it: scivolo mi: tupari pl: pochyÅ‚a powierzchnia pt: declive ru: Ñклон sk: Å¡ikmá plocha sq: breg therion: line rock-border bg: външен ръб на камък cz: kameny de: Umriss eines Felsens el: πεÏίγÏαμμα βÏάχου en: rock border es: contorno bloque fr: bord d’un rocher it: bordo masso mi: rohe kÅhatu pl: obrys kamienia pt: lateral da rocha ru: внешний кромка глыбы sk: obrys kameňa sq: kufij shkembinjsh therion: line rock-edge bg: вътрешен ръб на камък cz: hrany kamenů de: Struktur eines Felsens el: άκÏη βÏάχου en: rock edges es: arista bloque fr: arête d’un rocher it: spigolo masso mi: mata kohatu pl: krawÄ™dzie kamienia pt: bordas da rocha ru: внутреннÑÑ ÐºÑ€Ð¾Ð¼ÐºÐ° глыбы sk: hrany kameňa sq: skaji I shkembit therion: point bedrock bg: оÑновна Ñкала cz: pevná skála de: Deckgebirge el: πέτÏωμα en: bedrock es: roca madre fr: roche it: roccia mi: koiwi a papa pl: lita skaÅ‚a pt: rocha encaixante ru: ÐºÐ¾Ñ€ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ñ€Ð¾Ð´Ð° sk: pevná skala sq: shtrat shkembi therion: point blocks bg: камъни, блокаж cz: kamenné bloky de: Blöcke el: ογκόλιθοι en: blocks, breakdown es: bloques fr: blocs it: massi mi: pakaru pl: kamienne bloki pt: blocos, desmoronamento ru: глыбы, завал sk: kamenné bloky sq: blloqe, shembje therion: point debris bg: чакъл cz: Å¡tÄ›rk de: Schutt el: χαλάσματα en: debris es: derrubios fr: débris it: detriti mi: otaota pl: żwir pt: escombros ru: щебень sk: sutina sq: mbetje-mbeturina therion: point sand bg: пÑÑък cz: písek de: Sand el: άμμος en: sand es: arena fr: sable it: sabbia mi: onepÅ« pl: piasek pt: areia ru: пеÑок sk: piesok sq: rane therion: point clay bg: глина cz: bahno de: Lehm el: άÏγιλος en: clay es: arcilla fr: argile it: argilla mi: oneuku pl: glina pt: lama ru: глина sk: íl sq: argjil therion: point water bg: вода cz: voda de: Wasser el: νεÏÏŒ en: water es: agua fr: eau it: acqua mi: wai pl: woda pt: água ru: вода sk: voda sq: uje therion: point ice bg: лед cz: led de: Eis el: πάγος en: ice es: hielo fr: glace it: ghiaccio mi: kÅpaka pl: lód pt: gelo ru: лёд sk: ľad sq: akull therion: point snow bg: ÑнÑг cz: sníh de: Schnee el: χιώνι en: snow es: nieve fr: neige it: neve mi: huka pl: Å›nieg pt: neve ru: Ñнег sk: sneh sq: bore therion: point pebbles bg: камъчета cz: valouny de: Kies el: χαλίκια en: pebbles es: cantos rodados fr: galets it: ciotoli mi: nga kÅhatu iti pl: okrÄ™glaki pt: seixos ru: галька sk: okruhliaky sq: gurralece therion: point raft bg: наÑип cz: náplav de: schwimmendes Kalkhäutchen el: σταλαγμιτικό υλικό που επιπλέει en: calcite raft es: calcita flotante fr: calcite flottante it: calcite flottante mi: mÅkihi o kÅhatu hÅhonu pl: nanios pt: jangada ru: выÑыпка sk: náplav sq: trap-skele therion: point guano bg: гуано cz: guano de: Guano el: γκουανό (πεÏιττώματα νυχτεÏίδων) en: guano es: guano fr: guano it: guano mi: tutae pl: guano pt: guano ru: гуано sk: guáno sq: jashteqitje e lakuriqeve-guano therion: point clay-tree de: Lehmbäumchen en: clay tree it: pini d'argilla mi: rakau oneuku therion: line border bg: граница cz: ohraniÄení de: Begrenzung el: άκÏη en: border es: límite fr: bord it: bordo mi: rohe pl: granica pt: borda ru: граница sk: ohraniÄenie sq: kufiri therion: line border:visible bg: видима граница cz: ohraniÄení de: sichtbare Begrenzung el: άκÏη en: border es: límite fr: bord it: bordo mi: rohe pl: granica pt: borda ru: Ð²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° sk: ohraniÄenie sq: vije kufiri-e dukshme therion: line border:temporary bg: временна граница cz: nestálé ohraniÄení de: vorübergehende Begrenzung el: Ï€ÏοσωÏινή άκÏη en: temporary border es: límite temporal fr: bord, temporaire it: bordo temporaneo mi: rohe mo te wÄ pl: tymczasowa granica pt: borda temporária ru: Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° sk: nestále ohraniÄenie sq: kufij i perkohshem therion: line border:presumed bg: предполагаема граница cz: pÅ™edpokládané ohraniÄení de: geschätzte Begrenzung el: υποθετική άκÏη en: presumed border es: límite supuesto fr: bord, supposé it: bordo presunto mi: rohe whakaaringa whakaaro pl: niewidoczna granica pt: borda presumida ru: Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÐ¼Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° sk: predpokladané ohraniÄenie sq: kufij I supozuar therion: area water bg: вода cz: vodní plocha de: Wasserfläche el: νεÏÏŒ en: water es: agua fr: eau it: acqua mi: wai pl: powierzchnia wody pt: água ru: вода sk: vodná plocha sq: uje therion: area sump bg: Ñифон cz: sifon de: Siphonfläche el: σιφόνι en: sump es: sifón fr: siphon it: sifone mi: kari a wai pl: syfon pt: sifão ru: Ñифон sk: zatopená plocha (sifón) sq: sifoni therion: area snow bg: ÑнÑг cz: sníh de: Schneefläche el: χιόνι en: snow es: nieve fr: neige it: neve mi: huka pl: Å›nieg pt: neve ru: Ñнег sk: sneh sq: bore therion: area ice bg: лед cz: led de: Eisfläche el: πάγος en: ice es: hielo fr: glace it: ghiaccio mi: kÅpaka pl: lód pt: gelo ru: лёд sk: ľad sq: akull therion: area sand bg: пÑÑък cz: písek de: Sandfläche el: άμμος en: sand es: arena fr: sable it: sabbia mi: onepÅ« pl: piasek pt: areia ru: пеÑок sk: piesok sq: rane therion: area clay bg: глина cz: bahno de: Lehmfläche el: άÏγιλος en: clay es: arcilla fr: argile it: argilla mi: oneuku pl: glina pt: lama ru: глина sk: íl sq: argjil therion: area pebbles bg: камъчета cz: valouny de: Kiesfläche el: χαλίκια en: pebbles es: cantos rodados fr: galets/pierres it: ciotoli mi: nga kÅhatu iti pl: okrÄ™glaki pt: seixos ru: галька sk: okrúhliaky sq: gurralece therion: area debris bg: чакъл cz: Å¡tÄ›rk de: Schuttfläche el: χαλάσματα en: debris es: derrubios fr: débris it: detriti mi: otaota pl: żwir pt: escombros ru: щебень sk: Å¡trk sq: mbetje-gurresh therion: area flowstone bg: каменен водопад cz: sintrové náteky de: flächiger Sinter el: σταλαγμιτικό υλικό δαπέδου en: flowstone es: concreción fr: concrétion it: concrezione pt: escorrimento ru: натечный каÑкад sk: sintrové náteky sq: gurre-rrjedhes therion: area moonmilk bg: пещерно млÑко cz: nickamínek de: Bergmilch el: γάλα σπηλαίου en: moonmilk fr: mondmilch it: moonmilk ru: лунное молоко sk: náteky mäkkého sintra sq: qumesht-hena therion: area blocks bg: блокаж cz: skalní bloky de: Fläche mit Blöcken el: ογκόλιθοι en: blocks, breakdown es: bloques fr: blocs it: massi mi: pakaru a kÅhatunui pl: bloki skalne pt: blocos ru: навал глыб sk: skalné bloky sq: blloqe therion: area bedrock bg: оÑновна Ñкала cz: pevná skála de: Deckgebirge el: πέτÏωμα en: bedrock es: roca madre fr: roche it: roccia pt: rocha encaixante ru: ÐºÐ¾Ñ€ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ñ€Ð¾Ð´Ð° sk: pevná skala sq: shtrat shkembi therion: line water-flow bg: водно течение cz: vodní tok de: Gerinne el: υδÏοÏÏοή en: water flow es: curso agua fr: rivière it: corso d'acqua mi: wairere pl: ciek wodny pt: fluxo de água ru: водоток sk: vodný tok sq: rrjedhe uji therion: point water-flow bg: водно течение cz: vodní tok de: Gerinne el: υδÏοÏÏοή en: water flow es: curso agua fr: rivière it: corso d'acqua mi: wairere pl: ciek wodny pt: fluxo de água ru: водоток sk: vodný tok sq: rrjedhe uji therion: line water-flow:permanent bg: поÑтоÑнно водно течение cz: vodní tok de: ständiges Gerinne el: μόνιμη υδÏοÏÏοή en: water flow es: curso agua fr: rivière, permanente it: corso d'acqua permanente mi: wairere pl: ciek wodny pt: fluxo de água permanente ru: поÑтоÑнный водоток sk: vodný tok sq: rrjedhe uji e perhershme therion: point water-flow:permanent bg: поÑтоÑнно водно течение cz: vodní tok de: ständiges Gerinne el: μόνιμη υδÏοÏÏοή en: water flow es: curso agua fr: rivière, permanente it: corso d'acqua permanente mi: wairere pl: ciek wodny pt: fluxo de água permanente ru: поÑтоÑнный водоток sk: vodný tok sq: rrjedhe uji e perhershme therion: line water-flow:intermittent bg: периодично водно течение cz: obÄasný vodní tok de: zeitweises Gerinne el: διακοπτόμενη υδÏοÏÏοή en: intermittent water flow es: curso agua intermitente fr: rivière, intermittente it: corso d'acqua temporaneo mi: wairere taumutumutu pl: okresowy ciek wodny pt: fluxo de água intermitente ru: непоÑтоÑнный водоток sk: obÄasný vodný tok sq: rrjedhe uji me force therion: point water-flow:intermittent bg: непоÑтоÑнно водно течение cz: obÄasný vodní tok de: zeitweises Gerinne el: διακοπτόμενη υδÏοÏÏοή en: intermittent water flow es: curso agua intermitente fr: rivière, intermittente it: corso d'acqua temporaneo mi: wairere taumutumutu pl: okresowy ciek wodny pt: fluxo de água intermitente ru: непоÑтоÑнный водоток sk: obÄasný vodný tok sq: rrjedhe uji me force therion: line water-flow:conjectural bg: предполагаемо водно течение cz: pÅ™edpokládaný vodní tok de: vermutetes Gerinne el: υποτιθέμενη υδÏοÏÏοή en: conjectural water flow es: curso agua supuesto fr: rivière, conjoncturelle it: corso d'acqua presunto mi: wairere a pÄtai pl: przewidywany ciek wodny pt: fluxo de água suposto ru: предполагаемый водоток sk: predpokladaný vodný tok sq: rrjedhe uji e supozuar therion: point water-flow:paleo bg: палео речно легло cz: paleoÅ™eÄiÅ¡tÄ› de: ehemaliges Gerinne el: παλαιουδÏοÏÏοή en: paleo water flow (scallops) es: paleocurso agua fr: rivière fossile it: paleocorso d'acqua mi: wairere nehera pl: stary ciek wodny pt: paleo-fluxo de água ru: палео-поток sk: paleorieÄisko sq: rrjedhe uji e vjeter therion: point spring bg: извор cz: vývÄ›r de: Quelle el: πηγή en: spring es: surgencia fr: source it: sorgente mi: waipuna pl: wywierzysko pt: nascente ru: иÑток sk: výver sq: burim therion: point sink bg: понор cz: ponor de: Schluckloch el: καταβόθÏα en: sink es: sumidero fr: perte it: perdita mi: tapoko pl: ponor pt: sumidouro ru: Ñток sk: ponor sq: pus therion: point flowstone bg: натек cz: sintr de: flächiger Sinter el: σταλαγμιτικό υλικό δαπέδου en: flowstone es: concreción fr: concrétions it: concrezione mi: pari kÅhatu pl: nacieki pt: escorrimento ru: натек sk: sinter sq: gurre-rrjedhes therion: line flowstone bg: каменен водопад cz: sintrové náteky de: flächiger Sinter el: σταλαγμιτικό υλικό δαπέδου en: flowstone es: concreción fr: concrétion it: concrezione mi: pari kÅhatu pl: nacieki pt: escorrimento ru: натечный каÑкад sk: sintrové náteky sq: gurre-rrjedhes therion: point moonmilk bg: пещерно млÑко cz: nickamínek de: Bergmilch el: γάλα σπηλαίου en: moonmilk es: mondmilch fr: mondmilch it: moonmilk mi: mirika marama pl: miÄ™kkie nacieki pt: leite-de-lua ru: лунное молоко sk: mäkký sinter sq: qumesht-hena therion: line moonmilk bg: пещерно млÑко cz: nickamínek de: Bergmilch el: γάλα σπηλαίου en: moonmilk fr: mondmilch it: moonmilk mi: mirika marama pl: miÄ™kkie nacieki ru: лунное молоко sk: náteky mäkkého sintra sq: qumesht-hena therion: point stalactite bg: Ñталактит cz: stalaktit de: Stalaktit el: σταλακτίτης en: stalactite es: estalactita fr: stalactite it: stalattite mi: kÅhatu ki te haere ki runga pl: stalaktyt pt: estalactite ru: Ñталактит sk: stalaktit sq: stalaktit therion: point stalactites therion: point stalagmite bg: Ñталагмит cz: stalagmit de: Stalagmit el: σταλαγμίτης en: stalagmite es: estalagmita fr: stalagmite it: stalagmite mi: kÅhatu ki te haere ki raro pl: stalagmit pt: estalagmite ru: Ñталагмит sk: stalagmit sq: stalagmit therion: point stalagmites therion: point pillar bg: Ñталактон cz: stalagnát de: Säule el: κολόνα en: pillar es: pilar fr: pillier it: colonna mi: pou pl: stalagnat pt: coluna ru: колонна sk: stalagnát sq: shtylle therion: point pillars therion: point ice-stalactite de: Eisstalaktit en: ice stalactite it: stalattite di ghiaccio mi: kÅpaka ki te haere ki runga pl: lodowy stalaktyt sk: ľadový stalaktit therion: point ice-stalagmite de: Eisstalagmit en: ice stalagmite it: stalagmite di ghiaccio mi: kÅpaka ki te haere ki raro pl: lodowy stalagmit sk: ľadový stalagmit therion: point ice-pillar de: Eissäule en: ice pillar it: colonna di ghiaccio mi: pou KÅpaka pl: lodowy stalagnat sk: ľadový stalagnát therion: point curtain bg: Ð´Ñ€Ð°Ð¿ÐµÑ€Ð¸Ñ cz: sintrové záclony de: Sinterfahne el: κουÏτίνα en: curtain es: cortina fr: rideau it: cortina mi: araia pl: draperie naciekowe pt: cortina ru: натечный Ð·Ð°Ð½Ð°Ð²ÐµÑ sk: sintrové záclony sq: perde therion: point soda-straw bg: цевичен Ñталактит cz: brÄka de: Makkaroni el: μακαÏόνια en: soda straw es: fistulosa fr: fistuleuse it: tubolare mi: pÅ« ngote pl: nacieki pt: canudos pt_PT: tubulares ru: Ñталактиты-Ñоломины sk: brÄká sq: shkopinje sode therion: point popcorn bg: коралити cz: pizolity de: Blumenkohlsinter el: μανιτάÏια από σταλαγμιτικό υλικό en: popcorn es: coliflor fr: choux-fleur it: cavolfiore mi: kanga pÄhuuhuu pl: pizolity pt: couve-flor ru: коралиты sk: pizolity sq: palagaqa-kokorroshka therion: point cave-pearl bg: пещерен биÑер cz: jeskynní perly de: Höhlenperle el: μαÏγαÏιτάÏι των σπηλαίων en: cave pearl es: perla de caverna fr: perle des cavernes it: pisolite mi: ana kahurangi pl: perÅ‚y jaskiniowe pt_BR: pérolas pt_PT: pérolas de Gruta ru: пещерный жемчуг sk: jaskynné perly sq: margaritar te shpelles therion: point disk bg: диÑк cz: disk de: Diskus el: δίσκος en: disk es: disco fr: disque it: disco mi: kiwhi pl: dysk pt: disco ru: диÑк sk: disk sq: pllake therion: point helictite bg: хеликтити cz: heliktit de: Excentrique el: ελικτίτης en: helictite es: excéntrica fr: excentrique/hélictite it: eccentrica mi: pÄkeho torotoro pl: heliktyt pt_BR: helictite pt_PT: excêntrica ru: геликтиты sk: heliktit sq: heliktite therion: point aragonite bg: арагонит cz: aragonit de: Aragonit el: αÏαγονίτης en: aragonite es: aragonito fr: aragonite it: aragonite mi: pÄkeho tuarua pl: aragonit pt_BR: aragonita pt_PT: aragonite ru: арагонит sk: aragonit sq: aragonite therion: point crystal bg: криÑтал cz: krystal de: Kristall el: κÏÏσταλλο en: crystal es: cristal fr: cristaux it: cristallo mi: kohatu piata pl: krysztaÅ‚ pt: cristal ru: криÑталлы sk: kryÅ¡tál sq: kristale therion: point wall-calcite bg: повлек cz: vápencový povlak de: Wandsinter el: ασβεστίτης τοιχώματος en: wall calcite es: calcita fr: mur, calcite it: calcite mi: tÄra a nga roimata a pakeho pl: wapienna powÅ‚oka pt_BR: parede de calcita pt_PT: parede de calcite ru: наÑтенный кальцит sk: vápencový povlak sq: kalcit-muri therion: point gypsum bg: Ð³Ð¸Ð¿Ñ cz: sádrovec de: Gips el: γÏψος en: gypsum es: yeso fr: gypse it: gesso mi: tote pl: gips pt: gipsita ru: Ð³Ð¸Ð¿Ñ sk: sádrovec sq: gjips therion: point gypsum-flower bg: гипÑово цвете cz: sádrovcový kvÄ›t de: Gipsblume el: άνθος γÏψου en: gypsum flower es: flor yeso fr: fleur de gypse it: fiore di gesso mi: putiputi tote pl: gipsowy kwiat pt: flor de gipsita ru: гипÑовые цветы sk: sádrovcový kvet sq: lule gjipsi therion: point rimstone-dam bg: Ñухо Ñинтрово езеро cz: sintrová hrázka de: Sinterbarriere el: Î³ÎºÎ¿Ï…Ï (λιθωματικό φÏάγμα) en: rimstone dam es: gour-presa fr: gours it: gour mi: kÅhatu matatara pl: naciekowa przegroda pt: travertino ru: гуры без воды sk: sintrová hrádza sq: penda guri therion: point rimstone-pool bg: Ñинтрово езеро cz: sintrové jezírko de: Sinterbecken el: Î³ÎºÎ¿Ï…Ï (λιθωματική λεκάνη) en: rimstone pool es: gour-poza fr: gour it: vasca mi: kÅhatu kopua wai pl: jeziorko naciekowe pt: lago travertino ru: гуры Ñ Ð²Ð¾Ð´Ð¾Ð¹ sk: sintrové jazierko sq: vaska uji therion: point anastomosis bg: анаÑтомоза cz: anastomóza de: Anastomose el: αναστόμωση en: anastomosis es: anastomosis fr: anastomose it: anastomosi mi: peka hono pl: anastomoza pt: anastomose ru: анаÑÑ‚Ð¾Ð¼Ð¾Ð·Ð¸Ñ sk: anastomóza sq: anastomosa(kuartz) therion: point karren bg: кари cz: Å¡krapy de: Karren el: κάÏÏεν - γυμνός καÏστικοποιημένος βÏάχος en: karren es: lapiaz fr: lapiez it: karren mi: awaawa pl: żłobki krasowe pt: lapiás ru: карры sk: Å¡krapy sq: karreni therion: point scallop bg: фаÑетки cz: erozní útvary de: Fließfacette el: σκάλοπ (κενά διάβÏωσης) en: scallop es: cavitaciones fr: vagues d’érosion (coups de gouge) it: scallop mi: anatipa pl: formy erozyjne pt: marcas de fluxo ru: фаÑетки sk: lastúrovité jamky sq: guacat therion: point flute bg: карни жлебове cz: píšťaly de: Kolk el: αυλάκι διάβÏωσης en: flute es: canaleta fr: marmites it: scanalatura mi: koauau pl: marmity pt: marcas de fluxo ru: канавки sk: píšťaly sq: flauta therion: point raft-cone bg: наÑипен ÐºÐ¾Ð½ÑƒÑ cz: náplavový kužel de: schwimmendes Kalkhäutchen el: σταλαγμιτικός κώνος που επιπλέει en: raft cone es: conos fr: cone it: calcite flottante mi: korere a mÅkihi kÅhatu hÅhonu pl: nanios pt: cone de jangada ru: выÑыпной ÐºÐ¾Ð½ÑƒÑ sk: náplavový kužeľ sq: rrjedhe uji konike therion: point archeo-material bg: археологичеÑка находка cz: archeologické nálezy de: archäologischer Fund el: αÏχαιολογικό εÏÏημα en: archaeological material es: yacimiento (arq) fr: matériel archéo it: materiale archeologico mi: taonga o nehe pl: znaleziska archeologiczne pt: material arqueológico ru: археологичеÑÐºÐ°Ñ Ð½Ð°Ñ…Ð¾Ð´ÐºÐ° sk: archeologické nálezy sq: material arkeologjik therion: point paleo-material bg: палеонтологична находка cz: paleontologické nálezy de: paläontologischer Fund el: παλαιοντολογικό εÏÏημα en: paleo material es: yacimiento (pal) fr: matériel paléo it: materiale paleologico mi: taiao taonga o nehe pl: znaleziska paleontologiczne pt: material paleontológico ru: палео-находка sk: paleontologické nálezy sq: paleo-material therion: point vegetable-debris bg: оÑтанки от раÑтителноÑÑ‚ cz: zbytky rostlin de: Pflanzenreste el: φυτικά κατάλοιπα en: vegetable debris es: detritus vegetales fr: débris végétaux it: detriti vegetali mi: otaota a hua whenua pl: szczÄ…tki roÅ›linne pt: restos vegetais ru: оÑтанки раÑтительноÑти sk: zvyÅ¡ky rastlín sq: mbetje perimesh therion: point root bg: корени cz: koÅ™eny de: Holzreste el: Ïίζες en: root es: raíz fr: racine it: radice mi: pakiaka pl: korzenie pt: raiz ru: корни раÑтений sk: korene sq: rrenje therion: point no-equipment bg: липÑва екипировка! cz: nevystrojené místo de: keine Ausrüstung el: χωÏίς υλικά en: no equipment! es: sin equipar fr: pas d’équipement it: senza armo mi: wahi a taonga mahi kore pl: miejsce bez punktu asekuracyjnego pt: local sem equipamento ru: ÑнарÑжение отутÑтвует! sk: nevystrojené miesto sq: vend pa pajisje therion: point anchor bg: закрепване cz: kotvení de: Seilbefestigung el: αγκÏÏωση en: anchor es: anclaje fr: ancrage it: ancoraggio mi: punga pl: punkt asekuracyjny pt: ancoragem ru: ИТО sk: kotvenie sq: pike-sigurimi therion: point rope bg: въже cz: lano de: Seil el: σχοινί en: rope es: cuerda fr: corde it: corda mi: taura pl: lina pt: corda ru: Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¾Ð¿Ð¾Ñ€Ð° sk: lano sq: litar therion: line rope therion: point rope-ladder bg: пещерна Ñтълба cz: lanový žebřík de: Drahtseilleiter el: ανεμόσκαλα en: rope ladder es: escala fr: échelle de corde it: scala di corda mi: arawhata taura pl: drabinka linowa pt: escada de corda ru: Ð³Ð¸Ð±ÐºÐ°Ñ Ð»ÐµÑтница sk: lanový rebrík sq: shkalle litari therion: line rope-ladder therion: point fixed-ladder bg: Ñтационарна Ñтълба cz: pevný žebřík de: feste Leiter el: μόνιμη σκάλα en: fixed ladder es: escala fija fr: échelle fixe it: scala fissa mi: arawhata pl: sztywna drabinka pt: escada fixa ru: жеÑÑ‚ÐºÐ°Ñ Ð»ÐµÑтница sk: fixný rebrík sq: shkalle fikse therion: line fixed-ladder therion: point steps bg: Ñтъпала cz: schody de: Stufen el: σκαλοπάτια en: steps es: escalones fr: marches it: scalini mi: nga tapuae pl: schody pt: degraus ru: Ñтупени sk: schody sq: shkalle therion: line steps therion: point via-ferrata therion: line via-ferrata therion: point traverse bg: Ñ‚Ñ€Ð°Ð²ÐµÑ€Ñ cz: traverz de: Querung el: Ï„ÏαβέÏσα en: traverse es: pasamanos fr: traversée it: traverso mi: hikoi a tupari pl: trawers pt: travessia ru: троллей sk: traverz sq: kalim anesore therion: point bridge bg: моÑÑ‚ cz: most de: Brücke el: γέφυÏα en: bridge es: puente roca fr: pont it: ponte di roccia mi: piriti pl: most pt: ponte ru: моÑÑ‚ sk: most sq: ure therion: point handrail therion: line handrail therion: point camp bg: лагер cz: bivak de: Biwak el: κατασκήνωση en: camp es: campamento fr: camp it: campo mi: topuni pl: biwak pt: acampamento ru: ПБЛ sk: bivak sq: vend-pushim therion: point remark bg: забележка cz: poznámka de: Bemerkung el: σχόλιο en: remark es: nota fr: remarque it: nota mi: korero pl: uwaga pt: anotação ru: заметка sk: poznámka sq: shenim therion: point label bg: етикет cz: pojmenování de: Beschriftung el: πεÏιγÏαφή en: label es: etiqueta fr: libellé it: etichetta mi: ingoa pl: nazwa pt: indicação ru: текÑÑ‚Ð¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° sk: pomenovanie sq: mbishkrim-etiket therion: line label bg: етикет cz: pojmenování de: Beschriftung el: πεÏιγÏαφή en: label es: etiqueta fr: libellé it: etichetta mi: ingoa pl: nazwa pt: indicação ru: текÑÑ‚Ð¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° sk: pomenovanie sq: mbishkrim therion: title legend bg: Легенда cz: Legenda de: Legende el: Τίτλος en: Legend es: Leyenda fr: Légende it: Legenda mi: Kaiwhakaatu pl: legenda pt: Legenda ru: УÑловные Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ sk: Legenda sq: permbajtja therion: title color-legend-altitude bg: ВиÑочинна Ñкала cz: NadmoÅ™ské výšky de: Höhe des Titelfeldes el: ΥψομετÏικά en: Altitudes es: color (altitud) fr: Altitudes it: Profondità mi: Teitei, Tiketike pl: wysokoÅ›ci npm pt: Altitudes ru: Ð’Ñ‹ÑÐ¾Ñ‚Ð½Ð°Ñ ÑˆÐºÐ°Ð»Ð° sk: Nadmorské výšky sq: titulli ngjyra-permbajtja-lartesia mbidetare therion: title color-legend-map bg: Карти cz: Mapy de: Karten el: ΧάÏτες en: Maps es: color (mapa) fr: Cartes it: Mappa mi: Mahere whenua pl: mapy pt: Mapas ru: Карты sk: Mapy sq: hartat therion: units ft bg: футове cz: ft de: ft el: πόδια en: ft es: ft fr: ft it: ft mi: whÄ«ti pl: ft (stopy) pt: pés ru: футов sk: ft sq: njesia matese-kembe therion: title cave length bg: Дължина cz: Délka de: Gesamtlänge el: Μήκος en: Length es: Desarrollo fr: Longueur it: Sviluppo mi: Roa a ana pl: dÅ‚ugość pt: Extensão ru: Длина sk: Dĺžka sq: gjatesia therion: units m bg: м cz: m de: m el: μ en: m es: m fr: m it: m mi: mehua pl: m (metry) pt: m ru: м sk: m sq: njesia matese-metri therion: title cave depth bg: Ð”ÐµÐ½Ð¸Ð²ÐµÐ»Ð°Ñ†Ð¸Ñ cz: PÅ™evýšení de: Niveaudifferenz el: Βάθος en: Depth es: Desnivel fr: Profondeur it: Profondità mi: HÅhonu a ana, RÄ“tÅtanga pl: przewyższenie pt: Desnível ru: Глубина sk: Prevýšenie sq: thellesia therion: title explo (plural) bg: ИзÑледване cz: Objevili de: Entdeckung el: ΕξεÏευνητές en: Explored by es: Exploración fr: Explorateurs it: Esplorazione mi: Kaipokai whenua pl: odkryli pt: Exploradas por ru: ИÑÑледование sk: Objavili sq: hulumtuar nga therion: title explo bg: ИзÑледване cz: Objevil de: Entdeckung el: ΕξεÏευνητής en: Explored by es: Exploración fr: Explorateur it: Esplorazione mi: Kaipokai whenua pl: odkryÅ‚ pt: Explorada por ru: ИÑÑледование sk: Objavil sq: hulumtuar nga therion: title topo (plural) bg: Картирали cz: Měřili de: Vermessung el: ΧαÏτογÏαφήθηκε από τους en: Surveyed by es: Espeleometría fr: Topographes it: Topografia mi: KairÅ«ri pl: pomierzyli pt: Topografadas por ru: Съемка sk: Zamerali sq: matur nga therion: title topo bg: Картирал cz: Měřil de: Vermessung el: ΧαÏτογÏαφήθηκε από τον en: Surveyed by es: Topografía fr: Topographe it: Topografia mi: KairÅ«ri pl: mierzyÅ‚ pt: Topografada por ru: Съемка sk: Zameral sq: matur nga therion: title carto (plural) bg: Гл. картировачи cz: Kreslili de: Zeichnung el: ΣκαÏίφημα en: Drawn by es: Cartografía fr: Dessinateurs it: Cartografia mi: Kaituhi pl: rysowali pt: Desenhadas por ru: ÐšÐ°Ð¼ÐµÑ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° sk: Kreslili sq: vizatuar nga therion: title carto bg: Гл. картировач cz: Kreslil de: Zeichnung el: ΣκαÏίφημα en: Drawn by es: Cartografía fr: Dessinateur it: Cartografia mi: Kaituhi pl: rysowaÅ‚ pt: Desenhada por ru: ÐšÐ°Ð¼ÐµÑ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° sk: Kreslil sq: vizatuar nga therion: title preview above bg: Изглед от горе cz: [Náhled horních vrstev] de: Vorschau oben el: [Ï€Ïοεπισκόπηση πάνω] en: [Preview above] es: Vista previa superior fr: [Prévisualisation au-dessus] it: Anteprima sopra mi: Tuhi a ana ki runga pl: widok z góry pt: [Visualização acima] ru: [Вид выше] sk: [Náhľad horných vrstiev] sq: parashiqimi lart therion: title preview below bg: Изглед от долу cz: [Náhled dolních vrstev] de: Vorschau unten el: [Ï€Ïοεπισκόπηση κάτω] en: [Preview below] es: Vista previa inferior fr: [Prévisualisation au-dessous] it: Anteprima sotto mi: Tuhi a ana ki raro pl: widok z doÅ‚u pt: [Visualização abaixo] ru: [Вид ниже] sk: [Náhľad spodných vrstiev] sq: parashiqimi perfundi therion: title surface bitmap bg: Карта на повърхноÑтта cz: [Povrchová mapa] de: Erdoberfläche el: [χάÏτης επιφάνειας] en: [Surface Image] es: Mapa superficie fr: [Carte extérieure] it: Mappa superficie mi: Konohi o te whenua pl: mapa powierzchni pt: [Mapa de superfície] ru: [Карта поверхноÑти] sk: [Povrchová mapa] sq: harta e siperfaqes therion/thlang/Makefile0000664000175000017500000000007107771720506014174 0ustar useruserall: perl process.pl update: perl process.pl update therion/thlang/thlang_stats.pl0000775000175000017500000000062211127142032015547 0ustar useruser#!/usr/bin/perl -w open (IN, $ARGV[0]) or die; while () { chomp; if (/^\W*therion:/) { foreach $l (keys %LOC) { $GLOB{$l} += 1; } $GLOB{"therion"} += 1; %LOC = (); } elsif (/^\W*([a-z]{2})(_[A-Z]{2})?:/) { $LOC{$1} = 1; } } foreach $l (keys %LOC) { $GLOB{$l} += 1; } foreach $l (keys %GLOB) { print "$l: " . int(100*$GLOB{$l}/$GLOB{"therion"}) . "\n"; } therion/thlang/process.pl0000775000175000017500000002131112065342776014553 0ustar useruser#!/usr/bin/perl ## usage: ## ./process.pl - generate .cxx,.h sources from texts.txt ## ./process.pl update - find new strings to translate and load all ## texts_xy.txt into texts.txt ## ./process.pl export[-empty] xy - export texts_xy.txt with texts ## for translation. If export-empty is used, only untranslated strings ## are exported @trans_sources = ( "../thsymbolset.cxx", "../thexpmap.cxx", "../thlocale.cxx", "../thmapstat.cxx", "../thpdf.cxx", ); sub read_lang_file { # nacita subor do hashu a vrati na neho referenciu my $fn = shift; my $lcode = shift; my $src = shift; open(INP,"$fn") || die("error: can't open $fn for input\n"); if (defined($lcode)) { $lcode = check_language($lcode); } else { $lcode = ""; } my %res; if (defined($src)) { %res = %{$src}; } else { %res = (); } my $itm = ""; my $lnum = 0; my $cmnt = ""; while ($ln = ) { $lnum++; # print "LINE: $ln"; if ($ln =~ /^\s*(\#.*)/) { $cmnt .= "$1\n"; # print "COMMENT\n"; next; } elsif ($ln =~ /^\s*therion\:\s*(.*\S)\s*$/) { $itm = $1; $res{$itm}{therion} = $lnum; $res{$itm}{"therion-cmnt"} = $cmnt; $cmnt = ""; # print "THERION: $itm\n"; } elsif (($ln =~ /^\s*(\w+)\:\s*(.*\S)\s*$/) && (length($itm) > 0)) { ($lng, $trn) = ($1, $2); $clng = check_language($lng); if (length($lng) == 0) { warn("warning: invalid language \"$lng\" ($fn:$lnum)\n"); } if ((length($lcode) == 0) || (substr($clng,0,2) eq $lcode)) { $res{$itm}{$clng} = $trn; $res{$itm}{"$clng-cmnt"} = $cmnt; } $cmnt = ""; # print "LANGUAGE: $clng => $trn\n"; } elsif ($ln !~ /^\s*$/) { warn("warning: error parsing $fn:$lnum\n"); } } close(INP); return \%res; } sub check_language { my $lng = shift; if ($lng =~ /^([A-Za-z]{2})([\_\-]{1}([A-Za-z]{2})){0,1}$/) { if (length($3) > 0) { return (lc($1) . "_" . uc($3)) } else { return (lc($1)) } } else { return ""; } } sub write_lang_file { my $fn = shift; my $href = shift; my %hr = %{$href}; open(OUT,">$fn") || die("error: can't open $fn for output\n"); my %sh = (); for $key (keys %hr) { # print "SORTING: $key -> $hr{$key}{therion}\n"; $sh{$hr{$key}{therion}} = $key; } @nkeys = sort {$a <=> $b} (keys %sh); for $key (@nkeys) { print OUT $hr{$sh{$key}}{"therion-cmnt"}; print OUT "therion: $sh{$key}\n"; for $lkey (sort keys %{$hr{$sh{$key}}}) { if (($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { print OUT $hr{$sh{$key}}{"$lkey-cmnt"}; print OUT "$lkey: ". $hr{$sh{$key}}{$lkey} ."\n"; } } print OUT "\n"; } close(OUT); } sub write_sources { my $href = shift; my %hr = %{$href}; # vytvorime si zoznam jazykov a ich alternativ my %lngs = (); my $key; my $lkey; foreach $key (keys %hr) { foreach $lkey (keys %{$hr{$key}}) { if (($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { $lngs{$lkey} = $lkey; if (length($lkey) > 2) { $nlkey = substr($lkey,0,2); $lngs{$nlkey} = $nlkey; } } } } my @langs = (sort keys %lngs); my $i; my $lcode; $languages = "enum {\n THLANG_SYSTEM = -2,\n THLANG_UNKNOWN = -1,\n"; $langcxxid = "static const thlang_pchar thlang__cxxids [] = {\n"; $langparse = "static const thstok thtt_lang [] = {\n"; for ($i = 0; $i <= $#langs; $i++) { $lcode = "THLANG_" . uc($langs[$i]); $langcxxid .= " \"$lcode\",\n"; $langparse .= " {\"$langs[$i]\", $lcode},\n"; $languages .= " $lcode = $i,\n"; $lngs{$langs[$i]} = $lcode; } $languages .= "};\n"; $langcxxid .= "};\n"; $langparse .= " {NULL, THLANG_UNKNOWN},\n};\n"; my $alternatives = "static const int thlang__alternatives [] = {\n"; for ($i = 0; $i <= $#langs; $i++) { $lkey = $langs[$i]; if ((length($lkey) > 2) && (defined($lngs{substr($lkey,0,2)}))) { $alternatives .= " " . $lngs{substr($lkey,0,2)} . ",\n"; } else { $alternatives .= " THLANG_UNKNOWN,\n"; } } $alternatives .= "};\n"; @texts = sort keys %hr; $textparse = "static const thstok thtt__texts [" . ($#texts + 2) . "] = {\n"; $texttable = "static thlang_pchar thlang__translations [" . ($#texts + 1) . "][" . ($#langs + 1) . "] = {\n"; $i = 0; my $nlkey; foreach $key (@texts) { $textparse .= " {\"$key\",$i},\n"; $texttable .= " {\n"; # priradi ll_LL -> ll ak ll neni definovane foreach $lkey (@langs) { if (length($lkey) > 2) { $nlkey = substr($lkey,0,2); if (!defined($hr{$key}{$nlkey})) { $hr{$key}{$nlkey} = $hr{$key}{$lkey}; } } } foreach $lkey (@langs) { if (defined($hr{$key}{$lkey})) { $texttable .= " \"$hr{$key}{$lkey}\",\n"; } else { $texttable .= " NULL,\n"; } } $texttable .= " },\n"; $i++; } $textparse .= " {NULL, -1},\n};\n"; $texttable .= "};\n"; # exportujeme h subor open(OUT,">../thlangdata.h") || die("error: can't open thlangdata.h for output\n"); print OUT <../thlangdata.cxx") || die("error: can't open thlangdata.cxx for output\n"); print OUT < $maxnm) { $maxnm = $hr{$key}{therion}; } } $maxnm = -1 - $maxnm; foreach $key (keys %hr) { $hr{$key}{therion} += $maxnm; } my $i = 0; foreach $fn (@trans_sources) { print "updating definitions from $fn ..."; open(INP,"$fn") || die("error: can't open $fn for input\n"); my @lines = ; close(INP); my $ln = join('',@lines); $ln =~ s/thT\(/\nthT\(/sg; @lines = split(/\n/,$ln); foreach $ln (@lines) { $i++; if ($ln =~ /^thT\(\"([^"]+)\"/) { $hr{$1}{therion} = $i; } } print " done\n"; } #vypise warningy foreach $key (keys %hr) { if ($hr{$key}{therion} < 0) { warn("warning: expression \"$key\" doesn't need to be translated\n"); } } return \%hr; } sub backup_file { my $fn = shift; open(INP,"$fn") || die("error: can't open $fn for input\n"); my @lines = ; close(INP); open(OUT,">$fn~") || die("error: can't open $fn~ for output\n"); print OUT @lines; close(OUT); } sub export_language { (my $fn, my $lng, my $href, my $onlyempty) = (shift, shift, shift, shift); my %hr = %{$href}; open(OUT,">$fn") || die("error: can't open $fn for output\n"); my %sh = (); for $key (keys %hr) { $sh{$hr{$key}{therion}} = $key; } my @nkeys = sort {$a <=> $b} (keys %sh); for $key (@nkeys) { my $toexp = 1; if ($onlyempty) { for $lkey (sort keys %{$hr{$sh{$key}}}) { if ((substr($lkey,0,2) eq $lng) && ($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { $toexp = 0; } } } if ($toexp) { print OUT $hr{$sh{$key}}{"therion-cmnt"}; print OUT "therion: $sh{$key}\n"; my $posc = "$lng:\n"; for $lkey (sort keys %{$hr{$sh{$key}}}) { if ((substr($lkey,0,2) eq $lng) && ($lkey !~ /^the/) && ($lkey !~ /\-cmnt/)) { print OUT $hr{$sh{$key}}{"$lkey-cmnt"}; print OUT "$lkey: ". $hr{$sh{$key}}{$lkey} ."\n"; $posc = ""; } } print OUT $posc; print OUT "\n"; } } close(OUT); } $rf = read_lang_file("texts.txt"); # ak update if ($ARGV[0] =~ /^update$/i) { opendir(CDR,"."); @updfiles = grep /^texts\_[a-z]{2}\.txt$/, readdir(CDR); foreach $ufn (@updfiles) { my $lcode = substr($ufn,6,2); print "updating $lcode translations ..."; $rf = read_lang_file($ufn,$lcode,$rf); backup_file("$ufn"); unlink($ufn) || $quietdel || warn("warning: can't delete $ufn\n"); print " done\n"; } closedir(CDR); backup_file("texts.txt"); $rf = update_todo_list($rf); write_lang_file("texts.txt",$rf); write_sources($rf); } elsif ($ARGV[0] =~ /^export(\-empty)?$/i) { my $onlyempty = $1; my $lng = check_language($ARGV[1]); if (length($lng) != 2) { die("error: invalid language \"$ARGV[1]\"\n"); } export_language("texts_$lng.txt",$lng,$rf,$onlyempty); } else { write_sources($rf); } therion/thwarppme.cxx0000664000175000017500000011110110636303170013773 0ustar useruser/** @file thwarppme.cxx * * @author marco corvi * @date nov 2006 - mar 2007 * * @brief Warping plaquette algo structures */ /* Copyright (C) 2006-2007 marco corvi * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include "thinfnan.h" #include "thwarppme.h" int therion::warp::basic_pair::basic_pair_nr = 0; namespace therion { namespace warp { /** compute vertical-ness * @param a X-coordinate factor * @param x X vector * @param u U vector * @return the min vertical-ness between X and U * * vertical-ness is * - positive if Y-coord is positive * - negative if Y-coord is negative * - the closer to 0 the more vertical is the vector */ double compute_vertical( double a, thvec2 & x, thvec2 & u ) { double vx = ( fabs(x.m_x * a) < fabs(x.m_y) )? 0.0 : ( (x.m_y > 0.0)? (1.0 - x.m_y/fabs( x.m_x * a )) : (x.m_y/fabs( x.m_x * a ) -1.0) ); double vu = ( fabs(u.m_x * a) < fabs(u.m_y) )? 0.0 : ( (u.m_y > 0.0)? (1.0 - u.m_y/fabs( u.m_x * a )) : (u.m_y/fabs( u.m_x * a ) - 1.0) ); return ( fabs(vx) < fabs(vu) )? vx : vu; } /** compute the squared distance from a segment * @param x input vector * @param b first endpoint of the segment * @param c second endpoint of the segment */ double compute_segment_distance2( const thvec2 & x, const thvec2 & b, const thvec2 & c ) { double xcb = c.m_x - b.m_x; double ycb = c.m_y - b.m_y; double x0b = x.m_x - b.m_x; double y0b = x.m_y - b.m_y; double xcb2 = xcb*xcb; double ycb2 = ycb*ycb; double cb2 = xcb2 + ycb2; double hx = (xcb2 * x.m_x + ycb2 * b.m_y + xcb * ycb * y0b)/cb2; double hy = (ycb2 * x.m_y + xcb2 * b.m_x + xcb * ycb * x0b)/cb2; bool inside = true; if (fabs(xcb) > fabs(ycb) ) { inside = ( c.m_x > b.m_x ) ? ( hx > b.m_x && hx < c.m_x ) : ( hx > c.m_x && hx < b.m_x ); } else { inside = ( c.m_y > b.m_y ) ? ( hy > b.m_y && hy < c.m_y ) : ( hy > c.m_y && hy < b.m_y ); } if ( inside ) { hx -= x.m_x; hy -= x.m_y; return hx*hx + hy*hy; } // else { hx = x.m_x - c.m_x; hy = x.m_y - c.m_y; double dc = hx*hx + hy*hy; double db = x0b*x0b + y0b*y0b; return ( dc < db )? dc : db; } } // namespace warp } // namespace therion void therion::warp::point_pair::add_line( line * line ) { // thprintf("%s add_line %s-%s\n", // m_name.c_str(), line->m_p1->m_name.c_str(), line->m_p2->m_name.c_str() ); if ( line->m_type == THMORPH_STATION ) m_legs ++; mLines.push_back( line ); } therion::warp::line::line( morph_type t, point_pair * p1, point_pair * p2 ) : m_type( t ) , m_p1( p1 ) , m_p2( p2 ) { // thprintf("New line: P1 %s P2 %s\n", p1->m_name.c_str(), p2->m_name.c_str() ); if ( p1 != NULL ) p1->add_line( this ); if ( p2 != NULL ) p2->add_line( this ); } void therion::warp::point_pair::update( thvec2 & x0, double xunit, thvec2 & u0, double uunit ) { z = ( x - x0 ) / xunit; w = ( u - u0 ) / uunit; } void therion::warp::point_pair::order_lines( inserter * warper, double x_u, warp_proj proj ) { size_t sz = mLines.size(); // thprintf("order_lines(): Point %s has %d/%d lines\n", m_name.c_str(), sz, m_legs ); if ( sz <= 1 ) { return; } bool repeat = true; while ( repeat ) { sz = mLines.size(); therion::warp::line * l1 = mLines[0]; thvec2 v1 = ( this == l1->m_p1 ) ? l1->vz : l1->vz * (-1); for ( size_t i=1; im_p1 ) ? l2->vz : l2->vz * (-1); double ct = v1 * v2; double st = v1 ^ v2; double theta = atan2( st, ct ); if ( theta < 0 ) theta += 2*THPI; if ( theta < theta_min ) { jmin = j; theta_min = theta; } } l1 = mLines[jmin]; if ( jmin > i ) { mLines[jmin] = mLines[i]; mLines[i] = l1; } v1 = ( this == l1->m_p1 ) ? l1->vz : l1->vz * (-1); } repeat = false; // now check that between any two STATION lines there is a non-STATION line // thprintf("Point %s: %6.2f %6.2f has %d lines\n", m_name.c_str(), x.m_x, x.m_y, sz ); for ( size_t i=0; i= 2 ) { therion::warp::line * l1 = mLines[i]; therion::warp::line * l2 = mLines[j]; if ( l1->m_type != THMORPH_STATION ) continue; if ( l2->m_type != THMORPH_STATION ) continue; therion::warp::point_pair * p1 = l1->other_end( this ); therion::warp::point_pair * p2 = l2->other_end( this ); // thprintf("point %s (%s - %s) sizes %d %d \n", // m_name.c_str(), p1->m_name.c_str(), p2->m_name.c_str(), p1->size(), p2->size() ); if ( p1->size() == 1 && p2->size() == 1 ) continue; } else if ( m_legs == 0 ) { continue; } else { // m_legs == 1 // angle between line[i] and line[j] therion::warp::line * l1 = mLines[i]; therion::warp::line * l2 = mLines[j]; therion::warp::point_pair * p1 = l1->other_end( this ); therion::warp::point_pair * p2 = l2->other_end( this ); // thprintf("point %s (%s - %s) legs 1 angle %6.2f\n", // m_name.c_str(), p1->m_name.c_str(), p2->m_name.c_str(), // (p2->u - u) ^ (p1->u -u ) ); if ( ((p2->u - u) ^ (p1->u -u )) < 0 ) continue; } repeat = true; // thprintf("Point %s: insert %d/%d lines (j=%d)\n", m_name.c_str(), i, sz, j ); therion::warp::line * l1 = mLines[i]; therion::warp::line * l2 = mLines[j]; therion::warp::point_pair * p1 = l1->other_end( this ); // ( this == l1->m_p1 ) ? l1->m_p2 : l1->m_p1; therion::warp::point_pair * p2 = l2->other_end( this ); // ( this == l2->m_p1 ) ? l2->m_p2 : l2->m_p1; thvec2 x1 = p1->x - x; thvec2 x2 = p2->x - x; thvec2 u1 = p1->u - u; thvec2 u2 = p2->u - u; // thprintf("must insert between %s %s at %s (m_legs %d) proj %s\n", // p1->m_name.c_str(), p2->m_name.c_str(), m_name.c_str(), m_legs, // (proj == THWARP_PLAN)? "plan" : "elev" ); // try a non-STATION line that reflected is between l1 and l2 size_t k = 0; if ( m_legs <= 2 ) { for ( ; km_type == THMORPH_STATION ) continue; therion::warp::point_pair * p0 = mLines[k]->other_end( this ); thvec2 x0 = x - p0->x; thvec2 u0 = u - p0->u; if ( (x2 ^ x0) < 0 && (x0 ^ x1) < 0 && (u2 ^ u0) < 0 && (u0 ^ u1) ) { // opposite is OK both for PLAN and for EXTENDED proj // thprintf("adding extra as opposite of %s\n", p0->m_name.c_str() ); thvec2 x3 = x + x0; thvec2 u3 = u + u0; warper->add_extra_line( this, i, x3, u3 ); break; } } } else { k = sz; // still need to insert } if ( k == sz ) { thvec2 x3, u3; if ( proj == THWARP_PLAN ) { // this is a wild guess. there is no generic way to guess // where the tranverse point(s) are ... double d1 = u1.length(); double d2 = u2.length(); double du = (u1 - u2).length(); thvec2 vu = u2/d2 - u1/d1; vu.normalize(); // thprintf("adding extra as bisector at %s [lengths %.2f %.2f %.2f]\n", // this->m_name.c_str(), du, d1, d2 ); if ( d1 < du ) du = d1; if ( d2 < du ) du = d2; u3.m_x = u.m_x + vu.m_y * du; u3.m_y = u.m_y - vu.m_x * du; thvec2 vx = x2/x2.length() - x1/x1.length(); vx.normalize(); /* double dx = (x1 - x2).length() / 2.0; double d1 = x1.length()/2.0; double d2 = x2.length()/2.0; if ( d1 < dx ) dx = d1; if ( d2 < dx ) dx = d2; */ double dx = du * x_u; x3.m_x = x.m_x + vx.m_y * dx; x3.m_y = x.m_y - vx.m_x * dx; } else /* if ( proj == THWARP_EXTENDED ) */ { #define TH_VERT_ALPHA 32.0 double v1 = compute_vertical( TH_VERT_ALPHA, x1, u1 ); double v2 = compute_vertical( TH_VERT_ALPHA, x2, u2 ); thvec2 vu = u2/u2.length() - u1/u1.length(); double du = (u1 - u2).length(); double d1 = u1.length(); double d2 = u2.length(); if ( d1 < du ) du = d1; if ( d2 < du ) du = d2; double dx = du * x_u; // thprintf("v1 %f v2 %f \n", v1, v2 ); if ( fabs(v1) < 0.5 || fabs(v2) < 0.5 ) { if ( fabs(v1) < 0.1 && fabs(v2) < 0.1 ) { if ( v1 * v2 < 0.0 ) { // vertical opposite // thprintf("horizontal\n"); u3.m_x = u.m_x + ((v2>0.0)? 1.0 : -1.0) * du; u3.m_y = u.m_y; x3.m_x = x.m_x + ((v2>0.0)? 1.0 : -1.0) * dx; x3.m_y = x.m_y; } else { thprintf("warning: closed up vertical angle\n"); u3.m_x = u.m_x; u3.m_y = (u1.m_y + u2.m_y)/2.0; x3.m_x = x.m_x; x3.m_y = (x1.m_y + x2.m_y)/2.0; } } else { // thprintf("bisector\n"); u3.m_x = u.m_x + vu.m_y * du; u3.m_y = u.m_y - vu.m_x * du; thvec2 vx = x2/x2.length() - x1/x1.length(); x3.m_x = x.m_x + vx.m_y * dx; x3.m_y = x.m_y - vx.m_x * dx; } } else { // thprintf("vertical\n"); u3.m_x = u.m_x; u3.m_y = u.m_y + ((v2>0.0)? 1.0 : -1.0) * du; x3.m_x = x.m_x; x3.m_y = x.m_y + ((v2>0.0)? 1.0 : -1.0) * dx; } } warper->add_extra_line( this, i, x3, u3 ); } } // for ( ...; iother_end( this ); thprintf("%s ", p2->m_name.c_str() ); } thprintf("\n"); */ // check that all the lines from this point that are not centerlines have a "single" // node at the other end // this check could be restricted to // if ( m_type == THMORPH_STATION ) for ( size_t i=0; im_type != THMORPH_STATION ) { point_pair * p2 = l2->other_end( this ); assert( p2->mLines.size() == 1 ); } } } therion::warp::line * therion::warp::point_pair::first_leg() { size_t sz = mLines.size(); for (size_t j=0; jm_type == THMORPH_STATION ) return mLines[j]; } return NULL; } void therion::warp::line::update() { // thprintf("Update line %s %s\n", m_p1->m_name.c_str(), m_p2->m_name.c_str() ); vz = m_p2->z - m_p1->z; vw = m_p2->w - m_p1->w; z.m_a = vz.m_y; z.m_b = - vz.m_x; z.m_c = - ( z.m_a * m_p1->z.m_x + z.m_b * m_p1->z.m_y); zab = sqrt(z.m_a*z.m_a + z.m_b*z.m_b); w.m_a = vw.m_y; w.m_b = - vw.m_x; w.m_c = - ( w.m_a * m_p1->w.m_x + w.m_b * m_p1->w.m_y); wab = sqrt(w.m_a*w.m_a + w.m_b*w.m_b); double dz = vz.length2(); // R.m_xx = R.m_yy = ( vw * vz ) / dz; // R.m_xy = ( vw ^ vz ) / dz; // R.m_yx = - R.m_xy; double dw = vw.length2(); // S.m_xx = S.m_yy = ( vz * vw ) / dw; // S.m_xy = ( vz ^ vw ) / dw; // S.m_yx = - S.m_xy; dz = sqrt( dz ); dw = sqrt( dw ); vz /= dz; vw /= dw; assert( fabs( vz.length() - 1.0 ) < 0.01 ); assert( fabs( vw.length() - 1.0 ) < 0.01 ); z_w = dz / dw; w_z = dw / dz; } // --------------------------------------------------------------- // therion::warp::triangle // // TOCHECK from .h double therion::warp::triangle::sm_map( const thvec2 & p, thvec2 & ret ) const { ret.m_x = p.m_x - m_A.m_x; ret.m_y = p.m_y - m_A.m_y; double d2 = ret.length2(); return d2*d2; } void therion::warp::triangle::inv_sm_map( const thvec2 & p, thvec2 & ret, double d4 ) const { ret.m_x = d4 * ( m_A.m_x + p.m_x ); ret.m_y = d4 * ( m_A.m_y + p.m_y ); } // --------------------------------------------------------------- // therion::warp::plaquette void therion::warp::plaquette::init() { m_AD = m_D - m_A; m_BC = m_C - m_B; m_AB = m_B - m_A; m_BA = m_A - m_B; m_AB_len = m_AB.length(); // length of AB (was m_abd) m_AD_len = m_AD.length(); // length of AD m_BC_len = m_BC.length(); // length of BC m_adn = m_AD; m_adn.normalize(); m_bcn = m_BC; m_bcn.normalize(); m_abn = m_AB; m_abn.normalize(); m_abh.m_x = m_abn.m_y; m_abh.m_y = - m_abn.m_x; m_a = m_A.m_x - m_B.m_x - m_D.m_x + m_C.m_x; m_b = - m_A.m_x + m_B.m_x; m_c = - m_A.m_x + m_D.m_x; m_d = m_A.m_x; m_e = m_A.m_y - m_B.m_y - m_D.m_y + m_C.m_y; m_f = - m_A.m_y + m_B.m_y; m_g = - m_A.m_y + m_D.m_y; m_h = m_A.m_y; m_A0 = m_a * m_f - m_b * m_e; m_B0 = m_a * m_h - m_d * m_e + m_c * m_f - m_b * m_g; m_C0 = m_c * m_h - m_d * m_g; m_D0 = m_a * m_g - m_c * m_e; m_E0 = m_a * m_h - m_d * m_e - m_c * m_f + m_b * m_g; m_F0 = m_b * m_h - m_d * m_f; // angles + "line" // thvec2 adn = m_AD; adn.normalize(); // m_theta_l = acos( m_abn * adn ); m_theta_l = angle( m_abn, m_adn ); // thvec2 bcn = m_BC; bcn.normalize(); // m_theta_r = acos( - m_abn * bcn ); m_theta_r = angle( m_bcn, - m_abn ); // thprintf("Plaquette theta L %.2f R %.2f \n", m_theta_l, m_theta_r ); // C1 is the projection (parallel to AB) of C on AD. // [1] line thru C parallel to AB: // y = C.y + ( x - C.x ) * AB.y / AB.x // [2] intersection with // y = A.y + ( x - A.x ) * AD.y / AD.x // // x ( AB.y AD.x - AB.x AD.y ) = AD.x AB.x ( A.y - C.y ) + AD.x AB.y C.x - AB.x AD.y A.x // i.e. // - adab * x = AB.x ( AD.x A.y - AD.y A.x ) - AD.x ( AB.x C.y - AB.y C.x ) // adab * x = AB.x * ( A ^ AD ) - AD.x * ( C ^ AB ) m_adab = - m_adn.m_x * m_abn.m_y + m_adn.m_y * m_abn.m_x; // abn ^ adn m_bcab = - m_bcn.m_x * m_abn.m_y + m_bcn.m_y * m_abn.m_x; // abn ^ bcn m_adA = - m_adn.m_x * m_A.m_y + m_adn.m_y * m_A.m_x; // A ^ adn m_bcB = - m_bcn.m_x * m_B.m_y + m_bcn.m_y * m_B.m_x; // B ^ bcn double cab = m_C.m_x * m_abn.m_y - m_C.m_y * m_abn.m_x; // C ^ abn m_C1 = ( m_abn * m_adA - m_adn * cab ) / m_adab; // check align A-D-C1 assert( fabs( m_A.m_x * m_D.m_y - m_A.m_y * m_D.m_x + m_D.m_x * m_C1.m_y - m_D.m_y * m_C1.m_x + m_C1.m_x * m_A.m_y - m_C1.m_y * m_A.m_x ) < 0.001 ); m_C1C = m_C - m_C1; // assert m_C1C || m_AB assert( fabs( m_C1C.m_x * m_AB.m_y - m_C1C.m_y * m_AB.m_x ) < 0.001 ); m_sin = m_AB.m_x / m_AB_len; m_cos = m_AB.m_y / m_AB_len; if ( fabs(m_AB.m_x) * 1.73 > fabs(m_AB.m_y) ) { // horizontal up to 60 deg. if ( fabs(m_AB.m_x) * 1.19 > fabs(m_AB.m_y) ) { // really horizontal m_sin = 0.0; m_cos = 1.0; } } else { if ( fabs(m_AB.m_y) * 0.58 > fabs(m_AB.m_x) ) { m_sin = 1.0; m_cos = 0.0; } } m_tan = m_sin/m_cos; m_ctg = m_cos/m_sin; } double therion::warp::plaquette::s_map_straight( const thvec2 & p ) const { double s; double ex_ay = m_e * p.m_x - m_a * p.m_y; double A = m_A0; double B = (ex_ay + m_B0)/2.0; double C = m_g * p.m_x - m_c * p.m_y + m_C0; double det = B*B - A * C; if ( det < 0.0 ) return thnan; if ( det > 0.0 ) det = sqrt( det ); if ( fabs(A) > 1.e-6 ) { s = (- B + det )/A; double s2 = (-B-det)/A; if ( s2 > 0.0 && fabs(s2) < fabs(s) ) s = s2; } else { s = ( B == 0.0 ) ? thinf : - C / (2*B); } return s; } double therion::warp::plaquette::s_map_slant( const thvec2 & p ) const { double x0 = p.m_x; double y0 = p.m_y; double pab = p.m_x * m_abn.m_y - p.m_y * m_abn.m_x; // P1 = [ (ad^A) ab + (P^ab) ad ] / [ad^ab] // P2 = [ (bc^B) ab + (P^ab) bc ] / [ad^bc] double x1 = ( m_abn.m_x * m_adA - m_adn.m_x * pab ) / m_adab; double y1 = ( m_abn.m_y * m_adA - m_adn.m_y * pab ) / m_adab; double x2 = ( m_abn.m_x * m_bcB - m_bcn.m_x * pab ) / m_bcab; double y2 = ( m_abn.m_y * m_bcB - m_bcn.m_y * pab ) / m_bcab; // check alignment // double align = (x1*y2 - x2*y1) + (x2*y0 - x0*y2) + (x0*y1 - x1*y0); // assert( fabs(align) < 0.001 ); double d12 = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1); double d10 = (x0-x1)*(x0-x1) + (y0-y1)*(y0-y1); return sqrt( d10/d12 ); } double therion::warp::plaquette::t_map( const thvec2 & p ) const { double t; double ex_ay = m_e * p.m_x - m_a * p.m_y; // double A = m_A0; double D = m_D0; // double B = (ex_ay + m_B0)/2.0; double E = (ex_ay + m_E0)/2.0; // double C = m_g * p.m_x - m_c * p.m_y + m_C0; double F = m_f * p.m_x - m_b * p.m_y + m_F0; double det = E*E - D * F; if ( det < 0.0 ) return thnan; if ( det > 0.0 ) det = sqrt( det ); if ( fabs(D) > 1.e-6 ) { t = (- E + det )/D; double t2 = (-E-det)/D; if ( t2 > 0.0 && fabs(t2) < fabs(t) ) t = t2; } else { t = ( E == 0.0 ) ? thinf : - F / (2*E); } return t; } // -------------------------------------------------------------- // Horizontal + Vertical stuff // // X:horizontal - Y:vertical void therion::warp::plaquette::hv_map( const thvec2 & p, thvec2 & ret ) const { ret.m_x = ( p.m_x - m_A.m_x )/m_AB.m_x; // Qy = Ay + (By-Ay)/(Bx-Ax) * (Px - Ax) double yq = m_A.m_y + m_AB.m_y * ret.m_x; ret.m_y = p.m_y - yq; } void therion::warp::plaquette::inv_hv_map( const thvec2 & p, thvec2 & ret ) const { ret.m_x = m_A.m_x + p.m_x * m_AB.m_x; double yq = m_A.m_y + p.m_x * m_AB.m_y; ret.m_y = yq + p.m_y; } // X:vertical - Y:horizontal void therion::warp::plaquette::vh_map( const thvec2 & p, thvec2 & ret ) const { ret.m_x = ( p.m_y - m_A.m_y )/m_AB.m_y; // Qx = Ax + (Bx-Ax)/(By-Ay) * (Py - Ay) double xq = m_A.m_x + m_AB.m_x * ret.m_x; ret.m_y = p.m_x - xq; } void therion::warp::plaquette::inv_vh_map( const thvec2 & p, thvec2 & ret ) const { ret.m_y = m_A.m_y + p.m_x * m_AB.m_y; double xq = m_A.m_x + p.m_x * m_AB.m_x; ret.m_x = xq + p.m_y; } // horizontal-vertical at an angle (m1) // X = Px + m1 ( Y - Py ) // // X = Qx + t * cos // Y = Qy + t * sin // // t = ( Y - Qy ) / sin // X = Qx + cos/sin * ( Y - Qy ) // = Px + cos/sin * ( Y - Py ) // void therion::warp::plaquette::vhm_map( const thvec2 & p, thvec2 & ret ) const { double yq = ( m_AB.m_x * m_A.m_y + (p.m_x - m_A.m_x - m_ctg * p.m_y ) * m_AB.m_y ) / ( m_AB.m_x - m_ctg * m_AB.m_y ); ret.m_x = ( yq - m_A.m_y )/m_AB.m_y; double xq = m_A.m_x + ret.m_x * m_AB.m_x; double dx = p.m_x - xq; double dy = p.m_y - yq; ret.m_y = sqrt( dx*dx + dy*dy ); } void therion::warp::plaquette::inv_vhm_map( const thvec2 & p, thvec2 & ret ) const { double xq = m_A.m_x + p.m_x * m_AB.m_x; double yq = m_A.m_y + p.m_x * m_AB.m_y; ret.m_x = xq + m_cos * p.m_y; ret.m_y = yq + m_sin * p.m_y; } // Y = Py + m ( X - Px ) void therion::warp::plaquette::hvm_map( const thvec2 & p, thvec2 & ret ) const { double xq = ( m_AB.m_y * m_A.m_x + (p.m_y - m_A.m_y - m_tan * p.m_x ) * m_AB.m_x ) / ( m_AB.m_y - m_tan * m_AB.m_x ); ret.m_x = ( xq - m_A.m_x )/m_AB.m_x; double yq = m_A.m_y + ret.m_x * m_AB.m_y; double dx = p.m_x - xq; double dy = p.m_y - yq; ret.m_y = sqrt( dx*dx + dy*dy ); } void therion::warp::plaquette::inv_hvm_map( const thvec2 & p, thvec2 & ret ) const { double xq = m_A.m_x + p.m_x * m_AB.m_x; double yq = m_A.m_y + p.m_x * m_AB.m_y; ret.m_x = xq + m_cos * p.m_y; ret.m_y = yq + m_sin * p.m_y; } // -------------------------------------------------------------- /** solve the system * | A+t(D-A) B+t(C-B) P | = 0 */ void therion::warp::plaquette::st_map( const thvec2 & p, thvec2 & ret ) const { double s; double ex_ay = m_e * p.m_x - m_a * p.m_y; double A = m_A0; double B = (ex_ay + m_B0)/2.0; double C = m_g * p.m_x - m_c * p.m_y + m_C0; if ( fabs(A) > 1.e-6 ) { double det = B*B - A * C; if ( det < 0.0 ) { ret.m_x = ret.m_y = thnan; return; } if ( det > 0.0 ) det = sqrt( det ); s = (- B + det )/A; double s2 = (-B-det)/A; if ( s2 > 0.0 && fabs(s2) < fabs(s) ) s = s2; } else { s = ( B == 0.0 ) ? thinf : - C / (2*B); } ret.m_x = s; ret.m_y = ( p.m_x - m_b * s - m_d ) / ( m_a * s + m_c ); } void therion::warp::plaquette::inv_st_map( const thvec2 & v, thvec2 & ret ) const { ret.m_x = m_a * v.m_x * v.m_y + m_b * v.m_x + m_c * v.m_y + m_d; ret.m_y = m_e * v.m_x * v.m_y + m_f * v.m_x + m_g * v.m_y + m_h; } // this are Beier-Neely type maps // "Feature-based image metamorphosis" Computer Graphics, 26 35-42, 1992 // // TODO // Taking into account different end-size ratios can be done here // or by the caller. The plaquette does not have the ratios, // and the relative weight could be different from the return // X coordinate (ret.m_x) // straight BN map void therion::warp::plaquette::bn_map_straight( const thvec2 & p, thvec2 & ret ) const { thvec2 ap( p.m_x - m_A.m_x, p.m_y - m_A.m_y ); ret.m_x = ( ap * m_abn ) / m_AB_len; ret.m_y = ap * m_abh; } void therion::warp::plaquette::inv_bn_map_straight( const thvec2 & p, thvec2 & ret ) const { // ret = m_A + m_AB * p.m_x + m_abh * p.m_y; ret.m_x = m_A.m_x + m_AB.m_x * p.m_x + m_abh.m_x * p.m_y; ret.m_y = m_A.m_y + m_AB.m_y * p.m_x + m_abh.m_y * p.m_y; } // slanted BN map void therion::warp::plaquette::bn_map_slant( const thvec2 & p, thvec2 & ret ) const { double x0 = p.m_x; double y0 = p.m_y; double pab = p.m_x * m_abn.m_y - p.m_y * m_abn.m_x; // P ^ ab // P1 = [ (A^ad) ab - (P^ab) ad ] / [ab^ad] projection of P parallel to AB on AD // P2 = [ (B^bc) ab - (P^ab) bc ] / [ab^bc] projection of P parallel to AB on BC double x1 = ( m_abn.m_x * m_adA - m_adn.m_x * pab ) / m_adab; double y1 = ( m_abn.m_y * m_adA - m_adn.m_y * pab ) / m_adab; double x2 = ( m_abn.m_x * m_bcB - m_bcn.m_x * pab ) / m_bcab; double y2 = ( m_abn.m_y * m_bcB - m_bcn.m_y * pab ) / m_bcab; // check alignment // double align = (x1*y2 - x2*y1) + (x2*y0 - x0*y2) + (x0*y1 - x1*y0); // assert( fabs(align) < 0.001 ); double d12 = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1); double d10 = (x0-x1)*(x0-x1) + (y0-y1)*(y0-y1); ret.m_x = sqrt( d10/d12 ); // slant distance // x1 = m_A.m_x + ret.m_x * m_AB.m_x; // y1 = m_A.m_y + ret.m_x * m_AB.m_y; // ret.m_y = sqrt( (x0-x1)*(x0-x1) + (y0-y1)*(y0-y1) ); // // straight distance ret.m_y = (p - m_A) * m_abh; } void therion::warp::plaquette::inv_bn_map_slant( const thvec2 & p, thvec2 & ret ) const { // slanted BN map /* thvec2 ps = m_A + p.m_x * m_AB; thvec2 p1 = m_C1 + p.m_x * m_C1C; double x = p1.m_x - ps.m_x; double y = p1.m_y - ps.m_y; ret = ps + (p1-ps)*(p.m_y /sqrt(x*x+y*y) ); */ double d1 = fabs(p.m_y/m_adab); double d2 = fabs(p.m_y/m_bcab); double x1 = 1.0 - p.m_x; ret.m_x = x1 * ( m_A.m_x + d1 * m_adn.m_x ) + p.m_x * ( m_B.m_x + d2 * m_bcn.m_x ); ret.m_y = x1 * ( m_A.m_y + d1 * m_adn.m_y ) + p.m_x * ( m_B.m_y + d2 * m_bcn.m_y ); } // TODO fix this double therion::warp::plaquette::sm_map( const thvec2 & p, thvec2 & ret ) const { thvec2 ap( p.m_x - m_A.m_x, p.m_y - m_A.m_y ); ret.m_x = (ap * m_abn) / m_AB_len; ret.m_y = ap * m_abh; double d2; if ( ret.m_x < 0.0 ) { // left point d2 = ap.length2(); } else if ( ret.m_x > 1.0 ) { // right point thvec2 bp( p.m_x - m_B.m_x, p.m_y - m_B.m_y ); d2 = bp.length2(); } else { // middle point d2 = ret.m_y * ret.m_y; } return d2*d2; } void therion::warp::plaquette::inv_sm_map( const thvec2 & p, thvec2 & ret, double d4 ) const { ret.m_x = d4 * ( m_A.m_x + p.m_x * m_AB.m_x + p.m_y * m_abh.m_x ); ret.m_y = d4 * ( m_A.m_y + p.m_x * m_AB.m_y + p.m_y * m_abh.m_y ); } // **************************************************************** // TRIANGLE PAIRS // namespace therion { namespace warp { /** cstr * @param a A-corner point pair ("vertex" of the triangle) * @param b B-corner point pair (right side) * @param c C-corner point pair (left side) * @param bound bound on "a" for is_inside test * @param cubic whether to use the cubic radial correction * @param border inner border */ template< > item_pair::item_pair( point_pair * a, point_pair * b, point_pair * c , double bound /* = BOUND_TRIANGLE */ ) : basic_pair( bound ) , from( a->z, b->z, c->z ) , to ( a->w, b->w, c->w ) { m_pair[0] = c; m_pair[1] = a; m_pair[2] = b; m_kl = ( from.theta_left() - to.theta_left() ) * MORPH_ANGLE_FACTOR; m_kr = ( from.theta_right() - to.theta_right() ) * MORPH_ANGLE_FACTOR; // m_kl = fabs(from.theta_left()-M_PI_2) - fabs(to.theta_left()-M_PI_2); // m_kr = fabs(from.theta_right()-M_PI_2) - fabs(to.theta_right()-M_PI_2); m_dl = from.m_ac / to.m_ac; m_dr = from.m_ab / to.m_ab; // thprintf("Triangle [%d] Theta L %.2f R %.2f Ratios L %.2f R %.2f \n", // nr(), m_kl, m_kr, m_dl, m_dr ); } /** type of this warping basic_pair * @return the number of points of the basic_pair */ template< > warp_type item_pair::type() const { return THWARP_TRIANGLE; } /** maximum number of neighbors * @return the maximum number of neighbors */ template< > int item_pair::ngbh_nr() const { return 2; } template< > void item_pair::set_projection( warp_proj proj ) { // thprintf("item_pair::set_projection(%d)\n", proj ); // TODO } template< > void item_pair::backward_normal_bd( const thvec2 & p, thvec2 & ret ) const { static thvec2 v0, r1, pa; to.bn_map( p, v0 ); v0.m_y *= v0.m_x * m_dr + (1.0-v0.m_x) * m_dl; from.inv_bn_map( v0, ret ); if ( v0.m_x < MORPH_BD ) { double x = v0.m_x/MORPH_BD; // x = 0 .. 1 // double x1 = 1.0 - 2*x + x*x; double x1 = 1 - x; /* #if MORPH_ROTATE != 0 double t = left_ngbh()->m_kr * x1; left_ngbh()->pto()->right_rotate( p, pa, cos(t), -sin(t) ); left_ngbh()->pto()->bn_map( pa, v0 ); #else left_ngbh()->pto()->bn_map( p, v0 ); #endif */ left_ngbh()->right_rotate_to( p, v0, x1 ); // double s = left_ngbh()->pto()->s_map( pa ); // v0.m_y *= s * left_ngbh()->m_dr + (1.0-s) * left_ngbh()->m_dl; v0.m_y *= v0.m_x * left_ngbh()->m_dr + (1.0-v0.m_x) * left_ngbh()->m_dl; left_ngbh()->pfrom()->inv_bn_map( v0, r1 ); // ret = ( ret + r1 * x1 ) / ( 1.0 + x1 ); ret.m_x = ( ret.m_x + x1 * r1.m_x ) / ( 1 + x1 ); ret.m_y = ( ret.m_y + x1 * r1.m_y ) / ( 1 + x1 ); } else if ( 1.0 - v0.m_x < MORPH_BD ) { double x = (1.0-v0.m_x)/MORPH_BD; // double x1 = 1.0 - 2*x + x*x; double x1 = 1 - x; /* #if MORPH_ROTATE != 0 double t = right_ngbh()->m_kl * x1; right_ngbh()->pto()->left_rotate( p, pa, cos(t), -sin(t) ); right_ngbh()->pto()->bn_map( pa, v0 ); #else right_ngbh()->pto()->bn_map( p, v0 ); #endif */ right_ngbh()->left_rotate_to( p, v0, x1 ); // s = right_ngbh()->pto()->s_map( pa ); // v0.m_y *= s * right_ngbh()->m_dr + (1.0-s) * right_ngbh()->m_dl; v0.m_y *= v0.m_x * right_ngbh()->m_dr + (1.0-v0.m_x) * right_ngbh()->m_dl; right_ngbh()->pfrom()->inv_bn_map( v0, r1 ); // ret = ( ret + r1 * x1 ) / ( 1.0 + x1 ); ret.m_x = ( ret.m_x + x1 * r1.m_x ) / ( 1 + x1 ); ret.m_y = ( ret.m_y + x1 * r1.m_y ) / ( 1 + x1 ); } else { /* nothing */ } } /* * as in therion template< > void item_pair::forward( const thvec2 & p, thvec2 & ret ) const { static thvec2 v0; from.bn_map( p, v0 ); v0.m_y /= v0.m_x * m_dr + (1.0-v0.m_x) * m_dl; to.inv_bn_map( v0, ret ); } */ #ifdef DEBUG /** debug: print */ template< > void item_pair::print() const { thprintf("[%d] Triangle A %6.2f %6.2f <-> %6.2f %6.2f\n", nr(), from.m_A.m_x, from.m_A.m_y, to.m_A.m_x, to.m_A.m_y ); thprintf(" B %6.2f %6.2f <-> %6.2f %6.2f\n", from.m_B.m_x, from.m_B.m_y, to.m_B.m_x, to.m_B.m_y ); thprintf(" C %6.2f %6.2f <-> %6.2f %6.2f\n", from.m_C.m_x, from.m_C.m_y, to.m_C.m_x, to.m_C.m_y ); print_ngbhs(); } #endif // **************************************************************** // PLAQUETTE PAIRS // // TODO FIXME template< > void item_pair::set_projection( warp_proj proj ) { // thprintf("item_pair::set_projection(%d)\n", proj ); #ifdef MORPH_EXPERIMENTAL if ( proj == THWARP_EXTENDED ) { // TODO if ( fabs(from.m_sin) > fabs(from.m_cos) ) { // horizontal if ( fabs(from.m_cos) > 0.0 ) { from.bn_map_impl = &therion::warp::plaquette::hvm_map; from.inv_bn_map_impl = &therion::warp::plaquette::inv_hvm_map; to.bn_map_impl = &therion::warp::plaquette::hvm_map; to.inv_bn_map_impl = &therion::warp::plaquette::inv_hvm_map; } else { from.bn_map_impl = &therion::warp::plaquette::hv_map; from.inv_bn_map_impl = &therion::warp::plaquette::inv_hv_map; to.bn_map_impl = &therion::warp::plaquette::hv_map; to.inv_bn_map_impl = &therion::warp::plaquette::inv_hv_map; } } else { if ( fabs(from.m_sin) > 0.0 ) { from.bn_map_impl = &therion::warp::plaquette::vhm_map; from.inv_bn_map_impl = &therion::warp::plaquette::inv_vhm_map; to.bn_map_impl = &therion::warp::plaquette::vhm_map; to.inv_bn_map_impl = &therion::warp::plaquette::inv_vhm_map; } else { from.bn_map_impl = &therion::warp::plaquette::vh_map; from.inv_bn_map_impl = &therion::warp::plaquette::inv_vh_map; to.bn_map_impl = &therion::warp::plaquette::vh_map; to.inv_bn_map_impl = &therion::warp::plaquette::inv_vh_map; } } } else #endif { if ( m_kl + m_kr < 0 ) { from.s_map_impl = &therion::warp::plaquette::s_map_slant; from.bn_map_impl = &therion::warp::plaquette::bn_map_slant; from.inv_bn_map_impl = &therion::warp::plaquette::inv_bn_map_slant; } else if ( false ) { to.s_map_impl = &therion::warp::plaquette::s_map_slant; to.bn_map_impl = &therion::warp::plaquette::bn_map_slant; to.inv_bn_map_impl = &therion::warp::plaquette::inv_bn_map_slant; } } } /** cstr * @param a A-corner point pair * @param b B-corner point pair * @param c C-corner point pair * @param d D-corner point pair * @param bound bound of "t" for the is_inside test * @param cubic whether to use the cubic correction * @param border inner border */ template< > item_pair::item_pair( point_pair * a, point_pair * b, point_pair * c, point_pair * d , double bound /* = BOUND_PLAQUETTE */ ) : basic_pair( bound ) , from( a->z, b->z, c->z, d->z ) , to ( a->w, b->w, c->w, d->w ) { m_pair[0] = d; m_pair[1] = a; m_pair[2] = b; m_pair[3] = c; m_kl = ( from.theta_left() - to.theta_left() ) * MORPH_ANGLE_FACTOR; m_kr = ( from.theta_right() - to.theta_right() ) * MORPH_ANGLE_FACTOR; // m_kl = fabs(from.theta_left()-M_PI_2) - fabs(to.theta_left()-M_PI_2); // m_kr = fabs(from.theta_right()-M_PI_2) - fabs(to.theta_right()-M_PI_2); m_dl = from.m_AD_len / to.m_AD_len; m_dr = from.m_BC_len / to.m_BC_len; // thprintf("Plaquette [%d] Theta L %.2f R %.2f Ratios L %.2f R %.2f \n", // nr(), m_kl, m_kr, m_dl, m_dr ); // } /** warp type * @return the warp type of the warping basic_pair */ template< > warp_type item_pair::type() const { return THWARP_PLAQUETTE; } /** maximum number of neighbors * @return the maximum number of neighbors */ template< > int item_pair::ngbh_nr() const { return 3; } template< > void item_pair::backward_normal_bd( const thvec2 & p, thvec2 & ret ) const { static thvec2 v0, r1, pa; double s = to.s_map( p ); // assert( s >= 0 && s <= 1.0 ); if ( s < MORPH_BD ) { double x = s/MORPH_BD; // x = 0 .. 1 double x1 = 1.0 - 2*x + x*x; // x1 = 1 .. 0 this->left_rotate_to( p, v0, x1 ); // v0.m_y *= s * m_dr + (1.0-s) * m_dl; v0.m_y *= v0.m_x * m_dr + (1.0-v0.m_x) * m_dl; from.inv_bn_map( v0, ret ); left_ngbh()->right_rotate_to( p, v0, x1 ); s = v0.m_x; v0.m_y *= s * left_ngbh()->m_dr + (1.0-s) * left_ngbh()->m_dl; left_ngbh()->pfrom()->inv_bn_map( v0, r1 ); // ret = ( ret + r1 * x1 ) / ( 1.0 + x1 ); ret.m_x = ( (2-x1)* ret.m_x + x1 * r1.m_x ) / 2; // ( 1 + x1 ); ret.m_y = ( (2-x1)* ret.m_y + x1 * r1.m_y ) / 2; // ( 1 + x1 ); } else if ( 1.0 - s < MORPH_BD ) { double x = (1.0-s)/MORPH_BD; // double x1 = 1.0 - x; double x1 = 1.0 - 2*x + x*x; this->right_rotate_to( p, v0, x1 ); // v0.m_y *= s * m_dr + (1.0-s) * m_dl; v0.m_y *= v0.m_x * m_dr + (1.0-v0.m_x) * m_dl; from.inv_bn_map( v0, ret ); right_ngbh()->left_rotate_to( p, v0, x1 ); s = v0.m_x; v0.m_y *= s * right_ngbh()->m_dr + (1.0-s) * right_ngbh()->m_dl; right_ngbh()->pfrom()->inv_bn_map( v0, r1 ); // ret = ( ret + r1 * x1 ) / ( 1.0 + x1 ); ret.m_x = ( (2-x1)* ret.m_x + x1 * r1.m_x ) / 2; // ( 1 + x1 ); ret.m_y = ( (2-x1)* ret.m_y + x1 * r1.m_y ) / 2; // ( 1 + x1 ); } else { to.bn_map( p, v0 ); // v0.m_y *= s * m_dr + (1.0-s) * m_dl; v0.m_y *= v0.m_x * m_dr + (1.0-v0.m_x) * m_dl; from.inv_bn_map( v0, ret ); // to.st_map( p, v0 ); // from.inv_st_map( v0, ret ); } } /** map p in the "from" image to a point in the "to" img * @param p 2D point in the "from" image * @param ret corresponding 2D point in the "to" image * * The backward() map is not invertibel in close form, therefore * the forward() map is carried out by guessing s first point and * searching around it for a point that satisfies the backward() map. * This way forward() takes 30-40 times longer than backward(). * * The forward() code must come after backward() has been instantiated. */ template< typename T > void item_pair::forward( const thvec2 & p, thvec2 & ret ) const { static thvec2 v0, r1; thvec2 p1; double d, d0, x, y; double dx = 0.1, dy=0.1; from.bn_map( p, v0 ); // v0.m_y *= s * m_dr + (1.0-s) * m_dl; v0.m_y *= v0.m_x * m_dr + (1.0-v0.m_x) * m_dl; to.inv_bn_map( v0, r1 ); this->backward( r1, p1 ); x = p.m_x - p1.m_x; y = p.m_y - p1.m_y; d0 = x*x + y*y; do { r1.m_x += dx; this->backward( r1, p1 ); x = p.m_x - p1.m_x; y = p.m_y - p1.m_y; d = x*x + y*y; if ( d < d0 ) { d0 = d; } else { r1.m_x -= dx; dx = -dx/2; } r1.m_y += dy; this->backward( r1, p1 ); x = p.m_x - p1.m_x; y = p.m_y - p1.m_y; d = x*x + y*y; if ( d < d0 ) { d0 = d; } else { r1.m_y -= dy; dy = -dy/2; } } while ( d0 > 1.e-6 && fabs(dx) > 1.e-3 && fabs(dy) > 1.e-3); ret = r1; } #ifdef DEBUG /** debug: print */ template< > void plaquette_pair::print() const { thprintf("[%d] Plaquette A %6.2f %6.2f <-> %6.2f %6.2f\n", nr(), from.m_A.m_x, from.m_A.m_y, to.m_A.m_x, to.m_A.m_y ); thprintf(" B %6.2f %6.2f <-> %6.2f %6.2f\n", from.m_B.m_x, from.m_B.m_y, to.m_B.m_x, to.m_B.m_y ); thprintf(" C %6.2f %6.2f <-> %6.2f %6.2f\n", from.m_C.m_x, from.m_C.m_y, to.m_C.m_x, to.m_C.m_y ); thprintf(" D %6.2f %6.2f <-> %6.2f %6.2f\n", from.m_D.m_x, from.m_D.m_y, to.m_D.m_x, to.m_D.m_y ); print_ngbhs(); } #endif } // namespace warp } // namespace therion therion/thdb1d.cxx0000664000175000017500000032734012447656373013172 0ustar useruser/** * @file thdb1d.cxx */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb1d.h" #include "thsurvey.h" #include "thobjectname.h" #include #include "thsvxctrl.h" #include "thdataobject.h" #include "thdatabase.h" #include "thdataleg.h" #include "thexception.h" #include "thdata.h" #include "thinfnan.h" #include #include #include "thpoint.h" #include "thlogfile.h" #include "thsurface.h" #include "thlocale.h" #include "thinit.h" #include "thconfig.h" #include "thtrans.h" #include "loch/lxMath.h" #include "thcs.h" #ifdef THMSVC #define hypot _hypot #endif //#define THUSESVX //#define THDEBUG thdb1d::thdb1d() { this->db = NULL; this->tree_legs = NULL; this->num_tree_legs = 0; this->lsid = 0; this->nlength = 0.0; this->tree_arrows = NULL; this->tree_nodes = NULL; this->min_year = thnan; this->max_year = thnan; this->d3_data_parsed = false; } void thdb1ds::export_mp_flags(FILE * out) { fprintf(out, "ATTR__stationflag_splay := %s;\n", (this->is_temporary() ? "true" : "false")); } void thdb1ds::set_temporary(const char * name) { temps = TT_TEMPSTATION_NONE; if (name != NULL) { switch (name[0]) { case '.': temps = TT_TEMPSTATION_FEATURE; break; case '-': temps = TT_TEMPSTATION_WALL; break; } } } thdb1d::~thdb1d() { if (this->tree_legs != NULL) delete [] this->tree_legs; if (this->tree_arrows != NULL) delete [] this->tree_arrows; if (this->tree_nodes != NULL) delete [] this->tree_nodes; } void thdb1d::assigndb(thdatabase * dbptr) { this->db = dbptr; } void thdb1d::scan_data() { thdb_object_list_type::iterator obi = this->db->object_list.begin(); thdataleg_list::iterator lei; thdatafix_list::iterator fii; thdatamark_list::iterator mii; thdatass_list::iterator ssi; thdataextend_list::iterator xi; thdataequate_list::iterator eqi; thstdims_list::iterator di; double meridian_convergence = thcfg.get_outcs_convergence(), declin, leggridmc, lastleggridmc(0.0); int lastleggridmccs = TTCS_LOCAL; thdata * dp; unsigned used_declination = 0; unsigned long prevlsid; double dcc, sindecl, cosdecl, tmpx, tmpy; thdb1ds * tsp1, * tsp2; // Temporary stations. this->min_year = thnan; this->max_year = thnan; obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); if (dp->date.is_defined()) { double syear, eyear; syear = dp->date.get_start_year(); eyear = syear; if (dp->date.is_interval()) eyear = dp->date.get_end_year(); if (thisnan(this->min_year)) { this->min_year = syear; this->max_year = eyear; } else { if (this->min_year > syear) this->min_year = syear; if (this->max_year < eyear) this->max_year = eyear; } } bool dpdeclindef; double dpdeclin; dpdeclin = 0.0; dpdeclindef = false; if (dp->date.is_defined() && (thcfg.get_outcs_mag_decl(dp->date.get_average_year(), dpdeclin))) dpdeclindef = true; // scan data shots lei = dp->leg_list.begin(); try { while(lei != dp->leg_list.end()) { if (lei->is_valid) { // thdataleg * lf = &(*lei); lei->from.id = this->insert_station(lei->from, lei->psurvey, dp, 3); lei->to.id = this->insert_station(lei->to, lei->psurvey, dp, 3); if (((strcmp(lei->from.name,".") == 0) || (strcmp(lei->from.name,"-") == 0)) && ((strcmp(lei->to.name,".") == 0) || (strcmp(lei->to.name,"-") == 0))) ththrow(("shot between stations without names not allowed")) if ((strcmp(lei->from.name,"-") == 0) || (strcmp(lei->to.name,"-") == 0) || (strcmp(lei->from.name,".") == 0) || (strcmp(lei->to.name,".") == 0)) { lei->flags |= TT_LEGFLAG_SPLAY; lei->walls = TT_FALSE; } this->leg_vec.push_back(thdb1dl(&(*lei),dp,lei->psurvey)); // check station marks tsp1 = &(this->station_vec[lei->from.id - 1]); tsp2 = &(this->station_vec[lei->to.id - 1]); if (lei->s_mark > (unsigned int)tsp1->mark) tsp1->mark = lei->s_mark; if (lei->s_mark > (unsigned int)tsp2->mark) tsp2->mark = lei->s_mark; // set underground station flag if ((lei->flags & TT_LEGFLAG_SURFACE) == 0) { tsp1->flags |= TT_STATIONFLAG_UNDERGROUND; tsp2->flags |= TT_STATIONFLAG_UNDERGROUND; } // check the length if ((lei->data_type == TT_DATATYPE_NORMAL) || (lei->data_type == TT_DATATYPE_DIVING) || (lei->data_type == TT_DATATYPE_CYLPOLAR)) { if (thisnan(lei->length) && (!thisnan(lei->tocounter)) && (!thisnan(lei->fromcounter))) { lei->length = lei->tocounter - lei->fromcounter; lei->length_sd = lei->counter_sd; } } // check depth change if (lei->data_type == TT_DATATYPE_DIVING) { if (!thisnan(lei->depthchange)) dcc = lei->depthchange; else dcc = lei->todepth - lei->fromdepth; lei->depthchange = dcc; if (fabs(dcc) > lei->length) ththrow(("length reading is less than change in depth")) } // check backwards compass reading if ((lei->data_type == TT_DATATYPE_NORMAL) || (lei->data_type == TT_DATATYPE_DIVING) || (lei->data_type == TT_DATATYPE_CYLPOLAR)) { if (!thisnan(lei->backbearing)) { if (thisnan(lei->bearing)) { lei->backbearing -= 180.0; if (lei->backbearing < 0) lei->backbearing += 360.0; lei->bearing = lei->backbearing; } else { lei->backbearing -= 180.0; if (lei->backbearing < 0) lei->backbearing += 360.0; // calculate average of two angles //lei->bearing += lei->backbearing; //lei->bearing = lei->bearing / 2.0; double sumx, sumy; sumx = cos((90.0 - lei->bearing)/180.0*THPI) + cos((90.0 - lei->backbearing)/180.0*THPI); sumy = sin((90.0 - lei->bearing)/180.0*THPI) + sin((90.0 - lei->backbearing)/180.0*THPI); lei->bearing = 90.0 - (atan2(sumy, sumx) / THPI * 180.0); if (lei->bearing < 0.0) lei->bearing += 360.0; } } } // check backwards gradient reading if (lei->data_type == TT_DATATYPE_NORMAL) { if (!thisnan(lei->backgradient)) { if (thisnan(lei->gradient)) { lei->backgradient = - lei->backgradient; lei->gradient = lei->backgradient; } else { if ((thisinf(lei->gradient) == 0) && (thisinf(lei->backgradient) == 0)) { lei->backgradient = - lei->backgradient; lei->gradient += lei->backgradient; lei->gradient = lei->gradient / 2.0; } else { if (thisinf(lei->gradient) != -thisinf(lei->backgradient)) ththrow(("invalid plumbed shot")) } } } } // calculate leg total length and std switch (lei->data_type) { case TT_DATATYPE_NORMAL: lei->total_length = lei->length; lei->total_bearing = (thisnan(lei->bearing) ? 0.0 : lei->bearing); if (!lei->direction) { lei->total_bearing += 180.0; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; } lei->total_gradient = (thisinf(lei->gradient) == 1 ? 90.0 : (thisinf(lei->gradient) == -1 ? -90.0 : lei->gradient)); if (!lei->direction) lei->total_gradient *= -1.0; lei->total_dz = lei->total_length * cos(lei->total_gradient/180*THPI); lei->total_dx = lei->total_dz * sin(lei->total_bearing/180*THPI); lei->total_dy = lei->total_dz * cos(lei->total_bearing/180*THPI); lei->total_dz = lei->total_length * sin(lei->total_gradient/180*THPI); lei->plumbed = (thisinf(lei->gradient) != 0); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->gradient == -90.0) || (lei->gradient == 90.0); } break; case TT_DATATYPE_DIVING: lei->total_length = lei->length; lei->total_bearing = (thisnan(lei->bearing) ? 0.0 : lei->bearing); if (!lei->direction) { lei->total_bearing += 180.0; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; } lei->total_gradient = asin(lei->depthchange / lei->length) / THPI * 180.0; if (!lei->direction) lei->total_gradient *= -1.0; lei->total_dz = lei->total_length * cos(lei->total_gradient/180*THPI); lei->total_dx = lei->total_dz * sin(lei->total_bearing/180*THPI); lei->total_dy = lei->total_dz * cos(lei->total_bearing/180*THPI); lei->total_dz = lei->total_length * sin(lei->total_gradient/180*THPI); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->depthchange == lei->length) && (lei->depthchange != 0.0); } break; case TT_DATATYPE_CYLPOLAR: lei->total_length = sqrt(thnanpow2(lei->length) + thnanpow2(lei->depthchange)); lei->total_bearing = (thisnan(lei->bearing) ? 0.0 : lei->bearing); if (!lei->direction) { lei->total_bearing += 180.0; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; } lei->total_gradient = atan2(lei->depthchange, lei->length) / THPI * 180.0; if (!lei->direction) lei->total_gradient *= -1.0; lei->total_dz = lei->total_length * cos(lei->total_gradient/180*THPI); lei->total_dx = lei->total_dz * sin(lei->total_bearing/180*THPI); lei->total_dy = lei->total_dz * cos(lei->total_bearing/180*THPI); lei->total_dz = lei->total_length * sin(lei->total_gradient/180*THPI); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->length == 0.0) && (lei->depthchange != 0.0); } break; case TT_DATATYPE_CARTESIAN: lei->total_dx = (lei->direction ? 1.0 : -1.0) * lei->dx; lei->total_dy = (lei->direction ? 1.0 : -1.0) * lei->dy; lei->total_dz = (lei->direction ? 1.0 : -1.0) * lei->dz; lei->total_length = thdxyz2length(lei->total_dx,lei->total_dy,lei->total_dz); lei->total_bearing = thdxyz2bearing(lei->total_dx,lei->total_dy,lei->total_dz); lei->total_gradient = thdxyz2clino(lei->total_dx,lei->total_dy,lei->total_dz); if (lei->infer_plumbs && (!lei->plumbed)) { lei->plumbed = (lei->dx == 0.0) && (lei->dy == 0.0) && (lei->dz != 0.0); } break; } leggridmc = 0.0; if (lei->gridcs != TTCS_LOCAL) { if (lei->gridcs != lastleggridmccs) { if (lei->gridcs == thcfg.outcs) { lastleggridmc = meridian_convergence; } else { lastleggridmc = thcfg.get_cs_convergence(lei->gridcs); } lastleggridmccs = lei->gridcs; } leggridmc = lastleggridmc; } if ((leggridmc != 0.0) || (meridian_convergence != 0.0) || (!thisnan(lei->declination)) || dpdeclindef) { declin = meridian_convergence - leggridmc; if (!thisnan(lei->declination)) { declin += lei->declination; used_declination |= 2; } else if (dpdeclindef) { lei->implicit_declination = dpdeclin; declin += dpdeclin; used_declination |= 4; } else { used_declination |= 1; } lei->total_bearing += declin; if (lei->total_bearing >= 360.0) lei->total_bearing -= 360.0; if (lei->total_bearing < 0.0) lei->total_bearing += 360.0; cosdecl = cos(declin/180*THPI); sindecl = sin(declin/180*THPI); tmpx = lei->total_dx; tmpy = lei->total_dy; lei->total_dx = (cosdecl * tmpx) + (sindecl * tmpy); lei->total_dy = (cosdecl * tmpy) - (sindecl * tmpx); } lei->adj_dx = lei->total_dx; lei->adj_dy = lei->total_dy; lei->adj_dz = lei->total_dz; lei->calc_total_stds(); } lei++; } } catch (...) threthrow(("%s [%d]", lei->srcf.name, lei->srcf.line)); // scan data fixes fii = dp->fix_list.begin(); thdb1ds * tmps; unsigned olevel, nlevel; try { while(fii != dp->fix_list.end()) { fii->station.id = this->insert_station(fii->station, fii->psurvey, dp, 2); tmps = &(this->station_vec[fii->station.id - 1]); tmps->flags |= TT_STATIONFLAG_FIXED; if (fii->srcf.context != NULL) { if (tmps->fixcontext != NULL) { if (tmps->fixcontext->fsptr == NULL) olevel = 0; else olevel = tmps->fixcontext->fsptr->level; if (fii->srcf.context->fsptr == NULL) nlevel = 0; else nlevel = fii->srcf.context->fsptr->level; if (nlevel <= olevel) { tmps->fixcontext = fii->srcf.context; } } else { tmps->fixcontext = fii->srcf.context; } } fii++; } } catch (...) threthrow(("%s [%d]", fii->srcf.name, fii->srcf.line)); } obi++; } // process equates separately obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); // scan data equates eqi = dp->equate_list.begin(); try { while(eqi != dp->equate_list.end()) { prevlsid = this->lsid; eqi->station.id = this->insert_station(eqi->station, eqi->psurvey, dp, 1); if ((prevlsid < eqi->station.id) && (eqi->station.survey != NULL)) thwarning(("%s [%d] -- equate used to define new station (%s@%s)", eqi->srcf.name, eqi->srcf.line, eqi->station.name, eqi->station.survey)); eqi++; } } catch (...) threthrow(("%s [%d]", eqi->srcf.name, eqi->srcf.line)); } obi++; } // after scanning obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_SURVEY_CMD) { thsurvey * srv = (thsurvey *) (*obi); if (!srv->entrance.is_empty()) { srv->entrance.id = this->get_station_id(srv->entrance, srv); if (srv->entrance.id == 0) { if (srv->entrance.survey == NULL) ththrow(("station doesn't exist -- %s", srv->entrance.name)) else ththrow(("station doesn't exist -- %s@%s", srv->entrance.name, srv->entrance.survey)) } // set entrance flag & comment to given station this->station_vec[srv->entrance.id-1].flags |= TT_STATIONFLAG_ENTRANCE; if (strlen(srv->title) > 0) this->station_vec[srv->entrance.id-1].comment = srv->title; else this->station_vec[srv->entrance.id-1].comment = srv->name; } } if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); // scan data stations ssi = dp->ss_list.begin(); try { while(ssi != dp->ss_list.end()) { ssi->station.id = this->get_station_id(ssi->station, ssi->psurvey); if (ssi->station.id == 0) { if (ssi->station.survey == NULL) ththrow(("station doesn't exist -- %s", ssi->station.name)) else ththrow(("station doesn't exist -- %s@%s", ssi->station.name, ssi->station.survey)) } // set station flags and comment else { if (ssi->comment != NULL) this->station_vec[ssi->station.id-1].comment = ssi->comment; this->station_vec[ssi->station.id-1].explored = ssi->explored; this->station_vec[ssi->station.id-1].flags |= ssi->flags; // set station attributes this->m_station_attr.insert_object(NULL, (long) ssi->station.id); thdatass_attr_map::iterator ami; for(ami = ssi->attr.begin(); ami != ssi->attr.end(); ami++) { this->m_station_attr.insert_attribute(ami->first.c_str(), ami->second); } } ssi++; } } catch (...) threthrow(("%s [%d]", ssi->srcf.name, ssi->srcf.line)); // scan data marks mii = dp->mark_list.begin(); try { while(mii != dp->mark_list.end()) { mii->station.id = this->get_station_id(mii->station, mii->psurvey); if (mii->station.id == 0) { if (mii->station.survey == NULL) ththrow(("station doesn't exist -- %s", mii->station.name)) else ththrow(("station doesn't exist -- %s@%s", mii->station.name, mii->station.survey)) } // set station flags and comment else { thdb1ds * markst = &(this->station_vec[mii->station.id - 1]); markst->mark_station = true; if (markst->mark < mii->mark) markst->mark = mii->mark; } mii++; } } catch (...) threthrow(("%s [%d]", mii->srcf.name, mii->srcf.line)); // scan extends xi = dp->extend_list.begin(); try { while(xi != dp->extend_list.end()) { if (!xi->to.is_empty()) { xi->to.id = this->get_station_id(xi->to, xi->psurvey); if (xi->to.id == 0) { if (xi->to.survey == NULL) ththrow(("station doesn't exist -- %s", xi->to.name)) else ththrow(("station doesn't exist -- %s@%s", xi->to.name, xi->to.survey)) } } xi->from.id = this->get_station_id(xi->from, xi->psurvey); if (xi->from.id == 0) { if (xi->from.survey == NULL) ththrow(("station doesn't exist -- %s", xi->from.name)) else ththrow(("station doesn't exist -- %s@%s", xi->from.name, xi->from.survey)) } xi++; } } catch (...) threthrow(("%s [%d]", xi->srcf.name, xi->srcf.line)); // scan dimensions di = dp->dims_list.begin(); try { while(di != dp->dims_list.end()) { di->station.id = this->get_station_id(di->station, di->psurvey); if (di->station.id == 0) { if (di->station.survey == NULL) ththrow(("station doesn't exist -- %s", di->station.name)) else ththrow(("station doesn't exist -- %s@%s", di->station.name, di->station.survey)) } di++; } } catch (...) threthrow(("%s [%d]", di->srcf.name, di->srcf.line)); dp->complete_dimensions(); } obi++; } if (((used_declination & 1) != 0) && ((used_declination & 4) != 0)) thwarning(("unable to determine magnetic declination for undated surveys")) thcfg.log_outcs(this->min_year, this->max_year); } void thdb1d::process_data() { this->scan_data(); this->find_loops(); this->close_loops(); if (thini.loopc == THINIT_LOOPC_SURVEX) { thsvxctrl survex; try { survex.process_survey_data(this->db); } catch (...) { thwarning((thexc.get_desc())) } } this->process_survey_stat(); this->postprocess_objects(); this->process_xelev(); } unsigned long thdb1d::get_station_id(thobjectname on, thsurvey * ps) { unsigned long csurvey_id = this->db->get_survey_id(on.survey, ps); thdb1d_station_map_type::iterator sti; sti = this->station_map.find(thobjectid(on.name, csurvey_id)); if (sti == this->station_map.end()) return 0; else return sti->second; } void thdb1ds::set_parent_data(class thdata * pd, unsigned pd_priority) { if (pd_priority > this->data_priority) { this->data.clear(); this->data_priority = pd_priority; } if (pd_priority == this->data_priority) this->data.push_back(pd); } unsigned long thdb1d::insert_station(class thobjectname on, class thsurvey * ps, class thdata * pd, unsigned pd_priority) { bool is_temp = false; if ((strcmp(on.name,"-") == 0) || (strcmp(on.name,".") == 0)) { is_temp = true; } // first insert object into database ps = this->db->get_survey(on.survey, ps); unsigned long csurvey_id = (ps == NULL) ? 0 : ps->id; on.survey = NULL; if (!is_temp) { thdb1d_station_map_type::iterator sti; sti = this->station_map.find(thobjectid(on.name, csurvey_id)); if (sti != this->station_map.end()) { this->station_vec[sti->second - 1].set_parent_data(pd,pd_priority); return sti->second; } if (!(this->db->insert_datastation(on, ps))) { if (on.survey != NULL) ththrow(("object already exist -- %s@%s", on.name, on.survey)) else ththrow(("object already exist -- %s", on.name)) } } this->lsid++; this->station_vec.push_back(thdb1ds(on.name, ps)); thdb1ds * cstation = &(this->station_vec[this->lsid - 1]); if (!is_temp) { this->station_map[thobjectid(on.name, csurvey_id)] = this->lsid; } else { cstation->set_temporary(on.name); } cstation->set_parent_data(pd,pd_priority); return this->lsid; } void thdb1d::self_print(FILE * outf) { unsigned int sid; fprintf(outf,"survey stations\n"); thdb1ds * sp; for (sid = 0; sid < this->lsid; sid++) { sp = & (this->station_vec[sid]); fprintf(outf,"\t%d:%ld\t%s@%s\t%.2f\t%.2f\t%.2f", sid + 1, sp->uid, sp->name, sp->survey->full_name, sp->x, sp->y, sp->z); fprintf(outf,"\tflags:"); if (sp->flags & TT_STATIONFLAG_ENTRANCE) fprintf(outf,"E"); if (sp->flags & TT_STATIONFLAG_CONT) fprintf(outf,"C"); if (sp->flags & TT_STATIONFLAG_FIXED) fprintf(outf,"F"); if (sp->flags & TT_STATIONFLAG_UNDERGROUND) fprintf(outf,"U"); fprintf(outf,"\tmark:"); switch (sp->mark) { case TT_DATAMARK_FIXED: fprintf(outf,"fixed"); break; case TT_DATAMARK_PAINTED: fprintf(outf,"painted"); break; case TT_DATAMARK_TEMP: fprintf(outf,"temporary"); break; case TT_DATAMARK_NATURAL: fprintf(outf,"natural"); break; } if (sp->comment != NULL) fprintf(outf,"\t\"%s\"", sp->comment); fprintf(outf,"\n"); } fprintf(outf,"end -- survey stations\n"); } unsigned long thdb1d::get_tree_size() { if (this->tree_legs == NULL) this->process_tree(); return this->num_tree_legs; } thdb1dl ** thdb1d::get_tree_legs() { if (this->tree_legs == NULL) this->process_tree(); return this->tree_legs; } void thdb1d_equate_nodes(thdb1d * thisdb, thdb1d_tree_node * n1, thdb1d_tree_node * n2) { if (n1->uid == n2->uid) return; thdb1d_tree_node * n3; if (n1->is_fixed && n2->is_fixed) { ththrow(("equate of two fixed stations -- %s@%s and %s@%s", thisdb->station_vec[n1->id - 1].name, thisdb->station_vec[n1->id - 1].survey->get_full_name(), thisdb->station_vec[n2->id - 1].name, thisdb->station_vec[n2->id - 1].survey->get_full_name())); } if (n1->id == n2->id) { ththrow(("equate of two identical stations -- %s@%s and %s@%s", thisdb->station_vec[n1->id - 1].name, thisdb->station_vec[n1->id - 1].survey->get_full_name(), thisdb->station_vec[n2->id - 1].name, thisdb->station_vec[n2->id - 1].survey->get_full_name())); } // vymeni ich ak uid1 nie je fixed if ((n2->is_fixed) && (!n1->is_fixed)) { n3 = n1; n1 = n2; n2 = n3; } // priradi uid1 do uid2 n2->uid = n1->uid; n3 = n2->prev_eq; while (n3 != NULL) { n3->uid = n1->uid; n3 = n3->prev_eq; } n3 = n2->next_eq; while (n3 != NULL) { n3->uid = n1->uid; n3 = n3->next_eq; } // teraz spojme n1->prev s n2->next while (n1->prev_eq != NULL) { n1 = n1->prev_eq; } while (n2->next_eq != NULL) { n2 = n2->next_eq; } n1->prev_eq = n2; n2->next_eq = n1; } void thdb1d::process_tree() { size_t tn_legs = this->leg_vec.size(); size_t tn_stations = this->station_vec.size(); #ifdef THDEBUG thprintf("\n\nscanning centreline tree\n"); #else thprintf("scanning centreline tree ... "); thtext_inline = true; #endif thdb1d_tree_node * nodes = new thdb1d_tree_node [tn_stations]; this->tree_nodes = nodes; thdb1d_tree_arrow * arrows = new thdb1d_tree_arrow [2 * tn_legs]; this->tree_arrows = arrows; thdb1d_tree_node * n1, * n2, * n3, * current_node = NULL; thdb1d_tree_arrow * a1, * a2; unsigned long i, ii; bool any_fixed = false; // let's parse all nodes for(i = 0, ii = 1, n1 = nodes; i < tn_stations; i++, n1++, ii++) { n1->id = ii; n1->uid = ii; n1->is_fixed = ((this->station_vec[i].flags & TT_STATIONFLAG_FIXED) != 0); // if (n1->is_fixed) // thprintf("FX: %s@%s\n", this->station_vec[i].name, this->station_vec[i].survey->full_name); if (n1->is_fixed) any_fixed = true; } // let's parse all equates thdb_object_list_type::iterator obi = this->db->object_list.begin(); thdataequate_list::iterator eqi; thdata * dp; int last_eq = -1; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); eqi = dp->equate_list.begin(); last_eq = -1; while(eqi != dp->equate_list.end()) { if (eqi->eqid != last_eq) { n1 = nodes + (eqi->station.id - 1); last_eq = eqi->eqid; } else { n2 = nodes + (eqi->station.id - 1); thdb1d_equate_nodes(this,n1,n2); } eqi++; } } obi++; } // now let's equate infer legs, zero lengthed thdb1d_leg_vec_type::iterator iil; for(iil = this->leg_vec.begin(); iil != this->leg_vec.end(); iil++) { if (iil->leg->infer_equates) { if (iil->leg->total_length == 0.0) { thdb1d_equate_nodes(this, nodes + (iil->leg->from.id - 1), nodes + (iil->leg->to.id - 1)); } } } // write uid into original database for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { this->station_vec[i].uid = n1->uid; } // go leg by leg and fill arrows for(iil = this->leg_vec.begin(), a1 = arrows; iil != this->leg_vec.end(); iil++) { if (iil->leg->infer_equates) if (iil->leg->total_length == 0.0) continue; a2 = a1 + 1; a1->negative = a2; a1->leg = &(*iil); a1->start_node = nodes + (nodes[iil->leg->from.id - 1].uid - 1); a1->end_node = nodes + (nodes[iil->leg->to.id - 1].uid - 1); // if ((iil->leg->data_type == TT_DATATYPE_NOSURVEY) && // ((!a1->start_node->is_fixed) || (!a1->end_node->is_fixed))) { //// thprintf("%s@%s - %s@%s\n", iil->leg->from.name, iil->leg->from.survey, iil->leg->to.name, iil->leg->to.survey); // ththrow(("unsurveyed shot between unfixed stations -- %s [%d]", // iil->leg->srcf.name, iil->leg->srcf.line // )); // } if (iil->leg->data_type == TT_DATATYPE_NOSURVEY) { a1->is_nosurvey = true; a2->is_nosurvey = true; } // hide splay-ed flags from extended elevation2 //if ((iil->leg->flags && TT_LEGFLAG_SPLAY) != 0) { // iil->leg->extend |= TT_EXTENDFLAG_HIDE; // a2->extend |= TT_EXTENDFLAG_HIDE; // a1->extend |= TT_EXTENDFLAG_HIDE; //} a2->negative = a1; a2->leg = a1->leg; a2->start_node = a1->end_node; a2->end_node = a1->start_node; a2->is_reversed = true; // assign nodes a1->next_arrow = a1->start_node->first_arrow; a1->start_node->first_arrow = a1; a2->next_arrow = a2->start_node->first_arrow; a2->start_node->first_arrow = a2; a1->start_node->narrows++; a2->start_node->narrows++; a1 += 2; } // process the tree // 1. set all nodes without legs as attached for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { if (n1->id != n1->uid) n1->is_attached = true; else if ((n1->first_arrow == NULL) && (n1->is_fixed)) n1->is_attached = true; } unsigned long series = 0, component = 0, tarrows = 0, last_series = 0; bool component_break = true; this->tree_legs = new thdb1dl* [tn_legs]; thdb1dl ** current_leg = this->tree_legs; while (tarrows < tn_legs) { if (component_break) { // let's find starting node n2 = NULL; n3 = NULL; bool n2null = true; for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { if (!n1->is_attached) { if (n2null) { n2 = n1; n3 = n1; n2null = false; } if (n1->is_fixed) { n2 = n1; break; } } } // something is wrong if (n2 == NULL) { ththrow(("a software BUG is present (" __FILE__ ":%d)", __LINE__)); //#ifdef THDEBUG // thprintf("warning -- not all stations connected to the network\n"); //#endif break; } if ((!n2->is_fixed) && (any_fixed || (component > 0))) { ththrow(("can not connect %s@%s to centerline network", this->station_vec[n3->id - 1].name, this->station_vec[n3->id - 1].survey->get_full_name())); } current_node = n2; current_node->is_attached = true; component++; if (series == last_series) series++; component_break = false; #ifdef THDEBUG thprintf("component %d -- %d (%s@%s)\n", component, current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } // end of tremaux // let's make move if (current_node->last_arrow == NULL) current_node->last_arrow = current_node->first_arrow; else current_node->last_arrow = current_node->last_arrow->next_arrow; // skip discovery arrows or nosurvey arrows, if station on the other site is not connected while ((current_node->last_arrow != NULL) && ( (current_node->last_arrow->is_discovery) || ((current_node->last_arrow->is_nosurvey) && (!current_node->last_arrow->end_node->is_attached)) )) current_node->last_arrow = current_node->last_arrow->next_arrow; if (current_node->last_arrow == NULL) { // go back if (current_node->back_arrow == NULL) component_break = true; else { current_node = current_node->back_arrow->end_node; #ifdef THDEBUG thprintf("%d (%s@%s) <-\n", current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } } else { // go forward // check if not already discovered current_node->last_arrow->negative->is_discovery = true; tarrows++; *current_leg = current_node->last_arrow->leg; #ifdef THDEBUG thdb1dl * prev_leg = *current_leg; #endif (*current_leg)->reverse = current_node->last_arrow->is_reversed; (*current_leg)->series_id = series; last_series = series; (*current_leg)->component_id = component; current_leg++; #ifdef THDEBUG thprintf("-> %d (%s@%s) [%d %s %d, series %d, arrow %d]\n", current_node->last_arrow->end_node->id, this->station_vec[current_node->last_arrow->end_node->id - 1].name, this->station_vec[current_node->last_arrow->end_node->id - 1].survey->get_full_name(), prev_leg->leg->from.id, (prev_leg->reverse ? "<=" : "=>"), prev_leg->leg->to.id, series, tarrows); #endif if (!current_node->last_arrow->end_node->is_attached) { current_node->last_arrow->end_node->back_arrow = current_node->last_arrow->negative; current_node = current_node->last_arrow->end_node; current_node->is_attached = true; if (current_node->narrows != 2) series++; } else series++; } } this->num_tree_legs = tarrows; #ifdef THDEBUG thprintf("\nend of scanning data tree\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif } void thdb1d__scan_survey_station_limits(thsurvey * ss, thdb1ds * st, bool is_under) { if (st->is_temporary()) return; if (ss->stat.station_state == 0) { if (is_under) ss->stat.station_state = 2; else ss->stat.station_state = 1; ss->stat.station_top = st; ss->stat.station_bottom = st; ss->stat.station_south = st; ss->stat.station_north = st; ss->stat.station_east = st; ss->stat.station_west = st; } else if (is_under && (ss->stat.station_state == 1)) { ss->stat.station_state = 2; ss->stat.station_top = st; ss->stat.station_bottom = st; ss->stat.station_south = st; ss->stat.station_north = st; ss->stat.station_east = st; ss->stat.station_west = st; } else if (is_under || (ss->stat.station_state == 1)) { ss->stat.station_state = 2; if (ss->stat.station_top->z < st->z) ss->stat.station_top = st; if (ss->stat.station_bottom->z > st->z) ss->stat.station_bottom = st; if (ss->stat.station_east->x < st->x) ss->stat.station_east = st; if (ss->stat.station_west->x > st->x) ss->stat.station_west = st; if (ss->stat.station_north->y < st->y) ss->stat.station_north = st; if (ss->stat.station_south->y > st->y) ss->stat.station_south = st; } } void thdb1d__scan_data_station_limits(thdata * ss, thdb1ds * st, bool is_under) { if (ss->stat_st_state == 0) { if (is_under) ss->stat_st_state = 2; else ss->stat_st_state = 1; ss->stat_st_top = st; ss->stat_st_bottom = st; // ss->stat_st_south = st; // ss->stat_st_north = st; // ss->stat_st_east = st; // ss->stat_st_west = st; } else if (is_under && (ss->stat_st_state == 1)) { ss->stat_st_state = 2; ss->stat_st_top = st; ss->stat_st_bottom = st; // ss->stat_st_south = st; // ss->stat_st_north = st; // ss->stat_st_east = st; // ss->stat_st_west = st; } else if (is_under || (ss->stat_st_state == 1)) { ss->stat_st_state = 2; if (ss->stat_st_top->z < st->z) ss->stat_st_top = st; if (ss->stat_st_bottom->z > st->z) ss->stat_st_bottom = st; // if (ss->stat_st_east->x < st->x) // ss->stat_st_east = st; // if (ss->stat_st_west->x > st->x) // ss->stat_st_west = st; // if (ss->stat_st_north->y < st->y) // ss->stat_st_north = st; // if (ss->stat_st_south->y > st->y) // ss->stat_st_south = st; } } void thdb1d::process_survey_stat() { #ifdef THDEBUG thprintf("\n\ncalculating basic statistics\n"); #else thprintf("calculating basic statistics ... "); thtext_inline = true; #endif thsurvey * ss; // prejde vsetky legy a spocita ich a dlzky pre kazde survey // do ktoreho patria thdb1d_leg_vec_type::iterator lit = this->leg_vec.begin(); while (lit != this->leg_vec.end()) { // skusi ci je duplikovane if ((lit->leg->flags & TT_LEGFLAG_SPLAY) != 0) lit->data->stat_splaylength += lit->leg->total_length; else if ((lit->leg->flags & TT_LEGFLAG_DUPLICATE) != 0) lit->data->stat_dlength += lit->leg->total_length; // ak nie skusi ci je surface else if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) lit->data->stat_slength += lit->leg->total_length; // inak prida do length else { lit->data->stat_length += lit->leg->total_length; this->nlength += lit->leg->total_length; // check if approximate length if ((lit->leg->flags & TT_LEGFLAG_APPROXIMATE) != 0) lit->data->stat_alength += lit->leg->total_length; } // stations if ((lit->leg->flags & TT_LEGFLAG_SPLAY) == 0) { if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) { thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->from.id - 1]), false); thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->to.id - 1]), false); } else { thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->from.id - 1]), true); thdb1d__scan_data_station_limits(lit->data, &(this->station_vec[lit->leg->to.id - 1]), true); } } ss = lit->survey; while (ss != NULL) { // skusi ci nie je splay if ((lit->leg->flags & TT_LEGFLAG_SPLAY) != 0) ss->stat.length_splay += lit->leg->total_length; // skusi ci je duplikovane else if ((lit->leg->flags & TT_LEGFLAG_DUPLICATE) != 0) ss->stat.length_duplicate += lit->leg->total_length; // ak nie skusi ci je surface else if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) ss->stat.length_surface += lit->leg->total_length; // inak prida do length else { if ((lit->leg->flags & TT_LEGFLAG_APPROXIMATE) != 0) ss->stat.length_approx += lit->leg->total_length; ss->stat.length += lit->leg->total_length; } if ((lit->leg->flags & TT_LEGFLAG_SPLAY) == 0) { if ((lit->leg->flags & TT_LEGFLAG_SURFACE) != 0) { thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->from.id - 1]), false); thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->to.id - 1]), false); } else { thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->from.id - 1]), true); thdb1d__scan_survey_station_limits(ss, &(this->station_vec[lit->leg->to.id - 1]), true); } } ss->stat.num_shots++; ss = ss->fsptr; } lit++; } // prejde vsetky stations a spocita ich a nastavi limitne stations // pricom ak najde prvu povrchovu, tak nastvi vsetky s nou // ak najde podzemnu a ma niekde povrchovu -> nastavi podzemnu thdb1d_station_vec_type::iterator sit = this->station_vec.begin(); while (sit != this->station_vec.end()) { ss = sit->survey; while (ss != NULL) { if (!thisnan(sit->explored)) ss->stat.length_explored += sit->explored; if ((sit->flags & TT_STATIONFLAG_ENTRANCE) > 0) { ss->stat.num_entrances++; } ss->stat.num_stations++; ss = ss->fsptr; } sit++; } // prejde vsetky continuations a prepocita explore length thdb_object_list_type::iterator obi = this->db->object_list.begin(); thpoint * pt; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_POINT_CMD) { pt = (thpoint *)(*obi); ss = pt->fsptr; if ((pt->type == TT_POINT_TYPE_CONTINUATION) && (!thisnan(pt->xsize))) { while (ss != NULL) { ss->stat.length_explored += pt->xsize; ss = ss->fsptr; } } } obi++; } #ifdef THDEBUG thprintf("\nend of basic statistics calculation\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif } struct thlc_leg { unsigned long from_uid, to_uid, from_id, to_id; thlc_leg * prev_series_leg, * next_series_leg; thdb1dl * dbleg; }; struct thlc_cross { unsigned long id, station_uid, narrows, dm_dist; bool is_fixed, dm_target; thlc_cross * dm_cross, * dm_next; struct thlc_cross_arrow * first_arrow, * last_arrow, * dm_arrow; }; struct thlc_series { unsigned long from, to, numlegs, id; thlc_cross * from_cross, * to_cross; thlc_leg * first_leg, * last_leg; bool is_active; }; struct thlc_cross_arrow { thlc_cross * target; thlc_cross_arrow * prev_arrow, * next_arrow; thlc_series * series; bool reverse; }; struct thlc_loop { thlc_cross * from_cross, * to_cross; thlc_cross_arrow * first_arrow, * last_arrow; unsigned long minid, size, id; #ifdef THDEBUG bool is_new; long old_id; #endif }; bool operator < ( const struct thlc_loop & l1, const struct thlc_loop & l2) { bool direction; thlc_cross_arrow * l1a, * l2a; if (l1.size < l2.size) return true; else if (l1.size > l2.size) return false; // neostava nam nic ine ako porovnavat po seriach if (l1.from_cross->id != l1.to_cross->id) { // l1 otovreny okruh if (l2.from_cross->id == l2.to_cross->id) return false; if (l1.minid < l2.minid) return true; if (l1.minid > l2.minid) return false; if (l1.to_cross->id == l2.to_cross->id) direction = true; else direction = false; // porovname seriu za seriou, vratime false ak nebude mensia l1a = l1.first_arrow; l2a = (direction ? l2.first_arrow : l2.last_arrow); while ((l1a != NULL) && (l2a != NULL)) { if (l1a->series->id > l2a->series->id) return false; if (l1a->series->id < l2a->series->id) return true; l1a = l1a->next_arrow; l2a = (direction ? l2a->next_arrow : l2a->prev_arrow); if ((l1a == NULL) && (l2a != NULL)) return true; if ((l1a != NULL) && (l2a == NULL)) return false; } //#ifdef THDEBUG // thprintf("LOOP EQUAL: %ld == %ld\n", l1.id, l2.id); //#endif return false; } else { // l1 uzavrety okruh if (l2.from_cross->id != l2.to_cross->id) return true; if (l1.minid < l2.minid) return true; if (l1.minid > l2.minid) return false; // v obidvoch najde minid hranu a na zaklade jej orientacie // urci direction v dvojke l1a = l1.first_arrow; while (l1a->series->id != l1.minid) { l1a = l1a->next_arrow; } l2a = l2.first_arrow; while (l2a->series->id != l2.minid) { l2a = l2a->next_arrow; } if (l1a->reverse != l2a->reverse) direction = false; else direction = true; #define nextstep {\ l1a = l1a->next_arrow; \ if (l1a == NULL) l1a = l1.first_arrow; \ l2a = (direction ? l2a->next_arrow : l2a->prev_arrow); \ if (l2a == NULL) l2a = (direction ? l2.first_arrow : l2.last_arrow); \ if ((l1a->series->id == l1.minid) && (l2a->series->id != l2.minid)) \ return true; \ if ((l1a->series->id != l1.minid) && (l2a->series->id == l2.minid)) \ return false; \ if (l1a->series->id < l2a->series->id) return true; \ if (l1a->series->id > l2a->series->id) return false; \ } nextstep; while (l1a->series->id != l1.minid) nextstep; //#ifdef THDEBUG // thprintf("LOOP EQUAL: %ld == %ld\n", l1.id, l2.id); //#endif return false; } } long chledala_chledala(thlc_cross * kde, unsigned long kde_size, thlc_cross * co, thlc_cross * odkial, std::list & vysledok) { long result = -1; unsigned long i; thlc_cross * cc, * lastcc; #ifdef THDEBUG thprintf("\nLOOP SEARCH: %ld -> %ld\n", odkial->id, co == NULL ? -1 : long(co->id)); #endif // initiaze targets if (co == NULL) { for (i = 0; i < kde_size; i++) { cc = &(kde[i]); cc->dm_target = cc->is_fixed; } } else { for (i = 0; i < kde_size; i++) kde[i].dm_target = false; co->dm_target = true; } // reset other tree variables for (i = 0; i < kde_size; i++) { cc = &(kde[i]); cc->dm_arrow = NULL; cc->dm_dist = 0; cc->dm_cross = NULL; } lastcc = odkial; lastcc->dm_next = NULL; cc = odkial; // modified Djikstra-Moore algorithm thlc_cross_arrow * ca; thlc_cross * cmin_cross = NULL, * nc; bool vykasli_sa; unsigned long cmin = 0; #define check_cmin(cross) {\ if (cross->dm_target) {\ if (cmin_cross == NULL) { \ cmin = cross->dm_dist; \ cmin_cross = cross; \ } else if (cmin > cross->dm_dist) {\ cmin = cross->dm_dist; \ cmin_cross = cross; \ } \ } \ } while (cc != NULL) { ca = cc->first_arrow; while ((ca != NULL) && (!cc->dm_target)) { if ((ca->series->is_active) && (ca->target->id != odkial->id)) { if (ca->target->dm_cross != NULL) { // sme vo vrchole, v ktorom sme uz boli, takze iba skontrolujeme, // ci tam nie sme rychlejsie if (ca->target->dm_dist > (cc->dm_dist + ca->series->numlegs)) { ca->target->dm_arrow = ca; ca->target->dm_cross = cc; ca->target->dm_dist = cc->dm_dist + ca->series->numlegs; check_cmin(ca->target); } } else { // dostali sme sa do noveho vrcholu, nastavime mu co treba a // pridame si ho do vrcholov na preskumanie ca->target->dm_arrow = ca; ca->target->dm_cross = cc; ca->target->dm_dist = cc->dm_dist + ca->series->numlegs; check_cmin(ca->target); lastcc->dm_next = ca->target; lastcc = lastcc->dm_next; lastcc->dm_next = NULL; } } ca = ca->next_arrow; } // skontroluje, ci ma zmysel este hladat if (cmin_cross != NULL) { nc = cc->dm_next; vykasli_sa = true; while (nc != NULL) { vykasli_sa = vykasli_sa && (cmin <= nc->dm_dist); nc = nc->dm_next; } if (vykasli_sa) cc->dm_next = NULL; } cc = cc->dm_next; } if (cmin_cross != NULL) { result = cmin; cc = cmin_cross; ca = cc->dm_arrow; while (ca != NULL) { vysledok.insert(vysledok.begin(),*ca); #ifdef THDEBUG thprintf("%d - %d : %s%d\n", ca->reverse ? ca->series->to : ca->series->from, ca->reverse ? ca->series->from : ca->series->to, ca->reverse ? "R" : "N", ca->series->id ); #endif cc = cc->dm_cross; ca = cc->dm_arrow; } } return result; } void thdb1d::find_loops() { size_t nlegs = this->get_tree_size(), nstations = this->station_vec.size(), numseries, i, lastcross, nseries, nloops; thdb1dl ** legs = this->get_tree_legs(), ** curleg, * cleg; thdb1d_tree_node * nodes = this->get_tree_nodes(), * from_node; long * crossst = NULL, * curcrossst, lastlegseries, currentcross; #ifdef THDEBUG thprintf("\n\nsearching for centerline loops\n"); #else thprintf("searching for centerline loops ... "); thtext_inline = true; #endif if (nstations > 0) crossst = new long [nstations]; thlc_leg * lclegs = NULL, * clcleg = NULL, * prevlcleg = NULL; if (nlegs > 0) lclegs = new thlc_leg [nlegs]; thlc_cross * lccrosses = NULL, * clccross; thlc_cross_arrow * lccrossarrows = NULL, * cca; thlc_series tmpseries, * curseries, * prevseries; std::vector lcseries; thdb1d_loop tdbloop; #ifdef THDEBUG thdb1d_loop_list_type::iterator dbli; #endif thdb1d_loop_leg tdbloopleg, * ptdbl; std::list from2fixv, to2fixv, closev, loopsv; std::list::iterator it; std::set::iterator lsi; #ifdef THDEBUG std::list all_loop_list; unsigned long prev_set_size; std::list::iterator lli; #endif std::set all_loop_set; long from2fixl, to2fixl, closel; thlc_cross_arrow tmpca; thlc_loop tmploop; // resetuje crossst lastcross = 0; #define setcrossst(uid) {\ currentcross = crossst[uid-1];\ if (currentcross < 0) {\ crossst[uid-1] = lastcross;\ currentcross = lastcross;\ lastcross++;\ }} for (i = 0, curcrossst = crossst; i < nstations; i++, curcrossst++) *curcrossst = -1; curleg = legs; i = 0; lastlegseries = -1; curseries = NULL; numseries = 0; clcleg = lclegs; while ((nlegs > 0) && ((*curleg)->leg->data_type == TT_DATATYPE_NOSURVEY)) { nlegs--; curleg++; } if (nlegs == 0) goto LC_COORD_CALC; while (i < nlegs) { while ((nlegs > i) && ((*curleg)->leg->data_type == TT_DATATYPE_NOSURVEY)) { nlegs--; curleg++; } if (nlegs == i) break; // nastavi clcleg cleg = (*curleg); clcleg->dbleg = cleg; clcleg->next_series_leg = NULL; if (cleg->reverse) { clcleg->from_id = cleg->leg->to.id; clcleg->to_id = cleg->leg->from.id; } else { clcleg->from_id = cleg->leg->from.id; clcleg->to_id = cleg->leg->to.id; } clcleg->from_uid = this->station_vec[clcleg->from_id - 1].uid; clcleg->to_uid = this->station_vec[clcleg->to_id - 1].uid; if (clcleg->from_uid == clcleg->to_uid) { ththrow(("shot between two equal stations -- %s@%s and %s@%s", this->station_vec[clcleg->from_id - 1].name, this->station_vec[clcleg->from_id - 1].survey->get_full_name(), this->station_vec[clcleg->to_id - 1].name, this->station_vec[clcleg->to_id - 1].survey->get_full_name())); } from_node = &(nodes[clcleg->from_uid - 1]); if ((lastlegseries != long(cleg->series_id)) || from_node->is_fixed || (from_node->narrows != 2)) { // zacina sa ina seria lcseries.push_back(tmpseries); curseries = &(lcseries[numseries]); curseries->id = numseries; if (numseries > 0) { prevseries = &(lcseries[long(numseries) - 1]);; } else { prevseries = NULL; } numseries++; clcleg->prev_series_leg = NULL; curseries->first_leg = clcleg; curseries->last_leg = clcleg; curseries->numlegs = 1; setcrossst(clcleg->from_uid); curseries->from = currentcross; if (prevseries != NULL) { setcrossst(prevlcleg->to_uid); prevseries->to = currentcross; } } else { // nezacina sa ina seria curseries->last_leg = clcleg; clcleg->prev_series_leg = prevlcleg; prevlcleg->next_series_leg = clcleg; curseries->numlegs++; } lastlegseries = long(cleg->series_id); curleg++; prevlcleg = clcleg; clcleg++; i++; } if (curseries != NULL) { setcrossst(prevlcleg->to_uid); curseries->to = currentcross; }; nseries = lcseries.size(); lccrosses = new thlc_cross [lastcross]; for (i = 0, curcrossst = crossst; i < nstations; i++, curcrossst++) { if (*curcrossst > -1) { clccross = &(lccrosses[*curcrossst]); clccross->id = *curcrossst; clccross->station_uid = i + 1; clccross->narrows = 0; clccross->first_arrow = NULL; clccross->last_arrow = NULL; clccross->is_fixed = nodes[i].is_fixed; } } // vytvori strom krizovatiek i = 0; lccrossarrows = new thlc_cross_arrow [2 * nseries]; cca = lccrossarrows; while (i < nseries) { curseries = &(lcseries[i]); curseries->from_cross = &(lccrosses[curseries->from]); curseries->to_cross = &(lccrosses[curseries->to]); cca->prev_arrow = NULL; cca->next_arrow = NULL; if (curseries->from_cross->last_arrow == NULL) { curseries->from_cross->first_arrow = cca; } else { cca->prev_arrow = curseries->from_cross->last_arrow; curseries->from_cross->last_arrow->next_arrow = cca; } curseries->from_cross->last_arrow = cca; curseries->from_cross->narrows++; cca->target = curseries->to_cross; cca->series = curseries; cca->reverse = false; cca++; cca->prev_arrow = NULL; cca->next_arrow = NULL; if (curseries->to_cross->last_arrow == NULL) { curseries->to_cross->first_arrow = cca; } else { cca->prev_arrow = curseries->to_cross->last_arrow; curseries->to_cross->last_arrow->next_arrow = cca; } curseries->to_cross->last_arrow = cca; curseries->to_cross->narrows++; cca->target = curseries->from_cross; cca->series = curseries; cca->reverse = true; cca++; i++; } #ifdef THDEBUG thprintf("\n\n\nLOOP CLOSURE DEBUG\n"); thprintf("\nCROSSES:\n"); for (i = 0; i < lastcross; i++) { thprintf("%ld: %s %ld [",i, lccrosses[i].is_fixed ? "F" : "V", lccrosses[i].narrows); cca = lccrosses[i].first_arrow; while (cca != NULL) { thprintf("%s%ld", cca->prev_arrow == NULL ? "" : " ", cca->target->id); cca = cca->next_arrow; } thprintf("] %s@%s\n", this->station_vec[lccrosses[i].station_uid - 1].name, this->station_vec[lccrosses[i].station_uid - 1].survey->name); } thprintf("\nSERIES:\n"); for (i = 0; i < nseries; i++) { thprintf("%ld: %ld - %ld [%ld legs",i,lcseries[i].from,lcseries[i].to,lcseries[i].numlegs); clcleg = lcseries[i].first_leg; if (clcleg != NULL) { thprintf(": %s@%s", this->station_vec[clcleg->from_uid - 1].name, this->station_vec[clcleg->from_uid - 1].survey->name); } while (clcleg != NULL) { thprintf(" - %s@%s", this->station_vec[clcleg->to_uid - 1].name, this->station_vec[clcleg->to_uid - 1].survey->name); clcleg = clcleg->next_series_leg; } thprintf("]\n"); } #endif // najde okruhy nloops = 0; // urobi preprocessing serii for(i = 0; i < nseries; i++) { curseries = &(lcseries[i]); curseries->is_active = true; // ak neni fixnuty a ma len jeden arrow - deaktivujeme if (((!(curseries->from_cross->is_fixed)) && (curseries->from_cross->narrows == 1)) || ((!(curseries->to_cross->is_fixed)) && (curseries->to_cross->narrows == 1))) curseries->is_active = false; // ak ma oba konce fixnute alebo totozne, spravi z nej okruh if ((curseries->from_cross->is_fixed && curseries->to_cross->is_fixed) || (curseries->from == curseries->to)) { tmpca.series = curseries; tmpca.reverse = false; tmpca.prev_arrow = NULL; tmpca.next_arrow = NULL; tmploop.first_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow = tmploop.first_arrow; tmploop.from_cross = curseries->from_cross; tmploop.to_cross = curseries->to_cross; tmploop.minid = curseries->id; tmploop.size = curseries->numlegs; tmploop.id = nloops++; #ifdef THDEBUG prev_set_size = all_loop_set.size(); #endif all_loop_set.insert(tmploop); #ifdef THDEBUG lsi = all_loop_set.find(tmploop); tmploop.old_id = lsi->id; if (prev_set_size < all_loop_set.size()) tmploop.is_new = true; else tmploop.is_new = false; all_loop_list.insert(all_loop_list.end(),tmploop); #endif curseries->is_active = false; } } // najde okruh ku kazdej serii for (i = 0; i < nseries; i++) { curseries = &(lcseries[i]); if (!curseries->is_active) continue; curseries->is_active = false; //#ifdef THDEBUG // thprintf("\nNEW SERIES: %ld -> %ld", curseries->from, curseries->to); //#endif // najde najblizsi pevny bod ku from from2fixv.clear(); if (!curseries->from_cross->is_fixed) from2fixl = chledala_chledala(lccrosses, lastcross, NULL, curseries->from_cross, from2fixv); else from2fixl = 0; // najde najblizsti pevny bod ku to to2fixv.clear(); if (!curseries->to_cross->is_fixed) to2fixl = chledala_chledala(lccrosses, lastcross, NULL, curseries->to_cross, to2fixv); else to2fixl = 0; // najde najkratsiu cestu z from do to closev.clear(); closel = chledala_chledala(lccrosses, lastcross, curseries->from_cross, curseries->to_cross, closev); // vytvori okruh if (((from2fixl >= 0) && (to2fixl >= 0)) || (closel > 0)) { // vlozime do okruhu sucasnu hranu tmpca.series = curseries; tmpca.reverse = false; tmpca.prev_arrow = NULL; tmpca.next_arrow = NULL; tmploop.first_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow = tmploop.first_arrow; tmploop.from_cross = curseries->from_cross; tmploop.to_cross = curseries->to_cross; tmploop.minid = curseries->id; tmploop.size = curseries->numlegs; tmploop.id = nloops++; #define checktmploop(ca) {\ if (tmploop.minid > ca.series->id) \ tmploop.minid = ca.series->id; \ tmploop.size += ca.series->numlegs; \ } if ((closel > 0) && (((from2fixl + to2fixl) >= closel) || (from2fixl < 0) || (to2fixl < 0))) { // vytvorime uzavrety okruh it = closev.begin(); while (it != closev.end()) { tmpca = *it; tmploop.last_arrow->next_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow->next_arrow->prev_arrow = tmploop.last_arrow; tmploop.last_arrow = tmploop.last_arrow->next_arrow; tmploop.last_arrow->next_arrow = NULL; checktmploop(tmpca); it++; } tmploop.from_cross = curseries->from_cross; tmploop.to_cross = curseries->from_cross; #ifdef THDEBUG prev_set_size = all_loop_set.size(); #endif all_loop_set.insert(tmploop); #ifdef THDEBUG lsi = all_loop_set.find(tmploop); tmploop.old_id = lsi->id; if (prev_set_size < all_loop_set.size()) tmploop.is_new = true; else tmploop.is_new = false; all_loop_list.insert(all_loop_list.end(),tmploop); #endif } else { // vytvorime otvoreny okruh it = from2fixv.begin(); while (it != from2fixv.end()) { tmpca = *it; tmpca.reverse = !tmpca.reverse; if (tmpca.reverse) tmploop.from_cross = tmpca.series->to_cross; else tmploop.from_cross = tmpca.series->from_cross; tmploop.first_arrow->prev_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.first_arrow->prev_arrow->next_arrow = tmploop.first_arrow; tmploop.first_arrow = tmploop.first_arrow->prev_arrow; tmploop.first_arrow->prev_arrow = NULL; checktmploop(tmpca); it++; } it = to2fixv.begin(); while (it != to2fixv.end()) { tmpca = *it; if (tmpca.reverse) tmploop.to_cross = tmpca.series->from_cross; else tmploop.to_cross = tmpca.series->to_cross; tmploop.last_arrow->next_arrow = &(*loopsv.insert(loopsv.end(),tmpca)); tmploop.last_arrow->next_arrow->prev_arrow = tmploop.last_arrow; tmploop.last_arrow = tmploop.last_arrow->next_arrow; tmploop.last_arrow->next_arrow = NULL; checktmploop(tmpca); it++; } #ifdef THDEBUG prev_set_size = all_loop_set.size(); #endif all_loop_set.insert(tmploop); #ifdef THDEBUG lsi = all_loop_set.find(tmploop); tmploop.old_id = lsi->id; if (prev_set_size < all_loop_set.size()) tmploop.is_new = true; else tmploop.is_new = false; all_loop_list.insert(all_loop_list.end(),tmploop); #endif } } curseries->is_active = true; } #ifdef THDEBUG // vypise okruhy na zaklade serii lli = all_loop_list.begin(); i = 0; thprintf("\nSERIES LOOPS:\n"); while (lli != all_loop_list.end()) { lsi = all_loop_set.find(*lli); thprintf("%ld[%ld] %s %s %ld: ", lli->id, lli->old_id, lli->is_new ? "NEW" : "OLD" , lli->from_cross->id != lli->to_cross->id ? "OPN" : "CLS", lli->size); cca = lli->first_arrow; if (cca->reverse) { thprintf("%d(%s@%s)", cca->series->to, this->station_vec[cca->series->to_cross->station_uid - 1].name, this->station_vec[cca->series->to_cross->station_uid - 1].survey->name); } else { thprintf("%d(%s@%s)", cca->series->from, this->station_vec[cca->series->from_cross->station_uid - 1].name, this->station_vec[cca->series->from_cross->station_uid - 1].survey->name); } while (cca != NULL) { if (cca->reverse) { thprintf("[%d(%s@%s)] - %d(%s@%s)", cca->series->to, this->station_vec[cca->series->to_cross->station_uid - 1].name, this->station_vec[cca->series->to_cross->station_uid - 1].survey->name, cca->series->from, this->station_vec[cca->series->from_cross->station_uid - 1].name, this->station_vec[cca->series->from_cross->station_uid - 1].survey->name); } else { thprintf("[%d(%s@%s)] - %d(%s@%s)", cca->series->from, this->station_vec[cca->series->from_cross->station_uid - 1].name, this->station_vec[cca->series->from_cross->station_uid - 1].survey->name, cca->series->to, this->station_vec[cca->series->to_cross->station_uid - 1].name, this->station_vec[cca->series->to_cross->station_uid - 1].survey->name); } cca = cca->next_arrow; } thprintf("\n"); lli++; i++; } #endif // zapise si okruhy do premennych databazy lsi = all_loop_set.begin(); while (lsi != all_loop_set.end()) { // vypise ci je open alebo close, nastavi tdbloop.from = &(this->station_vec[lsi->from_cross->station_uid - 1]); tdbloop.to = &(this->station_vec[lsi->to_cross->station_uid - 1]); if (tdbloop.from->uid == tdbloop.to->uid) tdbloop.open = false; else tdbloop.open = true; tdbloop.nlegs = 0; tdbloop.first_leg = NULL; tdbloop.last_leg = NULL; cca = lsi->first_arrow; while (cca != NULL) { clcleg = cca->reverse ? cca->series->last_leg : cca->series->first_leg; while (clcleg != NULL) { tdbloopleg.leg = clcleg->dbleg->leg; tdbloopleg.reverse = clcleg->dbleg->reverse; if (cca->reverse) tdbloopleg.reverse = !tdbloopleg.reverse; ptdbl = &(* this->loop_leg_list.insert(this->loop_leg_list.end(),tdbloopleg)); if (tdbloop.nlegs == 0) { tdbloop.first_leg = ptdbl; tdbloop.last_leg = ptdbl; ptdbl->next_leg = NULL; ptdbl->prev_leg = NULL; } else { tdbloop.last_leg->next_leg = ptdbl; ptdbl->prev_leg = tdbloop.last_leg; ptdbl->next_leg = NULL; tdbloop.last_leg = ptdbl; } tdbloop.nlegs++; clcleg = cca->reverse ? clcleg->prev_series_leg : clcleg->next_series_leg; } cca = cca->next_arrow; } this->loop_list.insert(this->loop_list.end(), tdbloop); lsi++; } #ifdef THDEBUG thprintf("\nSHOT LOOPS:\n"); dbli = this->loop_list.begin(); i = 0; while (dbli != this->loop_list.end()) { thprintf("%ld %s %ld: %s@%s", i, dbli->open ? "OPN" : "CLS", dbli->nlegs, dbli->from->name, dbli->from->survey->name); ptdbl = dbli->first_leg; while (ptdbl != NULL) { if (ptdbl->reverse) { thprintf(" - %s@%s", this->station_vec[this->station_vec[ptdbl->leg->from.id - 1].uid - 1].name, this->station_vec[this->station_vec[ptdbl->leg->from.id - 1].uid - 1].survey->name); } else { thprintf(" - %s@%s", this->station_vec[this->station_vec[ptdbl->leg->to.id - 1].uid - 1].name, this->station_vec[this->station_vec[ptdbl->leg->to.id - 1].uid - 1].survey->name); } ptdbl = ptdbl->next_leg; } thprintf("\n"); dbli++; i++; } #endif LC_COORD_CALC: if (crossst != NULL) delete [] crossst; if (lclegs != NULL) delete [] lclegs; if (lccrosses != NULL) delete [] lccrosses; if (lccrossarrows != NULL) delete [] lccrossarrows; #ifdef THDEBUG thprintf("\nEND OF LOOP CLOSURE DEBUG\n"); #endif #ifdef THDEBUG thprintf("\nend of loops searching\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif } void thdb1d::close_loops() { unsigned long nlegs = this->get_tree_size(), nstations = this->station_vec.size(); long i; #ifdef THDEBUG thprintf("\n\ncalculating station coordinates\n"); #else thprintf("calculating station coordinates ... "); thtext_inline = true; #endif // * priradi suradnice UID fixnym bodom thdata * dp; bool anyfixed = false; thdb_object_list_type::iterator obi = this->db->object_list.begin(); thdatafix_list::iterator fii; thdb1ds * ps; thdataobject * cx1, * cx2; thdb1ds * tmps; double avg_error = 0.0, avg_error_sum = 0.0; while (obi != this->db->object_list.end()) { if ((*obi)->get_class_id() == TT_DATA_CMD) { dp = (thdata *)(*obi); fii = dp->fix_list.begin(); while(fii != dp->fix_list.end()) { tmps = &(this->station_vec[fii->station.id - 1]); cx1 = tmps->fixcontext; cx2 = fii->srcf.context; if (((cx1 == NULL) && (cx2 == NULL)) || ((cx1 != NULL) && (cx2 != NULL) && (cx1->id == cx2->id))) { ps = &(this->station_vec[this->station_vec[fii->station.id - 1].uid - 1]); ps->placed = 1; ps->fixed = true; anyfixed = true; ps->x = fii->x; ps->y = fii->y; ps->z = fii->z; if (!thisnan(fii->sdx)) { ps->sdx = fii->sdx; ps->sdy = fii->sdy; ps->sdz = fii->sdz; } } fii++; } } obi++; } // * zrata okruhy (err_(dx|dy|dz), (err|src)_length) // * a potom vyrovna okruhy (nastavi legs) double src_dx, src_dy, src_dz, dst_dx, dst_dy, dst_dz, sum_length, dx, dy, dz, sum_sdx, sum_sdy, sum_sdz, sumlegs, err_dx, err_dy, err_dz; thdb1d_loop_list_type::iterator li; thdb1d_loop_leg * ll; unsigned mode; #ifdef THDEBUG #define nmodes 3 #else #define nmodes 2 #endif for (mode = 0; mode < nmodes; mode++) { li = this->loop_list.begin(); while (li != this->loop_list.end()) { sum_sdx = 0.0; sum_sdy = 0.0; sum_sdz = 0.0; src_dx = 0.0; src_dy = 0.0; src_dz = 0.0; if (li->open) { dst_dx = li->to->x - li->from->x; dst_dy = li->to->y - li->from->y; dst_dz = li->to->z - li->from->z; if (!li->from->adjusted) { sum_sdx += li->from->sdx * li->from->sdx; sum_sdx += li->from->sdy * li->from->sdy; sum_sdx += li->from->sdz * li->from->sdz; } if (!li->to->adjusted) { sum_sdx += li->to->sdx * li->to->sdx; sum_sdx += li->to->sdy * li->to->sdy; sum_sdx += li->to->sdz * li->to->sdz; } } else { dst_dx = 0.0; dst_dy = 0.0; dst_dz = 0.0; } // prvy prechod - spocita chyby a sumu odchylok sumlegs = 0.0; sum_length = 0.0; ll = li->first_leg; while (ll != NULL) { if (ll->reverse) { dx = - ll->leg->adj_dx; dy = - ll->leg->adj_dy; dz = - ll->leg->adj_dz; } else { dx = ll->leg->adj_dx; dy = ll->leg->adj_dy; dz = ll->leg->adj_dz; } sum_length += ll->leg->total_length; if (ll->leg->adjusted) { dst_dx -= dx; dst_dy -= dy; dst_dz -= dz; } else { src_dx += dx; src_dy += dy; src_dz += dz; if (!ll->leg->plumbed) { sum_sdx += ll->leg->total_sdx; sum_sdy += ll->leg->total_sdy; } sum_sdz += ll->leg->total_sdz; } sumlegs += 1.0; ll = ll->next_leg; } // zapise do statistiky #ifdef THDEBUG if (mode == 2) { thprintf("CORRECTION: %7.4f%% -> %7.4f%%\n", li->src_length > 0 ? 100.0 * li->err_length / li->src_length : 0.0, li->src_length > 0 ? 100.0 * sqrt(pow(dst_dx - src_dx,2.0) + pow(dst_dy - src_dy,2.0) + pow(dst_dz - src_dz,2.0)) / li->src_length : 0.0); } else #endif if (mode == 0) { li->src_length = sum_length; li->err_dx = dst_dx - src_dx; li->err_dy = dst_dy - src_dy; li->err_dz = dst_dz - src_dz; li->err_length = sqrt(li->err_dx * li->err_dx + li->err_dy * li->err_dy + li->err_dz * li->err_dz); if (sum_length > 0.0) { avg_error += 100.0 * sumlegs * (li->err_length / sum_length); avg_error_sum += sumlegs; } // vyrovna okruh } else { err_dx = dst_dx - src_dx; err_dy = dst_dy - src_dy; err_dz = dst_dz - src_dz; // ak je okruh otvoreny a std > 0, adjustne koncove body if (li->open) { if (!li->from->adjusted) { if (sum_sdx > 0.0) li->from->x -= err_dx * li->from->sdx / sum_sdx; if (sum_sdy > 0.0) li->from->y -= err_dy * li->from->sdy / sum_sdy; if (sum_sdz > 0.0) li->from->z -= err_dz * li->from->sdz / sum_sdz; li->from->adjusted = true; } if (!li->to->adjusted) { if (sum_sdx > 0.0) li->to->x += err_dx * li->to->sdx / sum_sdx; if (sum_sdy > 0.0) li->to->y += err_dy * li->to->sdy / sum_sdy; if (sum_sdz > 0.0) li->to->z += err_dz * li->to->sdz / sum_sdz; li->to->adjusted = true; } } ll = li->first_leg; while (ll != NULL) { if (!ll->leg->adjusted) { #define ORIENT (ll->reverse ? -1.0 : 1.0) if (sum_sdx > 0.0) ll->leg->adj_dx += ORIENT * err_dx * (ll->leg->plumbed ? 0.0 : ll->leg->total_sdx) / sum_sdx; else ll->leg->adj_dx += ORIENT * err_dx / sumlegs; if (sum_sdy > 0.0) ll->leg->adj_dy += ORIENT * err_dy * (ll->leg->plumbed ? 0.0 : ll->leg->total_sdy) / sum_sdy; else ll->leg->adj_dy += ORIENT * err_dy / sumlegs; if (sum_sdz > 0.0) ll->leg->adj_dz += ORIENT * err_dz * ll->leg->total_sdz / sum_sdz; else ll->leg->adj_dz += ORIENT * err_dz / sumlegs; ll->leg->adjusted = true; #ifdef THDEBUG thprintf("ADJLEG %s@%s - %s@%s: %.2f,%.2f,%.2f -> %.2f,%.2f,%.2f\n", this->station_vec[ll->leg->from.id - 1].name, this->station_vec[ll->leg->from.id - 1].survey->name, this->station_vec[ll->leg->to.id - 1].name, this->station_vec[ll->leg->to.id - 1].survey->name, ll->leg->total_dx, ll->leg->total_dy, ll->leg->total_dz, ll->leg->adj_dx, ll->leg->adj_dy, ll->leg->adj_dz); #endif } ll = ll->next_leg; } } // koniec vyrovnavanie li++; } // koniec cyklu okruhov } // koniec modoveho cyklu // * spocita suradnice UID bodom, tak ze prejde vsetky legy a // * poojde z UID na UID thdb1ds * froms, * tos; thdb1dl ** legs = this->get_tree_legs(), * cleg; long unrecover = -1; for (i = 0; (unsigned long) i < nlegs; i++) { legs[i]->leg->adjusted = false; } for (i = 0; (unsigned long) i < nlegs; i++) { cleg = legs[i]; if (cleg->reverse) { froms = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); } else { froms = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); } if (cleg->leg->data_type == TT_DATATYPE_NOSURVEY) { // ak je no-survey, nastavi mu total statistiku cleg->leg->total_dx = tos->x - froms->x; cleg->leg->total_dy = tos->y - froms->y; cleg->leg->total_dz = tos->z - froms->z; // najprv horizontalnu dlzku cleg->leg->total_length = hypot(cleg->leg->total_dx, cleg->leg->total_dy); cleg->leg->total_bearing = atan2(cleg->leg->total_dx, cleg->leg->total_dy) / THPI * 180.0; if (cleg->leg->total_bearing < 0.0) cleg->leg->total_bearing += 360.0; cleg->leg->total_gradient = atan2(cleg->leg->total_dz, cleg->leg->total_length) / THPI * 180.0; // potom celkovu dlzku cleg->leg->total_length = hypot(cleg->leg->total_length, cleg->leg->total_dz); continue; } if ((i == 0) && (!anyfixed)) { froms->placed = 1; froms->x = 0.0; froms->y = 0.0; froms->z = 0.0; } #ifdef THDEBUG thprintf("LEG: %s@%s [%ld] (from %s@%s [%ld])\n", tos->name, tos->survey->name, tos->uid, froms->name, froms->survey->name, froms->uid ); #endif if (froms->placed == 0) ththrow(("a software BUG is present (" __FILE__ ":%d)", __LINE__)); if (tos->placed == 0) { tos->placed += 1; if (cleg->reverse) { tos->x = froms->x - cleg->leg->adj_dx; tos->y = froms->y - cleg->leg->adj_dy; tos->z = froms->z - cleg->leg->adj_dz; } else { tos->x = froms->x + cleg->leg->adj_dx; tos->y = froms->y + cleg->leg->adj_dy; tos->z = froms->z + cleg->leg->adj_dz; } } else { tos->placed += 1; err_dx = (tos->x - froms->x) - (cleg->reverse ? -1.0 : 1.0) * cleg->leg->adj_dx; err_dy = (tos->y - froms->y) - (cleg->reverse ? -1.0 : 1.0) * cleg->leg->adj_dy; err_dz = (tos->z - froms->z) - (cleg->reverse ? -1.0 : 1.0) * cleg->leg->adj_dz; double err = hypot(hypot(err_dx, err_dy), err_dz); if ((err >= 1e-4) && (i > unrecover)) { #ifdef THDEBUG thprintf("ERRLEG %s@%s - %s@%s: %.2f,%.2f,%.2f\n", froms->name, froms->survey->name, tos->name, tos->survey->name, err_dx, err_dy, err_dz); #endif // mame problem - musime spravit nasledovne thdb1ds * errst, * lastst; errst = tos; lastst = tos; long start_i, end_i; start_i = 0; end_i = i; sumlegs = 0.0; sum_sdx = 0.0; sum_sdy = 0.0; sum_sdz = 0.0; // 1. najst zamery, na ktore chyby rozlozime for (i = end_i; i >= start_i; i--) { cleg = legs[i]; if (cleg->reverse) { froms = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); } else { froms = &(this->station_vec[this->station_vec[cleg->leg->from.id - 1].uid - 1]); tos = &(this->station_vec[this->station_vec[cleg->leg->to.id - 1].uid - 1]); } if ((!cleg->leg->adjusted) && (tos->uid == lastst->uid)) { sumlegs += 1.0; if (!cleg->leg->plumbed) { sum_sdx += cleg->leg->total_sdx; sum_sdy += cleg->leg->total_sdy; } sum_sdz += cleg->leg->total_sdz; cleg->leg->to_be_adjusted = true; } else { cleg->leg->to_be_adjusted = false; } if (tos->uid == lastst->uid) { lastst = froms; if ((froms->placed > 1) || (froms->fixed) || (froms->uid == errst->uid)) { start_i = i; } } if (tos->placed > 0) tos->placed--; } // 2. rozlozit chybu na zamery for (i = start_i; i <= end_i; i++) { cleg = legs[i]; if (cleg->leg->to_be_adjusted) { #define ORIENT2 (cleg->reverse ? -1.0 : 1.0) #ifdef THDEBUG thprintf("ADJLEG %s@%s - %s@%s: %.2f,%.2f,%.2f", this->station_vec[cleg->leg->from.id - 1].name, this->station_vec[cleg->leg->from.id - 1].survey->name, this->station_vec[cleg->leg->to.id - 1].name, this->station_vec[cleg->leg->to.id - 1].survey->name, cleg->leg->adj_dx, cleg->leg->adj_dy, cleg->leg->adj_dz); #endif if (sum_sdx > 0.0) cleg->leg->adj_dx += ORIENT2 * err_dx * (cleg->leg->plumbed ? 0.0 : cleg->leg->total_sdx) / sum_sdx; else cleg->leg->adj_dx += ORIENT2 * err_dx / sumlegs; if (sum_sdy > 0.0) cleg->leg->adj_dy += ORIENT2 * err_dy * (cleg->leg->plumbed ? 0.0 : cleg->leg->total_sdy) / sum_sdy; else cleg->leg->adj_dy += ORIENT2 * err_dy / sumlegs; if (sum_sdz > 0.0) cleg->leg->adj_dz += ORIENT2 * err_dz * cleg->leg->total_sdz / sum_sdz; else cleg->leg->adj_dz += ORIENT2 * err_dz / sumlegs; cleg->leg->adjusted = true; #ifdef THDEBUG thprintf(" -> %.2f,%.2f,%.2f\n", cleg->leg->adj_dx, cleg->leg->adj_dy, cleg->leg->adj_dz); #endif } } // 3. ratat este raz i = start_i - 1; if (sumlegs < 1.0) { #ifdef THDEBUG thprintf("ERRLEG UNRECOVERED!\n"); #endif unrecover = end_i; } } } } // * potom priradi suradnice nie UID bodom for(i = 0; (unsigned long)i < nstations; i++) { ps = &(this->station_vec[i]); froms = &(this->station_vec[ps->uid - 1]); if (ps->placed == 0) { ps->placed++; ps->x = froms->x; ps->y = froms->y; ps->z = froms->z; if (ps->placed == 0) { // ththrow(("a software BUG is present (" __FILE__ ":%d)", __LINE__)); ththrow(("can not connect %s@%s to centerline network", this->station_vec[i].name, this->station_vec[i].survey->get_full_name())); } } } #ifdef THDEBUG thprintf("\nend of station coordinates calculation\n\n"); #else thprintf("done\n"); thtext_inline = false; #endif if (avg_error_sum > 0.0) { thprintf("average loop error: %.2f%%\n", (avg_error / avg_error_sum)); } } struct thdb1d_lpr { thdb1d_loop * li; double err; }; int comp_lpr(const void * l1, const void * l2) { if (((thdb1d_lpr*)l1)->err > ((thdb1d_lpr*)l2)->err) return -1; else if (((thdb1d_lpr*)l1)->err < ((thdb1d_lpr*)l2)->err) return 1; else return 0; } void thdb1d::print_loops() { thdb1d_loop_list_type::iterator lii = this->loop_list.begin(); if (lii == this->loop_list.end()) return; unsigned long i, nloops; thdb1d_loop * li; nloops = this->loop_list.size(); thdb1d_lpr * lpr = new thdb1d_lpr [nloops]; i = 0; while (lii != this->loop_list.end()) { lpr[i].li = &(*lii); if (lii->src_length > 0.0) lpr[i].err = lii->err_length / lii->src_length; else lpr[i].err = 0.0; i++; lii++; } qsort(lpr,nloops,sizeof(thdb1d_lpr),comp_lpr); thdb1d_loop_leg * ll; thsurvey * ss; int totlen = 6 - strlen(thdeflocale.format_length_units()) + 1; thdb1ds * ps, * prev_ps, * first_ps; unsigned long psid, prev_psid, first_psid; thlog.printf("\n\n######################### loop errors ##########################\n"); thlog.printf( "REL-ERR ABS-ERR TOTAL-L STS X-ERROR Y-ERROR Z-ERROR STATIONS\n"); for (i = 0; i < nloops; i++) { li = lpr[i].li; thlog.printf("%6.2f%% %s%s %s%s %3ld %s%s %s%s %s%s [", li->src_length > 0.0 ? 100.0 * li->err_length / li->src_length : 0.0, thdeflocale.format_length(li->err_length,1,totlen), thdeflocale.format_length_units(), thdeflocale.format_length(li->src_length,1,totlen), thdeflocale.format_length_units(), li->nlegs, thdeflocale.format_length(li->err_dx,1,totlen), thdeflocale.format_length_units(), thdeflocale.format_length(li->err_dy,1,totlen), thdeflocale.format_length_units(), thdeflocale.format_length(li->err_dz,1,totlen), thdeflocale.format_length_units()); ll = li->first_leg; ss = NULL; if (ll->reverse) psid = ll->leg->to.id; else psid = ll->leg->from.id; ps = &(this->station_vec[psid - 1]); first_ps = ps; first_psid = psid; thlog.printf("%s", ps->name); if ((ss == NULL) || (ss->id != ps->survey->id)) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } prev_ps = ps; prev_psid = psid; while (ll != NULL) { if (ll->reverse) psid = ll->leg->to.id; else psid = ll->leg->from.id; if (prev_psid != psid) { ps = &(this->station_vec[psid - 1]); thlog.printf(" = %s", ps->name); if (ss->id != ps->survey->id) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } } if (ll->reverse) psid = ll->leg->from.id; else psid = ll->leg->to.id; ps = &(this->station_vec[psid - 1]); thlog.printf(" - %s", ps->name); if (ss->id != ps->survey->id) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } if ((ll->next_leg == NULL) && (!li->open)) { if (first_psid != psid) { psid = first_psid; ps = &(this->station_vec[psid - 1]); thlog.printf(" = %s", ps->name); if (ss->id != ps->survey->id) { ss = ps->survey; thlog.printf("@%s", ss->get_full_name()); } } } prev_ps = ps; prev_psid = psid; ll = ll->next_leg; } thlog.printf("]\n"); } thlog.printf("##################### end of loop errors #######################\n"); delete [] lpr; } thdb3ddata * thdb1d::get_3d_surface() { this->get_3d(); return &(this->d3_surface); } thdb3ddata * thdb1d::get_3d_splay() { this->get_3d(); return &(this->d3_splay); } thdb3ddata * thdb1d::get_3d_walls() { this->get_3d(); return &(this->d3_walls); } thdb3ddata * thdb1d::get_3d() { // vrati 3D data - ale len tie, ktore su oznacene if (this->d3_data_parsed) return &(this->d3_data); this->d3_data_parsed = true; unsigned long nlegs = this->get_tree_size(), nstat = this->station_vec.size(), i, last_st, cur_st; if (nstat <= 0) return &(this->d3_data); // najprv tam vlozi meracske bodiky thdb3dvx ** station_in = new thdb3dvx* [nstat]; // najprv podzemne data for (i = 0; i < nstat; i++) station_in[i] = NULL; #define get_3d_check_station(id) { \ if (station_in[id] == NULL) { \ station_in[id] = this->d3_data.insert_vertex( \ this->station_vec[id].x, \ this->station_vec[id].y, \ this->station_vec[id].z, \ (void *) &(this->station_vec[id])); \ } \ } // polygony tam vlozi ako linestripy (data poojdu na thdb1dl) last_st = nstat; thdb3dfc * fc = NULL, * secfc = NULL, * endsfc = NULL; thdb3dvx * fsecvx[10], * tsecvx[10]; thdb1dl ** tlegs = this->get_tree_legs(); double secx[10], secy[10], secXx, secXy, secXz, secYx, secYy, secYz; thdb1ds * fromst, * tost; int secn, j, prevj, nextj; for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected() && (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) == 0) && (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) == 0)) { cur_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; get_3d_check_station(cur_st); if (cur_st != last_st) { fc = this->d3_data.insert_face(THDB3DFC_LINE_STRIP); fc->insert_vertex(station_in[cur_st], (void *) *tlegs); } last_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; get_3d_check_station(last_st); fc->insert_vertex(station_in[last_st], (void *) *tlegs); // tu vygeneruje LRUD obalku if ((*tlegs)->leg->walls == TT_FALSE) goto SKIP_WALLS; #define secpt(N,X,Y) secx[N] = X; secy[N] = Y; switch ((*tlegs)->leg->shape) { case TT_DATALEG_SHAPE_DIAMOND: secpt(0,0.5,0.0); secpt(1,1.0,0.5); secpt(2,0.5,1.0); secpt(3,0.0,0.5); secn = 4; break; case TT_DATALEG_SHAPE_OCTAGON: secpt(0,0.292893218813,0.0); secpt(1,0.707106781167,0.0); secpt(2,1.0,0.292893218813); secpt(3,1.0,0.707106781167); secpt(4,0.707106781167,1.0); secpt(5,0.292893218813,1.0); secpt(6,0.0,0.707106781167); secpt(7,0.0,0.292893218813); secn = 8; break; case TT_DATALEG_SHAPE_TRIANGLE: secpt(0,0.0,0.0); secpt(1,1.0,0.0); secpt(2,0.5,1.0); secn = 3; break; case TT_DATALEG_SHAPE_TUNNEL: secpt(0,0.0,0.0); secpt(1,1.0,0.0); secpt(2,0.904508497187,0.61803398875); secpt(3,0.654508497187,1.0); secpt(4,0.345491502823,1.0); secpt(5,0.095491502823,0.61803398875); secn = 6; break; case TT_DATALEG_SHAPE_RECTANGLE: default: secpt(0,0.0,0.0); secpt(1,1.0,0.0); secpt(2,1.0,1.0); secpt(3,0.0,1.0); secn = 4; break; } // spocitame si X a Y section vectors secXx = cos((*tlegs)->leg->total_bearing / 180.0 * THPI); secXy = -sin((*tlegs)->leg->total_bearing / 180.0 * THPI); secXz = 0; if (fabs((*tlegs)->leg->total_gradient) < (*tlegs)->leg->vtresh) { secYx = 0.0; secYy = 0.0; secYz = 1.0; } else { secYx = -sin((*tlegs)->leg->total_gradient / 180.0 * THPI) * sin((*tlegs)->leg->total_bearing / 180.0 * THPI); secYy = -sin((*tlegs)->leg->total_gradient / 180.0 * THPI) * cos((*tlegs)->leg->total_bearing / 180.0 * THPI); secYz = cos((*tlegs)->leg->total_gradient / 180.0 * THPI); } secfc = this->d3_walls.insert_face(THDB3DFC_TRIANGLE_STRIP); endsfc = this->d3_walls.insert_face(THDB3DFC_TRIANGLES); // vypocitame a vlozime body aj s normalami fromst = &(this->station_vec[(*tlegs)->leg->from.id - 1]); tost = &(this->station_vec[(*tlegs)->leg->to.id - 1]); //#define SYMPASSAGES for(j = 0; j < secn; j++) { fsecvx[j] = this->d3_walls.insert_vertex( #ifdef SYMPASSAGES fromst->x - (*tlegs)->leg->from_left * secXx - (*tlegs)->leg->from_down * secYx + secx[j] * ((*tlegs)->leg->from_left + (*tlegs)->leg->from_right) * secXx + secy[j] * ((*tlegs)->leg->from_up + (*tlegs)->leg->from_down) * secYx, fromst->y - (*tlegs)->leg->from_left * secXy - (*tlegs)->leg->from_down * secYy + secx[j] * ((*tlegs)->leg->from_left + (*tlegs)->leg->from_right) * secXy + secy[j] * ((*tlegs)->leg->from_up + (*tlegs)->leg->from_down) * secYy, fromst->z - (*tlegs)->leg->from_left * secXz - (*tlegs)->leg->from_down * secYz + secx[j] * ((*tlegs)->leg->from_left + (*tlegs)->leg->from_right) * secXz + secy[j] * ((*tlegs)->leg->from_up + (*tlegs)->leg->from_down) * secYz, #else fromst->x + (secx[j] < 0.5 ? (*tlegs)->leg->from_left : (*tlegs)->leg->from_right) * (secx[j] - 0.5) / 0.5 * secXx + (secy[j] < 0.5 ? (*tlegs)->leg->from_down : (*tlegs)->leg->from_up) * (secy[j] - 0.5) / 0.5 * secYx, fromst->y + (secx[j] < 0.5 ? (*tlegs)->leg->from_left : (*tlegs)->leg->from_right) * (secx[j] - 0.5) / 0.5 * secXy + (secy[j] < 0.5 ? (*tlegs)->leg->from_down : (*tlegs)->leg->from_up) * (secy[j] - 0.5) / 0.5 * secYy, fromst->z + (secx[j] < 0.5 ? (*tlegs)->leg->from_left : (*tlegs)->leg->from_right) * (secx[j] - 0.5) / 0.5 * secXz + (secy[j] < 0.5 ? (*tlegs)->leg->from_down : (*tlegs)->leg->from_up) * (secy[j] - 0.5) / 0.5 * secYz, #endif NULL); tsecvx[j] = this->d3_walls.insert_vertex( #ifdef SYMPASSAGES tost->x - (*tlegs)->leg->to_left * secXx - (*tlegs)->leg->to_down * secYx + secx[j] * ((*tlegs)->leg->to_left + (*tlegs)->leg->to_right) * secXx + secy[j] * ((*tlegs)->leg->to_up + (*tlegs)->leg->to_down) * secYx, tost->y - (*tlegs)->leg->to_left * secXy - (*tlegs)->leg->to_down * secYy + secx[j] * ((*tlegs)->leg->to_left + (*tlegs)->leg->to_right) * secXy + secy[j] * ((*tlegs)->leg->to_up + (*tlegs)->leg->to_down) * secYy, tost->z - (*tlegs)->leg->to_left * secXz - (*tlegs)->leg->to_down * secYz + secx[j] * ((*tlegs)->leg->to_left + (*tlegs)->leg->to_right) * secXz + secy[j] * ((*tlegs)->leg->to_up + (*tlegs)->leg->to_down) * secYz, #else tost->x + (secx[j] < 0.5 ? (*tlegs)->leg->to_left : (*tlegs)->leg->to_right) * (secx[j] - 0.5) / 0.5 * secXx + (secy[j] < 0.5 ? (*tlegs)->leg->to_down : (*tlegs)->leg->to_up) * (secy[j] - 0.5) / 0.5 * secYx, tost->y + (secx[j] < 0.5 ? (*tlegs)->leg->to_left : (*tlegs)->leg->to_right) * (secx[j] - 0.5) / 0.5 * secXy + (secy[j] < 0.5 ? (*tlegs)->leg->to_down : (*tlegs)->leg->to_up) * (secy[j] - 0.5) / 0.5 * secYy, tost->z + (secx[j] < 0.5 ? (*tlegs)->leg->to_left : (*tlegs)->leg->to_right) * (secx[j] - 0.5) / 0.5 * secXz + (secy[j] < 0.5 ? (*tlegs)->leg->to_down : (*tlegs)->leg->to_up) * (secy[j] - 0.5) / 0.5 * secYz, #endif NULL); } // spocitame normaly na vrcholoch prevj = secn - 1; for(j = 0; j < secn; j++) { nextj = j + 1; if (nextj == secn) nextj = 0; // zrata normalu medzi vrcholmi prevj - j - nextj lxVec v1, v2, v3; v1 = lxVec(fsecvx[j]->x - fsecvx[prevj]->x, fsecvx[j]->y - fsecvx[prevj]->y, fsecvx[j]->z - fsecvx[prevj]->z); v2 = lxVec(fsecvx[j]->x - fsecvx[nextj]->x, fsecvx[j]->y - fsecvx[nextj]->y, fsecvx[j]->z - fsecvx[nextj]->z); v3 = lxVec(fsecvx[j]->x - tsecvx[j]->x, fsecvx[j]->y - tsecvx[j]->y, fsecvx[j]->z - tsecvx[j]->z); v1 = v1 ^ v3; v1.Normalize(); v2 = v2 ^ v3; v2.Normalize(); v3 = v1 - v2; v3.Normalize(); fsecvx[j]->insert_normal(v3.x, v3.y, v3.z); v1 = lxVec(tsecvx[j]->x - tsecvx[prevj]->x, tsecvx[j]->y - tsecvx[prevj]->y, tsecvx[j]->z - tsecvx[prevj]->z); v2 = lxVec(tsecvx[j]->x - tsecvx[nextj]->x, tsecvx[j]->y - tsecvx[nextj]->y, tsecvx[j]->z - tsecvx[nextj]->z); v3 = lxVec(tsecvx[j]->x - fsecvx[j]->x, tsecvx[j]->y - fsecvx[j]->y, tsecvx[j]->z - fsecvx[j]->z); v1 = v1 ^ v3; v1.Normalize(); v2 = v2 ^ v3; v2.Normalize(); v3 = v2 - v1; v3.Normalize(); tsecvx[j]->insert_normal(v3.x, v3.y, v3.z); if (j > 1) { endsfc->insert_vertex(fsecvx[0],NULL); endsfc->insert_vertex(fsecvx[j - 1],NULL); endsfc->insert_vertex(fsecvx[j],NULL); endsfc->insert_vertex(tsecvx[0],NULL); endsfc->insert_vertex(tsecvx[j],NULL); endsfc->insert_vertex(tsecvx[j - 1],NULL); } prevj = j; } // vlozime triangle strip for(j = 0; j < secn; j++) { secfc->insert_vertex(fsecvx[j],NULL); secfc->insert_vertex(tsecvx[j],NULL); } secfc->insert_vertex(fsecvx[0],NULL); secfc->insert_vertex(tsecvx[0],NULL); // koniec generovania LRUD obalky SKIP_WALLS:; } } // potom povrchove data for (i = 0; i < nstat; i++) station_in[i] = NULL; #undef get_3d_check_station #define get_3d_check_station(id) { \ if (station_in[id] == NULL) { \ station_in[id] = this->d3_surface.insert_vertex( \ this->station_vec[id].x, \ this->station_vec[id].y, \ this->station_vec[id].z, \ (void *) &(this->station_vec[id])); \ } \ } // polygony tam vlozi ako linestripy (data poojdu na thdb1dl) last_st = nstat; fc = NULL; tlegs = this->get_tree_legs(); for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected() && (((*tlegs)->leg->flags & TT_LEGFLAG_SURFACE) != 0) && (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) == 0)) { cur_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; get_3d_check_station(cur_st); if (cur_st != last_st) { fc = this->d3_surface.insert_face(THDB3DFC_LINE_STRIP); fc->insert_vertex(station_in[cur_st], (void *) *tlegs); } last_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; get_3d_check_station(last_st); fc->insert_vertex(station_in[last_st], (void *) *tlegs); } } // potom splay data for (i = 0; i < nstat; i++) station_in[i] = NULL; #undef get_3d_check_station #define get_3d_check_station(id) { \ if (station_in[id] == NULL) { \ station_in[id] = this->d3_splay.insert_vertex( \ this->station_vec[id].x, \ this->station_vec[id].y, \ this->station_vec[id].z, \ (void *) &(this->station_vec[id])); \ } \ } // polygony tam vlozi ako linestripy (data poojdu na thdb1dl) last_st = nstat; fc = NULL; tlegs = this->get_tree_legs(); for(i = 0; i < nlegs; i++, tlegs++) { if ((*tlegs)->survey->is_selected() && (((*tlegs)->leg->flags & TT_LEGFLAG_SPLAY) != 0)) { cur_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->to.id : (*tlegs)->leg->from.id) - 1].uid - 1; get_3d_check_station(cur_st); if (cur_st != last_st) { fc = this->d3_splay.insert_face(THDB3DFC_LINE_STRIP); fc->insert_vertex(station_in[cur_st], (void *) *tlegs); } last_st = this->station_vec[((*tlegs)->reverse ? (*tlegs)->leg->from.id : (*tlegs)->leg->to.id) - 1].uid - 1; get_3d_check_station(last_st); fc->insert_vertex(station_in[last_st], (void *) *tlegs); } } // meracske body tam vlozi ako body (data na dbdb1ds) delete [] station_in; return &(this->d3_data); } void thdb1d::postprocess_objects() { thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_SURFACE_CMD: ((thsurface*)(*obi))->check_stations(); break; } obi++; } // zrata priemerne dlzky shotov pre vsetky stations kvuoli interpolacii thdb1d_tree_arrow * arrow; thdb1d_tree_node * node, * nodes = this->get_tree_nodes(); thdb1ds * s; double numl; for(unsigned long i = 0; i < this->station_vec.size(); i++) { s = &(this->station_vec[i]); if (s->uid < (i + 1)) { s->asl = this->station_vec[s->uid - 1].asl; } else { s->asl = 0.0; numl = 0; node = &(nodes[i]); arrow = node->first_arrow; while (arrow != NULL) { if ((arrow->leg->leg->flags & TT_LEGFLAG_SURFACE) == 0) { s->asl += arrow->leg->leg->total_length; numl += 1.0; } arrow = arrow->next_arrow; } if (s->asl == 0.0) s->asl = thnan; else s->asl /= numl; } } } void thdb1d::process_xelev() { unsigned long tn_legs = this->leg_vec.size(); unsigned long tn_stations = this->station_vec.size(); #ifdef THDEBUG thprintf("\n\nprocessing extended elevation\n"); #else thprintf("processing extended elevation ... "); thtext_inline = true; #endif // PREPROCESS thdataextend_list::iterator xi; thdb1ds * st1; thdata * dp; thdb1d_tree_node * nodes = this->get_tree_nodes(), * from_node, * to_node; thdb1d_tree_arrow * carrow; thbuffer tmpbf; thdb_object_list_type::iterator obi = this->db->object_list.begin(); while (obi != this->db->object_list.end()) { switch ((*obi)->get_class_id()) { case TT_DATA_CMD: try { dp = (thdata *)(*obi); xi = dp->extend_list.begin(); while(xi != dp->extend_list.end()) { if (!xi->to.is_empty()) { // find shot to apply extend to from_node = nodes + (nodes[xi->from.id - 1].uid - 1); to_node = nodes + (nodes[xi->to.id - 1].uid - 1); carrow = from_node->first_arrow; while (carrow != NULL) { if (carrow->end_node->uid == to_node->uid) break; carrow = carrow->next_arrow; } if (carrow == NULL) { tmpbf = xi->from.name; if (xi->from.survey != NULL) { tmpbf += "@"; tmpbf += xi->from.survey; } tmpbf += " - "; tmpbf += xi->to.name; if (xi->to.survey != NULL) { tmpbf += "@"; tmpbf += xi->to.survey; } ththrow(("survey shot not found -- %s", tmpbf.get_buffer())) } else { // the leg is in carrow - set its extend if ((xi->extend & TT_EXTENDFLAG_DIRECTION) != 0) { carrow->leg->leg->extend &= ~TT_EXTENDFLAG_DIRECTION; carrow->extend &= ~TT_EXTENDFLAG_DIRECTION; } carrow->extend |= xi->extend; switch (xi->extend) { case TT_EXTENDFLAG_LEFT: if (carrow->is_reversed) carrow->leg->leg->extend |= TT_EXTENDFLAG_RIGHT; else carrow->leg->leg->extend |= TT_EXTENDFLAG_LEFT; break; case TT_EXTENDFLAG_RIGHT: if (carrow->is_reversed) carrow->leg->leg->extend |= TT_EXTENDFLAG_LEFT; else carrow->leg->leg->extend |= TT_EXTENDFLAG_RIGHT; break; case TT_EXTENDFLAG_VERTICAL: carrow->leg->leg->extend |= TT_EXTENDFLAG_VERTICAL; carrow->negative->extend |= TT_EXTENDFLAG_VERTICAL; break; default: carrow->leg->leg->extend |= xi->extend; } } } else { // add station extend attribute st1 = &(this->station_vec[xi->from.id - 1]); from_node = nodes + (nodes[xi->from.id - 1].uid - 1); if ((xi->extend & TT_EXTENDFLAG_DIRECTION) != 0) { st1->extend &= ~TT_EXTENDFLAG_DIRECTION; } st1->extend |= xi->extend; if ((xi->extend & TT_EXTENDFLAG_IGNORE) != 0) { carrow = from_node->first_arrow; while (carrow != NULL) { carrow->leg->leg->extend |= TT_EXTENDFLAG_IGNORE; carrow->extend |= TT_EXTENDFLAG_IGNORE; carrow->negative->extend |= TT_EXTENDFLAG_IGNORE; carrow = carrow->next_arrow; } } if ((xi->extend & TT_EXTENDFLAG_HIDE) != 0) { carrow = from_node->first_arrow; while (carrow != NULL) { carrow->leg->leg->extend |= TT_EXTENDFLAG_HIDE; carrow->extend |= TT_EXTENDFLAG_HIDE; carrow->negative->extend |= TT_EXTENDFLAG_HIDE; carrow = carrow->next_arrow; } } if (xi->extend == TT_EXTENDFLAG_BREAK) { carrow = from_node->first_arrow; while (carrow != NULL) { carrow->extend |= TT_EXTENDFLAG_BREAK; carrow = carrow->next_arrow; } } } xi++; } } catch (...) threthrow(("%s [%d]", xi->srcf.name, xi->srcf.line)); break; } obi++; } // PREPARE tree for new tremaux // is_attached to false unsigned long i; thdb1d_tree_node * n1, * current_node = NULL; thdb1d_tree_arrow * a1, * a2; // vsetky is discovery na false a1 = this->tree_arrows; for(i = 0; i < tn_legs; i++) { a1->is_discovery = false; a1++; a1->is_discovery = false; a1++; } // poojde v modoch normal/ignoreignore // FIND ROOT STATION AND FIRST SHOT // + traverse all stations // + find start in survey in highest level // + find top entrance // + find top station // // SHOT: // + find free start shot // + find free non ignore shot (ak nie ignoreignore) // EXTEND FROM ROOT // until everything is calculated unsigned long tarrows = 0; bool component_break = true; bool ignorant_mode = false, just_started = true; int default_left(1), go_left; // -1 - left, 1 - right, 0 - vertical int start_level, clevel; double cxx = 0.0; while (tarrows < tn_legs) { if (component_break) { for(i = 0, n1 = nodes; i < tn_stations; i++, n1++) { n1->is_attached = false; } a1 = this->tree_arrows; start_level = 0; a2 = NULL; for(i = 0; i < 2 * tn_legs; i++) { if (!a1->is_discovery) { // only ignore shots left clevel = 0; if ((a1->leg->leg->extend & TT_EXTENDFLAG_IGNORE) == 0) { // non ignore shots left clevel = 1; // dead end station if (a1->start_node->narrows == 1) clevel = 2; // entrance station left if ((this->station_vec[(a1->is_reversed ? (a1->leg->leg->to.id) : (a1->leg->leg->from.id)) - 1].flags & TT_STATIONFLAG_ENTRANCE) != 0) clevel = 3; // start station left if ((this->station_vec[a1->start_node->uid - 1].extend & TT_EXTENDFLAG_START) != 0) clevel = 4; // start shot left if ((a1->extend & TT_EXTENDFLAG_START) != 0) clevel = 5; if (a1->start_node->xx_touched) clevel = 6; } if (clevel > start_level) { start_level = clevel; a2 = a1; } else if ((clevel == start_level) && ((a2 == NULL) || (this->station_vec[a1->start_node->uid - 1].z > this->station_vec[a2->start_node->uid - 1].z))) { a2 = a1; } } a1++; } if (start_level == 0) ignorant_mode = true; // set up current_node & current_node->last_arrow if (a2 == NULL) { thwarning(("not all shots attached to extended elevation")); break; } current_node = a2->start_node; current_node->last_arrow = a2; current_node->is_attached = true; current_node->back_arrow = NULL; cxx = current_node->xx; component_break = false; if (!current_node->xx_touched) { switch (this->station_vec[current_node->uid - 1].extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_LEFT: case TT_EXTENDFLAG_REVERSE: current_node->xx_left = -1; break; case TT_EXTENDFLAG_VERTICAL: current_node->xx_left = 0; break; } } default_left = current_node->xx_left; just_started = true; #ifdef THDEBUG thprintf("START -- %d (%s@%s)\n", current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } if (just_started) { just_started = false; } else { // let's make move bool try_first; try_first = true; if (current_node->last_arrow == NULL) { try_first = false; current_node->last_arrow = current_node->first_arrow; } // find arrow that is not discovery and not ignored (if not ignorant mode) while (current_node->last_arrow != NULL) { if ((!current_node->last_arrow->is_discovery) && (ignorant_mode || (((current_node->last_arrow->extend & TT_EXTENDFLAG_IGNORE) == 0) && ((current_node->last_arrow->extend & TT_EXTENDFLAG_BREAK) == 0)))) break; current_node->last_arrow = current_node->last_arrow->next_arrow; if (try_first && (current_node->last_arrow == NULL)) { try_first = false; current_node->last_arrow = current_node->first_arrow; } } } if (current_node->last_arrow == NULL) { // go back if (current_node->back_arrow == NULL) component_break = true; else { current_node = current_node->back_arrow->end_node; cxx = current_node->xx; default_left = current_node->xx_left; #ifdef THDEBUG thprintf("%d (%s@%s) <-\n", current_node->id, this->station_vec[current_node->id - 1].name, this->station_vec[current_node->id - 1].survey->get_full_name()); #endif } } else { // go forward current_node->last_arrow->is_discovery = true; current_node->last_arrow->negative->is_discovery = true; tarrows++; // set start x if (current_node->last_arrow->is_reversed) current_node->last_arrow->leg->leg->txx = cxx; else current_node->last_arrow->leg->leg->fxx = cxx; // change cxx switch (this->station_vec[current_node->last_arrow->end_node->uid - 1].extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_REVERSE: default_left = -default_left; break; case TT_EXTENDFLAG_LEFT: default_left = -1; break; case TT_EXTENDFLAG_RIGHT: default_left = 1; break; case TT_EXTENDFLAG_VERTICAL: default_left = 0; break; } current_node->last_arrow->end_node->xx_left = default_left; go_left = default_left; if ((current_node->last_arrow->extend & (TT_EXTENDFLAG_LEFT | TT_EXTENDFLAG_RIGHT | TT_EXTENDFLAG_REVERSE | TT_EXTENDFLAG_VERTICAL)) == 0) { switch (current_node->last_arrow->leg->leg->extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_LEFT: go_left = -1; if (current_node->last_arrow->is_reversed) go_left = -go_left; break; case TT_EXTENDFLAG_RIGHT: go_left = 1; if (current_node->last_arrow->is_reversed) go_left = -go_left; break; case TT_EXTENDFLAG_REVERSE: go_left = -go_left; break; case TT_EXTENDFLAG_VERTICAL: go_left = 0; break; } } else { switch (current_node->last_arrow->extend & TT_EXTENDFLAG_DIRECTION) { case TT_EXTENDFLAG_REVERSE: go_left = -go_left; break; case TT_EXTENDFLAG_LEFT: go_left = -1; break; case TT_EXTENDFLAG_RIGHT: go_left = 1; break; case TT_EXTENDFLAG_VERTICAL: go_left = 0; break; } } cxx += double(go_left) * hypot(current_node->last_arrow->leg->leg->total_dx, current_node->last_arrow->leg->leg->total_dy); // set end x if (current_node->last_arrow->is_reversed) current_node->last_arrow->leg->leg->fxx = cxx; else current_node->last_arrow->leg->leg->txx = cxx; #ifdef THDEBUG thprintf("-> %d (%s@%s)\n", current_node->last_arrow->end_node->id, this->station_vec[current_node->last_arrow->end_node->id - 1].name, this->station_vec[current_node->last_arrow->end_node->id - 1].survey->get_full_name()); #endif if (!current_node->last_arrow->end_node->is_attached) { current_node->last_arrow->end_node->back_arrow = current_node->last_arrow->negative; current_node = current_node->last_arrow->end_node; current_node->xx = cxx; if (!current_node->extendx_ok) { current_node->extendx = cxx; current_node->extendx_ok = true; } current_node->is_attached = true; current_node->xx_touched = true; } else { cxx = current_node->xx; } } } // END OF TREMAUX #ifdef THDEBUG thprintf("\nend of extended elevation\n"); #else thprintf("done\n"); thtext_inline = false; #endif } therion/thscraplo.cxx0000664000175000017500000000230311534132162013765 0ustar useruser/** * @file thscraplo.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thscraplo.h" thscraplo::thscraplo() { this->next_line = NULL; this->next_outline = NULL; this->next_scrap_line = NULL; this->line = NULL; this->mode = TT_OUTLINE_NO; this->lfreefirst = true; this->lfreelast = true; } therion/thpdf.cxx0000664000175000017500000020423412047254054013107 0ustar useruser/** * @file thpdf.cxx */ /* Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #include // #include #include #include #include // #ifdef NOTHERION // #include // I don't know why // #endif #include "thpdfdbg.h" #include "thpdfdata.h" #include "thtexfonts.h" #include "thlang.h" #include "thversion.h" #ifdef THMSVC #define round(x) floor((x) + 0.5) #endif #ifndef NOTHERION #include "thchenc.h" #include "thbuffer.h" #endif using namespace std; #define IOerr(F) ((string)"Can't open file "+F+"!\n").c_str() /////////// // extern list SCRAPLIST; // extern map LAYERHASH; // extern set MAP_PREVIEW_UP, MAP_PREVIEW_DOWN; /////////// typedef struct { int id; int namex,namey,layer; bool dest,bookmark,title_before; map< int,set > scraps; int jumpE,jumpW,jumpN,jumpS; set jumpU,jumpD; // map< int,set > preview; // set preview; } sheetrecord; map > preview; map::iterator> SHEET_JMP; bool operator < (sheetrecord a, sheetrecord b) { return a.id < b.id; } bool operator == (sheetrecord a, sheetrecord b) { return a.id == b.id; } list SHEET; ////////// int mode; const int ATLAS = 0, MAP = 1; double MINX, MINY, MAXX, MAXY; double HS,VS; ////////// string tex_Sname(string s) {return("THS"+s);} string tex_Nname(string s) {return("THN"+s);} string tex_BMPname(string s) {return("THBMP"+s);} // bitmap void read_settings() { ifstream F("scraps.dat"); if(!F) therror(("Can't open file `scraps.dat'!")); char buf[101],ctok[100]; string tok; int context = 0; // 0=scrap, 1=layer, 2=map preview, 3=legend int i; double llx,lly,urx,ury; scraprecord SCR; layerrecord LH; list::iterator I; map::iterator J; while(F.getline(buf,100,'\n')) { // istrstream S(buf); istringstream S(buf); S >> ctok; tok = ctok; if (tok == "[SCRAP]") context = 0; else if (tok == "[LAYER]") context = 1; else if (tok == "[MAP]") context = 2; else if (tok == "[LEGEND]") context = 3; else if (tok == "N") { switch (context) { case 0: S >> ctok; SCRAPLIST.push_front(SCR); I = SCRAPLIST.begin(); I->name = ctok; break; case 1: S >> ctok; ((*J).second).N = ctok; while(S >> ctok) { ((*J).second).N = ((*J).second).N + " " + string(ctok); } break; } } else if (tok == "F") { S >> llx >> lly >> urx >> ury; I->F = " "; I->F1 = llx; I->F2 = lly; I->F3 = urx; I->F4 = ury; } else if (tok == "G") { S >> llx >> lly >> urx >> ury; I->G = " "; I->G1 = llx; I->G2 = lly; I->G3 = urx; I->G4 = ury; } else if (tok == "B") { S >> llx >> lly >> urx >> ury; I->B = " "; I->B1 = llx; I->B2 = lly; I->B3 = urx; I->B4 = ury; } else if (tok == "I") { S >> llx >> lly >> urx >> ury; I->I = " "; I->I1 = llx; I->I2 = lly; I->I3 = urx; I->I4 = ury; } else if (tok == "E") { S >> llx >> lly >> urx >> ury; I->E = " "; I->E1 = llx; I->E2 = lly; I->E3 = urx; I->E4 = ury; } else if (tok == "X") { S >> llx >> lly >> urx >> ury; I->X = " "; I->X1 = llx; I->X2 = lly; I->X3 = urx; I->X4 = ury; } else if (tok == "P") { S >> ctok; I->P = ctok; S >> llx >> lly; I->S1 = llx; I->S2 = lly; } else if (tok == "Y") { S >> i; I->layer = i; } else if (tok == "V") { S >> i; I->level = i; } else if (tok == "R") { S >> i; LAYERHASH.insert(make_pair(i,LH)); J = LAYERHASH.find(i); ((*J).second).Z = 0; } else if (tok == "U") { switch (context) { case 1: while(S >> i) { (((*J).second).U).insert(i); } break; case 2: while(S >> i) { MAP_PREVIEW_UP.insert(i); } break; } } else if (tok == "D") { switch (context) { case 1: while(S >> i) { (((*J).second).D).insert(i); } break; case 2: while(S >> i) { MAP_PREVIEW_DOWN.insert(i); } break; } } else if (tok == "T") { S >> ctok; ((*J).second).T = ctok; while(S >> ctok) { ((*J).second).T = ((*J).second).T + " " + string(ctok); } } else if (tok == "Z") { switch (context) { case 0: S >> i; I->sect = i; break; case 1: ((*J).second).Z = 1; break; } } } F.close(); SCRAPLIST.reverse(); } string xyz2str(int x, int y, int z) { char buf[50]; sprintf(buf,"%d.%d.%d",x,y,z); return (string) buf; } list::iterator find_sheet(int x, int y, int z) { // list::iterator I; // for (I = SHEET.begin(); I != SHEET.end(); I++) { // if (I->layer == x && I->namex == y && I->namey == z) break; // } // return (I); if (SHEET_JMP.count(xyz2str(x,y,z)) > 0) return SHEET_JMP.find(xyz2str(x,y,z))->second; else return SHEET.end(); } void make_sheets() { double llx = 0, lly = 0, urx = 0, ury = 0; double a,b,w,h; sheetrecord SHREC; if (mode == ATLAS) { for (map::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { I->second.minx = INT_MAX; I->second.miny = INT_MAX; I->second.maxx = INT_MIN; I->second.maxy = INT_MIN; } } for (list::iterator I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { llx = DBL_MAX; lly = DBL_MAX; urx = -DBL_MAX; ury = -DBL_MAX; if (I->F != "" && I->E == "" && I->G == "" && I->B == "" && I->X == "") { // clipped symbols shouldn't affect map size if (I->F1 < llx) llx = I->F1; if (I->F2 < lly) lly = I->F2; if (I->F3 > urx) urx = I->F3; if (I->F4 > ury) ury = I->F4; } if (I->E != "") { if (I->E1 < llx) llx = I->E1; if (I->E2 < lly) lly = I->E2; if (I->E3 > urx) urx = I->E3; if (I->E4 > ury) ury = I->E4; } if (I->G != "") { if (I->G1 < llx) llx = I->G1; if (I->G2 < lly) lly = I->G2; if (I->G3 > urx) urx = I->G3; if (I->G4 > ury) ury = I->G4; } if (I->B != "") { if (I->B1 < llx) llx = I->B1; if (I->B2 < lly) lly = I->B2; if (I->B3 > urx) urx = I->B3; if (I->B4 > ury) ury = I->B4; } if (I->I != "") { if (I->I1 < llx) llx = I->I1; if (I->I2 < lly) lly = I->I2; if (I->I3 > urx) urx = I->I3; if (I->I4 > ury) ury = I->I4; } if (I->X != "") { if (I->X1 < llx) llx = I->X1; if (I->X2 < lly) lly = I->X2; if (I->X3 > urx) urx = I->X3; if (I->X4 > ury) ury = I->X4; } for (list::iterator I_sk = I->SKETCHLIST.begin(); I_sk != I->SKETCHLIST.end(); I_sk++) { for (int i = 0; i<=1; i++) { for (int j = 0; j<=1; j++) { w = i * I_sk->width; h = j * I_sk->height; a = I_sk->xx*w + I_sk->xy*h + I_sk->dx; b = I_sk->yx*w + I_sk->yy*h + I_sk->dy; if (a < llx) llx = a; if (b < lly) lly = b; if (a > urx) urx = a; if (b > ury) ury = b; } } }; if (llx == DBL_MAX || lly == DBL_MAX || urx == -DBL_MAX || ury == -DBL_MAX) therror(("This can't happen -- no data for a scrap!")); map::iterator J = LAYERHASH.find(I->layer); if (J == LAYERHASH.end()) therror (("This can't happen!")); if (mode == ATLAS) { int Llx = (int) floor((llx-LAYOUT.overlap-LAYOUT.hoffset) / LAYOUT.hsize); int Lly = (int) floor((lly-LAYOUT.overlap-LAYOUT.voffset) / LAYOUT.vsize); int Urx = (int) floor((urx+LAYOUT.overlap-LAYOUT.hoffset) / LAYOUT.hsize); int Ury = (int) floor((ury+LAYOUT.overlap-LAYOUT.voffset) / LAYOUT.vsize); for (int i = Llx; i <= Urx; i++) { for (int j = Lly; j <= Ury; j++) { if (J->second.Z == 0) { // Z layers don't create new sheets list::iterator sheet_it = find_sheet(I->layer,i,j); if (sheet_it == SHEET.end()) { sheet_it = SHEET.insert(SHEET.end(),SHREC); SHEET_JMP.insert(make_pair(xyz2str(I->layer,i,j),sheet_it)); } sheet_it->layer = I->layer; sheet_it->namex = i; sheet_it->namey = j; map >::iterator K = sheet_it->scraps.find(I->level); if (K == sheet_it->scraps.end()) { set SCRP; sheet_it->scraps.insert(make_pair(I->level,SCRP)); K = sheet_it->scraps.find(I->level); } ((*K).second).insert(I->name); if (J->second.minx > Llx) J->second.minx = Llx; if (J->second.miny > Lly) J->second.miny = Lly; if (J->second.maxx < Urx) J->second.maxx = Urx; if (J->second.maxy < Ury) J->second.maxy = Ury; } // we add scrap to preview set tmpset; string tmpstr; tmpstr = xyz2str(I->layer,i,j); map >::iterator pr_it = preview.find(tmpstr); if (pr_it == preview.end()) { preview.insert(make_pair(tmpstr,tmpset)); pr_it = preview.find(tmpstr); } pr_it->second.insert(I->name); } } } else { map >::iterator K = (((*J).second).scraps).find(I->level); if (K == (((*J).second).scraps).end()) { set SCRP; (((*J).second).scraps).insert(make_pair(I->level,SCRP)); K = (((*J).second).scraps).find(I->level); } ((*K).second).insert(I->name); (((*J).second).allscraps).insert(I->name); if (((*J).second).Z == 0) { if (MINX > llx) MINX = llx; if (MINY > lly) MINY = lly; if (MAXX < urx) MAXX = urx; if (MAXY < ury) MAXY = ury; } } } // cout << "MINMAX " << MINX << " " << MINY << " " << MAXX << " " << MAXY << endl; } void find_jumps() { for (list::iterator sheet_it = SHEET.begin(); sheet_it != SHEET.end(); sheet_it++) { sheet_it->jumpW = 0; sheet_it->jumpE = 0; sheet_it->jumpN = 0; sheet_it->jumpS = 0; list::iterator I; int jump; string W = xyz2str(sheet_it->layer,sheet_it->namex-1,sheet_it->namey); string E = xyz2str(sheet_it->layer,sheet_it->namex+1,sheet_it->namey); string N = xyz2str(sheet_it->layer,sheet_it->namex,sheet_it->namey+1); string S = xyz2str(sheet_it->layer,sheet_it->namex,sheet_it->namey-1); if (SHEET_JMP.count(W) > 0) { I = SHEET_JMP.find(W)->second; sheet_it->jumpW = I->id; I->dest = true; } if (SHEET_JMP.count(E) > 0) { I = SHEET_JMP.find(E)->second; sheet_it->jumpE = I->id; I->dest = true; } if (SHEET_JMP.count(N) > 0) { I = SHEET_JMP.find(N)->second; sheet_it->jumpN = I->id; I->dest = true; } if (SHEET_JMP.count(S) > 0) { I = SHEET_JMP.find(S)->second; sheet_it->jumpS = I->id; I->dest = true; } map::iterator lay_it = LAYERHASH.find(sheet_it->layer); if (lay_it == LAYERHASH.end()) therror (("This can't happen!")); if (!lay_it->second.U.empty()) { for (set::iterator l_it = lay_it->second.U.begin(); l_it != lay_it->second.U.end(); l_it++) { map::iterator alt_lay_it = LAYERHASH.find(*l_it); if (alt_lay_it == LAYERHASH.end()) therror(("This can't happen!")); jump = (alt_lay_it->second.Z == 0) ? *l_it : alt_lay_it->second.AltJump; string U = xyz2str(jump,sheet_it->namex,sheet_it->namey); if (SHEET_JMP.count(U) > 0) { I = SHEET_JMP.find(U)->second; sheet_it->jumpU.insert(jump); I->dest = true; } } } if (!lay_it->second.D.empty()) { for (set::iterator l_it = lay_it->second.D.begin(); l_it != lay_it->second.D.end(); l_it++) { map::iterator alt_lay_it = LAYERHASH.find(*l_it); if (alt_lay_it == LAYERHASH.end()) therror(("This can't happen!")); jump = (alt_lay_it->second.Z == 0) ? *l_it : alt_lay_it->second.AltJump; string D = xyz2str(jump,sheet_it->namex,sheet_it->namey); if (SHEET_JMP.count(D) > 0) { I = SHEET_JMP.find(D)->second; sheet_it->jumpD.insert(jump); I->dest = true; } } } } } string grid_name(string s, int offset) { unsigned char c; bool is_num = true; for (unsigned i=0; i= 65 && c <= 90 && (c+offset) >= 65 && (c+offset) <= 90) || (c >= 97 && c <=122 && (c+offset) >= 97 && (c+offset) <=122)) { char buf[10]; sprintf(buf,"%c",c+offset); return (string) buf; } else return "?"; } else return "?"; } set find_excluded_pages(string s) { set excl; int i,j; char c; // istrstream S(s.c_str()); istringstream S(s); c = ','; while (S >> i) { S >> c; if (c == ',') excl.insert(i); else if (c == '-') { S >> j; for (int k=i; k<=j; k++) excl.insert(k); S >> c; // punctuation character } else therror(("Invalid character in the exclusion list!")); } //cout << endl; //cout << "Excl.list: " << s << endl; //cout << "Excl. set: "; //for (set::iterator I = excl.begin(); I != excl.end(); I++) // cout << *I << " "; //cout << endl; return excl; } void sort_sheets() { int pageid = 1 + LAYOUT.own_pages, tmppagenum = 1; set excluded; bool wait_for_title; if (LAYOUT.excl_pages) excluded = find_excluded_pages(LAYOUT.excl_list); for (map::reverse_iterator I = LAYERHASH.rbegin(); I != LAYERHASH.rend(); I++) { // I->second.minid = pageid; I->second.bookmark = false; wait_for_title = (I->second.T !="" && LAYOUT.title_pages) ? true : false; for (int j = I->second.maxy; j >= I->second.miny; j--) { for (int i = I->second.minx; i <= I->second.maxx; i++) { list::iterator sheet_it = find_sheet(I->first,i,j); if (sheet_it != SHEET.end()) { // if (wait_for_title && excluded.count(tmppagenum) > 0) { // wait_for_title = false; // } if (excluded.count(tmppagenum) == 0) { sheet_it->dest = false; sheet_it->title_before = false; sheet_it->bookmark = false; if (!I->second.bookmark) { sheet_it->bookmark = true; sheet_it->dest = true; I->second.bookmark = true; } if (wait_for_title) { sheet_it->title_before = true; pageid++; wait_for_title = false; } sheet_it->id = pageid; pageid++; } else { SHEET.erase(sheet_it); SHEET_JMP.erase(xyz2str(sheet_it->layer, sheet_it->namex,sheet_it->namey)); //cout << "Should erase sheet " << tmppagenum << endl; } tmppagenum++; } } } // I->second.maxid = pageid - 1; } SHEET.sort(); //cout << "sheets: " << SHEET.size() << endl; } void print_preview(int up,ofstream& PAGEDEF,double HSHIFT,double VSHIFT, list::iterator sheet_it = list::iterator()) { set used_layers; set used_scraps; double xc = 0, yc = 0; if (LAYOUT.OCG) { if (mode == MAP) PAGEDEF << "\\setbox\\xxx=\\hbox to \\adjustedHS{%" << endl; else PAGEDEF << "\\setbox\\xxx=\\hbox to " << HS << "bp{%" << endl; } // PAGEDEF << (up ? "\\PL{q .1 w}%" : "\\PL{q .8 g}%") << endl; if (up) { PAGEDEF << "\\PL{q .1 w " << LAYOUT.preview_above_r << " " << LAYOUT.preview_above_g << " " << LAYOUT.preview_above_b << " " << " RG}%" << endl; } else { PAGEDEF << "\\PL{q " << LAYOUT.preview_below_r << " " << LAYOUT.preview_below_g << " " << LAYOUT.preview_below_b << " " << " rg}%" << endl; } if (mode == ATLAS) { map::iterator lay_it = LAYERHASH.find(sheet_it->layer); if (lay_it == LAYERHASH.end()) therror(("This can't happen!")); used_layers = (up ? lay_it->second.U : lay_it->second.D); } else { used_layers = (up ? MAP_PREVIEW_UP : MAP_PREVIEW_DOWN); } for (set::iterator I=used_layers.begin(); I != used_layers.end(); I++) { if (mode == ATLAS) { map >::iterator pr_it = preview.find(xyz2str(*I,sheet_it->namex,sheet_it->namey)); if (pr_it != preview.end()) used_scraps = pr_it->second; } else { map::iterator J = LAYERHASH.find(*I); if (J == LAYERHASH.end()) therror(("This can't happen!")); used_scraps = J->second.allscraps; } if (!used_scraps.empty()) { for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0) { if (up) { if (K->B != "" && K->sect == 0) { xc = K->B1; yc = K->B2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << (mode == MAP && LAYOUT.OCG ? "\\PBcorr{" : "\\PB{") << xc << "}{" << yc << "}{\\" << tex_Xname("B"+(K->name)) << "}%" << endl; } } else { if (K->I != "" && K->sect == 0) { xc = K->I1; yc = K->I2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << (mode == MAP && LAYOUT.OCG ? "\\PBcorr{" : "\\PB{") << xc << "}{" << yc << "}{\\" << tex_Xname("I"+(K->name)) << "}%" << endl; } } } } } } PAGEDEF << "\\PL{Q}%" << endl; if (LAYOUT.OCG) { if (mode==MAP) PAGEDEF << "\\hfill}\\ht\\xxx=\\adjustedVS\\dp\\xxx=0bp" << endl; else PAGEDEF << "\\hfill}\\ht\\xxx=" << VS << "bp\\dp\\xxx=0bp" << endl; PAGEDEF << "\\immediate\\pdfxform "; PAGEDEF << "attr{/OC \\the\\" << (up ? "ocU" : "ocD") << "\\space 0 R} "; if (mode == MAP) PAGEDEF << "\\xxx\\PB{-\\adjustedX}{-\\adjustedY}{\\pdflastxform}%" << endl; else PAGEDEF << "\\xxx\\PB{0}{0}{\\pdflastxform}%" << endl; } } void compose_page(list::iterator sheet_it, ofstream& PAGE) { map::iterator lay_it = LAYERHASH.find(sheet_it->layer); if (lay_it == LAYERHASH.end()) therror (("This can't happen!")); if (sheet_it->title_before) { PAGE << "\\TITLE{" << utf2tex(lay_it->second.T) << "}\n"; } PAGE << "%\n% Page: " << u2str(sheet_it->id) << endl << "%\n"; if (sheet_it->dest) PAGE << "\\pdfdest name {" << u2str(sheet_it->id) << "} xyz" << endl; if (sheet_it->bookmark) { PAGE << "\\pdfoutline goto name {" << u2str(sheet_it->id) << "} count 0 {\\ne\\376\\ne\\377" << utf2texoctal(lay_it->second.N) << "}%" << endl; } PAGE.precision(6); PAGE << "\\setbox\\mapbox=\\hbox to " << HS << "bp{%" << endl; PAGE.precision(2); PAGE << "\\rlap{\\pdfrefxform\\" << tex_Sname(u2str(sheet_it->id)) << "}%" << endl; // map hyperlinks int lw = 25; double lhy = VS - 2*lw; double lhx = HS - 2*lw; if (sheet_it->jumpW) PAGE << "\\flatlink{0}{" << lw << "}{" << lw << "}{" << lhy << "}{" << u2str(sheet_it->jumpW) << "}%\n"; if (sheet_it->jumpE) PAGE << "\\flatlink{" << HS-lw << "}{" << lw << "}{" << lw << "}{" << lhy << "}{" << u2str(sheet_it->jumpE) << "}%\n"; if (sheet_it->jumpN) PAGE << "\\flatlink{" << lw << "}{" << VS-lw << "}{" << lhx << "}{" << lw << "}{" << u2str(sheet_it->jumpN)<< "}%\n"; if (sheet_it->jumpS) PAGE << "\\flatlink{" << lw << "}{0}{" << lhx << "}{" << lw << "}{" << u2str(sheet_it->jumpS) << "}%\n"; PAGE.precision(6); PAGE << "\\hfil}\\ht\\mapbox=" << VS << "bp%" << endl; PAGE.precision(2); PAGE << "\\pagelabel={" << grid_name(LAYOUT.labely,-sheet_it->namey) << " " << grid_name(LAYOUT.labelx,sheet_it->namex) << "}%" << endl; if (LAYOUT.page_numbering) PAGE << "\\pagenum=" << sheet_it->id << "%" << endl; // up and down links if (!sheet_it->jumpU.empty()) { PAGE << "\\pointerU={%\n"; for (set::reverse_iterator l_it = sheet_it->jumpU.rbegin(); l_it != sheet_it->jumpU.rend(); l_it++) { list::iterator s_it = find_sheet(*l_it,sheet_it->namex,sheet_it->namey); if (s_it == SHEET.end()) therror (("This can't happen!")); PAGE << utf2tex(LAYERHASH.find(*l_it)->second.N) << "|" << s_it->id << "|" << u2str(s_it->id) << "||%" << endl; } PAGE << "}%\n"; } else PAGE << "\\pointerU={notdef}%" << endl; if (!sheet_it->jumpD.empty()) { PAGE << "\\pointerD={%\n"; for (set::reverse_iterator l_it = sheet_it->jumpD.rbegin(); l_it != sheet_it->jumpD.rend(); l_it++) { list::iterator s_it = find_sheet(*l_it,sheet_it->namex,sheet_it->namey); if (s_it == SHEET.end()) therror (("This can't happen!")); PAGE << utf2tex(LAYERHASH.find(*l_it)->second.N) << "|" << s_it->id << "|" << u2str(s_it->id) << "||%" << endl; } PAGE << "}%\n"; } else PAGE << "\\pointerD={notdef}%" << endl; PAGE << "\\pagename={" << utf2tex(lay_it->second.N) << "}%" << endl; // pointers to neighbouring pages if (LAYOUT.page_numbering) { if (sheet_it->jumpW) PAGE << "\\pointerW=" << sheet_it->jumpW << "%\n"; else PAGE << "\\pointerW=0%\n"; if (sheet_it->jumpE) PAGE << "\\pointerE=" << sheet_it->jumpE << "%\n"; else PAGE << "\\pointerE=0%\n"; if (sheet_it->jumpN) PAGE << "\\pointerN=" << sheet_it->jumpN << "%\n"; else PAGE << "\\pointerN=0%\n"; if (sheet_it->jumpS) PAGE << "\\pointerS=" << sheet_it->jumpS << "%\n"; else PAGE << "\\pointerS=0%\n"; } PAGE << "\\setbox\\navbox=\\hbox{%" << endl; // navigator hyperlinks int nav_x = 2*LAYOUT.nav_right+1; int nav_y = 2*LAYOUT.nav_up+1; double HSN = LAYOUT.hsize / LAYOUT.nav_factor * nav_x; double VSN = LAYOUT.vsize / LAYOUT.nav_factor * nav_y; for (int i=-LAYOUT.nav_right; i <= LAYOUT.nav_right; i++) { for (int j=-LAYOUT.nav_up; j <= LAYOUT.nav_up; j++) { if (i!=0 || j!=0) { string tmp = xyz2str(sheet_it->layer, sheet_it->namex+i,sheet_it->namey+j); if (SHEET_JMP.count(tmp) > 0) { PAGE << "\\flatlink{" << HSN*(i+LAYOUT.nav_right)/nav_x << "}{" << VSN*(j+LAYOUT.nav_up)/nav_y << "}{" << HSN/nav_x << "}{" << VSN/nav_y << "}{" << u2str(SHEET_JMP.find(tmp)->second->id) << "}%\n"; } } } } PAGE << "\\pdfrefxform\\" << tex_Nname(u2str(sheet_it->id)) << "}%" << endl; PAGE << "\\dopage\\eject" << endl; } void print_page_bg(ofstream& PAGEDEF) { /* if ((LAYOUT.background_r != 1) || (LAYOUT.background_g != 1) || (LAYOUT.background_b != 1)) { */ if (! LAYOUT.transparent_map_bg) { // bg rectangle PAGEDEF << "\\PL{q " << LAYOUT.background_r << " " << LAYOUT.background_g << " " << LAYOUT.background_b << " rg 0 0 " << HS << " " << VS << " re f Q}%" << endl; } } void print_page_bg_scraps(int layer, ofstream& PAGEDEF, list::iterator sheet_it = list::iterator()) { // if transparency is used, all scraps should be filled white // on the coloured background, just before preview_down is displayed // and transparency is turned on /* if (LAYOUT.transparency && ((LAYOUT.background_r != 1) || (LAYOUT.background_g != 1) || (LAYOUT.background_b != 1))) { */ // even if bg is white, pdf might // be included in other pdf with // non-white bg; we should avoid // overoptimization if (LAYOUT.transparency ) { double HSHIFT=0, VSHIFT=0, xc = 0, yc = 0; map < int,set > LEVEL; set used_scraps; if (mode == ATLAS) { HSHIFT = LAYOUT.hsize * sheet_it->namex + LAYOUT.hoffset - LAYOUT.overlap; VSHIFT = LAYOUT.vsize * sheet_it->namey + LAYOUT.voffset - LAYOUT.overlap; LEVEL = sheet_it->scraps; } else { HSHIFT = MINX; VSHIFT = MINY; LEVEL = ((*(LAYERHASH.find(layer))).second).scraps; } PAGEDEF << "\\PL{q 1 g}%" << endl; // white background of the scrap for (map < int,set >::iterator I = LEVEL.begin(); I != LEVEL.end(); I++) { used_scraps = (*I).second; // scrap backgrounds for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->I != "") { xc = K->I1; yc = K->I2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("I"+(K->name)) << "}%" << endl; } } } PAGEDEF << "\\PL{Q}%" << endl; // end of white color for filled bg } } void print_surface_bitmaps (ofstream &PAGEDEF, double shiftx, double shifty) { if (LAYOUT.transparency || LAYOUT.OCG) { if (mode == MAP) PAGEDEF << "\\setbox\\xxx=\\hbox to\\adjustedHS{%" << endl; else PAGEDEF << "\\setbox\\xxx=\\hbox to" << HS << "bp{%" << endl; PAGEDEF << "\\PL{/GS2 gs}%" << endl; } int i = 1; PAGEDEF.precision(6); for (list::iterator I = SURFPICTLIST.begin(); I != SURFPICTLIST.end(); I++) { if (mode == MAP && (LAYOUT.transparency || LAYOUT.OCG)) { PAGEDEF << "\\bitmapcorr{"; } else { PAGEDEF << "\\bitmap{"; } PAGEDEF << I->xx << "}{" << I->yx << "}{" << I->xy << "}{" << I->yy << "}{" << I->dx - shiftx << "}{" << I->dy - shifty << "}{\\" << tex_BMPname(u2str(i)) << "}%" << endl; i++; }; PAGEDEF.precision(2); if (LAYOUT.transparency || LAYOUT.OCG) { if (mode == MAP) PAGEDEF << "\\hfill}\\ht\\xxx=\\adjustedVS\\dp\\xxx=0bp" << endl; else PAGEDEF << "\\hfill}\\ht\\xxx="<< VS << "bp\\dp\\xxx=0bp" << endl; PAGEDEF << "\\immediate\\pdfxform "; PAGEDEF << "attr{"; if (LAYOUT.transparency) PAGEDEF << "/Group \\the\\attrid\\space 0 R "; if (LAYOUT.OCG) PAGEDEF << "/OC \\the\\ocSUR\\space 0 R "; PAGEDEF << "} "; PAGEDEF << "resources{/ExtGState \\the\\resid\\space 0 R}"; if (mode == MAP) PAGEDEF << "\\xxx\\PB{-\\adjustedX}{-\\adjustedY}{\\pdflastxform}%" << endl; else PAGEDEF << "\\xxx\\PB{0}{0}{\\pdflastxform}%" << endl; } } paired rotatedaround(paired x,paired o, double th) { double theta = -th * 3.14159265358979 / 180; paired z, tmp; tmp.x = x.x - o.x; tmp.y = x.y - o.y; z.x = tmp.x * cos(theta) - tmp.y * sin(theta) + o.x; z.y = tmp.x * sin(theta) + tmp.y * cos(theta) + o.y; return z; } void print_grid_pdf(ofstream& PAGEDEF, double LLX, double LLY, double origMINX,double origMINY,double origMAXX, double origMAXY) { if (LAYOUT.grid == 0) return; PAGEDEF << "\\PL{q}"; paired ll, ur, lr, ul, llrot, urrot, ulrot, lrrot, llnew, urnew, origin; /* ll.x = LLX; ll.y = LLY; ur.x = LLX + HS; ur.y = LLY + VS; */ ll.x = origMINX; ll.y = origMINY; ur.x = origMAXX; ur.y = origMAXY; lr.x = ur.x; lr.y = ll.y; ul.x = ll.x; ul.y = ur.y; origin.x = LAYOUT.hgridorigin; origin.y = LAYOUT.vgridorigin; llrot = rotatedaround(ll,origin,-LAYOUT.gridrot); urrot = rotatedaround(ur,origin,-LAYOUT.gridrot); lrrot = rotatedaround(lr,origin,-LAYOUT.gridrot); ulrot = rotatedaround(ul,origin,-LAYOUT.gridrot); llnew.x = min(min(llrot.x, urrot.x), min(lrrot.x, ulrot.x)); llnew.y = min(min(llrot.y, urrot.y), min(lrrot.y, ulrot.y)); urnew.x = max(max(llrot.x, urrot.x), max(lrrot.x, ulrot.x)); urnew.y = max(max(llrot.y, urrot.y), max(lrrot.y, ulrot.y)); /* na odladenie PAGEDEF << "\\PL{ " << llrot.x-LLX << " " << llrot.y-LLY << " m " << lrrot.x-LLX << " " << lrrot.y-LLY << " l S}"; PAGEDEF << "\\PL{ " << ulrot.x-LLX << " " << ulrot.y-LLY << " m " << urrot.x-LLX << " " << urrot.y-LLY << " l S}"; PAGEDEF << "\\PL{2 w " << ll.x-LLX << " " << ll.y-LLY << " m " << lr.x-LLX << " " << lr.y-LLY << " l S}"; PAGEDEF << "\\PL{ " << ul.x-LLX << " " << ul.y-LLY << " m " << ur.x-LLX << " " << ur.y-LLY << " l S}"; PAGEDEF << "\\PL{10 w 1 J " << llnew.x-LLX << " " << llnew.y-LLY << " m " << llnew.x-LLX << " " << llnew.y-LLY << " l S}"; PAGEDEF << "\\PL{ " << urnew.x-LLX << " " << urnew.y-LLY << " m " << urnew.x-LLX << " " << urnew.y-LLY << " l S}"; PAGEDEF << "\\PL{20 w 1 J " << origin.x-LLX << " " << origin.y-LLY << " m " << origin.x-LLX << " " << origin.y-LLY << " l S}"; PAGEDEF << "\\PL{15 w 1 J " << rotatedaround(llnew,origin,LAYOUT.gridrot).x-LLX << " " << rotatedaround(llnew,origin,LAYOUT.gridrot).y-LLY << " m " << rotatedaround(llnew,origin,LAYOUT.gridrot).x-LLX << " " << rotatedaround(llnew,origin,LAYOUT.gridrot).y-LLY << " l S}"; PAGEDEF << "\\PL{ " << rotatedaround(urnew,origin,LAYOUT.gridrot).x-LLX << " " << rotatedaround(urnew,origin,LAYOUT.gridrot).y-LLY << " m " << rotatedaround(urnew,origin,LAYOUT.gridrot).x-LLX << " " << rotatedaround(urnew,origin,LAYOUT.gridrot).y-LLY << " l S}"; */ //cout << "***" << LAYOUT.hgridsize << endl; double grid_init_x = LAYOUT.hgridsize * floor ((llnew.x-origin.x)/LAYOUT.hgridsize) + origin.x; double grid_init_y = LAYOUT.vgridsize * floor ((llnew.y-origin.y)/LAYOUT.vgridsize) + origin.y; double G_real_init_x = LAYOUT.XO + LAYOUT.XS * floor ((llnew.x-origin.x)/LAYOUT.hgridsize); double G_real_init_y = LAYOUT.YO + LAYOUT.YS * floor ((llnew.y-origin.y)/LAYOUT.vgridsize); double cosr = cos(-LAYOUT.gridrot * 3.14159265 / 180); double sinr = sin(-LAYOUT.gridrot * 3.14159265 / 180); int row, col, elem; if (LAYOUT.proj == 0) { paired out,tmp; int ii,jj; double i, j; for (i = grid_init_x, ii=0; i < urnew.x + LAYOUT.hgridsize - 0.05; i += LAYOUT.hgridsize, ii++) { for (j = grid_init_y, jj=0; j < urnew.y + LAYOUT.vgridsize - 0.05; j += LAYOUT.vgridsize, jj++) { col = (i == grid_init_x ? 0 : (i >= urnew.x ? 2 : 1)); row = (j == grid_init_y ? 0 : (j >= urnew.y ? 2 : 1)); elem = col + 3*row; /* tmp.x = i; tmp.y = j; out = rotatedaround(tmp,origin,LAYOUT.gridrot); out.x -= LLX; out.y -= LLY; PAGEDEF << "\\PL{q 5 w 1 J 0 0 1 RG " << out.x << " " << out.y << " m " << out.x << " " << out.y << " l S Q}"; */ tmp.x = i+LAYOUT.gridcell[elem].x; tmp.y = j+LAYOUT.gridcell[elem].y; out = rotatedaround(tmp,origin,LAYOUT.gridrot); out.x -= LLX; out.y -= LLY; PAGEDEF << "\\PL{q}"; PAGEDEF << "\\PL{" << cosr << " " << sinr << " " << -sinr << " " << cosr << " " << out.x << " " << out.y << " cm}"; PAGEDEF << "\\PB{0}{0}{\\" << tex_Wname("grid") << u2str(elem+1) << "}"; PAGEDEF << "\\PL{Q}%" << endl; if (LAYOUT.grid_coord_freq==2 || (LAYOUT.grid_coord_freq==1 && elem!=4)) { tmp.x = i; tmp.y = j; out = rotatedaround(tmp,origin,LAYOUT.gridrot); out.x -= LLX; out.y -= LLY; PAGEDEF << "\\PL{q}"; PAGEDEF << "\\PL{" << cosr << " " << sinr << " " << -sinr << " " << cosr << " " << out.x << " " << out.y << " cm}"; PAGEDEF << "\\gridcoord{" << (row == 2 ? (col == 2 ? 1 : 3) : (col == 2 ? 7 : 9)) << "}{$(" << setprecision(0) << G_real_init_x+ii*LAYOUT.XS << "," << G_real_init_y+jj*LAYOUT.YS << setprecision(2) << ")$}%" << endl; PAGEDEF << "\\PL{Q}"; } } } } else { grid_init_x = LLX; int jj; double j; for (j = grid_init_y,jj=0; j < urnew.y + LAYOUT.vgridsize - 0.05; j += LAYOUT.vgridsize,jj++) { // PAGEDEF << "\\PL{q 3 w 0 0 1 RG 0 " << j-LLY << " m " << HS << " " << j-LLY << " l S Q}"; for (double i = grid_init_x; i < urnew.x + LAYOUT.hgridsize - 0.05; i += LAYOUT.hgridsize) { col = (i == grid_init_x ? 0 : (i >= urnew.x ? 2 : 1)); row = (j == grid_init_y ? 0 : (j >= urnew.y ? 2 : 1)); elem = col + 3*row; PAGEDEF << "\\PB{" << i-LLX+LAYOUT.gridcell[elem].x << "}{" << j-LLY+LAYOUT.gridcell[elem].y << "}{\\" << tex_Wname("grid") << u2str(elem+1) << "}%" << endl; if (col == 0 && LAYOUT.grid_coord_freq > 0) { PAGEDEF << "\\PL{q}"; PAGEDEF << "\\PL{1 0 0 1 " << i-LLX << " " << j-LLY << " cm}"; PAGEDEF << "\\gridcoord{" << (row==2?3:9) << "}{$" << setprecision(0) << G_real_init_y+jj*LAYOUT.YS << setprecision(2)<< "$}"; PAGEDEF << "\\PL{Q}%" << endl; } if (col == 2 && LAYOUT.grid_coord_freq == 2) { PAGEDEF << "\\PL{q}"; PAGEDEF << "\\PL{1 0 0 1 " << i-LLX << " " << j-LLY << " cm}"; PAGEDEF << "\\gridcoord{" << (row==2?1:7) << "}{$" << setprecision(0) << G_real_init_y+jj*LAYOUT.YS << setprecision(2)<< "$}"; PAGEDEF << "\\PL{Q}%" << endl; } } } } PAGEDEF << "\\PL{Q}%" << endl; } void print_map(int layer, ofstream& PAGEDEF, list::iterator sheet_it = list::iterator()){ double HSHIFT=0, VSHIFT=0, xc = 0, yc = 0; map < int,set > LEVEL; set page_text_scraps,used_scraps; string buffer; deque thstack; if (mode == ATLAS) { HSHIFT = LAYOUT.hsize * sheet_it->namex + LAYOUT.hoffset - LAYOUT.overlap; VSHIFT = LAYOUT.vsize * sheet_it->namey + LAYOUT.voffset - LAYOUT.overlap; LEVEL = sheet_it->scraps; } else { HSHIFT = MINX; VSHIFT = MINY; LEVEL = ((*(LAYERHASH.find(layer))).second).scraps; } for (map < int,set >::iterator I = LEVEL.begin(); I != LEVEL.end(); I++) { used_scraps = (*I).second; for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->P != "") page_text_scraps.insert(K->name); } } if (mode == ATLAS) { print_page_bg(PAGEDEF); if (LAYOUT.surface == 1) print_surface_bitmaps(PAGEDEF,HSHIFT,VSHIFT); print_page_bg_scraps(layer, PAGEDEF, sheet_it); if (LAYOUT.grid == 1) print_grid_pdf(PAGEDEF,HSHIFT,VSHIFT,HSHIFT,VSHIFT,HSHIFT+HS,VSHIFT+VS); } if (mode == ATLAS && !LAYERHASH.find(layer)->second.D.empty()) { print_preview(0,PAGEDEF,HSHIFT,VSHIFT,sheet_it); } for (map < int,set >::iterator I = LEVEL.begin(); I != LEVEL.end(); I++) { used_scraps = (*I).second; if (LAYOUT.transparency) { // transparency group beginning PAGEDEF << "\\setbox\\xxx=\\hbox to " << HS << "bp{%" << endl; PAGEDEF << "\\PL{/GS1 gs}%" << endl; // beginning of transparency } // PAGEDEF << "\\PL{q 1 g}%" << endl; // white background of the scrap for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->I != "") { PAGEDEF << "\\PL{q "; if (K->r < 0 || K->g < 0 || K->b < 0) { PAGEDEF << LAYOUT.foreground_r << " " << // background of the scrap LAYOUT.foreground_g << " " << LAYOUT.foreground_b << " rg}%" << endl; } else { PAGEDEF << K->r << " " << // background of the scrap K->g << " " << K->b << " rg}%" << endl; } xc = K->I1; yc = K->I2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("I"+(K->name)) << "}%" << endl; PAGEDEF << "\\PL{Q}%" << endl; // end of white color for filled bg } } // sketches PAGEDEF.precision(6); for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0) { for (list::iterator I_sk = K->SKETCHLIST.begin(); I_sk != K->SKETCHLIST.end(); I_sk++) { PAGEDEF << "\\pdfximage{" << (string) I_sk->filename << "}%" << endl; PAGEDEF << "\\bitmap{" << I_sk->xx << "}{" << I_sk->yx << "}{" << I_sk->xy << "}{" << I_sk->yy << "}{" << I_sk->dx - HSHIFT << "}{" << I_sk->dy - VSHIFT << "}{\\pdflastximage}%" << endl; }; }; } PAGEDEF.precision(2); // end of sketches for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->G != "") { xc = K->G1; yc = K->G2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("G"+(K->name)) << "}%" << endl; }; } if (LAYOUT.transparency) { PAGEDEF << "\\PL{/GS0 gs}%" << endl; // end of default transparency } PAGEDEF << "\\PL{q 0 0 m " << HS << " 0 l " << HS << " " << VS << " l 0 " << VS << " l 0 0 l}"; // beginning of the text clipping path definition for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (page_text_scraps.count(K->name) > 0 && K->P != "" && K->level >= (I->first)) { xc = HSHIFT - K->S1; yc = VSHIFT - K->S2; ifstream G((K->P).c_str()); if(!G) therror((IOerr(K->P))); while(G >> buffer) { if ((buffer == "m") || (buffer == "l") || (buffer == "c")) { PAGEDEF << "\\PL{"; for(unsigned i=0; i::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->F != "") { xc = K->F1; yc = K->F2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname(K->name) << "}%" << endl; }; } for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->E != "") { xc = K->E1; yc = K->E2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("E"+(K->name)) << "}%" << endl; }; } PAGEDEF << "\\PL{Q}"; // end of clipping by text for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && K->X != "") { xc = K->X1; yc = K->X2; xc -= HSHIFT; yc -= VSHIFT; PAGEDEF << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("X"+(K->name)) << "}%" << endl; }; } if (LAYOUT.transparency) { PAGEDEF << "\\hfill}\\ht\\xxx=" << VS << "bp\\dp\\xxx=0bp" << endl; PAGEDEF << "\\immediate\\pdfxform "; PAGEDEF << "attr{/Group \\the\\attrid\\space 0 R} "; PAGEDEF << "resources{/ExtGState \\the\\resid\\space 0 R}"; PAGEDEF << "\\xxx\\PB{0}{0}{\\pdflastxform}%" << endl; } } if (mode == ATLAS && !LAYERHASH.find(layer)->second.U.empty()) { print_preview(1,PAGEDEF,HSHIFT,VSHIFT,sheet_it); } if (mode == ATLAS) { if (LAYOUT.surface == 2) print_surface_bitmaps(PAGEDEF,HSHIFT,VSHIFT); if (LAYOUT.grid == 2) print_grid_pdf(PAGEDEF,HSHIFT,VSHIFT,HSHIFT,VSHIFT,HSHIFT+HS,VSHIFT+VS); } } void print_navigator(ofstream& P, list::iterator sheet_it) { set NAV_SCRAPS; set used_layers; set used_scraps; int nav_x = 2*LAYOUT.nav_right+1; int nav_y = 2*LAYOUT.nav_up+1; double HSN = LAYOUT.hsize / LAYOUT.nav_factor * nav_x; double VSN = LAYOUT.vsize / LAYOUT.nav_factor * nav_y; double xc = 0, yc = 0; P << "%\n\\setbox\\xxx=\\hbox to " << HSN << "bp{%\n\\PL{q "; P.precision(6); P << 1/LAYOUT.nav_factor << " 0 0 " << 1/LAYOUT.nav_factor << " 0 0 cm}%\n"; P.precision(2); map::iterator lay_it = LAYERHASH.find(sheet_it->layer); if (lay_it == LAYERHASH.end()) therror (("This can't happen!")); NAV_SCRAPS.clear(); if (!lay_it->second.D.empty()) { P << "\\PL{.8 g}%\n"; used_layers = lay_it->second.D; for (set::iterator I=used_layers.begin(); I != used_layers.end(); I++) { for (int i = sheet_it->namex-LAYOUT.nav_right; i <= sheet_it->namex+LAYOUT.nav_right; i++) { for (int j = sheet_it->namey-LAYOUT.nav_up; j <= sheet_it->namey+LAYOUT.nav_up; j++) { used_scraps.clear(); map >::iterator pr_it = preview.find(xyz2str(*I,i,j)); if (pr_it != preview.end()) used_scraps = pr_it->second; if (!used_scraps.empty()) { for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && NAV_SCRAPS.count(K->name) == 0 && K->I != "" && K->sect == 0) { xc = K->I1; yc = K->I2; xc -= LAYOUT.hsize * (sheet_it->namex - LAYOUT.nav_right) + LAYOUT.hoffset; yc -= LAYOUT.vsize * (sheet_it->namey - LAYOUT.nav_up) + LAYOUT.voffset; P << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("I"+(K->name)) << "}%" << endl; NAV_SCRAPS.insert(K->name); } } } } } } } NAV_SCRAPS.clear(); P << "\\PL{0 g}%\n"; for (int i = sheet_it->namex-LAYOUT.nav_right; i <= sheet_it->namex+LAYOUT.nav_right; i++) { for (int j = sheet_it->namey-LAYOUT.nav_up; j <= sheet_it->namey+LAYOUT.nav_up; j++) { used_scraps.clear(); map >::iterator pr_it = preview.find(xyz2str(sheet_it->layer,i,j)); if (pr_it != preview.end()) used_scraps = pr_it->second; if (!used_scraps.empty()) { for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && NAV_SCRAPS.count(K->name) == 0 && K->I != "" && K->sect == 0) { xc = K->I1; yc = K->I2; xc -= LAYOUT.hsize * (sheet_it->namex - LAYOUT.nav_right) + LAYOUT.hoffset; yc -= LAYOUT.vsize * (sheet_it->namey - LAYOUT.nav_up) + LAYOUT.voffset; P << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("I"+(K->name)) << "}%" << endl; NAV_SCRAPS.insert(K->name); } } } } } NAV_SCRAPS.clear(); if (!lay_it->second.U.empty()) { P << "\\PL{0.2 w}%\n"; used_layers = lay_it->second.U; for (set::iterator I=used_layers.begin(); I != used_layers.end(); I++) { for (int i = sheet_it->namex-LAYOUT.nav_right; i <= sheet_it->namex+LAYOUT.nav_right; i++) { for (int j = sheet_it->namey-LAYOUT.nav_up; j <= sheet_it->namey+LAYOUT.nav_up; j++) { used_scraps.clear(); map >::iterator pr_it = preview.find(xyz2str(*I,i,j)); if (pr_it != preview.end()) used_scraps = pr_it->second; if (!used_scraps.empty()) { for (list::iterator K = SCRAPLIST.begin(); K != SCRAPLIST.end(); K++) { if (used_scraps.count(K->name) > 0 && NAV_SCRAPS.count(K->name) == 0 && K->B != "" && K->sect == 0) { xc = K->B1; yc = K->B2; xc -= LAYOUT.hsize * (sheet_it->namex - LAYOUT.nav_right) + LAYOUT.hoffset; yc -= LAYOUT.vsize * (sheet_it->namey - LAYOUT.nav_up) + LAYOUT.voffset; P << "\\PB{" << xc << "}{" << yc << "}{\\" << tex_Xname("B"+(K->name)) << "}%" << endl; NAV_SCRAPS.insert(K->name); } } } } } } } // navigator grid P << "\\PL{Q}" << "\\PL{0 0 " << HSN << " " << VSN << " re S 0.1 w}"; for (int i = 1; i < nav_x; i++) P << "\\PL{" << HSN*i/nav_x << " 0 m " << HSN*i/nav_x << " " << VSN << " l S}%\n"; for (int i = 1; i < nav_y; i++) P << "\\PL{0 " << VSN*i/nav_y << " m " << HSN << " " << VSN*i/nav_y << " l S}%\n"; P << "\\PL{0.4 w " << HSN*LAYOUT.nav_right/nav_x << " " << VSN*LAYOUT.nav_up/nav_y << " " << HSN/nav_x << " " << VSN/nav_y << " " << " re S}"; // XObject definition P << "\\hfill}\\ht\\xxx=" << VSN << "bp\\dp\\xxx=0bp\n"; P << "\\immediate\\pdfxform\\xxx\\newcount\\" << tex_Nname(u2str(sheet_it->id)) << " \\" << tex_Nname(u2str(sheet_it->id)) << "=\\pdflastxform" << endl; } void print_margins(ofstream& PAGEDEF) { PAGEDEF << "\\PL{q}"; // PAGEDEF << "\\PL{3 w 0 0 " << HS << " " << VS << " re S}"; if (LAYOUT.overlap > 0) { double i = LAYOUT.hsize + LAYOUT.overlap; double j = LAYOUT.vsize + LAYOUT.overlap; PAGEDEF << "\\PL{0.5 w}"; PAGEDEF << "\\PL{0 " << LAYOUT.overlap << " m " << HS << " " << LAYOUT.overlap << " l S}"; PAGEDEF << "\\PL{0 " << j << " m " << HS << " " << j << " l S}"; PAGEDEF << "\\PL{" << LAYOUT.overlap << " 0 m " << LAYOUT.overlap << " " << VS << " l S}"; PAGEDEF << "\\PL{" << i << " 0 m " << i << " " << VS << " l S}"; } PAGEDEF << "\\PL{Q}%" << endl; } void build_pages() { ofstream PAGEDEF("th_pagedef.tex"); if(!PAGEDEF) therror(("Can't write file th_pagedef.tex")); PAGEDEF.setf(ios::fixed, ios::floatfield); PAGEDEF.precision(2); ofstream PAGE("th_pages.tex"); if(!PAGE) therror(("Can't write file th_pages.tex")); PAGE.setf(ios::fixed, ios::floatfield); PAGE.precision(2); ofstream PDFRES("th_resources.tex"); if(!PDFRES) therror(("Can't write file th_resources.tex")); if (LAYOUT.transparency || LAYOUT.OCG) { PDFRES << "\\ifnum\\pdftexversion<110\\pdfcatalog{ /Version /" << (LAYOUT.OCG ? "1.5" : "1.4") << " }" << (LAYOUT.OCG ? "\\else\\pdfoptionpdfminorversion=5" : "") << "\\fi" << endl; } PDFRES << "\\pdfinfo{/Creator (Therion " << THVERSION << ", MetaPost, TeX)}%" << endl; PDFRES << "\\pdfcatalog{ /ViewerPreferences << /DisplayDocTitle true /PrintScaling /None >> }" << endl; if(ENC_NEW.NFSS != 0) PDFRES << "\\input thfonts.map" << endl; PDFRES << "\\ifnum\\pdftexversion>139" << endl; PDFRES << " \\newread\\testin" << endl; PDFRES << " \\openin\\testin=glyphtounicode.tex" << endl; PDFRES << " \\ifeof\\testin\\message{No glyph to unicode mapping found!}\\else\\closein\\testin\\input glyphtounicode.tex\\pdfgentounicode=1\\fi" << endl; PDFRES << "\\fi" << endl; if (LAYOUT.transparency) { PDFRES << "\\opacity{" << LAYOUT.opacity << "}%" << endl; PDFRES << "\\surfaceopacity{" << LAYOUT.surface_opacity << "}%" << endl; PDFRES << "\\immediate\\pdfobj{ << /GS0 " << "<< /Type /ExtGState /ca 1 /BM /Normal >> " << " /GS1 << /Type /ExtGState /ca \\the\\opacity\\space /BM /Normal >> " << " /GS2 << /Type /ExtGState /ca \\the\\surfaceopacity\\space /BM /Normal >> >> }" << endl; PDFRES << "\\newcount\\resid\\resid=\\pdflastobj" << endl; PDFRES << "\\immediate\\pdfobj{ << /S /Transparency /K true >> }" << endl; PDFRES << "\\newcount\\attrid\\attrid=\\pdflastobj" << endl; } else { PDFRES << "\\immediate\\pdfobj{ << /GS0 " << "<< /Type /ExtGState >> " << " /GS1 << /Type /ExtGState >> " << " /GS2 << /Type /ExtGState >> >> }" << endl; PDFRES << "\\newcount\\resid\\resid=\\pdflastobj" << endl; } if (LAYOUT.OCG) { PDFRES << "\\immediate\\pdfobj{ << /Type /OCG /Name >> }" << endl; PDFRES << "\\newcount\\ocU\\ocU=\\pdflastobj" << endl; PDFRES << "\\immediate\\pdfobj{ << /Type /OCG /Name >> }" << endl; PDFRES << "\\newcount\\ocD\\ocD=\\pdflastobj" << endl; PDFRES << "\\immediate\\pdfobj{ << /Type /OCG /Name >> }" << endl; PDFRES << "\\newcount\\ocSUR\\ocSUR=\\pdflastobj" << endl; if (mode == MAP) { for (map::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { if (I->second.Z == 0) { PDFRES << "\\immediate\\pdfobj{ << /Type /OCG /Name second.N) << "> >> }" << endl; PDFRES << "\\newcount\\oc" << u2str(I->first) << "\\oc" << u2str(I->first) << "=\\pdflastobj" << endl; } } } PDFRES << "\\pdfcatalog{ /OCProperties <<" << endl << " /OCGs ["; if (LAYOUT.surface == 2) PDFRES << "\\the\\ocSUR\\space0 R "; PDFRES << "\\the\\ocU\\space0 R "; if (mode == MAP) { for (map::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { if (I->second.Z == 0) PDFRES << "\\the\\oc" << u2str(I->first) << "\\space 0 R "; } } PDFRES << "\\the\\ocD\\space0 R "; if (LAYOUT.surface == 1) PDFRES << "\\the\\ocSUR\\space0 R "; PDFRES << "]" << endl << " /D << /Name (Map layers) /ListMode /VisiblePages" << " /Order ["; if (LAYOUT.surface == 2) PDFRES << "\\the\\ocSUR\\space0 R "; PDFRES << "\\the\\ocU\\space0 R "; if (mode == MAP) { for (map::reverse_iterator I = LAYERHASH.rbegin(); I != LAYERHASH.rend(); I++) { if (I->second.Z == 0) PDFRES << "\\the\\oc" << u2str(I->first) << "\\space 0 R "; } } PDFRES << "\\the\\ocD\\space0 R "; if (LAYOUT.surface == 1) PDFRES << "\\the\\ocSUR\\space0 R "; PDFRES << "] >>" << endl << ">> }" << endl; } if (LAYOUT.doc_author != "") PDFRES << "\\pdfinfo{ /Author }" << endl; if (LAYOUT.doc_subject != "") PDFRES << "\\pdfinfo{ /Subject }" << endl; if (LAYOUT.doc_keywords != "") PDFRES << "\\pdfinfo{ /Keywords }" << endl; if (LAYOUT.doc_title != "") { PDFRES << "\\pdfinfo{ /Title }" << endl; // PDFRES << "\\legendcavename={" << utf2tex(LAYOUT.doc_title) << "}" << endl; } // if (LAYOUT.doc_comment != "") { // PDFRES << "\\legendcomment={" << utf2tex(LAYOUT.doc_comment) << "}" << endl; // } if (!LEGENDLIST.empty()) { // zmenit test na LAYOUT.legend??? PDFRES << "\\legendtrue" << endl; } else { PDFRES << "\\legendfalse" << endl; } if (!COLORLEGENDLIST.empty()) { PDFRES << "\\colorlegendtrue" << endl; } else { PDFRES << "\\colorlegendfalse" << endl; } PDFRES << "\\legendwidth=" << LAYOUT.legend_width << "bp" << endl; if (LAYOUT.map_header_bg) { PDFRES << "\\bgcolor={" << LAYOUT.background_r << " " << LAYOUT.background_g << " " << LAYOUT.background_b << "}" << endl; PDFRES << "\\legendbgfilltrue" << endl; } else PDFRES << "\\legendbgfillfalse" << endl; PDFRES.close(); // jednorazove vlozenie povrchovych obrazkov int i = 1; for (list::iterator I = SURFPICTLIST.begin(); I != SURFPICTLIST.end(); I++) { PAGEDEF << "\\pdfximage{" << (string) I->filename << "}%" << endl; PAGEDEF << "\\newcount\\" << tex_BMPname(u2str(i)) << "\\" << tex_BMPname(u2str(i)) << "=\\pdflastximage%" << endl; i++; } double origMINX=0, origMINY=0, origMAXX=0, origMAXY=0; if (mode == ATLAS) { HS = LAYOUT.hsize + 2*LAYOUT.overlap; VS = LAYOUT.vsize + 2*LAYOUT.overlap; if (LAYOUT.page_numbering) { PAGE << "\\pagenumberingtrue" << endl; } } else { if (LAYOUT.proj > 0 && LAYOUT.grid > 0) { // natiahnutie vysky aby sa zobrazil grid pod aj nad jaskynou MINY = LAYOUT.vgridsize * floor ((MINY-LAYOUT.vgridorigin)/LAYOUT.vgridsize) + LAYOUT.vgridorigin; MAXY = LAYOUT.vgridsize * ceil ((MAXY-LAYOUT.vgridorigin)/LAYOUT.vgridsize) + LAYOUT.vgridorigin; } origMINX = MINX; origMINY = MINY; origMAXX = MAXX; origMAXY = MAXY; if (LAYOUT.map_grid) { // origMINX = MINX; origMINY = MINY; origMAXX = MAXX; origMAXY = MAXY; MINX = LAYOUT.hsize * floor (MINX/LAYOUT.hsize); MINY = LAYOUT.vsize * floor (MINY/LAYOUT.vsize); MAXX = LAYOUT.hsize * ceil (MAXX/LAYOUT.hsize); MAXY = LAYOUT.vsize * ceil (MAXY/LAYOUT.vsize); } HS = MAXX - MINX; VS = MAXY - MINY; if (HS>14000 || VS>14000) therror(("Map is too large for PDF format. Try smaller scale!")); PAGEDEF << "\\eject" << endl; PAGEDEF << "\\hsize=" << HS << "bp" << endl; PAGEDEF << "\\vsize=" << VS << "bp" << endl; PAGEDEF << "\\pdfpagewidth=\\hsize\\advance\\pdfpagewidth by " << 2*LAYOUT.overlap << "bp" << endl; PAGEDEF << "\\pdfpageheight=\\vsize\\advance\\pdfpageheight by " << 2*LAYOUT.overlap << "bp" << endl; PAGEDEF << "\\hoffset=0cm" << endl; PAGEDEF << "\\voffset=0cm" << endl; PAGEDEF << "\\pdfhorigin=" << LAYOUT.overlap << "bp" << endl; PAGEDEF << "\\pdfvorigin=" << LAYOUT.overlap << "bp" << endl; } if (mode == ATLAS) { PAGEDEF << "\\newdimen\\overlap\\overlap=" << LAYOUT.overlap << "bp" << endl; for (list::iterator I = SHEET.begin(); I != SHEET.end(); I++) { // cout << "ID: " << I->id << " Layer: " << I->layer << " X: " << // I->namex << " Y: " << I->namey << endl; // cout << "*" << flush; PAGEDEF << "\\setbox\\xxx=\\hbox to "<< HS << "bp{%" << endl; print_map(I->layer, PAGEDEF, I); print_margins(PAGEDEF); PAGEDEF << "\\hfill}\\ht\\xxx=" << VS << "bp\\dp\\xxx=0bp" << endl; PAGEDEF << "\\immediate\\pdfxform"; PAGEDEF << "\\xxx\\newcount\\" << tex_Sname(u2str(I->id)) << " \\" << tex_Sname(u2str(I->id)) << "=\\pdflastxform" << endl; print_navigator(PAGEDEF,I); compose_page(I, PAGE); } } else { PAGEDEF << "\\newdimen\\x \\x=" << HS << "bp" << endl; PAGEDEF << "\\newdimen\\y \\y=" << VS << "bp" << endl; PAGEDEF << "\\setbox\\xxx=\\hbox to \\x{\\maplayout\\hfill}%\\dp\\xxx=0bp" << endl; PAGEDEF << "\\advance\\x by \\extraE" << endl; PAGEDEF << "\\advance\\x by \\extraW" << endl; PAGEDEF << "\\advance\\y by \\extraN" << endl; PAGEDEF << "\\advance\\y by \\extraS" << endl; PAGEDEF << "\\newbox\\xxxx\\setbox\\xxxx=\\hbox to \\x{\\kern\\extraW\\raise\\extraS\\box\\xxx\\hss}%\\dp\\xxx=0bp" << endl; PAGEDEF << "\\wd\\xxxx=\\x" << endl; PAGEDEF << "\\ht\\xxxx=\\y" << endl; PAGEDEF << "\\immediate\\pdfxform\\xxxx" << endl; PAGEDEF << "\\newcount\\THmaplegend\\THmaplegend=\\pdflastxform" << endl; PAGEDEF << "\\advance\\pdfhorigin by \\extraW" << endl; PAGEDEF << "\\advance\\pdfvorigin by \\extraN" << endl; PAGEDEF << "\\advance\\pdfpagewidth by \\extraW" << endl; PAGEDEF << "\\advance\\pdfpagewidth by \\extraE" << endl; PAGEDEF << "\\advance\\pdfpageheight by \\extraN" << endl; PAGEDEF << "\\advance\\pdfpageheight by \\extraS" << endl; PAGEDEF << "\\newdimen\\overlap\\overlap=" << LAYOUT.overlap << "bp" << endl; PAGEDEF << "\\dimtobp{\\the\\pdfpagewidth}\\edef\\xsize{\\tmpdef}%" << endl; PAGEDEF << "\\dimtobp{\\the\\pdfpageheight}\\edef\\ysize{\\tmpdef}%" << endl; PAGEDEF << "\\advance\\y by -\\extraN\\advance\\y by \\overlap" << endl; PAGEDEF << "\\dimtobp{\\the\\y}\\edef\\nsize{\\tmpdef}%" << endl; PAGEDEF << "\\x=\\extraW\\advance\\x by \\overlap" << endl; PAGEDEF << "\\dimtobp{\\the\\x}\\edef\\wsize{\\tmpdef}%" << endl; PAGEDEF << "\\newdimen\\overlaphalf\\overlaphalf=\\overlap\\divide\\overlaphalf by 2%" << endl; PAGEDEF << "\\newdimen\\framew\\framew=\\pdfpagewidth\\advance\\framew by -\\overlap" << endl; PAGEDEF << "\\newdimen\\frameh\\frameh=\\pdfpageheight\\advance\\frameh by -\\overlap" << endl; PAGEDEF << "\\newdimen\\framex\\framex=\\extraW\\advance\\framex by \\overlaphalf" << endl; PAGEDEF << "\\newdimen\\framey\\framey=\\extraN\\advance\\framey by \\overlaphalf" << endl; PAGEDEF << "\\dimtobp{\\framew}\\edef\\Framew{\\tmpdef}%" << endl; PAGEDEF << "\\dimtobp{\\frameh}\\edef\\Frameh{\\tmpdef}%" << endl; PAGEDEF << "\\dimtobp{\\framex}\\edef\\Framex{\\tmpdef}%" << endl; PAGEDEF << "\\dimtobp{\\framey}\\edef\\Framey{\\tmpdef}%" << endl; PAGEDEF << "\\adjustedHS=" << HS << "bp" << "\\advance\\adjustedHS by \\extraE" << "\\advance\\adjustedHS by \\extraW" << "\\advance\\adjustedHS by \\overlap" << "\\advance\\adjustedHS by \\overlap" << endl; PAGEDEF << "\\adjustedVS=" << VS << "bp" << "\\advance\\adjustedVS by \\extraN" << "\\advance\\adjustedVS by \\extraS" << "\\advance\\adjustedVS by \\overlap" << "\\advance\\adjustedVS by \\overlap" << endl; //calibration PAGEDEF.precision(10); for (int i=0; i<9; i++) { PAGEDEF << "\\calibrX{" << LAYOUT.calibration_local[i].x - MINX << "bp}\\tmpdimenX=\\tmpdimen" << endl; PAGEDEF << "\\calibrY{" << LAYOUT.calibration_local[i].y - MINY << "bp}\\tmpdimenY=\\tmpdimen" << endl; PAGEDEF << "\\pdfcatalog { /thCalibrate" << i << " (X=\\the\\tmpdimenX, Y=\\the\\tmpdimenY, L=" << LAYOUT.calibration_latlong[i].x << ", F=" << LAYOUT.calibration_latlong[i].y << ")}" << endl; } PAGEDEF << "\\pdfcatalog { /thCalibrate (HS=\\the\\adjustedHS, VS=\\the\\adjustedVS, HD=" << LAYOUT.calibration_hdist << ")}"; PAGEDEF.precision(2); PAGEDEF << "\\tmpdimen=\\extraW\\advance\\tmpdimen by \\overlap" << endl; PAGEDEF << "\\dimtobp{\\tmpdimen}\\edef\\adjustedX{\\tmpdef}%" << endl; PAGEDEF << "\\tmpdimen=\\extraS\\advance\\tmpdimen by \\overlap" << endl; PAGEDEF << "\\dimtobp{\\tmpdimen}\\edef\\adjustedY{\\tmpdef}%" << endl; /* if ((LAYOUT.background_r != 1) || (LAYOUT.background_g != 1) || (LAYOUT.background_b != 1)) { */ if (! LAYOUT.transparent_map_bg) { PAGEDEF << "\\PL{q " << LAYOUT.background_r << " " << LAYOUT.background_g << " " << LAYOUT.background_b << " rg -" << "\\wsize\\space" << "-" << "\\nsize\\space" << "\\xsize\\space" << "\\ysize\\space" << " re f Q}%" << endl; } PAGEDEF << "\\ifdim\\framethickness>0mm\\dimtobp{\\framethickness}\\edef\\Framethickness{\\tmpdef}" << "\\PL{q 0 0 0 RG 1 J 1 j \\Framethickness\\space w " << "-\\Framex\\space\\Framey\\space\\Framew\\space-\\Frameh\\space" << " re s Q}\\fi" << endl; // PAGEDEF << "\\leavevmode\\setbox\\xxx=\\hbox to " << HS << "bp{%" << endl; PAGEDEF << "\\leavevmode\\setbox\\xxx=\\hbox to 0bp{%" << endl; if (LAYOUT.surface == 1) print_surface_bitmaps(PAGEDEF,MINX,MINY); // print_page_bg(PAGEDEF); for (map::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { if (I->second.Z == 0) { if (LAYOUT.OCG && LAYOUT.transparency) { PAGEDEF << "\\PL{/OC /oc\\the\\oc" << u2str(I->first) << "\\space BDC}%" << endl; } print_page_bg_scraps(I->first,PAGEDEF); if (LAYOUT.OCG && LAYOUT.transparency) { PAGEDEF << "\\PL{EMC}%" << endl; } } } if (LAYOUT.grid == 1) print_grid_pdf(PAGEDEF,MINX,MINY,origMINX,origMINY,origMAXX,origMAXY); if (!MAP_PREVIEW_DOWN.empty()) print_preview(0,PAGEDEF,MINX,MINY); for (map::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { if (I->second.Z == 0) { PAGEDEF << "\\setbox\\xxx=\\hbox to " << HS << "bp{%" << endl; // we need flush layer data using XObject // (the text clipping path may become too large) print_map((*I).first,PAGEDEF); PAGEDEF << "\\hfill}\\ht\\xxx=" << VS << "bp\\dp\\xxx=0bp" << endl; PAGEDEF << "\\immediate\\pdfxform "; if (LAYOUT.OCG) { PAGEDEF << "attr{/OC \\the\\oc" << u2str(I->first) << "\\space 0 R} "; } PAGEDEF << "\\xxx\\PB{0}{0}{\\pdflastxform}%" << endl; } } if (!MAP_PREVIEW_UP.empty()) print_preview(1,PAGEDEF,MINX,MINY); if (LAYOUT.surface == 2) print_surface_bitmaps(PAGEDEF,MINX,MINY); if (LAYOUT.grid == 2) print_grid_pdf(PAGEDEF,MINX,MINY,origMINX,origMINY,origMAXX,origMAXY); if (LAYOUT.map_grid) { PAGEDEF << "\\PL{q .4 w 0.6 g 0.6 G }%" << endl; PAGEDEF << "\\PL{0 0 " << HS << " " << VS << " re S}%" << endl; for (double i=0; i <= HS; i += LAYOUT.hsize) { PAGEDEF << "\\PL{" << i << " 0 m " << i << " " << VS << " l S}%" << endl; if (i::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { if (I->second.Z == 0) PAGEDEF << "/oc\\the\\oc" << u2str(I->first) << "\\space\\the\\oc" << u2str(I->first) << "\\space0 R "; } PAGEDEF << " >> }\\pdfpageresources\\expandafter{\\thpdfpageres}" << endl; } } PAGEDEF.close(); PAGE.close(); } int thpdf(int m) { mode = m; #ifdef NOTHERION init_encodings(); print_fonts_setup(); cout << "making " << ((mode == ATLAS) ? "atlas" : "map") << " ... " << flush; #else thprintf("making %s ... ", (mode == ATLAS) ? "atlas" : "map"); #endif SHEET.clear(); SHEET_JMP.clear(); MINX=DBL_MAX, MINY=DBL_MAX, MAXX=-DBL_MAX, MAXY=-DBL_MAX; #ifdef NOTHERION read_settings(); // change to the quick mode only #endif make_sheets(); if (mode == ATLAS) { sort_sheets(); find_jumps(); } build_pages(); #ifdef NOTHERION cout << "done" << endl; #else thprintf("done\n"); #endif return(0); } #ifdef NOTHERION int main() { thpdf(0); } #endif therion/thdb2d.h0000664000175000017500000001711010754762242012577 0ustar useruser/** * @file thdb1d.h * 2D data structure processing class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb2d_h #define thdb2d_h #include "thinfnan.h" #include "thdb2dprj.h" #include "thmbuffer.h" #include "thbuffer.h" #include "thdb2dpt.h" #include "thdb2dlp.h" #include "thdb2dab.h" #include "thdb2dji.h" #include "thdb2dmi.h" #include "thdb2dcp.h" #include "thdb2dxs.h" #include "thdb2dxm.h" #include "thscraplo.h" #include "thlayoutln.h" #include "thscrapen.h" #include "thscraplp.h" #include #include #include /** * Projection ID structure. */ class thdb2dprjpr { public: thdb2dprj * prj; ///< Projection parameters. bool newprj, ///< Whether projection is new. parok; ///< Whether parameters are OK. thdb2dprjpr() : prj(NULL), newprj(false), parok(false) {} }; /** * User defined subtype group. */ struct thdb2d_udef { int m_command; const char * m_type; thdb2d_udef(int cmd, const char * type) : m_command(cmd), m_type(type) {} }; /** * User defined symbol properties. */ struct thdb2d_udef_prop { bool m_used, m_assigned; thdb2d_udef_prop() : m_used(false), m_assigned(true) {} void reset(); }; typedef std::list thdb2d_udef_prop_list; typedef std::map thdb2d_udef_map; bool operator < (const struct thdb2d_udef &, const struct thdb2d_udef &); bool operator == (const struct thdb2d_udef &, const struct thdb2d_udef &); /** * 2D data structure processing class. */ class thdb2d { public: bool processed_area_outlines; class thdatabase * db; ///< Our database. thdb2dprj_list prj_list; ///< Set of projections. thdb2dprjid_map prjid_map; int prj_lid; ///< Last projection id. thdb2dprj * prj_default; ///< Default projection. thdb2dpt_list pt_list; ///< List of 2D points. thdb2dlp_list lp_list; ///< List of path points. thdb2dab_list ab_list; ///< List of area border lines. thdb2dji_list ji_list; ///< List of join items. thdb2dmi_list mi_list; ///< List of map items. thdb2dcp_list cp_list; ///< Control point list. thdb2dxm_list xm_list; ///< Export map list. thdb2dxs_list xs_list; ///< Export scrap list. thscraplo_list scraplo_list; ///< Export map list. thscrapen_list scrapen_list; ///< Export map list. thlayoutln_list layoutln_list; ///< Export map list. thscraplp_list scraplp_list; ///< Export scrap list. thdb2d_udef_prop_list m_udef_list; ///< List of user defined symbol properties. thdb2d_udef_map m_udef_map; ///< User defined symbol map. void process_area_references(class tharea * aptr); ///< ??? void process_point_references(class thpoint * pp); ///< ??? void process_map_references(class thmap * mptr); ///< ??? void postprocess_map_references(class thmap * mptr); ///< ??? void process_join_references(class thjoin * jptr); ///< ??? void process_scrap_references(class thscrap * sptr); ///< ??? void pp_find_scraps_and_joins(thdb2dprj * prj); ///< ??? void pp_scale_points(thdb2dprj * prj); ///< ??? void pp_calc_limits(thdb2dprj * prj); ///< ??? void pp_calc_stations(thdb2dprj * prj); ///< ??? void pp_adjust_points(thdb2dprj * prj); ///< ??? void pp_shift_points(thdb2dprj * prj); ///< ??? void pp_morph_points(thdb2dprj * prj); void pp_calc_points_z(thdb2dprj * prj); void pp_process_joins(thdb2dprj * prj); ///< ??? bool pp_process_adjustments(thdb2dprj * prj); void pp_smooth_lines(thdb2dprj * prj); ///< ??? void pp_smooth_joins(thdb2dprj * prj); ///< ??? void pp_calc_distortion(thdb2dprj * prj); ///< ??? void insert_basic_maps(thdb2dxm * fmap, thmap * map, int mode, int level, thdb2dmi_shift shift = thdb2dmi_shift()); ///< ??? thdb2dxm * insert_maps(thdb2dxm * selection,thdb2dxm * insert_after,thmap * map, unsigned long selection_level, int level, int title_level, int map_level); ///< ??? void reset_selection(); public: thmbuffer mbf, ///< Multi buffer. mbf2; ///< Second buffer. thbuffer bf; /// Buffer. thdb2dxs_target_map m_target_map; /** * Standard constructor. */ thdb2d(); /** * Destructor. */ ~thdb2d(); /* * Assign database pointer. */ void assigndb(thdatabase * dbptr); /** * Print self. */ void self_print(FILE * outf); /** * Parse projection. * * Return projection identifier - if projection found or newly created - * or negative number, if parameters are not consistent. */ thdb2dprjpr parse_projection(const char * prjstr,bool insnew = true); /** * Insert 2D point. */ thdb2dpt * insert_point(); /** * Insert 2D line point. */ thdb2dlp * insert_line_point(); /** * Insert area border line. */ thdb2dab * insert_border_line(); /** * Insert join item. */ thdb2dji * insert_join_item(); /** * Insert map item. */ thdb2dmi * insert_map_item(); /** * Insert control point. */ thdb2dcp * insert_control_point(); /** * Insert export scrap. */ thdb2dxs * insert_xs(); /** * Insert export map. */ thdb2dxm * insert_xm(); /** * Insert ... */ thscraplo * insert_scraplo(); /** * Insert ... */ thlayoutln * insert_layoutln(); /** * Insert ... */ thscrapen * insert_scrapen(); /** * Insert ... */ thscraplp * insert_scraplp(); /** * Process 2D references. */ void process_references(); /** * Return efault projection. */ thdb2dprj * get_default_projection() {return this->prj_default;} /** * Process projection. */ void process_projection(thdb2dprj * prj); /** * Process projection. */ void process_areas_in_projection(thdb2dprj * prj); /** * Make map selection. */ thdb2dxm * select_projection(thdb2dprj * prj); /** * Register user defined symbol. */ void register_u_symbol(int cmd, const char * type); /** * Return user defined symbol properites. */ thdb2d_udef_prop * get_u_symbol_prop(int cmd, const char * type); /** * Set user defined symbol usage. */ void use_u_symbol(int cmd, const char * type); /** * Reset all user defined symbols. */ void reset_u_symbols(); /** * Return whether symbol is used. */ bool is_u_symbol_used(int cmd, const char * type); /** * Export metapost header file. */ void export_mp_header(FILE *); /** * Get projection title. */ const char * get_projection_title(thdb2dprj * prj); void log_distortions(); thdb2dprj * get_projection(int id); }; int thdb2d_rotate_align(int align, double rot); #endif therion/makearchive2.pl0000664000175000017500000000037211046571464014156 0ustar useruserif (open(VFL,"thversion.h")) { @verfl = ; $verfl[0] =~ /(\d+)\.(\d+)(\.(\d+))?/; $version = $&; close(VFL); } else { $version = "0.0"; } system("tar -cvf ../therion-$version.tar -C .. therion"); system("gzip ../therion-$version.tar"); therion/thlayoutclr.h0000664000175000017500000000261411446627620014004 0ustar useruser/** * @file thlayoutclr.h * Scrap outline line class. */ /* Copyright (C) 2009 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thlayoutclr_h #define thlayoutclr_h /** * layout color class. */ struct thlayout_color { double R, G, B, A; int defined; void parse(char * str, bool aalpha = false); thlayout_color() : R(1.0), G(1.0), B(1.0), A(1.0), defined(0) {} thlayout_color(double v) : R(v), G(v), B(v), A(1.0), defined(0) {} thlayout_color(double r, double g, double b) : R(r), G(g), B(b), A(1.0), defined(0) {} }; #endif therion/threpair-files0000775000175000017500000000105407777756224014141 0ustar useruser#!/usr/bin/tclsh proc repair_file {fnm} { puts "repairing file $fnm" set fid [open $fnm r] set fdt [read $fid] close $fid set fid [open $fnm w] fconfigure $fid -translation {auto lf} puts -nonewline $fid $fdt close $fid } proc scan_directory {dnm} { puts "scanning directory $dnm" set files [glob -nocomplain -directory $dnm *.th *.th2 *.th3 *.thcfg thconfig*] set dirs [glob -nocomplain -directory $dnm -type d *] foreach sfl $files { repair_file $sfl } foreach sdr $dirs { scan_directory $sdr } } scan_directory .therion/thendscrap.cxx0000664000175000017500000000437010721450356014134 0ustar useruser/** * @file thendscrap.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thendscrap.h" #include "thexception.h" #include "thchenc.h" thendscrap::thendscrap() { } thendscrap::~thendscrap() { } int thendscrap::get_class_id() { return TT_ENDSCRAP_CMD; } bool thendscrap::is(int class_id) { if (class_id == TT_ENDSCRAP_CMD) return true; else return thdataobject::is(class_id); } int thendscrap::get_cmd_nargs() { return 0; } const char * thendscrap::get_cmd_end() { return NULL; } const char * thendscrap::get_cmd_name() { return "endscrap"; } thcmd_option_desc thendscrap::get_cmd_option_desc(const char * opts) { return TT_DATAOBJECT_UNKNOWN; } void thendscrap::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { if (cod.id == 1) cod.id = TT_DATAOBJECT_NAME; switch (cod.id) { case TT_DATAOBJECT_NAME: if (th_is_keyword(*args)) this->name = this->db->strstore(*args); else ththrow(("invalid keyword -- %s", *args)); break; default: thdataobject::set(cod, args, argenc, indataline); } } void thendscrap::self_delete() { delete this; } void thendscrap::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thendscrap:\n"); } int thendscrap::get_context() { return THCTX_SCRAP; } therion/thdb3d.h0000664000175000017500000000724011577053654012607 0ustar useruser/** * @file thdb3d.h * 3D processing class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdb3d_h #define thdb3d_h #include #include #include "loch/lxMath.h" enum { THDB3DFC_POINTS, THDB3DFC_LINES, THDB3DFC_LINE_STRIP, THDB3DFC_LINE_LOOP, THDB3DFC_TRIANGLES, THDB3DFC_TRIANGLE_STRIP, THDB3DFC_TRIANGLE_FAN, THDB3DFC_QUADS, THDB3DFC_QUAD_STRIP, THDB3DFC_POLYGON, }; struct thdb3dlim { bool ok; double minx, miny, minz, maxx, maxy, maxz; thdb3dlim() : ok(false), minx(0.0), miny(0.0), minz(0.0), maxx(0.0), maxy(0.0), maxz(0.0) {} void update(double x, double y, double z); void update(thdb3dlim * limits); }; struct thdb3dnm { double x, y, z; bool norm; thdb3dnm * next; thdb3dnm() : x(0.0), y(0.0), z(0.0), norm(false), next(NULL) {} void normalize(); }; struct thdb3dvx { unsigned long id; double x, y, z; void * data; thdb3dnm * normal; thdb3dvx * next; thdb3dvx() : id(0), x(0.0), y(0.0), z(0.0), data(NULL), normal(NULL), next(NULL) {} lxVec get_vector() {return lxVec(this->x, this->y, this->z);} thdb3dnm * insert_normal(double nx, double ny, double nz); thdb3dnm * insert_normal(lxVec n) {return this->insert_normal(n.x, n.y, n.z);}; }; struct thdb3dfx { void * data; thdb3dnm * normal; thdb3dvx * vertex; thdb3dfx * next; thdb3dfx() : data(NULL), normal(NULL), vertex(NULL), next(NULL) {} thdb3dnm * insert_normal(double nx, double ny, double nz); thdb3dnm * insert_normal(lxVec n) {return this->insert_normal(n.x, n.y, n.z);}; }; struct thdb3dfc { int type; unsigned long nvx; thdb3dfx * firstfx, * lastfx; thdb3dfc * next; thdb3dfc() : type(THDB3DFC_TRIANGLES), nvx(0), firstfx(NULL), lastfx(NULL), next(NULL) {} thdb3dfx * insert_vertex(thdb3dvx * vx = NULL, void * dt = NULL); }; struct thdb3ddata { unsigned long nvertices, nfaces; double exp_shift_x, exp_shift_y, exp_shift_z; thdb3dfc * firstfc, * lastfc; thdb3dvx * firstvx, * lastvx; thdb3ddata * next; thdb3dlim limits; thdb3ddata() : nvertices(0), nfaces(0), exp_shift_x(0.0), exp_shift_y(0.0), exp_shift_z(0.0), firstfc(NULL), lastfc(NULL), firstvx(NULL), lastvx(NULL), next(NULL), limits() {} thdb3dfc * insert_face(int type); thdb3dvx * insert_vertex(double vxx, double vxy, double vxz, void * dt = NULL); thdb3dvx * insert_vertex(lxVec v, void * dt = NULL); void export_thm(FILE * out); void export_vrml(FILE * out); void export_3dmf(FILE * out); void export_dxf(FILE * out, const char * LAYER); void postprocess(); }; struct thdb3d { std::list normal_list; std::list vertex_list; std::list face_vertex_list; std::list face_list; }; extern thdb3d thdatabase3d; #endif therion/thjoin.h0000664000175000017500000000605510721450310012711 0ustar useruser/** * @file thjoin.h * join module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thjoin_h #define thjoin_h #include "thdataobject.h" /** * join command options tokens. */ enum { TT_JOIN_UNKNOWN = 2000, TT_JOIN_SMOOTH = 2001, TT_JOIN_COUNT = 2002, }; /** * join command options parsing table. */ static const thstok thtt_join_opt[] = { {"count", TT_JOIN_COUNT}, {"smooth", TT_JOIN_SMOOTH}, {NULL, TT_JOIN_UNKNOWN}, }; /** * join class. */ class thjoin : public thdataobject { public: friend class thdb2d; class thdb2dji * first_item, * last_item; class thdb2dprj * proj; thjoin * proj_next_join, * proj_prev_join; int smooth, ///< Smooth option. count; ///< Number of joins. void parse_item(char * istr); ///< Parse join item. public: /** * Standard constructor. */ thjoin(); /** * Standard destructor. */ ~thjoin(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "thjoin";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Get context for object. */ virtual int get_context(); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); }; #endif therion/thexpuni.cxx0000664000175000017500000006352511705762452013662 0ustar useruser/** * @file thexpuni.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thexpmap.h" #include "thexporter.h" #include "thexception.h" #include "thdatabase.h" #include "thdb2d.h" #include "thdb2dmi.h" #include "thlayout.h" #include "thmap.h" #include "thsketch.h" #include "thconfig.h" #include #include "thtmpdir.h" #include "thcsdata.h" #include "thdb3d.h" #ifdef THMSVC #define hypot _hypot #define snprintf _snprintf #define strcasecmp _stricmp #endif #include "thchenc.h" #include "thdb1d.h" #include "thinit.h" #include "thlogfile.h" #include "thcmdline.h" #include "thsurvey.h" #include "thchenc.h" #include #include "thmapstat.h" #include "thsurface.h" #include #include "loch/lxMath.h" #include "extern/shapefil.h" #include "thexpmodel.h" #include #include #include #include #include "thexpuni.h" #include "thproj.h" #include "thcs.h" static const char * DXFpre = " 0\nSECTION\n 2\nHEADER\n 9\n$ACADVER\n 1\nAC1014\n 9\n$ACADMAINTVER\n" " 70\n 0\n 9\n$DWGCODEPAGE\n 3\nANSI_1252\n 9\n$INSBASE\n" " 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$EXTMIN\n 10\n%.3f\n 20\n" "%.3f\n 30\n0.0\n 9\n$EXTMAX\n 10\n%.3f\n 20\n%.3f\n" " 30\n0.0\n 9\n$ORTHOMODE\n 70\n 1\n 9\n$REGENMODE\n" " 70\n 1\n 9\n$FILLMODE\n 70\n 1\n 9\n$QTEXTMODE\n 70\n" " 0\n 9\n$MIRRTEXT\n 70\n 1\n 9\n$DRAGMODE\n 70\n 2\n" " 9\n$LTSCALE\n 40\n1.0\n 9\n$OSMODE\n 70\n 0\n 9\n$ATTMODE\n" " 70\n 1\n 9\n$TEXTSIZE\n 40\n2.5\n 9\n$TRACEWID\n 40\n1.0\n" " 9\n$TEXTSTYLE\n 7\nSTANDARD\n 9\n$CLAYER\n 8\n0\n 9\n$CELTYPE\n" " 6\nBYLAYER\n 9\n$CECOLOR\n 62\n 256\n 9\n$CELTSCALE\n 40\n" "1.0\n 9\n$DELOBJ\n 70\n 1\n 9\n$DISPSILH\n 70\n 0\n" " 9\n$DIMSCALE\n 40\n1.0\n 9\n$DIMASZ\n 40\n2.5\n 9\n$DIMEXO\n" " 40\n0.625\n 9\n$DIMDLI\n 40\n3.75\n 9\n$DIMRND\n 40\n0.0\n" " 9\n$DIMDLE\n 40\n0.0\n 9\n$DIMEXE\n 40\n1.25\n 9\n$DIMTP\n" " 40\n0.0\n 9\n$DIMTM\n 40\n0.0\n 9\n$DIMTXT\n 40\n2.5\n 9\n" "$DIMCEN\n 40\n2.5\n 9\n$DIMTSZ\n 40\n0.0\n 9\n$DIMTOL\n 70\n" " 0\n 9\n$DIMLIM\n 70\n 0\n 9\n$DIMTIH\n 70\n 0\n" " 9\n$DIMTOH\n 70\n 0\n 9\n$DIMSE1\n 70\n 0\n 9\n$DIMSE2\n" " 70\n 0\n 9\n$DIMTAD\n 70\n 1\n 9\n$DIMZIN\n 70\n 8\n" " 9\n$DIMBLK\n 1\n\n 9\n$DIMASO\n 70\n 1\n 9\n$DIMSHO\n" " 70\n 1\n 9\n$DIMPOST\n 1\n\n 9\n$DIMAPOST\n 1\n\n 9\n" "$DIMALT\n 70\n 0\n 9\n$DIMALTD\n 70\n 4\n 9\n$DIMALTF\n" " 40\n0.0394\n 9\n$DIMLFAC\n 40\n1.0\n 9\n$DIMTOFL\n 70\n 1\n" " 9\n$DIMTVP\n 40\n0.0\n 9\n$DIMTIX\n 70\n 0\n 9\n$DIMSOXD\n" " 70\n 0\n 9\n$DIMSAH\n 70\n 0\n 9\n$DIMBLK1\n 1\n\n" " 9\n$DIMBLK2\n 1\n\n 9\n$DIMSTYLE\n 2\nSTANDARD\n 9\n$DIMCLRD\n" " 70\n 0\n 9\n$DIMCLRE\n 70\n 0\n 9\n$DIMCLRT\n 70\n" " 0\n 9\n$DIMTFAC\n 40\n1.0\n 9\n$DIMGAP\n 40\n0.625\n 9\n" "$DIMJUST\n 70\n 0\n 9\n$DIMSD1\n 70\n 0\n 9\n$DIMSD2\n" " 70\n 0\n 9\n$DIMTOLJ\n 70\n 1\n 9\n$DIMTZIN\n 70\n" " 0\n 9\n$DIMALTZ\n 70\n 0\n 9\n$DIMALTTZ\n 70\n 0\n" " 9\n$DIMFIT\n 70\n 3\n 9\n$DIMUPT\n 70\n 0\n 9\n$DIMUNIT\n" " 70\n 8\n 9\n$DIMDEC\n 70\n 4\n 9\n$DIMTDEC\n 70\n 4\n" " 9\n$DIMALTU\n 70\n 8\n 9\n$DIMALTTD\n 70\n 4\n 9\n" "$DIMTXSTY\n 7\nSTANDARD\n 9\n$DIMAUNIT\n 70\n 0\n 9\n$LUNITS\n" " 70\n 2\n 9\n$LUPREC\n 70\n 4\n 9\n$SKETCHINC\n 40\n" "1.0\n 9\n$FILLETRAD\n 40\n10.0\n 9\n$AUNITS\n 70\n 0\n 9\n" "$AUPREC\n 70\n 0\n 9\n$MENU\n 1\n.\n 9\n$ELEVATION\n 40\n" "0.0\n 9\n$PELEVATION\n 40\n0.0\n 9\n$THICKNESS\n 40\n0.0\n 9\n" "$LIMCHECK\n 70\n 0\n 9\n$BLIPMODE\n 70\n 0\n 9\n$CHAMFERA\n" " 40\n10.0\n 9\n$CHAMFERB\n 40\n10.0\n 9\n$CHAMFERC\n 40\n20.0\n" " 9\n$CHAMFERD\n 40\n0.0\n 9\n$SKPOLY\n 70\n 0\n 9\n$TDCREATE\n" " 40\n2454180.933710197\n 9\n$TDUPDATE\n 40\n2454180.933710197\n" " 9\n$TDINDWG\n 40\n0.0000000000\n 9\n$TDUSRTIMER\n 40\n0.0000000000\n" " 9\n$USRTIMER\n 70\n 1\n 9\n$ANGBASE\n 50\n0.0\n 9\n$ANGDIR\n" " 70\n 0\n 9\n$PDMODE\n 70\n 0\n 9\n$PDSIZE\n 40\n0.0\n" " 9\n$PLINEWID\n 40\n0.0\n 9\n$COORDS\n 70\n 1\n 9\n$SPLFRAME\n" " 70\n 0\n 9\n$SPLINETYPE\n 70\n 6\n 9\n$SPLINESEGS\n" " 70\n 8\n 9\n$ATTDIA\n 70\n 0\n 9\n$ATTREQ\n 70\n 1\n" " 9\n$HANDLING\n 70\n 1\n 9\n$HANDSEED\n 5\n3A\n 9\n$SURFTAB1\n" " 70\n 6\n 9\n$SURFTAB2\n 70\n 6\n 9\n$SURFTYPE\n 70\n" " 6\n 9\n$SURFU\n 70\n 6\n 9\n$SURFV\n 70\n 6\n 9\n" "$UCSNAME\n 2\n\n 9\n$UCSORG\n 10\n0.0\n 20\n0.0\n 30\n0.0\n" " 9\n$UCSXDIR\n 10\n1.0\n 20\n0.0\n 30\n0.0\n 9\n$UCSYDIR\n 10\n" "0.0\n 20\n1.0\n 30\n0.0\n 9\n$PUCSNAME\n 2\n\n 9\n$PUCSORG\n" " 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$PUCSXDIR\n 10\n1.0\n 20\n" "0.0\n 30\n0.0\n 9\n$PUCSYDIR\n 10\n0.0\n 20\n1.0\n 30\n0.0\n" " 9\n$USERI1\n 70\n 0\n 9\n$USERI2\n 70\n 0\n 9\n$USERI3\n" " 70\n 0\n 9\n$USERI4\n 70\n 0\n 9\n$USERI5\n 70\n 0\n" " 9\n$USERR1\n 40\n0.0\n 9\n$USERR2\n 40\n0.0\n 9\n$USERR3\n" " 40\n0.0\n 9\n$USERR4\n 40\n0.0\n 9\n$USERR5\n 40\n0.0\n 9\n" "$WORLDVIEW\n 70\n 1\n 9\n$SHADEDGE\n 70\n 3\n 9\n$SHADEDIF\n" " 70\n 70\n 9\n$TILEMODE\n 70\n 1\n 9\n$MAXACTVP\n 70\n" " 48\n 9\n$PINSBASE\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 9\n$PLIMCHECK\n" " 70\n 0\n 9\n$PEXTMIN\n 10\n1.000000E+20\n 20\n1.000000E+20\n" " 30\n1.000000E+20\n 9\n$PEXTMAX\n 10\n-1.000000E+20\n 20\n-1.000000E+20\n" " 30\n-1.000000E+20\n 9\n$PLIMMIN\n 10\n0.0\n 20\n0.0\n 9\n$PLIMMAX\n" " 10\n420.0\n 20\n297.0\n 9\n$UNITMODE\n 70\n 0\n 9\n$VISRETAIN\n" " 70\n 1\n 9\n$PLINEGEN\n 70\n 0\n 9\n$PSLTSCALE\n 70\n" " 1\n 9\n$TREEDEPTH\n 70\n 3020\n 9\n$PICKSTYLE\n 70\n 1\n" " 9\n$CMLSTYLE\n 2\nSTANDARD\n 9\n$CMLJUST\n 70\n 0\n 9\n" "$CMLSCALE\n 40\n20.0\n 9\n$PROXYGRAPHICS\n 70\n 1\n 9\n" "$MEASUREMENT\n 70\n 1\n 0\nENDSEC\n 0\nSECTION\n 2\nCLASSES\n" " 0\nCLASS\n 1\nLWPOLYLINE\n 2\nAcDbPolyline\n 3\n\"AutoCAD\"\n" " 90\n 0\n280\n 0\n281\n 1\n 0\nCLASS\n 1\nDICTIONARYVAR\n" " 2\nAcDbDictionaryVar\n 3\n\"AutoCAD\"\n 90\n 0\n280\n" " 0\n281\n 0\n 0\nCLASS\n 1\nHATCH\n 2\nAcDbHatch\n" " 3\n\"ACAD_SEDONA\"\n 90\n 0\n280\n 0\n281\n 1\n" " 0\nENDSEC\n 0\nSECTION\n 2\nTABLES\n 0\nTABLE\n 2\nVPORT\n" " 5\n8\n100\nAcDbSymbolTable\n 70\n 5\n 0\nVPORT\n 5\n39\n" "100\nAcDbSymbolTableRecord\n100\nAcDbViewportTableRecord\n 2\n" "*ACTIVE\n 70\n 0\n 10\n0.0\n 20\n0.0\n 11\n1.0\n 21\n1.0\n" " 12\n298.941176\n 22\n148.5\n 13\n0.0\n 23\n0.0\n 14\n10.0\n 24\n" "10.0\n 15\n10.0\n 25\n10.0\n 16\n0.0\n 26\n0.0\n 36\n1.0\n 17\n" "0.0\n 27\n0.0\n 37\n0.0\n 40\n297.0\n 41\n2.013072\n 42\n50.0\n" " 43\n0.0\n 44\n0.0\n 50\n0.0\n 51\n0.0\n 71\n 0\n 72\n 100\n" " 73\n 1\n 74\n 1\n 75\n 0\n 76\n 0\n 77\n 0\n" " 78\n 0\n 0\nENDTAB\n 0\nTABLE\n 2\nLTYPE\n 5\n5\n100\n" "AcDbSymbolTable\n 70\n 1\n 0\nLTYPE\n 5\n12\n100\nAcDbSymbolTableRecord\n" "100\nAcDbLinetypeTableRecord\n 2\nBYBLOCK\n 70\n 0\n 3\n" "\n 72\n 65\n 73\n 0\n 40\n0.0\n 0\nLTYPE\n 5\n13\n100\n" "AcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n 2\nBYLAYER\n" " 70\n 0\n 3\n\n 72\n 65\n 73\n 0\n 40\n0.0\n 0\n" "LTYPE\n 5\n14\n100\nAcDbSymbolTableRecord\n100\nAcDbLinetypeTableRecord\n" " 2\nCONTINUOUS\n 70\n 0\n 3\nSolid line\n 72\n 65\n 73\n" " 0\n 40\n0.0\n 0\nENDTAB\n 0\nTABLE\n 2\nLAYER\n 5\n2\n" "100\nAcDbSymbolTable\n 70\n 1\n 0\nLAYER\n 5\nE\n100\nAcDbSymbolTableRecord\n" "100\nAcDbLayerTableRecord\n 2\n0\n 70\n 0\n 62\n 7\n" " 6\nCONTINUOUS\n 0\nENDTAB\n 0\nTABLE\n 2\nSTYLE\n 5\n3\n" "100\nAcDbSymbolTable\n 70\n 1\n 0\nSTYLE\n 5\nF\n100\nAcDbSymbolTableRecord\n" "100\nAcDbTextStyleTableRecord\n 2\nSTANDARD\n 70\n 0\n 40\n" "0.0\n 41\n1.0\n 50\n0.0\n 71\n 0\n 42\n2.5\n 3\ntxt\n 4\n" "\n 0\nENDTAB\n 0\nTABLE\n 2\nVIEW\n 5\n6\n100\nAcDbSymbolTable\n" " 70\n 0\n 0\nENDTAB\n 0\nTABLE\n 2\nUCS\n 5\n7\n100\n" "AcDbSymbolTable\n 70\n 0\n 0\nENDTAB\n 0\nTABLE\n 2\nAPPID\n" " 5\n9\n100\nAcDbSymbolTable\n 70\n 1\n 0\nAPPID\n 5\n10\n" "100\nAcDbSymbolTableRecord\n100\nAcDbRegAppTableRecord\n 2\n" "ACAD\n 70\n 0\n 0\nENDTAB\n 0\nTABLE\n 2\nDIMSTYLE\n 5\n" "A\n100\nAcDbSymbolTable\n 70\n 1\n 0\nDIMSTYLE\n105\n1D\n" "100\nAcDbSymbolTableRecord\n100\nAcDbDimStyleTableRecord\n 2\n" "STANDARD\n 70\n 0\n 3\n\n 4\n\n 5\n\n 6\n\n 7\n\n 40\n" "1.0\n 41\n0.18\n 42\n0.0625\n 43\n0.38\n 44\n0.18\n 45\n0.0\n" " 46\n0.0\n 47\n0.0\n 48\n0.0\n140\n0.18\n141\n0.09\n142\n0.0\n" "143\n25.4\n144\n1.0\n145\n0.0\n146\n1.0\n147\n0.09\n 71\n 0\n" " 72\n 0\n 73\n 1\n 74\n 1\n 75\n 0\n 76\n 0\n" " 77\n 0\n 78\n 0\n170\n 0\n171\n 2\n172\n 0\n" "173\n 0\n174\n 0\n175\n 0\n176\n 0\n177\n 0\n" "178\n 0\n270\n 2\n271\n 4\n272\n 4\n273\n 2\n" "274\n 2\n340\nF\n275\n 0\n280\n 0\n281\n 0\n282\n" " 0\n283\n 1\n284\n 0\n285\n 0\n286\n 0\n287\n" " 3\n288\n 0\n 0\nENDTAB\n 0\nTABLE\n 2\nBLOCK_RECORD\n" " 5\n1\n100\nAcDbSymbolTable\n 70\n 0\n 0\nBLOCK_RECORD\n" " 5\n18\n100\nAcDbSymbolTableRecord\n100\nAcDbBlockTableRecord\n" " 2\n*MODEL_SPACE\n 0\nBLOCK_RECORD\n 5\n15\n100\nAcDbSymbolTableRecord\n" "100\nAcDbBlockTableRecord\n 2\n*PAPER_SPACE\n 0\nENDTAB\n 0\n" "ENDSEC\n 0\nSECTION\n 2\nBLOCKS\n 0\nBLOCK\n 5\n19\n100\n" "AcDbEntity\n 8\n0\n100\nAcDbBlockBegin\n 2\n*MODEL_SPACE\n 70\n" " 0\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 3\n*MODEL_SPACE\n 1\n" "\n 0\nENDBLK\n 5\n1A\n100\nAcDbEntity\n 8\n0\n100\nAcDbBlockEnd\n" " 0\nBLOCK\n 5\n16\n100\nAcDbEntity\n 67\n 1\n 8\n0\n100\n" "AcDbBlockBegin\n 2\n*PAPER_SPACE\n 70\n 0\n 10\n0.0\n 20\n" "0.0\n 30\n0.0\n 3\n*PAPER_SPACE\n 1\n\n 0\nENDBLK\n 5\n17\n" "100\nAcDbEntity\n 67\n 1\n 8\n0\n100\nAcDbBlockEnd\n 0\n" "ENDSEC\n 0\nSECTION\n 2\nENTITIES\n"; static const char * DXFpost = " 0\nENDSEC\n 0\nSECTION\n" " 2\nOBJECTS\n 0\nDICTIONARY\n 5\nC\n100\nAcDbDictionary\n 3\n" "ACAD_GROUP\n350\nD\n 3\nACAD_MLINESTYLE\n350\n1B\n 3\nACDBVARIABLEDICTIONARY\n" "350\n32\n 0\nDICTIONARY\n 5\nD\n102\n{ACAD_REACTORS\n330\nC\n" "102\n}\n100\nAcDbDictionary\n 0\nDICTIONARY\n 5\n1B\n102\n{ACAD_REACTORS\n" "330\nC\n102\n}\n100\nAcDbDictionary\n 3\nSTANDARD\n350\n1C\n" " 0\nDICTIONARY\n 5\n32\n102\n{ACAD_REACTORS\n330\nC\n102\n}\n" "100\nAcDbDictionary\n 3\nSORTENTS\n350\n33\n 0\nMLINESTYLE\n" " 5\n1C\n102\n{ACAD_REACTORS\n330\n1B\n102\n}\n100\nAcDbMlineStyle\n" " 2\nSTANDARD\n 70\n 0\n 3\n\n 62\n 256\n 51\n90.0\n 52\n" "90.0\n 71\n 2\n 49\n0.5\n 62\n 256\n 6\nBYLAYER\n 49\n" "-0.5\n 62\n 256\n 6\nBYLAYER\n 0\nDICTIONARYVAR\n 5\n33\n" "102\n{ACAD_REACTORS\n330\n32\n102\n}\n100\nDictionaryVariables\n" "280\n 0\n 1\n96\n 0\nENDSEC\n 0\nEOF\n\n"; thexpuni::thexpuni() { this->resol = 0.304; this->clear(); } void thexpuni::clear() { this->m_cpart = NULL; this->m_part_list.clear(); } void thexpuni::polygon_start_ring(bool outer) { this->m_ring_list.clear(); thexpuni_part p; p.m_outer = outer; this->m_cpart = &(*this->m_part_list.insert(this->m_part_list.end(), p)); } // insert points from bezier curve void insert_line_segment(double resolution, thline * ln, bool reverse, std::list & lst, long startp = 0, long endp = -1) { thdb2dlp * cpt, * prevpt; thdb2dpt * cp1, * cp2; double t, tt, ttt, t_, tt_, ttt_, nx, ny, nz, na, px, py; long pnum; prevpt = NULL; if (reverse) cpt = ln->last_point; else cpt = ln->first_point; pnum = 0; while (cpt != NULL) { // insert bezier curve if (pnum == startp) prevpt = NULL; if ((pnum >= startp) && ((endp < 0) || (pnum <= endp))) { if (prevpt != NULL) { px = prevpt->point->xt; py = prevpt->point->yt; if (reverse) { cp1 = prevpt->cp2; cp2 = prevpt->cp1; } else { cp1 = cpt->cp1; cp2 = cpt->cp2; } if ((cp1 != NULL) && (cp2 == NULL)) cp2 = cp1; if ((cp1 == NULL) && (cp2 != NULL)) cp1 = cp2; if ((cp1 != NULL) && (cp2 != NULL)) { for(t = 0.05; t < 1.0; t += 0.05) { tt = t * t; ttt = tt * t; t_ = 1.0 - t; tt_ = t_ * t_; ttt_ = tt_ * t_; nx = ttt_ * prevpt->point->xt + 3.0 * t * tt_ * cp1->xt + 3.0 * tt * t_ * cp2->xt + ttt * cpt->point->xt; ny = ttt_ * prevpt->point->yt + 3.0 * t * tt_ * cp1->yt + 3.0 * tt * t_ * cp2->yt + ttt * cpt->point->yt; nz = t_ * cpt->point->zt + t * prevpt->point->zt; na = t_ * cpt->point->at + t * prevpt->point->at; // resolution 0.1 m if (hypot(nx - px, ny - py) > resolution) { lst.push_back(thexpuni_data(nx + ln->fscrapptr->proj->rshift_x, ny + ln->fscrapptr->proj->rshift_y, nz + ln->fscrapptr->proj->rshift_z, na)); px = nx; py = ny; } } } } } // insert point it self if ((pnum >= startp) && ((endp < 0) || (pnum <= endp))) lst.push_back(thexpuni_data(cpt->point->xt + ln->fscrapptr->proj->rshift_x, cpt->point->yt + ln->fscrapptr->proj->rshift_y, cpt->point->zt + ln->fscrapptr->proj->rshift_z, cpt->point->at)); // next point prevpt = cpt; if (reverse) cpt = cpt->prevlp; else cpt = cpt->nextlp; pnum++; } } void thexpuni::polygon_insert_line(thline * ln, bool reverse) { insert_line_segment(this->resol, ln, reverse, this->m_ring_list); } void thexpuni::polygon_close_ring() { // check polygon orientation double area; std::list::iterator i, iprev; if (this->m_ring_list.size() < 2) return; iprev = this->m_ring_list.end(); iprev--; area = 0.0; for (i = this->m_ring_list.begin(); i != this->m_ring_list.end(); i++) { area += iprev->m_x * i->m_y - iprev->m_y * i->m_x; iprev = i; } area *= 0.5; bool reverse = ((area > 0) && (this->m_cpart->m_outer)) || ((area < 0) && (!this->m_cpart->m_outer)); // according to orientation, insert points to point list if (reverse) { for(i = this->m_ring_list.end(); i != this->m_ring_list.begin(); ) { i--; this->m_cpart->m_point_list.push_back(*i); } } else { for(i = this->m_ring_list.begin(); i != this->m_ring_list.end(); i++) { this->m_cpart->m_point_list.push_back(*i); } } } void thexpuni::parse_scrap(thscrap * scrap) { thbuffer stnbuff; // export scrap outline this->clear(); thscraplo * lo = scrap->get_outline(), * lo2; while (lo != NULL) { if (lo->line->outline != TT_LINE_OUTLINE_NONE) { lo2 = lo; this->polygon_start_ring(lo->line->outline == TT_LINE_OUTLINE_OUT); this->m_cpart->m_lo = lo; while (lo2 != NULL) { this->polygon_insert_line(lo2->line, lo2->mode == TT_OUTLINE_REVERSED); lo2 = lo2->next_line; } this->polygon_close_ring(); } lo = lo->next_outline; } } void thexpuni::parse_line(thline * line) { long sp = 0, cp = 1; int csubtype; this->clear(); thdb2dlp * lp = line->first_point, * slp; if (lp == NULL) return; csubtype = lp->subtype; slp = lp; lp = lp->nextlp; while (lp != NULL) { if ((lp->subtype != csubtype) || (lp->nextlp == NULL)) { thexpuni_part p; this->m_cpart = &(*this->m_part_list.insert(this->m_part_list.end(), p)); this->m_cpart->m_lp = slp; insert_line_segment(this->resol, line, false, this->m_cpart->m_point_list, sp, cp); csubtype = lp->subtype; sp = cp; slp = lp; } lp = lp->nextlp; cp++; } } void thexpmap::export_kml(class thdb2dxm * maps, class thdb2dprj * prj) { if (prj->type != TT_2DPROJ_PLAN) { thwarning(("unable to export KML from non plan projection")); return; } if (thcfg.outcs == TTCS_LOCAL) { thwarning(("data not georeferenced -- unable to export KML file")); return; } if (maps == NULL) { thwarning(("%s [%d] -- no selected projection data -- %s", this->src.name, this->src.line, this->projstr)) return; } FILE * out; const char * fnm = this->get_output("cave.kml"); out = fopen(fnm, "w"); if (out == NULL) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif thdb2dxm * cmap = maps; thdb2dxs * cbm; thdb2dmi * cmi; thscrap * scrap; thexpuni xu; fprintf(out,"\n\n\n"); fprintf(out,"Therion KML export\nTherion KML export.\n"); int cA, cR, cG, cB; cR = int (255.0 * this->layout->color_map_fg.R + 0.5); cG = int (255.0 * this->layout->color_map_fg.G + 0.5); cB = int (255.0 * this->layout->color_map_fg.B + 0.5); if (this->layout->transparency) { cA = int (255.0 * this->layout->opacity + 0.5); } else { cA = 255; } #define checkc(c) if (c < 0) c = 0; if (c > 255) c = 255; checkc(cA); checkc(cR); checkc(cG); checkc(cB); fprintf(out,"\n"); fprintf(out,"\n"); fprintf(out,"\n"); while (cmap != NULL) { cbm = cmap->first_bm; while (cbm != NULL) { cmi = cbm->bm->last_item; if (cbm->mode == TT_MAPITEM_NORMAL) { while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) { scrap = (thscrap*) cmi->object; xu.parse_scrap(scrap); if (xu.m_part_list.size() > 0) { fprintf(out,"\n"); std::list::iterator it; std::list::iterator ip; double x,y,z; for(it = xu.m_part_list.begin(); it != xu.m_part_list.end(); it++) { if (it->m_outer) fprintf(out,"\n"); else fprintf(out,"\n"); fprintf(out,"\n\n"); for(ip = it->m_point_list.begin(); ip != it->m_point_list.end(); ip++) { thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, ip->m_x, ip->m_y, scrap->z, x, y, z); fprintf(out, "\t%.14f,%.14f,%.14f\n", x / THPI * 180.0, y / THPI * 180.0, 0.0); } fprintf(out,"\n\n"); if (it->m_outer) fprintf(out,"\n"); else fprintf(out,"\n"); } fprintf(out,"\n"); } } cmi = cmi->prev_item; } } cbm = cbm->next_item; } cmap = cmap->next_item; } fprintf(out,"\n\n"); fprintf(out,"\n\n"); fclose(out); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmap::export_bbox(class thdb2dxm * maps, class thdb2dprj * prj) { if (prj->type != TT_2DPROJ_PLAN) { thwarning(("unable to export bounding box of non plan projection")); return; } if (thcfg.outcs == TTCS_LOCAL) { thwarning(("data not georeferenced -- unable to export bounding box file")); return; } if (maps == NULL) { thwarning(("%s [%d] -- no selected projection data -- %s", this->src.name, this->src.line, this->projstr)) return; } FILE * out; const char * fnm = this->get_output("cave.bbox"); out = fopen(fnm, "w"); if (out == NULL) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif thdb2dxm * cmap = maps; thdb2dxs * cbm; thdb2dmi * cmi; double cx, cy, cz; bool has_scrap = false; thscrap * scrap; thexpuni xu; lxVecLimits lim; while (cmap != NULL) { cbm = cmap->first_bm; while (cbm != NULL) { cmi = cbm->bm->last_item; if (cbm->mode == TT_MAPITEM_NORMAL) { while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) { scrap = (thscrap*) cmi->object; if (!thisnan(scrap->lxmin)) { thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, scrap->lxmin + prj->rshift_x, scrap->lymin + prj->rshift_y, scrap->z + prj->rshift_z, cx, cy, cz); lim.Add(cx / THPI * 180.0, cy / THPI * 180.0, cz); thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, scrap->lxmin + prj->rshift_x, scrap->lymax + prj->rshift_y, scrap->z + prj->rshift_z, cx, cy, cz); lim.Add(cx / THPI * 180.0, cy / THPI * 180.0, cz); thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, scrap->lxmax + prj->rshift_x, scrap->lymin + prj->rshift_y, scrap->z + prj->rshift_z, cx, cy, cz); lim.Add(cx / THPI * 180.0, cy / THPI * 180.0, cz); thcs2cs(thcs_get_data(thcfg.outcs)->params, thcs_get_data(TTCS_LONG_LAT)->params, scrap->lxmax + prj->rshift_x, scrap->lymax + prj->rshift_y, scrap->z + prj->rshift_z, cx, cy, cz); lim.Add(cx / THPI * 180.0, cy / THPI * 180.0, cz); has_scrap = true; } } cmi = cmi->prev_item; } } cbm = cbm->next_item; } cmap = cmap->next_item; } if (has_scrap) { fprintf(out,"%.14f\n",lim.min.x); fprintf(out,"%.14f\n",lim.min.y); fprintf(out,"%.14f\n",lim.max.x); fprintf(out,"%.14f\n",lim.max.y); } fclose(out); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } void thexpmap::export_dxf(class thdb2dxm * maps, class thdb2dprj * prj) { if (maps == NULL) { thwarning(("%s [%d] -- no selected projection data -- %s", this->src.name, this->src.line, this->projstr)) return; } FILE * out; const char * fnm = this->get_output("cave.dxf"); out = fopen(fnm, "w"); if (out == NULL) { thwarning(("can't open %s for output",fnm)) return; } #ifdef THDEBUG thprintf("\n\nwriting %s\n", fnm); #else thprintf("writing %s ... ", fnm); thtext_inline = true; #endif thdb2dxm * cmap = maps; thdb2dxs * cbm; thdb2dmi * cmi; thdb3dlim limits; thscrap * scrap; thexpuni xu; xu.resol = 0.1; fprintf(out,DXFpre,limits.minx, limits.miny, limits.maxx, limits.maxy); while (cmap != NULL) { cbm = cmap->first_bm; while (cbm != NULL) { cmi = cbm->bm->last_item; if (cbm->mode == TT_MAPITEM_NORMAL) { while (cmi != NULL) { if (cmi->type == TT_MAPITEM_NORMAL) { scrap = (thscrap*) cmi->object; xu.parse_scrap(scrap); if (xu.m_part_list.size() > 0) { double x(0.0), y(0.0), z(0.0), px(0.0), py(0.0), pz(0.0); bool inside; std::list::iterator it; std::list::iterator ip; fprintf(out, " 0\nHATCH\n 100\nAcDbEntity\n 8\n0\n 100\nAcDbHatch\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 210\n0.0\n 220\n0.0\n 230\n1.0\n 2\nSOLID\n 70\n1\n 71\n0\n"); fprintf(out, " 91\n%ld\n", (long) xu.m_part_list.size()); for(it = xu.m_part_list.begin(); it != xu.m_part_list.end(); it++) { fprintf(out, " 92\n0\n 93\n%ld\n", (long)it->m_point_list.size()); inside = false; for(ip = it->m_point_list.begin(); ip != it->m_point_list.end(); ip++) { x = ip->m_x; y = ip->m_y; z = scrap->z + scrap->proj->rshift_z; limits.update(x,y,z); if (inside) { fprintf(out, " 72\n1\n"); fprintf(out, " 10\n%.3f\n 20\n%.3f\n", px, py); fprintf(out, " 11\n%.3f\n 21\n%.3f\n", x, y); } inside = true; px = x; py = y; pz = z; } if (inside) { ip = it->m_point_list.begin(); x = ip->m_x; y = ip->m_y; z = scrap->z + scrap->proj->rshift_z; fprintf(out, " 72\n1\n"); fprintf(out, " 10\n%.3f\n 20\n%.3f\n", px, py); fprintf(out, " 11\n%.3f\n 21\n%.3f\n", x, y); } fprintf(out, " 97\n0\n"); } fprintf(out, " 75\n0\n 76\n1\n 98\n1\n 10\n0.0\n 20\n0.0\n"); } } cmi = cmi->prev_item; } } cbm = cbm->next_item; } cmap = cmap->next_item; } fprintf(out,"%s", DXFpost); fclose(out); #ifdef THDEBUG #else thprintf("done\n"); thtext_inline = false; #endif } therion/thsvg.h0000664000175000017500000000203412430473227012555 0ustar useruser/* * Copyright (C) 2005 Martin Budaj * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thsvg_h #define thsvg_h #include "thlegenddata.h" void thsvg(const char * fname, int, legenddata ldata); std::string escape_html(std::string); #endif therion/SYMBOLS.txt0000664000175000017500000000515012340611142013132 0ustar useruser [Special symbols] hgrid: SM northarrow: SKBB scalebar: SKBB SM vgrid: SM [Point symbols] airdraught: AUT UIS airdraught_summer: UIS airdraught_winter: UIS anastomosis: UIS anchor: SKBB aragonite: NSS archeomaterial: UIS bedrock: ASF blocks: AUT UIS breakdownchoke: AUT NSS bridge: SKBB camp: SKBB cavepearl: SKBB clay: AUT SKBB claychoke: AUT claytree: AUT continuation: UIS crystal: AUT UIS curtain: UIS debris: AUT UIS dig: UIS disk: UIS entrance: AUT UIS fixedladder: SKBB flowstone: UIS flowstonechoke: NSS flute: UIS gradient: AUT BCRA NSS SKBB UIS guano: UIS gypsum: NSS gypsumflower: NSS handrail: SKBB helictite: UIS ice: AUT UIS icepillar: AUT icestalactite: AUT icestalagmite: AUT karren: UIS lowend: NSS UIS moonmilk: UIS narrowend: UIS noequipment: SKBB paleomaterial: UIS pebbles: AUT UIS pillar: AUT UIS pillars: UIS popcorn: UIS raft: NSS raftcone: NSS rimstonedam: ASF rimstonepool: ASF root: ASF rope: SKBB ropeladder: SKBB sand: AUT UIS scallop: UIS sink: AUT SKBB snow: SKBB sodastraw: UIS spring: AUT SKBB stalactite: AUT UIS stalactites: UIS stalagmite: AUT UIS stalagmites: UIS station: SKBB station_fixed: ASF AUT station_natural: ASF station_painted: AUT SKBB station_temporary: ASF AUT SKBB steps: SKBB traverse: SKBB vegetabledebris: ASF viaferrata: SKBB wallcalcite: UIS water: AUT UIS waterflow_intermittent: UIS waterflow_paleo: UIS waterflow_permanent: UIS [Line symbols] arrow: SKBB border_presumed: SKBB border_temporary: SKBB border_visible: SKBB ceilingmeander: NZSS SKBB UIS ceilingstep: NZSS SKBB UIS chimney: NZSS UIS contour: AUT SKBB UIS fixedladder: SKBB floormeander: SKBB floorstep: AUT UIS flowstone: AUT UIS gradient: BCRA UIS handrail: SKBB mapconnection: SKBB moonmilk: UIS overhang: AUT SKBB pit: AUT UIS rockborder: UIS rockedge: UIS rope: SKBB ropeladder: SKBB section: SKBB slope: BCRA SKBB steps: SKBB survey_cave: AUT SKBB UIS survey_surface: SKBB viaferrata: SKBB wall_bedrock: UIS wall_blocks: AUT SKBB wall_clay: AUT SKBB wall_debris: AUT SKBB wall_flowstone: AUT wall_ice: AUT SKBB wall_moonmilk: AUT wall_overlying: AUT wall_pebbles: AUT SKBB wall_pit: AUT wall_presumed: NZSS UIS wall_sand: AUT SKBB wall_underlying: AUT UIS wall_unsurveyed: SKBB waterflow_conjectural: SKBB waterflow_intermittent: SKBB waterflow_permanent: UIS [Area symbols] bedrock: SKBB blocks: AUT SKBB clay: AUT SKBB debris: AUT SKBB UIS dimensions: SKBB flowstone: ASF ice: AUT SKBB moonmilk: SKBB pebbles: AUT SKBB sand: AUT UIS snow: AUT SKBB sump: AUT SKBB UIS water: AUT SKBB UIS therion/loch/0000775000175000017500000000000012450020344012165 5ustar userusertherion/loch/img.c0000664000175000017500000021115212337650112013115 0ustar useruser/* img.c * Routines for reading and writing Survex ".3d" image files * Copyright (C) 1993-2004,2005,2006,2010,2011,2013,2014 Olly Betts * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include "img.h" #define TIMENA "?" #ifdef IMG_HOSTED # define INT32_T int32_t # include "debug.h" # include "filelist.h" # include "filename.h" # include "message.h" # include "useful.h" # define TIMEFMT msg(/*%a,%Y.%m.%d %H:%M:%S %Z*/107) #else # ifdef HAVE_STDINT_H # include # define INT32_T int32_t # else # include # if INT_MAX >= 2147483647 # define INT32_T int # else # define INT32_T long # endif # endif # define TIMEFMT "%a,%Y.%m.%d %H:%M:%S %Z" # define EXT_SVX_3D "3d" # define EXT_SVX_POS "pos" # define FNM_SEP_EXT '.' # define METRES_PER_FOOT 0.3048 /* exact value */ # define xosmalloc(L) malloc((L)) # define xosrealloc(L,S) realloc((L),(S)) # define osfree(P) free((P)) # define osnew(T) (T*)malloc(sizeof(T)) /* in IMG_HOSTED mode, this tests if a filename refers to a directory */ # define fDirectory(X) 0 /* open file FNM with mode MODE, maybe using path PTH and/or extension EXT */ /* path isn't used in img.c, but EXT is */ # define fopenWithPthAndExt(PTH,FNM,EXT,MODE,X) \ ((*(X) = NULL), fopen(FNM,MODE)) # ifndef PUTC # define PUTC(C, FH) putc(C, FH) # endif # ifndef GETC # define GETC(FH) getc(FH) # endif # define fputsnl(S, FH) (fputs((S), (FH)) == EOF ? EOF : putc('\n', (FH))) # define SVX_ASSERT(X) #ifdef __cplusplus # include using std::max; using std::min; #else /* Return max/min of two numbers. */ /* May be defined already (e.g. by Borland C in stdlib.h) */ /* NB Bad news if X or Y has side-effects... */ # ifndef max # define max(X, Y) ((X) > (Y) ? (X) : (Y)) # endif # ifndef min # define min(X, Y) ((X) < (Y) ? (X) : (Y)) # endif #endif static INT32_T get32(FILE *fh) { INT32_T w = GETC(fh); w |= (INT32_T)GETC(fh) << 8l; w |= (INT32_T)GETC(fh) << 16l; w |= (INT32_T)GETC(fh) << 24l; return w; } static void put32(long w, FILE *fh) { PUTC((char)(w), fh); PUTC((char)(w >> 8l), fh); PUTC((char)(w >> 16l), fh); PUTC((char)(w >> 24l), fh); } static short get16(FILE *fh) { short w = GETC(fh); w |= (short)GETC(fh) << 8l; return w; } static void put16(short w, FILE *fh) { PUTC((char)(w), fh); PUTC((char)(w >> 8l), fh); } static char * baseleaf_from_fnm(const char *fnm) { const char *p; const char *q; char * res; size_t len; p = fnm; q = strrchr(p, '/'); if (q) p = q + 1; q = strrchr(p, '\\'); if (q) p = q + 1; q = strrchr(p, FNM_SEP_EXT); if (q) len = (const char *)q - p; else len = strlen(p); res = (char *)xosmalloc(len + 1); if (!res) return NULL; memcpy(res, p, len); res[len] = '\0'; return res; } #endif static char * my_strdup(const char *str); static time_t mktime_with_tz(struct tm * tm, const char * tz) { time_t r; char * old_tz = getenv("TZ"); #ifdef _MSC_VER if (old_tz) { old_tz = my_strdup(old_tz); if (!old_tz) return (time_t)-1; } if (_putenv_s("TZ", tz) != 0) { osfree(old_tz); return (time_t)-1; } #elif defined HAVE_SETENV if (old_tz) { old_tz = my_strdup(old_tz); if (!old_tz) return (time_t)-1; } if (setenv("TZ", tz, 1) < 0) { osfree(old_tz); return (time_t)-1; } #else char * p; if (old_tz) { size_t len = strlen(old_tz) + 1; p = (char *)xosmalloc(len + 3); if (!p) return (time_t)-1; memcpy(p, "TZ=", 3); memcpy(p + 3, tz, len); old_tz = p; } p = (char *)xosmalloc(strlen(tz) + 4); if (!p) { osfree(old_tz); return (time_t)-1; } memcpy(p, "TZ=", 3); strcpy(p + 3, tz); if (putenv(p) != 0) { osfree(p); osfree(old_tz); return (time_t)-1; } #define CLEANUP() osfree(p) #endif tzset(); r = mktime(tm); if (old_tz) { #ifdef _MSC_VER _putenv_s("TZ", old_tz); #elif !defined HAVE_SETENV putenv(old_tz); #else setenv("TZ", old_tz, 1); #endif osfree(old_tz); } else { #ifdef _MSC_VER _putenv_s("TZ", ""); #elif !defined HAVE_UNSETENV putenv((char*)"TZ"); #else unsetenv("TZ"); #endif } #ifdef CLEANUP CLEANUP(); #undef CLEANUP #endif return r; } static unsigned short getu16(FILE *fh) { return (unsigned short)get16(fh); } #include #if !defined HAVE_LROUND && !defined HAVE_DECL_LROUND /* The autoconf tests are not in use, but C99 and C++11 both added lround(), * so set HAVE_LROUND and HAVE_DECL_LROUND conservatively based on the language * standard version the compiler claims to support. */ # if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || \ (defined __cplusplus && __cplusplus >= 201103L) # define HAVE_LROUND 1 # define HAVE_DECL_LROUND 1 # endif #endif #ifdef HAVE_LROUND # if defined HAVE_DECL_LROUND && !HAVE_DECL_LROUND /* On older systems, the prototype may be missing. */ extern long lround(double); # endif # define my_lround lround #else static long my_lround(double x) { return (x >= 0.0) ? (long)(x + 0.5) : -(long)(0.5 - x); } #endif /* portable case insensitive string compare */ #if defined(strcasecmp) || defined(HAVE_STRCASECMP) # define my_strcasecmp strcasecmp #else static int my_strcasecmp(const char *s1, const char *s2) { unsigned char c1, c2; do { c1 = *s1++; c2 = *s2++; } while (c1 && toupper(c1) == toupper(c2)); /* now calculate real difference */ return c1 - c2; } #endif unsigned int img_output_version = IMG_VERSION_MAX; static img_errcode img_errno = IMG_NONE; #define FILEID "Survex 3D Image File" #define EXT_PLT "plt" #define EXT_PLF "plf" /* Attempt to string paste to ensure we are passed a literal string */ #define LITLEN(S) (sizeof(S"") - 1) /* Fake "version numbers" for non-3d formats we can read. */ #define VERSION_CMAP_SHOT -4 #define VERSION_CMAP_STATION -3 #define VERSION_COMPASS_PLT -2 #define VERSION_SURVEX_POS -1 static char * my_strdup(const char *str) { char *p; size_t len = strlen(str) + 1; p = (char *)xosmalloc(len); if (p) memcpy(p, str, len); return p; } static char * getline_alloc(FILE *fh) { int ch; size_t i = 0; size_t len = 16; char *buf = (char *)xosmalloc(len); if (!buf) return NULL; ch = GETC(fh); while (ch != '\n' && ch != '\r' && ch != EOF) { buf[i++] = ch; if (i == len - 1) { char *p; len += len; p = (char *)xosrealloc(buf, len); if (!p) { osfree(buf); return NULL; } buf = p; } ch = GETC(fh); } if (ch == '\n' || ch == '\r') { int otherone = ch ^ ('\n' ^ '\r'); ch = GETC(fh); /* if it's not the other eol character, put it back */ if (ch != otherone) ungetc(ch, fh); } buf[i++] = '\0'; return buf; } img_errcode img_error(void) { return img_errno; } static int check_label_space(img *pimg, size_t len) { if (len > pimg->buf_len) { char *b = (char *)xosrealloc(pimg->label_buf, len); if (!b) return 0; pimg->label = (pimg->label - pimg->label_buf) + b; pimg->label_buf = b; pimg->buf_len = len; } return 1; } #define has_ext(F,L,E) ((L) > LITLEN(E) + 1 &&\ (F)[(L) - LITLEN(E) - 1] == FNM_SEP_EXT &&\ my_strcasecmp((F) + (L) - LITLEN(E), E) == 0) img * img_open_survey(const char *fnm, const char *survey) { img *pimg; size_t len; char buf[LITLEN(FILEID) + 9]; int ch; if (fDirectory(fnm)) { img_errno = IMG_DIRECTORY; return NULL; } pimg = osnew(img); if (pimg == NULL) { img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->buf_len = 257; pimg->label_buf = (char *)xosmalloc(pimg->buf_len); if (!pimg->label_buf) { osfree(pimg); img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->fh = fopenWithPthAndExt("", fnm, EXT_SVX_3D, "rb", &(pimg->filename_opened)); if (pimg->fh == NULL) { osfree(pimg->label_buf); osfree(pimg); img_errno = IMG_FILENOTFOUND; return NULL; } pimg->fRead = 1; /* reading from this file */ img_errno = IMG_NONE; pimg->flags = 0; /* for version >= 3 we use label_buf to store the prefix for reuse */ /* for VERSION_COMPASS_PLT, 0 value indicates we haven't * entered a survey yet */ /* for VERSION_CMAP_SHOT, we store the last station here * to detect whether we MOVE or LINE */ pimg->label_len = 0; pimg->label_buf[0] = '\0'; pimg->survey = NULL; pimg->survey_len = 0; pimg->separator = '.'; #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; #endif pimg->is_extended_elevation = 0; pimg->style = pimg->oldstyle = img_STYLE_UNKNOWN; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; pimg->title = pimg->datestamp = NULL; pimg->datestamp_numeric = (time_t)-1; if (survey) { len = strlen(survey); if (len) { if (survey[len - 1] == '.') len--; if (len) { char *p; pimg->survey = (char *)xosmalloc(len + 2); if (!pimg->survey) { img_errno = IMG_OUTOFMEMORY; goto error; } memcpy(pimg->survey, survey, len); /* Set title to leaf survey name */ pimg->survey[len] = '\0'; p = strchr(pimg->survey, '.'); if (p) p++; else p = pimg->survey; pimg->title = my_strdup(p); if (!pimg->title) { img_errno = IMG_OUTOFMEMORY; goto error; } pimg->survey[len] = '.'; pimg->survey[len + 1] = '\0'; } } pimg->survey_len = len; } /* [VERSION_COMPASS_PLT, VERSION_CMAP_STATION, VERSION_CMAP_SHOT] pending * IMG_LINE or IMG_MOVE - both have 4 added. * [VERSION_SURVEX_POS] already skipped heading line, or there wasn't one * [version 0] not in the middle of a 'LINE' command * [version >= 3] not in the middle of turning a LINE into a MOVE */ pimg->pending = 0; len = strlen(fnm); if (has_ext(fnm, len, EXT_SVX_POS)) { pos_file: pimg->version = VERSION_SURVEX_POS; if (!pimg->survey) pimg->title = baseleaf_from_fnm(fnm); pimg->datestamp = my_strdup(TIMENA); if (!pimg->datestamp) { img_errno = IMG_OUTOFMEMORY; goto error; } pimg->start = 0; return pimg; } if (has_ext(fnm, len, EXT_PLT) || has_ext(fnm, len, EXT_PLF)) { long fpos; plt_file: pimg->version = VERSION_COMPASS_PLT; /* Spaces aren't legal in Compass station names, but dots are, so * use space as the level separator */ pimg->separator = ' '; pimg->start = 0; if (!pimg->survey) pimg->title = baseleaf_from_fnm(fnm); pimg->datestamp = my_strdup(TIMENA); if (!pimg->datestamp) { img_errno = IMG_OUTOFMEMORY; goto error; } while (1) { ch = GETC(pimg->fh); switch (ch) { case '\x1a': fseek(pimg->fh, -1, SEEK_CUR); /* FALL THRU */ case EOF: pimg->start = ftell(pimg->fh); return pimg; case 'N': { char *line, *q; fpos = ftell(pimg->fh) - 1; if (!pimg->survey) { /* FIXME : if there's only one survey in the file, it'd be nice * to use its description as the title here... */ ungetc('N', pimg->fh); pimg->start = fpos; return pimg; } line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } len = 0; while (line[len] > 32) ++len; if (pimg->survey_len != len || memcmp(line, pimg->survey, len) != 0) { osfree(line); continue; } q = strchr(line + len, 'C'); if (q && q[1]) { osfree(pimg->title); pimg->title = my_strdup(q + 1); } else if (!pimg->title) { pimg->title = my_strdup(pimg->label); } osfree(line); if (!pimg->title) { img_errno = IMG_OUTOFMEMORY; goto error; } if (!pimg->start) pimg->start = fpos; fseek(pimg->fh, pimg->start, SEEK_SET); return pimg; } case 'M': case 'D': pimg->start = ftell(pimg->fh) - 1; break; } while (ch != '\n' && ch != '\r') { ch = GETC(pimg->fh); } } } /* Although these are often referred to as "CMAP .XYZ files", it seems * that actually, the extension .XYZ isn't used, rather .SHT (shot * variant, produced by CMAP v16 and later), .UNA (unadjusted) and * .ADJ (adjusted) extensions are. Since img has long checked for * .XYZ, we continue to do so in case anyone is relying on it. */ if (has_ext(fnm, len, "sht") || has_ext(fnm, len, "adj") || has_ext(fnm, len, "una") || has_ext(fnm, len, "xyz")) { char *line; xyz_file: /* Spaces aren't legal in CMAP station names, but dots are, so * use space as the level separator. */ pimg->separator = ' '; line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } /* There doesn't seem to be a spec for what happens after 1999 with cmap * files, so this code allows for: * * 21xx -> xx (up to 2150) * * 21xx -> 1xx (up to 2199) * * full year being specified instead of 2 digits */ len = strlen(line); if (len > 59) { /* Don't just truncate at column 59, allow for a > 2 digit year. */ char * p = strstr(line + len, "Page"); if (p) { while (p > line && p[-1] == ' ') --p; *p = '\0'; len = p - line; } else { line[59] = '\0'; } } if (len > 45) { /* YY/MM/DD HH:MM */ struct tm tm; unsigned long v; char * p; pimg->datestamp = my_strdup(line + 45); p = pimg->datestamp; v = strtoul(p, &p, 10); if (v <= 50) { /* In the absence of a spec for cmap files, assume <= 50 means 21st * century. */ v += 2000; } else if (v < 200) { /* Map 100-199 to 21st century. */ v += 1900; } if (v == ULONG_MAX || *p++ != '/') goto bad_cmap_date; tm.tm_year = v - 1900; v = strtoul(p, &p, 10); if (v < 1 || v > 12 || *p++ != '/') goto bad_cmap_date; tm.tm_mon = v - 1; v = strtoul(p, &p, 10); if (v < 1 || v > 31 || *p++ != ' ') goto bad_cmap_date; tm.tm_mday = v; v = strtoul(p, &p, 10); if (v >= 24 || *p++ != ':') goto bad_cmap_date; tm.tm_hour = v; v = strtoul(p, &p, 10); if (v >= 60) goto bad_cmap_date; tm.tm_min = v; if (*p == ':') { v = strtoul(p + 1, &p, 10); if (v > 60) goto bad_cmap_date; tm.tm_sec = v; } else { tm.tm_sec = 0; } tm.tm_isdst = 0; /* We have no indication of what timezone this timestamp is in. It's * probably local time for whoever processed the data, so just assume * UTC, which is at least fairly central in the possibilities. */ pimg->datestamp_numeric = mktime_with_tz(&tm, ""); } else { pimg->datestamp = my_strdup(TIMENA); } bad_cmap_date: if (strncmp(line, " Cave Survey Data Processed by CMAP ", LITLEN(" Cave Survey Data Processed by CMAP ")) == 0) { len = 0; } else { if (len > 45) { line[45] = '\0'; len = 45; } while (len > 2 && line[len - 1] == ' ') --len; if (len > 2) { line[len] = '\0'; pimg->title = my_strdup(line + 2); } } if (len <= 2) pimg->title = baseleaf_from_fnm(fnm); osfree(line); if (!pimg->datestamp || !pimg->title) { img_errno = IMG_OUTOFMEMORY; goto error; } line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } if (line[0] != ' ' || (line[1] != 'S' && line[1] != 'O')) { img_errno = IMG_BADFORMAT; goto error; } if (line[1] == 'S') { pimg->version = VERSION_CMAP_STATION; } else { pimg->version = VERSION_CMAP_SHOT; } osfree(line); line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; goto error; } if (line[0] != ' ' || line[1] != '-') { img_errno = IMG_BADFORMAT; goto error; } osfree(line); pimg->start = ftell(pimg->fh); return pimg; } if (fread(buf, LITLEN(FILEID) + 1, 1, pimg->fh) != 1 || memcmp(buf, FILEID"\n", LITLEN(FILEID) + 1) != 0) { if (fread(buf + LITLEN(FILEID) + 1, 8, 1, pimg->fh) == 1 && memcmp(buf, FILEID"\r\nv0.01\r\n", LITLEN(FILEID) + 9) == 0) { /* v0 3d file with DOS EOLs */ pimg->version = 0; goto v03d; } rewind(pimg->fh); if (buf[1] == ' ') { if (buf[0] == ' ') { /* Looks like a CMAP .xyz file ... */ goto xyz_file; } else if (strchr("ZSNF", buf[0])) { /* Looks like a Compass .plt file ... */ /* Almost certainly it'll start "Z " */ goto plt_file; } } if (buf[0] == '(') { /* Looks like a Survex .pos file ... */ goto pos_file; } img_errno = IMG_BADFORMAT; goto error; } /* check file format version */ ch = GETC(pimg->fh); pimg->version = 0; if (tolower(ch) == 'b') { /* binary file iff B/b prefix */ pimg->version = 1; ch = GETC(pimg->fh); } if (ch != 'v') { img_errno = IMG_BADFORMAT; goto error; } ch = GETC(pimg->fh); if (ch == '0') { if (fread(buf, 4, 1, pimg->fh) != 1 || memcmp(buf, ".01\n", 4) != 0) { img_errno = IMG_BADFORMAT; goto error; } /* nothing special to do */ } else if (pimg->version == 0) { if (ch < '2' || ch > '0' + IMG_VERSION_MAX || GETC(pimg->fh) != '\n') { img_errno = IMG_TOONEW; goto error; } pimg->version = ch - '0'; } else { img_errno = IMG_BADFORMAT; goto error; } v03d: if (!pimg->title) pimg->title = getline_alloc(pimg->fh); else osfree(getline_alloc(pimg->fh)); pimg->datestamp = getline_alloc(pimg->fh); if (!pimg->title || !pimg->datestamp) { img_errno = IMG_OUTOFMEMORY; error: osfree(pimg->title); osfree(pimg->datestamp); osfree(pimg->filename_opened); fclose(pimg->fh); osfree(pimg); return NULL; } if (pimg->version >= 8) { int flags = GETC(pimg->fh); if (flags & img_FFLAG_EXTENDED) pimg->is_extended_elevation = 1; } else { len = strlen(pimg->title); if (len > 11 && strcmp(pimg->title + len - 11, " (extended)") == 0) { pimg->title[len - 11] = '\0'; pimg->is_extended_elevation = 1; } } if (pimg->datestamp[0] == '@') { unsigned long v; char * p; errno = 0; v = strtoul(pimg->datestamp + 1, &p, 10); if (errno == 0 && *p == '\0') pimg->datestamp_numeric = v; /* FIXME: We're assuming here that the C time_t epoch is 1970, which is * true for Unix-like systems, Mac OS X and Windows, but isn't guaranteed * by ISO C. */ } else { /* %a,%Y.%m.%d %H:%M:%S %Z */ struct tm tm; unsigned long v; char * p = pimg->datestamp; while (isalpha((unsigned char)*p)) ++p; if (*p == ',') ++p; while (isspace((unsigned char)*p)) ++p; v = strtoul(p, &p, 10); if (v == ULONG_MAX || *p++ != '.') goto bad_3d_date; tm.tm_year = v - 1900; v = strtoul(p, &p, 10); if (v < 1 || v > 12 || *p++ != '.') goto bad_3d_date; tm.tm_mon = v - 1; v = strtoul(p, &p, 10); if (v < 1 || v > 31 || *p++ != ' ') goto bad_3d_date; tm.tm_mday = v; v = strtoul(p, &p, 10); if (v >= 24 || *p++ != ':') goto bad_3d_date; tm.tm_hour = v; v = strtoul(p, &p, 10); if (v >= 60 || *p++ != ':') goto bad_3d_date; tm.tm_min = v; v = strtoul(p, &p, 10); if (v > 60) goto bad_3d_date; tm.tm_sec = v; tm.tm_isdst = 0; while (isspace((unsigned char)*p)) ++p; /* p now points to the timezone string. * * However, it's likely to be a string like "BST", and such strings can * be ambiguous (BST could be UTC+1 or UTC+6), so it is impossible to * reliably convert in all cases. Just pass what we have to tzset() - if * it doesn't handle it, UTC will be used. */ pimg->datestamp_numeric = mktime_with_tz(&tm, p); } bad_3d_date: pimg->start = ftell(pimg->fh); return pimg; } int img_rewind(img *pimg) { if (!pimg->fRead) { img_errno = IMG_WRITEERROR; return 0; } if (fseek(pimg->fh, pimg->start, SEEK_SET) != 0) { img_errno = IMG_READERROR; return 0; } clearerr(pimg->fh); /* [VERSION_SURVEX_POS] already skipped heading line, or there wasn't one * [version 0] not in the middle of a 'LINE' command * [version >= 3] not in the middle of turning a LINE into a MOVE */ pimg->pending = 0; img_errno = IMG_NONE; /* for version >= 3 we use label_buf to store the prefix for reuse */ /* for VERSION_COMPASS_PLT, 0 value indicates we haven't entered a survey * yet */ /* for VERSION_CMAP_SHOT, we store the last station here to detect whether * we MOVE or LINE */ pimg->label_len = 0; pimg->style = img_STYLE_UNKNOWN; return 1; } img * img_open_write(const char *fnm, char *title, int flags) { time_t tm; img *pimg; if (fDirectory(fnm)) { img_errno = IMG_DIRECTORY; return NULL; } pimg = osnew(img); if (pimg == NULL) { img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->buf_len = 257; pimg->label_buf = (char *)xosmalloc(pimg->buf_len); if (!pimg->label_buf) { osfree(pimg); img_errno = IMG_OUTOFMEMORY; return NULL; } pimg->fh = fopen(fnm, "wb"); if (!pimg->fh) { osfree(pimg->label_buf); osfree(pimg); img_errno = IMG_CANTOPENOUT; return NULL; } pimg->filename_opened = NULL; /* Output image file header */ fputs("Survex 3D Image File\n", pimg->fh); /* file identifier string */ if (img_output_version < 2) { pimg->version = 1; fputs("Bv0.01\n", pimg->fh); /* binary file format version number */ } else { pimg->version = (img_output_version > IMG_VERSION_MAX) ? IMG_VERSION_MAX : img_output_version; fprintf(pimg->fh, "v%d\n", pimg->version); /* file format version no. */ } fputs(title, pimg->fh); if (pimg->version < 8 && (flags & img_FFLAG_EXTENDED)) { /* Older format versions append " (extended)" to the title to mark * extended elevations. */ size_t len = strlen(title); if (len < 11 || strcmp(title + len - 11, " (extended)") != 0) fputs(" (extended)", pimg->fh); } PUTC('\n', pimg->fh); tm = time(NULL); if (tm == (time_t)-1) { fputsnl(TIMENA, pimg->fh); } else if (pimg->version <= 7) { char date[256]; /* output current date and time in format specified */ strftime(date, 256, TIMEFMT, localtime(&tm)); fputsnl(date, pimg->fh); } else { fprintf(pimg->fh, "@%ld\n", (long)tm); } if (pimg->version >= 8) { /* Clear bit one in case anyone has been passing true for fBinary. */ flags &=~ 1; PUTC(flags, pimg->fh); } #if 0 if (img_output_version >= 5) { static const unsigned char codelengths[32] = { 4, 8, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; fwrite(codelengths, 32, 1, pimg->fh); } #endif pimg->fRead = 0; /* writing to this file */ img_errno = IMG_NONE; /* for version >= 3 we use label_buf to store the prefix for reuse */ pimg->label_buf[0] = '\0'; pimg->label_len = 0; #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; pimg->olddate1 = pimg->olddate2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; pimg->olddays1 = pimg->olddays2 = -1; #endif pimg->style = pimg->oldstyle = img_STYLE_UNKNOWN; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; pimg->n_legs = 0; pimg->length = 0.0; pimg->E = pimg->H = pimg->V = 0.0; /* Don't check for write errors now - let img_close() report them... */ return pimg; } static void read_xyz_station_coords(img_point *pt, const char *line) { char num[12]; memcpy(num, line + 6, 9); num[9] = '\0'; pt->x = atof(num) / METRES_PER_FOOT; memcpy(num, line + 15, 9); pt->y = atof(num) / METRES_PER_FOOT; memcpy(num, line + 24, 8); num[8] = '\0'; pt->z = atof(num) / METRES_PER_FOOT; } static void read_xyz_shot_coords(img_point *pt, const char *line) { char num[12]; memcpy(num, line + 40, 10); num[10] = '\0'; pt->x = atof(num) / METRES_PER_FOOT; memcpy(num, line + 50, 10); pt->y = atof(num) / METRES_PER_FOOT; memcpy(num, line + 60, 9); num[9] = '\0'; pt->z = atof(num) / METRES_PER_FOOT; } static void subtract_xyz_shot_deltas(img_point *pt, const char *line) { char num[12]; memcpy(num, line + 15, 9); num[9] = '\0'; pt->x -= atof(num) / METRES_PER_FOOT; memcpy(num, line + 24, 8); num[8] = '\0'; pt->y -= atof(num) / METRES_PER_FOOT; memcpy(num, line + 32, 8); pt->z -= atof(num) / METRES_PER_FOOT; } static int read_coord(FILE *fh, img_point *pt) { SVX_ASSERT(fh); SVX_ASSERT(pt); pt->x = get32(fh) / 100.0; pt->y = get32(fh) / 100.0; pt->z = get32(fh) / 100.0; if (ferror(fh) || feof(fh)) { img_errno = feof(fh) ? IMG_BADFORMAT : IMG_READERROR; return 0; } return 1; } static int skip_coord(FILE *fh) { return (fseek(fh, 12, SEEK_CUR) == 0); } static int read_v3label(img *pimg) { char *q; long len = GETC(pimg->fh); if (len == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (len == 0xfe) { len += get16(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } } else if (len == 0xff) { len = get32(pimg->fh); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (feof(pimg->fh) || len < 0xfe + 0xffff) { img_errno = IMG_BADFORMAT; return img_BAD; } } if (!check_label_space(pimg, pimg->label_len + len + 1)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } q = pimg->label_buf + pimg->label_len; pimg->label_len += len; if (len && fread(q, len, 1, pimg->fh) != 1) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } q[len] = '\0'; return 0; } static int read_v8label(img *pimg, int common_flag, size_t common_val) { char *q; size_t del, add; if (common_flag) { if (common_val == 0) return 0; add = del = common_val; } else { int ch = GETC(pimg->fh); if (ch == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (ch != 0x00) { del = ch >> 4; add = ch & 0x0f; } else { ch = GETC(pimg->fh); if (ch == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (ch != 0xff) { del = ch; } else { del = get32(pimg->fh); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } } ch = GETC(pimg->fh); if (ch == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (ch != 0xff) { add = ch; } else { add = get32(pimg->fh); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } } } if (add > del && !check_label_space(pimg, pimg->label_len + add - del + 1)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } if (del > pimg->label_len) { img_errno = IMG_BADFORMAT; return img_BAD; } pimg->label_len -= del; q = pimg->label_buf + pimg->label_len; pimg->label_len += add; if (add && fread(q, add, 1, pimg->fh) != 1) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } q[add] = '\0'; return 0; } static int img_read_item_new(img *pimg, img_point *p); static int img_read_item_v3to7(img *pimg, img_point *p); static int img_read_item_ancient(img *pimg, img_point *p); static int img_read_item_ascii_wrapper(img *pimg, img_point *p); static int img_read_item_ascii(img *pimg, img_point *p); int img_read_item(img *pimg, img_point *p) { pimg->flags = 0; if (pimg->version >= 8) { return img_read_item_new(pimg, p); } else if (pimg->version >= 3) { return img_read_item_v3to7(pimg, p); } else if (pimg->version >= 1) { return img_read_item_ancient(pimg, p); } else { return img_read_item_ascii_wrapper(pimg, p); } } static int img_read_item_new(img *pimg, img_point *p) { int result; int opt; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; if (pimg->pending >= 0x40) { if (pimg->pending == 256) { pimg->pending = 0; return img_XSECT_END; } *p = pimg->mv; pimg->flags = (int)(pimg->pending) & 0x3f; pimg->pending = 0; return img_LINE; } again3: /* label to goto if we get a prefix, date, or lrud */ pimg->label = pimg->label_buf; opt = GETC(pimg->fh); if (opt == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (opt >> 6 == 0) { if (opt <= 4) { if (opt == 0 && pimg->style == 0) return img_STOP; /* end of data marker */ /* STYLE */ pimg->style = opt; goto again3; } if (opt >= 0x10) { switch (opt) { case 0x10: { /* No date info */ #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; #endif break; } case 0x11: { /* Single date */ int days1 = (int)getu16(pimg->fh); #if IMG_API_VERSION == 0 pimg->date2 = pimg->date1 = (days1 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days2 = pimg->days1 = days1; #endif break; } case 0x12: { /* Date range (short) */ int days1 = (int)getu16(pimg->fh); int days2 = days1 + GETC(pimg->fh) + 1; #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif break; } case 0x13: { /* Date range (long) */ int days1 = (int)getu16(pimg->fh); int days2 = (int)getu16(pimg->fh); #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif break; } case 0x1f: /* Error info */ pimg->n_legs = get32(pimg->fh); pimg->length = get32(pimg->fh) / 100.0; pimg->E = get32(pimg->fh) / 100.0; pimg->H = get32(pimg->fh) / 100.0; pimg->V = get32(pimg->fh) / 100.0; return img_ERROR_INFO; case 0x30: case 0x31: /* LRUD */ case 0x32: case 0x33: /* Big LRUD! */ if (read_v8label(pimg, 0, 0) == img_BAD) return img_BAD; pimg->flags = (int)opt & 0x01; if (opt < 0x32) { pimg->l = get16(pimg->fh) / 100.0; pimg->r = get16(pimg->fh) / 100.0; pimg->u = get16(pimg->fh) / 100.0; pimg->d = get16(pimg->fh) / 100.0; } else { pimg->l = get32(pimg->fh) / 100.0; pimg->r = get32(pimg->fh) / 100.0; pimg->u = get32(pimg->fh) / 100.0; pimg->d = get32(pimg->fh) / 100.0; } if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { return img_XSECT_END; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } /* If this is the last cross-section in this passage, set * pending so we return img_XSECT_END next time. */ if (pimg->flags & 0x01) { pimg->pending = 256; pimg->flags &= ~0x01; } return img_XSECT; default: /* 0x25 - 0x2f and 0x34 - 0x3f are currently unallocated. */ img_errno = IMG_BADFORMAT; return img_BAD; } goto again3; } if (opt != 15) { /* 1-14 and 16-31 reserved */ img_errno = IMG_BADFORMAT; return img_BAD; } result = img_MOVE; } else if (opt >= 0x80) { if (read_v8label(pimg, 0, 0) == img_BAD) return img_BAD; result = img_LABEL; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { if (!skip_coord(pimg->fh)) return img_BAD; pimg->pending = 0; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } pimg->flags = (int)opt & 0x7f; } else if ((opt >> 6) == 1) { if (read_v8label(pimg, opt & 0x20, 0) == img_BAD) return img_BAD; result = img_LINE; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l) != 0 || !(s[l] == '.' || s[l] == '\0')) { if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = 15; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } if (pimg->pending) { *p = pimg->mv; if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = opt; return img_MOVE; } pimg->flags = (int)opt & 0x1f; } else { img_errno = IMG_BADFORMAT; return img_BAD; } if (!read_coord(pimg->fh, p)) return img_BAD; pimg->pending = 0; return result; } static int img_read_item_v3to7(img *pimg, img_point *p) { int result; int opt; pimg->l = pimg->r = pimg->u = pimg->d = -1.0; if (pimg->pending == 256) { pimg->pending = 0; return img_XSECT_END; } if (pimg->pending >= 0x80) { *p = pimg->mv; pimg->flags = (int)(pimg->pending) & 0x3f; pimg->pending = 0; return img_LINE; } again3: /* label to goto if we get a prefix, date, or lrud */ pimg->label = pimg->label_buf; opt = GETC(pimg->fh); if (opt == EOF) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } switch (opt >> 6) { case 0: if (opt == 0) { if (!pimg->label_len) return img_STOP; /* end of data marker */ pimg->label_len = 0; goto again3; } if (opt < 15) { /* 1-14 mean trim that many levels from current prefix */ int c; if (pimg->label_len <= 17) { /* zero prefix using "0" */ img_errno = IMG_BADFORMAT; return img_BAD; } /* extra - 1 because label_len points to one past the end */ c = pimg->label_len - 17 - 1; while (pimg->label_buf[c] != '.' || --opt > 0) { if (--c < 0) { /* zero prefix using "0" */ img_errno = IMG_BADFORMAT; return img_BAD; } } c++; pimg->label_len = c; goto again3; } if (opt == 15) { result = img_MOVE; break; } if (opt >= 0x20) { switch (opt) { case 0x20: /* Single date */ if (pimg->version < 7) { int date1 = get32(pimg->fh); #if IMG_API_VERSION == 0 pimg->date2 = pimg->date1 = date1; #else /* IMG_API_VERSION == 1 */ if (date1 != 0) { pimg->days2 = pimg->days1 = (date1 / 86400) + 25567; } else { pimg->days2 = pimg->days1 = -1; } #endif } else { int days1 = (int)getu16(pimg->fh); #if IMG_API_VERSION == 0 pimg->date2 = pimg->date1 = (days1 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days2 = pimg->days1 = days1; #endif } break; case 0x21: /* Date range (short for v7+) */ if (pimg->version < 7) { INT32_T date1 = get32(pimg->fh); INT32_T date2 = get32(pimg->fh); #if IMG_API_VERSION == 0 pimg->date1 = date1; pimg->date2 = date2; #else /* IMG_API_VERSION == 1 */ pimg->days1 = (date1 / 86400) + 25567; pimg->days2 = (date2 / 86400) + 25567; #endif } else { int days1 = (int)getu16(pimg->fh); int days2 = days1 + GETC(pimg->fh) + 1; #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif } break; case 0x22: /* Error info */ pimg->n_legs = get32(pimg->fh); pimg->length = get32(pimg->fh) / 100.0; pimg->E = get32(pimg->fh) / 100.0; pimg->H = get32(pimg->fh) / 100.0; pimg->V = get32(pimg->fh) / 100.0; if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } return img_ERROR_INFO; case 0x23: { /* v7+: Date range (long) */ int days1; int days2; if (pimg->version < 7) { img_errno = IMG_BADFORMAT; return img_BAD; } days1 = (int)getu16(pimg->fh); days2 = (int)getu16(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } #if IMG_API_VERSION == 0 pimg->date1 = (days1 - 25567) * 86400; pimg->date2 = (days2 - 25567) * 86400; #else /* IMG_API_VERSION == 1 */ pimg->days1 = days1; pimg->days2 = days2; #endif break; } case 0x24: { /* v7+: No date info */ #if IMG_API_VERSION == 0 pimg->date1 = pimg->date2 = 0; #else /* IMG_API_VERSION == 1 */ pimg->days1 = pimg->days2 = -1; #endif break; } case 0x30: case 0x31: /* LRUD */ case 0x32: case 0x33: /* Big LRUD! */ if (read_v3label(pimg) == img_BAD) return img_BAD; pimg->flags = (int)opt & 0x01; if (opt < 0x32) { pimg->l = get16(pimg->fh) / 100.0; pimg->r = get16(pimg->fh) / 100.0; pimg->u = get16(pimg->fh) / 100.0; pimg->d = get16(pimg->fh) / 100.0; } else { pimg->l = get32(pimg->fh) / 100.0; pimg->r = get32(pimg->fh) / 100.0; pimg->u = get32(pimg->fh) / 100.0; pimg->d = get32(pimg->fh) / 100.0; } if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { return img_XSECT_END; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } /* If this is the last cross-section in this passage, set * pending so we return img_XSECT_END next time. */ if (pimg->flags & 0x01) { pimg->pending = 256; pimg->flags &= ~0x01; } return img_XSECT; default: /* 0x25 - 0x2f and 0x34 - 0x3f are currently unallocated. */ img_errno = IMG_BADFORMAT; return img_BAD; } if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } goto again3; } /* 16-31 mean remove (n - 15) characters from the prefix */ /* zero prefix using 0 */ if (pimg->label_len <= (size_t)(opt - 15)) { img_errno = IMG_BADFORMAT; return img_BAD; } pimg->label_len -= (opt - 15); goto again3; case 1: if (read_v3label(pimg) == img_BAD) return img_BAD; result = img_LABEL; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l + 1) != 0) { if (!skip_coord(pimg->fh)) return img_BAD; pimg->pending = 0; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } pimg->flags = (int)opt & 0x3f; break; case 2: if (read_v3label(pimg) == img_BAD) return img_BAD; result = img_LINE; if (pimg->survey_len) { size_t l = pimg->survey_len; const char *s = pimg->label_buf; if (strncmp(pimg->survey, s, l) != 0 || !(s[l] == '.' || s[l] == '\0')) { if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = 15; goto again3; } pimg->label += l; /* skip the dot if there */ if (*pimg->label) pimg->label++; } if (pimg->pending) { *p = pimg->mv; if (!read_coord(pimg->fh, &(pimg->mv))) return img_BAD; pimg->pending = opt; return img_MOVE; } pimg->flags = (int)opt & 0x3f; break; default: img_errno = IMG_BADFORMAT; return img_BAD; } if (!read_coord(pimg->fh, p)) return img_BAD; pimg->pending = 0; return result; } static int img_read_item_ancient(img *pimg, img_point *p) { int result; static long opt_lookahead = 0; static img_point pt = { 0.0, 0.0, 0.0 }; long opt; again: /* label to goto if we get a cross */ pimg->label = pimg->label_buf; pimg->label[0] = '\0'; if (pimg->version == 1) { if (opt_lookahead) { opt = opt_lookahead; opt_lookahead = 0; } else { opt = get32(pimg->fh); } } else { opt = GETC(pimg->fh); } if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } switch (opt) { case -1: case 0: return img_STOP; /* end of data marker */ case 1: /* skip coordinates */ if (!skip_coord(pimg->fh)) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } goto again; case 2: case 3: { size_t len; result = img_LABEL; if (!fgets(pimg->label_buf, pimg->buf_len, pimg->fh)) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } if (pimg->label[0] == '\\') pimg->label++; len = strlen(pimg->label); if (len == 0 || pimg->label[len - 1] != '\n') { img_errno = IMG_BADFORMAT; return img_BAD; } /* Ignore empty labels in some .3d files (caused by a bug) */ if (len == 1) goto again; pimg->label[len - 1] = '\0'; pimg->flags = img_SFLAG_UNDERGROUND; /* no flags given... */ if (opt == 2) goto done; break; } case 6: case 7: { long len; result = img_LABEL; if (opt == 7) pimg->flags = GETC(pimg->fh); else pimg->flags = img_SFLAG_UNDERGROUND; /* no flags given... */ len = get32(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } /* Ignore empty labels in some .3d files (caused by a bug) */ if (len == 0) goto again; if (!check_label_space(pimg, len + 1)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } if (fread(pimg->label_buf, len, 1, pimg->fh) != 1) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } pimg->label_buf[len] = '\0'; break; } case 4: result = img_MOVE; break; case 5: result = img_LINE; break; default: switch ((int)opt & 0xc0) { case 0x80: pimg->flags = (int)opt & 0x3f; result = img_LINE; break; case 0x40: { char *q; pimg->flags = (int)opt & 0x3f; result = img_LABEL; if (!fgets(pimg->label_buf, pimg->buf_len, pimg->fh)) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } q = pimg->label_buf + strlen(pimg->label_buf) - 1; /* Ignore empty-labels in some .3d files (caused by a bug) */ if (q == pimg->label_buf) goto again; if (*q != '\n') { img_errno = IMG_BADFORMAT; return img_BAD; } *q = '\0'; break; } default: img_errno = IMG_BADFORMAT; return img_BAD; } break; } if (!read_coord(pimg->fh, &pt)) return img_BAD; if (result == img_LABEL && pimg->survey_len) { if (strncmp(pimg->label, pimg->survey, pimg->survey_len + 1) != 0) goto again; pimg->label += pimg->survey_len + 1; } done: *p = pt; if (result == img_MOVE && pimg->version == 1) { /* peek at next code and see if it's an old-style label */ opt_lookahead = get32(pimg->fh); if (feof(pimg->fh)) { img_errno = IMG_BADFORMAT; return img_BAD; } if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (opt_lookahead == 2) return img_read_item_ancient(pimg, p); } return result; } static int img_read_item_ascii_wrapper(img *pimg, img_point *p) { /* We need to set the default locale for fscanf() to work on * numbers with "." as decimal point. */ int result; char * current_locale = my_strdup(setlocale(LC_NUMERIC, NULL)); setlocale(LC_NUMERIC, "C"); result = img_read_item_ascii(pimg, p); setlocale(LC_NUMERIC, current_locale); free(current_locale); return result; } /* Handle all ASCII formats. */ static int img_read_item_ascii(img *pimg, img_point *p) { int result; pimg->label = pimg->label_buf; if (pimg->version == 0) { ascii_again: pimg->label[0] = '\0'; if (feof(pimg->fh)) return img_STOP; if (pimg->pending) { pimg->pending = 0; result = img_LINE; } else { char cmd[7]; /* Stop if nothing found */ if (fscanf(pimg->fh, "%6s", cmd) < 1) return img_STOP; if (strcmp(cmd, "move") == 0) result = img_MOVE; else if (strcmp(cmd, "draw") == 0) result = img_LINE; else if (strcmp(cmd, "line") == 0) { /* set flag to indicate to process second triplet as LINE */ pimg->pending = 1; result = img_MOVE; } else if (strcmp(cmd, "cross") == 0) { if (fscanf(pimg->fh, "%lf%lf%lf", &p->x, &p->y, &p->z) < 3) { img_errno = feof(pimg->fh) ? IMG_BADFORMAT : IMG_READERROR; return img_BAD; } goto ascii_again; } else if (strcmp(cmd, "name") == 0) { size_t off = 0; int ch = GETC(pimg->fh); if (ch == ' ') ch = GETC(pimg->fh); while (ch != ' ') { if (ch == '\n' || ch == EOF) { img_errno = ferror(pimg->fh) ? IMG_READERROR : IMG_BADFORMAT; return img_BAD; } if (off == pimg->buf_len) { if (!check_label_space(pimg, pimg->buf_len * 2)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } pimg->label_buf[off++] = ch; ch = GETC(pimg->fh); } pimg->label_buf[off] = '\0'; pimg->label = pimg->label_buf; if (pimg->label[0] == '\\') pimg->label++; pimg->flags = img_SFLAG_UNDERGROUND; /* default flags */ result = img_LABEL; } else { img_errno = IMG_BADFORMAT; return img_BAD; /* unknown keyword */ } } if (fscanf(pimg->fh, "%lf%lf%lf", &p->x, &p->y, &p->z) < 3) { img_errno = ferror(pimg->fh) ? IMG_READERROR : IMG_BADFORMAT; return img_BAD; } if (result == img_LABEL && pimg->survey_len) { if (strncmp(pimg->label, pimg->survey, pimg->survey_len + 1) != 0) goto ascii_again; pimg->label += pimg->survey_len + 1; } return result; } else if (pimg->version == VERSION_SURVEX_POS) { /* Survex .pos file */ int ch; size_t off; pimg->flags = img_SFLAG_UNDERGROUND; /* default flags */ againpos: off = 0; while (fscanf(pimg->fh, "(%lf,%lf,%lf )", &p->x, &p->y, &p->z) != 3) { if (ferror(pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } if (feof(pimg->fh)) return img_STOP; if (pimg->pending) { img_errno = IMG_BADFORMAT; return img_BAD; } pimg->pending = 1; /* ignore rest of line */ do { ch = GETC(pimg->fh); } while (ch != '\n' && ch != '\r' && ch != EOF); } pimg->label_buf[0] = '\0'; do { ch = GETC(pimg->fh); } while (ch == ' ' || ch == '\t'); if (ch == '\n' || ch == EOF) { /* If there's no label, set img_SFLAG_ANON. */ pimg->flags |= img_SFLAG_ANON; return img_LABEL; } pimg->label_buf[0] = ch; off = 1; while (!feof(pimg->fh)) { if (!fgets(pimg->label_buf + off, pimg->buf_len - off, pimg->fh)) { img_errno = IMG_READERROR; return img_BAD; } off += strlen(pimg->label_buf + off); if (off && pimg->label_buf[off - 1] == '\n') { pimg->label_buf[off - 1] = '\0'; break; } if (!check_label_space(pimg, pimg->buf_len * 2)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } pimg->label = pimg->label_buf; if (pimg->label[0] == '\\') pimg->label++; if (pimg->survey_len) { size_t l = pimg->survey_len + 1; if (strncmp(pimg->survey, pimg->label, l) != 0) goto againpos; pimg->label += l; } return img_LABEL; } else if (pimg->version == VERSION_COMPASS_PLT) { /* Compass .plt file */ if (pimg->pending > 0) { /* -1 signals we've entered the first survey we want to * read, and need to fudge lots if the first action is 'D'... */ /* pending MOVE or LINE */ int r = pimg->pending - 4; pimg->pending = 0; pimg->flags = 0; pimg->label[pimg->label_len] = '\0'; return r; } while (1) { char *line; char *q; size_t len = 0; int ch = GETC(pimg->fh); switch (ch) { case '\x1a': case EOF: /* Don't insist on ^Z at end of file */ return img_STOP; case 'X': case 'F': case 'S': /* bounding boX (marks end of survey), Feature survey, or * new Section - skip to next survey */ if (pimg->survey) return img_STOP; skip_to_N: while (1) { do { ch = GETC(pimg->fh); } while (ch != '\n' && ch != '\r' && ch != EOF); while (ch == '\n' || ch == '\r') ch = GETC(pimg->fh); if (ch == 'N') break; if (ch == '\x1a' || ch == EOF) return img_STOP; } /* FALLTHRU */ case 'N': line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } while (line[len] > 32) ++len; if (pimg->label_len == 0) pimg->pending = -1; if (!check_label_space(pimg, len + 1)) { osfree(line); img_errno = IMG_OUTOFMEMORY; return img_BAD; } pimg->label_len = len; pimg->label = pimg->label_buf; memcpy(pimg->label, line, len); pimg->label[len] = '\0'; osfree(line); break; case 'M': case 'D': { /* Move or Draw */ long fpos = -1; if (pimg->survey && pimg->label_len == 0) { /* We're only holding onto this line in case the first line * of the 'N' is a 'D', so skip it for now... */ goto skip_to_N; } if (ch == 'D' && pimg->pending == -1) { if (pimg->survey) { fpos = ftell(pimg->fh) - 1; fseek(pimg->fh, pimg->start, SEEK_SET); ch = GETC(pimg->fh); pimg->pending = 0; } else { /* If a file actually has a 'D' before any 'M', then * pretend the 'D' is an 'M' - one of the examples * in the docs was like this! */ ch = 'M'; } } line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } /* Compass stores coordinates as North, East, Up = (y,x,z)! */ if (sscanf(line, "%lf%lf%lf", &p->y, &p->x, &p->z) != 3) { osfree(line); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; } else { img_errno = IMG_BADFORMAT; } return img_BAD; } p->x *= METRES_PER_FOOT; p->y *= METRES_PER_FOOT; p->z *= METRES_PER_FOOT; q = strchr(line, 'S'); if (!q) { osfree(line); img_errno = IMG_BADFORMAT; return img_BAD; } ++q; len = 0; while (q[len] > ' ') ++len; q[len] = '\0'; len += 2; /* ' ' and '\0' */ if (!check_label_space(pimg, pimg->label_len + len)) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } pimg->label = pimg->label_buf; if (pimg->label_len) { pimg->label[pimg->label_len] = ' '; memcpy(pimg->label + pimg->label_len + 1, q, len - 1); } else { memcpy(pimg->label, q, len - 1); } q += len - 1; /* Now read LRUD. Technically, this is optional but virtually * all PLT files have it (with dummy negative values if no LRUD * was measured) and some versions of Compass can't read PLT * files without it! */ while (*q && *q <= ' ') q++; if (*q == 'P') { if (sscanf(q + 1, "%lf%lf%lf%lf", &pimg->l, &pimg->r, &pimg->u, &pimg->d) != 4) { osfree(line); if (ferror(pimg->fh)) { img_errno = IMG_READERROR; } else { img_errno = IMG_BADFORMAT; } return img_BAD; } pimg->l *= METRES_PER_FOOT; pimg->r *= METRES_PER_FOOT; pimg->u *= METRES_PER_FOOT; pimg->d *= METRES_PER_FOOT; } else { pimg->l = pimg->r = pimg->u = pimg->d = -1; } osfree(line); pimg->flags = img_SFLAG_UNDERGROUND; /* default flags */ if (fpos != -1) { fseek(pimg->fh, fpos, SEEK_SET); } else { pimg->pending = (ch == 'M' ? img_MOVE : img_LINE) + 4; } return img_LABEL; } default: img_errno = IMG_BADFORMAT; return img_BAD; } } } else { /* CMAP .xyz file */ char *line = NULL; char *q; size_t len; if (pimg->pending) { /* pending MOVE or LINE or LABEL or STOP */ int r = pimg->pending - 4; /* Set label to empty - don't use "" as we adjust label relative * to label_buf when label_buf is reallocated. */ pimg->label = pimg->label_buf + strlen(pimg->label_buf); pimg->flags = 0; if (r == img_LABEL) { /* nasty magic */ read_xyz_shot_coords(p, pimg->label_buf + 16); subtract_xyz_shot_deltas(p, pimg->label_buf + 16); pimg->pending = img_STOP + 4; return img_MOVE; } pimg->pending = 0; if (r == img_STOP) { /* nasty magic */ read_xyz_shot_coords(p, pimg->label_buf + 16); return img_LINE; } return r; } pimg->label = pimg->label_buf; do { osfree(line); if (feof(pimg->fh)) return img_STOP; line = getline_alloc(pimg->fh); if (!line) { img_errno = IMG_OUTOFMEMORY; return img_BAD; } } while (line[0] == ' ' || line[0] == '\0'); if (line[0] == '\x1a') return img_STOP; len = strlen(line); if (pimg->version == VERSION_CMAP_STATION) { /* station variant */ if (len < 37) { osfree(line); img_errno = IMG_BADFORMAT; return img_BAD; } memcpy(pimg->label, line, 6); q = (char *)memchr(pimg->label, ' ', 6); if (!q) q = pimg->label + 6; *q = '\0'; read_xyz_station_coords(p, line); /* FIXME: look at prev for lines (line + 32, 5) */ /* FIXME: duplicate stations... */ return img_LABEL; } else { /* Shot variant (VERSION_CMAP_SHOT) */ char old[8], new_[8]; if (len < 61) { osfree(line); img_errno = IMG_BADFORMAT; return img_BAD; } memcpy(old, line, 7); q = (char *)memchr(old, ' ', 7); if (!q) q = old + 7; *q = '\0'; memcpy(new_, line + 7, 7); q = (char *)memchr(new_, ' ', 7); if (!q) q = new_ + 7; *q = '\0'; pimg->flags = img_SFLAG_UNDERGROUND; if (strcmp(old, new_) == 0) { pimg->pending = img_MOVE + 4; read_xyz_shot_coords(p, line); strcpy(pimg->label, new_); osfree(line); return img_LABEL; } if (strcmp(old, pimg->label) == 0) { pimg->pending = img_LINE + 4; read_xyz_shot_coords(p, line); strcpy(pimg->label, new_); osfree(line); return img_LABEL; } pimg->pending = img_LABEL + 4; read_xyz_shot_coords(p, line); strcpy(pimg->label, new_); memcpy(pimg->label + 16, line, 70); osfree(line); return img_LABEL; } } } static void write_coord(FILE *fh, double x, double y, double z) { static INT32_T X_, Y_, Z_; INT32_T X, Y, Z; SVX_ASSERT(fh); /* Output in cm */ X = my_lround(x * 100.0); Y = my_lround(y * 100.0); Z = my_lround(z * 100.0); X_ -= X; Y_ -= Y; Z_ -= Z; put32(X, fh); put32(Y, fh); put32(Z, fh); X_ = X; Y_ = Y; Z_ = Z; } static int write_v3label(img *pimg, int opt, const char *s) { size_t len, n, dot; /* find length of common prefix */ dot = 0; for (len = 0; s[len] == pimg->label_buf[len] && s[len] != '\0'; len++) { if (s[len] == '.') dot = len + 1; } SVX_ASSERT(len <= pimg->label_len); n = pimg->label_len - len; if (len == 0) { if (pimg->label_len) PUTC(0, pimg->fh); } else if (n <= 16) { if (n) PUTC(n + 15, pimg->fh); } else if (dot == 0) { if (pimg->label_len) PUTC(0, pimg->fh); len = 0; } else { const char *p = pimg->label_buf + dot; n = 1; for (len = pimg->label_len - dot - 17; len; len--) { if (*p++ == '.') n++; } if (n <= 14) { PUTC(n, pimg->fh); len = dot; } else { if (pimg->label_len) PUTC(0, pimg->fh); len = 0; } } n = strlen(s + len); PUTC(opt, pimg->fh); if (n < 0xfe) { PUTC(n, pimg->fh); } else if (n < 0xffff + 0xfe) { PUTC(0xfe, pimg->fh); put16((short)(n - 0xfe), pimg->fh); } else { PUTC(0xff, pimg->fh); put32(n, pimg->fh); } fwrite(s + len, n, 1, pimg->fh); n += len; pimg->label_len = n; if (!check_label_space(pimg, n + 1)) return 0; /* FIXME: distinguish out of memory... */ memcpy(pimg->label_buf + len, s + len, n - len + 1); return !ferror(pimg->fh); } static int write_v8label(img *pimg, int opt, int common_flag, size_t common_val, const char *s) { size_t len, del, add; /* find length of common prefix */ for (len = 0; s[len] == pimg->label_buf[len] && s[len] != '\0'; len++) { } SVX_ASSERT(len <= pimg->label_len); del = pimg->label_len - len; add = strlen(s + len); if (add == common_val && del == common_val) { PUTC(opt | common_flag, pimg->fh); } else { PUTC(opt, pimg->fh); if (del <= 15 && add <= 15 && (del || add)) { PUTC((del << 4) | add, pimg->fh); } else { PUTC(0x00, pimg->fh); if (del < 0xff) { PUTC(del, pimg->fh); } else { PUTC(0xff, pimg->fh); put32(del, pimg->fh); } if (add < 0xff) { PUTC(add, pimg->fh); } else { PUTC(0xff, pimg->fh); put32(add, pimg->fh); } } } if (add) fwrite(s + len, add, 1, pimg->fh); pimg->label_len = len + add; if (add > del && !check_label_space(pimg, pimg->label_len + 1)) return 0; /* FIXME: distinguish out of memory... */ memcpy(pimg->label_buf + len, s + len, add + 1); return !ferror(pimg->fh); } static void img_write_item_date_new(img *pimg) { int same, unset; /* Only write dates when they've changed. */ #if IMG_API_VERSION == 0 if (pimg->date1 == pimg->olddate1 && pimg->date2 == pimg->olddate2) return; same = (pimg->date1 == pimg->date2); unset = (pimg->date1 == 0); #else /* IMG_API_VERSION == 1 */ if (pimg->days1 == pimg->olddays1 && pimg->days2 == pimg->olddays2) return; same = (pimg->days1 == pimg->days2); unset = (pimg->days1 == -1); #endif if (same) { if (unset) { PUTC(0x10, pimg->fh); } else { PUTC(0x11, pimg->fh); #if IMG_API_VERSION == 0 put16(pimg->date1 / 86400 + 25567, pimg->fh); #else /* IMG_API_VERSION == 1 */ put16(pimg->days1, pimg->fh); #endif } } else { #if IMG_API_VERSION == 0 int diff = (pimg->date2 - pimg->date1) / 86400; if (diff > 0 && diff <= 256) { PUTC(0x12, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x13, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); put16(pimg->date2 / 86400 + 25567, pimg->fh); } #else /* IMG_API_VERSION == 1 */ int diff = pimg->days2 - pimg->days1; if (diff > 0 && diff <= 256) { PUTC(0x12, pimg->fh); put16(pimg->days1, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x13, pimg->fh); put16(pimg->days1, pimg->fh); put16(pimg->days2, pimg->fh); } #endif } #if IMG_API_VERSION == 0 pimg->olddate1 = pimg->date1; pimg->olddate2 = pimg->date2; #else /* IMG_API_VERSION == 1 */ pimg->olddays1 = pimg->days1; pimg->olddays2 = pimg->days2; #endif } static void img_write_item_date(img *pimg) { int same, unset; /* Only write dates when they've changed. */ #if IMG_API_VERSION == 0 if (pimg->date1 == pimg->olddate1 && pimg->date2 == pimg->olddate2) return; same = (pimg->date1 == pimg->date2); unset = (pimg->date1 == 0); #else /* IMG_API_VERSION == 1 */ if (pimg->days1 == pimg->olddays1 && pimg->days2 == pimg->olddays2) return; same = (pimg->days1 == pimg->days2); unset = (pimg->days1 == -1); #endif if (same) { if (img_output_version < 7) { PUTC(0x20, pimg->fh); #if IMG_API_VERSION == 0 put32(pimg->date1, pimg->fh); #else /* IMG_API_VERSION == 1 */ put32((pimg->days1 - 25567) * 86400, pimg->fh); #endif } else { if (unset) { PUTC(0x24, pimg->fh); } else { PUTC(0x20, pimg->fh); #if IMG_API_VERSION == 0 put16(pimg->date1 / 86400 + 25567, pimg->fh); #else /* IMG_API_VERSION == 1 */ put16(pimg->days1, pimg->fh); #endif } } } else { if (img_output_version < 7) { PUTC(0x21, pimg->fh); #if IMG_API_VERSION == 0 put32(pimg->date1, pimg->fh); put32(pimg->date2, pimg->fh); #else /* IMG_API_VERSION == 1 */ put32((pimg->days1 - 25567) * 86400, pimg->fh); put32((pimg->days2 - 25567) * 86400, pimg->fh); #endif } else { #if IMG_API_VERSION == 0 int diff = (pimg->date2 - pimg->date1) / 86400; if (diff > 0 && diff <= 256) { PUTC(0x21, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x23, pimg->fh); put16(pimg->date1 / 86400 + 25567, pimg->fh); put16(pimg->date2 / 86400 + 25567, pimg->fh); } #else /* IMG_API_VERSION == 1 */ int diff = pimg->days2 - pimg->days1; if (diff > 0 && diff <= 256) { PUTC(0x21, pimg->fh); put16(pimg->days1, pimg->fh); PUTC(diff - 1, pimg->fh); } else { PUTC(0x23, pimg->fh); put16(pimg->days1, pimg->fh); put16(pimg->days2, pimg->fh); } #endif } } #if IMG_API_VERSION == 0 pimg->olddate1 = pimg->date1; pimg->olddate2 = pimg->date2; #else /* IMG_API_VERSION == 1 */ pimg->olddays1 = pimg->days1; pimg->olddays2 = pimg->days2; #endif } static void img_write_item_new(img *pimg, int code, int flags, const char *s, double x, double y, double z); static void img_write_item_v3to7(img *pimg, int code, int flags, const char *s, double x, double y, double z); static void img_write_item_ancient(img *pimg, int code, int flags, const char *s, double x, double y, double z); void img_write_item(img *pimg, int code, int flags, const char *s, double x, double y, double z) { if (!pimg) return; if (pimg->version >= 8) { img_write_item_new(pimg, code, flags, s, x, y, z); } else if (pimg->version >= 3) { img_write_item_v3to7(pimg, code, flags, s, x, y, z); } else { img_write_item_ancient(pimg, code, flags, s, x, y, z); } } static void img_write_item_new(img *pimg, int code, int flags, const char *s, double x, double y, double z) { switch (code) { case img_LABEL: write_v8label(pimg, 0x80 | flags, 0, -1, s); break; case img_XSECT: { INT32_T l, r, u, d, max_dim; img_write_item_date_new(pimg); l = (INT32_T)my_lround(pimg->l * 100.0); r = (INT32_T)my_lround(pimg->r * 100.0); u = (INT32_T)my_lround(pimg->u * 100.0); d = (INT32_T)my_lround(pimg->d * 100.0); if (l < 0) l = -1; if (r < 0) r = -1; if (u < 0) u = -1; if (d < 0) d = -1; max_dim = max(max(l, r), max(u, d)); flags = (flags & img_XFLAG_END) ? 1 : 0; if (max_dim >= 32768) flags |= 2; write_v8label(pimg, 0x30 | flags, 0, -1, s); if (flags & 2) { /* Big passage! Need to use 4 bytes. */ put32(l, pimg->fh); put32(r, pimg->fh); put32(u, pimg->fh); put32(d, pimg->fh); } else { put16(l, pimg->fh); put16(r, pimg->fh); put16(u, pimg->fh); put16(d, pimg->fh); } return; } case img_MOVE: PUTC(15, pimg->fh); break; case img_LINE: img_write_item_date_new(pimg); if (pimg->style != pimg->oldstyle) { switch (pimg->style) { case img_STYLE_NORMAL: case img_STYLE_DIVING: case img_STYLE_CARTESIAN: case img_STYLE_CYLPOLAR: case img_STYLE_NOSURVEY: PUTC(pimg->style, pimg->fh); break; } pimg->oldstyle = pimg->style; } write_v8label(pimg, 0x40 | flags, 0x20, 0x00, s ? s : ""); break; default: /* ignore for now */ return; } write_coord(pimg->fh, x, y, z); } static void img_write_item_v3to7(img *pimg, int code, int flags, const char *s, double x, double y, double z) { switch (code) { case img_LABEL: write_v3label(pimg, 0x40 | flags, s); break; case img_XSECT: { INT32_T l, r, u, d, max_dim; /* Need at least version 5 for img_XSECT. */ if (pimg->version < 5) return; img_write_item_date(pimg); l = (INT32_T)my_lround(pimg->l * 100.0); r = (INT32_T)my_lround(pimg->r * 100.0); u = (INT32_T)my_lround(pimg->u * 100.0); d = (INT32_T)my_lround(pimg->d * 100.0); if (l < 0) l = -1; if (r < 0) r = -1; if (u < 0) u = -1; if (d < 0) d = -1; max_dim = max(max(l, r), max(u, d)); flags = (flags & img_XFLAG_END) ? 1 : 0; if (max_dim >= 32768) flags |= 2; write_v3label(pimg, 0x30 | flags, s); if (flags & 2) { /* Big passage! Need to use 4 bytes. */ put32(l, pimg->fh); put32(r, pimg->fh); put32(u, pimg->fh); put32(d, pimg->fh); } else { put16(l, pimg->fh); put16(r, pimg->fh); put16(u, pimg->fh); put16(d, pimg->fh); } return; } case img_MOVE: PUTC(15, pimg->fh); break; case img_LINE: if (pimg->version >= 4) { img_write_item_date(pimg); } write_v3label(pimg, 0x80 | flags, s ? s : ""); break; default: /* ignore for now */ return; } write_coord(pimg->fh, x, y, z); } static void img_write_item_ancient(img *pimg, int code, int flags, const char *s, double x, double y, double z) { size_t len; INT32_T opt = 0; SVX_ASSERT(pimg->version > 0); switch (code) { case img_LABEL: if (pimg->version == 1) { /* put a move before each label */ img_write_item_ancient(pimg, img_MOVE, 0, NULL, x, y, z); put32(2, pimg->fh); fputsnl(s, pimg->fh); return; } len = strlen(s); if (len > 255 || strchr(s, '\n')) { /* long label - not in early incarnations of v2 format, but few * 3d files will need these, so better not to force incompatibility * with a new version I think... */ PUTC(7, pimg->fh); PUTC(flags, pimg->fh); put32(len, pimg->fh); fputs(s, pimg->fh); } else { PUTC(0x40 | (flags & 0x3f), pimg->fh); fputsnl(s, pimg->fh); } opt = 0; break; case img_MOVE: opt = 4; break; case img_LINE: if (pimg->version > 1) { opt = 0x80 | (flags & 0x3f); break; } opt = 5; break; default: /* ignore for now */ return; } if (pimg->version == 1) { put32(opt, pimg->fh); } else { if (opt) PUTC(opt, pimg->fh); } write_coord(pimg->fh, x, y, z); } /* Write error information for the current traverse * n_legs is the number of legs in the traverse * length is the traverse length (in m) * E is the ratio of the observed misclosure to the theoretical one * H is the ratio of the observed horizontal misclosure to the theoretical one * V is the ratio of the observed vertical misclosure to the theoretical one */ void img_write_errors(img *pimg, int n_legs, double length, double E, double H, double V) { PUTC((pimg->version >= 8 ? 0x1f : 0x22), pimg->fh); put32(n_legs, pimg->fh); put32((INT32_T)my_lround(length * 100.0), pimg->fh); put32((INT32_T)my_lround(E * 100.0), pimg->fh); put32((INT32_T)my_lround(H * 100.0), pimg->fh); put32((INT32_T)my_lround(V * 100.0), pimg->fh); } int img_close(img *pimg) { int result = 1; if (pimg) { if (pimg->fh) { if (pimg->fRead) { osfree(pimg->survey); osfree(pimg->title); osfree(pimg->datestamp); } else { /* write end of data marker */ switch (pimg->version) { case 1: put32((INT32_T)-1, pimg->fh); break; default: if (pimg->version <= 7 ? (pimg->label_len != 0) : (pimg->style != img_STYLE_NORMAL)) { PUTC(0, pimg->fh); } /* FALL THROUGH */ case 2: PUTC(0, pimg->fh); break; } } if (ferror(pimg->fh)) result = 0; if (fclose(pimg->fh)) result = 0; if (!result) img_errno = pimg->fRead ? IMG_READERROR : IMG_WRITEERROR; } osfree(pimg->label_buf); osfree(pimg->filename_opened); osfree(pimg); } return result; } therion/loch/lxAboutDlg.cxx0000664000175000017500000000664212447661250015003 0ustar useruser#include "lxWX.h" #include "icons/about.xpm" #include "../thversion.h" // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries class lxAboutDlg : public wxDialog { public: lxAboutDlg(wxWindow * parent); ~lxAboutDlg(); void OnKeyPress(wxKeyEvent&); void OnMouseDown(wxMouseEvent&); DECLARE_EVENT_TABLE(); }; enum { lxABDG_TEXT1 = 6000, lxABDG_TEXT2, lxABDG_TEXT3, lxABDG_BMP, }; BEGIN_EVENT_TABLE(lxAboutDlg, wxDialog) EVT_KEY_DOWN(lxAboutDlg::OnKeyPress) EVT_LEFT_DOWN(lxAboutDlg::OnMouseDown) END_EVENT_TABLE() void lxAboutDlg::OnKeyPress(wxKeyEvent& WXUNUSED(event)) { this->Destroy(); } void lxAboutDlg::OnMouseDown(wxMouseEvent&WXUNUSED(event)) { this->Destroy(); } lxAboutDlg::lxAboutDlg(wxWindow * parent) : wxDialog(parent, wxID_ANY, wxString(_("About Loch"))) //, wxDefaultPosition, wxDefaultSize, //#if defined(__WXX11__) // wxTHICK_FRAME //#else // wxSIMPLE_BORDER //#endif // | wxFRAME_TOOL_WINDOW) { wxBitmap bmp(about_xpm); wxStaticBitmap * pbmp; wxFont tmpFont; this->SetBackgroundColour(wxColour(_T("black"))); this->SetForegroundColour(_T("white")); pbmp = new wxStaticBitmap(this, lxABDG_BMP, bmp); wxBoxSizer * sizerBmp = new wxBoxSizer(wxHORIZONTAL); sizerBmp->AddSpacer(100); sizerBmp->Add(pbmp, 0, wxALL | wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL, 0); wxBoxSizer * sizerAll = new wxBoxSizer(wxVERTICAL); sizerAll->Add(new wxStaticText(this, lxABDG_TEXT1,_T("Loch")), 0, wxALL, lxBORDER); sizerAll->Add(new wxStaticText(this, lxABDG_TEXT2,_("3D visualization tool for caves")), 0, lxNOTTOP, lxBORDER); wxString lxVer; lxVer = _T("Version: "); lxVer += _T(THVERSION); sizerAll->Add(new wxStaticText(this, lxABDG_TEXT3, lxVer), 0, lxNOTTOP, lxBORDER); wxBoxSizer * sizerAllAbove = new wxBoxSizer(wxHORIZONTAL); sizerAllAbove->Add(sizerAll, 0, wxALL, 2 * lxBORDER); SetSizer(sizerAllAbove); sizerBmp->SetSizeHints(this); sizerBmp->Fit(this); tmpFont = lxFStaticText(lxABDG_TEXT1)->GetFont(); tmpFont.SetWeight(wxFONTWEIGHT_BOLD); lxFStaticText(lxABDG_TEXT1)->SetFont(tmpFont); wxSize tmpsize = this->GetClientSize(); pbmp->SetSize(tmpsize.x - bmp.GetWidth(), tmpsize.y - bmp.GetHeight(), -1, -1); this->CentreOnParent(); #if wxCHECK_VERSION(3,0,0) FindWindow(lxABDG_TEXT1)->Bind(wxEVT_KEY_DOWN, &lxAboutDlg::OnKeyPress, this); FindWindow(lxABDG_TEXT2)->Bind(wxEVT_KEY_DOWN, &lxAboutDlg::OnKeyPress, this); FindWindow(lxABDG_TEXT3)->Bind(wxEVT_KEY_DOWN, &lxAboutDlg::OnKeyPress, this); FindWindow(lxABDG_BMP)->Bind(wxEVT_KEY_DOWN, &lxAboutDlg::OnKeyPress, this); FindWindow(lxABDG_TEXT1)->Bind(wxEVT_LEFT_DOWN, &lxAboutDlg::OnMouseDown, this); FindWindow(lxABDG_TEXT2)->Bind(wxEVT_LEFT_DOWN, &lxAboutDlg::OnMouseDown, this); FindWindow(lxABDG_TEXT3)->Bind(wxEVT_LEFT_DOWN, &lxAboutDlg::OnMouseDown, this); FindWindow(lxABDG_BMP)->Bind(wxEVT_LEFT_DOWN, &lxAboutDlg::OnMouseDown, this); #else FindWindow(lxABDG_TEXT1)->SetEventHandler(this->GetEventHandler()); FindWindow(lxABDG_TEXT2)->SetEventHandler(this->GetEventHandler()); FindWindow(lxABDG_TEXT3)->SetEventHandler(this->GetEventHandler()); FindWindow(lxABDG_BMP)->SetEventHandler(this->GetEventHandler()); #endif delete sizerBmp; } lxAboutDlg::~lxAboutDlg() { //delete this->m_bmp; } void lxShowAboutDialog(wxWindow * parent) { lxAboutDlg ad(parent); ad.ShowModal(); } therion/loch/lxAboutDlg.h0000664000175000017500000000052710537464734014432 0ustar useruser/** * @file lxAbout.h * Loch about dialog. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxAboutDlg_h #define lxAboutDlg_h // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries void lxShowAboutDialog(wxWindow * parent); #endif therion/loch/lxImgIO.cxx0000664000175000017500000004161610537464734014254 0ustar useruser#include "lxImgIO.h" // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #ifdef __cplusplus extern "C" { // stupid JPEG library #endif #include #ifdef __cplusplus } #endif #endif //LXDEPCHECK - standart libraries /******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/ /* This half of the example shows how to feed data into the JPEG compressor. * We present a minimal version that does not worry about refinements such * as error recovery (the JPEG code will just exit() if it gets an error). */ /* * IMAGE DATA FORMATS: * * The standard input image format is a rectangular array of pixels, with * each pixel having the same number of "component" values (color channels). * Each pixel row is an array of JSAMPLEs (which typically are unsigned chars). * If you are working with color data, then the color values for each pixel * must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit * RGB color. * * For this example, we'll assume that this data structure matches the way * our application has stored the image in memory, so we can just pass a * pointer to our image buffer. In particular, let's say that the image is * RGB color and is described by: */ //extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */ //extern int image_height; /* Number of rows in image */ //extern int image_width; /* Number of columns in image */ /* * Sample routine for JPEG compression. We assume that the target file name * and a compression quality factor are passed in. */ GLOBAL(bool) lxWrite_JPEG_file (const char * filename, int quality, lxImageRGB img) { int image_width = img.width; int image_height = img.height; unsigned char* image = img.data; JSAMPLE * image_buffer = (JSAMPLE *) image; /* This struct contains the JPEG compression parameters and pointers to * working space (which is allocated as needed by the JPEG library). * It is possible to have several such structures, representing multiple * compression/decompression processes, in existence at once. We refer * to any one struct (and its associated working data) as a "JPEG object". */ struct jpeg_compress_struct cinfo; /* This struct represents a JPEG error handler. It is declared separately * because applications often want to supply a specialized error handler * (see the second half of this file for an example). But here we just * take the easy way out and use the standard error handler, which will * print a message on stderr and call exit() if compression fails. * Note that this struct must live as long as the main JPEG parameter * struct, to avoid dangling-pointer problems. */ struct jpeg_error_mgr jerr; /* More stuff */ FILE * outfile; /* target file */ JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ int row_stride; /* physical row width in image buffer */ /* Step 1: allocate and initialize JPEG compression object */ /* We have to set up the error handler first, in case the initialization * step fails. (Unlikely, but it could happen if you are out of memory.) * This routine fills in the contents of struct jerr, and returns jerr's * address which we place into the link field in cinfo. */ cinfo.err = jpeg_std_error(&jerr); /* Now we can initialize the JPEG compression object. */ jpeg_create_compress(&cinfo); /* Step 2: specify data destination (eg, a file) */ /* Note: steps 2 and 3 can be done in either order. */ /* Here we use the library-supplied code to send compressed data to a * stdio stream. You can also write your own code to do something else. * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that * requires it in order to write binary files. */ if ((outfile = fopen(filename, "wb")) == NULL) { lxImgIOError = "can't open file for output"; //fprintf(stderr, "can't open %s\n", filename); return(false); //exit(1); } jpeg_stdio_dest(&cinfo, outfile); /* Step 3: set parameters for compression */ /* First we supply a description of the input image. * Four fields of the cinfo struct must be filled in: */ cinfo.image_width = image_width; /* image width and height, in pixels */ cinfo.image_height = image_height; cinfo.input_components = 3; /* # of color components per pixel */ cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ /* Now use the library's routine to set default compression parameters. * (You must set at least cinfo.in_color_space before calling this, * since the defaults depend on the source color space.) */ jpeg_set_defaults(&cinfo); /* Now you can set any non-default parameters you wish to. * Here we just illustrate the use of quality (quantization table) scaling: */ jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */); /* Step 4: Start compressor */ /* TRUE ensures that we will write a complete interchange-JPEG file. * Pass TRUE unless you are very sure of what you're doing. */ jpeg_start_compress(&cinfo, TRUE); /* Step 5: while (scan lines remain to be written) */ /* jpeg_write_scanlines(...); */ /* Here we use the library's state variable cinfo.next_scanline as the * loop counter, so that we don't have to keep track ourselves. * To keep things simple, we pass one scanline per call; you can pass * more if you wish, though. */ row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ while (cinfo.next_scanline < cinfo.image_height) { /* jpeg_write_scanlines expects an array of pointers to scanlines. * Here the array is only one element long, but you could pass * more than one scanline at a time if that's more convenient. */ row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); } /* Step 6: Finish compression */ jpeg_finish_compress(&cinfo); /* After finish_compress, we can close the output file. */ fclose(outfile); /* Step 7: release JPEG compression object */ /* This is an important step since it will release a good deal of memory. */ jpeg_destroy_compress(&cinfo); /* And we're done! */ return(true); } /* * SOME FINE POINTS: * * In the above loop, we ignored the return value of jpeg_write_scanlines, * which is the number of scanlines actually written. We could get away * with this because we were only relying on the value of cinfo.next_scanline, * which will be incremented correctly. If you maintain additional loop * variables then you should be careful to increment them properly. * Actually, for output to a stdio stream you needn't worry, because * then jpeg_write_scanlines will write all the lines passed (or else exit * with a fatal error). Partial writes can only occur if you use a data * destination module that can demand suspension of the compressor. * (If you don't know what that's for, you don't need it.) * * If the compressor requires full-image buffers (for entropy-coding * optimization or a multi-scan JPEG file), it will create temporary * files for anything that doesn't fit within the maximum-memory setting. * (Note that temp files are NOT needed if you use the default parameters.) * On some systems you may need to set up a signal handler to ensure that * temporary files are deleted if the program is interrupted. See libjpeg.doc. * * Scanlines MUST be supplied in top-to-bottom order if you want your JPEG * files to be compatible with everyone else's. If you cannot readily read * your data in that order, you'll need an intermediate array to hold the * image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top * source data using the JPEG code's internal virtual-array mechanisms. */ /******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/ /* This half of the example shows how to read data from the JPEG decompressor. * It's a bit more refined than the above, in that we show: * (a) how to modify the JPEG library's standard error-reporting behavior; * (b) how to allocate workspace using the library's memory manager. * * Just to make this example a little different from the first one, we'll * assume that we do not intend to put the whole image into an in-memory * buffer, but to send it line-by-line someplace else. We need a one- * scanline-high JSAMPLE array as a work buffer, and we will let the JPEG * memory manager allocate it for us. This approach is actually quite useful * because we don't need to remember to deallocate the buffer separately: it * will go away automatically when the JPEG object is cleaned up. */ /* * ERROR HANDLING: * * The JPEG library's standard error handler (jerror.c) is divided into * several "methods" which you can override individually. This lets you * adjust the behavior without duplicating a lot of code, which you might * have to update with each future release. * * Our example here shows how to override the "error_exit" method so that * control is returned to the library's caller when a fatal error occurs, * rather than calling exit() as the standard error_exit method does. * * We use C's setjmp/longjmp facility to return control. This means that the * routine which calls the JPEG library must first execute a setjmp() call to * establish the return point. We want the replacement error_exit to do a * longjmp(). But we need to make the setjmp buffer accessible to the * error_exit routine. To do this, we make a private extension of the * standard JPEG error handler object. (If we were using C++, we'd say we * were making a subclass of the regular error handler.) * * Here's the extended error handler struct: */ struct my_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; typedef struct my_error_mgr * my_error_ptr; /* * Here's the routine that will replace the standard error_exit method: */ METHODDEF(void) my_error_exit (j_common_ptr cinfo) { /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ my_error_ptr myerr = (my_error_ptr) cinfo->err; /* Always display the message. */ /* We could postpone this until after returning, if we chose. */ (*cinfo->err->output_message) (cinfo); /* Return control to the setjmp point */ longjmp(myerr->setjmp_buffer, 1); } /* * Sample routine for JPEG decompression. We assume that the source file name * is passed in. We want to return 1 on success, 0 on error. */ GLOBAL(lxImageRGB) lxRead_JPEG_file (const char * filename, FILE * infile) { /* This struct contains the JPEG decompression parameters and pointers to * working space (which is allocated as needed by the JPEG library). */ struct jpeg_decompress_struct cinfo; /* We use our private extension JPEG error handler. * Note that this struct must live as long as the main JPEG parameter * struct, to avoid dangling-pointer problems. */ struct my_error_mgr jerr; /* More stuff */ //FILE * infile; /* source file */ JSAMPARRAY buffer; /* Output row buffer */ int row_stride; /* physical row width in output buffer */ /* In this example we want to open the input file before doing anything else, * so that the setjmp() error recovery below can assume the file is open. * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that * requires it in order to read binary files. */ if (infile == NULL) { if ((infile = fopen(filename, "rb")) == NULL) { lxImgIOError = "can't open file for input"; //fprintf(stderr, "can't open %s\n", filename); return lxImageRGB(); } } /* Step 1: allocate and initialize JPEG decompression object */ /* We set up the normal JPEG error routines, then override error_exit. */ cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; /* Establish the setjmp return context for my_error_exit to use. */ if (setjmp(jerr.setjmp_buffer)) { /* If we get here, the JPEG code has signaled an error. * We need to clean up the JPEG object, close the input file, and return. */ jpeg_destroy_decompress(&cinfo); fclose(infile); lxImgIOError = "error reading JPEG file"; return lxImageRGB(); } /* Now we can initialize the JPEG decompression object. */ jpeg_create_decompress(&cinfo); /* Step 2: specify data source (eg, a file) */ jpeg_stdio_src(&cinfo, infile); /* Step 3: read file parameters with jpeg_read_header() */ (void) jpeg_read_header(&cinfo, TRUE); /* We can ignore the return value from jpeg_read_header since * (a) suspension is not possible with the stdio data source, and * (b) we passed TRUE to reject a tables-only JPEG file as an error. * See libjpeg.doc for more info. */ /* Step 4: set parameters for decompression */ /* In this example, we don't need to change any of the defaults set by * jpeg_read_header(), so we do nothing here. */ /* Step 5: Start decompressor */ (void) jpeg_start_decompress(&cinfo); /* We can ignore the return value since suspension is not possible * with the stdio data source. */ /* We may need to do some setup of our own at this point before reading * the data. After jpeg_start_decompress() we have the correct scaled * output image dimensions available, as well as the output colormap * if we asked for color quantization. * In this example, we need to make an output work buffer of the right size. */ /* JSAMPLEs per row in output buffer */ row_stride = cinfo.output_width * cinfo.output_components; /* Make a one-row-high sample array that will go away when done with image */ buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); /* Step 6: while (scan lines remain to be read) */ /* jpeg_read_scanlines(...); */ lxImageRGB img; img.width = cinfo.output_width; img.height = cinfo.output_height; img.data = (unsigned char*)malloc(cinfo.output_components * img.width * img.height); unsigned char* ptr = img.data; /* Here we use the library's state variable cinfo.output_scanline as the * loop counter, so that we don't have to keep track ourselves. */ while (cinfo.output_scanline < cinfo.output_height) { /* jpeg_read_scanlines expects an array of pointers to scanlines. * Here the array is only one element long, but you could ask for * more than one scanline at a time if that's more convenient. */ (void) jpeg_read_scanlines(&cinfo, buffer, 1); /* Assume put_scanline_someplace wants a pointer and sample count. */ memcpy(ptr, buffer[0], row_stride); ptr += row_stride; } /* Step 7: Finish decompression */ (void) jpeg_finish_decompress(&cinfo); /* We can ignore the return value since suspension is not possible * with the stdio data source. */ /* Step 8: Release JPEG decompression object */ /* This is an important step since it will release a good deal of memory. */ jpeg_destroy_decompress(&cinfo); /* After finish_decompress, we can close the input file. * Here we postpone it until after no more JPEG errors are possible, * so as to simplify the setjmp error logic above. (Actually, I don't * think that jpeg_destroy can do an error exit, but why assume anything...) */ fclose(infile); /* At this point you may want to check to see whether any corrupt-data * warnings occurred (test whether jerr.pub.num_warnings is nonzero). */ /* And we're done! */ return img; } /* * SOME FINE POINTS: * * In the above code, we ignored the return value of jpeg_read_scanlines, * which is the number of scanlines actually read. We could get away with * this because we asked for only one line at a time and we weren't using * a suspending data source. See libjpeg.doc for more info. * * We cheated a bit by calling alloc_sarray() after jpeg_start_decompress(); * we should have done it beforehand to ensure that the space would be * counted against the JPEG max_memory setting. In some systems the above * code would risk an out-of-memory error. However, in general we don't * know the output image dimensions before jpeg_start_decompress(), unless we * call jpeg_calc_output_dimensions(). See libjpeg.doc for more about this. * * Scanlines are returned in the same order as they appear in the JPEG file, * which is standardly top-to-bottom. If you must emit data bottom-to-top, * you can use one of the virtual arrays provided by the JPEG memory manager * to invert the data. See wrbmp.c for an example. * * As with compression, some operating modes may require temporary files. * On some systems you may need to set up a signal handler to ensure that * temporary files are deleted if the program is interrupted. See libjpeg.doc. */ void lxImageRGBFree(lxImageRGB & img) { if (img.data != NULL) free(img.data); img.data = NULL; } char * lxImgIOError = "unknown"; therion/loch/lxOptDlg.cxx0000664000175000017500000001177611102265142014462 0ustar useruser#include "lxWX.h" #include "lxGUI.h" // Standard libraries #ifndef LXDEPCHECK #include #include #endif //LXDEPCHECK - standart libraries enum { LXOD_START = 6000, LXOD_INIT_DIR_PATH, LXOD_INIT_DIR_BROWSE, LXOD_GLASSES, LXOD_END, }; class lxOptionsDlg : public wxDialog { public: long tmp; lxFrame * m_lxframe; lxOptionsDlg(wxWindow * parent); void OnCommand(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(lxOptionsDlg, wxDialog) //EVT_UPDATE_UI_RANGE(LXOD_START, LXOD_END, lxOptionsDlg::OnUpdateUI) EVT_BUTTON(LXOD_INIT_DIR_BROWSE, lxOptionsDlg::OnCommand) END_EVENT_TABLE() lxOptionsDlg::lxOptionsDlg(wxWindow * parent) : wxDialog(parent, wxID_ANY, wxString(_("Options"))) { this->m_lxframe = (lxFrame *) parent; wxBoxSizer * sizerAll = new wxBoxSizer(wxVERTICAL); lxStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox(this, wxID_ANY, _("General options")), wxVERTICAL); lxStaticBoxSizer->Add( new wxStaticText(this, wxID_ANY, _("Default data files directory")), 0, wxALIGN_LEFT | wxALL, lxBORDER); lxBoxSizer = new wxBoxSizer(wxHORIZONTAL); lxBoxSizer->Add(new wxTextCtrl(this, LXOD_INIT_DIR_PATH, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxTextValidator(0, &this->m_lxframe->m_iniDirectory)), 1, wxALIGN_CENTER | lxNOTTOP, lxBORDER); lxBoxSizer->Add(new wxButton(this, LXOD_INIT_DIR_BROWSE, _("Browse...")), 0, wxALIGN_LEFT | wxRIGHT | wxBOTTOM, lxBORDER); lxStaticBoxSizer->Add(lxBoxSizer, 0, wxEXPAND); lxStaticBoxSizer->Add( new wxStaticText(this, wxID_ANY, _("Default stereo colors")), 0, wxALIGN_LEFT | lxNOTTOP, lxBORDER); wxChoice * ch = new wxChoice(this, LXOD_GLASSES, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxGenericValidator(&this->m_lxframe->m_iniStereoGlasses)); ch->Append(_("red & cyan")); ch->Append(_("red & green")); ch->Append(_("red & blue")); ch->Append(_("yellow & blue")); ch->Append(_("cyan & red")); ch->Append(_("green & red")); ch->Append(_("blue & red")); ch->Append(_("blue & yellow")); ch->Append(_("remember last used channels")); lxStaticBoxSizer->Add(ch, 0, wxEXPAND | lxNOTTOP, lxBORDER); lxStaticBoxSizer->Add( new wxStaticText(this, wxID_ANY, _("Measurement system")), 0, wxALIGN_LEFT | lxNOTTOP, lxBORDER); lxBoxSizer = new wxBoxSizer(wxHORIZONTAL); lxBoxSizer->Add(new wxRadioButton(this, wxID_ANY, _("Metric"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP, lxRadioBtnValidator(&this->m_lxframe->m_iniUnits, LXUNITS_METRIC)), 0, wxALIGN_LEFT | lxNOTTOP, lxBORDER); lxBoxSizer->Add(new wxRadioButton(this, wxID_ANY, _("Imperial"), wxDefaultPosition, wxDefaultSize, 0, lxRadioBtnValidator(&this->m_lxframe->m_iniUnits, LXUNITS_IMPERIAL)), 0, wxALIGN_LEFT | wxRIGHT | wxBOTTOM, lxBORDER); lxStaticBoxSizer->Add(lxBoxSizer, 0, wxEXPAND); sizerAll->Add(lxStaticBoxSizer, 0, wxEXPAND | wxALL, lxBORDER); lxStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox(this, wxID_ANY, _("Walls extrapolation")), wxVERTICAL); lxStaticBoxSizer->Add( new wxRadioButton(this, wxID_ANY, _("Do not extrapolate walls"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP, lxRadioBtnValidator(&this->m_lxframe->m_iniWallsInterpolate, LXWALLS_INTERP_NONE)), 0, wxALIGN_LEFT | wxALL, lxBORDER); lxStaticBoxSizer->Add( new wxRadioButton(this, wxID_ANY, _("Extrapolate only files without walls information"), wxDefaultPosition, wxDefaultSize, 0, lxRadioBtnValidator(&this->m_lxframe->m_iniWallsInterpolate, LXWALLS_INTERP_ALL_ONLY)), 0, wxALIGN_LEFT | wxALL, lxBORDER); lxStaticBoxSizer->Add( new wxRadioButton(this, wxID_ANY, _("Extrapolate all missing walls information"), wxDefaultPosition, wxDefaultSize, 0, lxRadioBtnValidator(&this->m_lxframe->m_iniWallsInterpolate, LXWALLS_INTERP_MISSING)), 0, wxALIGN_LEFT | wxALL, lxBORDER); sizerAll->Add(lxStaticBoxSizer, 0, wxEXPAND | lxNOTTOP, lxBORDER); // Bottom line lxBoxSizer = new wxBoxSizer(wxHORIZONTAL); lxBoxSizer->Add(new wxButton(this, wxID_OK, _("OK")), 0, wxALIGN_CENTER | wxLEFT | wxRIGHT | wxBOTTOM, lxBORDER); lxBoxSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel")), 0, wxALIGN_CENTER | wxRIGHT | wxBOTTOM, lxBORDER); sizerAll->Add(lxBoxSizer, 0, wxALIGN_RIGHT); lxFButton(wxID_CANCEL)->SetFocus(); SetSizer(sizerAll); sizerAll->SetSizeHints(this); sizerAll->Fit(this); this->CentreOnParent(); } void lxOptionsDlg::OnCommand(wxCommandEvent& event) { switch (event.GetId()) { case LXOD_INIT_DIR_BROWSE: { wxDirDialog dd(this); dd.SetPath(lxFTextCtrl(LXOD_INIT_DIR_PATH)->GetValue()); if (dd.ShowModal() == wxID_OK) { lxFTextCtrl(LXOD_INIT_DIR_PATH)->SetValue(dd.GetPath()); } } break; // case wxID_OK: // this->m_lxframe->m_iniDirectory = lxFTextCtrl(LXOD_INIT_DIR_PATH)->GetValue(); // this->m_lxframe->m_iniStereoGlasses = lxFChoice(LXOD_GLASSES)->GetSelection(); // break; } } void lxShowOptionsDialog(wxWindow * parent) { lxOptionsDlg od(parent); od.ShowModal(); } therion/loch/lxRender.cxx0000664000175000017500000007675711775015730014536 0ustar useruser/** * @file lxRender.cxx * Loch printing implementation. */ // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { // stupid JPEG library #endif #include #ifdef __cplusplus } #endif #endif //LXDEPCHECK - standard libraries #include "lxRender.h" #include "lxWX.h" #include "lxGLC.h" #include "lxGUI.h" #include "lxSetup.h" #include "lxTR.h" #define lxRENDERBORDER this->m_glc->TRCGet(TR_TILE_BORDER) //#ifdef LXLINUX //#define lxPPMFORMAT 1 //#endif lxRenderData::lxRenderData() { this->m_scale = 2000.0; this->m_scaleMode = LXRENDER_FIT_SCREEN; this->m_imgWhiteBg = true; this->m_imgWidth = 170.0; this->m_imgHeight = 257.0; this->m_imgResolution = 300.0; this->m_imgFileType = 0; this->m_askFName = true; #ifdef lxPPMFORMAT this->m_imgFileName = _T("cave.ppm"); #else this->m_imgFileName = _T("cave.bmp"); #endif } #define pngerr(err) printf(err) void lxRenderData::CalcImageDimensions(lxGLCanvas * glc) { switch (this->m_scaleMode) { case LXRENDER_FIT_SCALE: this->m_imgPixH = 2.0 * glc->setup->cam_dist * glc->setup->cam_lens_vfovr / this->m_scale / 0.0254 * this->m_imgResolution; this->m_imgPixW = glc->setup->cam_width * this->m_imgPixH; break; case LXRENDER_FIT_WIDTH: this->m_imgPixW = (this->m_imgWidth / 25.4 * this->m_imgResolution); this->m_imgPixH = this->m_imgPixW / glc->setup->cam_width; break; case LXRENDER_FIT_HEIGHT: this->m_imgPixH = (this->m_imgHeight / 25.4 * this->m_imgResolution); this->m_imgPixW = this->m_imgPixH * glc->setup->cam_width; break; // screen shot default: this->m_imgPixH = glc->wh; this->m_imgPixW = glc->ww; break; } if (glc->setup->cam_width <= 1.0) { if (this->m_imgPixH < 32.0) { this->m_imgPixH = 32.0; this->m_imgPixW = this->m_imgPixH * glc->setup->cam_width; } if (this->m_imgPixH > 32768.0){ this->m_imgPixH = 32768.0; this->m_imgPixW = this->m_imgPixH * glc->setup->cam_width; } } else { if (this->m_imgPixW < 32.0) { this->m_imgPixW = 32.0; this->m_imgPixH = this->m_imgPixW / glc->setup->cam_width; } if (this->m_imgPixW > 32768.0){ this->m_imgPixW = 32768.0; this->m_imgPixH = this->m_imgPixW / glc->setup->cam_width; } } switch (this->m_scaleMode) { case LXRENDER_FIT_SCALE: this->m_imgHeight = this->m_imgPixH / this->m_imgResolution * 25.4; this->m_imgWidth = this->m_imgPixW / this->m_imgResolution * 25.4; break; case LXRENDER_FIT_WIDTH: this->m_imgHeight = this->m_imgPixH / this->m_imgResolution * 25.4; this->m_scale = 2.0 * glc->setup->cam_dist * glc->setup->cam_lens_vfovr / this->m_imgPixH / 0.0254 * this->m_imgResolution; break; case LXRENDER_FIT_HEIGHT: this->m_imgWidth = this->m_imgPixW / this->m_imgResolution * 25.4; this->m_scale = 2.0 * glc->setup->cam_dist * glc->setup->cam_lens_vfovr / this->m_imgPixH / 0.0254 * this->m_imgResolution; break; } } enum { LXRDC_START = 6000, LXRDC_FIT_SCREEN, LXRDC_FIT_WIDTH, LXRDC_FIT_HEIGHT, LXRDC_FIT_SCALE, LXRDC_WIDTH, LXRDC_HEIGHT, LXRDC_SCALE, LXRDC_RESOL, LXRDC_RESOL_LBL, LXRDC_IMGSIZE, LXRDC_IMGSIZE_LBL, LXRDC_WHITEBG, LXRDC_END, }; class lxRenderDataConfig : public wxDialog { public: lxRenderDataConfig(wxWindow * parent, lxRenderData * data, lxGLCanvas * glc); lxRenderData * m_data; lxCRC32 m_dataCRC; lxGLCanvas * m_glc; void OnUpdateUI(wxUpdateUIEvent & event); void OnKey(wxKeyEvent & event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(lxRenderDataConfig, wxDialog) EVT_UPDATE_UI_RANGE(LXRDC_START, LXRDC_END, lxRenderDataConfig::OnUpdateUI) END_EVENT_TABLE() void lxRenderDataConfig::OnUpdateUI(wxUpdateUIEvent & WXUNUSED(event)) { lxFTextCtrl(LXRDC_WIDTH)->Enable(lxFRadioBtn(LXRDC_FIT_WIDTH)->GetValue()); lxFTextCtrl(LXRDC_HEIGHT)->Enable(lxFRadioBtn(LXRDC_FIT_HEIGHT)->GetValue()); lxFTextCtrl(LXRDC_SCALE)->Enable(lxFRadioBtn(LXRDC_FIT_SCALE)->GetValue()); lxFTextCtrl(LXRDC_RESOL)->Enable(!lxFRadioBtn(LXRDC_FIT_SCREEN)->GetValue()); lxFStaticText(LXRDC_RESOL_LBL)->Enable(!lxFRadioBtn(LXRDC_FIT_SCREEN)->GetValue()); lxFCheckBox(LXRDC_WHITEBG)->Enable(!lxFRadioBtn(LXRDC_FIT_SCREEN)->GetValue()); lxRenderData rd; lxFTextCtrl(LXRDC_WIDTH)->GetValue().ToDouble(&rd.m_imgWidth); lxFTextCtrl(LXRDC_HEIGHT)->GetValue().ToDouble(&rd.m_imgHeight); lxFTextCtrl(LXRDC_SCALE)->GetValue().ToDouble(&rd.m_scale); lxFTextCtrl(LXRDC_RESOL)->GetValue().ToDouble(&rd.m_imgResolution); if (lxFRadioBtn(LXRDC_FIT_SCALE)->GetValue()) rd.m_scaleMode = LXRENDER_FIT_SCALE; if (lxFRadioBtn(LXRDC_FIT_SCREEN)->GetValue()) rd.m_scaleMode = LXRENDER_FIT_SCREEN; if (lxFRadioBtn(LXRDC_FIT_WIDTH)->GetValue()) rd.m_scaleMode = LXRENDER_FIT_WIDTH; if (lxFRadioBtn(LXRDC_FIT_HEIGHT)->GetValue()) rd.m_scaleMode = LXRENDER_FIT_HEIGHT; #define lxRenderDataConfig_check \ this->m_dataCRC.Initialize(); \ this->m_dataCRC.AddInteger(rd.m_scaleMode); \ this->m_dataCRC.AddString(lxFTextCtrl(LXRDC_WIDTH)->GetValue()); \ this->m_dataCRC.AddString(lxFTextCtrl(LXRDC_HEIGHT)->GetValue()); \ this->m_dataCRC.AddString(lxFTextCtrl(LXRDC_SCALE)->GetValue()); \ this->m_dataCRC.AddString(lxFTextCtrl(LXRDC_RESOL)->GetValue()); lxRenderDataConfig_check rd.CalcImageDimensions(this->m_glc); if (this->m_dataCRC.Changed()) { double imgsize = 0.000003 * rd.m_imgPixH * rd.m_imgPixW; if (imgsize < 100.0) lxFStaticText(LXRDC_IMGSIZE)->SetLabel(wxString::Format(_T("%.0f x %.0f (%.1f MB)"), rd.m_imgPixW, rd.m_imgPixH, imgsize)); else lxFStaticText(LXRDC_IMGSIZE)->SetLabel(wxString::Format(_T("%.0f x %.0f (%.1f GB)"), rd.m_imgPixW, rd.m_imgPixH, 0.001 * imgsize)); if (rd.m_scaleMode != LXRENDER_FIT_SCREEN) { if (rd.m_scaleMode != LXRENDER_FIT_WIDTH) { lxFTextCtrl(LXRDC_WIDTH)->SetValue(wxString::Format(_T("%.0f"), rd.m_imgWidth)); } if (rd.m_scaleMode != LXRENDER_FIT_HEIGHT) { lxFTextCtrl(LXRDC_HEIGHT)->SetValue(wxString::Format(_T("%.0f"), rd.m_imgHeight)); } if (rd.m_scaleMode != LXRENDER_FIT_SCALE) { lxFTextCtrl(LXRDC_SCALE)->SetValue(wxString::Format(_T("%.0f"), rd.m_scale)); } } lxRenderDataConfig_check this->m_dataCRC.Changed(); } } lxRenderDataConfig::lxRenderDataConfig(wxWindow * parent, lxRenderData * data, class lxGLCanvas * glc) : wxDialog(parent, wxID_ANY, wxString(_("Rendering setup"))) { m_data = data; m_glc = glc; // TODO: dat to lxWX wxBoxSizer * sizerAll = new wxBoxSizer(wxVERTICAL); lxStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox(this, wxID_ANY, _("Size and scaling")), wxVERTICAL); lxStaticBoxSizer->Add( new wxRadioButton(this, LXRDC_FIT_SCREEN, _("Screen shot"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP, lxRadioBtnValidator(&this->m_data->m_scaleMode, LXRENDER_FIT_SCREEN)), 0, wxALIGN_LEFT | wxALL, lxBORDER); lxFlexGridSizer = new wxFlexGridSizer(3); lxFlexGridSizer->Add( new wxRadioButton(this, LXRDC_FIT_WIDTH, _("Image width"), wxDefaultPosition, wxDefaultSize, 0, lxRadioBtnValidator(&this->m_data->m_scaleMode, LXRENDER_FIT_WIDTH)), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | lxNOTTOP, lxBORDER); lxFlexGridSizer->Add( new wxStaticText(this, wxID_ANY, _("(mm)")), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT | wxALIGN_RIGHT, lxBORDER); lxFlexGridSizer->Add( new wxTextCtrl(this, LXRDC_WIDTH, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT, lxDoubleValidator(&this->m_data->m_imgWidth,0.005,5000.0)), 0, wxALIGN_CENTER | wxBOTTOM | wxRIGHT, lxBORDER); lxSETWWIDTH(LXRDC_WIDTH, 2); lxFlexGridSizer->Add( new wxRadioButton(this, LXRDC_FIT_HEIGHT, _("Image height"), wxDefaultPosition, wxDefaultSize, 0, lxRadioBtnValidator(&this->m_data->m_scaleMode, LXRENDER_FIT_HEIGHT)), 0, wxALIGN_LEFT | lxNOTTOP | wxALIGN_CENTER_VERTICAL, lxBORDER); lxFlexGridSizer->Add( new wxStaticText(this, wxID_ANY, _("(mm)")), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT | wxALIGN_RIGHT, lxBORDER); lxFlexGridSizer->Add( new wxTextCtrl(this, LXRDC_HEIGHT, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT, lxDoubleValidator(&this->m_data->m_imgHeight,0.005,5000.0)), 0, wxALIGN_CENTER | wxBOTTOM | wxRIGHT, lxBORDER); lxSETWWIDTH(LXRDC_HEIGHT, 2); lxFlexGridSizer->Add( new wxRadioButton(this, LXRDC_FIT_SCALE, _("Scale"), wxDefaultPosition, wxDefaultSize, 0, lxRadioBtnValidator(&this->m_data->m_scaleMode, LXRENDER_FIT_SCALE)), 0, wxALIGN_LEFT | lxNOTTOP | wxALIGN_CENTER_VERTICAL, lxBORDER); lxFlexGridSizer->Add( new wxStaticText(this, wxID_ANY, _("1 :")), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT | wxALIGN_RIGHT, lxBORDER); lxFlexGridSizer->Add( new wxTextCtrl(this, LXRDC_SCALE, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT, lxDoubleValidator(&this->m_data->m_scale,1,1e10)), 0, wxALIGN_CENTER | wxBOTTOM | wxRIGHT, lxBORDER); lxSETWWIDTH(LXRDC_SCALE, 2); lxStaticBoxSizer->Add(lxFlexGridSizer, 0, wxEXPAND); sizerAll->Add(lxStaticBoxSizer, 0, wxEXPAND | wxALL, lxBORDER); lxStaticBoxSizer = new wxStaticBoxSizer( new wxStaticBox(this, wxID_ANY, _("Image options")), wxVERTICAL); lxBoxSizer = new wxBoxSizer(wxHORIZONTAL); lxBoxSizer->Add( new wxStaticText(this, LXRDC_RESOL_LBL, _("Rendering resolution (dpi)")), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL | wxALIGN_RIGHT, lxBORDER); lxBoxSizer->Add( new wxTextCtrl(this, LXRDC_RESOL, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT, lxDoubleValidator(&this->m_data->m_imgResolution,96,2400)), 0, wxALIGN_CENTER | lxNOTLEFT, lxBORDER); lxSETWWIDTH(LXRDC_RESOL, 2); lxStaticBoxSizer->Add(lxBoxSizer, 0, wxEXPAND); lxBoxSizer = new wxBoxSizer(wxHORIZONTAL); lxBoxSizer->Add( new wxStaticText(this, LXRDC_IMGSIZE_LBL, _("Image size:")), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | lxNOTTOP | wxALIGN_RIGHT, lxBORDER); lxBoxSizer->Add( new wxStaticText(this, LXRDC_IMGSIZE, _("00 x 00 (00.0 MB)")), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT | wxALIGN_LEFT, lxBORDER); lxStaticBoxSizer->Add(lxBoxSizer, 0, wxEXPAND); lxStaticBoxSizer->Add( new wxCheckBox(this, LXRDC_WHITEBG, _("White background"), wxDefaultPosition, wxDefaultSize, 0, wxGenericValidator(&this->m_data->m_imgWhiteBg)), 0, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | lxNOTTOP | wxALIGN_LEFT, lxBORDER); sizerAll->Add(lxStaticBoxSizer, 0, wxEXPAND | lxNOTTOP, lxBORDER); // Bottom line lxBoxSizer = new wxBoxSizer(wxHORIZONTAL); lxBoxSizer->Add(new wxButton(this, wxID_OK, _("OK")), 0, wxALIGN_CENTER | wxLEFT | wxRIGHT | wxBOTTOM, lxBORDER); lxBoxSizer->Add(new wxButton(this, wxID_CANCEL, _("Cancel")), 0, wxALIGN_CENTER | wxRIGHT | wxBOTTOM, lxBORDER); sizerAll->Add(lxBoxSizer, 0, wxALIGN_RIGHT); SetSizer(sizerAll); sizerAll->SetSizeHints(this); sizerAll->Fit(this); this->CentreOnParent(); } void lxRenderData::Configure(wxWindow * parent, class lxGLCanvas * glc) { lxRenderDataConfig cdlg(parent, this, glc); cdlg.ShowModal(); } class lxRenderFile { public: bool m_started, m_continue, m_progress; lxGLCanvas * m_glc; lxRenderData * m_pData; FILE * m_file, * m_fileTMP; GLint m_imgWidth, m_imgHeight, m_tWidth, m_tHeight; GLubyte * m_imgBuffRow; GLubyte * m_imgBuffLine; int m_imgBuffLineSize; int m_cTile; wxWindow * m_parent; png_structp png_ptr; png_infop png_info_ptr; void Render(); void RenderBMPHeader(); void RenderPNGHeader(); void RenderPNGFooter(); void RenderPDFHeader(); void RenderPDFFooter(); void ErrorExit(const wxString & err); lxRenderFile(wxWindow * p, lxRenderData * pdata, lxGLCanvas * glc); ~lxRenderFile(); }; lxRenderFile::lxRenderFile(wxWindow * p, lxRenderData * pdata, lxGLCanvas * glc) { m_parent = p; m_pData = pdata; m_glc = glc; m_started = false; m_file = NULL; m_continue = false; m_progress = false; m_imgBuffLine = NULL; m_imgBuffRow = NULL; } lxRenderFile::~lxRenderFile() { if (m_file != NULL) fclose(m_file); if (this->m_imgBuffLine != NULL) delete [] this->m_imgBuffLine; if (this->m_imgBuffRow != NULL) delete [] this->m_imgBuffRow; this->m_glc->TRCDestroy(); this->m_glc->m_renderData = NULL; this->m_glc->ForceRefresh(); } void lxRenderFile::Render() { m_file = NULL; // najprv zrata rozmery oprazka double tmp_w, tmp_h; // zratame rozmery oprazka //if (m_pData->m_scaleMode == LXRENDER_FIT_SCALE) { // tmp_w = (m_pData->m_imgWidth / 25.4 * m_pData->m_imgResolution); // tmp_h = (m_pData->m_imgHeight / 25.4 * m_pData->m_imgResolution); //} else { // tmp_h = 2.0 * m_glc->setup->cam_dist * lxVFOVR / m_pData->m_scale / 0.0254 * m_pData->m_imgResolution; // tmp_w = m_glc->setup->cam_width * tmp_h; //} this->m_pData->CalcImageDimensions(m_glc); tmp_h = this->m_pData->m_imgPixH; tmp_w = this->m_pData->m_imgPixW; m_imgWidth = (GLint) tmp_w; m_imgHeight = (GLint) tmp_h; m_tWidth = m_glc->ww; m_tHeight = m_glc->wh; if (this->m_pData->m_scaleMode != LXRENDER_FIT_SCREEN) { if (m_tHeight * m_imgWidth > 5000000) m_tHeight = 5000000 / m_imgWidth; m_tHeight = m_tHeight - (m_tHeight % 8); m_tWidth = m_tWidth - (m_tHeight % 8); } else { m_tHeight = m_tHeight + 8 - (m_tHeight % 8); m_tWidth = m_tWidth + 8 - (m_tHeight % 8); } wxString cdir, cnm; wxFileName::SplitPath(m_pData->m_imgFileName, &cdir, &cnm, NULL); if (cdir.Length() == 0) cdir = this->m_glc->frame->m_fileDir; if (m_pData->m_askFName) { wxFileDialog fileDlg(this->m_parent, _("Save rendering as"), cdir, cnm, #ifdef lxPPMFORMAT _("PPM files (*.ppm)|*.ppm"), #else _("PDF files (*.pdf)|*.pdf|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp"), #endif wxFD_SAVE | wxFD_OVERWRITE_PROMPT); fileDlg.CentreOnParent(); fileDlg.SetFilterIndex(m_pData->m_imgFileType); if (fileDlg.ShowModal() == wxID_OK) { m_pData->m_imgFileName = fileDlg.GetPath(); m_pData->m_imgFileType = fileDlg.GetFilterIndex(); } else return; } // otvorime subor m_file = fopen(m_pData->m_imgFileName.mb_str(), "w+b"); if (m_file == NULL) { ErrorExit(_("Unable to open file for output.")); return; } // start rendering m_glc->m_renderData = m_pData; // allocate rendering buffers this->m_glc->TRCInit(LXGLCTR_TILE, this->m_imgWidth, this->m_imgHeight, this->m_tWidth, this->m_tHeight); this->m_imgBuffLineSize = 3 * this->m_imgWidth; switch (m_pData->m_imgFileType) { case 0: RenderPDFHeader(); trRowOrder(this->m_glc->m_TRC->m_ctx, TR_TOP_TO_BOTTOM); break; case 1: RenderPNGHeader(); trRowOrder(this->m_glc->m_TRC->m_ctx, TR_TOP_TO_BOTTOM); break; default: RenderBMPHeader(); trRowOrder(this->m_glc->m_TRC->m_ctx, TR_BOTTOM_TO_TOP); break; } this->m_tWidth = this->m_glc->TRCGet(TR_TILE_WIDTH); this->m_tHeight = this->m_glc->TRCGet(TR_TILE_HEIGHT); this->m_imgBuffLine = new GLubyte [m_imgBuffLineSize]; this->m_imgBuffRow = new GLubyte [3 * this->m_imgWidth * this->m_tHeight]; double tmpcw = m_glc->setup->cam_width; m_glc->setup->cam_width = double(m_imgWidth) / double(m_imgHeight); m_cTile = 0; long max = ((this->m_imgWidth + this->m_tWidth - 2 * lxRENDERBORDER - 1) / (this->m_tWidth - 2 * lxRENDERBORDER)) * ((this->m_imgHeight + this->m_tHeight - 2 * lxRENDERBORDER - 1) / (this->m_tHeight - 2 * lxRENDERBORDER)); m_continue = true; wxString renmsg = wxString::Format(_("Rendering (%d x %d, %.1f MB) ..."), m_imgWidth, m_imgHeight, double(m_imgWidth) * double(m_imgHeight) * 3 / 1048576.0); wxProgressDialog * dialog = NULL; if (this->m_pData->m_askFName) { dialog = new wxProgressDialog(_("Rendering to bitmap"), renmsg, max, // range m_parent, // parent wxPD_CAN_ABORT | wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME); } int curColumn; this->m_glc->SetFontColors(); this->m_glc->m_fntTitleO->setPointSize(14.0 * this->m_pData->m_imgResolution / 96.0); this->m_glc->m_fntNumericO->setPointSize(8.0 * this->m_pData->m_imgResolution / 96.0); while (m_continue) { if (this->m_pData->m_scaleMode == LXRENDER_FIT_SCREEN) { this->m_glc->TRCBeginTile(); this->m_glc->m_sInit = true; this->m_glc->m_isO = false; this->m_glc->RenderScreen(); this->m_glc->m_isO = true; this->m_glc->m_sInit = true; } else { if (this->m_cTile == 0) { this->m_glc->UpdateRenderContents(); if (this->m_glc->m_oList == 0) this->m_glc->m_oList = glGenLists(1); glNewList(this->m_glc->m_oList, GL_COMPILE); this->m_glc->RenderAll(); glEndList(); } if (this->m_glc->setup->cam_anaglyph) { this->m_glc->setup->cam_anaglyph_left = false; this->m_glc->SetCamera(); this->m_glc->TRCBeginTile(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); if (this->m_glc->m_renderData->m_imgWhiteBg) glClearColor(1.0, 1.0, 1.0, 1.0); else glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); this->m_glc->SetColorMask(); #ifdef LXLINUX this->m_glc->RenderAll(); #else glCallList(this->m_glc->m_oList); #endif this->m_glc->setup->cam_anaglyph_left = true; this->m_glc->SetCamera(); this->m_glc->TRCBeginTile(); this->m_glc->SetColorMask(); #ifdef LXLINUX this->m_glc->RenderAll(); #else glCallList(this->m_glc->m_oList); #endif glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else { m_glc->SetCamera(); this->m_glc->TRCBeginTile(); #ifdef LXLINUX this->m_glc->RenderAll(); #else glCallList(this->m_glc->m_oList); #endif } // render indicators if (this->m_glc->setup->m_vis_indicators) this->m_glc->RenderInds(); } curColumn = this->m_glc->TRCGet(TR_CURRENT_COLUMN); m_continue = this->m_glc->TRCEndTile(); this->m_cTile++; m_continue = m_continue && ((dialog == NULL) || dialog->Update(this->m_cTile, renmsg)); // save tile do rowbuffera { int curTileWidth = this->m_glc->TRCGet(TR_CURRENT_TILE_WIDTH); int bytesPerImageRow = m_imgWidth * 3 * sizeof(GLubyte); int bytesPerTileRow = (m_tWidth - 2 * lxRENDERBORDER) * 3 * sizeof(GLubyte); int xOffset = curColumn * bytesPerTileRow; int bytesPerCurrentTileRow = (curTileWidth - 2 * lxRENDERBORDER) * 3 * sizeof(GLubyte); int i; int curTileHeight = this->m_glc->TRCGet(TR_CURRENT_TILE_HEIGHT); for (i = 0; i < curTileHeight; i++) { memcpy(m_imgBuffRow + i * bytesPerImageRow + xOffset, // Dest this->m_glc->TRCGetBuffer() + i * bytesPerTileRow, // Src bytesPerCurrentTileRow); // Byte count } } if (curColumn == (this->m_glc->TRCGet(TR_COLUMNS)-1)) { // write this buffered row of tiles to the file int curTileHeight = this->m_glc->TRCGet(TR_CURRENT_TILE_HEIGHT); int bytesPerImageRow = m_imgWidth * 3 * sizeof(GLubyte); int i; GLubyte * rowPtr; // The arithmetic is a bit tricky here because of borders and // the up/down flip. Thanks to Marcel Lancelle for fixing it. #ifdef lxPPMFORMAT for (i = 2 * lxRENDERBORDER; i < curTileHeight; i++) { rowPtr = m_imgBuffRow + (curTileHeight-1-i) * bytesPerImageRow; // (curTileHeight-1-i) fwrite(rowPtr, 1, 3 * m_imgWidth, m_file); } #else GLubyte * sPtr, * dPtr; int j; switch (this->m_pData->m_imgFileType) { // case 0: // for (i = (curTileHeight - 2 * lxRENDERBORDER); i > 0 ; i--) { // rowPtr = m_imgBuffRow + (i-1) * bytesPerImageRow; // fwrite(rowPtr, 1, m_imgBuffLineSize, m_file); // } // break; case 0: case 1: for (i = (curTileHeight - 2 * lxRENDERBORDER); i > 0 ; i--) { rowPtr = m_imgBuffRow + (i-1) * bytesPerImageRow; png_write_row(this->png_ptr, rowPtr); } break; default: for (i = 0; i < (curTileHeight - 2 * lxRENDERBORDER); i++) { rowPtr = m_imgBuffRow + i * bytesPerImageRow; for (j = 0, dPtr = m_imgBuffLine, sPtr = rowPtr; j < m_imgWidth; j++, dPtr += 3, sPtr += 3) { dPtr[2] = sPtr[0]; dPtr[1] = sPtr[1]; dPtr[0] = sPtr[2]; } fwrite(m_imgBuffLine, 1, m_imgBuffLineSize, m_file); } break; } #endif } } m_glc->setup->cam_width = tmpcw; //pngtst; if (dialog != NULL) { delete dialog; } switch (this->m_pData->m_imgFileType) { case 0: this->RenderPDFFooter(); break; case 1: this->RenderPNGFooter(); break; } delete [] this->m_imgBuffLine; delete [] this->m_imgBuffRow; this->m_imgBuffLine = NULL; this->m_imgBuffRow = NULL; } void lxRenderFile::ErrorExit(const wxString & err) { wxMessageBox(err, _("Error"), wxICON_ERROR | wxOK, m_parent); } void lxRenderFile::RenderBMPHeader() { #ifdef lxPPMFORMAT fprintf(this->m_file,"P6\n"); fprintf(this->m_file,"# ppm-file created by loch\n"); fprintf(this->m_file,"%d %d\n", this->m_imgWidth, this->m_imgHeight); fprintf(this->m_file,"255\n"); #else wxUint16 bpp = 24; // # of bits per pixel int palette_size = 0; // # of color map entries, ie. 2^bpp colors unsigned width = this->m_imgWidth; unsigned row_padding = (4 - int(width*bpp/8.0) % 4) % 4; // # bytes to pad to dword unsigned row_width = int(width * bpp/8.0) + row_padding; // # of bytes per row this->m_imgBuffLineSize = row_width; struct { // BitmapHeader: wxUint16 magic; // format magic, always 'BM' wxUint32 filesize; // total file size, inc. headers wxUint32 reserved; // for future use wxUint32 data_offset; // image data offset in the file // BitmapInfoHeader: wxUint32 bih_size; // 2nd part's size wxUint32 width, height; // bitmap's dimensions wxUint16 planes; // num of planes wxUint16 bpp; // bits per pixel wxUint32 compression; // compression method wxUint32 size_of_bmp; // size of the bitmap wxUint32 h_res, v_res; // image resolution in dpi wxUint32 num_clrs; // number of colors used wxUint32 num_signif_clrs;// number of significant colors } hdr; double imgRes; if (this->m_pData->m_scaleMode == LXRENDER_FIT_SCREEN) imgRes = 96.0; else imgRes = this->m_pData->m_imgResolution; wxUint32 hdr_size = 14/*BitmapHeader*/ + 40/*BitmapInfoHeader*/; hdr.magic = wxUINT16_SWAP_ON_BE(0x4D42/*'BM'*/); hdr.filesize = wxUINT32_SWAP_ON_BE(hdr_size + palette_size * 4 + row_width * this->m_imgHeight); hdr.reserved = 0; hdr.data_offset = wxUINT32_SWAP_ON_BE(hdr_size + palette_size * 4); hdr.bih_size = wxUINT32_SWAP_ON_BE(hdr_size - 14); hdr.width = wxUINT32_SWAP_ON_BE(this->m_imgWidth); hdr.height = wxUINT32_SWAP_ON_BE(this->m_imgHeight); hdr.planes = wxUINT16_SWAP_ON_BE(1); // always 1 plane hdr.bpp = wxUINT16_SWAP_ON_BE(bpp); hdr.compression = 0; // RGB uncompressed hdr.size_of_bmp = wxUINT32_SWAP_ON_BE(row_width * this->m_imgHeight); hdr.h_res = hdr.v_res = wxUINT32_SWAP_ON_BE((wxUint32) (imgRes * 100.0 / 2.54 + 0.5)); // 72dpi is standard hdr.num_clrs = wxUINT32_SWAP_ON_BE(palette_size); // # colors in colormap hdr.num_signif_clrs = 0; // all colors are significant #ifdef bmpWrite #undef bmpWrite #endif #define bmpWrite(srcp, srcs) fwrite(srcp, 1, srcs, this->m_file) bmpWrite(&hdr.magic, 2); bmpWrite(&hdr.filesize, 4); bmpWrite(&hdr.reserved, 4); bmpWrite(&hdr.data_offset, 4); bmpWrite(&hdr.bih_size, 4); bmpWrite(&hdr.width, 4); bmpWrite(&hdr.height, 4); bmpWrite(&hdr.planes, 2); bmpWrite(&hdr.bpp, 2); bmpWrite(&hdr.compression, 4); bmpWrite(&hdr.size_of_bmp, 4); bmpWrite(&hdr.h_res, 4); bmpWrite(&hdr.v_res, 4); bmpWrite(&hdr.num_clrs, 4); bmpWrite(&hdr.num_signif_clrs, 4); #endif } void lxRenderData::Render(wxWindow * parent, lxGLCanvas * glc) { lxRenderFile pf(parent, this, glc); char * prevlocale = setlocale(LC_NUMERIC,NULL); setlocale(LC_NUMERIC,"C"); glc->m_isO = true; pf.Render(); glc->m_isO = false; setlocale(LC_NUMERIC,prevlocale); } void lxRenderFile::RenderPNGHeader() { double imgRes; if (this->m_pData->m_scaleMode == LXRENDER_FIT_SCREEN) imgRes = 96.0; else imgRes = this->m_pData->m_imgResolution; /* initialize stuff */ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) pngerr("[write_png_file] png_create_write_struct failed"); png_info_ptr = png_create_info_struct(png_ptr); if (!png_info_ptr) pngerr("[write_png_file] png_create_info_struct failed"); if (setjmp(png_jmpbuf(png_ptr))) pngerr("[write_png_file] Error during init_io"); png_init_io(png_ptr, this->m_file); /* write header */ if (setjmp(png_jmpbuf(png_ptr))) pngerr("[write_png_file] Error during writing header"); png_set_IHDR(png_ptr, png_info_ptr, /*256, 256,*/ this->m_imgWidth, this->m_imgHeight, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_set_pHYs(png_ptr, png_info_ptr, (png_uint_32) (imgRes * 39.3700787401574 + 0.5), (png_uint_32) (imgRes * 39.3700787401574 + 0.5), PNG_RESOLUTION_METER); png_write_info(png_ptr, png_info_ptr); /* write bytes */ if (setjmp(png_jmpbuf(png_ptr))) pngerr("[write_png_file] Error during writing bytes"); } void lxRenderFile::RenderPNGFooter() { /* end write */ if (setjmp(png_jmpbuf(png_ptr))) pngerr("[write_png_file] Error during end of write"); png_write_end(png_ptr, NULL); png_destroy_write_struct(&this->png_ptr, &this->png_info_ptr); } size_t pdf_obj[10], pdf_png_start_length, pdf_png_start; void lxRenderFile::RenderPDFHeader() { double imgRes; if (this->m_pData->m_scaleMode == LXRENDER_FIT_SCREEN) imgRes = 96.0; else imgRes = this->m_pData->m_imgResolution; double imw, imh; imw = 72.0 * this->m_imgWidth / imgRes; imh = 72.0 * this->m_imgHeight / imgRes; char tmp_buff[256]; fprintf(this->m_file,"%%PDF-1.4\n"); pdf_obj[4] = ftell(this->m_file); sprintf(tmp_buff, "q\n%.4f 0 0 %.4f 0 0 cm\n/Im1 Do\nQ\n", imw, imh); fprintf(this->m_file,"4 0 obj <<\n/Length %u\n>>\nstream\n%sendstream\nendobj\n", (unsigned)strlen(tmp_buff), tmp_buff); pdf_obj[3] = ftell(this->m_file); fprintf(this->m_file,"3 0 obj <<\n/Type /Page\n/Contents 4 0 R\n/Resources 2 0 R\n/MediaBox [0 0 %.4f %.4f]\n/Parent 5 0 R\n>> endobj\n", imw, imh); pdf_obj[1] = ftell(this->m_file); fprintf(this->m_file,"1 0 obj <<\n/Type /XObject\n/Subtype /Image\n/Width %u\n" "/Height %u\n/BitsPerComponent 8\n/ColorSpace /DeviceRGB\n", this->m_imgWidth, this->m_imgHeight); pdf_png_start_length = ftell(this->m_file); fprintf(this->m_file,"/Length 00000000000000\n/Filter /FlateDecode\n/DecodeParms << /Colors 3 /Columns %u /BitsPerComponent 8 /Predictor 10 >>\n>>\nstream\n", this->m_imgWidth); /* initialize stuff */ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) pngerr("[write_png_file] png_create_write_struct failed"); png_info_ptr = png_create_info_struct(png_ptr); if (!png_info_ptr) pngerr("[write_png_file] png_create_info_struct failed"); if (setjmp(png_jmpbuf(png_ptr))) pngerr("[write_png_file] Error during init_io"); this->m_fileTMP = tmpfile(); png_init_io(png_ptr, this->m_fileTMP); /* write header */ if (setjmp(png_jmpbuf(png_ptr))) pngerr("[write_png_file] Error during writing header"); png_set_IHDR(png_ptr, png_info_ptr, /*256, 256,*/ this->m_imgWidth, this->m_imgHeight, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, png_info_ptr); pdf_png_start = ftell(this->m_fileTMP); } void lxRenderFile::RenderPDFFooter() { size_t src_pos, dst_pos, png_len, png_pos, png_hdr, png_add, buff_read, buff_rest; unsigned char lenbuff[8]; png_write_end(png_ptr, NULL); fseek(this->m_fileTMP, pdf_png_start, SEEK_SET); png_len = 0; bool contpng = true; do { fread(lenbuff, 1, 8, this->m_fileTMP); png_add = (size_t) lenbuff[3] + 256 * (size_t) lenbuff[2] + 256 * 256 * (size_t) lenbuff[1] + 256 * 256 * 256 * (size_t) lenbuff[0]; png_hdr = (size_t) lenbuff[7] + 256 * (size_t) lenbuff[6] + 256 * 256 * (size_t) lenbuff[5] + 256 * 256 * 256 * (size_t) lenbuff[4]; if (png_hdr == 0x49444154) { png_len += png_add; if (fseek(this->m_fileTMP, png_add + 4, SEEK_CUR) != 0) contpng = false; } else { contpng = false; } } while (contpng); fseek(this->m_file, pdf_png_start_length, SEEK_SET); fprintf(this->m_file,"/Length %u\n/Filter /FlateDecode\n/DecodeParms << /Colors 3 /Columns %u /BitsPerComponent 8 /Predictor 10 >>\n>>\nstream\n", (unsigned) png_len, this->m_imgWidth); #define buffsize 256000 unsigned char * buff = new unsigned char [buffsize]; contpng = true; dst_pos = ftell(this->m_file); src_pos = pdf_png_start; do { fseek(this->m_fileTMP, src_pos, SEEK_SET); src_pos += 8; fread(lenbuff, 1, 8, this->m_fileTMP); png_add = (size_t) lenbuff[3] + 256 * (size_t) lenbuff[2] + 256 * 256 * (size_t) lenbuff[1] + 256 * 256 * 256 * (size_t) lenbuff[0]; png_hdr = (size_t) lenbuff[7] + 256 * (size_t) lenbuff[6] + 256 * 256 * (size_t) lenbuff[5] + 256 * 256 * 256 * (size_t) lenbuff[4]; if (png_hdr == 0x49444154) { for(png_pos = 0; png_pos < png_add; png_pos += buff_read) { if (fseek(this->m_fileTMP, src_pos, SEEK_SET) != 0) contpng = false; buff_rest = png_add - png_pos; if (buff_rest > buffsize) buff_rest = buffsize; buff_read = fread(buff, 1, buff_rest, this->m_fileTMP); //fseek(this->m_file, dst_pos, SEEK_SET); fwrite(buff, 1, buff_read, this->m_file); src_pos += buff_read; dst_pos += buff_read; } src_pos += 4; } else { contpng = false; } } while (contpng); delete [] buff; //fseek(this->m_file, dst_pos, SEEK_SET); fprintf(this->m_file,"\n"); fprintf(this->m_file,"endstream\nendobj\n"); pdf_obj[2] = ftell(this->m_file); fprintf(this->m_file,"2 0 obj <<\n/XObject << /Im1 1 0 R >>\n/ProcSet [ /PDF /ImageC ]\n>> endobj\n"); pdf_obj[5] = ftell(this->m_file); fprintf(this->m_file,"5 0 obj <<\n/Type /Pages\n/Count 1\n/Kids [3 0 R]\n>> endobj\n"); pdf_obj[6] = ftell(this->m_file); fprintf(this->m_file,"6 0 obj <<\n/Type /Catalog\n/Pages 5 0 R\n>> endobj\n"); pdf_obj[7] = ftell(this->m_file); fprintf(this->m_file,"7 0 obj <<\n/Producer (Loch)\n/Creator (Therion)\n>> endobj\n"); pdf_obj[9] = ftell(this->m_file); fprintf(this->m_file,"xref\n0 8\n%010u 65535 f\n%010u 00000 n\n%010u 00000 n\n%010u 00000 n\n%010u 00000 n\n%010u 00000 n\n%010u 00000 n\n%010u 00000 n\n", 0,(unsigned)pdf_obj[1],(unsigned)pdf_obj[2],(unsigned)pdf_obj[3],(unsigned)pdf_obj[4],(unsigned)pdf_obj[5],(unsigned)pdf_obj[6],(unsigned)pdf_obj[7]); fprintf(this->m_file,"trailer\n<< /Size 8\n /Root 6 0 R\n/Info 7 0 R >>\nstartxref\n%u\n%%%%EOF\n",(unsigned)pdf_obj[9]); png_destroy_write_struct(&this->png_ptr, &this->png_info_ptr); fclose(this->m_fileTMP); } therion/loch/lxR2P.h0000664000175000017500000000037010537464734013330 0ustar useruser#ifdef __cplusplus extern "C" { #endif typedef struct _R2PCTX R2PContext; extern R2PContext *R2PCreate(int width, int height); extern void R2PMakeCurrent(R2PContext * ctx); extern void R2PDestroy(R2PContext * ctx); #ifdef __cplusplus } #endif therion/loch/lochfile.ico0000664000175000017500000000427610344431444014466 0ustar useruser ¨( @«´©²³† €†3JL””ë™™™68ËÌÌVV¶‹‹‹ª®®ouê*”› 46)>?O•¥¦¦-rv™™ñôôúeeerrÆTTÓ'ÉÒååõ[[[’’Ì€¼ß³³Ý××ûVV…=Œ‘MMMy~Hbc$ÃÌ7df ‘‘ãFgh= $vv1) && ($v2 >= $vv2)} { set vv1 $v1 set vv2 $v2 set ver $vv1.$vv2 set incpath "$d/include/vtk-$vv1.$vv2" set libpath "$d/lib/vtk-$vv1.$vv2" } } } } switch [lindex $argv 0] { incpath { puts $incpath } libpath { puts $libpath } version6 { puts [expr $vv1 >= 6] } default { puts $ver } } exit therion/loch/lxPres.h0000664000175000017500000000162012426422672013627 0ustar useruser/** * @file lxPres.h * Loch scene setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxPres_h #define lxPres_h // Standard libraries #ifndef LXDEPCHECK #include #include #endif //LXDEPCHECK - standart libraries #include "lxWX.h" enum { LXPRES_POSLB, }; class lxPresentDlg : public wxMiniFrame { public: lxTBoxPos m_toolBoxPosition; wxString m_fileName, m_fileDir; bool m_changed; class lxFrame * m_mainFrame; class wxListBox * m_posLBox; lxPresentDlg(wxWindow *parent); void OnCommand(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnMove(wxMoveEvent& event); void ResetPresentation(bool save = false); bool SavePresentation(bool saveas = false); void LoadPresentation(); void UpdateList(); void UpdateControls(); private: DECLARE_EVENT_TABLE() }; #endif therion/loch/lxTR.h0000664000175000017500000000716212047414326013246 0ustar useruser/* $Id: tr.h,v 1.5 1997/07/21 17:34:07 brianp Exp $ */ /* * $Log: tr.h,v $ * Revision 1.5 1997/07/21 17:34:07 brianp * added tile borders, incremented version to 1.1 * * Revision 1.4 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.3 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul * * * This library allows one to render arbitrarily large images with OpenGL. * The basic idea is to break the image into tiles which are rendered one * at a time. The tiles are assembled together to form the final, large * image. Tiles and images can be of any size. * * Basic usage: * * 1. Allocate a tile rendering context: * TRcontext t = trNew(); * * 2. Specify the final image buffer and tile size: * GLubyte image[W][H][4] * trImageSize(t, W, H); * trImageBuffer(t, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte *) image); * * 3. Setup your projection: * trFrustum(t, left, right, bottom top, near, far); * or * trOrtho(t, left, right, bottom top, near, far); * or * trPerspective(t, fovy, aspect, near, far); * * 4. Render the tiles: * do { * trBeginTile(t); * DrawMyScene(); * } while (trEndTile(t)); * * You provide the DrawMyScene() function which calls glClear() and * draws all your stuff. * * 5. The image array is now complete. Display it, write it to a file, etc. * * 6. Delete the tile rendering context when finished: * trDelete(t); * */ #ifndef lxTR_h #define lxTR_h /* Standard libraries */ #ifndef LXDEPCHECK #include #include #include #include #ifdef _WIN32 #include #endif #ifdef LXMACOSX #include #include #else #include #include #endif #endif /* LXDEPCHECK - standart libraries */ #ifdef __cplusplus extern "C" { #endif #define TR_VERSION "1.1" #define TR_MAJOR_VERSION 1 #define TR_MINOR_VERSION 1 typedef struct _TRctx TRcontext; typedef enum { TR_TILE_WIDTH = 100, TR_TILE_HEIGHT, TR_TILE_BORDER, TR_IMAGE_WIDTH, TR_IMAGE_HEIGHT, TR_ROWS, TR_COLUMNS, TR_CURRENT_ROW, TR_CURRENT_COLUMN, TR_CURRENT_TILE_WIDTH, TR_CURRENT_TILE_HEIGHT, TR_ROW_ORDER, TR_TOP_TO_BOTTOM, TR_BOTTOM_TO_TOP } TRenum; extern TRcontext *trNew(void); extern void trDelete(TRcontext *tr); extern void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border); extern void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trImageSize(TRcontext *tr, GLint width, GLint height); extern void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trRowOrder(TRcontext *tr, TRenum order); extern GLint trGet(TRcontext *tr, TRenum param); extern void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ); extern void trBeginTile(TRcontext *tr); extern int trEndTile(TRcontext *tr); extern void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z); #ifdef __cplusplus } #endif #endif therion/loch/lxMath.h0000664000175000017500000001015711577052700013611 0ustar useruser/** * @file lxMath.h * Loch mathematics module. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef lxMath_h #define lxMath_h // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #endif //LXDEPCHECK - standart libraries #define lxPI 3.1415926535898 struct lxVec { double x, y, z; lxVec() : x(0.0), y(0.0), z(0.0) {}; lxVec(double a, double b, double c) : x(a), y(b), z(c) {}; double Length(); double Azimuth(); double Inclination(); double Norm(); void Normalize(); lxVec operator += ( const lxVec& v); lxVec operator -= ( const lxVec& v); lxVec operator *= ( const double& c); lxVec operator /= ( const double& c); lxVec Rotated(double a, double i); }; lxVec operator + ( const lxVec& p, const lxVec& q ); lxVec operator - ( const lxVec& p, const lxVec& q ); double operator * ( const lxVec& p, const lxVec& q ); lxVec operator * ( const double& c, const lxVec& q ); lxVec operator / ( const lxVec& p, const double& c); lxVec operator ^ ( const lxVec& p, const lxVec& q ); bool operator < ( const lxVec& p, const lxVec& q ); bool operator == ( const lxVec& p, const lxVec& q ); bool operator != ( const lxVec& p, const lxVec& q ); lxVec lxPol2Vec(const double l, const double a, const double i); lxVec lxVecAbs(lxVec v); lxVec lxCalcNormal4(lxVec v1, lxVec v2, lxVec v3, lxVec vN); lxVec lxCalcNormal5(lxVec v1, lxVec v2, lxVec v3, lxVec v4, lxVec vN); struct lxVecLimits { lxVec min, max, xmin, xmax, ymin, ymax, zmin, zmax; bool valid; lxVecLimits() : valid(false) {}; void Add(double a, double b, double c); void Add(lxVec v); lxVecLimits Rotate(double a, double i, lxVec c); lxVec Vertex(int v); }; struct lxTriGeomPoint { lxVec p, n; operator lxVec & () {return this->p;} const lxVec & operator = (const lxVec q) {this->p = q; return this->p;} }; bool operator < ( const lxTriGeomPoint& p, const lxTriGeomPoint& q ); struct lxTriGeom3Angle { size_t v1, v2, v3; lxTriGeom3Angle() : v1(0), v2(0), v3(0) {} lxTriGeom3Angle(size_t vv1, size_t vv2, size_t vv3); }; struct lxTriGeom { size_t m_nPoints; std::map m_points; std::vector m_positions; std::list m_triangles; std::vector m_geometry; void Clear(); void Append(lxTriGeom * src); size_t InsertPoint(lxTriGeomPoint p); bool Insert3Angle(lxTriGeomPoint p1, lxTriGeomPoint p2, lxTriGeomPoint p3); bool Insert4Angle(lxTriGeomPoint p1, lxTriGeomPoint p2, lxTriGeomPoint p3, lxTriGeomPoint p4); size_t GetNPoints(); lxTriGeomPoint GetPoint(size_t i); size_t GetNTriangles(); lxTriGeom3Angle GetTriangle(size_t i); lxTriGeom() : m_nPoints(0) {} }; struct lxPlane { lxVec m_point, m_normal; double m_delta; void Init(lxVec pt, lxVec norm); double CalcPosition(lxVec pt); bool CalcIntersection(lxVec fp, lxVec tp, lxVec & tgt); }; #define lxVecXYZ(vec) (vec).x, (vec).y, (vec).z #define lxMax(a,b) ((a) > (b) ? (a) : (b)) #define lxMin(a,b) ((a) < (b) ? (a) : (b)) #define lxShiftVecPXYZ(v,s) ((v)->x - (s).x), ((v)->y - (s).y), ((v)->z - (s).z) #define lxShiftVecXYZ(v,s) ((v).x - (s).x), ((v).y - (s).y), ((v).z - (s).z) #define lxShiftVecX3(v,s) (v[0] - (s).x), (v[1] - (s).y), (v[2] - (s).z) #endif therion/loch/lxMath.cxx0000664000175000017500000002250411453314100014147 0ustar useruser/** * @file lxMath.cxx * Loch math implementation. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries #include "lxMath.h" void lxVec::Normalize() { double n = this->Length(); if (n > 0.0) { this->x /= n; this->y /= n; this->z /= n; } } double lxVec::Norm() { return (this->x * this->x + this->y * this->y + this->z * this->z); } double lxVec::Length() { return sqrt(this->x * this->x + this->y * this->y + this->z * this->z); } double lxVec::Azimuth() { return atan2(this->x, this->y) / lxPI * 180.0; } double lxVec::Inclination() { return atan2(this->z, sqrt(this->x * this->x + this->y * this->y)) / lxPI * 180.0; } lxVec operator + ( const lxVec& p, const lxVec& q ) { return lxVec(p.x + q.x, p.y + q.y, p.z + q.z); } lxVec operator - ( const lxVec& p, const lxVec& q ) { return lxVec(p.x - q.x, p.y - q.y, p.z - q.z); } double operator * ( const lxVec& p, const lxVec& q ) { return (p.x * q.x + p.y * q.y + p.z * q.z); } lxVec operator * ( const double& c, const lxVec& q ) { return lxVec(c * q.x, c * q.y, c * q.z); } lxVec operator / ( const lxVec& p, const double& c) { return (c != 0.0 ? lxVec(p.x / c, p.y / c, p.z / c) : lxVec()); } lxVec operator ^ ( const lxVec& p, const lxVec& q ) { return lxVec(p.y * q.z - p.z * q.y, p.z * q.x - p.x * q.z, p.x * q.y - p.y * q.x); } void lxVecLimits::Add(double a, double b, double c) { #define lxVecLimAddSet(par) this->par = lxVec(a, b, c) if (this->valid) { if (this->min.x > a) { this->min.x = a; lxVecLimAddSet(xmin); } if (this->max.x < a) { this->max.x = a; lxVecLimAddSet(xmax); } if (this->min.y > b) { this->min.y = b; lxVecLimAddSet(ymin); } if (this->max.y < b) { this->max.y = b; lxVecLimAddSet(xmax); } if (this->min.z > c) { this->min.z = c; lxVecLimAddSet(zmin); } if (this->max.z < c) { this->max.z = c; lxVecLimAddSet(zmax); } } else { lxVecLimAddSet(min); lxVecLimAddSet(max); lxVecLimAddSet(xmin); lxVecLimAddSet(xmax); lxVecLimAddSet(ymin); lxVecLimAddSet(ymax); lxVecLimAddSet(zmin); lxVecLimAddSet(zmax); this->valid = true; } } lxVec lxPol2Vec(const double l, const double a, const double i) { return lxVec( l * cos(i / 180.0 * lxPI) * sin(a / 180.0 * lxPI), l * cos(i / 180.0 * lxPI) * cos(a / 180.0 * lxPI), l * sin(i / 180.0 * lxPI) ); } lxVec lxVec::Rotated(double a, double i) { double sa = sin(a / 180.0 * lxPI), ca = cos(a / 180.0 * lxPI), si = sin(i / 180.0 * lxPI), ci = cos(i / 180.0 * lxPI); return lxVec( this->x * ca - this->y * sa , this->x * ci * sa + this->y * ca * ci - this->z * si, this->x * si * sa + this->y * si * ca + this->z * ci ); } lxVec lxVecLimits::Vertex(int v) { switch (v) { case 0: return this->min; case 1: return lxVec(this->max.x, this->min.y, this->min.z); case 2: return lxVec(this->max.x, this->max.y, this->min.z); case 3: return lxVec(this->min.x, this->max.y, this->min.z); case 4: return lxVec(this->min.x, this->min.y, this->max.z); case 5: return lxVec(this->max.x, this->min.y, this->max.z); case 6: return this->max; default: return lxVec(this->min.x, this->max.y, this->max.z); } } lxVecLimits lxVecLimits::Rotate(double a, double i, lxVec c) { lxVecLimits result; lxVec mymin = this->min - c; lxVec mymax = this->max - c; result.Add(mymin.Rotated(a,i)); result.Add(lxVec(mymin.x, mymin.y, mymax.z).Rotated(a,i)); result.Add(lxVec(mymin.x, mymax.y, mymin.z).Rotated(a,i)); result.Add(lxVec(mymax.x, mymin.y, mymin.z).Rotated(a,i)); result.Add(lxVec(mymax.x, mymin.y, mymax.z).Rotated(a,i)); result.Add(lxVec(mymax.x, mymax.y, mymin.z).Rotated(a,i)); result.Add(lxVec(mymin.x, mymax.y, mymax.z).Rotated(a,i)); result.Add(mymax.Rotated(a,i)); return result; } lxVec lxVec::operator += ( const lxVec& v) { *this = lxVec(this->x + v.x, this->y + v.y, this->z + v.z); return *this; } lxVec lxVec::operator -= ( const lxVec& v) { *this = lxVec(this->x - v.x, this->y - v.y, this->z - v.z); return *this; } lxVec lxVec::operator *= ( const double& c) { *this = lxVec(this->x * c, this->y * c, this->z * c); return *this; } lxVec lxVec::operator /= ( const double& c) { *this = lxVec(this->x / c, this->y / c, this->z / c); return *this; } bool operator < (const struct lxVec & p, const struct lxVec & q) { if (p.x < q.x) return true; if (p.x > q.x) return false; if (p.y < q.y) return true; if (p.y > q.y) return false; if (p.z < q.z) return true; return false; } bool operator == ( const lxVec& p, const lxVec& q ) { if ((!(p < q)) && (!(q < p))) return true; else return false; } bool operator != ( const lxVec& p, const lxVec& q ) { return !(p == q); } bool operator < ( const lxTriGeomPoint& p, const lxTriGeomPoint& q ) { if (p.p < q.p) return true; if (q.p < p.p) return false; if (p.n < q.n) return true; else return false; } void lxVecLimits::Add(lxVec v) { this->Add(lxVecXYZ(v)); } lxVec lxVecAbs(lxVec v) { return lxVec(fabs(v.x), fabs(v.y), fabs(v.z)); } size_t lxTriGeom::InsertPoint(lxTriGeomPoint p) { size_t rv; std::map::iterator i; i = this->m_points.find(p); if (i == this->m_points.end()) { rv = this->m_nPoints; this->m_positions.push_back(p); this->m_nPoints++; this->m_points[p] = rv; } else { rv = i->second; } return rv; } void lxTriGeom::Clear() { this->m_nPoints = 0; this->m_points.clear(); this->m_positions.clear(); this->m_triangles.clear(); this->m_geometry.clear(); } lxTriGeom3Angle::lxTriGeom3Angle(size_t vv1, size_t vv2, size_t vv3) { this->v1 = vv1; this->v2 = vv2; this->v3 = vv3; } bool lxTriGeom::Insert3Angle(lxTriGeomPoint p1, lxTriGeomPoint p2, lxTriGeomPoint p3) { size_t v1, v2, v3; v1 = this->InsertPoint(p1); v2 = this->InsertPoint(p2); v3 = this->InsertPoint(p3); if ((p1.p != p2.p) && (p2.p != p3.p) && (p1.p != p3.p)) { this->m_triangles.push_back(lxTriGeom3Angle(v1, v2, v3)); return true; } else { return false; } } bool lxTriGeom::Insert4Angle(lxTriGeomPoint p1, lxTriGeomPoint p2, lxTriGeomPoint p3, lxTriGeomPoint p4) { bool i1, i2; i1 = this->Insert3Angle(p1, p2, p3); i2 = this->Insert3Angle(p4, p3, p2); return (i1 && i2); } size_t lxTriGeom::GetNPoints() { return this->m_nPoints; } lxTriGeomPoint lxTriGeom::GetPoint(size_t i) { return this->m_positions[i]; } size_t lxTriGeom::GetNTriangles() { this->m_geometry.clear(); std::list::iterator i; for(i = this->m_triangles.begin(); i != this->m_triangles.end(); i++) { this->m_geometry.push_back(*i); } return this->m_geometry.size(); } lxTriGeom3Angle lxTriGeom::GetTriangle(size_t i) { return this->m_geometry[i]; } void lxPlane::Init(lxVec pt, lxVec norm) { norm.Normalize(); this->m_normal = norm; this->m_point = pt; this->m_delta = -1.0 * (this->m_normal * this->m_point); } double lxPlane::CalcPosition(lxVec pt) { return (pt * this->m_normal + this->m_delta); } bool lxPlane::CalcIntersection(lxVec fp, lxVec tp, lxVec & tgt) { lxVec d = (tp - fp); double y = (this->m_normal * d); if (y == 0.0) return false; else { y = ((this->m_normal * fp + this->m_delta) / y); tgt = fp - y * d; if (y > 0.0) return false; else return true; } } void lxTriGeom::Append(lxTriGeom * src) { lxTriGeomPoint pp; lxTriGeom3Angle tt; size_t sn, sx, i; sn = src->GetNPoints(); sx = this->m_nPoints; for(i = 0; i < sn; i++) { pp = src->GetPoint(i); this->m_nPoints++; this->m_positions.push_back(pp); this->m_points[pp] = sx + i; } sn = src->GetNTriangles(); for(i = 0; i < sn; i++) { tt = src->GetTriangle(i); tt.v1 += sx; tt.v2 += sx; tt.v3 += sx; this->m_triangles.push_back(tt); } } lxVec lxCalcNormal4(lxVec v1, lxVec v2, lxVec v3, lxVec vN) { v1 = vN - v1; v2 = vN - v2; v3 = vN - v3; v1 = v1 ^ (-1.0 * v2); v3 = v3 ^ v2; v1.Normalize(); v3.Normalize(); vN = v1 + v3; vN.Normalize(); return vN; } lxVec lxCalcNormal5(lxVec v1, lxVec v2, lxVec v3, lxVec v4, lxVec vN) { v2 = lxCalcNormal4(v1, v2, v3, vN); v4 = lxCalcNormal4(v3, v4, v1, vN); vN = v2 + v4; vN.Normalize(); return vN; } therion/loch/lxGLC.cxx0000664000175000017500000015577512447657465013740 0ustar useruser/** * @file lxGLC.cxx * Loch GL canvas implementation. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #include #include #include #ifdef LXMACOSX #include #include #else #include #include #endif #endif //LXDEPCHECK - standart libraries #include "lxGLC.h" #include "lxGUI.h" #include "lxData.h" #include "lxSetup.h" #include "lxSView.h" #include "lxFNT6x13_bdf.h" #include "lxFNT10x20_bdf.h" #include "lxFNTFreeSans_ttf.h" #include "lxSetup.h" #include "lxRender.h" #include "lxGUI.h" #include "lxTR.h" #ifdef LXWIN32 #include "lxR2D.h" #endif #ifdef LXLINUX #include "lxR2P.h" #endif #define LXTRCBORDER (this->m_renderData->m_scaleMode == LXRENDER_FIT_SCREEN ? 0 : 16) BEGIN_EVENT_TABLE(lxGLCanvas, wxGLCanvas) EVT_LEFT_DCLICK(lxGLCanvas::OnMouseDouble) EVT_RIGHT_DCLICK(lxGLCanvas::OnMouseDouble) EVT_LEFT_DOWN(lxGLCanvas::OnMouseDown) EVT_LEFT_UP(lxGLCanvas::OnMouseUp) EVT_MIDDLE_DOWN(lxGLCanvas::OnMouseDown) EVT_MIDDLE_UP(lxGLCanvas::OnMouseUp) EVT_RIGHT_DOWN(lxGLCanvas::OnMouseDown) EVT_RIGHT_UP(lxGLCanvas::OnMouseUp) EVT_MOTION(lxGLCanvas::OnMouseMove) EVT_MOUSEWHEEL(lxGLCanvas::OnMouseWheel) EVT_SIZE(lxGLCanvas::OnSize) EVT_PAINT(lxGLCanvas::OnPaint) EVT_ERASE_BACKGROUND(lxGLCanvas::OnEraseBackground) EVT_ENTER_WINDOW(lxGLCanvas::OnEnterWindow ) EVT_CHAR(lxGLCanvas::OnKeyPress) EVT_IDLE(lxGLCanvas::OnIdle) END_EVENT_TABLE() static const GLubyte srf16tex[48] = { 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 0, 0 }; lxGLCanvas::lxGLCanvas(struct lxSetup * stp, struct lxData * dat, wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : wxGLCanvas(parent, id, NULL, pos, size, style, name), ctx(this) { this->frame = NULL; this->data = dat; this->setup = stp; this->ww = 100; this->wh = 100; this->mx = 0; this->my = 0; this->m_sList = 0; this->m_sFixList = 0; this->m_sEntList = 0; this->m_sStList = 0; this->m_oList = 0; this->m_oFixList = 0; this->m_oEntList = 0; this->m_oStList = 0; this->m_lic = 0; this->m_sInit = true; this->m_sInitReset = true; this->m_isO = false; this->m_renderData = NULL; // fonts initialization FT_Library library = OGLFT::Library::instance(); FT_New_Memory_Face(library, lxFNT10x20_bdf, lxFNT10x20_bdf_size, 0, &this->m_ftFace1); FT_New_Memory_Face(library, lxFNT6x13_bdf, lxFNT6x13_bdf_size, 0, &this->m_ftFace2); FT_New_Memory_Face(library, lxFNTFreeSans_ttf, lxFNTFreeSans_ttf_size, 0, &this->m_ftFace3); this->m_fntTitleS = new OGLFT::Monochrome(this->m_ftFace1); this->m_fntNumericS = new OGLFT::Monochrome(this->m_ftFace2); this->m_fntTitleO = new OGLFT::Filled(this->m_ftFace3); this->m_fntNumericO = new OGLFT::Filled(this->m_ftFace3); this->m_OSC = NULL; this->m_TRC = NULL; this->m_sMoveLock = LXGLCML_NONE; this->m_sCameraAutoRotate = false; this->m_sCameraLockRotation = false; this->m_sCameraAutoRotateAngle = 1.0; this->m_maxTSizeO = 0; this->m_maxTSizeS = 0; this->m_initTextures = true; } bool lxGLCanvas::IsRenderingOff() { return (m_isO && (this->m_renderData->m_scaleMode != LXRENDER_FIT_SCREEN)); } lxGLCanvas::~lxGLCanvas() { this->OSCDestroy(); this->TRCDestroy(); delete this->m_fntTitleS; delete this->m_fntNumericS; delete this->m_fntTitleO; delete this->m_fntNumericO; FT_Done_Face(this->m_ftFace1); FT_Done_Face(this->m_ftFace2); FT_Done_Face(this->m_ftFace3); } void lxGLCanvas::OnEnterWindow( wxMouseEvent& WXUNUSED(event) ) { //this->SetFocus(); } void lxGLCanvas::RenderScreen() { glViewport(0, 0, (GLint) this->ww, (GLint) this->wh); if (this->m_sInit) this->InitializeS(); if (this->setup->cam_anaglyph) { glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); this->setup->cam_anaglyph_left = false; this->SetCamera(); this->SetColorMask(); glCallList(this->m_sList); this->setup->cam_anaglyph_left = true; this->SetCamera(); this->SetColorMask(); glCallList(this->m_sList); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } else { this->SetCamera(); glCallList(this->m_sList); } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); this->RenderOffList(); if (this->setup->m_vis_indicators) this->RenderInds(); } void lxGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); if (!this->m_isO) { this->ctx.SetCurrent(*this); this->RenderScreen(); SwapBuffers(); } } void lxGLCanvas::ForceRefresh(bool updateTB) { this->Refresh(false); if (updateTB) this->frame->SetupUpdate(); } void lxGLCanvas::OnSize(wxSizeEvent& event) { // this is also necessary to update the context on some platforms wxGLCanvas::OnSize(event); // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...) int w, h; this->GetClientSize(&w, &h); this->setup->cam_width = double((GLfloat) w / (GLfloat) h); this->ww = w; this->wh = h; #ifdef __WXMSW__ this->ForceRefresh(); #endif } void lxGLCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // Do nothing, to avoid flashing. } void lxGLCanvas::InitializeS() { wxSizeEvent tmpe; OnSize(tmpe); this->OpenGLInit(); //this->SetFontColors(); this->UpdateRenderContents(); this->UpdateRenderList(); if (this->m_sInitReset) { this->setup->ResetCamera(); this->m_sInitReset = false; } this->m_sInit = false; } void lxGLCanvas::UpdateRenderList() { this->ctx.SetCurrent(*this); if (this->m_sList == 0) this->m_sList = glGenLists(1); glNewList(this->m_sList, GL_COMPILE); this->RenderAll(); glEndList(); } void lxGLCanvas::UpdateRenderContents() { this->setup->UpdateData(); if (this->data->m_textureSurface.image.data != NULL) { GLint newTSizeO, newTSizeS; newTSizeO = this->m_maxTSizeO; newTSizeS = this->m_maxTSizeS; if (this->m_isO) { glGetIntegerv(GL_MAX_TEXTURE_SIZE, &newTSizeO); if (newTSizeO > 4096) newTSizeO = 4096; //printf("MaxTSizeO: %d\n", newTSizeO); if (newTSizeS == 0) { newTSizeS = newTSizeO; } } else { glGetIntegerv(GL_MAX_TEXTURE_SIZE, &newTSizeS); if (newTSizeS > 4096) newTSizeS = 4096; //printf("MaxTSizeS: %d\n", newTSizeS); if (newTSizeO == 0) { newTSizeO = newTSizeS; } } if ((this->data->m_textureSurface.texS == NULL) || (this->m_maxTSizeO != newTSizeO) || (this->m_maxTSizeS != newTSizeS)) { this->m_maxTSizeS = newTSizeS; this->m_maxTSizeO = newTSizeO; this->ctx.SetCurrent(*this); this->data->m_textureSurface.CreateTexImages(this->m_maxTSizeS, this->m_maxTSizeO); if (this->m_isO) this->OSCMakeCurrent(); } if (this->m_initTextures) { glGenTextures(1, & this->m_idTexSurface); glGenTextures(1, & this->m_idTexStation); this->m_initTextures = false; } glBindTexture(GL_TEXTURE_2D, this->m_idTexSurface); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (this->m_isO) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->data->m_textureSurface.texSizeO, this->data->m_textureSurface.texSizeO, 0, GL_RGB, GL_UNSIGNED_BYTE, (this->setup->cam_anaglyph && this->setup->cam_anaglyph_bw) ? this->data->m_textureSurface.texObw : this->data->m_textureSurface.texO); } else { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, this->data->m_textureSurface.texSizeS, this->data->m_textureSurface.texSizeS, 0, GL_RGB, GL_UNSIGNED_BYTE, (this->setup->cam_anaglyph && this->setup->cam_anaglyph_bw) ? this->data->m_textureSurface.texSbw : this->data->m_textureSurface.texS); } } this->shift = (this->setup->data_limits.max + this->setup->data_limits.min) / 2.0; } void lxGLCanvas::UpdateContents() { this->UpdateRenderContents(); this->UpdateRenderList(); this->ForceRefresh(); } void lxGLCanvas::OnMouseUp(wxMouseEvent& event) { switch (this->m_sMoveLock) { case LXGLCML_ZOOM: case LXGLCML_ROTATE: case LXGLCML_ZOOM2ROTATE: if (event.LeftUp()) this->m_sMoveLock = LXGLCML_NONE; break; case LXGLCML_PANX: case LXGLCML_PANY: case LXGLCML_PANX2Y: if ((this->mx == event.GetX()) && (this->my == event.GetY())) { this->PopupMenu(this->frame->m_toolMenu); } if (event.RightUp() || (event.LeftUp() && this->m_sMoveSingle)) this->m_sMoveLock = LXGLCML_NONE; break; case LXGLCML_TILT: if (event.MiddleUp() || (event.LeftUp() && this->m_sMoveSingle)) this->m_sMoveLock = LXGLCML_NONE; break; } if ((this->m_sMoveLock == LXGLCML_NONE) && (this->HasCapture())) { this->ReleaseMouse(); } } void lxGLCanvas::SetColorMask() { switch (this->setup->cam_anaglyph_glasses) { // red & cyan case 0: if (this->setup->cam_anaglyph_left) glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); else glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE); break; // red & green case 1: if (this->setup->cam_anaglyph_left) glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); else glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE); break; // red & blue case 2: if (this->setup->cam_anaglyph_left) glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); else glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE); break; // yellow & blue case 3: if (this->setup->cam_anaglyph_left) glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE); else glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE); break; // cyan & red case 4: if (this->setup->cam_anaglyph_left) glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE); else glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); break; // green & red case 5: if (this->setup->cam_anaglyph_left) glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE); else glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); break; // blue & red case 6: if (this->setup->cam_anaglyph_left) glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE); else glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE); break; // yellow & blue default: if (this->setup->cam_anaglyph_left) glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE); else glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE); break; } } bool lxGLCanvas::CameraAutoRotate() { if (this->m_sCameraAutoRotate) { this->setup->RotateCameraF(this->m_sCameraAutoRotateAngle); this->ForceRefresh(); this->m_sCameraAutoRotateCounter++; if (this->m_sCameraAutoRotateSWatch.Time() > 1000) { ((wxStaticText *)(this->frame->m_viewpointSetupDlg->FindWindow(LXVSTP_RENSPEED)))->SetLabel( wxString::Format(_("Rendering at %.1f fps."), 1000.0 * double(this->m_sCameraAutoRotateCounter) / double(this->m_sCameraAutoRotateSWatch.Time()))); this->m_sCameraAutoRotateCounter = 0; this->m_sCameraAutoRotateSWatch.Start(); } return true; } else return false; } void lxGLCanvas::OnIdle(wxIdleEvent& WXUNUSED(event)) { // fix bug with opening file before everything is initialized if (!this->frame->m_fileToOpen.IsEmpty()) { wxString fto; fto = this->frame->m_fileToOpen; this->frame->m_fileToOpen = _T(""); this->frame->OpenFile(fto); return; } switch (this->m_sMoveLock) { case LXGLCML_PANX: case LXGLCML_PANX2Y: case LXGLCML_PANY: break; default: this->CameraAutoRotate(); break; } } void lxGLCanvas::OnMouseDouble(wxMouseEvent& event) { if (event.m_leftDown) this->frame->ToggleFullScreen(); } void lxGLCanvas::OnMouseDown(wxMouseEvent& event) { this->m_lic = 0; switch (this->m_sMoveLock) { case LXGLCML_ZOOM2ROTATE: if (event.RightDown()) { if (abs(this->mx - event.GetX()) >= abs(this->my - event.GetY())) { this->m_sMoveLock = LXGLCML_ROTATE; } else { this->m_sMoveLock = LXGLCML_ZOOM; } } break; case LXGLCML_PANX2Y: if (event.LeftDown()) { if (abs(this->mx - event.GetX()) >= abs(this->my - event.GetY())) { this->m_sMoveLock = LXGLCML_PANX; } else { this->m_sMoveLock = LXGLCML_PANY; } } break; case LXGLCML_NONE: this->mx = event.GetX(); this->my = event.GetY(); this->m_sCameraStartAutoRotateAngle = this->m_sCameraAutoRotateAngle; this->setup->StartCameraMovement(); this->m_sMoveSingle = false; if (event.LeftDown() && event.ShiftDown()) { this->m_sMoveLock = LXGLCML_PANX2Y; this->m_sMoveSingle = true; } else if (event.LeftDown() && event.ControlDown()) { this->m_sMoveLock = LXGLCML_TILT; this->m_sMoveSingle = true; } else if (event.LeftDown()) { this->m_sMoveLock = LXGLCML_ZOOM2ROTATE; } else if (event.RightDown()) { this->m_sMoveLock = LXGLCML_PANX2Y; } else if (event.MiddleDown()) { this->m_sMoveLock = LXGLCML_TILT; } break; } if (this->m_sMoveLock != LXGLCML_NONE) { if (!this->HasCapture()) { this->CaptureMouse(); } } } void lxGLCanvas::OnMouseWheel(wxMouseEvent& event) { if (this->m_sMoveLock == LXGLCML_NONE) { this->setup->StartCameraMovement(); this->setup->TiltCamera(-1.0 * double(event.GetWheelRotation()) / double(event.GetWheelDelta())); this->ForceRefresh(); } } void lxGLCanvas::OnMouseMove(wxMouseEvent& event) { double f, ff; switch (this->m_sMoveLock) { case LXGLCML_ZOOM: case LXGLCML_ROTATE: case LXGLCML_ZOOM2ROTATE: if ((this->m_sMoveLock == LXGLCML_ZOOM) || (this->m_sMoveLock == LXGLCML_ZOOM2ROTATE)) f = pow(1.4142135623730950488016887242097, double(this->my - event.GetY()) / 20.0); else f = 1.0; if ((!this->m_sCameraLockRotation) && ((this->m_sMoveLock == LXGLCML_ROTATE) || (this->m_sMoveLock == LXGLCML_ZOOM2ROTATE))) { ff = double(event.GetX() - this->mx) / 2.0; } else { ff = 0.0; } this->setup->ZoomCamera(f); if (this->m_sCameraAutoRotate) { this->m_sCameraAutoRotateAngle = this->m_sCameraStartAutoRotateAngle + ff / 50.0; #ifdef LXWIN32 if (!this->CameraAutoRotate()) this->ForceRefresh(); #endif } else { this->setup->RotateCamera(ff); this->ForceRefresh(); } break; case LXGLCML_PANX: case LXGLCML_PANY: case LXGLCML_PANX2Y: if ((this->m_sMoveLock == LXGLCML_PANX) || (this->m_sMoveLock == LXGLCML_PANX2Y)) f = double(event.GetX() - this->mx) / double(this->ww); else f = 0.0; if ((this->m_sMoveLock == LXGLCML_PANY) || (this->m_sMoveLock == LXGLCML_PANX2Y)) ff = double(event.GetY() - this->my) / double(this->wh); else ff = 0.0; this->setup->PanCamera(f, ff); this->ForceRefresh(); break; case LXGLCML_TILT: this->setup->TiltCamera(double(event.GetY() - this->my) / 2.0); if (this->m_sCameraAutoRotate) { #ifdef LXWIN32 if (!this->CameraAutoRotate()) this->ForceRefresh(); #else ; #endif } else { this->ForceRefresh(); } break; } if (this->m_sMoveLock != LXGLCML_NONE) { if (!this->HasCapture()) { this->CaptureMouse(); } } } void lxGLCanvas::OnKeyPress(wxKeyEvent& event) { switch (event.GetKeyCode()) { case WXK_ESCAPE: if (this->frame->IsFullScreen()) this->frame->ToggleFullScreen(); break; case WXK_LEFT: this->setup->StartCameraMovement(); if (event.ShiftDown()) this->setup->PanCamera(-0.02, 0.0); else this->setup->RotateCamera(-1.0); this->ForceRefresh(); break; case WXK_RIGHT: this->setup->StartCameraMovement(); if (event.ShiftDown()) this->setup->PanCamera(0.02, 0.0); else this->setup->RotateCamera(1.0); this->ForceRefresh(); break; case WXK_UP: this->setup->StartCameraMovement(); if (event.ShiftDown()) this->setup->PanCamera(0.0, -0.02); else if (event.ControlDown()) this->setup->ZoomCamera(1.02); else this->setup->TiltCamera(-1.0); this->ForceRefresh(); break; case WXK_DOWN: this->setup->StartCameraMovement(); if (event.ShiftDown()) this->setup->PanCamera(0.0, 0.02); else if (event.ControlDown()) this->setup->ZoomCamera(0.98); else this->setup->TiltCamera(1.0); this->ForceRefresh(); break; default: event.Skip(); } } #define lxFNTSH (this->IsRenderingOff() ? (this->m_fntNumericO->pointSize() * this->m_fntNumericO->resolution() / 72.0) : 13.0) #define lxFNTSW (this->IsRenderingOff() ? (0.55 * lxFNTSH) : 6.0) #define lxFNTLH (this->IsRenderingOff() ? (this->m_fntTitleO->pointSize() * this->m_fntTitleO->resolution() / 72.0) : 20.0) #define lxFNTLW (this->IsRenderingOff() ? (0.55 * lxFNTLH) : 10.0) OGLFT::Face * lxGLCanvas::GetFontNumeric() { if (this->IsRenderingOff()) return this->m_fntNumericO; else return this->m_fntNumericS; } OGLFT::Face * lxGLCanvas::GetFontTitle() { if (this->IsRenderingOff()) return this->m_fntTitleO; else return this->m_fntTitleS; } void lxGLCanvas::SetCamera() { double minclip, maxclip, vclip, hclip; lxVecLimits ml = this->setup->data_limits.Rotate(this->setup->cam_dir, this->setup->cam_tilt, this->setup->cam_center); //printf("\n\n\nCAMERA\n"); //printf(" dir: %12.2f\n", this->setup->cam_dir); //printf(" tilt: %12.2f\n", this->setup->cam_tilt); //printf(" ext x: %12.2f%12.2f\n", ml.min.x, ml.max.x); //printf(" y: %12.2f%12.2f\n", ml.min.y, ml.max.y); //printf(" z: %12.2f%12.2f\n", ml.min.z, ml.max.z); //printf("center: %12.2f%12.2f%12.2f\n", lxVecXYZ(this->setup->cam_center)); //printf(" pos: %12.2f%12.2f%12.2f\n", lxVecXYZ(this->setup->cam_pos)); //printf(" dist: %12.2f\n", this->setup->cam_dist); minclip = this->setup->cam_dist + ml.min.y; if (minclip < 0.0) minclip = 1.0; minclip = 0.9 * minclip; maxclip = this->setup->cam_dist + ml.max.y; maxclip = 1.1 * maxclip; if (maxclip < minclip) maxclip = minclip + 1.0; if (minclip < (maxclip / 100.0)) minclip = maxclip / 100.0; glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (this->setup->cam_persp) { if (!this->m_isO) { gluPerspective(this->setup->cam_lens_vfov, this->setup->cam_width, minclip, maxclip); } else { if (this->TRCGetContext()) { trPerspective(this->TRCGetContext(), this->setup->cam_lens_vfov, this->setup->cam_width, minclip, maxclip); } else { gluPerspective(this->setup->cam_lens_vfov, this->setup->cam_width, minclip, maxclip); } } } else { vclip = this->setup->cam_dist * this->setup->cam_lens_vfovr; hclip = vclip * this->setup->cam_width; //printf("x clip: %12.2f%12.2f\n", -hclip, hclip); //printf("y clip: %12.2f%12.2f\n", -vclip, vclip); if (!this->m_isO) { glOrtho(-hclip, hclip, -vclip, vclip, minclip, maxclip); } else { if (this->TRCGetContext() != NULL) { trOrtho(this->TRCGetContext(), -hclip, hclip, -vclip, vclip, minclip, maxclip); } else { glOrtho(-hclip, hclip, -vclip, vclip, minclip, maxclip); } } } //printf("z clip: %12.2f%12.2f\n", minclip, maxclip); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); lxVec up = lxVec( sin(this->setup->cam_tilt / 180.0 * lxPI) * sin(this->setup->cam_dir / 180.0 * lxPI), sin(this->setup->cam_tilt / 180.0 * lxPI) * cos(this->setup->cam_dir / 180.0 * lxPI), cos(this->setup->cam_tilt / 180.0 * lxPI) ); //printf("LOOK FROM: %12.2f%12.2f%12.f\n", lxShiftVecXYZ(this->setup->cam_pos,this->shift)); //printf(" TO: %12.2f%12.2f%12.f\n", lxShiftVecXYZ(this->setup->cam_center,this->shift)); //printf(" UP: %12.2f%12.2f%12.f\n", lxVecXYZ(up)); if (this->setup->cam_anaglyph) { lxVec aRPosShift = (this->setup->cam_anaglyph_left ? -1.0 : 1.0) * (this->setup->cam_anaglyph_eyesep * this->setup->cam_dist) * lxVec( -cos(this->setup->cam_dir / 180.0 * lxPI), sin(this->setup->cam_dir / 180.0 * lxPI), 0 ); gluLookAt(lxShiftVecXYZ(this->setup->cam_pos,this->shift + aRPosShift), lxShiftVecXYZ(this->setup->cam_center, this->shift), lxVecXYZ(up)); } else { gluLookAt(lxShiftVecXYZ(this->setup->cam_pos,this->shift), lxShiftVecXYZ(this->setup->cam_center,this->shift), lxVecXYZ(up)); } // Save view coordinates glGetDoublev(GL_MODELVIEW_MATRIX, m_camera_modelview); glGetDoublev(GL_PROJECTION_MATRIX, m_camera_projection); glGetIntegerv(GL_VIEWPORT, m_camera_viewport); } static const GLfloat mat0[] = { 0.0, 0.0, 0.0, 1.0}; static const GLfloat mat1[] = { 1.0, 1.0, 1.0, 1.0}; static const GLfloat mat2[] = { 0.5}; static const GLfloat mat3[] = { 1.0, 1.0, 1.0, 0.5}; void lxGLCanvas::RenderScrapWalls() { GLfloat clr[4]; clr[0] = 1.0; clr[1] = 1.0; clr[2] = 1.0; clr[3] = this->setup->m_walls_opacity; glColor4f(1.0,1.0,1.0,this->setup->m_walls_opacity); glShadeModel(GL_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_LIGHTING); bool useTransparency; useTransparency = false; if (this->setup->m_walls_transparency && (clr[3] < 1.0)) { lxVec viewDir; viewDir = this->setup->cam_center - this->setup->cam_pos; viewDir.Normalize(); this->data->allWallsSorted->SetVector(viewDir.x, viewDir.y, viewDir.z); glDepthMask(GL_FALSE); glEnable(GL_BLEND); useTransparency = true; } else { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); glEnable(GL_COLOR_MATERIAL); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat0); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat0); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat2); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); glColor4fv(clr); vtkIdType * cPts, nPts, xP; double * nmv, * ptc, nmvv[3]; this->data->scrapWallsNormals->Update(); vtkPolyData * pdt; if (useTransparency) { pdt = this->data->allWallsSorted->GetOutput(); } else { pdt = this->data->allWallsStripped->GetOutput(); } vtkCellArray * tgs = pdt->GetPolys(); vtkCellArray * tss = pdt->GetStrips(); vtkDataArray * nms = pdt->GetPointData()->GetNormals(); #define draw3vert(N) \ ptc = pdt->GetPoint(cPts[N]); \ nmv = nms->GetTuple(cPts[N]); \ glNormal3f(nmv[0],nmv[1],nmv[2]); \ if ((!this->setup->cam_anaglyph) && (this->setup->m_colormd != lxSETUP_COLORMD_DEFAULT) && (this->setup->m_colormd_app_walls)) { \ this->data->luTable->GetColor(ptc[2], nmvv); \ clr[0] = nmvv[0]; clr[1] = nmvv[1]; clr[2] = nmvv[2]; \ glColor4fv(clr); \ } \ glVertex3f(lxShiftVecX3(ptc, this->shift)); tgs->InitTraversal(); glBegin(GL_TRIANGLES); while (tgs->GetNextCell(nPts, cPts) != 0) { if (nPts == 3) { draw3vert(0); draw3vert(1); draw3vert(2); } } glEnd(); tss->InitTraversal(); while (tss->GetNextCell(nPts, cPts) != 0) { glBegin(GL_TRIANGLE_STRIP); for(xP = 0; xP < nPts; xP++) { draw3vert(xP); } glEnd(); } glDisable(GL_COLOR_MATERIAL); } void lxGLCanvas::RenderSurface() { GLfloat clr[4]; clr[0] = 1.0; clr[1] = 1.0; clr[2] = 1.0; clr[3] = this->setup->m_srf_opacity; bool srf_tex = (this->data->m_textureSurface.image.data != NULL) && (this->setup->m_srf_texture); glShadeModel(GL_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glColor4f(1.0,1.0,1.0,this->setup->m_srf_opacity); if (this->setup->m_srf_transparency && (clr[3] < 1.0)) { lxVec viewDir; viewDir = this->setup->cam_center - this->setup->cam_pos; viewDir.Normalize(); this->data->surfaceSorted->SetVector(viewDir.x, viewDir.y, viewDir.z); glDepthMask(GL_FALSE); glEnable(GL_BLEND); } else { glDepthMask(GL_TRUE); glDisable(GL_BLEND); } glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat0); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, clr); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat0); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat2); if (srf_tex) { glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glBindTexture(GL_TEXTURE_2D, this->m_idTexSurface); } else { glDisable(GL_TEXTURE_2D); } if (this->setup->m_srf_lighting) glEnable(GL_LIGHTING); else glDisable(GL_LIGHTING); vtkIdType * cPts, nPts; double * nmv, * ptc; this->data->surfaceSorted->Update(); vtkPolyData * pdt = this->data->surfaceSorted->GetOutput(); vtkCellArray * tgs = pdt->GetPolys(); vtkDataArray * nms = pdt->GetPointData()->GetNormals(); tgs->InitTraversal(); glBegin(GL_TRIANGLES); while (tgs->GetNextCell(nPts, cPts) != 0) { if (nPts == 3) { // nmv = this->data->luTable->GetColor(ptc[2]); // clr[0] = nmv[0]; clr[1] = nmv[1]; clr[2] = nmv[2]; // glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, clr); #undef draw3vert #define draw3vert(N) \ ptc = pdt->GetPoint(cPts[N]); \ nmv = nms->GetTuple(cPts[N]); \ glNormal3f(nmv[0],nmv[1],nmv[2]); \ if (srf_tex) \ glTexCoord2f(\ (ptc[0] * this->data->m_textureSurface.xx + ptc[1] * this->data->m_textureSurface.xy + this->data->m_textureSurface.dx) / this->data->m_textureSurface.iw, \ 1.0 - (ptc[0] * this->data->m_textureSurface.yx + ptc[1] * this->data->m_textureSurface.yy + this->data->m_textureSurface.dy) / this->data->m_textureSurface.ih); \ glVertex3f(lxShiftVecX3(ptc, this->shift)); \ draw3vert(0); draw3vert(1); draw3vert(2); } } glEnd(); glDisable(GL_TEXTURE_2D); } void lxGLCanvas::RenderCenterline() { if (this->IsRenderingOff()) { glLineWidth(this->m_renderData->m_imgResolution / 96.0); } else { glLineWidth(1.0); } double clrs[3], clrc[3]; if (this->setup->cam_anaglyph) { if ((this->m_renderData != NULL) && (this->m_renderData->m_scaleMode != LXRENDER_FIT_SCREEN) && this->m_renderData->m_imgWhiteBg) { clrc[0] = 0.0;clrc[1] = 0.0;clrc[2] = 0.0; } else { clrc[0] = 1.0;clrc[1] = 1.0;clrc[2] = 1.0; } } else { clrc[0] = 0.0;clrc[1] = 1.0;clrc[2] = 1.0; } clrs[0] = 0.5; clrs[1] = 0.5; clrs[2] = 0.5; bool prevsurface = false; lxDataShot * psh; lxVec * stv; double clr[3]; unsigned long id, nid; nid = this->data->shots.size(); glColor3f(clrc[0],clrc[1],clrc[2]); glBegin(GL_LINES); for(id = 0; id < nid; id++) { psh = &(this->data->shots[id]); if (psh->invisible) continue; if (psh->splay && (!this->setup->m_vis_centerline_splay)) continue; if (psh->duplicate && (!this->setup->m_vis_centerline_duplicate)) continue; #define drawLvert(N) \ stv = &(this->data->stations[N].pos); \ if ((!psh->surface) && (!this->setup->cam_anaglyph) && (this->setup->m_colormd != lxSETUP_COLORMD_DEFAULT) && (this->setup->m_colormd_app_centerline)) { \ this->data->luTable->GetColor(stv->z, clr); \ glColor3f(clr[0],clr[1],clr[2]); \ } \ glVertex3f(lxShiftVecPXYZ(stv, this->shift)); if ((psh->surface && this->setup->m_vis_centerline_surface) || ((!psh->surface) && this->setup->m_vis_centerline_cave)) { if (prevsurface != psh->surface) { if (psh->surface) { glColor3f(clrs[0],clrs[1],clrs[2]); } else { glColor3f(clrc[0],clrc[1],clrc[2]); } } drawLvert(psh->from); drawLvert(psh->to); } prevsurface = psh->surface; } glEnd(); } void lxGLCanvas::ProjectPoint(double src_x, double src_y, double src_z, GLdouble * x, GLdouble * y, GLdouble * z) { gluProject(src_x, src_y, src_z, m_camera_modelview, m_camera_projection, m_camera_viewport, x, y, z); } void lxGLCanvas::ProjectStations() { unsigned long id, nid; nid = this->data->stations.size(); lxDataStation * st; for(id = 0; id < nid; id++) { st = &(this->data->stations[id]); this->ProjectPoint(lxShiftVecPXYZ(&(st->pos), this->shift), &(st->m_screen_x), &(st->m_screen_y), &(st->m_screen_z)); } } void lxGLCanvas::RenderOffList() { if (!(this->setup->m_vis_centerline_fix || this->setup->m_vis_centerline_station || this->setup->m_vis_centerline_entrance)) return; this->ProjectStations(); this->SetIndicatorsTransform(); // Render stations unsigned long id, nid; nid = this->data->stations.size(); lxDataStation * st; GLdouble x, y, z; GLuint fxList, enList, stList; glShadeModel(GL_FLAT); glDepthMask(GL_TRUE); glDisable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (this->IsRenderingOff()) { if (this->m_oStList == 0) { this->m_oStList = glGenLists(3); this->m_oEntList = this->m_oStList + 1; this->m_oFixList = this->m_oStList + 2; } stList = this->m_oStList; enList = this->m_oEntList; fxList = this->m_oFixList; } else { if (this->m_sStList == 0) { this->m_sStList = glGenLists(3); this->m_sEntList = this->m_sStList + 1; this->m_sFixList = this->m_sStList + 2; } stList = this->m_sStList; enList = this->m_sEntList; fxList = this->m_sFixList; } glNewList(fxList, GL_COMPILE); glColor3f(0.2,0.0,0.0); glBegin(GL_TRIANGLE_FAN); glVertex3d( 0.0,-2.4,0.0); glVertex3d(+2.4, 0.0,0.0); glVertex3d( 0.0,+2.4,0.0); glVertex3d(-2.4, 0.0,0.0); glEnd(); glColor3f(1.0,0.0,0.0); glBegin(GL_LINE_STRIP); glVertex3d( 0.0,-2.4,0.0); glVertex3d(+2.4, 0.0,0.0); glVertex3d( 0.0,+2.4,0.0); glVertex3d(-2.4, 0.0,0.0); glVertex3d( 0.0,-2.4,0.0); glEnd(); glBegin(GL_LINES); glVertex3d( 0.0,-2.4,0.0); glVertex3d( 0.0,-3.4,0.0); glVertex3d(+2.4, 0.0,0.0); glVertex3d(+3.4, 0.0,0.0); glVertex3d( 0.0,+2.4,0.0); glVertex3d( 0.0,+3.4,0.0); glVertex3d(-2.4, 0.0,0.0); glVertex3d(-3.4, 0.0,0.0); glEnd(); glEndList(); glNewList(enList, GL_COMPILE); glColor3f(0.0,0.0,0.0); //glColor3f(0.1,0.3,0.1); glBegin(GL_TRIANGLE_FAN); glVertex3d(-4.4,-4.4,0.0); glVertex3d(-4.4, 2.4,0.0); glVertex3d(-2.4, 4.4,0.0); glVertex3d( 2.4, 4.4,0.0); glVertex3d( 4.4, 2.4,0.0); glVertex3d( 4.4,-4.4,0.0); glEnd(); glColor3f(0.3,1.0,0.3); glBegin(GL_LINE_STRIP); glVertex3d(-3.4,-3.4,0.0); glVertex3d(-0.4,-3.4,0.0); glVertex3d(-3.4,-0.4,0.0); glVertex3d(-3.4, 0.4,0.0); glVertex3d(-0.4, 3.4,0.0); glVertex3d( 0.4, 3.4,0.0); glVertex3d( 3.4, 0.4,0.0); glVertex3d( 3.4,-0.4,0.0); glVertex3d( 0.4,-3.4,0.0); glVertex3d( 3.4,-3.4,0.0); glEnd(); glEndList(); glNewList(stList, GL_COMPILE); glColor3f(1.0,1.0,0.0); glBegin(GL_LINES); glVertex3d(-2.4, 0,0); glVertex3d( 2.4, 0,0); glVertex3d( 0,-2.4,0); glVertex3d( 0,+2.4,0); glEnd(); glEndList(); if (this->setup->m_vis_centerline_station) { for(id = 0; id < nid; id++) { st = &(this->data->stations[id]); if (st->m_screen_z < 0.0) continue; x = (GLdouble)long(st->m_screen_x) + 0.5; y = (GLdouble)long(st->m_screen_y) + 0.5; z = - st->m_screen_z; if (st->m_temporary && (!this->setup->m_vis_centerline_splay)) continue; if (st->m_surface && (!this->setup->m_vis_centerline_surface)) continue; if ((!st->m_surface) && (!this->setup->m_vis_centerline_cave)) continue; glLoadIdentity(); glTranslated(x, y, z); glCallList(stList); } } glDisable(GL_DEPTH_TEST); if (this->setup->m_vis_centerline_fix) { for(id = 0; id < nid; id++) { st = &(this->data->stations[id]); if (st->m_fix) { if (st->m_screen_z < 0.0) continue; x = (GLdouble)long(st->m_screen_x) + 0.5; y = (GLdouble)long(st->m_screen_y) + 0.5; z = - st->m_screen_z; glLoadIdentity(); glTranslated(x, y, z); glCallList(fxList); } } } if (this->setup->m_vis_centerline_entrance) { for(id = 0; id < nid; id++) { st = &(this->data->stations[id]); if (st->m_entrance) { if (st->m_screen_z < 0.0) continue; x = (GLdouble)long(st->m_screen_x) + 0.5; y = (GLdouble)long(st->m_screen_y) + 0.5; z = - st->m_screen_z; glLoadIdentity(); glTranslated(x, y, z); glCallList(enList); } } } glLoadIdentity(); std::string cmnt; const char * csurvey; char strCBar[10]; bool show_label; this->GetFontNumeric()->setForegroundColor(1.0, 1.0, 0.5, 1.0); if (this->setup->m_stlabel_name || this->setup->m_stlabel_comment || this->setup->m_stlabel_altitude || this->setup->m_stlabel_survey) { for(id = 0; id < nid; id++) { show_label = false; st = &(this->data->stations[id]); if (st->m_screen_z < 0.0) continue; if (st->m_temporary) continue; if (this->setup->m_vis_centerline_entrance && st->m_entrance) show_label = true; if (this->setup->m_vis_centerline_fix && st->m_fix) show_label = true; if (st->m_surface && this->setup->m_vis_centerline_surface && this->setup->m_vis_centerline_station) show_label = true; if ((!st->m_surface) && this->setup->m_vis_centerline_cave && this->setup->m_vis_centerline_station) show_label = true; if (!show_label) continue; // name cmnt = ""; if (this->setup->m_stlabel_name && (strlen(st->m_name) > 0)) cmnt = st->m_name; // survey if (this->setup->m_stlabel_survey) { csurvey = this->data->surveys[st->m_survey_idx].m_full_name.c_str(); if (strlen(csurvey) > 0) { if (cmnt.length() > 0) cmnt += "@"; cmnt += csurvey; } } // altitude if (this->setup->m_stlabel_altitude) { if (this->frame->m_iniUnits == 1) { sprintf(&(strCBar[0]), "%.0f ft", st->pos.z / 0.3048); } else { sprintf(&(strCBar[0]), "%.0f m", st->pos.z); } if (cmnt.length() > 0) cmnt += ":"; cmnt += strCBar; } // comment if (this->setup->m_stlabel_comment && (strlen(st->m_comment) > 0)) { if (cmnt.length() > 0) cmnt += ":"; cmnt += st->m_comment; } x = (GLdouble)long(st->m_screen_x+0.5); y = (GLdouble)long(st->m_screen_y+0.5); z = - st->m_screen_z; if (cmnt.length() > 0) { this->GetFontNumeric()->draw(x + 5, y - 0.25 * lxFNTSH, z, wxString(wxConvUTF8.cMB2WX(cmnt.c_str()))); } } } } void lxGLCanvas::GeomOutline() { glBegin(GL_LINE_STRIP); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(0), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(4), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(0), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(1), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(5), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(1), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(2), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(6), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(2), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(3), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(7), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(3), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(0), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(4), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(5), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(6), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(7), this->shift)); glVertex3f(lxShiftVecXYZ(this->setup->data_limits.Vertex(4), this->shift)); glEnd(); } void lxGLCanvas::RenderAll() { if (this->m_isO) { if ((this->m_renderData != NULL) && (this->m_renderData->m_scaleMode != LXRENDER_FIT_SCREEN) && this->m_renderData->m_imgWhiteBg) glClearColor(1.0, 1.0, 1.0, 0.0); else glClearColor(0.0, 0.0, 0.0, 0.0); } else { glClearColor(0.0, 0.0, 0.0, 0.0); } glClearDepth(1.0); if (this->setup->cam_anaglyph) glClear(GL_DEPTH_BUFFER_BIT); else glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // vyrendruje outline glDisable(GL_LIGHTING); glShadeModel(GL_FLAT); glDepthMask(GL_TRUE); if (this->m_isO) { glLineWidth(this->m_renderData->m_scaleMode == LXRENDER_FIT_SCREEN ? 1.0 : this->m_renderData->m_imgResolution / 96.0); } else { glLineWidth(1.0); } glDisable(GL_BLEND); if (this->setup->cam_anaglyph) glColor3f(0.7, 0.7, 0.7); else glColor3f(1.0, 0.0, 0.0); if (this->setup->m_vis_bbox) this->GeomOutline(); glShadeModel(GL_SMOOTH); if (this->setup->m_vis_centerline) this->RenderCenterline(); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); if (this->setup->m_vis_walls) this->RenderScrapWalls(); glDisable(GL_CULL_FACE); if (this->setup->m_vis_surface) this->RenderSurface(); glDepthMask(GL_TRUE); glDisable(GL_BLEND); glShadeModel(GL_FLAT); } void lxGLCanvas::OpenGLInit() { glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void lxGLCanvas::SetIndicatorsTransform() { if (this->m_isO) { this->m_indRes = this->m_renderData->m_imgResolution / 25.4; // pixels per mm this->m_indLWidth = 0.5; // line width mm if ((this->m_indLWidth * this->m_indRes) < 1.0) { this->m_indLWidth = 1.0 / this->m_indRes; // line width mm } } else { this->m_indRes = 3.7795276; // pixels per mm this->m_indLWidth = 1.0 / this->m_indRes; // line width mm glLineWidth(1.0); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (this->m_isO) { trOrtho(this->TRCGetContext(), 0.0, this->m_renderData->m_imgPixW, 0.0, this->m_renderData->m_imgPixH, -1.0, 1.0); this->TRCBeginTile(); } else { glOrtho(0.0, this->ww, 0.0, this->wh, 0.0, 1.0); //gluOrtho2D(0.0, this->ww, 0.0, this->wh); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void lxGLCanvas::RenderInds() { this->SetFontColors(); if (this->m_isO) { this->m_indRes = this->m_renderData->m_imgResolution / 25.4; // pixels per mm this->m_indLWidth = 0.5; // line width mm if ((this->m_indLWidth * this->m_indRes) < 1.0) { this->m_indLWidth = 1.0 / this->m_indRes; // line width mm } } else { this->m_indRes = 3.7795276; // pixels per mm this->m_indLWidth = 1.0 / this->m_indRes; // line width mm glLineWidth(1.0); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (this->m_isO) { trOrtho(this->TRCGetContext(), 0.0, this->m_renderData->m_imgPixW, 0.0, this->m_renderData->m_imgPixH, -1.0, 1.0); this->TRCBeginTile(); } else { gluOrtho2D(0.0, this->ww, 0.0, this->wh); } glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glShadeModel(GL_FLAT); glMatrixMode(GL_MODELVIEW); glEnable(GL_BLEND); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glLoadIdentity(); glTranslatef(this->m_indRes * 9.0, this->m_indRes * 18.0, 0.0); this->RenderICompass(5.0); glLoadIdentity(); glTranslatef(this->m_indRes * 28.0, this->m_indRes * 13.0, 0.0); this->RenderIClino(8.0); glLoadIdentity(); glTranslatef(this->m_indRes * 34.0, this->m_indRes * 9.0, 0.0); this->RenderIScalebar(50.0); if ((!this->setup->cam_anaglyph) && (this->setup->m_colormd != lxSETUP_COLORMD_DEFAULT)) { glLoadIdentity(); glTranslatef(this->m_indRes * 4.0, this->m_indRes * 29.0, 0.0); this->RenderIDepthbar(40.0); } glLoadIdentity(); this->GetFontTitle()->draw(this->m_indRes * 3.0, this->m_indRes * 3.0, this->data->title); // if (this->m_isO) // this->m_fntTitleO->draw(this->m_indRes * 3.0, this->m_indRes * 3.0, this->data->title); // else // this->m_fntTitleS->draw(this->m_indRes * 3.0, this->m_indRes * 3.0, this->data->title); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); } #define clrTemplate(AW,AB,NL) {\ if (this->m_isO) {\ if (this->setup->cam_anaglyph) {\ if (this->m_renderData->m_imgWhiteBg)\ glColor4f AW; \ else \ glColor4f AB; \ } else \ glColor4f NL; \ } else { \ if (this->setup->cam_anaglyph) \ glColor4f AB; \ else \ glColor4f NL; \ } \ } #define clrOutCntr() clrTemplate((0.0, 0.0, 0.0, 1.0),(1.0, 1.0, 1.0, 1.0),(0.1, 0.1, 1.0, 1.0)) #define clrOutFill() clrTemplate((0.5, 0.5, 0.5, 0.5),(0.5, 0.5, 0.5, 0.5),(0.0, 0.0, 1.0, 0.5)) #define clrIndCntr() clrTemplate((0.0, 0.0, 0.0, 1.0),(1.0, 1.0, 1.0, 1.0),(1.0, 0.0, 0.0, 1.0)) #define clrIndFill() clrTemplate((0.5, 0.5, 0.5, 1.0),(0.5, 0.5, 0.5, 1.0),(1.0, 0.8, 0.0, 1.0)) #define v2r(x,y) glVertex2f(this->m_indRes * (x), this->m_indRes * (y)) #define hlw (this->m_indLWidth / 2.0) void lxGLCanvas::RenderICompass(double size) { int t; glPushMatrix(); glRotatef(this->setup->cam_dir, 0.0, 0.0, 1.0); clrOutFill(); // draw circle aroung glBegin(GL_TRIANGLE_FAN); for(t = 0; t < 360; t++) { v2r( (size - hlw) * sin(double(t)/180.0*lxPI), (size - hlw) * cos(double(t)/180.0*lxPI)); } glEnd(); clrOutCntr(); if (this->m_isO) { glBegin(GL_TRIANGLE_STRIP); for(t = 0; t <= 360; t++) { v2r( (size - hlw) * sin(double(t)/180.0*lxPI), (size - hlw) * cos(double(t)/180.0*lxPI)); v2r( (size + hlw) * sin(double(t)/180.0*lxPI), (size + hlw) * cos(double(t)/180.0*lxPI)); } glEnd(); } else { glBegin(GL_LINE_STRIP); for(t = 0; t <= 360; t++) { v2r( (size - hlw) * sin(double(t)/180.0*lxPI), (size - hlw) * cos(double(t)/180.0*lxPI)); } glEnd(); } this->RenderILine(0.0, -size - 0.75, 0.0, -size + 1.0); this->RenderILine(-size - 0.75, 0.0, -size + 1.0, 0.0); this->RenderILine( size - 1.0, 0.0, size + 0.75, 0.0); lxVec a1, a2, a3, a4; a1 = lxVec(0.0, size + 1.0, 0.0); a2 = a1.Rotated(150.0, 0.0); a3 = a1.Rotated(-150.0, 0.0); a4 = lxVec(0.0, -0.333 * size, 0.0); clrIndFill(); glBegin(GL_TRIANGLE_STRIP); v2r(a2.x, a2.y); v2r(a1.x, a1.y); v2r(a4.x, a4.y); v2r(a3.x, a3.y); glEnd(); clrIndCntr(); this->RenderILine(a1.x, a1.y, a2.x, a2.y); this->RenderILine(a1.x, a1.y, a3.x, a3.y); this->RenderILine(a4.x, a4.y, a2.x, a2.y); this->RenderILine(a4.x, a4.y, a3.x, a3.y); glPopMatrix(); #if wxCHECK_VERSION(3,0,0) this->GetFontNumeric()->draw((-2.0) * lxFNTSW, this->m_indRes * (-size - 1.0) - lxFNTSH, wxString::Format(_("%03d\xc2\xb0"), int(this->setup->cam_dir))); #else this->GetFontNumeric()->draw((-2.0) * lxFNTSW, this->m_indRes * (-size - 1.0) - lxFNTSH, wxString::Format(_("%03d\260"), int(this->setup->cam_dir))); #endif } void lxGLCanvas::RenderIClino(double size) { #define awn 0.75 #define awt 1.5 #define aae 0.33 int t; double tilt = this->setup->cam_tilt; bool neg = tilt < 0.0; glPushMatrix(); if (neg) glTranslatef(0.0, this->m_indRes * size, 0.0); clrOutFill(); if (fabs(tilt) > 0.0) { glBegin(GL_TRIANGLE_FAN); v2r(0.0, 0.0); for(t = 0; t <= 20; t++) { v2r( (-size) * cos(double(t) * (tilt / 20.0) / 180.0 * lxPI), (size) * sin(double(t) * (tilt / 20.0) / 180.0 * lxPI)); } glEnd(); } clrOutCntr(); if (this->m_isO) { glBegin(GL_TRIANGLE_STRIP); for(t = 0; t <= 90; t += 5) { v2r( (-1.0) * (size - hlw) * cos(double(t)/180.0*lxPI), (neg ? -1.0 : 1.0) * (size - hlw) * sin(double(t)/180.0*lxPI)); v2r( (-1.0) * (size + hlw) * cos(double(t)/180.0*lxPI), (neg ? -1.0 : 1.0) * (size + hlw) * sin(double(t)/180.0*lxPI)); } glEnd(); } else { glBegin(GL_LINE_STRIP); for(t = 0; t <= 90; t += 5) { v2r( (-1.0) * (size) * cos(double(t)/180.0*lxPI), (neg ? -1.0 : 1.0) * (size) * sin(double(t)/180.0*lxPI)); } glEnd(); } this->RenderILine(-size - 1.0, 0.0, 1.0, 0.0); this->RenderILine(0.0, (neg ? 1.0 : -1.0), 0.0, (neg ? -size - 1.0 : size + 1.0)); this->RenderILine(-size, (neg ? 1.0 : -1.0), -size, 0.0); this->RenderILine(0.0, (neg ? -size : size), 1.0, (neg ? -size : size)); glPushMatrix(); glRotatef(-tilt, 0.0, 0.0, 1.0); clrIndFill(); glBegin(GL_QUADS); v2r(-size - 1.0, -awn); v2r(-size - 1.0, awn); v2r(-aae * size, awn); v2r(-aae * size, -awn); glEnd(); glBegin(GL_TRIANGLES); v2r(-aae * size, awt); v2r(-aae * size, -awt); v2r(0.0, 0.0); glEnd(); clrIndCntr(); this->RenderILine(-size - 1.0, -awn, -size - 1.0, awn); this->RenderILine(-size - 1.0, -awn, -aae * size, -awn); this->RenderILine(-size - 1.0, awn, -aae * size, awn); this->RenderILine(-aae * size, -awn, -aae * size, -awt); this->RenderILine(-aae * size, awn, -aae * size, awt); this->RenderILine(-aae * size, -awt, 0.0, 0.0); this->RenderILine(-aae * size, awt, 0.0, 0.0); glPopMatrix(); glPopMatrix(); #if wxCHECK_VERSION(3,0,0) this->GetFontNumeric()->draw(this->m_indRes * (-size) / 2.0 - 1.5 * lxFNTSW, this->m_indRes * (-1.0) - lxFNTSH, wxString::Format(_("%+03d\xc2\xb0"), int(this->setup->cam_tilt))); #else this->GetFontNumeric()->draw(this->m_indRes * (-size) / 2.0 - 1.5 * lxFNTSW, this->m_indRes * (-1.0) - lxFNTSH, wxString::Format(_("%+03d\260"), int(this->setup->cam_tilt))); #endif } void lxGLCanvas::RenderIDepthbar(double size) { #define dbw 3.0 #define dbtw 0.8 #define dbnc 32 int t; double clv[3], * clr; clr = this->data->luTable->GetRange(); glShadeModel(GL_SMOOTH); glBegin(GL_QUAD_STRIP); for(t = 0; t <= dbnc; t++) { this->data->luTable->GetColor(clr[0] + t / double(dbnc) * (clr[1] - clr[0]), clv); glColor4f(clv[0], clv[1], clv[2], 1.0); v2r(0.0, double(t) * size / double(dbnc)); v2r(dbw, double(t) * size / double(dbnc)); } glEnd(); glShadeModel(GL_FLAT); clrOutCntr(); this->RenderILine(dbw, 0.0, dbw, size); char strCBar[10]; for(t = 0; t <= 10; t++) { clrOutCntr(); this->RenderILine(dbw, double(t) * size / 10.0, dbw + dbtw, double(t) * size / 10.0); if (this->frame->m_iniUnits == 1) { sprintf(&(strCBar[0]), "%.0f ft", (clr[0] + double(t) / 10.0 * (clr[1] - clr[0])) / 0.3048); } else { sprintf(&(strCBar[0]), "%.0f m", (clr[0] + double(t) / 10.0 * (clr[1] - clr[0]))); } this->GetFontNumeric()->draw(this->m_indRes * dbw + lxFNTSW, this->m_indRes * (double(t) * size / 10.0) - 0.333 * lxFNTSH, strCBar); } // Depth-bar title this->GetFontNumeric()->draw(0.0, this->m_indRes * (size + 1.0) + 0.5 * lxFNTSH, wxString(_("Altitude"))); } void lxGLCanvas::RenderIScalebar(double size) { #define sbh 2.0 #define sbt 1.5 // upravime size tak, aby zodpovedala 1.0, 2.5 alebo 5.0 // nasobku standardnej velkosti // pixel -> 1 meter??? char strLen[32]; double sblen, scale; int sbtest; // scale = m / pixel scale = 2.0 * this->setup->cam_dist * this->setup->cam_lens_vfovr / (this->m_isO ? this->m_renderData->m_imgPixH : this->wh); if (this->frame->m_iniUnits == 1) { bool miles; miles = false; sbtest = int(floor(log((size * this->m_indRes) * scale / 0.3048) / log(pow(10.0,1.0/3.0)))); sblen = pow(10.0,floor(double(sbtest)/3.0)); switch (sbtest % 3) { case 0: sblen *= 1.0; break; case -2: case 1: sblen *= 2.5; break; default: sblen *= 5.0; break; } size = sblen * 0.3048 / scale / this->m_indRes; if (sbtest > 12) { size *= 1.6; miles = true; sbtest = int(floor(log((size * this->m_indRes) * scale / 1609.344) / log(pow(10.0,1.0/3.0)))); if (sbtest < 0) sbtest = 0; sblen = pow(10.0,floor(double(sbtest)/3.0)); switch (sbtest % 3) { case 0: sblen *= 1.0; break; case -2: case 1: sblen *= 2.5; break; default: sblen *= 5.0; break; } size = sblen * 1609.344 / scale / this->m_indRes; } if (miles) sprintf(&(strLen[0]),"%.0f mi", sblen); else if (sblen > 4.0) sprintf(&(strLen[0]),"%.0f ft", sblen); else sprintf(&(strLen[0]),"%g in", 12.0 * sblen); } else { sbtest = int(floor(log((size * this->m_indRes) * scale) / log(pow(10.0,1.0/3.0)))); sblen = pow(10.0,floor(double(sbtest)/3.0)); switch (sbtest % 3) { case 0: sblen *= 1.0; break; case -2: case 1: sblen *= 2.5; break; default: sblen *= 5.0; break; } size = sblen / scale / this->m_indRes; if (sblen >= 10000.0) sprintf(&(strLen[0]),"%.0f km", sblen / 1000.0); else if (sblen >= 4.0) sprintf(&(strLen[0]),"%.0f m", sblen); else if (sblen >= 0.01) sprintf(&(strLen[0]),"%.0f mm", sblen * 1000.0); else sprintf(&(strLen[0]),"%g mm", sblen * 1000.0); } clrOutFill(); glBegin(GL_QUADS); v2r(0.0 * size, 0.0); v2r(0.2 * size, 0.0); v2r(0.2 * size, sbh); v2r(0.0 * size, sbh); v2r(0.4 * size, 0.0); v2r(0.6 * size, 0.0); v2r(0.6 * size, sbh); v2r(0.4 * size, sbh); v2r(0.8 * size, 0.0); v2r(1.0 * size, 0.0); v2r(1.0 * size, sbh); v2r(0.8 * size, sbh); glEnd(); clrOutCntr(); this->RenderILine(0.0, 0.0, size, 0.0); this->RenderILine(0.0, sbh, size, sbh); this->RenderILine( 0.0, 0.0, 0.0, sbh + sbt); this->RenderILine(0.1 * size, sbh, 0.1 * size, sbh + sbt/3.0); this->RenderILine(0.2 * size, 0.0, 0.2 * size, sbh + sbt/3.0); this->RenderILine(0.3 * size, sbh, 0.3 * size, sbh + sbt/3.0); this->RenderILine(0.4 * size, 0.0, 0.4 * size, sbh + sbt/3.0); this->RenderILine(0.5 * size, sbh, 0.5 * size, sbh + 2.0*sbt/3.0); this->RenderILine(0.6 * size, 0.0, 0.6 * size, sbh + sbt/3.0); this->RenderILine(0.7 * size, sbh, 0.7 * size, sbh + sbt/3.0); this->RenderILine(0.8 * size, 0.0, 0.8 * size, sbh + sbt/3.0); this->RenderILine(0.9 * size, sbh, 0.9 * size, sbh + sbt/3.0); this->RenderILine( size, 0.0, size, sbh + sbt); this->GetFontNumeric()->draw(0.5 * size * this->m_indRes - 0.5 * double(strlen(strLen)) * lxFNTSW, (sbh + sbt + 1.0) * this->m_indRes, strLen); } void lxGLCanvas::RenderILine(double fx, double fy, double tx, double ty) { bool rounded; if (this->m_isO) rounded = true; else rounded = false; if (this->m_isO) { lxVec n, nr; int t; n = lxVec(tx, ty, 0.0) - lxVec(fx, fy, 0.0); n.Normalize(); n = hlw * lxVec(n.y, -n.x, n.z); glBegin(GL_QUADS); v2r(fx + n.x, fy + n.y); v2r(tx + n.x, ty + n.y); v2r(tx - n.x, ty - n.y); v2r(fx - n.x, fy - n.y); glEnd(); if (rounded) { glBegin(GL_TRIANGLE_FAN); v2r(fx - n.x, fy - n.y); for(t = 0; t > -180; t -= 30) { nr = n.Rotated(double(t), 0.0); v2r(fx + nr.x, fy + nr.y); } glEnd(); glBegin(GL_TRIANGLE_FAN); v2r(tx - n.x, ty - n.y); for(t = 0; t < 180; t += 30) { nr = n.Rotated(double(t), 0.0); v2r(tx + nr.x, ty + nr.y); } glEnd(); } } else { glBegin(GL_LINES); v2r(fx, fy); v2r(tx, ty); glEnd(); } } void lxGLCanvas::SetFontColors() { if (this->m_isO && this->m_renderData->m_imgWhiteBg) { this->GetFontTitle()->setForegroundColor(0.0, 0.0, 0.0, 1.0); this->GetFontNumeric()->setForegroundColor(0.0, 0.0, 0.0, 1.0); } else { if (this->setup->cam_anaglyph) { this->GetFontTitle()->setForegroundColor(1.0, 1.0, 1.0, 1.0); this->GetFontNumeric()->setForegroundColor(1.0, 1.0, 1.0, 1.0); } else { this->GetFontTitle()->setForegroundColor(0.0, 0.8, 1.0, 1.0); this->GetFontNumeric()->setForegroundColor(0.0, 0.8, 1.0, 1.0); } } } struct OSC { int m_Width, m_Height; bool m_OK; #ifdef LXWIN32 R2DContext * m_r2d; #endif #ifdef LXLINUX R2PContext * m_r2p; #endif OSC() { #ifdef LXWIN32 this->m_r2d = NULL; #endif #ifdef LXLINUX this->m_r2p = NULL; #endif this->m_Width = 0; this->m_Height = 0; this->m_OK = false; } }; bool lxGLCanvas::OSCMakeCurrent() { // urobime context current #ifdef LXWIN32 if (this->m_OSC->m_r2d) { R2DMakeCurrent(this->m_OSC->m_r2d); return true; } #endif #ifdef LXLINUX if (this->m_OSC->m_r2p) { R2PMakeCurrent(this->m_OSC->m_r2p); return true; } #endif return false; } bool lxGLCanvas::OSCInit(GLint w, GLint h) { // vytvorime dib // vytvorime context this->m_OSC = new OSC(); this->m_OSC->m_Width = w; this->m_OSC->m_Height = h; this->m_OSC->m_OK = true; #ifdef LXWIN32 this->m_OSC->m_r2d = R2DCreate(w, h); #endif #ifdef LXLINUX this->m_OSC->m_r2p = R2PCreate(w, h); #endif return this->m_OSC->m_OK; } void lxGLCanvas::OSCDestroy() { if (this->m_OSC != NULL) { #ifdef LXWIN32 if (this->m_OSC->m_r2d) R2DDestroy(this->m_OSC->m_r2d); #endif #ifdef LXLINUX if (this->m_OSC->m_r2p) R2PDestroy(this->m_OSC->m_r2p); #endif delete this->m_OSC; } this->m_OSC = NULL; } struct _TRctx * lxGLCanvas::TRCGetContext() { if (this->m_TRC != NULL) return this->m_TRC->m_ctx; else return NULL; } void lxGLCanvas::TRCInit(int type, GLint w, GLint h, GLint tw, GLint th) { if (this->m_TRC == NULL) { this->m_TRC = new TRC(); if (th < 64) th = 64; if (tw < 64) tw = 64; if (th > this->m_OSC->m_Height) th = this->m_OSC->m_Height; if (tw > this->m_OSC->m_Width) tw = this->m_OSC->m_Width; tw = tw - tw % 8; th = th - th % 8; TRcontext * ctx = this->m_TRC->m_ctx = trNew(); GLubyte * buff = this->m_TRC->m_buff = new GLubyte [3 * sizeof(GLubyte) * (type == LXGLCTR_IMAGE ? w : tw) * (type == LXGLCTR_IMAGE ? h : th)]; this->OSCMakeCurrent(); this->OpenGLInit(); trTileSize(ctx, tw, th, LXTRCBORDER); trImageSize(ctx, w, h); if (type == LXGLCTR_IMAGE) trImageBuffer(ctx, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *) buff); else trTileBuffer(ctx, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *) buff); } } GLint lxGLCanvas::TRCGet(int param) { if (this->m_TRC != NULL) return trGet(this->m_TRC->m_ctx, (TRenum) param); else return -1; } GLubyte * lxGLCanvas::TRCGetBuffer() { if (this->m_TRC != NULL) return this->m_TRC->m_buff; else return (GLubyte *) NULL; } void lxGLCanvas::TRCDestroy() { if (this->m_TRC != NULL) { delete [] this->m_TRC->m_buff; trDelete(this->m_TRC->m_ctx); delete this->m_TRC; } this->m_TRC = NULL; } void lxGLCanvas::TRCBeginTile() { if (this->m_TRC != NULL) { this->OSCMakeCurrent(); trBeginTile(this->m_TRC->m_ctx); } } bool lxGLCanvas::TRCEndTile() { if (this->m_TRC != NULL) return (trEndTile(this->m_TRC->m_ctx) > 0); else return false; } therion/loch/lxFile.h0000664000175000017500000001274611140004102013560 0ustar useruser#ifndef lxFile_h #define lxFile_h // Standard libraries #ifndef LXDEPCHECK #include #include #include #endif //LXDEPCHECK - standart libraries typedef char * lxFileBuff; #ifdef THMSVC #ifndef UINT32_MAX # define UINT32_MAX (0xffffffffUL) #endif #ifndef uint32_t #if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) typedef unsigned long uint32_t; # define UINT32_C(v) v ## UL # ifndef PRINTF_INT32_MODIFIER # define PRINTF_INT32_MODIFIER "l" # endif #elif (UINT_MAX == UINT32_MAX) typedef unsigned int uint32_t; # ifndef PRINTF_INT32_MODIFIER # define PRINTF_INT32_MODIFIER "" # endif # define UINT32_C(v) v ## U #elif (USHRT_MAX == UINT32_MAX) typedef unsigned short uint32_t; # define UINT32_C(v) ((unsigned short) (v)) # ifndef PRINTF_INT32_MODIFIER # define PRINTF_INT32_MODIFIER "" # endif #else #error "Platform not supported" #endif #endif #else #include #endif #define lxFileSizeT uint32_t struct lxFileSize { lxFileSizeT m_size; operator lxFileSizeT & () {return this->m_size;} lxFileSizeT & operator = (const lxFileSizeT & right) {return this->m_size = right;} lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; struct lxFileDbl { double m_num; operator double & () {return this->m_num;} double & operator = (const double & right) {return this->m_num = right;} lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; struct lxFileDataPtr { lxFileSize m_position, m_size; lxFileDataPtr(); void Clear(); lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; struct lxFileData { void * m_data; lxFileSizeT m_size, m_buffSize; lxFileData(); void Clear(); void Copy(lxFileSizeT size, const void * src); void BuffResize(lxFileSizeT size); const void * GetData(lxFileDataPtr ptr); const char * GetString(lxFileDataPtr ptr); FILE * GetTmpFile(lxFileDataPtr ptr); lxFileDataPtr AppendStr(const char * str); lxFileDataPtr AppendData(const void * data, lxFileSizeT size); lxFileDataPtr AppendFile(const char * fnm); }; struct lxFile3Point { lxFileDbl m_c[3]; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; struct lxFile3Angle { lxFileSize m_v[3]; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; struct lxFileSurvey { lxFileSize m_id, m_parent; lxFileDataPtr m_namePtr, m_titlePtr; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; typedef std::list lxFileSurvey_list; enum { LXFILE_STATION_FLAG_SURFACE = 1, LXFILE_STATION_FLAG_ENTRANCE = 2, LXFILE_STATION_FLAG_FIXED = 4, LXFILE_STATION_FLAG_CONTINUATION = 8, LXFILE_STATION_FLAG_HAS_WALLS = 16, }; struct lxFileStation { lxFileSize m_id, m_surveyId; lxFileDataPtr m_namePtr, m_commentPtr; lxFileSize m_flags; lxFileDbl m_c[3]; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); void SetFlag(int flag, bool value); bool GetFlag(int flag); lxFileStation(); }; typedef std::list lxFileStation_list; enum { LXFILE_SHOT_FLAG_SURFACE = 1, LXFILE_SHOT_FLAG_DUPLICATE = 2, LXFILE_SHOT_FLAG_NOT_VISIBLE = 4, LXFILE_SHOT_FLAG_NOT_LRUD = 8, LXFILE_SHOT_FLAG_SPLAY = 8, }; enum { LXFILE_SHOT_SECTION_NONE, LXFILE_SHOT_SECTION_OVAL, LXFILE_SHOT_SECTION_SQUARE, LXFILE_SHOT_SECTION_DIAMOND, LXFILE_SHOT_SECTION_TUNNEL, }; struct lxFileShot { lxFileSize m_from, m_to, m_surveyId; lxFileDbl m_fLRUD[4], m_tLRUD[4]; lxFileDbl m_threshold; lxFileSize m_flags, m_sectionType; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); void SetFlag(int flag, bool value); bool GetFlag(int flag); lxFileShot(); }; typedef std::list lxFileShot_list; struct lxFileScrap { lxFileSize m_id, m_surveyId; lxFileDataPtr m_pointsPtr, m_3AnglesPtr; lxFileSize m_numPoints, m_num3Angles; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; typedef std::list lxFileScrap_list; struct lxFileSurface { lxFileSize m_id; lxFileSize m_width, m_height; lxFileDbl m_calib[6]; lxFileDataPtr m_dataPtr; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; typedef std::list lxFileSurface_list; enum { LXFILE_BITMAP_JPEG, LXFILE_BITMAP_PNG, }; struct lxFileSurfaceBitmap { lxFileSize m_surfaceId; lxFileSize m_type; lxFileDbl m_calib[6]; lxFileDataPtr m_dataPtr; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; typedef std::list lxFileSurfaceBitmap_list; struct lxFile { static bool m_bigEndian; lxFileSurvey_list m_surveys; lxFileData m_surveysData; lxFileSizeT m_nSurveys; lxFileStation_list m_stations; lxFileData m_stationsData; lxFileSizeT m_nStations; lxFileShot_list m_shots; lxFileData m_shotsData; lxFileScrap_list m_scraps; lxFileData m_scrapsData; lxFileSurface_list m_surfaces; lxFileData m_surfacesData; lxFileSurfaceBitmap_list m_surfaceBitmaps; lxFileData m_surfaceBitmapsData; std::string m_error; FILE * m_file; static void switchEndian(char * data, lxFileSizeT size); void ImportLOX(const char * fn); void ExportLOX(const char * fn); void Import3D(const char * fn); void ImportPLT(const char * fn); lxFile(); ~lxFile(); void Clear(); bool HasAnyWalls(); void InterpolateMissingLRUD(); lxFileSurvey * NewSurvey(); lxFileStation * NewStation(); lxFileShot * NewShot(); }; #endif therion/loch/lxR2D.c0000664000175000017500000003723410507531566013313 0ustar useruser/* ** Simple example of rendering to a Windows DIB (Device Independent Bitmap) */ #include "lxR2D.h" #include #include #include #if !defined(M_PI) #define M_PI 3.14159265F #endif #define colorIndexMode FALSE #define doubleBuffered FALSE #define renderToDIB TRUE struct _R2DCTX { int winWidth, winHeight; HDC hDC; HGLRC hGLRC; HPALETTE hPalette; HBITMAP hBitmap; }; /* Struct used to manage color ramps */ struct R2DcolorIndexState { GLfloat amb[3]; /* ambient color / bottom of ramp */ GLfloat diff[3]; /* diffuse color / middle of ramp */ GLfloat spec[3]; /* specular color / top of ramp */ GLfloat ratio; /* ratio of diffuse to specular in ramp */ GLint indexes[3]; /* where ramp was placed in palette */ }; /* ** Each entry in this array corresponds to a color ramp in the ** palette. The indexes member of each struct is updated to ** reflect the placement of the color ramp in the palette. */ #define NUM_COLORS (sizeof(R2Dcolors) / sizeof(R2Dcolors[0])) struct R2DcolorIndexState R2Dcolors[] = { { { 0.0F, 0.0F, 0.0F }, { 0.1F, 0.6F, 0.3F }, { 1.0F, 1.0F, 1.0F }, 0.75F, { 0, 0, 0 }, }, { { 0.0F, 0.0F, 0.0F }, { 0.0F, 0.2F, 0.5F }, { 1.0F, 1.0F, 1.0F }, 0.75F, { 0, 0, 0 }, }, { { 0.0F, 0.05F, 0.05F }, { 0.6F, 0.0F, 0.8F }, { 1.0F, 1.0F, 1.0F }, 0.75F, { 0, 0, 0 }, }, }; /*****************************************************************/ void R2DsetupDIB(R2DContext * ctx) { HDC hDC = ctx->hDC; BITMAPINFO *bmInfo; BITMAPINFOHEADER *bmHeader; UINT usage; VOID *base; int bmiSize; int bitsPerPixel; bmiSize = sizeof(*bmInfo); bitsPerPixel = GetDeviceCaps(hDC, BITSPIXEL); switch (bitsPerPixel) { case 8: /* bmiColors is 256 WORD palette indices */ bmiSize += (256 * sizeof(WORD)) - sizeof(RGBQUAD); break; case 16: /* bmiColors is 3 WORD component masks */ bmiSize += (3 * sizeof(DWORD)) - sizeof(RGBQUAD); break; case 24: case 32: default: /* bmiColors not used */ break; } bmInfo = (BITMAPINFO *) calloc(1, bmiSize); bmHeader = &bmInfo->bmiHeader; bmHeader->biSize = sizeof(*bmHeader); bmHeader->biWidth = ctx->winWidth; bmHeader->biHeight = ctx->winHeight; bmHeader->biPlanes = 1; /* must be 1 */ bmHeader->biBitCount = (WORD) bitsPerPixel; bmHeader->biXPelsPerMeter = 0; bmHeader->biYPelsPerMeter = 0; bmHeader->biClrUsed = 0; /* all are used */ bmHeader->biClrImportant = 0; /* all are important */ switch (bitsPerPixel) { case 8: bmHeader->biCompression = BI_RGB; bmHeader->biSizeImage = 0; usage = DIB_PAL_COLORS; /* bmiColors is 256 WORD palette indices */ { WORD *palIndex = (WORD *) &bmInfo->bmiColors[0]; int i; for (i=0; i<256; i++) { palIndex[i] = (WORD)i; } } break; case 16: bmHeader->biCompression = BI_RGB; bmHeader->biSizeImage = 0; usage = DIB_RGB_COLORS; /* bmiColors is 3 WORD component masks */ { DWORD *compMask = (DWORD *) &bmInfo->bmiColors[0]; compMask[0] = 0xF800; compMask[1] = 0x07E0; compMask[2] = 0x001F; } break; case 24: case 32: default: bmHeader->biCompression = BI_RGB; bmHeader->biSizeImage = 0; usage = DIB_RGB_COLORS; /* bmiColors not used */ break; } ctx->hBitmap = CreateDIBSection(hDC, bmInfo, usage, &base, NULL, 0); if (ctx->hBitmap == NULL) { (void) MessageBox(WindowFromDC(hDC), "Failed to create DIBSection.", "OpenGL application error", MB_ICONERROR | MB_OK); exit(1); } SelectObject(hDC, ctx->hBitmap); free(bmInfo); } void R2DsetupPalette(R2DContext * ctx) { HDC hDC = ctx->hDC; PIXELFORMATDESCRIPTOR pfd; LOGPALETTE* pPal; int pixelFormat = GetPixelFormat(hDC); int paletteSize; DescribePixelFormat(hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); /* ** Determine if a palette is needed and if so what size. */ if (pfd.dwFlags & PFD_NEED_PALETTE) { paletteSize = 1 << pfd.cColorBits; } else if (pfd.iPixelType == PFD_TYPE_COLORINDEX) { paletteSize = 4096; } else { return; } pPal = (LOGPALETTE*) malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY)); pPal->palVersion = 0x300; pPal->palNumEntries = (WORD) paletteSize; if (pfd.iPixelType == PFD_TYPE_RGBA) { /* ** Fill the logical paletee with RGB color ramps */ int redMask = (1 << pfd.cRedBits) - 1; int greenMask = (1 << pfd.cGreenBits) - 1; int blueMask = (1 << pfd.cBlueBits) - 1; int i; for (i=0; ipalPalEntry[i].peRed = (BYTE)( (((i >> pfd.cRedShift) & redMask) * 255) / redMask); pPal->palPalEntry[i].peGreen = (BYTE)( (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask); pPal->palPalEntry[i].peBlue = (BYTE)( (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask); pPal->palPalEntry[i].peFlags = 0; } } else { /* ** Fill the logical palette with color ramps. ** ** Set up the logical palette so that it can be realized ** into the system palette as an identity palette. ** ** 1) The default static entries should be present and at the right ** location. The easiest way to do this is to grab them from ** the current system palette. ** ** 2) All non-static entries should be initialized to unique values. ** The easiest way to do this is to ensure that all of the non-static ** entries have the PC_NOCOLLAPSE flag bit set. */ int numRamps = NUM_COLORS; int rampSize = (paletteSize - 20) / numRamps; int extra = (paletteSize - 20) - (numRamps * rampSize); int i, r; /* ** Initialize static entries by copying them from the ** current system palette. */ GetSystemPaletteEntries(hDC, 0, paletteSize, &pPal->palPalEntry[0]); /* ** Fill in non-static entries with desired colors. */ for (r=0; rpalPalEntry[rampBase]; int diffSize = (int) (rampSize * R2Dcolors[r].ratio); int specSize = rampSize - diffSize; for (i=0; ipalPalEntry[index]; pe->peRed = (BYTE) 0; pe->peGreen = (BYTE) 0; pe->peBlue = (BYTE) 0; pe->peFlags = PC_NOCOLLAPSE; } } ctx->hPalette = CreatePalette(pPal); free(pPal); if (ctx->hPalette) { SelectPalette(hDC, ctx->hPalette, FALSE); RealizePalette(hDC); } } void R2DsetupPixelFormat(HDC hDC) { PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), /* size of this pfd */ 1, /* version num */ PFD_SUPPORT_OPENGL, /* support OpenGL */ 0, /* pixel type */ 0, /* 8-bit color depth */ 0, 0, 0, 0, 0, 0, /* color bits (ignored) */ 0, /* no alpha buffer */ 0, /* alpha bits (ignored) */ 0, /* no accumulation buffer */ 0, 0, 0, 0, /* accum bits (ignored) */ 16, /* depth buffer */ 0, /* no stencil buffer */ 0, /* no auxiliary buffers */ PFD_MAIN_PLANE, /* main layer */ 0, /* reserved */ 0, 0, 0, /* no layer, visible, damage masks */ }; int SelectedPixelFormat; BOOL retVal; pfd.cColorBits = (BYTE) GetDeviceCaps(hDC, BITSPIXEL); /* if (colorIndexMode) { */ /* pfd.iPixelType = PFD_TYPE_COLORINDEX; */ /* } else { */ pfd.iPixelType = PFD_TYPE_RGBA; /* } */ /* if (doubleBuffered) { */ /* pfd.dwFlags |= PFD_DOUBLEBUFFER; */ /* } */ /* if (renderToDIB) { */ pfd.dwFlags |= PFD_DRAW_TO_BITMAP; /* } else { */ /* pfd.dwFlags |= PFD_DRAW_TO_WINDOW; */ /* } */ SelectedPixelFormat = ChoosePixelFormat(hDC, &pfd); if (SelectedPixelFormat == 0) { (void) MessageBox(WindowFromDC(hDC), "Failed to find acceptable pixel format.", "OpenGL application error", MB_ICONERROR | MB_OK); exit(1); } retVal = SetPixelFormat(hDC, SelectedPixelFormat, &pfd); if (retVal != TRUE) { (void) MessageBox(WindowFromDC(hDC), "Failed to set pixel format.", "OpenGL application error", MB_ICONERROR | MB_OK); exit(1); } } R2DContext * R2DCreate(int width, int height) { R2DContext * ctx = (R2DContext *) calloc(1, sizeof(R2DContext)); if (ctx) { ctx->winWidth = width; ctx->winHeight = height; ctx->hDC = CreateCompatibleDC(NULL); R2DsetupDIB(ctx); R2DsetupPixelFormat(ctx->hDC); R2DsetupPalette(ctx); ctx->hGLRC = wglCreateContext(ctx->hDC); } return ctx; } void R2DMakeCurrent(R2DContext * ctx) { if (ctx) { wglMakeCurrent(ctx->hDC, ctx->hGLRC); } } void R2DDestroy(R2DContext * ctx) { if (ctx) { if (ctx->hGLRC) { wglMakeCurrent(NULL, NULL); wglDeleteContext(ctx->hGLRC); } DeleteDC(ctx->hDC); free(ctx); } } /* Stand alone stuff */ #ifndef LXWIN32 HDC hDCFrontBuffer; void (*idleFunc)(void); R2DContext * global_ctx; void drawTorus(void) { int numMajor = 32; int numMinor = 24; float majorRadius = 0.6F; float minorRadius = 0.2F; double majorStep = 2.0F*M_PI / numMajor; double minorStep = 2.0F*M_PI / numMinor; int i, j; for (i=0; iwinWidth > global_ctx->winHeight) { GLfloat aspect = (GLfloat) global_ctx->winWidth / (GLfloat) global_ctx->winHeight; glFrustum(-0.5F*aspect, 0.5F*aspect, -0.5F, 0.5F, 1.0F, 3.0F); } else { GLfloat aspect = (GLfloat) global_ctx->winHeight / (GLfloat) global_ctx->winWidth; glFrustum(-0.5F, 0.5F, -0.5F*aspect, 0.5F*aspect, 1.0F, 3.0F); } glMatrixMode(GL_MODELVIEW); } void init(void) { GLfloat matShine = 20.00F; GLfloat light0Pos[4] = { 0.70F, 0.70F, 1.25F, 0.00F }; glClearColor(R2Dcolors[2].diff[0], R2Dcolors[2].diff[1], R2Dcolors[2].diff[2], 1.0F); glClearIndex((GLfloat) R2Dcolors[2].indexes[1]); setProjection(); glTranslatef(0.0F, 0.0F, -2.0F); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, matShine); glLightfv(GL_LIGHT0, GL_POSITION, light0Pos); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); if (!colorIndexMode) { glEnable(GL_COLOR_MATERIAL); } } void doRedraw(void) { static GLfloat x, y, z; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(x, 1.0F, 0.0F, 0.0F); glRotatef(y, 0.0F, 1.0F, 0.0F); glRotatef(z, 0.0F, 0.0F, 1.0F); drawTorus(); glPopMatrix(); if (renderToDIB) { glFinish(); BitBlt(hDCFrontBuffer, 0, 0, global_ctx->winWidth, global_ctx->winHeight, global_ctx->hDC, 0, 0, SRCCOPY); GdiFlush(); } else { SwapBuffers(hDCFrontBuffer); } x += 5.0F; if (x > 360.0F) x -= 360.0F; y += 7.0F; if (y > 360.0F) y -= 360.0F; z += 9.0F; if (z > 360.0F) z -= 360.0F; } void redraw(void) { idleFunc = doRedraw; } void resize(void) { setProjection(); glViewport(0, 0, global_ctx->winWidth, global_ctx->winHeight); } LRESULT APIENTRY WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_SIZE: if (global_ctx->hGLRC) { //global_ctx->winWidth = (int) LOWORD(lParam); //global_ctx->winHeight = (int) HIWORD(lParam); resize(); return 0; } case WM_PALETTECHANGED: /* ** Update palette mapping if this *is not* the active window. */ if (global_ctx->hGLRC && global_ctx->hPalette && (HWND) wParam != hWnd) { UnrealizeObject(global_ctx->hPalette); SelectPalette(global_ctx->hDC, global_ctx->hPalette, FALSE); RealizePalette(global_ctx->hDC); redraw(); return 0; } break; case WM_QUERYNEWPALETTE: /* ** Update palette mapping if this *is* the active window. */ if (global_ctx->hGLRC && global_ctx->hPalette) { UnrealizeObject(global_ctx->hPalette); SelectPalette(global_ctx->hDC, global_ctx->hPalette, FALSE); RealizePalette(global_ctx->hDC); redraw(); return TRUE; } break; case WM_PAINT: /* ** Update the window. Don't use the device context returned by ** BeginPaint as it won't have the right palette selected into it. */ if (global_ctx->hGLRC) { PAINTSTRUCT ps; BeginPaint(hWnd, &ps); redraw(); EndPaint(hWnd, &ps); return 0; } break; case WM_CHAR: switch ((int)wParam) { case VK_ESCAPE: DestroyWindow(hWnd); return 0; case VK_SPACE: if (idleFunc) { idleFunc = NULL; } else { idleFunc = doRedraw; } default: break; } break; default: break; } /* Deal with any unprocessed messages */ return DefWindowProc(hWnd, message, wParam, lParam); } int APIENTRY WinMain( HINSTANCE hCurrentInst, HINSTANCE hPreviousInst, LPSTR lpszCmdLine, int nCmdShow) { WNDCLASS wndClass; HWND hWnd; MSG msg; char *className = "OpenGL"; char *windowName = "Simple DIB Example"; int winX = 0, winY = 0; R2DContext * ctx = R2DCreate(512, 512); global_ctx = ctx; /* Define and register a window class */ wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hCurrentInst; wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = className; RegisterClass(&wndClass); /* Create a window of the previously defined class */ hWnd = CreateWindow( className, /* Window class's name */ windowName, /* Title bar text */ WS_OVERLAPPEDWINDOW | /* The window's style */ WS_CLIPCHILDREN | WS_CLIPSIBLINGS, winX, winY, /* Position */ global_ctx->winWidth, global_ctx->winHeight, /* Size */ NULL, /* Parent window's handle */ NULL, /* Menu handle */ hCurrentInst, /* Instance handle */ NULL); /* No additional data */ /* Map the window to the screen */ ShowWindow(hWnd, nCmdShow); /* Force the window to repaint itself */ UpdateWindow(hWnd); /* ** Set up for OpenGL rendering. Bind the rendering context to ** the same device context that the palette will be selected into. */ hDCFrontBuffer = GetDC(hWnd); R2DMakeCurrent(ctx); init(); idleFunc = doRedraw; /* Process Messages */ while (1) { /* execute the idle function while there are no messages to process */ while (idleFunc && PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == FALSE) { (*idleFunc)(); } if (GetMessage(&msg, NULL, 0, 0) != TRUE) { break; } TranslateMessage(&msg); DispatchMessage(&msg); } /* ** Finish OpenGL rendering. */ idleFunc = NULL; R2DDestroy(ctx); ReleaseDC(hWnd, hDCFrontBuffer); return (int) msg.wParam; } #endif /* Stand alone stuff */ therion/loch/lxGLC.h0000664000175000017500000001134512447650352013331 0ustar useruser/** * @file lxGLC.h * Loch GL canvas. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef lx_h #define lx_h // Standard libraries #ifndef LXDEPCHECK #include #include #include #include "lxOGLFT.h" #endif //LXDEPCHECK - standart libraries enum { LXGLCML_NONE, LXGLCML_ZOOM2ROTATE, LXGLCML_ZOOM, LXGLCML_ROTATE, LXGLCML_TILT, LXGLCML_PANX, LXGLCML_PANY, LXGLCML_PANX2Y, LXGLCTR_TILE, LXGLCTR_IMAGE }; #include "lxMath.h" class lxGLCanvas: public wxGLCanvas { public: lxVec shift; long ww, wh, mx, my; struct lxRenderData * m_renderData; struct lxData * data; struct lxSetup * setup; class lxFrame * frame; wxGLContext ctx; void UpdateContents(); lxGLCanvas(struct lxSetup * stp, struct lxData * dat, wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = _T("lxGLCanvas") ); ~lxGLCanvas(); GLuint m_idTexSurface, m_idTexStation, m_initTextures; // screen funkcie a premenne GLuint m_sList, m_oList, m_sFixList, m_sEntList, m_sStList, m_oFixList, m_oEntList, m_oStList; int m_sMoveLock; double m_indRes, m_indLWidth; bool m_sInit, m_sInitReset; bool m_sMoveSingle, m_isO; // fonty FT_Face m_ftFace1, m_ftFace2, m_ftFace3; OGLFT::Monochrome * m_fntNumericS, * m_fntTitleS; OGLFT::Filled * m_fntNumericO, * m_fntTitleO; GLdouble m_camera_modelview[16]; GLdouble m_camera_projection[16]; GLint m_camera_viewport[4]; bool m_sCameraAutoRotate, m_sCameraLockRotation; wxStopWatch m_sCameraAutoRotateSWatch; long m_sCameraAutoRotateCounter; double m_sCameraAutoRotateAngle, m_sCameraStartAutoRotateAngle; void OnPaint(wxPaintEvent& event); void OnSize(wxSizeEvent& event); void OnEraseBackground(wxEraseEvent& event); void OnEnterWindow(wxMouseEvent& event); void OnMouseDouble(wxMouseEvent& event); void OnMouseDown(wxMouseEvent& event); void OnMouseUp(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event); void OnMouseWheel(wxMouseEvent& event); void OnKeyPress(wxKeyEvent& event); void OnIdle(wxIdleEvent& event); bool CameraAutoRotate(); void InitializeS(); void ForceRefresh(bool updateTB = true); void UpdateRenderContents(); void UpdateRenderList(); void RenderScreen(); void SetIndicatorsTransform(); void ProjectPoint(double src_x, double src_y, double src_z, GLdouble * x, GLdouble * y, GLdouble * z); void ProjectStations(); void RenderOffList(); // offscreen funkcie a premenne struct OSC * m_OSC; struct TRC * m_TRC; GLint m_maxTSizeS, m_maxTSizeO; bool OSCMakeCurrent(); void OSCDestroy(); bool OSCInit(GLint w, GLint h); void TRCInit(int type, GLint w, GLint h, GLint tw = 0, GLint th = 0); struct _TRctx * TRCGetContext(); void TRCDestroy(); GLint TRCGet(int param); GLubyte * TRCGetBuffer(); void TRCBeginTile(); bool TRCEndTile(); void SetColorMask(); long m_lic; DECLARE_EVENT_TABLE() public: bool IsRenderingOff(); OGLFT::Face * GetFontNumeric(); OGLFT::Face * GetFontTitle(); void OpenGLInit(); void SetCamera(); void RenderAll(); void SetFontColors(); void RenderSurface(); void GeomOutline(); void RenderCenterline(); void RenderScrapWalls(); void RenderInds(); void RenderICompass(double size); void RenderIClino(double size); void RenderIScalebar(double size); void RenderIDepthbar(double size); void RenderILine(double fx, double fy, double tx, double ty); }; // lxGLCanvas struct TRC { struct _TRctx * m_ctx; GLubyte * m_buff; TRC() { this->m_ctx = NULL; this->m_buff = NULL; } }; #endif therion/loch/lxSetup.cxx0000664000175000017500000002774112426416155014404 0ustar useruser/** * @file lxSetup.cxx * Loch model setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #endif //LXDEPCHECK - standart libraries #include "lxSetup.h" #include "lxData.h" lxSetup::lxSetup(lxData * dat) { this->data = dat; this->UpdateData(); this->cam_dir = 0; this->cam_tilt = 90; this->cam_persp = true; this->SetLens(50.0); this->cam_anaglyph = false; this->cam_anaglyph_bw = true; this->cam_anaglyph_left = false; this->cam_anaglyph_eyesep = 0.02; this->cam_anaglyph_glasses = 0; this->m_vis_centerline = true; this->m_vis_walls = true; this->m_vis_surface = true; this->m_vis_labels = false; this->m_vis_bbox = true; this->m_vis_indicators = true; this->m_vis_grid = false; this->m_vis_centerline_cave = true; this->m_vis_centerline_surface = true; this->m_vis_centerline_splay = false; this->m_vis_centerline_duplicate = false; this->m_vis_centerline_entrance = false; this->m_vis_centerline_fix = false; this->m_vis_centerline_station = false; this->m_stlabel_altitude = false; this->m_stlabel_comment = false; this->m_stlabel_name = false; this->m_stlabel_survey = false; this->m_colormd = lxSETUP_COLORMD_ALTITUDE; this->m_colormd_app_centerline = true; this->m_colormd_app_walls = true; this->m_srf_transparency = true; this->m_srf_texture = true; this->m_srf_opacity = 0.5; this->m_srf_lighting = false; this->m_walls_transparency = false; this->m_walls_opacity = 0.5; } void lxSetup::SetLens(double lens) { this->cam_lens = lens; if (this->cam_lens < 20.0) this->cam_lens = 20.0; if (this->cam_lens > 2000.0) this->cam_lens = 2000.0; this->cam_lens_vfov = atan(12.0 / this->cam_lens) / lxPI * 360.0; this->cam_lens_vfovr = 12.0 / this->cam_lens; } void lxSetup::UpdateData() { // udate data limits lxVecLimits tmp, tmpZ; tmp.valid = false; this->data_limits.valid = false; unsigned long id, nid; double * bnds; nid = this->data->shots.size(); lxDataShot * shp; for(id = 0; id < nid; id++) { shp = &(this->data->shots[id]); if (this->m_vis_centerline && (((!shp->surface) && this->m_vis_centerline_cave) || (shp->surface && this->m_vis_centerline_surface))) { this->data_limits.Add(this->data->stations[shp->from].pos); this->data_limits.Add(this->data->stations[shp->to].pos); if (!shp->surface) { tmpZ.Add(this->data->stations[shp->from].pos); tmpZ.Add(this->data->stations[shp->to].pos); } } } nid = this->data->stations.size(); for(id = 0; id < nid; id++) { tmp.Add(this->data->stations[id].pos); } vtkPolyData * w; w = this->data->allWalls->GetOutput(); if ((w != NULL) && (w->GetNumberOfPoints() > 0)) { bnds = w->GetBounds(); if (this->m_vis_walls) { this->data_limits.Add(bnds[0], bnds[2], bnds[4]); this->data_limits.Add(bnds[1], bnds[3], bnds[5]); tmpZ.Add(bnds[0], bnds[2], bnds[4]); tmpZ.Add(bnds[1], bnds[3], bnds[5]); } tmp.Add(bnds[0], bnds[2], bnds[4]); tmp.Add(bnds[1], bnds[3], bnds[5]); } if (tmpZ.valid) { this->data->luTable->SetTableRange(tmpZ.min.z, tmpZ.max.z); } else if (this->data_limits.valid) { this->data->luTable->SetTableRange(this->data_limits.min.z, this->data_limits.max.z); } if ((this->data->surface != NULL) && (this->data->surface->GetNumberOfPoints() > 0)) { bnds = this->data->surface->GetBounds(); if (this->m_vis_surface) { this->data_limits.Add(bnds[0], bnds[2], bnds[4]); this->data_limits.Add(bnds[1], bnds[3], bnds[5]); } tmp.Add(bnds[0], bnds[2], bnds[4]); tmp.Add(bnds[1], bnds[3], bnds[5]); } if (!this->data_limits.valid) { if (tmp.valid) this->data_limits = tmp; else { this->data_limits.Add(0.0, 0.0, 0.0); this->data_limits.Add(300.0, 200.0, 100.0); } this->data->luTable->SetTableRange(this->data_limits.min.z, this->data_limits.max.z); } this->data_limits_diam = (this->data_limits.max - this->data_limits.min).Length(); } void lxSetup::UpdatePos() { this->cam_pos = this->cam_center + \ lxPol2Vec(this->cam_dist, this->cam_dir + 180.0, this->cam_tilt); } void lxSetup::ResetCamera() { this->cam_center = (this->data_limits.min + this->data_limits.max) / 2.0; lxVecLimits target = this->data_limits.Rotate(this->cam_dir, this->cam_tilt, this->cam_center); double model_width; model_width = target.max.x / lxVecAbs(target.max).z; if (this->cam_width > model_width) { this->cam_dist = target.max.z / (this->cam_lens_vfovr * 0.99); } else { this->cam_dist = target.max.x / (this->cam_lens_vfovr * this->cam_width * 0.99); } if (this->cam_persp) { this->cam_dist += target.max.y; } this->UpdatePos(); //if (this->cam_persp) { // //} //printf("MAX: %8.2f %8.2f %8.2f\n", lxVecXYZ(this->data_limits.max)); //printf("MIN: %8.2f %8.2f %8.2f\n", lxVecXYZ(this->data_limits.min)); //printf("CENTER: %8.2f %8.2f %8.2f\n", lxVecXYZ(this->cam_center)); //printf("MLMAX: %8.2f %8.2f %8.2f\n", lxVecXYZ(target.max)); //printf("MLMIN: %8.2f %8.2f %8.2f\n", lxVecXYZ(target.min)); //printf("DIST: %8.2f\n", this->cam_dist); //printf("WIDTH: %8.2f\n", this->cam_width); } #define calc_cam_pos void lxSetup::StartCameraMovement() { this->cam_orig_center = this->cam_center; this->cam_orig_pos = this->cam_pos; this->cam_orig_dist = this->cam_dist; this->cam_orig_dir = this->cam_dir; this->cam_orig_tilt = this->cam_tilt; } void lxSetup::ZoomCamera(double zoom) { if (zoom > 0.0) this->cam_dist = this->cam_orig_dist / zoom; this->UpdatePos(); } void lxSetup::PanCamera(double panx, double pany) { this->cam_center = this->cam_orig_center + lxPol2Vec(panx * this->cam_dist * 2.0 * this->cam_lens_vfovr * this->cam_width, this->cam_dir + 270.0, 0); this->cam_center = this->cam_center + lxPol2Vec(pany * this->cam_dist * 2.0 * this->cam_lens_vfovr, this->cam_dir + (this->cam_tilt > 0.0 ? 0 : 180.0), (this->cam_tilt > 0 ? 90.0 - this->cam_tilt : 90 + this->cam_tilt)); this->UpdatePos(); } void lxSetup::TiltCamera(double tilt) { this->cam_tilt = this->cam_orig_tilt + tilt; if (this->cam_tilt > 90.0) this->cam_tilt = 90.0; if (this->cam_tilt < -90.0) this->cam_tilt = -90.0; this->UpdatePos(); } void lxSetup::RotateCamera(double rot) { this->cam_dir = this->cam_orig_dir + rot; if (this->cam_dir < 0.0) { this->cam_dir += 360.0 * ceil(fabs(this->cam_dir) / 360.0); } if (this->cam_dir >= 360.0) { this->cam_dir -= 360.0 * floor(this->cam_dir / 360.0); } this->UpdatePos(); } void lxSetup::RotateCameraF(double rot) { this->cam_orig_dir += rot; this->RotateCamera(0.0); } void lxSetup::SelectSurvey(const char * survey) { this->m_survey_selection.insert(std::string(survey)); } bool lxSetup::IsSurveySelected(const char * survey) { if (this->m_survey_selection.size() == 0) return true; std::set::iterator it = this->m_survey_selection.find(std::string(survey)); if (it != this->m_survey_selection.end()) return true; return false; } void lxSetup::ClearSurveySelection() { this->m_survey_selection.clear(); } void lxSetup::SaveToXMLNode(wxXmlNode * n) { wxXmlNode * tmp, * tmpd; // remove all children tmp = n->GetChildren(); while (tmp != NULL) { tmpd = tmp; tmp = tmp->GetNext(); if (tmpd->GetName().StartsWith(_T("Camera"))) n->RemoveChild(tmpd); delete tmpd; } // save settings char * prevlocale = setlocale(LC_NUMERIC,NULL); setlocale(LC_NUMERIC,"C"); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraFacing")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_dir))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraTilt")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_tilt))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraCenterX")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_center.x))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraCenterY")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_center.y))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraCenterZ")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_center.z))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraDistance")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_dist))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraFocus")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, wxString::Format(_T("%.4f"), this->cam_lens))); n->AddChild(tmp); tmp = new wxXmlNode(wxXML_ELEMENT_NODE, _T("CameraPerspective")); tmp->AddChild(new wxXmlNode(wxXML_TEXT_NODE, wxEmptyString, this->cam_persp ? _T("true") : _T("false"))); n->AddChild(tmp); setlocale(LC_NUMERIC,prevlocale); } wxString getXmlValue(wxXmlNode * n, const wxString & name) { wxString rv; if (n != NULL) { wxXmlNode * t = n->GetChildren(), * tt; while(t != NULL) { if (t->GetName() == name) { tt = t->GetChildren(); if (tt->GetType() == wxXML_TEXT_NODE) rv = tt->GetContent(); } t = t->GetNext(); } } return rv; } void interpolateFloat(double * value, wxString v1, wxString v2, double t) { if (v1.empty()) return; if (v2.empty()) *value = atof(v1.mbc_str()); else *value = (1.0 - t) * atof(v1.mbc_str()) + t * atof(v2.mbc_str()); } void interpolateBoolean(bool * value, wxString v1, wxString v2, double t) { if (v1.empty()) return; if (v2.empty()) *value = (v1 == _T("true")); else { if (t <= 0.5) *value = (v1 == _T("true")); else *value = (v2 == _T("true")); } } void lxSetup::LoadFromXMLNode(wxXmlNode * n, wxXmlNode * nn, double t) { if (n->GetName() != _T("Scene")) return; char * prevlocale = setlocale(LC_NUMERIC,NULL); double d; setlocale(LC_NUMERIC,"C"); interpolateFloat(&(this->cam_dir), getXmlValue(n, _T("CameraFacing")), getXmlValue(nn, _T("CameraFacing")), t); interpolateFloat(&(this->cam_tilt), getXmlValue(n, _T("CameraTilt")), getXmlValue(nn, _T("CameraTilt")), t); interpolateFloat(&(this->cam_center.x), getXmlValue(n, _T("CameraCenterX")), getXmlValue(nn, _T("CameraCenterX")), t); interpolateFloat(&(this->cam_center.y), getXmlValue(n, _T("CameraCenterY")), getXmlValue(nn, _T("CameraCenterY")), t); interpolateFloat(&(this->cam_center.z), getXmlValue(n, _T("CameraCenterZ")), getXmlValue(nn, _T("CameraCenterZ")), t); interpolateFloat(&(this->cam_dist), getXmlValue(n, _T("CameraDistance")), getXmlValue(nn, _T("CameraDistance")), t); d = 20.0; interpolateFloat(&d, getXmlValue(n, _T("CameraFocus")), getXmlValue(nn, _T("CameraFocus")), t); this->SetLens(d); interpolateBoolean(&(this->cam_persp), getXmlValue(n, _T("CameraPerspective")), getXmlValue(nn, _T("CameraPerspective")), t); this->UpdatePos(); setlocale(LC_NUMERIC,prevlocale); } therion/loch/lxSTree.cxx0000664000175000017500000000511212047417350014307 0ustar useruser// Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries #include "lxSTree.h" #include "lxGUI.h" #include "lxGLC.h" #include "lxSetup.h" #ifndef LXGNUMSW #include "loch.xpm" #endif enum { lxSS_SURVEY_TREE = 4000, }; BEGIN_EVENT_TABLE(lxModelTreeDlg, wxMiniFrame) EVT_BUTTON(wxID_ANY, lxModelTreeDlg::OnCommand) EVT_BUTTON(wxID_CLOSE, lxModelTreeDlg::OnCommand) EVT_MOVE(lxModelTreeDlg::OnMove) EVT_CLOSE(lxModelTreeDlg::OnClose) END_EVENT_TABLE() void lxModelTreeDlg::OnCommand(wxCommandEvent& event) { switch (event.GetId()) { case wxID_CLOSE: this->m_mainFrame->ToggleSelectionSetup(); break; } } void lxModelTreeDlg::OnClose(wxCloseEvent& WXUNUSED(event)) { this->m_mainFrame->ToggleSelectionSetup(); } void lxModelTreeDlg::OnMove(wxMoveEvent& WXUNUSED(event)) { this->m_toolBoxPosition.Save(); } lxModelTreeDlg::lxModelTreeDlg(wxWindow *parent) : wxMiniFrame(parent, wxID_ANY, _(" Selection"),wxDefaultPosition, wxDefaultSize, (wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxRESIZE_BORDER) & (~(wxMINIMIZE_BOX | wxMAXIMIZE_BOX))) { this->m_toolBoxPosition.Init(this, parent, 0, 8, 8); #ifdef LXGNUMSW this->SetIcon(wxIcon(_T("LOCHICON"))); #else this->SetIcon(wxIcon(loch_xpm)); #endif this->m_mainFrame = (lxFrame *) parent; wxBoxSizer * sizerFrame = new wxBoxSizer(wxVERTICAL); wxBoxSizer * sizerTop = new wxBoxSizer(wxVERTICAL); lxPanel = new wxPanel(this, wxID_ANY); this->m_treeControl = new wxTreeCtrl(lxPanel); sizerTop->Add( this->m_treeControl, 1, wxALL | wxEXPAND, lxBORDER); sizerTop->Add( new wxButton(lxPanel, wxID_CLOSE, _("Close")), 0, wxALIGN_RIGHT | lxNOTTOP, lxBORDER); lxPanel->SetSizer(sizerTop); sizerTop->Fit(lxPanel); sizerFrame->Add(lxPanel, 1, wxEXPAND | wxALL); this->SetSizer(sizerFrame); sizerFrame->SetSizeHints(this); sizerFrame->Fit(this); wxSize mfs = this->m_mainFrame->GetSize(); this->SetSize(mfs.GetWidth() / 4, mfs.GetHeight() / 2); } void lxModelTreeDlg::LoadData() { this->m_treeControl->DeleteAllItems(); lxData * data = this->m_mainFrame->data; std::vector parents; lxDataSurveyVec::iterator i; if (data == NULL) return; i = data->surveys.begin(); if (i == data->surveys.end()) return; wxTreeItemId tmpId = this->m_treeControl->AddRoot(_T("Surveys")); parents.push_back(tmpId); i++; for(; i != data->surveys.end(); i++) { parents.push_back(this->m_treeControl->AppendItem(parents[i->m_parent], wxConvUTF8.cMB2WX(strlen(i->m_title) > 0 ? i->m_title : i->m_name))); } } therion/loch/icons/0000775000175000017500000000000012426432012013302 5ustar userusertherion/loch/icons/stereo.xpm0000664000175000017500000000074110763711716015350 0ustar useruser/* XPM */ static const char * stereo_xpm [] = { /* columns rows colors chars-per-pixel */ "16 15 5 1", " c black", ". c cyan", "X c red", "o c gray100", "O c None", /* pixels */ "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO", " ", " oooooooooooooo ", " o.....ooXXXXXo ", " o.....ooXXXXXo ", " o.....ooXXXXXo ", " o....ooooXXXXo ", " oooooo oooooo ", " OO ", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO" }; therion/loch/icons/camera.xpm0000664000175000017500000000076610763711622015302 0ustar useruser/* XPM */ static const char * camera_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 6 1", " c black", ". c #002E70", "X c #CDCDCD", "o c #C4E9F5", "O c gray100", "+ c None", /* pixels */ "++++++++++++++++", "+++ + ++++++", "++ ooo ooo +++++", "++ ooo ooo +++++", "++ ooo ooo +++++", "+++ + ++ ++", "++++ + ++", "++++ .... ++", "++++ .... ++", "++++ .... ++", "+++++ ++ ++", "++++ .++. ++ ++", "++++ .++. ++++++", "+++ .++++. +++++", "+++ .++++. +++++" }; therion/loch/icons/home.xpm0000664000175000017500000000077710763711640015004 0ustar useruser/* XPM */ static const char * home_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 7 1", " c black", ". c #6AFFFF", "X c #BE0000", "o c #9B601A", "O c red", "+ c gray100", "@ c None", /* pixels */ "@@@@@@@@@@@@@@@@", "@@@@@@@XXX@@@@@@", "@@@@@@XOOOX@ @@", "@@@@@XOOOOOX @@", "@@@@XOOOOOOOX @@", "@@@XOOOOOOOOOX@@", "@@XOOOOOOOOOOOX@", "@XXXXXXXXXXXXXXX", "@@@ +++++++++ @@", "@@@ + + + @@", "@@@ + . + o + @@", "@@@ + + o + @@", "@@@ +++++ o + @@", "@@@ +++++ o + @@", "@@@ @@" }; therion/loch/icons/visstation.xpm0000664000175000017500000000061012267532016016240 0ustar useruser/* XPM */ static const char * visstation_xpm[] = { "16 15 2 1", " c None", ". c #9E7B00", " ", " ", " ", " .. ", " .. ", " .. ", " ........ ", " ........ ", " .. ", " .. ", " .. ", " ", " ", " ", " "}; therion/loch/icons/lockrot.xpm0000664000175000017500000000075310763711644015527 0ustar useruser/* XPM */ static const char * lockrot_xpm [] = { /* columns rows colors chars-per-pixel */ "16 15 5 1", " c #0060A2", ". c #00A5E4", "X c #DE0000", "o c gray100", "O c None", /* pixels */ "OOOOOOOOOOOOOOOO", "OOOOOOOOOOOOOOOO", "OOOOO......OOOOO", "OOOO.......OOOOO", "OOO .......OOOOO", "OOO ..OOOOOOOOOO", "OXX OOXXOOOOOOO", "OXXX OXXXO OOOO", "OOXXXXXXOO OOO", "OOOXXXX OO", "OOOXXXX O", "OOXXXXXX OO", "OXXXOOXXXO OOO", "OXXOOOOXXO OOOO", "OOOOOOOOOOOOOOOO" }; therion/loch/icons/visfix.xpm0000664000175000017500000000060412267531774015362 0ustar useruser/* XPM */ static const char * visfix_xpm[] = { "16 15 2 1", " c None", ". c #500000", " ", " ", " . ", " . ", " ... ", " . . ", " . . ", " ... . ... ", " . . ", " . . ", " ... ", " . ", " . ", " ", " "}; therion/loch/icons/open.xpm0000664000175000017500000000074310763711652015011 0ustar useruser/* XPM */ static const char *open_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 5 1", " c None", ". c Black", "X c Yellow", "o c Gray100", "O c #bfbf00", /* pixels */ " ", " ... ", " . . .", " ..", " ... ...", " .XoX....... ", " .oXoXoXoXo. ", " .XoXoXoXoX. ", " .oXoX..........", " .XoX.OOOOOOOOO.", " .oo.OOOOOOOOO. ", " .X.OOOOOOOOO. ", " ..OOOOOOOOO. ", " ........... ", " " }; therion/loch/icons/scene.xpm0000664000175000017500000000076410763711712015145 0ustar useruser/* XPM */ static const char *scene_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 6 1", " c black", ". c #3A3A3A", "X c #0101C6", "o c #BBCEFD", "O c gray100", "+ c None", /* pixels */ "++++++++++++++++", "++ ++", "++ OOOOOOOO o ++", "++ O.....OO ++", "++ OOOOOOOO O ++", "++ OXO....O o ++", "++ OOOOOOOO o ++", "++ OXO....O o ++", "++ OOOOOOOO O ++", "++ OXO....O O ++", "++ OOOOOOOO O ++", "++ OOOOOOOO ++", "++ OOOOOOOO o ++", "++ ++", "++++++++++++++++" }; therion/loch/icons/profile.xpm0000664000175000017500000000072710763711670015512 0ustar useruser/* XPM */ static const char * profile_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 4 1", " c red", ". c #FFCC00", "X c gray100", "o c None", /* pixels */ "oooooooooooooooo", "oooooooooooooooo", "ooooooooo oooooo", "ooooooooo ooooo", "ooooooooo . oooo", "o ... ooo", "o ........... oo", "o ............ o", "o ........... oo", "o ... ooo", "ooooooooo . oooo", "ooooooooo ooooo", "ooooooooo oooooo", "oooooooooooooooo", "oooooooooooooooo" }; therion/loch/icons/rendersetup.xpm0000664000175000017500000000073410763711702016404 0ustar useruser/* XPM */ static const char *rendersetup_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 4 1", " c black", ". c #505050", "X c gray100", "o c None", /* pixels */ "oooooooooooooooo", "o ....o", "o XXXXXXXX Xo oo", "o X......X o o", "o XXXXXXXX oo oo", "o X......X oo oo", "o XXXXXXXX oo oo", "o X......X o o", "o XXXXXXXX oo oo", "o ....o", "o.oooooooo.ooooo", "o.o oooo o.ooooo", "o. .ooooo", "o.o oooo o.ooooo", "oooooooooooooooo" }; therion/loch/icons/vissurface.xpm0000664000175000017500000000073510763711734016224 0ustar useruser/* XPM */ static const char *vissurface_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 4 1", " c #41B800", ". c #98F963", "X c gray100", "o c None", /* pixels */ "oooooooooooooooo", "oooooooooooooooo", "oooooooooooooooo", "oooooooooooooooo", "oooo ooooo.ooooo", "ooo ooo...oooo", "oo o.....ooo", "o ......oo", " .....oo", " ....oo", " ...oo", " ..oo", " .oo", " oo", "oooooooooooooooo" }; therion/loch/icons/about.xpm0000664000175000017500000031571510763711616015172 0ustar useruser/* XPM */ static const char * about_xpm[] = { "224 224 257 2", " c None", ". c #000000", "+ c #010101", "@ c #020202", "# c #030303", "$ c #040404", "% c #050505", "& c #060606", "* c #070707", "= c #090909", "- c #0A0A0A", "; c #080808", "> c #151515", ", c #131313", "' c #0C0C0C", ") c #141414", "! c #181818", "~ c #0D0D0D", "{ c #0B0B0B", "] c #0E0E0E", "^ c #0F0F0F", "/ c #111111", "( c #101010", "_ c #121212", ": c #161616", "< c #171717", "[ c #191919", "} c #1A1A1A", "| c #222222", "1 c #1F1F1F", "2 c #232323", "3 c #1D1D1D", "4 c #2A2A2A", "5 c #262626", "6 c #212121", "7 c #1E1E1E", "8 c #2B2B2B", "9 c #2C2C2C", "0 c #313131", "a c #1C1C1C", "b c #1B1B1B", "c c #292929", "d c #2F2F2F", "e c #242424", "f c #404040", "g c #202020", "h c #424242", "i c #2E2E2E", "j c #3A3A3A", "k c #272727", "l c #3C3C3C", "m c #3E3E3E", "n c #4A4A4A", "o c #323232", "p c #363636", "q c #434343", "r c #383838", "s c #303030", "t c #2D2D2D", "u c #373737", "v c #393939", "w c #282828", "x c #3D3D3D", "y c #444444", "z c #343434", "A c #252525", "B c #353535", "C c #333333", "D c #515151", "E c #474747", "F c #464646", "G c #3F3F3F", "H c #4D4D4D", "I c #414141", "J c #575757", "K c #4F4F4F", "L c #5C5C5C", "M c #5D5D5D", "N c #454545", "O c #565656", "P c #5B5B5B", "Q c #494949", "R c #696969", "S c #3B3B3B", "T c #585858", "U c #535353", "V c #484848", "W c #555555", "X c #4C4C4C", "Y c #505050", "Z c #4B4B4B", "` c #4E4E4E", " . c #5A5A5A", ".. c #606060", "+. c #5E5E5E", "@. c #595959", "#. c #6B6B6B", "$. c #717171", "%. c #616161", "&. c #666666", "*. c #676767", "=. c #747474", "-. c #828282", ";. c #808080", ">. c #707070", ",. c #545454", "'. c #6D6D6D", "). c #656565", "!. c #636363", "~. c #6F6F6F", "{. c #7F7F7F", "]. c #8A8A8A", "^. c #525252", "/. c #8D8D8D", "(. c #818181", "_. c #9D9D9D", ":. c #626262", "<. c #5F5F5F", "[. c #898989", "}. c #A0A0A0", "|. c #959595", "1. c #8E8E8E", "2. c #848484", "3. c #767676", "4. c #8F8F8F", "5. c #A4A4A4", "6. c #AFAFAF", "7. c #979797", "8. c #838383", "9. c #787878", "0. c #8C8C8C", "a. c #868686", "b. c #9B9B9B", "c. c #ABABAB", "d. c #858585", "e. c #777777", "f. c #646464", "g. c #999999", "h. c #727272", "i. c #7E7E7E", "j. c #929292", "k. c #7B7B7B", "l. c #6A6A6A", "m. c #A8A8A8", "n. c #737373", "o. c #919191", "p. c #9F9F9F", "q. c #A7A7A7", "r. c #C4C4C4", "s. c #7C7C7C", "t. c #AAAAAA", "u. c #7A7A7A", "v. c #939393", "w. c #BFBFBF", "x. c #9E9E9E", "y. c #797979", "z. c #9C9C9C", "A. c #A9A9A9", "B. c #7D7D7D", "C. c #B5B5B5", "D. c #B0B0B0", "E. c #B8B8B8", "F. c #686868", "G. c #878787", "H. c #A1A1A1", "I. c #949494", "J. c #B2B2B2", "K. c #BABABA", "L. c #909090", "M. c #969696", "N. c #757575", "O. c #6C6C6C", "P. c #6E6E6E", "Q. c #CFCFCF", "R. c #A6A6A6", "S. c #AEAEAE", "T. c #B6B6B6", "U. c #ADADAD", "V. c #B7B7B7", "W. c #B3B3B3", "X. c #C5C5C5", "Y. c #ACACAC", "Z. c #B1B1B1", "`. c #B9B9B9", " + c #B4B4B4", ".+ c #BCBCBC", "++ c #C3C3C3", "@+ c #C2C2C2", "#+ c #C0C0C0", "$+ c #C7C7C7", "%+ c #CDCDCD", "&+ c #CBCBCB", "*+ c #BEBEBE", "=+ c #C1C1C1", "-+ c #989898", ";+ c #D6D6D6", ">+ c #E0E0E0", ",+ c #D0D0D0", "'+ c #DDDDDD", ")+ c #DFDFDF", "!+ c #D1D1D1", "~+ c #BBBBBB", "{+ c #888888", "]+ c #C9C9C9", "^+ c #DADADA", "/+ c #F2F2F2", "(+ c #F0F0F0", "_+ c #A3A3A3", ":+ c #F9F9F9", "<+ c #E6E6E6", "[+ c #DCDCDC", "}+ c #CECECE", "|+ c #EFEFEF", "1+ c #EDEDED", "2+ c #F4F4F4", "3+ c #F3F3F3", "4+ c #F7F7F7", "5+ c #E3E3E3", "6+ c #D9D9D9", "7+ c #BDBDBD", "8+ c #A2A2A2", "9+ c #E4E4E4", "0+ c #FBFBFB", "a+ c #ECECEC", "b+ c #D4D4D4", "c+ c #E7E7E7", "d+ c #C8C8C8", "e+ c #D8D8D8", "f+ c #CCCCCC", "g+ c #E5E5E5", "h+ c #D2D2D2", "i+ c #A5A5A5", "j+ c #DEDEDE", "k+ c #CACACA", "l+ c #D5D5D5", "m+ c #D3D3D3", "n+ c #9A9A9A", "o+ c #EBEBEB", "p+ c #D7D7D7", "q+ c #E1E1E1", "r+ c #C6C6C6", "s+ c #8B8B8B", "t+ c #DBDBDB", "u+ c #E9E9E9", "v+ c #EEEEEE", "w+ c #FEFEFE", "x+ c #FAFAFA", "y+ c #F8F8F8", "z+ c #F1F1F1", "A+ c #F6F6F6", "B+ c #F5F5F5", "C+ c #E8E8E8", "D+ c #FFFFFF", "E+ c #FCFCFC", "F+ c #FDFDFD", "G+ c #E2E2E2", "H+ c #EAEAEA", ". . + + + @ + + + + @ # # # @ $ % $ # % $ # @ @ + + + + + . . . . . + @ + + + + . + . . + + . . . . + + + + . + + + + + + . + + + + + + . . . . . . . . . . . . . . + + . . . @ $ $ # # $ $ @ $ % % @ + + + + . + + + + + . + + . . + + + + . . + + . . @ + @ + + . . . . + @ @ + @ % & $ * = - - * $ $ % ; * $ $ & & % $ $ & % $ # # $ $ % & ; = & @ + @ $ % % # $ % # @ + . . + + . + + . . . + + . . . . + . . . . + . . . . + + @ + + + + $ $ # + + + + + . ", ". . + + + + @ @ + + @ # @ @ @ # % $ $ # $ $ # @ @ @ + + . . . . . . + + + + + . . . . + . + + + + + + + . + @ @ + + @ + + + + . + + + + . + + . . . . . . . . . . . . + + . + # % $ + @ $ @ # % % % $ @ @ @ + @ # @ $ # + + + + + + + + + + . + + + + + # # @ + + . . . . # # + + @ % $ $ $ * - = - % # % $ $ % & ; ; % # $ % $ @ @ # % $ * > , ' % + + @ # $ $ # % % # + + + + + + . . + . + + + . . . . + . . . . + @ . . + + + + + + + + # # @ @ + + + + + . ", ". . + + + @ @ @ + + @ @ @ + @ $ # # # # # $ $ # # @ . . . . . . . + + + + . + . . . + + . + + + + + + + + + @ @ @ @ @ @ @ + + + @ @ @ + . . + . . . . . . . . . . . + + . . + $ % # @ @ @ + @ # % % $ # + @ @ # $ $ $ @ + + @ + . + + + + + + + + . + + # @ @ @ . . . + + # $ @ + @ $ $ $ % * ; = - * # # # @ * ; = * # + # # @ # # % ; ; ' ) ! ~ # + @ # # # $ # $ & # + + + + + + + @ # + . . . . . + + + + . . . + @ + . . + + + + + + @ + + + + + + + + + . ", ". . + + @ @ @ @ + @ @ @ @ + # $ # # $ # $ $ % % & # . . . . . . + + + + + + + . . . . + + + + + . + @ @ @ @ @ + + + @ @ @ + @ # @ @ # + . . . . . . . . . . . . . . @ . . . . # $ # @ + + . + @ # $ # # # # @ # @ @ . + + + # + + + + + + + + + . . + @ # + + @ + . . + @ @ # @ # % % $ $ % % & = - & # @ + # $ = ~ = @ + + # @ $ $ { - ~ ] ' ' ; @ + @ @ # $ # # # @ + . . + + + @ @ + + @ . . . . . . . + + . . . + + @ + + + + + + + + @ @ + + + + + + + + . ", ". . . + @ @ @ + + + @ @ @ @ # $ $ % % # $ % % # $ @ + + . . . . + + + + . . . . . + + + + + + + + + @ + + @ @ + + @ @ @ @ + + @ + + @ + . . . . . . . . . . . . + # $ + . . . @ # $ + @ @ + . + # % $ $ $ $ @ + . . . . . # @ + @ + + + + + @ + . + @ # @ + + + + . . + @ # % # # * - ; % % # % - = % # + @ % $ ; ^ ; $ # @ # # & ; = { ' / ] = # + . $ & $ & % # # @ . + . + + + + @ + + + + . . . . + . . . . . . + @ # + + + + + + @ + + @ + + + + + + + + . ", ". . . . + + + + + + + @ @ @ @ @ # # # @ @ $ $ @ + . + + . . . + + . + . . . . . . + + + + + + + + @ @ + + @ @ + + + @ @ . + + + + + @ + . . . . . . . . . . . + $ $ # @ . + . . . @ + # & % % # & & # $ # # $ @ . . . + + + + + # + + + + + # @ + + . + + . + + + . . + # @ # # $ * ; & = * # $ * * # @ @ % ; ; - ' ; & & & $ % = - = ] ( ( ~ $ . + + % = = - ' % + + + + . + + @ + + @ @ + + . . . . + . . . . . + + # @ + @ @ + + @ @ @ + @ @ + @ + + + + + . ", ". . . . + @ @ + + + + @ @ @ # @ # $ # # @ # # # + + . + + + + + + . . . . . . . . . + + + + + + + @ @ + + @ @ + + + + + + + + + + + + + + + . + . . + . + + + + @ # @ @ . . . . . + + # & = - = % $ # # @ + @ . . + + + + + + + @ + + . + @ @ + + + + . . + + . . . . + # $ @ # % & ; * { * $ # % & & # # { ( _ , ] - - { - { ~ , ( , ) / ^ - $ . + @ % - { _ ] # . . + + . + + + + # @ @ . . . . . . + + . . . . + @ @ @ + + + + @ + + @ @ + + @ @ @ + . + + . ", ". . . . + @ + + + + @ @ @ @ # @ # $ $ $ $ $ # @ + + . + + @ @ + + + + . . . . . . + + + . + + + + @ @ + @ @ + + . + + + + @ @ # @ + + + . . . . . . + + + + + + + . + + . . . + @ + + + @ $ % & $ @ # @ + + . . . + + + + + + + + + . + @ @ + . + @ + + + . . . . . . @ # $ # @ % & * * { & # $ & % % + # % ] ^ ] _ - * { - ~ ^ , ^ ^ / ( / ; @ + @ @ % - ' ] * + . . + . . + + @ + @ + + + . . . . . . . . . . + + + + + . + + + @ + + + + + + + + + + . + + . ", ". . . . + + + + + @ # # # @ @ @ # $ % $ % % $ @ + + + @ @ @ + + + . . + . . . + + + + . . . . + @ @ + + @ + + + @ + + + @ @ # # @ + + + . . . . . . + @ # @ + . . + + + + @ + @ % $ + + . . + @ @ @ # + + @ . . + + @ @ + + + + + . + + + + + . + + + + + + + @ + . + # # # # @ $ % $ % ; % % & % # # @ # @ * { = * % & ; ; = - ' - { ^ _ ^ & + + @ % ; ( ( * # + + + + + . + + + @ @ . . . . . . . . + . . + + + + @ + + + + + + + @ @ + + + + + + + + + + + . ", ". + . . + + + + @ @ @ # # # # @ @ @ # $ $ $ @ + + + @ # @ + + + + + . + + + + + @ + + + + . + + @ @ + + + + + + @ @ + + @ # + + + + . . . . . . . . + @ @ + + + + + @ # $ $ @ # & & @ @ + + @ + + + + . + # @ + @ @ # # + . . + . . + @ + + + + + + @ # @ @ + + + + + @ $ $ # # # # $ & % $ * - = & $ @ # @ @ * * & & & & * * $ ; ~ ~ , _ - # + @ $ = ^ ) ] # + + + + + + . + + + @ + + . . . . . . + + + . + + . + @ + + + @ + @ @ @ @ + + + + + + + + + + + . ", ". . . . + + @ # @ @ @ # $ @ # # # # # # # @ + . . + + + + . + + + . + + + + . + @ + + + . + + + @ @ @ + + + @ + @ @ + + + + + + + . + . + + + . . . . + + + + # @ @ $ $ % $ # # # $ @ @ @ $ $ + + . + + @ - = # # % ; $ + . . . . + + + + . . . + + $ & $ + + @ @ + @ # % $ $ $ # # # % & $ ; - * & % # # @ @ @ # $ $ ; { ; * ; = { ~ : < - + + # = ^ / > ( % + + + + . . + + + + + . . . . . . . . + + + + . . . + @ + + @ @ # # @ @ + + + @ + + + + + + + + . ", ". . . . + + @ @ @ @ @ # $ @ @ # $ % # @ + + + . . . . + + + + + + . + + + + + @ $ $ $ + . . . + + @ # @ + @ @ + + + + + + + + + . + + @ + + . . . . + + + $ $ # @ @ $ @ # @ + + + + + @ $ ; & + . . + + # - = $ $ % # @ @ + . . + + + . + + + + @ # % * # . + + @ . + # $ $ $ % $ @ # ; ; & ; ; - ; * $ @ @ # % & # # - ] - ; = - ~ > : [ ' + $ = ( } } > ~ @ . + + . . . + + + + . . . . . . . . . . + + + + + + @ # @ @ @ @ @ @ @ + + + @ @ + + + + + + . + . ", ". . . + + + @ @ # @ @ @ # # @ # % % # + . + + + + . . + + . . + . + . + + + + % ; % # + . . . + @ @ @ + + @ + + + + + + + + + + + @ @ @ . + . + + + @ # @ % # @ + + + . . . . + + + + $ & & # + . . + + @ $ $ $ @ @ @ @ @ + + + + . . . + + @ $ # @ @ # + . + @ + + + @ $ $ # # $ # # & = = ; ; { ; & # @ @ # # $ $ $ * ; ; = ] = { ~ ( _ ; @ ; ' _ [ | , # + + + . . . . + @ @ + + + + . . . . . . . . + . @ + @ # # @ @ # # + @ @ + + + + + + + @ + + + + @ . ", ". . . + + @ @ @ # # @ @ # @ # # $ $ $ @ . . + + + . . . + . . + . + . . . + + $ * $ @ + + @ @ @ @ @ + + + @ + @ + + + + + @ @ @ # # @ + . + + . . + @ & % % @ + . . . + . . . . + @ # $ % # + . . + @ + + + @ @ + + # # @ + + + + + . + @ + @ # @ + . . . + + @ + + @ # $ $ $ $ # % # $ = - ; ; * % % # $ $ $ # # $ $ * = * - ' - { ' / ' $ % ~ , : 1 ! ; # + + + @ . + + . . . . . . . . . . + + + + + . + + + @ # # # $ # # @ + + @ @ + + # @ @ + + + @ @ @ . ", ". + . + + + @ @ @ @ @ @ @ # # # # @ + . . . + + . . + . . . + + + + . . . . . + # @ @ + + @ @ @ @ + + + + @ . . + @ @ @ @ # @ @ # @ + . . . . . . + # % & $ + . . . . @ # # @ . + @ # @ @ + . . + @ + @ + @ # % @ @ @ + + + + + + + . . @ + + + . . . . . @ @ + + . @ # $ & $ # # % $ $ = { ; & % % & % $ % $ # # @ $ & ; * * ; - { ( / { % { } 1 2 } ; # @ + + + + + + + . . + + . . . . . . + + + + + . + . + # # # # $ @ @ + + @ # @ @ @ @ @ @ + + @ # + @ . ", ". + + + + @ @ @ @ @ @ # @ # # # # + + . . . . . . . + . . . . @ # + . . . . . + + + + + + @ @ @ @ + + + + + + + + $ $ @ + $ # + @ + + + . . . . . @ $ % * $ @ . . + @ $ % * & @ + @ + + . . . + + @ + @ @ # ~ - # + . + . + + + + + + . + + + + . . . . @ # $ + + @ + + # $ # # $ $ # $ & & % % & & # $ % % & $ # # % $ & * * - ' { ( ( * $ ] 3 4 5 ' @ @ @ + + @ @ + + + + + . + + . . . . + + + + + . . + + @ # # @ + @ @ @ + + + + # @ + @ @ + + + @ @ + + . ", ". + + + + @ @ + @ @ + @ @ @ # @ + . + . . . . . . . . . + + + + + . . . . . . + @ + + + + + + @ + + @ @ @ + + + @ # @ @ @ # @ + @ . . + . . . . . # % & $ # + . + $ % & * ; ; # + + + + + + + @ @ + + % % * / { @ + . . . . + . + @ + + . . + @ + . + @ @ # # + + @ @ # # @ # $ $ # # @ @ @ @ $ % % $ # # $ & = % $ # # % & * = - ~ ] { $ $ / : 6 7 & @ + # + @ # @ @ + + + + . + + . . . . + . + + + . + + . % $ @ @ + + @ + @ @ + @ @ @ + + + @ + + + @ @ . . ", "+ + + + + + @ @ @ + + + + + + + . . . . . . . . . . . . + . + + + . . . + + + # @ + + . . . . + @ + # + + + + + @ # @ # @ @ + + + + . . . . . . . @ @ @ @ @ + . @ = = & * * % . + + + $ # @ # @ @ @ + & ; = { % + + + . . . . . + + . . . . + @ @ . + @ @ + + + + + + @ # # # # # @ @ @ @ + + @ $ * % # @ @ $ & $ $ $ $ # $ $ * - ~ ' % $ & , : 1 ) # @ + @ @ @ # # @ + + + + + . . . . . . . + + + + . + + + # # @ . + + @ @ @ @ + + @ + @ + + + + + + + + + . ", ". + + + + + + . . + . . + + . . . . . . . . . . . . + + + + + + . . . + @ @ # $ # @ @ + . . + + + @ # @ . + + + + @ @ @ @ + + @ + . . . . + + + + @ + . + + . . + ; - % * % @ + + + + @ @ # @ @ + @ + $ % $ # + + + + + . . . . + + + + + @ @ + . . + @ @ . . + @ @ + + @ @ # # # @ @ + @ + + @ % & # # # @ $ % $ % % $ % % $ ; { ~ - & $ ; } } / * @ + + + @ @ # @ @ + @ @ + . . . . . . . @ @ + + + + + + + + + + + @ @ @ @ @ @ + # + + + + + + @ + @ + @ + . ", ". . . . . . . . . . + + + . . . . . . . . . . . . + + + . + + + + . . + @ @ @ # @ # @ @ + + + + @ @ @ + + + @ @ + + # @ + + + + . . . . . + + + + @ @ + . . + . + & ; ; ; * # # # @ + + + + + + + + + + + . . . . + @ + . + + + @ % & @ @ @ @ . . + + + + . . + @ + + + + + @ @ # @ @ # + @ $ # @ @ @ + + # $ # @ $ & % % $ & = = ] ; $ $ - } } ' + + + . + @ + @ @ @ @ @ + + . . . . . . . + @ + + + + @ + + + + . + # @ + @ # @ # @ @ + + @ + @ # @ + + @ + . ", ". . . . . . . . . + + + + . . . . . . . . . + . . . + + . . + + + + + @ @ + + @ @ @ @ + . + @ @ & $ + . + + @ @ @ @ + @ @ + + + . . . . . + . . + + @ + . . . . . $ ; = ' & # @ $ # # @ # $ % # @ + + + . . . . . . + . + + + @ # % @ + + + + + + + + + + + + + + + + + + + @ + + + @ @ + # $ # # + + + + @ $ # + # % % % % % & = ] * # $ ( [ > & @ + + + + + + @ @ + @ + . + . . . . . . . + + + + + @ + @ @ @ @ + @ $ @ @ + @ @ # # @ @ @ @ @ @ @ + @ + @ + . ", ". . . . . . . . + + . . . . . . . . . . . . . . + + + + + + + + . + + # # + + @ @ @ @ + + + @ * % # + + @ + @ # $ @ @ + + + + . . . . . . + . . + + . + + + + + . $ - = ' ; $ # # $ $ @ # % = = # + + + . . . . + + + . . + @ # $ & + + + + # @ + + + + + @ @ + + + + + + + + . . . + + . + @ $ @ + + + + + @ @ @ # % $ % $ $ & - ~ ; # % ~ / ~ @ @ + + + + + @ @ + + + + . . . . . . . + + + + + + . @ + # # $ # + @ $ @ @ @ # # # # @ @ @ @ @ @ + + + @ @ + . ", ". . . . . . . . + . . . . . . . . . . + . . . . . . + + + @ + . . + @ % # + + @ + @ + + @ + # % & $ + + + @ @ @ + + @ + . . + . . . . . . + + + + + + $ $ + + + + & { { = * % & % $ $ & % % & $ @ @ + . . . . . . + + . . . + @ $ @ + @ + + + + + + + . + + + + + . + + + + + + . + @ + . # @ @ + + + + + + + @ # % & & & @ % ; ~ ( = $ & { ] * + + + . + + + + @ + + + . . . . . . . + + + + + + . + + @ @ + # @ + @ @ @ + + @ # # # @ @ @ @ @ @ + @ + # + + . ", ". . . . . . . . . . . . . . . . . . . + + . . + + . + + @ # + + + % & * @ @ + @ @ @ @ + @ @ # & * # # @ + @ + + + + + + + + + . . . . . + + + @ + + # ; % + @ @ @ * { - { * & & * $ $ & * $ @ @ @ + . . . . + + + + + + + + + @ # + + + + + @ @ @ + . . . + + + . + + . + + + + + . . . # $ + + + + + . + + + @ # * = = ; $ % ' ] ] = $ ; ] * + + + + + + + + + + + + + . . . . . . . + + @ + + + . + @ @ + @ @ + + @ @ + + @ $ & # # # @ # # + + + + + @ @ @ . ", ". . . . . . . . . . . . . . . . . . . + . . . + + . + + # @ + + @ $ $ # + + + . + + @ @ @ # % & # + @ @ + + + + + + + + . + @ + . . . + + . + + . + @ $ @ + @ + + % - { ' ; % $ $ + @ @ # + + + + . . . + + # @ + + @ + + . + # # @ @ @ + @ # $ @ + + . + . + . . . + . . . . + + . + + # # + + @ @ + . @ @ # @ $ % * & * * % ; - % $ % ' / & + + + @ + @ + + + + + @ + . . . . . . . + @ + @ @ + + + @ @ @ $ # @ @ # # @ @ @ # $ $ # @ # @ # + + @ + + + + + . ", ". . . . . . . . . . . + + . . . . . . . . + + + + + + @ # + @ @ + + + @ + . . . + + + # @ @ # # + + + + + @ + + + + + + @ + . + . . . . . + + @ @ . + . + . + @ @ $ ; ' { = $ + . + . + @ @ + + + + + + + @ + + + @ # . . . + @ + @ @ @ + + @ # # @ + . . + + + + + + + + + + + + . . + + + @ @ @ # @ . + # # % & % & * & ; = * * % $ & ( ~ + + + + + + + + @ + @ + . . . . . . + . . + + + # # @ + @ @ # # # $ # # # @ @ # # $ # @ @ $ @ @ @ @ + + @ + + @ + . ", ". . . . . . . . . . . . . . . . . . . . . . . @ + + . + + + + @ + . . @ @ + . + + @ @ @ @ + + + . . + # @ @ + @ @ + + # $ @ . + + + + . . + @ @ + + . . . . + + + # * - ^ { % + + + + + + + + + + + + @ @ + + + + @ + . . . + + . . + + + + # # @ @ + . . + + + + @ + + @ + + @ + + . . + + @ % # # @ . + # $ $ & % * & & * = = = * $ ; ; # + + + + + + + + + @ + + + . . . . . + . . + + # $ # @ + + # $ # @ @ @ @ @ @ @ % & % # @ # @ $ $ @ @ @ + @ @ + @ @ . ", ". . . . . . . . . . . . . . . . . . + . . . + + + . . + + + + . + + + @ @ + + @ # # # $ # + + + + + @ $ @ + + @ # @ @ @ # @ @ + + + + . . @ $ # + . + + + + + + @ # ; ~ ] ~ ; @ + + + + + + + + + + # @ @ @ @ + + + @ + + + + + + + + + + @ @ # $ # + . + + + . + @ + @ @ + + + + + . . + @ # $ # @ + + @ $ % $ % % & & & * = { { * & ; % @ + . + + + + + . + @ + + . . . . . . . . + + + # @ # # # + # % # # # # # @ @ $ & & $ # $ # $ # # @ @ @ @ @ @ + @ # . ", ". . . . . . . . . . . . . . . . . + + . . + @ + + + + + # + + + + @ @ + + + @ @ $ % $ # @ @ @ @ @ @ $ # @ . + . + @ @ + . + @ + . . . . @ $ # @ + + @ + + + + + @ $ % ] > ( & @ + . . . . . . . + @ # + + # # + + # + . + @ + + @ @ + + @ @ + @ # # + @ @ + + + + + + + + + @ # + + + + + % % # $ @ + + # $ % % & & & * * & = ; = * * $ @ . . . + + + . + + + + + + . . . . . . . + + . + # $ # # $ # # @ # $ # # # # $ $ & & $ # @ @ @ @ + @ @ + + + + + @ $ . ", ". . . . . . . . . . . . . + . . . + + + . + + + + + + @ @ + + + @ @ @ @ + @ @ @ @ # # # + + # @ @ @ + + + + . . + @ + + . + + . . + + # $ % $ @ + @ @ @ # # + + + + . * ' { * @ + . . . . . . . . + + . . @ # @ + @ + . . + + + + @ @ + + + + # # @ + + + + + + @ @ + + + + @ + + + @ @ @ @ # # # @ @ @ $ $ $ $ $ & % & & * ; % $ & & + + + + + + . + + + + + + + + . . . . . . . + . + @ % = $ @ @ @ # @ @ # $ # # % % & * % % $ + @ @ + @ + @ + + + + @ $ $ . ", ". . . . . . + . . . . . + @ + . + + @ @ + @ + + + + @ # # + . . + @ @ @ + @ @ @ @ @ + + . + @ + . + + + + + . + # @ + @ + @ + + + @ @ @ @ $ $ @ + $ & * { * + . . . . + # % # + + . . . . . . . . . . . + + + + + + . + @ @ . + + + + + + + + @ # + . + + + + @ # + @ # . . . . . + + @ # @ + # + @ + + $ $ # # $ % & & % ; & # @ @ # + . + + + + + + + @ + + + + . . . . . . . + + . + # $ % @ @ @ $ $ @ @ @ @ @ # % & * & $ $ @ + @ + + # @ + + @ @ # @ @ # . ", ". . . . . . + . . . . . + # + + + + + + + @ + . + @ # # @ @ + @ + @ + @ + @ # # @ + @ + . @ # + + + + + + + + @ $ # @ @ # $ # + + @ # @ @ @ @ + @ * - { ] % . . . . . . + + + + + . + . . . . . . + @ + + + @ @ @ + + + @ @ . + . + + . + + + @ # + + + + @ + + @ @ $ # . . . . . + . + # + + + + + + + @ @ % % & * * & % ; * @ + + + + + + + + . . + . + + + + + . + . + + + + + . . + @ # # @ @ # * % $ & # + @ $ $ $ $ # @ @ @ + + + + @ @ @ @ # @ @ @ @ # . ", ". . . . . . + + . . . + + @ + . . + + + + + + . + # # # + + @ @ @ @ + @ @ # @ @ + + # + . @ # + @ + + + . + + @ # % # + # @ @ + + + # @ @ + . . + & % % = % . . . . . . + + + . + . + . + . . = ~ & & # + + @ # + @ @ + + + @ @ . + + . . + + + + + + + + + @ + @ # # @ . . . . . + + @ + + + + . . + + @ # % * $ % ; * $ $ # + . + # . . + + + + + + + + + . + . . + @ @ + + + + + . . + + # # @ % * $ $ * $ @ $ % $ # % $ @ @ @ + + + + + + + @ @ + @ @ @ # . ", ". . . . . . + + . . . + + + + . . . . + + + # @ @ $ $ @ @ + @ @ @ @ + + @ # @ + @ + $ $ @ # @ @ # @ @ + + + @ $ % & % $ # @ @ # @ @ @ # # . . . . + + + @ # + . . . . . . . + + . . . . . ; , 8 9 { $ # @ @ @ + + + + @ @ @ # @ + + + + $ $ + . . + + + + + + @ @ # $ + . . + + + + + + + + + + + . . + @ # & % # % ; ; % # + . + . @ + + . + . . + + + + + . . . . % # + @ + + + + + + @ # $ # & = - & - * $ # & % # $ % @ @ @ @ # @ + + + + + @ + @ @ + # # . ", ". . . . . . + + . . + + + + . . . . . + # # # + @ @ + + @ $ @ @ @ + . + # # # @ + @ % % @ @ @ @ @ + + . @ # # # # # # # % $ @ @ $ $ @ # # . . . . . . . . + . . . + + + + + + # @ + . + = ! 4 0 } * # @ # $ # @ + + + @ @ @ @ # @ @ + = { @ . . . + . + + @ @ @ + @ @ + . . + + @ + + . . . . + + . . . + @ $ $ # % * & % @ + + + . . + . . + + . + + . . + + . . + = $ + + + . . . + + @ % % $ * ~ { * ~ * $ & % # % % $ # # + + # # + + @ + @ $ + + @ + # @ . ", ". . . . . . . + + . . + . . . + + @ + + # # + + + + + + @ # @ @ @ + . + + + + + + @ @ + + + @ + + + + + # # $ # + + + + @ @ + + @ @ @ @ + + + . . . . . . . . . . + + @ @ @ % ; $ @ + # { ! 4 1 # + + + # @ + + + + + + + + + + @ $ * ( { @ + + @ @ @ # @ @ @ # + + + + . + . + + + . . + + + + + . . . + # $ # $ % & $ @ + . . . + . . . + . . + + + . + + + . . ' ' # + + . . . . . @ # % $ $ * / ] = = & % & $ # % % $ % # + + # # @ + + + # + + + @ @ @ @ . ", "+ + . . . . . . . . . . . . . + + + + + + + + + + + + + @ @ @ + + + . @ @ . . + @ # + + + + + + + + + @ & $ # # + + + + + . + . + + + + + @ + . . . . . . . . . . + + @ @ @ $ % $ @ + + # ; ~ * . . . . + . . . . + + + . . . + # * = = & $ @ @ $ $ # @ + + + + + + + @ + . + + + + + + + + + . . . . + + @ # @ $ $ $ @ . . . . . . + . . . + . + + . . . . . . $ ] { # + . . . . . + $ * ; & $ { ! > { = % $ % % # # # $ @ @ @ @ @ @ # # @ @ @ + + @ @ @ @ + . ", "+ + . . . . . . . + . . + + + + . + + + + + + + + + + + + + + + . . . . @ @ + @ # $ @ @ @ + + + + + # % % @ + + + @ @ + + + @ @ # # @ + . . + . . . . . . . . . . . . . + # @ @ + . + @ $ # + + . . . . . . + + . . + + + + + # # $ % # # % # @ # $ @ + . + . + + + + + + + + + + + + + . . . + . . . . + + # # # @ + . . . . + . . + + + . + + . . + + + . . + - ( ; @ + . . . + + + % - * # % _ 3 > ^ { # @ $ $ # # $ # # @ # # # # $ @ # @ + + @ @ @ @ @ + . ", "+ + . . . + . . . . + + @ + . . + . + + + + + + + + + + + + @ @ . + + + @ @ @ @ $ $ # # # . + + + + % * $ + + @ # $ $ # + + # $ % % # . . @ + . . . . . . + + . . . + . . $ # @ + + @ % * * @ . . . . . . . + + + @ # % $ % $ $ # $ & & # @ . @ @ @ + . . + . + + + @ @ + @ + + . + + + + . . + . + + + . + % % $ @ . . . + + + + + . . . . . . + + + + . . . . { ( % + + . . + + + # & & @ + % : a _ ] { # @ $ # & * # @ # # $ $ $ % # @ @ @ @ # # @ @ @ + + . ", ". . . . . . . . . + + + @ + . . . # # + + # $ + + + + @ + + + + + @ # # + + @ # $ * % $ # @ @ @ . . # $ # + . + + @ # $ + @ # # # @ + + + + + . . . . . + # $ # $ $ % * # # $ # $ % % + & { ; + + . . . + . + @ $ % * ; { ] & # $ * & * $ + . + + + + @ + + + + + @ $ # + + + . + + + . + @ + + + + + + + @ % % $ @ . + @ & # + + + . . + . + . . + . . . . . + = ' @ + + . + + + @ % ; $ + + # ; ; = { = % % % & % $ @ # @ % ; % % $ $ # @ # $ # $ # @ + + @ . ", "+ . . . . . . . + + + + + + + + @ * # + + $ % + + @ # $ $ @ $ @ + @ # # + @ # # @ % $ $ # @ # # . . # # @ + . + + + @ @ # @ $ & # . + + . . + . . . . . @ * * ; ' = ' ] & @ # # $ * $ @ % = = @ # + . + + + @ # % ; { - { = & % & & @ + @ + + + + . + # @ + . + + @ # @ @ + . + + + + + + + + + + + + . + @ # $ # @ + @ $ & # + + + + + . . . . + + . . . . . + # # + + . + . + + $ & % # # @ @ # $ * = ; & * * $ $ # # # # * ; * ; $ # @ $ $ $ $ # $ @ + + + . ", "+ + + . . . . . + + + + + + @ # % % @ + + $ ; $ # # $ & # $ & @ + + + + @ $ $ + + + + @ + + @ + + + $ # + + . + + + @ # % $ $ & # @ @ @ + . . . . + . . @ - ] ~ ( ~ ! ) = # + + + @ + + + $ # + + . + + + . + # * { { ; ; ; ; - * @ . . . . + + + + + + @ @ + . . + @ + # @ + + + + @ + + + . + + + + . . + + + @ @ # $ % $ + + . . . . . . . . + . . . . . + + + + @ . + + . + @ $ $ @ @ $ $ $ % * * & * & % % $ $ $ @ @ # & & ; - * # @ # # @ # @ # @ + + + . ", ". + + . . . . + + + + . + + + + + + + + @ * - % @ @ @ @ + @ # + . . + @ % % @ + + + # # + + + + + # * & % + . + @ @ @ @ $ % # # $ % $ + . . . . . . . + @ ] ) ^ / ( ^ ' & @ + . . . . . + # . . . . . + . . + # & & & & * = * * # + . . . . . + + # @ # # @ + + + + + + + + + + + + @ + . . . . . . . . + + @ + . + @ % & # + + . . . . . . . . + . . . . . . + + + . . + + . + @ $ # + @ % { - ' = = * ; & & $ $ $ $ # # $ % % = * $ # $ # @ @ @ @ @ @ @ @ + . ", ". . . . . . + + . . . + + + + + . + + . @ & * % @ @ . . . @ # + . @ @ # % % @ + # # @ # + . . + . # $ % % + + @ @ # # # $ & % # # # # . . + . . . . . . + ' / ] ~ ' - $ . . + . + . . . . . . . . + + + . @ $ & $ # $ & ; % % % # + . . . . . . + @ @ # + + + + + + + + + + @ + @ + @ @ + . . . . . . . + + + . . . + # $ $ + + . . . . + . . + + . . . . . + @ @ + . . @ @ + $ $ @ @ + $ ; = - ~ = { - { = & % # @ # @ # $ % % = & @ $ $ @ @ @ @ @ + @ @ @ @ . ", ". . . . . + + + + . . + + + . . + @ @ + + + @ @ @ + + . . # $ + @ $ # + $ $ @ @ # + . + . . . . . . + @ + + @ # $ % & * $ $ & # @ @ @ . . . . . . . . . . % ; - ; % @ . . . . . + . . . . @ + @ + + + . @ % - { # + + @ # + @ @ + + + . . . + . @ + + + @ @ . + . . + + @ + + + @ + + + + + + . . . + + + + + . . . + @ # $ + . . . . + + . . + + + + . . . @ % % @ + . + + # * * # + @ $ % * - ( ^ { - = ; % $ # # # # % % % ; = & $ # # @ # @ + @ + @ @ @ @ . ", ". . . . + @ + + + + . . + . . + + + + + . + @ @ @ @ + . + # % @ @ # # @ $ % # # # @ # $ + + @ + @ @ @ + @ # * ; & * * & $ # % $ $ % @ + + + . + . . . . . @ @ @ @ + . . . . @ $ % $ + . + $ & % + + + @ - ~ / ~ + . . . + + + + + + + . + % @ @ @ + . + @ @ @ + + + @ + + . . + # + + + + @ + . . + + + + + + . . . . @ # @ + . + + . + . . + + + + + . . . # = & + . . @ # % & $ + + + % # & / : , ^ - { = % # $ $ @ $ $ $ % - ~ = % $ # @ @ @ @ @ @ @ @ @ @ . ", ". + . + $ & + . + + + . . . . . + + . . . + @ @ @ @ + . + # $ @ + @ $ $ * & % # + @ & # @ @ @ @ # # @ + + $ - = % @ # % % # % % $ $ $ + + . . . . . . . . . . . . . . . + # * - ^ ' # . @ * { $ + + & ; , ) ^ & @ + . + $ & # # @ . . . + @ + # @ . + # # # $ @ # # + + + + + + + . . + + + + . + @ + + + + + + + . . + @ + . . + + . . . . . + + . . . . + & / * + . . @ $ ; & $ + + @ # % ; _ _ ~ ~ ; ; % @ @ # % % & % $ - { ' ; % $ # @ @ @ + @ @ # + + @ . ", "+ + + @ $ % @ + + @ + . . . . . + . . . + # ; # @ + . . + @ # # # # $ $ = & # @ . @ # @ + + + @ @ # + + @ # & & @ + @ % & & # @ + @ # + + + . + + . . + . . . . . . . . @ & = { ] { # @ # $ # . + # - { _ ) ' # @ @ @ @ % * $ $ @ . . . + + . + @ $ * = % % % # + + + . + + + + . . . . + + . + @ + + + @ + . . + + . . + + . . . + + + + + + + + + . . . . { [ & . . @ @ $ ; ; $ @ # & * % ' ^ ( - = ; = ; @ @ $ % % * ; * { { = % # # # @ + @ @ @ @ + @ @ @ . ", "+ + + + + @ @ + + + + . . . + . + + . . + % - % @ + + + + @ @ # $ # $ $ % @ + + + @ @ + + . . @ @ @ @ + @ @ $ $ @ # $ & = * @ + + + @ + + @ + + . . . + + . . . . . . . + @ # # $ + + + + + . . . @ ; - = ; % $ % % * # @ @ + + + + . . + . . . + & ' - & % $ @ + @ + + + + + @ + + + + + . . + @ + + + # @ . . + + + . . . . + + . + + + + + . . . . . . + _ 6 - . . + # % ] = % % % * ' { ] , _ / { - ; # @ $ # # & ; * & ; - - % @ $ % @ + @ @ @ @ + + @ # . ", "@ + + + + + + + + + + . . . . + + @ # # $ & * & @ + @ # + . . @ @ # % $ + + + @ + + @ + . + + @ # @ @ @ @ $ * % @ % = ; * & @ + $ $ % @ + + + + . . . + + . . . . . + + + . @ + . . . + . . . . . + # % # + @ & * & & @ + . . . . . . . + + + + @ * ' = & # $ @ + + + # # + + @ @ + + . . . . + . . + + @ @ + + + + + + + . . + + . . . . + + . . . . . . # ( , & . . + @ & ] & $ * * - ' ' ] > , ( ~ { & @ $ * & # $ ; = & ; { = * % # $ $ # $ # @ @ + + @ @ . ", "@ + . + + + @ @ + + + + + + + + + @ $ % * * & $ @ . @ # @ . . @ # $ * % + + @ # + # # + . + @ @ @ + @ @ + # * ; % & % % & # @ # # $ $ + + # @ + . . . . . . . . . . + + @ @ @ + . + @ $ @ . . . . . # # + + & { & # @ + . . + + . . . + + + + # & { - & # * * # @ + $ % @ . . + + . . . . . . . + + + @ + + + + + + + + + . . . . + + + . . . . . . . . . * ( ] $ + + + + * { @ + $ ' ' ~ ~ > [ / / ( ] % # & * ; % % = - - ~ ^ ~ * % $ $ $ $ % $ @ + @ @ . + . ", "@ . . + @ @ @ @ + + . . + + + # @ + @ % ; & $ # @ . + @ @ + + @ # & ; # + + & & @ $ % + . + @ @ + + + @ @ % { ~ & & + @ @ @ @ + . + + . @ # $ # . . . . . . . @ $ & # @ @ $ # # $ # % ^ * . + + # % $ # @ & - ; # @ + + + + @ @ + . . + + . . @ ; ' & # @ * { - & % % $ @ . . . . . . . . . . . @ @ + + @ + + + . + + + . . . . . . . . . . . . . . . . + ~ b ) @ . + @ @ & $ @ @ % ' ( ^ > : [ > ( ^ ] = % * = ; % & * - { ' ' ; % & % $ $ # @ $ @ + @ @ + @ . ", "+ + + + @ @ # + + . . + + + + @ @ @ @ & & & @ @ @ . + + @ @ + @ # % # + + @ { - # ; & + + + + @ # @ + + $ - { ; $ $ @ @ @ # + . . + + + # * ^ { . + + . . . @ & ~ < ^ $ # # @ # % - - ; @ + + $ ; = % + + # $ + + @ + + + @ # # + + + + + + + + * & + + $ & ' ' & # # @ + . . + . + + . . @ # + @ @ @ + + . + + + @ + . . . . . . . . . . . + . . . . . # < 4 > . + # # $ * $ @ $ ; , ^ ) ) [ 5 a ) ~ ; * % * { ' = % { ^ ' * % % # % $ $ # # # @ @ @ + + + @ . ", "+ @ + + + + + + . + + @ + + + @ # $ % & # @ @ @ + . . . @ $ # @ $ # + + . + * ; & ' % + + + + # $ @ @ $ ; - ] & # @ @ # @ @ @ + + # + @ % ~ , ; . + + + . + % = , 3 3 ^ - % $ * ; = % . . . $ % % $ % @ + + @ @ + + + + + @ $ # @ + + + @ @ @ @ & * @ # & * * * # + @ @ + + @ + # # @ + + # $ @ @ @ + + . . + + @ + . + . . . . . . + + @ + + . . . . . { 2 8 ~ . . @ # $ % # # & ^ / ' , > b c [ , ) ] * $ $ = ' - * = ~ ( = % $ # $ % % $ # # # @ @ + + + + . ", "+ @ @ + + . + + + + + + + + . + @ # # # @ + . . . . . + @ $ # @ # # + . . @ & & $ # + + + + @ # # # # & ' ^ ( & + @ @ @ @ @ # @ # # @ $ ' ' $ + . . . . . + & = = ( b : , - % % # + . . + @ % @ # # $ % # @ # $ # % # + @ $ $ # @ + + @ @ @ + + & & $ # # % & # + + @ + + @ # @ $ @ + + @ + @ + + + + + + + . . + + . . . . . + @ . + + + . . . . . . . ( d e * . + + @ # $ % % = - ' _ : > a [ ^ ( ) = & * % - { * = - = ; ; * * $ % % # $ @ # # @ @ # + + @ . ", "+ + + + + . + # @ + @ + + + . . . @ @ @ + . . + . . + $ % ; % @ % # + + @ ; = & + . + . . . @ # # # $ ; - = $ @ + + $ $ # @ @ # # # @ * ) ' + . + . . + . @ & = = ] : ) : ] ; & + + @ # $ % $ # # # # $ # + + $ $ = $ + @ # @ @ + . + + @ + + @ % @ @ @ @ @ @ + . + @ + @ # # $ @ + @ # @ + + + + . + # @ + + + + + + . . . . + + . . . . . . . . . . + ) f 4 $ + @ @ + # % $ $ - - _ ! > ! 3 [ ^ ) > ; = - = = * $ $ ; - - ] = & % % $ # $ + @ $ @ + @ + + @ . ", "+ + + + + + + @ # # + . . + + + + @ @ + . . . + + $ & & & % % # # @ @ @ # = { * + . + + + # @ @ % - & * ; ; & + . + % % @ + + # @ @ @ & ^ - . . + . + + + # & - ' ^ / , / - = # @ + # ; ' ; % @ # + + @ @ + @ @ @ # # @ @ + . . . + @ + + . + % = $ . . @ + . . + + @ + @ # & ; @ + @ # + + . + + . + + + @ # + + + + . . . . . . . . . . . . . . . . # g h 2 ; @ @ $ @ # $ % = ~ ~ > ! 7 i j k : [ , ' { { - ; & $ % & - ~ _ = $ % % % # @ @ + @ + @ @ + + + . ", "+ + + + @ @ + @ + + + + + + # @ @ @ + + + . . @ % = { & # # @ @ @ + @ @ $ & * % + + @ + # # # % ; = - = & * & @ + # % % + + @ # # # @ @ + + . . . . . + + @ % * * - = ~ ~ # # @ @ $ * - ] = * @ . . . . . + $ @ + + + . . . . . . + @ @ + + @ & ; $ @ @ + + . . + + + + + + % $ @ @ + # @ + + + . . + + @ @ + . . . . . . . + . . . . . . . . . . . . & | l 2 ' $ & $ # % $ & { = ] ! 7 c m n o b / ] = { ~ { * % $ & ; ~ / ' { % # # $ # $ # $ + . @ @ + @ @ . ", "+ + @ + # # % $ + + @ + + + $ @ + . + @ + . . # ; ] ~ * # # @ @ @ + + + @ # @ # $ @ + @ @ @ # % $ & = * * $ $ @ + % # + + # % % % & @ + + + . . . + . . . @ & & % # + ; ; + $ # @ $ & * % = = + . . . . . + + . . + . . . . . + + + $ # + + + * & + + @ @ + + + + @ + + . + + + @ @ @ + + . . . + + @ + + + . . . . + . . . . . . . . . . . . . . . + ; g e > * % = & % ; % & { ] < < 1 p q l r g & % * ( / / ^ = ; ; = , , - ; & % % # $ % $ # @ + @ @ + @ + . ", ". + # + + # % # + + @ @ . . @ + . . + $ # . + % * ' { - $ # % @ + + @ $ $ # @ % ' % . @ # # % % # & ; * % @ @ # # % $ @ @ & * & ; - % + + + + . + . . . . + @ @ @ + . @ # @ @ # + . + @ $ ] ^ + . . . . + + . . + . . + + + + + @ # # # @ + & = # + . + + . + # @ @ + + . + . + + + + . + . + + + + @ @ + + . . . . + + . . . . . . . + . . . . + + # - ! ( * & = - * & % ; = ' ( a ) 7 s p t 2 ' # # & ^ , ! , = ; - ] } > ' & * * % % & $ $ @ @ + + + + + + . ", "+ + # # + + # + + + + + . . . . . + + ; = @ + % & % * * % # # + + @ & ; * @ + @ $ @ + + # & * * # $ % % # + @ # % % % % % % % # & % # @ + @ + + + . . . + @ @ + + + + @ @ + + + + + . @ * ~ = . . + $ # # + . . . . + + + + + @ # # $ = < 7 / ; @ @ # + . + @ # # @ @ @ + + @ @ @ + @ + + + + + . + + + @ + . . . . . . . . + . . . . + . . . + + . # = ' = % & ^ ~ = = & * { ( ^ , [ 8 o 0 4 > & @ # & ^ ) ! _ ; = { ~ ( ~ ; % % & & & % $ $ # # @ + @ # + @ . ", "# $ @ # + + + + . . . . . . . . + @ @ & ; @ # # @ $ # # @ @ + + # $ - - % @ + @ + . . @ & = * & $ @ # & & @ # $ $ $ # % & $ # @ # @ @ @ # @ + + + . . . + * & + + + + @ @ @ + # % # + % = * + . . @ % - * + @ @ @ + + @ @ @ + + @ # $ < q q g = % % * # + @ # @ @ # $ % $ # % @ + + # @ . + + + . . . + @ + + . . . . . . . . . . . . . . . . . @ # - ; * { & ^ < / ] ] ' { ' / ^ ^ 6 u v 0 | { $ + # = ) : [ ( = & ~ ^ ^ ~ { ; & & % % # # @ @ @ @ @ + # @ @ . ", "& & @ + . . . . . . . . . . . + @ # # $ $ # + + + # % $ @ + + + @ % & & % @ + @ @ + @ % ~ - * * * $ & - - % # $ * $ # # @ @ # @ @ # $ $ $ @ + + + . . . + * ] { % $ @ $ % + + # = & + $ % @ @ + + # & ; $ $ = ~ = @ @ @ + + . . + # & , i c < * $ % & # @ @ # # # # @ $ $ # @ # @ + + + + + + + . . + @ + . . . @ + . . + + . . . . . . . . + + . - ) * & % * , 3 _ , < ( ] / ) } } w o x j g ; @ + @ _ 6 a < ] - = ^ ~ ^ ^ ~ { - = & % % # @ + @ # @ # $ # + . ", "= & + + . . . . . . . . . + + @ # $ - # @ @ @ . + @ & & @ + # @ @ $ # + @ @ @ # # + % ' - & = = * & * = = & % $ # # @ @ @ @ $ @ @ * & % $ # + + + + . . + % ] / - % @ & = @ . @ $ + . + @ $ & % @ # % # # % = ' % @ # + . . . . + # @ $ - ~ & $ $ # @ @ $ $ $ # @ @ + # # + + @ # # @ # + @ # @ + + + + + + @ # # # @ + + + + . . . . . . . + @ @ ~ ~ = ~ & = ^ ( ~ / < ) : } } } 2 s y q p > @ + . % ) 7 [ < _ ( : > _ , ~ ~ ' ^ - ; % $ # # @ + # @ @ @ @ + . ", "$ $ + + . . . . . . . + . + @ @ # & = @ . @ @ . + # - - + + # @ + # # + + + @ # + + & ~ ' = ; * % # # # @ @ % $ @ # @ + + @ $ @ @ & * $ $ @ @ @ @ + + + + & - - ; * ; * $ + . . . . . + & ' ^ ; # + + @ % - & $ . . + . . . + + . . . + % ; # @ # @ + @ $ $ $ % $ # @ @ + + + + @ # $ $ + + @ # + + + + + @ # $ $ # + . . . . + + + + . . . @ + # & $ ; ~ - { ] ' ^ _ < a e 2 3 e w s y z 4 / + . + & ] < < ) , , b b : : ( ' / / - & $ # # @ @ @ # # # @ @ + . ", "+ @ + + . . . . . + . + + @ @ # # $ $ + . @ @ . % - ^ ; @ $ * # + % * @ + + # $ + % = ~ ] { & # + . . . . + # # @ $ @ @ @ @ @ @ + # % = % @ @ + @ + + + @ % % $ # * { $ + . . . . . . @ { : , $ @ + . $ = ; % + . . + + + + + + + . . + @ # + . + + + @ # # # # # @ @ @ + + . + + + + + + + + + + . . # @ $ $ # % @ # @ . . . + . . . . . @ # + + # $ - ( : 3 / ^ ( _ ! 2 5 g 7 2 5 A t 4 a { . . + = / } } > b [ w A > } ! ~ ' - - ; % # @ @ @ @ # # # # # # . ", "# + + + + + + . . + + + + @ # # # # % @ . @ @ + % ~ ~ & % ; * $ $ % $ @ . @ * & % - { * * % % # . . . + + @ % @ @ $ @ @ # # $ # + @ # & * % + . + + @ # $ % # @ # $ $ + . . . . + + . @ = , ~ + + . + * ; $ # @ @ $ & & * % # $ # $ # $ * # + . + + + + # @ + + + + @ + + + + + + + . + # @ + + + + + % * & # + # # # @ + . . . . . . . . + + + @ # $ / [ 9 w ' ] ' / < 6 5 k 2 6 9 7 g 8 1 & . . + - < < [ 3 6 5 9 1 < b : / ] { ; ; & % # # # @ @ # @ @ $ # . ", "# # . . . + . . + + + + + @ # % - % $ $ + @ @ + % ] = % % * # & - $ @ @ @ $ % & & * $ # # # & $ . . . @ $ & * # @ # $ & $ @ # @ @ # @ # ; * + . + + @ $ % # + + @ + . . . + + . . @ % * = ~ ; @ @ + # * % # # # ~ 6 7 / ] ' ) : > _ { & % # + . @ + + @ # @ + + + + . + + + . . . . + @ + + + . + + + $ & # @ + + + + + . . . . . . . . + + + + # $ * / 1 0 e ( ~ = ' ( g k w a | 4 5 9 v 5 $ + @ @ - ! ) > b 4 i 9 7 ! 6 g 3 ) ' { - * % $ # # # @ @ + + @ # . ", "@ + + . . . . . . . + @ + @ $ % ; % $ # + # % # $ - ~ % # $ # % % @ + $ = * $ @ @ + + @ @ @ # + + + @ # $ $ @ + # & ] ] & + + . @ # + @ * ' + + + . @ * $ @ . . . . + . . . . + + % ; ' - { ; % & @ * * $ % $ * 7 B 4 , { ~ , a 2 } ] % + $ @ @ * $ @ # # + + + + + + + + + + + + + # @ + @ + @ @ + + . @ % $ + + . . . . . . . + . . . @ @ + + # % = _ b c 6 _ { = ; / g 5 3 > 7 2 C d t , . @ & * _ } > 6 [ 3 A 2 1 6 4 w 1 , - = ; * % # $ # $ # @ @ @ + @ . ", "+ + + + + . . . . . . + + + $ % $ $ # + @ & ' ; # # * # $ $ @ @ . . @ # @ @ + . . . + @ @ $ # + . @ $ $ # @ # @ # % / : & + @ @ # # # # & ; # + $ % # $ @ + . + . + + . + . $ # @ $ $ $ % % # % & $ ; & $ ; = { : ! , { & & * / _ ( ~ - = ; @ $ > : * # @ + + + + + + + + + + + + # % @ + @ @ @ + + @ + + # % @ + . . . . . . + . . . + # + + @ # % { } 4 h 5 ~ { = = > k B b b 5 c p 8 2 = . $ ' ( g 2 e e 1 6 1 7 6 2 g [ ! ( - * % % # # # & % # % $ @ # @ . ", "+ + + + . . . . . + + + . + % * # + + + @ % ' ] % + @ + + # @ + . . $ * + . . . + @ % % @ % ; $ + @ & & % & % % + @ ' { @ @ # + @ # # $ % & $ + % ; $ # @ + . . + @ @ + . $ : ^ * @ + + . . . + @ $ * $ # - * % * - * @ + @ % - / ] ] ] ' ' % $ < b ~ + + + + @ + # ; - ; # . . + % & # + + @ @ + @ @ @ @ @ @ + + + + + + . . . . . . + # + + @ # * / A h D k { ~ - / 3 C 0 g | 8 i d 2 g - . % ~ : w A A c 2 1 , ] b 2 < : , > ' * % $ # # $ & # # % $ @ # @ . ", "+ + + . . . . + + $ # # # & ^ ~ $ . . . + # * ' $ + . . . @ # + . @ $ * # + + + + # - { # * ; @ . @ & & % # # @ + @ ; * + & - $ + # $ % $ # @ + # % # + @ . . . @ # + . . ' 4 A ~ @ . . . + # @ $ & & @ + @ # $ + @ # + . + $ = / { - ; = * $ # ( / ' @ # # + @ # % * = ~ & + . + # $ # # % * # @ @ @ @ + . @ . + + @ $ @ . . . . . . + @ + + @ @ { [ 5 E F t : { ~ [ e c e 6 | 9 w g a } = # { : g d c 1 c k > _ ] 1 7 > ) ) ! ] = * & & $ % % # # # # @ # @ . ", "+ @ @ . . . . + + # # # & ^ } / * @ + + + @ # $ @ + + . @ # $ @ + $ * & $ @ # # + % - = # $ # + . @ % @ + . + @ @ @ & = $ * ] { + # % ; % # + @ @ + @ + . + . . . + . . # - e w ~ . . + - ~ ( , / { & + . . @ % @ . . . . . . @ % # @ = { % @ # $ $ % @ $ $ @ @ @ @ . + @ + + + + @ @ # & ; = & @ + + + + + + + + @ # $ + . . + . . . @ @ # @ # = [ k 8 G H I 2 , , g 8 2 c } 6 6 e [ ! _ ~ ] : e d u z k C 0 , / | r k [ > < > , = = { ; $ # % $ @ @ # # + + . ", "@ @ @ + + . . + + . + @ $ * ' - $ + + + @ @ + + # + + + @ $ # # # $ % $ $ + @ # $ & & * # + . . @ $ % @ . . . + @ # # % & @ & = $ @ @ * * $ @ + + + + + . . . . . . . . $ ' 2 4 { . + = > : } 1 1 < ] ; + + @ # # + . . + . + @ @ + + { ) { = & @ @ # # # @ @ + + + . . + @ @ . + + + @ & & $ @ + + + . + + + + + # # @ + . . . . . . @ @ @ + # _ e 8 t G J K k ( / 5 5 c C 3 [ 2 t 5 [ ~ , | e t p f G G L m [ [ 8 B 6 b b _ : , ] _ ^ * & $ $ # @ @ $ # @ + . ", "@ + . . . . . . . . . + @ # $ % & % + + + @ + # & # + . @ $ # # $ $ # # $ + @ # % % % & $ @ + @ % ; % . . . $ @ @ @ # % @ @ % & & # @ @ $ # @ + . . + + . . . . . . . + # - > > # . & > } [ a g e 3 / { # # @ % % @ + + + + & ' & . @ ; ~ ' ] ; # $ { ' $ + $ / - @ + + # * # + + + # $ $ + @ @ + @ + + + . . + # # @ @ + . . . . . . . + + @ % : 5 i d u M F 3 / ) 5 g 1 7 _ 3 c 8 e } ^ ] k 4 w G G N O P l 3 e p 8 2 2 | 3 [ ] ( > ' ; - % $ $ $ # $ $ + + . ", "@ @ . . . . . . . + @ $ & $ * - ' ; @ + @ # % & & & # + @ # # @ @ # $ % & # + $ % $ % & = * # $ $ % % @ . # ' ' { % # @ + # ; ~ ~ # @ @ @ + # + . # % @ . . . . . . + @ @ & ; # + @ { [ < > , ^ ] ] - & $ @ @ # $ @ @ + . + $ * # $ _ ) ( ' & # @ % [ a $ @ & ' { # . + $ $ + . + * = & % $ # + @ @ @ @ + . + # $ # # @ . . . . . . . . + + & ' [ 8 d C x Q C < ) 7 5 g 6 : , d o C 5 > ~ a C u 9 N l N R O o w t S B e k 2 b ! / ^ { * = { & @ @ # # # # @ # . ", "@ + + + . . . + . @ # * = % ; { - = @ + $ $ $ ; = - & # $ % $ @ @ % & % & % @ # # @ # & ; * # & * # # @ . @ ' : ) ~ & # # $ * ; * # @ % { ~ & # # ' ~ @ . . . . + @ @ @ % & @ . . . & ' ^ - ; % % ; # @ + + @ + + . @ @ . . # $ # / t 4 ( & @ + . $ ~ ] @ + + @ @ . . . + + . + ^ 7 ! { * % @ + @ + + @ @ + $ & % @ + @ + . . . . . . . . @ ' : 2 d w 9 m w 3 1 | k 4 | A < _ 4 o s e , , w G F l G m n T Q 4 8 j x p c i | 3 < _ ( - & = - & # # % $ # @ @ @ . ", "@ @ + . . . . . . # & % % & ; { ] & + # * % $ = - { ' & % & ; $ # = * # # # @ + # $ # ; % + $ & % % % $ @ . : 6 b ! / ( = $ % $ $ # # * ] / - $ - ^ * + + . . . . @ # @ $ % @ + + + @ # $ @ % % $ # + + + @ # @ + . @ @ . . # # @ { ! ! & + + + + $ @ . . . @ @ @ @ + + @ + + { 6 c ( * # @ % # + + + + @ # % % $ @ + + . . . . . + @ + + # ' 3 c t | 2 2 [ 7 e A 5 7 2 2 ! a 4 9 i 2 1 | j q Q U H Q H D I 2 t m S l z j c a ! ! ) ( ; ; ; * % % & $ @ @ @ + . ", "@ @ + + . . . . . % { ' = = ' { { $ + % { % - - = & ; # @ $ = & % = % $ @ $ # + * = * # + + & ; # ~ ] - # @ ^ | 7 3 [ < { & # % $ + + # { ' { & * = @ . . . . . @ @ # @ # * $ + @ # @ @ $ % * * % @ + + @ @ @ + + + @ @ @ + + + @ + + @ @ . . . + @ + + . + * $ @ @ + + + + % ~ > } & $ # # & * $ @ @ @ @ % = * * # + . . . . . . @ # + @ & ' ) 1 2 5 2 1 | t g e 5 } 7 7 } 5 c 9 9 6 5 5 j V K T W U X x j s 8 u y D j r 4 b a } / ^ ' * & & % % & $ @ # # @ . ", "+ # # + . . . . . % - ' ~ - ~ ^ ^ & @ ; ] - { * @ + . + + @ % $ $ % @ @ + @ # % ~ ) ~ @ . @ - = % ) : % @ $ ) k 1 _ / ( > : ^ * # . . # * ; ; $ @ + . . . . . . + # @ + % ^ ; @ # # # # * = - { ; % # & * $ @ + @ @ @ $ % + . + + + + . + . . . . @ # @ + @ # + @ @ + @ + . @ + + . + # $ # # ; * % @ @ # $ = - ; % # . . . . . . & $ . + $ - { : 6 6 2 | 7 2 1 3 g [ 2 a 1 0 A d o 3 | t j N Y M P P X v v m o d y Z u p 9 9 5 a _ ( { * % & & & % # $ # @ # . ", "+ # $ + + + + + @ # ; ^ ^ / ] / - # @ ' / ( ; @ + . . $ = & $ # # @ . + # % ; { ~ _ ~ # . & ' & & { * + @ @ > 2 ) = ~ ^ 7 2 [ * + + @ & $ @ # $ + . . . . + + . + @ @ @ = / - + . + @ = ~ - ~ ; - / b b ' & @ @ + + + # # @ # @ . + . . . . # $ + @ $ # % # @ @ + @ @ # + . . . . . + + @ + + + @ @ + @ @ @ @ $ $ & @ + . . . . @ ( % + # { ] ~ 7 6 e k A 5 | 3 ) < w d | A 9 4 d 8 9 c z N ` X H .E B v B y r h ..n o 9 t i 2 ) ) / ' ; & $ % % $ # # $ @ + . ", "@ @ # + . . . # & $ $ ~ ] , / = % + @ = ] - @ . . . + = _ ' & % $ . . + * = ~ ) ^ - - $ @ = ~ & & $ . . + + % ~ = @ # = > g , $ + @ % ; & # # $ @ . . + $ * & $ + # % # ; ' * + . + # ; ' ~ ; % ~ < k A { # @ * $ + @ + + $ ( ^ % + . . + . + % $ + # $ = ; @ + + # @ @ @ @ + . . + + . + + . . . . . @ @ @ $ # + # @ . . . . . $ - $ + % ~ ^ > a g | e k p t 6 _ ( A d d t 9 S f d 4 2 d ` D F T +.V I z e 5 i V P f 9 5 c g < > _ _ ' * % % % $ % $ $ # @ @ . ", "@ + + + . + @ - ~ ; $ # & { ] % + + + . # $ . . . . # ( < ~ ; * $ + + @ % = ] ( , ^ * + @ * = # # # @ . + # ; ' % + + ; ~ - & + + % / ^ % # $ & % @ # ~ : , ; $ + # # $ & & $ + + # * - & * % % % ; { ~ & @ # % % + + + @ { / ( = # . . @ @ @ # @ + @ $ & % @ # # ; = @ @ $ @ + @ @ @ + @ + . . . . + . + @ # # + @ + . . . . . # % + + $ = ( < b 1 k c t j p A > ! e 0 d 0 l V H i A A N @.V X #... .Z s g A 9 n n q p 8 e g < > : , / ; & * * $ $ % $ $ # @ . ", "+ + + + . # # % ; % $ @ $ - = # . . . . + + + . . . $ { ( ( { * $ @ $ $ $ * * - , : * . @ { - $ $ # # . + & ^ ] # + + & ~ = % # % ; ] - # @ $ & % $ ; ) [ ) $ + + + + @ # # @ + @ $ - = & & & ; $ @ # * & # # @ @ @ + + + ; = & # + . # * % $ @ + . + @ + + # % ' / - $ $ # @ + @ $ # + + + . . + + . . + + + + @ @ + . . . . . # $ + # % { ) ! } e 9 9 4 C j r < ! d j 8 w p Z v 3 2 A q @.` Y $.%.F I 2 w l n &.*.n j i 7 a a } < , ^ - { = * * & $ $ % # # . ", "+ + + . . @ % # @ # # @ $ $ # + + . + # @ . . + + + % - { ~ ~ = $ % % $ # # @ - , ! ' + # ; - = ; ; * # $ ( < ] # + @ % = = & ~ / ; ; # # & * * ; = * * - * . . . + . + @ . + @ @ # % % % ; ; * % # $ & $ $ $ @ + + + + + @ @ # + . . # & % % # # @ @ + . + # $ ~ a > ; ; % # @ @ @ + + + + . & ' # . . @ # # + % % + . . . . . + @ @ $ ' _ ) ! } 2 4 d z l S G 2 _ o F B C z C 0 k 5 d l L =.M .J N I 0 q P -.;.>.n S i e 7 b [ [ : ) ) _ { - - * $ $ $ $ $ . ", "+ + + + . + # # # # + + @ + . @ # + + @ + + . + # * { _ / _ _ % @ # # @ # # $ ' , > ' @ # & - - { ~ ] - - , { & # @ # & ; = * ^ , * @ @ ; , - - ] - @ + # + . . . + + + @ . @ % $ # % * = & % # % % ; $ @ $ $ @ . . + $ ' $ + # # @ @ % * ; * % * * % @ + * & @ $ ^ / & % # @ + + . . + + @ + ( ! % + # % @ @ + % $ + . . + . . + + @ % { _ > : a 6 6 8 f V p I z } 0 ,.h x d w C s t s I D $.'.).!.K ,.K ~.-.{.].W p p o 4 6 } > _ > < ) _ - - - % $ $ % $ @ . ", "+ + . . + + + + # @ + . . # @ & ; # . . . . . + & ' ) [ ! < ~ + @ + @ $ & % % ] _ ( = @ @ & - ; = ~ ] ] / & @ @ @ $ $ * ~ = * ( , % @ $ * ' & : 3 / # + # @ + + + . + + . . @ % $ $ % ; { ; $ # & & ~ = # % % % $ @ = ! ! $ @ # # @ # ^ / * ; & * = * # $ - % + . + @ @ . . + + + + @ # ; ' * { - $ & ; ; % # # $ # @ . . . . . + + # $ { ! 7 b 7 7 | i q n C p p 6 t D ,.H B B x u h S x @.^.,.J J .O )./.(._./.D q v u | k g ) , ) - - = & ; * $ # & % + + . ", "@ . . . . + # $ $ $ # + + # % * = $ + . . . @ ; ~ ] ( ! [ - # @ # + + = = # # $ { ^ = @ # % - ; = ~ , , { @ + @ # $ $ % - - & { ] ~ - & = { * ^ : ^ % # $ # @ @ @ . + @ + + @ # * ; * - ' - * * ] - ' - % * * * & $ ! A ^ @ # # # % $ * * % - = * $ % @ + @ + . + @ . + + + @ # % # @ $ ' / * $ @ @ & & & = { = % # # . . . + + @ @ # $ - 7 | } [ b | s v I p z i g c F :.).N l m X ^.h q E L P U <.#.~.[.}.|.1.2.,.y j 0 c 4 } ( ^ ( { = % $ * & & & * * # @ . ", "@ + . + + # * ; & % * % $ * * ; ; # + . . + % - ~ = ; ^ ( # . + % # @ > ) @ . . & ' * # @ $ * & $ = ) _ % + + $ & $ $ & ' ~ % # = , ' $ $ ; * * = * # # # @ + # # + @ @ @ @ # % { ~ ~ - - - - ' ~ = ; * = = = * $ $ e k - $ = % # % $ + + # ; ^ ( & # @ + + . @ $ # + # # @ @ % $ # $ $ ~ - @ + + @ % & $ - ~ ^ * $ $ + + . . + @ # $ & = ! 6 } | t i B j S p r i 3 5 V X ` f l q T V f Q I J .P 3.{.4.5.6.7.8.9.K x y s s A } ^ ' ' ~ & $ * * * $ & % % & $ . ", "# + + + + # - ' % @ & * & = - { * % $ + + # $ $ & $ $ ~ ^ # . + & % $ ) / + . . % ] - $ + @ # # + + & = @ . + # % % ; ~ / ] * $ - ; & # % % $ * & # # # + + @ * $ + @ @ # @ # = ~ ( ( - - { ' ' - - ; * ] ' ; - & * b k % & - $ @ # @ @ $ = ^ - = ; # + @ * ~ * $ @ + # @ @ @ $ # . + + + + + + $ & * = - = ; { % @ + . . . + @ # $ % = ] b 6 g 2 0 l s p f V h d } 8 Q U h N u y T Y v 8 n P !.T ~.0.a.b.c.d.{.e.f.f r f p 2 b ) ] - - * & ; & $ * & # # $ # . ", "# # + + + @ % ; @ . # $ % % $ & * ; - # + % $ + # $ ' : ) = . + $ % % * & . . @ % = { # . + + # + . + = = . . + # % ^ ! 3 , = ; % @ + $ ; % % $ @ + @ # @ $ # - & . + @ @ @ # = ( ' ] { = - ~ ] - - - ; = - - - & % - { # & & @ . . + @ ; ~ ] = % $ # + + * { $ + . + . . . @ # + + . . . . . @ ; - * # % ; * & @ + + . . . + @ # % ~ ] , g 7 3 e 0 G o B I l j 0 | w q X l Q h I Q ^.U G ` f.=.).9.g.h.i.b.j.d.k.f.y f m p t | ! , ^ - - = { ; & & $ # @ $ $ . ", "$ @ + + @ + + + . . + # $ # # # # & ; $ @ # # + + ; b 2 > = . + % ; ; # . + @ % ; = = + + # * { $ . @ < ! $ . . @ ; ( > < ^ * $ % * % # @ @ @ @ . + # % % % % { ] # + @ @ # @ & ( ( - { - = ' - ' ~ - ; * - * # @ @ # # @ + @ . . . + $ % & # # @ @ @ @ + + @ . . . . . . + @ + + + . . . . . # / [ * . . @ & % + + + + . . + + # - / ~ b 4 w } 4 0 o j m p z o z 0 I h q q V u f I h h q +.#.l.e.b.m.n.>.o._.p.2.T P V l l u e : ! > ' ; ; ' = & % & & $ $ # . ", "* @ @ @ @ + . + . + # # # # # @ @ % $ $ @ @ @ + + = a 1 / # . # - ] ^ ' = # $ $ % & & @ % - ~ ] $ . $ } a - . . @ ; , ! > { * @ & * & # + + . . . @ / b ^ * $ ; ' ' & @ @ # @ # * ; ; { { - ^ ^ _ _ ] ] = * @ . . . + @ # . . . . . + # @ + . . . + + # $ + . . . . . . . . # + + + . . @ @ # % ' , # . + + @ + + @ # + . . + + % ~ ' ( 4 r i 9 u v p v r p r w 4 t q f m V h s 9 l X V ` M '.n.q.r.q.i.s.j.t.q.o.u.!.V j V y w 3 ) _ ; & & ; ; & $ % & & $ # . ", "& # @ @ # + + + @ + # & ; ; % @ + # & & % $ + + @ & = { % . + ; _ < ~ ' { @ + @ # & * # * ' - = + + # / _ ; + . @ ~ 3 [ ) & + + # % % @ + + @ % # % ( 6 | = $ * = ] _ = # + + + + @ $ % & & ~ / _ / _ ' * @ + @ @ + @ @ @ % $ . . . @ $ % . . . . . . + + + . . . . . . . . . . . . . . # $ # $ @ + . + # + + + % ; $ + . . . . * { = / s x s 4 h V j s i u B | | e r m s S r t 4 l V Y D T ).=.v.w.x.y.|.z.A.m.A.[.*. .G V G 9 a _ ~ * & ; = * % # $ $ # % & . ", "% # # + + + + # % @ # & { = % @ + @ % & ; % + + # # @ $ @ + @ * { ; $ @ # + . + @ * ' = ; ' ' * @ # % ' ; + . . $ / b a ) # . + + * ; # + . # ; * % $ ^ | / & ; ; ' , ' $ @ # @ @ + + @ @ + $ - ^ ^ ) ' . # = ~ ^ : , * & / % . + + + $ $ . . . . . . . . . . . . . . . . . . . . . + . . . . + + . . + $ ; { * * * $ + . . . + = - & a d s d | r j r B i 4 9 2 1 ! : w 8 o 0 A 5 o h n ` #.B.i.4.C.v.<.j.D.E._.m.s.O .l I m w } / - * & * * & * & % $ # $ $ . ", "@ # $ @ . + + ; ; @ # % & # @ # % $ @ & = ; @ + @ + + @ # $ # @ @ @ + # % # + + . % , ] = , ) { $ * & $ @ @ & ' ' ] > ! ' + + . # ~ ; + . . . @ $ % $ $ ' ' * % * = ; % $ # $ $ $ # + + + + + $ * - ( = @ ; ~ ( < w 3 - ~ { @ . @ * ; $ + . . . . . . . . . . . . . + + + + + + + + . . . @ & ; @ + + # : 9 v 3 % @ . . . . + # = { ] 7 8 c 5 4 9 z 4 1 8 d 8 7 1 1 [ w 0 z w k C 0 f I Z F.8.G.g.H.(.;.I.m.J.K.|.n.J h j F G 5 } ) ^ ; $ % $ % = ; $ $ & = $ . ", "@ + @ + + + @ % $ + @ $ $ + + # ; % + # % * $ + + @ @ % & & $ @ + + @ & % + + + + + , : - ( ~ & $ # @ @ # ; , : ' ~ ) < * . @ @ + & $ . . . @ % - { & @ @ & # $ % % $ $ $ $ @ # % % # + . @ @ @ + # % $ * , [ [ 4 5 _ = ( ] @ + # a d : . . . . . . . . . . . . . . @ @ @ $ % # + . . + # ; ] { & & # = 8 N T l ; + . . . . + % ] { ] a w e | A i C d t s o e 7 6 3 8 v 4 0 t A C p j j n B./.5.}.o.L.o.%.:.3.0.h.=.!.F u i k k 5 } / ' = - ; * % $ % % % = $ . ", "+ + + + # @ + + . . + @ @ + + $ { * @ + # $ $ @ + $ $ % & & $ @ + + + # @ . @ @ @ + $ ; $ & % + + . @ & = ~ ( ] $ % ] ~ $ . @ # + @ * * # $ ; ~ ' ] - $ ; { & $ # @ @ % $ # @ $ & & * # + @ % $ $ @ # @ * 6 8 s x 3 & & ] / ; @ & 3 9 , . . . . . . . . . . . . . + @ # @ % % # + + # = ^ ] ( / - * & , t i Y Q , @ + + . . + % { * { b k k | 2 C i i x o p 2 b ! } s x v B p d d j r G H R ~.x.M.9._.I.w ) F ).%.N.O.,.x 5 w k | ! ! _ ( ' ' * & $ $ $ % & % . ", "+ + @ @ # @ + + . . @ + @ + + = ' $ + + # = * $ @ & ' - % & $ @ . . + @ % & $ @ % @ . + # $ # . . + # % & * - % @ + @ # + . + # + @ * { = & & * ; = ; ; ) _ ; # # + # & % % * ; * & * $ @ & { * % % # + + : i i } ; + @ - ^ & @ & - $ . . . . . . . . + + + @ . + @ @ + + @ % @ + ; _ : : , < > ; $ & > c g i v b $ @ @ . . + & ' - ( a | 2 6 5 9 A 4 o j q A 3 1 a k I S o r k c j m F K <.y.d.P N b.1.< & 8 O M M M ..X w a 3 b } 1 ) ^ ( ~ * * * & # $ & $ . ", "@ + + @ $ @ @ + . + % # @ # & = % . . . @ = - - $ % ~ ' % % * & . . . $ / , { & # + . # ( > ' + $ # + @ # # & & @ + $ % @ + + # & & * { ' $ @ @ . + % { ! - * % $ @ $ ; & ; { = * ; * & @ ; ^ - - ' { # . ; [ ^ + @ + + * % + + + . . . . . . . . . % $ @ @ @ @ # # @ . . + + + . = < b > > ( ; $ # & ~ ( ; ^ 1 / $ % + . . @ ~ _ { _ a A i 5 c 9 d f u h v 5 a 3 a t h z v u A c r x q ` h.=.<., / y W w > 5 n ..+.D X j 6 7 a ! ! _ ^ / ^ ' * & * * % & * % . ", "+ . . + # @ + . . + # # @ # % $ + . . . # * - ' ; $ & % # # & $ . + + & ] , } [ % . # ( ! | } * ; # . # & = ; % # $ - ; $ @ % ; - ; $ # ; % + # $ - , } ! * $ $ # # $ % * = & $ * ~ = $ $ * = * ) 5 a # . + % % . . + @ & $ @ + + @ . . . . . . . % - $ % - ; * * $ + . @ * & @ + # ' , : b > & # # $ % $ # $ * % # $ + . . $ , , ] 3 6 6 e k i s 9 s p G u } b | k i z s B B d z y x p Q {.#.r ' . # w S } g S +.!.O h z k c g : < ] ~ ! , ( = & ; = % * * & . ", ". + @ $ $ # + + + @ # @ + + + + . . . . $ ; & % % # $ % @ # @ + . + @ % { ] < b & . & ( ] ( ) ' $ . + $ * ~ { ' = ' - * * ; & * ; $ + # ; & $ * ~ } p A < * $ % $ $ % % = & $ # % & $ % % $ $ $ ' < ] + . . . . . . + . + & % + + @ . . . . . . @ = * # * ) _ - ; % $ $ * | s ; # $ { ] ' ( ( * $ # $ @ + # & @ + @ @ + . + & } > > e 5 2 e 2 9 5 5 | 0 r t 7 | 4 s i 9 s o k c f Q f l W (.P g # . . 2 n } b V +.+.&.` v p m 4 ! > , ] ^ , ( ' ; * & $ & % & . ", "+ + # & * @ . . @ $ $ @ + @ @ . . . . + $ % $ # @ # & & # + @ + . % ~ - ; * ] _ * $ # # * { ^ - @ . $ = = - ' : , ! > * = ] ~ % @ # $ * ; % * { ' : a > ' * % * $ # $ % % & $ # % % $ % % % $ # $ & # . . & * . . + # @ # ' ; + . . . . . . . + # $ # # - ) : { & * - } g 0 &.8 % * = = $ # # & @ + + + # { ^ $ + @ % # + + = ! > : 6 9 d A 6 6 2 5 c i d k 5 2 5 C 9 w v f d 9 j I l q R ;.F : @ . # c 8 < d @.O...L @.x u u c 3 : ) ( _ : ( ( - % & - & % & . ", "@ # % * & + . + @ $ $ # # & # + + . . + # # $ $ # % = % @ + @ $ @ - a 7 ( - - { { ; @ # & = - ; @ + & ' = & ' / ( ) ( ; - ' { # @ $ % % % # @ $ - ] ] { & * & ; $ # # # @ $ # # % # # $ % & # # $ + . . . 6 t + . . # $ ~ _ # . . . . . . . . @ @ $ = ' ) > / = % & , m x e 8 9 * + @ # $ # @ @ @ . . . @ ^ < > = ~ ] $ + @ = , < ( 2 8 c 5 e | 6 k i 8 8 e k A 0 t A 4 C I m i 5 C v f h.#.I , . . ; 4 8 b H P.=.$.'.F.F z d 1 ! a ! _ ) ) ( ~ - & & ~ - % % . ", "# & & & & + + + + # $ # * ~ * % # . + # % # % $ $ $ @ + + @ @ # @ ; _ ] = = ; * * * $ $ * = { ; @ + $ & % % ] / ) , ~ { & # # $ % & % @ @ + + # & - ^ ] % @ . # ; % & # # $ # $ & # % ; % ; % @ @ . . . + = ~ @ . + # & , > + . . . # # + . + @ # * ' ! 6 [ ^ - / 1 l x 3 ~ ; ; # + @ # @ # $ # # # @ . . @ ; ] ' ~ - @ @ % ' > ) ] a A e k 7 g w k o v t 1 e | e g e i 5 o x t w i m K 9.N.K w > , } | 7 ] } Z 3.s.B.9.Y 0 i w 6 b > ) < ( = - * ; ; { - & $ . ", "$ & % % # @ . . . + + # - { & # @ . @ $ % $ $ # # @ . + @ + + $ # @ # @ # & $ @ # $ & $ & ; ; $ + + + + + # ~ _ ) } : ; $ + @ # & = % @ + . + # & % ' { $ + # * ] - & # @ + + @ # # % * & $ # @ + . . . . . . + + + # % ; % + . . * g < . . + + % - ~ < 7 } ) > B H J w * % @ + # % * & & % # $ % $ $ # + . . + + @ # + @ * ( ^ ~ ' [ 6 g A a 2 8 k s v i 2 c 2 < 7 | v r p l C i t h J 9.B.M J N.n S v S 1 ] s W O.!.T n C e 7 a ) ( _ / - ; ; * = { ^ ; $ & . ", "& $ $ @ + + . . . + . + & % @ + + . + & ; $ # @ $ @ + @ % @ . = ^ ; @ % ; ; & + + # ; & # $ # + . + + . . + $ ^ < b _ ; # # # # @ @ + . . + # $ & * - * + + % , 1 ( # + + . . + # $ % $ @ . + + . . . . . . # { % $ % $ $ @ . . $ p n 1 . . . @ { ~ ; / : < g k W &.U 6 & # # @ $ = { { - = & % & % $ & # + + + . . + + + & ' = - ( b 7 g 1 [ 1 6 1 4 4 k 4 c 6 a e e p x S r p 4 0 U $.N.n.M V 9.%.n W h.'.f B z C q h h s g 1 3 : - & = - { = ; ; ; ] & # $ . ", "; & # . . . + + . + @ + % * + + . . + % $ # @ + + + + # $ @ + - > , : [ b b ( @ @ # * & + + . . . . . . . . % , , , % # $ $ $ $ + . . . + @ # % @ # % # + + # ( ! - # . . . @ # * * $ + . . . . . . . . . @ * ( ; & & $ + @ . . , O j ; . . + % / _ { / ! 3 8 z I E t = # $ $ % ; ' ] / ~ ~ ^ , ^ - ' = ; # # # $ + + + + * ^ ' ' < a b a < [ 1 2 e 0 8 3 A 4 | a e 5 z G r z d w u ,.:.P.#.#.&.&...o v +. .u r 9 _ u y u t 6 A A < - ; ( , ] ; - = ' { $ $ # . ", "- - $ + + + # % + + + . + # $ $ . . + + + . + + + + @ ; = * = { ^ 3 w 4 9 0 ! # + @ @ % $ . . . . . . . . & ! A ) = # % , = # $ % @ . + @ # # @ + + . + # # # # $ $ $ + + . + # ; * @ + . . . @ $ # . + * ' = * - % @ @ # + . % 6 v / . . + @ * ^ ^ > c r 0 B p o ( + + + % & = ~ ( / ) < [ < } : , ( = $ $ & ; ; % # @ * ^ ^ ] ^ < } 7 a , [ 5 9 t j 4 6 5 d 9 g 1 c B h B 4 8 i o ` +.F.$.{.v.I.4.I } 1 e 4 C r 4 0 I j u o c [ ( ^ < [ , / ] { ' ( - % # $ . ", "- ] $ . . . # # . . . . . . & { % . . + + . . + + @ % = ' ( { ; - 7 c A A 5 : # + + + # ; @ . . . . . . { 7 t 8 b % + . * & # # & # . + & & @ @ $ @ . @ * & # + . . # % . . # * & # + . + # $ ; & @ . + $ ; * # % % & ; $ + . ; c k + . . # & ~ ( , | S S u v g ; . . @ @ # % = ~ ( _ _ : [ } : , ( { * $ % - - = ; * & { _ ^ ^ ' , } 1 a / ( | k i d 6 5 0 s 6 2 c B B s A b A c 0 I W K L G.c.Q.R.n.p + ~ 9 p S y u v v l m 4 a : , ! ) ^ ( _ { ' - { % # # . ", "# & $ . . . . . . . . . . . ; ^ ~ $ . + @ # @ @ @ $ % * - / { & % { ! b } [ ~ # @ + + $ & @ . . . . . ~ s y N q c ~ + . @ # @ $ % $ # $ & $ @ $ - # . + # % @ . . . $ * # . # % @ + + + @ # $ $ @ . . . + $ $ # = ^ ] ; @ . $ ' _ _ # + + % - ] ( : j :.Y 0 i ) . + % $ $ @ @ = ' ^ ( ! b } ( ' { * % % % ; { ; * = ; & { ( ( = ~ ! 3 > ( , ! a A s A 7 w d t 2 6 5 4 c u w c 0 t B K @.q k ` S.w.A.T.~.! ] 9 S p J q s S j I B 6 < [ } ] ~ ^ ~ = - - - $ # @ . ", ". $ = # . . . . . . . . . @ = < | 1 & $ ; - & @ # % ; - - ' { $ $ ; ( : ^ ' = = # . + & % . . . . . % B @.n f E z _ @ + @ # @ $ $ * - ; @ + @ & - # . + $ $ + . . . ; = % + @ . . + + + + . . + # + . . + & * $ { ] ~ @ + ; / [ - * # + # * - - ^ b O |.l.8 , ; @ # = - = { ] ' ^ ( / g 1 1 < ^ ~ ' * % % ; - & % % # % = ( - * ^ [ [ / ~ / [ 1 A o 3 7 i u c c A 8 w 4 5 | p m 8 B Q Y :.y ,.U.V.W.X.Y.&.a 3 k e v S C v x j 9 < > ! / ( ~ ~ = * ' - ; # @ # . ", "+ % { $ # + . . . . + . . = ) s f 0 1 , ; - - $ $ % = ] ' - & @ @ % { ] ' { ] * @ + @ $ + . . . . # : h ,.y f E C ) # + @ # # # & & & # . @ % ^ ] + . + % = & + . @ $ & $ % { $ + % & # + @ @ $ / ; . . + # ; ; = ; # . % < > ( % @ + . @ & ; - ] c J %.s - . + @ * ~ / : a ! > < a 6 5 c A | } : ( { * * & & & $ # @ $ = ' ; - ] ) : ^ ~ / : a | 5 e | o q 8 t z 8 t i a > e z t r X ..R %.@.Z.w.`.E.R.#.i 2 p 0 g z z z l z k g 1 } , / ( ~ = - { - ; $ # @ . ", "+ % ; ~ - @ . . . . . . + ( 8 S S C C 3 = - { % % % = ^ ; $ # # + + ; ] ^ ~ { @ . + # # . . . . # ] 9 ,.P.*.Z G o ! % # ; % % & % @ + . + # ( 2 ) . . @ & { ' & + + @ % # ; , _ * * % @ % = ; { ) * + + $ * { { * & + . ; b / ; # . . . . + & / , i D s $ . . + ; = ( < b } } > } 9 t g A 1 1 2 6 / ' ; * ; & $ % @ @ % = - * - ] , > ( ] , < 3 2 9 8 w 0 s c 8 i 8 0 0 3 _ : 5 i y U Z :.%.N. +`..+++@+$.6 | n E 2 S G v z t 2 w e 1 ! _ ( / > > ^ = - & # # . ", ". $ = , = @ . . + + . . # : C G v B f t ] % * $ % ; ~ ) ; + @ % + . & _ ! ! % . . + % % + . . . * [ r .F.*.p 0 s ( $ # ; ; % & $ + . + % { e 9 > . . # = ' { { $ @ % ' = & ( / ~ % @ % ( ^ - = - # . + @ * ' ( ~ % . . ' > ' ; $ . . . . . ] A g i u _ . + @ - ~ ' ( > ) _ > ^ 1 c w A 1 k 9 | A e < - % & & % % & % ; ' ~ & { / ! < ( ] : b 1 | A e 8 p c 2 8 c w d B 9 3 ) e z Y M Q %.).{.#+.+++$+%+{./ ] k g ] t y x z i b 6 w c b < [ < ) _ ^ - = * # @ . ", "+ @ ; _ ; + . . . . + + # > z l B z f u < # @ + # - _ : = @ + @ + . + { _ ] # + @ - = & & + . + ( A j V z a = _ , # @ + $ ] * + . + . . = ) A i ] . . + % ' ( ^ $ @ * , - @ $ & # @ $ * ) < { * - ; # @ % ^ ! } a [ * @ < 3 * % # . . . . - c q N j > @ + + % { ' { ] / ] ^ ~ _ : 7 A g 1 0 C 2 6 d d : { % % = - ; * ; - - * _ ! [ , / ( [ < < b g 1 e 9 4 5 e A i 0 t k | > 7 o N W F X $.1.r.&+*+=+q.u.2 [ t 5 | 0 j p o A a a 6 1 } [ a > _ ( ( ' = * $ # . ", "$ % * & # + + + . . . . ; 3 8 r p S m m > + + + @ = , < ^ @ + . + @ # * ; & # # & ] { * * $ . . ' 5 w : & . . - 1 = % # # = $ + + @ * ~ ^ } 7 } ; @ + + @ * ] ' @ + @ % # + . + @ # _ 5 a ~ @ & _ _ ' ^ / ) } 1 i z ^ % e e & . . . . + < p @.T P X 3 . . $ = ~ ' ^ ) ) / ] ^ ) ! / _ ) > 3 5 ) > b 6 b ! ^ ~ = ' { # @ % = ^ ! < < > ^ ] 1 < 6 | 1 e 2 e i 2 e g w 4 6 k 1 a k v D M W R (.-+;+>+,+E.S.0.G w C n x s d y l u 0 w 2 5 5 1 < 3 b > / { - ; % $ . ", "{ ^ ; . + + + . . . . . ~ 1 g k i z z p ( # + + $ { _ b _ # + @ # - ] ' = % + @ * ; * & ; ; & + # ~ = . . . + / d 5 3 / & $ + + + & a 1 : ! ] * & $ # + + @ % @ . . + # # # + $ * / t 0 b & . # ] - $ ; % % ' ! o z - = A > % . . . @ g Y U L U y l 7 $ $ & = ' ' : a a : ~ / : : / < : _ / _ ~ ^ [ ) ( , > ) - & # + $ * & = _ ! } _ ~ _ < : | A k | k 5 8 A | | t A g 1 b 8 y i m W P &.n.v.'+)+!+S.t.v.I ; _ c k v B l l l i A A i k 6 a a [ < ) ^ - * % # . ", "- ^ % + + + + . . . . + ; > : [ | 7 5 a - $ @ + ; / < < ^ % $ * - ] / ( - # . + = ' # # { ' ; @ + + . . . . # 2 f o 9 > { ; # @ . ~ e a _ ~ # # * # @ + + . . . . . + & $ % & $ * b r v A b * * ; $ . . @ $ @ * ' ' $ & ; & - # . . ~ s J @.y F 5 ^ / > ) = & & ; ] ! } : ) > } : , [ 1 7 3 | A 2 6 [ ( ] / , * $ . + @ # @ $ ' < > _ ] ~ , [ 1 | g 3 g e 4 2 b b 1 6 e } ! c x 9 d I H P =.M.~+w.m.M._.{+B = & ; 7 Z q v v o 2 8 t o 7 e c 3 } < < , % % % $ . ", "$ $ @ + + + + + + + + + % ~ _ , b a 5 3 * % & = ^ > [ > * @ & ; - ] = ~ ~ # @ @ ] [ & # - { $ + . . . . . . ~ Y X 2 1 _ * % # @ + ] > ~ & $ # # @ + + # @ . . . . + # * % # & % ; } t j h f g ( = @ . + ; > / ( ~ - ' ~ $ $ - # . + } ` @.I k ' + @ { / ' ; @ @ & - / : [ a ) > 3 2 8 A d j t v B c a : / { ~ ; @ @ # $ $ @ $ { ^ ] / ] ' [ b 3 g e 2 g c 0 w > [ 3 7 g b b d u i p I W 3.j.z.A.H.n.#.$.` 9 [ , ^ 6 u S y V o e d d d i k 1 [ 2 a / ' * % & % . ", "$ # . + + . + @ # $ @ @ @ @ = > ! ] ) , ~ = - ^ _ ~ / ^ @ . @ = ; = & & = & $ # ; ! ' + $ % + . . . . . + . 6 =.P.k & $ # $ % & $ - ; # @ - & @ + @ @ # + . . . + % * ^ - # $ & * ' [ t q j e / = + . . ~ 6 A 6 z | 6 1 * % $ + + # } l g - $ . . . . + @ ; % @ $ ; ) [ 7 k A 2 9 0 x 0 o F 4 < ~ _ > : / ; - # @ % & ] _ ' < < % % - { ' : [ | A 6 g 6 A w b < < 7 [ ! : 3 8 k w p h D ~.2.c.]+&+$+5.u.f.m ! : 5 s B f X ,.G 0 p z 0 m 2 1 A 6 3 , ~ = & % $ . ", "& # . + . . + # % $ @ # $ # $ ~ ' % & ' ( ' = - { - & & @ . @ * ; $ @ # # # @ + % ~ * . . . . . . . . . # ' i ~.0.x . . + ] , { * # $ + . / i ] . # * @ . + @ @ & ' ~ : } { @ * - ; ] 4 0 < ' { % . . + ] [ b 2 o w [ ' @ @ + . . $ & % @ . . . . ; 7 b ) , ( { = { : k o j l u 4 } ) ~ ] ~ & + + ; & * { & % # % * = ^ ' * & & . . . @ = , ! e 8 6 3 6 A 7 < < } b [ _ , t i 5 t p E Y #.u.|.^+/+(+Q.A._+B.V _ 3 t u G V n h t s m r 9 w e 6 6 [ _ ^ ] { $ @ . ", "* @ . . . + + + $ @ @ $ & & & # # @ # ; - & % * ; $ @ % $ + # $ = ; ; # . + $ & & # . . . . . . . . . + = 7 s F !.0 . + - a ( ; $ @ @ + . - .V * & } } ^ * = / / _ < < > ] * ; ; * ; ' ' # $ * + . . $ ) 7 7 | 3 ) = . . . + . . + . . . . @ $ ( A 0 2 a [ [ > , [ 6 B V d k 1 ; . . . # # & ] [ A ( { ^ { % % $ @ + + . . . . . . . . & ' b 4 t g ! < 1 ! > < 1 A 3 : 3 S I o C G q K F.i.4.*+:+<+)+[+}+T._+n 6 c S l F E I C v v o 5 6 6 | k b / _ ( ' # + . ", "$ @ + + . + + . . @ # % = ^ & # @ @ $ # # # @ # $ # # # @ $ & # & * * @ $ * ' - # + + . + . + . . . + { [ k 5 g 7 [ * % 1 5 = . @ @ + @ @ % 5 l ~ ; c o j b ( < ) < [ > ~ - , 6 / % ; = & @ % ~ ; @ + # ( 5 c k 9 _ & + . . . . @ # + . + % { _ d o e 3 > > g 7 3 9 u s o | ~ $ . . + = ^ ^ < k t w e 9 C 5 ] % + + + + . . . . . . + + @ & } i e 1 b ! [ [ < : b 3 3 6 s l n p A S q X @.9.j.C.|+1+(+2+[+ +*+M.G z m V f Z F u F x u 9 | | k c | _ , { & @ # . ", "+ + @ # % + . . + @ # $ & ; # # # @ @ # @ @ + + $ & # + . % & $ * = # + ; ^ ; & . . + + + . . . . . & e I C : { { ] & $ ( ' @ . . @ % { - # @ ; # $ e 0 8 a ) ! b 3 < : _ a v S [ & ( g = * ^ : ( ; @ + ) c i o 2 , % . . . . + # # + @ & 1 1 A f r 5 e [ b w 2 8 x W 9 & + . . . @ { a 2 e C p u v o G W X ! + . . + + + . $ { , ^ = @ + @ - [ | 1 e a < > ! 7 3 1 g o r B B 4 c z x J =.d.a.`.|+3+4+:+5+`.E._.G b C ` W ,.V j f m r 9 c c 4 | } _ / ; # + @ . ", ". . + # % @ . . + @ % & $ $ $ # # # # # + + @ @ $ $ # @ . + = { ] { # @ & ; # @ . + @ + . . . . . + ^ t Q l ' % = % . + # % + . + @ & > ( . . @ % + [ 0 4 b > } 2 < ] / _ i I g ( $ * ' $ - > > : { $ + ' b 1 3 ' % + . . . . @ + . + % / 7 5 9 B 8 e 8 A C Q B m E ` 3 . . . . $ { 7 j U U %.f f S u ^.O z ' . . . + $ ~ , 3 r l 6 _ ^ ~ * % < 2 c 2 [ ) ( ) 1 6 b 3 z S z u r l r h +.{+8.O [.>+/+:+4+6+7+8+k.I ! k x V Q y p j j x u 0 A g [ : > ~ = @ @ # . ", ". + + + + @ @ + . @ % * * = * * % % # # @ $ # # # @ + + # * ' , ~ $ @ + & % + + . . + + + . . . . % 2 p I t ; & ~ % . @ $ + + . @ % { ! ' + + * - . ] 8 s 7 ) 7 w ) { ; ~ 5 > * & # . . @ - > ! > * @ . + * * & @ . . . . . . + + . + * : 2 c 5 t 9 9 o i d x y N m 6 . . . . + ( 2 n #.8.].s.Z x h X :.y ! + . . . . $ < 0 E l j t c j F x 9 e A 1 6 } > / _ a 7 g 2 0 u p I m S l l %.o.l.8 +.9+0+4+a+,+C.I.@.H d | p E n X f X Z v C d k 7 < a [ { % @ # $ . ", "$ % @ . . # % # + + # & - ^ ( ( _ ( = * & ; * # @ . . # * ; $ $ # # + + @ @ # @ + + + + + + . + . ] s l 8 ) * & ; $ @ @ @ . . + % ; / : ; = - ] _ ; = 2 A b 7 c k ] * & & & @ . + $ # @ # * _ / * . . . . . . . . . . . . . . @ # @ @ { 1 8 8 2 A k 5 2 3 ] = a < - + . . . + ; g E a.R.Y.R.$.,.D f.F.L f < & . . . @ * ! y W f 0 w I :.R +.n.V c g b ) : : _ b 1 2 g k i d m V G f F $.8.r A O.b+/+c+b+!+C.e.z y B 1 s F K V E D ^.f o B s 5 3 ! ^ & # @ # # . ", "~ ' % + . # $ % # @ + % ' ] - ^ / ^ ' & & * ; $ @ + . @ # + . . . $ ; & + @ * * + @ + + . . . + # a s c a _ _ & + @ $ % @ + @ % ' : a : - ) ! _ g g ] _ : < b 4 ! * ; $ % ; @ + @ & * = = = / ; + . . . . . . . . . . . + # { ' * $ $ ~ g w g 3 | 8 i _ $ @ # ; # . . . . . ; 8 f.{+E.++q.A.R Q P #.#.D G z _ . . . & w ,.J ^.r < 5 %.<.!.+.F.h | : / ( > ) : a 1 } g | 5 9 H P h x x :.P 8 p ~.K.3+0+'+++A...> g 5 a l Y E h E N I x 4 l o g : ~ & # @ # $ @ . ", "& = & + . + @ % $ # $ ; ( = @ & $ % * * $ % ; # + @ # + + . . @ + # = - % @ ; ; + + @ . . + + % , i o 2 ) ] _ { # # * { = @ % , 5 5 A [ ' < g ! 7 g > ] ~ { ' ~ = ; = & & = # + @ * ; / 1 b , & . . . . . . . . . . @ & % & ' ~ ; % * ) 5 4 c w 0 u c = @ ] ^ & @ . . + = e <.Y.w.J.E.%+x.R !.+.!.k.P Q ` X 1 . . + , G L U ` t , e G v X n 2 b 7 [ ) : ! ! b 7 3 7 a 6 5 z P P H r j f C G n !.p.}+1+}+7+H.f.d g : 3 r m V J D N Q 0 C j i 2 b ~ & # # # # # . ", "+ # % # . + + # @ $ { ] ~ ; # $ % $ # $ + # * $ + + $ = % @ $ # @ + $ ~ ] $ % $ + + + . . + + % 9 I C ! - ] / - # + ; 5 1 = ; ! A e 5 | ^ ! A a / a b 6 > , ] * ; ' = % $ # . . $ = & } 9 k 5 : $ . . . . . + + * % ' ^ * & ; ^ ^ ^ [ 9 r z C j N ,.4 - ; _ { + . / B J N.(.c..+d+++q.w.-+ .*.'.(.{+P V O o ' + @ > d f ^.x s | 5 C t [ t 6 b 1 3 ! / [ a > [ a 3 6 3 4 i v H ,.E x G u G L <.e.A.Q.e+b+f+K.[.U h A 6 S T H Y J K h j C S i 2 < ~ & $ % @ # $ . ", "@ + % & @ . @ # @ % ' ~ = % & ~ { $ # @ + + $ @ @ + # - * @ % @ + + $ * / ] = ; # + + + . + . ; 5 j z / $ = & # # + + [ 3 ~ & & : g g 3 / ^ : > ; ~ ! 6 ! ( ~ ^ { - & + + . . # ' - # ~ | i o 6 * . . . . . . ; 7 < ( ~ / ( ] } 2 b e 4 0 C x ` .W 3 & % @ + . ' Y -+C.Z.v.|.Y.`.}.G.1.I.N.G.g.1.'.K x c ( & + % | S j y d 2 8 G s g b ! : w d 3 _ ~ , ! ! a 2 | : 3 t w C Z F p o N F W :.$.d.E.>+g+>+&+h+-.G X B 0 +.k.).+.^.V f G m G w w b = # @ # # # # . ", "$ + @ & * $ @ @ + @ % & & $ ; ( { & ' * @ % ; & @ . . + + @ $ @ + @ @ % ~ ) : , $ . + + + + + = / < : ~ @ $ @ + % # . * [ ' + $ , 2 7 ^ ' { = { % + + ' _ ; - ( ] % @ + . . + $ ^ 3 ] $ [ A A 6 ~ . . . . . . $ ] ! < 7 w A 9 k a e t t w B ,.*.%.t % + . . & S h.L.z.A.g.L.|.H.t.R.;.-.p.H.b.b.&.f 2 ] ; & ; ~ ^ > c C o 8 k s C } g w g 1 C v 7 , ( / ) ! a e 6 , a 5 8 v K n C 4 m Z +.O.F.G.~+<+3+>+&+X.9.u Q y s W $.&.!.M X q u s | g g / $ # # @ # # @ . ", "$ @ + * ] * @ . . + @ # % & = ' ~ ^ > = # * = * # + + + + + @ # + + + % { > } > # . @ + . + @ & * ' { = ' [ 6 ^ @ @ . $ / = & < d 9 b ( - ~ ~ ; $ . . ( l i , { * $ # # + . @ ; ! 3 ) & & < e c g ( @ . . . . * ' / < 2 p u S 8 w 8 5 C x W f.:.s & . + . ( Y 7.J.T.p.q.W.c.H.v.i+H.a._.~+U.*.E k b ' ] 7 } , [ [ < b b / ' ] g B 0 w 8 t 0 0 t | ) ^ ^ > [ } 7 a / } 4 m ` M Y r o v X ,.U :.8.E.j+g+j+k+7+H.P :.*.q n O.).:.l.J V S 8 9 | > ; # # # # @ # # . ", "% @ + $ = * @ + + + @ & & - ' = % * - ; $ $ % $ # @ + + + + + @ # $ @ # - / > , & . + . . . + @ @ ; { ; _ 2 z 7 $ $ # # - * - ! e c 4 A : : < ; % # + ^ K @.C e ] % # @ + + # _ a > _ ( % ' 7 | w e - . + . . ~ > / : | z n S G U n f H &.4.z.^.* . . . { Q H.X.E.Z. +E.%+*+D.U.z._.5.X.J.o.p e 2 ) ' _ g C d e a b ! / @ . & 1 p G v l B o 0 s 2 , ^ , ! : < a / _ b s q F U y p j m n P .:.>._.l+g+m+m+r.E.s.&.L Q D L Y X ^.Q f C t i 8 ~ @ @ @ # @ + # $ . ", "& $ @ + # & $ @ $ # % ; = = ' ; + + & - ; $ $ # # + . + @ + @ + @ # $ $ % - ] ^ ; + . . . . . . . - , ' ' , g ^ = = & @ # & % - ~ 7 s t 3 / ; * = * ; ; ! g e n I / % + + @ ; & * _ [ a { & - < | < * # @ + + @ ; ~ b t r W e.L.M.x.L.[.n+ +I.A . . . . 3 %.b.d+f+r.Q.r.Z.5.H.6.}.-+j.-.q b / | S s a > 2 V y k g : > } - . = 2 r Q W f d C B l o b / / < , b ! ( ) a d C r S i i C S +.(.{.:.*.1.}+o+m+p+&+7+z.P T D ..<.O ^.` K Q C c d e ; @ @ @ @ @ + $ $ . ", "* & @ + @ % % $ $ # & { ^ ^ / * @ % % & & @ @ # @ . . @ @ # @ . . . # - { & # + + . . + + . . . # ( < { - { ( ( [ ^ @ + @ & = ; - b t A : ; # & ^ { ' ' ; # % ! c ^ @ . + @ $ # # , 2 2 , = * - ~ { * # + . . . # ~ 1 s x T x.6.5.q.8+M.i.Z } @ . . . { B O.-+Y.A.6.W.~+Q.H.[._.U.j.).k @ @ - < 6 7 > ( z ^.l | 6 / ( 8 r % % k n J ^.x G X H n m 4 / ] ^ _ [ : , > g e 4 f y 9 t d N !.>.n.;.8.m.p+<+q+j+]+7+p.:.L R l...P W U Q G l B A { $ @ @ @ @ # @ @ @ . ", "; % @ + @ % & $ # $ & ] ~ ' { & $ # + . + + # & @ + @ $ # @ + + . . @ ~ / ; @ + . . . # ' _ _ @ & ~ * # % - ( ) ' ; . . + $ = ' ] 3 2 ) { $ @ $ * = = & @ + . . & > ' . . + . . + , A A [ ( ' # @ - $ + . . . . & / } 4 j N -.L.X l u C 3 $ . . . . . < V N.i+{.#.n.G.[._.{.f.*.i.` t ) { = ' ( _ ) ^ _ s f 4 , ( / / G ,.$ @ 4 :. .N q ,.).>.&.,.d ! ( : ) ) ] ~ > | 4 z Q N o p u F J %.!.s./.}.$+e+b+e+d+r.b.f.*.%.$.+.X H D G h I l [ $ @ @ @ @ @ # # # @ . ", "% # # @ # * ; $ # & = ~ ] * + + + + . . . @ * - $ @ $ # @ + . . . . + % = % @ @ . . + $ > 1 b $ # # + # ' > g 3 & . + ] 6 b ] ] = - ^ @ + . + + $ ; = & + + + * _ 7 8 ] . . . . . $ b 8 e 2 / $ $ $ @ . . . . + # { e B p k o s ; . . # & % $ # + . $ 4 +.2.g.=.P.i.i.Y u z Z V o g b 7 : / ( ( ] < A | a g | ) ' _ < l Z ^ @ c @.M D L ).).<.u.!.l a / ^ _ / ' [ e 4 0 r p t s o s V T ).f.i.;.=.U.m+h+r+d+`.n+M I h &.:.F q Q n Q q i ~ $ $ @ @ + + @ @ # # . ", "% $ $ $ = ' = % # & ] ^ ] & . . . . . . . # ' ( - $ $ # . . . . . . + # ; * $ # . + + @ ^ 3 / @ + + + % , b A 1 ; . ~ C Q 9 , : ^ = & + . . . + * ' ~ ^ + . @ ^ 3 4 S } + . . . . . , 4 9 m 2 & $ # @ . . + + @ $ = 2 B v 1 ; # . + % ' 5 B 1 ( - @ % w f.N.B.B.{.=.V A i ` J Z 0 g 6 5 1 3 6 1 6 9 C 0 i t k < % # < q f ; $ m L l.T ^.F.M T 9.l.q [ ] ( / ] ) g | e r f z s k c f M T +.l.h.4.v.V.&+)+h+d+_.9.+.r s N ^.x x H T H f g & $ % @ @ + @ + @ # @ . ", "% $ % * { ^ - * - ] > ( - @ . . . . . . . + $ ' ~ ; ; ; * * $ . + + % ; { ] - ; # + @ - b t t b * + . - 8 5 g k 2 k o h S 1 - } > ; $ + + + + % ' ^ ) ! ^ # + ~ 6 x E a + . . . . . - 9 V M ` p 1 { + . . + + + @ = ! 7 6 } * @ @ ; ) g H F u c ) $ = B '.#.f.P. .t { [ T h.l.O .P F V f x N r u r r q Q l 2 - = , E M d $ % 9 ` ..L T J :. .W +.y a ( ) , ' a 6 7 A 0 o z z i C W h.$.l.$.2.m.S.#+}+<+6+@+{+d.~.G u y ^.` I ` W Z S ! $ # $ $ @ + @ + + + @ . ", "$ % ' ~ ] ^ { { [ 3 : ~ % . . . . . . . . . # { { ; ~ _ > _ { # . # ' _ ^ , ~ ~ & + @ { g l 8 i ! + . * 5 w a 1 p E v p 4 _ % ^ { = % + + * * = ' { ! 3 | ' . - 2 f Z g . . . . . . ) q Z +...H f < . . . . + . + ; : ! > / # . + { ! 5 W ^.Q n s ; = m F.M L +.B & ' F 4.N.9.h.l.R O ,.&.R ).j 5 2 A B u i a ( < m N 8 < # @ ( C n G V W M P @.f.n | = ~ ' { a | e 9 t 4 9 0 C z ,.9.P. .~.].S.R.q.X.Q.j+d+&.$.f.j I D ,.D n E V m w { # # @ @ + + @ @ # # @ . ", "% & ( , ( ' = ' [ } ^ ; @ . . . . . . . . . = ( = * ' _ } ! > ~ $ # = ( ' ~ ' - ; # @ % ~ a ) k d = . # g A a , 8 G 9 7 > = & & $ ] ] + . - ] $ # @ = _ > = . @ ) 6 ! ; # + . . . . 3 V n O W Z F : . . . . . . . * 1 < * + + . + ] k d q Z T O i - > D ).M T T 0 + ) F.a.=.+.K F ` ^.U T :.&.E o i o d 6 7 1 8 2 c 7 < ( # . , t B m F n q q K D f a - - ' _ } 7 | B d B p w S ` +.k.$.@.%.n+v.[._+X.r+)+%+9.=.n.z n <.O Q h N H l / # $ # + @ + + @ # # @ + . ", "* - , ) / ] { { _ ) ' @ . . . . . . . . . + & ' ; * ] , < [ b ) = $ ' ^ * - ] & & $ + + + . . g u _ . + b w b / } 2 _ ' ~ - { ; # { ] # . # # + + % * { : _ 6 / & & @ + + # % @ . . 3 K O <.T ,.X d { @ . . . . . & b a * . . @ * < 2 t v O <.L t ) d J T ,.T P t . & Q %.^.m l V +.<.@. .T T m 7 e o a A Q F r | w 0 l s > < p l v S S p 0 r I Q ` i , ~ ~ 7 A 2 c G x I z e f f.L #.L M $.L.4.k._+~+Q.}+q.N.s+~.y n O O W Q X ` o * # $ $ @ @ + + @ # @ + + . ", "= _ ) / > ! _ ] ( ' # + . . . . . . . . . . = - & - ' { ] ) , ( ; = < ) & = ] { ; * # + . . @ - < - + . ~ 6 > ' 6 A - @ $ { = { @ + $ # + + . $ * ] { = 6 v Q o % . + + + ; ] % . . [ q Z E Y D I v e * . . . . . ' 1 c / . . $ ] 3 1 8 S 9.i+'.l k Z M ).Q K N _ . . k H O H D .).W @.F.!.F d , 3 N h I ` O U 0 0 S f v 8 u v x n I v m t 2 } e s 8 a ' , 3 e s B p I q p B q ..M F.n.P.a.8+/.G.}.7+@+w.j.P.[.J I q !.P D X T H 7 # # $ # # @ @ @ # @ @ @ @ . ", "{ ~ { { : [ ) _ ~ $ . . . . . . . . . . . . # * ; , ( , b [ < / ~ ~ a b ] ~ > _ ~ ) ] + + + - ; & $ + + ; ] ' ^ w 2 = + % { > d _ . . + = ( @ $ ; ' ] ' 5 D %.G - . + @ + ; : ; . + [ t c 7 t h E j o ! @ . . . @ ) k 4 > @ . * ) 3 c s K 8+f+o.^.Z ..T O z 1 , # . . ^ v q X T ).:.Q l F ` i [ = ( G q E G H F.d k j Y S s G N y h l 0 O B ^ % { ! g ! ] a 2 A k o h F.h.O y F ` .R R '.=.s+s+].i+E.i+A.{+M R ).f t F X K Q Q 4 { # # $ # @ @ # @ @ @ + + @ . ", "- % @ # & $ * ; $ @ . . . . . . . . . . . . . @ ' [ ^ < k 2 g [ / - ^ [ 3 1 _ ( < ! ( = % @ # ; * + + @ # # % ^ e _ $ $ - _ 0 0 ^ + + & 3 6 - # % ' ' ' d P.9.i $ @ { * ; / 2 ) . % 3 | : 6 d r v q z 3 % + . . % 3 c c < # . ~ 7 6 s K R U.=+_++.B G q A ) ~ * # @ + @ : k x N j s 8 C y m t $ . ' S n p k C C } e B E j 9 h J ` Q E V W o = # ( ! g 7 [ 6 2 d s 8 M ^+(+t+V g j ..$.3.h.>.~.3.L.Y..+S. +I.<.+.f.Q v x X X X q } # $ # $ $ $ @ @ @ @ @ @ + + . ", "; # + + . . $ # + + . . + . . . . . . . . . . + * ] = ; ) : _ ^ ' { & : k 7 / > } ~ * < ~ @ @ ; * + + @ @ . $ ' < ' . % - b 5 ] @ + ; b o s 6 = * * { b m '.Q = . % ~ { ~ 1 o > . # } b < } 7 c B C > $ # % + . = b 2 | , @ & < 1 i B f.i.5.t+T.l.b # % # + @ + . . + . . @ ; ; % & { 3 4 3 , # @ , n (.).S s e < c o m m p h X W P L Y H u b < 7 1 w 5 a b 6 9 p v ).,+1+#+d . ^ F B.e.#.h.9.8.1.S.w.Z.d+U.l.....f d q F l ` f > % % % $ $ @ # @ # # @ + . + . ", "$ + . + . . @ @ + . . + # $ @ @ @ . . . . . . + # = ; $ # * & & ~ ' * ( ^ ; & * = + $ ~ * + * - & @ + # @ + # = ~ * @ @ { > ; # . # b w z v i _ * % = k r d ( . . = / ] , 2 C _ . * ! > * - _ ! C A , = * ) & @ / 7 5 [ * + % ^ 3 m ,.U &.2.w.D.<.( . . . . . . . . . . . . . . . . . . . . + ; 9 F .a.N.^.l d e d l u i 0 q V ).F.@.` T %.C g k 4 u c 3 7 d p r v K @.m ( + . + 8 u.u.N.8./.U.H.m.*+.+D.7.<.L ~.v d V ^.q x 5 { ; $ & * $ @ $ % # $ # + + + . ", "+ + + + . + + % $ . @ $ % $ & % % + . . . . . . @ = = @ + + + % / > - = + . . . # % & $ + + * * @ @ + $ # + # ; @ # ' ' ; $ # @ + @ ) 3 w B c ] + # = 1 4 ^ + . . ; ' ' ! 4 w = # [ , % % ( a e 4 z s / ( 1 ' & < 7 > $ . . + , z T .K +.>.@.0 ) + . . . . . . . . . . . . . . + ; + . { > 3 C s+Y.I.u.<.S i i 7 3 w 7 3 i q L y.O.&.@.U R X 8 k r X 4 < 6 C r 0 B F p ^ . + . * u k.s.n.v.H.R.}.8+8+q.Y.s+f.#.B.H x Z Q X ` ! & & & & $ # # @ # @ @ # @ @ + . ", ". + + + . . . ; ^ { & - ~ & * = & + + + . . + @ = { ' # . + # = ) : = @ @ + + + . & ( ' + + # @ + . @ % ; = * - { ] k e ] % @ # + @ ~ : _ { { - * { ^ 3 ! $ . . . % ' _ 2 z 7 @ * } ] + & | z B x m s / [ k b = - & @ + . . { C H M T Z O Z ; . . . . . . . . . . ; ! # + + % $ 7 P.f.l M u.d.5.,+&+7+}.k.%.<.V q r c b ) v *.~.R B.;.9.+.P Q k c I I d } 2 o l o 0 j z 3 % . . > <.d.8.8.g.H.i+b.U.8+H.R.1.>.$.l.Q Q Z I j u _ * & % % # @ # @ @ + @ + # @ + . ", ". . . + + . @ = ( _ - - ~ - ' = # + @ + . + @ $ ' ^ ^ & . # { ^ , ^ * + . + & { # $ ] - @ + @ + @ # ; ; - = * { < 3 u 8 { * $ # + @ * * @ . { o Q q C a { & + . + & - ) 2 4 ~ . @ % % . . ; [ k l r , ; b w 7 ; . . + & $ - A @. .` h 6 _ * . . . . . . . . . . . 2 ~.d = & a t :.`.)+W._./.1.~+X.J.G.>...4.p.e.e.:.p : ^ u !.J ).G.i.N.K x d i x G o 0 k o B G I y h f C ] + . 7 9.k.o.g.v.z.q.v.-+s+0.j.e...'.X X L n x 0 [ & ; & $ $ $ # # # # + + @ + + + . ", ". . + + # @ & { ~ ] ; # % & # + + + @ @ + + @ # ' / ^ & @ * ) , , ] $ + . + % ' % + & * % + + + . % = & $ @ + + = < 2 } % $ @ @ @ @ + . . . | e.H.H.i. .g $ . # % % ; > a _ % + @ . . . . + % _ 1 : # $ _ | ] @ . . # A u j r N j 5 / . . . . . . . . . . + + ~ / G F.X A ( g f v.`.6+b+V.6. +Q.m.P.W V ,.s.d.z./.'.m ) / m l. .@.Y E D W S i p x h I o 4 i x N Z X U <.,.b $ . , H n.M._+o.g.I.(.L.8.3.N.X K &.E h X n p 2 ^ = ; $ % & % # @ @ @ . + @ + . . . ", ". . + + # % ~ ~ = * % + + @ + + + . + + + + + # = ' & $ % ~ < ! ) ^ % + @ + + @ @ + + @ $ + # # # # % # . . . + & _ 7 ( % + + + # * # . . ; 4 P.R.V.g.>.v { $ % $ @ [ Z z * @ % # + . . @ ] 5 u p } # $ ^ w / + . . - S ,.y | ( & . . . . . . . . . . % 7 5 I M M C ,.J 5 / e y l.4..+}+$+m+c+6+n+N.~.J N.-+d.i.8.!.Y J f.` J M B 2 s ^.W F C u B i t t k 2 o I ,.K q q s ^ @ + + * 2 !.s+j.I.5.g.s+R s.d.J I J N y I ^.n a ; * # # $ $ $ # @ @ . . + . . + . . ", ". . . + $ ; ( ) = @ + # * & + + + . + + + + @ - ] / * + $ ( < < : ~ % * % + . . + + + + + @ % % # @ @ + . . + * g l S 0 ~ @ + + + $ + . + ( g G '.k.1.K a ( ^ % . . G ).h , ~ % + + + + * L b.A._+Z ) * { ( - + . @ b h 0 > $ . . . . . . . . . . * | G *.>.N.N.V W /.h ~ | p Y '.(.|.J.f+)+u+1+e+I.<.'.M.W.Y.R.].-.1.T.0.=.8.O.O E W ^.K l d f Y x 0 s 9 c t h J M n | - + + + + . . = Q I.s+}.n+4.B._+T.[.R #.n E ,...Z ) # # @ # @ + @ @ . + . . . . . + . . ", ". . + @ ; ] ~ ~ * # * ^ > ( @ . . + . + + # ; _ _ , = + $ ; ) } < { $ ; $ . . . @ # @ + + @ $ & $ # @ . . . # ^ i h 0 e ] @ . . . . . . + & ' : 9 C w { * - ' - # { n U 8 , ] # . + + . A Y.6+t+}+k+P # % # + . + ) A > @ . . . . . + + . . . . $ 9 J f.L R M W q {+N.~ * 4 I K O >.9./.|.Y.m+v+[+L.3.6.*+X.~+A.S.E.E.4.H !.j.d.;.i.W X Q h p I U M v z n x o V M W 9 $ . . + + . + + . } '.a.z.Y.}.}.6.J.N.l.R F q W O w % @ + @ @ + + + + . + . . . . . @ # . ", ". . . # = ^ * % { ~ ] ] ~ = @ . . . . + + # * ] ' ' ; % * ' _ 6 a % % ; + + . . + @ @ # @ @ % ; $ @ + . . + * a v h : # + + . + $ % % @ + % ] , / & . . . # < S f F K S ! ; ; @ + + . = e.j+'+5+p+^+%.. . . . + ] [ * . . . . . + + + . . . . ; c U %.f...:.<.1.p.'.a . & c ` .@.O._.Y.J.!+5+,+5.8+d+@+=+%+E.K.}+w. +n 2 h O.;.a.d.M G B 0 z q Q Z l i j d z Z M F = . + . + + + + . . . T h+m+}.n+U.6.Y.l.W U ` N U v { @ @ @ # @ @ + + + . . . . . . + @ $ . ", "@ + . # * $ + # - _ ] * # # @ + . . . . # & $ * $ # * ~ ) } : : { $ * = @ . . + + @ @ $ @ $ - ' & @ @ @ + + # ' } [ ; @ $ = - ; ~ ~ ) - + % ^ < - ; / { & - ) B y.8.0 > % + $ & @ . . } _+g+X.A.j.f { . . . * 3 A ' + + + + + + + + + . . . . > U 3.i.a.B.;.-+p.(.1 . % _ C ..;.a.k.c.&+!+,+5+,+J.l+/+t+<+=+-+Z.*+$+E.:.K H D .l.y.~.E t k m K O h z m j o d E .o + . . . . + . . . . . B.w+/+w.R.V.Y.8.Z H #.'.J ,.c # @ + @ # @ + . . . . . . . + @ @ @ # . ", "$ # + + $ @ + @ $ { & @ @ + $ % . . . . # = $ + . . * ) } b ^ ^ * # & ; + . . + + + + @ @ $ _ b { & ; * . . . . # & - * = ] = * = ( , _ # - ' % . ! P T Q 5 * - A v > # + + # & & = ~ 3 X F.F A ] + . . . & 0 V } @ . + + . + + + . . . . . $ q 8.|.J.r.A.5.M.E % $ - ' 4 O n.2.'.J b.r+^+m+'+l+*+>+e+t+c+~+|.E.6+e+=+1.'.@.j y l.9.$.J x m F Q E B C r m p t m v ) + . . . . . . . . . + e.x+4+t+%+,+W.L o D ~.&.V 8 { @ + + + . . . . . . . + + + @ $ # @ # . ", "& * $ # @ + # & % @ + + % * & # + + . . + @ @ % + . @ , > , - = & @ + # @ . . + + @ @ # + # , ! * * # + + . . . @ @ $ # # @ @ % * % ; * * ( ( @ + { f N.n.K g % + ; * = { $ # & _ | i I H } . . - - . . . ^ I t % . + + . . + + + . . . . . k s+q.~+r+X.x.e.:.a + = ^ b r P y.B.k.4.@+)+g+j+e+;+l+c+1+9+[+&+++m+;+r+X.-+F.n.$.O.!.:.h.f.$.P.T S k m X S E S 0 o ! . . . . + + + . . + . . =.0+x+(+u+9+i+c 4 U J W I [ # . + + + . + . . . + + + @ + # $ $ # # . ", "# % % $ % @ # = ' # . + $ & # . + + + + . + - [ ~ . # ' ' * ; { ' + . $ $ + . + + . @ $ # # ' _ * % + . + . . . @ @ @ + . + # % & % @ $ ; : , % + % g Y s.B.Q ; @ $ * ( , % # ) 5 s j X Q ( . @ / ( + + . { 4 b # . + + + + + + + . . . . % V -+5.7+.+8+J ) ' ; # + } F.B.h.{.k.d+v+9+v+3+c+^+'+u+a+:+v+t+!+m+j+m+E.#+q.~.u.9.2.%.Z L <.;.P.T n p n +.^.Y U m 0 ( . + . . + . . . . . . . #.|+3+y+>+t.<.} D ..y p } & @ + + + + . . . . + @ @ @ $ # $ # @ # # . ", "# # # % = & + & ] & + @ @ # # + + @ @ + + $ / 3 < * ; / } ; + * & + @ & & + . . . . . + @ + # % & @ . . . @ + + + @ * * - * % $ $ $ + + % { - # . % ^ | @...q & % { > ^ & + - 3 o 9 5 t 2 # . $ { < $ . . - ) ; @ + + + + + + . . . . + . : N.].s+_.}.h.u _ % # . & z u.{.B.g.++1+z+z+3+|+[+)+1+z+1+|+u+<+[+l+!+m+,+*+M.#.P.$.v.B.%.L <.0.s+N.y.h.O.y.#.Z Y W ^.3 + . . . . . . . . @ b F ++0+2+0+q+n+).F.h.P 0 ) + + + + + . . . . . @ # # @ @ $ $ # # $ # @ . ", "% $ % % & * # $ ' & + @ @ @ @ $ $ # ; $ @ * ) ! ' = ' ) ) - @ @ # @ @ $ & + . . . . + @ + . . + + . . . . $ # + . * ! : 5 5 A _ + + . . @ # # # @ * / ! g 7 ) @ = 8 a @ . @ ] [ c t i 0 / . @ { - ] # . # 7 , @ + @ + + + + . . . . + + . a l.N.2.$.d.v ~ - # # $ A @.[.b.Z.b+A+2+A+a+g+c+u+a+B+2+3+z+1+C+<+;+&+%+f+!+o.!.n.l.y.4.n+{.y.4.m.t.H.g.(.<.J .l.0.K.3.{ # @ . . . . . . C }+z+D+:+x+4+>+m+$+&+5.R I - . + @ . . . . + + + @ # + + @ # $ # $ # @ @ . ", "# $ & % & * % # @ + + @ @ + @ $ % % = - = ~ _ ~ ' ; $ ; ~ ~ % $ @ + + # # + + + @ . + % # . . . + # # # @ + + . + % $ = s n o > . . + # # # # $ - ~ / ! a ] # . * k , . . * ] ' ^ 9 j m _ . + & $ + @ + * 6 ] . . + + . . . . . . + + + , V !.~.~.&.M 7 % * ' & 7 M ;.}.b+(+y+:+z+|+c+5+q+9+o+|+3+/+u+o+z+z+q+l+]+X.[+C.d.[.P.R -./.(.h.a.H.g.g.{+F.K ~.8.|.K.m+5.d b - . . . . . . ` x+D+E+E+E+:+B+2+m+M.8.:.k # + @ @ . . . + + + # # @ + @ @ @ # # # # # # . ", "$ % % & & & % & @ . . + @ # % % % & ; ; - _ / ( ( % . # / ^ & # @ + # $ # # + + @ * < ~ $ . . + + # # # & & @ . + $ * + - a / + + . # & ; $ @ @ - , ! ) } , # . % , ! ! ~ $ @ @ < u d | , @ # ~ % + @ @ * - @ + . + + . + . . . + . # 6 D ~.%.Q t ) ; % ' d l p J *.i._+q+4+a+a+2+2+(+(+a+g+o+g+|+a+c+z+4+F+F+o+Q.,+c+z+C+G+h+D.-+B.'.=.G.s+(.9.^.z n.t.}.6.++m+i+>.T = . + + + . . d q+D+E+E+x+4+B+v+Z.O.F.k + + + @ + . + . @ @ + @ # @ # $ @ # $ $ $ @ @ @ . ", "% % % # $ % % $ @ . . . # * = ; * * { & * ' ' = # + + # = & # @ . + # # @ ; * @ & > b ~ # . . + $ % & * & * - ~ # @ - $ . . . . + % & & % @ + $ = / : } [ ) - @ @ ( 1 2 < $ . # b 5 ) ~ / % = < ; . . + $ @ @ + . . . . + . . . $ - 9 <.f.l 9 e * . . @ 7 F ~.(.P.%.$._+c+g+b+p+2+0+A+A+|+(+C+<+q+t+a+y+4+^+w.m+u+w.f+y+F+w+w+D+4+r.0.g.W.@+w.q.z.i+l+5+k+_+b.5.z.V.2.- . + + + + . $ o.D+x+A+2+2+(+^+W.3.V - + + + @ + + + + @ + # @ # + @ # + @ # # # @ @ @ . ", "# $ $ @ @ $ * & @ . . . $ ' ^ ~ ' ] ^ { % # @ + + . . + @ + @ $ # + + . + & { = = % @ $ + . . @ ; ; * & # . ; C C & @ + . . . . + - { & # + # ' | e } e 2 ^ $ # . ' < ! _ # . # - * % / } / ~ { # . . . + + @ + . . + . . . . + ( r O.Q 0 [ > ] # + @ / z .j.g.;.f.v ].4+E+B+A+x+E+E+:+2+v+l+[+9+c+G+*+R.M ^.e+y+q.k+0+E+E+E+E+F+D+x+z+:+w+D+D+D+D+D+x+'+$+r.6+u+w+D.{ . . + + + @ . e r+w+4+2+A+v+l+++u./ . + @ + + + + @ # @ # # @ + + @ @ # @ # @ # $ $ # . ", "@ @ # # # $ % & # + + . # ' { ( ( ( / ( - @ . . + . . + . . @ { - + . . @ ~ ^ = % + + . . . + $ ; & # @ + . & s n b $ + . . . . @ % % $ $ * > 6 f x S y S ) + . + & _ : < - # @ @ % ( k 9 } = @ + . . . . # @ + + + + . . + # ~ | Z <.A ) ~ % { { % ; a q :.>.P.%.U A -.1+4+z+g+o+B+x+E+x+|+C+|+x+!+).8 H f %.g+F+B+w+0+x+0+0+E+0+E+E+F+E+E+x+0+0+E+:+x+x+:+0+F+F+w+r+! . + + . . + + . J 2+0+x+4+2+(+m+D @ + + @ @ @ # @ + # @ # @ @ + + + @ @ @ # @ $ $ # # . ", "@ # # & % % * & @ . . . + % % ~ > : < ) _ = $ + . . . . . . $ ~ ^ ; + # { a b $ + + + . . . + $ * $ # . . . * [ : ) ' # + . . + $ $ @ $ ] < 8 j x G E T m ( + . @ { < } 1 i | # . # [ o 3 $ + + . . . . . + + + + + . + . + - 1 4 S j } ^ % & > < ~ ] t Z J O '.2.^.f.r+1+(+o+'+^+l+6+u+H+u+4+D+;+S . # W C.`.;+B+F+E+x+B+H+0+E+0+0+0+E+0+0+E+0+E+x+|+:+0+E+:+0+x+D+^+k . . ~ :. .~ @ . b }+D+x+y+y+a+u.' . @ @ + @ # # @ @ $ $ # @ + @ @ # # @ # # + # % # # . ", "@ $ $ % $ & % # @ . . . . @ # % ] < [ _ / / ( * . . . . . . $ / , ~ ; ^ 1 5 7 { + + + . . . @ # + @ @ + + + % # * ( > & + + + + % & $ ' 1 d ` H o 9 S ^.r * $ ' ] , [ | N %.F & . # | A # . . . . . . . . + + + + . + + + . - 2 A B e & @ & _ k 1 > [ e f ..u.U.n+w 0.E+x+4+z+9+'+b+r.$+6+<+:+D+v.% . . #./+Q.W.v+w+0+0+;+5+w+0+0+E+E+E+E+E+E+0+E+0+:+0+:+:+:+x+x+D+[+6 . . i 2+D+a.@ . . (.B+H+3+0+W.^ . @ # @ # @ $ # @ # @ # # @ + @ # @ % $ % $ @ # # $ $ . ", "$ & * % @ % * @ . . . . . + @ + & , [ / > _ , ' . . . . . . & , ( ; ' b 4 2 } ~ ; & @ @ @ + @ # $ % @ + @ % * % - / , ' @ + + + $ ; } C r C G B 4 i f G 3 = ^ : < < [ 8 +.N.F * . % , = + + . . . + . . . + + + + + + + + . ^ s c w - . ; b g w 6 | b b D L.#+w.H ) 7+D+:+x+E+0+/+q+m+q+5+3+E+D+++< . . 9.D+t+7.9+D+E+:+>+2+E+0+0+E+E+E+0+0+E+E+0+x+x+x+x+0+0+0+0+D+B+x . . u /+D+v+S . . s D.>+B+r.l + + + @ @ + @ @ # $ # @ @ @ @ @ @ + @ # # # @ + @ @ # $ . ", "$ $ & % @ # # . . . . . . . + @ * / : < 3 : ^ % . . . + + + # % % & - ! b ( ~ = - * & $ $ # $ @ # - & @ % & * % & ^ , ! & + + + . ; G .V z i w 6 e z w ; & ] , ! a w m T +.t $ + # % + . . . . + + + . . . + + + + + @ + @ ( e : & . @ ( b b 5 s 4 c V 4.h+l+e.a *.(+y+y+:+0+0+:+/+(+<+5+v+0+D+V.] . . l (+:+Z.e+D+D+0+F+E+0+0+0+E+E+E+E+E+x+/+A+y+4+y+:+0+0+0+0+w+0+n . . x 2+w+D+c.; . { i+D+>+^.. + # # # + @ + # $ $ # @ @ @ @ @ @ @ $ # # # @ @ + @ # $ . ", "$ % & $ # @ . . + + + . . . + # * { < a a < { @ . . . @ & % # % * - ^ > ^ ; * & & ; ; & ; & & % ' ' = % % & & @ $ ( } 6 ) + + + . ; s ^.J l p 4 7 , ( & + % ' ! ! 2 I P J Q | . . $ ; # . . . + + + + . . . + @ @ + + @ + + = ] = + . # ) _ 6 t F n J {+D.v.H.E p ++4+/+0+y+:+x+0+v+B+B+|+9+(+D+D.= . . = H.o+t.&+f+T.A+w+E+0+0+E+x+x+E+0+F+(+u+B+0+E+E+0+0+0+E+0+F+F+L . . l A+w+F+(+v . # u.H+i+} . @ # $ # + # # $ & @ @ @ @ @ @ + + @ @ $ $ % & @ + + @ # . ", "@ # % % # @ . + + . + . . . . @ $ ; ) ! a / % + + + + % ] * @ * / ( : ) ' ; & % % = * & & $ & ' _ , / = * ; & + @ ~ 7 7 > @ + + $ ' ! z z } ~ ~ { ~ ' # . % 8 O q I T @.O z ~ + . ; ~ # + + . . + + + . . . . + @ + . @ + . @ $ # + . ' , * | J ).~.-.q.n+5 M j *.B+E+/+0+:+x+0+0+y+:+0+x+B+A+0+)+3.c 0 V q.A+f+]+8.< /.x+F+0+E+E+x+x+x+E+E+A+x+E+0+x+E+E+E+E+E+0+0+D+/.. . A t+F+E+D+-.. . 0 -+H * @ + @ @ @ + @ $ & % + @ $ # @ # @ + + @ $ % & $ @ @ # # $ . ", "+ @ % $ @ + . + + + + . + @ . . @ * ~ / > ] $ . + + @ # ) ] # = , : } ) ~ * % % $ * & # # % ' / ) [ / ; % & $ . + { < [ / $ . + * ) < b , $ . @ * , ( # . $ l 3.%. .@.J F e ~ $ . % * @ + + . + + . + . . . . . . . + + + . . + + . $ [ 3 _ v ~.v.a.o.4.u.S 1 z q.o+2+3+x+x+0+0+y+E+0+E+0+E+y+y+x+y+<+1+4+:+:+a+1+q+m.K d.F+F+E+E+0+E+0+E+y+0+F+x+0+E+E+0+0+E+0+E+E+D+~+{ . 2 X.0+E+D+p+8 . = w _ @ @ @ @ @ @ @ # # & $ @ # $ $ @ # @ + + $ % % % & % # # # $ . ", "@ % % @ + . . + + @ . + # % + . + $ - ( : : % . . @ # # : 7 & - _ ) ( ~ - % $ % $ & $ @ @ * ] _ ^ ] ~ * @ @ @ . . % ( ) ( % + . ; k d k _ + + @ ~ / ' # . $ n G.=.J W V T j 2 * . @ @ @ + + + @ . . . . . . . . . . + . . + . @ + + ' 1 x E 8.z.p.-+[.s+a.G ~ s 8.p.T.z+0+:+B+B+3+E+0+E+0+E+0+0+x+E+w+w+w+F+:+3+a+z+D+'+R Y.w+E+E+0+0+F+9+!+A+y+B+1+:+0+E+E+0+E+E+0+D+u+5 . Y :+E+F+D+B+K . + @ + @ @ @ + + @ # @ @ @ # # # # # @ # # @ + @ # # # # # @ @ @ # . ", "# * * + . . . . + + @ @ @ # # + + @ % = ] b ^ . + % % $ , 2 ' = ' ' - = $ @ $ $ $ $ # $ % ] / ^ - = / ( ; . . . + + @ * % + . + ' 0 Z 9 = . + { > / = % . & y d.v.9.L J R y.T 5 # . . + + + . . . . . . . . . . . . . . . . ( ) # + ) Z B.s+-+A.5.{+/._.P ( + & , s.'+E+0+A+H+1+4+E+0+x+0+:+0+0+:+E+E+0+E+E+F+0+H+|+D+c+Y E a+D+E+0+E+w+i+j.q+:+A+g+A+F+0+0+0+0+E+0+D+[+7 . Y D+x+E+D+[+I . + @ # @ @ @ @ + @ @ @ @ @ # # @ # # @ # $ @ + + $ $ # # $ @ + + @ . ", "# * % . . . + @ # @ $ & @ + # # # + $ - ^ } ( + + % * ; = ) / - ; - - { $ + + # # $ $ # = _ ' - = ; { ^ ' % # + . . . . @ + . + ) G q _ . . $ ) } > ^ ; & % a L i.N.P U U k.v.2.v # . . + . . . . . . . . . . . . . . . . . { { @ % e s+m+E.s+z.S.;.O.y , . + . 5 &+D+E+x+0+C+(+E+:+3+B+4+A+x+0+0+0+0+E+B+:+0+F+B+l+6+c.e * a.|+0+x+0+D+i+!._+1+y+y+:+E+F+0+0+0+E+F+D+U.@ . 1 f+B+6.a.W ) + + @ # + @ @ @ @ @ # # # @ + + @ # # # @ @ @ + @ # $ $ @ # # @ . + . ", "@ $ + . . . @ ; ' - ] ~ ; # + @ $ # # * ; # @ @ & { ' - ; { _ ! ( - ( / { % . + @ $ % ; = ] { ; - * # # ^ ^ - - . . . . + . . . ^ l t $ . . ; 3 | 6 | ! ~ * . - z Z L n P (.S.E.*.# . . + . . . . . + $ - $ . . . . . . + + + . . + ] s.d+|.&.n+1.&.i % . + + . K u+D+0+x+:+3+4+0+x+B+z+3+y+:+0+0+E+:+/+9+v+:+F+c+R C M.-+e g ]+E+y+x+E+E+@+i.t+B+4+0+G+g+w+0+E+E+|+H+n+@ . % 7.D+^+8+-+m @ + @ @ @ @ @ @ @ @ # $ @ # @ + @ # @ % # # @ @ @ # # # @ # @ @ + + . ", "+ . + . . @ % ' ~ ^ , ^ ^ ~ % . @ + + @ # # # $ ( , / ^ - ~ _ [ > ^ ^ , _ { @ + + # & * { / ^ { - - + + : > & % + . . . . . . + ; _ = + . @ / e 5 w k | : < { + . ; 4 n P k._.S.X . . . . + . . . . . - 7 | ' . . . . . + + + . . . a {..+s+9.z.[.T ' . + + . ^ b.3+E+E+0+B+o+x+x+E+E+2+A+E+E+E+0+0+0+(+@+W.q+4+3+~+<.v.D+G.z l+:+B+0+0+E+4+5+A+F+x+q+}.>+D+E+E+D+]+1.-.~ . @ 1.C+z.8.O / + + @ @ @ @ + @ # # @ @ @ @ + + + @ @ $ $ @ # @ + @ @ # # % @ # @ @ . ", ". . . . . @ & { ' ^ _ ~ ^ [ ~ + . . . . $ = * - ^ ) ! _ = - _ : _ ] { ~ ] - $ # # @ $ & ^ ^ = & $ * ' ( ~ * @ + + . . . @ + + # $ @ + . + - b A A 1 g A 1 } ) # . . . ] 7 O a.l./ . . . . . . . . . . / p j ] . . . + + + + . + + + 6 >.8+L.{+7.q./.t @ + . . w E.(+4+/+4+0+/+2+y+E+0+:+y+3+x+x+x+0+F+F+2+b+ +$+:+D+:+f+j.Y P.'+x+0+E+E+0+F+D+w+4+5+2+4+0+0+E+E+0+D+>+-.[ . @ O {+d > * @ + + @ @ @ + + @ @ # @ @ @ + + + + @ @ # $ # # + + + # # # $ # @ @ # . ", ". . . . . + & = - ~ ^ ^ / ] - # . . . . @ ; = - ] , / ^ ] { , ) ' * / < ) ] % $ & @ # { ] ] & @ . & ~ / * & & & $ . . + - - $ @ @ + . . $ < 1 5 e 3 e d k : ] & % ; @ . . ( f } . + + . . . . . . . . ] D N - . . + + + + + + @ @ = , p ~.9.4.5.*+h+L.] . . ; e.)+3+(+5+|+A+B+B+x+0+E+E+x+B+u+e+9+v+z+x+0+4+'+>+B+E+F+E+h+T.,+B+x+0+E+E+0+E+D+g+`.B+0+E+0+E+w+E+y+k+{.f > + . ~ < { # @ . + + @ # % @ @ # @ @ # # @ + + + @ @ @ # # @ @ @ @ @ @ @ # # $ # # @ . ", ". . . . . + # * ; = ; { = & % # . . . . . % - _ ( ~ - ' ( ~ { = % @ ] ! ) ^ & % % $ % { { ; * @ . % - % @ % = ~ - @ + + ^ > # + + + . # / 3 7 | 2 } e 5 | / & - ^ a = @ @ . + + . + + . . . . . . @ % [ K p # . . . + + + . + . $ B q 0 Z &._.-+@+^+|.[ . . _ S.y+B+3+z+2+y+4+a+:+D+E+E+0+E+z+[+[+e+]+3+y+v+y+4+0+F+E+0+w+D+F+F+F+F+w+0+E+E+D+j+c.u+x+w+E+x+/+m+;.p ] - & @ . + . . . . + + # $ @ @ @ @ @ + @ @ @ # + + @ $ # # # # + @ @ + @ # # @ $ & $ # @ . ", ". . . . . . + & - ; & & % # $ @ + . . . . + { ) ^ - * ' ~ ' = ; * @ ; ) / ' * % % & * % % % ; % + @ % + @ % ' / ] % + $ ^ ' + # % + . @ / a b 1 w w 5 e 3 ~ % # % ; % $ + + . + + + . . . . . . . . # _ 9 ) @ @ * @ + + . . . & 2 L =.%.~.1.U.5.r+%+8+B . . [ T.(+G+[+q+p+}+p+}+%+}+(+0+F+:+C+h+9+w.'+0+0+:+3+o+H+x+w+D+D+E+y+A+o+G+4+F+x+0+E+/+p+X.b+a+F+b+L y S 9 _ % @ + . + + + + + . + @ % # @ # + @ @ @ @ @ + + @ @ % # @ @ @ @ @ @ + @ $ % $ % $ $ @ @ . ", ". . . . . . . $ = = - % % @ @ @ + + + . . . @ ; ' - ; - = & ; ' ^ * = ' ~ ' { * & ; = * & % ; ; % + + + # * ^ ) ~ $ @ $ { * + # / ~ . . $ ~ : 7 | 2 | [ , & + + . . . . + . . . . . + . . . . . . * ; % ; # @ - e ' . . . . . 1 D 9.2.e.|.j.L.R.D.D.7+l.= . d ]+]+H.n+Z.c.0.j.4.v.I.]+;+o+>+++=+J.E.(+w+E+x+o+p+)+y+[+@+~+^+Q.6.R.-+V.1+y+F+D+F+q+X. +@+#+8.7 & [ , & @ + + + + + + + + @ @ @ # # + + @ @ + + + @ @ + # $ $ # @ + + + @ @ @ @ # # # # # @ @ $ . ", ". . . . + @ # $ ; ; ; % $ # @ + . + . + + + + $ ; % & % @ @ = > A b ] ' = ; ; * ; = * & % % ; = ; $ + + + = , ~ = & % $ % # + @ [ 8 ^ . . @ = ) } < ) < ( $ . + . . . . . . . . . . . . . . . + $ { { @ . + @ ' / # . . . + ~ m O l.s.{+{+/._._+R.&+G+Y.~.w a s.#+D.v.-+E._+s+-.0._._+B.%.k+3+'+{.Y.1+F+0+a+[+q+2+y+B.< 4 l.|.e.<.~.L.#+u+H+U.k.8.%+]+e+R r 9 < , % + + . . . + + + + + + @ # # @ + + @ + + + @ @ @ # # $ & # + @ + @ # # # # # # @ @ @ @ @ # . ", ". . . . + & & & - ; % % + + + . + . . + & { = ; & # $ % + ; > 1 t a - * $ * & & ; = * $ % # % ^ [ 3 ~ @ + $ * $ @ * , ~ + + . + , 3 [ & . . + $ ~ ~ ^ ~ $ . . . . . . . . . . + + . . . . . + . # & # . . + @ $ # + . . . @ v ).~.[.-+G.s+R.S._.,+c+G+m+)+I., ^ G O d.E.k+=+f+C.4._.'.b Q [+D+(+j.A.6+v+w+/+m+|+D+D+x.g a B P R n y 9.U.7+-+w : U 7+++s+o : [ / % + + + . . + + + @ @ + + + @ @ # @ + + @ # @ + + + # # # @ @ @ @ + + @ # # # # @ @ # # @ @ @ . ", ". . . + # ; - * ; & # @ + + + @ @ + + @ ^ > _ ^ * & @ . # ] < e a * $ * $ $ $ & { ' = % # + @ ) 5 d , $ # @ + + . $ 7 3 # + # & % ] ] & # + . . + * ~ & @ + + . . . . + . . . . + + . + . . . . . + + . . . + + + . . + + & g v !.|.Y.g.a.o.4.o.w.^+e+<+H+3+|.s ; 5 0.C+v+z+F+3+=+1.l | t.0+x+0+G+f+c+t+b+o+p+Q.F+|+_+` o v C !.<.8 W o.(.r Z I.W h h 3 ( = $ # @ + + + + + @ + @ @ @ @ + + @ + @ # @ @ @ # # @ + + @ @ @ + + @ + + + + $ # # $ $ $ % % $ $ % . ", ". . . + % & * * & % @ + . . . $ - $ + * ] ( , ^ = % . . & _ ! g ~ . . & * $ % % { ' = * * $ # = ) _ ' = ; % + + + # / ] % . & ^ _ : - $ % # + . + ' ^ = ) } ] ; + . + + + + . + . . + . . . . + . . . . + + @ + + . . + . / A k S F.I.i+1.z.-.[.S.h+g+G+t+r+6+X._+$+A+0+F+E+2+W.N A ; < $.e+x+w+(+]+l+]+a.&+^+;.O.F C J H f n {.7.S ^ j J +.=+B.$ . # - # # + + + + @ @ + + + + @ @ @ @ @ + + @ @ @ @ # # @ # $ + + @ @ + + @ @ @ + + # # @ # $ $ & * $ # # # . ", ". . . + % * & % % $ # + . . @ - ~ * . & ~ - = = = @ + $ ' : > ~ * @ . @ & & % * { * & { % # % & { ( ' ~ ( * + + @ $ & * # . + & ) g { & # + . @ @ * ] > 8 o c k _ . . . + + + . . . . . . . + + . . . . . + + + + + . + $ k v o k o <.9.].z.d.(.R.g+c+b+#+r.*+h+E+E+F+w+E+y+v+_.< . . . ) 5.1+v+A+<+C+v+<+u+o+c+E.r ' z I I N y.q.<.3 a h H.a.^ . + # * & # + + + + + + + + + @ + @ @ + + @ @ + + @ @ + @ @ @ # @ + + + @ @ @ @ @ @ + # @ @ $ # $ % & % # # # . ", "+ + . . % % @ @ # % $ + + + # - ' - % % % % $ # # + # ^ , > ] % # $ % % * ; % - { & & ( ; % % % ~ < { ] _ ; + @ & ; * * ~ * + + = / * + . . . + . @ / A 0 p o c 1 $ . @ + + + . . . . . . . . . . . . . . . . @ @ + . $ a 9 i t i o G f L ].c.Z.r+^+l+`.b.p. .r E.D+F+H+w.w.g+e+h . b f c P m.Q.a+D+E+:+w+w+x+F+D+b+V c l Z Z h *.%.w A H U ) . + + + + @ + + @ + + + @ @ + + @ @ @ @ + @ @ @ @ @ @ @ # + + @ @ + + + + + @ @ @ @ @ @ @ @ # $ % # % # # @ $ # . ", "@ . . . @ @ + . + $ @ @ + @ $ - ' = / ' @ + + + . @ = _ > ^ & # % ; ; * ; { = = { * * { = - & - ( ] ; ~ ( $ @ % & ; = & > > $ @ $ # # + . . . . $ ] 1 l l H V n o & . # . . . . . . . . . . . . . . . . . . + + + + . & C C 4 d t 5 v l V '.q.`.m+7+}.|.h.).F ! G 0.z.*.g M g+D+g.g e..+p . ) ~.b+4+/+c+|+<+^+c+y+D+p+F e 0 c { ( k 3 4 B ^ . * & @ + @ @ @ @ + @ @ + + @ @ + + + + + @ # @ + @ # @ @ @ + + @ # @ @ # $ @ @ # @ # @ @ @ @ # # # # @ @ # $ $ # . ", "+ . . # # @ . . + + + + @ $ & { { - ] ] $ . . . . * , ( ; $ $ % * - = = ; * * ; & # + $ ; > ) ( ^ ; & { ; @ # ' ^ - = ; % % % % % . + @ . . . * [ w r I I O H r k ] + . . . . . . . . . . + + . . . . . . . + + + + & ~ 2 w c s z c 0 Z q ,.u.$.+.].R.J.].x Y -.L.L ' . . '.A+D+R.P p.O.( . & A u.W.e+++T.!+h+;+u+:+E+[.' g f t 4 ] ~ | g - $ & % # # $ @ @ @ @ % # # + @ @ + + + + + @ # # @ @ @ @ # # + + @ $ # @ % & # @ @ @ @ # # # @ # + @ # # # # % $ # . ", ". + # = - * % # + . . @ $ - - { ' { ' = $ . . . @ ^ ) ; + @ % & * { ] = $ $ * % + + + @ ( 6 2 } ^ % @ & ; $ $ { ~ ; { * + . . & ' - # . . . . _ t r G B 5 5 | ! ! 3 6 % . . + + . . . . + + + + . . . . . . + + . $ [ k 6 e e 9 5 e V D h !.L 6 = T q.&+M.o n g.1+D+]._ J u+B+7.d 7 2 = . @ ; > ^.(.g.9.>.9.|.5.W.h+;+^+D u B.T.b.A * & # $ $ # @ # @ $ # @ $ # % $ @ + + # + @ + + @ # @ # + @ # $ @ @ @ $ & % # @ $ # # # # # % % $ # @ # # @ # % # # $ # # . ", ". . # * = - { = $ @ @ $ = = = - { = - % + . . @ * _ ( # . . # $ % ' - % $ % # + . + # % > A w 3 ] & % # % % # $ $ # % # + + . & ] _ / _ ] $ . } p m 9 , ^ > b 7 b 0 I ^ . . . . . . . . + + + . . . . . . . + + @ ; 6 s A z B 5 ] 2 Y H e 8 b q o.D.r+j+m.K y e.(+D+x+]+q+A+i.; . = = . @ ; ; ( n &.Y K :.O.=.4.].j.c.`.s+H ).d.&.A & $ @ # $ # $ $ # # # # $ # # # @ @ + + + @ + # @ + + # # # # $ $ # # % $ $ # @ + $ # # $ $ # $ & % $ # $ $ $ $ $ # @ @ # . ", ". . + @ % & = ' ; @ $ & ; * & = ; * = # . + + @ - ( { # . . . . + * * $ % * # . . + $ $ ~ } b , * ; = $ + + + . . . . . + + @ $ ' ) > b w k ~ / g [ _ ~ - ~ } d w 4 } % @ . . + + . + . . . . . . + + . . . . . * ) [ t t t p A a w | } # . m r.x+z+o+c+#+x _ t +F+E+D+D+[+j . + @ @ + - [ , 7 W W K O l.-.{.].g.d.` %.O z 9 5 | , @ + # * ; % $ $ # # # # # # $ # @ @ + + @ @ + @ # + + # # @ # # @ # # $ % $ @ + + + @ @ # # # % % % * % # & * $ @ @ # # @ . ", ". . . . + # & * ; @ # % & ; = = % * * @ + + @ $ * ; { ~ = % @ # $ & ; # # $ @ . + # # ; ~ < b ) ; ; & + + . . . . . . . + $ % # % { ^ ) 7 8 ! % % ; / < _ _ 3 d 4 | ~ + + . . . . + + . . . . . + + + + + + + @ { > ) A j S G l u 6 ; + + G +3+2+1+v+y+6+p . . O 9+F+:+y+H+Z . @ + @ + ; , l .. .P W W O =.8.*.~.K } w A ! : ' # $ @ + % = * $ $ $ # # @ @ # # # # # @ + @ @ @ @ @ @ @ @ # + @ # # @ @ # % % @ + + + + @ $ $ # $ % $ $ & $ & & $ $ @ # @ @ @ . ", ". . . . . + @ @ @ @ # # % { : / & % $ + . + + # % * { _ ) = % % & & ; @ + + + + + # % ] ) ! > > ^ ' $ . . . . . . . . . + % & $ @ # = / ( & $ % * ~ < < b e 4 z t c g * . . . . . + . . # ; + + + + + + + + + % ^ ' ) 8 m q >.P e & . . w /.f+<+;+]+_+L f ( . ~ B.;+|+1+|+/+2.@ @ + + + # ~ s q U ~.<.h c p q m 6 / 1 [ { # ] = + @ # # & = * $ # % # # @ @ @ @ $ @ # @ @ + + + + + @ + @ @ @ @ + @ @ @ @ $ # @ + + @ + @ % % @ # $ % % $ $ % # # # # $ # @ # . ", ". + + + + + . . . . @ @ * / ! > ^ = @ + . . . @ $ % % / > * & & & ; = % + . . + # $ ; ] ( / _ ' ^ / % + . . + . . . . + @ $ $ % $ @ % ; & @ # { ^ > 7 3 6 8 i C C 9 8 , . + % $ . . . . / j / . + + + + + + + ; ' > 2 z I S n 8 * . . - m [.V.!+1.i ; . . . $ ).Q.t+q+g+|+F+q.; . + + @ & { a c S V I i < / _ , ; @ ; ' * . + # + @ $ # % # $ $ @ # # # @ # @ @ + + @ + + + + + + + + @ + @ @ # @ + + # # # $ @ @ @ @ @ @ @ @ + @ % % & # # @ # % # # $ % $ % . ", "+ + + + + . . . . . . + - / / > _ ] $ + . . . + @ @ + ; - $ # ; ^ ~ - & + . . @ # % ; / , ~ ' = ' { $ + + . . . . . . . & * + @ % ; { * ; ; * ( [ < g 7 7 4 4 9 e 7 ) * + - B 5 + . . * > 4 / . . + + + + + @ = ; > 4 w 2 5 , # . @ ^ 4 @.8.R.Q.>.# . . . + n #+'+t+j+[+z+4+d.# . @ @ + # % ^ 7 c 4 3 ( = * * $ @ @ $ = ; @ + @ @ @ $ & & # # @ @ @ # # # # + # @ @ + + @ @ @ @ + + # @ @ @ @ @ @ @ # # $ # @ + + @ @ @ + + + + @ # # $ # $ # @ # # # # # # # . ", "+ . . + . . . . . . + @ ; _ ( < _ ) ( $ + + # + . + + $ & + + # - ^ ' $ @ + + + $ & $ ; ! k ] { ' & # + + . . . . . . . % $ + . # = , / ] - ; ' } g k | a | 8 5 , ] $ @ - 7 B b + + . * < / % . + + @ + . + + $ % ; : : = # . . . } Z D @.B.J.b+k.% . . . < g.;+^+c+^+9+(+;+I . + + + + + @ # % { , { # + . . . + @ # # # % @ # # @ @ $ $ $ # @ @ @ # # + # @ + @ + @ @ # @ + @ # @ # + + @ @ @ + + $ # @ + + # @ # # + + + . + @ + + # $ $ @ @ $ $ @ # @ @ # . ", "+ . + + . . . . . @ # + $ ' ( : : ! < ' * ' = @ + # @ @ # + @ % = ' ; # * - $ % ; & # * { ~ - = ^ - $ % # + . . . . . . + @ + + $ = ' ) ~ = * - _ 6 k g 7 | 4 3 ; + + ; ^ a ) + + @ @ + ; { @ + + + + + + + . @ $ * ] $ . . . ; e <.u.+.F n.;.n.c . . . : d F.V.;+l+]+f+e+T.8 . + + . @ @ @ # + @ @ + + . $ - $ + + # @ + @ @ + @ @ @ # # $ $ @ # @ @ + + + @ @ + @ @ + @ # @ @ + @ + + . + + + + + @ @ # + + # $ + @ @ @ + + @ @ + @ + + + + + $ # @ @ + + @ . ", "+ + . . . . . . . + # + + ; ~ ] ! ) ) / ~ _ - + @ # + @ @ + @ % - ' $ @ - , - ; = * * & ; & $ @ % ; * * $ + @ + . . . . + + . @ = { / , ^ ^ { ] _ ! 7 3 } 9 0 _ . . + ; ~ ( * . + @ @ . @ # + + @ + + + + @ + + $ # $ - ) 6 z H ,...!.,.W ^.w & . . @ 1 &.,.l |.k+V.=+K.$+E.u . + + + + + + + @ @ + + . * a 3 & + + @ @ + + @ @ + + + # # # @ + + @ + @ # + + @ + + + + + + + @ + + + + + + + + + + + # + @ + + + + + # @ @ # + + + + @ + . + @ @ + + + + @ @ . ", "+ . . + . . . + + + + + + % = / , ( / ] ~ ' & @ + @ + + @ # @ $ = { % + # ( ) - % # % & * % + + @ ; * % @ + # @ + @ . . . . . @ = ~ > : > ! _ / _ , a e 1 4 e & . . + % = { & + . . . . + + + + + + + + + @ . . . @ { c x :.3...E U T P.F.7 + . . + ) M -.F.f ,./.Y.V.E.*+_.a . + + + + . . + @ + $ / 7 u 4 = @ + + + + + @ @ + + + @ # # $ @ + + + + @ @ + + + + + + + + @ @ # @ + + @ + + + @ + + @ @ @ @ @ + + @ . + + # # + @ @ @ @ + @ @ @ + . + @ + $ # . ", ". . . . . + @ @ # # @ # $ & % * ' - ~ ; ; * % + + @ @ # # # + $ ; % # @ . $ / ] * $ $ % & ; * * % % $ # + . + . + + + + . . . . % ' , ) < > / ~ ] , < 2 b } ^ # + . + & ~ ; $ . . . + + + + + @ + + + + . . . . . ^ w X !. .N G V W W O 9 @ . . @ ) 8 n M @.u C E h.|.i+w.k.{ . + + . . . . @ # + % 3 t k ^ # # + + + + + + + . . + # # @ + + + + @ @ @ @ + @ @ @ + + + @ + @ @ @ @ + + + + + # @ @ @ + @ @ @ @ @ @ @ + + @ @ # # # # # # @ + @ @ @ @ @ @ @ @ . ", ". . . . . @ $ $ $ $ % ; { ; = ~ & % = % % * * $ # # $ % $ $ @ $ & # @ + + + # % & * * * & ; ; ; # + @ + . . . . . + + + . . . . $ - / , ! > ~ - ^ ] ( : > : ( % . . . ; [ { @ . . . . + + . + + . . + + . . . . & 7 v K !.y r z z G G w # . . @ > S O S i r u t u E u.7.c.u.> . . . . . . + @ + + = ) ^ # + # @ + + @ + + + . . + + + @ @ + + + # @ @ @ @ + + @ @ + + + @ # + @ + + + + + + + + @ @ @ + + + + @ @ + + + @ @ @ # # @ + @ $ $ @ # @ @ @ @ # + @ . ", ". . . . . + = = * { ' ~ ^ { / / ~ = ] ^ & # % - % # * * $ # @ # # @ @ # @ @ @ @ # # + & * $ . . . . . + . . . . . + . . . . . . # - ^ , ] { ^ ( ^ - = ^ > [ / - $ $ = { } a & . . . + + . . + + + + + . . . . @ ( 2 h U Q r m j C t _ # . . . b y ..R E w t 8 e s f ,.W n H s ' # + . . . . . . + - ' % . + % # @ + + . . . + + . . . @ + + + + @ @ @ @ @ + + @ + + @ # @ @ + + + + @ + + . @ + + + + + # # @ # @ @ @ @ @ @ @ # $ @ + + @ $ @ $ # @ + @ # + + . ", ". . . . . + ; - = ~ ' ] ^ ~ , [ ) : : _ { # # % $ @ % & # + + + & { $ $ $ # @ + + . . + @ + . . + + @ @ + . . . . + . . . . . . . + = ~ = = ~ > > ~ * = ] : _ _ _ 5 S t A g ; . . . . + + + . . + + + . . . . { < w q U h z z 4 | ] . . . . * t m ,.J I 9 4 5 i y N t : # & [ 1 _ % @ + . . . . + & & # + @ $ @ + + . . . . + @ + + @ + + + + + + @ @ @ + @ @ @ % @ @ @ + + @ + @ + + + + + + + + + @ @ # # $ # # # @ + @ % @ @ @ @ @ + + + + # # @ @ @ + + + . ", ". . . . . + & * * & * ' { - ^ ) , , : ] & $ $ # # * % $ # + # * { ] % % * % & % # $ $ $ # + . . @ * = { - # + . . . . . . . . . . . # ' { % ( } / ; @ @ % > < < i O &.&.H [ + . + . . + . + + . . . + . . . $ > 6 j y G 0 p C [ * . . . + ' | q m B p 9 t 8 d d I N 6 ; # % = = - * { } ~ % # # # + @ @ @ @ + + + + + . + + + @ $ # @ # + + + + @ + + @ @ # @ @ # @ + + @ + @ + + + @ + + + @ + @ $ @ # # % $ @ @ @ @ @ @ $ # @ @ @ @ @ @ @ @ @ @ # @ + + + + . ", "+ . . . + + + $ % % % & & ; { ^ ) { ' * & & = ; % % @ @ @ . % ) ^ $ $ % $ $ * * & ; ' ) ' @ . . @ $ * = = = & + . . . . + + + + . . . # ; % { / { # . + $ ] / 9 D J &...X [ . + + + . . + + . . + + + . . . ' 6 i Y V C i 7 ( & @ + + + ] i o z d d c t i 5 i w 3 [ ' % $ ; * @ $ $ ; > ^ ~ / ^ ; # + @ + + + + + . + + @ + @ @ % % # # @ # # @ + + @ + @ # + + @ + + + @ # @ + + @ @ + + + + + # # # # + @ @ + @ @ @ @ @ @ @ @ + @ $ $ $ % & # # @ + . + + + . ", "+ . + + + . . @ $ % % $ @ @ ^ : - $ * * = ' - - & $ @ @ + . ; [ { + @ + . @ $ $ % ~ ! 3 : $ . . + @ % & & * * # + . . + + + + + . . . + $ & % $ # . . . @ % ! 0 ` ` W .Q / . + + + + . + + + + + @ + + . . ~ 2 o N h C e { + + + + # # ) 8 4 k e | } 8 t e A ! * # $ & ; & # % - & % & ' , : { % @ @ @ @ + + + + + + @ @ @ @ + @ @ # + + # # + + + + @ @ + + + . . + @ @ @ @ + + @ $ @ + + @ # # @ # # @ @ + @ # @ # @ @ @ @ # + + # $ @ $ % @ # # + + + + + . ", "# @ + + . . . . @ # $ # @ + = ' @ @ * { { ~ { ; % # # # # # ; - $ . . . . + @ # * ' : ! | { . . . @ & % $ $ & & # . . . + + @ . . . . + $ & @ + . . . . . @ , C n f v h i = + @ . . . . + + @ + + + . . . @ / 7 p N p 7 ~ $ + . . + @ % * , 7 g e 2 1 2 9 4 | ~ $ # * - ; @ $ ; ] / ' - > ^ % @ + + + + + + + + + + @ # # $ @ + + + + + @ # # + + + + + + + + . . . + + + + @ + + @ @ + + # @ # % # # # # @ # # @ + @ @ # @ + + @ @ # # @ # # + @ # # # @ + @ . ", "% * @ + . . . . @ # $ # @ + . + + @ & = = { ] ; # # $ % & ~ { . . . . + . . + $ % ' ! 1 w _ @ + . + * * % * * & @ + . . + . + + . . . . @ $ + . . . . . . . ( 4 C ! / { @ # - = # + . . . . . . . . . . + # _ 6 N V 7 & $ + . . . + + @ # { < A w e 7 b 6 w < # + # % $ # $ - ~ ( / * ; ~ $ . + + + + + + + @ @ + @ @ $ # # @ @ @ + + + + + @ @ + + + + + . . . + . . . + + + + + + + + + $ # @ # @ # # $ # # @ # # @ # # @ + @ # # $ # @ @ @ @ @ # * % @ @ + . ", "$ % # + . . . . + % & # @ + . . + @ $ * - ; - { * # # * = = % + . . . . . . + @ $ = ) w 4 } * # @ $ % # # * * % # + + . . . . . . . . + + . . . + + $ ; & . * > < ' * @ @ * ; - * @ . . . . . . . . . . + & > | 5 g = @ + . . . . . + + + @ ' } 2 e } : 3 a ( $ + # # $ * ; ^ > ^ ' @ $ $ + + + + + + + + + # @ + + # $ $ # @ @ # + + + + + + + + + # + + + + + @ + . . . . + + + + + @ + @ @ @ @ # # # # @ @ + # # @ # # + @ # # @ # # $ # @ # $ # # # # @ @ . ", "# $ # + . + + . + % & * % + . . . + $ & ; * % ; ' ; # & % @ # $ & & $ + + + + . # * ' } ) ~ = & & ' ; . + @ # $ $ # $ # + + # @ $ $ # & # . + + # & ] : b > , < } b } _ & = # @ # + + + + + + . . . . + . - 7 k , # @ . . . . . . . + + @ + + % * - { ( < , ) ] @ + $ ; * * ( > ~ * & @ @ + + + + @ + @ + + + + + + # $ # # # @ @ + @ + + + + @ @ @ @ + + + @ @ @ + + + + + + + + @ + + @ @ @ @ @ # $ # @ + + + @ # @ @ # @ # # # $ $ $ % % $ @ # $ # @ @ @ @ . ", "# % % @ . . . . + + * ] & + . . . @ % & * * * - ] - * # + + # & { ~ / ' ; % $ # + @ $ # # $ % * ~ _ ~ + . . + + @ * ; $ @ # ; ; - { $ ; @ + @ @ + @ { > 1 g } 2 w 6 1 ( & # + . . + + + + + + + . . . + + _ d [ * @ . . . . . + + + + + @ + + . * ~ # * { { < ; . + ; ' @ $ ' ] = ; & # + + + @ # # @ + . + + # # @ @ $ $ @ @ @ @ + @ # @ @ @ @ # @ + + + + @ + @ # + + + + @ + + + @ + + @ # @ @ # # # # # @ @ @ @ @ @ @ @ @ @ # % % $ # $ $ $ # @ # @ @ @ @ . ", "@ @ $ # + . . . . % ) [ ( . . . . @ & % & ; ; = - * $ @ . . $ - ] ( / ( ' { ~ { = # + . + + @ % ] , ' @ + + + + @ % ; { > _ ; % % ; ' % + + + + . . # = / _ < a 7 3 : $ . . . . . + + + . . + @ . . + + * 1 k = . . . . + @ # @ @ + + + + + . # ^ ( % @ @ % - $ + # ; { + + # % $ # @ . + + + + # @ + + + + @ @ @ # # $ # @ @ + + @ # @ @ # + @ @ @ + @ @ @ @ @ @ + + + + + + + + + + + + @ @ @ # # @ @ # @ @ # # + @ # $ @ # # $ $ # # # # $ % # @ @ # # # @ . ", "@ @ # # + + + . # ~ [ 7 ( # . . . # $ % & ; * & @ + + + + # * - ] ( = = ~ ' ' ~ ] = # + + . @ % ' ] * + + @ $ $ # $ ] } g 1 * . @ % * @ . . . @ . . + + ; _ / b 7 ] $ . . . . . . + @ + + . . + . . + # ( ) * + . . . + % = = % * & # @ + . @ ~ _ ^ % @ # % = = % $ = = # + + @ @ @ + + + + @ @ # @ + + + $ % # @ @ # # @ @ @ + + @ $ # @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ + + @ @ + @ + + + + @ + $ $ # # # @ # # # $ # # $ @ # $ $ % % $ % % # # # @ @ @ @ @ @ . ", "@ + + @ % # # # & ] [ [ { @ . . . + $ % $ ; $ . . . . . @ % ; ~ , ^ ^ ~ ' - - - ' ] & . + @ $ % ; * # @ + @ $ & * ' b c g 3 - . . + + . + + + . . . . . + * / c 3 @ . . . . . . . . + + . . . . + . @ ( > ; . . . . . # = ' ' { ] ~ ~ ' & @ ; ] ] ^ = ; _ ) ; # # # { ] % @ + . + + + + + + @ $ $ # + $ ; ' - ; $ # $ # @ @ @ + + + + @ + @ $ + + + @ @ @ @ + + + @ + + + + + + . @ + @ @ @ @ @ # @ @ $ $ # $ # @ % $ $ % @ @ # $ @ $ $ $ $ $ # @ @ + @ + + @ . ", "@ + + + # $ # % - , b ) @ . . . . + $ % $ + + . . + . . + % - ^ > ] / ] { ; - ; ' ] = * @ # & * $ + + $ & % % % = ) g e k : $ + + + + + + + . . + + . . . % ) b - . . . . . . . + . . . . . + . . + * ] * + . . . . @ = { * ; ~ ' ' ^ ^ * * { ~ ' & { ] 7 ) + . + # { ' % + + + + + + + @ # # # # @ + ; ~ ] { ] ~ ' ; $ # $ # @ + + @ @ @ @ @ + . + @ @ @ + + + + # @ + . + @ + + + + @ @ # @ + @ # @ # @ # $ % % % # # # # @ # # # @ # $ & $ # + @ $ $ + + + . ", "+ . + + @ $ # $ * ' ] & . . . . . . @ # + + . . + + . + % = ] , / _ / ~ ~ ' ; { ] - { ' $ $ = ] = + # & = * % & , ! w w | = + . . + + + @ . . . + + . + % _ > ^ & + . + . . . . . + . . . . . . . @ * ; + . . . . + * ] - = - - ; * & & & - = % $ # * ~ ] * + . + # * & $ + + + + + + + + # # + @ + . & / ' ] , ^ { = & $ # @ @ @ + @ @ @ + + + + + + + @ + + + + + + @ @ @ @ @ @ @ @ + # $ # @ $ $ @ # # @ # $ $ $ $ @ # # @ @ @ @ # # # # # @ @ # # @ + @ + . ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + @ @ # # # $ # # $ $ @ # $ # # $ $ $ % # @ @ @ # @ @ # @ @ @ . ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + @ # # $ $ $ # $ $ @ $ # % $ + # # $ % @ @ @ # $ @ @ @ # @ @ . ", ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; therion/loch/icons/fit.xpm0000664000175000017500000000072710763711626014635 0ustar useruser/* XPM */ static const char * fit_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 4 1", " c #0000BB", ". c #009BFF", "X c gray100", "o c None", /* pixels */ "oooooooooooooooo", "oo ooooo o", "oo ...ooooo... o", "oo .ooooooooo. o", "oo .ooooooooo. o", "oooooooooooooooo", "oooooooooooooooo", "oooooooooooooooo", "oooooooooooooooo", "oooooooooooooooo", "oo .ooooooooo. o", "oo .ooooooooo. o", "oo ...ooooo... o", "oo ooooo o", "oooooooooooooooo" }; therion/loch/icons/visinds.xpm0000664000175000017500000000112310763711730015515 0ustar useruser/* XPM */ static const char *visinds_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 12 1", " c #0009C4", ". c #1D00FF", "X c #00FF02", "o c #00CCFF", "O c #00F5FE", "+ c #FF3100", "@ c #FD00FD", "# c #FFBA00", "$ c #F3FF00", "% c #FFEA3A", "& c gray100", "* c None", /* pixels */ "****************", "**+ *ooo********", "**# ************", "**$ *ooo********", "**X ************", "**O *ooo********", "**. ************", "**@ *ooo********", "****************", "** * *******", "** % * % **o****", "** * * ***", "***o***o********", "**ooooooooooo***", "****************" }; therion/loch/icons/persp.xpm0000664000175000017500000000073110763711660015175 0ustar useruser/* XPM */ static const char * persp_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 4 1", " c #0060A2", ". c #00A5E4", "X c gray100", "o c None", /* pixels */ "oooooooooooooooo", "oooooooo ooo oo", "oooooooo o oooo", "oooooooo oooooo", "oooooo . oooooo", "oooo .... ooooo", "oo ...... ooooo", "o ........ ooooo", "oo ...... ooooo", "oooo .... ooooo", "oooooo . oooooo", "oooooooo oooooo", "oooooooo o oooo", "oooooooo ooo oo", "oooooooooooooooo" }; therion/loch/icons/render.xpm0000664000175000017500000000074510763711700015323 0ustar useruser/* XPM */ static const char *render_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 5 1", " c None", ". c Black", "X c Gray100", "o c #808000", "O c Yellow", /* pixels */ " ", " ......... ", " .XXXXXXXX. ", " .X.....X. ", " .XXXXXXXX. ", " .X.....X.... ", " .XXXXXXXX. . .", " .......... . ..", ". . . .", "............. .", ". ooo . . ", ". OOO ... ", "............. . ", " . . . ", " ........... " }; therion/loch/icons/plan.xpm0000664000175000017500000000072510763711664015005 0ustar useruser/* XPM */ static const char *plan_xpm[] = { /* columns rows colors chars-per-pixel */ "15 16 4 1", " c black", ". c red", "X c #FFCC00", "o c None", /* pixels */ "ooooo.....ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "ooooo.XXX.ooooo", "oo...XXXXX...oo", "ooo.XXXXXXX.ooo", "oooo.XXXXX.oooo", "ooooo.XXX.ooooo", "oooooo.X.oooooo", "ooooooo.ooooooo", "ooooooooooooooo" }; therion/loch/icons/vislabel.xpm0000664000175000017500000000062512267532012015640 0ustar useruser/* XPM */ static const char * vislabel_xpm[] = { "16 15 3 1", " c None", ". c #000000", "+ c #9E7B00", " ", " . .. . ", " . . . . . . ", " ... .. . ", " . . . . . . ", " . . .. . ", " ", " ", " + ", " + ", " +++++ ", " + ", " + ", " ", " "}; therion/loch/icons/viswalls.xpm0000664000175000017500000000173110763711736015715 0ustar useruser/* XPM */ static const char *viswalls_xpm[] = { /* columns rows colors chars-per-pixel */ "16 15 39 1", " c black", ". c gray43", "X c #717171", "o c #777777", "O c gray48", "+ c #7E7E7E", "@ c #838383", "# c #848484", "$ c gray53", "% c gray55", "& c gray56", "* c #909090", "= c gray57", "- c #939393", "; c #959595", ": c gray59", "> c #989898", ", c #9A9A9A", "< c #9B9B9B", "1 c gray61", "2 c #9D9D9D", "3 c gray62", "4 c #A0A0A0", "5 c gray63", "6 c #A2A2A2", "7 c gray64", "8 c #A4A4A4", "9 c #A5A5A5", "0 c #A7A7A7", "q c gray66", "w c #A9A9A9", "e c #AAAAAA", "r c gray67", "t c #B7B7B7", "y c #B9B9B9", "u c gray73", "i c #BBBBBB", "p c gray100", "a c None", /* pixels */ "aaaaaaaaaaaaaaaa", "aaaaaaaaaaaa aa", "aaaaaaaaaa 6r a", "aaaaaaaa #include #include #endif //LXDEPCHECK - standart libraries #include "lxPres.h" #include "lxGUI.h" #include "lxGLC.h" #include "lxSetup.h" #ifndef LXGNUMSW #include "loch.xpm" #endif enum { lxPR_LIST = 4000, }; BEGIN_EVENT_TABLE(lxPresentDlg, wxMiniFrame) EVT_BUTTON(wxID_ANY, lxPresentDlg::OnCommand) EVT_BUTTON(wxID_CLOSE, lxPresentDlg::OnCommand) EVT_LISTBOX(lxPR_LIST, lxPresentDlg::OnCommand) EVT_MOVE(lxPresentDlg::OnMove) EVT_CLOSE(lxPresentDlg::OnClose) END_EVENT_TABLE() bool lxPresentDlg::SavePresentation(bool saveas) { bool rv = true; wxString defFName = _T("presentation.lxp"); if (this->m_fileName.empty()) { saveas = true; } else { defFName = this->m_fileName; } if (this->m_fileDir.empty()) { this->m_fileDir = this->m_mainFrame->m_fileDir; } if (saveas) { wxFileDialog dialog( this, _("Save presentation"), wxEmptyString, defFName, _("Loch presentation file (*.lxp)|*.lxp"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); dialog.SetDirectory(this->m_fileDir); dialog.CentreOnParent(); if (dialog.ShowModal() == wxID_OK) { this->m_fileName = dialog.GetPath(); this->m_fileDir = dialog.GetDirectory(); saveas = false; } else { rv = false; } } if (!saveas) { this->m_mainFrame->m_pres->Save(this->m_fileName); this->m_changed = false; } return rv; } void lxPresentDlg::LoadPresentation() { if (this->m_fileDir.empty()) { this->m_fileDir = this->m_mainFrame->m_fileDir; } if (this->m_changed) { wxMessageDialog dlg(this, _("Presentation was changed. Save it?"), _("Warning"), wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxICON_EXCLAMATION | wxCENTRE); switch (dlg.ShowModal()) { case wxID_CANCEL: return; case wxID_YES: if (!this->SavePresentation()) return; break; } } wxFileDialog dialog ( this, _("Open"), wxEmptyString, wxEmptyString, _("Loch presentation file (*.lxp)|*.lxp") ); dialog.SetDirectory(this->m_fileDir); dialog.CentreOnParent(); if (dialog.ShowModal() == wxID_OK) { this->ResetPresentation(); this->m_fileName = dialog.GetPath(); this->m_fileDir = dialog.GetDirectory(); this->m_mainFrame->m_pres->Load(dialog.GetPath()); this->UpdateList(); } } void lxPresentDlg::ResetPresentation(bool save) { wxXmlNode * r; if (save && this->m_changed) { wxMessageDialog dlg(this, _("Presentation was changed. Save it?"), _("Warning"), wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxICON_EXCLAMATION | wxCENTRE); switch (dlg.ShowModal()) { case wxID_CANCEL: return; case wxID_YES: if (!this->SavePresentation()) return; break; } } r = new wxXmlNode(wxXML_ELEMENT_NODE, _T("LochPresentation")); this->m_mainFrame->m_pres->SetRoot(r); this->m_changed = false; this->m_posLBox->Clear(); } void lxPresentDlg::UpdateList() { this->m_posLBox->Clear(); wxXmlNode * n; if (this->m_mainFrame->m_pres->GetRoot() != NULL) { n = this->m_mainFrame->m_pres->GetRoot()->GetChildren(); long time = 0; while (n != NULL) { if (n->GetName() == _T("Scene")) { this->m_posLBox->AppendString(wxString::Format(_T("%04d"), time)); time++; } n = n->GetNext(); } } } void lxPresentDlg::UpdateControls() { wxWindow::FindWindowById(LXMENU_PRESUPDATE, this)->Enable(this->m_posLBox->GetCount() > 0); wxWindow::FindWindowById(LXMENU_PRESDELETE, this)->Enable(this->m_posLBox->GetCount() > 0); wxWindow::FindWindowById(LXMENU_PRESMOVEDOWN, this)->Enable((this->m_posLBox->GetCount() > 0) && (this->m_posLBox->GetSelection() != wxNOT_FOUND) && ((this->m_posLBox->GetSelection() + 1) < this->m_posLBox->GetCount())); wxWindow::FindWindowById(LXMENU_PRESMOVEUP, this)->Enable((this->m_posLBox->GetCount() > 0) && (this->m_posLBox->GetSelection() != wxNOT_FOUND) && (this->m_posLBox->GetSelection() > 0)); } void lxPresentDlg::OnCommand(wxCommandEvent& event) { wxXmlNode * n, * r, * p; long c, sel; r = this->m_mainFrame->m_pres->GetRoot(); if (r == NULL) { this->ResetPresentation(); r = this->m_mainFrame->m_pres->GetRoot(); } switch (event.GetId()) { case wxID_CLOSE: this->m_mainFrame->TogglePresentationDlg(); break; case LXMENU_PRESMARK: p = new wxXmlNode(wxXML_ELEMENT_NODE, _T("Scene")); this->m_mainFrame->setup->SaveToXMLNode(p); sel = this->m_posLBox->GetSelection(); if (sel == wxNOT_FOUND) { r->AddChild(p); sel = this->m_posLBox->GetCount(); } else { n = r->GetChildren(); c = 0; while (n != NULL) { if (n->GetName() == _T("Scene")) { if (sel == c) { r->InsertChildAfter(p, n); sel++; break; } c++; } n = n->GetNext(); } } this->UpdateList(); this->m_posLBox->Select(sel); this->UpdateControls(); //this->m_posLBox->EnsureVisible(this->m_posLBox->GetCount()-1); this->m_changed = true; break; case LXMENU_PRESMOVEDOWN: case LXMENU_PRESMOVEUP: case LXMENU_PRESDELETE: case LXMENU_PRESUPDATE: case lxPR_LIST: n = r->GetChildren(); p = NULL; c = 0; if (event.GetId() == lxPR_LIST) sel = event.GetSelection(); else { sel = this->m_posLBox->GetSelection(); if (sel == wxNOT_FOUND) break; } while (n != NULL) { if (n->GetName() == _T("Scene")) { if (sel == c) { switch (event.GetId()) { case lxPR_LIST: this->m_mainFrame->setup->LoadFromXMLNode(n); this->m_mainFrame->canvas->ForceRefresh(); this->m_mainFrame->UpdateM2TB(); break; case LXMENU_PRESUPDATE: this->m_mainFrame->setup->SaveToXMLNode(n); break; case LXMENU_PRESDELETE: r->RemoveChild(n); delete n; this->UpdateList(); if (this->m_posLBox->GetCount() > 0) this->m_posLBox->Select(this->m_posLBox->GetCount() > c ? c : c-1); break; case LXMENU_PRESMOVEUP: if (c > 0) { r->RemoveChild(n); r->InsertChild(n, p); this->UpdateList(); this->m_posLBox->Select(c-1); } break; case LXMENU_PRESMOVEDOWN: if ((c+1) < this->m_posLBox->GetCount()) { p = n->GetNext(); r->RemoveChild(n); r->InsertChildAfter(n, p); this->UpdateList(); this->m_posLBox->Select(c+1); } break; } break; } c++; p = n; } n = n->GetNext(); } break; case LXMENU_PRESSAVE: this->SavePresentation(); break; case LXMENU_PRESSAVEAS: this->SavePresentation(true); break; case LXMENU_PRESNEW: this->ResetPresentation(true); break; case LXMENU_PRESOPEN: this->LoadPresentation(); this->m_posLBox->Select(0); break; } this->UpdateControls(); } void lxPresentDlg::OnClose(wxCloseEvent& WXUNUSED(event)) { this->m_mainFrame->TogglePresentationDlg(); } void lxPresentDlg::OnMove(wxMoveEvent& WXUNUSED(event)) { this->m_toolBoxPosition.Save(); } lxPresentDlg::lxPresentDlg(wxWindow *parent) : wxMiniFrame(parent, wxID_ANY, _("Presentation"),wxDefaultPosition, wxDefaultSize, (wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxRESIZE_BORDER) & (~(wxMINIMIZE_BOX | wxMAXIMIZE_BOX))) { this->m_toolBoxPosition.Init(this, parent, 0, 8, 8); #ifdef LXGNUMSW this->SetIcon(wxIcon(_T("LOCHICON"))); #else this->SetIcon(wxIcon(loch_xpm)); #endif this->m_mainFrame = (lxFrame *) parent; this->m_fileName = wxEmptyString; wxBoxSizer * sizerFrame = new wxBoxSizer(wxVERTICAL); wxBoxSizer * sizerTop = new wxBoxSizer(wxHORIZONTAL); lxPanel = new wxPanel(this, wxID_ANY); this->m_posLBox = new wxListBox(lxPanel, lxPR_LIST); wxBoxSizer * controlSizer = new wxBoxSizer(wxVERTICAL); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESMARK, _("Mark")), 0, wxALIGN_RIGHT | wxALL); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESUPDATE, _("Update")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESMOVEUP, _("Move up")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESMOVEDOWN, _("Move down")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESDELETE, _("Delete")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( \ new wxStaticLine(lxPanel, wxID_ANY), \ 0, wxBOTTOM | wxTOP | wxEXPAND, lxBORDER); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESNEW, _("New")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESOPEN, _("Open...")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESSAVE, _("Save")), 0, wxALIGN_RIGHT | lxNOTTOP); controlSizer->Add( new wxButton(lxPanel, LXMENU_PRESSAVEAS, _("Save as...")), 0, wxALIGN_RIGHT | lxNOTTOP); sizerTop->Add(m_posLBox, 1, wxTOP | wxBOTTOM | wxLEFT | wxEXPAND, lxBORDER); lxBoxSizer = new wxBoxSizer(wxVERTICAL); lxBoxSizer->Add(controlSizer, 1, wxEXPAND, lxBORDER); lxBoxSizer->Add( new wxButton(lxPanel, wxID_CLOSE, _("Close")), 0, wxALIGN_RIGHT); sizerTop->Add(lxBoxSizer, 0, wxALL | wxEXPAND, lxBORDER); lxPanel->SetSizer(sizerTop); sizerTop->Fit(lxPanel); sizerFrame->Add(lxPanel, 1, wxEXPAND | wxALL); this->SetSizer(sizerFrame); sizerFrame->SetSizeHints(this); sizerFrame->Fit(this); wxSize mfs = this->m_mainFrame->GetSize(); this->SetSize(mfs.GetWidth() / 4, mfs.GetHeight() / 2); this->UpdateControls(); } therion/loch/lxWX.cxx0000664000175000017500000002512210537464734013640 0ustar useruser#include "lxWX.h" #ifndef LXDEPCHECK #include #include #include #include #endif wxStaticBox * lxStaticBox; wxStaticBoxSizer * lxStaticBoxSizer; wxBoxSizer * lxBoxSizer; wxGridSizer * lxGridSizer; wxFlexGridSizer * lxFlexGridSizer; wxGridBagSizer * lxGBSizer; wxRadioButton * lxRadioBtn; wxCheckBox * lxCheckBox; wxPanel * lxPanel; wxSize lxSize; wxPoint lxPoint; lxDoubleValidator::lxDoubleValidator(double * val, const double vmin, const double vmax, const wxChar * fmt) : wxValidator() { this->m_variable = val; this->m_vMin = vmin; this->m_vMax = vmax; this->m_fmt = fmt; } lxDoubleValidator::lxDoubleValidator(const lxDoubleValidator & val) : wxValidator() { Copy(val); } bool lxDoubleValidator::Copy(const lxDoubleValidator& val) { this->m_variable = val.m_variable; this->m_vMin = val.m_vMin; this->m_vMax = val.m_vMax; this->m_fmt = val.m_fmt; wxValidator::Copy(val); return TRUE; } lxDoubleValidator::~lxDoubleValidator() { } bool lxDoubleValidator::Validate(wxWindow * WXUNUSED(parent)) { double tmp; if( !CheckValidator() ) return FALSE; if (!((wxTextCtrl *)m_validatorWindow)->GetValue().ToDouble(&tmp)) { // TODO: MSGBox saying something about the range ((wxTextCtrl *)this->m_validatorWindow)->SetSelection(-1, -1); this->m_validatorWindow->SetFocus(); return FALSE; } if ((tmp < this->m_vMin) || (tmp > this->m_vMax)) { ((wxTextCtrl *)this->m_validatorWindow)->SetSelection(-1, -1); this->m_validatorWindow->SetFocus(); return FALSE; } return TRUE; } bool lxDoubleValidator::TransferToWindow() { if (!CheckValidator()) return FALSE; ((wxTextCtrl *) m_validatorWindow)->SetValue(wxString::Format(this->m_fmt, *this->m_variable)); return TRUE; } bool lxDoubleValidator::TransferFromWindow() { if (((wxTextCtrl *)m_validatorWindow)->GetValue().ToDouble(this->m_variable)) { if (*this->m_variable < this->m_vMin) *this->m_variable = this->m_vMin; if (*this->m_variable > this->m_vMax) *this->m_variable = this->m_vMax; } return TRUE; } lxRadioBtnValidator::lxRadioBtnValidator(long * val, const long optval) : wxValidator() { this->m_variable = val; this->m_variableValue = optval; } lxRadioBtnValidator::lxRadioBtnValidator(const lxRadioBtnValidator & val) : wxValidator() { Copy(val); } bool lxRadioBtnValidator::Copy(const lxRadioBtnValidator& val) { this->m_variable = val.m_variable; this->m_variableValue = val.m_variableValue; wxValidator::Copy(val); return TRUE; } lxRadioBtnValidator::~lxRadioBtnValidator() { } bool lxRadioBtnValidator::Validate(wxWindow * WXUNUSED(parent)) { if( !CheckValidator() ) return FALSE; return TRUE; } bool lxRadioBtnValidator::TransferToWindow() { if (!CheckValidator()) return FALSE; ((wxRadioButton *) m_validatorWindow)->SetValue((*this->m_variable) == this->m_variableValue); return TRUE; } bool lxRadioBtnValidator::TransferFromWindow() { if (((wxRadioButton *) m_validatorWindow)->GetValue()) *this->m_variable = this->m_variableValue; return TRUE; } void lxAdjustBitmapRGB(size_t s, unsigned char * d) { unsigned char * x; size_t i = 0; x = d; while ((i + 3) < s) { if (x[2] >= 0x80) { if ((abs(x[0] - x[2]) < 0x10) && (abs(x[0] - x[1]) < 0x10)) { x[0] -= 0x0C; x[1] -= 0x0C; } } else { if ((abs(x[0] - x[2]) < 0x10) && (abs(x[0] - x[1]) < 0x10)) { x[2] += 0x0C; } } x += 3; i += 3; } } lxCRC32::lxCRC32() { this->m_prevCrc = 0; this->Initialize(); } void lxCRC32::Initialize() { this->m_crcStr = _T(""); } bool lxCRC32::Changed() { unsigned long crc = this->Calculate(); bool r; r = (this->m_prevCrc != crc); this->m_prevCrc = crc; return r; } void lxCRC32::AddInteger(long var) { this->m_crcStr += wxString::Format(_("%ld"), var); } void lxCRC32::AddReal(double dbl) { this->m_crcStr += wxString::Format(_("%.14e"), dbl); } void lxCRC32::AddString(wxString sss) { this->m_crcStr += sss; } static unsigned long lxCrc32Table[] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL }; unsigned long lxCRC32::Calculate() { unsigned long i; unsigned long crc32val; size_t len = this->m_crcStr.Length() * sizeof(wxChar); const unsigned char * s = (const unsigned char *) this->m_crcStr.GetData(); crc32val = 0; for (i = 0; i < len; i++) { crc32val = lxCrc32Table[(crc32val ^ s[i]) & 0xff] ^ (crc32val >> 8); } return crc32val; } lxTBoxPos::lxTBoxPos(wxWindow * tool, wxWindow * frame, int corner, int xOffset, int yOffset) { this->Init(tool, frame, corner, xOffset, yOffset); } lxTBoxPos::lxTBoxPos() { this->Init(NULL, NULL, 0, 0, 0); } void lxTBoxPos::Init(wxWindow * tool, wxWindow * frame, int corner, int xOffset, int yOffset) { this->m_corner = corner; this->m_xOffset = xOffset; this->m_yOffset = yOffset; this->m_winFrame = frame; this->m_winTool = tool; } void lxTBoxPos::Save() { if ((this->m_winFrame == NULL) || (this->m_winTool == NULL)) return; int fw, fh, fx, fy, tw, th, tx, ty, nc; double cdist, mdist; this->m_winFrame->GetSize(& fw, & fh); this->m_winFrame->GetPosition(& fx, & fy); this->m_winTool->GetSize(& tw, & th); this->m_winTool->GetPosition(& tx, & ty); nc = 0; cdist = hypot(fx - tx, fy - ty); mdist = cdist; cdist = hypot(fx + fw - tx - tw, fy - ty); if (cdist < mdist) {mdist = cdist; nc = 1;} cdist = hypot(fx + fw - tx - tw, fy + fh - ty - th); if (cdist < mdist) {mdist = cdist; nc = 2;} cdist = hypot(fx - tx, fy + fh - ty - th); if (cdist < mdist) {mdist = cdist; nc = 3;} this->m_corner = nc; if (((wxFrame*)this->m_winFrame)->IsFullScreen() && ((nc == 1) || (nc == 4))) { ty += this->m_fsOffset; } switch (nc) { case 1: this->m_xOffset = fx + fw - tx - tw; this->m_yOffset = ty - fy; break; case 2: this->m_xOffset = fx + fw - tx - tw; this->m_yOffset = fy + fh - ty - th; break; case 3: this->m_xOffset = tx - fx; this->m_yOffset = fy + fh - ty - th; break; default: this->m_xOffset = tx - fx; this->m_yOffset = ty - fy; break; } } void lxTBoxPos::Restore() { if ((this->m_winFrame == NULL) || (this->m_winTool == NULL)) return; int fw, fh, fx, fy, tw, th, tx, ty, sx, sy; wxDisplaySize(& sx, & sy); this->m_winFrame->GetSize(& fw, & fh); this->m_winFrame->GetPosition(& fx, & fy); this->m_winTool->GetSize(& tw, & th); this->m_winTool->GetPosition(& tx, & ty); if (((wxFrame*)this->m_winFrame)->IsFullScreen() && ((this->m_corner == 1) || (this->m_corner == 4))) { fy -= this->m_fsOffset; } switch (this->m_corner) { case 1: tx = fx + fw - this->m_xOffset - tw; ty = fy + this->m_yOffset; break; case 2: tx = fx + fw - this->m_xOffset - tw; ty = fy + fh - this->m_yOffset - th; break; case 3: tx = fx + this->m_xOffset; ty = fy + fh - this->m_yOffset - th; break; default: tx = fx + this->m_xOffset; ty = fy + this->m_yOffset; break; } sx -= tw; sy -= th; if (tx < 0) tx = 0; if (tx > sx) tx = sx; if (ty < 0) ty = 0; if (ty > sy) ty = sy; this->m_winTool->Move(tx, ty); //this->Save(); } void lxTBoxPos::Set(int corner, int xOffset, int yOffset) { this->m_corner = corner; this->m_xOffset = xOffset; this->m_yOffset = yOffset; } int lxTBoxPos::m_fsOffset(0); therion/loch/makedepend2.pl0000664000175000017500000000045612320011275014705 0ustar useruser# read make file open(MF,"Makefile"); @mflines = ; close(MF); open(MF,">Makefile"); $ind = 0; foreach $ln (@mflines) { if ($ln =~ /^\s*\#\s*DEPENDENCIES/) { $ind = 1; } if ($ind && ($ln =~ /^\w+\.o\:\s+/)) { print MF "\$(LOUTDIR)/$ln"; } else { print MF $ln; } } close(MF); therion/loch/lxSScene.h0000664000175000017500000000206610537464734014111 0ustar useruser/** * @file lxSScene.h * Loch scene setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxSScene_h #define lxSScene_h // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries #include "lxWX.h" enum { LXMSTP_CONTROLLB, }; class lxModelSetupDlg : public wxMiniFrame { public: lxTBoxPos m_toolBoxPosition; class lxFrame * m_mainFrame; wxBoxSizer * m_controlSizer, * m_controlSizer_ColorMode, * m_controlSizer_Visibility, * m_controlSizer_Centerline, * m_controlSizer_Walls, * m_controlSizer_Surface, * m_controlSizer_Labels, * m_controlSizer_BBox2Grid, * m_controlSizer_Indicators, * m_controlSizer_ColorSetup; lxModelSetupDlg(wxWindow *parent); void LoadSetup(); void InitSetup(); void OnSlider(wxScrollEvent& event); void OnCommand(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnMove(wxMoveEvent& event); void OnControlSelect(wxCommandEvent& event); private: DECLARE_EVENT_TABLE() }; #endif therion/loch/help/0000775000175000017500000000000012426431273013127 5ustar userusertherion/loch/help/en/0000775000175000017500000000000012426431345013531 5ustar userusertherion/loch/help/en/loch.chm0000664000175000017500000003301610645413630015150 0ustar useruserITSF`.T‡+ý|ª{О  É"æìý|ª{О  É"æì`xTÌþ6ITSPT ÿÿÿÿÿÿÿÿ j’].!Ðù É"æìTÿÿÿÿÿÿÿÿÿÿÿÿPMGLÖ ÿÿÿÿÿÿÿÿ//#IDXHDRþ /#ITBITS /#STRINGSŸe"/#SYSTEM¡(/#TOPICSž@/#URLSTRŸ \/#URLTBLžY0 /$FIftiMainÒa«8 /$OBJINST½"•?/$WWAssociativeLinks//$WWAssociativeLinks/Property½/$WWKeywordLinks//$WWKeywordLinks/BTree«tL/$WWKeywordLinks/Data¼@4/$WWKeywordLinks/Map¼t /$WWKeywordLinks/Property¼~ /loch.hhc†% /loch.hhk†%…M /loch.htm‹r ::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content¢.§d,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableÊ0Eo †< Uncompressed MSCompressed{7FC28940-9D31-11D0PLZXC GÑ•F HHA Version 4.74.8702$ p_*RÄÇ loch.htm Loch Helploch loch.hhc loch.hhkYáY  T#SM®ê= ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtp5oýÿï½émR¿c4⪵­Výæ¶¶[Ê6[®Ð½¸½·ò¶ÞöïõÛ{ÇY•vR*’T§P!tîÂC‡\†ŽîúBøú’T ú\ü08#B€VÞ€|Ûý}Ü÷¾#¡õ–Õ¿ZŠY’[–P&ö-:à(ØsÊù*7Q¶Þûð)cÂΑVpÏ=X=BBzm=²¬éuâìØ’¥iþñOÂ#P5Dó^[û–eÈ[­`,*¡ƒpA‰¡:ˆÛq:ÔñE²ázmC/hp>jkÛ.fBŸjKÏÍ®×íç C0ƒ;?Æ ŠëŰºÞ ­é¬2¢Ü]îË»²B­C“+scƒér#wèÎܳéÇY$žEs ©è6‡Åø$ÓÙõåÈãè(O]sAæ… 5Фy»ëË»XM¦Ó¥Næ¿Ãc3=6k3 m.kè‰þ¹ðDI†¾ËPŸÍ4#ІàÁX(ó¡©çO?Cnådð8êÒHéx_¨À]û±jB©ñìVâe6¶¸ýZ‚A²0÷Ì’k¨¥”óÃ*ELW;Q ~±PT GÜæ—A>õE¹(X‡ËÝù"‹„[ê721D†|þðÀ.Ê`UÉÔA¼^2×>>ážYÀ/å¿ …µ°g^.gÐ’Eº´¤Þ¥Yî'M m nXëä{`â·ý:2ò×riá l¸ei´žÄ)ƒgŽh*¿w ¸a°Rizaf37'.–Mç<–ìð¡l†¦"»¿Ç;w•…Û9šT!-c†T(85»,œù·­¿fL5ÇB€äéÛd…¡î@ÜÍóœõ×n=Œù²’¡û×·n¯½§ÛM‚•£­Ú|„cÅb', ©zž2Y™UŸ®LÖ æó¢\ÖlÝfmØh2þÓîf‡{•”áÇé}Geñã±)£´rw0ù è"ažFk<Zߘn¡Oú" kD‡Šbã!ÅÎ3µÇ.‹Ø7eD¸¨¹mÔÍɹ•‹¶X®Ò.îÓÅú”ú±¬¨×@¿£‹¾>$k3m ÊRÿS'ånsÝqe°c]äÅY|i.v:QLDÔ3H7àOBtf͘ŽCŒöu*Cüϸ’2°~njÆj#ჯg¾*Úx|¹x·{Å©x$ÊR¨¹ÕEáÀfÜùÎ&5™Ý«×üèˆó2j¹"fo›úônj(î±OgQD~N?{•Ï/ Ú½Á|E¯Ä”ÅŸ§ÕœSÿ&M[oÉ&k §Å€¹bÆ&Íç>ÒÅ®ÑqÀ«;us䌕lÅ  ŸÕMñ¾Ñ5T&ʾÉ6wÁ\ZÅ´²c*fÎÿ›°,Éš‘; ¯6n™˜í‘8ÍA yÒKõˆf±G¯{gf(ÓÈP`ЖQ÷—2–Êó¨²]r•‘…‘öåîÍÍ™~EAE–ßíL­ÔfŽúŒ“ã~Ï&;bÍf”öN]‰ùp9¶=º@Yº¹°¸R%öFâë>¨œ]UC$ÎR?Žæª¹TäðeIµ;{¿ŒW•¿‚ïvwxÂÉ¿ÿŘ“ª% ~­8qå °»HíÒî„«…–·ñ#ýERg¼¼YÃ>ÙúF‚ Hg…~­‹žox„p'‘ênð_Öø]@hØAûkZûFj*ï Æpˆv9/‘÷!r P(B¡(ôß3ùøÜá–0Ò÷h$âB\Jö±Û·!µ¾·ÅYk§ìã5Ú]kñ ~³õ¨~Ÿhk‡¡B…-Ë¢;0›)®"\vaa\É]ċŌ˜7B1Jµw Ü `IJ€U2š«”â°Y2]b–ü–Œs]R\ÁË[/[EÌF £Kxô’ér _áýrMÚqÍ¥K¸ô’®ôÈé’  ™2ä_Ðé%#ÀÓú@„}؈yˆZÌÃ]‚yà¥<>Ú‚Σù`L-Ùh¡Lƒji% NZŠZ©›²ÕBü†‚ÖÆÕ! D2f…].B27¼Çâ_BÔœ¹k±`DtÃæôÍIÆNž0pbõÀzíÃçä#º €=›ðÃçycwpx T21!–ª’Š ”]d-»„L0zdS*þ‚‡Q©4È·‹L(Ëå.›¤0‹ê¹‰@O°<¦¡p”§Ð6æÅ@ÚI;MGh ÑÏ:;€C¹ð“³Ø°µXG) Ü}Ö¡ ”ÁkvüGqzµ<”ØÂúÛ‡<@­¼\#ëP¥7Éy-Tà*[À‰ìQ€Ð:¯èÊÙë¼ÀV´¯“}€«è ÕØìÊ@tF…ª†óXKŠ ZB_Ø„<Ôµ¸þ朂Ýòã a£va#2ˆQŒ’ä@” bd £9%È(ÄÉ@ Fr1JQ2ˆ’@Œ äb” £d9w ¾°ïƒl¿²…?ŒÑ~¤/ï0=þ½.Œ*+Uû²´J­Ù‘6pøt©¾~†‚âS¦Î9ûq ŽM›8âî‡KM=[ºv0?:g¿³ZÓ§Óãk¡ µP²Z… FЖ5ªc}˜Æ–©¤|qýX[PÓN‡âV§N–ܶભïT?ªë“ªyÕAN!*À[µä‘R&µ×ÜñErÁ’êÕüx9f{¹Ùiîi Ö+2k…EöÀ·ÝãéRÖÁ1k—ÁÛCí¶wßâó@­0­[<ó›È?ƃN7Ü÷Å)÷\}yåÌQ]¥¸dÜr^¸ù? B¦l]¨?VBëÀîÕ—_Ž»©|ƒ߇¡nº.˜l»î)¬r%¿ú_U¿ÔùÚ=;âj°àjxÐo¼Kó#pÈc±±²ï¼I3õ£=(zëNpö½÷Ýî~n‡¨°`h) zZ>âØú×}øƒVذ*{jàOVµä÷àˆÛ°ûö{¦ü÷Aþ ØÇZ´¬Ø!]¬\wbýïßÁÝÀpìgX¿SÃWà dñ4ÊBwÁ'ÀÁArœðã#eæùðñÄþ6ž„çó±è¼jŸeˆ{{í©ÒôXýÃZÅefMVf›ÈÌ~8Ÿñ·ºt_Û}¬]&NlÙ,í½oGºâƒâ´úN„¢3³è«722³6L™ŽºéènúãNCNé¥äD®xN(›JôMåräÃ4ùïè)w{*3zå§ž9ºŸn§ê—:9gŸó·î7'fsÍeI6²ÞœºëHãéYþôÑÒ§Ni T¨ç5*-F['ÐR;c©ZaÊãù[§íiµÙBmõs˜:¨RC'ªUщ{mXZ'¬WI‰«íÒd›ë±hVÓ+õtÈšF¶ÛÔ‰ÛíŸp[͉­VÕO«aÎ}u%_ ÉánA8ö>¸áÖ ûmxãn‰¸Wׂ+ø}¢}û^îÞ”Ãåá~v“Ÿ»B›¤†ÞxûÞä_»k7WfÍæÈ"l1|°Ðu®W¢þ¯  ö5¾ŠXw]uŸe0ÛH†Oª˜ì¨xÛ»âú½¿Ì‚Õn/gç7 \K¼Xï«´ÜÅ p/æÜ©˜=NžÆ¨Åô «ëúR`yd_¬k2®Zm¶ŒJ¦  »/#´ÄתÎ|“½›ØÎŸX )lË ”uéaf‚Ì£Bm>sO™˜Ô&PfߦmÚ&Û«R pJ`[0£oŸ¶´š=n|¥Xë½ tx,j6¼ F 닊¸´¦&óƒÁ›9BP¨Ò¯¶4 K#+•U·‘–dKQ>©_Û¼gúisétÿ“¦˜/WMY½ oÍ;­8˜=¸êñ|€­eN­_ÖÌPÔ%Éê'”L9+§pŒuÃ÷±c‰sòÅõú¬Ý½[K3;×´S‰z*âä5ÅìŸÙ²8ëÆSG¦mfŸÍ‚W£1*˜2Ã[žf§³%¶ÕÉuž1]˜§b\˜§PX<ß(V?.Y2×1Zœ¦W™)_[Zçv /¶ÍTe eµv¶EÛ¶lX…Ô¿¿|6(gb[-1¯a+±O- _Ά¸è¹ð+£9%¤bÛµó«ËJÝ#³µsÓ­¶ ƒ'µ 1[!sX”¼ï t¤¦žâ›[jìÏׇ0ÊgÒAÁötººîäå|i¨%ó¸i+vUcÖQ¸‚ºª5Ë“)ÕY.(Ýyd|"0CE•ÈÔ”ÐÀ MKÀùzX€Ü Ôþ´9U'~ (ë}àa P¢”&9<:ˆýLÆÖÖß’ ÀÏaªÀ¥ ü5È¢zL3õ§±óÕ÷Ø£a¼tJÝ  „D§:ÏœŠü6œÞ«é,ôßÕ©ÉTæ@à¿°âÁþჅO¯ÞoJà‡5ÉòyŽÎŽd®Y€ü%2\Íf-¡%ø,íßø+|Nµ.R@AQ ô‰è li~çI¸ä˜ Äн·>døHÜ1Æð ]¿¸Á-ƒò_N'±;QÑS¨®Ù¸‘$Èä¶»x{f˜ry„ŽK2`$é¡ZŸ9¶z¾€ÝUöâ«ÀÉ`¤VÚÊ@xlN 9¯]XKõŒŠRäB¿üùƒ ú5³W»TÔ7¯«t†^ K7„ñ`";ßÅ>ä¡Np߆9ªyUû@OÕÿæŒêLHÞ Ê*ÐUùQi"gî´ÆJà·îpë`F™iâ/7`FÐm0È{Ž@¾9¸î3 èݼÙ“â °LrÇÄOŸGüwCÀI&ÉAqs_ž"2Ý3Ô<…ʘ*?ðo>?@Ü?²B­{þ½Œú|…¿¢o!µà<ŠþƒKQ°dÊÊuxÀl9 , Ô=æã.s?YÐ賤 Ç%Z_¡ÒŽÕïKèvÏÜW«‰½ Ñ3º‰õ7]§®oM».÷Ö-<÷­{K¯4Çéõ¯uþÊ\`"¾ #ÈpæY ïHRþPÅ`¿¾ø4ÀHf…Dð.rx¾£ ‘±Ñ¦cŠ¡…ô Ò9eô6¶„“«äƒ½K-¡" Lƒ”)ÏÚ~Â|Æž€î§ëÌA>(ÂPB#àDÔ}%G‹³÷óù|øŠª™GK,4äÖôþf´°¡±¹Î9!zÉ00ÿ¬|ïStnôò”Å‚{W¥ @O¾Ê'è¿·å'ZsM—YŸ~Ì”eÞèÞ d(Üį1"V¼•wí¬ò°y×ü×JãèWž(Wífrѳ%6äƒ #= ´Ù52&¥9™ZäDhÐ꯳›èóGw­²Ýr¡t¢ÙÈÓ=#uA½÷"qrÐCPâÏ›Ã}¯+é1eýãB½ ¨úÕ&rm*­Ã@8¡©‰J®³” ¸ý/¥Û$Jþ7ÆdªÊߤ¿© žì±ç’ÔáŸùHØ[k›Dï…"\™)JiÐ;ž>nDcö^ "J7ОdCö¾xŒWÉû×OA1}Gw°' È£lßÑ?l²g[âï¹Â (§P ÷{‹õ^kЃ%˜€‡Ã¿wm®òB …(¡P…B _(EÙ팤 „["ZoIý)BÚÁE$ ’ÓBj+lŠVðÈÜK}£­g1¦¤ïj’:é-ÛˆcHX‘Ò±›ôÿÜéå#]µ÷nùTºäöÿ¦*,?%!,ò¯_A.…B P(B¡ …(¡P…B P(B¡ …(¡P…B P(B¡ …(à_€(Pä€therion/loch/help/en/loch.hhp0000664000175000017500000000042710507017326015157 0ustar useruser[OPTIONS] Auto Index=Yes Compatibility=1.1 or later Compiled file=loch.chm Contents file=loch.hhc Default topic=loch.htm Display compile progress=Yes Full-text search=Yes Index file=loch.hhk Language=0x409 English (United States) Title=Loch Help [FILES] loch.htm [INFOTYPES] therion/loch/help/en/Makefile0000664000175000017500000000026610507614400015166 0ustar useruserall: loch.htb loch.chm loch.chm: loch.hhp loch.hhc loch.hhk loch.htm hhc loch.hhp loch.htb: loch.hhp loch.hhc loch.hhk loch.htm zip loch.htb loch.hhp loch.hhc loch.hhk loch.htm therion/loch/help/en/loch.hhk0000664000175000017500000000131510507017352015146 0ustar useruser
therion/loch/help/en/loch.hhc0000664000175000017500000000144510507014144015136 0ustar useruser
therion/loch/help/en/loch.htm0000664000175000017500000000761110645413566015203 0ustar useruser Loch Help

Loch Help

Table of contents


Basic control

Function Mouse action Key

Zoom & Rotate Left click + drag
Zoom only Left click + drag up/down,
then hold left and click right
Ctrl + Up/Down
Rotate only Left click + drag left/right,
then hold left and click right
Left/Right
Pan Right click + drag Shift + Arrows
Tilt Middle (wheel) click + drag
or wheel rotate
Up/Down

Full screen Left double click F11
Context menu Right click

If continuous rotation is turned on, then rotation mouse movements change the speed or direction of rotation. If rotation is locked, then rotation mouse movements have no effect.


Off screen rendering

Loch is able to render large bitmaps that can be afterwards post processed and printed. Bitmaps can be exported in PDF, PNG or BMP formats. Configuration of export is dove via Rendering setup dialog. You can set following features:

Size and scaling

Screen shotScreen copy will be saved into file with no other changes.
Image widthContents of the screen will have given with.
Image heightContents of the screen will have given height.
ScaleContents of the screen will be exported in given scale.

Image options

Rendering resolutionResolution of the image file used when image size or scale are specified.
Image sizeImage size in pixels and uncompressed bytes calculated from previous settings.
White backgroundForce white background in exported image.

 

Known bugs

  • Sometimes empty rectangles appear in off screen rendered file. Changing window size usually helps.

Windows specific

  • Texture gets strange color pattern. Reloading model seems to help.
  • Passage coloring gets random. Restarting the program/computer helps.

Linux specific

  • Stereo mode does not work correctly on some graphic adapters.
  • This help does not work.

therion/loch/help/en/loch.htb0000664000175000017500000000543410645413630015161 0ustar useruserPK­<5ëé )Í3loch.hhpSD,qñM=cd`ia``P`@FF…ÎUT †ØEàR•Fh‘“FU±jÃ0†÷{ŠÛ¡!,<”&&âÁtP•‹%r–„tçí«8¥´Ë ßñÿ÷]×ÚªÙ?ám•;ÓTœ(Á»‚ûeÙÊ­X-Vè#²ŠóÊ2ñ’gÁ^›…6CÆNÈIúƒÑ°¡‹YP|°úË›«êG†èûH)ÍÇË‘ùEhL¤¢63œÝþ•_¡V®UOÅrZ/_qëz¶ÉàÓ‡³’’…Ó3´VrªÎ)ÜèÊªÞæ¯} «öeÓžw ßPK¼}<5Iô3Ø,%3loch.hhcSD,qñM=cd`ia``P`@FF…ÎUT ÒEàR•Fh‘“F­R]o‚0}Þ~Å“½ag²·¡‰@,(ÆÕ,>6¬2 M©Ëöïw ã–%<øÒÛsÏ9m7 “€¶VlÃvïÇQŽKHDÙ’…í !tãÌo=;·….B,•0j^‰™óD7t·`ÉÎTÖFÔf欋TËF¾›;-²ÇNa%J¯R4¹Tð0™ZÖ‘ëÂKaDÅL'÷ຸIZÏO®ÿ™ Ì·B1#¾ i°”–JhSˆyn<Å5¯NŽ¢Šg‚!ÞO^qg)Ë7¡­ éèp¶m_Íá ôd©/¹78ö´Awßæ/,–)/{\)Ó|’›ªÃõ® ®e9T||¿–‰¨ñe‹:lãWǵŒøÇlð?ŒÏàsˆ „GÚÔaÛ¸ÿPK·<5ä@£X Í3loch.hhkSD,qñM=cd`ia``P`@FF…ÎUT šØEàR•Fh‘“F­’ÁOƒ0ÆÏøW¼u‰7¨K¼Ù-P†Á‚]ÌŽ V %¥3úß[¨™Q/¸´}í÷ÞïKú‘E˜ìt °cûG?Ž@.Æe÷‡,_0¦ Ú\‘áõ€ÃëiW¬ýú¥oB¢¬¡ú—(Tbk]ò„ªòEÂ?®X'áwà ì]4ÎY™q<Äë4ç æ8š»rJUÚíï£ÍöƒC¥Šïyòº¯°³Er¶á´T„§)hî?k6¯v è+]zÚ ›¤Ó'p¯Í]ÿFˆ®_[ÕHÉ48¼¶`•Ü êƒîˆxYj¹Þ2Z)ci¥UÌHb¨ÀŒåIŸ ýæv¨”†"J:O?‘ùõ_ÁáÕt¦JÌš>–¤"«5kƒê÷aºˆÝFÃÉUÔùI ·5Ü>`Ž$‚I•õɪYX"©’RmA¤œAƹùÓG.ÌÏ¢¥ø‡;Ô&fÒ…&aÉ2wŽöåÐj<šOX –.âʵ©¾š\Y‡ÌX<ÇûUʧ&VÕŽl…”t͉äc„ ©€„l…Í‘ ˜£‰§¡é{mØ?ˆâ²`÷ ¶"±ùA£æ~†¡F~7„A@žŠ™Ø¸o›Ÿh7ç¾ ì~QðpIÃíÍE g˜x-ï1½„òÿdß²“в1ŒŒàOíŽ uœ§DUÈSóxÓÚGxªdí/j\Zt"­S1yæÔx·XoÜ$1Èt¥½[„iŽ5,©€£zZ^QÓALNŽ¢žóJ]p©Rº[·ÃyýC9 ýo°93Ùé´tÜGÔ'ªè`¹eéà(Í&Ó¬M5Øì<|å¹ÎÌ í?¼Ó¿%¨ãʇ^Ñ/•¥[¥ïžÆ¤ÈܨtQÀPåð€ýˆåÐY }¢ïu´ÐÚR…>ºý‹¼yˆrÿ’ÿPK ­<5ëé )Í ¶loch.hhpSD,UT†ØEPK ¼}<5Iô3Ø,% ¶&loch.hhcSD,UTÒEPK ·<5ä@£X Í ¶«loch.hhkSD,UTšØEPK WGì6þæJ™€ ¶loch.htmSD,UT&Ñ•FPKê therion/loch/help/Makefile0000664000175000017500000000004710507252532014565 0ustar useruserall: make -i -C ./en make -i -C ./sk therion/loch/help/sk/0000775000175000017500000000000012426431345013544 5ustar userusertherion/loch/help/sk/loch.chm0000664000175000017500000003406610645414732015175 0ustar useruserITSF`.ôÙ‚ý|ª{О  É"æìý|ª{О  É"æì`xTÌþ68ITSPT ÿÿÿÿÿÿÿÿ j’].!Ðù É"æìTÿÿÿÿÿÿÿÿÿÿÿÿPMGLÕ ÿÿÿÿÿÿÿÿ//#IDXHDRŠ /#ITBITS /#STRINGS«_>/#SYSTEM¡(/#TOPICSª@/#URLSTR«\/#URLTBLªS0 /$FIftiMainÝz¬ /$OBJINSTÈ;•?/$WWAssociativeLinks//$WWAssociativeLinks/PropertyÈ7/$WWKeywordLinks//$WWKeywordLinks/BTree· L/$WWKeywordLinks/DataÇY4/$WWKeywordLinks/MapÈ /$WWKeywordLinks/PropertyÈ /loch.hhc‡$ /loch.hhk‡$† /loch.htm(©e::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content¢.¬ ,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableÎ:0Fp ‡= Uncompressed MSCompressed{7FC28940-9D31-11D0VLZXC ‡Ó•F HHA Version 4.74.8702$ %‚SÄÇ loch.htm Loch Helploch loch.hhc loch.hhkYáY  T#SM×µF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"c`$_ëÿ™»s”cŒó)¸p€¯eZT/njª|e¡Î§®º»»ã¿âÎcœDèDPEPDô ÀÈμ \>( 0 ("èr`˜ «ïC¼m÷}Ußû®Ò$]´6Š:I½%a'ö¥Å+ääÒCí–bɾ úò5·+´¶m_MVømB±T¬k–Þ/ɲd£$¸9²éù;§„ãHHÀÀŠÖoÛîVmÑT”bå‰"&€#ôH>óÞ¿W~cbžiѵ™šO ÙšŠÙP5™Ø¹¶Eé©•Ó¤dkek ¿lm†Œ? ú+Áâÿ[&÷F£7†(–µtÚùvV%¨ dµ°Ð´JVBR„:óÅ™ÒÌ„O&€3äæ×Ó¼ŒÏ<mSù¤_ʹÙÜgp‹„BÑòÁ”›pÂ=i™Ì­ŒñÒB9üš!QAkÃбÀôQn!\Zò-±-¡S‚“…lî5·)A|Ç4U^¥‰ŒŽ¥™~Š§ÈˆbµaІUy(pEú &a)y*Ô?ç³µ»›§ŒyhyËEB^6À|gáhßlU“_FŒ)8<÷ãÀ&ñ‹gˆ[ZPñpìâRÁ`HÇ7ÅâÜAñ8‚ðØÙhçbenFàmc¹‰ªdÄÇvl”Q}È –ýÇŸ.üHÊã ¢h³ÑGfD0Ìd:™ßm³^‡f[ÜM9ÎfÄ£ô&ý=³¡Ç}X1ë'ÐnS~-hÐaÁü¿uÁF@ H™)k² çS(>ûQõ÷y5kKÚÚ™ÙÙP¢GQ~}êwP옿ZZe^ža<²Wç§‘•°Eó훤™aÿ~|ÕÝ<Žáúô£ÞO ±ï÷ÀJ˜¨OŒ,“¸çÙ­c3f|ì–\ÿƒÑ˜VOEÎèqH–œÇ ’^ă/w½+ê°³€Êe8„çõWƒ€ÌÝýB« X%þWÍû†¶xù¹p92JÖò•mß9¥‰…?æyTt³Å#1©§8ÝÜïg¤&/çüzùƒŽÀŸÊ˜a#e6ì¼Ø‰–G½q²/:¢;iHKDæË;X¦I*!äÁ´FTas2š@G hnÈK›ö§@h!Î>Ÿ‹ñÄ#W‹l…#%&Ž^…ÖDèM•lÙÊå+È‘C4ò,r|A™<ðRow‘ŠóÛÚKc¥ˆw1çG˜š\UÏÄq5³ÝˆÊb?vee-óá^ ±Q45fŸØŽÐëÈ6ˆíb~2.„z¼ùçW^ÞÞXdQ õê— ¾bh *޲vû‚!Ü÷.Dåmó{DèÉ«1‹9Q«çü…¥À rËQº²YÂNãqBeðTe,B÷Á|±sÓ¾fÿÒ#lüÿðæåXb†Ù³Ð:ŠòSl±ÕeÏÍÒ¨þ¦'34)¥Ç¶¥Ây%h,q ’×ÌÎWÙdKÑxm–Ë6éÁœYÔ9Ï/-á´ýÿ±¹Þ…qçPE)( mâ\³È…ºµ®±?÷[$~¦ÔLXŠÔƒ»i›ŽCZvHÐʯԒ9¢j\Ò„ Ë‚æÃ—`éþâ0·0£åÿ'6y Ä’‡G’`NËï1#¢m<ͩޭCñVøW:‡¤Xu_RÀóÃ\þŠBä®lXÐò™Âš¤-Ô4J¡æ¯4—HÄ›J³¨6b #@)¨ÒKÅÅpJO(RÏUߤ¶ó2ë…I½ÔÂ2´ý_FJõqZóc¨|k; ž9LO0t„£2ŠL³lí;j£èÎÄQԺע1¡¯Ðì:eܽÕÿ ÛXd?ž†ºEÑ–šíHª©ãQ(¸èPðª¤xã/Rn1©Y%× ÚIAfd#ŽŸ©ƒ|CŒ; ’©ÿ®w‘_?ȆÉß+1¤w`ÆI<ÿµË„;~ábˆìÈ2k§€ILç<±õ3§Šl+j'Ü»*õeiw@N¦€Ïƒ³±­â`¿Ïñ'ôG¢,ââlê@ê"D(ldžÅ20Ò탼ÆÀ&ÄôÖr°š(Ç#9MQy†ì¨¹QdéÇü†˜#ääå“´–ÂxͪMÆfÐ+Ë+(B™Ž,Ñôu½ð£üÝM³{æ=âÐd=-!} qæ8ŒuUDÝóú猤ݣR蟆>:¨^F»{ˆ'Ì!VÐ- ôò(íÈ,ž¹Ë޶à6Цk¹¬úù<1æ¤We[ú¡Ò9“:Êæˆï¤„ÛöQv‡-IÖ2¤qúmqË2LqR™“hÚÅY‰A .Æpâ*/µ€&ÊA¥¤*‘êÚ?žIŽœã·™ÉB=*±«ž WA™˜Ë—ÁðÙäÊO Ø^œ5UØäkˆ®¬:Ê-À‚9!,ÜOÎÒ|x/µåãÐÕ}ë€x«ÕAÀûêªx#59yLñ&ÉDÊTó £ö@(•Röéæi%¾u.GÎ ]0=Àr#M ”-8ll! Ù?º'ì±àÈŠ<{9³mÃìÄg]ê3'®b„sÜÿ0´ãÛÈÓ8½}4-KÉÅLÛ.â'‚ÆY¯× °ëK:{rèÈIv¦ÑÀð‚A‹©èÅmÙ“G·ST˜v3 ©ëðßTïê:¤o–ÔÔÍxeËÅNú/ í)ÜF5 (έþ#¨AšFsþszþMa¼ÒîsáWo°“3£'Êž,šD+}á‘‘oãDT{ ç¼P Wê­Yëš  öô_ž…4Ïgöö:DγèÈ™ÞÂë{@úÊÞ#”µà§ÉñÆŠÝŒò¼†}@@`1€æ?‚ú€€\à8ïB0c¢0¯@1ÄÐ. Êq¯— H\ØÀ6€x9\còÄo¤ÃøðDÄâŸ>ØØ©9PŽ9öØ&\acàž¬8P•ì^ HJOWãô{ƒW¢Oâ@"ryÕMæaö³ ›‡¼ÚBUË-ç_D±Ý“§ö§-žµJXJ…‡¯ð›0Pu·¢„o ä‡ÄeÑgÈq‹¾Uú-$'ü|…T ÷ÊòÃHiŒƒú°i*ƒPŸþb%צ‡/Òä%Áöš7¼À¥q¢¯ø¦"º6*ú„oã <øžÃwmòA|øÆ¢—¦8÷ÒSÑl7>öšŠ `|ãÑWlS"ö7‹¾è棠`lBl³²Ë(XÓ8øxC;e bEL”ŒÂÆ*3?p &³¨)Ž£/ h¹ BL€MÅâ·ýP4”\|±d  H¹‚TQ3ão‰£°#!7ÌmàŒ©QgÄ"#T ´7tFÜ(A£ØÈV ®x5èŠ\¾<2‡äL¦ßä ,t¤°ÔÇSŠw…û N²ÁÜÌ_"”Îk‹ƒdv3iÑ$XŒ]¶AFn¹IA”I™í7 BIØ|ÂÇ IÄÚ–ÆI ~bÕ¨F ÆÌ6Î ŽÄˆ367ëHƒ@I\Ò× Gb„šXpOÛdú™ƒ‰N¡ 4šü±Û¢‰ˆ¡ò1èh ‚'Mí¸ ¢&XEån›<¬AéD‚MF©òVMŽj:Èt$©Îýü¢ñpþŒÈ<„Œz?BFTŽÂâ0¦‡q0Œ£©8…Åa(Lãa*GSq8 ŠÃQ˜ÆÂT0ަâq‡£08Œ…©arÓ|Æ¡@ä…ÜèòÅ ØQ̬x;£è€êéXaÝ@K7Í”N—¾¥κë,ÙV)Δ¦›æzÝÀn·•Wçz5ÔuMuÜ»ïíÛOïSÑ©†é¸o¼ h†y£ó®OŸ[·ež‰q*0Çf7õA½h‡FߣP—½7óíê©R‘=»©S¼óBê€W•*{NHžˆLZ57¯¤ÍJ”ßAÎ7œs H°}÷øá„t>j5ªµ‘Ô\Zýs¿Ò\Šo^ è¯Yøß3Î!òa l³ftÑxIgz™ƒðÀ‹/ð€\j΃û:èŠê‚™ü€jÕaÃdz„4üt ÍÜð¶5ÛÁQÈ#Fˆ0âÛ¼â˜xM"IâŠÞ¸é5Àø-€c«¨ýèóƒe>Ìš¸õƒ+Û<w´´ºõÇéñ5À4Cݺ©^Öàjë¤~Í}çï|U7k€Ë•Ï… ù“ 7$7üÉ'¨L­’=€áf7¹(ÃI _έ3 2¬kHGËÄŸÓŽy”!_…3!FÏe-ˆCáÅÄ0¼ 䲓FÑ Ø'+i&F¾ŸC,Ý|Þð`ˆ†âw5ë’Aî³Ú ßÞdå;OlÊúÄábêûàWÏ(jðÞŸ/×î3ùÜ ~…FjÒ@MQ¸¡Ç·þÅgCÖ¼—"ÈpM¬!Û:Ó¦“g™¹} ’±Q•UôBn~0ëÆ!èÖþñ²¨áã®,œ¿œ§<|Ò¨¬ ÿ¼X~jËÓMH!8¦(6GB–yO·Ž• ‚ §¯á¼9*¸µµÉå>îY«‚lѪø'V¥ÛŽPï›8þŒ’+U/î…H² ¼p½mOÃX[„b¶¬ä*‚<úBm^üvшòè-„<1©Tâöºz¶Ž¼ÅoÐ8`)&ªQ3Hº³{„ÉÌU^ÉÎ…J™]`ëÃeI!ÇŸKFѸÜ3›£qÆe¥*l„çöd›K‰i‡Jhf„p …éuX[âPàSGç޺İODàå©É¯úX•@ßÛÉ»Ø;ì©x¿ ,>'q~æÿiM‰ËY<À{_¾'…Å–ƒKðÈæiµÕŸp?Ù‡ü2â¡<-OR‘Ø2㈠‡5>PòËA%;_J\¥VÕÞઅ=ìç©Ì˜=¯TÊ"=c)Ž6¬ìѹñ?E,d³G.+;.t —+ñÍQ󸼱g¢GÙJvúÌÎd©¬×[9Ñ`PZ‡IW'Q)'áñhúäxh÷ŸNˆ7ÊQÏ÷úsAê=uTÁ=2ó=UX^·ÆD_fºPîÆ72]Zƒ¢™v |>n›êÙ wž§¿Ï­¾×ò:}k7àùï{Û®‘6`¬/adZ^'éá!‚µÂ9_ªú„kÿÿ_ýÑG‚ ;é:ÈdÖÁø½„øúSäýì “Ç^gBùçY&"HK‘xo`u÷_°W00000000000000é?í5Iîפ¿¥Jå ÿÙT $½)¹“T›D]"]½â€ìMdxh·_¢kéÛü‹‘$“­­¢«Êe$ÅHÜÆûiïËï[{Ú?óñ_M@û @2ù= ¡¿D÷ÀüÜ;À0°00000000000000000000000000000000000000?0ð(V €therion/loch/help/sk/loch.hhp0000664000175000017500000000042710507017326015172 0ustar useruser[OPTIONS] Auto Index=Yes Compatibility=1.1 or later Compiled file=loch.chm Contents file=loch.hhc Default topic=loch.htm Display compile progress=Yes Full-text search=Yes Index file=loch.hhk Language=0x409 English (United States) Title=Loch Help [FILES] loch.htm [INFOTYPES] therion/loch/help/sk/Makefile0000664000175000017500000000026610507614400015201 0ustar useruserall: loch.htb loch.chm loch.chm: loch.hhp loch.hhc loch.hhk loch.htm hhc loch.hhp loch.htb: loch.hhp loch.hhc loch.hhk loch.htm zip loch.htb loch.hhp loch.hhc loch.hhk loch.htm therion/loch/help/sk/loch.hhk0000664000175000017500000000135310645414614015170 0ustar useruser
therion/loch/help/sk/loch.hhc0000664000175000017500000000160710645414600015155 0ustar useruser
therion/loch/help/sk/loch.htm0000664000175000017500000001212010645414724015202 0ustar useruser Loch

Loch

Obsah


Základné ovládanie

Funkcia Ovládanie Klávesa

Zoom & otáÄanie Ľavé tlaÄítko + posun
Iba zoom Ľavé tlaÄítko + posun hore/dole,
potom držaÅ¥ pravé a kliknúť ľavé tlaÄítko
Ctrl + Hore/Dolu
Iba otáÄanie Ľavé tlaÄítko + posun vľavo/vpravo,
potom držaÅ¥ ľavé a kliknúť pravé tlaÄítko
Vľavo/Vpravo
Posun Pravé tlaÄítko + posun Shift + Šípky
Sklon Stredné tlaÄítko (koliesko) + posun
alebo otáÄanie kolieska
Hore/Dole

Celá obrazovka Dvojklik ľavým tlaÄítkom F11
Menu Pravé tlaÄítko

Ak je zapnutá automatická rotácia, tak pohyb myšou mení rýchlosť alebo smer rotácie. Ak rotácia je zamknutá, tak pohyb myšou na ňu nemá vplyv.


Rendrovanie do súboru

Loch môže rendrovaÅ¥ obrázky vo vysokom rozlíšení, ktoré je možné následne spracovaÅ¥ a vytlaÄiÅ¥. Obrázky môžu byÅ¥ exportované v PDF, PNG alebo BMP formáte. Konfigurácia exportu sa robí prostredníctvom dialógového okna Nastavenie rendrovania. Môžete v ňom nastaviÅ¥ nasledovné:

Veľkosť a mierka

Kópia obrazovky Do súboru bude uložená presná kópia obrazovky.
Šírka obrázku Obsah obrazovky bude maÅ¥ Å¡pecifikovanú šírku.
Výška obrázku Obsah obrazovky bude maÅ¥ Å¡pecifikovanú výšku.
Mierka Obsah obrazovky bude exportovaný v danej mierke.

Nastavenia obrázku

Rozlíšenie Rozlíšenie obrázku pokiaľ sú špecifikované jeho rozmery alebo presná mierka.
VeľkosÅ¥ obrázku VypoÄítaná veľkosÅ¥ obrázku v bodoch a nekomprimovaných bajtoch podľa predchádzajúcich nastavení.
Biele pozadie Biele pozadie v exportovanom obrázku - používa sa pri tlaÄi.

 

Známe problémy

  • V exportovanom obrázku sa obÄas zobrazí prázdny Å¡tvoruholník. Zmena veľkosti okna tento problém obyÄajne vyrieÅ¡i.

Špecifické pre Windows

  • Textúry majú niekedy Äudnú farebnú vzorku, pomôže súbor znovu naÄítaÅ¥.
  • Farby chodieb sú náhodné. Treba reÅ¡tartovaÅ¥ program alebo poÄítaÄ.

Špecifické pre Linux

  • ObÄas nefunguje stereo mód.

therion/loch/help/sk/loch.htb0000664000175000017500000000613110645414730015171 0ustar useruserPK­<5ëé )Í3loch.hhpSD,qñM=cd`ia``P`@FF…ÎUT †ØEàR•Fi‘“FU±jÃ0†÷{ŠÛ¡!,<”&&âÁtP•‹%r–„tçí«8¥´Ë ßñÿ÷]×ÚªÙ?ám•;ÓTœ(Á»‚ûeÙÊ­X-Vè#²ŠóÊ2ñ’gÁ^›…6CÆNÈIúƒÑ°¡‹YP|°úË›«êG†èûH)ÍÇË‘ùEhL¤¢63œÝþ•_¡V®UOÅrZ/_qëz¶ÉàÓ‡³’’…Ó3´VrªÎ)ÜèÊªÞæ¯} «öeÓžw ßPKîHì6tîw¤3loch.hhcSD,qñM=cd`ia``P`@FF…ÎUT 0Ó•FàR•Fi‘“F­“ÍNÂ@€ÏšøCM¼••ă …hL¡K Þ–v  ÛnÝn‰<.G^Á“Ý-AšÈeÿ:óÍ×íÔªÙ^ÏŸOø#&³®;ìa2tü>!¶oë'„8c£}ui©žŽ­æ%…”&Ø2œ±3íøÞÔ€€§SÙ2Fq xΗòFàªY Ëà™‹uñ îê ãФÌL|-âMËèU Óßfø…(ñM’H&¬ ADE޲UÈ¥y¯!5Ó„§XbB3hÔoÁ4Õ)ѲV׳çjëuž²äpy™™à c®PVFM¯6Lè +‘ eEyÒç,D¡‹’ ¨–3W§ºÃ6üQ¦4Óøïüq9ÑÞ"§Ñ/A.(;F1DõòŸÿ-ÿ²[3¦{à¶ iãÉ.×ê› ÎÎî4Å4|£d ä¿/¸(N×Ré(âtuþËJw‰nÛ'ÛÓºÅ*ÿ!cÝ?ÑZ¶mõ¯}PKôHì6l9‚=73loch.hhkSD,qñM=cd`ia``P`@FF…ÎUT <Ó•FàR•Fi‘“F­’¿nÂ0Æg*õŽTê\¤n5H$q U ˆUts7‰ðŸÈ1¨<.#¯Ð©q‚º´‹Ow¾»ï§Ó‡ûAäÇ›%i<a¹ö™Ž‹ÐŒÄÏqÐþ DÎøöÛ¤dØ(˜¡ ©`#ç…,ÈjG+R% “fäÌËT«Z}š{Íò§NdÊxïJoëBUð8¶‹û® o¥a‚V0<€ëÚ*ju°›®­v‡³1àÈ{%~ æP5Ú†}Twãv]¯‡+ª©8£-š×=å»&‰’šÿ4…*¥ü·‹«´FœQ'wùã–ÓLž@íù1£²d³ÜùÍ]µâWgZ1™iµ·0)¨¿¥w—cÙq¦K™_ÿXò(TZ%ü$—y»¼þƒQëŒZ;5Þê¼üPKIì6½‘áŽHå3loch.htmSD,qñM=cd`ia``P`@FF…ÎUT „Ó•FàR•Fi‘“FÅXÍnÛF>§@ßaªA‹Ú"œ\І YRmD¶Gq‘Ü–âÚ¢¹ä²Ë%kê rñ;T‡rð)=¹°{ ô<}…Îr)Š’ÿèØAuÑ.¹;óÍÌ7³Ãý÷ïÌïÚû[ƒwýγíÁnúo[½­gµuÃØé º†Ñ´³7†ÑÙ«5¾ýÆTü0·;Ív6±G%‘”Á:ý=râÍÚ÷%õåú h †z¶Y“ôT#é±W0R¹É£õŸksAƒA¯ÓèñáÈ4ô8ÓeÊÌÖ~ûÝ|uwoÝæVg³¶MYL¥3$sQ áF. ‹‡/ûVHÔÓ‹§o{Åg½Ò çMØ>èt7kß+³gµÆûtâ2bûé'à1K'6ñjÍJR¨oSáøÇµ† «Ý`sÓ ‹‹¨ª Vt"?xÁ-–~òµÛ4J›L£džÙo˜­ƒÒ»þbÜ„½ænGG/3³½u‹Ñe?–€›ƒf«×!eìM@†hîfíE-›÷‰mçó²ŠÁÁ²ƒ6ÄMæûHÔw£ùîÐ!¦ÑBí{×ï—pVÜòwÄ4¼INî,m¤: ‚â^¢°í•÷†´ mÛ{Î=xN¼àp™N¦gÚ¬ûLš^’#&™ž¥çÒåð<Œü Þx˜ù«Ûw,cýŒ0â‚6gt­ÌZý ¸DØbvEf‘ÿ™ .s\?½ÀGÓ«±÷#Ù’‚¡òm¥¶ÍYô.x’`A¬ŒáF¬Ìä÷:#·¼ìŒÜ?qÆ¡Öy˜é|¤'úÕ(×_EY­oFΑÄå³?ÓóÀM‰÷Ëx¥RЬ"–ÿàræÐÐå?௅‹0jñ5 ßCîW9çæ*þßê´E±n·ó¸Š혟(vj®^z%V¨ÝGx—ú«Ù]…«š8Q§bù4^¬lºpBaL?B^‰0£ ö4.N„¢ ž|k ‰‹¤%xÉlÂ#𨟞ƒH/‡#ÆCÌtͭУb!;ßOëJË\˜Vç¹™¾$ûfðzˆ X×oìîh)°9(ÚŠJ}Ïr?ÑÏ:8ðÒ¿fWD¾ mD¢¥“±›@Ì!NBޤA³Æ,=ŸM”?ÖÀ•\`äÐDÏ®TŠbŸ2ÌVZ _ˆµm¨E”ÅÙ™}¬Ãþ\A¦;+Á%ô4àB*Ü(.†~»»ý½_s·vûpÄ:KÒzIÇkî9Ç‘Ð>×2" ¶0rظ…ºŠœe¬Š¸CXúù˜#ñFX#\ ƒÙÙmì‘P’˜*—‰Â}˜høª¬m7󕤈oö¥ùÙ6´IÐ|#ø_–‚4zÙ8¤Ó+W³<‡ •Áø¸X"‰ÅèCš9)®UŸå,AدÓÏCžûV¼šWŽ$3h¥ݰ¿]°¬È¦1Œ2F~‚þ¤¡úw3éEIJê×*ÜÆJˆÕÙ‚¾) +ŠDgŸ 8¶§˜7›tè9nƬ œ+-ÑS>L/g“¯8δ< àÝœ|_ް”¤—˜ØýÓÍiz'@œ(’/¥E‘sÎûêyqP2Õ3VòDyK«¹ëé•Ê”•˜©ÂˆÅK&I^ÀòÌ)+ÒµàI˜8¯0_ÄÅÃ$àÙ LTjÇEµ*LÁâ¶:+žWxÂñ4ð™EN¤zp»²"4ÙŽðqLNÒ‹¡ƒ‹ü<æéy} Òã]Ðr(£Úü€‰]9ºÙFÈ÷ © Šc/\°Ž+¢ÙUzuº tßâ<Œöý††xãÕ€¾rX¹¸vqÛ•@ÄÊ[™³dõá-f…*÷°KñcRezvdâ+ÛOÔxbŠhĆ˭Ã{l†ÈœÒч§º{âËA×HQn‚‚O|ôi":›(W•`™F ±¹ýë¿N"ìÉ>)îÀoŽoó?B4¹Tî¸MÐS™^`ÆyŠo€ÙêR;éYd«BzDµ²Š:æx¬aDóÞGv0öy¬3 بܦ¨K„•ÀpÄ‘1VV0J8Ãԯõ`ûK’9<û>äÇ‚xóRgÛô¬~Ç]ÒMé9~tZÙû:²>=Šü㛵PRA9v]Ÿí»4cËYÐÓ4ÔE`61ü~è›ÊÿPK ­<5ëé )Í ¶loch.hhpSD,UT†ØEPK îHì6tîw¤ ¶&loch.hhcSD,UT0Ó•FPK ôHì6l9‚=7 ¶öloch.hhkSD,UT<Ó•FPK Iì6½‘áŽHå ¶†loch.htmSD,UT„Ó•FPK' therion/loch/lxOGLFT.h0000664000175000017500000024033112047414660013572 0ustar useruser// -*- c++ -*- /* * OGLFT: A library for drawing text with OpenGL using the FreeType library * Copyright (C) 2002 lignum Computing, Inc. * $Id: OGLFT.h,v 1.15 2003/10/01 14:41:09 allen Exp $ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef OGLFT_H #define OGLFT_H #ifndef LXDEPCHECK #ifndef OGLFT_NO_WX #include #include #else #include #endif #include #include #include #include #ifdef HAVE_MPATROL #include #endif #ifdef LXMACOSX #include #include #else #include #include #endif #ifndef OGLFT_NO_SOLID #define OGLFT_NO_SOLID #endif #ifndef OGLFT_NO_SOLID #include #endif #include #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_OUTLINE_H #include FT_TRIGONOMETRY_H #endif //! All of OGLFT C++ objects are in this namespace. namespace OGLFT { //! Thanks to DesCartes, I'd consider these manifest constants. enum Coordinates { X, //!< The X component of space Y, //!< The Y component of space Z, //!< The Z component of space W //!< The projection component of space }; //! Who to credit? Newton? I'd consider these manifest constants. enum ColorSpace { R, //!< The Red component of a color G, //!< The Green component of a color B, //!< The Blue component of a color A, //!< The Alpha (or transparency) of a color }; //! Callback from GLU tessellation routines. typedef void (*GLUTessCallback)(); //! The FreeType library instance. /*! * The FreeType library has a single, global instance of a library * handle. This reference is used to load font faces. This detail * is generally hidden from the user of OGLFT, however, it * can be useful to get the FT_Library instance if you want to open * a font file yourself, either from disk or embedded in the program. */ class Library { public: /*! * The FreeType library's library handle is only available through this * accessor method. * \return the global OGLFT FreeType library handle. */ static FT_Library& instance ( void ); protected: /*! * The constructor for this class is automatically called when * this library is loaded. Access the instance through the instance() * method. */ Library ( void ); /*! * This destructor is automatically called when the program exits. */ ~Library( void ); private: static Library library; static FT_Library library_; }; //! Advance describes the "advance" of a glyph, namely the distance in //! model space at which the NEXT glyph should be drawn. This class exists //! to assist the computation of string metrics. struct Advance { float dx_; //!< Advance increment in the X direction. float dy_; //!< Advance increment in the Y direction. //! Default constructor. An otherwise uninitialized Advance contains zeros. Advance ( float dx = 0, float dy = 0 ) : dx_( dx ), dy_( dy ) {} //! Initialize an advance from a FreeType advance member. Advance ( FT_Vector v ) { dx_ = v.x / 64.; dy_ = v.y / 64.; } //! Increment Advance with a FreeType advance member. //! \return a reference to oneself. Advance& operator+= ( const FT_Vector v ) { dx_ += v.x / 64.; dy_ += v.y / 64.; return *this; } }; //! Describe the metrics of a glyph or string relative to the origin //! of the first character struct BBox { float x_min_; //!< The left-most position at which "ink" appears. float y_min_; //!< the bottom-most position at which "ink" appears. float x_max_; //!< The right-most position at which "ink" appears. float y_max_; //!< The top-most position at which "ink" appears. Advance advance_; //!< The (total) advancement //! Default constructor is all zeros. BBox () : x_min_( 0 ), y_min_( 0 ), x_max_( 0 ), y_max_( 0 ) {} /*! *(Partially) initialize a BBox from a FreeType bounding box member. *(The advancement is initialized to zero by its default constructor). * \param ft_bbox a FreeType bounding box as retrieved from * \c FT_Glyph_Get_CBox. */ BBox ( FT_BBox ft_bbox ) { x_min_ = ft_bbox.xMin / 64.; y_min_ = ft_bbox.yMin / 64.; x_max_ = ft_bbox.xMax / 64.; y_max_ = ft_bbox.yMax / 64.; } //! Scale the bounding box by a constant. //! \param k a constant to scale the bounding box by. //! \return a reference to oneself. BBox& operator*= ( double k ) { x_min_ *= k; y_min_ *= k; x_max_ *= k; y_max_ *= k; advance_.dx_ *= k; advance_.dy_ *= k; return *this; } /*! * Merge a bounding box into the current one (not really addition). * Each time a BBox is "added", the current BBox is expanded to include * the metrics of the new BBox. May only work for horizontal fonts, though. * \param b the bounding box to merge. * \return a reference to oneself. */ BBox& operator+= ( const BBox& b ) { float new_value; new_value = b.x_min_ + advance_.dx_; if ( new_value < x_min_ ) x_min_ = new_value; new_value = b.y_min_ + advance_.dy_; if ( new_value < y_min_ ) y_min_ = new_value; new_value = b.x_max_ + advance_.dx_; if ( new_value > x_max_ ) x_max_ = new_value; new_value = b.y_max_ + advance_.dy_; if ( new_value > y_max_ ) y_max_ = new_value; advance_.dx_ += b.advance_.dx_; advance_.dy_ += b.advance_.dy_; return *this; } }; //! During tesselation of a polygonal Face (outline, filled or solid), //! an object which implements this interface can be used to compute a //! different color for each vertex. class ColorTess { public: //! Compute a color for this position. Note that the position is //! in the glyph's local coordinate system. //! \param p vertex position in glyph's local coordinate system. Argument is //! a GLdouble[3]. //! \return GLfloat[4] (RGBA) color specification. virtual GLfloat* color ( GLdouble* p ) = 0; virtual ~ColorTess(); }; //! During tesselation of a polygonal Face (outline, filled or solid), //! an object which implements this interface can be used to compute a //! different texture coordinate for each vertex. class TextureTess { public: //! Compute a texture coordinate for this position. Note that the //! position is in the glyph's local coordinate system. //! \param p vertex position in glyph's local coordinate system. Argument is //! a GLdouble[3]. //! \return GLfloat[2] (s,t) texture coordinates. virtual GLfloat* texCoord ( GLdouble* p ) = 0; virtual ~TextureTess(); }; //! The argument to setCharacterDisplayLists is an STL vector of //! OpenGL display list names (GLuints). typedef std::vector DisplayLists; //! A convenience definition of an iterator for display list vectors. typedef DisplayLists::const_iterator DLCI; //! A convenience definition of an iterator for display list vectors. typedef DisplayLists::iterator DLI; //! A face (aka font) used to render text with OpenGL. /*! * This is an abstract class, but it does define most the functions that * you are likely to call to manipulate the rendering of the text. */ class Face { public: //! Thanks to the standard formerly known as PHIGS. Horizontal text //! justification constants. enum HorizontalJustification { LEFT, //!< Left justified justification of text ORIGIN, //!< Natural origin alignment of text (default) CENTER, //!< Center justified alignment of text RIGHT //!< Right justified alignment of text }; //! Thanks to the standard formerly known as PHIGS. Vertical text //! justification constants. enum VerticalJustification { BOTTOM, //!< Descender alignment of text BASELINE, //!< Baseline alignment of text (default) MIDDLE, //!< Centered alignment of text TOP //!< Ascender justification of text }; //! Control how OpenGL display lists are created for individual glyphs. //! The default mode is to create display lists for each glyph as it //! is requested. Therefore, the Face drawing routines cannot themselves //! be called from within an open display list. In IMMEDIATE mode, //! cached glyphs will be drawn if available, otherwise the FreeType //! data for a glyph is re-rendered each time. enum GlyphCompileMode { COMPILE, //!< Compile new glyphs when seen for the first time. IMMEDIATE //!< Do not \em create display lists for glyphs. }; private: //! We allow a Face to be constructed either from a file name //! or passed in as an already opened FreeType FT_Face. In the case //! of the later (already opened), we don't close the FT_Face on //! destruction. This way you can share FT_Faces between related //! OGLFT faces. Also, we're experimenting with being able to use //! multiple FT_Faces in a single OGLFT Face, so this is represented //! as a data structure. struct FaceData { FT_Face face_; bool free_on_exit_; FaceData ( FT_Face face, bool free_on_exit = true ) : face_( face ), free_on_exit_( free_on_exit ) {} }; protected: //! The FreeType face - experimentally, this is now an array of //! faces so that we can handle a wider range of UNICODE points //! in case a face doesn't cover the points of interest. std::vector< FaceData > faces_; //! Did a font load OK? bool valid_; //! Glyph display list creation mode. enum GlyphCompileMode compile_mode_; //! Nominal point size. float point_size_; //! Display resolution in pixels per inch. FT_UInt resolution_; //! Does rendering text affect the MODELVIEW matrix? bool advance_; //! Foreground color (I really wanted to avoid this, but not really //! possible without state queries, which you can't put into //! display lists. Anyway, you'll be able to get even more fancy //! by passing in a function to map the color with, so why balk at //! this?) GLfloat foreground_color_[4]; //! Background color (what modes would use this?) GLfloat background_color_[4]; //! PHIGS-like horizontal positioning of text. enum HorizontalJustification horizontal_justification_; //! PHIGS-like vertical positioning of text. enum VerticalJustification vertical_justification_; //! Rotate an entire string in the Z plane GLfloat string_rotation_; //! Let the user decide which character to use as the rotation reference. //! Use "o" by default, I suppose. FT_UInt rotation_reference_glyph_; //! The rotation reference character could be in any face. FT_Face rotation_reference_face_; //! These are the translation offsets provided by the rotation reference //! character; for whom, we've discovered, only the Y position is relevant. GLfloat rotation_offset_y_; //! Type of the cache of defined glyph to display list mapping. typedef std::map< FT_UInt, GLuint > GlyphDLists; //! A convenience definition of the iterator over the glyph to display //! list map. typedef GlyphDLists::const_iterator GDLCI; //! A convenience definition of the iterator over the glyph to display //! list map. typedef GlyphDLists::iterator GDLI; //! Cache of defined glyph display lists GlyphDLists glyph_dlists_; //! The user can supply an array of display list which are invoked //! before each glyph is rendered. DisplayLists character_display_lists_; public: /*! * Construct a Face by loading a font from the given file. * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Face ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * Alternatively, the user may have already opened a face and just * wants to draw with it. This is useful for Multiple Master fonts or * combining multiple files to increase UNICODE point coverage. * \param face open Freetype FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Face ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * Deleting a Face frees its FreeType face (and anything else it's * styles have allocated). */ virtual ~Face ( void ); /*! * Let the user test to see if the font was loaded OK. * \return true if the FT_Face was successfully created. */ bool isValid ( void ) const { return valid_; } /*! * Add another FT_Face to the OGLFT Face. Generally used to add more * coverage of UNICODE points (at least that's the plan). This * routine takes a filename and takes ownership of the FT_Face. * \param filename name of file containing font face data. * \return true if face was successfully added. */ bool addAuxiliaryFace ( const char* filename ); /*! * Add another FT_Face to the OGLFT Face. Generally used to add more * coverage of UNICODE points (at least that's the plan). This * routine takes an already open FT_Face. The user is responsible * for clean up. * \param face open FreeType FT_Face * \return true if face was successfully added. */ bool addAuxiliaryFace ( FT_Face face ); /*! * By default, each time a new character is seen, its glyph is rendered * into a display list. This means that a display list cannot already * be open (since OpenGL doesn't allow nested display list creation). * Rendering can be set into immediate mode in which case glyphs are * rendered from display lists if available, but are otherwise generated * anew each time. * \param compile_mode the new compile mode. */ void setCompileMode ( enum GlyphCompileMode compile_mode ) { compile_mode_ = compile_mode; } /*! * \return the current glyph compile mode. */ enum GlyphCompileMode compileMode ( void ) const { return compile_mode_; } /*! * For the rasterized styles (Monochrome, Grayscale, Translucent, Texture), * glyphs are rendered at the pixel size given by: * * point_size [pts] * / 72 [pts/in] * resolution [dots/in] = [dots]. * * For the polygon styles (Outline, Filled, Solid), the "nominal" size of * the glyphs is: * * point_size[pts] / 72 [pts/in] * resolution [dots/in] * / units_per_EM [font unit/EM] = [dots * EM]. * * If the MODELVIEW and PROJECTION matrices are such that one screen pixel * corresponds to one modeling unit, then polygonal Faces will * be the same size as raster Faces. * * Note that changing the point size after Face creation will invalidate * the cache of OpenGL display lists and any other information which * the individual styles have cached. * \param point_size the new point size in points (1/72-th inch). */ void setPointSize ( float point_size ); /*! * \return the current point size. */ float pointSize ( void ) { return point_size_; } /*! * For the rasterized styles (Monochrome, Grayscale, * Translucent, Texture), the exact rendered size of the glyphs depends on * the resolution of the display (as opposed to the polygon styles * whose size is controlled by the viewing matrices). The Texture * style is slightly different because the glyphs are texture-mapped * onto an arbitrary rectangle; here, the resolution only controls * how accurately the glyph is rendered. * \param resolution the resolution in DPI (dots per inch). */ void setResolution ( FT_UInt resolution ); /*! * \return the current raster resolution. */ FT_UInt resolution ( void ) { return resolution_; } /*! * If advance is true, then the changes made to the MODELVIEW matrix * to render a string are allowed to remain. Otherwise, the library * pushes the current MODELVIEW matrix onto the matrix stack, renders * the string and then pops it off again. Rendering a character always * modifies the MODELVIEW matrix. * \param advance whether or not the MODELVIEW matrix should be left * translated by the advancement of a rendered string. */ void setAdvance ( bool advance ) { advance_ = advance; } /*! * \return the advance value. */ bool advance ( void ) const { return advance_; } /*! * This is the nominal color of the glyphs. A lot of other things * can alter what you actually see! Note that changing the foreground * color invalidates the glyph cache. * \param red the red component of the foreground color. * \param green the green component of the foreground color. * \param blue the blue component of the foreground color. * \param alpha the alpha component of the foreground color. */ void setForegroundColor ( GLfloat red = 0.0, GLfloat green = 0.0, GLfloat blue = 0.0, GLfloat alpha = 1.0 ); /*! * This is the nominal color of the glyphs. A lot of other things * can alter what you actually see! Note that changing the foreground * color invalidates the glyph cache. * \param foreground_color an array of 4 values corresponding to the * red, green, blue and alpha components of the foreground color. */ void setForegroundColor ( const GLfloat foreground_color[4] ); #ifndef OGLFT_NO_WX /*! * This is the nominal color of the glyphs. A lot of other things * can alter what you actually see! Note that changing the foreground * color invalidates the glyph cache. * \param foreground_color the foreground color as an unsigned int. */ void setForegroundColor ( const wxColour foreground_color ); #endif /* OGLFT_NO_WX */ /*! * \return the red component of the foreground color */ GLfloat foregroundRed ( void ) const { return foreground_color_[R]; } /*! * \return the green component of the foreground color */ GLfloat foregroundGreen ( void ) const { return foreground_color_[G]; } /*! * \return the blue component of the foreground color */ GLfloat foregroundBlue ( void ) const { return foreground_color_[B]; } /*! * \return the alpha component of the foreground color */ GLfloat foregroundAlpha ( void ) const { return foreground_color_[A]; } /*! * This is the nominal background color of the glyphs. A lot of other things * can alter what you actually see! Note that changing the background * color invalidates the glyph cache. * \param red the red component of the background color. * \param green the green component of the background color. * \param blue the blue component of the background color. * \param alpha the alpha component of the background color. */ void setBackgroundColor ( GLfloat red = 1.0, GLfloat green = 1.0, GLfloat blue = 1.0, GLfloat alpha = 0.0 ); /*! * This is the nominal background color of the glyphs. A lot of other things * can alter what you actually see! Note that changing the background * color invalidates the glyph cache. * \param background_color an array of 4 values corresponding to the * red, green, blue and alpha components of the background color. */ void setBackgroundColor ( const GLfloat background_color[4] ); #ifndef OGLFT_NO_WX /*! * This is the nominal background color of the glyphs. A lot of other things * can alter what you actually see! Note that changing the background * color invalidates the glyph cache. * \param background_color the background color as an unsigned int. */ void setBackgroundColor ( const wxColour background_color ); #endif /* OGLFT_NO_WX */ /*! * \return the red component of the background color */ GLfloat backgroundRed ( void ) const { return background_color_[R]; } /*! * \return the green component of the background color */ GLfloat backgroundGreen ( void ) const { return background_color_[G]; } /*! * \return the blue component of the background color */ GLfloat backgroundBlue ( void ) const { return background_color_[B]; } /*! * \return the alpha component of the background color */ GLfloat backgroundAlpha ( void ) const { return background_color_[A]; } /*! * Set the individual character rotation in the Z direction. * \param character_rotation_z angle in degrees of z rotation. */ virtual void setCharacterRotationZ ( GLfloat character_rotation_z ) = 0; /*! * \return the character rotation in the Z direction. */ virtual GLfloat characterRotationZ ( void ) const = 0; /*! * The z rotation angle needs a center. Nominate a character whose * center is to be the center of rotation. By default, use "o". * \param c rotation reference character. */ void setCharacterRotationReference ( unsigned char c ); /*! * Rotate an entire string through the given angle (in the Z plane only). * (Somewhat pointless for the vector styles since you can do mostly * the same thing with the MODELVIEW transform, however, for what its * worth, this routine uses the FreeType rotation function to compute * the "proper" metrics for glyph advance.) * \param string_rotation angle in degrees of z rotation. */ void setStringRotation ( GLfloat string_rotation ); /*! * \return the (Z plane) string rotation angle. */ GLfloat stringRotation ( void ) const { return string_rotation_; } /*! * Set the horizontal justification. * \param horizontal_justification the new horizontal justification. */ void setHorizontalJustification ( enum HorizontalJustification horizontal_justification ) { horizontal_justification_ = horizontal_justification; } /*! * \return the horizontal justification. */ enum HorizontalJustification horizontalJustification ( void ) const { return horizontal_justification_; } /*! * Set the vertical justification. * \param vertical_justification the new vertical justification */ void setVerticalJustification ( enum VerticalJustification vertical_justification ) { vertical_justification_ = vertical_justification; } /*! * \return the vertical justification. */ enum VerticalJustification verticaljustification ( void ) const { return vertical_justification_; } /*! * Specify an OpenGL display list to be invoked before * each character in a string. Face makes a copy of the argument. Pass * an empty DisplayLists to disable this feature. * \param character_display_lists STL vector containing a display * list to invoke before each glyph in a string is drawn. */ void setCharacterDisplayLists ( const DisplayLists& character_display_lists ) { character_display_lists_ = character_display_lists; } /*! * \return a reference to the array of character display lists. This is * the live list as stored in the Face. */ DisplayLists& characterDisplayLists ( void ) { return character_display_lists_; } /*! * \return the height (i.e., line spacing) at the current character size. */ virtual double height ( void ) const = 0; /*! * Compute the bounding box info for a character. * \param c the (latin1) character to measure. * \return the bounding box of c. */ virtual BBox measure ( unsigned char c ) = 0; #ifdef _UNICODE #ifndef OGLFT_NO_WX /*! * Compute the bounding box info for a character. * \param c the (UNICODE) character to measure. * \return the bounding box of c. */ virtual BBox measure ( const wxChar c ) = 0; #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ /*! * Compute the bounding box info for a string. * \param s the (latin1) string to measure. * \return the bounding box of s. */ virtual BBox measure ( const char* s ); /*! * Compute the bounding box info for a string without conversion * to modeling coordinates. * \param s the (latin1) string to measure. * \return the bounding box of s. */ virtual BBox measureRaw ( const char* s ); #ifndef OGLFT_NO_WX /*! * Compute the bounding box info for a string. * \param s the (UNICODE) string to measure. * \return the bounding box of s. */ virtual BBox measure ( const wxString& s ); /*! * Compute the bounding box info for a real number formatted as specified. * \param format (see draw for valid formats) * \param number real number. * \return the bounding box of the formatted number. */ virtual BBox measure ( const wxString& format, double number ); /*! * Compute the bounding box info for a string without conversion * to modeling coordinates. * \param s the (UNICODE) string to measure. * \return the bounding box of s. */ virtual BBox measureRaw ( const wxString& s ); #endif /* OGLFT_NO_WX */ /*! * Compile a string into an OpenGL display list for later * rendering. Essentially, the string is rendered at the origin * of the current MODELVIEW. Note: no other display lists should * be open when this routine is called. Also, the Face does not * keep track of these lists, so you must delete them in order * to recover the memory. * \param s the (latin1) string to compile. * \return the display list name for the string. */ GLuint compile ( const char* s ); #ifndef OGLFT_NO_WX /*! * Compile a string into an OpenGL display list for later * rendering. Essentially, the string is rendered at the origin * of the current MODELVIEW. Note: no other display lists should * be open when this routine is called. Also, the Face does not * keep track of these lists, so you must delete them in order * to recover the memory. * \param s the (UNICODE) string to compile. * \return the display list name for the string. */ GLuint compile ( const wxString& s ); #endif /* OGLFT_NO_WX */ /*! * Compile a single character (glyph) into an OpenGL display list * for later rendering. The Face \em does keep track of these * display lists, so do not delete them. * \param c the (latin1) character to compile. * \return the display list name for the character. */ GLuint compile ( unsigned char c ); #ifndef OGLFT_NO_WX /*! * Compile a single character (glyph) into an OpenGL display list * for later rendering. The Face \em does keep track of these * display lists, so do not delete them. * \param c the (UNICODE) character to compile. * \return the display list name for the character. */ GLuint compile ( const wxChar c ); #endif /* OGLFT_NO_WX */ /*! * Draw a (latin1) string using the current MODELVIEW matrix. If * advance is true, then the final glyph advance changes to the * MODELVIEW matrix are left in place. * \param s the (latin1) string to draw. */ void draw ( const char* s ); #ifndef OGLFT_NO_WX /*! * Draw a (UNICODE) string using the current MODELVIEW * matrix. If advance is true, then the final glyph advance * changes to the MODELVIEW matrix are left in place. * \param s the (UNICODE) string to draw. */ void draw ( const wxString& s ); #endif /* OGLFT_NO_WX */ /*! * Draw the character using the current MODELVIEW matrix. Note that * the MODELVIEW matrix is modified by the glyph advance. Draw a * string if you don't want the MODELVIEW matrix changed. * \param c the (latin1) character to draw. */ void draw ( unsigned char c ); #ifndef OGLFT_NO_WX /*! * Draw the character using the current MODELVIEW matrix. Note that * the MODELVIEW matrix is modified by the glyph advance. Draw a * string if you don't want the MODELVIEW matrix changed. * \param c the (UNICODE) character to draw. */ void draw ( const wxChar c ); #endif /* OGLFT_NO_WX */ /*! * Draw the (latin1) character at the given 2D point. Note that * the MODELVIEW matrix is modified by the glyph advance. Draw * a string if you don't want the MODELVIEW matrix changed. * \param x the X position. * \param y the Y position. * \param c the (latin1) character to draw. */ void draw ( GLfloat x, GLfloat y, unsigned char c ); /*! * Draw the (latin1) character at the given 3D point. Note that * the MODELVIEW matrix is modified by the glyph advance. Draw * a string if you don't want the MODELVIEW matrix changed. * \param x the X position. * \param y the Y position. * \param z the Z position. * \param c the (latin1) character to draw. */ void draw ( GLfloat x, GLfloat y, GLfloat z, unsigned char c ); #ifndef OGLFT_NO_WX /*! * Draw the (UNICODE) character at the given 2D point. Note that * the MODELVIEW matrix is modified by the glyph advance. Draw * a string if you don't want the MODELVIEW matrix changed. * \param x the X position. * \param y the Y position. * \param c the (UNICODE) character to draw. */ void draw ( GLfloat x, GLfloat y, wxChar c ); /*! * Draw the (UNICODE) character at the given 3D point. Note that * the MODELVIEW matrix is modified by the glyph advance. Draw * a string if you don't want the MODELVIEW matrix changed. * \param x the X position. * \param y the Y position. * \param z the Z position. * \param c the (UNICODE) character to draw. */ void draw ( GLfloat x, GLfloat y, GLfloat z, wxChar c ); #endif /* OGLFT_NO_WX */ /*! * Draw a string at the given 2D point. * \param x the X position. * \param y the Y position. * \param s the (latin1) string to draw. */ void draw ( GLfloat x, GLfloat y, const char* s ); /*! * Draw a string at the given 3D point. * \param x the X position. * \param y the Y position. * \param z the Z position. * \param s the (latin1) string to draw. */ void draw ( GLfloat x, GLfloat y, GLfloat z, const char* s ); #ifndef OGLFT_NO_WX /*! * Draw a string at the given 2D point. * \param x the X position. * \param y the Y position. * \param s the (UNICODE) string to draw. */ void draw ( GLfloat x, GLfloat y, const wxString& s ); /*! * Draw a string at the given 3D point. * \param x the X position. * \param y the Y position. * \param z the Z position. * \param s the (UNICODE) string to draw. */ void draw ( GLfloat x, GLfloat y, GLfloat z, const wxString& s ); /*! * Draw a real number per the given format at the given 2D point. * \param x the X position. * \param y the Y position. * \param format Like a typical printf format. Regular text is printed * while a '%' introduces the real number's format. Includes the * following format flags: * \li %%x.yf - floating point in field width x and precision y * \li %%x.ye - scientific notation in field width x and precision y * \li %%x.yg - pick best floating or scientific in field width x and * precision y * \li %%p - draw as a proper fraction, e.g. 1 1/2. Note: this currently * requires a special font which encodes glyphs to be drawn for the * numerator and demoninator in the UNICODE Private Area (0xE000). * * \param number the numeric value. */ void draw ( GLfloat x, GLfloat y, const wxString& format, double number ); /*! * Draw a real number per the given format at the given 3D point. * \param x the X position. * \param y the Y position. * \param z the Z position. * \param format Like a typical printf format. Regular text is printed * while a '%' introduces the real number's format. Includes the * following format flags: * \li %%x.yf - floating point in field width x and precision y * \li %%x.ye - scientific notation in field width x and precision y * \li %%x.yg - pick best floating or scientific in field width x and * precision y * \li %%p - draw as a proper fraction, e.g. 1 1/2. Note: this currently * requires a special font which encodes glyphs to be drawn for the * numerator and demoninator in the UNICODE Private Area (0xE000). * * \param number the numeric value. */ void draw ( GLfloat x, GLfloat y, GLfloat z, const wxString& format, double number ); #endif /* OGLFT_NO_WX */ /*! * \return the nominal ascender from the face. This is in "notional" * units. */ int ascender ( void ) { return faces_.front().face_->ascender; } /*! * \return the nominal descender from the face. This is in "notional" * units. */ int descender ( void ) { return faces_.front().face_->descender; } protected: // The various styles override these routines //! Some styles, in particular the Texture, need specialized steps //! to compile a glyph into an OpenGL display list. //! \param face the FT_Face containing the glyph. //! \param glyph_index the index of the glyph in face. //! \return the display list of the compiled glyph. virtual GLuint compileGlyph ( FT_Face face, FT_UInt glyph_index ) = 0; //! Each style implements its own glyph rendering routine. //! \param face the FT_Face containing the glyph. //! \param glyph_index the index of the glyph in face. virtual void renderGlyph ( FT_Face face, FT_UInt glyph_index ) = 0; //! There is a slight different between the way in which the polygonal //! and raster styles select the character size for FreeType to generate. virtual void setCharSize ( void ) = 0; //! The different styles have different caching needs (well, really only //! the texture style currently has more than the display list cache). virtual void clearCaches ( void ) = 0; //! The polygonal and raster styles compute different values for the //! Z rotation offset. (It's in integer pixels for the raster styles and //! in floating point pixels for the polygonal styles.) virtual void setRotationOffset ( void ) = 0; private: void init ( void ); BBox measure_nominal ( const char* s ); #ifndef OGLFT_NO_WX BBox measure_nominal ( const wxString& s ); wxString format_number ( const wxString& format, double number ); #endif /* OGLFT_NO_WX */ }; //! This is the base class of the polygonal styles: outline, filled and solid. /*! * In the polygonal styles, the detailed geometric outlines of the glyphs * are extracted from the font file and rendered as polygons. */ class Polygonal : public Face { protected: //! Angle of rotation of characters relative to text orientation. struct { bool active_; GLfloat x_, y_, z_; } character_rotation_; //! The tessellation of curves is pretty crude; regardless of length, //! use the same number of increments (and as near as I can tell, this //! is more than sufficient unless the glyph takes up the whole screen). unsigned int tessellation_steps_; //! When curves are tessellated, we use the forward difference algorithm //! from Foley and van Dam for parametric curves (pg. 511 of 2nd Ed. in C). //! So, the step size, delta, is in the parametric variable which is always //! on the interval [0,1]. Therefore, delta = 1/tessellation_steps double delta_, delta2_, delta3_; //! For vector rendition modes, FreeType is allowed to generate the //! lines and arcs at the original face definition resolution. To //! get to the proper glyph size, the vertices are scaled before //! they're passed to the GLU tessellation routines. double vector_scale_; //! Callbacks for FreeType glyph decomposition into outlines FT_Outline_Funcs interface_; //! Default number of steps to break TrueType and Type1 arcs into. //! (Note: this looks good to me, anyway) static const unsigned int DEFAULT_TESSELLATION_STEPS = 4; /*! * VertexInfo is a private class which is used by the decomposition and * tessellation routines to store the vertices and other data of the glyph's * outline. Because of the "impedance mismatch" between the crazy * 26.6 fixed point format of the FreeType library (well, don't * blame them; look at what they have to work with) and OpenGL's preference * for double precision, this simple vector has two constructors: one * for 26.6 format and one for direct floating point. * * VertexInfo also contains (optional) pointers to objects which * implement the ColorTess and TextureTess interfaces. */ struct VertexInfo { double v_[3]; //!< Why is this double precision? Because the second //!< argument to the routine gluTessVertex is a pointer //!< to an array of doubles. Otherwise, we could use //!< single precision everywhere. //! The user can provide a ColorTess object which computes a color //! for each tesselated vertex. ColorTess* color_tess_; //! The user can provide a TextureTess object which computes texture //! coordinates for each tesselated vertex. TextureTess* texture_tess_; //! Default constructor just initializes Vertex to zero. //! \param color_tess optional color tesselation object. //! \param texture_tess optional texture tesselation object. VertexInfo ( ColorTess* color_tess = 0, TextureTess* texture_tess = 0 ) : color_tess_( color_tess ), texture_tess_( texture_tess ) { v_[X] = v_[Y] = v_[Z] = 0.; } /*! * Construct a Vertex from a point in a FreeType contour. * \param ft_v a FreeType FT_Vector, normally passed into the * the decomposition callbacks. * \param color_tess optional color tesselation object. * \param texture_tess optional texture tesselation object. */ VertexInfo ( FT_Vector* ft_v, ColorTess* color_tess = 0, TextureTess* texture_tess = 0 ) : color_tess_( color_tess ), texture_tess_( texture_tess ) { v_[X] = (double)( ft_v->x / 64 ) + (double)( ft_v->x % 64 ) / 64.; v_[Y] = (double)( ft_v->y / 64 ) + (double)( ft_v->y % 64 ) / 64.; v_[Z] = 0.; } /*! * Construct a Vertex from a 2D point. * \param p 2D array of doubles. * \param color_tess optional color tesselation object. * \param texture_tess optional texture tesselation object. */ VertexInfo ( double p[2], ColorTess* color_tess = 0, TextureTess* texture_tess = 0 ) : color_tess_( color_tess ), texture_tess_( texture_tess ) { v_[X] = p[X]; v_[Y] = p[Y]; v_[Z] = 0.; } /*! * Construct a Vertex from a 2D point. * \param x the X coordinate. * \param y the Y coordinate. * \param color_tess optional color tesselation object. * \param texture_tess optional texture tesselation object. */ VertexInfo ( double x, double y, ColorTess* color_tess = 0, TextureTess* texture_tess = 0 ) : color_tess_( color_tess ), texture_tess_( texture_tess ) { v_[X] = x; v_[Y] = y; v_[Z] = 0.; } //! Treat the Vertex like a vector: Normalize its length in the //! usual way. void normalize ( void ) { double length = sqrt( v_[X] * v_[X] + v_[Y] * v_[Y] + v_[Z] * v_[Z] ); v_[X] /= length; v_[Y] /= length; v_[Z] /= length; } }; /*! * Buffers the last control point as the outline of a glyph is * decomposed. */ VertexInfo last_vertex_; //! Normally, we will consider a list of vertices. typedef std::list< VertexInfo* > VertexInfoList; //! A convenience definition of the iterator over the list of vertices. typedef VertexInfoList::const_iterator VILCI; //! A convenience definition of the iterator over the list of vertices. typedef VertexInfoList::iterator VILI; /*! * As curves are decomposed out of the glyph, their vertices are passed * along to the GLU tessellation functions. These vertices have to * hang around until gluTessContourEnd is called. */ VertexInfoList vertices_; //! As GLU tessellation proceeds, new contours open with every call //! to moveTo. bool contour_open_; //! The user can provide a ColorTess object which computes a color //! for each tesselated vertex. ColorTess* color_tess_; //! The user can provide a TextureTess object which computes texture //! coordinates for each tesselated vertex. TextureTess* texture_tess_; public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Polygonal ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open Freetype FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Polygonal ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The Polygonal destructor doesn't do anything in particular. */ virtual ~Polygonal ( void ); /*! * TrueType and Type1 files describe the boundaries of glyphs with * quadratic and cubic curves, respectively. Since OpenGL can only really * draw straight lines, these curves have to be tessellated. The * number of steps used is fixed for all glyphs in the face, * but can be changed through this method. Other notes: This value is * only applicable for Outline, Filled and Solid styles. Changing this value * invalidates any cached display lists for glyphs in this face. * * \param tessellation_steps the number of steps to tessellate each curved * segment of a glyph outline. */ void setTessellationSteps ( unsigned int tessellation_steps ); /*! * \return the number of steps used to tessellate curves in the * polygonal font types. */ unsigned int tessellationSteps ( void ) const { return tessellation_steps_; } /*! * Set the individual character rotation in the X direction. * \param character_rotation_x angle in degrees of the X rotation. */ void setCharacterRotationX ( GLfloat character_rotation_x ); /*! * Set the individual character rotation in the Y direction. * \param character_rotation_y angle in degrees of the Y rotation. */ void setCharacterRotationY ( GLfloat character_rotation_y ); /*! * Set the individual character rotation in the Z direction. * \param character_rotation_z angle in degrees of the Z rotation. */ void setCharacterRotationZ ( GLfloat character_rotation_z ); /*! * \return the character rotation in the X direction. */ GLfloat characterRotationX ( void ) const { return character_rotation_.x_; } /*! * \return the character rotation in the Y direction. */ GLfloat characterRotationY ( void ) const { return character_rotation_.y_; } /*! * \return the character rotation in the Z direction. */ GLfloat characterRotationZ ( void ) const { return character_rotation_.z_; } /*! * Set an optional color tesselation object. Each tesselated vertex * is passed to this object, which returns a color for that position * in space. * \param color_tess the color tesselation object. */ void setColorTess ( ColorTess* color_tess ); /*! * \return the color tesselation object. */ ColorTess* colorTess ( void ) const { return color_tess_; } /*! * Set an optional texture coordinate tesselation object. Each * tessellated vertex is passed to this object, which returns * texture coordinates for that position in space. * \param texture_tess the texture coordinate tesselation object. */ void setTextureTess ( TextureTess* texture_tess ); /*! * \return the texture coordinate tesselation object. */ TextureTess* textureTess ( void ) const { return texture_tess_; } /*! * \return the height (i.e., line spacing) at the current character size. */ double height ( void ) const; /*! * Implement measuring a character in a polygonal face. * \param c the (latin1) character to measure * \return the bounding box of c. */ BBox measure ( unsigned char c ); #ifdef _UNICODE #ifndef OGLFT_NO_WX /*! * Implement measuring a character in a polygonal face. * \param c the (UNICODE) character to measure * \return the bounding box of c. */ BBox measure ( const wxChar c ); #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ /*! * Measure a string of characters. Note: currently, this merely * calls Face's measure routine. * \param s string of (latin1) characters to measure * \return the bounding box of s. */ BBox measure ( const char* s ) { return Face::measure( s ); } #ifndef OGLFT_NO_WX /*! * Implement measuring a formatted number * \param format the format string * \param number to value to format * \return the bounding box of the formatted number */ BBox measure ( const wxString& format, double number ) { return Face::measure( format, number ); } #endif /* OGLFT_NO_WX */ private: void init ( void ); void setCharSize ( void ); void setRotationOffset ( void ); GLuint compileGlyph ( FT_Face face, FT_UInt glyph_index ); protected: void clearCaches ( void ); }; //! Render text as a polygon outline. /*! * \image html outline_class.png * Text is drawn as an outline of each glyph. The contours are extracted * from the font file through FreeType. FreeType is used to scale the * contours to a given size. Usually the outline is drawn in the foreground * color, however, you can specify a ColorTess object to provide a color * for each vertex individually. You can also use * the per-glyph display list functionality to alter the attributes * of each glyph. * * The only complexity to this style is selecting the point size. Since * the outlines are drawn as a polygon, they are subject to the MODELVIEW * transformation. The point size is nominally chosen to be the same as a * raster image generated at the given resolution. Some experimentation * with point size and resolution may be necessary to achieve the desired * results. */ class Outline : public Polygonal { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Outline ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Outline ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor doesn't do anything in particular. */ ~Outline ( void ); private: void init ( void ); void renderGlyph ( FT_Face face, FT_UInt glyph_index ); static int moveToCallback ( FT_Vector* to, Outline* outline ); static int lineToCallback ( FT_Vector* to, Outline* outline ); static int conicToCallback ( FT_Vector* control, FT_Vector* to, Outline* outline ); static int cubicToCallback ( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, Outline* outline ); }; //! Render text as a filled polygons. /*! * \image html filled_class.png * Each glyph is drawn as a filled polygon. The contours are extracted * from the font file through FreeType. FreeType is used to scale the * contours to the given size. Then the GLU tessellation routines are used * to tessellate the contours into polygons (well, triangles). By default, * these are drawn in GL_FILL polygon mode, but any other polygon mode * can be specified. * * Usually, the polygons are drawn only in the * foreground color, however, you may supply ColorTess and TextureTess * objects which can alter the color or texture coordinates of each * vertex individually. You can also use * the per-glyph display list functionality to alter the attributes * of each glyph. * * The only complexity to this style is selecting the point size. Since * the glyphs are drawn as polygons, they are subject to the viewing and * modeling transformations. The point size is nominally chosen to be the same * as a raster image generated at the given resolution. Some experimentation * with point size and resolution may be necessary to achieve the desired * results. */ class Filled : public Polygonal { //! 3D tessellation of glyphs is accomplished through the standard GLU //! routines GLUtesselator* tess_obj_; //! A place to store any extra vertices generated by the Combine callback VertexInfoList extra_vertices_; protected: //! Offset the glyph in the Z direction. Solely for the Solid subclass. //! Until I can figure out how to shift the glyph outside the context //! of this class, I guess this has got to stay (but it is redundant //! to extrusion_.depth_) GLfloat depth_offset_; public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Filled ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Filled ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor deletes the GLU tessellation object allocated in * in the constructor. */ virtual ~Filled ( void ); /*! * \return the list of extra vertices created by the GLU tessellation * combine callback. */ VertexInfoList& extraVertices ( void ) { return extra_vertices_; } protected: void renderGlyph ( FT_Face face, FT_UInt glyph_index ); private: void init ( void ); static int moveToCallback ( FT_Vector* to, Filled* filled ); static int lineToCallback ( FT_Vector* to, Filled* filled ); static int conicToCallback ( FT_Vector* control, FT_Vector* to, Filled* filled); static int cubicToCallback ( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, Filled* filled ); static void vertexCallback ( VertexInfo* vertex ); static void beginCallback ( GLenum which ); static void endCallback ( void ); static void combineCallback ( GLdouble coords[3], void* vertex_data[4], GLfloat weight[4], void** out_data, Filled* filled ); static void errorCallback ( GLenum error_code ); }; #ifndef OGLFT_NO_SOLID //! Render text as solid letters. /*! * \image html solid_class.png * Each glyph is drawn as a closed solid. The contours are extracted * from the font file through FreeType. FreeType is used to scale the * contours to the given size. The contours are passed to the GLE * tubing and extrusion library to create the sides of the solid. * Then the GLU tessellation routines are used * to tessellate the contours into polygons which are used to cap the sides. * * Currently, the solids are drawn only in the foreground color. However, * proper surface normals are computed so that the solids may be lighted. * Eventually, you'll be able to supply a color/texture * coordinate function to make glyphs more interesting. Note that you can use * the per-glyph display list functionality to alter each glyph individually. * * Another TODO item is to improve the interaction with GLE. Currently, * you can only create block solids. Eventually, we'll have the capability * add bevels and rounds to the edges of the solids and maybe even more * general extrusions (like, for example, the swooshing letters in the title * sequence of the Salkind's 1978 "Superman" movie). * * The only complexity to this style is selecting the point size. Since * the glyphs are drawn as a collection of polygons, they are subject to the * viewing and modeling transformations. The point size is nominally chosen * to be the same as a raster image generated at the given resolution. * Some experimentation with point size and resolution may be necessary to * achieve the desired results. */ class Solid : public Filled { private: //! Callbacks for FreeType glyph decomposition into outlines (note: this //! has the same name as the variable in Polygonal, but it is distinct since //! the routines for the GLE contouring are different from the Filled //! GLU tessellation routines. This may be too confusing?) FT_Outline_Funcs interface_; //! For now, you can only get block extruded solids static const unsigned int N_POLYLINE_PTS = 4; //! Data for the gleExtrusion routine struct glePoint2D { double p_[2]; glePoint2D ( double p[2] ) { p_[X] = p[X]; p_[Y] = p[Y]; } glePoint2D ( double x, double y ) { p_[X] = x; p_[Y] = y; } glePoint2D ( const VertexInfo& v ) { p_[X] = v.v_[X]; p_[Y] = v.v_[Y]; } }; //! Collect all the output from GLE in one of these structures. struct { double depth_; struct { int x_, y_; } normal_sign_; std::vector< glePoint2D > contour_; std::vector< glePoint2D > contour_normals_; gleDouble up_[3]; int n_polyline_pts_; gleDouble point_array_[N_POLYLINE_PTS][3]; } extrusion_; public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Solid ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Solid ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor doesn't do anything in particular. */ ~Solid ( void ); /*! * Set the thickness of the solid * \param depth thickness of the solid in model units. */ void setDepth ( double depth ); /*! * \return the solid extrusion depth. */ double depth ( void ) const { return extrusion_.depth_; } private: // It would be nice if C/C++ had real matrix notation (like Perl!) void assign ( gleDouble a[3], double x, double y, double z ) { a[X] = x; a[Y] = y; a[Z] = z; } void init ( void ); void renderGlyph ( FT_Face face, FT_UInt glyph_index ); static int moveToCallback ( FT_Vector* to, Solid* solid ); static int lineToCallback ( FT_Vector* to, Solid* solid ); static int conicToCallback ( FT_Vector* control, FT_Vector* to, Solid* solid ); static int cubicToCallback ( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, Solid* solid ); }; #endif /* OGLFT_NO_SOLID */ //! This is the base class of the raster styles: bitmap, grayscale and //! translucent. /*! * In the raster styles, FreeType's rasterizer is used to generate raster * images of each glyph. */ class Raster : public Face { protected: //! Raster glyph can be rotated in the Z plane (in addition to the string //! rotation). GLfloat character_rotation_z_; public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Raster ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Raster ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor doesn't do anything in particular. */ virtual ~Raster ( void ); /*! * Set the individual character rotation in the Z direction. * \param character_rotation_z angle in degrees of Z rotation. */ void setCharacterRotationZ ( GLfloat character_rotation_z ); /*! * \return the character rotation in the Z direction. */ GLfloat characterRotationZ ( void ) const { return character_rotation_z_; } /*! * \return the height (i.e., line spacing) at the current character size. */ double height ( void ) const; /*! * Implement measuring a character in a raster face. * \param c the (latin1) character to measure * \return the bounding box of c. */ BBox measure ( unsigned char c ); #ifdef _UNICODE #ifndef OGLFT_NO_WX /*! * Implement measuring a character in a raster face. * \param c the (UNICODE) character to measure * \return the bounding box of c. */ BBox measure ( const wxChar c ); #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ /*! * Measure a string of characters. Note: currently, this merely * calls Face's measure routine. * \param s string of (latin1) characters to measure * \return the bounding box of s. */ BBox measure ( const char* s ) { return Face::measure( s ); } #ifndef OGLFT_NO_WX /*! * Implement measuring a formatted number * \param format the format string * \param number to value to format * \return the bounding box of the formatted number */ BBox measure ( const wxString& format, double number ) { return Face::measure( format, number ); } #endif /* OGLFT_NO_WX */ private: void init ( void ); GLuint compileGlyph ( FT_Face face, FT_UInt glyph_index ); void setCharSize ( void ); void setRotationOffset ( void ); void clearCaches ( void ); }; //! Render text as a monochrome raster image. /*! * \image html monochrome_class.png * This is more or less the standard way in which text is intended to * be rendered in OpenGL. It uses the \c glBitmap call to draw a sequence * of monochrome bitmaps. Since FreeType is capable of rotating glyphs * created from faces based on vector outlines, you can rotate (in the Z plane) * both the text string as well as the individual characters in the string. * * Note: you \em must call * \code * glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); * \endcode * before drawing in order for monochrome glyphs to be rendered properly. * * Another note: It is helpful to have the option * \c GL_RASTER_POSITION_UNCLIPPED_IBM available if you intend to draw text * at MODELVIEW based positions, otherwise if the initial text position is off * the screen, the entire image is clipped. */ class Monochrome : public Raster { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Monochrome ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Monochrome ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor doesn't do anything in particular. */ ~Monochrome ( void ); private: GLubyte* invertBitmap ( const FT_Bitmap& bitmap ); void renderGlyph ( FT_Face face, FT_UInt glyph_index ); }; //! Render text as a grayscale raster image. /*! * \image html grayscale_class.png * The Grayscale style is similar to the Monochrome style. FreeType is used * to rasterize a glyph and this is then drawn on the screen using * \c glDrawPixels. The FreeType rasterization is done in anti-aliased mode. * When Grayscale draws the glyph image, the resulting text is blended * smoothly from the foreground color to the background color. The background * of the glyph is opaque, so this style works best over a solid background. * * Note: you \em must call * \code * glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); * \endcode * before drawing in order for grayscale glyphs to be rendered properly. * * Another note: It is helpful to have the option * \c GL_RASTER_POSITION_UNCLIPPED_IBM available if you intend to draw text * at MODELVIEW based positions, otherwise if the initial text position is off * the screen, the entire image is clipped. */ class Grayscale : public Raster { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Grayscale ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Grayscale ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor doesn't do anything in particular. */ ~Grayscale ( void ); private: GLubyte* invertPixmap ( const FT_Bitmap& bitmap ); void renderGlyph ( FT_Face face, FT_UInt glyph_index ); }; //! Render text as a translucent raster image. /*! * \image html translucent_class.png * The Translucent style is similar to the Grayscale style. FreeType is used * to rasterize a glyph and this is then drawn on the screen using * \c glDrawPixels. The FreeType rasterization is done in anti-aliased mode. * When Translucent draws the glyph image, the grayscale levels provided * by FreeType are used as Alpha values in the raster image. This allows * the glyphs to be smoothly blended into complicated backgrounds. * * Note: you \em must call * \code * glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); * \endcode * before drawing in order for translucent glyphs to be rendered properly. * Additionally, you need to activate blending in order to achieve the * translucent effect: * \code * glEnable( GL_BLEND ); * glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); * \endcode * * Another note: It is helpful to have the option * \c GL_RASTER_POSITION_UNCLIPPED_IBM available if you intend to draw text * at MODELVIEW based positions, otherwise if the initial text position is off * the screen, the entire image is clipped. */ class Translucent : public Raster { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Translucent ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Translucent ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The destructor doesn't do anything in particular. */ ~Translucent ( void ); private: GLubyte* invertPixmapWithAlpha ( const FT_Bitmap& bitmap ); void renderGlyph ( FT_Face face, FT_UInt glyph_index ); }; //! This is the base class of the texture style. class Texture : public Face { protected: //! Angle of rotation of characters relative to text orientation. struct { bool active_; //!< Is character rotation non-zero? (faster than checking all //!< the other values.) GLfloat x_, //!< Angle of rotation in the X direction. y_, //!< Angle of rotation in the Y direction. z_; //!< Angle of rotation in the Z direction. } character_rotation_; /*! * The textured glyphs need a little bit more infrastructure to draw * since we have to remember the size of the texture object itself * (at least implicitly). Also, we don't want to create any more * texture objects than we have to, so they are always cached. */ struct TextureInfo { GLuint texture_name_; //!< A bound texture name is an integer in OpenGL. FT_Int left_bearing_, //!< The left bearing of the transformed glyph. bottom_bearing_; //!< The bottom bearing of the transformed glyph. int width_, //!< The 2**l width of the texture. height_; //!< The 2**m height of the texture. GLfloat texture_s_, //!< The fraction of the texture width occupied //!< by the glyph. texture_t_; //!< The fraction of the texture height occupied //!< by the glyph. FT_Vector advance_; //!< The advance vector of the transformed glyph. }; //! Type of the cache of defined glyph to texture objects mapping. typedef std::map< FT_UInt, TextureInfo > GlyphTexObjs; //! A convenience definition of the iterator over the glyph to texture //! object map. typedef GlyphTexObjs::const_iterator GTOCI; //! A convenience definition of the iterator over the glyph to texture //! object map. typedef GlyphTexObjs::iterator GTOI; //! Cache of defined glyph texture objects. GlyphTexObjs glyph_texobjs_; public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Texture ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ Texture ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The texture destructor doesn't really do anything. */ virtual ~Texture ( void ); /*! * Set the individual character rotation in the X direction. * \param character_rotation_x angle in degrees of X rotation. */ void setCharacterRotationX ( GLfloat character_rotation_x ); /*! * Set the individual character rotation in the Y direction. * \param character_rotation_y angle in degrees of Y rotation. */ void setCharacterRotationY ( GLfloat character_rotation_y ); /*! * Set the individual character rotation in the Z direction. * \param character_rotation_z angle in degrees of Z rotation. */ void setCharacterRotationZ ( GLfloat character_rotation_z ); /*! * \return the character rotation in the X direction. */ GLfloat characterRotationX ( void ) const { return character_rotation_.x_; } /*! * \return the character rotation in the Y direction. */ GLfloat characterRotationY ( void ) const { return character_rotation_.y_; } /*! * \return the character rotation in the Z direction. */ GLfloat characterRotationZ ( void ) const { return character_rotation_.z_; } /*! * \return the height (i.e., line spacing) at the current character size. */ double height ( void ) const; /*! * Implement measuring a character in a texture face. * \param c the (latin1) character to measure * \return the bounding box of c. */ BBox measure ( unsigned char c ); #ifdef _UNICODE #ifndef OGLFT_NO_WX /*! * Implement measuring a character in a texture face. * \param c the (UNICODE) character to measure * \return the bounding box of c. */ BBox measure ( const wxChar c ); #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ /*! * Measure a string of characters. Note: currently, this merely * calls Face's measure routine. * \param s string of (latin1) characters to measure * \return the bounding box of s. */ BBox measure ( const char* s ) { return Face::measure( s ); } #ifndef OGLFT_NO_WX /*! * Implement measuring a formatted number * \param format the format string * \param number to value to format * \return the bounding box of the formatted number */ BBox measure ( const wxString& format, double number ) { return Face::measure( format, number ); } #endif /* OGLFT_NO_WX */ protected: /*! * OpenGL texture maps have to be a power of 2 in width and height (including * apparently 1 = 2**0 ). This function returns the next higher power of * 2 of the argument. If the argument is already a power of 2, you just * get that back. * \param a width or height of an image. * \return value of a rounded to nearest, higher power of 2. */ unsigned int nearestPowerCeil ( unsigned int a ); /*! * This is all that distinguishes the various texture styles. Each subclass * defines this method as appropriate. Once the texture is bound, it * is rendered the same in all cases. * \param face FT_Face containing the glyph to render. * \param glyph_index index of glyph in face. */ virtual void bindTexture ( FT_Face face, FT_UInt glyph_index ) = 0; private: void init ( void ); void setCharSize ( void ); void setRotationOffset ( void ); GLuint compileGlyph ( FT_Face face, FT_UInt glyph_index ); void renderGlyph ( FT_Face face, FT_UInt glyph_index ); void clearCaches ( void ); }; //! Render text as texture mapped monochrome quads. /*! * \image html texture_monochrome_class.png * This style is similar to the Monochrome raster style, except instead * of using \c glBitmap to draw the raster image, the image is used * as a texture map on a quad. If drawing is confined to the Z plane, * then you will see no difference between this style and Monochrome. * However, because the quad is a 3D object, it can be transformed * by the usual modeling operations; so, texture mapped glyphs can be * rotated in the X and Y directions as well as Z direction. Also, * if the viewing (or modeling) transformation has a non-unity scale or * shear, the glyphs will also be scaled or sheared (unlike the raster * styles). Also, there is no problem with clipping glyphs which lie * off the screen; texture mapped quads are properly clipped to the * screen boundary. * * If this is not convincing enough, the performance of texture mapped * glyphs is generally as good as or better than the equivalent * raster style (especially with hardware texture acceleration). However, * they do take up more memory space. * * Note: you \em must call * \code * glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); * \endcode * before drawing in order for textured glyphs to be rendered properly. */ class MonochromeTexture : public Texture { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ MonochromeTexture ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ MonochromeTexture ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The monochrome texture destructor doesn't really do anything. */ ~MonochromeTexture ( void ); private: GLubyte* invertBitmap ( const FT_Bitmap& bitmap, int* width, int* height ); void bindTexture ( FT_Face face, FT_UInt glyph_index ); }; //! Render text as texture mapped grayscale quads. /*! * \image html texture_grayscale_class.png * This style is similar to the Grayscale raster style, except instead * of using \c glDrawPixels to draw the raster image, the image is used * as a texture map on a quad. If drawing is confined to the Z plane, * then you will see no difference between this style and Grayscale. * However, because the quad is a 3D object, it can be transformed * by the usual modeling operations; so, texture mapped glyphs can be * rotated in the X and Y directions as well as Z direction. Also, * if the viewing (or modeling) transformation has a non-unity scale or * shear, the glyphs will also be scaled or sheared (unlike the raster * styles). Also, there is no problem with clipping glyphs which lie * off the screen; texture mapped quads are properly clipped to the * screen boundary. * * If this is not convincing enough, the performance of texture mapped * glyphs is generally as good as or better than the equivalent * raster style (especially with hardware texture acceleration). However, * they do consume more memory space. * * Note: you \em must call * \code * glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); * \endcode * before drawing in order for textured glyphs to be rendered properly. */ class GrayscaleTexture : public Texture { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ GrayscaleTexture ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ GrayscaleTexture ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The grayscale texture destructor doesn't really do anything. */ ~GrayscaleTexture ( void ); private: GLubyte* invertPixmap ( const FT_Bitmap& bitmap, int* width, int* height ); void bindTexture ( FT_Face face, FT_UInt glyph_index ); }; //! Render text as texture mapped translucent quads. /*! * \image html texture_translucent_class.png * This style is similar to the Translucent raster style, except instead * of using \c glDrawPixels to draw the raster image, the image is used * as a texture map on a quad. If drawing is confined to the Z plane, * then you will see no difference between this style and Translucent. * However, because the quad is a 3D object, it can be transformed * by the usual modeling operations; so, texture mapped glyphs can be * rotated in the X and Y directions as well as Z direction. Also, * if the viewing (or modeling) transformation has a non-unity scale or * shear, the glyphs will also be scaled or sheared (unlike the raster * styles). Also, there is no problem with clipping glyphs which lie * off the screen; texture mapped quads are properly clipped to the * screen boundary. * * If this is not convincing enough, the performance of texture mapped * glyphs is generally as good as or better than the equivalent * raster style (especially with hardware texture acceleration). However, * they do consume more memory space. * * Note: you \em must call * \code * glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); * \endcode * before drawing in order for textured glyphs to be rendered properly. * Additionally, you need to activate blending in order to achieve the * translucent effect: * \code * glEnable( GL_BLEND ); * glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); * \endcode */ class TranslucentTexture : public Texture { public: /*! * \param filename the filename which contains the font face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ TranslucentTexture ( const char* filename, float point_size = 12, FT_UInt resolution = 100 ); /*! * \param face open FreeType FT_Face. * \param point_size the initial point size of the font to generate. A point * is essentially 1/72th of an inch. Defaults to 12. * \param resolution the pixel density of the display in dots per inch (DPI). * Defaults to 100 DPI. */ TranslucentTexture ( FT_Face face, float point_size = 12, FT_UInt resolution = 100 ); /*! * The translucent texture destructor doesn't really do anything. */ ~TranslucentTexture ( void ); private: GLubyte* invertPixmap ( const FT_Bitmap& bitmap, int* width, int* height ); void bindTexture ( FT_Face face, FT_UInt glyph_index ); }; } // Close OGLFT namespace #endif /* OGLFT_H */ therion/loch/lxR2D.h0000664000175000017500000000054510537464734013320 0ustar useruser#ifdef __cplusplus extern "C" { #endif /*Standard libraries*/ #ifndef LXDEPCHECK #include #endif /*LXDEPCHECK - standart libraries*/ typedef struct _R2DCTX R2DContext; extern R2DContext *R2DCreate(int width, int height); extern void R2DMakeCurrent(R2DContext * ctx); extern void R2DDestroy(R2DContext * ctx); #ifdef __cplusplus } #endif therion/loch/lxTR.c0000664000175000017500000002716510507531566013253 0ustar useruser/* $Id: tr.c,v 1.9 1998/01/29 16:56:54 brianp Exp $ */ /* * $Log: tr.c,v $ * Revision 1.9 1998/01/29 16:56:54 brianp * allow trOrtho() and trFrustum() to be called at any time, minor clean-up * * Revision 1.8 1998/01/28 19:47:39 brianp * minor clean-up for C++ * * Revision 1.7 1997/07/21 17:34:38 brianp * added tile borders * * Revision 1.6 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.5 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.4 1997/04/26 19:59:36 brianp * set CurrentTile to -1 before first tile and after last tile * * Revision 1.3 1997/04/22 23:51:15 brianp * added WIN32 header stuff, removed tabs * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul */ #include "lxTR.h" #define DEFAULT_TILE_WIDTH 256 #define DEFAULT_TILE_HEIGHT 256 #define DEFAULT_TILE_BORDER 0 #ifdef assert #undef assert #endif #define assert(x) struct _TRctx { /* Final image parameters */ GLint ImageWidth, ImageHeight; GLenum ImageFormat, ImageType; GLvoid *ImageBuffer; /* Tile parameters */ GLint TileWidth, TileHeight; GLint TileWidthNB, TileHeightNB; GLint TileBorder; GLenum TileFormat, TileType; GLvoid *TileBuffer; /* Projection parameters */ GLboolean Perspective; GLdouble Left; GLdouble Right; GLdouble Bottom; GLdouble Top; GLdouble Near; GLdouble Far; /* Misc */ TRenum RowOrder; GLint Rows, Columns; GLint CurrentTile; GLint CurrentTileWidth, CurrentTileHeight; GLint CurrentRow, CurrentColumn; GLint ViewportSave[4]; }; /* * Misc setup including computing number of tiles (rows and columns). */ static void Setup(TRcontext *tr) { if (!tr) return; tr->Columns = (tr->ImageWidth + tr->TileWidthNB - 1) / tr->TileWidthNB; tr->Rows = (tr->ImageHeight + tr->TileHeightNB - 1) / tr->TileHeightNB; tr->CurrentTile = 0; assert(tr->Columns >= 0); assert(tr->Rows >= 0); } TRcontext *trNew(void) { TRcontext *tr = (TRcontext *) calloc(1, sizeof(TRcontext)); if (tr) { tr->TileWidth = DEFAULT_TILE_WIDTH; tr->TileHeight = DEFAULT_TILE_HEIGHT; tr->TileBorder = DEFAULT_TILE_BORDER; tr->RowOrder = TR_BOTTOM_TO_TOP; tr->CurrentTile = -1; } return (TRcontext *) tr; } void trDelete(TRcontext *tr) { if (tr) free(tr); } void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border) { if (!tr) return; assert(border >= 0); assert(width >= 1); assert(height >= 1); assert(width >= 2*border); assert(height >= 2*border); tr->TileBorder = border; tr->TileWidth = width; tr->TileHeight = height; tr->TileWidthNB = width - 2 * border; tr->TileHeightNB = height - 2 * border; Setup(tr); } void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->TileFormat = format; tr->TileType = type; tr->TileBuffer = image; } void trImageSize(TRcontext *tr, GLint width, GLint height) { if (!tr) return; tr->ImageWidth = width; tr->ImageHeight = height; Setup(tr); } void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->ImageFormat = format; tr->ImageType = type; tr->ImageBuffer = image; } GLint trGet(TRcontext *tr, TRenum param) { if (!tr) return 0; switch (param) { case TR_TILE_WIDTH: return tr->TileWidth; case TR_TILE_HEIGHT: return tr->TileHeight; case TR_TILE_BORDER: return tr->TileBorder; case TR_IMAGE_WIDTH: return tr->ImageWidth; case TR_IMAGE_HEIGHT: return tr->ImageHeight; case TR_ROWS: return tr->Rows; case TR_COLUMNS: return tr->Columns; case TR_CURRENT_ROW: if (tr->CurrentTile<0) return -1; else return tr->CurrentRow; case TR_CURRENT_COLUMN: if (tr->CurrentTile<0) return -1; else return tr->CurrentColumn; case TR_CURRENT_TILE_WIDTH: return tr->CurrentTileWidth; case TR_CURRENT_TILE_HEIGHT: return tr->CurrentTileHeight; case TR_ROW_ORDER: return (GLint) tr->RowOrder; default: return 0; } } void trRowOrder(TRcontext *tr, TRenum order) { if (!tr) return; if (order==TR_TOP_TO_BOTTOM || order==TR_BOTTOM_TO_TOP) tr->RowOrder = order; } void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_FALSE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_TRUE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ) { GLdouble xmin, xmax, ymin, ymax; ymax = zNear * tan(fovy * 3.14159265 / 360.0); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; trFrustum(tr, xmin, xmax, ymin, ymax, zNear, zFar); } void trBeginTile(TRcontext *tr) { GLint matrixMode; GLint tileWidth, tileHeight, border; GLdouble left, right, bottom, top; if (!tr) return; if (tr->CurrentTile <= 0) { Setup(tr); /* Save user's viewport, will be restored after last tile rendered */ glGetIntegerv(GL_VIEWPORT, tr->ViewportSave); } /* which tile (by row and column) we're about to render */ if (tr->RowOrder==TR_BOTTOM_TO_TOP) { tr->CurrentRow = tr->CurrentTile / tr->Columns; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else if (tr->RowOrder==TR_TOP_TO_BOTTOM) { tr->CurrentRow = tr->Rows - (tr->CurrentTile / tr->Columns) - 1; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else { /* This should never happen */ abort(); } assert(tr->CurrentRow < tr->Rows); assert(tr->CurrentColumn < tr->Columns); border = tr->TileBorder; /* Compute actual size of this tile with border */ if (tr->CurrentRow < tr->Rows-1) tileHeight = tr->TileHeight; else tileHeight = tr->ImageHeight - (tr->Rows-1) * (tr->TileHeightNB) + 2 * border; if (tr->CurrentColumn < tr->Columns-1) tileWidth = tr->TileWidth; else tileWidth = tr->ImageWidth - (tr->Columns-1) * (tr->TileWidthNB) + 2 * border; /* Save tile size, with border */ tr->CurrentTileWidth = tileWidth; tr->CurrentTileHeight = tileHeight; glViewport(0, 0, tileWidth, tileHeight); /* tile size including border */ /* save current matrix mode */ glGetIntegerv(GL_MATRIX_MODE, &matrixMode); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* compute projection parameters */ left = tr->Left + (tr->Right - tr->Left) * (tr->CurrentColumn * tr->TileWidthNB - border) / tr->ImageWidth; right = left + (tr->Right - tr->Left) * tileWidth / tr->ImageWidth; bottom = tr->Bottom + (tr->Top - tr->Bottom) * (tr->CurrentRow * tr->TileHeightNB - border) / tr->ImageHeight; top = bottom + (tr->Top - tr->Bottom) * tileHeight / tr->ImageHeight; if (tr->Perspective) glFrustum(left, right, bottom, top, tr->Near, tr->Far); else glOrtho(left, right, bottom, top, tr->Near, tr->Far); /* restore user's matrix mode */ glMatrixMode(matrixMode); } int trEndTile(TRcontext *tr) { GLint prevRowLength, prevSkipRows, prevSkipPixels; /* prevAlignment; */ if (!tr) return 0; assert(tr->CurrentTile>=0); /* be sure OpenGL rendering is finished */ glFinish(); /* save current glPixelStore values */ glGetIntegerv(GL_PACK_ROW_LENGTH, &prevRowLength); glGetIntegerv(GL_PACK_SKIP_ROWS, &prevSkipRows); glGetIntegerv(GL_PACK_SKIP_PIXELS, &prevSkipPixels); /*glGetIntegerv(GL_PACK_ALIGNMENT, &prevAlignment);*/ if (tr->TileBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->TileWidthNB; GLint srcHeight = tr->TileHeightNB; glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->TileFormat, tr->TileType, tr->TileBuffer); } if (tr->ImageBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->CurrentTileWidth - 2 * tr->TileBorder; GLint srcHeight = tr->CurrentTileHeight - 2 * tr->TileBorder; GLint destX = tr->TileWidthNB * tr->CurrentColumn; GLint destY = tr->TileHeightNB * tr->CurrentRow; /* setup pixel store for glReadPixels */ glPixelStorei(GL_PACK_ROW_LENGTH, tr->ImageWidth); glPixelStorei(GL_PACK_SKIP_ROWS, destY); glPixelStorei(GL_PACK_SKIP_PIXELS, destX); /*glPixelStorei(GL_PACK_ALIGNMENT, 1);*/ /* read the tile into the final image */ glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->ImageFormat, tr->ImageType, tr->ImageBuffer); } /* restore previous glPixelStore values */ glPixelStorei(GL_PACK_ROW_LENGTH, prevRowLength); glPixelStorei(GL_PACK_SKIP_ROWS, prevSkipRows); glPixelStorei(GL_PACK_SKIP_PIXELS, prevSkipPixels); /*glPixelStorei(GL_PACK_ALIGNMENT, prevAlignment);*/ /* increment tile counter, return 1 if more tiles left to render */ tr->CurrentTile++; if (tr->CurrentTile >= tr->Rows * tr->Columns) { /* restore user's viewport */ glViewport(tr->ViewportSave[0], tr->ViewportSave[1], tr->ViewportSave[2], tr->ViewportSave[3]); tr->CurrentTile = -1; /* all done */ return 0; } else return 1; } /* * Replacement for glRastePos3f() which avoids the problem with invalid * raster pos. */ void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z) { if (tr->CurrentTile<0) { /* not doing tile rendering right now. Let OpenGL do this. */ glRasterPos3f(x, y, z); } else { GLdouble modelview[16], proj[16]; GLint viewport[4]; GLdouble winX, winY, winZ; /* Get modelview, projection and viewport */ glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, proj); viewport[0] = 0; viewport[1] = 0; viewport[2] = tr->CurrentTileWidth; viewport[3] = tr->CurrentTileHeight; /* Project object coord to window coordinate */ if (gluProject(x, y, z, modelview, proj, viewport, &winX, &winY, &winZ)){ /* set raster pos to window coord (0,0) */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0, tr->CurrentTileWidth, 0.0, tr->CurrentTileHeight, 0.0, 1.0); glRasterPos3f(0.0, 0.0, (GLfloat) -winZ); /* Now use empty bitmap to adjust raster position to (winX,winY) */ { GLubyte bitmap[1] = {0}; glBitmap(1, 1, 0.0, 0.0, (GLfloat) winX, (GLfloat) winY, bitmap); } /* restore original matrices */ glPopMatrix(); /*proj*/ glMatrixMode(GL_MODELVIEW); glPopMatrix(); } #ifdef DEBUG if (glGetError()) printf("GL error!\n"); #endif } } therion/loch/lxSTree.h0000664000175000017500000000127012047417736013745 0ustar useruser/** * @file lxSTree.h * Loch scene setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxSTree_h #define lxSTree_h // Standard libraries #ifndef LXDEPCHECK #include #include #endif //LXDEPCHECK - standart libraries #include "lxWX.h" class lxModelTreeDlg : public wxMiniFrame { public: lxTBoxPos m_toolBoxPosition; class lxFrame * m_mainFrame; wxTreeCtrl * m_treeControl; lxModelTreeDlg(wxWindow *parent); void LoadData(); void OnCommand(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnMove(wxMoveEvent& event); private: DECLARE_EVENT_TABLE() }; #endif therion/loch/lxR2P.c0000664000175000017500000001114010507531566013313 0ustar useruser/*Standard libraries*/ #ifndef LXDEPCHECK #include #define GLX_GLXEXT_PROTOTYPES #include #include #include #include #endif /*LXDEPCHECK - standart libraries*/ #include "lxR2P.h" struct _R2PCTX { GLXContext ctx; Pixmap pm; XVisualInfo *visinfo; GLXPixmap glxpm; Display *dpy; }; void R2Pmake_context(R2PContext * r2pc) { const int sbAttrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, None }; const int dbAttrib[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, None }; int scrnum; Window root; scrnum = DefaultScreen( r2pc->dpy ); root = RootWindow( r2pc->dpy, scrnum ); r2pc->visinfo = glXChooseVisual( r2pc->dpy, scrnum, (int *) sbAttrib ); if (!r2pc->visinfo) { r2pc->visinfo = glXChooseVisual( r2pc->dpy, scrnum, (int *) dbAttrib ); if (!r2pc->visinfo) { printf("Error: couldn't get an RGB visual\n"); exit(1); } } /* need indirect context */ r2pc->ctx = glXCreateContext( r2pc->dpy, r2pc->visinfo, NULL, False ); if (!r2pc->ctx) { printf("Error: glXCreateContext failed\n"); exit(-1); } } void R2Pmake_pixmap(R2PContext * r2pc, unsigned int width, unsigned int height) { r2pc->pm = XCreatePixmap( r2pc->dpy, RootWindow( r2pc->dpy, DefaultScreen( r2pc->dpy )), width, height, r2pc->visinfo->depth ); if (!r2pc->pm) { printf("Error: XCreatePixmap failed\n"); exit(-1); } r2pc->glxpm = glXCreateGLXPixmap( r2pc->dpy, r2pc->visinfo, r2pc->pm ); if (!r2pc->glxpm) { printf("Error: GLXCreateGLXPixmap failed\n"); exit(-1); } } R2PContext *R2PCreate(int width, int height) { R2PContext * c = (R2PContext *) calloc(1, sizeof(R2PContext)); if (c) { c->dpy = XOpenDisplay(NULL); R2Pmake_context(c); R2Pmake_pixmap(c, (unsigned int) width, (unsigned int) height); } return c; } void R2PMakeCurrent(R2PContext * c) { if (c) { glXMakeCurrent( c->dpy, c->glxpm, c->ctx ); } } void R2PDestroy(R2PContext * c) { if (c) { glXDestroyGLXPixmap(c->dpy, c->glxpm); XFreePixmap(c->dpy, c->pm); glXDestroyContext(c->dpy, c->ctx); XCloseDisplay(c->dpy); free(c); } } #ifndef LXLINUX static GC gc; R2PContext * global_ctx; static Window make_rgb_window( Display *dpy, unsigned int width, unsigned int height ) { XSetWindowAttributes attr; unsigned long mask; Window win; int scrnum; Window root; scrnum = DefaultScreen( dpy ); root = RootWindow( dpy, scrnum ); /* window attributes */ attr.background_pixel = 0; attr.border_pixel = 0; /* TODO: share root colormap if possible */ attr.colormap = XCreateColormap( dpy, root, global_ctx->visinfo->visual, AllocNone); attr.event_mask = StructureNotifyMask | ExposureMask; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow( dpy, root, 0, 0, width, height, 0, global_ctx->visinfo->depth, InputOutput, global_ctx->visinfo->visual, mask, &attr ); /* make an X GC so we can do XCopyArea later */ gc = XCreateGC( global_ctx->dpy, win, 0, NULL ); return win; } static void event_loop( Display *dpy, GLXPixmap pm ) { XEvent event; while (1) { XNextEvent( dpy, &event ); switch (event.type) { case Expose: printf("Redraw\n"); /* copy the image from GLXPixmap to window */ XCopyArea( dpy, pm, event.xany.window, /* src, dest */ gc, 0, 0, 300, 300, /* gc, src pos, size */ 0, 0 ); /* dest pos */ break; case ConfigureNotify: /* nothing */ break; } } } int main( int argc, char *argv[] ) { Window win; global_ctx = R2PCreate(300, 300); win = make_rgb_window( global_ctx->dpy, 300, 300 ); R2PMakeCurrent(global_ctx); printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); /* Render an image into the pixmap */ glShadeModel( GL_FLAT ); glClearColor( 0.5, 0.5, 0.5, 1.0 ); glClear( GL_COLOR_BUFFER_BIT ); glViewport( 0, 0, 300, 300 ); glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 ); glColor3f( 0.0, 1.0, 1.0 ); glRectf( -0.75, -0.75, 0.75, 0.75 ); glFlush(); XMapWindow( global_ctx->dpy, win ); event_loop( global_ctx->dpy, global_ctx->pm ); R2PDestroy(global_ctx); return 0; } #endif therion/loch/makefile.pl0000664000175000017500000000175610251676250014322 0ustar useruseruse File::Glob; use File::Copy; use File::Path; if ($ARGV[0] =~ /^\s*cp\s*$/i) { copy($ARGV[1],$ARGV[2]) || die("$0: error -- cp $ARGV[1] -> $ARGV[2]\n"); } elsif ($ARGV[0] =~ /^\s*mv\s*$/i) { copy($ARGV[1],$ARGV[2]) || die("$0: error -- cp $ARGV[1] -> $ARGV[2]\n"); unlink($ARGV[1]) || warn("$0: can't delete $ARGV[1]\n");; } elsif ($ARGV[0] =~ /^\s*rm\s*$/i) { $dum = shift @ARGV; $quietdel = ''; if ($ARGV[0] =~ /^\s*\-q\s*$/) { $dum = shift @ARGV; $quietdel = 1; } foreach $f (@ARGV) { if ($f =~ /\*/) { @fl = glob($f); foreach $ff (@fl) { unlink($ff) || $quietdel || warn("$0: can't delete $ff\n"); } } else { unlink($f) || $quietdel || warn("$0: can't delete $f\n"); } } } elsif ($ARGV[0] =~ /^\s*rmdir\s*$/i) { $dum = shift @ARGV; $quietdel = ''; if ($ARGV[0] =~ /^\s*\-q\s*$/) { $dum = shift @ARGV; $quietdel = 1; } foreach $f (@ARGV) { rmtree($f) || $quietdel || warn("$0: can't delete $f\n");; } } therion/loch/lxSView.h0000664000175000017500000000276610537464734013775 0ustar useruser/** * @file lxSView.h * Loch scene setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxSView_h #define lxSView_h // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries #include "lxWX.h" enum { LXVSTP_CONTROLLB = 10000, LXVSTP_PERSP, LXVSTP_ZOOM, LXVSTP_ZOOMSLIDE, LXVSTP_FACING, LXVSTP_FACINGSLIDE, LXVSTP_TILT, LXVSTP_TILTSLIDE, LXVSTP_DIST, LXVSTP_DISTSLIDE, LXVSTP_CENTERX, LXVSTP_CENTERY, LXVSTP_CENTERZ, LXVSTP_ROTATION, LXVSTP_ROTLOCK, LXVSTP_ROTSPEED, LXVSTP_STEREO, LXVSTP_STEREOBW, LXVSTP_3DGLASSES, LXVSTP_EYESEP, LXVSTP_RENSPEED, }; class lxViewpointSetupDlg : public wxMiniFrame { public: lxTBoxPos m_toolBoxPosition; lxCRC32 m_toolBoxCRC; class lxFrame * m_mainFrame; wxBoxSizer * m_controlSizer, * m_controlSizer_Orientation, * m_controlSizer_Center, * m_controlSizer_Camera, * m_controlSizer_Rotation, * m_controlSizer_Stereo; bool m_uicFacing, m_uicTilt, m_uicCenterX, m_uicCenterY, m_uicCenterZ, m_uicDist, m_uicZoom; lxViewpointSetupDlg(wxWindow *parent); bool IsChanged(); void LoadSetup(); void SetSliders(); void OnCommand(wxCommandEvent& event); void OnClose(wxCloseEvent& event); void OnMove(wxMoveEvent& event); void OnControlSelect(wxCommandEvent& event); void OnSlider(wxScrollEvent& event); void OnText(wxCommandEvent& event); private: DECLARE_EVENT_TABLE() }; #endif therion/loch/lxSetup.h0000664000175000017500000000431412410766724014023 0ustar useruser/** * @file lxSetup.h * Loch model setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxSetup_h #define lxSetup_h // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries #include "lxData.h" #include "lxMath.h" #include enum { lxSETUP_COLORMD_DEFAULT, lxSETUP_COLORMD_ALTITUDE, }; struct lxSetup { // data settings lxData * data; lxVecLimits data_limits; // camera settings lxVec cam_center, cam_pos, cam_orig_center, cam_orig_pos; int cam_anaglyph_glasses, m_colormd; double cam_dist, cam_dir, cam_tilt, cam_width, cam_orig_dist, cam_orig_dir, cam_orig_tilt, cam_lens, cam_lens_vfov, cam_lens_vfovr, cam_anaglyph_eyesep, data_limits_diam; bool cam_persp, cam_anaglyph, cam_anaglyph_bw, cam_anaglyph_left; bool m_vis_centerline, m_vis_walls, m_vis_surface, m_vis_labels, m_vis_bbox, m_vis_grid, m_vis_indicators, m_vis_centerline_cave, m_vis_centerline_surface, m_vis_centerline_splay, m_vis_centerline_station, m_vis_centerline_entrance, m_vis_centerline_fix, m_vis_centerline_duplicate, m_stlabel_comment, m_stlabel_name, m_stlabel_altitude, m_stlabel_survey; bool m_srf_transparency, m_srf_texture, m_srf_lighting; bool m_walls_transparency; bool m_colormd_app_centerline, m_colormd_app_walls; double m_srf_opacity, m_walls_opacity; std::set m_survey_selection; lxSetup(struct lxData * dat); // Upravi data na zaklade settings a potom updatne // sam seba. void UpdateData(); // Restne pohlad podla prave nastaveneho dir a tilt, // ostatne da tak, aby data_limits vyplnali obrazovku void ResetCamera(); void StartCameraMovement(); void ZoomCamera(double zoom); void PanCamera(double panx, double pany); void TiltCamera(double tilt); void RotateCamera(double rot); void RotateCameraF(double rot); void SetLens(double lens); void UpdatePos(); void SelectSurvey(const char * survey); bool IsSurveySelected(const char * survey); void ClearSurveySelection(); void SaveToXMLNode(wxXmlNode * n); void LoadFromXMLNode(wxXmlNode * n, wxXmlNode * nn = NULL, double t = 0.0); }; #endif therion/loch/Makefile0000664000175000017500000002016412450020341013625 0ustar useruserOUTDIR ?= . THPLATFORM ?= LINUX ifneq ($(OUTDIR),.) LOUTDIR = $(OUTDIR)/loch else LOUTDIR = . endif # common therion objects CMNOBJECTS = \ lxTR.o lxOGLFT.o lxSetup.o lxRender.o lxWX.o \ lxImgIO.o lxLRUD.o lxFile.o lxSTree.o \ lxData.o lxMath.o lxSView.o lxSScene.o \ lxGUI.o lxGLC.o lxOptDlg.o lxAboutDlg.o lxPres.o \ img.o VTKVERSION = $(shell tclsh ./getvtkver.tcl version) VTKPATH = $(shell tclsh ./getvtkver.tcl incpath) VTKLIBPATH = $(shell tclsh ./getvtkver.tcl libpath) VTKV6 = $(shell tclsh ./getvtkver.tcl version6) ifeq ($(VTKV6),1) VTKLIBS = -lvtkCommonExecutionModel-$(VTKVERSION) -lvtkCommonDataModel-$(VTKVERSION) -lvtkCommonCore-$(VTKVERSION) -lvtkFiltersCore-$(VTKVERSION) -lvtkFiltersHybrid-$(VTKVERSION) -lvtkIOLegacy-$(VTKVERSION) -lfreetype -lpng -ljpeg else VTKLIBS = -lvtkHybrid -lvtkImaging -lvtkIO -lvtkGraphics -lvtkFiltering -lvtkCommon -lvtkjpeg -lvtkpng -lvtkzlib -lvtksys -lfreetype endif # VTKVERSION = 5.4 # VTKPATH = /usr/local/include/vtk-$(VTKVERSION) # VTKLIBPATH = /usr/local/lib/vtk-$(VTKVERSION) POSTMAKE = STRIPFLAG = -s # PLATFORM CONFIG # PLATFORM LINUX ##CXX = c++ ##CC = gcc ##POBJECTS = lxR2P.o ##ifeq ($(VTKV6),1) ##VTKLIBS = -lvtkCommonExecutionModel-$(VTKVERSION) -lvtkCommonDataModel-$(VTKVERSION) -lvtkCommonCore-$(VTKVERSION) -lvtkFiltersCore-$(VTKVERSION) -lvtkFiltersHybrid-$(VTKVERSION) -lvtkIOLegacy-$(VTKVERSION) -lfreetype -lpng -ljpeg ##else ##VTKLIBS = -lvtkHybrid -lvtkImaging -lvtkIO -lvtkGraphics -lvtkFiltering -lvtkCommon -lfreetype ##endif ##CXXPFLAGS = -DLXLINUX $(shell wx-config --cxxflags) -Wno-deprecated $(shell freetype-config --cflags) -I$(VTKPATH) ##CCPFLAGS = -DLXLINUX $(shell wx-config --cflags) ##LXLIBDIR = linux ##PLIBS = $(shell wx-config --libs --gl-libs) -L$(VTKLIBPATH) $(VTKLIBS) -lGLU -lGL -lpthread -lX11 -lz ##LXPLATFORM = LINUX # PLATFORM DEBIAN CXX = c++ CC = gcc POBJECTS = lxR2P.o ifeq ($(VTKV6),1) VTKLIBS = -lvtkCommonExecutionModel-$(VTKVERSION) -lvtkCommonDataModel-$(VTKVERSION) -lvtkCommonCore-$(VTKVERSION) -lvtkFiltersCore-$(VTKVERSION) -lvtkFiltersHybrid-$(VTKVERSION) -lvtkIOLegacy-$(VTKVERSION) -lfreetype -lpng -ljpeg else VTKLIBS = -lvtkHybrid -lvtkImaging -lvtkIO -lvtkGraphics -lvtkFiltering -lvtkCommon -lfreetype endif CXXPFLAGS = -DLXLINUX $(shell wx-config --cxxflags) -Wno-deprecated $(shell freetype-config --cflags) -I$(VTKPATH) CCPFLAGS = -DLXLINUX $(shell wx-config --cflags) LXLIBDIR = linux PLIBS = $(shell wx-config --libs --gl-libs) -L$(VTKLIBPATH) $(VTKLIBS) -lGLU -lGL -lpthread -lX11 -lz LXPLATFORM = LINUX # PLATFORM WIN32 ##CXX = c++ ##CC = gcc ##POBJECTS = loch.res lxR2D.o getline.o ##CXXPFLAGS = -W -Wall -DLXWIN32 $(shell wx-config --static --cxxflags) $(shell freetype-config --cflags) -I$(VTKPATH) -Wno-deprecated ##CCPFLAGS = -W -Wall -DLXWIN32 $(shell wx-config --static --cflags) ##LXLIBDIR = mingw ##PLIBS = $(shell freetype-config --libs) $(shell wx-config --static --libs --gl-libs) -L$(VTKLIBPATH) $(VTKLIBS) ##LXPLATFORM = WIN32 ##STRIPFLAG = -static-libgcc -static -s # PLATFORM MACOSX ##CXX = c++ ##CC = cc ##POBJECTS = ##CXXPFLAGS = -W -Wall -DLXMACOSX $(shell wx-config --cxxflags) $(shell freetype-config --cflags) -I$(VTKPATH) -Wno-deprecated -I/usr/X11R6/include -I/usr/X11R6/include/freetype2 ##CCPFLAGS = -W -Wall -DLXMACOSX $(shell wx-config --cflags) -I/usr/X11R6/include ##LXLIBDIR = ##PLIBS = -lz -L/usr/X11R6/lib $(shell wx-config --libs --gl-libs) -L$(VTKLIBPATH) $(VTKLIBS) ##POSTMAKE = cp -f ./loch ./loch.app/Contents/MacOS ##STRIPFLAG = # PLATFORM ENDCONFIG # BUILD CONFIG # BUILD OZONE ##CCBFLAGS = -O3 ##CXXBFLAGS = -O3 ##LDBFLAGS = $(STRIPFLAG) # BUILD OXYGEN CCBFLAGS = -O2 CXXBFLAGS = -O2 LDBFLAGS = $(STRIPFLAG) # BUILD RELEASE ##CCBFLAGS = ##CXXBFLAGS = ##LDBFLAGS = $(STRIPFLAG) # BUILD DEBUG ##CCBFLAGS = -ggdb ##CXXBFLAGS = -ggdb -DLXDEBUG ##LDBFLAGS = # BUILD ENDCONFIG # compiler settings CXXFLAGS = -Wall -D_GNU_SOURCE -DLOCH $(CXXPFLAGS) $(CXXBFLAGS) CCFLAGS = -Wall -D_GNU_SOURCE -DLOCH $(CCPFLAGS) $(CCBFLAGS) OBJECTS = $(addprefix $(LOUTDIR)/,$(POBJECTS)) $(addprefix $(LOUTDIR)/,$(CMNOBJECTS)) # linker settings LIBS = $(PLIBS) LDFLAGS = $(LDBFLAGS) $(LOUTDIR)/%.o : %.cxx $(CXX) -c $(CXXFLAGS) -o $@ $< $(LOUTDIR)/%.o : %.cc $(CXX) -c $(CXXFLAGS) -o $@ $< $(LOUTDIR)/%.o : %.c $(CC) -c $(CCFLAGS) -o $@ $< all: $(LOUTDIR)/loch hlp hlp: make -C ./help $(LOUTDIR)/loch: $(OBJECTS) $(CXX) -o $(LOUTDIR)/loch -Wall $(OBJECTS) $(LIBS) $(LDFLAGS) $(POSTMAKE) $(LOUTDIR)/loch.res: loch.rc loch.ico windres -i loch.rc -I ../../wxMSW-2.8.10/include -I rc -o $(LOUTDIR)/loch.res -O coff graphs: dot -Tps graph-vispipe.dot -o graph-vispipe.ps depend: perl makedepend.pl > Makefile.dep perl maketest.pl Makefile.dep perl makefile.pl mv Makefile.dep Makefile $(CXX) -DLXDEPCHECK -DLOCH -MM *.cxx >> Makefile $(CC) -DLXDEPCHECK -DLOCH -MM *.c >> Makefile perl makedepend2.pl config-debug: perl makeconfig.pl BUILD DEBUG test-release: zip -9 loch.zip loch.exe test.th test.jpg thconfig config-release: perl makeconfig.pl BUILD RELEASE config-oxygen: perl makeconfig.pl BUILD OXYGEN config-ozone: perl makeconfig.pl BUILD OZONE config-linux: perl makeconfig.pl PLATFORM LINUX config-debian: perl makeconfig.pl PLATFORM DEBIAN config-win32: perl makeconfig.pl PLATFORM WIN32 config-macosx: perl makeconfig.pl PLATFORM MACOSX clean: perl makefile.pl rm -q *~ perl makefile.pl rm -q help/*/*~ perl makefile.pl rm -q loch.exe perl makefile.pl rm -q loch perl makefile.pl rm -q loch.app/Contents/MacOS/loch perl makefile.pl rm -q *.o perl makefile.pl rm -q *.log perl makefile.pl rm -q core perl makefile.pl rmdir -q .xvpics perl makefile.pl rm -q *.bmp perl makefile.pl rm -q *.ppm perl makefile.pl rm -q *.zip perl makefile.pl rm -q *.pdf perl makefile.pl rm -q *.png # DEPENDENCIES $(LOUTDIR)/lxAboutDlg.o: lxAboutDlg.cxx lxWX.h icons/about.xpm ../thversion.h $(LOUTDIR)/lxData.o: lxData.cxx lxData.h lxMath.h lxImgIO.h lxFile.h lxLRUD.h $(LOUTDIR)/lxFile.o: lxFile.cxx lxFile.h lxMath.h img.h $(LOUTDIR)/lxGLC.o: lxGLC.cxx lxGLC.h lxMath.h lxGUI.h lxData.h lxImgIO.h lxFile.h \ lxSetup.h lxSView.h lxWX.h lxFNT6x13_bdf.h lxFNT10x20_bdf.h \ lxFNTFreeSans_ttf.h lxRender.h lxTR.h $(LOUTDIR)/lxGUI.o: lxGUI.cxx lxGUI.h lxGLC.h lxMath.h lxData.h lxImgIO.h lxFile.h \ lxSetup.h lxRender.h lxOptDlg.h lxAboutDlg.h lxSView.h lxWX.h lxSScene.h \ lxSTree.h lxPres.h icons/open.xpm icons/render.xpm icons/reload.xpm \ icons/stereo.xpm icons/rotation.xpm icons/lockrot.xpm icons/fit.xpm \ icons/home.xpm icons/rendersetup.xpm icons/plan.xpm icons/profile.xpm \ icons/fullscreen.xpm icons/orto.xpm icons/camera.xpm icons/scene.xpm \ icons/viscline.xpm icons/vissurface.xpm icons/visbbox.xpm \ icons/viswalls.xpm icons/visinds.xpm icons/visentrance.xpm \ icons/visfix.xpm icons/visstation.xpm icons/vislabel.xpm loch.xpm $(LOUTDIR)/lxImgIO.o: lxImgIO.cxx lxImgIO.h $(LOUTDIR)/lxLRUD.o: lxLRUD.cxx lxLRUD.h lxMath.h $(LOUTDIR)/lxMath.o: lxMath.cxx lxMath.h $(LOUTDIR)/lxOGLFT.o: lxOGLFT.cxx lxOGLFT.h $(LOUTDIR)/lxOptDlg.o: lxOptDlg.cxx lxWX.h lxGUI.h lxGLC.h lxMath.h $(LOUTDIR)/lxPres.o: lxPres.cxx lxPres.h lxWX.h lxGUI.h lxGLC.h lxMath.h lxSetup.h \ lxData.h lxImgIO.h lxFile.h loch.xpm $(LOUTDIR)/lxRender.o: lxRender.cxx lxRender.h lxWX.h lxGLC.h lxMath.h lxGUI.h \ lxSetup.h lxData.h lxImgIO.h lxFile.h lxTR.h $(LOUTDIR)/lxSScene.o: lxSScene.cxx lxSScene.h lxWX.h lxGUI.h lxGLC.h lxMath.h \ lxSetup.h lxData.h lxImgIO.h lxFile.h loch.xpm $(LOUTDIR)/lxSTree.o: lxSTree.cxx lxSTree.h lxWX.h lxGUI.h lxGLC.h lxMath.h \ lxSetup.h lxData.h lxImgIO.h lxFile.h loch.xpm $(LOUTDIR)/lxSView.o: lxSView.cxx lxSView.h lxWX.h lxGUI.h lxGLC.h lxMath.h \ lxSetup.h lxData.h lxImgIO.h lxFile.h loch.xpm $(LOUTDIR)/lxSetup.o: lxSetup.cxx lxSetup.h lxData.h lxMath.h lxImgIO.h lxFile.h $(LOUTDIR)/lxWX.o: lxWX.cxx lxWX.h $(LOUTDIR)/getline.o: getline.c $(LOUTDIR)/img.o: img.c img.h $(LOUTDIR)/lxR2D.o: lxR2D.c lxR2D.h $(LOUTDIR)/lxR2P.o: lxR2P.c lxR2P.h $(LOUTDIR)/lxTR.o: lxTR.c lxTR.h therion/loch/loch.app/0000775000175000017500000000000012426430421013675 5ustar userusertherion/loch/loch.app/Contents/0000775000175000017500000000000012426432574015505 5ustar userusertherion/loch/loch.app/Contents/Resources/0000775000175000017500000000000012426433153017451 5ustar userusertherion/loch/loch.app/Contents/Resources/loch.icns0000664000175000017500000025015112053734164021262 0ustar userusericnsPiTOC His32`s8mkil32ül8mkit32 Òt8mk@ic08.áic09Ææis32`‚ÿƒÿ‚ÿ€ÿÿÿ€ÿÿÿ„ÿÿÿÿÿÿÿ€€ÿÿÿ€ ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿ€ÿÿÿ€ÿ‚ÿ€ÿÿƒÿÿƒÿÿ‚€ÿƒŽÿ‚ÿƒÿ‚ÿ€ÿÿÿ€ÿÿÿ„ÿÿÿÿÿÿÿ€€ÿÿÿ€ ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿ€ÿÿÿ€ÿ‚ÿ€ÿÿƒÿÿƒÿÿ‚€ÿƒŽÿ‚ÿƒÿ‚ÿ€ÿÿÿ€ÿÿÿ„ÿÿÿÿÿÿÿ€€ÿÿÿ€ ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿ€ÿÿÿÿÿ€ÿÿÿ€ÿ‚ÿ€ÿÿƒÿÿƒÿÿ‚€ÿƒŽÿs8mkÿÿÿÿÿÿ ÆË²ÿÿíÿþÿÿýÿÿÿÿÿß‘ÿÿ¢ÿüÿÿÿýÿÿÿÆÿÿÿúÿrÿÿ¥ÿÿÿÿÑÿÿ©ÿÿÿÿ¦ÿÿÌÿÿÿÿ¹ÿÿòÿÿÿÿæÿÿiÿÈÿÿ×ÿdÿÿÞÿÿÿÿÈÿÿÊÿ¬ÿÿÿÿùÿÿÿ¡ÿù“ÿÿÿÿÿÿÿûÿ ÿÿâÿýÿüÿÿÿããȰŒÿÿU°¦¡½¿ÿÿÿÿÿÿÿÿÿÿÿÿÿil32üŒÿ€„‘‘ÿ€‘†ÿ‘Žÿ€€ÿš“´Í‚ÿ¿œÿ€Šÿ‘ÿ·ûê‚D‚dàÖƒˆÿš‘ÿµÿuˆ4ÿÿ‡ÿš€ÿ~Œÿÿ€…ÿšÿ¤ûƒUÕùÿÿûï³£ÿšƒÿšÿŸÁ‚ °ÿăÿÿš‰ÿ€&àÿ‘ƒÿÿÿ)û¦ÿÿ€€‘ÿÿ€ÿÿ‘‚ÿ€ÿÿIÝ€ÿ‘‘ÿ ƒÿÝ)÷ƒÿ€ÿšÿ£³€HËÿƒš„ÿ ‘ÿÇRÝœÿ€ÿ ‘ÿÝ))ÝÿŠ…ÿ ‘ÿÇRâ’ÿ€ÿ€ÿÿ€ìšÿ†ÿ‘ÿÄUâ’ÿÿÿÿ—â€ÿÿ‘‡ÿ‘ÿÊKÝœÿÿÿÿœÝRÇÿ‘‡ÿ‘ÿÿ€÷ƒÿÿÿÿœÝUÄÿ‘‡ÿ€ÿÿ€ÿÿ‘€ÿ ÿ—âKÊÿ‘†ÿ ÿ’â&àÿ‘ÿ€ÿÿ€ÿÿ‘†ÿ €ÿµ}}µÿ€ÿ‘ÿÿ€ÿÿ†ÿ€ÿÿ€ô”ÿÿ ‘ÿÇR®¤ÿš„ÿ šÿ£³+Ûÿ€‚ÿÿšÚ€ÿÿ€„ÿ”ÿÿ€ì“ÿƒÿ€ÿÿ€Öÿ‚ÿ ‘ÿËH.Úÿ‘„ÿ šÿ£³.Úÿ‘ÿ‘ÿÍH€ì“ÿ‚ÿš€‘ÿÿ€ ì“ÿÿÿšÿ§§€}µÿš€ƒšÿÿÿÿšÿÃY.Úÿ‘ÿšÿŸÈ€2×—ƒÿ€ÿ£Íÿûÿ]ð‘ÿ€ÿÿ‚ 6ÿÕÜùÿ¤ÿÿ´²D…UÄÿƒÿœÝˆ÷ƒÿÿ‡}´ÿ€ÿÿˆÝ—ÿü‚)U{êü€ÿ€ÿµ®K€UR`&+€ÿ ŸùÜÜìÿÿÝÅ·š€€ÿ ÿ¦ÊÅÄÄÇ¿àÿÿÛ‘€ÿƒ——“ƒÿ‘‚ÿ‡ÿšÿš€ÿÿ‘€„ÿš‡‘ÿŒÿ€„‘‘ÿ€‘†ÿ‘Žÿ€€ÿš“´Í‚ÿ¿œÿ€Šÿ‘ÿ·ûê‚D‚dàÖƒˆÿš‘ÿµÿuˆ4ÿÿ‡ÿš€ÿ~Œÿÿ€…ÿšÿ¤ûƒUÕùÿÿûï³£ÿšƒÿšÿŸÁ‚ °ÿăÿÿš‰ÿ€&àÿ‘ƒÿÿÿ)û¦ÿÿ€€‘ÿÿ€ÿÿ‘‚ÿ€ÿÿIÝ€ÿ‘‘ÿ ƒÿÝ)÷ƒÿ€ÿšÿ£³€HËÿƒš„ÿ ‘ÿÇRÝœÿ€ÿ ‘ÿÝ))ÝÿŠ…ÿ ‘ÿÇRâ’ÿ€ÿ€ÿÿ€ìšÿ†ÿ‘ÿÄUâ’ÿÿÿÿ—â€ÿÿ‘‡ÿ‘ÿÊKÝœÿÿÿÿœÝRÇÿ‘‡ÿ‘ÿÿ€÷ƒÿÿÿÿœÝUÄÿ‘‡ÿ€ÿÿ€ÿÿ‘€ÿ ÿ—âKÊÿ‘†ÿ ÿ’â&àÿ‘ÿ€ÿÿ€ÿÿ‘†ÿ €ÿµ}}µÿ€ÿ‘ÿÿ€ÿÿ†ÿ€ÿÿ€ô”ÿÿ ‘ÿÇR®¤ÿš„ÿ šÿ£³+Ûÿ€‚ÿÿšÚ€ÿÿ€„ÿ”ÿÿ€ì“ÿƒÿ€ÿÿ€Öÿ‚ÿ ‘ÿËH.Úÿ‘„ÿ šÿ£³.Úÿ‘ÿ‘ÿÍH€ì“ÿ‚ÿš€‘ÿÿ€ ì“ÿÿÿšÿ§§€}µÿš€ƒšÿÿÿÿšÿÃY.Úÿ‘ÿšÿŸÈ€2×—ƒÿ€ÿ£Íÿûÿ]ð‘ÿ€ÿÿ‚ 6ÿÕÜùÿ¤ÿÿ´²D…UÄÿƒÿœÝˆ÷ƒÿÿ‡}´ÿ€ÿÿˆÝ—ÿü‚)U{êü€ÿ€ÿµ®K€UR`&+€ÿ ŸùÜÜìÿÿÝÅ·š€€ÿ ÿ¦ÊÅÄÄÇ¿àÿÿÛ‘€ÿƒ——“ƒÿ‘‚ÿ‡ÿšÿš€ÿÿ‘€„ÿš‡‘ÿŒÿ€„‘‘ÿ€‘†ÿ‘Žÿ€€ÿš“´Í‚ÿ¿œÿ€Šÿ‘ÿ·ûê‚D‚dàÖƒˆÿš‘ÿµÿuˆ4ÿÿ‡ÿš€ÿ~Œÿÿ€…ÿšÿ¤ûƒUÕùÿÿûï³£ÿšƒÿšÿŸÁ‚ °ÿăÿÿš‰ÿ€&àÿ‘ƒÿÿÿ)û¦ÿÿ€€‘ÿÿ€ÿÿ‘‚ÿ€ÿÿIÝ€ÿ‘‘ÿ ƒÿÝ)÷ƒÿ€ÿšÿ£³€HËÿƒš„ÿ ‘ÿÇRÝœÿ€ÿ ‘ÿÝ))ÝÿŠ…ÿ ‘ÿÇRâ’ÿ€ÿ€ÿÿ€ìšÿ†ÿ‘ÿÄUâ’ÿÿÿÿ—â€ÿÿ‘‡ÿ‘ÿÊKÝœÿÿÿÿœÝRÇÿ‘‡ÿ‘ÿÿ€÷ƒÿÿÿÿœÝUÄÿ‘‡ÿ€ÿÿ€ÿÿ‘€ÿ ÿ—âKÊÿ‘†ÿ ÿ’â&àÿ‘ÿ€ÿÿ€ÿÿ‘†ÿ €ÿµ}}µÿ€ÿ‘ÿÿ€ÿÿ†ÿ€ÿÿ€ô”ÿÿ ‘ÿÇR®¤ÿš„ÿ šÿ£³+Ûÿ€‚ÿÿšÚ€ÿÿ€„ÿ”ÿÿ€ì“ÿƒÿ€ÿÿ€Öÿ‚ÿ ‘ÿËH.Úÿ‘„ÿ šÿ£³.Úÿ‘ÿ‘ÿÍH€ì“ÿ‚ÿš€‘ÿÿ€ ì“ÿÿÿšÿ§§€}µÿš€ƒšÿÿÿÿšÿÃY.Úÿ‘ÿšÿŸÈ€2×—ƒÿ€ÿ£Íÿûÿ]ð‘ÿ€ÿÿ‚ 6ÿÕÜùÿ¤ÿÿ´²D…UÄÿƒÿœÝˆ÷ƒÿÿ‡}´ÿ€ÿÿˆÝ—ÿü‚)U{êü€ÿ€ÿµ®K€UR`&+€ÿ ŸùÜÜìÿÿÝÅ·š€€ÿ ÿ¦ÊÅÄÄÇ¿àÿÿÛ‘€ÿƒ——“ƒÿ‘‚ÿ‡ÿšÿš€ÿÿ‘€„ÿš‡‘ÿl8mk   Éÿÿÿÿÿ«+ ›þþýÿÿÿÿÿþÿû×  ’ÿÿÿÿüúùøøøúûüÿÿÿþÿüúúûÿÿÿÿÿÿüýøÿÿWþÿûüüýÿþýýÿÿþþÿþþÿü]Søÿúþûÿûÿº5 ÿÿýûÿã ÿÿùþûÿþ` ÿÿùÿÿ ÿÿúÿþýá  áÿùÿþ ]üÿþþÿÆ  ¼ÿúÿý+ áÿûüÿá ¼ÿúÿý'ÿÿúÿü ºÿúÿý'&ýÿúÿÿ Ãÿúÿý++ýÿúÿ¼ ÿÿùÿþ +ýÿúÿº ÿÿøÿÿ &ýÿúÿà 'ýÿúÿã ÿÿøÿÿ ’ÿþýÿ’ ÿÿøÿÿÿÿúÿý ¼ÿûÿþa]üÿûÿß0ýÿûÿÿÿÿúÿüÿÿúÿü5 ÆÿþûÿÜ ]üÿûÿÜ Åÿþüÿü ÿÿúÿüiüÿýÿÿ’ ¶ÿþûÿÜ IùÿüþÿÙ5, ]Éÿþÿöûÿýÿýÿÿûÿÿüìÿýþýÿa“þÿþÿÿÿÿÿÿúÿº +ýÿþÿÿÿÿÿÿÿýÿþ ÿÿöúùùúûûüþÿ“ÿÿøûûûúúúú÷þý,ýÿûÿÿÿÿÿÿüþý—þÿþÿÿÿÿÿÿýÿÿIýþþüÿÿá¹–`ùºº¼°ãÿÿß ,,   it32 Òÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ‰êÿ“åÿœÛÿ¢Óÿ©Ïÿ¬Íÿ¯Éÿ²Çÿ´ÅÿµÄÿ·Áÿ™ˆÿ“Àÿ“•ÿ½ÿ’šÿ‹¼ÿ’œÿ‹¹ÿ¢ÿ‹·ÿŽ¥ÿеÿ¦ÿгÿ¨ÿ‰±ÿ‘ªÿ‰¯ÿ‘¬ÿˆ®ÿ‘­ÿ‰¬ÿ‘¯ÿˆ«ÿ‘°ÿ‰©ÿ³ÿˆ©ÿ޵ÿˆ¨ÿŽ·ÿ‡¨ÿŒ¹ÿ‡§ÿŒºÿˆ¦ÿ‹»ÿˆ¥ÿ‹¼ÿˆ¥ÿнÿˆ¤ÿ‹½ÿˆ¤ÿ‹½ÿˆ¤ÿоÿˆ¤ÿ‰¿ÿˆ¤ÿˆÀÿˆ£ÿ‰Àÿˆ£ÿ‰Àÿˆ£ÿ‰Àÿˆ£ÿˆÁÿˆ£ÿˆÁÿˆ£ÿˆÁÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿˆÁÿˆ£ÿˆÁÿˆ£ÿˆÁÿ‡¤ÿˆÁÿ‡¤ÿˆÀÿˆ¤ÿˆÀÿˆ¥ÿ‡¿ÿ‰¥ÿ‡¿ÿˆ¦ÿˆ¾ÿˆ¦ÿ‰½ÿ‡§ÿ‰¼ÿˆ¨ÿˆ¼ÿˆ¨ÿˆ»ÿ‰¨ÿ‡¼ÿ‰¨ÿˆºÿ‰©ÿˆºÿ‰©ÿ‰¹ÿˆ«ÿˆ¸ÿ‰«ÿ‰¶ÿ‰­ÿˆ¶ÿ‰­ÿ‰µÿˆ®ÿ‰´ÿ‰¯ÿˆ³ÿ‰°ÿ‰²ÿ‰±ÿˆ±ÿ‰²ÿˆ°ÿгÿˆ®ÿŠ´ÿˆ­ÿ‹´ÿ‰¬ÿжÿˆ«ÿŠ·ÿˆ«ÿŠ·ÿ‰©ÿЏÿ‰¨ÿйÿ‰¨ÿ‰»ÿ‰¦ÿ‰¼ÿ‰¥ÿнÿ‰£ÿŠ¿ÿˆ£ÿŠ¿ÿ‰ ÿ‹ÀÿŠŸÿŠÂÿ‰žÿŠÃÿ‰ÿ‹Äÿ‰œÿŠÅÿ‰›ÿŠÅÿ‹™ÿ‘½ÿ–ÿ–¹ÿ”ÿ¨’ÿ§“ÿªŽÿ©’ÿ«Žÿ©’ÿ¬Œÿª’ÿ¬Œÿª’ÿ¬Œÿª“ÿ«Œÿ©”ÿªŽÿ§–ÿ©Žÿ§˜ÿ¥’ÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ‰êÿ“åÿœÛÿ¢Óÿ©Ïÿ¬Íÿ¯Éÿ²Çÿ´ÅÿµÄÿ·Áÿ™ˆÿ“Àÿ“•ÿ½ÿ’šÿ‹¼ÿ’œÿ‹¹ÿ¢ÿ‹·ÿŽ¥ÿеÿ¦ÿгÿ¨ÿ‰±ÿ‘ªÿ‰¯ÿ‘¬ÿˆ®ÿ‘­ÿ‰¬ÿ‘¯ÿˆ«ÿ‘°ÿ‰©ÿ³ÿˆ©ÿ޵ÿˆ¨ÿŽ·ÿ‡¨ÿŒ¹ÿ‡§ÿŒºÿˆ¦ÿ‹»ÿˆ¥ÿ‹¼ÿˆ¥ÿнÿˆ¤ÿ‹½ÿˆ¤ÿ‹½ÿˆ¤ÿоÿˆ¤ÿ‰¿ÿˆ¤ÿˆÀÿˆ£ÿ‰Àÿˆ£ÿ‰Àÿˆ£ÿ‰Àÿˆ£ÿˆÁÿˆ£ÿˆÁÿˆ£ÿˆÁÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿˆÁÿˆ£ÿˆÁÿˆ£ÿˆÁÿ‡¤ÿˆÁÿ‡¤ÿˆÀÿˆ¤ÿˆÀÿˆ¥ÿ‡¿ÿ‰¥ÿ‡¿ÿˆ¦ÿˆ¾ÿˆ¦ÿ‰½ÿ‡§ÿ‰¼ÿˆ¨ÿˆ¼ÿˆ¨ÿˆ»ÿ‰¨ÿ‡¼ÿ‰¨ÿˆºÿ‰©ÿˆºÿ‰©ÿ‰¹ÿˆ«ÿˆ¸ÿ‰«ÿ‰¶ÿ‰­ÿˆ¶ÿ‰­ÿ‰µÿˆ®ÿ‰´ÿ‰¯ÿˆ³ÿ‰°ÿ‰²ÿ‰±ÿˆ±ÿ‰²ÿˆ°ÿгÿˆ®ÿŠ´ÿˆ­ÿ‹´ÿ‰¬ÿжÿˆ«ÿŠ·ÿˆ«ÿŠ·ÿ‰©ÿЏÿ‰¨ÿйÿ‰¨ÿ‰»ÿ‰¦ÿ‰¼ÿ‰¥ÿнÿ‰£ÿŠ¿ÿˆ£ÿŠ¿ÿ‰ ÿ‹ÀÿŠŸÿŠÂÿ‰žÿŠÃÿ‰ÿ‹Äÿ‰œÿŠÅÿ‰›ÿŠÅÿ‹™ÿ‘½ÿ–ÿ–¹ÿ”ÿ¨’ÿ§“ÿªŽÿ©’ÿ«Žÿ©’ÿ¬Œÿª’ÿ¬Œÿª’ÿ¬Œÿª“ÿ«Œÿ©”ÿªŽÿ§–ÿ©Žÿ§˜ÿ¥’ÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ‰êÿ“åÿœÛÿ¢Óÿ©Ïÿ¬Íÿ¯Éÿ²Çÿ´ÅÿµÄÿ·Áÿ™ˆÿ“Àÿ“•ÿ½ÿ’šÿ‹¼ÿ’œÿ‹¹ÿ¢ÿ‹·ÿŽ¥ÿеÿ¦ÿгÿ¨ÿ‰±ÿ‘ªÿ‰¯ÿ‘¬ÿˆ®ÿ‘­ÿ‰¬ÿ‘¯ÿˆ«ÿ‘°ÿ‰©ÿ³ÿˆ©ÿ޵ÿˆ¨ÿŽ·ÿ‡¨ÿŒ¹ÿ‡§ÿŒºÿˆ¦ÿ‹»ÿˆ¥ÿ‹¼ÿˆ¥ÿнÿˆ¤ÿ‹½ÿˆ¤ÿ‹½ÿˆ¤ÿоÿˆ¤ÿ‰¿ÿˆ¤ÿˆÀÿˆ£ÿ‰Àÿˆ£ÿ‰Àÿˆ£ÿ‰Àÿˆ£ÿˆÁÿˆ£ÿˆÁÿˆ£ÿˆÁÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿ‰Áÿˆ¢ÿˆÁÿˆ£ÿˆÁÿˆ£ÿˆÁÿ‡¤ÿˆÁÿ‡¤ÿˆÀÿˆ¤ÿˆÀÿˆ¥ÿ‡¿ÿ‰¥ÿ‡¿ÿˆ¦ÿˆ¾ÿˆ¦ÿ‰½ÿ‡§ÿ‰¼ÿˆ¨ÿˆ¼ÿˆ¨ÿˆ»ÿ‰¨ÿ‡¼ÿ‰¨ÿˆºÿ‰©ÿˆºÿ‰©ÿ‰¹ÿˆ«ÿˆ¸ÿ‰«ÿ‰¶ÿ‰­ÿˆ¶ÿ‰­ÿ‰µÿˆ®ÿ‰´ÿ‰¯ÿˆ³ÿ‰°ÿ‰²ÿ‰±ÿˆ±ÿ‰²ÿˆ°ÿгÿˆ®ÿŠ´ÿˆ­ÿ‹´ÿ‰¬ÿжÿˆ«ÿŠ·ÿˆ«ÿŠ·ÿ‰©ÿЏÿ‰¨ÿйÿ‰¨ÿ‰»ÿ‰¦ÿ‰¼ÿ‰¥ÿнÿ‰£ÿŠ¿ÿˆ£ÿŠ¿ÿ‰ ÿ‹ÀÿŠŸÿŠÂÿ‰žÿŠÃÿ‰ÿ‹Äÿ‰œÿŠÅÿ‰›ÿŠÅÿ‹™ÿ‘½ÿ–ÿ–¹ÿ”ÿ¨’ÿ§“ÿªŽÿ©’ÿ«Žÿ©’ÿ¬Œÿª’ÿ¬Œÿª’ÿ¬Œÿª“ÿ«Œÿ©”ÿªŽÿ§–ÿ©Žÿ§˜ÿ¥’ÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿt8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýúôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿic08.á‰PNG  IHDR\r¨f$iCCPICC Profile8…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqxl+*pIDATxí]ݯÇ•¯ ̇`ÙxùòÎÊKÈ®c ´kK,¶Ì œÈ7a"'í>XZ¤(yɰ/‘_"‹k%Xoä+ {meeot£Ø‰—qÀ,¬Í—ÃÝókøÁLßêžê™ªîªžs¤s{¦§ouÕ¯ªÏ9uêœê‰™™£¤(ã‰Àœñl¶¶ZP€€ ŠÀ# `Œ;_›®¨Ð1 Œ1*ƸóµéŠ€ ŠÀ# `Œ;_›®¨Ð1 Œ1*ƸóµéŠ€ ŠÀ# `Œ;_›®¨Ð1 Œ1*ƸóµéŠ€ ŠÀ# `Œ;_›®Ü¡Œ%ÒêùÂs+¶þäú ãØý§Üô_…qì¥kò劰nnÑ‹ŠÃg µð<øk„—UlÛßËõ /ªø¾.ǽQ‡«¹?–ïþ2w^¿@`Bw€P;^!ÍzVø››ñuá¦p<èxà{éWòå9áS½'õó`šêÈÁ5Ó+|"€~ƃK·0AJ„v|ÃRa´í’0A{ËA-€*Ã%Ýkó¿iMîÉ"Ë`Ð}ÆÞrP `ÐIë÷¼¦gíƒhü«W¯šééisêTË{ÅŠfýúõfÞ¼ylGѱÈ2(ºžç‹,‡±± Tp(´ã;K8?·ÇyšÿÞZúᇚ}ûö™wÞyÇ[™½=òÈ#fÙ²e¦Óéôžöù™x=‘+tl,¹žôk‘fÏWw(M?¬&ã7Ì̧Ÿ~𝇗ï|ðY¸p¡Ù´iS_y,ƒ¾ÿ³|)²ò–Ak-–Qá)jª¼fÏWu(M?¬&?sæŒùì³ÏòuðöeW°ò–-‚—¥ÜVŨ°”æÏå5þPš½¨yZ“ÕcØóE–Á òF°Ø åÏ ‡ñzj@€ßUu„"©ùŸ’2F^§ÏkzÖ+VÏú :Yƒþ¯Èrp° hÜ#÷è7HÞ7 `Ш©÷wj|‰òšž…¥¦ñYïQE–CË€ýÃUƒä}*FU£ý?5>v§¹~‘fÏW%uMŸoϨߋ,‡¼ePbÐ`U’÷ ¨`W6s¤F¡wß) kT¤Ùóÿ0®š>àïyË`‹ Y߀ €A£#ÌïÔüNsý¼ÆWÍî·Sò–-‚]»v ŠD¤E@ß@r«*üŽ%×Ò¨ùæúy¯šÝæá®£EpéÒ%×HDögr–€ €áÆÈ°ÿ5”æß¿Ј»aÓÖÿ£E€(ÇÞHDß-)Á¦+|6vŒTÔÛCÔ•4ÿ¡C‡‚FÜÕ A:w£%€)ÈÁ7Àþ]*—ÿ›° §”m 1üÂõ}ëÇ5Rh äà€BÅ~HO>(=©POQ3”j~ë×ÓÃÞ…ƒoà¼Ü=©ÓEÀ>¨t}Ÿš_çú7ÀŠõ/-ú¶oßnÖ®]kî»ï¾|•ˉÍÂܨÇ(I@˜n¡ÆwZß§æ×¹~˜Îð]*-³gÏš={öØ@GîùŒ0|Ï G›; @zÇ#Qó—Îõy?ÕüD"­#-¹sçš;wÚ*|¿0r^Ž2‹P€ôŒG¢æ/ëó~ªù‰DšÇE‹™»ï¾»¬òÑÆ¨(ë>÷ßTó»cÕš+á |å•W²= ö.ĸÀª@´ñ*ü GJzÕü³ñt}[ÏÄìûÌG}”hÁ0`ïBŽL ¢ŠP0ÚsÒüŸ|ò‰ùãÿxkï¼¶Åòc×ÞU«V™{î¢óGy>yò¤Áœ;FúüóÏ ƒ%¹´¢‹P0ÚÈ¢d/ÕüxøŸþyóî»ïfwk[,ÿW¾ò3999kóΛЭÙ!(_xá…[‚s´® ÷ß\H1>@@µqATº¾ãcÎ;gÞ|óMsìØ1žŠúXU£#DvïÞ½Þ·ï^·nÁCUuÛñº-® ¤  Ú£H﴾Ϣá)†Ç8 Ñg5I2+W®œu~Ô(s÷îÝfëÖ­•ŠjÊr %R|€ ·¡EÍ_i}ŸoÌyûí·3Mæv«ú®*Òô¡4zÕ–¡~>úhÕ3yË¡.‹€–@…ø€)i\WølåFzún@Ró—ÎõY×÷iºÂQqlT¤éCiôºÚŸ·ê¶*Ä4¾* À>*©ññàƒœæúÐxW^ì1ýÔü0­CÌÝ/ÆÀc×Ü*¼‘C1Ò¸Ì[´j]ǪB…ø8H_žn„Fº‘×sSjüJs}jþÈcúgnjþ ,[…˜»KáÁß/Œ]s«ð~VØëkËi`©®ŽU… ñ¥­×ªäûZ7Iãs®ßôú>5û õø!æøU5:ü}ÂU“`/°Y ^ùèD¥–-ë@;‡¶òñ%Yƒç¤u9¨¸1¾FÒøœë7½¾_4§Ï=BCÌñ«jt\®J¼Ìâ*äd9Ôm 8¬ TickÇU ¥ñÙ±ÌõóÍÎ&ñX¤é‡Õè,×õˆû¿çzqÏuyËÁjä-ÇgÎYhìÄU™™³eËÛ- ýa4Fã*†Òøì¥Xæúy?„fg“x¤ÎÏ݇Õè,7ô‘õ¦åPjÐXºtiËJ°ÑwÞy§ÁÒ …0ÿ¿h9_Û©qÔüNëùìjüØæú½øÔüÈ[fîN¨š:æ-ZèçY« ´Ð¯Èæ M‹/6óçÏ·Ýf¹œü–0~ì Ÿ®•ÆMPóc`à³QãÇ6×÷èŧ…ÀçÔ‰íÁfÏ [W ù/^lTw¤nÏC4’%8. ’æMãËàȈsþ šŸš}ÐC]ןM }¤EpFn„U…mÂaÞÜ¢»îºËlܸÑ\»v-h|ÀwÜa0]³êF<@#»‹¨¤ùcÓø8œóWÐüÔ„ù9=‹ä× ¼6¥#ÛÓš¶O`COìé_@Èø€9sæ˜%K–”áÖØ.ÂmNš?VÏSAóç5~Û4;!q=ÒÀ8˜Ìÿvóc/ƒñŸ~ú©y饗ÌåË—í" K +\›/ íÀIóǪñ9`+h~j릚ŸH„92>@í¾€’}®J}jÙ)(uP:÷å„õ£ Š`dÔC¶Æ2æ?ôº?B‹ï¿ÿ~³yóf³wï^ÓétlÕÁ9j~ë!¤ç£@ P]WÌ?þ;v˜ÉÉIƒdKˆš_çú% éOÍ#Џ*PÍÊŽb¾]1ÿ÷Þ{¯ùÞ÷¾g¿_@ªù €ÑÓq"а¢Ç|ÿšbþg&Ñ`ÖÊÜ8©š¿ý)>’'NœÈb³»Ýn-È" V‡…°~ÜžÖõ}A) ’sçÎ5XC­‰&¾øâ‹ìUÒ–ûuå"È à PR’@ `‰ž?¾Ájhâºÿc=fV¯^m»Ýi9ùªðïl?ê9E VRÁ³¢Ê:ˆëþÛ·oÏ^éd¹Qc‹,çõ”"5± €Þ@ÄÔJÔüY~÷HÅÀJŠ@RÄ.:‚fa`h¤©ù²ü ýk‹Ýn-|ˆ]”FâÅ®*¾iˆˆ?8ÿàPR’BÀÿÓã·ù¥€K–,1ØUÅ7 ñ‡å¿®ïzhyŠ@hb#C¼íG#þB;-?bVœBGÞŒø³ÞûæIø+CGK$@è@ìûVð*1øKfhkE]HRÔØ‹cW¾hÄ_/"ú9i’¡#/\¸`®\Á¶p³H#þfA¢'RFÀ¿ =e4nÖ½$æ_#þZпڄÛÄnXsnWßï'®ÿoذ¡(æûÄa¿8%E Ä.jÍàúÿ¶mÛŠbþ[ÑéÚE€Ä*ÉpXÿ¯u·Xv’PÄ*:ÒàÚsÖÿ5æ?ÔHÔrA VÐH€ÃúÿkÒKóßÈPÕ›†@ VÐH@ À]ù ëÿø¬¤´X@#9%=ªëÿ%àèOé"«°":ÀzÓ'uý¿ý)]’¡sJºQ×ÿKÀiáOµÆŸ4‰_R‘€ æ4ÙGzïú¨5þ¤þæÝ¾cR@è€Û°è§1E ‘ø“&±NJ4 ”Þ{,èH+k?iY=è—dö\¥[Œ@#ñ'MŽ»¤|¡^I`è[kùq ÐHüI“ãN-xY€q O­Ehj?‰aÜ©!¥Y€¡Ÿ«´ËøS cS³Ó~@=ÖÞºþ*þdáÂ…æÉ'Ÿ4Ø¢€‚gŸª@×,À‚á7~§­ëÿ¡âO.^¼h>ÿüó2”ƒgŸª ðk`Ù‹ßJ×ÿ}ÇŸôÎýïºËºÁwŸž}ª ||wågÍ,Ǩ ¿v¤µ­ÿ;Ìý»RŸZÆ Aº„4 °œý´XÚ²Yx­M¾ßAéàsº õ8,ü[}|žS@9ššXŽO[~=/ [É÷;(|NK¤"àà¤@9ÄšXŽOê¿öÎýaôÑ'Ÿ|b°855e|¾ƒÒÑç+ 8©±Þ b:R·Â¹¨õÿ<ºò[-sÖ!)€·õ nºF²F†Õx½UXJcÿÏ;gÞ|óMsìØ±°µ¸]zí>§¤|×®]3ˆ›®‘JcÃk¬‡Þ* ¥ý‹åºE‹°_ÕîsJJ¬^½Ú<þøãfÍš5Yü~ ÝB ñ ¹WRÖR Ø´áV shþW^yÅ\ºtÉ{;K²ÿj÷9%%Ö®]köìÙcvìØ‘Åï{ï™Ùvä戻„— +œû8pÀ|ôÑGÞ[Üdö_¾1±j5«$¼ï¾û xÁ‚æÈ‘#æèÑ£ùö õýŽ;î0Xëµ¼Äàû…¡ ¦„»ÂˆÔRJZcÿ{#aÍÆ@± €Ò¹Ðùóç³ø}_Ι3Ç`­·„ ýa@ÀK«@@hÕûïX;¤± zC¯"aËâ÷oñÖx_zé%333cÖ¯_oæÍƒÒGÀ ~€ aÄgO +¥‹ÆSGø aøyúÈwì? !ûuá1VЕ BÓB`Þ'ä»WÂ<ó½³gÏšeË–™N§ST¾Uc]¬ç£E #5ø‚ÀçZ(†ì¿|Cc0±Á°ÐIë…ƒR2ÁÒÛ·oÏ^CެsÆÜ5ú5~jýïû7ý—ïšXë<š7ÂS‹ƒf‚« Ð{¹~NZcÿæþ]oí]XwD xõêUsüøñ̰eË–t‡·Ö¼Þ¹m±ÿ1eÿå‰]äë›}xçwì£Ô::Ң¹?×ÿßzë-¯ëÿ1eÿå{4©@ V>tDàâÅ‹ <ÁJ­C€sø”f9–ûø’[uUf@öV”û_k’ ¤h "xé1mJçþ ÄþwNÌýÁø\;Å>˜'ˆÌÚ4-TD Ñ/‰Õæ%zL 繈Øÿ¨ïò»’k‚þ»¨5"HÇ«Í:éq$:òßµÏýj\:¾þäKb”µD.]ºÔ<ðÀfÓ¦MæÁ´{UN"@)-˜Õù­Úœû‡Êû/±(­®­Ž¡ÎÅ.ºÒpÌj‰\±bE–møÝï~·( 4K3þÁ~`}ôQÞŸÇŽ|À\‚–‰ !²æp„Z÷'€¼´±c*Àè5ä€1gûö·¿m+Þd0²Ú.ÐsQ!€ñýuá­Â³²þB½óĘýǺñ˜Š`}k9b8˜o%Tºž\òúS½,“Ûa‡mÂá> õÎ?Þ$Æì?ÖǤ@¨œÌ±ö@Б%)ˆe°ºÂ:àˆŠãÈu<ø»…Wت…~-Ø Êv¹ó¹Þ¹lÙùF$-Båp€Ó§Og«Ð ÕMñ|gÿÀô‡`%ßoüáMæþ]¹>¤Ú³ÿXG“Ì `ò†¯ømî `çÎĪ÷¨¾€^4âûÌÕëº?²>§§§³ÔoŸoü! sÄý#þ?ø»ÿX§¢cÒ€9Ë—/Ïvôñ%–úˆDrÇÒuÿ?üÐìÛ·Ï>|ØkÖQr˜ûcÊÒM(YVèc*À1Åœ€‰‰‰lÎî,õøF´¶òJ×ý_|ñÅLaøÖþçþdÿå{ P3 Í©ë›ÔàÑÚÊÃ`€ÐG\÷ýõ׳ݟú~ôð%¥¹?››Š8-~UØšOëÆ ,<´¾¦|ˆ ÔÝ‚9ªš;b<ǼîÍÜŸ]”Ê~]©0¼¦`|î#úB½1ÈÁ`Õ8}•Ô/u °Ln‚u¬Ðt„û(‚uÿhæþ& €93RñIVžGú|¿1ˆå;ø¬sNþ¿ƒ#ÒºsöH*€õ-• ¾ßÄ›:øJ½Î,GÁèHÉÐúºî_âÔçP°:Âü·Ù]ØÚÛ7Ñ€õã‚Ý‚¹î¬Y‚¾Áw+‘™ß°]®ëþ6TnœKMt¥ÚðÀ)‰ß'BEÊ}2*Ù-¸#hdà ˜šø[š›¡ëþÅ]’š /ÀúÆ P‘„qã–°`ü AÖÕ QaüÂë¿YV@1ß_×ýû`éû’š`å­ûp5 Td Ã[„u5€=TÏ‘^k¶Ÿ®ûî„TÀ=Ò4pq5 Td ß"|ùòå¢,A] èë‘`_¨ùŸ’;fûq¯?¼í)¥ó_ÔþTâòõo42»A»XHW, 8EÍ5|¶BsÊRŠù/ U  ÑÈ@] (NÁÏ;i~zý±§Cè½þòý£Z÷Ï÷Pª + )\ í ÐÕ€ü0ªí;5?LÿBÍÚëŸbÌQ¥*¸PÊà°0!€ëžE£®úy¬°t„Kwø¡æß¿l?V» s¶%UÀú—F†ÊtX (]—fåõèŒ@G®éGÍèС a¬mæþlKê 420T– Ãj#Ó` t…a±( ñ,ô ­ùSÌ÷ùÜŸþô§ƒ®‰ù÷ËR¹Âи#$÷ÁTë¾æÍ›gþô§?™3g°J7:áuÏ(‚åƒst§|ÇIlgŽúýYXix°äû³€F‘ØÞûg?ûY¶) ‚®_¿ŽÓÞ ýŒŒÓ§Ÿ~:[ÆkäsôùßÔw…¿ŽšR·œ|¾³™à°g FŽ6ü9÷BŠ™õ´…ŽôËW½Ms¶-uÀv”úBe ê>„?ر#%cî€Ï}:Ò¯ïfò¥Ms¶­- Ô*KP÷ à0 väÜí¡#ýxOL!W­Z•í:•úº?ÛÄc[@WT*KP÷ à0 v,]M éÇVaÙwrrÒlß¾=›ûó|ϱ+Ÿ1þ^Æçd¨-€¾€Z³é ÐÈ@ïããr`–ßÔÔTH?¶†^ÿÍ›7›½{÷šN§ÃŸòGZ ïóŸ¯Ø ïmlg#Y‚Hø½ñWšåÇÂx»k® FüAû¯\¹2÷kß×RTß•‘}i›(Íô½À¾tˆ ÔÕ‚U~¤×¿4âsÿcÇŽ•—6â¯ôú[^Ï’¿”Xú;,uÌ?+œ?¶M”f †Z pˆ ¼(ÀÏÚ§>ßú=óôŒø«kîïàõÿXúl¿ð”pW89j›8-=ðª°õýØ/A<¾É!2P÷ p^ÿÒˆ¿PY~¬b¯?ü}§ø¿©Û&ºÒ…«¡:GW¼![êõg¬¨wú±¼þ‡ä`$Km¥«¡zIWFFãp ×?ÔÞ~¬=5ÿÖ­[]½þïñS=¶M°Éøj%] n'¯¨wú±ÖÔü»víj­×Ÿmå±­I8óØH¯\¹b.\ç¬uX @v îÀ1†šÿ)9µ[xÅíŸn¢×?ÔÞ~4ò^ÿÛ¨ÞøÔVogö=TD oæ°P:Çe9ct¤æ‡Àg+…öúWÐüÉ{ýó§žœo¿ÿ•|Ø$Œã-Â*ÀÙ³g3+«ØÝ×'aÝBñølIý_¹„ÒDqóèÓE¥Ž!Šço…w ÿ³ðƒÂ³6¨E„å¯ýkó‹_üÂüö·¿õ–Î-÷Ê‚)¾ßùÎwÌücóÐC¼@ÔBÐü¿Æ’ßÏ… ·¢ïÆJà¡D‡Ãäó¹?€ †ŒtŸ"1ðørLþÂ)<ëá—s}yþXiñ-°™ßÿýïß|ík_+zøQ•? c¹ïß…?³á€\7µu €ù?ü}ú½\ pØ'`B*6޾§9Ý{û9Dú½,ý•ôz߃Ðó¥­ 4"*¢¼B‘Ã>ãê pšós½?‚½ý8ç‡ÀçÖQ[@iD ÷ „SðäÉ“Ç'9ìÀˆ7z•ý‡'úlÐèe9Åø×µÃ³ü6lØ`ä÷OIÓ[©ùÙ¥mõÀÁvBšöáå·ˆ¾˜êØUÆ·5PÁ°@*çÒ¹[•k燿‘f!ÆR¸pÎ?==mðÖ%hþHööƒæoÕœ_ÚÓGmµ8#­Å ë#ú°Ë ´5CK15ðA|÷Ëý. CÓt…Qï6-kŒ?z½Ÿ÷xòÉ' ,€b~ÿ{¿·æ´ÕûÚšÖSš§ïÝ»wg;½"÷Û79ø8'†vìø¾Då9ùÌDðѲeËʶ”º(ukã~´p¶Iû:Â}Ä]}ß}÷Ýì<¦NÀ,1â¯{û ‹YÛ}U …9ᕾE¡v ¦/óN<ø rÔ¶ýœ¼þœó‡ÞÙ‡š¿B–ßorýÓÚ¯mì8¬á"Œóí>:G!ÈÌÂ÷ìÙc,ÚV@[¨# Î[…aX©®9?5ÿ8eùY·œ€uvxt±*€—L¬¾E«W¯6?þ¸á&“¾VxÄ “ ËŽ[¶láéÞ#–)¿%<_¸+ A•2•zýézg®÷;ìê ñaÌýÿ/eà«Ö}\qY$fe{¬]»Ö@3/_¾<{­´oÀ›Ñ~¥^Fúqù•øø>VØÕ÷}¹÷Ï…!R¾•`7`Ý'€qX €V Ec°_ÆV[J½þ¡wöaÿq½¿$ÖŸ—òKqcCã&J;šßwT`ï Ç`¿'¯è}ˆ¹Ãz?/}P>ü“ðJa„þbJ04n!·W‹z–9°°å{*à°{0çÎx¿ˆsÓØs¨ùŸ’:ï¶.·Òëjg¢×¿d½ÿÆ…·ÿBpÿZmù•°Ré[Ý­çÚš `m¬œ„÷ÿ…ר.`ŽPÃû<"õÛ$üUáß Çž+à”ßÿñÇ›_þò—A×ú+sÏ=÷˜§Ÿ~Ú<óÌ3Ù»ü,³à2a©mù;aàŸçTúCªîFvã@h'æ¦X–êK êm<}paEÀwd , °Ã~¬êŒ9éËÂðRÇf ×RÍ_—×éÒ¥Ù†/ˆóÿÉO~bŠ]‘ÐDfû£ÈB(ú?ßç½Y"ã"J禾{gPy9,‚õ†fzNøˆäÈúAೕêòú¯X±"[Íæâá·Ö=w’íÅRr“äe<Œ*¨ ;¿I”zîýMù\87åu75Õ ‚vNŸ>ÓˆÑ÷N9¼'5|1Y˜Ju„· âJÍ¿ÿþly•1ÿò?Aéý÷ß7ï¼óŽ-¯q  ëÂ3"0&$GcŽLù\û™ý‘ÒàŸ¼%2´E0ª DÄ3¡ž…”hª™}ûöÍÈúôÌ͘tdKºçöWÈ`™Ä9K #éGÍzg‚têÔ©l?dûæ^‡‡>S©ë<òÈ„ähÌët:³bC²«âýÃñ@Kdh‹ ªÀõ>|˜œ4k¬8ÞÌF›¡fzã7f0xø=T½é `ŽÀ¦Mð5‰ë\LØYƒ´¦äò®pSA+\­°Î—›ÒüÀìJ|ðA–£AüóÿWÒùKëþž·Dhp\`c §ä²ª€’‡ßÁI’d£ÍÈ4×™væÌ™ Äí Aóƒ¼kÿÅÞøË<Ù ÑHƒ²‰?Lpf9öY×g§H¿º4¿c£Ñ—ìWŒûÁB¦{sˆ¾‡þÈÿKSßóãâ÷RoæÑÝÂáÒ9Ÿüžq]:—†ôÁ'HДXçº85’VX¨ßkÂÓ,«¦#çþ0= óûëŠô¢Íì×ÌäÏãŸ/ýQd!ä¯õÝÁ¡E€©ÍAáË®uq±pMGxàœÏõ¦±\'É"â-¦V`µ8Hø½¶#-8 #Ý? #``@às1¿¿®H¿¾›øÂþ(²ÜÒZdK¤Ô2³î" MJç|,˜s?8cR ›;Ð4öÀç1¢F‚bÀþ¥ùr=~_.e}Kø![™´¨hÑØ®Iéû£éöä-‘{ï½7 p²¤•ó9Åþv‡\°v(ÇI²Ðë‹%˜θ;Ð ‹5Zû [ô¨ÿWºoA]ùý£6"µÿçx %òðÃ‹Ž´ –½ €­R¼½.}”ßÓ ¬Ã‹ÞW‰~¡æ)Ù? ©V_•Ï Kæ8˜šš²­½7U×ÖÜ—ã–ÂÎ;míƒìL.À¤4x;ùR9çëñ¢TNÉ%ûø¹§R8¸¡Š§bµ˜*D’”pû´‹€`%Îùr^tëµz²:Hb™?›ÅM'NœÈvUîv»qW´%µc$),Dlfcñ\tmjÞîúÙu:ç«Wk/Æ+µa­(Õƒ#Iñ%X_£‹i²¨÷&:çëEC?ÃJ©r«€ˆ#Iá(ØcÒù.`Va:盉žPjGÀ‡h( s¾Úû:ê^¹rÅ\¸0/Ò‰ª|øˆ†òèœ/ªqÐxeB¿W¡ñ¶¸C óÕ3" U¡]c'¾WaÍš5Ža¥zð1>†õ4OïòÅ_hר‰ïUرc‡ ñ–åØÛßTý|Œ¡|:ç ÛåÜÕö±Ç3ЮÑ<© Þ­ÐGÜK1ô{ún:Æ_`eAÐnذaäñ1”Ð9_ØÑÇwÙñe¢aïV©t¤Ñö- ÷þ7–§B¾W¡÷^ãü™o<Ú¶m[4 C Îùú‰ŽWJv‡wÙYßp4z –pZ®xUމŽp_Ü9ß«qòäIƒuj%ÿðG° ¨PHç¯Ê s¾<Œ~¾S²ïÞ½Û¬\¹²¬PtpûØu徨‰ŒÏ}Äq199i`Å(…A ÂVÀŘ%MtÎ7ס. d/y—v|Áûê m\7aÃ=06ØœÌßœãbÕªUYV ÓÂe«5µò`UøNŸ^xB:0¬- ¡oºÂ[~³žrÖÄIóB3Ô’»_xJ¸+Ü-‘ƒ­ëVÌÖ­[³ß‘&þ /ßlÕZ™œ¤Oˆ[“qCKÓºrÖÙ{–߬§\´ Ó­s>š{*é­žB²ãÁÇË+›Þr a‡…1~°#mß8B»z­˜uëÖõYr½R°%ØÞ½{l_>è¿Ø/¿t!Ÿ@Já‚dž ϯvIAÜF[%}/:ƒ?C’ÿð‡?4yÉnIïœ–Ò Ù!ŒcxEAGx›ð³ÂÖ—ÊùŒà œžž6©lÇzÇrtØ”UŃÿ/ÂoòÄ cŸä.¸ƒî#áÂ9ÿO%=‘p;!ÙM;· }}xYÉS³,–ž·x^Þ oV¬€—]Jw(§tÎÇåç~<¯G;ì¼ýüG'üyqGú$ðÚ²–@õ·[±è‚@p"i¹®WIï­—‹ò’ÝK¡ Aý`•œ†%ðMa|F…ã$»BÿŒ‚Ç|Я„‡ò ¹øò/QIŸa^Ë8ûž¦d‡é#Q1àÁAè8É ò‡ã>‚`(ß‹€l”üœO%=`÷OÞ$»ÿª•–HK€a0öZ<¯G? ­ñó·w±zÿG%}/þ?{“ìþ«V©Äü8©ôÏzñ@†Öøù’],€Þÿ5pTønžœ'Çw…¿zó»FCXþ·ðÝ,xƒS£ü8I­þ±××Û¸¨jÄŒÖOP* 0T2P…òõRE@ˆwŽVM€ €ÐkùŠ@Ĩˆ¸s´jŠ@hT„FXËW"F@@Ä£USB#  4ÂZ¾"1*"î­š"¡ÖòˆPqçhÕШ°–¯DŒ€ €ˆ;G«¦„F@@h„µ|E bTDÜ9Z5E 4*B#¬å+#  âÎѪ)¡Pa-_ˆwŽVM€ €ÐkùŠ@Äü?_cQôIEND®B`‚ic09Ææ‰PNG  IHDRôxÔú$iCCPICC Profile8…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqxl+@IDATxìÝ‹“å‘.üò±×WîèŽ$4 ˆ«dûÄñ®Ïî Nø¯ÞøÖ6ÙÇ!dc„‘$$w{×ë]ù+)åf4Ý]ÝÓ=SÝ‘S5ÕÕÕUOÕûæ“—÷­oüíokJ B ( B`µø«u¹uµ…@!P…@!"õ…@!P+ˆ@€¼éuÉ…@!P…@€z B ( D À ÞôºäB ( B @=…@!P…À "P`oz]r!P…@!P žB ( B`(°‚7½.¹( B (PÏ@!P…@!°‚XÁ›^—\…@!P¨g ( B XAЬàM¯K. B (ŠÔ3P…@!P¬ EVð¦×%…@!PEê( B (V"+xÓë’ B ( "õ …@!P+ˆ@€¼éuÉ…@!P…@€z B ( D À ÞôºäB ( B @=…@!P…À "P`oz]r!P…@!P žB ( B`(°‚7½.¹( B (PÏ@!P…@!°‚XÁ›^—\…@!P¨g ( B XAЬàM¯K. B (ŠÔ3P…@!P¬ EVð¦×%…@!Pß* B`e@ø¿ªÝσüÿ5Žû_¡÷†î ý§ÐçBÿñÖÿwÇò¿Cí·Œ’¸~÷aè+¡gB_¾õÿg±Lücõk’¸ÀÏzI!0wŠÌâúB W0üÚ=CôŸ™ã9þwBï EÖBŸ ýn誢ó@è•Ы¡°ø4ôBán9(‹Òð[–Û‚@€m¹~¤èÚû÷Bï ýv(cD YÈÆA°ûBÀûCEüÖª‰kví0€Å¿‡&ñJ f ý<Ô½°^RÌ"s‡¸~ è ?ˆ39úh(ãôýPáæYyBûŽÇãÝz4tOhºX]qÍ®Bÿ…~š˜Xm ˜ÿÿjŸ?†®‡Jæ@€ùc\¿Pô¡é‡BŸ Ý*ÀøÏ*'ÏøSQ¿u(T4`U €k‡ƒ®.àÏ¡ >%ú_QžÿõPQDà“Ð’B`î˜;Äõ…À¶!ÀЦ‡™FWH™‘aŸýŸ¡ÿŠˆ0ØHÀ,ıˆßæö›¢ «*€T¬3=‹$p²þU( vÂþÿŠ0 fîcÞËXÝ’äq<4#6ÖKV"+xÓë’—í™Áex3ÏÌ¸ÛÆ=sKÅÒ>öOc«[–4$i´?Ý–¾€pýÒ! qNCœ81Äjxþ¢–b?Da’÷Â3 ÒÖKVhI!P,ŒÍÁУ¡rü¼I;O_>úÇ¡*òUç—ÌžñgÀÝ'$í¹Pë"×B¥|wVý´c!YsðN¬¯‡"%+ˆÀ¬¬„®.¹èrú…>Êà3ü£‚øÌ>%ýD ïŸ(€Z†z–ý=€X ~Çz€a¥À*ÞõºæEA€Éh§.vîjϰ²Ï…ôyÿ34sü¼ÊÌï÷.'ÿ·¿ý­ù¯ÿú¯æ?ÿó?ë”|ã.µ2x~Îñþášo~ó›³<_œÃ¡Òˆ[Þ» ÝǦ-IF6Ö(>ܬæ oD>gU3°%øû÷å"ý»'uF…@" }2â™Óד,¶c ¬óô7ËñÛ?É‚ÎÜñfeLâP[†ÿ‹/¾h>ýôÓæ/ùKKñüÞœâ×.ð¿ÿû&ìŒþ·¿ýíæ¾ûîkî¾ûîvýk;Nÿû3ªf`ú#ßüf’È®5y#ªf`«È÷ôûEzzcê´ @`cN`…Ò3Ô‘[:ò_¨ÿgŸ}Ö¼ûî»Íï~÷»–|õÕW­ñg`û(¢HÀ~ðƒÖø?~¼yä‘GšÝ»q¯™íâç @ךçHEHITÍ@€°LR`™îf]˲!9áÌéûŸÁgø‰u„1X¸ÿ'Ÿ|Ò\¼x±9sæLsíÚµæóÏ?oCêßúV?»¥¿þõ¯m”âž{îiöìÙÓ|ÿûßoî¿ÿþY€¸Û*ù| «9p#€ªØÖÛ²}?ÖÏ–¶}×_¿TÌI»Êp«ãgÞú(É\«ïo–ÓêŒÜŒIß줷œãŸwN^Þœ ý û¿úê«Í¯~õ«æ•W^iÿÿ÷ÿ÷öó>G`ôÝï~·üÇüGC¿÷½ïµÿ« ðyÖ ä2¯{5£ž¥.Ÿ«9ÈÀ°šÔsN<»ˆ©g²ëó»–ì$EvýúíeC@{•³w½éÑËé;~’ÇÊŽ6ɆÏ3oëó‰dÞ9yž½ü¾¼ÿ•+Wš×_½9wî\³¾¾Þ0þBìi,':ñmÚ9û—_~ÙPçÎøïÚµ«Ù¿[ E R@¶¡f`«WîyUsÏ• Úlž©LW(Z¬y„E@I!PÌq9ûq¿¢£Ev$§?ïœ<@ý·~ؼöÚkÍ… š7nŒÃ¥wŸÿéOjÞ~ûí6š! °wïÞæÞ{ïm€m¨Ø*. <žF|Øñ†Õ ˆ ˆ<™ê¸j†¡×ãíEz|sêÔÌ©ËÙ» ŒìHNÞ9y¡}ÆS@ÞÿÏ–~^Lqî®AãåË—Ûš^?ÃOV f€áGk¡YKPó ‹ Eá.Õ9öÓ`Žßy Ãó ºäìí?JfšÓßøCBØŒSŽ»÷¹;Cµ9y¿E2L.ìoøß¢ Ïÿúõë-™Éô†kÉÜ?¬­w­Ø*ù»™F™CÍÁÆš§ìÙ— ¸jCê] Í/iªX-éEúvGê|úŒ€ö2˜ãw®Ü=ÛŒ{æ–‹%B`ÿÁœ}ü;R²³ÌÜ«ïOÓßøKsü>g¸ä³·#'Ÿ€¡¢IF6žç¢ü 3pM£ëÜÓçuv­ØêuoCÍçq°fÀ){Vµ¬`ü? ½z5 Hb«%}BÀ -) nèü† 5ìNnTñ“¢½ÞÃߘãgÀx‰Æß/zN>ðßaüé8éR30îã>G¨€š§ >jIÞ }- (é!EzxSê”z‹¯þ¡Ð§C|†_ïô~þÆ?ÃÃ/CN>îA¯e\ÍÀVO¾5j`…zá”ÚiõE„>J€>Þ•:§>! Äéu®:·¡?ýçP!ÞÎÍŠ¯›‚P¬ÎWÃènö‹jϰ4u³¿@N»Ëx,zN~¾hoýèãj¶ú “Ödª"Ÿ“Ô ˆ!Œÿá[×£= Ɇj+7 An¦ÆŒz‘ÈÔW¬–l'E¶íú­EC@þñߺ?ôÙPyþÌñ+€ÊÎKǦ=Í,gÇ) û¨¹ô³0mظ{áâ$ ƒdbäÖ‡S#0®f`êßúb’À®5s¨ðì/T[S  &À¨Ñ€š7 @è“èÓݨsé<™ÜæÑPžÿ¡{Cw\6æô7Î¥Ðew¿ã`ÏèºÖ lõçºÔÌ©fF¨ˆYŽ ¸ëÒ5o@€Ð)З;QçÑGsš€ð¦m½9ýsé/Û¸û^€¾@'1®æ`j²f&ç¨yzöüèÙ ©ÓÙVx+–ÚÁ`n2ÇõóüúB¨H€T€”ÀT2fÏp­e~ÜA3W;,§¿q.ý<®PoåøÇ¡»|Ÿ«9W3 zä9%ž¥)jDÐÔ"˜C%jÞ€£/R /w¢Îc'ðü+Râ©M…J¶)ò“ï—÷?Êógü“(Äêd2.g?îhãrú:ô$ Ž• ɆÏCÉj 0®æ Ÿ‹a5wÝuWK¡õío»}áÑÝwßÝ®wDPûB´›ÁZm¬æ vZŠìô¨ßßItNãÆõ}f’ó—³DåôÇ!TŸoD kÍÁf5æðýï|ç;­ñ?~üxóÈ#Lòúcd™ÇO7 ’-ÂfIrÞ€b݈’m@ À6€\?Ñ[2Gùtœá°qýö™‰ŒËÙû‘ÊéC¨>ß kxý"°gÏžö]<ðÀ$`Üé ÖØˆÀ] U(X`r3ú¼ÀŒ€¬Ã, ¼!IÏLÇõ ©f˜}0w*ÿ¾Ù8ü9ûqfH¿rúãªÏ§A`cÍ€cxÖ2àsϬw ßÿþ÷o§™¦ù½øŽœÂÚÁyl“§2yP½K @˜§˜'ºuì¾! àñŸË¸~ÞÒà¸|/l?«¹ö“dî6Ɇß))¶ŠÀÆšÇó¬™,Ê3|îܹ– xõñáÇ›C‡µ$@djJÙlÞÆÿ£Ðz—À” Nòµ"“ Uû.:&'9:—qýsü:ÔškÑ™Õ:ÿa5jÞzë­Û¯o>vìXóÿø- Ø‚ˆÈå¼?ŒuR57q˜ëß"s…·Þ3ÌׯèïÉУ¡3×/ÌñâÅæÌ™3í{âk®ý@¸diP#à¥Qˆ¢°o߾ƨ€-€A|ÛgÕ "3§õ"s¶Ûsþ< :“qý®Pˆ”wtãÆæ•W^i^}õÕv‰ ˆÔ\ûP*Yäÿ?þøãæìÙ³Í(ÖoÚÔ@œÁ¼"tklËš N˜«%[A ÀVЫïöÍrþ3×/Ïø_¾|¹¹téRsúôé6Oº¾¾ÞK) ÌÛWξïKß(³R‚ ¼ùæ›mMÀ®]»šýû÷73˜7`cMÀÇñSŒþP5jêDrnX-™"Ó VßY6æüÿ%NüñЙëgøyþo¿ývóòË/7ï½÷^ X€ê< I@zéþð‡öUÒ"] g0o€S¬ Èyƒ ¡o…z±P4¡PÉ(°ð꫽G`0§x4ÎVþß¶™ˆqýï¾ûnëõÿñló£ò¤%…À* ° ó Î` oTðY¨†V @ØŠØ zõÝ>"0³œ¿ü~†í­!ý×Ïã?uêTó‹_ü¢ÍÊûÿå/"–%…Àò#Àó¿~ýz;ôUþŸÌxÞ€ÍjD.…jç%[D À¬¯÷ ÃÆqþSçü»Œë—}ÿý÷Ûœ¨°hI!°* ¾v2Xë2ÃyL0`ˆ y;¾ê…\ï„–ñf!Efb£/C¬“Èqþ[Êù׸þ¾ÜÖ:¾"0é¼GŽiß+0Áõ0öÂÿÿŠÜ[ ÿW¨-@تØ*‚õý>!0˜3<'¶¥œëïÓ­­sY46Î`¤€yî»ï¾i.Å´À_ÞRë%3@ À @¬Cl¼a~Ïm†%ç… ½´‡çÿ£ÐBE„y ¥Æõw†ªv,F"°Ù¼¦Ê6o€Éƒ¼c@ê@Ê SCÈÛçõgƒÈHÀÍâœ!_¬Í£(0Ÿú´_x^…{ÕÀD%°m»CŸ :ç_ãú½’B`Flœ7ÀBŒÿîÝ»Û)„Í$èDÀ”ÙcHŸ)¾Ã±®&àj¨‘5 @˜FŠLƒZ}g§Ðë 5œO'`RÕÂ^çûãÐã¡{C'ÞÉŘʷÆõO ]}¡Š@ÎïP8øè£6Ï<óLK8ÐÜsÏ=틳†„ñÿN(Ã/HÞ =j‚ ÏCK¦@ À ÕWv žÿC¡O‡2ø9M("€øÌ>S‰iN/\¸Pãú§B¯¾TŒF`°&)ðZaÃf¥Ì"8B}@›ùãõ‹ú}úUh€a)0 jõíDû—ÇWàw"”—ÿÏ¡Bþ: ÿéÛ:Ë`Îÿ—¿üeóë_ÿºÆõwF¯v,º#`Ø ’mèl¾K@ÚíèÑ£ípÂGB <ªÝ?ºj»ö. ˆ(¬š€¡«èŠTí·hàŒ¿b>E}òûòüÇB{ÅÙàϳït’Írþ5®¿tµS!01ƒC­_¹r¥D('ÙqÀlÛÚ»H€ˆŸÁP‚‡J¨ @–t@ @j—C`ã\þ<ÿ'B§Êño¼Š9sû{³_I!PÌá"Fx‡€tÀA(  'CõÄA¯…~úEhIŠt©vÙ1äõý=z4ôPè=¡3‘9ÿk×®55—ÿL ­ƒ#PõÏð+þûþ÷'ÊÚ w°¼ª& À J#Ö‹Œ§>Ú°|îCÿÃ[úB,§×ßûšTÎÿkpÔ?…À¶#`؟ἄû£>j׎ ¸ñ\yÿœÆß’…Áj¤¤Scµd"ƒhÔúN#°YÎÿÙ8)Þ?B€d0V'“ÊùO†Wí]Ì Dü«¯¾jߣñÎ;ï´é€C‡5ßûÞ÷F Üx:ú ©Îï€Ñ¿ª&À(‚ô¯¡Y/«%(PÏAŸЈUúÊí1úÿúxèLrþæö—ãÏqþ•ódK @À$AF˜€¬­­5?ùÉOÚ ‚ œ@8ƒ5ò ˆÁ…зB? ÍÔ@ŽŠM%(PÏAŸÌé!òÿ¶ÍD>ù䓿Ýwß½=οrþ3u§2k¯nêÓN±(¿ŸoÔ)…{÷îmß0!¼lQB)5Cˆ€ù¤> 5•p€aPŠ ¢Që;ÀLrþBŠBü:KÿË'RC޼Øçå—_nN:Uãüwâ.wüMÅaßüæ7oß;_s/û ™Ÿv>ù¼y¶J&CfòÿÀçŸÞêåË—Û¶ûå—_¶õH€âÀļã/lV p)´ˆÝ& ؔڴmhœòúƒãü'ÎùëŒu*9å¨Ü"ÏBçñ­o}«klÌñ믿ÞNBòþûï7^Tbÿ’þ Åa†„¹oŒé@2=_ž!çh8[ÉdÀÌ=ÖFvXšƒCqàž={ÚT€š$!ì(v”П˜+@m€áeü„ͤÀf¨Ô¶íBÀdé–rþ:žÃ{ï½×\½zµáM㯓֡XÿðÛ×^{­ê·Æùo×íìw€]»vµ¿×Æêü3¢3Ù‘æ³7CÄà#Žž)õ$*Ø‹L‡·öI’¼{W@’òcÇŽ5ÿøÿØ9rdÒ×3öÂÿŠ 8–ÂÿŠK6 P` õï¶"0˜³;¿ £Z׫=zO(Æ:¼} Z¹€”õøã7?üᇎ»OÕ£½gMá@†k3d›ÏâíkœreðxŽé9÷¼ÏêøSžÖͯm¬9°UôùÊ”Žg_ÛÐn–Aòº¤7DûÔûXW¨íO ù®)‡Cõ[j‘>ý"tåÄ^RtEÀó‚~Ëçg©=Öl›bùþgC†bÛâtµÐØÿ¶ð@ub¦öÞ4ÉϹsçšõõõ;&^É,£UÆÿ6„_[a,²ØîÁlž~úé‘ãî3ת“¥¼0d`…ágÕtÖò¶é±u®#‰ïŒ’›U‰7 žsÏv>룾;÷Ïà?Xsàݰœ—@T@:LñAŠ—!%æYÝðwÞy§M.*Š5A ÆÃËóW£¤6àbè¥P„`VÏPjq¤ÀâÜ«>œ©ÿÜÇõç…Êù3ü<ÿ·ß~»}›Ÿùþk.ÿDh²%¯_ÙT»ÆU¿øâ‹ÍsÏ=×ûq÷Wij×õÐwB…m‘÷¬X B0ú†©"²ž÷^ŒMdì»Í žú§º=<îüc[+ƒ ˆ,º 1FdTjmm­7âðáÃí°À ®C‚Xš!PT`eíàÊ^xÜô’ÉàÕ?útèžÐ¹ëc·žLÎí¯CSé/X2Ön½¥xçú7žxâ‰vHß#<²Pãî㪠Ýz?ôÍÐk·þgügÕ‰0 žsÏ7Ca½ Îc¤ wî©™0E „Ê¥dT™A¤DãYn‹#Í 0… @ÝóÛmdŠã,ôWfÕp„:ùÛ`Å<*ÏE†î5¬pès¡ÿ3TuÿÜÆõkärü/¿ürsêÔ©æ¿øEÒ´-‡ÿÅ﯄dØ=Ãð.:CóãÈ´ˆ°=ïŸá?yòdó³Ÿýìk¯[wœ >÷¬Ì2Gï¤:iaÿ3¡¿ýyèõЯBç@l=ß „±âRYžíÂ5ÎÊ`äqò:ßõdÛ‹Õî"= ²#̓i3©´E® Ò“óG8RiAĹq½¾+@úÈó$4²’ÅqÝ­H$j σð§Î.óžsüÏÄgÇníƒ vbÙÅæñ¢ao×/¼™EM¯¿þz; ˆ¼ß"w`ã‘Ø|,~b¼á¢$] ÀfãøMµkÎ}¦b@Äb†ÂP ËÏ*GïùrÑ =ƒö–¾K¿á÷ÒxÆê–%»çØð0ž¿(€%B€ 8Y{«[Ç"®S{Óî´¿l{±Ú]=…q?üp님icËPC~=¯IhL¤Lñ®€$©È]F²ëøìY` nâ /¡KŽÿÉø½¹ëçñæ°¦×^{­¹páÂÊæüun[™{_$Eg98×¾ÀçÚŸuŽ^ÿÄ8 ý ùÿ&ÔØíCç) "#â`]$@J@:€ñg4f!ŽÅ1ú3©9` —£?ýéOÛ{ïD—¡&ÀóL)€ï xöÙg[2ðÐCµDh³Z‰ö7–¼ð_Iã‹"·žˆZ´tÉñÛg&"¤q`\?ÃäÄ&Æõ¯rÎÜ8ýq7ñ0é7ƒœkßrŽ2ë}FãÏBåÿýÆvI^(ÍP3³Š°hŽ¥M!~ǺˆÃ–ÅHµµµ6â³L5 Œ¾!ß`]{A2º•û Yfä(—Cv[îÍE–ûþn¼:»ªûn`¿:ZáÇ™æøãxwˆð5ö¾Ù¸þœéË—4daÿeÏùæø]7|„ú…ý·:÷~VLoa¿g#Ã¥ÖÓSÊg';O†LHžÇüëП‡ Ùo5G3çqÓHfÞØ.Ѹ* ,¯˜ÌB2 µ°YÍßÄ\»…Iâ«ÃÅÈ€5¢jBçI{ÞÒ³~¤~~¢¿0ÜÑkƒ¥ ]—þB ¤Ñ|¶Ý‡Ä¹Ÿ;§³*0'`{zX÷›³-9þh £Æõ3X™“Ö1Ù_'µ¬²1Çï:a`û,æÞ‡!)M²Ñnìö‡agp‡åôÓCŸWŽ> ¡ÎgVÆ75Vü^Š%Ùñ¥Y‹¼.íÉàù‹X"ÚjF&®ØX ¢Æ@^k„€úmÌ~Œé¢‰¾!ûK$€ñw-I~‡\SâîþfÀv>WCNkû7Ø~Ìwò·5Ç¿ñBk\ÿ×Ù˜ãWͬ#²ß³gO;ÎYÑÞsö_?¡;ÿ—Ó× Û£¿óLç³…¡`€ÓÏçWn!DKe°æ@d6QÄÑЃ¡B'¬ ÈyD˜¤ÞÔ Ú%ƒ™Æ´Ó{´§Ù5:@qÇëpOðŒ'ÁíÑUmϩ؜ûò+<ÿ‡BGãŸYŽãE«F®qýGecŽŸá×yeàÈ‘#;=N_Ç(ïþfèµP†žÁÏ~##Œ×g¡Û£Ÿ\*ÙXsÀð#ˆÀžÐ¬EèLâ;·%ç 77„§lδ£Ñ¼}¬¾­(øC -3Š8æ‘;¡Å Œ¹¸®gCîºí·x]Ç̰Ÿýqè?‡Ž 1ÆÇ“Ë`Ø~0ü,ÇXãúÿŽç°¹ø áÊ|¬ÎL@w›EÇÈ3bŒN‡þ&tXN§sôqjK%¼ÑÁšÇS• Ð^ÓX™ÆV{žhªm£A6Öx±B°È‚0«™A '˜˜íƒ«ªØB¥`D_2=`¹ôR`¹o±Z'aîëý¡Ï†>:“qüqœ¯ /¢Æõ ’¯ý“^ þÙ\ü>$NSäì¿ö{Sü#Êø_ ½úFèÙзCExLƒ¹pë$;MŸ¯d.µEaëà‡¸ƒØŠ´dã¿+T{Ö®µï$b±:\<_H¦”£iyõ;zÌüß8u ÚKFÆ\¼DWþƒ¡‡ÂñF¨ˆKÖ,= (w{‰Eèð@èÉУ¡<ÿ'Bg2Ž?Žó5‘KâÿÝï~×züBŒeë¿ /¥çsñ3> ÿk¡ï„þ<ô­ÐÅvãDœa5Ò,î‹%Ñžµkí»s˜ˆaU’óç-[* \Ä"À¸îV\“ºÆßrŒñ÷€÷¿Ê"X롈.¢åyÿ*tÞµñ;+.¾dy¸7. Ã}2T‡q(ôžÐ¹ˆÿÅ‹aEÇ5®ÿë0gοÇsñg|9Ôd;€uÛJúÀàýᩪ @ò;€¼ yEsÚè¢çÿóšDÏRsÛ% ’?6–úÊ¿†zæ? ýsh€¡d±:ÎbèxK_ˆå`È0þ\4®š7ªÎÿ«¯¾ÚüêW¿jßÞ'çÏ«Àȉ}Va\ÿf¨fÎÿÉ'ŸlTõÏp.~£»ŽËz†,3|›FŠý¨ï ñó0ÿ_迆Š\ Ž.é"4 ƒuéÖ)ñT ÔÞ…µóž}´C†Ÿ÷/àùÔž‘‚E–ŒHŒ‰è”ô‘úDé”Cyý7;«¦y/Ö‡âŸ-T`ine{!ù`Ë fÎÿÙXçýë <ôS?Ø]rüçÎkÖ××[c¯ƒÉ†8HâVB„$³˜/sþ3ž‹ŸáÖk3ÞŒBz,ّŦ‘òÍøÔ¾ŒÈõг¡o„¾ÊÛdü“TÄjÉ#€ìñL‘3÷ŒáÊ\v3d€êÛ‡¶uíR*`ÿþýí[õòÛÚø¢E\ ÕÞšµ3pç_ŸCý¦¡ÒCq‹Ï–JŠ,ÕílÃ9ÿ‰Ë{¯Ÿ!óì0XÖmË4O¬ŽÞÿÆw¼öÚk·k¤õ}K 8/y~ÑŠ|»¡Tb@Ô7äú+ÑÔÝ¡†òúm'ï…vƱýÆ‚ü)° 7êÖiz yª-çü³pFèLƒ9}útSãøo!Ýa1‡œ¿K~5ôJ衃9~!ÈìˆJåì„’–8Jyn.…Šé'x¶Icu¸ "ŠéxмiÑÆUŸa¿¾Mì|´GdA±ô¦CçœÍï¼mSl!œô¯+3/@€OE?šiÎ_ãòçñ¿ýöÛÍË/¿Ü¼÷Þ{m%m¯½w§4‡œ¿ÿ¡ÆwËûÿ<ô­PÞHI!0 dPÅ:ß„ðáX?ÊQ-ì$jÔdM€Ð9ïZ?¡. =l5#Û'ÉÈ„ór9©kÑVÇbäzeæ(0æ©èÙÇ3Íù«ô½páBëõkÜ^ úç?+*.é‚Àrþòúë¡ ûùÇÊñ%#`ô…¡¬2¯_ºhW(§¡3ˆ}o‹‚V“餹T^µ”aߌÿ퓾µ¢€á7ºÁ¹O!"q"*ÔúRJ€þßV¬}yÎÿ—¿üeóë_ÿºùÅ/~Ñû‘÷ò+Àsþ¿_¦ÿz%T*`i;Ÿ¸¶’Ù €`î¢GjEn„^µPئÿФ—«£…ñÜXàE_AŸÅøÃÿD.84ÒÖv‘ë–#D'OøÁliç(w·Ç2÷œÿ›o¾Ù¼ÿþû 7ñÇNܳmÊùËûóþyþŒ¿ðnI!0 ψz5"" ÏõPùlEmRûB4ýÊXñ¼K˜ºšQ}ë­·šwÞygœñ{ÜíØAÞß >øàƒöœfØ»woÍ °ü"éÙ¿sÍù‹(þËôìÚ{w:Ûóÿ·¸è?„öÛÅêÝ© €$‹¼WúZ¨ºr4ôdèлC; OYA œ?ÚR”°oE€/F=À•+‚háÆÇ9Ïp^ÑíSdeáç(w±Ç2ל¿*ßÊùw¿ûÛó_³QPRÌÁšµ{B9 @ž„¼¿@^ußóÿY hX " ’1£y`Èff):W @(™ ’R©ÂvrvûB_ áÅ¿Ýdpœåü»a¶q¯ÊùoD¤þ_xÿ I.#ˆmY ŸÉ>ÇrS>gø ” Ðô+ˆ€eVßoúåØè¼äùE6?ÿüóÖøoq^€]q¼~ÃDÝ$] /.¦dçÐøÜ “zàügCŸ =ŠLTijÙ8ÿÊùŠ¥rþªÝúŠ@Š…3üj}µúýLö9úŸ¡$ Sûöíks錫)‚ÿ˜À¨ }ïÅP„ †ê(b¿^K€~ÜÓ÷B…èî}"t-ôßZßˉeã8ÿÊùOaåü'ëöî%êkä®ý‹~F“©î’ôkk¾–/¼k…ÆëcŒʰû_ÞÁ ™@`¶0/€¾92À˜Â¥±›Ks!qSY,SC<úTèá‡ByþSÉÆqþ•óŸ ÆÊùO†WíÝ{>3äÁþ>ÐçH¨5bä†døÀm=Ãzï½÷¶Þ¿B»E¨ ˜Á¼ÿøP£-²Ø2V[Šôãþa—ãáÐçCyþ†ìPÛ;Kåü;C5tÇÊù…¦>Xl6«  Ðï 5j9Eð‘#GZ`8Ýúúz ‡Éú,3˜I’óÿ2t)Šÿò~H$v~‰xe•Üœ)O—¡§X/•óѨ=*ç? úl Pµ.Àb›+àJèÑСÆ?>kÃçòÖñùR9ÿ; ™hƒœ¿ðæO<Ñ;v¬}7ºw¤oAÇa¿ÇYµ­¤Øi8æÐÏXŸHÌ `ˆÝ"äÿ³@qã¼¢ µq‘"J»T2”ò,ÕUöóbˆZŸHi^€¼°Œþåÿc–)¡K!E¶ï6fXßR¨?Çý %ÉÇu÷/ÿÿÑGµBYò×¼_Ñ€UdHTäñÇo~øÃÎ:Ç¿RÂVãü7"Sÿ/*ߎWô§îȳ½ÔóÄõµ‚L@ØJ³é·¥k? Õgg$Årá¤ÀöÜ2FÖÚÔãþUþ¿ªÚßË8 ”ûŸà!Þž«Ý¦_‘¿Ëâ=³y=ýôÓÍŒsü¯¤rþ©ÿ—L4r%æ˜ð¦!Fún†ßh­‡CEIn„Jd]À‘€"q÷¶A<@¶J[1èc¡¤‰Æý3ú<ÿsçεÃþÞxã¶0+Ùãx+%¼~!}!ÿG}´yñÅ›çž{n–9þxê ¯„Ö8ÿÈÔÿ‹ŒÃ%|8óyŒµÿì³ÏÚ‰vú6B)#(ý7ï-”Í4?ÂzèÛ¡H€y>ÔQ¨X()°=·Ë$ì¿¥qÿ<þ .ÜžíïòåËíH kg²’óœ»ß”ž3Îño|:„ýu’•ó߈Lý¿Èˆl!3@¿d”RŸßÐÁø»¯ƒý7›Éë¿÷ÖÒÿR&R'E„’;ȼÿ¡øhêqÿŒÿoûÛv¾³ý™ ÷ofÀ¾±ë;!˜nËÆJ] 6'"™ÑÜýƒ'ÆÒ"•á<÷NÃVùËóÿ¡ÿ* \ªá—‹Œ€g^Ò¡[žÀôÀ&)SŸ$Ji¶Ré˾I´3òߺë–òúE€õPýÉ“/Ù¶ûB‡Ê'‰ Øž«› ÃgÜ¿yÿÕ$«¶}YS]Æõoqîþ`3üByƒÃ|4rÛtŒgCß}'T4@¯–D!VK …DÀ3ìÙGt=ÓrÚ"®´×ÈgœñL¢® WdÎòüùó(¥Z¤½/â|©óÒÇä¹8?ý3[©/@ôÛ–CEÕôçãdºJ€®Hmm? ÃÆ´=8*Iå”:ɪŽûï2®ßÛûf8®_g‡Í3ð†ø¹oŠ6÷ýMèïB±ÿ’B`™`äÓÐ#¼ 2`©~‰‘* *Ošää:ùB­Ü>ôË;ðAFÍüiPÅÄcdÐIƒ‡ÿ³_X;º°'>æfõñc‰¡ÖE:KŽû7}媌ûï2®_ã¡ðêß}3”ÁgøD!ðÙB†úâ¼K Ià¨è£¨õ‰ÄPeaÑÉŽyö‰Ž¿Õ3À¹ÒÏL!"$Tä$‰Ó‡ÙÙ¯˜þÉ-…ŒX* )ómŒÊPÚ©Ñ(ì³÷¹.û¸ÿ9Žë×Pá?ØhÝŸÌñŸ‰õ_‡þ(«›2y‘Zªk×®5»wïnÓˆ>Ör„(Ô¤3§ÿXH)0ŸÛæé­†Äƒ|0ÔÀ}¡õȧ‹ÑWÔ·jãþ·a\?ÃÏ€k¼9•'o[æøÏÆúÛ¡öѰó^!¾@”ËŽ€ç»z)”·«ÓŸé×ôoÙ6bõï’EÉ&&Ë@Ÿ¢‰óúä“OÚáÔj³ˆr®DDYG€t"8qéL,d ÀߟÛY®eތѿ?ôXèÁÐ÷ “mׯC[}'tXŽÿ÷ñÙ‡¡%…Àª"À˜1ø ܃§ÿÒ)^Ö¯©aÊèX¬þ]û$–}燜(PDœãáÇ›§žzª%lßÊ!"ðqaœË…4þqÞ-‹³,™-€pÙžÐC¡O…j@„">³Ï¦‚¡òþWmÜæü ïóêÞ9ŒëçÕËãÊñ«()VPÃȱ„3ïÿ¯¡™ÎÜ”Äç­Œð s—YF޾Ɋ,E^Í** ÙA6€tø^ovJqzs†‹y" Fžñ?úÓP¬y0„6’Èû¯Ê¸ÿÌù?ùä“a}?ûÙÏZF®º¿cC h‡ v®è’a?ª’ÿç¡•ãJ M@þúA¨vòQ¨þ‹·‹pfî*ŒêÐvèF^ž_ @ãÿÞ{ﵑŽG‡âb}|ê]ÉÖ¶ÀÖ1v‡|¿¼ÿáP¡³NE4±_[ü·ìãþ7ËùÏx\¿ŽŒñ—ǼúFèÙÐÊñ%…Àf†žÁ×~D,„rjä¾µ­…)ý2Àè+\4y‘T€ÏúX¸8°‹ÌÕ› ƒÖHTþ ™uŠ)Å~mŠá~Xª‡Q ]6Ù˜ó饗šgŸ}vÖãúþœ»ŸçÿVhåø—íaªë™5H@æ¶õeÖÐ! / ?AÔxoAN°¶ð×ñŠtjŠÝ0fEgÔºh@gú¾çž{še÷¿1ç¿¶¶Öæß:ƒ4~Ga…L¿}çÖºm%…@!0¢—”ÍÝ\*Éh¤e_kæx€Ù¡šù K % eD0ha3Ãg6 TØÉrÙÇýÏ0çÏ+/*ŸÞ ü….üÕÜýBI!°EÿÉùsbD4GÿÅç %fälqJ€U‘Õ¹ÒùÞQF– ¼Æ¢Øooè¾PÆçC…цZöqÿɲب´}úé§Û¢?ÃorÚÐ Ù7Ã/$ÉØ×/ïÏûçù‹Ä$QˆÕ’B 耀‚åìß,õg#û´ÇìÍ.úœ|1PF&ì‡zs-“žH€IÛ| 3fô5^ö`hûRæóï2®ÿwñû•óÏ›PËB`r{^?çÆriŒ\KòWoe`‡7úÊÒH€ÙÜJ@ØO¨*Ù÷ l”9äüyþ×oŸ’B Ø:K=‰]5)0›;ލò_ åõÿ44£X³Ô€}6¹ÿe÷Ÿá4Ìš÷o‚oïÛâ8­T(_H¿ÆõoúDÕÆB`æhw©3?xˆ¬ (0›'qgä…ÿ…þ5ãŸmÂe©±º¹xð–iÜ¿Âá4ê•›»víjsþÀrþ þÿ׿ùcT[ B èŒ@€ÎPÝ–¢ªÿ5$+P—eÜ?ŸÆÈø=z´9räHó /4Ï=÷ÜVÆù{=ï¡5®¿Ó“U;…@!0"ñ™ô᱿†š5‹v&±o;åí²ŒûGd„ÿUûïß¿¿1ůé5g0·¿ùÈ×CúN¨1þR%…@!P"P`BÀFìžÓfªLWx& ÿ¿©ù/ë¸Ch¤L«ÉãñÅoØ¢ 'Ä*sþ¿uú¯¡WB¥|VR…@!0!E&lÈîY#¯ÞTÿe÷Ÿ€ûï¿¿%=öX³{÷î6Ê1áøÚÍrþo¨¼ž?ãû’B ( (0!`#vgˆDƾ#Ú+(Íí¿¾¾Þ\»v­9wî\séÒ¥æ7Þh®\¹Ò¾œbÄï,ÄGŠÿîºë®vŸ={öLûV¿9ÿ‹‹ÿChë_ˆ§ N²(úŒ@€Ùßÿ#%‡ýyû”Wþž={¶}ÕåË—Û‘¢öYP¹í‘#:ñ2£oâ8åk}7æü×ÛJ B (¶ˆ@€-¸áë9Üo$ `¿üòËæüùóÍéÓ§›S§Nµï¦¶Íª|Ž,ªHq¸Ã½sûÓO?mçÙ6Úa„dÅREˆ¿æòX}T…ÀV(°ô¦ü.ïÞk~?þøãÖóÿðÃÛ”£ŸÆsÊC÷âk®ÏµHsx½f‡÷k3úê'°úQ¨"?ùþ3¡•óJ B ˜%Ef‡f'ï?ŽdóÔÂäË" ¾¹6êQ’Å~×bŸOB ó»ú‹Ð·B+ç ”…@!0KŠÌÍ ^’¡>ߎg¹DÒ¦?¤œ1†?/0wÂõPcû½Àçâ­u©€’B ( #°T–gÆØLr8!ìN#ò Œ¾1ñ#)å—@IDATÞA-7þ—¿ü¥õ”óóE^*ø£÷Þ{o; Y !€×ú¾úzè/Cñçù#%…@!P3F ÀleÀç@è¦ÂûÏã¸,¯ Ì)€þx y衇Úa€&ê@þÝ]}/T* Æù%…@!PÌ"³AUášÙÿÌÈhLxÇç-`øÓ;žp‚‡è0ô&ÿ1õïÃ?ÜüøÇ?nÖÖÖÚù\ëA–(ø1üˆK B (æ„@€Ù+TM²¡ÞÿÆŸSõ¿,"¥±wïÞöµ¿>úh“3Ú>&` Þ øÐ"‰J- B ˜E¦u°êŸÑº?Ô›½ ®Œÿ2ù~u O<ñDóÃþ°ù¿ÿ÷ÿ¶SïÛ·¯ùö·¿Ý¾`L _§|÷- - ‹() B ˜ Õ~wÑÉøÃŽá÷ŸB÷†¼µnûȪ·ø|á%G1xë߃>Ø<óÌ3͉'š§Ÿ~º­ÚàýIq$@žèJà·ð@]@!P,4E¦»} –ií}ÆÿX(ãÿ|è¡PFl$Hï‘#¼~9ÿãÇ7Bþ/½ôRóì³Ï6‡`"að½ÿ"ÁW;…@!09E&ÇÌ7wyê=¡¬ÝS¡ÀZ(B೑ >_øð¿Ü¾ýý;v¬-ø ˜R`Æð¬œòØõµB ( ØHÇw^>ƒÿ\èOC3 %0ÒƒÏcrãq¨þˆ¿s7r!sþ'Ožl~ö³Ÿµ9žÿ/ýQ©àOõ?5௡ËSSR…@ß(0ÝAyÞ>ÏÿáPE€¶ Æ¿wJ9ò4ªcräwd›·8WçMï¾ûîf×®]m®xê©§Úœ?ã?áu.iä„ Lü³j â?s+”…@!PÌ "Ó ;Q•ÿˆÀÈWÝÅç·Ee¼Â9†”'ÝqˆÜíïo÷JNðsÏ=÷´ç|ôèÑæÈ‘#Í /¼Ð<÷ÜsÓäü󾊕+¡§C/†zûŸ©€Í X @() B`^˜Y!j¡êÿß™øIùsÆ?#¶õU牴ìß¿¿èç‘Gi¨"À-Èçñ]ÿ÷¡n©4L‹%…@!PÌ "Ó#+|-w-gm@ÑùÿMEµ¿×äZz;Þõë×›7n´¯ÌíøÂœM»…õ¥>Üzü/¾øbsðàÁV™ q‚ãÏãÿMèÿ*à5ÀùJà"FI!PóB ÀtÈ2b¯ j°}oÆóŠ\/ý¹víZóþûï7—.]j>ù䓯›óƒ¾JFxûH@Îð7EÎßE2þòý þ™Ð7Bχ"°Ll-K B (æ„@€ée Dx¬–C ÿOúS³¾¾ÞÿsçεÆÿÌ™3Í•+WÚˆ@ßçPüçÍ…^òcèßÕþQ#çÿA(ÏÿÐ ýC¨"À’B ( mD ÀÖÁVõ?Rx÷þóŸ[¯ÿÂ… ÍÙ³gÛu„àóÏ?ï}ÀÅ!("¢®eJðYj=Tΰn[I!P…À6#P`k€òçð"_~ùesþüùæôéÓÍ©S§ÚпmŒªÏ¥ú,H ãÿÅ_4Ÿ~úi;Àh†2ÊÚÏœÿÿ‹õ • () B ØfŠlàŒ§Â¿?þ¸õü?üðÃ6%Àè§g½ §1õO8ÇØølÌ+Œ3=âù2[eE›vîvÖ/…@!pEÓž¬7z Ü¶hÀÒŸÞ{ュ׿¶¶Ö0þ'Ožl¬#ÈÁA}Ϙ'N—ÄwJ B (æ„@€é5œŠ,•÷?øö¿ýû÷7ÇoßxìØ±öE@†3މ@5£"¹´­¤( B 'è~#2¬m)¬}è}¡ß]*åý…ù:Ô<ûì³Í‹/¾ØF¼ÐDFæ1€¯.¢åý%…@!Pô ¥2\s–ƒïîн¡o­Û¾49îÁÀáÇ›Ç{¬Ù½{wK ŸƘ¡ÿÌÿïH@€PR…@_(ÐíN0h*Ú}ÆÿX(ãÿ|è¡PQ€‘ G,Ê0@¾Êÿx  ûOøú_$Iå¿p[0û”…@!Pl##Ö6žGß NƳï ] }ê–Z·Ígc±\ã×rûí&šòÅE9þÉ,ï¨%…@!PôŠt»Œ;/ŸÁ.ô§¡ àíŽL—ó¨UÖÉÇ¡ú!æügü¿øâ‹æÓO?mî¾ûî6ÿ?âì²ØÏÒðHSÿšÐø…’%…@!P=B @·›0òÂÿBÿ‡*´w›«wJ…u9¹Î˜úÙÆ-™®0ëŸi€½ÊØ»F£ÏÈ3ü†Hšú׋Öo­Ûnî„’B ( ž P û€•(€ÊD@n»“¨œ¿ï¾ûZ/Z}‡!tŽ;ïò@–cÒŒ»ù}ÆÿíPÆÿõÐË¡¢E„’B (ú‚@€îw"½Üÿß™ø cçÿŒtÿÙݳc¤‚q‡ËµPÿ\(p!!ðY€¡¤( ¾ P ûçåšýÏ,€¢C'Åç1Ë£[ £_¿~½¹qãFó§?ýi\8=ÛaüSÇœãÎËgðÏ„þ24£R•J B èEºÝ ÞF3ùî¡-£/o®ˆÎô®]»Ö¼ÿþûÍ¥K—šO>ù¤}£r°DâbàÂÛçù¿ªжÄβ¤( B 'è~#0Q­åPƒ&gÎÓ___oÿ¹sçZãæÌ™æÊ•+mD`LN=¿p‚‰¨üGDKJ B`9ÈBgË’%A Àä7rlàÝ;Ïë¿páBsöìÙv!øüóÏ—1E¸xžrü¨”˃Àؾoy.u5®¤Àd÷YHúM€/¿ü²9þ|súôéæÔ©Smèß6C벺~èó³ý)Œ4ûŸYEDKJ B`±èý\ìË\½³/0‡{. ðïã?n=ÿ?ü°M ¨ úG–L’yžÌ`9vfÄ%à.§XVÔøä<–ÁÐ貂°Œ×U`Nw•±ÿꫯڿå”ÓéÎéìærX$@ÀÈKÿ—…Àâ# ’gä“PR{#g‹ÏKòÒæt£ Ÿ3æß$@–+$å¬ÐÍ®K]rþ“Œ¬Ì…/ó…˜ÓÝeôMþóƒü È4À+ ,°7».q©ÁcDó¾jöS³ šÿd¥<š¸Þ¥•º‘s¸µ9y/²­¤( @@gÅ6¨ç‘Òcü½üìà­uÛËy ]ŠÌé2øù sÿ/"H"3'ˆê°…@!ÐOw#zò§Çbñ>ôP¨(ÀH Ø95ö]YÅþ®ÀœÍEžðgIËœog¾Xw9Ë=¡ þS¡ÀZ¨h€ÏF€ø|Ü ÄìÒ+YÅþ®ÀÁEcÀ …ó6”1_¼È$&¯©–…@!ÐÆ—Ïà?úÓÐŒH ŒL0¤ý´ì»¬rW ïO真‘“™³ÀÿEvàFÔO;ƒÀÈóöyþ‡Þj›ú€ÔX½SÒø+|VÕ÷Ðú*÷wEî|~W~‹IŒ¼È(ç/X‰‹Vþ…ÀØQ•ÿˆ@çןú|ß}÷5wß}w;J TŸe•û»~ß™>?5K~nŒ¾7f`É/·.¯(¾Ž€¡¼ Íñÿ_ÿt̆@÷»ß½³û޼ªý]EvüÑëÏ d¸ÎÐÅïÿûÍ=÷ÜÓÎcàÿ’B X)ÌögÖ?³ÿ™P4`hG Œ®nÈ’G}ýúõæÆíèÒ‰}”êïjB‡>>—;rNòurwÅ]wÝÕÜÿýÍC=Ô<øàƒÏúÆÛÐêG åD 'ôøK¨¥÷l*Œ¾‚aiCQÃk×®µï@¹téRû4Þ5rÐ'©þîæÝ¨@ŸžÊ:>½÷Þ{[¯mm­5þ'Ožl¬#ªy³Ó°,) ÅF@;ΗqᇶkþŸþô§ÆëÎÿsçÎ5Œÿ™3gš+W®´$¡/’ý]Ö)¬rW /OåžïžçÏëß¿süøñæðáÃͱcÇš={ö´SwŒô§•ï žõÓ…À •þ¹zI¼{/;{ÿý÷› .4gÏžmׂÏ?ÿ¼­#êS@_†TW)€¡õ*}`˜ŽØ¡C‡šgŸ}¶yñÅÛ㯢W1Ϙ€N¢Þ¸JM]ë2#€Èóú3ô?’Ø‹|ùå—Íùóç›Ó§O7§NjCÿ¶ ÿçâ>Æááì<ÿüóÍ /¼ÐÔûÏså9 «KZö] ‹Æ)d)ú»"SÜùeü 6ÌøñÅͧŸ~Ú2ä1שS*ä` 7B? Õšúó‹“*) ¡HÛ±¢wß 5ûŸY…ÇZtFŸ7-¬®fHMQßÄ9*þݤÎQ¿'b¡ï#KÙß½±c@©—ÞF„ǰã1“wh Œ¼¡p!ãÿaèú­uÛû5ð7N¨¤(6E€ñg Ôðo3þ^þsðÖºíCEÞFXéDÿ÷I6Žû—êÜ·o_úïp®KÛßèÓSºÃç’Õº–ÁaÜQfFŸñ;”ñ=ôr¨(@€¡¤Xw^?£ï¥?ÇBÿçC…Š %ñYk𳘸CѰ¯l›ä¸ÿóœœ8q¢çDäÂ9}™(§þî“Ð¥éïŠÄÝ,ù;ذ59Âk¡ þ¹PàB(Bà³"BI!°°~bö{Bü§B€µPÑŸ´Eã8Äa¶_’˜l÷ÿøã·€RÀRöwE¶ÿyìí/2þ©cN’qçå3øgBšÑ)J%…À‚ ^ÏÈ3þ'B*ð`¨”ÀØ€°¿ûC‡Ú~ѧmqžáP€³s:4û»c}¡û»"qK&F`äyûë¡ï… Ù¦±¤ÆjI!P,H€a¼ûB‡¦ço{j¬Þ)Œ¿0;#‹tt"î<М¶ F¦œçÄ™éÓ ‹¼z)4#Ù×Y.œX¸[Ö›þkœ‰(€ÊalmìSRýCq—ãFìÍã‘Õÿ±:^ ýËyõ;„ÓÇp{lqž5Ò ú9}ž¾oáed^gᯮ.`žð H¡CZR‹‹ÃÆÃÍÉ&º…tŒF&úò6윣œ¶0Ï b$B’“mÃYÏÿ'ŠÌãeýã…³Q˜P®°¤(^ÿ¯«òçõkÏ¢¢¢C…A5ZÈ4¿ÆÑ{ à7Ú)€Ç !zÌy~°ÅyN2Ò‰$ÁL4@T`á¥R  wä2'èùÑ,‹LîÈ­¨-&F £wÚ.â®ØOÑß¾P®Ï‡ ão®Þ´)uoô àO>ù¤woÿs¾˜ržÅ~Šœ¯†Š,d¾?Îû)p$³Ûзb˜Ù]Y{$ßó£)ÐBR …@@Ûåí3úŠýŽ…ö÷\¨‘RzCIß›þ¼î÷£>jÎ;×ÿ3gÎ4W®\i_ ÄàöMœwNr6æüDAxû9²éíX_5âÉH#úwqR“J€I›p$ ¤( !€0ò{BÇý?ÿ›ÈgöÙT2œþÁ4.\hΞ=ÛF/’°O¥cìä7÷ÿnl7ÚÉgý¼À8±I¤À$hM°/†™ŒScÃ8'8rovÕŒ0Ör)D\GI!°ì0îòþk¡¼þŸ†f4`ì¸ý™†1þ¿ýío›S§NµùQÆ?û½8f¯$#²H€¾LÞÿBèRÏsR`(cO5†Ž!§9œÅ\)üE~ÅBE„’B`A@äÿ…ÿ†>Êó·MÈ25V7ý›‡]½zµùðÃÛB@}]ö{›ka¶"úµ¥Ÿç¤ÀœžIÆKÎ7M)>Y2ù¯¸ž:äÝá"%…@!°èû³úPÐI ÷óÖ?ìè×¼NwÊWêvú½Y픀ŽÇãÔdõÿÒÎs24ÏÓ¤ÚmÉ„UÉ"K(Àl–ŽÝ,áýªK*ØRûõ:Ý{î¹§%f\éú¼ Q$I=]J)0§ÛªQ`ÉÙH4ÛL”±$âB~jü0ÂØX¦¤(úÀD<Ü>gFè_õ¿§(€™MÜWqîê&LÇ®Ä<'Kcúôðiă>Ø<ôÐCípãc³HÆ´” žØ,‡¨0lF4@çRRýD€÷Ÿ€±5< (ã™ãþåüUü Åéó>K’×€ÀøÌ9g û¨.Âr)å"“=¹ÙpF>ñ ü]wÝÕ<öØc­Çïe¨š5Læ³Ï>»ÍH'ûùùî cLãpƒüá#¡âØòÅÐÓ¡WB?-) þ" Ë‘<ûÐ>ç/ÇÏè›ô'Çý¿ñÆí¸ÿ¾§89[È ²"jÑñ|‘ýZöoKÝ,wxBÚPò8"æÆæý ûcž÷Þ{o»¼råÊíŠÙÜ¿OËÆßé"<þÝ¡ž!Å€R…~Z @()zŒ@z¹¹zª9ì/˜÷ùòå6 ³OŸ…ÑÏz¬Ž}\^ÎØþ>w\Äe€îw­3#Ì7Oyõä¾}ûZÕxlÇš¯_¿Þ2Òî?½={:?„ÅrLÁ  jxè®PCˆÖB32`D ¼¨¥ÆjI!Pì0Ú#¯?‡ïŽ4r"Ò—çÏŸoNŸ>ÝŽûLiöuܾ˜HŸ6eÑbö[#ñÙá{¹¥Ÿ/Ð ¾dÉð›b<ÓzðD,5 ¬Ùƒ)JÐÉá1ÎKíBžûˆóƒ,„ÈD`bñ|G¶¥T€ˆ2“-mCŠk,) ýgþ? ݦçÏ»FÿøãÛT¦)ž?oºcH}ÓcÏk£~Œ#£O“޽ÿþûÛˆ¬º,Ÿõ©ÿ]Ž[  J7÷™¨*”Qõ’d¢<ð@KrûÍÃöã¯a|ïÝwßݾÛ[eïIRd7áz2Tmvs!ô÷¡¦Î¼jLm%…À#€›»#_ý;¶]2örèj˜2—¾Ã×0ôç90ô¾ûîkû³µµµÖøŸ(Y$£Ád OQ„Äy)ìñNoµ "F?ã×XxþûBEI.†^ Õáô§è!N¦¤X!ôKú'íP¥ßòòŸƒ·ÖG¶ON@F²>hBÇ ~f{Åù!+hŽ=zÛó·÷?æüõU‰Wöë›öíÛ{U³ÿ5W2 ß% ”­ñ ÍÆ„I3€wcŸ$À²oâüÆ_®Ï9>òÈ#ÍO~ò“6t¦vaÑPK†¨@=gBI!°C0hÚ$£Ïó×o鿞±ËºXÝ\Òpr:ÐͲM[õe"Ì®]»ÚZ€ ~Iº;Ta³ÑN›öë±}á¥:æn·3S̆x@äµ-ýÏÐ}PưÎ8ÄÎHF¤)!2!3E€¼ˆ‰rŒù¥Z…ÀÌ@Däö„2øO…"k¡Ø½ÏFFè8 ©±oïe°hшó°L(0¡˜ð닱{€n÷ ò¿jhŦ¹ó€Æ„1Æ?uèN;ôÆ‚Õg‚¹¾ WD ŒÿUøƒ>“žÀ23q•ñ]zýl!° ˆÆ1fŒÿ‰ÐŸ†ê¿ åÄŒMÈ™§÷û÷RœŸ~IšÂ°ký•>Lm“Ú+ŽÍQð—jx¤ÑKŸ†Šüêã—RŠt»­ ƒðn-„jT$aaEØ,(€óæ›o¶HA`Nj”/þÐÈFXÀ«Ó8ã…­N¼X!mõ9‡CÓó·=5VïÆ_{gP³Ñöï<À6lqnIR óã°˜„M³Ã¹fÿ®¿â¼˜ÇäÃÐõ[ë ß¿Çul*E6…eÓÉ}øçPÿOÄ=ˆFÇßÉ =D„ÍÞzë­6€E?úè£Í³Ï>ÛŽ0űF¦3"°A–4&Kÿ—…ÀÎ À€é³sn°”¥¼'AúsL=/ºãºNÇžÅNÈ æ÷öÕµµ›ãþOœ8Ñ®«sÎp£Ïó;”ñ=ôr¨(€}–N†öàKw¥³¿ ©rD}&!R`Ö¯$’€] ±užEI!Pì<"–&þÉÉD:‹¶Ïøg ó·aGÆÝym÷ÿøã·€H ãž5^ þ¹PàBhÎnZ À(¹‰ÀÄU¢ƒ#xÔþï»H ˜þ3_þ!5 ºöá‡n=‚1çŸaÅ"c€ª 9 0Øþ8+¼~Þz»¢rÿ›Šþ)û)ý€÷—˜#DdP?Ð'áTI:t¨R¾øâ‹íÌ&ý½@ÆŒû×#ŒÿéÐ_†Š|*ŠY)€¡äïL4N4«gyÏ9Ìn€s¥ÄÒ ‚Ρ¤(z‰ã/ºËÀsVû)ú“ÿçù$åú&í]Âob0mß0as…èÇúÔþ#j•¼†]ÝR€ø¼Cä ¹z)4=ÛScu¹¤RÓÝO ÈØPËrdƒŠÏÛF#¤ž©Œè¢Ö¯S0¸QI åüë< C€ƒ²Ù¸ÿçb»¢e¡}_;___o>úè£æÜ¹s­ñ?sæLsåÊ•Öè›Ã×–”žäùwLQ ­ Jð‚›TIÖvÅêrK€­Ý_̰“h0˜3Fm¹h"Ç&œÖÇà¢aYç[̆Œ‘ß8îÿ‘Øf" ŸÙgSáÝóþ?øàƒæÂ… ·S€' o‘ý«óæhMHBzDt„Z Xz)0ý-ΰP' JÕÔ”ªT-…¤xÒùàNóÿ¦Pš<šóV „”…@oàÝ3ò¼ý‰Çý#Œ(ãÿÛßþ¶9uêT›ÿ`üEúLÒbó™þÇa!ƒý·p,¯Ÿ÷‰ø²ÜÿRKõäÛp{å Qï¢6„“–KË%|Õ甲⑘ŒtÈ©m²õ…@!0$€7+ï8´ó¸ÿØ·uLÓ«W¯¶#¤.ûê°p¢Ò‘Ò:Ï1…ŠŒÎS¢ÈI±Ÿ¢?ùž'§.ö[x)°µ[8È"‡‰ñ4n^q êE5¶ÚgŸ}ÖÕôUç!0ƒÀÿ%…@!Ð[x®SûÏhŸvΠª¢}—ŒLX"#D3oŸÑWì÷vèzè™P#DF >_ )°õÛ8öAÑ„Îyÿ¼h†Þ¤–Šj’]oýTê…@!P´0p¼Yj]4 ³È¡gºRŸµ(Ò12‰0òÞíÂàç¸ÿwcÝD@>³ÏÒK€éo±[§‘¼g *§Ó5E¥€ío¼ñF;ÆVñJ_E~-Ùu €úŠ[W!°èRåÿ§÷/ÿ¯úß’ó"—.…Ùç4%œÿTÿÆ]HãB(¯ÿ—¡ Xêqÿq_“"_ƒ£ó?ÙÐà§XÄrh\ÜC‰E' @Ο?ß¾tGZ Ïauá´A9·ÎhÕŽ…@!0OôGÙmyÜ¿Ù?Õ) :9&œ>Ïëš×±iáÿõÐ÷Byþ¶‰è¦Æêr‹‡¦d:xÿ9tÄ›GÆÉ€d!]N©›ÛÛ{øóç (Z” œ`c%Ë’B ˜œ}‘É~û =º¥qÿ¢“R”´÷øÉ“ŽÞž "@QÕÿˆ@C°qró’"Ó#›¬[¸N$ ª°¿Æµ [½"ç+-ÐQÊøwªv+¦DÐÍtÜ¿W‚  íOÐÞ§¼„­ ˜@6ößE&¯v½9ŒdAš`C:Àƒ•º)N&2VUãBúظ2J!5!}!e!b¡0(Ó›^Üß7 £™4\NÍÒÿ%…@!0{oçZ åõÿ44£"“ú¥¡)Jý‡d‘ÆýÇõÜ”k@T:ŒÈïmŒàêËoÎ{ž{¬À²"ÓÝäÍrH¤ð[68Ø"wHæÓ=ê>EÊÐS#ÿ#GŽ4{÷îm'ö3‡–cm-;‡ î¬6…À(wF^ÿs0ôáÐÎIìÛF!eÜ¿ó}gö©¡ÓŸ¦ƒ¦†›åP‚4ø[˶^`º;ʘaŒB7®†w,T#ľ1ò›IÿX”ÁÖƒÛ7aÜUýz¡}â‰'šƒ¶oÚ²Dƒ1âÂ"þ]9v×\Rl š¾ü¡ ¿>HM@'YÔqÿyq)‘T‹"k`¦Ö‘Yúå¤Àt·Èq¤€‡è³[KÿçœM @|ÞÊ/:wÛöe†ý“ýøÇ?nßxôèÑvB#é€ç. 8Ñ’B ˜/Hw¶·ÎÀ)iÓ‹8î?ádôó=+c¼ÿüJ.õS++E¦»õïöJèG·”ׯ2zC * hêÐvèƒ$Þª…üèG?jÃÿµè0rÁ³% ‚ ñHVr˜M\wI!0oôG†°‰´qD,s>ûX½SIysK^ó"ŽûÏ:%ÑÈ) ãŸz'H+°¥Àt79½Û scÝÁ‘ÐC¡£F¹ª²YN’Gb¸MN´(­4û^Õ‡£®{æ$–¤#ûF_Áœ°9¯yÇýKQrBÓ¬ßÿýíL«Þ·â³>Ï«2ó»¿…˜¼Aæøç8Œÿ)Õ·…•¬¨½víZ;Y‘Fuýúõæ‘Giß²uß}÷µ…€#¢@V%{ƤBÖCß 0ëÖW¡TI!Pl ôþõ?¼ÿ‘@Ï|&ûÑÆÏ;×\ºt©•tÆýgq²~È[ÿÖÖÖZãòäÉv!Ñ7%ÒÙ¯´R ‡­/s>˜.tAIFŸhLf3"@¬Ûô #ã’áÁë¿71ºª£BšŠ%…À …døÇ¶)í[Ø?_HvöìÙv}QÆýgŠ’×¿ÿþæøñãí4ëÇŽk¤-Í´Ú1°ÒÆß3W [E€rþ^¸!Ô=²ø/>ﵪ¬¼qãF»4 Ð:–í]cF pغ+ôÁP^¿íä½Ð…&IíUÔŸB`çÐŽ´5ÕÿT4Ò @æME~úôéæÔ©S_{=¹Ï¥ú,œÆÿùçŸo^xá…Ö11D™cbTÃçÄeÁL½Ò#Q [† –9¦Ô¶°.‡Ñèä©!6ÜÚÚZ—™ ];<42\Dö…ê ›8÷’B /h_Ú•dmKñ±‚[í-Év¬~]Dü?þ¸õü})FùÏöÿõoõë?Ô?øÁš4F'¥ço;ïßr„,U=â:Ç~T`,Dvð´MÌ(û: Àv: F¾\Å-–=F`’­P=€B%_²þ®,) é0î_”íDè‘Г¡Šµ·‘€±øì³ÏnŸï,„è8%ú$áþ]»vµµœüREl'¸î;vúܱgmè‚ÀÄ9¥1LµËonË> o0n6Àb”Äàûɧ8D}¥(¸'Öü'C‡®…«+*0¶o&2N_4A`D%?ÿüóÛŽÉ„×#êâÓQ™ð‹¿ûâÝùþb>QU©P[æÚ0Yÿ÷U «Éa7Ø·1ÃÂlØwÇoŸ×ŸQsXW¸4n±I!°Š0R©BüŒ?ÿÇ¡ÿ'4ëmx·t(`øµgÿ¨¢ÍãQkÛ}DE“ãþ]ƒ¾0¤qLTr°ŸÑ´£¶¶rÏŠl½)¿ËØg® “EúL\¦óÓÐŒxçwÚ7Xt£Qމfè¼äÿå*‡b߇ּBI!0mG_Æ]a-ƒÿì-},–b$ÁrSAÞO=Ñùä“ö\uЇ,¿"¬|„èÀ/¯y„’B Ù~ä÷‘hùþ#·Öyþ £™^õÄ_Þæ/ˆN Çý?þøãm߃Ќ‰`0îò×Büs¡À…PÑŸJ¶ ´\¾€C‹‘Mb°M§Ñégœ—fE7Œ¿™Ãâ}¹>ä€:°ï…Õ‰Õ¼BI!ÐíGåí#¡Ï‡þ4T*çXwý‹Ñ<&ù2 ÐH)Ⱦ gc ãþ¥yÆÿtè/CESE’m@€1žM±ûÐCµSrò®5FÑE:}K 8pŽ–W¯^m¼C\§2F¤¾j¨¤PfÍ  ”@´cüõ8T*@[Ò¶:‰v+íh `ŠÄgTo ïtüyîÄAÚ¸§¦“2 éjè¥ÐôümOÕÕrÉìÈÉr¨0ðBæêX ž†kGá©QZÞ´æ±²Qò¡N"àÁö0¿õÖ[í :Æχۑÿu,bÍ °#ð×®I W£ —m›Š¶ÉcÎÐ9‡Bèß‹Þ|óÍÖÙ0qŽ}웩½M¶Cõ‰úG$`ãþû)úãYñüÇFicŸ•"³»ÍYà&ÄäÍ€"C…‘÷€cq1[iËE˜•+ÓÎß9Ïp^€œ¤CG×ÿòd”óE`£÷?’ðèUú«+RíÿÆo4üã›W^y¥yï½÷ÚhÀ|OwkGçñÓ9Œû?gv94#[;Ñ%øv€ÙÝÄŒ–3ÑЧ ÁÊo-BþŸÁç=d1–>£yT=z&3\WÀÃQRÜ4Z ÿØ6¡}JÍ©'ºpáBëõ3üÞúg{ßE ˜Ã¸ÿwãÚM„  ôŸYž_€Ù¡ir^+ãÅ‹U­+éËME8Žá×p…¾ä»2Œ×Ç㯑Îp^S› Ñ ‰x&×Cå9K UG@¿¡hMBEµ‘¡ý‰€!ÅøÃš×^{­9uêTÛV‘tmw„SQãþç§ŠÌãÌÑ1üŒ×{¡ N ב Ⱥ€¡VJ@* ‹×š@ÄD'w1Tˆ^Ck(â³’B`@ˆµ þ˜øÇú”‘íƒ#!ÿo¢iž¿#]ÑÖ¸ÿùß­"³Áк.„ŠÓi¬ÇB±v Ø»»5è;$+è×ÖÖÚÏüŸóäÌ{v¿ãË;¸!‹‡x¬NǹO1/€ª\äVpéáÄç%…À*  -ì=z$ôdè¡Póh %ÈÙW¨òçõ‹..Bè?®©•,^tê¢L5Î9š@$} ŒjÜÿàŠŒg‚y%sM#¼þÏBá«ÁÞêJŒ8pà@;¼Ža5Εa]¡yàGÇæ8cŸ’B`¸'.Rÿñd(ï€"É¢C @|ÖŠ"c¹táôE}âRãþç{çïɘ/ÓÀ4¯„~jØ ¯ßvòpèС'ª¡.GŽiI€4€€í*xUòª諨[˜Á¼rþH“åÈ*ç¾âPçUloÄwSy°Œ?ÿÇ¡ÿ'T$@­ ç‚%ú mÒ{F(çbF!*"‰HKû;¼ R`6 3îúg©0Þl§q§ùÐk¸|a/ËóçÏ7—/_n¼ÐzŸE±"Æ>弈̤Qh€¡de`øõÅiÜzÿÙ[úX,Ä I‚妢¯@¤âô# jßûç«ÿCjÜÿ¦·u.‹ÌV$ ½|FŒÅF,…ÿ5Þ¡‚h$™°—iĹ}è—{ðÁ°yöìÙÓbOü’ÿ¡k¡ÿûÖºhbgáñCoÜyö'°Í;"(´Æýo3ðñsE懹ªvCv¨õ‰DÑŽ°¿!=}—,:Ú8/€F-—‡ÈðD:ˆ‹9¡%…Àª €Èë#ЇŸ }8TþŸç?±ˆ"¦W=ñ—·ù ¢úŠ÷¿ÍÀÇϘæ›U¡f#Âcø½æË:„Øû*Œ¼F<8/€‰G‘Gy¤e÷#Î&žEUÏ< CLØ!‘•þ'YRlÏ?p8ôùPžÿ¾[j{gÑOî§nÈ0@C‰Á‰¥¨qÿoóÌv,03(ï8ƒeÞiu—Byµ†Êó!°×ðﵡ0rê3k[ŸÅùjÄΕÑWt¤ÑÁ>sþÈL~Ðá¢&7BÍ\‚¨±( ”,%úÑB¹D@[:Ü´ˆíwˆv'rèÅbÔüÿ•Óþî8Övo­qÿÛzEæ…8CÅà_¾õ¬7Ãv,TÖÓßtX ÆÎh# "àÿ¾‹ˆ <cy  µPÄ.ë¡o‡"†ª«è>$N²¤˜÷Ï¡ú Ä×°áN9³Øï¶è/ý_ýêWík½üÇ0b}GŸ#ˆÎÀ¤Ô¸ÿÛ·s[V*0˜5dûZhÎooˆÔÀ5ôM @loÐ0Ò°æöEXŠر€1Ó#r žI˜yáwb÷i¬+¨, ”,%žoCj]4`"áí¿ûî»Í¹sçš‹/¶Q€L!ö=ÀI¨qÿÝî™ì\`&0Þq£ÿ ôzèG¡¼~  :µUÅcB ¡1!²ô¬ûN©DVlr‡b$!þ4Šòú$Ïèz¨%…À²! Ä/ÔŸNAö¢Òb› žQ·äA«¿yùå—›W_}µ]~ôÑGmôAõ}“ P‘°~Â5!¢žú"ÊšÊÙJ'A_OØÁ°dEF€³…<˜ =ƒÍ{@-„ õ`jè›  1¨ž衇Z&Ý÷ù݃’F£F^\‹m#D'èYdðµz…O–C/‡jÌ#Ÿ—‹†€çݳ¾ï–"À<ía¨0ú z†Î¯^½Ú†þ…üß|óͶ¿`@ûì0¤S€Ô¸ÿ¡·zî˜ÄÉNý‚h€ÿU¶ŠøS6×({ì±¶°Îÿùn!=£0å>²z$Z¡a‹ÛKǰùök¾j%ƒ·nD€‘žÓü,VK ¥@À³ÍèŸ}8ôd¨è R0ôyçÑsLº¥ÚÿìÙ³ÍÿøÇæ•W^iŒ¾ è³ðøiûßù»T`ûîFM±þ‘Â[V Ãû×Pz©¡ÿ+W®´!²¾ÿÁ C\~×2…ˆšÐÊûO^}e!0Æ_DðÉе[Šôê'†F¼>§€ÁGÿyëß"¼ô'#„5î?îòK€í¹BØrþ Û,G†´NásCèòõÀ†õd]ȯïÂK‘Ë3ùÚµkÍîÝ»ÛT€è€ë°!R$gš2qœú¨è|é-ÆŸÇ?ñ\ÿC¯àïµ×^kóþ¼~‘ÁEp âšÛaû‡ÄÎJ€íÁ›gô í¡# ãÈóO" _Æ“~ë­·Ú÷Œ1žqø”h…ºž‰w˜ÏÀ´ÀF¸×7â:{$ÀÐ?:²f">/)ýã/ç/ôÿ\賡Íõû·ÅÒ"‚<ÿœ3Äg‹ Ú~ûßù;U`{îA€Q€¡¿® D.QJ·ìû›½²2Ù‹ŒÑÑŒ§žzª%õn€¡·½>Xnäü„òü†þKèã¡FušñISˆ\ÓE‘,^Ì>m×®]m7Áùs äõ«Š«Xâdû"E¶÷NdÕ¯ßD¢›èÓï{˜o0ÀøóöM ”õ õn€‰n}í¼<H*ò“óG¬Û6±Hb‹hW‹&ú0}™>MߦÆiBI1b‚Z7BÉ„˜°)wWñ¯ò߀OB•é*öÁdåScõNQð£±0¬Ò²ìÛ¼7ïD @˜’ñ¯wÜy_kËJ 0˜óÿa\1}!T @*€ñê,Ú»Æù«ÐΤÕô <ë>KûïßÝ)°=÷$sÚ ÿzè{¡BW¦ûn€Ø§Í—KdQ ¢Ÿ>Ï  3Òà‘¥Þ à.–¬sþòý”÷O(ã tíˆÑ—Z£Fp ‚¾Kûïç*°=÷£º*`h›ðß±P‘9@ùÁM‡bùòÿkkk±K$¾âÿE˜ #H€NjFïAù0T4¥†%½E`&9ÿ¼ºÁ¹þ/\¸Ð˜øÇˆ lg¹_ß–R´Æý÷íÎÜœ`¥gµ|g„ˆÏy7Àëÿ,3Ø4 ŠZ†…?hÃ}ü¢Í 0ƒwÀîr¨¢“+Jz‹€Ä6¢¿åœ¿+6×?‚-=ØWá° 5î¿w¨"ÛsO´N!ÿ+¡Þ ðq(¯?[íñ>4Žg4€™9Ò’€½{÷¶Ó}jX¤ïóä0Æ-¼àÁ¸L^ÿÍ ¾™Bé:…QI!0g<©j{„øUûÿ(tK9Er‹8×\÷máÔ¸ÿÛpôf¥ÀöÜ Æ÷ÊcEŒk¸ªzu¨ñÏÚü?½¨ó¤°…wèPœP45v®ôا¤ØNþÿ¿½ûñ¶¢ºòþ̬5IfÒ1QQP"Ѝ†t›n»³Ðv寞Õ=*Ñ8jÔ   !" Ø¦{Ò“™•fö§x›¾<îïWïÞª{÷^k¿ª[÷Ç«úÖ9û|÷sŠ-Ù£f¥ÈO¾ÿDè‘ЙsþfÐüåû­§aÑŸ¾¬õ×{‡Ô¼ÿ;àèÌ‹"‹»ùèÕðf‘[áƒÜHéóºÎ°ƒgX`]£´û°ãu øW®\iBl]üãº2bíó˜Ÿ `ÀÒDLs#™‘c!áí›cØex°@€R²„§Eô,PelƒŽ÷ï’Áœÿ'Ÿ|Òùk˜Ðaz»#½‡øLS]Ëã'|Îcv=47ovèO®YÎø9_QqÎ*‚]Ez[ö³¸J½„õÖµã±F7Þ/)ÚB û¨A_<ª†Ç¢?êTÔ‘íQ̃¼¾øâ‹&ZgÐò?{ölóÔ̾Íók½C’ظNΉŸ5@f¶OO›(Åן È.tÙ-°ì;ðŸÿŸGË{ ög¹B•Â:]D‘_ñŸèÅ¢†‚öã‚ç¸ÀúJg00äÕ¤ðÍûG‡"Þó™¡"ô¯¯JÛyL6 põêÕÞÎóß~¡H~®UbëÙ%3Êv{¨¾¢¤eŠ´ èœ?7Œñ¦‘IÏw¤GÁ˜˜#L…ÔyÚS„Õç<ÕÍ!âý#.žmnŸ· 2`ßvŒÈ¯Êù+œ´õZ]EI!°4Nƒ¼Áÿdèß…ŠHä4Þ±@»ÿôÓO›å}ßxãf­ý×ÀÙwAèkÞ?îb€îÜ'逹ÖàQ»Y`ÛfD²À®;—wç™ (ÎWôÂ… Gä!Gˆt€Á`°7è Ò"BÉB@Dëäý„š÷Ÿ¡ïe°Ú?²~åÊ•ÆóϾßë­ Nÿ»ï¾ûš"@¡ÿ1ý8¯•íS¥c@Š¢ù~Ê&fª4vKÚD @›hÎÿ[ø¨uÞ…8ù­¤ì а?` FEDÀë.‹(ãG•l?~|ãÁlÖ0-PmÃI°= 0âãu¸hÕ¿‡J? U›0u Á•þéÒO‘vÚwÙ3õïØ±cM>}úôÆÁƒ›Èžk#ú3< úß„ž ½ú^¨"_ƬH@€Ð¶Œ´°mÿ£ú½±èùöurÎ{N1Jò—óê³Ø.wmkÀ¥0-йè-^ăp\1ã”u 0ܺÍvºvê|Ú@@Á®9ÿ¹ñØcm˜Þ»gÏž&¢7HûgÀÿ0ø4!ðYÒ2EZtΟKüE|ߺ_…òú pBc ŒF–Ñê\Œ¯Y± ïBØÍ`*ÔØ5B༜³jç\¹P1ã\>ܬ"×:¶Lžó#<²qùò寻6ÕÈ€ªóu͸8pŽ"ª¢¥¼7¡†A<‘±5ð#GC…b- œžp-)ÚB@Nžï–î‹-Ïb¾_;—šÓÎUûë£ê_äþ‘‚¾ {îPy~Sýž~úé“'O6[5>ÃaŸ¦¬¬Ò—ÙAà¤ö ¦ÎŸo€îÜ¢ÁF.æ5¯V˜qì`¦òþ…Ü ª^L=J4=ì »ÇouF22‘‘ i¤Åë)€œëf¨6Ì0_=ZÏJv'ƒ¾Êÿƒ¡§BÐ,þ‹Ý»EdK»6è›ñâñ¾¦ýYµSLöƒ»¿ÙÍ#<~*Úhðî?tèÐÆ™3g6Nœ8±ñè£|–™$gAéÇŸš÷?|ó¸ÀüØíö7ªSŒ [þ÷¯c@uN[†—a¿Ë‚¸"/SHN‘4[vq÷nm½f@•’B -~?dt;Š|R)(ýtd•2Ëûçñ#å¹ÚŸ‡c)Ú‚ðÆÏwGØvFÁŸ0ÿSO=µ±¹¹Ù¤î›SDð,û¢%»Œ@€]xΟLjåü j¶^40MEEÂç:dן ×r‡Ê!ò&FexñŽÝùŒoì-•3Ä´éË¡f”ó"pO|1Uÿ3øóøO‡þ<4Ûž >:²"òýÿ·ß~{Ãzÿê_2E'BÐu‚×w‡ ì?üpãñ¿ôÒK×ÏóçˆÌ(""žIÚáèG`.õY²‹ØEpwðÓ: ÌMÇù5Œ<‰€NˆtùÙqM·%= 笀plŒ0ÌÚ®àÙ^ ý}èX¼âý’B`Ù¾rpG2 øÏnéã±E´³$ ¶#EžŸ·oÝ5•s¼o)Éæè«¢ŽGŽi¦ïJCN‘ëÄH„îÏ¡_n镨òü‘‚’ P` Ïñ/’lŒü)/ÃçØ¹× q ªy|ä——ü†suÎ"ž!NE&H^ã1x-þ(Œ¨]5Èñ~I!0 ôB¥˜´©'C7C_ÜÚ7CgjÉyÿú¡×¾Ïûw ŠE68s¬õŸØ©o2è«üÿ,ôÐË¡HA‘€a·e¬›µÛÿ¼~"<\Þ-I„åy}©2f Ë9ˆ°a4håý¡Q²ØE}0ð=*ÿÏóŸYq—×,Z×w‘²ÅPd¼ƒEŒþ8ˆØ}jîÿÅPk¡èÇ5í/@Øm©Àn#<ßïc¿*ÿ1d3n„òD¦ 9bçù\$`BE}üìòE”Aùúë¯7®]»Ö, 2Ã4"¹Âí«–Yþmíëˆ!BŸ åùçÔ¿™È8ò-ׯú)—Úʹñ<é> 2CõO¶E¿eg&DíØ´TýÕàÏã+ôŸB¯„ZÿDA/­þ ì¶Øm„çû}_'1ð ‰ ©j¿/”û€¸w Õ]’EE LFº`Dœ§•MR»À«°,0cɰðšÆä/ë©RØ•¹«eÔзT¤ï =ªïeª)v'‹6mÐWíOMÍ5Xv¹/Ž»*}JÑ͹Öîzþû[z>¶~›$Á¶d—(°ËÏùó/ÙÅP‘amó†2DrŠ¥î&I€m×Åù"+Œ$£éœëÙ]¿k+}~"•éú¡b”…êo3‰ð8BûË_þ²™ðî»ï6E€Úx…ǿõþ…÷E4?eÛ^ÝÚ¿Û’% P`  Oñ/ñA†µàõ»µõšAb˜†€8ÞÈ9?Ò‰í`ÀàÏ˨gtâÖ¬óIˆ¸©H§öEf-üµðÏ¥K—š…€ú8ï?/ZmN ký‹hÊ÷‹jÊÿóüK–„@€%?áß"ŒNæÅ„ÌxýÜy`¨#ÅàŸ:òCyCA‘Ü(ƒÉ@üëÙ¹9ëwBÿBýI²õEÑQ©·¡"Š…Èf4Ë<ÿ×_}ã7Þh¶j´m—öiÞ¿|¿4\ kýàý:”çÿå–ö³"N~¤@7ï¢ü—Þ€è$¶‡B ]¹·€©€ £i= îrÉ¢QûnèÞ-•ÿçù##Å ¯ÝjÃÚ­¹þBÿBþ¿ùÍoÏ_‘œÏøl_Rú£9Ïyæ™gÚXëŸSƒ¨oB¬*× ,KŠ, ùÉÿWÇÈΑå_â˜Úä`¢ô%’†1 eKÏs”c4£¢û Fm—€5$ ú'C†ž mC F’½JKý^¿~½Yê÷“O>Ù8{ölÉ è£ðúåü-õk½ÿ—_~yãÙgŸÝÉZÿ¦WrdÒŽõ–•:ç"ý¹ŒuÏF£í—Ó—:€íçÞÇ”‹ ÎÛ†jã{C%yF‰* ”ŒDà‡ñŽÛ±ÐÍ-5ýV¿ÓƆŠÐ?_•¿Ô•µþE¬øg@_EÎßL¡ÿ£G6ëý‹Ì)j–DS¨}µ%KF À’oÀ”ÿ^ œv¡Ê±"Ô˜¹ÆÌMŽýB‡ÞTmÌûØÁ³X)^íÏbjÒÔ!(êTví€dðçñŸýy¨HÀ¡úͶ»wŠþe Wð÷Î;ï4y^¿µ8D³ú&™ó?vìXòÿÅ/~ÑÌʱֿ÷fQL, çýÃQ…z ©Ì’%"P`‰àÏð¯u÷jpþÿÈÍàŸ¹Fðº/Ò³àÄk“˘Ãí .už­# _üµþ‰ÐgCE´#ý,5v‡‹þ¥ÈïÊ•+·×úßÁ yÃÿÉ.ͨ[æüŸ~úé†?~üö²â3FEÜþúå–^‰-Ï¿?Æ(Nv•¥@?î.Äëç‰ØŽüã½FäÓy%¹J—¥¾#ÃíàÙÜ”œÃ=XÅÝê<ƒ€œÿá<ÿ#¡ÿúDèC¡S‹h•%~Wý¬¯ký·˜óOìÔÝôß ý,ôÐË¡ŒQ‘€aÙR`Ùw`¶ÿ?u§É€ªä,®›í_-ÿÓ;|6€p#oƒÚ/)¶# ND‘Ÿœ?`ß±™EhÜ£¬û¼ÖË9šã¯ç£Ð‹[úMlļdÉXò ˜áßüS'~Íb:ŒQ%^uV×÷H[ìðÙòŽøÑÖ~zSã8èú@ß=Ëœÿó±OÏ„î • ðÞÔ‚h÷u­Q6v­àý+ö;uêÔF 9„ÛàÏ㯵þ§nM‹ÿ`€Åc¾ëÿQ(R!Š]Ïë¾|ùr³ÈCeðÏÇ’îú‰ÌùU9Ï<Àfèåÿõ¡j¾U•¥øÈ D d}Øžó—ï§¼ÿ†ü'¦×â3h£}]ëŸ}`¨T›GúÊù#;Èù#Ü9¡ÿ÷Bß­µþ„.J€.Þ•Ñ甞ëØK§þÁ~°ñøã7¹t¯MQºxñbS¨¤:Ù ÛÕ e^•\ê°g0Tû÷ïo"<˜ˆðMé" ÿåÐs¡BfÔºšI+9ÿĬ¯kýóøé½÷ÞÛ þæø:thãÌ™3'Nœ˜gžB¢O}Êó¿úÏ¡¿ ÕßJ:ˆÀH ÚÁs­Sº…ÀØÁßGDäóxÿ:º^g籨RZïêàïü#R®Á¢@|5 H‚3F øÀƒ¡ 'yûr»¶r’µ.@€°†¢ ìÝqÎv}]ë?gÙXägïÞ½ÍB?›››‡nþqmsŠç• Úrþ€}ÇJ:Š@€ŽÞ˜!§Å«j&_Q’'êéàà!  ãK•vYç:øl « Dd#÷G\‡ ý~¨ ï=¡µ.@€°¦¢ßí ñ·’óWåß÷µþ‘é‡~¸ñø_z饯ë7ÏŸã0£pH2çÿvìÓÿ*ÀÐx¯¤£èèÙvZŒu¿r-€[£ù¶z™…=Ira?þxãüùóÍûC¾Ö©CRŒ2 ra‹¸˜k-E0A+„‰ñ¯u&¶¢oë#î¿:E~òýôH(Bà=me*2øKM!¤ýéëZÿl„"aQÂ#GŽ4+þ‰ª9>ƒlÏùË÷SÞ¿"@ƒÿÄΟ)YE–üÿ63±o« m Š|xÌØ=#&ŒÞ‡u üÄàïzœ³ÈÃ¥jy‚°diÍ×°8‰ KVVsþÈç¥K—š5þÏ;·ñÚk¯5D okýëGl@Ú)56b©œÿ ué+#½È.dKƒ€Á a“Û¦3 ÏEÑ’­µo¢ §5α©ËåX€Ñª°d€°2˜ó—÷—ÿwl.ùú믛BÚ?üpC4íÚµk½]ëŸ P „Ô° sÊ`Î_Þÿrhåüçs_«À2PŸïr‡õTl7B:ÕR¥T¢³cüÒPaôtüø×‹ç챤¼Ó®<[ݾˆ†È€ý ¡KÞþ°u«åânånþ§ŒøØêBü§Bz&t¦yþú‡þ’3R2çÿæ›on¼úê«È€Ù4<龈”š~‚L³úU®·ÁFLˆªé'©.ZˆÿÐÿZ9ÿ¡R wM®M§3ðcÙŸ…òbï • ȺÆo¨èøÂ|ûöíkŠ3lÉèCD€!Fbù¤Éý{Üo’ç©pÉDŽ©‡üð7cÊŸâ¿“'O6û"ilÄaDË®…~úq([ôêÖþÕØ–ô"ý¸i: OUDx9߆º†Zê–IxÉ:=™÷"ÈÙgìº,|$Å´@D€³Ãu`©0'£& @€Ðc1z©‹Aãã¡Cõ žÿL¢½é<}þ|ÐD®^½ÚËœ¿Á0ï_ð©§žjôO<Ñh¶a öçr€ùa(ýûÐê;B_¥@?î ¼Æ[5h}Ê«qœ0v7›½!xýÂ~l Àƒ>ØÌ¥ÏȇÁ3È fõýŸZÊ!çå\…Œÿ® p_\ÑÀk2dÒ,pLÝ’ pOœ#p ô¹PžÿÞ-u|&AÔš|úé§ÍT¿7Þx£i{rþ}ˆ– »X¤ÙàÿÜsÏ5+þYMs0…–‘Áaßcúðyè¯CyþÒg™B‹Ý’>"P wMÌÐ?"` Ò!u@î»÷GJþèäÂ}¿‡ oÊsPÖ©F|Îñ.‰óaÄ`ÅvÎu òÿêÔT¸PÛ$W™ç„÷X\ãý’î €¸§ûB$OTÌñ™Ö®\¹²ÁóWÒ§œÿö fÌ¢±øOÎûŸ¡ˆÖÏé l~‚è3ÒÕG„¾J€þÜ9-;›zÞ+2 ìÏÐÔF ,ß@Êüíßþmà]_ºt©)®côxÙvùƒKx##׃¸¦9Ö€=*Ë‹¡…ÊqJµÀø/¡%ÝG!6‰ˆ}/TJÌ}KdmJ¿ÐÆ ü}ü]ƒÙ ȽAŽyÿl‹þ’6ç_b_ÿ(é9Eú{:â?û3‹œ Â@à Àãaìºê”Ód¤5͹.¼ä‡å‰…2p•>¡¾Â~€¡'â~ñP©}}cnѦDÉlµµ¾‹þ¬_çZ ž 2£l·7p.é9Eúy‡1rìÜ 6uÈ“ó$0ó…yÓï½÷^3Ç誌Z`Ž¥L‘'žCESXû/Bÿ5´¤ûhïÚ=¯ß %  *à¾!~±H—­×DdÉ`)%¦@ŸP8«Íñ¤û(H u ®W:Cÿé#Iuá¼~Fa0âã’#P ¿7OçÌÉéŒ{Cå¸uÒ‰"`Ð4¥NÀs×9.üÙea°2•ÚÖ`œóa&ÎJIc–¸]Šï}jàè6q‚%M;×ÞÝ?*ÿÏóK‚µôˆyÅÚQ¦—´³bDÅ2–ä ~·W"rAMÿ3ï_àŒóþÙ51ŠŽ¯†~ÊæÜbK±SÒo¦¶”ý¾Ì•;{+7XñxÈÁГ¡Œ ÐöT’ÅA¶÷ßC²V`ªXÒ‡ló´y4d3æ6¿ð ™aìfô mÍ!7€èc‘x¿dùˆàhïÚ½ö¯¦Ã4@¤`äýãñäMñSHêá>j_&R`Ê©å~‘€$ñ›½¿4ß±cÇš~qúôéf&²?àgÅ ¯&æ\èåÐ÷BÊö ú.EúyuPP±†Îà)Êy ”QœšÄgîäE3Ž]—,PÌu:FÛ´&ÎŒ /ž<žîg\ÛÁŽÍ€ƒ"qúÃÈŽö“õ.¦úYÛß?mÈ耵þsê_ÍøÝÞˆ^ŸxòÉ'›TŸÇhïÙ³§ ýOAÒ¾ðÍûG> E¼w‹yÇNI(ÐÏ{— ]®úzèЋ¡Ž#òØŒ£P6O(5vïÆ¡3 ò„x<]{2Ð ˜óUÔDyqŒ4ÏNÎ @ D6|ÖvŒøåüå9m½. tH² Ûj×Ú7ÿtèÏC÷…"ÀÚ>KÞK—.5Ëû¾õÖ[ÍTX8FmIå¼¶–¿Ù ‘ï—ß7ð?ÿüó¯¼òJØ»wïíz† Q>Þ½AÞàÿnèk¡¢RŽêÂ*H€~ÞE4×ÐQuH¹9±oÞívƒè^;Æ/ç:3x]÷xœ¯|­]Ô‰ñlvƒ>/G]àÁãÙ!{"O´ \€Ð!ÑnµßÜ ôÚ÷³[úxl§&¼ñÙ†àf®_@Û׿³ ÀÔ1ý¡¢? ¿rþÒyÏ<óL³ÜïÓO?=+!n Š?lм¿TãP¶†íIÝ’>#P ¿wo°ªz¦ï„À h›¡ÇB…D 5/ZÑÛ]b5 ò¤E ¦^w]27Ë@ ßÊÙòìm³ž}öÙ† XY±ã˜âÀ$¼ÿoC3 ÐuÖåüxóßÕŽµç'Cµï·öŠíÔ’óüyÁÚ¹¶Cû.®KÎßR¿ÚÿË/¿Üôű3ŠKÚ † æýÏ`_>^ /wjºóüc|LØî£P„À<‘“~í%q¼D@Ø3Ö<Þ—­Á_õv9P×" ,:…Èÿ3xÝg?S\Ì }ÙBù=jdãùÏ,ÚƒzkIˆ­‚hï–ùú?zôhS+0§ \ƒëŒˆ”¬EVë†z°  „ýY¨Müòáп *òžŒ /Ù!Œ¢P(ÏZ´/„€7ç9íÞbz`Ï@#bV@ÉÔBQìÇŒ´Ø–,÷8ú\è‹¡9õÏñ©E{úÏyþÚ~_çùg LßÍœÿ©S§6~ñ‹_4)0žÿ”Ä~¢`T;ÿ?¡Bþì á<ˆ è%+„@€º™q)|žÿ—¡¼ØC¡Œ¦Ž«sFP \~ùòå¦ÀŽ¡4øg¨tè—;taÉ|­-`ðG &Ô4ð08?“wÉè1‚Yô$’R$ @X’ <Ò}¡Ú´{ÅKu|*Ñ–E‰ŒRíCî)è›è¯ú%ɰ¼¯\?à1ÙõÊš† ×Ç6hç~jvÑÕP΄”XÿŠ“.™Œ@€Éõí:+`+w‡Å¼F #Âû7MˆWá5ãxñâŦ&À >CÉç2êr”ó»§ r›¡ú„TÉåÐs¡"Œ!¬’Å#€ÀjÓ*ÄL8gªœN|q±ÐÕ/ù˦m¿ûî»Í:}‰på…ðø©hÁ_¾ÿСCÍSþNœ8Ñ,ˆ•Ÿr Wí[±ß•ÐCÿúQ¨¶ŸØÇnÉ*!P`•îæ×"4JÝã±^’€ü!ïŸaá=3. ã•+W/)=ë;ÿEw_!2®™™BsÌðâ ©›@œxAˆ#X @X’ðLå¡©}Ñ€™Ä´Ñœ÷éÒ¥&Ò5%Aœéÿìö‡3e§àÏLE›››Ís=›C˜ô‘Þ··öµ}íÞ{>S²bX±ºu9ªšäüIÓØQÐ )W˜Sç," ÀÐÓ¤ú$£r¢žu@3\:æ\(œ„—U9Åó¹À­zб$*>[²;Àýû¡¼~÷È@dP¶*"@¢>¶R@7nÜØxýõ×7Þxãf;øøkµ"}$¸íËã饗¯?—Â Èøƒ0•2Ôæ? }?ô‹PÄ—¸•h X­?EVë~æÕ¸Ü[ÒV9€É¦·Œ䪚Þó¦Ì#ƿ膤‡äZ4ºž$3#Î6pB” 2p=ÙŠDÄ.Þ+Ù=ܼî‚6ñ~ô è~³ZX¡!kE ·¦ºúŒÏö-n}RÛµó /ÕÿÒx;쫃í|Ðã¯Áè+(EVð¦Æ%% pÓ“yµ G†ËåyOÒ¶Œ(cÚq-R®Cõ?˜ Œ_@ùep»Ç9á'êí–0+à2ô`è©PEšHAޫؽSxô X=+âúõëͬO>ùdãìÙ³Íúÿ¢}–$6ÙGjë;ö¦… µº¨é•çCE*õ ¬¢XÅ»ÚÂ5)¤S4¥JºoáѼ|„ÆÀÈÌ!òž £2ç<ÇOÔWvˆ€AèÑÐc¡›[*Ém°Ij Œ<|…¬øcZ¨€5"ÌXÑ'õM}T_U³³%²ûp¨}é©050C¿-YAЬàMKâ½ê¼ŠÙlÃyñr¼0ž¹4ªð¹Pz†Uû2åºëx¨‹å]‹è€tÀ„P)h¤àù0ŒòÏ °LÏ3_ÃÖ~I;ÀæÿéП‡Š”DµèX` Wð÷Î;ï4y^>Ø'¾ÛkÑ3U‡ìhçúìQ®Q× KÑ–C¡HÀ#¡_†šj© "ÂÙþ³Ä¡;$ëÕ?›/Štó¾ìô¬’ÈtÚìSÿ®RXQ•±¢@´/ë0Šòºª¾y~êxIò¤}a(Õ)g­•ÿî’Úr¼0 "•…ÙÓ¡Ú¹]ß0žxQÈþa¿úG€ÐE)ÐÅ»²³s2` £þ8TîšW5Ó}VWi­ÿÌû û=z´ ù+úË­´aש¬iÃÿñù¦-ú< 2qˆØ´ß¿ úô;úÂ,5Óÿr?>™€Q5‰Ëó„,Z#°làÿsÇ ^Œ(ÀHåPoá0é¯+¡Ô=¡Ïléã±e`ÚAÃ/§—­œêMSåþͧ·´*¶$îô?¸ÄO²}æ‚[îÂ… M: ž"Å1§ UŠ ^îÁW¡Ûª ¶D[²>NS˜=*L|$T{)ço†rª6Eèߢ?«²Ö`Ñ ÌÈ€ë´ÐÁ:§áê›[ãù¨|xÂÿf¾6ÇüBlJ¡ˆ˜}ÿΟ–Å=G¦­!hùß/ýç`J ìY34X!"’c»!rèØÂ<¬¹-_œd¢q2ÂÈ€ÍÀV2 VŒçƒ¡¼ÿ§B ݱ æTÃû¿™ÏO—Kߪ¢ß £±ãóö &“Õÿ›››/¼ðB³>€Ç ú|¨6M.„¾úE躧’(i£ á“¡›¡/níÏÕ^E¥.]ºÔ¬ñîܹ×^{­!}_ë_E²­bií 5 ¿ûÝkV Rmyˆo $ÍëøÎ_|G*ÌàþN¤î‰HÃ\ÑÁø“Dß0Àå 7éó«ú>†elCvígM„ÈB¼´uE–M \„>Ê8xm@3°•LFV“Æ…@ÁR4¥ ¹ÉÆrª7?üðC†è&ï™Ñ5˜†!ѹÛNKT9bç.%Às4§Z`‡`ðÚÝ„VN[Ǿª“¸eôôqø=úh¨>?—ä©}JOYòYx¼ï’íU´MáV·b ·ï“ŒüA0H¼þhû7ã{7­ ¾ÀoÆ ƒïèE?v=—ï4ÒoC üìÁVäñob!²ÛÀà€]ú?9Phl¡ #úiè߇î F­@€0¥ÀŠÀSC‚)20Q„ÓˆØz͘PÞ‡uÓÏž=;îùé½1®‡!E2„*lÌК3Žðˆ¤ê ®fÌ‘j¿5÷âÀÖMpLHOM€·ÔØ] Ñ÷y=0y.ôÅPù~êøÔâþ oÈ)ÿW¿úÕÆ«¯¾ÚxËÚ¬…žú.®Ñ@oÚªëÐ~‰÷²¿Ž¹NíkP؉ÿˆïýG|ÿ¦0Ú»ÿA£¶à;^kï~Ÿ“<žvbŽþ1ìg×é˜è > –a~¶ûO¡×CõúçÐíö"ÝEêÛ‘ì6ðû$£Hx­ŽðŸÙÒ£±õŸ_7ã—<·dOe`)ü&†ótdƒ"CzSX‘g¬cyùW®\¹ùë_ÿzƒwµ ÏOgè\›kd@åT]chª•uÕEà@†äH›ãþÀ~°&àëxmDºz%ô«PŸúGyÿbwåEûdåþAyX9>•¸oÚlæü¥¤äüE¦ÜOï­‚dÔOµ[ýs˜ä€<ì½aÇ|ž"½TûWX˜í_=RœÿûoxŒ¨!Øþñz}7ì³>5>¡ý³F@á0»±Ý^Ÿ½¸ub§ qB»).VÈïH¨ð¨üãÇ+<*\:W0¾W2 )J½^ÆM5Cû>ûª¨Š÷1"§:µážãwå+iØ’üÈ«òYé¹QïeD r¤Í4,ÕØ3\ lôT(²‹\ ý(TxïZ¨ÑJÇ_A‚„7/ÆÏ •p™I´ËK—V/ç? m5Ûë°÷'ÓÉå SÐG–¢nâ;ÑÞ¿“íß#…Çý_v ¨!˜§L8õ•~Û}áñÓí¢?œ ´ÇkÎB€°½"¼úGBŸ5àg8@¼7w0¾[2:qxL7ÃË¿ã>•[ä%ÃØÞ³-§:lÀvlŽ3ZÎW\¯küíoÛx•ÈÀÀeŽT}ÀŒ`ðb´íGC‘\„@'Fºåÿ²CÇîZˆëõ î¬}ÎÁL²ª9ÿ™@˜üáü·÷M$Ààûx´ÿïDû¿'Úÿ=œ5lƒ~˜ ÞÛVC°“þ1ì߬ó1cbÚ D@*€½Ðg8Î$··^íðo[€lT¶ÔÏøa4¼ü¿åF¹¨l]3å¬ã{%-! “ü›j*ûßzë­¦²˜'¹F]Xu §š÷8Ïbûë<Þ›­ëUhųD|l2à}H Yˆ5Ã"¼:´þp04k5¾ˆýU/ L[`+¯Éëçýëÿ¢¢p*BÕî…­û õúë¯o¼ùæ›+—ó ÀÎnï›^ß1øûùÀõžÁöŸ}æÃÄàï½!5MMÁ¤‚a¿Ùçc‰S‹5i/kˆÜ»´ÃoÌ@lƒ`–NÒÖ‰ÓœçûLìÓ£¡¢ `^„ïøÿƒá©xY²4^i¡~ÅFòŒ ®ÆL¼¯Ã‡G|ëÀ€ç°ˆó[Äÿ0°¸f^ÿàu3„™#E¤X¹œÿÝ´rd;ÆÛ_7`°ýöagྤÝÈþ1K Á°ßìó1Ø‘k"í…¾£^æB¨1q¾U ;mIÀISì^GWÜódèfè‹¡O„êü%AƒæŽîž0²7åW¥€jVˆ 4t»Àãã?¾=­ÌŠl?ûÙÏ6:Ôx;Û??æ5ËØÎõtÆ1¿ÝÕ·ö@¿g8jN„Šˆ Cð*ˆ§ƺ  à^¸'%Ý@À½¬¡™TCгnï,v¹&BŒ×H´AÒ˜éÔBåýyþÂ}úŒÝÙe Ý„ž¼&ªšý×ûp£ÂªÖÃ|p·â7¡n!×’ÿDÀ ¤ðÌÄ%êà¥&fð„á„6)Ä ç¯NÇþKè*‹Á³Êëÿ»ÐŒ`›Â›c €Á%¡jf¢¼ñÆׯPuX´&~«d °³Ô,áwõ_ÎRÁ>H°¶ìEΚa'Œ«"ë¢ì^#­I€GÃK4:ËóË[ 3ÏóïÜ!:;ƒ› |œ±dvà–óüySW®\ú¿'‰Õ쿸Úßœ… ³ÔìÝ»÷6yEÓ©…ñôÛV_Iâ»+':¨Až Øz0”çï[‘»ÃE›Ô÷µQmUʺ¦©†#´ü£À,5Ë?ãvÏ@¥ÒU£j"ØŸaw¥ DIè{áDõE¢h›¡ß†þ)ô\hkÒ0*'3aèäþæšç»ýª¬yÍ 0M `’Amÿl½žŒæ™ÀªxBÛ ¬FZ2ÍšFï±ÇkžÓŽ <òÈ#Í"B9“`È/ìõ‘ÛUüãòa[DØD€]˜JjTš¨Tâ?Õ—ëC E`Þ‚…žäþ™6êyð@ŒÔDHж² ös<ØL¥c/ þ<䙽@ž þ×B;GâœÙž³˜yžoþPn R—.]Úxï½÷š\“e\sËÏÔvz'Ê›Õ`åï2¬jP+€°tÖØW<åÁñßnÞÕ±×EÌ2k¦&â%™ožÞ’c%…@—`k"D ÙvBÝ2 €XutŒˆ !{BÙ Z_ú<´Ui# L!?é;iŒE¥Žp§ßPDVQf.E•bQ&¹?OÂ:{ölóÚÀå}$ d~`oÀ× “ÁÛ–ŒG³ÏšjÚ- 1ú) uäÔñÿh5Þe8êÔ?ˆ ­6ãaÔ&µM†t«F¥éëU£¡’®#°½&ÂùjÓj…Ì`+8`O<ñDs|Ìõ f=jJ=a;¤ÒZ•6€“Ô¹UûËW Nv¤èäœ í ícJ÷ Q Mo_‹žÁM’0òÇë±Àþ©h þc!»ýf’%ì#ÿÌ…Þþ`íðþ3u#CLi|FR”Åó'^² Þ/)ºŽ@Ú¶%Ú®A?£‡j¦hϾœ)4‘3¯ië¡ ðqb~$à@¨¼…HÀ-bg»ÈaŠE>æ\‹~ûÏÖëB`! ®:±””v\j(쌕(Àĺö¦}!T©1íïý÷߯•¡ÐÖÁ®"0è$ ž#B€ ˆ^+Tç2AŒŸB݃án³Z•6À³qF~¿eù_! @c¨ð:±}^¾"?^ÈKà¨f +)º†€v*4m›l¿kçØ‘óéäù±ú¹ˆŠ‡O™ma?FÕgJ ¾" êßÀ¯P]Ëœ‚P·*m€ãŒxýž0ø£7c €¯ÀÏòžS®E?YR,9½¬TWàƒ” EÀàŸ:ôfDðüùó=°Þ¿`Ñ©AïW”e$|õFÇ`/8 ™ PßbŸíà<ØŸÒ‰PSÓª´a¹Ô(D¨ŸŽeþB¨:¸|ß„µèã§J î  ³ åaõ˜²wç":t&¼{áQ–<6AJÀ ÏN %…@ŸÐŽÕ³¨k¹páB71àLL±.€Ë—NkUÚ òcûígœÞ#ªãg1àöÏÕëB ‹$k×iµáüw~— ö ¤º ÛJýíÓú…î €ÄJy„×BbÇo;¾ÿþIëˆä…t2à¤f&ò ò!ò" iI!Ð7°ú’v@¢ë*ÚùÕú•B`ùð\i-D@;·ÈqÏñûï¿'u;ºÀ™î!ÿM^b쪾ÃX»Ïy¾ò5Ïwªu¨óhËEÚ¹MŒ¢œhVH+,)úŽ€AÞ8wãÆ&Âeð7Nm BpøðáiÖÃL‘öipkƒLÌK0’@¨y¾ÓÜ’úL!°^ðþ3Pi•õº÷ërµÈ,’k4è#¸ê]¤¼Ç9^†´A&æ%jžï2nmýÏB ?ðÈ$^—«„€Ÿ œâ¬wñzYÒ˜xîØMÍóS} ( B` @v»°ŽH`b^¢æù®A‹®K,v€'‡Äb/–ÝÁ%ÔW ©èÒ:"m€‰­3ËsÔ<߉PÕ µC ‹) @W®]3X› VïÒ•uDBÜY̾æù®M_‹ Íâµµ¸Ø]¾Hƒ¿4!¡X¸fì2àõóKC@}Ë Xf½ËÂ*m²Ê7óKC¿þq!ÐÚtI;ðø‘ÕѶ%…@!°û,,Pó|wÿfÖX +i­ÌWW¸z縫þ·ÀøÃf‹\Á7‰ÁÎÿCýB!Ð Øu.Ú7²»Ìz—…D2T:8ͧ¼§n4Æ:‹Ù0( v`¯‹ÌŽc~CTa”Ñyä‘ k¤ÿèG?jÊEÂò³µ-úŽ@—ìÇÂ":ù XfÞ£ï ¨Î¹ÈOËSçšõ²y?òac×L–ýÁ~°ñøã76Âë|4°Ç‚{TxF\Fþ§z£è ]² #=¹7uš…ÀT æ«Ëû ÙØÁß79–æýçúè÷Þ{oõDK¸´¤Xºb?F0xyÓeæ=V¥Õu,²¢òÕ|Ä÷ûxØj> ý—С?•Èô€íPÉ¢¢.ò¥d ¤è#l‰Áÿ¹çžÛ8sæÌÆþýûg‚ý`[&ؼä‰aÆüà´Û… HGÎy¾ |¾ùæ›û·k¢.¾–þœö–Õç@æì´Ma»x`ãé§ŸÞ8yòd³Uà3B×Ú·í‘ÿÖ×2žƒà˜¯ôú-7ÿ¿¡þË¡Ÿ…þŸÐûB¥qˆ—w <áÎhŠºÜ¸á§n-)^»ñª#ÝF@{æ?üðÃG޹íùOi?òâÆ¦ÑòC³lÛ ÚŒhÍóå¶Ôg—‰@æìû„„û:Ô0÷'Nl<ú裳žžŽ+../Þ:“ßì’ Üõ‹¡" Ýz4T$à¡Ðÿ:„Jºåðá÷=£Ï?ÿ|ã£>j‡"\Ioàܪcɺλ2‡°­J`â e‡®y¾¡ªtí5sv¦¥ÉÙ)Ü1 ÉãÍ)™ ×çÆ† æüý.} øsèµPú6ÔµcO? ý~èH ,Ê^‘J Hˆ0¦"‡%…@Ÿ@Z­gaa+©,ÎÅ2´¿Ìñ;·¿Ò˜xR"5Ï÷6æµÓäì„ëxü/½ôRãõóüy¦3Š™ð÷7¡òáÿ;Ô ¸Ê‚¸æ+¡_…~Êëwœ 9̈¡™R ¥¬ˆ˜½ýöÛMÚ)àQeêE@.ÏÜü‡úS,Žƒö;Ø.µ[㟔¡6šO¼DrLjþ¡¿ÐL²!­J`b^ Láâkžo«÷²~¬E´Y9;^hæì¤±²cOù¯„¾yÂWC¿ ½*™-?žƒa쮜0^úG\/`À}9øÇ{ Æi/.¶Â¢K×®]k¢ß~ûm³<°hãJÌ0B ¼®z¢’ú³` ðYÔÇ YÈÊãWË2¥ Éþ£ïè7 øC³×âŸ6ÀX“çÊpbFDþ#ó!¶5Ï7Qªmh1gÇÛç¿z)ôÐ߇ʯ2ˆËkùè]¯‘šAc„QŽ”A{Á˜"c?ûÙÏ2ÀÐ"<)DýZU'ðÕW_‰j½±›h—òûV´4Æ!ˆ)k €ãÇoŠZ"¯“¸Ž8¶áßC¿Aûc(Býyh«Ò˜˜vÆò :m­ó= :¶lZÊÙé¸üB/n©0V¿ê .ñá((‚Tü7•ÓpÇ·ã#Ê€²„¨!lÈÕ«Wo? é{I!°X ìÒUj†xûHrŠÀÚ—BTS$¢5`#®‡~jàG¢ÕÔ´*mù=•QØ>Åô©ÅPÉy¾ò!X“´€^åô†ÂUw 5gh_;Ô93U5cÎ.û€·QˆÇÿVè?…f>ÜSmè:Þ>¯Ÿ]P aß±‘v"Þ»C„Q¥cxY +a\zh[â~"olŒ{ç¾æ½½ãÇêE!°CØ *²mP·°ÏO~ò“—_~¹©]1è‹øLF±ØšÑð§ÀŽ —Cß eCÑ"­J@^B'vÒ仡¾ßÙ¹uJùL +’׫œ^ V²0 -çìrp¶3à¿¿¥çc‹µ’$d‰Ck!®Wþ.Ÿ‡Âbo({1UÑàŽ¤ÃßkwF)þ·ÜxÖ ìÌcëgJ ™@0 îÿ ñ[èç™gži^k¯I²r.´Ç)H©þ"…È뿊4«)jUÚ ¯Æõ[? } ôáP¡¾¡Â%‡j¼~FXHOçÅ”*§È•ì:»³ÓY…ø?Õiõ ûŠ×Y3?#cÿdè¾Pvc¢0šìÝ.¼­¿ù›¿i¢î«©ÆvØç·¿^³"€x" T…þ_xá…f¡°9Ö Ùþ¯3bfüÔoDÙ‘Öåîž4û¿àå|úßBýþPὑk2ÅG§FÔ4÷+§è•ì*»³C.‡~úYèïCyþë.}† >¢$¼~áLÎGa*Ÿ+ÖhàTd€Ú€ô¸Æ~±Þ,æ@Àà/m­@5ëSv°NÈö3E×7¨ýÎ€Ž“3øßz:Ô ¿Š ¬\øss³IÈëü“á#•Ó ]ÜŽÓþv)gÇÃýuè«¡H15ð­» YÕ|=öo„^ u0• `èî K¶×0Ð ()ÚFÀàOØŽ+ µC1nê+Bþêe4^$@ž[M´P`ÐÿQèÁP':rð÷š^~ ÏÚg€*⩜¤JÚD`9»Á·ANGÛÚ¼¾ÿ r]„HþV÷… wŠî U€Ì5bo¯`S›RR´À`ûÒÆ´?d`’놤ó ^æ_C5`?¬AwŽdh"OÞ‰ ÿëØ#`£rs¼³Êé„®Þ˜äì \X;öÞzÅݕ¯1^·Fä[Ä9z'4íÇ‘Ø?ŠˆÌ,iSFÙ•™°¾P,}Á oÝÏBõ߇f±u&ÛF ίÌ}0g±uxþMåôæÇ®¾y7 ÈÙ™çNõnÉxLmR3ñQ¨ðæžP6d.ß+)úŒ€þ`À×.néØr*8Ø­zÿñ{Må¾íN„Ç/‡§ãz@ögšçŸ¿C*§wõb‡,0g—0¡î’Ñðx<ƒÿç[ËšÉT¶%£¼ »Òº'¿YRì6Ú²Âé°Ávm`êçù¿úO¡"¦ëÔ÷ò;±ÛŽ´ð:ªNé"œ¸Î<ó<ßøÎR9½;à¨;D`A9;žëu‡—ÞÕ¯3jRl2ð@èwC* ¸8½NRà˜ý’B oø\ã¤A;»úÁ–ž­ÙCÆP¶$íInãP;ÒH6.OaàÏ“<û3ÍóÝ~I•ÓÛŽH½î-ƒ×`Îîr¼Ö²ÄnÉà„P8ÂŽ>*ªÈPª'º7ôHèþP¡¤èœöáB¨p¿™eGL‘åýÿ6ôjèB¤  ]žÂE`9X£—,íö$ ìbþ{ý—B`>Ô$²»MÀ%Dç¢s 9ö‹Å½þÛÎ褽¸'WGÛÙµÕ· B ( B OðvJ B ( B`Í(°f7¼.·( B €@ä%?ŠQIDAT€j…@!P…À"P` oz]r!P…@!P Ú@!P…@!°†XÛ^—\…@!P¨6P…@!P¬!EÖð¦×%…@!PEª …@!Pkˆ@€5¼éuÉ…@!P…@€j…@!P…À"P` oz]r!P…@!P Ú@!P…@!°†XÛ^—\…@!P¨6P…@!P¬!EÖð¦×%…@!PEª …@!Pkˆ@€5¼éuÉ…@!P…@€j…@!P…À"P` oz]r!P…@!P Ú@!P…@!°†XÛ^—\…@!P¨6P…@!P¬!EÖð¦×%…@!PEª …@!Pkˆ@€5¼éuÉ…@!P…@€j…@!P…À"P` oz]r!P…@!P Ú@!P…@!°†XÛ^—\…@!P¨6P…@!P¬!EÖð¦×%…@!PEª …@!Pkˆ@€5¼éuÉ…@!P…@€j…@!P…À"P` oz]r!P…@!P Ú@!P…@!°†XÛ^—\…@!P¨6P…@!P¬!ÿy|&±ã©IEND®B`‚icnV ¿€therion/loch/loch.app/Contents/Info.plist0000664000175000017500000000301012053734174017444 0ustar useruser CFBundleInfoDictionaryVersion 6.0 CFBundleIdentifier org.wxwindows.. CFBundleDevelopmentRegion English CFBundleExecutable loch CFBundleDocumentTypes CFBundleTypeName Therion loch files. CFBundleTypeIconFile loch.icns CFBundleTypeExtensions lox CFBundleTypeRole Viewer CFBundleIconFile loch.icns CFBundleName loch CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 CFBundleShortVersionString 1.0 CFBundleGetInfoString loch, (c) 2001-2012 Stacho Mudrak CFBundleLongVersionString loch, (c) 2001-2012 Stacho Mudrak NSHumanReadableCopyright Copyright 2001-2012 Stacho Mudrak LSRequiresCarbon CSResourcesFileMapped therion/loch/loch.app/Contents/MacOS/0000775000175000017500000000000011763353324016445 5ustar userusertherion/loch/loch.app/Contents/PkgInfo0000664000175000017500000000001010572556040016747 0ustar useruserAPPL????therion/loch/lxOGLFT.cxx0000664000175000017500000031435512047417426014160 0ustar useruser/* * OGLFT: A library for drawing text with OpenGL using the FreeType library * Copyright (C) 2002 lignum Computing, Inc. * $Id: OGLFT.cpp,v 1.11 2003/10/01 14:21:18 allen Exp $ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #define OGLFT_NO_SOLID #include "lxOGLFT.h" namespace OGLFT { // This is the static instance of the FreeType library wrapper ... Library Library::library; // ... and this is the FreeType library handle itself. FT_Library Library::library_; // The static instance above causes this constructor to be called // when the object module is loaded. Library::Library ( void ) { FT_Error error = FT_Init_FreeType( &library_ ); if ( error != 0 ) { std::cerr << "Could not initialize the FreeType library. Exiting." << std::endl; exit( 1 ); } } Library::~Library ( void ) { FT_Error error = FT_Done_FreeType( library_ ); if ( error != 0 ) { std::cerr << "Could not terminate the FreeType library." << std::endl; } } // Return the only instance in the process FT_Library& Library::instance ( void ) { return library_; } // Load a new face Face::Face ( const char* filename, float point_size, FT_UInt resolution ) : point_size_( point_size ), resolution_( resolution ) { valid_ = true; // Assume the best :-) FT_Face ft_face; FT_Error error = FT_New_Face( Library::instance(), filename, 0, &ft_face ); if ( error != 0 ) { valid_ = false; return; } // As of FreeType 2.1: only a UNICODE charmap is automatically activated. // If no charmap is activated automatically, just use the first one. if ( ft_face->charmap == 0 && ft_face->num_charmaps > 0 ) FT_Select_Charmap( ft_face, ft_face->charmaps[0]->encoding ); faces_.push_back( FaceData( ft_face ) ); init(); } // Go with a face that the user has already opened. Face::Face ( FT_Face face, float point_size, FT_UInt resolution ) : point_size_( point_size ), resolution_( resolution ) { valid_ = true; // As of FreeType 2.1: only a UNICODE charmap is automatically activated. // If no charmap is activated automatically, just use the first one. if ( face->charmap == 0 && face->num_charmaps > 0 ) FT_Select_Charmap( face, face->charmaps[0]->encoding ); faces_.push_back( FaceData( face, false ) ); init(); } // Standard initialization behavior once the font file is opened. void Face::init ( void ) { // By default, each glyph is compiled into a display list the first // time it is encountered compile_mode_ = COMPILE; // By default, all drawing is wrapped with push/pop matrix so that the // MODELVIEW matrix is not modified. If advance_ is set, then subsequent // drawings follow from the advance of the last glyph rendered. advance_ = false; // Initialize the default colors foreground_color_[R] = 0.; foreground_color_[G] = 0.; foreground_color_[B] = 0.; foreground_color_[A] = 1.; background_color_[R] = 1.; background_color_[G] = 1.; background_color_[B] = 1.; background_color_[A] = 0.; // The default positioning of the text is at the origin of the first glyph horizontal_justification_ = ORIGIN; vertical_justification_ = BASELINE; // By default, strings are rendered in their nominal direction string_rotation_ = 0; // setCharacterRotationReference calls the virtual function clearCaches() // so it is up to a subclass to set the real default rotation_reference_glyph_ = 0; rotation_reference_face_ = 0; rotation_offset_y_ = 0.; } Face::~Face ( void ) { for ( unsigned int i = 0; i < faces_.size(); i++ ) if ( faces_[i].free_on_exit_ ) FT_Done_Face( faces_[i].face_ ); } // Add another Face to select characters from bool Face::addAuxiliaryFace ( const char* filename ) { FT_Face ft_face; FT_Error error = FT_New_Face( Library::instance(), filename, 0, &ft_face ); if ( error != 0 ) return false; faces_.push_back( FaceData( ft_face ) ); setCharSize(); return true; } // Add another Face to select characters from bool Face::addAuxiliaryFace ( FT_Face face ) { faces_.push_back( FaceData( face, false ) ); setCharSize(); return true; } // Note: Changing the point size also clears the display list cache void Face::setPointSize ( float point_size ) { if ( point_size != point_size_ ) { point_size_ = point_size; clearCaches(); setCharSize(); } } // Note: Changing the resolution also clears the display list cache void Face::setResolution ( FT_UInt resolution ) { if ( resolution != resolution_ ) { resolution_ = resolution; clearCaches(); setCharSize(); } } // Note: Changing the background color also clears the display list cache. void Face::setBackgroundColor ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) { if ( background_color_[R] != red || background_color_[G] != green || background_color_[B] != blue || background_color_[A] != alpha ) { background_color_[R] = red; background_color_[G] = green; background_color_[B] = blue; background_color_[A] = alpha; clearCaches(); } } // Note: Changing the foreground color also clears the display list cache. void Face::setForegroundColor ( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) { if ( foreground_color_[R] != red || foreground_color_[G] != green || foreground_color_[B] != blue || foreground_color_[A] != alpha ) { foreground_color_[R] = red; foreground_color_[G] = green; foreground_color_[B] = blue; foreground_color_[A] = alpha; clearCaches(); } } // Note: Changing the foreground color also clears the display list cache. void Face::setForegroundColor ( const GLfloat foreground_color[4] ) { if ( foreground_color_[R] != foreground_color[R] || foreground_color_[G] != foreground_color[G] || foreground_color_[B] != foreground_color[B] || foreground_color_[A] != foreground_color[A] ) { foreground_color_[R] = foreground_color[R]; foreground_color_[G] = foreground_color[G]; foreground_color_[B] = foreground_color[B]; foreground_color_[A] = foreground_color[A]; clearCaches(); } } // Note: Changing the background color also clears the display list cache. void Face::setBackgroundColor ( const GLfloat background_color[4] ) { if ( background_color_[R] != background_color[R] || background_color_[G] != background_color[G] || background_color_[B] != background_color[B] || background_color_[A] != background_color[A] ) { background_color_[R] = background_color[R]; background_color_[G] = background_color[G]; background_color_[B] = background_color[B]; background_color_[A] = background_color[A]; clearCaches(); } } #ifndef OGLFT_NO_WX // Note: Changing the foreground color also clears the display list cache. void Face::setForegroundColor ( const wxColour foreground_rgba ) { GLfloat foreground_color[4]; foreground_color[R] = foreground_rgba.Red() / 255.; foreground_color[G] = foreground_rgba.Green() / 255.; foreground_color[B] = foreground_rgba.Blue() / 255.; foreground_color[A] = 1.0; if ( foreground_color_[R] != foreground_color[R] || foreground_color_[G] != foreground_color[G] || foreground_color_[B] != foreground_color[B] || foreground_color_[A] != foreground_color[A] ) { foreground_color_[R] = foreground_color[R]; foreground_color_[G] = foreground_color[G]; foreground_color_[B] = foreground_color[B]; foreground_color_[A] = foreground_color[A]; clearCaches(); } } // Note: Changing the background color also clears the display list cache. void Face::setBackgroundColor ( const wxColour background_rgba ) { GLfloat background_color[4]; background_color[R] = background_rgba.Red() / 255.; background_color[G] = background_rgba.Green() / 255.; background_color[B] = background_rgba.Blue() / 255.; background_color[A] = 1.0; if ( background_color_[R] != background_color[R] || background_color_[G] != background_color[G] || background_color_[B] != background_color[B] || background_color_[A] != background_color[A] ) { background_color_[R] = background_color[R]; background_color_[G] = background_color[G]; background_color_[B] = background_color[B]; background_color_[A] = background_color[A]; clearCaches(); } } #endif /* OGLFT_NO_WX */ // Note: Changing the string rotation angle clears the display list cache void Face::setStringRotation ( GLfloat string_rotation ) { if ( string_rotation != string_rotation_ ) { string_rotation_ = string_rotation; clearCaches(); // Note that this affects ALL glyphs accessed through // the Face, both the vector and the raster glyphs. Very nice! if ( string_rotation_ != 0. ) { float angle; if ( string_rotation_ < 0. ) { angle = 360. - fmod( fabs( string_rotation_ ), 360.f ); } else { angle = fmod( string_rotation_, 360.f ); } FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(angle * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; for ( unsigned int i = 0; i < faces_.size(); i++ ) FT_Set_Transform( faces_[i].face_, &rotation_matrix, 0 ); } else for ( unsigned int i = 0; i < faces_.size(); i++ ) FT_Set_Transform( faces_[i].face_, 0, 0 ); } } // Note: Changing the rotation reference character clears the display list cache. void Face::setCharacterRotationReference ( unsigned char c ) { unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( f < faces_.size() && glyph_index != rotation_reference_glyph_ ) { FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; rotation_reference_glyph_ = glyph_index; rotation_reference_face_ = faces_[f].face_; setRotationOffset(); clearCaches(); } } BBox Face::measure ( const char* s ) { BBox bbox; unsigned char c; if ( ( c = *s++ ) != 0 ) { bbox = measure( c ); for ( c = *s; c != 0; c = *++s ) { BBox char_bbox = measure( c ); bbox += char_bbox; } } return bbox; } BBox Face::measureRaw ( const char* s ) { BBox bbox; for ( char c = *s; c != 0; c = *++s ) { BBox char_bbox; unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) continue; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) continue; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) continue; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); char_bbox = ft_bbox; char_bbox.advance_ = faces_[f].face_->glyph->advance; bbox += char_bbox; } return bbox; } #ifndef OGLFT_NO_WX BBox Face::measure ( const wxString& s ) { BBox bbox; if ( s.length() > 0 ) { bbox = measure( (const wxChar) s.GetChar( 0 ) ); for ( unsigned int i = 1; i < s.length(); i++ ) { BBox char_bbox = measure( (const wxChar) s.GetChar( i ) ); bbox += char_bbox; } } return bbox; } BBox Face::measure ( const wxString& format, double number ) { return measure( format_number( format, number ) ); } BBox Face::measureRaw ( const wxString& s ) { BBox bbox; for ( unsigned int i = 0; i < s.length(); i++ ) { BBox char_bbox; unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, s.GetChar( i ) ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) { continue; } FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) continue; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) continue; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); char_bbox = ft_bbox; char_bbox.advance_ = faces_[f].face_->glyph->advance; bbox += char_bbox; } return bbox; } #endif /* OGLFT_NO_WX */ // Measure the bounding box as if the (latin1) string were not rotated BBox Face::measure_nominal ( const char* s ) { if ( string_rotation_ == 0. ) return measure( s ); for ( unsigned int f = 0; f < faces_.size(); f++ ) FT_Set_Transform( faces_[f].face_, 0, 0 ); BBox bbox = measure( s ); float angle; if ( string_rotation_ < 0. ) { angle = 360. - fmod( fabs( string_rotation_ ), 360.f ); } else { angle = fmod( string_rotation_, 360.f ); } FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(angle * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; for ( unsigned int f = 0; f < faces_.size(); f++ ) FT_Set_Transform( faces_[f].face_, &rotation_matrix, 0 ); return bbox; } #ifndef OGLFT_NO_WX // Measure the bounding box as if the (UNICODE) string were not rotated BBox Face::measure_nominal ( const wxString& s ) { if ( string_rotation_ == 0. ) return measure( s ); for ( unsigned int f = 0; f < faces_.size(); f++ ) FT_Set_Transform( faces_[f].face_, 0, 0 ); BBox bbox = measure( s ); float angle; if ( string_rotation_ < 0. ) { angle = 360. - fmod( fabs( string_rotation_ ), 360.f ); } else { angle = fmod( string_rotation_, 360.f ); } FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(angle * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; for ( unsigned int f = 0; f < faces_.size(); f++ ) FT_Set_Transform( faces_[f].face_, &rotation_matrix, 0 ); return bbox; } // Format the number per the given format. Mostly pointless // for the standard formats, e.g. %12e. You can use the regular // Qt functions to format such a string and avoid the parsing // which is done here. wxString Face::format_number ( const wxString& format, double number ) { return wxString::Format(format, number); } #endif /* OGLFT_NO_WX */ // Compile a (latin1) string into a display list GLuint Face::compile ( const char* s ) { // First, make sure all the characters in the string are themselves // in display lists const char* s_tmp = s; unsigned char c; for ( c = *s_tmp; c != 0; c = *++s_tmp ) { compile( c ); } GLuint dlist = glGenLists( 1 ); glNewList( dlist, GL_COMPILE ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); if ( !advance_ ) glPushMatrix(); draw( s ); if ( !advance_ ) glPopMatrix(); glEndList(); return dlist; } #ifndef OGLFT_NO_WX // Compile a (UNICODE) string into a display list GLuint Face::compile ( const wxString& s ) { // First, make sure all the characters in the string are themselves // in display lists for ( unsigned int i = 0; i < s.length(); i++ ) { compile( (const wxChar) s.GetChar( i ) ); } GLuint dlist = glGenLists( 1 ); glNewList( dlist, GL_COMPILE ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); if ( !advance_ ) glPushMatrix(); draw( s ); if ( !advance_ ) glPopMatrix(); glEndList(); return dlist; } #endif /* OGLFT_NO_WX */ // Compile a (latin1) character glyph into a display list and cache // it for later GLuint Face::compile ( unsigned char c ) { // See if we've done it already GDLCI fgi = glyph_dlists_.find( c ); if ( fgi != glyph_dlists_.end() ) return fgi->second; unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return 0; GLuint dlist = compileGlyph( faces_[f].face_, glyph_index ); glyph_dlists_[ c ] = dlist; return dlist; } #ifndef OGLFT_NO_WX // Compile a (UNICODE) character glyph into a display list and cache // it for later GLuint Face::compile ( const wxChar c ) { // See if we've done it already GDLCI fgi = glyph_dlists_.find( c ); if ( fgi != glyph_dlists_.end() ) return fgi->second; unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return 0; GLuint dlist = compileGlyph( faces_[f].face_, glyph_index ); glyph_dlists_[ c ] = dlist; return dlist; } #endif /* OGLFT_NO_WX */ // Assume the MODELVIEW matrix is already set and draw the (latin1) // string. Note: this routine now ignores almost all settings: // including the position (both modelview and raster), color, // justification and advance settings. Consider this to be the raw // drawing routine for which you are responsible for most of the // setup. void Face::draw ( const char* s ) { DLCI character_display_list = character_display_lists_.begin(); unsigned char c; for (c = *s; c != 0; c = *++s ) { if ( character_display_list != character_display_lists_.end() ) { glCallList( *character_display_list ); character_display_list++; } draw( c ); } } #ifndef OGLFT_NO_WX // Assume the MODELVIEW matrix is already set and draw the (UNICODE) // string. Note: this routine now ignores almost all settings: // including the position (both modelview and raster), color, // justification and advance settings. Consider this to be the raw // drawing routine for which you are responsible for most of the // setup. void Face::draw ( const wxString& s ) { DLCI character_display_list = character_display_lists_.begin(); for ( unsigned int i = 0; i < s.length(); i++ ) { if ( character_display_list != character_display_lists_.end() ) { glCallList( *character_display_list ); character_display_list++; } draw( (const wxChar) s.GetChar( i ) ); } } #endif /* OGLFT_NO_WX */ // Assume the MODELVIEW matrix is already setup and draw the // (latin1) character. void Face::draw ( unsigned char c ) { // See if we've done it already GDLCI fgi = glyph_dlists_.find( c ); if ( fgi != glyph_dlists_.end( ) ) { glCallList( fgi->second ); return; } unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return; // Otherwise, either compile it (and call it) or ... else if ( compile_mode_ == COMPILE ) { GLuint dlist = compile( c ); glCallList( dlist ); } // ... render it immediately else { renderGlyph( faces_[f].face_, glyph_index ); } } #ifndef OGLFT_NO_WX // Assume the MODELVIEW matrix is already setup and draw the // (UNICODE) character. void Face::draw ( const wxChar c ) { // See if we've done it already GDLCI fgi = glyph_dlists_.find( c ); if ( fgi != glyph_dlists_.end( ) ) { glCallList( fgi->second ); return; } unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) { break; } } if ( glyph_index == 0 ) return; // Otherwise, either compile it (and call it) or ... if ( compile_mode_ == COMPILE ) { GLuint dlist = compile( c ); glCallList( dlist ); } // ... render it immediately else { renderGlyph( faces_[f].face_, glyph_index ); } } #endif /* OGLFT_NO_WX */ // Draw the (latin1) character at the given position. The MODELVIEW // matrix is modified by the glyph advance. void Face::draw ( GLfloat x, GLfloat y, unsigned char c ) { glTranslatef( x, y, 0. ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( c ); } // Draw the (latin1) character at the given position. The MODELVIEW // matrix is modified by the glyph advance. void Face::draw ( GLfloat x, GLfloat y, GLfloat z, unsigned char c ) { glTranslatef( x, y, z ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( c ); } #ifndef OGLFT_NO_WX // Draw the (UNICODE) character at the given position. The MODELVIEW // matrix is modified by the glyph advance. void Face::draw ( GLfloat x, GLfloat y, wxChar c ) { glTranslatef( x, y, 0. ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( c ); } // Draw the (UNICODE) character at the given position. The MODELVIEW // matrix is modified by the glyph advance. void Face::draw ( GLfloat x, GLfloat y, GLfloat z, wxChar c ) { glTranslatef( x, y, z ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( c ); } #endif /* OGLFT_NO_WX */ // Draw the (latin1) string at the given position. void Face::draw ( GLfloat x, GLfloat y, const char* s ) { if ( !advance_ ) glPushMatrix(); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) { glPushMatrix(); BBox bbox = measure_nominal( s ); GLfloat dx = 0, dy = 0; switch ( horizontal_justification_ ) { case LEFT: dx = -bbox.x_min_; break; case CENTER: dx = -( bbox.x_min_ + bbox.x_max_ ) / 2.; break; case RIGHT: dx = -bbox.x_max_; break; default: break; } switch ( vertical_justification_ ) { case BOTTOM: dy = -bbox.y_min_; break; case MIDDLE: dy = -( bbox.y_min_ + bbox.y_max_ ) / 2.; break; case TOP: dy = -bbox.y_max_; break; default: break; } // There is probably a less expensive way to compute this glRotatef( string_rotation_, 0., 0., 1. ); glTranslatef( dx, dy, 0 ); glRotatef( -string_rotation_, 0., 0., 1. ); } glTranslatef( x, y, 0. ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( s ); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) glPopMatrix(); if ( !advance_ ) glPopMatrix(); } // Draw the (latin1) string at the given position. void Face::draw ( GLfloat x, GLfloat y, GLfloat z, const char* s ) { if ( !advance_ ) glPushMatrix(); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) { glPushMatrix(); BBox bbox = measure_nominal( s ); GLfloat dx = 0, dy = 0; switch ( horizontal_justification_ ) { case LEFT: dx = -bbox.x_min_; break; case CENTER: dx = -( bbox.x_min_ + bbox.x_max_ ) / 2.; break; case RIGHT: dx = -bbox.x_max_; break; default: break; } switch ( vertical_justification_ ) { case BOTTOM: dy = -bbox.y_min_; break; case MIDDLE: dy = -( bbox.y_min_ + bbox.y_max_ ) / 2.; break; case TOP: dy = -bbox.y_max_; break; default: break; } // There is probably a less expensive way to compute this glRotatef( string_rotation_, 0., 0., 1. ); glTranslatef( dx, dy, 0 ); glRotatef( -string_rotation_, 0., 0., 1. ); } glTranslatef( x, y, z ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( s ); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) glPopMatrix(); if ( !advance_ ) glPopMatrix(); } #ifndef OGLFT_NO_WX // Draw the (UNICODE) string at the given position. void Face::draw ( GLfloat x, GLfloat y, const wxString& s ) { if ( !advance_ ) glPushMatrix(); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) { glPushMatrix(); BBox bbox = measure_nominal( s ); GLfloat dx = 0, dy = 0; switch ( horizontal_justification_ ) { case LEFT: dx = -bbox.x_min_; break; case CENTER: dx = -( bbox.x_min_ + bbox.x_max_ ) / 2.; break; case RIGHT: dx = -bbox.x_max_; break; default: break; } switch ( vertical_justification_ ) { case BOTTOM: dy = -bbox.y_min_; break; case MIDDLE: dy = -( bbox.y_min_ + bbox.y_max_ ) / 2.; break; case TOP: dy = -bbox.y_max_; break; default: break; } // There is probably a less expensive way to compute this glRotatef( string_rotation_, 0., 0., 1. ); glTranslatef( dx, dy, 0 ); glRotatef( -string_rotation_, 0., 0., 1. ); } glTranslatef( x, y, 0. ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( s ); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) glPopMatrix(); if ( !advance_ ) glPopMatrix(); } // Draw the (UNICODE) string at the given position. void Face::draw ( GLfloat x, GLfloat y, GLfloat z, const wxString& s ) { if ( !advance_ ) glPushMatrix(); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) { glPushMatrix(); // In 3D, we need to exert more care in the computation of the // bounding box of the text. NOTE: Needs to be fixed up for // polygonal faces, too... BBox bbox; // Code from measure_nominal, but changed to use measureRaw instead if ( string_rotation_ == 0. ) bbox = measureRaw( s ); else { // Undo rotation for ( unsigned int f = 0; f < faces_.size(); f++ ) FT_Set_Transform( faces_[f].face_, 0, 0 ); bbox = measureRaw( s ); // Redo rotation float angle; if ( string_rotation_ < 0. ) { angle = 360. - fmod( fabs( string_rotation_ ), 360.f ); } else { angle = fmod( string_rotation_, 360.f ); } FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(angle * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; for ( unsigned int f = 0; f < faces_.size(); f++ ) FT_Set_Transform( faces_[f].face_, &rotation_matrix, 0 ); } // Determine the offset into the bounding box which will appear // at the user's specified position. GLfloat dx = 0, dy = 0; switch ( horizontal_justification_ ) { case LEFT: dx = bbox.x_min_; break; case CENTER: dx = ( bbox.x_min_ + bbox.x_max_ ) / 2; break; case RIGHT: dx = bbox.x_max_; break; default: break; } switch ( vertical_justification_ ) { case BOTTOM: dy = bbox.y_min_; break; case MIDDLE: dy = ( bbox.y_min_ + bbox.y_max_ ) /2; break; case TOP: dy = bbox.y_max_; break; default: break; } // **Now** rotate these coordinates around into 3D modeling coordinates! GLint viewport[4]; GLdouble modelview[16], projection[16]; glGetIntegerv( GL_VIEWPORT, viewport ); glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); GLdouble x0, y0, z0; gluUnProject( 0, 0, 0, modelview, projection, viewport, &x0, &y0, &z0 ); GLdouble dx_m, dy_m, dz_m; gluUnProject( dx, dy, 0., modelview, projection, viewport,&dx_m,&dy_m,&dz_m ); glTranslated( x0-dx_m, y0-dy_m, z0-dz_m ); } glTranslatef( x, y, z ); glColor4f( foreground_color_[R], foreground_color_[G], foreground_color_[B], foreground_color_[A] ); glRasterPos2i( 0, 0 ); draw( s ); if ( horizontal_justification_ != ORIGIN || vertical_justification_ != BASELINE ) glPopMatrix(); if ( !advance_ ) glPopMatrix(); } // Draw the number at the given position per the given format. void Face::draw ( GLfloat x, GLfloat y, const wxString& format, double number ) { draw( x, y, format_number( format, number ) ); } // Draw the number at the given position per the given format. void Face::draw ( GLfloat x, GLfloat y, GLfloat z, const wxString& format, double number ) { draw( x, y, z, format_number( format, number ) ); } #endif /* OGLFT_NO_WX */ Raster::Raster ( const char* filename, float point_size, FT_UInt resolution ) : Face( filename, point_size, resolution ) { if ( !isValid() ) return; init(); } Raster::Raster ( FT_Face face, float point_size, FT_UInt resolution ) : Face( face, point_size, resolution ) { init(); } void Raster::init ( void ) { character_rotation_z_ = 0; setCharSize(); setCharacterRotationReference( 'o' ); } Raster::~Raster ( void ) { clearCaches(); } void Raster::setCharacterRotationZ ( GLfloat character_rotation_z ) { if ( character_rotation_z != character_rotation_z_ ) { character_rotation_z_ = character_rotation_z; clearCaches(); } } double Raster::height ( void ) const { if ( faces_[0].face_->height > 0 ) return faces_[0].face_->height / 64.; else return faces_[0].face_->size->metrics.y_ppem; } BBox Raster::measure ( unsigned char c ) { BBox bbox; // For starters, just get the unscaled glyph bounding box unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return bbox; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return bbox; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) return bbox; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); bbox = ft_bbox; bbox.advance_ = faces_[f].face_->glyph->advance; // In order to be accurate regarding the placement of text not // aligned at the glyph's origin (CENTER/MIDDLE), the bounding box // of the raster format has to be projected back into the // view's coordinates GLint viewport[4]; GLdouble modelview[16], projection[16]; glGetIntegerv( GL_VIEWPORT, viewport ); glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); // Well, first we have to get the Origin, since that is the basis // of the bounding box GLdouble x0, y0, z0; gluUnProject( 0., 0., 0., modelview, projection, viewport, &x0, &y0, &z0 ); GLdouble x, y, z; gluUnProject( bbox.x_min_, bbox.y_min_, 0., modelview, projection, viewport, &x, &y, &z ); bbox.x_min_ = x - x0; bbox.y_min_ = y - y0; gluUnProject( bbox.x_max_, bbox.y_max_, 0., modelview, projection, viewport, &x, &y, &z ); bbox.x_max_ = x - x0; bbox.y_max_ = y - y0; gluUnProject( bbox.advance_.dx_, bbox.advance_.dy_, 0., modelview, projection, viewport, &x, &y, &z ); bbox.advance_.dx_ = x - x0; bbox.advance_.dy_ = y - y0; return bbox; } #ifdef _UNICODE #ifndef OGLFT_NO_WX BBox Raster::measure ( const wxChar c ) { BBox bbox; // For starters, just get the unscaled glyph bounding box unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return bbox; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return bbox; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) return bbox; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); bbox = ft_bbox; bbox.advance_ = faces_[f].face_->glyph->advance; // In order to be accurate regarding the placement of text not // aligned at the glyph's origin (CENTER/MIDDLE), the bounding box // of the raster format has to be projected back into the // view's coordinates GLint viewport[4]; GLdouble modelview[16], projection[16]; glGetIntegerv( GL_VIEWPORT, viewport ); glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); glGetDoublev( GL_PROJECTION_MATRIX, projection ); // Well, first we have to get the Origin, since that is the basis // of the bounding box GLdouble x0, y0, z0; gluUnProject( 0., 0., 0., modelview, projection, viewport, &x0, &y0, &z0 ); GLdouble x, y, z; gluUnProject( bbox.x_min_, bbox.y_min_, 0., modelview, projection, viewport, &x, &y, &z ); bbox.x_min_ = x - x0; bbox.y_min_ = y - y0; gluUnProject( bbox.x_max_, bbox.y_max_, 0., modelview, projection, viewport, &x, &y, &z ); bbox.x_max_ = x - x0; bbox.y_max_ = y - y0; gluUnProject( bbox.advance_.dx_, bbox.advance_.dy_, 0., modelview, projection, viewport, &x, &y, &z ); bbox.advance_.dx_ = x - x0; bbox.advance_.dy_ = y - y0; return bbox; } #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ GLuint Raster::compileGlyph ( FT_Face face, FT_UInt glyph_index ) { GLuint dlist = glGenLists( 1 ); glNewList( dlist, GL_COMPILE ); renderGlyph( face, glyph_index ); glEndList( ); return dlist; } void Raster::setCharSize ( void ) { FT_Error error; for ( unsigned int i = 0; i < faces_.size(); i++ ) { error = FT_Set_Char_Size( faces_[i].face_, (FT_F26Dot6)( point_size_ * 64 ), (FT_F26Dot6)( point_size_ * 64 ), resolution_, resolution_ ); if ( error != 0 ) return; } if ( rotation_reference_glyph_ != 0 ) setRotationOffset(); } void Raster::setRotationOffset ( void ) { FT_Error error = FT_Load_Glyph( rotation_reference_face_, rotation_reference_glyph_, FT_LOAD_RENDER ); if ( error != 0 ) return; rotation_offset_y_ = rotation_reference_face_->glyph->bitmap.rows / 2.; } void Raster::clearCaches ( void ) { GDLI fgi = glyph_dlists_.begin(); for ( ; fgi != glyph_dlists_.end(); ++fgi ) { glDeleteLists( fgi->second, 1 ); } glyph_dlists_.clear(); } Monochrome::Monochrome ( const char* filename, float point_size, FT_UInt resolution ) : Raster( filename, point_size, resolution ) {} Monochrome::Monochrome ( FT_Face face, float point_size, FT_UInt resolution ) : Raster( face, point_size, resolution ) {} Monochrome::~Monochrome ( void ) {} GLubyte* Monochrome::invertBitmap ( const FT_Bitmap& bitmap ) { // In FreeType 2.0.9, the pitch of bitmaps was rounded up to an // even number. In general, this disagrees with what we had been // using for OpenGL. int width = bitmap.width / 8 + ( ( bitmap.width & 7 ) > 0 ? 1 : 0 ); GLubyte* inverse = new GLubyte[ bitmap.rows * width ]; GLubyte* inverse_ptr = inverse; for ( int r = 0; r < bitmap.rows; r++ ) { GLubyte* bitmap_ptr = &bitmap.buffer[bitmap.pitch * ( bitmap.rows - r - 1 )]; for ( int p = 0; p < width; p++ ) *inverse_ptr++ = *bitmap_ptr++; } return inverse; } void Monochrome::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { // Start by retrieving the glyph's data. FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; FT_Glyph original_glyph; FT_Glyph glyph; error = FT_Get_Glyph( face->glyph, &original_glyph ); if ( error != 0 ) return; error = FT_Glyph_Copy( original_glyph, &glyph ); FT_Done_Glyph( original_glyph ); if ( error != 0 ) return; // If the individual characters are rotated (as distinct from string // rotation), then apply that extra rotation here. This is equivalent // to the sequence // glTranslate(x_center,y_center); // glRotate(angle); // glTranslate(-x_center,-y_center); // which is used for the polygonal styles. The deal with the raster // styles is that you must retain the advance from the string rotation // so that the glyphs are laid out properly. So, we make a copy of // the string rotated glyph, and then rotate that and add back an // additional offset to (in effect) restore the proper origin and // advance of the glyph. if ( character_rotation_z_ != 0. ) { FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(character_rotation_z_ * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; FT_Vector original_offset, rotation_offset; original_offset.x = ( face->glyph->metrics.width / 2 + face->glyph->metrics.horiBearingX ) / 64 * 0x10000L; original_offset.y = (FT_Pos)(rotation_offset_y_ * 0x10000L); rotation_offset = original_offset; FT_Vector_Rotate( &rotation_offset, (FT_Angle)(character_rotation_z_ * 0x10000L) ); rotation_offset.x = original_offset.x - rotation_offset.x; rotation_offset.y = original_offset.y - rotation_offset.y; rotation_offset.x /= 1024; rotation_offset.y /= 1024; error = FT_Glyph_Transform( glyph, &rotation_matrix, &rotation_offset ); } error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_MONO, 0, 1 ); if ( error != 0 ) { FT_Done_Glyph( glyph ); return; } FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph; // Evidently, in FreeType2, you can only get "upside-down" bitmaps and // OpenGL won't invert a bitmap with PixelZoom, so we have to invert the // glyph's bitmap ourselves. GLubyte* inverted_bitmap = invertBitmap( bitmap_glyph->bitmap ); glBitmap( bitmap_glyph->bitmap.width, bitmap_glyph->bitmap.rows, -bitmap_glyph->left, bitmap_glyph->bitmap.rows - bitmap_glyph->top, face->glyph->advance.x / 64., face->glyph->advance.y / 64., inverted_bitmap ); FT_Done_Glyph( glyph ); delete[] inverted_bitmap; } Grayscale::Grayscale ( const char* filename, float point_size, FT_UInt resolution ) : Raster( filename, point_size, resolution ) {} Grayscale::Grayscale ( FT_Face face, float point_size, FT_UInt resolution ) : Raster( face, point_size, resolution ) {} Grayscale::~Grayscale ( void ) {} GLubyte* Grayscale::invertPixmap ( const FT_Bitmap& bitmap ) { GLubyte* inverse = new GLubyte[ bitmap.rows * bitmap.pitch ]; GLubyte* inverse_ptr = inverse; for ( int r = 0; r < bitmap.rows; r++ ) { GLubyte* bitmap_ptr = &bitmap.buffer[bitmap.pitch * ( bitmap.rows - r - 1 )]; for ( int p = 0; p < bitmap.pitch; p++ ) { *inverse_ptr++ = *bitmap_ptr++; } } return inverse; } void Grayscale::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; FT_Glyph original_glyph; FT_Glyph glyph; error = FT_Get_Glyph( face->glyph, &original_glyph ); if ( error != 0 ) return; error = FT_Glyph_Copy( original_glyph, &glyph ); FT_Done_Glyph( original_glyph ); if ( error != 0 ) return; if ( character_rotation_z_ != 0. ) { FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(character_rotation_z_ * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; FT_Vector original_offset, rotation_offset; original_offset.x = ( face->glyph->metrics.width / 2 + face->glyph->metrics.horiBearingX ) / 64 * 0x10000L; original_offset.y = (FT_Pos)(rotation_offset_y_ * 0x10000L); rotation_offset = original_offset; FT_Vector_Rotate( &rotation_offset, (FT_Angle)(character_rotation_z_ * 0x10000L) ); rotation_offset.x = original_offset.x - rotation_offset.x; rotation_offset.y = original_offset.y - rotation_offset.y; rotation_offset.x /= 1024; rotation_offset.y /= 1024; error = FT_Glyph_Transform( glyph, &rotation_matrix, &rotation_offset ); } error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, 0, 1 ); if ( error != 0 ) { FT_Done_Glyph( glyph ); return; } FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph; // Evidently, in FreeType2, you can only get "upside-down" bitmaps // (this could be cured with PixelZoom, but that an additional function) GLubyte* inverted_pixmap = invertPixmap( bitmap_glyph->bitmap ); // :-( If this is compiled in a display list, it may or not be in effect // later when the list is actually called. So, the client should be alerted // to this fact: unpack alignment must be 1 glPushAttrib( GL_PIXEL_MODE_BIT ); glPixelTransferf( GL_RED_SCALE, foreground_color_[R] - background_color_[R] ); glPixelTransferf( GL_GREEN_SCALE, foreground_color_[G] - background_color_[G] ); glPixelTransferf( GL_BLUE_SCALE, foreground_color_[B] - background_color_[B] ); glPixelTransferf( GL_ALPHA_SCALE, foreground_color_[A] ); glPixelTransferf( GL_RED_BIAS, background_color_[R] ); glPixelTransferf( GL_GREEN_BIAS, background_color_[G] ); glPixelTransferf( GL_BLUE_BIAS, background_color_[B] ); glPixelTransferf( GL_ALPHA_BIAS, background_color_[A] ); glBitmap( 0, 0, 0, 0, bitmap_glyph->left, bitmap_glyph->top - bitmap_glyph->bitmap.rows, 0 ); glDrawPixels( bitmap_glyph->bitmap.width, bitmap_glyph->bitmap.rows, GL_LUMINANCE, GL_UNSIGNED_BYTE, inverted_pixmap ); // This is how you advance the raster position when drawing PIXMAPS // (without querying the state) glBitmap( 0, 0, 0, 0, -bitmap_glyph->left + face->glyph->advance.x / 64., bitmap_glyph->bitmap.rows - bitmap_glyph->top + face->glyph->advance.y / 64., 0 ); FT_Done_Glyph( glyph ); glPopAttrib(); delete[] inverted_pixmap; } Translucent::Translucent ( const char* filename, float point_size, FT_UInt resolution ) : Raster( filename, point_size, resolution ) {} Translucent::Translucent ( FT_Face face, float point_size, FT_UInt resolution ) : Raster( face, point_size, resolution ) {} Translucent::~Translucent ( void ) {} // The simplest format which glDrawPixels can render with (varying) transparency // is GL_LUMINANCE_ALPHA; so, we take the grayscale bitmap from FreeType // and treat all non-zero values as full luminance (basically the mask for // rendering) and duplicate the grayscale values as alpha values // (as well as turn it upside-down). GLubyte* Translucent::invertPixmapWithAlpha ( const FT_Bitmap& bitmap ) { GLubyte* inverse = new GLubyte[ 2 * bitmap.rows * bitmap.pitch ]; GLubyte* inverse_ptr = inverse; for ( int r = 0; r < bitmap.rows; r++ ) { GLubyte* bitmap_ptr = &bitmap.buffer[bitmap.pitch * ( bitmap.rows - r - 1 )]; for ( int p = 0; p < bitmap.pitch; p++ ) { *inverse_ptr++ = *bitmap_ptr ? 255 : 0; *inverse_ptr++ = *bitmap_ptr++; } } return inverse; } void Translucent::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; FT_Glyph original_glyph; FT_Glyph glyph; error = FT_Get_Glyph( face->glyph, &original_glyph ); if ( error != 0 ) return; error = FT_Glyph_Copy( original_glyph, &glyph ); FT_Done_Glyph( original_glyph ); if ( error != 0 ) return; if ( character_rotation_z_ != 0. ) { FT_Matrix rotation_matrix; FT_Vector sinus; FT_Vector_Unit( &sinus, (FT_Angle)(character_rotation_z_ * 0x10000L) ); rotation_matrix.xx = sinus.x; rotation_matrix.xy = -sinus.y; rotation_matrix.yx = sinus.y; rotation_matrix.yy = sinus.x; FT_Vector original_offset, rotation_offset; original_offset.x = ( face->glyph->metrics.width / 2 + face->glyph->metrics.horiBearingX ) / 64 * 0x10000L; original_offset.y = (FT_Pos)(rotation_offset_y_ * 0x10000L); rotation_offset = original_offset; FT_Vector_Rotate( &rotation_offset, (FT_Angle)(character_rotation_z_ * 0x10000L) ); rotation_offset.x = original_offset.x - rotation_offset.x; rotation_offset.y = original_offset.y - rotation_offset.y; rotation_offset.x /= 1024; rotation_offset.y /= 1024; error = FT_Glyph_Transform( glyph, &rotation_matrix, &rotation_offset ); } error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, 0, 1 ); if ( error != 0 ) { FT_Done_Glyph( glyph ); return; } FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph; // Evidently, in FreeType2, you can only get "upside-down" bitmaps. For // translucency, the grayscale bitmap generated by FreeType is expanded // to include an alpha value (and the non-zero values of the // grayscale bitmap are saturated to provide a "mask" of the glyph). GLubyte* inverted_pixmap = invertPixmapWithAlpha( bitmap_glyph->bitmap ); glPushAttrib( GL_PIXEL_MODE_BIT ); glPixelTransferf( GL_RED_SCALE, foreground_color_[R] - background_color_[R] ); glPixelTransferf( GL_GREEN_SCALE, foreground_color_[G] -background_color_[G] ); glPixelTransferf( GL_BLUE_SCALE, foreground_color_[B] - background_color_[B] ); glPixelTransferf( GL_ALPHA_SCALE, foreground_color_[A] ); glPixelTransferf( GL_RED_BIAS, background_color_[R] ); glPixelTransferf( GL_GREEN_BIAS, background_color_[G] ); glPixelTransferf( GL_BLUE_BIAS, background_color_[B] ); glPixelTransferf( GL_ALPHA_BIAS, background_color_[A] ); // Set the proper raster position for rendering this glyph (why doesn't // OpenGL have a similar function for pixmaps?) glBitmap( 0, 0, 0, 0, bitmap_glyph->left, bitmap_glyph->top - bitmap_glyph->bitmap.rows, 0 ); glDrawPixels( bitmap_glyph->bitmap.width, bitmap_glyph->bitmap.rows, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, inverted_pixmap ); // This is how you advance the raster position when drawing PIXMAPS // (without querying the state) glBitmap( 0, 0, 0, 0, -bitmap_glyph->left + face->glyph->advance.x / 64., bitmap_glyph->bitmap.rows - bitmap_glyph->top + face->glyph->advance.y / 64., 0 ); FT_Done_Glyph( glyph ); glPopAttrib(); delete[] inverted_pixmap; } Polygonal::Polygonal ( const char* filename, float point_size, FT_UInt resolution ) : Face( filename, point_size, resolution ) { if ( !isValid() ) return; init(); } Polygonal::Polygonal ( FT_Face face, float point_size, FT_UInt resolution ) : Face( face, point_size, resolution ) { init(); } void Polygonal::init ( void ) { character_rotation_.active_ = false; character_rotation_.x_ = 0; character_rotation_.y_ = 0; character_rotation_.z_ = 0; tessellation_steps_ = DEFAULT_TESSELLATION_STEPS; delta_ = 1. / (double)tessellation_steps_; delta2_ = delta_ * delta_; delta3_ = delta2_ * delta_; // For vector rendition modes, FreeType is allowed to generate the // lines and arcs at the original face definition resolution. To // get to the proper glyph size, the vertices are scaled before // they're passed to the GLU tessellation routines. if ( resolution_ != 0 ) vector_scale_ = (GLdouble)( point_size_ * resolution_ ) / (GLdouble)( faces_.front().face_->units_per_EM * 72 ); else // According to the FreeType documentation, resolution == 0 -> 72 DPI vector_scale_ = (GLdouble)( point_size_ ) / (GLdouble)( faces_.front().face_->units_per_EM ); color_tess_ = 0; texture_tess_ = 0; setCharSize(); // Can't call this until a valid character size is set! setCharacterRotationReference( 'o' ); } Polygonal::~Polygonal ( void ) { clearCaches(); } // Note: Changing the color tessellation object also clears the // display list cache void Polygonal::setColorTess ( ColorTess* color_tess ) { color_tess_ = color_tess; clearCaches(); } // Note: Changing the texture coordinate tessellation object also // clears the display list cache void Polygonal::setTextureTess ( TextureTess* texture_tess ) { texture_tess_ = texture_tess; clearCaches(); } // Note: Changing the appoximation steps also clears the display list cache void Polygonal::setTessellationSteps ( unsigned int tessellation_steps ) { if ( tessellation_steps != tessellation_steps_ ) { tessellation_steps_ = tessellation_steps; delta_ = 1. / (double)tessellation_steps_; delta2_ = delta_ * delta_; delta3_ = delta2_ * delta_; clearCaches(); } } // Note: Changing the character rotation also clears the display list cache. void Polygonal::setCharacterRotationX ( GLfloat character_rotation_x ) { if ( character_rotation_x != character_rotation_.x_ ) { character_rotation_.x_ = character_rotation_x; if ( character_rotation_.x_ != 0. || character_rotation_.y_ != 0. || character_rotation_.z_ != 0. ) character_rotation_.active_ = true; else character_rotation_.active_ = false; clearCaches(); } } void Polygonal::setCharacterRotationY ( GLfloat character_rotation_y ) { if ( character_rotation_y != character_rotation_.y_ ) { character_rotation_.y_ = character_rotation_y; if ( character_rotation_.x_ != 0. || character_rotation_.y_ != 0. || character_rotation_.z_ != 0. ) character_rotation_.active_ = true; else character_rotation_.active_ = false; clearCaches(); } } void Polygonal::setCharacterRotationZ ( GLfloat character_rotation_z ) { if ( character_rotation_z != character_rotation_.z_ ) { character_rotation_.z_ = character_rotation_z; if ( character_rotation_.x_ != 0. || character_rotation_.y_ != 0. || character_rotation_.z_ != 0. ) character_rotation_.active_ = true; else character_rotation_.active_ = false; clearCaches(); } } void Polygonal::setCharSize ( void ) { for ( unsigned int i = 0; i < faces_.size(); i++ ) { FT_Error error = FT_Set_Char_Size( faces_[i].face_, 0, faces_[i].face_->units_per_EM * 64, 0, 0 ); if ( error != 0 ) return; } if ( rotation_reference_glyph_ != 0 ) setRotationOffset(); } void Polygonal::setRotationOffset ( void ) { FT_Error error = FT_Load_Glyph( rotation_reference_face_, rotation_reference_glyph_, FT_LOAD_RENDER ); if ( error != 0 ) return; vector_scale_ = ( point_size_ * resolution_ ) / ( 72. * rotation_reference_face_->units_per_EM ); rotation_offset_y_ = ( rotation_reference_face_->glyph->metrics.horiBearingY / 2. ) / 64. * vector_scale_; } double Polygonal::height ( void ) const { if ( faces_[0].face_->height > 0 ) return ( faces_[0].face_->height * point_size_ * resolution_ ) / ( 72. * faces_[0].face_->units_per_EM ); else return ( faces_[0].face_->size->metrics.y_ppem * point_size_ * resolution_ ) / ( 72. * faces_[0].face_->units_per_EM ); } BBox Polygonal::measure ( unsigned char c ) { BBox bbox; // For starters, just get the unscaled glyph bounding box unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return bbox; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return bbox; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) return bbox; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); bbox = ft_bbox; bbox.advance_ = faces_[f].face_->glyph->advance; bbox *= ( point_size_ * resolution_ ) / ( 72. * faces_[f].face_->units_per_EM ); return bbox; } #ifdef _UNICODE #ifndef OGLFT_NO_WX BBox Polygonal::measure ( const wxChar c ) { BBox bbox; // For starters, just get the unscaled glyph bounding box unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return bbox; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return bbox; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) return bbox; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); bbox = ft_bbox; bbox.advance_ = faces_[f].face_->glyph->advance; bbox *= ( point_size_ * resolution_ ) / ( 72. * faces_[f].face_->units_per_EM ); return bbox; } #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ GLuint Polygonal::compileGlyph ( FT_Face face, FT_UInt glyph_index ) { GLuint dlist = glGenLists( 1 ); glNewList( dlist, GL_COMPILE ); renderGlyph( face, glyph_index ); glEndList( ); return dlist; } void Polygonal::clearCaches ( void ) { GDLI fgi = glyph_dlists_.begin(); for ( ; fgi != glyph_dlists_.end(); ++fgi ) { glDeleteLists( fgi->second, 1 ); } glyph_dlists_.clear(); } Outline::Outline ( const char* filename, float point_size, FT_UInt resolution ) : Polygonal( filename, point_size, resolution ) { if ( !isValid() ) return; init(); } Outline::Outline ( FT_Face face, float point_size, FT_UInt resolution ) : Polygonal( face, point_size, resolution ) { init(); } void Outline::init ( void ) { interface_.move_to = (FT_Outline_MoveTo_Func)moveToCallback; interface_.line_to = (FT_Outline_LineTo_Func)lineToCallback; interface_.conic_to = (FT_Outline_ConicTo_Func)conicToCallback; interface_.cubic_to = (FT_Outline_CubicTo_Func)cubicToCallback; interface_.shift = 0; interface_.delta = 0; } Outline::~Outline ( void ) {} void Outline::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; FT_OutlineGlyph g; error = FT_Get_Glyph( face->glyph, (FT_Glyph*)&g ); if ( error != 0 ) return; vector_scale_ = ( point_size_ * resolution_ ) / ( 72. * face->units_per_EM ); if ( character_rotation_.active_ ) { glPushMatrix(); glTranslatef( ( face->glyph->metrics.width / 2. + face->glyph->metrics.horiBearingX ) / 64. * vector_scale_, rotation_offset_y_, 0. ); if ( character_rotation_.x_ != 0. ) glRotatef( character_rotation_.x_, 1., 0., 0. ); if ( character_rotation_.y_ != 0. ) glRotatef( character_rotation_.y_, 0., 1., 0. ); if ( character_rotation_.z_ != 0. ) glRotatef( character_rotation_.z_, 0., 0., 1. ); glTranslatef( -( face->glyph->metrics.width / 2. + face->glyph->metrics.horiBearingX ) / 64. * vector_scale_, -rotation_offset_y_, 0. ); } contour_open_ = false; // The Big Kahuna: the FreeType glyph decomposition routine traverses // the outlines of the font by calling the various routines stored in // outline_interface_. These routines in turn call the GL vertex routines. error = FT_Outline_Decompose( &g->outline, &interface_, this ); FT_Done_Glyph( (FT_Glyph)g ); // Some glyphs may be empty (the 'blank' for instance!) if ( contour_open_ ) glEnd( ); if ( character_rotation_.active_ ) { glPopMatrix(); } // Drawing a character always advances the MODELVIEW. glTranslatef( face->glyph->advance.x / 64. * vector_scale_, face->glyph->advance.y / 64. * vector_scale_, 0. ); for ( VILI vili = vertices_.begin(); vili != vertices_.end(); vili++ ) delete *vili; vertices_.clear(); } int Outline::moveToCallback ( FT_Vector* to, Outline* outline ) { if ( outline->contour_open_ ) { glEnd(); } outline->last_vertex_ = VertexInfo( to, outline->colorTess(), outline->textureTess() ); glBegin( GL_LINE_LOOP ); outline->contour_open_ = true; return 0; } int Outline::lineToCallback ( FT_Vector* to, Outline* outline ) { outline->last_vertex_ = VertexInfo( to, outline->colorTess(), outline->textureTess() ); GLdouble g[2]; g[X] = outline->last_vertex_.v_[X] * outline->vector_scale_; g[Y] = outline->last_vertex_.v_[Y] * outline->vector_scale_; glVertex2dv( g ); return 0; } int Outline::conicToCallback ( FT_Vector* control, FT_Vector* to, Outline* outline ) { // This is crude: Step off conics with a fixed number of increments VertexInfo to_vertex( to, outline->colorTess(), outline->textureTess() ); VertexInfo control_vertex( control, outline->colorTess(), outline->textureTess() ); double b[2], c[2], d[2], f[2], df[2], d2f[2]; GLdouble g[3]; g[Z] = 0.; b[X] = outline->last_vertex_.v_[X] - 2 * control_vertex.v_[X] + to_vertex.v_[X]; b[Y] = outline->last_vertex_.v_[Y] - 2 * control_vertex.v_[Y] + to_vertex.v_[Y]; c[X] = -2 * outline->last_vertex_.v_[X] + 2 * control_vertex.v_[X]; c[Y] = -2 * outline->last_vertex_.v_[Y] + 2 * control_vertex.v_[Y]; d[X] = outline->last_vertex_.v_[X]; d[Y] = outline->last_vertex_.v_[Y]; f[X] = d[X]; f[Y] = d[Y]; df[X] = c[X] * outline->delta_ + b[X] * outline->delta2_; df[Y] = c[Y] * outline->delta_ + b[Y] * outline->delta2_; d2f[X] = 2 * b[X] * outline->delta2_; d2f[Y] = 2 * b[Y] * outline->delta2_; for ( unsigned int i = 0; i < outline->tessellation_steps_-1; i++ ) { f[X] += df[X]; f[Y] += df[Y]; g[X] = f[X] * outline->vector_scale_; g[Y] = f[Y] * outline->vector_scale_; if ( outline->colorTess() ) glColor4fv( outline->colorTess()->color( g ) ); glVertex2dv( g ); df[X] += d2f[X]; df[Y] += d2f[Y]; } g[X] = to_vertex.v_[X] * outline->vector_scale_; g[Y] = to_vertex.v_[Y] * outline->vector_scale_; if ( outline->colorTess() ) glColor4fv( outline->colorTess()->color( g ) ); glVertex2dv( g ); outline->last_vertex_ = to_vertex; return 0; } int Outline::cubicToCallback ( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, Outline* outline ) { // This is crude: Step off cubics with a fixed number of increments VertexInfo to_vertex( to, outline->colorTess(), outline->textureTess() ); VertexInfo control1_vertex( control1, outline->colorTess(), outline->textureTess() ); VertexInfo control2_vertex( control2, outline->colorTess(), outline->textureTess() ); double a[2], b[2], c[2], d[2], f[2], df[2], d2f[2], d3f[2]; GLdouble g[3]; g[Z] = 0.; a[X] = -outline->last_vertex_.v_[X] + 3 * control1_vertex.v_[X] -3 * control2_vertex.v_[X] + to_vertex.v_[X]; a[Y] = -outline->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y] -3 * control2_vertex.v_[Y] + to_vertex.v_[Y]; b[X] = 3 * outline->last_vertex_.v_[X] - 6 * control1_vertex.v_[X] + 3 * control2_vertex.v_[X]; b[Y] = 3 * outline->last_vertex_.v_[Y] - 6 * control1_vertex.v_[Y] + 3 * control2_vertex.v_[Y]; c[X] = -3 * outline->last_vertex_.v_[X] + 3 * control1_vertex.v_[X]; c[Y] = -3 * outline->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y]; d[X] = outline->last_vertex_.v_[X]; d[Y] = outline->last_vertex_.v_[Y]; f[X] = d[X]; f[Y] = d[Y]; df[X] = c[X] * outline->delta_ + b[X] * outline->delta2_ + a[X] * outline->delta3_; df[Y] = c[Y] * outline->delta_ + b[Y] * outline->delta2_ + a[Y] * outline->delta3_; d2f[X] = 2 * b[X] * outline->delta2_ + 6 * a[X] * outline->delta3_; d2f[Y] = 2 * b[Y] * outline->delta2_ + 6 * a[Y] * outline->delta3_; d3f[X] = 6 * a[X] * outline->delta3_; d3f[Y] = 6 * a[Y] * outline->delta3_; for ( unsigned int i = 0; i < outline->tessellation_steps_-1; i++ ) { f[X] += df[X]; f[Y] += df[Y]; g[X] = f[X] * outline->vector_scale_; g[Y] = f[Y] * outline->vector_scale_; if ( outline->colorTess() ) glColor4fv( outline->colorTess()->color( g ) ); glVertex2dv( g ); df[X] += d2f[X]; df[Y] += d2f[Y]; d2f[X] += d3f[X]; d2f[Y] += d3f[Y]; } g[X] = to_vertex.v_[X] * outline->vector_scale_; g[Y] = to_vertex.v_[Y] * outline->vector_scale_; if ( outline->colorTess() ) glColor4fv( outline->colorTess()->color( g ) ); glVertex2dv( g ); outline->last_vertex_ = to_vertex; return 0; } Filled::Filled ( const char* filename, float point_size, FT_UInt resolution ) : Polygonal( filename, point_size, resolution ) { if ( !isValid() ) return; init(); } Filled::Filled ( FT_Face face, float point_size, FT_UInt resolution ) : Polygonal( face, point_size, resolution ) { init(); } void Filled::init ( void ) { depth_offset_ = 0; interface_.move_to = (FT_Outline_MoveTo_Func)moveToCallback; interface_.line_to = (FT_Outline_LineTo_Func)lineToCallback; interface_.conic_to = (FT_Outline_ConicTo_Func)conicToCallback; interface_.cubic_to = (FT_Outline_CubicTo_Func)cubicToCallback; interface_.shift = 0; interface_.delta = 0; tess_obj_ = gluNewTess(); #ifdef LXWIN32 gluTessCallback( tess_obj_, GLU_TESS_VERTEX, (void (__stdcall *)(void)) & glVertex3dv ); gluTessCallback( tess_obj_, GLU_TESS_BEGIN, (void (__stdcall *)(void)) & glBegin ); gluTessCallback( tess_obj_, GLU_TESS_END, (void (__stdcall *)(void)) & glEnd ); gluTessCallback( tess_obj_, GLU_TESS_COMBINE_DATA, (void (__stdcall *)(void)) & combineCallback ); gluTessCallback( tess_obj_, GLU_TESS_ERROR, (void (__stdcall *)(void)) & errorCallback); #else gluTessCallback( tess_obj_, GLU_TESS_VERTEX, (GLUTessCallback)vertexCallback ); gluTessCallback( tess_obj_, GLU_TESS_BEGIN, (GLUTessCallback)beginCallback ); gluTessCallback( tess_obj_, GLU_TESS_END, (GLUTessCallback)endCallback ); gluTessCallback( tess_obj_, GLU_TESS_COMBINE_DATA, (GLUTessCallback)combineCallback ); gluTessCallback( tess_obj_, GLU_TESS_ERROR, (GLUTessCallback)errorCallback); #endif } Filled::~Filled ( void ) { gluDeleteTess( tess_obj_ ); } void Filled::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; FT_OutlineGlyph g; error = FT_Get_Glyph( face->glyph, (FT_Glyph*)&g ); if ( error != 0 ) return; vector_scale_ = ( point_size_ * resolution_ ) / ( 72. * face->units_per_EM ); if ( character_rotation_.active_ ) { glPushMatrix(); glTranslatef( ( face->glyph->metrics.width / 2. + face->glyph->metrics.horiBearingX ) / 64. * vector_scale_, rotation_offset_y_, 0. ); if ( character_rotation_.x_ != 0. ) glRotatef( character_rotation_.x_, 1., 0., 0. ); if ( character_rotation_.y_ != 0. ) glRotatef( character_rotation_.y_, 0., 1., 0. ); if ( character_rotation_.z_ != 0. ) glRotatef( character_rotation_.z_, 0., 0., 1. ); glTranslatef( -( face->glyph->metrics.width / 2. + face->glyph->metrics.horiBearingX ) / 64. * vector_scale_, -rotation_offset_y_, 0. ); } if ( depth_offset_ != 0. ) { glPushMatrix(); glTranslatef( 0., 0., depth_offset_ ); glNormal3f( 0., 0., 1. ); } else { glNormal3f( 0., 0., -1. ); } glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); contour_open_ = false; gluTessBeginPolygon( tess_obj_, this ); // The Big Kahuna: the FreeType glyph decomposition routine traverses // the outlines of the font by calling the various routines stored in // interface_. These routines in turn call the GLU tessellation routines // to create OGL polygons. error = FT_Outline_Decompose( &g->outline, &interface_, this ); FT_Done_Glyph( (FT_Glyph)g ); // Some glyphs may be empty (the 'blank' for instance!) if ( contour_open_ ) gluTessEndContour( tess_obj_ ); gluTessEndPolygon( tess_obj_ ); if ( depth_offset_ != 0. ) { glPopMatrix(); } if ( character_rotation_.active_ ) { glPopMatrix(); } // Drawing a character always advances the MODELVIEW. glTranslatef( face->glyph->advance.x / 64 * vector_scale_, face->glyph->advance.y / 64 * vector_scale_, 0. ); for ( VILI vili = extra_vertices_.begin(); vili != extra_vertices_.end(); vili++ ) delete *vili; extra_vertices_.clear(); for ( VILI vili = vertices_.begin(); vili != vertices_.end(); vili++ ) delete *vili; vertices_.clear(); } int Filled::moveToCallback ( FT_Vector* to, Filled* filled ) { if ( filled->contour_open_ ) { gluTessEndContour( filled->tess_obj_ ); } filled->last_vertex_ = VertexInfo( to, filled->colorTess(), filled->textureTess() ); gluTessBeginContour( filled->tess_obj_ ); filled->contour_open_ = true; return 0; } int Filled::lineToCallback ( FT_Vector* to, Filled* filled ) { filled->last_vertex_ = VertexInfo( to, filled->colorTess(), filled->textureTess() ); VertexInfo* vertex = new VertexInfo( to, filled->colorTess(), filled->textureTess() ); vertex->v_[X] *= filled->vector_scale_; vertex->v_[Y] *= filled->vector_scale_; gluTessVertex( filled->tess_obj_, vertex->v_, vertex ); filled->vertices_.push_back( vertex ); return 0; } int Filled::conicToCallback ( FT_Vector* control, FT_Vector* to, Filled* filled ) { // This is crude: Step off conics with a fixed number of increments VertexInfo to_vertex( to, filled->colorTess(), filled->textureTess() ); VertexInfo control_vertex( control, filled->colorTess(), filled->textureTess() ); double b[2], c[2], d[2], f[2], df[2], d2f[2]; b[X] = filled->last_vertex_.v_[X] - 2 * control_vertex.v_[X] + to_vertex.v_[X]; b[Y] = filled->last_vertex_.v_[Y] - 2 * control_vertex.v_[Y] + to_vertex.v_[Y]; c[X] = -2 * filled->last_vertex_.v_[X] + 2 * control_vertex.v_[X]; c[Y] = -2 * filled->last_vertex_.v_[Y] + 2 * control_vertex.v_[Y]; d[X] = filled->last_vertex_.v_[X]; d[Y] = filled->last_vertex_.v_[Y]; f[X] = d[X]; f[Y] = d[Y]; df[X] = c[X] * filled->delta_ + b[X] * filled->delta2_; df[Y] = c[Y] * filled->delta_ + b[Y] * filled->delta2_; d2f[X] = 2 * b[X] * filled->delta2_; d2f[Y] = 2 * b[Y] * filled->delta2_; for ( unsigned int i = 0; i < filled->tessellation_steps_-1; i++ ) { f[X] += df[X]; f[Y] += df[Y]; VertexInfo* vertex = new VertexInfo( f, filled->colorTess(), filled->textureTess() ); vertex->v_[X] *= filled->vector_scale_; vertex->v_[Y] *= filled->vector_scale_; filled->vertices_.push_back( vertex ); gluTessVertex( filled->tess_obj_, vertex->v_, vertex ); df[X] += d2f[X]; df[Y] += d2f[Y]; } VertexInfo* vertex = new VertexInfo( to, filled->colorTess(), filled->textureTess() ); vertex->v_[X] *= filled->vector_scale_; vertex->v_[Y] *= filled->vector_scale_; filled->vertices_.push_back( vertex ); gluTessVertex( filled->tess_obj_, vertex->v_, vertex ); filled->last_vertex_ = to_vertex; return 0; } int Filled::cubicToCallback ( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, Filled* filled ) { // This is crude: Step off cubics with a fixed number of increments VertexInfo to_vertex( to, filled->colorTess(), filled->textureTess() ); VertexInfo control1_vertex( control1, filled->colorTess(), filled->textureTess() ); VertexInfo control2_vertex( control2, filled->colorTess(), filled->textureTess() ); double a[2], b[2], c[2], d[2], f[2], df[2], d2f[2], d3f[2]; a[X] = -filled->last_vertex_.v_[X] + 3 * control1_vertex.v_[X] -3 * control2_vertex.v_[X] + to_vertex.v_[X]; a[Y] = -filled->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y] -3 * control2_vertex.v_[Y] + to_vertex.v_[Y]; b[X] = 3 * filled->last_vertex_.v_[X] - 6 * control1_vertex.v_[X] + 3 * control2_vertex.v_[X]; b[Y] = 3 * filled->last_vertex_.v_[Y] - 6 * control1_vertex.v_[Y] + 3 * control2_vertex.v_[Y]; c[X] = -3 * filled->last_vertex_.v_[X] + 3 * control1_vertex.v_[X]; c[Y] = -3 * filled->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y]; d[X] = filled->last_vertex_.v_[X]; d[Y] = filled->last_vertex_.v_[Y]; f[X] = d[X]; f[Y] = d[Y]; df[X] = c[X] * filled->delta_ + b[X] * filled->delta2_ + a[X] * filled->delta3_; df[Y] = c[Y] * filled->delta_ + b[Y] * filled->delta2_ + a[Y] * filled->delta3_; d2f[X] = 2 * b[X] * filled->delta2_ + 6 * a[X] * filled->delta3_; d2f[Y] = 2 * b[Y] * filled->delta2_ + 6 * a[Y] * filled->delta3_; d3f[X] = 6 * a[X] * filled->delta3_; d3f[Y] = 6 * a[Y] * filled->delta3_; for ( unsigned int i = 0; i < filled->tessellation_steps_-1; i++ ) { f[X] += df[X]; f[Y] += df[Y]; VertexInfo* vertex = new VertexInfo( f, filled->colorTess(), filled->textureTess() ); vertex->v_[X] *= filled->vector_scale_; vertex->v_[Y] *= filled->vector_scale_; filled->vertices_.push_back( vertex ); gluTessVertex( filled->tess_obj_, vertex->v_, vertex ); df[X] += d2f[X]; df[Y] += d2f[Y]; d2f[X] += d3f[X]; d2f[Y] += d3f[Y]; } VertexInfo* vertex = new VertexInfo( to, filled->colorTess(), filled->textureTess() ); vertex->v_[X] *= filled->vector_scale_; vertex->v_[Y] *= filled->vector_scale_; filled->vertices_.push_back( vertex ); gluTessVertex( filled->tess_obj_, vertex->v_, vertex ); filled->last_vertex_ = to_vertex; return 0; } void Filled::vertexCallback ( VertexInfo* vertex ) { if ( vertex->color_tess_ != 0 ) glColor4fv( vertex->color_tess_->color( vertex->v_ ) ); if ( vertex->texture_tess_ != 0 ) glTexCoord2fv( vertex->texture_tess_->texCoord( vertex->v_ ) ); glVertex3dv( vertex->v_ ); } void Filled::beginCallback ( GLenum which ) { glBegin( which ); } void Filled::endCallback ( void ) { glEnd(); } void Filled::combineCallback ( GLdouble coords[3], void* vertex_data[4], GLfloat weight[4], void** out_data, Filled* filled ) { (void)vertex_data; (void)weight; // std::cerr << "called combine" << std::endl; VertexInfo* vertex = new VertexInfo( coords ); *out_data = vertex; filled->extraVertices().push_back( vertex ); } void Filled::errorCallback ( GLenum error_code ) { std::cerr << "hmm. error during tessellation?:" << gluErrorString( error_code ) << std::endl; } #ifndef OGLFT_NO_SOLID Solid::Solid ( const char* filename, float point_size, FT_UInt resolution ) : Filled( filename, point_size, resolution ) { if ( !isValid() ) return; init(); } Solid::Solid ( FT_Face face, float point_size, FT_UInt resolution ) : Filled( face, point_size, resolution ) { init(); } void Solid::init ( void ) { interface_.move_to = (FT_Outline_MoveTo_Func)moveToCallback; interface_.line_to = (FT_Outline_LineTo_Func)lineToCallback; interface_.conic_to = (FT_Outline_ConicTo_Func)conicToCallback; interface_.cubic_to = (FT_Outline_CubicTo_Func)cubicToCallback; interface_.shift = 0; interface_.delta = 0; // Set up for extrusion. Default depth is 1 (units of what?) extrusion_.depth_ = 1.; extrusion_.up_[X] = 0.; extrusion_.up_[Y] = 1.; extrusion_.up_[Z] = 0.; extrusion_.n_polyline_pts_ = N_POLYLINE_PTS; assign( extrusion_.point_array_[0], 0., 0., extrusion_.depth_ + 1. ); assign( extrusion_.point_array_[1], 0., 0., extrusion_.depth_ ); assign( extrusion_.point_array_[2], 0., 0., 0. ); assign( extrusion_.point_array_[3], 0., 0., -1. ); // Turn on closed contours and smooth vertices; turn off end capping gleSetJoinStyle( TUBE_JN_RAW | TUBE_CONTOUR_CLOSED | TUBE_NORM_EDGE ); } Solid::~Solid ( void ) {} // Note: as usual, setting this clears the caches void Solid::setDepth ( double depth ) { if ( depth > 0. && depth != extrusion_.depth_ ) { extrusion_.depth_ = depth; assign( extrusion_.point_array_[0], 0., 0., extrusion_.depth_ + 1. ); assign( extrusion_.point_array_[1], 0., 0., extrusion_.depth_ ); clearCaches(); } } void Solid::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; FT_OutlineGlyph g; error = FT_Get_Glyph( face->glyph, (FT_Glyph*)&g ); if ( error != 0 ) return; vector_scale_ = ( point_size_ * resolution_ ) / ( 72. * face->units_per_EM ); if ( character_rotation_.active_ ) { glPushMatrix(); glTranslatef( ( face->glyph->metrics.width / 2. + face->glyph->metrics.horiBearingX ) / 64. * vector_scale_, rotation_offset_y_, 0. ); if ( character_rotation_.x_ != 0. ) glRotatef( character_rotation_.x_, 1., 0., 0. ); if ( character_rotation_.y_ != 0. ) glRotatef( character_rotation_.y_, 0., 1., 0. ); if ( character_rotation_.z_ != 0. ) glRotatef( character_rotation_.z_, 0., 0., 1. ); glTranslatef( -( face->glyph->metrics.width / 2. + face->glyph->metrics.horiBearingX ) / 64. * vector_scale_, -rotation_offset_y_, 0. ); } contour_open_ = false; // In theory, TrueType contours are defined clockwise and Type1 contours // are defined counter-clockwise. Trust the flag set by FreeType to // indicate this since it is critical to getting the orientation of the // surface normals correct. if ( g->outline.flags & FT_OUTLINE_REVERSE_FILL ) { extrusion_.normal_sign_.x_ = -1; extrusion_.normal_sign_.y_ = 1; } else { extrusion_.normal_sign_.x_ = 1; extrusion_.normal_sign_.y_ = -1; } // The Big Kahuna: the FreeType glyph decomposition routine traverses // the outlines of the font by calling the various routines stored in // extrude_interface_. These in turn call the gleExtrusion routine. error = FT_Outline_Decompose( &g->outline, &interface_, this ); FT_Done_Glyph( (FT_Glyph)g ); // Some glyphs may be empty (the 'blank' for instance!) if ( contour_open_ ) { extrusion_.contour_normals_.push_back( extrusion_.contour_normals_.front() ); gleExtrusion( extrusion_.contour_.size(), &extrusion_.contour_.begin()->p_, &extrusion_.contour_normals_[1].p_, extrusion_.up_, extrusion_.n_polyline_pts_, extrusion_.point_array_, 0 ); extrusion_.contour_.clear(); extrusion_.contour_normals_.clear(); } if ( character_rotation_.active_ ) { glPopMatrix(); } // Apply the front and back faces of the solid character (recall that // drawing a character advances the MODELVIEW, so defend against that // with the stack operations) glPushMatrix(); depth_offset_ = 0.; Filled::renderGlyph( face, glyph_index ); glPopMatrix(); glPushMatrix(); depth_offset_ = extrusion_.depth_; Filled::renderGlyph( face, glyph_index ); glPopMatrix(); // Drawing a character always advances the MODELVIEW. glTranslatef( face->glyph->advance.x / 64. * vector_scale_, face->glyph->advance.y / 64. * vector_scale_, 0. ); for ( VILI vili = vertices_.begin(); vili != vertices_.end(); vili++ ) delete *vili; vertices_.clear(); } int Solid::moveToCallback ( FT_Vector* to, Solid* solid ) { if ( solid->contour_open_ ) { // A word of explanation: since you can't predict when the // contour is going to end (its end is signaled by calling this // routine, i.e., the contour ends when another is started // abruptly), only the lineTo and arcTo functions generate contour // points. The upshot is that the normals, which are computed for the // current segment, are one behind the segment described in the // the contour array. To make things match up at the end, the first // normal is copied to the end of the normal array and the extrusion // routine is passed the list of normals starting at the second entry. solid->extrusion_.contour_normals_. push_back( solid->extrusion_.contour_normals_.front() ); #if 1 gleExtrusion( solid->extrusion_.contour_.size(), &solid->extrusion_.contour_.begin()->p_, &solid->extrusion_.contour_normals_[1].p_, solid->extrusion_.up_, solid->extrusion_.n_polyline_pts_, solid->extrusion_.point_array_, 0 ); #endif solid->extrusion_.contour_.clear(); solid->extrusion_.contour_normals_.clear(); } solid->last_vertex_ = VertexInfo( to, solid->colorTess(), solid->textureTess() ); solid->contour_open_ = true; return 0; } int Solid::lineToCallback ( FT_Vector* to, Solid* solid ) { VertexInfo vertex( to, solid->colorTess(), solid->textureTess() ); VertexInfo normal( solid->extrusion_.normal_sign_.y_ * ( vertex.v_[Y] - solid->last_vertex_.v_[Y] ), solid->extrusion_.normal_sign_.x_ * ( vertex.v_[X] - solid->last_vertex_.v_[X] ) ); solid->last_vertex_ = vertex; vertex.v_[X] *= solid->vector_scale_; vertex.v_[Y] *= solid->vector_scale_; normal.normalize(); solid->extrusion_.contour_.push_back( vertex ); solid->extrusion_.contour_normals_.push_back( normal ); return 0; } int Solid::conicToCallback ( FT_Vector* control, FT_Vector* to, Solid* solid ) { // This is crude: Step off conics with a fixed number of increments VertexInfo to_vertex( to, solid->colorTess(), solid->textureTess() ); VertexInfo control_vertex( control, solid->colorTess(), solid->textureTess() ); double b[2], c[2], d[2], f[2], df[2], d2f[2]; b[X] = solid->last_vertex_.v_[X] - 2 * control_vertex.v_[X] + to_vertex.v_[X]; b[Y] = solid->last_vertex_.v_[Y] - 2 * control_vertex.v_[Y] + to_vertex.v_[Y]; c[X] = -2 * solid->last_vertex_.v_[X] + 2 * control_vertex.v_[X]; c[Y] = -2 * solid->last_vertex_.v_[Y] + 2 * control_vertex.v_[Y]; d[X] = solid->last_vertex_.v_[X]; d[Y] = solid->last_vertex_.v_[Y]; f[X] = d[X]; f[Y] = d[Y]; df[X] = c[X] * solid->delta_ + b[X] * solid->delta2_; df[Y] = c[Y] * solid->delta_ + b[Y] * solid->delta2_; d2f[X] = 2 * b[X] * solid->delta2_; d2f[Y] = 2 * b[Y] * solid->delta2_; for ( unsigned int i = 0; i < solid->tessellation_steps_-1; i++ ) { f[X] += df[X]; f[Y] += df[Y]; VertexInfo vertex( f, solid->colorTess(), solid->textureTess() ); VertexInfo normal( solid->extrusion_.normal_sign_.y_ * df[Y], solid->extrusion_.normal_sign_.x_ * df[X] ); vertex.v_[X] *= solid->vector_scale_; vertex.v_[Y] *= solid->vector_scale_; normal.normalize(); solid->extrusion_.contour_.push_back( vertex ); solid->extrusion_.contour_normals_.push_back( normal ); df[X] += d2f[X]; df[Y] += d2f[Y]; } VertexInfo vertex( to, solid->colorTess(), solid->textureTess() ); VertexInfo normal( solid->extrusion_.normal_sign_.y_ * df[Y], solid->extrusion_.normal_sign_.x_ * df[X] ); vertex.v_[X] *= solid->vector_scale_; vertex.v_[Y] *= solid->vector_scale_; normal.normalize(); solid->extrusion_.contour_.push_back( vertex ); solid->extrusion_.contour_normals_.push_back( normal ); solid->last_vertex_ = to_vertex; return 0; } int Solid::cubicToCallback ( FT_Vector* control1, FT_Vector* control2, FT_Vector* to, Solid* solid ) { // This is crude: Step off cubics with a fixed number of increments VertexInfo to_vertex( to, solid->colorTess(), solid->textureTess() ); VertexInfo control1_vertex( control1, solid->colorTess(), solid->textureTess() ); VertexInfo control2_vertex( control2, solid->colorTess(), solid->textureTess() ); double a[2], b[2], c[2], d[2], f[2], df[2], d2f[2], d3f[2]; a[X] = -solid->last_vertex_.v_[X] + 3 * control1_vertex.v_[X] -3 * control2_vertex.v_[X] + to_vertex.v_[X]; a[Y] = -solid->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y] -3 * control2_vertex.v_[Y] + to_vertex.v_[Y]; b[X] = 3 * solid->last_vertex_.v_[X] - 6 * control1_vertex.v_[X] + 3 * control2_vertex.v_[X]; b[Y] = 3 * solid->last_vertex_.v_[Y] - 6 * control1_vertex.v_[Y] + 3 * control2_vertex.v_[Y]; c[X] = -3 * solid->last_vertex_.v_[X] + 3 * control1_vertex.v_[X]; c[Y] = -3 * solid->last_vertex_.v_[Y] + 3 * control1_vertex.v_[Y]; d[X] = solid->last_vertex_.v_[X]; d[Y] = solid->last_vertex_.v_[Y]; f[X] = d[X]; f[Y] = d[Y]; df[X] = c[X] * solid->delta_ + b[X] * solid->delta2_ + a[X] * solid->delta3_; df[Y] = c[Y] * solid->delta_ + b[Y] * solid->delta2_ + a[Y] * solid->delta3_; d2f[X] = 2 * b[X] * solid->delta2_ + 6 * a[X] * solid->delta3_; d2f[Y] = 2 * b[Y] * solid->delta2_ + 6 * a[Y] * solid->delta3_; d3f[X] = 6 * a[X] * solid->delta3_; d3f[Y] = 6 * a[Y] * solid->delta3_; for ( unsigned int i = 0; i < solid->tessellation_steps_-1; i++ ) { f[X] += df[X]; f[Y] += df[Y]; VertexInfo vertex( f, solid->colorTess(), solid->textureTess() ); VertexInfo normal( solid->extrusion_.normal_sign_.y_ * df[Y], solid->extrusion_.normal_sign_.x_ * df[X] ); vertex.v_[X] *= solid->vector_scale_; vertex.v_[Y] *= solid->vector_scale_; normal.normalize(); solid->extrusion_.contour_.push_back( vertex ); solid->extrusion_.contour_normals_.push_back( normal ); df[X] += d2f[X]; df[Y] += d2f[Y]; d2f[X] += d3f[X]; d2f[Y] += d3f[Y]; } VertexInfo vertex( to, solid->colorTess(), solid->textureTess() ); VertexInfo normal( solid->extrusion_.normal_sign_.y_ * df[Y], solid->extrusion_.normal_sign_.x_ * df[X] ); vertex.v_[X] *= solid->vector_scale_; vertex.v_[Y] *= solid->vector_scale_; normal.normalize(); solid->extrusion_.contour_.push_back( vertex ); solid->extrusion_.contour_normals_.push_back( normal ); solid->last_vertex_ = to_vertex; return 0; } #endif // OGLFT_NO_SOLID Texture::Texture ( const char* filename, float point_size, FT_UInt resolution ) : Face( filename, point_size, resolution ) { if ( !isValid() ) return; init(); } Texture::Texture ( FT_Face face, float point_size, FT_UInt resolution ) : Face( face, point_size, resolution ) { init(); } void Texture::init ( void ) { character_rotation_.active_ = false; character_rotation_.x_ = 0; character_rotation_.y_ = 0; character_rotation_.z_ = 0; setCharSize(); setCharacterRotationReference( 'o' ); } Texture::~Texture ( void ) { clearCaches(); } // Note: Changing the character rotation also clears the display list cache. void Texture::setCharacterRotationX ( GLfloat character_rotation_x ) { if ( character_rotation_x != character_rotation_.x_ ) { character_rotation_.x_ = character_rotation_x; if ( character_rotation_.x_ != 0. || character_rotation_.y_ != 0. || character_rotation_.z_ != 0. ) character_rotation_.active_ = true; else character_rotation_.active_ = false; clearCaches(); } } void Texture::setCharacterRotationY ( GLfloat character_rotation_y ) { if ( character_rotation_y != character_rotation_.y_ ) { character_rotation_.y_ = character_rotation_y; if ( character_rotation_.x_ != 0. || character_rotation_.y_ != 0. || character_rotation_.z_ != 0. ) character_rotation_.active_ = true; else character_rotation_.active_ = false; clearCaches(); } } void Texture::setCharacterRotationZ ( GLfloat character_rotation_z ) { if ( character_rotation_z != character_rotation_.z_ ) { character_rotation_.z_ = character_rotation_z; if ( character_rotation_.x_ != 0. || character_rotation_.y_ != 0. || character_rotation_.z_ != 0. ) character_rotation_.active_ = true; else character_rotation_.active_ = false; clearCaches(); } } void Texture::setCharSize ( void ) { for ( unsigned int f = 0; f < faces_.size(); f++ ) { FT_Error error = FT_Set_Char_Size( faces_[f].face_, (FT_F26Dot6)( point_size_ * 64 ), (FT_F26Dot6)( point_size_ * 64 ), resolution_, resolution_ ); if ( error != 0 ) return; } if ( rotation_reference_glyph_ != 0 ) setRotationOffset(); } void Texture::setRotationOffset ( void ) { FT_Error error = FT_Load_Glyph( rotation_reference_face_, rotation_reference_glyph_, FT_LOAD_RENDER ); if ( error != 0 ) return; rotation_offset_y_ = rotation_reference_face_->glyph->bitmap.rows / 2.; } BBox Texture::measure ( unsigned char c ) { BBox bbox; // For starters, just get the unscaled glyph bounding box unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return bbox; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return bbox; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) return bbox; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); bbox = ft_bbox; bbox.advance_ = faces_[f].face_->glyph->advance; return bbox; } double Texture::height ( void ) const { if ( faces_[0].face_->height > 0 ) return faces_[0].face_->height / 64.; else return faces_[0].face_->size->metrics.y_ppem; } #ifdef _UNICODE #ifndef OGLFT_NO_WX BBox Texture::measure ( const wxChar c ) { BBox bbox; // For starters, just get the unscaled glyph bounding box unsigned int f; FT_UInt glyph_index = 0; for ( f = 0; f < faces_.size(); f++ ) { glyph_index = FT_Get_Char_Index( faces_[f].face_, c ); if ( glyph_index != 0 ) break; } if ( glyph_index == 0 ) return bbox; FT_Error error = FT_Load_Glyph( faces_[f].face_, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return bbox; FT_Glyph glyph; error = FT_Get_Glyph( faces_[f].face_->glyph, &glyph ); if ( error != 0 ) return bbox; FT_BBox ft_bbox; FT_Glyph_Get_CBox( glyph, ft_glyph_bbox_unscaled, &ft_bbox ); FT_Done_Glyph( glyph ); bbox = ft_bbox; bbox.advance_ = faces_[f].face_->glyph->advance; return bbox; } #endif /* OGLFT_NO_WX */ #endif /* _UNICODE */ GLuint Texture::compileGlyph ( FT_Face face, FT_UInt glyph_index ) { bindTexture( face, glyph_index ); GLuint dlist = glGenLists( 1 ); glNewList( dlist, GL_COMPILE ); renderGlyph( face, glyph_index ); glEndList( ); return dlist; } void Texture::renderGlyph ( FT_Face face, FT_UInt glyph_index ) { FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; TextureInfo texture_info; GTOCI texture_object = glyph_texobjs_.find( glyph_index ); if ( texture_object == glyph_texobjs_.end() ) { bindTexture( face, glyph_index ); texture_object = glyph_texobjs_.find( glyph_index ); if ( texture_object == glyph_texobjs_.end() ) return; } texture_info = texture_object->second; glBindTexture( GL_TEXTURE_2D, texture_info.texture_name_ ); if ( character_rotation_.active_ ) { glPushMatrix(); glTranslatef( ( texture_info.width_ / 2. + texture_info.left_bearing_ ), rotation_offset_y_, 0. ); if ( character_rotation_.x_ != 0. ) glRotatef( character_rotation_.x_, 1., 0., 0. ); if ( character_rotation_.y_ != 0. ) glRotatef( character_rotation_.y_, 0., 1., 0. ); if ( character_rotation_.z_ != 0. ) glRotatef( character_rotation_.z_, 0., 0., 1. ); glTranslatef( -( texture_info.width_ / 2. + texture_info.left_bearing_ ), -rotation_offset_y_, 0. ); } glBegin( GL_QUADS ); glTexCoord2i( 0, 0 ); glVertex2f( texture_info.left_bearing_, texture_info.bottom_bearing_ ); glTexCoord2f( texture_info.texture_s_, 0. ); glVertex2f( texture_info.left_bearing_ + texture_info.width_, texture_info.bottom_bearing_ ); glTexCoord2f( texture_info.texture_s_, texture_info.texture_t_ ); glVertex2f( texture_info.left_bearing_ + texture_info.width_, texture_info.bottom_bearing_ + texture_info.height_ ); glTexCoord2f( 0., texture_info.texture_t_ ); glVertex2f( texture_info.left_bearing_, texture_info.bottom_bearing_ + texture_info.height_ ); glEnd(); if ( character_rotation_.active_ ) { glPopMatrix(); } // Drawing a character always advances the MODELVIEW. glTranslatef( texture_info.advance_.x / 64., texture_info.advance_.y / 64., 0. ); } void Texture::clearCaches ( void ) { GDLI fgi = glyph_dlists_.begin(); for ( ; fgi != glyph_dlists_.end(); ++fgi ) { glDeleteLists( fgi->second, 1 ); } glyph_dlists_.clear(); GTOI fti = glyph_texobjs_.begin(); for ( ; fti != glyph_texobjs_.end(); ++fti ) { glDeleteTextures( 1, &fti->second.texture_name_ ); } glyph_texobjs_.clear(); } unsigned int Texture::nearestPowerCeil ( unsigned int a ) { unsigned int b = a; unsigned int c = 1; if ( a == 0 ) return 1; // Take the log-2 of a for ( ; ; ) { if ( b == 1 ) break; else if ( b == 3 ) { c *= 4; break; } b >>= 1; c *= 2; } // If it's too small, raise it another power if ( c < a ) c *= 2; return c; } MonochromeTexture::MonochromeTexture ( const char* filename, float point_size, FT_UInt resolution ) : Texture( filename, point_size, resolution ) {} MonochromeTexture::MonochromeTexture ( FT_Face face, float point_size, FT_UInt resolution ) : Texture( face, point_size, resolution ) {} MonochromeTexture::~MonochromeTexture ( void ) {} // Round up the size of the image to a power of two, but otherwise // use the bitmap as is (i.e., don't expand it into separate // luminance and alpha components) GLubyte* MonochromeTexture::invertBitmap ( const FT_Bitmap& bitmap, int* width, int* height ) { *width = nearestPowerCeil( bitmap.width ); *height = nearestPowerCeil( bitmap.rows ); GLubyte* inverse = new GLubyte[ ( *width + 7) / 8 * *height ]; GLubyte* inverse_ptr = inverse; memset( inverse, 0, sizeof( GLubyte )*( *width + 7 ) / 8 * *height ); for ( int r = 0; r < bitmap.rows; r++ ) { GLubyte* bitmap_ptr = &bitmap.buffer[bitmap.pitch * ( bitmap.rows - r - 1 )]; for ( int p = 0; p < bitmap.pitch; p++ ) { *inverse_ptr++ = *bitmap_ptr++; } inverse_ptr += ( ( *width + 7 ) / 8 - bitmap.pitch ); } return inverse; } // Hmm. This is the only routine which is different between the different // styles. void MonochromeTexture::bindTexture ( FT_Face face, FT_UInt glyph_index ) { GTOCI texobj = glyph_texobjs_.find( glyph_index ); if ( texobj != glyph_texobjs_.end() ) return; // Retrieve the glyph's data. FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; error = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_MONO ); if ( error != 0 ) return; TextureInfo texture_info; glGenTextures( 1, &texture_info.texture_name_ ); glBindTexture( GL_TEXTURE_2D, texture_info.texture_name_ ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); // Texture maps have be a power of 2 in size (is 1 a power of 2?), so // pad it out while flipping it over int width, height; GLubyte* inverted_pixmap = invertBitmap( face->glyph->bitmap, &width, &height ); GLfloat red_map[2] = { background_color_[R], foreground_color_[R] }; GLfloat green_map[2] = { background_color_[G], foreground_color_[G] }; GLfloat blue_map[2] = { background_color_[B], foreground_color_[B] }; GLfloat alpha_map[2] = { background_color_[A], foreground_color_[A] }; glPixelMapfv( GL_PIXEL_MAP_I_TO_R, 2, red_map ); glPixelMapfv( GL_PIXEL_MAP_I_TO_G, 2, green_map ); glPixelMapfv( GL_PIXEL_MAP_I_TO_B, 2, blue_map ); glPixelMapfv( GL_PIXEL_MAP_I_TO_A, 2, alpha_map ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_COLOR_INDEX, GL_BITMAP, inverted_pixmap ); // Save a good bit of the data about this glyph texture_info.left_bearing_ = face->glyph->bitmap_left; texture_info.bottom_bearing_ = -( face->glyph->bitmap.rows - face->glyph->bitmap_top ); texture_info.width_ = face->glyph->bitmap.width; texture_info.height_ = face->glyph->bitmap.rows; texture_info.texture_s_ = (GLfloat)texture_info.width_ / width; texture_info.texture_t_ = (GLfloat)texture_info.height_ / height; texture_info.advance_ = face->glyph->advance; glyph_texobjs_[ glyph_index ] = texture_info; delete[] inverted_pixmap; } GrayscaleTexture::GrayscaleTexture ( const char* filename, float point_size, FT_UInt resolution ) : Texture( filename, point_size, resolution ) {} GrayscaleTexture::GrayscaleTexture ( FT_Face face, float point_size, FT_UInt resolution ) : Texture( face, point_size, resolution ) {} GrayscaleTexture::~GrayscaleTexture ( void ) {} // For the grayscale style, the luminance is the grayscale FreeType value, // so this just rounds up to a power of two and inverts the pixmap GLubyte* GrayscaleTexture::invertPixmap ( const FT_Bitmap& bitmap, int* width, int* height ) { *width = nearestPowerCeil( bitmap.width ); *height = nearestPowerCeil( bitmap.rows ); GLubyte* inverse = new GLubyte[ *width * *height ]; GLubyte* inverse_ptr = inverse; for ( int r = 0; r < bitmap.rows; r++ ) { GLubyte* bitmap_ptr = &bitmap.buffer[bitmap.pitch * ( bitmap.rows - r - 1 )]; for ( int p = 0; p < bitmap.width; p++ ) { *inverse_ptr++ = *bitmap_ptr++; } inverse_ptr += ( *width - bitmap.pitch ); } return inverse; } // Hmm. This is the only routine which is different between the different // styles. void GrayscaleTexture::bindTexture ( FT_Face face, FT_UInt glyph_index ) { GTOCI texobj = glyph_texobjs_.find( glyph_index ); if ( texobj != glyph_texobjs_.end() ) return; // Retrieve the glyph's data. FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; error = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_NORMAL ); if ( error != 0 ) return; TextureInfo texture_info; glGenTextures( 1, &texture_info.texture_name_ ); glBindTexture( GL_TEXTURE_2D, texture_info.texture_name_ ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); // Texture maps have be a power of 2 in size (is 1 a power of 2?), so // pad it out while flipping it over int width, height; GLubyte* inverted_pixmap = invertPixmap( face->glyph->bitmap, &width, &height ); glPushAttrib( GL_PIXEL_MODE_BIT ); glPixelTransferf( GL_RED_SCALE, foreground_color_[R] - background_color_[R] ); glPixelTransferf( GL_GREEN_SCALE, foreground_color_[G]-background_color_[G] ); glPixelTransferf( GL_BLUE_SCALE, foreground_color_[B]-background_color_[B] ); glPixelTransferf( GL_ALPHA_SCALE, foreground_color_[A]-background_color_[A] ); glPixelTransferf( GL_RED_BIAS, background_color_[R] ); glPixelTransferf( GL_GREEN_BIAS, background_color_[G] ); glPixelTransferf( GL_BLUE_BIAS, background_color_[B] ); glPixelTransferf( GL_ALPHA_BIAS, background_color_[A] ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, inverted_pixmap ); glPopAttrib(); // Save a good bit of the data about this glyph texture_info.left_bearing_ = face->glyph->bitmap_left; texture_info.bottom_bearing_ = -( face->glyph->bitmap.rows - face->glyph->bitmap_top ); texture_info.width_ = face->glyph->bitmap.width; texture_info.height_ = face->glyph->bitmap.rows; texture_info.texture_s_ = (GLfloat)texture_info.width_ / width; texture_info.texture_t_ = (GLfloat)texture_info.height_ / height; texture_info.advance_ = face->glyph->advance; glyph_texobjs_[ glyph_index ] = texture_info; delete[] inverted_pixmap; } TranslucentTexture::TranslucentTexture ( const char* filename, float point_size, FT_UInt resolution ) : Texture( filename, point_size, resolution ) {} TranslucentTexture::TranslucentTexture ( FT_Face face, float point_size, FT_UInt resolution ) : Texture( face, point_size, resolution ) {} TranslucentTexture::~TranslucentTexture ( void ) {} // For the translucent style, the luminance is saturated and alpha value // is the translucent FreeType value GLubyte* TranslucentTexture::invertPixmap ( const FT_Bitmap& bitmap, int* width, int* height ) { *width = nearestPowerCeil( bitmap.width ); *height = nearestPowerCeil( bitmap.rows ); GLubyte* inverse = new GLubyte[ 2 * *width * *height ]; GLubyte* inverse_ptr = inverse; for ( int r = 0; r < bitmap.rows; r++ ) { GLubyte* bitmap_ptr = &bitmap.buffer[bitmap.pitch * ( bitmap.rows - r - 1 )]; for ( int p = 0; p < bitmap.width; p++ ) { *inverse_ptr++ = 0xff; *inverse_ptr++ = *bitmap_ptr++; } inverse_ptr += 2 * ( *width - bitmap.pitch ); } return inverse; } // Hmm. This is the only routine which is different between the different // styles. void TranslucentTexture::bindTexture ( FT_Face face, FT_UInt glyph_index ) { GTOCI texobj = glyph_texobjs_.find( glyph_index ); if ( texobj != glyph_texobjs_.end() ) return; // Retrieve the glyph's data. FT_Error error = FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); if ( error != 0 ) return; error = FT_Render_Glyph( face->glyph, FT_RENDER_MODE_NORMAL ); if ( error != 0 ) return; TextureInfo texture_info; glGenTextures( 1, &texture_info.texture_name_ ); glBindTexture( GL_TEXTURE_2D, texture_info.texture_name_ ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); // Texture maps have be a power of 2 in size (is 1 a power of 2?), so // pad it out while flipping it over int width, height; GLubyte* inverted_pixmap = invertPixmap( face->glyph->bitmap, &width, &height ); glPushAttrib( GL_PIXEL_MODE_BIT ); glPixelTransferf( GL_RED_SCALE, foreground_color_[R] - background_color_[R] ); glPixelTransferf( GL_GREEN_SCALE, foreground_color_[G]-background_color_[G] ); glPixelTransferf( GL_BLUE_SCALE, foreground_color_[B]-background_color_[B] ); glPixelTransferf( GL_ALPHA_SCALE, foreground_color_[A]-background_color_[A] ); glPixelTransferf( GL_RED_BIAS, background_color_[R] ); glPixelTransferf( GL_GREEN_BIAS, background_color_[G] ); glPixelTransferf( GL_BLUE_BIAS, background_color_[B] ); glPixelTransferf( GL_ALPHA_BIAS, background_color_[A] ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, inverted_pixmap ); glPopAttrib(); // Save a good bit of the data about this glyph texture_info.left_bearing_ = face->glyph->bitmap_left; texture_info.bottom_bearing_ = -( face->glyph->bitmap.rows - face->glyph->bitmap_top ); texture_info.width_ = face->glyph->bitmap.width; texture_info.height_ = face->glyph->bitmap.rows; texture_info.texture_s_ = (GLfloat)texture_info.width_ / width; texture_info.texture_t_ = (GLfloat)texture_info.height_ / height; texture_info.advance_ = face->glyph->advance; glyph_texobjs_[ glyph_index ] = texture_info; delete[] inverted_pixmap; } } // close OGLFT namespace therion/loch/lxOptDlg.h0000664000175000017500000000052510537464734014120 0ustar useruser/** * @file lxSScene.h * Loch scene setup. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ #ifndef lxOptDlg_h #define lxOptDlg_h // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries void lxShowOptionsDialog(wxWindow * parent); #endif therion/loch/lxSView.cxx0000664000175000017500000004557712447661136014354 0ustar useruser// Standard libraries #ifndef LXDEPCHECK #include #include #endif //LXDEPCHECK - standart libraries #include "lxSView.h" #include "lxGUI.h" #include "lxGLC.h" #include "lxSetup.h" #ifndef LXGNUMSW #include "loch.xpm" #endif #define POS(r, c) wxGBPosition(r,c) #define SPAN(r, c) wxGBSpan(r,c) BEGIN_EVENT_TABLE(lxViewpointSetupDlg, wxMiniFrame) EVT_BUTTON(wxID_CLOSE, lxViewpointSetupDlg::OnCommand) EVT_CHECKBOX(LXVSTP_PERSP, lxViewpointSetupDlg::OnCommand) EVT_CHECKBOX(LXVSTP_ROTATION, lxViewpointSetupDlg::OnCommand) EVT_CHECKBOX(LXVSTP_ROTLOCK, lxViewpointSetupDlg::OnCommand) EVT_CHECKBOX(LXVSTP_STEREO, lxViewpointSetupDlg::OnCommand) EVT_CHECKBOX(LXVSTP_STEREOBW, lxViewpointSetupDlg::OnCommand) EVT_CHOICE(LXVSTP_3DGLASSES, lxViewpointSetupDlg::OnCommand) EVT_MOVE(lxViewpointSetupDlg::OnMove) EVT_CLOSE(lxViewpointSetupDlg::OnClose) EVT_LISTBOX(LXVSTP_CONTROLLB, lxViewpointSetupDlg::OnControlSelect) EVT_TEXT(LXVSTP_FACING, lxViewpointSetupDlg::OnText) EVT_TEXT(LXVSTP_TILT, lxViewpointSetupDlg::OnText) EVT_TEXT(LXVSTP_CENTERX, lxViewpointSetupDlg::OnText) EVT_TEXT(LXVSTP_CENTERY, lxViewpointSetupDlg::OnText) EVT_TEXT(LXVSTP_CENTERZ, lxViewpointSetupDlg::OnText) EVT_TEXT(LXVSTP_DIST, lxViewpointSetupDlg::OnText) EVT_TEXT(LXVSTP_ZOOM, lxViewpointSetupDlg::OnText) EVT_COMMAND_SCROLL(LXVSTP_FACINGSLIDE, lxViewpointSetupDlg::OnSlider) EVT_COMMAND_SCROLL(LXVSTP_TILTSLIDE, lxViewpointSetupDlg::OnSlider) EVT_COMMAND_SCROLL(LXVSTP_ZOOMSLIDE, lxViewpointSetupDlg::OnSlider) EVT_COMMAND_SCROLL(LXVSTP_DISTSLIDE, lxViewpointSetupDlg::OnSlider) EVT_COMMAND_SCROLL(LXVSTP_EYESEP, lxViewpointSetupDlg::OnSlider) EVT_COMMAND_SCROLL(LXVSTP_ROTSPEED, lxViewpointSetupDlg::OnSlider) END_EVENT_TABLE() void lxViewpointSetupDlg::OnControlSelect(wxCommandEvent& event) { this->m_controlSizer->Show(this->m_controlSizer_Orientation, event.GetSelection() == 0); this->m_controlSizer->Show(this->m_controlSizer_Center, event.GetSelection() == 1); this->m_controlSizer->Show(this->m_controlSizer_Camera, event.GetSelection() == 2); this->m_controlSizer->Show(this->m_controlSizer_Rotation, event.GetSelection() == 3); this->m_controlSizer->Show(this->m_controlSizer_Stereo, event.GetSelection() == 4); this->m_controlSizer->Layout(); } void lxViewpointSetupDlg::OnText(wxCommandEvent& event) { bool update = false; double tmpv; switch (event.GetId()) { case LXVSTP_FACING: if (this->m_uicFacing) { if ((lxFTextCtrl(LXVSTP_FACING)->GetValue().ToDouble(&tmpv)) && (tmpv >= 0.0) && (tmpv < 360.0)) { this->m_mainFrame->setup->cam_dir = tmpv; update = true; } } this->m_uicFacing = true; break; case LXVSTP_TILT: if (this->m_uicTilt) { if ((lxFTextCtrl(LXVSTP_TILT)->GetValue().ToDouble(&tmpv)) && (tmpv <= 90.0) && (tmpv >= -90.0)) { this->m_mainFrame->setup->cam_tilt = tmpv; update = true; } } this->m_uicTilt = true; break; case LXVSTP_DIST: if (this->m_uicDist) { if ((lxFTextCtrl(LXVSTP_DIST)->GetValue().ToDouble(&tmpv)) && (tmpv > 0.0)) { this->m_mainFrame->setup->cam_dist = tmpv; update = true; } } this->m_uicDist = true; break; case LXVSTP_ZOOM: if (this->m_uicZoom) { if ((lxFTextCtrl(LXVSTP_ZOOM)->GetValue().ToDouble(&tmpv)) && (tmpv >= 20.0) && (tmpv <= 2000.0)) { double oldvfovr = this->m_mainFrame->setup->cam_lens_vfovr; this->m_mainFrame->setup->SetLens(tmpv); this->m_mainFrame->setup->cam_dist *= oldvfovr / this->m_mainFrame->setup->cam_lens_vfovr; this->m_uicDist = false; lxFTextCtrl(LXVSTP_DIST)->SetValue(wxString::Format(_T("%.0f"), this->m_mainFrame->setup->cam_dist)); update = true; } } this->m_uicZoom = true; break; case LXVSTP_CENTERX: if (this->m_uicCenterX) { if (lxFTextCtrl(LXVSTP_CENTERX)->GetValue().ToDouble(&tmpv)) { this->m_mainFrame->setup->cam_center.x = tmpv; update = true; } } this->m_uicCenterX = true; break; case LXVSTP_CENTERY: if (this->m_uicCenterY) { if (lxFTextCtrl(LXVSTP_CENTERY)->GetValue().ToDouble(&tmpv)) { this->m_mainFrame->setup->cam_center.y = tmpv; update = true; } } this->m_uicCenterY = true; break; case LXVSTP_CENTERZ: if (this->m_uicCenterZ) { if (lxFTextCtrl(LXVSTP_CENTERZ)->GetValue().ToDouble(&tmpv)) { this->m_mainFrame->setup->cam_center.z = tmpv; update = true; } } this->m_uicCenterZ = true; break; } if (update) { this->m_mainFrame->setup->UpdatePos(); this->m_mainFrame->canvas->ForceRefresh(false); this->SetSliders(); } } void lxViewpointSetupDlg::OnSlider(wxScrollEvent& event) { wxCommandEvent tmpEvent(wxEVT_COMMAND_TEXT_UPDATED); switch (event.GetId()) { case LXVSTP_FACINGSLIDE: #ifndef LXDEPCHECK #if wxCHECK_VERSION(2,7,1) lxFTextCtrl(LXVSTP_FACING)->ChangeValue(wxString::Format(_T("%d"), event.GetInt())); tmpEvent.SetId(LXVSTP_FACING); #else lxFTextCtrl(LXVSTP_FACING)->SetValue(wxString::Format(_T("%d"), event.GetInt())); #endif break; case LXVSTP_TILTSLIDE: #if wxCHECK_VERSION(2,7,1) lxFTextCtrl(LXVSTP_TILT)->ChangeValue(wxString::Format(_T("%d"), event.GetInt())); tmpEvent.SetId(LXVSTP_TILT); #else lxFTextCtrl(LXVSTP_TILT)->SetValue(wxString::Format(_T("%d"), event.GetInt())); #endif break; case LXVSTP_ZOOMSLIDE: #if wxCHECK_VERSION(2,7,1) lxFTextCtrl(LXVSTP_ZOOM)->ChangeValue(wxString::Format(_T("%d"), int(20.0 * pow(100.0, (double(event.GetInt()) / 1000.0))))); tmpEvent.SetId(LXVSTP_ZOOM); #else lxFTextCtrl(LXVSTP_ZOOM)->SetValue(wxString::Format(_T("%d"), int(20.0 * pow(100.0, (double(event.GetInt()) / 1000.0))))); #endif break; case LXVSTP_DISTSLIDE: #if wxCHECK_VERSION(2,7,1) lxFTextCtrl(LXVSTP_DIST)->ChangeValue(wxString::Format(_T("%d"), int(pow(200.0 * this->m_mainFrame->setup->data_limits_diam, (double(event.GetInt()) / 1000.0))))); tmpEvent.SetId(LXVSTP_DIST); #else lxFTextCtrl(LXVSTP_DIST)->SetValue(wxString::Format(_T("%d"), int(pow(200.0 * this->m_mainFrame->setup->data_limits_diam, (double(event.GetInt()) / 1000.0))))); #endif #endif break; case LXVSTP_ROTSPEED: this->m_mainFrame->canvas->m_sCameraAutoRotateAngle = (event.GetInt() >= 0 ? 1.0 : -1.0) * 0.05 * pow(200.0, fabs(double(event.GetInt())) / 1000.0); break; case LXVSTP_EYESEP: this->m_mainFrame->setup->cam_anaglyph_eyesep = (double(event.GetInt()) / 10000.0); if (this->m_mainFrame->setup->cam_anaglyph) this->m_mainFrame->canvas->ForceRefresh(false); break; } this->OnText(tmpEvent); } void lxViewpointSetupDlg::OnCommand(wxCommandEvent& event) { switch (event.GetId()) { case wxID_CLOSE: this->m_mainFrame->ToggleViewpointSetup(); break; case LXVSTP_PERSP: this->m_mainFrame->TogglePerspective(); break; case LXVSTP_STEREO: this->m_mainFrame->ToggleStereo(); break; case LXVSTP_STEREOBW: this->m_mainFrame->ToggleStereoBW(); break; case LXVSTP_ROTATION: this->m_mainFrame->ToggleRotation(); break; case LXVSTP_ROTLOCK: this->m_mainFrame->ToggleRotLock(); break; case LXVSTP_3DGLASSES: this->m_mainFrame->setup->cam_anaglyph_glasses = event.GetSelection(); if (this->m_mainFrame->setup->cam_anaglyph) this->m_mainFrame->canvas->ForceRefresh(); break; } } void lxViewpointSetupDlg::OnClose(wxCloseEvent& WXUNUSED(event)) { this->m_mainFrame->ToggleViewpointSetup(); } void lxViewpointSetupDlg::OnMove(wxMoveEvent& WXUNUSED(event)) { if (!this->IsIconized()) { this->m_toolBoxPosition.Save(); } } lxViewpointSetupDlg::lxViewpointSetupDlg(wxWindow *parent) : wxMiniFrame(parent, wxID_ANY, _(" Camera"),wxDefaultPosition, wxDefaultSize, (wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX) & (~(wxMINIMIZE_BOX | wxMAXIMIZE_BOX))) { m_toolBoxPosition.Init(this, parent, 0, 0, 0); #ifdef LXGNUMSW this->SetIcon(wxIcon(_T("LOCHICON"))); #else this->SetIcon(wxIcon(loch_xpm)); #endif this->m_mainFrame = (lxFrame *) parent; this->m_uicFacing = false; this->m_uicTilt = false; this->m_uicCenterX = false; this->m_uicCenterY = false; this->m_uicCenterZ = false; this->m_uicDist = false; this->m_uicZoom = false; ///////////////////////////////////////////////////////////// wxBoxSizer * sizerTop = new wxBoxSizer(wxHORIZONTAL), * sizerFrame = new wxBoxSizer(wxVERTICAL); lxPanel = new wxPanel(this, wxID_ANY); wxListBox * ctrlLBox; ctrlLBox = new wxListBox(lxPanel, LXVSTP_CONTROLLB); ctrlLBox->AppendString(_("Orientation")); ctrlLBox->AppendString(_("Center")); ctrlLBox->AppendString(_("Focus")); ctrlLBox->AppendString(_("Rotation")); ctrlLBox->AppendString(_("Stereo mode")); this->m_controlSizer = new wxBoxSizer(wxVERTICAL); wxSize ctrlMinSize; #define ADDCB(id, ss) \ lxBoxSizer->Add( \ new wxCheckBox(lxPanel, id, ss), \ 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxBOTTOM | wxEXPAND, lxBORDER); #define ADDRB(id, ss) \ lxBoxSizer->Add( \ new wxRadioButton(lxPanel, id, ss), \ 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxBOTTOM | wxEXPAND, lxBORDER); #define ADDST(id, ss) \ lxBoxSizer->Add( \ new wxStaticText(lxPanel, id, ss), \ 0, wxALIGN_LEFT | wxBOTTOM | wxEXPAND, lxBORDER); ///////////////////////////////////////////////////////// // Orientation lxBoxSizer = this->m_controlSizer_Orientation = new wxBoxSizer(wxVERTICAL); lxGBSizer = new wxGridBagSizer(); lxGBSizer->SetCols(2); lxGBSizer->AddGrowableCol(1, 1); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Facing (deg)")), POS(0, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_FACING, _T("0"), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(0, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxGBSizer->Add( new wxSlider(lxPanel, LXVSTP_FACINGSLIDE, 0, 0, 359), POS(1, 0), SPAN(1, 2), wxBOTTOM | wxEXPAND, lxBORDER); lxSETWWIDTH(LXVSTP_FACING, 2); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Tilt (deg)")), POS(2, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_TILT, _T("90"), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(2, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxGBSizer->Add( new wxSlider(lxPanel, LXVSTP_TILTSLIDE, 0, -90, 90), POS(3, 0), SPAN(1, 2), wxBOTTOM | wxEXPAND, lxBORDER); lxSETWWIDTH(LXVSTP_TILT, 2); lxBoxSizer->Add(lxGBSizer, 0, wxEXPAND); this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); ctrlMinSize = lxBoxSizer->GetMinSize(); #define updateCtrlMinSize \ lxSize = lxBoxSizer->GetMinSize(); \ if (lxSize.x > ctrlMinSize.x) ctrlMinSize.x = lxSize.x; \ if (lxSize.y > ctrlMinSize.y) ctrlMinSize.y = lxSize.y; ///////////////////////////////////////////////////////// // Center lxBoxSizer = this->m_controlSizer_Center = new wxBoxSizer(wxVERTICAL); ADDST(wxID_ANY,_("Rotation center")); lxGBSizer = new wxGridBagSizer(); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Easting (m)")), POS(0, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_CENTERX, _T("100.0"), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(0, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxSETWWIDTH(LXVSTP_CENTERX, 3); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Northing (m)")), POS(1, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_CENTERY, _T("100.0"), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(1, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxSETWWIDTH(LXVSTP_CENTERY, 3); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Altitude (m)")), POS(2, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_CENTERZ, _T("100.0"), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(2, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxSETWWIDTH(LXVSTP_CENTERZ, 3); lxBoxSizer->Add(lxGBSizer, 1, wxEXPAND); this->m_controlSizer->Add(lxBoxSizer, 0, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Camera lxBoxSizer = this->m_controlSizer_Camera = new wxBoxSizer(wxVERTICAL); lxGBSizer = new wxGridBagSizer(); lxGBSizer->SetCols(2); lxGBSizer->AddGrowableCol(1, 1); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Distance (m)")), POS(0, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_DIST, _T("100"), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(0, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxGBSizer->Add( new wxSlider(lxPanel, LXVSTP_DISTSLIDE, 0, 0, 1000), POS(1, 0), SPAN(1, 2), wxBOTTOM | wxEXPAND, lxBORDER); lxSETWWIDTH(LXVSTP_DIST, 2.0); lxGBSizer->Add( new wxCheckBox(lxPanel, LXVSTP_PERSP, _("Orthogonal view")), POS(2,0), SPAN(1, 2), wxBOTTOM | wxALIGN_LEFT, lxBORDER); lxGBSizer->Add( new wxStaticText(lxPanel, wxID_ANY, _("Focus (mm)")), POS(3, 0), SPAN(1, 1), wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxRIGHT, lxBORDER); lxGBSizer->Add( new wxTextCtrl(lxPanel, LXVSTP_ZOOM, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT), POS(3, 1), SPAN(1, 1), wxALIGN_LEFT | wxBOTTOM, lxBORDER); lxGBSizer->Add( new wxSlider(lxPanel, LXVSTP_ZOOMSLIDE, 0, 0, 1000), POS(4, 0), SPAN(1, 2), wxBOTTOM | wxEXPAND, lxBORDER); lxSETWWIDTH(LXVSTP_ZOOM, 2.0); lxBoxSizer->Add(lxGBSizer, 0, wxEXPAND); this->m_controlSizer->Add(lxBoxSizer, 0, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Rotation lxBoxSizer = this->m_controlSizer_Rotation = new wxBoxSizer(wxVERTICAL); ADDCB(LXVSTP_ROTATION, _("Enable rotation")) ADDCB(LXVSTP_ROTLOCK, _("Lock rotation")) ADDST(wxID_ANY, _("Rotation speed")) wxSlider * rspeed = new wxSlider(lxPanel, LXVSTP_ROTSPEED, 0, -1000, 1000, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS); #if wxCHECK_VERSION(3,0,0) rspeed->SetTickFreq(1000); #else rspeed->SetTickFreq(1000,0); #endif lxBoxSizer->Add( rspeed, 0, wxBOTTOM | wxEXPAND, lxBORDER); lxBoxSizer->Add( new wxStaticText(lxPanel, LXVSTP_RENSPEED, _T("")), 0, wxALIGN_LEFT | wxBOTTOM | wxEXPAND, lxBORDER); this->m_controlSizer->Add(lxBoxSizer, 0, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Stereo lxBoxSizer = this->m_controlSizer_Stereo = new wxBoxSizer(wxVERTICAL); ADDCB(LXVSTP_STEREO, _("Enable stereo mode")) ADDST(wxID_ANY, _("Eye separation")) lxBoxSizer->Add( new wxSlider(lxPanel, LXVSTP_EYESEP, 250, 1, 1000), 0, wxEXPAND); wxChoice * ch = new wxChoice(lxPanel, LXVSTP_3DGLASSES); ch->Append(_("red & cyan")); ch->Append(_("red & green")); ch->Append(_("red & blue")); ch->Append(_("yellow & blue")); ch->Append(_("cyan & red")); ch->Append(_("green & red")); ch->Append(_("blue & red")); ch->Append(_("blue & yellow")); ch->SetSelection(0); ADDCB(LXVSTP_STEREOBW, _("Disable color textures")) ADDST(wxID_ANY, _("Color channels")) lxBoxSizer->Add(ch, 0, wxBOTTOM | wxEXPAND, lxBORDER); this->m_controlSizer->Add(lxBoxSizer, 0, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // end of tools this->m_controlSizer->Layout(); wxCommandEvent cmdEvent; cmdEvent.SetInt(0); this->m_controlSizer->SetMinSize(ctrlMinSize); this->OnControlSelect(cmdEvent); sizerTop->Add(ctrlLBox, 0, wxALL | wxEXPAND, lxBORDER); lxBoxSizer = new wxBoxSizer(wxVERTICAL); lxBoxSizer->Add( this->m_controlSizer, 1, wxEXPAND, lxBORDER); lxBoxSizer->Add( new wxButton(lxPanel, wxID_CLOSE, _("Close")), 0, wxALIGN_RIGHT); sizerTop->Add(lxBoxSizer, 1, wxALL | wxEXPAND, lxBORDER); lxPanel->SetSizer(sizerTop); sizerTop->Fit(lxPanel); sizerFrame->Add(lxPanel, 1, wxEXPAND | wxALL); this->SetSizer(sizerFrame); sizerFrame->SetSizeHints(this); sizerFrame->Fit(this); wxCommandEvent cmdEvt; cmdEvt.SetInt(3); this->OnControlSelect(cmdEvt); ctrlLBox->Select(3); } bool lxViewpointSetupDlg::IsChanged() { return false; } void lxViewpointSetupDlg::LoadSetup() { lxSetup * stp = this->m_mainFrame->setup; this->m_uicFacing = false; lxFTextCtrl(LXVSTP_FACING)->SetValue(wxString::Format(_T("%.0f"), stp->cam_dir)); this->m_uicTilt = false; lxFTextCtrl(LXVSTP_TILT)->SetValue(wxString::Format(_T("%.0f"), stp->cam_tilt)); this->m_uicCenterX = false; lxFTextCtrl(LXVSTP_CENTERX)->SetValue(wxString::Format(_T("%.0f"), stp->cam_center.x)); this->m_uicCenterY = false; lxFTextCtrl(LXVSTP_CENTERY)->SetValue(wxString::Format(_T("%.0f"), stp->cam_center.y)); this->m_uicCenterZ = false; lxFTextCtrl(LXVSTP_CENTERZ)->SetValue(wxString::Format(_T("%.0f"), stp->cam_center.z)); this->m_uicDist = false; lxFTextCtrl(LXVSTP_DIST)->SetValue(wxString::Format(_T("%.0f"), stp->cam_dist)); this->m_uicZoom = false; lxFTextCtrl(LXVSTP_ZOOM)->SetValue(wxString::Format(_T("%.0f"), stp->cam_lens)); lxFCheckBox(LXVSTP_PERSP)->SetValue(!stp->cam_persp); lxFCheckBox(LXVSTP_STEREO)->SetValue(stp->cam_anaglyph); lxFCheckBox(LXVSTP_STEREOBW)->SetValue(stp->cam_anaglyph_bw); lxFCheckBox(LXVSTP_ROTATION)->SetValue(this->m_mainFrame->canvas->m_sCameraAutoRotate); lxFCheckBox(LXVSTP_ROTLOCK)->SetValue(this->m_mainFrame->canvas->m_sCameraLockRotation); if (this->m_mainFrame->canvas->m_sCameraAutoRotate) lxFCheckBox(LXVSTP_ROTLOCK)->SetLabel(_("Lock rotation speed")); else lxFCheckBox(LXVSTP_ROTLOCK)->SetLabel(_("Lock rotation")); this->SetSliders(); this->IsChanged(); } void lxViewpointSetupDlg::SetSliders() { lxSetup * stp = this->m_mainFrame->setup; lxFSlider(LXVSTP_FACINGSLIDE)->SetValue(int(stp->cam_dir)); lxFSlider(LXVSTP_TILTSLIDE)->SetValue(int(stp->cam_tilt)); lxFSlider(LXVSTP_ZOOMSLIDE)->SetValue(int(1000.0 * log(stp->cam_lens / 20.0)/log(100.0) + 0.5)); lxFSlider(LXVSTP_DISTSLIDE)->SetValue(int(1000.0 * log(stp->cam_dist)/log(200.0 * stp->data_limits_diam) + 0.5)); lxFSlider(LXVSTP_EYESEP)->SetValue(int(stp->cam_anaglyph_eyesep * 10000.0)); lxFSlider(LXVSTP_ROTSPEED)->SetValue(int(fabs(this->m_mainFrame->canvas->m_sCameraAutoRotateAngle) < 0.05 ? 0.0 : (this->m_mainFrame->canvas->m_sCameraAutoRotateAngle > 0 ? 1 : -1) * int(1000.0 * log(fabs(this->m_mainFrame->canvas->m_sCameraAutoRotateAngle) / 0.05)/log(200.0) + 0.5))); } therion/loch/lxLRUD.h0000664000175000017500000000213210537464734013471 0ustar useruser#ifndef lxLRUD_h #define lxLRUD_h // Standard libraries #ifndef LXDEPCHECK #endif //LXDEPCHECK - standart libraries #include "lxMath.h" enum { LXLRUD_OCTAGON, LXLRUD_TUNNEL, LXLRUD_DIAMOND, LXLRUD_SQUARE, }; struct lxLRUDShot { lxVec from, to; long xfrom, xto; int profile; double fl, fr, fu, fd, tl, tr, tu, td, vthresh; void * usr_data; lxLRUDShot() : profile(LXLRUD_OCTAGON), vthresh(60.0) {} }; struct lxLRUDData { long nstations; std::list shots; std::map station_map; double currentVT; int currentProfile; lxLRUDData() : nstations(0), currentVT(60.0), currentProfile(LXLRUD_OCTAGON) {} long GetStationID(lxVec pos, bool insert = false); }; struct lxLRUD { lxLRUDData i; lxTriGeom o; void SetVThreshold(double vt); void SetProfile(int sec_type); void InsertShot(double * from, double * to, double * fromLRUD, double * toLRUD, void * usrData); void Calculate(); long GetPointsN(); void GetPoint(long idx, double * coord, double * norm); long GetTrianglesN(); void GetTriangle(long idx, long * vertices); }; #endif therion/loch/img.h0000664000175000017500000002121012265325004013113 0ustar useruser/* img.h * Header file for routines to read and write Survex ".3d" image files * Copyright (C) Olly Betts 1993,1994,1997,2001,2002,2003,2004,2005,2006,2010,2011,2012,2013,2014 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef IMG_H # define IMG_H /* Define IMG_API_VERSION if you want more recent versions of the img API. * * 0 (default) The old API. date1 and date2 give the survey date as time_t. * Set to 0 for "unknown". * 1 days1 and days2 give survey dates as days since 1st Jan 1900. * Set to -1 for "unknown". */ #ifndef IMG_API_VERSION # define IMG_API_VERSION 0 #elif IMG_API_VERSION > 1 # error IMG_API_VERSION > 1 too new #endif #ifdef __cplusplus extern "C" { #endif #include #include /* for time_t */ # define img_BAD -2 # define img_STOP -1 # define img_MOVE 0 # define img_LINE 1 /* NB: img_CROSS is never output and ignored on input. * Put crosses where labels are. */ /* # define img_CROSS 2 */ # define img_LABEL 3 # define img_XSECT 4 # define img_XSECT_END 5 # define img_ERROR_INFO 6 /* Leg flags */ # define img_FLAG_SURFACE 0x01 # define img_FLAG_DUPLICATE 0x02 # define img_FLAG_SPLAY 0x04 /* Station flags */ # define img_SFLAG_SURFACE 0x01 # define img_SFLAG_UNDERGROUND 0x02 # define img_SFLAG_ENTRANCE 0x04 # define img_SFLAG_EXPORTED 0x08 # define img_SFLAG_FIXED 0x10 # define img_SFLAG_ANON 0x20 # define img_SFLAG_WALL 0x40 /* File-wide flags */ # define img_FFLAG_EXTENDED 0x80 /* When writing img_XSECT, img_XFLAG_END in pimg->flags means this is the last * img_XSECT in this tube: */ # define img_XFLAG_END 0x01 # define img_STYLE_UNKNOWN -1 # define img_STYLE_NORMAL 0 # define img_STYLE_DIVING 1 # define img_STYLE_CARTESIAN 2 # define img_STYLE_CYLPOLAR 3 # define img_STYLE_NOSURVEY 4 /* 3D coordinates (in metres) */ typedef struct { double x, y, z; } img_point; typedef struct { /* members you can access when reading (don't touch when writing) */ char *label; int flags; char *title; /* Older .3d format versions stored a human readable datestamp string. * Format versions >= 8 versions store a string consisting of "@" followed * by the number of seconds since midnight UTC on 1/1/1970. Some foreign * formats contain a human readable string, others no date information * (which results in "?" being returned). */ char *datestamp; /* The datestamp as a time_t (or (time_t)-1 if not available). * * For 3d format versions >= 8, this is a reliable value and in UTC. Older * 3d format versions store a human readable time, which img will attempt * to decode, but it may fail, particularly with handling timezones. Even * if it does work, beware that times in local time where DST applies are * inherently ambiguous around when the clocks go back. * * CMAP XYZ files contain a timestamp. It's probably in localtime (but * without any timezone information) and the example files are all pre-2000 * and have two digit years. We do our best to turn these into a useful * time_t value. */ time_t datestamp_numeric; char separator; /* character used to separate survey levels ('.' usually) */ #if IMG_API_VERSION == 0 time_t date1, date2; #else /* IMG_API_VERSION == 1 */ int days1, days2; #endif double l, r, u, d; /* Error information - valid when IMG_ERROR is returned: */ int n_legs; double length; double E, H, V; /* The filename actually opened (e.g. may have ".3d" added). */ char * filename_opened; int is_extended_elevation; /* The style of the data - one of the img_STYLE_* constants above */ int style; /* all other members are for internal use only */ FILE *fh; /* file handle of image file */ char *label_buf; size_t buf_len; size_t label_len; int fRead; /* 1 for reading, 0 for writing */ long start; /* version of file format: * -4 => CMAP .xyz file, shot format * -3 => CMAP .xyz file, station format * -2 => Compass .plt file * -1 => .pos file * 0 => 0.01 ascii * 1 => 0.01 binary, * 2 => byte actions and flags * 3 => prefixes for legs; compressed prefixes * 4 => survey date * 5 => LRUD info * 6 => error info * 7 => more compact dates with wider range * 8 => lots of changes */ int version; char *survey; size_t survey_len; int pending; /* for old style text format files and survey filtering */ img_point mv; #if IMG_API_VERSION == 0 time_t olddate1, olddate2; #else /* IMG_API_VERSION == 1 */ int olddays1, olddays2; #endif int oldstyle; } img; /* Which version of the file format to output (defaults to newest) */ extern unsigned int img_output_version; /* Minimum supported value for img_output_version: */ #define IMG_VERSION_MIN 1 /* Maximum supported value for img_output_version: */ #define IMG_VERSION_MAX 8 /* Open a .3d file for reading * fnm is the filename * Returns pointer to an img struct or NULL */ #define img_open(F) img_open_survey((F), NULL) /* Open a .3d file for reading * fnm is the filename * Returns pointer to an img struct or NULL * survey points to a survey name to restrict reading to (or NULL for all * survey data in the file) */ img *img_open_survey(const char *fnm, const char *survey); /* Open a .3d file for output * fnm is the filename * title is the title * flags contains a bitwise-or of any file-wide flags - currently only one * is available: img_FFLAG_EXTENDED. (The third parameter used to be * 'fBinary', but has been ignored for many years, so the parameter has * been repurposed for flags - for this reason, img.c deliberately ignores bit * 1 being set, but callers should be written/updated not to set it). * * Returns pointer to an img struct or NULL for error (check img_error() * for details) */ img *img_open_write(const char *fnm, char *title, int flags); /* Read an item from a .3d file * pimg is a pointer to an img struct returned by img_open() * coordinates are returned in p * flags and label name are returned in fields in pimg * Returns img_XXXX as #define-d above */ int img_read_item(img *pimg, img_point *p); /* Write a item to a .3d file * pimg is a pointer to an img struct returned by img_open_write() * code is one of the img_XXXX #define-d above * flags is the leg, station, or xsect flags * (meaningful for img_LINE, img_LABEL, and img_XSECT respectively) * s is the label (only meaningful for img_LABEL) * x, y, z are the coordinates */ void img_write_item(img *pimg, int code, int flags, const char *s, double x, double y, double z); /* Write error information for the current traverse * n_legs is the number of legs in the traverse * length is the traverse length (in m) * E is the ratio of the observed misclosure to the theoretical one * H is the ratio of the observed horizontal misclosure to the theoretical one * V is the ratio of the observed vertical misclosure to the theoretical one */ void img_write_errors(img *pimg, int n_legs, double length, double E, double H, double V); /* rewind a .3d file opened for reading so the data can be read in * several passes * pimg is a pointer to an img struct returned by img_open() * Returns: non-zero for success, zero for error (check img_error() for * details) */ int img_rewind(img *pimg); /* Close a .3d file * pimg is a pointer to an img struct returned by img_open() or * img_open_write() * Returns: non-zero for success, zero for error (check img_error() for * details) */ int img_close(img *pimg); /* Codes returned by img_error */ typedef enum { IMG_NONE = 0, IMG_FILENOTFOUND, IMG_OUTOFMEMORY, IMG_CANTOPENOUT, IMG_BADFORMAT, IMG_DIRECTORY, IMG_READERROR, IMG_WRITEERROR, IMG_TOONEW } img_errcode; /* Read the error code * If img_open(), img_open_survey() or img_open_write() returns NULL, or * img_rewind() or img_close() returns 0, or img_read_item() returns img_BAD * then you can call this function to discover why. */ img_errcode img_error(void); #ifdef __cplusplus } #endif #endif therion/loch/makedepend.pl0000664000175000017500000000035510251676250014634 0ustar useruser# read make file open(MF,"Makefile"); @mflines = ; close(MF); # backup makefile open(MFB,">Makefile~"); print MFB @mflines; close(MFB); foreach $ln (@mflines) { print $ln; if ($ln =~ /^\s*\#\s*DEPENDENCIES/) { last; } } therion/loch/lxData.cxx0000664000175000017500000005015012346021640014133 0ustar useruser/** * @file lxData.cxx * Loch model data. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LXMACOSX #include #else #include #endif #include #endif //LXDEPCHECK - standart libraries #include "lxData.h" #include "lxLRUD.h" lxData::lxData() { this->m_centerline = NULL; this->scrapWalls = NULL; this->scrapWallsNormals = vtkPolyDataNormals::New(); this->lrudWalls = NULL; this->allWalls = vtkAppendPolyData::New(); this->allWallsTriangle = vtkTriangleFilter::New(); this->allWallsSorted = vtkDepthSortPolyData::New(); this->allWallsSorted->SetDirectionToSpecifiedVector(); this->allWallsSorted->SetVector(0.0, 0.0, -1.0); this->allWallsSorted->SetDepthSortModeToBoundsCenter(); this->allWallsStripped = vtkStripper::New(); this->surface = NULL; this->surfaceNormals = vtkPolyDataNormals::New(); this->surfaceTriangle = vtkTriangleFilter::New(); this->surfaceSorted = vtkDepthSortPolyData::New(); this->surfaceSorted->SetDirectionToSpecifiedVector(); this->surfaceSorted->SetDepthSortModeToBoundsCenter(); this->surfaceSorted->SetVector(0.0, 0.0, -1.0); this->luTable = vtkLookupTable::New(); this->luTable->SetHueRange(0.93,0.0); this->luTable->SetValueRange(1.0,1.0); this->luTable->SetSaturationRange(1.0,1.0); this->luTable->Build(); this->title = _("No file open"); } void lxData::Clear() { this->shots.clear(); this->stations.clear(); this->surveys.clear(); if (this->scrapWalls != NULL) { this->scrapWalls->Delete(); this->scrapWalls = NULL; } if (this->lrudWalls != NULL) { this->lrudWalls->Delete(); this->lrudWalls = NULL; } if (this->surface != NULL) { this->surface->Delete(); this->surface = NULL; } if (this->m_centerline != NULL) { this->m_centerline->Delete(); this->m_centerline = NULL; } this->m_textureSurface.Clear(); } void lxDataTexture::Clear() { lxImageRGBFree(this->image); this->ClearTexImages(); } lxDataTexture::~lxDataTexture() { this->Clear(); } lxData::~lxData() { this->Clear(); this->scrapWallsNormals->Delete(); this->allWallsStripped->Delete(); this->allWallsSorted->Delete(); this->allWallsTriangle->Delete(); this->allWalls->Delete(); this->surfaceTriangle->Delete(); this->surfaceSorted->Delete(); this->surfaceNormals->Delete(); this->luTable->Delete(); } bool lxDataTexture::InitCalibInverse(double idx, double idy, double ixx, double ixy, double iyx, double iyy) { #define invmen (iyy*ixx - ixy*iyx) if (invmen == 0.0) return false; this->xx = iyy / invmen; this->xy = -ixy / invmen; this->yx = -iyx / invmen; this->yy = ixx / invmen; this->dx = -1.0 * (this->xx * idx + this->xy * idy); this->dy = -1.0 * (this->yx * idx + this->yy * idy); return true; } bool lxDataTexture::InitCalibNormal(double idx, double idy, double ixx, double ixy, double iyx, double iyy) { this->dx = idx; this->dy = idy; this->xx = ixx; this->xy = ixy; this->yx = iyx; this->yy = iyy; return true; } void lxDataTexture::ClearTexImages() { #define lxDataTextureClear(i) \ if (this->i != NULL) { \ delete [] this->i; \ this->i = NULL; \ } lxDataTextureClear(texS); lxDataTextureClear(texSbw); lxDataTextureClear(texO); lxDataTextureClear(texObw); } bool lxDataTexture::SetImage(lxImageRGB img) { this->Clear(); this->image = img; if (this->image.data == NULL) return false; else return true; } void lxDataTexture::CreateTexImages(int sizeS, int sizeO) { this->ClearTexImages(); if (this->image.data == NULL) return; unsigned char * psrc, * pdst; long pidx, pidn; this->iw = double(this->image.width); this->ih = double(this->image.height); // resize the image int newSize = this->image.width; if (this->image.height > this->image.width) newSize = this->image.height; while (sizeS >= (2 * newSize)) sizeS /= 2; this->texS = new unsigned char [3 * sizeS * sizeS]; this->texSbw = new unsigned char [3 * sizeS * sizeS]; gluScaleImage(GL_RGB, this->image.width, this->image.height, GL_UNSIGNED_BYTE, this->image.data, sizeS, sizeS, GL_UNSIGNED_BYTE, this->texS); pidn = 3 * sizeS * sizeS; for(pidx = 0, psrc = this->texS, pdst = this->texSbw; pidx < pidn; pidx += 3, psrc += 3, pdst += 3) { pdst[2] = pdst[1] = pdst[0] = (unsigned char) (0.2989*double(psrc[0]) + 0.5870*double(psrc[1]) + 0.1140*double(psrc[2])); } this->texSizeS = sizeS; while (sizeO >= (2 * newSize)) sizeO /= 2; this->texO = new unsigned char [3 * sizeO * sizeO]; this->texObw = new unsigned char [3 * sizeO * sizeO]; gluScaleImage(GL_RGB, this->image.width, this->image.height, GL_UNSIGNED_BYTE, this->image.data, sizeO, sizeO, GL_UNSIGNED_BYTE, this->texO); pidn = 3 * sizeO * sizeO; for(pidx = 0, psrc = this->texO, pdst = this->texObw; pidx < pidn; pidx += 3, psrc += 3, pdst += 3) { pdst[2] = pdst[1] = pdst[0] = (unsigned char) (0.2989*double(psrc[0]) + 0.5870*double(psrc[1]) + 0.1140*double(psrc[2])); } this->texSizeO = sizeO; } struct lxDataRebuildStationStruct { lxFileStation * m_pst; size_t m_pos; }; void lxData::Rebuild() { wxString inpln, flags, filename; wxUint32 id1, id2, nid, lnNum, scrapWallsNpt, currentXpt = 0, surfaceNpt; wxInt32 xMode; double fpos[3], norm[3]; lxLRUD lrud; lxDataStation st; lxDataShot sh; lxDataSurvey sv; bool err; this->Clear(); this->title = _T(""); this->scrapWalls = vtkPolyData::New(); this->lrudWalls = vtkPolyData::New(); this->surface = vtkPolyData::New(); this->m_centerline = vtkPolyData::New(); //vtkVoidArray * cldata_array = vtkVoidArray::New(); vtkIntArray * cldata_array = vtkIntArray::New(); cldata_array->SetName("Temp"); err = false; lnNum = 0; xMode = -1; surfaceNpt = 0; lxVec tmpVec; vtkPoints * sWpoints = vtkPoints::New(), * lWpoints = vtkPoints::New(), * spoints = vtkPoints::New(), * cl_points = vtkPoints::New(); vtkCellArray * sWpolys = vtkCellArray::New(), * lWpolys = vtkCellArray::New(), * sWstrips = vtkCellArray::New(), * spolys = vtkCellArray::New(), * cl_cells = vtkCellArray::New(); vtkFloatArray * lWnorms = vtkFloatArray::New(); lWnorms->SetName("Normals"); // * tmpCA; std::map stationMap; std::map surveyMap; size_t st_num; lxDataRebuildStationStruct stR; lxFileSurvey_list::iterator sv_it; lxFileStation_list::iterator st_it; lxFileShot_list::iterator sh_it; lxFileSurvey_list::iterator su_it = this->m_input.m_surveys.begin(); if (su_it != this->m_input.m_surveys.end()) { this->title = wxConvUTF8.cMB2WX(this->m_input.m_surveysData.GetString(su_it->m_titlePtr)); if (this->title.Length() == 0) this->title = wxConvUTF8.cMB2WX(this->m_input.m_surveysData.GetString(su_it->m_namePtr)); } for(sv_it = this->m_input.m_surveys.begin(), st_num = 0; sv_it != this->m_input.m_surveys.end(); sv_it++, st_num++) { sv.m_id = sv_it->m_id; sv.m_name = this->m_input.m_surveysData.GetString(sv_it->m_namePtr); sv.m_title = this->m_input.m_surveysData.GetString(sv_it->m_titlePtr); sv.m_parent = sv_it->m_parent; sv.m_level = 0; sv.m_full_name = sv.m_name; this->surveys.push_back(sv); surveyMap[sv_it->m_id] = st_num; } lxDataSurvey * csv, * psv; for(st_num = 0; st_num < this->surveys.size(); st_num++) { csv = &(this->surveys[st_num]); if (surveyMap.find(csv->m_parent) == surveyMap.end()) csv->m_level = 0; else if (csv->m_parent == csv->m_id) csv->m_level = 0; else { psv = &(this->surveys[surveyMap[csv->m_parent]]); if (psv->m_full_name.size() > 0) csv->m_full_name += "."; csv->m_full_name += psv->m_full_name; csv->m_level = psv->m_level + 1; } } for(st_it = this->m_input.m_stations.begin(), st_num = 0; st_it != this->m_input.m_stations.end(); st_it++, st_num++) { st.pos.x = st_it->m_c[0]; st.pos.y = st_it->m_c[1]; st.pos.z = st_it->m_c[2]; st.m_name = this->m_input.m_stationsData.GetString(st_it->m_namePtr); st.m_comment = this->m_input.m_stationsData.GetString(st_it->m_commentPtr); st.m_temporary = (strcmp(st.m_name,".") == 0) || (strcmp(st.m_name,"-") == 0); st.m_fix = st_it->GetFlag(LXFILE_STATION_FLAG_FIXED); st.m_entrance = st_it->GetFlag(LXFILE_STATION_FLAG_ENTRANCE); st.m_surface = st_it->GetFlag(LXFILE_STATION_FLAG_SURFACE); st.m_survey_idx = surveyMap[st_it->m_surveyId]; stR.m_pos = st_num; stR.m_pst = &(*st_it); stationMap[st_it->m_id] = stR; this->stations.push_back(st); cl_points->InsertNextPoint(st_it->m_c[0], st_it->m_c[1], st_it->m_c[2]); } lxFileDbl * tmpDbl; double fc[3], tc[3], fd[4], td[4]; for(sh_it = this->m_input.m_shots.begin(); sh_it != this->m_input.m_shots.end(); sh_it++) { sh.from = stationMap[sh_it->m_from].m_pos; sh.to = stationMap[sh_it->m_to].m_pos; sh.surface = sh_it->GetFlag(LXFILE_SHOT_FLAG_SURFACE); sh.invisible = sh_it->GetFlag(LXFILE_SHOT_FLAG_NOT_VISIBLE); sh.splay = sh_it->GetFlag(LXFILE_SHOT_FLAG_SPLAY); sh.duplicate = sh_it->GetFlag(LXFILE_SHOT_FLAG_DUPLICATE); this->shots.push_back(sh); cldata_array->InsertNextValue(sh.from); //cldata_array->InsertNextVoidPointer(&(*sh_it)); cl_cells->InsertNextCell(2); cl_cells->InsertCellPoint(sh.from); cl_cells->InsertCellPoint(sh.to); if (sh_it->m_sectionType != LXFILE_SHOT_SECTION_NONE) { tmpDbl = stationMap[sh_it->m_from].m_pst->m_c; fc[0] = tmpDbl[0]; fc[1] = tmpDbl[1]; fc[2] = tmpDbl[2]; tmpDbl = stationMap[sh_it->m_to].m_pst->m_c; tc[0] = tmpDbl[0]; tc[1] = tmpDbl[1]; tc[2] = tmpDbl[2]; tmpDbl = sh_it->m_fLRUD; fd[0] = tmpDbl[0]; fd[1] = tmpDbl[1]; fd[2] = tmpDbl[2]; fd[3] = tmpDbl[3]; tmpDbl = sh_it->m_tLRUD; td[0] = tmpDbl[0]; td[1] = tmpDbl[1]; td[2] = tmpDbl[2]; td[3] = tmpDbl[3]; lrud.SetVThreshold(sh_it->m_threshold); lrud.InsertShot(fc, tc, fd, td, NULL); } } this->m_centerline->SetPoints(cl_points); this->m_centerline->SetLines(cl_cells); vtkCellData * cdt; cdt = this->m_centerline->GetCellData(); cdt->SetScalars(cldata_array); cldata_array->Delete(); cl_points->Delete(); cl_cells->Delete(); // walls scrapWallsNpt = 0; lxFileScrap_list::iterator sw_it; lxFile3Point * sw_pts; lxFile3Angle * sw_tri; for(sw_it = this->m_input.m_scraps.begin(); sw_it != this->m_input.m_scraps.end(); sw_it++) { sw_pts = (lxFile3Point *) this->m_input.m_scrapsData.GetData(sw_it->m_pointsPtr); currentXpt = scrapWallsNpt; for(id1 = 0; id1 < sw_it->m_numPoints; id1++) { sWpoints->InsertPoint(scrapWallsNpt, sw_pts[id1].m_c[0], sw_pts[id1].m_c[1], sw_pts[id1].m_c[2]); scrapWallsNpt++; } sw_tri = (lxFile3Angle *) this->m_input.m_scrapsData.GetData(sw_it->m_3AnglesPtr); for(id1 = 0; id1 < sw_it->m_num3Angles; id1++) { sWpolys->InsertNextCell(3); sWpolys->InsertCellPoint(currentXpt + sw_tri[id1].m_v[0]); sWpolys->InsertCellPoint(currentXpt + sw_tri[id1].m_v[2]); sWpolys->InsertCellPoint(currentXpt + sw_tri[id1].m_v[1]); } } this->scrapWalls->SetPoints(sWpoints); this->scrapWalls->SetPolys(sWpolys); // single surface surfaceNpt = 0; lxFileSurface_list::iterator sf_it = this->m_input.m_surfaces.begin(); lxFileDbl * sf_a; if (sf_it != this->m_input.m_surfaces.end()) { sf_a = (lxFileDbl *) this->m_input.m_surfacesData.GetData(sf_it->m_dataPtr); currentXpt = surfaceNpt; nid = 0; for(id1 = 0; id1 < sf_it->m_height; id1++) { for(id2 = 0; id2 < sf_it->m_width; id2++) { spoints->InsertPoint(surfaceNpt, sf_it->m_calib[0] + sf_it->m_calib[2] * double(id2) + sf_it->m_calib[3] * double(id1), sf_it->m_calib[1] + sf_it->m_calib[4] * double(id2) + sf_it->m_calib[5] * double(id1), sf_a[nid]); surfaceNpt++; nid++; } } wxUint32 r1, r2; for(id1 = 1; id1 < sf_it->m_height; id1++) { for(id2 = 1; id2 < sf_it->m_width; id2++) { r2 = (id1 * sf_it->m_width) + id2; r1 = r2 - sf_it->m_width; spolys->InsertNextCell(4); spolys->InsertCellPoint(currentXpt + r1 - 1); spolys->InsertCellPoint(currentXpt + r1); spolys->InsertCellPoint(currentXpt + r2); spolys->InsertCellPoint(currentXpt + r2 - 1); } } } this->surface->SetPoints(spoints); this->surface->SetPolys(spolys); // texture for first surface object lxFileSurfaceBitmap_list::iterator sfb_it = this->m_input.m_surfaceBitmaps.begin(); if ((sfb_it != this->m_input.m_surfaceBitmaps.end()) && (sfb_it->m_surfaceId == 0) && (sfb_it->m_type == LXFILE_BITMAP_JPEG)) { this->m_textureSurface.SetImage(lxRead_JPEG_file("", this->m_input.m_surfaceBitmapsData.GetTmpFile(sfb_it->m_dataPtr))); this->m_textureSurface.InitCalibInverse(sfb_it->m_calib[0], sfb_it->m_calib[1], sfb_it->m_calib[2], sfb_it->m_calib[3], sfb_it->m_calib[4], sfb_it->m_calib[5]); } // insert LRUD into walls lrud.Calculate(); long i, ni; ni = lrud.GetPointsN(); lWnorms->SetNumberOfComponents(3); for (i = 0; i < ni; i++) { lrud.GetPoint(i, fpos, norm); lWpoints->InsertPoint(i, fpos[0], fpos[1], fpos[2]); lWnorms->InsertTuple(i, norm); } ni = lrud.GetTrianglesN(); long triv[3]; for (i = 0; i < ni; i++) { lrud.GetTriangle(i, triv); lWpolys->InsertNextCell(3); lWpolys->InsertCellPoint(triv[0]); lWpolys->InsertCellPoint(triv[1]); lWpolys->InsertCellPoint(triv[2]); } this->lrudWalls->SetPoints(lWpoints); this->lrudWalls->SetPolys(lWpolys); this->lrudWalls->GetPointData()->SetNormals(lWnorms); // rescale image if too large double * bnds, x1, y1, x2, y2, x3, x4, y3, y4, tmp1, tmp2; int ix1, iy1, ix2, iy2, nsx, nsy; if ((this->surface != NULL) && (this->surface->GetNumberOfPoints() > 0) && (this->m_textureSurface.image.data != NULL)) { bnds = this->surface->GetBounds(); x1 = this->m_textureSurface.xx * bnds[0] + this->m_textureSurface.xy * bnds[2] + this->m_textureSurface.dx; x2 = this->m_textureSurface.xx * bnds[1] + this->m_textureSurface.xy * bnds[2] + this->m_textureSurface.dx; x3 = this->m_textureSurface.xx * bnds[0] + this->m_textureSurface.xy * bnds[3] + this->m_textureSurface.dx; x4 = this->m_textureSurface.xx * bnds[1] + this->m_textureSurface.xy * bnds[3] + this->m_textureSurface.dx; y1 = this->m_textureSurface.yx * bnds[0] + this->m_textureSurface.yy * bnds[2] + this->m_textureSurface.dy; y2 = this->m_textureSurface.yx * bnds[1] + this->m_textureSurface.yy * bnds[2] + this->m_textureSurface.dy; y3 = this->m_textureSurface.yx * bnds[0] + this->m_textureSurface.yy * bnds[3] + this->m_textureSurface.dy; y4 = this->m_textureSurface.yx * bnds[1] + this->m_textureSurface.yy * bnds[3] + this->m_textureSurface.dy; tmp1 = x1; tmp2 = x1; if (x2 < tmp1) tmp1 = x2; if (x2 > tmp2) tmp2 = x2; if (x3 < tmp1) tmp1 = x3; if (x3 > tmp2) tmp2 = x3; if (x4 < tmp1) tmp1 = x4; if (x4 > tmp2) tmp2 = x4; x1 = tmp1; x2 = tmp2; tmp1 = y1; tmp2 = y1; if (y2 < tmp1) tmp1 = y2; if (y2 > tmp2) tmp2 = y2; if (y3 < tmp1) tmp1 = y3; if (y3 > tmp2) tmp2 = y3; if (y4 < tmp1) tmp1 = y4; if (y4 > tmp2) tmp2 = y4; y1 = tmp1; y2 = tmp2; ix1 = int(floor(x1)) - 1; if (ix1 < 0) ix1 = 0; iy1 = int(floor(y1)) - 1; if (iy1 < 0) iy1 = 0; ix2 = int(ceil(x2)) + 1; if (ix2 > this->m_textureSurface.image.width) ix2 = this->m_textureSurface.image.width; iy2 = int(ceil(y2)) + 1; if (iy2 > this->m_textureSurface.image.height) iy2 = this->m_textureSurface.image.height; nsx = ix2 - ix1; nsy = iy2 - iy1; if ((((ix2 - ix1) < this->m_textureSurface.image.width) || ((iy2 - iy1) < this->m_textureSurface.image.height)) && (nsx > 0) && (nsy > 0)) { // skopirujeme data unsigned char * nd = (unsigned char *)malloc(3 * nsx * nsy); int rr, rs, ors, dcs; rs = 3 * nsx; dcs = 3 * ix1; ors = 3 * this->m_textureSurface.image.width; for(rr = 0; rr < nsy; rr++) { memcpy( nd + ((nsy-rr-1) * rs), this->m_textureSurface.image.data + ((this->m_textureSurface.image.height - 1 - iy1 - rr) * ors + dcs), rs); } lxImageRGBFree(this->m_textureSurface.image); this->m_textureSurface.image.data = nd; this->m_textureSurface.image.width = nsx; this->m_textureSurface.image.height = nsy; this->m_textureSurface.iw = (double) nsx; this->m_textureSurface.ih = (double) nsy; this->m_textureSurface.dx -= (double) ix1; this->m_textureSurface.dy -= (double) iy1; } } else { this->m_textureSurface.Clear(); } #if VTK_MAJOR_VERSION > 5 this->scrapWallsNormals->SetInputData(this->scrapWalls); #else this->scrapWallsNormals->SetInput(this->scrapWalls); #endif this->scrapWallsNormals->SetFeatureAngle(360.0); this->scrapWallsNormals->SetAutoOrientNormals(false); this->scrapWallsNormals->Update(); // COUNTER needed #if VTK_MAJOR_VERSION > 5 this->allWalls->RemoveAllInputs(); this->allWalls->AddInputData(this->scrapWallsNormals->GetOutput()); this->allWalls->AddInputData(this->lrudWalls); #else this->allWalls->RemoveAllInputs(); this->allWalls->AddInput(this->scrapWallsNormals->GetOutput()); this->allWalls->AddInput(this->lrudWalls); #endif this->allWalls->Update(); #if VTK_MAJOR_VERSION > 5 this->allWallsTriangle->SetInputConnection(this->allWalls->GetOutputPort()); this->allWallsSorted->SetInputConnection(this->allWallsTriangle->GetOutputPort()); #else this->allWallsTriangle->SetInput(this->allWalls->GetOutput()); this->allWallsSorted->SetInput(this->allWallsTriangle->GetOutput()); #endif this->allWallsSorted->Update(); #if VTK_MAJOR_VERSION > 5 this->allWallsStripped->SetInputConnection(this->allWallsTriangle->GetOutputPort()); #else this->allWallsStripped->SetInput(this->allWallsTriangle->GetOutput()); #endif this->allWallsStripped->Update(); #if VTK_MAJOR_VERSION > 5 this->surfaceNormals->SetInputData(this->surface); #else this->surfaceNormals->SetInput(this->surface); #endif this->surfaceNormals->SetFeatureAngle(360); this->surfaceNormals->Update(); #if VTK_MAJOR_VERSION > 5 this->surfaceTriangle->SetInputConnection(this->surfaceNormals->GetOutputPort()); this->surfaceSorted->SetInputConnection(this->surfaceTriangle->GetOutputPort()); #else this->surfaceTriangle->SetInput(this->surfaceNormals->GetOutput()); this->surfaceSorted->SetInput(this->surfaceTriangle->GetOutput()); #endif this->surfaceSorted->Update(); sWpoints->Delete(); sWpolys->Delete(); sWstrips->Delete(); lWpoints->Delete(); lWpolys->Delete(); lWnorms->Delete(); spoints->Delete(); spolys->Delete(); } void lxData::ExportVTK(wxString fileName) { vtkPolyDataWriter * w = vtkPolyDataWriter::New(); w->SetFileName(fileName.mbc_str()); w->SetFileTypeToBinary(); #if VTK_MAJOR_VERSION > 5 w->SetInputConnection(this->allWallsStripped->GetOutputPort()); #else w->SetInput(this->allWallsStripped->GetOutput()); #endif w->Write(); w->Delete(); } therion/loch/maketest.pl0000664000175000017500000000007410251676250014352 0ustar useruserif ((-s $ARGV[0]) > 0) { exit 0 } else { die "error" } therion/loch/loch.rc0000664000175000017500000000006110344433534013446 0ustar useruserLOCHICON ICON "loch.ico" #include "wx/msw/wx.rc" therion/loch/lxWX.h0000664000175000017500000001024710763712120013251 0ustar useruser#ifndef lxWX_h #define lxWX_h // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #if !wxCHECK_VERSION(2,7,0) #define wxFD_OVERWRITE_PROMPT wxOVERWRITE_PROMPT #define wxFD_SAVE wxSAVE #endif #endif //LXDEPCHECK - standart libraries #ifdef __WXGTK__ #define lxBORDER 3 #else #define lxBORDER 5 #endif #define lxFStaticText(ID) ((wxStaticText *)FindWindow(ID)) #define lxFRadioBtn(ID) ((wxRadioButton *)FindWindow(ID)) #define lxFCheckBox(ID) ((wxCheckBox *)FindWindow(ID)) #define lxFButton(ID) ((wxButton *)FindWindow(ID)) #define lxFTextCtrl(ID) ((wxTextCtrl*)FindWindow(ID)) #define lxFSpinCtrl(ID) ((wxSpinCtrl*)FindWindow(ID)) #define lxFSlider(ID) ((wxSlider*)FindWindow(ID)) #define lxFChoice(ID) ((wxChoice*)FindWindow(ID)) #define lxNOTTOP wxBOTTOM | wxLEFT | wxRIGHT #define lxNOTLEFT wxBOTTOM | wxTOP | wxRIGHT void lxAdjustBitmapRGB(size_t s, unsigned char * d); #ifdef LXWIN32 #define lxADJUSTRGB(s, n) lxAdjustBitmapRGB(s, n) #else #define lxADJUSTRGB(s, n) #endif extern wxStaticBox * lxStaticBox; extern wxStaticBoxSizer * lxStaticBoxSizer; extern wxBoxSizer * lxBoxSizer; extern wxGridSizer * lxGridSizer; extern wxGridBagSizer * lxGBSizer; extern wxFlexGridSizer * lxFlexGridSizer; extern wxRadioButton * lxRadioBtn; extern wxCheckBox * lxCheckBox; extern wxPanel * lxPanel; extern wxSize lxSize; extern wxPoint lxPoint; #define lxSETWWIDTH(ID, fact) \ lxSize = FindWindow(ID)->GetSize(); \ lxSize.SetWidth((int) (lxSize.GetHeight() * fact)); \ FindWindow(ID)->SetSizeHints(lxSize, lxSize); #define lxSETWWH(ID, fact, fact2) \ lxSize = FindWindow(ID)->GetSize(); \ lxSize.SetWidth((int) (lxSize.GetHeight() * fact)); \ lxSize.SetHeight((int) (lxSize.GetHeight() * fact * fact2)); \ FindWindow(ID)->SetSizeHints(lxSize, lxSize); class lxTBoxPos { int m_xOffset, m_yOffset, m_corner; wxWindow * m_winTool, * m_winFrame; public: static int m_fsOffset; lxTBoxPos(); lxTBoxPos(wxWindow * tool, wxWindow * frame, int corner, int xOffset, int yOffset); void Init(wxWindow * tool, wxWindow * frame, int corner = 0, int xOffset = 0, int yOffset = 0); void Set(int corner, int xOffset, int yOffset); void Save(); void Restore(); }; class lxCRC32 { public: unsigned long m_prevCrc; wxString m_crcStr; lxCRC32(); void Initialize(); void AddInteger(long var); void AddReal(double dbl); void AddString(wxString sss); unsigned long Calculate(); bool Changed(); }; class lxDoubleValidator : public wxValidator { public: lxDoubleValidator(double * val, const double vmin, const double vmax, const wxChar * fmt = _T("%.0f")); lxDoubleValidator(const lxDoubleValidator & val); ~lxDoubleValidator(); virtual wxObject *Clone() const { return new lxDoubleValidator(*this); } bool Copy(const lxDoubleValidator& val); virtual bool Validate(wxWindow *parent); virtual bool TransferToWindow(); virtual bool TransferFromWindow(); protected: double * m_variable; double m_vMin, m_vMax; const wxChar * m_fmt; bool CheckValidator() const { wxCHECK_MSG( m_validatorWindow, FALSE, _T("No window associated with validator") ); wxCHECK_MSG( m_validatorWindow->IsKindOf(CLASSINFO(wxTextCtrl)), FALSE, _T("wxNumberValidator is only for wxTextCtrl's") ); wxCHECK_MSG( ((wxTextCtrl *)m_validatorWindow)->IsSingleLine(), FALSE, _T("Multiline wxTextCtrl not allowed yet") ); return TRUE; } }; class lxRadioBtnValidator : public wxValidator { public: lxRadioBtnValidator(long * val, const long optval); lxRadioBtnValidator(const lxRadioBtnValidator & val); ~lxRadioBtnValidator(); virtual wxObject *Clone() const { return new lxRadioBtnValidator(*this); } bool Copy(const lxRadioBtnValidator& val); virtual bool Validate(wxWindow *parent); virtual bool TransferToWindow(); virtual bool TransferFromWindow(); protected: long * m_variable; long m_variableValue; bool CheckValidator() const { wxCHECK_MSG( m_validatorWindow, FALSE, _T("No window associated with validator") ); wxCHECK_MSG( m_validatorWindow->IsKindOf(CLASSINFO(wxRadioButton)), FALSE, _T("wxRadioBtnValidator is only for wxRadioButtons") ); return TRUE; } }; #endif therion/loch/lxGUI.h0000664000175000017500000001460612410762207013344 0ustar useruser/** * @file lxGUI.h * Loch user interface. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef lxGUI_h #define lxGUI_h // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #endif //LXDEPCHECK - standart libraries #include "lxGLC.h" enum { LXMENU_CAMERA_ADJUST = 1000, LXMENU_CAMERA_ROTCW, LXMENU_CAMERA_ROTCCW, LXMENU_CAMERA_UPPER, LXMENU_CAMERA_LOWER, LXMENU_CAMERA_UP, LXMENU_CAMERA_DOWN, LXMENU_CAMERA_LEFT, LXMENU_CAMERA_RIGHT, LXMENU_CAMERA_ZOOMIN, LXMENU_CAMERA_ZOOMOUT, LXMENU_CAMERA_ORIENT, LXMENU_CAMERA_ORIENT_HOME, LXMENU_CAMERA_ORIENT_PLAN, LXMENU_CAMERA_ORIENT_PROFILE, LXMENU_CAMERA_ORIENT_NORTH, LXMENU_CAMERA_ORIENT_SOUTH, LXMENU_CAMERA_ORIENT_EAST, LXMENU_CAMERA_ORIENT_WEST, LXMENU_CAMERA_EXTENDS, LXMENU_CAMERA_DEFAULTS, LXMENU_CAMERA_PERSP, LXMENU_CAMERA_AUTOROTATE, LXMENU_CAMERA_LOCKROT, LXMENU_VIEW, LXMENU_VIEW_FULLSCREEN, LXMENU_VIEW_MODELSTP, LXMENU_VIEW_SELECTIONSTP, LXMENU_VIEW_VIEWPOINTSTP, LXMENU_VIEW_PRESENTDLG, LXMENU_TOOLS_OPTIONS, LXMENU_VIEWEND, LXMENU_EDIT_UNDO, LXMENU_EDIT_REDO, LXMENU_FILE_OPEN, LXMENU_FILE_RELOAD, LXMENU_FILE_RENDER, LXMENU_FILE_RENDER_SETUP, LXMENU_FILE_EXPORT, LXMENU_FILE_IMPORT, LXMENU_HELP_CONTENTS, LXMENU_HELP_CONTROL, LXMENU_HELP_RENDERING, LXMENU_HELP_BUGS, LXMENU_HELP_ABOUT, LXMENU_EXPFIT, LXMENU_EXPROT, LXMENU_PRES, LXMENU_PRESMARK, LXMENU_PRESUPDATE, LXMENU_PRESMOVEUP, LXMENU_PRESMOVEDOWN, LXMENU_PRESDELETE, LXMENU_PRESNEW, LXMENU_PRESOPEN, LXMENU_PRESSAVE, LXMENU_PRESSAVEAS, LXMENU_PRESACTIVATE, LXMENU_PRESEDIT, LXMENU_PRES_END, LXTB, LXTB_OPEN, LXTB_RELOAD, LXTB_RENDER, LXTB_RENDER_SETUP, LXTB_VIEWPOINT, LXTB_PERSP, LXTB_ROTATION, LXTB_LOCKROT, LXTB_PLAN, LXTB_PROFILE, LXTB_FIT, LXTB_HOME, LXTB_FULLSCREEN, LXTB_STEREO, LXTB_VIEWSTP, LXTB_SCENESTP, LXTB_VISCENTERLINE, LXTB_VISWALLS, LXTB_VISSURFACE, LXTB_VISBBOX, LXTB_VISINDS, LXTB_VISENTRANCE, LXTB_VISFIX, LXTB_VISSTATION, LXTB_VISLABEL, LXTBEND, }; enum { LXWALLS_INTERP_NONE, LXWALLS_INTERP_ALL_ONLY, LXWALLS_INTERP_MISSING, }; enum { LXUNITS_METRIC, LXUNITS_IMPERIAL, }; class lxFrame: public wxFrame { public: lxGLCanvas * canvas; wxString m_fileDir, m_fileToOpen, m_fileName; int m_fileType; struct lxData * data; struct lxSetup * setup; struct lxRenderData * m_renderData; wxXmlDocument * m_pres; class lxModelSetupDlg * m_modelSetupDlg; bool m_modelSetupDlgOn; class lxModelTreeDlg * m_selectionSetupDlg; bool m_selectionSetupDlgOn; class lxPresentDlg * m_presentationDlg; bool m_presentationDlgOn; class lxViewpointSetupDlg * m_viewpointSetupDlg; bool m_viewpointSetupDlgOn; wxMenuBar * m_menuBar; wxToolBar * m_toolBar; wxMenu * m_viewpointMenu, * m_toolMenu; wxAcceleratorTable m_menuAccelTable; wxFileConfig * m_fileConfig; wxFileHistory * m_fileHistory; wxString m_iniDirectory; long m_iniUnits; int m_iniStereoGlasses; int m_iniStereoGlassesLast; long m_iniWallsInterpolate; class lxApp * m_app; class wxHelpController * m_helpController; lxFrame(class lxApp * app, const wxString& title, const wxPoint& pos, const wxSize& size, long style = wxDEFAULT_FRAME_STYLE); virtual ~lxFrame(); void OnExit(wxCommandEvent& event); void OnAll(wxCommandEvent& event); void OnMenuCameraMove(wxCommandEvent& event); void OnMenuCameraOrient(wxCommandEvent& event); void OnSize(wxSizeEvent& event); void OnMove(wxMoveEvent& event); void TogglePerspective(); void ToggleStereo(); void ToggleStereoBW(); void ToggleRotation(); void ToggleRotLock(); void ToggleFullScreen(); void ToggleModelSetup(); void ToggleSelectionSetup(); void TogglePresentationDlg(); void ToggleViewpointSetup(); void ToggleVisibilityCenterline(); void ToggleVisibilityCenterlineCave(); void ToggleVisibilityCenterlineSurface(); void ToggleVisibilityCenterlineSplay(); void ToggleVisibilityCenterlineDuplicate(); void ToggleVisibilityCenterlineFix(); void ToggleVisibilityCenterlineStation(); void ToggleVisibilityCenterlineEntrance(); void ToggleVisibilitySurface(); void ToggleVisibilityWalls(); void ToggleVisibilityLabels(); void ToggleVisibilityBBox(); void ToggleVisibilityGrid(); void ToggleVisibilityIndicators(); void ToggleVisibilityStLabelName(); void ToggleVisibilityStLabelComment(); void ToggleVisibilityStLabelAltitude(); void ToggleVisibilityStLabelSurvey(); void ExportRotationPictures(); void SetColorMode(int); void DetectFileType(); int GetFileType(wxString fName); void ToggleColorsApplyCenterline(); void ToggleColorsApplyWalls(); void ToggleSurfaceTexture(); void ToggleSurfaceTransparency(); void ToggleSurfaceLighting(); void ToggleWallsTransparency(); void SetupUpdate(); void SetupApply(); void OpenFile(const wxString & fName); void ImportFile(const wxString fName, int fType); void LoadData(wxString fName, int fType); void ReloadData(); void UpdateM2TB(); DECLARE_EVENT_TABLE() }; // lxFrame class lxApp: public wxGLApp { public: class lxFrame * frame; wxLocale m_locale; wxFileName m_path; bool OnInit(); #ifdef LXMACOSX virtual void MacOpenFile(const wxString &fileName); #endif }; // lxApp #endif therion/loch/loch.xpm0000664000175000017500000000232610763711560013657 0ustar useruser/* XPM */ static const char * loch_xpm[] = { "32 32 2 1", " c None", "+ c #000000", " ", " ", " ", " ++++++++ ", " +++++++++++++ ", " ++++++++++++++++ ", " ++++++++++++++++++ ", " +++++++++ +++++ ", " +++++++ +++++ ", " +++++ ++++ ", " +++++ ++++ ", " ++++ ++++ ", " +++++ ++++ ", " ++++ ++++ ", " ++++ ++++ ", " ++++ ++++ ", " ++++ ++++ ", " ++++ ++++ ", " ++++ +++++ ", " ++++ ++++ ", " ++++ +++++ ", " ++++ +++++ ", " ++++ +++++ ", " ++++ +++++ ", " +++++++ ++++++++++++ ", " +++++++++++ +++++++++++++ ", " ++++++++++++ +++++++++++++ ", " +++++++++++ ++++++++++++ ", " ++++++ ", " ", " ", " "}; therion/loch/lxData.h0000664000175000017500000000656211140457360013573 0ustar useruser/** * @file lxData.h * Loch model data. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef lxData_h #define lxData_h // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #include #include #include #include #endif //LXDEPCHECK - standart libraries #include "lxMath.h" #include "lxImgIO.h" #include "lxImgIO.h" #include "lxFile.h" struct lxDataSurvey { size_t m_id, m_parent, m_level; const char * m_name, * m_title; std::string m_full_name; }; struct lxDataStation { lxVec pos; size_t m_survey_idx; const char * m_name, * m_comment; bool m_temporary, m_entrance, m_fix; double m_screen_x, m_screen_y, m_screen_z, m_surface; lxDataStation() : m_name(NULL), m_temporary(false), m_entrance(false), m_fix(false), m_surface(false) {} }; struct lxDataTexture { double dx, dy, xx, xy, yx, yy, iw, ih; unsigned texSizeS, texSizeO; lxImageRGB image; unsigned char * texS, * texSbw, * texO, * texObw; lxDataTexture() : dx(0.0), dy(0.0), xx(1.0), xy(0.0), yx(0.0), yy(1.0), iw(1.0), ih(1.0), image(), texS(NULL), texSbw(NULL), texO(NULL), texObw(NULL) {} ~lxDataTexture(); bool SetImage(lxImageRGB img); void Clear(); void ClearTexImages(); void CreateTexImages(int sizeS, int sizeO); bool InitCalibInverse(double idx, double idy, double ixx, double ixy, double iyx, double iyy); bool InitCalibNormal(double idx, double idy, double ixx, double ixy, double iyx, double iyy); }; struct lxDataShot { unsigned long from, to; bool surface, invisible, splay, duplicate; }; typedef std::vector lxDataStationVec; typedef std::vector lxDataShotVec; typedef std::vector lxDataSurveyVec; struct lxData { lxFile m_input; lxDataStationVec stations; lxDataShotVec shots; lxDataSurveyVec surveys; wxString title; vtkPolyData * scrapWalls, * lrudWalls, * surface, * m_centerline; vtkTriangleFilter * allWallsTriangle, * surfaceTriangle; vtkDepthSortPolyData * allWallsSorted, * surfaceSorted; vtkAppendPolyData * allWalls; vtkStripper * allWallsStripped; vtkPolyDataNormals * scrapWallsNormals, * surfaceNormals; vtkLookupTable * luTable; lxDataTexture m_textureSurface; lxData(); ~lxData(); void Clear(); void Rebuild(); void InitTextures(); void ExportVTK(wxString fileName); }; #endif therion/loch/getline.c0000664000175000017500000000720410507531566014001 0ustar useruser/* getline.c -- Replacement for GNU C library function getline Copyright (C) 1993, 1996, 1997 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Written by Jan Brittenson, bson@gnu.ai.mit.edu. */ #if HAVE_CONFIG_H # include #endif /* The `getdelim' function is only declared if the following symbol is defined. */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #include #include #if defined __GNU_LIBRARY__ && HAVE_GETDELIM int getline (lineptr, n, stream) char **lineptr; size_t *n; FILE *stream; { return getdelim (lineptr, n, '\n', stream); } #else /* ! have getdelim */ # define NDEBUG # include # if STDC_HEADERS # include # else char *malloc (), *realloc (); # endif /* Always add at least this many bytes when extending the buffer. */ # define MIN_CHUNK 64 /* Read up to (and including) a TERMINATOR from STREAM into *LINEPTR + OFFSET (and null-terminate it). *LINEPTR is a pointer returned from malloc (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Return the number of characters read (not including the null terminator), or -1 on error or EOF. */ int getstr (lineptr, n, stream, terminator, offset) char **lineptr; size_t *n; FILE *stream; char terminator; size_t offset; { int nchars_avail; /* Allocated but unused chars in *LINEPTR. */ char *read_pos; /* Where we're reading into *LINEPTR. */ int ret; if (!lineptr || !n || !stream) return -1; if (!*lineptr) { *n = MIN_CHUNK; *lineptr = malloc (*n); if (!*lineptr) return -1; } nchars_avail = *n - offset; read_pos = *lineptr + offset; for (;;) { register int c = getc (stream); /* We always want at least one char left in the buffer, since we always (unless we get an error while reading the first char) NUL-terminate the line buffer. */ assert(*n - nchars_avail == read_pos - *lineptr); if (nchars_avail < 2) { if (*n > MIN_CHUNK) *n *= 2; else *n += MIN_CHUNK; nchars_avail = *n + *lineptr - read_pos; *lineptr = realloc (*lineptr, *n); if (!*lineptr) return -1; read_pos = *n - nchars_avail + *lineptr; assert(*n - nchars_avail == read_pos - *lineptr); } if (c == EOF || ferror (stream)) { /* Return partial line, if any. */ if (read_pos == *lineptr) return -1; else break; } *read_pos++ = c; nchars_avail--; if (c == terminator) /* Return the line. */ break; } /* Done - NUL terminate and return the number of chars read. */ *read_pos = '\0'; ret = read_pos - (*lineptr + offset); return ret; } int getline (lineptr, n, stream) char **lineptr; size_t *n; FILE *stream; { return getstr (lineptr, n, stream, '\n', 0); } int getdelim (lineptr, n, delimiter, stream) char **lineptr; size_t *n; int delimiter; FILE *stream; { return getstr (lineptr, n, stream, delimiter, 0); } #endif therion/loch/loch.ico0000664000175000017500000002603610251676250013627 0ustar useruser(V è~00hf@@h Î ``è6( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€Àùçóóãóãñáñàñðøþÿÿÿÿ( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€à€ÀÀÀøÀÿàÿþðþø?ü?üü?þü?þøÿøÿøÿ‡øÿ‡øÿ‡ø?ÿ‡ü?ÿ‡üÿ‡þÿ‡þÿÿ~ÿÀÿàÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0`€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀüÀøÀðÀðàðþðÿðøÿÿà?üÿÿà?þÿÿàþÿÿÀÿÿÿÀÿ€ÿ€ÿÿÀÿ€ÿÿà?ÿÿÿà?ÿÿÿð?ÿÿÿðÿÿÿøÿÿÿøÿÿÿøÿÿÿøÿÿÿüÿÿÿüÿÿÿüÿÿÿüÿÿÿüÿ€ÿÿüÿ€ÿÿüÿÀÿüÿÀ?ÿüÿàÿüÿðÿøÿøÿðÿüàÿþ?ÿÿ€?ÿÿÀÿÿðÿÿÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÿþÀÿüÀøÀ?ðÀ?ðÀ?ðà?ððøÿ€ø?ÿþÿüÿÿÿüÿþÿÿüÿÿ?ÿÿøÿÿ€ÿÿøÿÿÀÿÿðÿÿÀÿÿðÿÿàÿÿðÿÿðÿÿàÿÿøÿÿàÿÿøÿÿÀÿÿüÿÿÀÿÿüÿÿÀÿÿþÿÿÀÿÿþÿÿ€?ÿÿþÿÿ€?ÿÿÿÿ€?ÿÿÿÿ€?ÿÿÿÿ€?ÿÿÿÿ€?ÿÿÿ€?ÿ€?ÿÿÿ€?ÿ€?ÿÿÿ€?ÿ€ÿÿÿ€?ÿ€ÿÿÿ€?ÿÀÿÿÿ€?ÿÀÿÿÿ€?ÿÀÿÿÿ€?ÿàÿÿÿ€?ÿàÿÿÿ€?ÿðÿÿÿ€?ÿð?ÿÿ?ÿøÿÿÿüÿþÿþÿüÿÿðÿÿ€ÿÿÿÀÿÿÿðÿÿÿøÿÿÿþÿÿÿÿ€ÿÿÿÿàÿÿÿÿüÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(`À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿøÿÿÿà?øÿÿ€ðÿÿðÿÿðÿþðÿþðÿüøÿüøÿüüÿüÿÿþÿðÿþ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ€ÿÿÿÿþÿÿÀ?ÿÿÿÿüÿÿàÿÿÿÿüÿÿðÿÿÿÿüÿÿðÿÿÿÿøÿÿøÿÿÿÿø?ÿÿüÿÿÿÿð?ÿÿþÿÿÿÿðÿÿÿÿÿÿÿàÿÿÿ€ÿÿÿÿàÿÿÿÀÿÿÿÿÀÿÿÿÿàÿÿÿÿÀÿÿÿÿàÿÿÿÀÿÿÿÿðÿÿÿ€ÿÿÿÿð?ÿÿÿ€ÿÿÿÿø?ÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿÿüÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿÀÿÿþÿÿÿÿÿÀÿÿþÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÀÿÿÿÀ?ÿÿÿÿÀÿÿÿÀÿÿÿÿÀÿÿÿàÿÿÿÿÀÿÿÿàÿÿÿÿÀÿÿÿðÿÿÿÿ€ÿÿÿøÿÿÿÿ€ÿÿÿü?ÿÿÿ€ÿÿÿüÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿüÿÿÿÿ€ÿøÿÿÿÿÀÿÀÿÿÿÿàÿÿÿÿøÿÿÿÿüÿÿÿÿþÿÿÿÿÿ€?ÿÿÿÿÿÀÿÿÿÿÿðÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtherion/loch/TODO0000664000175000017500000000174111105003560012655 0ustar useruserTODO: + stations signs + labels + label entrances and fixed stations + multiple color modes + measure toolbox + survey tree + animation toolbox + multiple surfaces support + finish SK translation + fix Mac OS X built + search for help and localization files under Linux + scalebar to OpenGL list + channel brightness adjustment in stereo mode + station labeling + PNG texture support + color schemes (altitude, surveys, date) + add closed file mode + File->Close + escape in full-screen mode from toolboxes BUGS: + inactive loading file window + radiobutton not active when rotation MAC OS X: a) Udelat z ni bundlovanou aplikaci b) Dodat Info.plist, do kteryho se napisi typy souboru, ktery to ma zrat pretazenim, jaky maji mit obrazek (asi mysli ikonu), koncovku, file type, atd. c) Doprogramovat podporu pro tohle aby pri pretazeni se event zkonvertoval na udalost pro otevreni souboru aniz by te to otravovalo s oknem pro jeho vyber. therion/loch/lxSScene.cxx0000664000175000017500000004245211763375654014473 0ustar useruser// Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries #include "lxSScene.h" #include "lxGUI.h" #include "lxGLC.h" #include "lxSetup.h" #ifndef LXGNUMSW #include "loch.xpm" #endif enum { lxSS_VIS_CENTERLINE = 4000, lxSS_VIS_WALLS, lxSS_VIS_SURFACE, lxSS_VIS_LABELS, lxSS_VIS_BBOX, lxSS_VIS_GRID, lxSS_VIS_INDICATORS, lxSS_SRF_TRANSPARENCY, lxSS_SRF_OPACITY, lxSS_SRF_TEXTURE, lxSS_SRF_LIGHTING, lxSS_WALLS_TRANSPARENCY, lxSS_WALLS_OPACITY, lxSS_COLORMD_ALTITUDE, lxSS_COLORMD_DEFAULT, lxSS_COLORAPP_CENTERLINE, lxSS_COLORAPP_WALLS, lxSS_CLNVIS_SURFACE, lxSS_CLNVIS_CAVE, lxSS_CLNVIS_SPLAY, lxSS_CLNVIS_DUPLICATE, lxSS_CLNVIS_STATION, lxSS_CLNVIS_ENTRANCE, lxSS_CLNVIS_FIX, lxSS_STLABEL_NAME, lxSS_STLABEL_SURVEY, lxSS_STLABEL_COMMENT, lxSS_STLABEL_ALTITUDE, lxSS_IND_PNAME, }; BEGIN_EVENT_TABLE(lxModelSetupDlg, wxMiniFrame) EVT_RADIOBUTTON(lxSS_COLORMD_ALTITUDE, lxModelSetupDlg::OnCommand) EVT_RADIOBUTTON(lxSS_COLORMD_DEFAULT, lxModelSetupDlg::OnCommand) EVT_BUTTON(wxID_ANY, lxModelSetupDlg::OnCommand) EVT_BUTTON(wxID_CLOSE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_CENTERLINE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_WALLS, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_SURFACE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_LABELS, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_BBOX, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_GRID, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_VIS_INDICATORS, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_WALLS_TRANSPARENCY, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_SRF_TRANSPARENCY, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_SRF_TEXTURE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_SRF_LIGHTING, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_STATION, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_ENTRANCE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_FIX, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_SURFACE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_CAVE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_SPLAY, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_CLNVIS_DUPLICATE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_COLORAPP_CENTERLINE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_COLORAPP_WALLS, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_STLABEL_NAME, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_STLABEL_COMMENT, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_STLABEL_ALTITUDE, lxModelSetupDlg::OnCommand) EVT_CHECKBOX(lxSS_STLABEL_SURVEY, lxModelSetupDlg::OnCommand) EVT_MOVE(lxModelSetupDlg::OnMove) EVT_CLOSE(lxModelSetupDlg::OnClose) EVT_COMMAND_SCROLL(lxSS_WALLS_OPACITY, lxModelSetupDlg::OnSlider) EVT_COMMAND_SCROLL(lxSS_SRF_OPACITY, lxModelSetupDlg::OnSlider) EVT_LISTBOX(LXMSTP_CONTROLLB, lxModelSetupDlg::OnControlSelect) EVT_TEXT(lxSS_IND_PNAME, lxModelSetupDlg::OnCommand) END_EVENT_TABLE() void lxModelSetupDlg::OnCommand(wxCommandEvent& event) { switch (event.GetId()) { case wxID_CLOSE: this->m_mainFrame->ToggleModelSetup(); break; case lxSS_SRF_TEXTURE: this->m_mainFrame->ToggleSurfaceTexture(); break; case lxSS_SRF_LIGHTING: this->m_mainFrame->ToggleSurfaceLighting(); break; case lxSS_SRF_TRANSPARENCY: this->m_mainFrame->ToggleSurfaceTransparency(); break; case lxSS_WALLS_TRANSPARENCY: this->m_mainFrame->ToggleWallsTransparency(); break; case lxSS_VIS_CENTERLINE: this->m_mainFrame->ToggleVisibilityCenterline(); break; case lxSS_VIS_WALLS: this->m_mainFrame->ToggleVisibilityWalls(); break; case lxSS_VIS_SURFACE: this->m_mainFrame->ToggleVisibilitySurface(); break; case lxSS_VIS_LABELS: this->m_mainFrame->ToggleVisibilityLabels(); break; case lxSS_VIS_BBOX: this->m_mainFrame->ToggleVisibilityBBox(); break; case lxSS_VIS_GRID: this->m_mainFrame->ToggleVisibilityGrid(); break; case lxSS_VIS_INDICATORS: this->m_mainFrame->ToggleVisibilityIndicators(); break; case lxSS_COLORMD_ALTITUDE: this->m_mainFrame->SetColorMode(lxSETUP_COLORMD_ALTITUDE); break; case lxSS_COLORMD_DEFAULT: this->m_mainFrame->SetColorMode(lxSETUP_COLORMD_DEFAULT); break; case lxSS_COLORAPP_CENTERLINE: this->m_mainFrame->ToggleColorsApplyCenterline(); break; case lxSS_COLORAPP_WALLS: this->m_mainFrame->ToggleColorsApplyWalls(); break; case lxSS_CLNVIS_SURFACE: this->m_mainFrame->ToggleVisibilityCenterlineSurface(); break; case lxSS_CLNVIS_CAVE: this->m_mainFrame->ToggleVisibilityCenterlineCave(); break; case lxSS_CLNVIS_SPLAY: this->m_mainFrame->ToggleVisibilityCenterlineSplay(); break; case lxSS_CLNVIS_DUPLICATE: this->m_mainFrame->ToggleVisibilityCenterlineDuplicate(); break; case lxSS_CLNVIS_FIX: this->m_mainFrame->ToggleVisibilityCenterlineFix(); break; case lxSS_CLNVIS_ENTRANCE: this->m_mainFrame->ToggleVisibilityCenterlineEntrance(); break; case lxSS_CLNVIS_STATION: this->m_mainFrame->ToggleVisibilityCenterlineStation(); break; case lxSS_STLABEL_ALTITUDE: this->m_mainFrame->ToggleVisibilityStLabelAltitude(); break; case lxSS_STLABEL_NAME: this->m_mainFrame->ToggleVisibilityStLabelName(); break; case lxSS_STLABEL_SURVEY: this->m_mainFrame->ToggleVisibilityStLabelSurvey(); break; case lxSS_STLABEL_COMMENT: this->m_mainFrame->ToggleVisibilityStLabelComment(); break; case lxSS_IND_PNAME: this->m_mainFrame->data->title = lxFTextCtrl(lxSS_IND_PNAME)->GetValue(); this->m_mainFrame->canvas->ForceRefresh(); break; } } void lxModelSetupDlg::OnSlider(wxScrollEvent& event) { bool update = false; switch (event.GetId()) { case lxSS_SRF_OPACITY: this->m_mainFrame->setup->m_srf_opacity = 1.0 - double(event.GetInt()) / 100.0; update = true; break; case lxSS_WALLS_OPACITY: this->m_mainFrame->setup->m_walls_opacity = 1.0 - double(event.GetInt()) / 100.0; update = true; break; } if (update) this->m_mainFrame->canvas->UpdateContents(); } void lxModelSetupDlg::OnClose(wxCloseEvent& WXUNUSED(event)) { this->m_mainFrame->ToggleModelSetup(); } void lxModelSetupDlg::OnMove(wxMoveEvent& WXUNUSED(event)) { this->m_toolBoxPosition.Save(); } void lxModelSetupDlg::OnControlSelect(wxCommandEvent& event) { this->m_controlSizer->Show(this->m_controlSizer_Visibility, event.GetSelection() == 0); this->m_controlSizer->Show(this->m_controlSizer_ColorMode, event.GetSelection() == 1); this->m_controlSizer->Show(this->m_controlSizer_Centerline, event.GetSelection() == 2); this->m_controlSizer->Show(this->m_controlSizer_Labels, event.GetSelection() == 3); this->m_controlSizer->Show(this->m_controlSizer_Walls, event.GetSelection() == 4); this->m_controlSizer->Show(this->m_controlSizer_Surface, event.GetSelection() == 5); //this->m_controlSizer->Show(this->m_controlSizer_BBox2Grid, event.GetSelection() == 6); this->m_controlSizer->Show(this->m_controlSizer_Indicators, event.GetSelection() == 6); //this->m_controlSizer->Show(this->m_controlSizer_ColorSetup, event.GetSelection() == 8); this->m_controlSizer->Layout(); } lxModelSetupDlg::lxModelSetupDlg(wxWindow *parent) : wxMiniFrame(parent, wxID_ANY, _(" Scene"),wxDefaultPosition, wxDefaultSize, (wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX) & (~(wxMINIMIZE_BOX | wxMAXIMIZE_BOX))) { this->m_toolBoxPosition.Init(this, parent, 2, 8, 8); #ifdef LXGNUMSW this->SetIcon(wxIcon(_T("LOCHICON"))); #else this->SetIcon(wxIcon(loch_xpm)); #endif this->m_mainFrame = (lxFrame *) parent; wxBoxSizer * sizerTop = new wxBoxSizer(wxHORIZONTAL), * sizerFrame = new wxBoxSizer(wxVERTICAL); lxPanel = new wxPanel(this, wxID_ANY); wxListBox * ctrlLBox; ctrlLBox = new wxListBox(lxPanel, LXMSTP_CONTROLLB); ctrlLBox->AppendString(_("Visibility")); ctrlLBox->AppendString(_("Color mode")); ctrlLBox->AppendString(_("Centerline")); ctrlLBox->AppendString(_("Stations")); ctrlLBox->AppendString(_("Walls")); ctrlLBox->AppendString(_("Surface")); //ctrlLBox->AppendString(_("BBox & grid")); ctrlLBox->AppendString(_("Indicators")); //ctrlLBox->AppendString(_("Color setup")); ctrlLBox->Select(0); this->m_controlSizer = new wxBoxSizer(wxVERTICAL); wxSize ctrlMinSize; ///////////////////////////////////////////////////////// // Visibility lxBoxSizer = this->m_controlSizer_Visibility = new wxBoxSizer(wxVERTICAL); #define ADDCB(id, ss) \ lxBoxSizer->Add( \ new wxCheckBox(lxPanel, id, ss), \ 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxBOTTOM, lxBORDER); #define ADDRB(id, ss) \ lxBoxSizer->Add( \ new wxRadioButton(lxPanel, id, ss), \ 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxBOTTOM, lxBORDER); #define ADDST(id, ss) \ lxBoxSizer->Add( \ new wxStaticText(lxPanel, id, ss), \ 0, wxALIGN_LEFT | wxBOTTOM, lxBORDER); ADDST(wxID_ANY, _("Scene items")) ADDCB(lxSS_VIS_CENTERLINE, _("Centerline")) ADDCB(lxSS_VIS_WALLS, _("Walls")) ADDCB(lxSS_VIS_SURFACE, _("Surface")) // ADDCB(lxSS_VIS_LABELS, _("Labels")) ADDCB(lxSS_VIS_BBOX, _("Bounding box")) // ADDCB(lxSS_VIS_GRID, _("Grid")) ADDCB(lxSS_VIS_INDICATORS, _("Indicators")) this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); ctrlMinSize = lxBoxSizer->GetMinSize(); #define updateCtrlMinSize \ lxSize = lxBoxSizer->GetMinSize(); \ if (lxSize.x > ctrlMinSize.x) ctrlMinSize.x = lxSize.x; \ if (lxSize.y > ctrlMinSize.y) ctrlMinSize.y = lxSize.y; ///////////////////////////////////////////////////////// // color mode lxBoxSizer = this->m_controlSizer_ColorMode = new wxBoxSizer(wxVERTICAL); ADDST(wxID_ANY, _("Color mode")) lxBoxSizer->Add( new wxRadioButton(lxPanel, lxSS_COLORMD_ALTITUDE, _("Altitude"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP), 0, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT | wxBOTTOM, lxBORDER); //ADDRB(lxSS_COLORMD_ALTITUDE, _("Altitude")) // ADDRB(wxID_ANY, _("Topo date")) ADDRB(lxSS_COLORMD_DEFAULT, _("Default")) lxBoxSizer->Add( \ new wxStaticLine(lxPanel, wxID_ANY), \ 0, wxBOTTOM | wxEXPAND, lxBORDER); ADDST(wxID_ANY, _("Applies to")); ADDCB(lxSS_COLORAPP_CENTERLINE, _("Centerline")) ADDCB(lxSS_COLORAPP_WALLS, _("Walls")) // ADDCB(wxID_ANY, _("Surface")) this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Centerline lxBoxSizer = this->m_controlSizer_Centerline = new wxBoxSizer(wxVERTICAL); ADDST(wxID_ANY, _("Centerline visibility")) ADDCB(lxSS_CLNVIS_SURFACE, _("Surface")) ADDCB(lxSS_CLNVIS_CAVE, _("Underground")) ADDCB(lxSS_CLNVIS_SPLAY, _("Splay")) ADDCB(lxSS_CLNVIS_DUPLICATE, _("Duplicate")) this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Walls lxBoxSizer = this->m_controlSizer_Walls = new wxBoxSizer(wxVERTICAL); ADDCB(lxSS_WALLS_TRANSPARENCY, _("Transparency")) lxBoxSizer->Add( new wxSlider(lxPanel, lxSS_WALLS_OPACITY, 50, 0, 100, wxDefaultPosition, wxDefaultSize), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, lxBORDER); this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Surface lxBoxSizer = this->m_controlSizer_Surface = new wxBoxSizer(wxVERTICAL); ADDCB(lxSS_SRF_TRANSPARENCY, _("Transparency")) lxBoxSizer->Add( new wxSlider(lxPanel, lxSS_SRF_OPACITY, 50, 0, 100, wxDefaultPosition, wxDefaultSize), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, lxBORDER); ADDCB(lxSS_SRF_TEXTURE, _("Texture")) ADDCB(lxSS_SRF_LIGHTING, _("Lighting")) // ADDCB(wxID_ANY, _("Fit to underground")) this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Labels lxBoxSizer = this->m_controlSizer_Labels = new wxBoxSizer(wxVERTICAL); ADDST(wxID_ANY, _("Marked stations")); ADDCB(lxSS_CLNVIS_ENTRANCE, _("Entrances")) ADDCB(lxSS_CLNVIS_FIX, _("Fixed stations")) ADDCB(lxSS_CLNVIS_STATION, _("All")) lxBoxSizer->Add(new wxStaticLine(lxPanel, wxID_ANY), 0, wxBOTTOM | wxEXPAND, lxBORDER); ADDST(wxID_ANY, _("Labels")) ADDCB(lxSS_STLABEL_COMMENT, _("Comment")) ADDCB(lxSS_STLABEL_NAME, _("Name")) ADDCB(lxSS_STLABEL_SURVEY, _("Survey")) ADDCB(lxSS_STLABEL_ALTITUDE, _("Altitude")) // lxBoxSizer->Add(new wxStaticLine(lxPanel, wxID_ANY), 0, wxBOTTOM | wxEXPAND, lxBORDER); // // ADDST(wxID_ANY, _("Other labels")) // ADDCB(wxID_ANY, _("Survey names")) // ADDCB(wxID_ANY, _("Map labels")) // ADDCB(wxID_ANY, _("Map remarks")) // this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // BBox & Grid // // lxBoxSizer = this->m_controlSizer_BBox2Grid = new wxBoxSizer(wxVERTICAL); // // ADDST(wxID_ANY, _("Bounding box size")) // // wxBoxSizer * bs2; // bs2 = new wxBoxSizer(wxHORIZONTAL); // // bs2->Add( // new wxStaticText(lxPanel, wxID_ANY, _T("Overlap (%)")), // 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, lxBORDER); // bs2->Add( // new wxSpinCtrl(lxPanel, 3332, _T("5"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 100, 5)); // lxSETWWIDTH(3332, 2); // lxBoxSizer->Add(bs2, 0, wxBOTTOM | wxALIGN_LEFT, lxBORDER); // // ADDCB(wxID_ANY, _("Fit bbox to grid")) // lxBoxSizer->Add(new wxStaticLine(lxPanel, wxID_ANY), 0, wxBOTTOM | wxEXPAND, lxBORDER); // ADDST(wxID_ANY, _("Grid labels")) // ADDCB(wxID_ANY, _("Altitude")) // ADDCB(wxID_ANY, _("XY coordinates")) // // this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); // updateCtrlMinSize; ///////////////////////////////////////////////////////// // Indicators lxBoxSizer = this->m_controlSizer_Indicators = new wxBoxSizer(wxVERTICAL); ADDST(wxID_ANY, _("Project title")) lxBoxSizer->Add( new wxTextCtrl(lxPanel, lxSS_IND_PNAME), 0, wxALIGN_CENTER_VERTICAL | wxEXPAND | wxBOTTOM, lxBORDER); this->m_controlSizer->Add(lxBoxSizer, 1, wxEXPAND); updateCtrlMinSize; ///////////////////////////////////////////////////////// // Color setup // lxBoxSizer = this->m_controlSizer_ColorSetup = new wxBoxSizer(wxVERTICAL); // lxFlexGridSizer = new wxFlexGridSizer(2); ///////////////////////////////////////////////////////// // end of tools this->m_controlSizer->Layout(); wxCommandEvent cmdEvent; cmdEvent.SetInt(0); this->m_controlSizer->SetMinSize(ctrlMinSize); this->OnControlSelect(cmdEvent); sizerTop->Add(ctrlLBox, 0, wxALL | wxEXPAND, lxBORDER); lxBoxSizer = new wxBoxSizer(wxVERTICAL); lxBoxSizer->Add( this->m_controlSizer, 1, wxEXPAND, lxBORDER); lxBoxSizer->Add( new wxButton(lxPanel, wxID_CLOSE, _("Close")), 0, wxALIGN_RIGHT); sizerTop->Add(lxBoxSizer, 1, wxALL | wxEXPAND, lxBORDER); lxPanel->SetSizer(sizerTop); sizerTop->Fit(lxPanel); sizerFrame->Add(lxPanel, 1, wxEXPAND | wxALL); this->SetSizer(sizerFrame); sizerFrame->SetSizeHints(this); sizerFrame->Fit(this); } void lxModelSetupDlg::InitSetup() { lxFTextCtrl(lxSS_IND_PNAME)->SetValue(this->m_mainFrame->data->title); } void lxModelSetupDlg::LoadSetup() { lxSetup * stp = this->m_mainFrame->setup; lxFCheckBox(lxSS_VIS_CENTERLINE)->SetValue(stp->m_vis_centerline); lxFCheckBox(lxSS_VIS_WALLS)->SetValue(stp->m_vis_walls); lxFCheckBox(lxSS_VIS_SURFACE)->SetValue(stp->m_vis_surface); // lxFCheckBox(lxSS_VIS_LABELS)->SetValue(stp->m_vis_labels); lxFCheckBox(lxSS_VIS_BBOX)->SetValue(stp->m_vis_bbox); // lxFCheckBox(lxSS_VIS_GRID)->SetValue(stp->m_vis_grid); lxFCheckBox(lxSS_VIS_INDICATORS)->SetValue(stp->m_vis_indicators); lxFCheckBox(lxSS_CLNVIS_CAVE)->SetValue(stp->m_vis_centerline_cave); lxFCheckBox(lxSS_CLNVIS_SURFACE)->SetValue(stp->m_vis_centerline_surface); lxFCheckBox(lxSS_CLNVIS_SPLAY)->SetValue(stp->m_vis_centerline_splay); lxFCheckBox(lxSS_CLNVIS_DUPLICATE)->SetValue(stp->m_vis_centerline_duplicate); lxFCheckBox(lxSS_CLNVIS_FIX)->SetValue(stp->m_vis_centerline_fix); lxFCheckBox(lxSS_CLNVIS_ENTRANCE)->SetValue(stp->m_vis_centerline_entrance); lxFCheckBox(lxSS_CLNVIS_STATION)->SetValue(stp->m_vis_centerline_station); lxFRadioBtn(lxSS_COLORMD_ALTITUDE)->SetValue(stp->m_colormd == lxSETUP_COLORMD_ALTITUDE); lxFRadioBtn(lxSS_COLORMD_DEFAULT)->SetValue(stp->m_colormd == lxSETUP_COLORMD_DEFAULT); lxFCheckBox(lxSS_COLORAPP_CENTERLINE)->SetValue(stp->m_colormd_app_centerline); lxFCheckBox(lxSS_COLORAPP_WALLS)->SetValue(stp->m_colormd_app_walls); lxFCheckBox(lxSS_STLABEL_ALTITUDE)->SetValue(stp->m_stlabel_altitude); lxFCheckBox(lxSS_STLABEL_NAME)->SetValue(stp->m_stlabel_name); lxFCheckBox(lxSS_STLABEL_SURVEY)->SetValue(stp->m_stlabel_survey); lxFCheckBox(lxSS_STLABEL_COMMENT)->SetValue(stp->m_stlabel_comment); lxFCheckBox(lxSS_SRF_TRANSPARENCY)->SetValue(stp->m_srf_transparency); lxFCheckBox(lxSS_SRF_TEXTURE)->SetValue(stp->m_srf_texture); lxFCheckBox(lxSS_SRF_LIGHTING)->SetValue(stp->m_srf_lighting); lxFSlider(lxSS_SRF_OPACITY)->SetValue(100 - int(stp->m_srf_opacity * 100.0)); lxFCheckBox(lxSS_WALLS_TRANSPARENCY)->SetValue(stp->m_walls_transparency); lxFSlider(lxSS_WALLS_OPACITY)->SetValue(100 - int(stp->m_walls_opacity * 100.0)); } therion/loch/makeconfig.pl0000664000175000017500000000146610251676250014646 0ustar useruser# read make file open(MF,"Makefile"); @mflines = ; close(MF); # backup makefile open(MFB,">Makefile~"); print MFB @mflines; close(MFB); open(MF,">Makefile"); $insidecfg = 0; $insideprm = 0; $config = $ARGV[0]; $param = $ARGV[1]; foreach $ln (@mflines) { if ($ln =~ /^\s*\#\s*$config\s+CONFIG\s*$/) { $insidecfg = 1; } if ($ln =~ /^\s*\#\s*$config\s+ENDCONFIG\s*$/) { $insidecfg = 0; } if ($insidecfg && ($ln =~ /^\s*\#\s*$config\s+$param\s*$/)) { $insideprm = 1; } elsif ($insidecfg && ($ln =~ /^\s*\#\s*$config\s+\S+\s*$/)) { $insideprm = 0; } if ($ln =~ /\S/) { if ($insidecfg) { if ($insideprm) { $ln =~ s/^\s*\#\#//; } else { if ($ln =~ /^\s*[^\#]/) { $ln = "##$ln"; } } } } print MF $ln; } close(MF); therion/loch/lxImgIO.h0000664000175000017500000000143310537464734013672 0ustar useruser#ifndef lxImgIO_h #define lxImgIO_h // Standard libraries #ifndef LXDEPCHECK #include #include #endif //LXDEPCHECK - standart libraries #ifndef UCHAR #define UCHAR typedef unsigned char uchar; #endif extern char * lxImgIOError; // struct for handling images struct lxImageRGB { uchar* data; //pixel data in RGB format. sizeof(data) == 3 * width * height; int width, height; lxImageRGB() : data(NULL), width(0), height(0) {} }; /* Compress image into JPEG, and save it to disk quality must be in range 0-100 */ bool lxWrite_JPEG_file (const char * filename, int quality, lxImageRGB img); /* Load and decompress JPEG image from disk */ lxImageRGB lxRead_JPEG_file (const char * filename, FILE * infile = NULL); void lxImageRGBFree(lxImageRGB & img); #endif therion/loch/lxLRUD.cxx0000664000175000017500000005323611577054400014045 0ustar useruser#include "lxLRUD.h" // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #endif //LXDEPCHECK - standart libraries static const double lxVecPrec = 0.01; long lxLRUDData::GetStationID(lxVec pos, bool insert) { std::map::iterator smi; smi = this->station_map.find(pos); if (smi == this->station_map.end()) { if (insert) { this->station_map[pos] = this->nstations; nstations++; return (this->nstations - 1); } else { return -1; } } else { return smi->second; } } void lxLRUD::SetVThreshold(double vt) { this->i.currentVT = vt; } void lxLRUD::SetProfile(int sec_type) { this->i.currentProfile = sec_type; } void lxLRUD::InsertShot(double * from, double * to, double * fromLRUD, double * toLRUD, void * usrData) { lxLRUDShot shot; shot.fl = fromLRUD[0]; shot.fr = fromLRUD[1]; shot.fu = fromLRUD[2]; shot.fd = fromLRUD[3]; shot.tl = toLRUD[0]; shot.tr = toLRUD[1]; shot.tu = toLRUD[2]; shot.td = toLRUD[3]; shot.vthresh = this->i.currentVT; shot.profile = this->i.currentProfile; shot.from = lxVec(from[0], from[1], from[2]); shot.to = lxVec(to[0], to[1], to[2]); shot.xfrom = this->i.GetStationID(shot.from, true); shot.xto = this->i.GetStationID(shot.to, true); shot.usr_data = usrData; this->i.shots.insert(this->i.shots.end(), shot); } struct xcEdge { size_t fx, tx; lxLRUDShot * shot; lxVec dir; bool used; xcEdge() : fx(0), tx(0), shot(NULL), used(false) {} }; struct xcNodeArrow { xcEdge * edge; bool orient; xcNodeArrow() : edge(NULL), orient(true) {} xcNodeArrow(xcEdge * e, bool o) : edge(e), orient(o) {} lxVec GetDir(); size_t GetFX(); double GetFU(); double GetFD(); double GetFL(); double GetFR(); size_t GetTX(); double GetTU(); double GetTD(); double GetTL(); double GetTR(); }; lxVec xcNodeArrow::GetDir() { return (this->orient ? 1.0 : -1.0) * this->edge->dir; } size_t xcNodeArrow::GetFX() { return (this->orient ? this->edge->fx : this->edge->tx); } size_t xcNodeArrow::GetTX() { return (this->orient ? this->edge->tx : this->edge->fx); } #define xcNAGet(d,e,f) double xcNodeArrow::Get##d() { \ return (this->orient ? lxMax(this->edge->shot->e, lxVecPrec) : lxMax(this->edge->shot->f, lxVecPrec)); \ } xcNAGet(TU,tu,fu) xcNAGet(TD,td,fd) xcNAGet(TL,tl,fr) xcNAGet(TR,tr,fl) xcNAGet(FU,fu,tu) xcNAGet(FD,fd,td) xcNAGet(FL,fl,tr) xcNAGet(FR,fr,tl) struct xcNode { size_t id; lxVec p; std::list arrows; }; struct xcSeriesStart { double prob; xcNodeArrow arrow; }; bool operator < (const xcSeriesStart & s, const xcSeriesStart & t) { return s.prob < t.prob; } enum { LXPE_FLAT, LXPE_ROUND, LXPE_CONT, }; struct xcSeriesArrow { xcNodeArrow arrow; xcSeriesArrow * next, * prev; int fType, tType, fXMin, tXMin; lxVec f, t, ft, sDir, uDir, rDir, fDir, nfDir, tDir, ntDir; double fDist, tDist; lxTriGeomPoint fp[9], tp[9], nfp[9], ntp[9]; lxPlane fPlane, tPlane, nfPlane, ntPlane; xcSeriesArrow() : next(NULL), prev(NULL) {} }; void lxLRUD::Calculate() { // TODO - more sophisticated LRUD modelling :) std::list::iterator shi; lxVec shotDir, uDir, rDir; double pX[8], pY[8]; int prevProfile, i; prevProfile = -1; double ca, ci; // 1. traverse all shots and create a list of nodes size_t csx, cex, nedg, cnx, nnod; std::map stMap; std::map::iterator stMapIter; nedg = this->i.shots.size(); nnod = 0; if (nedg == 0) return; xcEdge * edges = new xcEdge [nedg], * cedge; for(csx = 0, shi = this->i.shots.begin(); shi != this->i.shots.end(); shi++) { cedge = &(edges[csx]); cedge->shot = &(*shi); stMapIter = stMap.find(shi->from); if (stMapIter == stMap.end()) { cedge->fx = nnod; stMap[shi->from] = nnod++; } else { cedge->fx = stMapIter->second; } stMapIter = stMap.find(shi->to); if (stMapIter == stMap.end()) { cedge->tx = nnod; stMap[shi->to] = nnod++; } else { cedge->tx = stMapIter->second; } if (cedge->fx != cedge->tx) csx++; else nedg--; } if (nedg == 0) { delete [] edges; return; } xcNode * nodes = new xcNode [nnod], * cnode; for(stMapIter = stMap.begin(); stMapIter != stMap.end(); stMapIter++) { nodes[stMapIter->second].id = stMapIter->second; nodes[stMapIter->second].p = stMapIter->first; } // 2. for each node, create a list of edges (with edge orientation) for(cex = 0; cex < nedg; cex++) { cedge = &(edges[cex]); cedge->dir = nodes[cedge->tx].p - nodes[cedge->fx].p; cedge->dir.Normalize(); nodes[cedge->fx].arrows.push_back(xcNodeArrow(cedge, true)); nodes[cedge->tx].arrows.push_back(xcNodeArrow(cedge, false)); } // 3. calculate series starting arrow probabilities std::vector sstarts; size_t narrows; xcSeriesStart sstart; std::list::iterator nait; for (cnx = 0; cnx < nnod; cnx++) { cnode = &(nodes[cnx]); narrows = cnode->arrows.size(); for (nait = cnode->arrows.begin(); nait != cnode->arrows.end(); nait++) { sstart.arrow = *nait; sstart.prob = ((narrows % 2 == 0) ? 1.0 : -1.0) / double (narrows); sstarts.push_back(sstart); } } std::sort(sstarts.begin(), sstarts.end()); // 4. create series bool nextarrow = true; xcSeriesArrow sarrow; xcNodeArrow parrow, narrow; xcNode * lastN; std::list series; std::list::iterator si; xcSeriesArrow * psi; std::vector::iterator ssi; sarrow.arrow = sstarts[0].arrow; sarrow.arrow.edge->used = true; series.push_back(sarrow); parrow = sarrow.arrow; while (nextarrow) { // find next arrow from parrow nextarrow = false; lastN = &(nodes[parrow.GetTX()]); for(nait = lastN->arrows.begin(); nait != lastN->arrows.end(); nait++) { if (!nait->edge->used) { if (nextarrow) { if ((nait->GetDir() * parrow.GetDir()) > (narrow.GetDir() * parrow.GetDir())) { narrow = *nait; } } else { nextarrow = true; narrow = *nait; } } } // if not found, find new start arrow if (!nextarrow) { for(ssi = sstarts.begin(); ssi != sstarts.end(); ssi++) { if (!ssi->arrow.edge->used) { narrow = ssi->arrow; nextarrow = true; break; } } } // add new series item if (nextarrow) { narrow.edge->used = true; sarrow.arrow = narrow; series.push_back(sarrow); } parrow = narrow; } xcSeriesArrow * first, * prev; first = NULL; prev = NULL; for(si = series.begin(); si != series.end(); si++) { if (prev != NULL) { if (si->arrow.GetFX() == prev->arrow.GetTX()) { si->prev = prev; prev->next = &(*si); } else { if ((first != NULL) && (first->arrow.GetFX() == prev->arrow.GetTX())) { prev->next = first; first->prev = prev; } first = NULL; } } prev = &(*si); if (first == NULL) first = prev; } if ((first != NULL) && (first->arrow.GetFX() == prev->arrow.GetTX())) { prev->next = first; first->prev = prev; } for(si = series.begin(); si != series.end(); si++) { si->fType = LXPE_CONT; si->tType = LXPE_CONT; if (si->prev == NULL) { if (nodes[si->arrow.GetFX()].arrows.size() == 1) { si->fType = LXPE_FLAT; } else { si->fType = LXPE_ROUND; } } if (si->next == NULL) { if (nodes[si->arrow.GetTX()].arrows.size() == 1) { si->tType = LXPE_FLAT; } else { si->tType = LXPE_ROUND; } } } for(si = series.begin(); si != series.end(); si++) { psi = &(*si); #define pXY(i,x,y) pX[i] = x; pY[i] = y; //if (shi->profile != prevProfile) { if (psi->arrow.edge->shot->profile != prevProfile) { switch (psi->arrow.edge->shot->profile) { case LXLRUD_TUNNEL: pXY(0,0.0,1.0) pXY(1,0.5,0.75) pXY(2,0.8,0.0) pXY(3,1.0,-1.0) pXY(4,0.0,-1.0) pXY(5,-1.0,-1.0) pXY(6,-0.8,0.0) pXY(7,-0.5,0.75) break; case LXLRUD_DIAMOND: pXY(0,0.0,1.0) pXY(1,0.5,0.5) pXY(2,1.0,0.0) pXY(3,0.5,-0.5) pXY(4,0.0,-1.0) pXY(5,-0.5,-0.5) pXY(6,-1.0,0.0) pXY(7,-0.5,0.5) break; case LXLRUD_SQUARE: pXY(0,0.0,1.0) pXY(1,1.0,1.0) pXY(2,1.0,0.0) pXY(3,1.0,-1.0) pXY(4,0.0,-1.0) pXY(5,-1.0,-1.0) pXY(6,-1.0,0.0) pXY(7,-1.0,1.0) break; default: pXY(0,0.0,1.0) pXY(1,0.707,0.707) pXY(2,1.0,0.0) pXY(3,0.707,-0.707) pXY(4,0.0,-1.0) pXY(5,-0.707,-0.707) pXY(6,-1.0,0.0) pXY(7,-0.707,0.707) break; } } prevProfile = psi->arrow.edge->shot->profile; shotDir = nodes[si->arrow.GetTX()].p - nodes[si->arrow.GetFX()].p; rDir = lxVec(shotDir.y, -shotDir.x, 0.0); if (rDir.Norm() == 0.0) { rDir = lxVec(1.0, 0.0, 0.0); uDir = lxVec(0.0, (shotDir.z < 0 ? 1.0 : -1.0), 0.0); } else { rDir.Normalize(); ci = shotDir.Inclination(); if (fabs(ci) < si->arrow.edge->shot->vthresh) uDir = lxVec(0.0, 0.0, 1.0); else { uDir = lxVec(0.0, 1.0, 0.0); ca = shotDir.Azimuth(); uDir = lxPol2Vec(1.0, (ci >= 0.0 ? ca + 180.0 : ca), (ci >= 0.0 ? 90 - ci : 90 + ci)); } } si->uDir = uDir; si->rDir = rDir; si->sDir = uDir ^ rDir; si->sDir.Normalize(); si->f = nodes[si->arrow.GetFX()].p; si->t = nodes[si->arrow.GetTX()].p; si->ft = si->t - si->f; si->tDir = si->sDir; si->fDir = si->sDir; si->fPlane.Init(si->f, si->fDir); si->tPlane.Init(si->t, si->tDir); si->fXMin = -1; si->tXMin = -1; si->fDist = -1.0; si->tDist = -1.0; for(i = 0; i < 8; i++) { si->fp[i].p = si->f + pX[i] * (pX[i] > 0 ? si->arrow.GetFR() : si->arrow.GetFL()) * rDir + pY[i] * (pY[i] > 0 ? si->arrow.GetFU() : si->arrow.GetFD()) * uDir; si->tp[i].p = si->t + pX[i] * (pX[i] > 0 ? si->arrow.GetTR() : si->arrow.GetTL()) * rDir + pY[i] * (pY[i] > 0 ? si->arrow.GetTU() : si->arrow.GetTD()) * uDir; } } // spocitajme fDir a tDir, fPlane a tPlane for(si = series.begin(); si != series.end(); si++) { psi = &(*si); if (si->next != NULL) { si->tDir = si->sDir + si->next->sDir; if (si->tDir.Norm() < 1E-6) { if (si->tType == LXPE_CONT) { si->tType = LXPE_ROUND; si->next->fType = LXPE_ROUND; } } else { si->tDir.Normalize(); si->next->fDir = si->tDir; si->tPlane.Init(si->t, si->tDir); si->next->fPlane = si->tPlane; } } } // spocitajme body na fPlane a tPlane lxVec ffp[8], ttp[8], nsDir; lxPlane sPlane; double sDistMax(0.0), sDistMin(0.0), sDistCur; int sXMax(0), sXMin(0); bool allOK; for(si = series.begin(); si != series.end(); si++) { psi = &(*si); // spocitajme tPlane allOK = true; sPlane.Init(si->t, si->sDir); for(i = 0; i < 8; i++) { allOK = allOK && (si->tPlane.CalcIntersection(si->fp[i], si->tp[i], ttp[i])); sDistCur = sPlane.CalcPosition(ttp[i]); if (i == 0) { sDistMax = sDistCur; sXMax = 0; sDistMin = sDistCur; sXMin = 0; } else { if (sDistCur > sDistMax) { sDistMax = sDistCur; sXMax = i; } if (sDistCur < sDistMin) { sDistMin = sDistCur; sXMin = i; } } } if (sXMin != sXMax) { nsDir = ttp[sXMin] - si->tp[sXMax]; if (nsDir.Norm() > 0) nsDir.Normalize(); else allOK = false; si->ntDir = nsDir ^ si->tDir; si->ntDir = nsDir ^ si->ntDir; if ((si->ntDir * si->sDir) < 0) si->ntDir *= -1.0; else if ((si->ntDir * si->sDir) == 0.0) allOK = false; si->ntDir.Normalize(); } else { si->ntDir = si->sDir; } si->ntPlane.Init(ttp[sXMin], si->ntDir); for(i = 0; i < 8; i++) { allOK = allOK && si->ntPlane.CalcIntersection(si->fp[i], si->tp[i], si->ntp[i]); } if (si->tType == LXPE_CONT) { si->tXMin = sXMin; si->tDist = (si->tp[7 - sXMin].p - si->t).Length(); if (!allOK) { si->tType = LXPE_ROUND; } } // spocitajme fPlane allOK = true; sPlane.Init(si->f, si->sDir); for(i = 0; i < 8; i++) { allOK = allOK && (si->fPlane.CalcIntersection(si->tp[i], si->fp[i], ffp[i])); sDistCur = sPlane.CalcPosition(ffp[i]); if (i == 0) { sDistMax = sDistCur; sXMax = 0; sDistMin = sDistCur; sXMin = 0; } else { if (sDistCur > sDistMax) { sDistMax = sDistCur; sXMax = i; } if (sDistCur < sDistMin) { sDistMin = sDistCur; sXMin = i; } } } if (sXMax != sXMin) { nsDir = ffp[sXMax] - si->fp[sXMin]; if (nsDir.Norm() > 0) nsDir.Normalize(); else allOK = false; si->nfDir = nsDir ^ si->fDir; si->nfDir = nsDir ^ si->nfDir; if ((si->nfDir * si->sDir) < 0) si->nfDir *= -1.0; else if ((si->nfDir * si->sDir) == 0.0) allOK = false; si->nfDir.Normalize(); } else { si->nfDir = si->sDir; } si->nfPlane.Init(ffp[sXMax], si->nfDir); for(i = 0; i < 8; i++) { allOK = allOK && si->nfPlane.CalcIntersection(si->tp[i], si->fp[i], si->nfp[i]); } if (si->fType == LXPE_CONT) { si->fXMin = sXMax; si->fDist = (si->fp[7 - sXMax].p - si->f).Length(); if (!allOK) { si->fType = LXPE_ROUND; } } } for(si = series.begin(); si != series.end(); si++) { psi = &(*si); if ((si->fType == LXPE_ROUND) && (si->prev != NULL)) { si->prev->tType = LXPE_ROUND; } if ((si->tType == LXPE_ROUND) && (si->next != NULL)) { si->next->fType = LXPE_ROUND; } } for(si = series.begin(); si != series.end(); si++) { // teraz nastavime body tak, ako ich mame vo vystupe allOK = false; while (((si->tType == LXPE_CONT) || (si->fType == LXPE_CONT)) && (!allOK)) { // 1. Nastavime body for(i = 0; i < 8; i++) { if (si->fType == LXPE_CONT) ffp[i] = si->nfp[i]; else ffp[i] = si->fp[i]; if (si->tType == LXPE_CONT) ttp[i] = si->ntp[i]; else ttp[i] = si->tp[i]; } // 2. Skontrolujeme ci sedia smery a to, ci body nelezia mimo // koncovych rovin allOK = true; for (i = 0; i < 8; i++) { if (((ttp[i] - ffp[i]) * si->ft) < 0.0) { allOK = false; break; } } if (!allOK) { if ((si->fType == LXPE_CONT) && (si->tType == LXPE_CONT)) { if ((si->sDir * si->nfDir) < (si->sDir * si->ntDir)) { si->fType = LXPE_ROUND; si->prev->tType = LXPE_ROUND; } else { si->tType = LXPE_ROUND; si->next->fType = LXPE_ROUND; } } else if (si->fType == LXPE_CONT) { si->fType = LXPE_ROUND; si->prev->tType = LXPE_ROUND; } else if (si->tType == LXPE_CONT) { si->tType = LXPE_ROUND; si->next->fType = LXPE_ROUND; } } } // koniec checkovania } // calculate points for(si = series.begin(); si != series.end(); si++) { psi = &(*si); if (si->tType == LXPE_CONT) { for(i = 0; i < 8; i++) { si->tp[i] = si->ntp[i]; } } if (si->fType == LXPE_CONT) { for(i = 0; i < 8; i++) { si->fp[i] = si->nfp[i]; } } } // if points are too close to each other, reduce geometry double avDist; int ti, fi; for(si = series.begin(); si != series.end(); si++) { if (si->tType == LXPE_CONT) { for(i = 0; i < 8; i++) { ti = (i + si->tXMin) % 8; fi = (i + si->next->fXMin) % 8; avDist = (si->tp[ti].p - si->tp[(ti + 7) % 8].p).Length() + (si->tp[ti].p - si->tp[(ti + 1) % 8].p).Length(); avDist += (si->next->fp[fi].p - si->next->fp[(fi + 7) % 8].p).Length() + (si->next->fp[fi].p - si->next->fp[(fi + 1) % 8].p).Length(); avDist *= 0.25; if ((avDist > 0.0) && ((si->next->fp[fi].p - si->tp[ti].p).Length() / avDist < 0.25)) { si->tp[ti].p = 0.5 * (si->next->fp[fi].p + si->tp[ti].p); si->next->fp[fi].p = si->tp[ti].p; } } } } // calculate normals for(si = series.begin(); si != series.end(); si++) { psi = &(*si); for(i = 0; i < 8; i++) { si->tp[i].n = lxCalcNormal4(si->tp[(i + 1) % 8].p, si->fp[i].p, si->tp[(i + 7) % 8].p, si->tp[i].p); si->fp[i].n = lxCalcNormal4(si->fp[(i + 7) % 8].p, si->tp[i].p, si->fp[(i + 1) % 8].p, si->fp[i].p); } } lxVec nnorm; for(si = series.begin(); si != series.end(); si++) { psi = &(*si); if (si->tType == LXPE_CONT) { for(i = 0; i < 8; i++) { ti = (i + si->tXMin) % 8; fi = (i + si->next->fXMin) % 8; nnorm = si->tp[i].n + si->next->fp[i].n; nnorm.Normalize(); si->tp[i].n = nnorm; si->next->fp[i].n = nnorm; } } } // insert geometry // COUNTER NEEDED lxTriGeom so; for(si = series.begin(); si != series.end(); si++) { psi = &(*si); if (si->fType != LXPE_CONT) { this->o.Append(&so); so.Clear(); } si->fp[8].p = lxVec(0.0, 0.0, 0.0); si->tp[8].p = lxVec(0.0, 0.0, 0.0); for(i = 0; i < 8; i++) { si->fp[8].p += si->fp[i]; si->tp[8].p += si->tp[i]; } si->fp[8].p *= 0.125; si->fp[8].n = -1.0 * si->sDir; si->tp[8].p *= 0.125; si->tp[8].n = si->sDir; double dl; lxTriGeomPoint ddt, ddp[8]; double diam; switch (si->tType) { case LXPE_ROUND: //if (si->tDist <= 0.0) { diam = (si->tp[0].p - si->tp[8].p).Length(); for(i = 1; i < 8; i++) { dl = (si->tp[i].p - si->tp[8].p).Length(); if (diam > dl) diam = dl; } //} else { // diam = si->tDist; //} ddt = si->tp[8].p + diam * si->sDir; ddt.n = si->tp[8].n; for (i = 0; i < 8; i++) { ddp[i] = si->tp[8] + 0.70710678 * (si->tp[i] - si->tp[8]) + 0.70710678 * diam * si->sDir; } for (i = 0; i < 8; i++) { nnorm = lxCalcNormal4(si->tp[(i + 7) % 8].p, ddp[i].p, si->tp[(i + 1) % 8].p, si->tp[i].p); nnorm += si->tp[i].n; nnorm.Normalize(); si->tp[i].n = nnorm; ddp[i].n = lxCalcNormal5(ddp[(i+1) % 8], si->tp[i], ddp[(i+7) % 8], ddt, ddp[i]); } for (i = 0; i < 8; i++) { so.Insert3Angle(ddt, ddp[i], ddp[(i + 1) % 8]); so.Insert4Angle(ddp[i], si->tp[i], ddp[(i + 1) % 8], si->tp[(i + 1) % 8]); } break; case LXPE_FLAT: for(i = 0; i < 8; i++) { ddp[i].p = si->tp[i].p; ddp[i].n = si->tp[8].n; } for(i = 0; i < 8; i++) { so.Insert3Angle(si->tp[8], ddp[i], ddp[(i + 1) % 8]); } break; } switch (si->fType) { case LXPE_ROUND: //if (si->fDist <= 0.0) { diam = (si->fp[0].p - si->fp[8].p).Length(); for(i = 1; i < 8; i++) { dl = (si->fp[i].p - si->fp[8].p).Length(); if (diam > dl) diam = dl; } //} else { // diam = si->fDist; //} ddt = si->fp[8].p - diam * si->sDir; ddt.n = si->fp[8].n; for (i = 0; i < 8; i++) { ddp[i].n = ddp[i].p - si->fp[8].p; ddp[i].n.Normalize(); } for (i = 0; i < 8; i++) { ddp[i] = si->fp[8] + 0.70710678 * (si->fp[i] - si->fp[8]) - 0.70710678 * diam * si->sDir; } for (i = 0; i < 8; i++) { nnorm = lxCalcNormal4(si->fp[(i + 1) % 8].p, ddp[i].p, si->fp[(i + 7) % 8].p, si->fp[i].p); nnorm += si->fp[i].n; nnorm.Normalize(); si->fp[i].n = nnorm; ddp[i].n = lxCalcNormal5(ddp[(i+1) % 8], ddt, ddp[(i+7) % 8], si->fp[i], ddp[i]); } for (i = 0; i < 8; i++) { so.Insert3Angle(ddt, ddp[(i + 1) % 8], ddp[i]); so.Insert4Angle(si->fp[i], ddp[i], si->fp[(i + 1) % 8], ddp[(i + 1) % 8]); } break; case LXPE_FLAT: for(i = 0; i < 8; i++) { ddp[i].p = si->fp[i].p; ddp[i].n = si->fp[8].n; } for(i = 0; i < 8; i++) { so.Insert3Angle(si->fp[8], ddp[(i + 1) % 8], ddp[i]); } break; } if (si->tType == LXPE_CONT) { for(i = 0; i < 8; i++) { ti = (i + si->tXMin) % 8; fi = (i + si->next->fXMin) % 8; so.Insert4Angle(si->next->fp[fi], si->tp[ti], si->next->fp[(fi + 1) % 8], si->tp[(ti + 1) % 8]); } } for(i = 0; i < 8; i++) { so.Insert4Angle(si->tp[i], si->fp[i], si->tp[(i + 1) % 8], si->fp[(i + 1) % 8]); } } this->o.Append(&so); delete [] edges; delete [] nodes; //size_t nT = this->o.GetNTriangles(); //size_t nP = this->o.GetNPoints(); } long lxLRUD::GetPointsN() { return long(this->o.GetNPoints()); } void lxLRUD::GetPoint(long idx, double * coord, double * norm) { lxTriGeomPoint pt = this->o.GetPoint(idx); coord[0] = pt.p.x; coord[1] = pt.p.y; coord[2] = pt.p.z; norm[0] = pt.n.x; norm[1] = pt.n.y; norm[2] = pt.n.z; } long lxLRUD::GetTrianglesN() { return long(this->o.GetNTriangles()); } void lxLRUD::GetTriangle(long idx, long * vertices) { lxTriGeom3Angle tg = this->o.GetTriangle(idx); vertices[0] = long(tg.v1); vertices[1] = long(tg.v2); vertices[2] = long(tg.v3); } therion/loch/locale/0000775000175000017500000000000012426430420013427 5ustar userusertherion/loch/locale/sk/0000775000175000017500000000000012426431401014044 5ustar userusertherion/loch/locale/sk/loch.mo0000664000175000017500000002131610645416266015346 0ustar useruserÞ•Ÿß ˆ ‰ ‘ ˜   ¦ ­ ± » Á É Ù â è î ô û , CNU\cjpv{‘ ±¼ŒÃP Y f q ~!ˆª ±¾Å Ì×íó  2H _l … ’ž®ÁÇ)à0 ; JW` f q}  ª ¸ Ä Ð Ûéý#9O b o| „Ž –¢ ¨³Gà # (2; C P^ eqx‡ ›¼Óîþ(:LUet†Œ ’ ž ª¶ÈØ è õ $, 4 ?L lx  —¢¨¼ÍÝ ðü   ' 2> E P [g ƒh‘ú #29 A NZckry œ¦¿ Ýêñù þ 1$5Zb›h) 2 ?(Iry‹”š£ »Å Ö ä!ñ-CTdsƒ›­³'Ï*÷" 5AQ YfvŠ¡²ÆÚ ë÷ -BXrŒ¢ ºÈËÔ ä ï û M-{•ž§°¸ÀÐá ø 4Um€—®´Éá ù  + A H O _ q ‚ – ¦ ¹ Ç Ô ç î !! !! *!K!T!k! s!!‡! ›!©!Â!Ù!é!""$"="Q"Z"m"†"#š"¾"WzN0<`  G;KXD_žCŽj=“‡&tawFY‘oZi+M]~c.V™'‚*|:$PH”s8 (?Bn’5@^ƒŸ˜Qœ9‰7,†‹L uElJhpTR x-![)ˆ3›m4/r61O–kAf>bvš%gd…\y"{ŒqU 2e#—ŠSI}•€„ Camera Scene%+03d°%.14e%03d°%ld&About...&Bugs&Camera&Contents... F1&Control&East&File&Help&North&Open... Ctrl+O&Options...&Plan&Reload Ctrl+R&Render to file Ctrl+P&Rendering&Reset&Scene&South&Tools&View&West(mm)00 x 00 (00.0 MB)1 :3D visualization tool for cavesAbout LochActionAll supported files (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch files (*.lox)|*.lox|Compass PLT files (*.plt)|*.plt|Survex 3D files (*.3d)|*.3dAltitudeAltitude (m)Applies toBounding boxBrowse...Building 3D model, please wait...CameraCamera setupCancelCenterCenterlineCenterline visibilityCloseColor channelsColor modeDefaultDefault data files directoryDefault stereo colorsDisable color texturesDistance (m)Do not extrapolate wallsE&xit Ctrl+QEasting (m)Enable rotationEnable stereo modeErrorError reading input fileExtrapolate all missing walls informationExtrapolate only files without walls informationEye separationFacing (deg)Fit zoomFocusFocus (mm)Full screenFull screen F11General optionsImage heightImage optionsImage size:Image widthIndicatorsLock rotationLock rotation speedLower viewpoint UpMove down Shift+UpMove left Shift+RightMove right Shift+LeftMove up Shift+DownNo file openNorthing (m)OKOpenOpen fileOptionsOrientationOrthoOrthogonalOrthogonal viewPDF files (*.pdf)|*.pdf|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmpPPM files (*.ppm)|*.ppmPlanPlan viewPro&fileProfileProfile viewProject titleReloadReload fileRenderRender to fileRendering &setup...Rendering (%d x %d, %.1f MB) ...Rendering at %.1f fps.Rendering resolution (dpi)Rendering setupRendering to bitmapResetReset viewpointRotate left RightRotate right LeftRotationRotation centerRotation speedSave rendering asScaleSceneScene itemsScene setupScreen shotShow bounding boxShow centerlineShow indicatorsShow surfaceShow wallsSize and scalingStereoStereo modeSurfaceTextureTilt (deg)TransparencyUnable to open file for output.UndergroundUpper viewpoint DownVersion: VisibilityWallsWalls extrapolationWhite backgroundZoom in Ctrl+UpZoom out Ctrl+DownZoom to fitZoom to fit Spaceblue & redblue & yellowcyan & redgreen & rednonamered & bluered & cyanred & greenremember last used channelsyellow & blueProject-Id-Version: Loch POT-Creation-Date: PO-Revision-Date: 2007-07-12 09:21+0100 Last-Translator: aa Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Slovak X-Poedit-Country: SLOVAKIA X-Poedit-SourceCharset: iso-8859-1 X-Poedit-Basepath: ../.. X-Poedit-SearchPath-0: . Kamera Scéna%+03d°%.14e%03d°%ldO &programe...&Chyby&Kamera&Obsah... F1O&vládanie&Východ&SúborPo&moc&Sever&OtvoriÅ¥... Ctrl+O&Nastavenia...&Pôdorys&Znovu naÄítaÅ¥ Ctrl+R&RendrovaÅ¥ do súboru Ctrl+P&Rendrovanie&Reset&Scéna&Juh&Nástroje&Pohľad&Západ(mm)00 x 00 (00.0 MB)1 :Program na 3D vizualizáciu jaskýňO LochuAkciaVÅ¡etky podporované súbory (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch súbory (*.lox)|*.lox|Compass PLT súbory (*.plt)|*.plt|Survex 3D súbory (*.3d)|*.3dNadmorská výškaNadm. výška (m)Týka saOhraniÄenieNájdi...Spracúvam 3D model, prosím Äakajte...KameraNastavenie kameryZruÅ¡iÅ¥StredPolygónViditeľnosÅ¥ polygónuZatvoriÅ¥Farebné kanályFarebný módÅ tandardnéŠtandardný adresár so súbormiÅ tandardné stereo farbyÄŒiernobiele textúryVzdialenosÅ¥ (m)NeextrapolovaÅ¥&Koniec Ctrl+QX - východ (m)Automatické otáÄanieStereo zobrazenieChybaChyba pri Äítaní súboruExtrapolovaÅ¥ vÅ¡etky chýbajúce stenyExtrapolovaÅ¥ len súbory úplne bez stienVzdialenosÅ¥ oÄíAzimut (st)Optimálny zoomOhniskoOhnisko (mm)Celá obrazovkaCelá obrazovka F11VÅ¡eobecné nastaveniaVýška obrázkuNastavenia obrázkuVeľkosÅ¥ obrázku:Šírka obrázkuIndikátoryZamknúť otáÄanieUzamknúť rýchlosÅ¥ otáÄaniaZmenÅ¡iÅ¥ sklon HorePosun dolu Shift+HorePosun vľavo Shift+VpravoPosun vpravo Shift+VľavoPosun hore Shift+DoleNie je otvorený súborY - sever (m)OKOtvoriÅ¥OtvoriÅ¥ súborNastaveniaOrientáciaOrtogonálneOrtogonálneOrtogonálne zobrazeniePDF súbory (*.pdf)|*.pdf|PNG súbory (*.png)|*.png|BMP súbory (*.bmp)|*.bmpPPM súbory (*.ppm)|*.ppmPôdorysPôdorysBoko&rysBokorysBokorysNázov projektuZnovu naÄítaÅ¥Znovu naÄíaÅ¥ súborRendrovaÅ¥RendrovaÅ¥ do súboruNa&stavenie rendrovania...Rendrujem (%d x %d, %.1f MB) ...Rendrovanie (%.1f fps).Rozlíšenie (dpi)Nastavenie rendrovaniaRendrovanie do súboruResetÅ tandardný pohľadOtoÄiÅ¥ doľava VpravoOtoÄiÅ¥ doprava VľavoOtáÄanieStred otáÄaniaRýchlosÅ¥ otáÄaniaUložiÅ¥ obrázok akoMierkaScénaPoložky scényNastavenie scényKópia obrazovkyZobraz ohraniÄenieZobraz polygónZobraz indikátoryZobraz povrchZobraz stenyVeľkosÅ¥ a mierkaStereoStereo zobrazeniePovrchTextúrySklon (st)PriehľadnosÅ¥Nemôžem zapisovaÅ¥ do súboru.PodzemieZväÄÅ¡iÅ¥ sklon DoleVerzia:ViditeľnosÅ¥StenyExtrapolácia stienBiele pozadieZväÄÅ¡i zoom Ctrl+HoreZmenÅ¡i zoom Ctrl+DoleOptimálny zoomOptimálny zoom Medzeramodrá & Äervenámodrá & žltázelenomodrá & Äervenázelená & Äervenábez menaÄervená & modráÄervená & zelenomodráÄervená & zelenápamätaÅ¥ naposledy použité farbyžltá & modrátherion/loch/locale/sk/loch.po0000664000175000017500000004632610645416266015361 0ustar userusermsgid "" msgstr "" "Project-Id-Version: Loch\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2007-07-12 09:21+0100\n" "Last-Translator: aa \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Slovak\n" "X-Poedit-Country: SLOVAKIA\n" "X-Poedit-SourceCharset: iso-8859-1\n" "X-Poedit-Basepath: ../..\n" "X-Poedit-SearchPath-0: .\n" # C:/Projects/MSVCProjects/loch/lxAboutDlg.cxx:53 #: lxAboutDlg.cxx:54 msgid "About Loch" msgstr "O Lochu" # C:/Projects/MSVCProjects/loch/lxAboutDlg.cxx:76 #: lxAboutDlg.cxx:77 msgid "3D visualization tool for caves" msgstr "Program na 3D vizualizáciu jaskýň" # C:/Projects/MSVCProjects/loch/lxAboutDlg.cxx:78 #: lxAboutDlg.cxx:79 msgid "Version: " msgstr "Verzia:" #: lxData.cxx:84 msgid "No file open" msgstr "Nie je otvorený súbor" # c:/cave/loch/loch/lxGLCs.cxx:381 #: lxGLCs.cxx:412 #, c-format msgid "Rendering at %.1f fps." msgstr "Rendrovanie (%.1f fps)." # c:/cave/loch/loch/lxGLCx.cxx:542 #: lxGLCx.cxx:605 #, c-format msgid "%03d°" msgstr "%03d°" # c:/cave/loch/loch/lxGLCx.cxx:633 #: lxGLCx.cxx:696 #, c-format msgid "%+03d°" msgstr "%+03d°" # c:/cave/loch/loch/lxSScene.cxx:222 # c:/cave/loch/loch/lxSScene.cxx:324 #: lxGLCx.cxx:736 #: lxSScene.cxx:273 msgid "Altitude" msgstr "Nadmorská výška" # c:/cave/loch/loch/lxGUI.cxx:94 #: lxGUI.cxx:155 msgid "noname" msgstr "bez mena" # c:/cave/loch/loch/lxGUI.cxx:98 # c:/cave/loch/loch/lxGUI.cxx:354 #: lxGUI.cxx:206 #: lxGUI.cxx:575 msgid "Open" msgstr "OtvoriÅ¥" # c:/cave/loch/loch/lxGUI.cxx:98 #: lxGUI.cxx:206 msgid "Open file" msgstr "OtvoriÅ¥ súbor" # c:/cave/loch/loch/lxGUI.cxx:99 #: lxGUI.cxx:207 msgid "Reload" msgstr "Znovu naÄítaÅ¥" # c:/cave/loch/loch/lxGUI.cxx:99 #: lxGUI.cxx:207 msgid "Reload file" msgstr "Znovu naÄíaÅ¥ súbor" # c:/cave/loch/loch/lxGUI.cxx:100 #: lxGUI.cxx:209 msgid "Render" msgstr "RendrovaÅ¥" # c:/cave/loch/loch/lxGUI.cxx:100 #: lxGUI.cxx:209 msgid "Render to file" msgstr "RendrovaÅ¥ do súboru" # c:/cave/loch/loch/lxPrint.cxx:291 # c:/cave/loch/loch/lxRender.cxx:237 #: lxGUI.cxx:210 #: lxRender.cxx:236 msgid "Rendering setup" msgstr "Nastavenie rendrovania" # c:/cave/loch/loch/lxGUI.cxx:102 # c:/cave/loch/loch/lxGUI.cxx:152 # c:/cave/loch/loch/lxSView.cxx:257 #: lxGUI.cxx:212 #: lxGUI.cxx:275 #: lxGUI.cxx:283 #: lxSView.cxx:262 msgid "Rotation" msgstr "OtáÄanie" # c:/cave/loch/loch/lxGUI.cxx:103 # c:/cave/loch/loch/lxGUI.cxx:153 # c:/cave/loch/loch/lxSView.cxx:400 # c:/cave/loch/loch/lxSView.cxx:526 #: lxGUI.cxx:213 #: lxGUI.cxx:276 #: lxGUI.cxx:284 #: lxSView.cxx:405 #: lxSView.cxx:532 msgid "Lock rotation" msgstr "Zamknúť otáÄanie" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:217 #: lxGUI.cxx:214 msgid "Ortho" msgstr "Ortogonálne" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:217 # C:/Projects/MSVCProjects/loch/lxSView.cxx:380 #: lxGUI.cxx:214 #: lxSView.cxx:380 msgid "Orthogonal view" msgstr "Ortogonálne zobrazenie" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:218 #: lxGUI.cxx:215 msgid "Stereo" msgstr "Stereo" # c:/cave/loch/loch/lxGUI.cxx:107 # c:/cave/loch/loch/lxSView.cxx:258 #: lxGUI.cxx:215 #: lxSView.cxx:263 msgid "Stereo mode" msgstr "Stereo zobrazenie" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:220 #: lxGUI.cxx:217 msgid "Plan" msgstr "Pôdorys" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:220 #: lxGUI.cxx:217 msgid "Plan view" msgstr "Pôdorys" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:221 #: lxGUI.cxx:218 msgid "Profile" msgstr "Bokorys" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:221 #: lxGUI.cxx:218 msgid "Profile view" msgstr "Bokorys" # c:/cave/loch/loch/lxGUI.cxx:104 #: lxGUI.cxx:219 msgid "Fit zoom" msgstr "Optimálny zoom" # c:/cave/loch/loch/lxGUI.cxx:104 #: lxGUI.cxx:219 msgid "Zoom to fit" msgstr "Optimálny zoom" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:223 #: lxGUI.cxx:220 msgid "Reset" msgstr "Reset" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:223 #: lxGUI.cxx:220 msgid "Reset viewpoint" msgstr "Å tandardný pohľad" # c:/cave/loch/loch/lxSScene.cxx:169 # c:/cave/loch/loch/lxSScene.cxx:200 # c:/cave/loch/loch/lxSScene.cxx:231 # c:/cave/loch/loch/lxSScene.cxx:362 #: lxGUI.cxx:222 #: lxSScene.cxx:218 #: lxSScene.cxx:249 #: lxSScene.cxx:286 msgid "Centerline" msgstr "Polygón" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:225 #: lxGUI.cxx:222 msgid "Show centerline" msgstr "Zobraz polygón" # c:/cave/loch/loch/lxSScene.cxx:170 # c:/cave/loch/loch/lxSScene.cxx:201 # c:/cave/loch/loch/lxSScene.cxx:232 # c:/cave/loch/loch/lxSScene.cxx:363 #: lxGUI.cxx:223 #: lxSScene.cxx:219 #: lxSScene.cxx:250 #: lxSScene.cxx:287 msgid "Walls" msgstr "Steny" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:226 #: lxGUI.cxx:223 msgid "Show walls" msgstr "Zobraz steny" # c:/cave/loch/loch/lxSScene.cxx:171 # c:/cave/loch/loch/lxSScene.cxx:202 # c:/cave/loch/loch/lxSScene.cxx:233 # c:/cave/loch/loch/lxSScene.cxx:245 # c:/cave/loch/loch/lxSScene.cxx:364 #: lxGUI.cxx:224 #: lxSScene.cxx:220 #: lxSScene.cxx:251 #: lxSScene.cxx:300 msgid "Surface" msgstr "Povrch" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:227 #: lxGUI.cxx:224 msgid "Show surface" msgstr "Zobraz povrch" # c:/cave/loch/loch/lxSScene.cxx:204 # c:/cave/loch/loch/lxSScene.cxx:365 #: lxGUI.cxx:225 #: lxSScene.cxx:253 msgid "Bounding box" msgstr "OhraniÄenie" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:228 #: lxGUI.cxx:225 msgid "Show bounding box" msgstr "Zobraz ohraniÄenie" # c:/cave/loch/loch/lxSScene.cxx:174 #: lxGUI.cxx:226 #: lxSScene.cxx:223 #: lxSScene.cxx:255 msgid "Indicators" msgstr "Indikátory" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:229 #: lxGUI.cxx:226 msgid "Show indicators" msgstr "Zobraz indikátory" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:231 #: lxGUI.cxx:228 msgid "Camera setup" msgstr "Nastavenie kamery" # c:/cave/loch/loch/lxGUI.cxx:110 #: lxGUI.cxx:229 msgid "Scene setup" msgstr "Nastavenie scény" # c:/cave/loch/loch/lxGUI.cxx:112 #: lxGUI.cxx:231 msgid "Full screen" msgstr "Celá obrazovka" # c:/cave/loch/loch/lxGUI.cxx:117 #: lxGUI.cxx:236 msgid "&Open...\tCtrl+O" msgstr "&OtvoriÅ¥...\tCtrl+O" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:240 #: lxGUI.cxx:237 msgid "&Reload\tCtrl+R" msgstr "&Znovu naÄítaÅ¥\tCtrl+R" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:242 #: lxGUI.cxx:239 msgid "&Render to file\tCtrl+P" msgstr "&RendrovaÅ¥ do súboru\tCtrl+P" # c:/cave/loch/loch/lxGUI.cxx:121 #: lxGUI.cxx:240 msgid "Rendering &setup..." msgstr "Na&stavenie rendrovania..." # C:/Projects/MSVCProjects/loch/lxGUI.cxx:245 #: lxGUI.cxx:242 msgid "E&xit\tCtrl+Q" msgstr "&Koniec\tCtrl+Q" # c:/cave/loch/loch/lxGUI.cxx:126 #: lxGUI.cxx:247 msgid "Rotate left\tRight" msgstr "OtoÄiÅ¥ doľava\tVpravo" # c:/cave/loch/loch/lxGUI.cxx:127 #: lxGUI.cxx:248 msgid "Rotate right\tLeft" msgstr "OtoÄiÅ¥ doprava\tVľavo" # c:/cave/loch/loch/lxGUI.cxx:129 #: lxGUI.cxx:250 msgid "Upper viewpoint\tDown" msgstr "ZväÄÅ¡iÅ¥ sklon\tDole" # c:/cave/loch/loch/lxGUI.cxx:130 #: lxGUI.cxx:251 msgid "Lower viewpoint\tUp" msgstr "ZmenÅ¡iÅ¥ sklon\tHore" # c:/cave/loch/loch/lxGUI.cxx:132 #: lxGUI.cxx:253 msgid "Move up\tShift+Down" msgstr "Posun hore\tShift+Dole" # c:/cave/loch/loch/lxGUI.cxx:133 #: lxGUI.cxx:254 msgid "Move down\tShift+Up" msgstr "Posun dolu\tShift+Hore" # c:/cave/loch/loch/lxGUI.cxx:134 #: lxGUI.cxx:255 msgid "Move left\tShift+Right" msgstr "Posun vľavo\tShift+Vpravo" # c:/cave/loch/loch/lxGUI.cxx:135 #: lxGUI.cxx:256 msgid "Move right\tShift+Left" msgstr "Posun vpravo\tShift+Vľavo" # c:/cave/loch/loch/lxGUI.cxx:137 #: lxGUI.cxx:258 msgid "Zoom in\tCtrl+Up" msgstr "ZväÄÅ¡i zoom\tCtrl+Hore" # c:/cave/loch/loch/lxGUI.cxx:138 #: lxGUI.cxx:259 msgid "Zoom out\tCtrl+Down" msgstr "ZmenÅ¡i zoom\tCtrl+Dole" # c:/cave/loch/loch/lxGUI.cxx:139 #: lxGUI.cxx:260 msgid "Zoom to fit\tSpace" msgstr "Optimálny zoom\tMedzera" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:266 #: lxGUI.cxx:263 msgid "&Plan" msgstr "&Pôdorys" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:267 #: lxGUI.cxx:264 msgid "Pro&file" msgstr "Boko&rys" # c:/cave/loch/loch/lxGUI.cxx:144 #: lxGUI.cxx:266 msgid "&North" msgstr "&Sever" # c:/cave/loch/loch/lxGUI.cxx:145 #: lxGUI.cxx:267 msgid "&West" msgstr "&Západ" # c:/cave/loch/loch/lxGUI.cxx:146 #: lxGUI.cxx:268 msgid "&East" msgstr "&Východ" # c:/cave/loch/loch/lxGUI.cxx:147 #: lxGUI.cxx:269 msgid "&South" msgstr "&Juh" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:274 #: lxGUI.cxx:271 msgid "&Reset" msgstr "&Reset" # c:/cave/loch/loch/lxSView.cxx:256 #: lxGUI.cxx:278 msgid "Camera" msgstr "Kamera" # c:/cave/loch/loch/lxGUI.cxx:161 #: lxGUI.cxx:279 msgid "Scene" msgstr "Scéna" # c:/cave/loch/loch/lxGUI.cxx:151 #: lxGUI.cxx:282 msgid "Action" msgstr "Akcia" # c:/cave/loch/loch/lxSView.cxx:254 #: lxGUI.cxx:285 #: lxSView.cxx:259 msgid "Orientation" msgstr "Orientácia" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:289 #: lxGUI.cxx:286 msgid "Orthogonal" msgstr "Ortogonálne" # c:/cave/loch/loch/lxGUI.cxx:157 #: lxGUI.cxx:288 msgid "Full screen\tF11" msgstr "Celá obrazovka\tF11" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:294 #: lxGUI.cxx:291 msgid "&Camera" msgstr "&Kamera" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:295 #: lxGUI.cxx:292 msgid "&Scene" msgstr "&Scéna" # c:/cave/loch/loch/lxGUI.cxx:117 #: lxGUI.cxx:294 msgid "&Options..." msgstr "&Nastavenia..." # C:/Projects/MSVCProjects/loch/lxGUI.cxx:300 #: lxGUI.cxx:297 msgid "&Contents...\tF1" msgstr "&Obsah...\tF1" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:301 #: lxGUI.cxx:298 msgid "&Control" msgstr "O&vládanie" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:302 #: lxGUI.cxx:299 msgid "&Rendering" msgstr "&Rendrovanie" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:303 #: lxGUI.cxx:300 msgid "&Bugs" msgstr "&Chyby" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:305 #: lxGUI.cxx:302 msgid "&About..." msgstr "O &programe..." # c:/cave/loch/loch/lxGUI.cxx:165 #: lxGUI.cxx:305 msgid "&File" msgstr "&Súbor" # c:/cave/loch/loch/lxGUI.cxx:166 #: lxGUI.cxx:306 msgid "&View" msgstr "&Pohľad" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:310 #: lxGUI.cxx:307 msgid "&Tools" msgstr "&Nástroje" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:311 #: lxGUI.cxx:308 msgid "&Help" msgstr "Po&moc" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:581 #: lxGUI.cxx:578 msgid "All supported files (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch files (*.lox)|*.lox|Compass PLT files (*.plt)|*.plt|Survex 3D files (*.3d)|*.3d" msgstr "VÅ¡etky podporované súbory (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch súbory (*.lox)|*.lox|Compass PLT súbory (*.plt)|*.plt|Survex 3D súbory (*.3d)|*.3d" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:870 #: lxGUI.cxx:867 msgid "Building 3D model, please wait..." msgstr "Spracúvam 3D model, prosím Äakajte..." # C:/Projects/MSVCProjects/loch/lxGUI.cxx:899 #: lxGUI.cxx:896 msgid "Error reading input file" msgstr "Chyba pri Äítaní súboru" # c:/cave/loch/loch/lxData.cxx:360 # c:/cave/loch/loch/lxPrint.cxx:466 # c:/cave/loch/loch/lxPrint.cxx:995 # c:/cave/loch/loch/lxRender.cxx:655 #: lxGUI.cxx:896 #: lxRender.cxx:664 msgid "Error" msgstr "Chyba" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:43 #: lxOptDlg.cxx:43 msgid "Options" msgstr "Nastavenia" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:50 #: lxOptDlg.cxx:50 msgid "General options" msgstr "VÅ¡eobecné nastavenia" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:54 #: lxOptDlg.cxx:54 msgid "Default data files directory" msgstr "Å tandardný adresár so súbormi" # c:/cave/loch/loch/lxPrint.cxx:349 #: lxOptDlg.cxx:60 msgid "Browse..." msgstr "Nájdi..." # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:65 #: lxOptDlg.cxx:64 msgid "Default stereo colors" msgstr "Å tandardné stereo farby" # c:/cave/loch/loch/lxSView.cxx:430 #: lxOptDlg.cxx:68 #: lxSView.cxx:435 msgid "red & cyan" msgstr "Äervená & zelenomodrá" # c:/cave/loch/loch/lxSView.cxx:431 #: lxOptDlg.cxx:69 #: lxSView.cxx:436 msgid "red & green" msgstr "Äervená & zelená" # c:/cave/loch/loch/lxSView.cxx:432 #: lxOptDlg.cxx:70 #: lxSView.cxx:437 msgid "red & blue" msgstr "Äervená & modrá" # c:/cave/loch/loch/lxSView.cxx:433 #: lxOptDlg.cxx:71 #: lxSView.cxx:438 msgid "yellow & blue" msgstr "žltá & modrá" # c:/cave/loch/loch/lxSView.cxx:434 #: lxOptDlg.cxx:72 #: lxSView.cxx:439 msgid "cyan & red" msgstr "zelenomodrá & Äervená" # c:/cave/loch/loch/lxSView.cxx:435 #: lxOptDlg.cxx:73 #: lxSView.cxx:440 msgid "green & red" msgstr "zelená & Äervená" # c:/cave/loch/loch/lxSView.cxx:436 #: lxOptDlg.cxx:74 #: lxSView.cxx:441 msgid "blue & red" msgstr "modrá & Äervená" # c:/cave/loch/loch/lxSView.cxx:437 #: lxOptDlg.cxx:75 #: lxSView.cxx:442 msgid "blue & yellow" msgstr "modrá & žltá" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:77 #: lxOptDlg.cxx:76 msgid "remember last used channels" msgstr "pamätaÅ¥ naposledy použité farby" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:85 #: lxOptDlg.cxx:84 msgid "Walls extrapolation" msgstr "Extrapolácia stien" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:89 #: lxOptDlg.cxx:88 msgid "Do not extrapolate walls" msgstr "NeextrapolovaÅ¥" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:92 #: lxOptDlg.cxx:91 msgid "Extrapolate only files without walls information" msgstr "ExtrapolovaÅ¥ len súbory úplne bez stien" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:95 #: lxOptDlg.cxx:94 msgid "Extrapolate all missing walls information" msgstr "ExtrapolovaÅ¥ vÅ¡etky chýbajúce steny" # c:/cave/loch/loch/lxPrint.cxx:387 # c:/cave/loch/loch/lxRender.cxx:322 #: lxOptDlg.cxx:102 #: lxRender.cxx:321 msgid "OK" msgstr "OK" # c:/cave/loch/loch/lxPrint.cxx:388 # c:/cave/loch/loch/lxPrint.cxx:775 # c:/cave/loch/loch/lxRender.cxx:323 #: lxOptDlg.cxx:103 #: lxRender.cxx:322 msgid "Cancel" msgstr "ZruÅ¡iÅ¥" # c:/cave/loch/loch/lxRender.cxx:247 #: lxRender.cxx:246 msgid "Size and scaling" msgstr "VeľkosÅ¥ a mierka" # c:/cave/loch/loch/lxRender.cxx:251 #: lxRender.cxx:250 msgid "Screen shot" msgstr "Kópia obrazovky" # c:/cave/loch/loch/lxRender.cxx:257 #: lxRender.cxx:256 msgid "Image width" msgstr "Šírka obrázku" # c:/cave/loch/loch/lxRender.cxx:260 # c:/cave/loch/loch/lxRender.cxx:271 #: lxRender.cxx:259 #: lxRender.cxx:270 msgid "(mm)" msgstr "(mm)" # c:/cave/loch/loch/lxRender.cxx:268 #: lxRender.cxx:267 msgid "Image height" msgstr "Výška obrázku" # c:/cave/loch/loch/lxRender.cxx:279 #: lxRender.cxx:278 msgid "Scale" msgstr "Mierka" # c:/cave/loch/loch/lxRender.cxx:282 #: lxRender.cxx:281 msgid "1 :" msgstr "1 :" # c:/cave/loch/loch/lxRender.cxx:293 #: lxRender.cxx:292 msgid "Image options" msgstr "Nastavenia obrázku" # c:/cave/loch/loch/lxPrint.cxx:302 # c:/cave/loch/loch/lxRender.cxx:297 #: lxRender.cxx:296 msgid "Rendering resolution (dpi)" msgstr "Rozlíšenie (dpi)" # c:/cave/loch/loch/lxRender.cxx:307 #: lxRender.cxx:306 msgid "Image size:" msgstr "VeľkosÅ¥ obrázku:" # c:/cave/loch/loch/lxRender.cxx:310 #: lxRender.cxx:309 msgid "00 x 00 (00.0 MB)" msgstr "00 x 00 (00.0 MB)" # c:/cave/loch/loch/lxPrint.cxx:295 # c:/cave/loch/loch/lxRender.cxx:315 #: lxRender.cxx:314 msgid "White background" msgstr "Biele pozadie" # c:/cave/loch/loch/lxRender.cxx:437 #: lxRender.cxx:436 msgid "Save rendering as" msgstr "UložiÅ¥ obrázok ako" # c:/cave/loch/loch/lxPrint.cxx:183 # c:/cave/loch/loch/lxRender.cxx:439 #: lxRender.cxx:438 msgid "PPM files (*.ppm)|*.ppm" msgstr "PPM súbory (*.ppm)|*.ppm" # c:/cave/loch/loch/lxRender.cxx:441 #: lxRender.cxx:440 msgid "PDF files (*.pdf)|*.pdf|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp" msgstr "PDF súbory (*.pdf)|*.pdf|PNG súbory (*.png)|*.png|BMP súbory (*.bmp)|*.bmp" # c:/cave/loch/loch/lxPrint.cxx:627 # c:/cave/loch/loch/lxPrint.cxx:647 # c:/cave/loch/loch/lxPrint.cxx:872 # c:/cave/loch/loch/lxPrint.cxx:892 # c:/cave/loch/loch/lxRender.cxx:455 #: lxRender.cxx:454 msgid "Unable to open file for output." msgstr "Nemôžem zapisovaÅ¥ do súboru." # c:/cave/loch/loch/lxPrint.cxx:921 # c:/cave/loch/loch/lxRender.cxx:493 #: lxRender.cxx:492 #, c-format msgid "Rendering (%d x %d, %.1f MB) ..." msgstr "Rendrujem (%d x %d, %.1f MB) ..." # c:/cave/loch/loch/lxRender.cxx:494 #: lxRender.cxx:493 msgid "Rendering to bitmap" msgstr "Rendrovanie do súboru" # c:/cave/loch/loch/lxSScene.cxx:147 #: lxSScene.cxx:196 msgid " Scene" msgstr " Scéna" # c:/cave/loch/loch/lxSScene.cxx:167 # c:/cave/loch/loch/lxSScene.cxx:335 #: lxSScene.cxx:216 msgid "Visibility" msgstr "ViditeľnosÅ¥" # c:/cave/loch/loch/lxSScene.cxx:168 #: lxSScene.cxx:217 #: lxSScene.cxx:271 msgid "Color mode" msgstr "Farebný mód" # c:/cave/loch/loch/lxSScene.cxx:199 #: lxSScene.cxx:248 msgid "Scene items" msgstr "Položky scény" # c:/cave/loch/loch/lxSScene.cxx:224 #: lxSScene.cxx:279 msgid "Default" msgstr "Å tandardné" # c:/cave/loch/loch/lxSScene.cxx:230 #: lxSScene.cxx:285 msgid "Applies to" msgstr "Týka sa" # c:/cave/loch/loch/lxSScene.cxx:243 #: lxSScene.cxx:298 msgid "Centerline visibility" msgstr "ViditeľnosÅ¥ polygónu" # c:/cave/loch/loch/lxSScene.cxx:244 #: lxSScene.cxx:299 msgid "Underground" msgstr "Podzemie" # c:/cave/loch/loch/lxSScene.cxx:265 # c:/cave/loch/loch/lxSScene.cxx:278 #: lxSScene.cxx:317 #: lxSScene.cxx:330 msgid "Transparency" msgstr "PriehľadnosÅ¥" # c:/cave/loch/loch/lxSScene.cxx:282 #: lxSScene.cxx:334 msgid "Texture" msgstr "Textúry" # C:/Projects/MSVCProjects/loch/lxSScene.cxx:398 #: lxSScene.cxx:392 msgid "Project title" msgstr "Názov projektu" # c:/cave/loch/loch/lxSScene.cxx:389 # c:/cave/loch/loch/lxSView.cxx:464 #: lxSScene.cxx:424 #: lxSView.cxx:470 msgid "Close" msgstr "ZatvoriÅ¥" # C:/Projects/MSVCProjects/loch/lxSView.cxx:228 #: lxSView.cxx:228 msgid " Camera" msgstr " Kamera" # c:/cave/loch/loch/lxSView.cxx:255 #: lxSView.cxx:260 msgid "Center" msgstr "Stred" # C:/Projects/MSVCProjects/loch/lxSView.cxx:261 #: lxSView.cxx:261 msgid "Focus" msgstr "Ohnisko" # c:/cave/loch/loch/lxSView.cxx:287 #: lxSView.cxx:292 msgid "Facing (deg)" msgstr "Azimut (st)" # c:/cave/loch/loch/lxSView.cxx:298 #: lxSView.cxx:303 msgid "Tilt (deg)" msgstr "Sklon (st)" # c:/cave/loch/loch/lxSView.cxx:323 #: lxSView.cxx:328 msgid "Rotation center" msgstr "Stred otáÄania" # c:/cave/loch/loch/lxSView.cxx:327 #: lxSView.cxx:332 msgid "Easting (m)" msgstr "X - východ (m)" # c:/cave/loch/loch/lxSView.cxx:335 #: lxSView.cxx:340 msgid "Northing (m)" msgstr "Y - sever (m)" # c:/cave/loch/loch/lxSView.cxx:343 #: lxSView.cxx:348 msgid "Altitude (m)" msgstr "Nadm. výška (m)" # c:/cave/loch/loch/lxSView.cxx:364 #: lxSView.cxx:369 msgid "Distance (m)" msgstr "VzdialenosÅ¥ (m)" # c:/cave/loch/loch/lxSView.cxx:379 #: lxSView.cxx:384 msgid "Focus (mm)" msgstr "Ohnisko (mm)" # c:/cave/loch/loch/lxSView.cxx:399 #: lxSView.cxx:404 msgid "Enable rotation" msgstr "Automatické otáÄanie" # c:/cave/loch/loch/lxSView.cxx:401 #: lxSView.cxx:406 msgid "Rotation speed" msgstr "RýchlosÅ¥ otáÄania" # c:/cave/loch/loch/lxSView.cxx:422 #: lxSView.cxx:427 msgid "Enable stereo mode" msgstr "Stereo zobrazenie" # c:/cave/loch/loch/lxSView.cxx:423 #: lxSView.cxx:428 msgid "Eye separation" msgstr "VzdialenosÅ¥ oÄí" # C:/Projects/MSVCProjects/loch/lxSView.cxx:445 #: lxSView.cxx:445 msgid "Disable color textures" msgstr "ÄŒiernobiele textúry" # c:/cave/loch/loch/lxSView.cxx:441 #: lxSView.cxx:447 msgid "Color channels" msgstr "Farebné kanály" # c:/cave/loch/loch/lxSView.cxx:524 #: lxSView.cxx:530 msgid "Lock rotation speed" msgstr "Uzamknúť rýchlosÅ¥ otáÄania" # c:/cave/loch/loch/lxWX.cxx:200 #: lxWX.cxx:200 #, c-format msgid "%ld" msgstr "%ld" # c:/cave/loch/loch/lxWX.cxx:206 #: lxWX.cxx:206 #, c-format msgid "%.14e" msgstr "%.14e" therion/loch/locale/bg/0000775000175000017500000000000012426431401014017 5ustar userusertherion/loch/locale/bg/loch.mo0000664000175000017500000002505611560730726015323 0ustar useruserÞ•Ÿß ˆ ‰ ‘ ˜   ¦ ­ ± » Á É Ù â è î ô û , CNU\cjpv{‘ ±¼ŒÃP Y f q ~!ˆª ±¾Å Ì×íó  2H _l … ’ž®ÁÇ)à0 ; JW` f q}  ª ¸ Ä Ð Ûéý#9O b o| „Ž –¢ ¨³Gà # (2; C P^ eqx‡ ›¼Óîþ(:LUet†Œ ’ ž ª¶ÈØ è õ $, 4 ?L lx  —¢¨¼ÍÝ ðü   ' 2> E P [g ƒˆ‘  '2:@GK i w…¡ ± ½ Ç Óß÷ (3\p ‚Ž” ¬ ºÆËÝCá %/Ä@#)H _j:| ·(Ä í ø &9H"b…)š0Ä0õ&.?n”#° Ô?ác!^…*ä+- Ydt†%œ"Â2å- F e 0z 5« #á -!/3!/c!-“!Á!á!ô! ÷!""-"B"Y"'p"P˜"é"# # # $# 1#>#Y#l#ˆ# ™#.º#)é#$42$*g$0’$Ã$!Ô$+ö$+"%N% _%"€%,£% Ð% Ý%è%&&.&M&i&!‡&%©&Ï&$ë& '%'C'X'i'‡'/ž'Î'#á' (( $(*/( Z(h(‡(+¦(/Ò())6)P) n)|)˜)²)EÐ)*WzN0<`  G;KXD_žCŽj=“‡&tawFY‘oZi+M]~c.V™'‚*|:$PH”s8 (?Bn’5@^ƒŸ˜Qœ9‰7,†‹L uElJhpTR x-![)ˆ3›m4/r61O–kAf>bvš%gd…\y"{ŒqU 2e#—ŠSI}•€„ Camera Scene%+03d°%.14e%03d°%ld&About...&Bugs&Camera&Contents... F1&Control&East&File&Help&North&Open... Ctrl+O&Options...&Plan&Reload Ctrl+R&Render to file Ctrl+P&Rendering&Reset&Scene&South&Tools&View&West(mm)00 x 00 (00.0 MB)1 :3D visualization tool for cavesAbout LochActionAll supported files (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch files (*.lox)|*.lox|Compass PLT files (*.plt)|*.plt|Survex 3D files (*.3d)|*.3dAltitudeAltitude (m)Applies toBounding boxBrowse...Building 3D model, please wait...CameraCamera setupCancelCenterCenterlineCenterline visibilityCloseColor channelsColor modeDefaultDefault data files directoryDefault stereo colorsDisable color texturesDistance (m)Do not extrapolate wallsE&xit Ctrl+QEasting (m)Enable rotationEnable stereo modeErrorError reading input fileExtrapolate all missing walls informationExtrapolate only files without walls informationEye separationFacing (deg)Fit zoomFocusFocus (mm)Full screenFull screen F11General optionsImage heightImage optionsImage size:Image widthIndicatorsLock rotationLock rotation speedLower viewpoint UpMove down Shift+UpMove left Shift+RightMove right Shift+LeftMove up Shift+DownNo file openNorthing (m)OKOpenOpen fileOptionsOrientationOrthoOrthogonalOrthogonal viewPDF files (*.pdf)|*.pdf|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmpPPM files (*.ppm)|*.ppmPlanPlan viewPro&fileProfileProfile viewProject titleReloadReload fileRenderRender to fileRendering &setup...Rendering (%d x %d, %.1f MB) ...Rendering at %.1f fps.Rendering resolution (dpi)Rendering setupRendering to bitmapResetReset viewpointRotate left RightRotate right LeftRotationRotation centerRotation speedSave rendering asScaleSceneScene itemsScene setupScreen shotShow bounding boxShow centerlineShow indicatorsShow surfaceShow wallsSize and scalingStereoStereo modeSurfaceTextureTilt (deg)TransparencyUnable to open file for output.UndergroundUpper viewpoint DownVersion: VisibilityWallsWalls extrapolationWhite backgroundZoom in Ctrl+UpZoom out Ctrl+DownZoom to fitZoom to fit Spaceblue & redblue & yellowcyan & redgreen & rednonamered & bluered & cyanred & greenremember last used channelsyellow & blueProject-Id-Version: Loch POT-Creation-Date: PO-Revision-Date: 2011-05-06 10:31+0100 Last-Translator: Language-Team: bulgarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Slovak X-Poedit-Country: SLOVAKIA X-Poedit-SourceCharset: iso-8859-1 X-Poedit-Basepath: ../.. Plural-Forms: и X-Poedit-SearchPath-0: . КамераСцена%+03d°%.14e%03d°%ldЗа &програмата...&Бъгове&Камера&Съдържание... F1&Контрол&Изток&ФайлПо&мощ&Север&Отвори... Ctrl+O&ÐаÑтройки...&План&Презареди Ctrl+R&Рендирай във файл Ctrl+P&Рендиране&Ðулиране&Сцена&Юг&ИнÑтрументи&Изглед&Запад(mm)00 x 00 (00.0 MB)1 :Програма за 3D Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° пещериЗа LochДейÑтвиеВÑички поддържани файлове (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch файлове (*.lox)|*.lox|Compass PLT файлове (*.plt)|*.plt|Survex 3D файлове (*.3d)|*.3dÐадморÑка виÑочинаÐадм. виÑочина (m)ОтнаÑÑ Ñе заРамкаПреглед...Създавам 3D model, молÑ, изчакайте...КамераÐаÑтройки на камератаОтказЦентърÐнтенаВидимоÑÑ‚ на антенатаЗатвориЦветни каналиРежим на цветоветеСтандартниСтандартна директориÑСтандартни Ñтерео цветовеИзключи цветните текÑтуриРазÑтоÑние (m)Ðе екÑтраполирай Ñтените&Изход Ctrl+QX - изток (m)Включи ротациÑСтерео изображениеГрешкаГрешка при четене на входниÑÑ‚ файлЕкÑтраполирай вÑичката липÑтваща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° ÑтениЕкÑтраполирай Ñамо файлове без Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° ÑтениРаздалеченоÑÑ‚ на очитеÐзимут (градуÑи)Оптимално приближаванеФокуÑÐ¤Ð¾ÐºÑƒÑ (mm)ЦÑл екранЦÑл екран F11Генерални наÑтройкиВиÑочина на ÑнимкаÐаÑтройки на изображениетоРазмер на изображението:Ширина на ÑнимкаИндикаториЗаключване на завъртанетоЗаключи ÑкороÑтта на ротациÑПоглед от долу ГореДвижение на долу Shift+ГореДвижение на лÑво Shift+ДÑÑноДвижение на дÑÑно Shift+ЛÑвоДвижение на горе Shift+ДолуÐе е отворен файлY - Ñевер (m)OKОтвориОтвори файлÐаÑтройкиОриентациÑОртогоналнаОртогоналнаОртогонална проекциÑPDF файл (*.pdf)|*.pdf|PNG файл (*.png)|*.png|BMP файл (*.bmp)|*.bmpPPM файл (*.ppm)|*.ppmПланПланПро&филПрофилПрофилИме на проектаПрезаредиПрезареди файлРендирайРендирай във файлÐа&Ñтройки на рендиране...Рендиране (%d x %d, %.1f MB) ...Рендиране (%.1f fps).Ð ÐµÐ·Ð¾Ð»ÑŽÑ†Ð¸Ñ Ð½Ð° рендирането (dpi)ÐаÑтройки на рендиранеРендиране към изображениеÐулиранеСтандартен изгледЗавъртане на лÑво ДÑÑноЗавъртане на дÑÑно ЛÑвоавъртанеЦентър на ротациÑСкороÑÑ‚ на ротациÑЗапиши рендираното катоРазмерСценаОбекти в ÑценатаÐаÑтройки на ÑценатаСнимка на екранаПокажи рамкатаПокажи антенатаПокажи индикаториПокажи повърхноÑттаПокажи ÑтенитеРазмер и мащабиранеСтереоСтерео изобразÑванеПОвърхноÑтТекÑтураÐаклон (градуÑи)ПрозрачноÑÑ‚ÐеуÑпех при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° файл.ПодземÑтаПоглед от горе ДолуВерÑиÑ:ВидимоÑтСтениЕкÑÐ¿Ñ€Ð°Ð¿Ð¾Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° ÑтениБÑл фонПриближи Ctrl+ГореОтдалечи Ctrl+ДолуОптимално приближаванеОптимално приближение SpaceÑиньо & червеноÑиньо & жълтоциÑн & червенозелено & червенобез имечервено & Ñиньочервено & циÑнчервено & зеленозапомни поÑледно използваните каналижълто & Ñиньоtherion/loch/locale/bg/loch.po0000664000175000017500000005215211560730726015323 0ustar useruser# # Alexander Yanev , 2011. # msgid "" msgstr "" "Project-Id-Version: Loch\n" "POT-Creation-Date: \n" "PO-Revision-Date: 2011-05-06 10:31+0100\n" "Last-Translator: \n" "Language-Team: bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Slovak\n" "X-Poedit-Country: SLOVAKIA\n" "X-Poedit-SourceCharset: iso-8859-1\n" "X-Poedit-Basepath: ../..\n" "Plural-Forms: и\n" "X-Poedit-SearchPath-0: .\n" # C:/Projects/MSVCProjects/loch/lxAboutDlg.cxx:53 #: lxAboutDlg.cxx:54 msgid "About Loch" msgstr "За Loch" # C:/Projects/MSVCProjects/loch/lxAboutDlg.cxx:76 #: lxAboutDlg.cxx:77 msgid "3D visualization tool for caves" msgstr "Програма за 3D Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° пещери" # C:/Projects/MSVCProjects/loch/lxAboutDlg.cxx:78 #: lxAboutDlg.cxx:79 msgid "Version: " msgstr "ВерÑиÑ:" #: lxData.cxx:84 msgid "No file open" msgstr "Ðе е отворен файл" # c:/cave/loch/loch/lxGLCs.cxx:381 #: lxGLCs.cxx:412 #, c-format msgid "Rendering at %.1f fps." msgstr "Рендиране (%.1f fps)." # c:/cave/loch/loch/lxGLCx.cxx:542 #: lxGLCx.cxx:605 #, c-format msgid "%03d°" msgstr "%03d°" # c:/cave/loch/loch/lxGLCx.cxx:633 #: lxGLCx.cxx:696 #, c-format msgid "%+03d°" msgstr "%+03d°" # c:/cave/loch/loch/lxSScene.cxx:222 # c:/cave/loch/loch/lxSScene.cxx:324 #: lxGLCx.cxx:736 #: lxSScene.cxx:273 msgid "Altitude" msgstr "ÐадморÑка виÑочина" # c:/cave/loch/loch/lxGUI.cxx:94 #: lxGUI.cxx:155 msgid "noname" msgstr "без име" # c:/cave/loch/loch/lxGUI.cxx:98 # c:/cave/loch/loch/lxGUI.cxx:354 #: lxGUI.cxx:206 #: lxGUI.cxx:575 msgid "Open" msgstr "Отвори" # c:/cave/loch/loch/lxGUI.cxx:98 #: lxGUI.cxx:206 msgid "Open file" msgstr "Отвори файл" # c:/cave/loch/loch/lxGUI.cxx:99 #: lxGUI.cxx:207 msgid "Reload" msgstr "Презареди" # c:/cave/loch/loch/lxGUI.cxx:99 #: lxGUI.cxx:207 msgid "Reload file" msgstr "Презареди файл" # c:/cave/loch/loch/lxGUI.cxx:100 #: lxGUI.cxx:209 msgid "Render" msgstr "Рендирай" # c:/cave/loch/loch/lxGUI.cxx:100 #: lxGUI.cxx:209 msgid "Render to file" msgstr "Рендирай във файл" # c:/cave/loch/loch/lxPrint.cxx:291 # c:/cave/loch/loch/lxRender.cxx:237 #: lxGUI.cxx:210 #: lxRender.cxx:236 msgid "Rendering setup" msgstr "ÐаÑтройки на рендиране" # c:/cave/loch/loch/lxGUI.cxx:102 # c:/cave/loch/loch/lxGUI.cxx:152 # c:/cave/loch/loch/lxSView.cxx:257 #: lxGUI.cxx:212 #: lxGUI.cxx:275 #: lxGUI.cxx:283 #: lxSView.cxx:262 msgid "Rotation" msgstr "авъртане" # c:/cave/loch/loch/lxGUI.cxx:103 # c:/cave/loch/loch/lxGUI.cxx:153 # c:/cave/loch/loch/lxSView.cxx:400 # c:/cave/loch/loch/lxSView.cxx:526 #: lxGUI.cxx:213 #: lxGUI.cxx:276 #: lxGUI.cxx:284 #: lxSView.cxx:405 #: lxSView.cxx:532 msgid "Lock rotation" msgstr "Заключване на завъртането" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:217 #: lxGUI.cxx:214 msgid "Ortho" msgstr "Ортогонална" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:217 # C:/Projects/MSVCProjects/loch/lxSView.cxx:380 #: lxGUI.cxx:214 #: lxSView.cxx:380 msgid "Orthogonal view" msgstr "Ортогонална проекциÑ" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:218 #: lxGUI.cxx:215 msgid "Stereo" msgstr "Стерео" # c:/cave/loch/loch/lxGUI.cxx:107 # c:/cave/loch/loch/lxSView.cxx:258 #: lxGUI.cxx:215 #: lxSView.cxx:263 msgid "Stereo mode" msgstr "Стерео изобразÑване" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:220 #: lxGUI.cxx:217 msgid "Plan" msgstr "План" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:220 #: lxGUI.cxx:217 msgid "Plan view" msgstr "План" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:221 #: lxGUI.cxx:218 msgid "Profile" msgstr "Профил" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:221 #: lxGUI.cxx:218 msgid "Profile view" msgstr "Профил" # c:/cave/loch/loch/lxGUI.cxx:104 #: lxGUI.cxx:219 msgid "Fit zoom" msgstr "Оптимално приближаване" # c:/cave/loch/loch/lxGUI.cxx:104 #: lxGUI.cxx:219 msgid "Zoom to fit" msgstr "Оптимално приближаване" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:223 #: lxGUI.cxx:220 msgid "Reset" msgstr "Ðулиране" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:223 #: lxGUI.cxx:220 msgid "Reset viewpoint" msgstr "Стандартен изглед" # c:/cave/loch/loch/lxSScene.cxx:169 # c:/cave/loch/loch/lxSScene.cxx:200 # c:/cave/loch/loch/lxSScene.cxx:231 # c:/cave/loch/loch/lxSScene.cxx:362 #: lxGUI.cxx:222 #: lxSScene.cxx:218 #: lxSScene.cxx:249 #: lxSScene.cxx:286 msgid "Centerline" msgstr "Ðнтена" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:225 #: lxGUI.cxx:222 msgid "Show centerline" msgstr "Покажи антената" # c:/cave/loch/loch/lxSScene.cxx:170 # c:/cave/loch/loch/lxSScene.cxx:201 # c:/cave/loch/loch/lxSScene.cxx:232 # c:/cave/loch/loch/lxSScene.cxx:363 #: lxGUI.cxx:223 #: lxSScene.cxx:219 #: lxSScene.cxx:250 #: lxSScene.cxx:287 msgid "Walls" msgstr "Стени" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:226 #: lxGUI.cxx:223 msgid "Show walls" msgstr "Покажи Ñтените" # c:/cave/loch/loch/lxSScene.cxx:171 # c:/cave/loch/loch/lxSScene.cxx:202 # c:/cave/loch/loch/lxSScene.cxx:233 # c:/cave/loch/loch/lxSScene.cxx:245 # c:/cave/loch/loch/lxSScene.cxx:364 #: lxGUI.cxx:224 #: lxSScene.cxx:220 #: lxSScene.cxx:251 #: lxSScene.cxx:300 msgid "Surface" msgstr "ПОвърхноÑÑ‚" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:227 #: lxGUI.cxx:224 msgid "Show surface" msgstr "Покажи повърхноÑтта" # c:/cave/loch/loch/lxSScene.cxx:204 # c:/cave/loch/loch/lxSScene.cxx:365 #: lxGUI.cxx:225 #: lxSScene.cxx:253 msgid "Bounding box" msgstr "Рамка" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:228 #: lxGUI.cxx:225 msgid "Show bounding box" msgstr "Покажи рамката" # c:/cave/loch/loch/lxSScene.cxx:174 #: lxGUI.cxx:226 #: lxSScene.cxx:223 #: lxSScene.cxx:255 msgid "Indicators" msgstr "Индикатори" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:229 #: lxGUI.cxx:226 msgid "Show indicators" msgstr "Покажи индикатори" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:231 #: lxGUI.cxx:228 msgid "Camera setup" msgstr "ÐаÑтройки на камерата" # c:/cave/loch/loch/lxGUI.cxx:110 #: lxGUI.cxx:229 msgid "Scene setup" msgstr "ÐаÑтройки на Ñцената" # c:/cave/loch/loch/lxGUI.cxx:112 #: lxGUI.cxx:231 msgid "Full screen" msgstr "ЦÑл екран" # c:/cave/loch/loch/lxGUI.cxx:117 #: lxGUI.cxx:236 msgid "&Open...\tCtrl+O" msgstr "&Отвори...\tCtrl+O" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:240 #: lxGUI.cxx:237 msgid "&Reload\tCtrl+R" msgstr "&Презареди\tCtrl+R" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:242 #: lxGUI.cxx:239 msgid "&Render to file\tCtrl+P" msgstr "&Рендирай във файл\tCtrl+P" # c:/cave/loch/loch/lxGUI.cxx:121 #: lxGUI.cxx:240 msgid "Rendering &setup..." msgstr "Ðа&Ñтройки на рендиране..." # C:/Projects/MSVCProjects/loch/lxGUI.cxx:245 #: lxGUI.cxx:242 msgid "E&xit\tCtrl+Q" msgstr "&Изход\tCtrl+Q" # c:/cave/loch/loch/lxGUI.cxx:126 #: lxGUI.cxx:247 msgid "Rotate left\tRight" msgstr "Завъртане на лÑво\tДÑÑно" # c:/cave/loch/loch/lxGUI.cxx:127 #: lxGUI.cxx:248 msgid "Rotate right\tLeft" msgstr "Завъртане на дÑÑно\tЛÑво" # c:/cave/loch/loch/lxGUI.cxx:129 #: lxGUI.cxx:250 msgid "Upper viewpoint\tDown" msgstr "Поглед от горе\tДолу" # c:/cave/loch/loch/lxGUI.cxx:130 #: lxGUI.cxx:251 msgid "Lower viewpoint\tUp" msgstr "Поглед от долу\tГоре" # c:/cave/loch/loch/lxGUI.cxx:132 #: lxGUI.cxx:253 msgid "Move up\tShift+Down" msgstr "Движение на горе\tShift+Долу" # c:/cave/loch/loch/lxGUI.cxx:133 #: lxGUI.cxx:254 msgid "Move down\tShift+Up" msgstr "Движение на долу\tShift+Горе" # c:/cave/loch/loch/lxGUI.cxx:134 #: lxGUI.cxx:255 msgid "Move left\tShift+Right" msgstr "Движение на лÑво\tShift+ДÑÑно" # c:/cave/loch/loch/lxGUI.cxx:135 #: lxGUI.cxx:256 msgid "Move right\tShift+Left" msgstr "Движение на дÑÑно\tShift+ЛÑво" # c:/cave/loch/loch/lxGUI.cxx:137 #: lxGUI.cxx:258 msgid "Zoom in\tCtrl+Up" msgstr "Приближи\tCtrl+Горе" # c:/cave/loch/loch/lxGUI.cxx:138 #: lxGUI.cxx:259 msgid "Zoom out\tCtrl+Down" msgstr "Отдалечи\tCtrl+Долу" # c:/cave/loch/loch/lxGUI.cxx:139 #: lxGUI.cxx:260 msgid "Zoom to fit\tSpace" msgstr "Оптимално приближение\tSpace" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:266 #: lxGUI.cxx:263 msgid "&Plan" msgstr "&План" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:267 #: lxGUI.cxx:264 msgid "Pro&file" msgstr "Про&фил" # c:/cave/loch/loch/lxGUI.cxx:144 #: lxGUI.cxx:266 msgid "&North" msgstr "&Север" # c:/cave/loch/loch/lxGUI.cxx:145 #: lxGUI.cxx:267 msgid "&West" msgstr "&Запад" # c:/cave/loch/loch/lxGUI.cxx:146 #: lxGUI.cxx:268 msgid "&East" msgstr "&Изток" # c:/cave/loch/loch/lxGUI.cxx:147 #: lxGUI.cxx:269 msgid "&South" msgstr "&Юг" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:274 #: lxGUI.cxx:271 msgid "&Reset" msgstr "&Ðулиране" # c:/cave/loch/loch/lxSView.cxx:256 #: lxGUI.cxx:278 msgid "Camera" msgstr "Камера" # c:/cave/loch/loch/lxGUI.cxx:161 #: lxGUI.cxx:279 msgid "Scene" msgstr "Сцена" # c:/cave/loch/loch/lxGUI.cxx:151 #: lxGUI.cxx:282 msgid "Action" msgstr "ДейÑтвие" # c:/cave/loch/loch/lxSView.cxx:254 #: lxGUI.cxx:285 #: lxSView.cxx:259 msgid "Orientation" msgstr "ОриентациÑ" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:289 #: lxGUI.cxx:286 msgid "Orthogonal" msgstr "Ортогонална" # c:/cave/loch/loch/lxGUI.cxx:157 #: lxGUI.cxx:288 msgid "Full screen\tF11" msgstr "ЦÑл екран\tF11" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:294 #: lxGUI.cxx:291 msgid "&Camera" msgstr "&Камера" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:295 #: lxGUI.cxx:292 msgid "&Scene" msgstr "&Сцена" # c:/cave/loch/loch/lxGUI.cxx:117 #: lxGUI.cxx:294 msgid "&Options..." msgstr "&ÐаÑтройки..." # C:/Projects/MSVCProjects/loch/lxGUI.cxx:300 #: lxGUI.cxx:297 msgid "&Contents...\tF1" msgstr "&Съдържание...\tF1" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:301 #: lxGUI.cxx:298 msgid "&Control" msgstr "&Контрол" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:302 #: lxGUI.cxx:299 msgid "&Rendering" msgstr "&Рендиране" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:303 #: lxGUI.cxx:300 msgid "&Bugs" msgstr "&Бъгове" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:305 #: lxGUI.cxx:302 msgid "&About..." msgstr "За &програмата..." # c:/cave/loch/loch/lxGUI.cxx:165 #: lxGUI.cxx:305 msgid "&File" msgstr "&Файл" # c:/cave/loch/loch/lxGUI.cxx:166 #: lxGUI.cxx:306 msgid "&View" msgstr "&Изглед" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:310 #: lxGUI.cxx:307 msgid "&Tools" msgstr "&ИнÑтрументи" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:311 #: lxGUI.cxx:308 msgid "&Help" msgstr "По&мощ" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:581 #: lxGUI.cxx:578 msgid "All supported files (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch files (*.lox)|*.lox|Compass PLT files (*.plt)|*.plt|Survex 3D files (*.3d)|*.3d" msgstr "Ð’Ñички поддържани файлове (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch файлове (*.lox)|*.lox|Compass PLT файлове (*.plt)|*.plt|Survex 3D файлове (*.3d)|*.3d" # C:/Projects/MSVCProjects/loch/lxGUI.cxx:870 #: lxGUI.cxx:867 msgid "Building 3D model, please wait..." msgstr "Създавам 3D model, молÑ, изчакайте..." # C:/Projects/MSVCProjects/loch/lxGUI.cxx:899 #: lxGUI.cxx:896 msgid "Error reading input file" msgstr "Грешка при четене на входниÑÑ‚ файл" # c:/cave/loch/loch/lxData.cxx:360 # c:/cave/loch/loch/lxPrint.cxx:466 # c:/cave/loch/loch/lxPrint.cxx:995 # c:/cave/loch/loch/lxRender.cxx:655 #: lxGUI.cxx:896 #: lxRender.cxx:664 msgid "Error" msgstr "Грешка" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:43 #: lxOptDlg.cxx:43 msgid "Options" msgstr "ÐаÑтройки" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:50 #: lxOptDlg.cxx:50 msgid "General options" msgstr "Генерални наÑтройки" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:54 #: lxOptDlg.cxx:54 msgid "Default data files directory" msgstr "Стандартна директориÑ" # c:/cave/loch/loch/lxPrint.cxx:349 #: lxOptDlg.cxx:60 msgid "Browse..." msgstr "Преглед..." # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:65 #: lxOptDlg.cxx:64 msgid "Default stereo colors" msgstr "Стандартни Ñтерео цветове" # c:/cave/loch/loch/lxSView.cxx:430 #: lxOptDlg.cxx:68 #: lxSView.cxx:435 msgid "red & cyan" msgstr "червено & циÑн" # c:/cave/loch/loch/lxSView.cxx:431 #: lxOptDlg.cxx:69 #: lxSView.cxx:436 msgid "red & green" msgstr "червено & зелено" # c:/cave/loch/loch/lxSView.cxx:432 #: lxOptDlg.cxx:70 #: lxSView.cxx:437 msgid "red & blue" msgstr "червено & Ñиньо" # c:/cave/loch/loch/lxSView.cxx:433 #: lxOptDlg.cxx:71 #: lxSView.cxx:438 msgid "yellow & blue" msgstr "жълто & Ñиньо" # c:/cave/loch/loch/lxSView.cxx:434 #: lxOptDlg.cxx:72 #: lxSView.cxx:439 msgid "cyan & red" msgstr "циÑн & червено" # c:/cave/loch/loch/lxSView.cxx:435 #: lxOptDlg.cxx:73 #: lxSView.cxx:440 msgid "green & red" msgstr "зелено & червено" # c:/cave/loch/loch/lxSView.cxx:436 #: lxOptDlg.cxx:74 #: lxSView.cxx:441 msgid "blue & red" msgstr "Ñиньо & червено" # c:/cave/loch/loch/lxSView.cxx:437 #: lxOptDlg.cxx:75 #: lxSView.cxx:442 msgid "blue & yellow" msgstr "Ñиньо & жълто" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:77 #: lxOptDlg.cxx:76 msgid "remember last used channels" msgstr "запомни поÑледно използваните канали" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:85 #: lxOptDlg.cxx:84 msgid "Walls extrapolation" msgstr "ЕкÑÐ¿Ñ€Ð°Ð¿Ð¾Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° Ñтени" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:89 #: lxOptDlg.cxx:88 msgid "Do not extrapolate walls" msgstr "Ðе екÑтраполирай Ñтените" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:92 #: lxOptDlg.cxx:91 msgid "Extrapolate only files without walls information" msgstr "ЕкÑтраполирай Ñамо файлове без Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñтени" # C:/Projects/MSVCProjects/loch/lxOptDlg.cxx:95 #: lxOptDlg.cxx:94 msgid "Extrapolate all missing walls information" msgstr "ЕкÑтраполирай вÑичката липÑтваща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñтени" # c:/cave/loch/loch/lxPrint.cxx:387 # c:/cave/loch/loch/lxRender.cxx:322 #: lxOptDlg.cxx:102 #: lxRender.cxx:321 msgid "OK" msgstr "OK" # c:/cave/loch/loch/lxPrint.cxx:388 # c:/cave/loch/loch/lxPrint.cxx:775 # c:/cave/loch/loch/lxRender.cxx:323 #: lxOptDlg.cxx:103 #: lxRender.cxx:322 msgid "Cancel" msgstr "Отказ" # c:/cave/loch/loch/lxRender.cxx:247 #: lxRender.cxx:246 msgid "Size and scaling" msgstr "Размер и мащабиране" # c:/cave/loch/loch/lxRender.cxx:251 #: lxRender.cxx:250 msgid "Screen shot" msgstr "Снимка на екрана" # c:/cave/loch/loch/lxRender.cxx:257 #: lxRender.cxx:256 msgid "Image width" msgstr "Ширина на Ñнимка" # c:/cave/loch/loch/lxRender.cxx:260 # c:/cave/loch/loch/lxRender.cxx:271 #: lxRender.cxx:259 #: lxRender.cxx:270 msgid "(mm)" msgstr "(mm)" # c:/cave/loch/loch/lxRender.cxx:268 #: lxRender.cxx:267 msgid "Image height" msgstr "ВиÑочина на Ñнимка" # c:/cave/loch/loch/lxRender.cxx:279 #: lxRender.cxx:278 msgid "Scale" msgstr "Размер" # c:/cave/loch/loch/lxRender.cxx:282 #: lxRender.cxx:281 msgid "1 :" msgstr "1 :" # c:/cave/loch/loch/lxRender.cxx:293 #: lxRender.cxx:292 msgid "Image options" msgstr "ÐаÑтройки на изображението" # c:/cave/loch/loch/lxPrint.cxx:302 # c:/cave/loch/loch/lxRender.cxx:297 #: lxRender.cxx:296 msgid "Rendering resolution (dpi)" msgstr "Ð ÐµÐ·Ð¾Ð»ÑŽÑ†Ð¸Ñ Ð½Ð° рендирането (dpi)" # c:/cave/loch/loch/lxRender.cxx:307 #: lxRender.cxx:306 msgid "Image size:" msgstr "Размер на изображението:" # c:/cave/loch/loch/lxRender.cxx:310 #: lxRender.cxx:309 msgid "00 x 00 (00.0 MB)" msgstr "00 x 00 (00.0 MB)" # c:/cave/loch/loch/lxPrint.cxx:295 # c:/cave/loch/loch/lxRender.cxx:315 #: lxRender.cxx:314 msgid "White background" msgstr "БÑл фон" # c:/cave/loch/loch/lxRender.cxx:437 #: lxRender.cxx:436 msgid "Save rendering as" msgstr "Запиши рендираното като" # c:/cave/loch/loch/lxPrint.cxx:183 # c:/cave/loch/loch/lxRender.cxx:439 #: lxRender.cxx:438 msgid "PPM files (*.ppm)|*.ppm" msgstr "PPM файл (*.ppm)|*.ppm" # c:/cave/loch/loch/lxRender.cxx:441 #: lxRender.cxx:440 msgid "PDF files (*.pdf)|*.pdf|PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp" msgstr "PDF файл (*.pdf)|*.pdf|PNG файл (*.png)|*.png|BMP файл (*.bmp)|*.bmp" # c:/cave/loch/loch/lxPrint.cxx:627 # c:/cave/loch/loch/lxPrint.cxx:647 # c:/cave/loch/loch/lxPrint.cxx:872 # c:/cave/loch/loch/lxPrint.cxx:892 # c:/cave/loch/loch/lxRender.cxx:455 #: lxRender.cxx:454 msgid "Unable to open file for output." msgstr "ÐеуÑпех при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° файл." # c:/cave/loch/loch/lxPrint.cxx:921 # c:/cave/loch/loch/lxRender.cxx:493 #: lxRender.cxx:492 #, c-format msgid "Rendering (%d x %d, %.1f MB) ..." msgstr "Рендиране (%d x %d, %.1f MB) ..." # c:/cave/loch/loch/lxRender.cxx:494 #: lxRender.cxx:493 msgid "Rendering to bitmap" msgstr "Рендиране към изображение" # c:/cave/loch/loch/lxSScene.cxx:147 #: lxSScene.cxx:196 msgid " Scene" msgstr "Сцена" # c:/cave/loch/loch/lxSScene.cxx:167 # c:/cave/loch/loch/lxSScene.cxx:335 #: lxSScene.cxx:216 msgid "Visibility" msgstr "ВидимоÑÑ‚" # c:/cave/loch/loch/lxSScene.cxx:168 #: lxSScene.cxx:217 #: lxSScene.cxx:271 msgid "Color mode" msgstr "Режим на цветовете" # c:/cave/loch/loch/lxSScene.cxx:199 #: lxSScene.cxx:248 msgid "Scene items" msgstr "Обекти в Ñцената" # c:/cave/loch/loch/lxSScene.cxx:224 #: lxSScene.cxx:279 msgid "Default" msgstr "Стандартни" # c:/cave/loch/loch/lxSScene.cxx:230 #: lxSScene.cxx:285 msgid "Applies to" msgstr "ОтнаÑÑ Ñе за" # c:/cave/loch/loch/lxSScene.cxx:243 #: lxSScene.cxx:298 msgid "Centerline visibility" msgstr "ВидимоÑÑ‚ на антената" # c:/cave/loch/loch/lxSScene.cxx:244 #: lxSScene.cxx:299 msgid "Underground" msgstr "ПодземÑта" # c:/cave/loch/loch/lxSScene.cxx:265 # c:/cave/loch/loch/lxSScene.cxx:278 #: lxSScene.cxx:317 #: lxSScene.cxx:330 msgid "Transparency" msgstr "ПрозрачноÑÑ‚" # c:/cave/loch/loch/lxSScene.cxx:282 #: lxSScene.cxx:334 msgid "Texture" msgstr "ТекÑтура" # C:/Projects/MSVCProjects/loch/lxSScene.cxx:398 #: lxSScene.cxx:392 msgid "Project title" msgstr "Име на проекта" # c:/cave/loch/loch/lxSScene.cxx:389 # c:/cave/loch/loch/lxSView.cxx:464 #: lxSScene.cxx:424 #: lxSView.cxx:470 msgid "Close" msgstr "Затвори" # C:/Projects/MSVCProjects/loch/lxSView.cxx:228 #: lxSView.cxx:228 msgid " Camera" msgstr "Камера" # c:/cave/loch/loch/lxSView.cxx:255 #: lxSView.cxx:260 msgid "Center" msgstr "Център" # C:/Projects/MSVCProjects/loch/lxSView.cxx:261 #: lxSView.cxx:261 msgid "Focus" msgstr "ФокуÑ" # c:/cave/loch/loch/lxSView.cxx:287 #: lxSView.cxx:292 msgid "Facing (deg)" msgstr "Ðзимут (градуÑи)" # c:/cave/loch/loch/lxSView.cxx:298 #: lxSView.cxx:303 msgid "Tilt (deg)" msgstr "Ðаклон (градуÑи)" # c:/cave/loch/loch/lxSView.cxx:323 #: lxSView.cxx:328 msgid "Rotation center" msgstr "Център на ротациÑ" # c:/cave/loch/loch/lxSView.cxx:327 #: lxSView.cxx:332 msgid "Easting (m)" msgstr "X - изток (m)" # c:/cave/loch/loch/lxSView.cxx:335 #: lxSView.cxx:340 msgid "Northing (m)" msgstr "Y - Ñевер (m)" # c:/cave/loch/loch/lxSView.cxx:343 #: lxSView.cxx:348 msgid "Altitude (m)" msgstr "Ðадм. виÑочина (m)" # c:/cave/loch/loch/lxSView.cxx:364 #: lxSView.cxx:369 msgid "Distance (m)" msgstr "РазÑтоÑние (m)" # c:/cave/loch/loch/lxSView.cxx:379 #: lxSView.cxx:384 msgid "Focus (mm)" msgstr "Ð¤Ð¾ÐºÑƒÑ (mm)" # c:/cave/loch/loch/lxSView.cxx:399 #: lxSView.cxx:404 msgid "Enable rotation" msgstr "Включи ротациÑ" # c:/cave/loch/loch/lxSView.cxx:401 #: lxSView.cxx:406 msgid "Rotation speed" msgstr "СкороÑÑ‚ на ротациÑ" # c:/cave/loch/loch/lxSView.cxx:422 #: lxSView.cxx:427 msgid "Enable stereo mode" msgstr "Стерео изображение" # c:/cave/loch/loch/lxSView.cxx:423 #: lxSView.cxx:428 msgid "Eye separation" msgstr "РаздалеченоÑÑ‚ на очите" # C:/Projects/MSVCProjects/loch/lxSView.cxx:445 #: lxSView.cxx:445 msgid "Disable color textures" msgstr "Изключи цветните текÑтури" # c:/cave/loch/loch/lxSView.cxx:441 #: lxSView.cxx:447 msgid "Color channels" msgstr "Цветни канали" # c:/cave/loch/loch/lxSView.cxx:524 #: lxSView.cxx:530 msgid "Lock rotation speed" msgstr "Заключи ÑкороÑтта на ротациÑ" # c:/cave/loch/loch/lxWX.cxx:200 #: lxWX.cxx:200 #, c-format msgid "%ld" msgstr "%ld" # c:/cave/loch/loch/lxWX.cxx:206 #: lxWX.cxx:206 #, c-format msgid "%.14e" msgstr "%.14e" therion/loch/getline.h0000664000175000017500000000177710537464734014024 0ustar useruser/* Copyright (C) 1995, 1997 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GETLINE_H_ # define GETLINE_H_ 1 #ifdef __cplusplus extern "C" { #endif # include int getline (char **_lineptr, size_t *_n, FILE *_stream); int getdelim (char **_lineptr, size_t *_n, int _delimiter, FILE *_stream); #ifdef __cplusplus } #endif #endif /* not GETLINE_H_ */ therion/loch/lxFNTFreeSans_ttf.h0000664000175000017500000276244610537464734015705 0ustar useruserFT_Byte lxFNTFreeSans_ttf[] = { 0,1,0,0,0,15,0,128,0,3,0,112,71,68,69,70, 85,149,93,142,0,0,0,252,0,0,0,114,71,80,79,83, 120,189,136,27,0,0,1,112,0,0,18,36,71,83,85,66, 249,2,197,18,0,0,19,148,0,0,2,6,79,83,47,50, 75,64,204,87,0,0,21,156,0,0,0,86,99,109,97,112, 235,21,241,230,0,0,21,244,0,0,9,130,99,118,116,32, 0,33,2,121,0,0,31,120,0,0,0,4,103,97,115,112, 255,255,0,3,0,0,31,124,0,0,0,8,103,108,121,102, 155,243,51,102,0,0,31,132,0,3,76,16,104,101,97,100, 219,187,238,20,0,3,107,148,0,0,0,54,104,104,101,97, 8,21,10,153,0,3,107,204,0,0,0,36,104,109,116,120, 5,62,143,235,0,3,107,240,0,0,33,252,108,111,99,97, 12,152,136,28,0,3,141,236,0,0,34,0,109,97,120,112, 8,222,1,90,0,3,175,236,0,0,0,32,110,97,109,101, 251,79,242,251,0,3,176,12,0,0,6,78,112,111,115,116, 90,188,188,203,0,3,182,92,0,0,81,43,0,1,0,0, 0,12,0,0,0,106,0,0,0,2,0,15,0,3,0,243, 0,1,0,244,0,245,0,2,0,246,3,109,0,1,3,110, 3,110,0,2,3,111,7,23,0,1,7,24,7,26,0,2, 7,27,7,27,0,1,7,28,7,28,0,2,7,29,7,29, 0,1,7,30,7,32,0,2,7,33,8,72,0,1,8,73, 8,79,0,2,8,80,8,124,0,1,8,125,8,125,0,2, 8,126,8,126,0,1,0,4,0,0,0,2,0,0,0,0, 0,1,0,0,0,10,0,48,0,62,0,2,68,70,76,84, 0,14,108,97,116,110,0,26,0,4,0,0,0,0,255,255, 0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0, 0,1,107,101,114,110,0,8,0,0,0,1,0,1,0,2, 0,6,0,14,0,2,0,0,0,1,0,16,0,2,0,0, 0,1,2,138,0,1,2,86,0,4,0,0,0,20,0,50, 0,64,0,102,0,116,0,154,0,188,0,250,1,32,1,70, 1,96,1,134,1,148,1,162,1,176,1,190,1,204,1,218, 2,8,2,22,2,36,0,3,6,205,255,206,6,209,255,215, 8,72,255,156,0,9,0,36,255,249,0,55,255,176,0,57, 255,210,0,58,255,237,0,60,255,164,0,131,255,249,0,134, 255,249,0,135,255,249,0,136,255,245,0,3,6,205,255,205, 6,209,255,215,8,72,255,155,0,9,0,36,255,206,0,55, 255,130,0,57,255,163,0,58,255,190,0,60,255,123,0,131, 255,206,0,134,255,206,0,135,255,206,0,136,255,202,0,8, 0,36,255,189,0,55,255,251,0,58,0,12,0,60,255,247, 0,131,255,189,0,134,255,189,0,135,255,189,0,136,255,177, 0,15,0,15,255,196,0,17,255,196,0,36,255,184,0,71, 255,236,0,82,255,230,0,85,255,238,0,86,255,238,0,87, 255,249,0,89,255,254,0,90,0,2,0,92,255,250,0,131, 255,184,0,134,255,184,0,135,255,184,0,136,255,171,0,9, 0,36,255,204,0,55,0,9,0,57,0,15,0,58,0,27, 0,60,0,5,0,131,255,204,0,134,255,204,0,135,255,204, 0,136,255,192,0,9,0,36,255,203,0,55,0,11,0,57, 0,15,0,58,0,26,0,60,0,7,0,131,255,203,0,134, 255,203,0,135,255,203,0,136,255,190,0,6,0,36,0,30, 0,55,255,181,0,57,255,187,0,58,255,222,0,60,255,165, 0,136,0,30,0,9,0,36,255,212,0,55,255,135,0,57, 255,168,0,58,255,196,0,60,255,128,0,131,255,212,0,134, 255,212,0,135,255,212,0,136,255,208,0,3,8,64,255,254, 8,67,255,217,8,72,255,210,0,3,8,64,255,219,8,67, 255,231,8,72,255,220,0,3,8,64,255,254,8,67,255,223, 8,72,255,207,0,3,8,64,0,5,8,67,255,200,8,72, 255,172,0,3,8,64,0,1,8,67,255,230,8,72,255,180, 0,3,8,64,0,1,8,67,255,226,8,72,255,213,0,11, 0,15,255,137,0,17,255,137,0,29,255,179,8,62,255,228, 8,63,255,233,8,64,255,163,8,65,255,226,8,66,255,216, 8,67,255,252,8,68,255,228,8,72,255,203,0,3,8,64, 0,1,8,67,255,223,8,72,255,208,0,3,8,64,255,253, 8,67,255,219,8,72,255,213,0,12,0,15,255,182,0,17, 255,182,8,61,255,194,8,62,255,187,8,63,255,189,8,64, 255,175,8,65,255,189,8,66,255,194,8,67,255,166,8,68, 255,191,8,69,255,191,8,72,255,138,0,1,0,20,0,15, 0,16,0,17,0,125,6,204,6,205,6,208,6,209,6,210, 6,226,8,61,8,62,8,63,8,64,8,65,8,66,8,67, 8,68,8,69,8,72,0,1,14,210,0,4,0,0,0,76, 0,162,1,60,1,130,1,172,1,226,2,88,2,138,2,156, 2,238,3,100,3,182,3,224,4,54,4,172,4,214,5,148, 5,202,6,100,6,246,7,32,7,178,7,188,7,210,7,224, 7,234,8,4,8,74,8,100,8,110,8,120,8,182,8,188, 8,206,8,232,9,6,9,16,9,26,9,200,9,210,10,16, 10,22,10,128,10,230,11,0,11,106,11,152,12,10,12,56, 12,102,12,216,13,78,13,84,13,98,13,120,13,134,13,148, 13,174,13,180,13,186,13,216,13,222,14,0,14,14,14,28, 14,42,14,56,14,70,14,84,14,98,14,112,14,126,14,132, 14,154,14,172,14,182,14,200,0,38,0,15,0,5,0,16, 255,253,0,17,0,5,0,38,255,220,0,42,255,221,0,50, 255,223,0,52,255,224,0,55,255,163,0,56,255,219,0,57, 255,181,0,58,255,205,0,60,255,157,0,68,255,252,0,69, 0,4,0,70,255,245,0,71,255,248,0,72,255,240,0,74, 255,246,0,82,255,243,0,84,255,248,0,87,255,240,0,88, 255,244,0,89,255,225,0,90,255,235,0,92,255,222,0,109, 255,212,0,137,255,220,0,152,255,223,0,155,255,219,0,156, 255,219,0,157,255,219,0,158,255,219,0,169,255,246,0,206, 255,220,0,207,255,245,6,205,255,191,6,209,255,200,6,225, 255,216,0,17,0,36,255,235,0,50,255,249,0,57,255,215, 0,58,255,231,0,60,255,212,0,131,255,235,0,132,255,235, 0,133,255,235,0,134,255,235,0,135,255,235,0,136,255,235, 0,148,255,249,0,149,255,249,0,150,255,249,0,152,255,249, 0,154,255,255,1,20,255,251,0,10,0,36,255,224,0,43, 255,244,0,46,255,246,0,50,255,248,0,131,255,224,0,134, 255,224,0,135,255,224,0,136,255,223,0,149,255,248,0,152, 255,248,0,13,0,36,255,214,0,45,255,251,0,55,255,211, 0,57,255,205,0,58,255,227,0,59,255,203,0,60,255,193, 0,130,255,214,0,131,255,214,0,132,255,214,0,133,255,214, 0,134,255,214,0,135,255,214,0,29,0,15,255,148,0,16, 255,242,0,17,255,148,0,36,255,187,0,45,255,205,0,50, 255,234,0,68,255,223,0,72,255,232,0,76,255,246,0,77, 255,244,0,82,255,235,0,85,255,221,0,88,255,223,0,130, 255,187,0,131,255,187,0,132,255,187,0,133,255,187,0,134, 255,187,0,135,255,187,0,152,255,234,0,163,255,223,0,166, 255,223,0,167,255,223,0,168,255,227,0,171,255,232,0,181, 255,235,0,184,255,235,0,186,255,235,1,21,255,233,0,12, 0,36,255,250,0,55,255,212,0,57,255,206,0,58,255,228, 0,60,255,194,0,130,255,250,0,131,255,250,0,132,255,250, 0,133,255,250,0,134,255,250,0,135,255,250,0,136,255,253, 0,4,0,36,255,224,0,134,255,224,0,135,255,224,0,136, 255,225,0,20,0,16,255,209,0,38,255,205,0,42,255,205, 0,50,255,208,0,54,255,218,0,55,0,20,0,68,255,245, 0,72,255,224,0,82,255,227,0,88,255,237,0,92,255,194, 0,149,255,208,0,152,255,208,0,166,255,245,0,167,255,245, 0,168,255,249,0,181,255,227,0,184,255,227,0,190,255,237, 1,20,255,211,0,29,0,16,255,131,0,36,0,17,0,38, 255,215,0,42,255,214,0,50,255,215,0,54,255,237,0,55, 255,151,0,56,255,221,0,57,255,151,0,58,255,188,0,60, 255,135,0,88,255,249,0,92,255,200,0,131,0,17,0,134, 0,17,0,135,0,17,0,136,0,20,0,137,255,219,0,148, 255,215,0,149,255,215,0,150,255,215,0,151,255,215,0,152, 255,215,0,158,255,221,0,190,255,249,0,206,255,215,1,34, 255,237,6,205,255,107,6,209,255,115,0,20,0,15,255,249, 0,17,255,249,0,36,255,247,0,38,255,253,0,42,255,254, 0,68,255,251,0,82,0,2,0,131,255,247,0,134,255,247, 0,135,255,247,0,136,255,250,0,137,255,253,0,163,255,251, 0,166,255,251,0,167,255,251,0,168,255,254,0,181,0,2, 0,184,0,2,0,186,0,4,0,206,255,253,0,10,0,36, 255,221,0,55,255,214,0,57,255,211,0,58,255,233,0,59, 255,210,0,60,255,197,0,131,255,221,0,134,255,221,0,135, 255,221,0,136,255,217,0,21,0,15,255,121,0,16,255,216, 0,17,255,121,0,36,255,178,0,45,255,178,0,68,255,228, 0,72,255,225,0,82,255,229,0,131,255,178,0,134,255,178, 0,135,255,178,0,136,255,170,0,163,255,228,0,166,255,228, 0,167,255,228,0,168,255,232,0,171,255,225,0,181,255,229, 0,184,255,229,0,186,255,229,1,21,255,228,0,29,0,16, 255,254,0,38,255,240,0,42,255,241,0,50,255,243,0,55, 255,233,0,56,255,239,0,57,255,217,0,58,255,229,0,60, 255,213,0,68,255,241,0,72,255,244,0,82,255,247,0,88, 255,247,0,92,255,248,0,137,255,240,0,149,255,243,0,152, 255,243,0,158,255,239,0,163,255,241,0,166,255,241,0,167, 255,241,0,168,255,244,0,171,255,244,0,181,255,247,0,184, 255,247,0,188,255,247,0,190,255,247,1,20,255,245,1,21, 255,245,0,10,0,36,255,234,0,55,255,228,0,57,255,214, 0,58,255,228,0,60,255,208,0,87,255,253,0,131,255,234, 0,134,255,234,0,135,255,234,0,136,255,234,0,47,0,15, 255,156,0,16,255,179,0,17,255,156,0,29,255,123,0,30, 255,127,0,36,255,161,0,38,255,212,0,42,255,211,0,45, 255,156,0,50,255,214,0,54,255,232,0,57,0,12,0,58, 0,16,0,60,0,20,0,68,255,156,0,70,255,166,0,72, 255,161,0,74,255,167,0,76,255,253,0,77,255,251,0,82, 255,164,0,85,255,164,0,86,255,164,0,88,255,165,0,89, 255,161,0,90,255,163,0,92,255,156,0,109,255,135,0,130, 255,161,0,131,255,161,0,132,255,161,0,133,255,161,0,134, 255,161,0,135,255,161,0,136,255,159,0,148,255,214,0,149, 255,214,0,150,255,214,0,151,255,214,0,152,255,214,0,154, 255,215,0,168,255,159,0,186,255,169,1,20,255,221,1,34, 255,232,1,35,255,196,6,225,255,139,0,13,0,15,255,229, 0,17,255,231,0,36,255,220,0,80,255,252,0,81,255,252, 0,83,0,3,0,85,255,252,0,131,255,220,0,132,255,220, 0,133,255,220,0,134,255,220,0,135,255,220,0,136,255,217, 0,38,0,15,255,167,0,16,255,218,0,17,255,167,0,29, 255,190,0,30,255,190,0,36,255,185,0,38,255,213,0,42, 255,214,0,50,255,216,0,54,255,221,0,55,0,15,0,68, 255,197,0,72,255,199,0,74,255,206,0,76,255,251,0,82, 255,202,0,85,255,214,0,88,255,215,0,92,255,236,0,109, 255,173,0,130,255,185,0,131,255,185,0,132,255,185,0,133, 255,185,0,134,255,185,0,135,255,185,0,136,255,178,0,148, 255,216,0,149,255,216,0,150,255,216,0,151,255,216,0,152, 255,216,0,154,255,223,0,168,255,201,0,186,255,206,0,207, 255,213,1,34,255,221,6,225,255,176,0,36,0,15,255,200, 0,16,255,243,0,17,255,200,0,29,255,204,0,30,255,203, 0,36,255,206,0,38,255,233,0,42,255,234,0,50,255,236, 0,54,255,232,0,55,0,19,0,68,255,218,0,72,255,224, 0,74,255,231,0,76,255,255,0,82,255,227,0,85,255,228, 0,88,255,228,0,92,255,250,0,109,255,198,0,130,255,206, 0,131,255,206,0,132,255,206,0,133,255,206,0,134,255,206, 0,135,255,206,0,136,255,200,0,148,255,236,0,149,255,236, 0,150,255,236,0,151,255,236,0,152,255,236,0,154,255,243, 0,168,255,222,0,186,255,231,6,225,255,202,0,10,0,16, 255,205,0,38,255,208,0,50,255,211,0,52,255,212,0,68, 255,241,0,72,255,220,0,82,255,223,0,88,255,232,0,92, 255,195,0,152,255,211,0,36,0,15,255,145,0,16,255,172, 0,17,255,145,0,29,255,169,0,30,255,168,0,36,255,160, 0,38,255,198,0,42,255,198,0,50,255,200,0,54,255,215, 0,55,0,23,0,68,255,168,0,72,255,167,0,74,255,173, 0,76,0,3,0,82,255,170,0,83,255,202,0,88,255,193, 0,89,255,220,0,109,255,133,0,130,255,160,0,131,255,160, 0,132,255,160,0,133,255,160,0,134,255,160,0,135,255,160, 0,136,255,153,0,148,255,200,0,149,255,200,0,150,255,200, 0,151,255,200,0,152,255,200,0,154,255,202,0,168,255,172, 0,186,255,174,6,225,255,137,0,2,0,89,255,223,0,92, 255,218,0,5,0,77,255,252,0,89,255,235,0,90,255,243, 0,92,255,230,6,205,255,233,0,3,0,89,255,245,0,90, 255,253,0,92,255,241,0,2,0,75,0,1,0,78,0,7, 0,6,0,87,255,246,0,89,255,241,0,90,255,247,0,91, 255,229,0,92,255,237,6,205,255,238,0,17,0,68,255,247, 0,72,255,241,0,73,0,22,0,76,255,254,0,77,255,252, 0,79,255,253,0,82,255,246,0,87,0,24,0,163,255,247, 0,166,255,247,0,167,255,247,0,168,255,251,0,171,255,241, 0,181,255,246,0,184,255,246,0,186,255,247,1,21,255,244, 0,6,0,68,255,251,0,166,255,251,0,167,255,251,0,168, 255,255,0,181,0,3,0,184,0,3,0,2,0,92,255,238, 6,205,255,241,0,2,0,55,255,249,0,77,255,253,0,15, 0,16,255,215,0,68,255,254,0,72,255,235,0,74,255,240, 0,82,255,237,0,86,255,253,0,88,255,245,0,163,255,254, 0,166,255,254,0,167,255,254,0,168,0,2,0,171,255,235, 0,181,255,237,0,184,255,237,0,190,255,250,0,1,0,92, 255,251,0,4,0,83,0,5,0,89,255,243,0,90,255,249, 0,92,255,238,0,6,0,55,255,160,0,83,0,5,0,89, 255,243,0,90,255,249,0,92,255,238,6,205,255,242,0,7, 0,55,255,157,0,87,255,246,0,89,255,238,0,90,255,246, 0,91,255,229,0,92,255,234,6,205,255,235,0,2,0,87, 255,252,0,92,255,240,0,2,0,70,0,8,0,88,0,4, 0,43,0,15,255,187,0,16,255,209,0,17,255,187,0,29, 255,234,0,30,255,234,0,68,255,251,0,70,255,250,0,71, 255,255,0,72,255,245,0,73,0,26,0,74,255,252,0,76, 0,1,0,78,0,6,0,79,0,1,0,82,255,250,0,83, 0,8,0,84,255,253,0,86,0,4,0,87,0,28,0,88, 0,2,0,89,0,29,0,90,0,31,0,91,0,20,0,92, 0,24,0,93,0,9,0,162,255,251,0,163,255,251,0,164, 255,251,0,166,255,251,0,167,255,251,0,168,255,255,0,169, 255,247,0,170,255,245,0,171,255,245,0,172,255,245,0,180, 255,250,0,181,255,250,0,182,255,250,0,184,255,250,0,186, 255,250,0,207,255,250,1,21,255,248,6,205,0,1,0,2, 0,87,255,253,6,205,255,234,0,15,0,29,255,228,0,30, 255,228,0,54,255,248,0,68,255,255,0,72,255,242,0,75, 255,253,0,82,255,244,0,163,255,255,0,166,255,255,0,167, 255,255,0,168,0,2,0,171,255,242,0,181,255,244,0,184, 255,244,6,205,255,255,0,1,6,205,255,248,0,26,0,15, 255,187,0,16,255,244,0,17,255,187,0,29,255,233,0,30, 255,233,0,68,255,238,0,70,255,240,0,72,255,235,0,74, 255,242,0,82,255,239,0,86,255,247,0,162,255,238,0,163, 255,238,0,164,255,238,0,165,255,238,0,166,255,238,0,167, 255,238,0,168,255,242,0,170,255,235,0,171,255,235,0,172, 255,235,0,180,255,239,0,181,255,239,0,184,255,239,0,186, 255,239,0,207,255,240,0,25,0,15,255,206,0,16,255,255, 0,17,255,206,0,29,255,233,0,30,255,233,0,68,255,241, 0,70,255,249,0,72,255,244,0,74,255,250,0,82,255,247, 0,86,255,251,0,162,255,241,0,163,255,241,0,164,255,241, 0,165,255,241,0,166,255,241,0,167,255,241,0,168,255,245, 0,170,255,244,0,171,255,244,0,172,255,244,0,180,255,247, 0,181,255,247,0,184,255,247,0,186,255,250,0,6,0,68, 255,239,0,70,255,233,0,72,255,228,0,82,255,231,0,84, 255,236,0,171,255,228,0,26,0,15,255,186,0,16,255,242, 0,17,255,186,0,29,255,229,0,30,255,229,0,68,255,234, 0,70,255,237,0,72,255,232,0,74,255,239,0,79,255,252, 0,82,255,236,0,86,255,244,0,162,255,234,0,163,255,234, 0,164,255,234,0,165,255,234,0,166,255,234,0,167,255,234, 0,168,255,238,0,170,255,232,0,171,255,232,0,172,255,232, 0,180,255,236,0,181,255,236,0,184,255,236,0,186,255,237, 0,11,0,15,0,5,0,17,0,5,0,38,255,220,0,42, 255,221,0,50,255,223,0,52,255,224,0,55,255,163,0,56, 255,219,0,57,255,181,0,58,255,205,0,60,255,157,0,28, 0,15,0,5,0,16,255,253,0,17,0,5,0,38,255,220, 0,42,255,221,0,50,255,223,0,52,255,224,0,55,255,163, 0,56,255,219,0,57,255,181,0,58,255,205,0,60,255,157, 0,68,255,252,0,69,0,4,0,70,255,245,0,71,255,248, 0,72,255,240,0,74,255,246,0,82,255,243,0,84,255,248, 0,87,255,240,0,88,255,244,0,89,255,225,0,90,255,235, 0,92,255,222,0,109,255,212,6,205,255,191,6,225,255,216, 0,11,0,15,0,5,0,17,0,5,0,38,255,220,0,42, 255,221,0,50,255,223,0,52,255,224,0,55,255,163,0,56, 255,219,0,57,255,181,0,58,255,205,0,60,255,157,0,11, 0,15,0,5,0,17,0,5,0,38,255,220,0,42,255,221, 0,50,255,223,0,52,255,224,0,55,255,163,0,56,255,219, 0,57,255,181,0,58,255,205,0,60,255,157,0,28,0,15, 0,5,0,16,255,253,0,17,0,5,0,38,255,220,0,42, 255,221,0,50,255,223,0,52,255,224,0,55,255,163,0,56, 255,219,0,57,255,181,0,58,255,205,0,60,255,157,0,68, 255,252,0,69,0,4,0,70,255,245,0,71,255,248,0,74, 255,246,0,82,255,243,0,84,255,248,0,87,255,240,0,88, 255,244,0,89,255,225,0,90,255,235,0,92,255,222,0,109, 255,212,6,205,255,191,6,209,255,200,6,225,255,216,0,29, 0,15,0,5,0,16,255,253,0,17,0,5,0,38,255,220, 0,42,255,221,0,50,255,223,0,52,255,224,0,55,255,163, 0,56,255,219,0,57,255,181,0,58,255,205,0,60,255,157, 0,68,255,252,0,69,0,4,0,70,255,245,0,71,255,248, 0,72,255,240,0,74,255,246,0,82,255,243,0,84,255,248, 0,87,255,240,0,88,255,244,0,89,255,225,0,90,255,235, 0,92,255,222,0,109,255,212,6,205,255,191,6,209,255,200, 6,225,255,216,0,1,0,36,255,225,0,3,0,55,255,214, 0,57,255,211,0,60,255,197,0,5,0,36,255,221,0,55, 255,214,0,57,255,211,0,58,255,233,0,60,255,197,0,3, 0,55,255,214,0,57,255,211,0,60,255,197,0,3,0,55, 255,214,0,57,255,211,0,60,255,197,0,6,0,36,255,221, 0,55,255,214,0,57,255,211,0,58,255,233,0,59,255,210, 0,60,255,197,0,1,0,36,255,223,0,1,0,36,255,220, 0,7,0,15,255,229,0,17,255,231,0,36,255,220,0,80, 255,252,0,81,255,252,0,83,0,3,0,85,255,252,0,1, 0,36,255,220,0,8,0,15,255,229,0,17,255,231,0,36, 255,220,0,69,0,3,0,80,255,252,0,81,255,252,0,83, 0,3,0,85,255,252,0,3,0,89,255,235,0,90,255,243, 0,92,255,230,0,3,0,89,255,235,0,90,255,243,0,92, 255,230,0,3,0,89,255,235,0,90,255,243,0,92,255,230, 0,3,0,89,255,235,0,90,255,243,0,92,255,230,0,3, 0,89,255,240,0,90,255,246,0,92,255,236,0,3,0,89, 255,241,0,90,255,247,0,92,255,237,0,3,0,89,255,241, 0,90,255,247,0,92,255,237,0,3,0,89,255,238,0,90, 255,246,0,92,255,234,0,3,0,89,255,238,0,90,255,246, 0,92,255,234,0,1,0,87,255,246,0,5,0,87,255,246, 0,89,255,238,0,90,255,246,0,91,255,229,0,92,255,234, 0,4,0,36,255,224,0,43,255,244,0,46,255,246,0,50, 255,248,0,2,0,75,0,1,0,78,0,7,0,4,0,36, 255,234,0,55,255,228,0,57,255,214,0,87,255,253,0,2, 0,89,255,223,0,92,255,218,0,2,0,20,0,36,0,39, 0,0,0,41,0,42,0,4,0,45,0,47,0,6,0,49, 0,51,0,9,0,53,0,61,0,12,0,68,0,70,0,21, 0,72,0,76,0,24,0,78,0,92,0,29,0,130,0,135, 0,44,0,137,0,137,0,50,0,148,0,152,0,51,0,154, 0,158,0,56,0,162,0,163,0,61,0,166,0,168,0,63, 0,171,0,172,0,66,0,180,0,182,0,68,0,184,0,184, 0,71,0,206,0,207,0,72,1,34,1,34,0,74,1,63, 1,63,0,75,0,1,0,0,0,10,0,84,0,110,0,4, 68,70,76,84,0,26,97,114,109,110,0,38,104,101,98,114, 0,50,108,97,116,110,0,62,0,4,0,0,0,0,255,255, 0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,1, 0,4,0,0,0,0,255,255,0,1,0,1,0,4,0,0, 0,0,255,255,0,1,0,1,0,2,102,114,97,99,0,14, 108,105,103,97,0,20,0,0,0,1,0,0,0,0,0,1, 0,3,0,4,0,10,0,18,0,26,0,34,0,4,0,8, 0,1,0,32,0,4,0,8,0,1,0,204,0,4,0,8, 0,1,1,78,0,4,0,8,0,1,1,94,0,1,0,166, 0,5,0,16,0,38,0,80,0,102,0,144,0,2,0,6, 0,14,7,24,0,3,6,230,0,24,7,24,0,3,0,18, 0,24,0,4,0,10,0,18,0,26,0,34,7,30,0,3, 6,230,0,27,7,30,0,3,0,18,0,27,7,25,0,3, 6,230,0,24,7,25,0,3,0,18,0,24,0,2,0,6, 0,14,7,26,0,3,6,230,0,24,7,26,0,3,0,18, 0,24,0,4,0,10,0,18,0,26,0,34,7,31,0,3, 6,230,0,27,7,31,0,3,0,18,0,27,7,28,0,3, 6,230,0,25,7,28,0,3,0,18,0,25,0,2,0,6, 0,14,7,32,0,3,6,230,0,27,7,32,0,3,0,18, 0,27,0,1,0,5,0,21,0,22,0,23,0,24,0,26, 0,1,0,122,0,6,0,18,0,28,0,74,0,84,0,94, 0,104,0,1,0,4,0,244,0,2,0,45,0,5,0,12, 0,20,0,28,0,34,0,40,8,77,0,3,0,73,0,79, 8,76,0,3,0,73,0,76,8,75,0,2,0,79,8,74, 0,2,0,76,8,73,0,2,0,73,0,1,0,4,0,245, 0,2,0,77,0,1,0,4,8,79,0,2,0,87,0,1, 0,4,8,78,0,2,0,87,0,2,0,6,0,12,8,77, 0,2,0,79,8,76,0,2,0,76,0,1,0,6,0,44, 0,73,0,76,0,86,1,65,8,73,0,1,0,18,0,1, 0,8,0,1,0,4,3,110,0,2,3,105,0,1,0,1, 3,76,0,1,0,18,0,1,0,8,0,1,0,4,8,125, 0,2,3,145,0,1,0,1,3,133,0,0,0,1,1,225, 1,144,0,5,0,0,0,200,0,200,0,0,0,200,0,200, 0,200,0,0,0,200,0,49,1,2,0,0,2,11,5,4, 2,2,2,2,2,4,192,95,142,255,80,7,96,251,0,0, 2,160,0,0,0,0,80,102,69,100,0,64,0,32,255,253, 4,117,254,53,0,90,4,117,1,203,128,2,0,191,221,245, 0,1,0,0,0,0,0,3,0,0,0,3,0,0,0,28, 0,1,0,0,0,0,8,124,0,3,0,1,0,0,0,28, 0,4,8,96,0,0,2,20,2,0,0,8,0,20,0,13, 0,126,1,128,1,137,1,140,1,147,1,153,1,159,1,165, 1,169,1,171,1,174,1,227,1,237,1,245,2,27,2,31, 2,51,2,84,2,89,2,92,2,97,2,106,2,109,2,115, 2,117,2,127,2,133,2,137,2,142,2,144,2,156,2,158, 2,160,2,199,2,203,2,221,3,4,3,8,3,12,3,15, 3,20,3,40,3,117,3,122,3,126,3,138,3,140,3,161, 3,206,4,95,4,196,4,200,4,204,4,245,4,249,5,86, 5,94,5,135,5,138,5,185,5,196,5,234,7,13,7,44, 7,74,9,2,9,11,9,13,9,17,9,51,9,57,9,67, 9,69,9,73,9,77,9,81,9,112,9,131,9,140,9,144, 9,168,9,176,9,178,9,185,9,188,9,196,9,200,9,205, 9,215,9,221,9,227,9,250,10,10,10,16,10,40,10,48, 10,51,10,54,10,57,10,60,10,66,10,72,10,77,10,92, 10,94,10,112,10,116,10,130,10,139,10,168,10,176,10,179, 10,185,10,195,10,200,10,204,10,208,10,239,11,3,11,7, 11,9,11,11,11,15,11,19,11,24,11,26,11,29,11,33, 11,43,11,48,11,51,11,57,11,67,11,71,11,96,11,111, 11,131,11,138,11,144,11,149,11,154,11,156,11,159,11,164, 11,170,11,181,11,185,11,193,11,200,11,205,11,215,11,221, 11,225,12,131,12,138,12,144,12,154,12,156,12,168,12,179, 12,239,13,131,13,133,13,139,13,145,13,148,13,156,13,158, 13,162,13,165,13,171,13,177,13,187,13,189,13,198,13,202, 13,212,13,214,13,217,13,223,31,21,31,29,31,69,31,77, 31,87,31,89,31,91,31,93,31,125,31,180,31,196,31,211, 31,219,31,239,31,244,31,254,32,16,32,20,32,35,32,38, 32,55,32,61,32,68,32,73,32,75,32,113,32,121,32,137, 32,168,32,170,32,172,33,12,33,18,33,22,33,28,33,34, 33,40,33,45,33,51,33,127,33,149,33,181,33,212,34,0, 34,3,34,9,34,19,34,23,34,26,34,30,34,32,34,46, 34,52,34,60,34,62,34,67,34,73,34,96,34,101,34,151, 34,165,35,0,37,202,38,106,48,3,48,5,48,17,48,21, 48,147,48,153,48,155,48,254,246,65,246,190,246,195,246,220, 251,6,251,54,251,60,251,62,251,65,251,68,251,79,255,253, 255,255,0,0,0,13,0,32,0,160,1,130,1,139,1,142, 1,153,1,157,1,165,1,167,1,171,1,173,1,196,1,230, 1,240,1,248,2,30,2,38,2,80,2,86,2,91,2,96, 2,101,2,109,2,111,2,117,2,121,2,130,2,135,2,140, 2,144,2,156,2,158,2,160,2,198,2,202,2,216,3,0, 3,6,3,10,3,15,3,17,3,38,3,116,3,122,3,126, 3,132,3,140,3,142,3,163,4,0,4,140,4,199,4,203, 4,208,4,248,5,49,5,90,5,97,5,137,5,176,5,187, 5,208,7,0,7,16,7,48,9,1,9,5,9,13,9,16, 9,19,9,53,9,60,9,69,9,71,9,75,9,80,9,102, 9,129,9,133,9,143,9,147,9,170,9,178,9,182,9,188, 9,190,9,199,9,203,9,215,9,220,9,223,9,230,10,5, 10,15,10,19,10,42,10,50,10,53,10,56,10,60,10,62, 10,71,10,75,10,89,10,94,10,102,10,114,10,129,10,133, 10,149,10,170,10,178,10,181,10,189,10,199,10,203,10,208, 10,230,11,2,11,5,11,9,11,11,11,15,11,19,11,21, 11,26,11,28,11,31,11,42,11,47,11,50,11,54,11,62, 11,71,11,96,11,102,11,130,11,133,11,142,11,146,11,153, 11,156,11,158,11,163,11,168,11,174,11,183,11,190,11,198, 11,202,11,215,11,218,11,225,12,131,12,133,12,142,12,146, 12,156,12,158,12,176,12,230,13,130,13,133,13,137,13,145, 13,148,13,153,13,158,13,160,13,164,13,167,13,173,13,179, 13,189,13,192,13,202,13,207,13,214,13,216,13,223,31,0, 31,24,31,32,31,72,31,80,31,89,31,91,31,93,31,95, 31,128,31,182,31,198,31,214,31,221,31,242,31,246,32,16, 32,19,32,24,32,38,32,48,32,57,32,68,32,71,32,75, 32,112,32,116,32,128,32,167,32,170,32,172,33,11,33,16, 33,22,33,27,33,34,33,38,33,42,33,48,33,83,33,144, 33,181,33,208,34,0,34,2,34,5,34,15,34,23,34,26, 34,29,34,32,34,39,34,52,34,60,34,62,34,65,34,73, 34,96,34,100,34,149,34,165,35,0,37,202,38,106,48,1, 48,5,48,7,48,20,48,65,48,153,48,155,48,161,246,57, 246,190,246,195,246,220,251,0,251,29,251,56,251,62,251,64, 251,67,251,70,255,253,255,255,255,245,255,227,255,194,255,193, 255,192,255,191,255,186,255,183,255,178,255,177,255,176,255,175, 255,154,255,152,255,150,255,148,255,146,255,140,255,112,255,111, 255,110,255,107,255,104,255,102,255,101,255,100,255,97,255,95, 255,94,255,92,255,91,255,80,255,79,255,78,255,41,255,39, 255,27,254,249,254,248,254,247,254,245,254,244,254,227,254,152, 254,148,254,145,254,140,254,139,254,138,254,137,254,88,254,44, 254,42,254,40,254,37,254,35,253,236,253,233,253,231,253,230, 253,193,253,192,253,181,252,160,252,158,252,155,250,229,250,227, 250,226,250,224,250,223,250,222,250,220,250,219,250,218,250,217, 250,215,250,195,250,179,250,178,250,176,250,174,250,173,250,172, 250,169,250,167,250,166,250,164,250,162,250,153,250,149,250,148, 250,146,250,136,250,132,250,130,250,129,250,128,250,127,250,126, 250,124,250,123,250,119,250,117,250,106,250,105,250,98,250,97, 250,85,250,83,250,74,250,73,250,72,250,71,250,68,250,65, 250,63,250,60,250,39,250,21,250,20,250,19,250,18,250,15, 250,12,250,11,250,10,250,9,250,8,250,0,249,253,249,252, 249,250,249,246,249,243,249,219,249,214,249,196,249,195,249,192, 249,191,249,188,249,187,249,186,249,183,249,180,249,177,249,176, 249,172,249,168,249,167,249,158,249,156,249,153,248,248,248,247, 248,244,248,243,248,242,248,241,248,234,248,184,248,38,248,37, 248,34,248,29,248,27,248,23,248,22,248,21,248,20,248,19, 248,18,248,17,248,16,248,14,248,11,248,7,248,6,248,5, 248,0,230,224,230,222,230,220,230,218,230,216,230,215,230,214, 230,213,230,212,230,210,230,209,230,208,230,206,230,205,230,203, 230,202,230,185,230,183,230,180,230,178,230,169,230,168,230,162, 230,160,230,159,230,123,230,121,230,115,230,86,230,85,230,84, 229,246,229,243,229,240,229,236,229,231,229,228,229,227,229,225, 229,194,229,178,229,147,229,121,229,78,229,77,229,76,229,71, 229,68,229,66,229,64,229,63,229,57,229,52,229,45,229,44, 229,42,229,37,229,15,229,12,228,221,228,208,228,118,225,173, 225,14,215,120,215,119,215,118,215,116,215,73,215,68,215,67, 215,62,18,4,17,136,17,132,17,108,13,73,13,51,13,50, 13,49,13,48,13,47,13,46,8,129,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,6,0,0,1,146,178,0,0,0,0,159,1,3, 0,160,192,1,0,0,0,0,0,0,0,127,126,123,128,117, 116,104,111,1,0,0,3,4,5,6,7,8,9,10,11,12, 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44, 45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60, 61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76, 77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92, 93,94,95,96,97,0,134,135,137,139,147,152,158,163,162,164, 166,165,167,169,171,170,172,173,175,174,176,177,179,181,180,182, 184,183,188,187,189,190,0,114,100,101,105,0,120,161,112,107, 0,118,106,0,136,154,0,115,0,0,103,119,0,0,0,0, 0,108,124,0,168,186,129,99,110,0,0,0,0,109,125,0, 98,130,133,151,0,0,0,0,0,0,0,0,185,0,193,0, 0,0,0,0,0,0,0,121,0,0,0,132,140,131,141,138, 143,144,145,142,149,150,0,148,156,157,155,0,0,0,113,0, 0,0,122,0,0,0,0,0,0,33,2,121,0,0,0,1, 255,255,0,2,0,2,0,33,0,0,1,110,2,154,0,3, 0,7,0,46,177,1,0,47,60,178,7,4,0,237,50,177, 6,5,220,60,178,3,2,0,237,50,0,177,3,0,47,60, 178,5,4,0,237,50,178,7,6,1,252,60,178,1,2,0, 237,50,51,17,33,17,37,33,17,33,33,1,77,254,212,1, 11,254,245,2,154,253,102,33,2,88,0,2,0,124,0,0, 0,208,2,217,0,5,0,9,0,0,19,17,7,35,39,17, 19,21,35,53,208,22,39,22,83,84,2,217,254,174,223,223, 1,82,253,143,104,104,0,2,0,52,1,208,1,49,2,197, 0,5,0,11,0,0,19,51,21,7,35,39,55,51,21,7, 35,39,52,93,27,39,27,160,93,27,39,27,2,197,111,134, 134,111,111,134,134,0,0,2,0,14,255,236,2,30,2,185, 0,27,0,31,0,0,1,7,51,21,35,7,51,21,35,7, 35,55,35,7,35,55,35,53,51,55,35,53,51,55,51,7, 51,55,3,35,7,51,1,229,36,93,106,31,105,117,39,76, 38,124,39,76,38,101,114,31,108,121,36,76,36,125,35,48, 124,32,125,2,185,196,68,174,68,211,211,211,211,68,174,68, 196,196,196,254,248,174,0,3,0,32,255,130,2,6,3,2, 0,51,0,58,0,67,0,0,19,51,21,22,23,22,23,20, 21,35,38,39,38,39,38,35,21,22,23,22,21,20,7,6, 7,6,7,21,35,53,38,39,38,55,52,53,51,22,23,22, 23,22,23,17,38,39,38,53,52,55,54,55,17,53,6,7, 6,21,20,23,17,54,55,54,53,52,39,38,243,59,126,47, 19,2,79,1,57,20,24,6,7,100,31,85,68,11,13,49, 75,59,154,43,14,1,79,7,14,2,2,35,71,93,33,71, 140,26,31,96,17,3,175,61,31,42,47,29,3,2,54,9, 93,38,47,5,5,77,34,11,4,1,249,31,17,48,106,104, 61,10,8,29,6,103,103,10,117,39,48,9,8,74,24,3, 4,48,9,1,16,28,24,51,95,146,42,8,4,254,201,240, 13,76,14,16,90,127,254,249,7,30,40,60,61,30,18,0, 0,5,0,29,255,236,3,91,2,197,0,16,0,33,0,37, 0,53,0,70,0,0,19,50,31,1,22,21,20,7,6,35, 34,39,38,53,52,55,54,23,34,15,1,6,21,20,23,22, 51,50,55,54,53,52,39,38,37,51,1,35,1,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,23,34,7,6, 21,20,23,22,51,50,55,54,53,52,47,1,38,199,84,51, 18,18,63,47,60,81,52,38,63,47,60,54,30,12,5,45, 26,31,54,30,17,48,24,1,124,66,254,117,66,1,218,85, 51,35,63,47,60,81,52,38,64,47,59,54,30,17,47,25, 30,54,30,17,48,23,15,2,173,66,28,37,42,79,51,39, 63,48,60,81,52,38,70,46,23,16,16,53,31,17,45,25, 30,57,30,15,94,253,39,1,86,66,46,60,79,51,39,63, 48,60,81,51,38,70,45,25,30,55,30,16,45,25,29,57, 30,10,5,0,0,3,0,52,255,233,2,125,2,197,0,41, 0,56,0,69,0,0,1,51,20,7,23,35,39,6,7,6, 35,34,39,38,53,52,55,54,55,38,39,38,53,52,55,54, 51,50,31,1,22,23,22,21,20,7,6,7,23,54,53,52, 39,54,55,54,53,52,39,38,35,34,7,6,21,20,23,19, 39,6,7,6,21,20,23,22,51,50,55,54,1,237,80,58, 122,109,62,49,28,56,76,116,56,33,52,36,74,70,9,2, 65,46,60,90,46,15,9,2,1,55,29,54,133,31,208,81, 15,7,45,19,23,60,20,6,25,178,160,94,20,8,54,35, 42,67,68,8,1,78,94,89,151,78,48,17,36,82,49,68, 81,53,36,43,88,48,13,14,77,47,33,66,28,21,24,9, 9,69,49,26,30,163,54,60,3,99,51,37,15,20,52,23, 10,50,16,20,33,35,254,164,200,60,50,20,24,65,38,25, 65,8,0,1,0,48,1,208,0,142,2,197,0,5,0,0, 19,51,21,7,35,39,48,94,27,40,27,2,197,111,134,134, 0,1,0,73,255,44,1,35,2,217,0,17,0,0,19,51, 6,7,6,21,20,23,22,23,35,38,39,38,53,52,55,54, 236,55,124,12,1,122,7,8,55,113,37,13,93,31,2,217, 200,229,21,20,233,213,13,12,148,192,68,63,179,179,61,0, 0,1,0,38,255,44,1,0,2,217,0,17,0,0,23,35, 54,55,54,53,52,39,38,39,51,22,23,22,21,20,7,6, 93,55,124,12,1,122,7,8,55,113,37,13,93,31,212,200, 229,21,20,233,213,13,12,148,192,68,63,179,179,61,0,1, 0,40,1,185,1,87,2,217,0,14,0,0,19,51,7,55, 23,7,23,7,39,7,39,55,39,55,23,160,63,5,106,19, 108,70,51,62,63,50,69,108,19,106,2,217,112,38,59,30, 89,36,93,93,36,89,30,59,38,0,0,1,0,50,255,246, 2,22,1,218,0,11,0,0,1,21,35,21,35,53,35,53, 51,53,51,21,2,22,207,70,207,207,70,1,11,70,207,207, 70,207,207,0,0,1,0,87,255,109,0,192,0,104,0,11, 0,0,55,51,21,20,35,53,54,55,54,61,1,35,87,105, 105,43,10,7,60,104,120,131,38,2,31,19,39,18,0,1, 0,46,0,240,1,28,1,56,0,3,0,0,1,21,35,53, 1,28,238,1,56,72,72,0,0,1,0,87,0,0,0,191, 0,104,0,3,0,0,55,21,35,53,191,104,104,104,104,0, 0,1,255,248,255,236,1,28,2,217,0,3,0,0,19,51, 3,35,229,55,237,55,2,217,253,19,0,2,0,43,255,233, 1,251,2,197,0,17,0,27,0,0,1,50,19,22,21,16, 7,6,35,34,39,38,53,52,55,54,55,50,23,34,17,16, 51,50,55,54,53,16,1,19,218,13,1,138,42,52,176,43, 13,69,54,95,7,7,142,140,118,21,5,2,197,254,183,21, 22,254,241,69,20,216,66,84,195,93,71,7,78,254,223,254, 220,192,46,57,1,30,0,1,0,102,0,0,1,91,2,197, 0,11,0,0,1,35,53,54,55,54,55,54,55,51,17,35, 1,3,157,102,30,30,21,2,2,58,88,1,249,63,13,23, 22,71,6,6,253,59,0,1,0,34,0,0,1,255,2,197, 0,35,0,0,1,50,31,1,22,21,20,15,1,6,7,6, 7,33,21,33,54,55,54,63,1,54,53,52,39,38,35,34, 15,1,6,7,35,54,55,54,1,28,121,64,19,23,150,100, 91,24,9,4,1,117,254,40,7,50,42,100,92,96,60,35, 45,75,40,7,17,4,88,3,35,60,2,197,80,30,44,54, 132,82,54,53,49,20,24,87,128,67,55,57,52,55,85,72, 39,22,57,12,32,68,100,54,92,0,0,1,0,32,255,233, 1,250,2,197,0,49,0,0,5,34,39,38,39,51,22,23, 22,51,50,55,54,53,52,35,7,35,53,54,55,54,53,52, 39,38,35,34,15,1,6,7,35,54,55,54,51,50,23,22, 21,20,7,22,23,22,21,20,7,6,1,10,197,32,3,2, 88,8,105,17,19,104,32,11,147,37,11,113,34,27,70,24, 31,78,35,6,15,1,88,4,186,15,17,140,52,24,99,93, 20,7,94,60,23,184,21,24,132,16,3,79,28,35,129,1, 75,2,31,25,53,85,27,9,53,10,29,60,210,18,1,94, 43,58,108,39,32,76,26,35,123,60,38,0,0,2,0,28, 0,0,2,8,2,197,0,10,0,13,0,0,37,33,53,1, 51,17,51,21,35,21,35,53,17,3,1,71,254,213,1,66, 65,105,105,88,222,170,93,1,190,254,52,79,170,249,1,54, 254,202,0,1,0,35,255,233,2,1,2,197,0,36,0,0, 1,21,33,7,54,51,50,23,22,21,20,7,6,35,34,39, 38,39,38,39,51,22,51,50,55,54,53,52,39,38,35,34, 7,6,7,35,19,1,220,254,217,28,59,72,120,64,45,87, 64,92,112,65,8,7,27,16,88,31,114,101,38,16,76,34, 45,64,45,10,11,81,53,2,197,87,198,43,87,61,88,129, 72,53,67,9,9,33,79,119,81,36,47,109,42,19,43,10, 13,1,130,0,0,2,0,43,255,233,2,1,2,197,0,30, 0,46,0,0,5,34,17,52,55,54,55,54,51,50,23,22, 23,35,38,39,38,35,34,7,6,21,54,51,50,23,22,21, 20,7,6,3,34,7,6,21,20,23,22,51,50,55,54,53, 52,39,38,1,25,238,64,56,100,17,17,115,55,23,8,88, 18,73,13,15,111,34,13,58,105,111,62,44,82,62,84,85, 40,22,61,36,47,76,40,25,71,29,23,1,90,185,100,84, 15,2,93,40,52,88,16,3,144,54,71,79,83,59,83,119, 68,52,1,130,66,36,47,86,46,27,63,40,51,102,37,15, 0,1,0,46,0,0,2,8,2,197,0,12,0,0,1,21, 2,3,6,7,35,54,55,54,55,33,53,2,8,202,66,12, 8,94,50,93,55,93,254,129,2,197,74,254,244,254,241,47, 49,218,171,101,132,87,0,3,0,37,255,233,2,1,2,197, 0,28,0,44,0,60,0,0,1,22,21,20,7,6,35,34, 39,38,53,52,55,38,39,38,53,52,55,54,51,50,23,22, 21,20,15,1,6,39,34,15,2,20,23,22,51,50,55,54, 53,52,39,38,3,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,1,135,122,86,63,89,124,67,47,121,72,16, 8,81,55,77,116,59,38,45,32,9,127,80,30,10,3,61, 27,35,80,30,13,65,25,33,89,39,20,66,34,46,91,39, 20,67,35,1,117,58,119,112,61,46,82,58,80,118,58,45, 48,23,31,99,53,37,76,48,65,68,41,26,6,252,58,26, 28,70,28,13,57,24,29,75,27,11,254,215,64,33,42,82, 38,20,65,33,42,82,38,19,0,2,0,38,255,233,1,253, 2,197,0,30,0,48,0,0,1,50,17,20,7,6,7,6, 35,34,39,38,39,51,22,23,22,51,50,55,54,53,6,7, 34,39,38,53,52,55,54,23,34,15,2,6,21,20,23,22, 51,50,55,54,53,52,39,38,1,14,239,65,53,97,20,20, 115,55,23,8,88,18,73,13,15,111,34,13,70,92,112,62, 44,82,62,87,76,40,15,8,2,71,29,38,83,41,23,61, 37,2,197,254,166,185,100,81,17,3,93,40,52,88,16,3, 144,54,71,77,2,83,59,83,119,68,52,77,64,30,35,13, 13,102,37,15,65,36,48,87,46,27,0,2,0,110,0,0, 0,214,2,12,0,3,0,7,0,0,55,21,35,53,19,21, 35,53,214,104,104,104,104,104,104,1,164,104,104,0,0,2, 0,110,255,109,0,215,2,12,0,3,0,15,0,0,19,21, 35,53,3,51,21,20,35,53,54,55,54,61,1,35,215,104, 1,105,105,43,10,7,60,2,12,104,104,254,92,120,131,38, 2,31,19,39,18,0,0,1,0,45,255,247,2,22,1,218, 0,6,0,0,55,53,37,21,13,1,21,45,1,233,254,118, 1,138,198,69,207,79,161,164,79,0,0,2,0,50,0,111, 2,22,1,97,0,3,0,7,0,0,1,21,33,53,5,21, 33,53,2,22,254,28,1,228,254,28,1,97,70,70,172,70, 70,0,0,1,0,50,255,247,2,27,1,218,0,6,0,0, 1,21,5,53,45,1,53,2,27,254,23,1,138,254,118,1, 11,69,207,79,161,164,79,0,0,2,0,77,0,0,1,253, 2,229,0,37,0,41,0,0,37,35,53,52,55,54,55,54, 55,54,55,52,47,1,38,35,34,7,6,21,35,52,55,54, 51,50,31,1,22,21,20,7,6,7,6,7,6,29,2,35, 53,1,74,90,28,17,35,7,17,74,1,61,31,17,19,82, 30,17,85,180,19,20,126,56,16,15,51,19,30,63,10,6, 90,199,55,50,37,22,33,6,15,66,66,70,30,10,4,58, 34,64,211,21,2,83,30,36,43,70,59,23,27,58,27,15, 24,142,104,104,0,2,0,34,255,114,3,183,2,229,0,70, 0,89,0,0,1,51,3,6,21,20,23,22,51,50,55,54, 53,52,39,38,39,34,35,34,15,1,6,21,20,23,22,51, 50,55,23,6,35,34,39,38,39,38,53,52,55,54,55,54, 55,54,51,50,23,22,23,22,21,20,7,6,35,34,39,6, 35,34,39,38,53,52,55,54,55,50,23,39,34,7,6,21, 20,23,22,51,50,55,54,55,54,55,39,38,39,38,2,153, 83,90,12,29,10,11,64,53,51,97,99,141,7,8,147,113, 34,99,105,108,162,79,114,28,112,114,180,131,122,19,3,95, 28,35,108,151,37,37,166,123,116,18,3,86,76,110,96,14, 66,76,82,47,34,79,77,101,84,38,128,66,50,45,47,24, 28,58,44,33,16,4,1,2,11,47,16,1,245,254,232,35, 15,27,13,4,72,71,87,120,89,92,6,102,34,113,142,141, 97,100,32,67,42,107,100,147,23,23,154,130,39,31,98,25, 6,101,94,135,21,21,121,102,89,77,72,69,49,65,109,84, 83,1,87,23,71,63,80,67,34,17,65,48,84,22,17,26, 48,16,6,0,0,2,0,17,0,0,2,141,2,217,0,7, 0,10,0,0,37,33,7,35,1,51,1,35,11,2,1,218, 254,231,77,99,1,4,120,1,0,104,101,112,120,219,219,2, 217,253,39,1,41,1,76,254,180,0,0,3,0,79,0,0, 2,111,2,217,0,18,0,28,0,39,0,0,51,17,33,50, 23,22,21,20,7,22,23,22,23,20,21,20,7,6,35,3, 51,50,55,54,52,39,38,43,1,1,52,39,38,43,1,21, 51,50,55,54,79,1,40,103,55,58,101,105,21,6,1,56, 57,102,236,180,72,34,40,40,34,72,180,1,102,71,26,34, 227,227,65,32,34,2,217,51,52,82,112,47,41,80,20,23, 6,7,88,59,61,1,159,26,31,118,31,26,254,72,87,28, 11,251,35,36,0,1,0,48,255,233,2,165,2,229,0,31, 0,0,1,35,38,39,38,39,34,7,6,21,20,23,22,51, 50,55,54,55,54,55,51,2,33,34,39,38,53,52,55,54, 51,50,2,150,95,15,38,54,90,128,61,40,95,59,83,109, 51,6,4,22,11,96,33,254,245,141,82,106,102,82,149,238, 1,247,75,35,44,2,115,75,112,170,79,49,77,8,9,42, 71,254,223,85,109,185,183,111,91,0,0,2,0,89,0,0, 2,155,2,217,0,11,0,22,0,0,51,17,33,50,31,1, 22,21,20,7,6,35,39,51,50,55,54,53,52,39,38,43, 1,89,1,25,163,79,22,33,116,73,108,188,172,174,37,9, 168,25,27,172,2,217,132,43,81,108,209,95,61,82,181,45, 56,246,32,5,0,1,0,90,0,0,2,101,2,217,0,11, 0,0,19,21,33,21,33,17,33,21,33,21,33,21,183,1, 174,253,245,1,249,254,100,1,141,1,76,250,82,2,217,82, 233,82,0,1,0,90,0,0,2,67,2,217,0,9,0,0, 19,17,35,17,33,21,33,21,33,21,183,93,1,233,254,116, 1,92,1,76,254,180,2,217,82,233,82,0,0,1,0,44, 255,233,2,197,2,229,0,41,0,0,1,17,35,39,6,35, 34,39,38,53,52,55,54,55,54,51,50,23,22,23,35,38, 39,38,35,34,7,6,21,20,23,22,23,22,23,50,55,54, 61,1,35,53,2,197,59,23,104,145,153,94,87,102,14,16, 85,133,179,81,33,12,95,21,95,42,53,132,71,53,61,8, 8,72,112,114,66,49,222,1,129,254,123,97,116,114,104,162, 176,110,15,13,70,118,49,66,98,36,17,104,78,115,126,84, 10,9,72,2,80,60,84,20,82,0,0,1,0,83,0,0, 2,132,2,217,0,11,0,0,1,33,17,35,17,51,17,33, 17,51,17,35,2,39,254,138,94,93,1,119,93,93,1,76, 254,180,2,217,254,197,1,59,253,39,0,1,0,100,0,0, 0,194,2,217,0,3,0,0,19,17,35,17,194,94,2,217, 253,39,2,217,0,1,0,17,255,233,1,170,2,217,0,21, 0,0,1,51,17,20,7,6,35,34,39,38,61,1,51,21, 20,23,22,51,50,55,54,53,1,77,93,90,49,67,124,52, 27,95,81,13,15,58,31,23,2,217,253,221,124,53,28,86, 46,61,64,47,111,18,3,45,34,82,0,1,0,79,0,0, 2,146,2,217,0,11,0,0,19,21,35,17,51,17,1,51, 9,1,35,1,172,93,93,1,107,120,254,215,1,44,110,254, 255,0,255,255,2,217,254,143,1,113,254,215,254,80,1,118, 0,1,0,80,0,0,2,21,2,217,0,5,0,0,19,17, 33,21,33,17,173,1,104,254,59,2,217,253,121,82,2,217, 0,1,0,75,0,0,2,249,2,217,0,12,0,0,33,35, 3,17,35,17,51,27,1,51,17,35,17,1,212,98,207,88, 129,216,212,129,88,2,99,253,157,2,217,253,133,2,123,253, 39,2,99,0,0,1,0,76,0,0,2,134,2,217,0,9, 0,0,1,17,35,1,17,35,17,51,1,17,2,134,105,254, 135,88,101,1,125,2,217,253,39,2,79,253,177,2,217,253, 172,2,84,0,0,2,0,38,255,233,2,230,2,229,0,18, 0,34,0,0,1,50,31,1,22,21,20,7,6,7,6,35, 34,39,38,53,52,55,54,23,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,1,133,174,97,26,56,82,20,24, 91,135,167,98,87,111,95,145,130,72,56,95,67,97,129,72, 58,98,66,2,229,123,38,96,131,148,105,26,20,77,117,104, 161,184,107,91,82,102,80,118,158,83,59,100,79,117,165,83, 56,0,0,2,0,91,0,0,2,105,2,217,0,12,0,24, 0,0,19,17,35,17,33,50,23,22,21,20,7,6,35,39, 51,50,55,54,53,52,47,1,38,43,1,184,93,1,45,161, 47,17,63,58,83,229,194,102,30,10,79,34,14,15,194,1, 53,254,203,2,217,118,41,55,97,57,52,82,74,24,30,90, 28,8,2,0,0,2,0,38,255,197,2,230,2,229,0,18, 0,37,0,0,5,7,39,6,35,34,39,38,53,52,55,54, 51,50,23,22,21,20,7,39,23,54,53,52,39,38,35,34, 7,6,21,20,23,22,51,50,55,39,2,221,47,105,86,105, 167,98,87,111,96,145,166,98,88,103,158,89,79,94,68,97, 131,72,56,95,67,96,60,60,74,1,58,87,51,117,104,161, 184,107,91,116,104,160,172,113,129,73,89,139,157,83,59,102, 80,118,159,83,58,28,62,0,0,2,0,93,0,0,2,167, 2,217,0,29,0,40,0,0,19,17,35,17,33,50,23,22, 21,20,7,6,7,22,23,22,23,22,23,22,23,21,35,38, 53,55,52,39,38,35,39,51,50,55,54,53,52,39,38,43, 1,186,93,1,80,170,41,11,72,19,24,62,19,17,1,2, 17,9,16,113,21,1,80,18,22,240,225,121,18,4,38,32, 73,225,1,58,254,198,2,217,120,33,42,98,51,13,12,27, 40,37,86,96,27,13,11,23,48,71,65,109,17,4,82,86, 17,22,66,32,28,0,0,1,0,48,255,233,2,109,2,229, 0,54,0,0,1,35,38,39,38,35,34,15,1,6,21,20, 23,22,31,1,22,23,22,21,20,7,6,7,6,35,34,39, 38,39,51,23,22,23,22,51,50,55,54,55,54,53,52,47, 2,38,53,52,55,54,51,50,23,22,2,84,88,1,109,32, 40,104,41,12,6,54,25,41,183,120,28,7,58,11,11,73, 132,169,76,42,1,88,3,7,28,51,117,89,45,44,7,1, 110,24,181,143,104,64,91,176,63,28,2,3,111,29,8,62, 24,17,20,56,28,13,11,49,33,97,25,28,84,63,11,9, 56,104,57,94,38,41,33,61,31,31,56,7,7,76,35,7, 48,37,133,124,56,34,111,49,0,1,0,21,0,0,2,81, 2,217,0,7,0,0,1,17,35,17,35,53,33,21,1,98, 93,240,2,60,2,135,253,121,2,135,82,82,0,1,0,85, 255,233,2,133,2,217,0,21,0,0,1,51,17,20,7,6, 35,34,39,38,53,17,51,17,20,23,22,51,50,55,54,53, 2,40,93,104,72,105,165,73,41,93,110,34,42,124,45,19, 2,217,254,0,130,65,45,101,58,81,2,0,254,0,117,31, 10,80,34,44,0,1,0,30,0,0,2,133,2,217,0,6, 0,0,33,35,1,51,27,1,51,1,136,100,254,250,100,214, 202,99,2,217,253,151,2,105,0,1,0,22,0,0,3,161, 2,217,0,12,0,0,33,35,11,1,35,3,51,27,1,51, 27,1,51,2,232,102,168,163,102,187,104,137,162,100,166,134, 104,2,87,253,169,2,217,253,176,2,80,253,176,2,80,0, 0,1,0,22,0,0,2,137,2,217,0,11,0,0,9,1, 35,11,1,35,1,3,51,27,1,51,1,135,1,2,115,199, 200,113,1,2,242,113,187,188,111,1,118,254,138,1,48,254, 208,1,118,1,99,254,226,1,30,0,0,1,0,13,0,0, 2,149,2,217,0,8,0,0,1,17,35,17,1,51,27,1, 51,1,131,93,254,231,115,214,208,111,1,30,254,226,1,30, 1,187,254,157,1,99,0,1,0,28,0,0,2,71,2,217, 0,9,0,0,1,21,1,33,21,33,53,1,33,53,2,69, 254,76,1,182,253,213,1,182,254,102,2,217,84,253,205,82, 82,2,53,82,0,1,0,64,255,44,0,250,2,217,0,7, 0,0,19,21,35,17,51,21,35,17,250,103,103,186,2,217, 72,252,227,72,3,173,0,1,255,248,255,236,1,28,2,217, 0,3,0,0,27,1,35,3,47,237,55,237,2,217,253,19, 2,237,0,1,0,23,255,44,0,209,2,217,0,7,0,0, 23,53,51,17,35,53,51,17,23,103,103,186,212,72,3,29, 72,252,83,0,0,1,0,44,1,73,1,169,2,197,0,6, 0,0,19,51,19,35,11,1,35,197,73,155,69,122,121,69, 2,197,254,132,1,44,254,212,0,1,255,234,255,80,2,66, 255,130,0,3,0,0,5,21,33,53,2,66,253,168,126,50, 50,0,0,1,0,22,2,80,0,231,2,228,0,3,0,0, 19,23,35,39,135,96,60,149,2,228,148,148,0,2,0,42, 255,233,2,23,2,27,0,45,0,62,0,0,37,21,6,35, 34,39,38,39,6,7,34,39,38,53,52,55,54,55,54,55, 54,55,54,61,1,52,39,38,35,34,7,6,7,35,54,55, 54,51,50,23,22,21,17,20,51,50,39,53,6,7,6,7, 6,7,6,21,20,23,22,51,50,55,54,2,23,35,22,71, 13,1,1,87,91,110,43,19,92,36,94,16,22,73,11,3, 81,17,19,103,17,2,1,84,3,33,55,119,176,19,2,45, 9,137,32,82,9,11,106,16,4,67,16,20,72,52,32,49, 63,9,63,7,7,76,1,75,35,45,102,38,15,12,2,3, 9,29,8,12,22,64,12,2,75,9,9,72,37,61,116,13, 14,254,204,41,118,94,15,11,1,2,15,54,12,15,65,15, 4,47,29,0,0,2,0,54,255,233,2,11,2,217,0,16, 0,32,0,0,19,51,17,54,51,50,23,22,21,20,7,6, 35,34,39,21,35,19,34,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,54,83,57,105,128,59,37,91,57,80,107, 59,75,229,83,39,24,69,33,44,84,42,27,72,37,2,217, 254,236,86,108,68,99,161,77,49,90,67,1,205,84,50,69, 125,52,26,79,51,70,127,53,25,0,0,1,0,31,255,233, 1,221,2,27,0,32,0,0,1,35,38,47,1,34,7,6, 21,20,23,22,51,50,55,51,6,7,6,35,34,39,38,53, 52,55,54,51,50,23,22,23,22,1,215,84,13,84,27,94, 35,16,79,29,39,107,21,84,11,104,43,56,129,62,41,92, 59,82,106,58,4,4,29,1,92,97,15,2,100,46,63,137, 45,17,126,137,46,20,105,70,101,160,77,49,68,5,5,43, 0,2,0,26,255,233,1,239,2,217,0,18,0,36,0,0, 1,17,35,53,6,7,6,35,34,39,38,53,52,55,54,51, 50,23,17,3,34,7,6,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,1,239,74,58,86,11,12,130,60,38,89, 57,79,108,53,147,85,41,20,5,1,70,36,47,83,39,24, 72,33,2,217,253,39,69,83,8,1,112,71,103,154,75,47, 81,1,15,254,244,82,38,51,16,16,122,54,27,82,50,69, 131,51,23,0,0,2,0,40,255,233,2,1,2,27,0,25, 0,36,0,0,37,33,22,23,22,51,50,55,51,6,7,6, 35,34,39,38,53,52,55,54,51,50,23,22,23,22,5,33, 54,53,52,39,38,35,34,7,6,2,1,254,126,1,27,43, 83,102,35,84,22,104,44,54,136,63,39,94,60,86,115,65, 20,12,21,254,128,1,38,1,59,38,48,85,41,20,234,72, 40,68,105,121,43,18,110,68,100,158,77,49,82,25,31,55, 44,2,4,80,45,29,75,36,0,1,0,18,0,0,1,2, 2,220,0,21,0,0,1,21,35,17,35,17,35,53,51,53, 52,55,54,51,50,23,21,38,35,34,29,1,1,2,87,83, 70,70,74,22,27,23,24,19,10,58,2,12,68,254,56,1, 200,68,89,88,24,7,5,69,1,53,82,0,0,2,0,29, 255,38,1,233,2,27,0,39,0,55,0,0,1,51,17,20, 7,6,7,6,7,6,35,34,39,38,39,51,22,23,22,51, 50,55,54,61,1,6,15,1,34,39,38,39,38,53,52,55, 54,51,50,23,39,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,1,156,77,41,7,7,48,109,11,11,138,50, 17,4,85,6,26,36,59,81,35,30,59,73,27,83,61,3, 3,66,85,57,81,98,62,151,88,37,20,78,29,39,89,35, 18,82,27,2,12,254,74,154,64,10,9,60,6,1,88,31, 39,39,21,28,49,41,102,27,82,10,2,64,3,3,77,129, 153,79,54,91,14,90,48,66,139,47,18,92,46,63,150,43, 14,0,0,1,0,70,0,0,1,230,2,217,0,23,0,0, 19,51,17,54,55,54,51,50,23,22,21,17,35,17,52,39, 38,35,34,7,6,21,17,35,70,83,54,66,21,27,110,39, 16,83,34,32,42,84,37,21,83,2,217,254,235,70,13,4, 74,30,39,254,116,1,107,55,24,24,77,42,58,254,223,0, 0,2,0,66,0,0,0,150,2,217,0,3,0,7,0,0, 19,17,35,17,55,21,35,53,150,83,83,84,2,12,253,244, 2,12,205,105,105,0,0,2,255,238,255,38,0,153,2,217, 0,15,0,19,0,0,19,51,17,20,7,34,35,34,39,53, 22,51,50,55,54,53,19,21,35,53,70,83,128,7,8,13, 15,17,3,52,11,5,83,83,2,12,253,135,103,6,3,71, 1,32,14,23,3,37,105,105,0,1,0,58,0,0,1,246, 2,217,0,11,0,0,19,17,55,51,7,19,35,3,7,21, 35,17,141,222,107,182,214,103,177,81,83,2,217,254,85,222, 181,254,169,1,28,80,204,2,217,0,0,1,0,68,0,0, 0,152,2,217,0,3,0,0,19,17,35,17,152,84,2,217, 253,39,2,217,0,1,0,70,0,0,2,250,2,27,0,42, 0,0,19,51,21,54,55,54,51,50,23,22,23,54,55,54, 51,50,23,22,21,17,35,17,52,39,38,35,34,7,6,21, 17,35,17,52,39,38,35,34,7,6,21,17,35,70,77,54, 74,15,18,89,43,5,4,54,63,20,24,122,25,5,84,63, 16,18,61,37,25,84,71,12,14,62,37,24,84,2,12,74, 76,11,2,65,7,8,65,11,4,98,22,26,254,119,1,105, 81,19,5,54,37,46,254,183,1,105,87,15,3,56,36,45, 254,183,0,1,0,70,0,0,1,231,2,27,0,23,0,0, 19,51,21,54,55,54,51,50,23,22,21,17,35,17,52,39, 38,35,34,7,6,21,17,35,70,77,54,76,20,24,105,42, 19,83,59,21,28,84,37,21,84,2,12,88,85,14,4,70, 32,41,254,116,1,107,70,24,9,77,42,58,254,223,0,2, 0,36,255,233,1,254,2,27,0,15,0,31,0,0,1,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,54,23,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,1,16, 152,57,29,102,56,79,144,60,33,105,55,77,93,38,19,78, 31,41,90,39,21,82,30,2,27,129,65,91,167,71,39,119, 67,95,174,70,37,77,92,48,64,137,48,19,88,47,66,145, 46,16,0,2,0,54,255,38,2,11,2,27,0,18,0,34, 0,0,23,17,51,21,54,51,50,23,22,21,20,7,6,7, 6,35,34,39,17,19,34,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,54,77,59,108,127,60,38,89,39,52,21, 23,97,64,146,83,39,24,69,33,44,84,42,26,71,35,218, 2,230,79,94,111,71,104,154,75,33,10,4,78,254,239,2, 167,84,50,69,125,52,26,81,50,69,127,53,26,0,0,2, 0,26,255,38,1,239,2,27,0,16,0,32,0,0,5,35, 17,6,35,34,39,38,53,52,55,54,51,50,23,53,51,7, 34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,1, 239,83,57,105,128,59,37,91,57,80,107,60,74,229,84,42, 27,70,36,47,82,40,24,71,33,218,1,22,83,108,68,99, 161,77,49,85,70,63,81,51,71,122,54,27,81,50,69,131, 51,24,0,1,0,69,0,0,1,65,2,27,0,17,0,0, 19,51,21,54,55,54,51,50,23,21,6,7,6,7,6,21, 17,35,69,77,58,58,13,14,11,21,72,31,3,3,59,84, 2,12,95,93,14,3,3,85,1,21,2,2,43,110,254,240, 0,1,0,34,255,233,1,203,2,27,0,48,0,0,1,35, 38,35,34,7,6,21,20,23,22,31,1,22,23,22,21,20, 7,6,35,34,39,38,53,51,22,23,22,51,50,55,54,53, 52,47,2,38,39,38,53,52,55,54,51,50,23,22,1,182, 88,3,102,82,23,6,66,14,17,80,118,23,7,90,52,74, 194,14,1,88,6,18,33,71,84,28,10,54,27,78,119,31, 16,84,49,68,145,35,10,1,122,84,49,14,16,45,22,4, 4,19,28,70,21,27,96,44,26,162,8,9,47,20,35,47, 16,19,46,19,8,19,29,51,28,43,93,42,25,101,27,0, 0,1,0,14,255,233,0,254,2,156,0,23,0,0,19,21, 35,17,20,23,22,51,50,55,21,6,35,34,39,38,53,17, 35,53,51,53,51,21,254,86,22,9,15,25,15,39,29,89, 11,1,71,71,83,2,12,68,254,153,38,6,3,4,70,7, 67,7,9,1,140,68,144,144,0,1,0,65,255,233,1,226, 2,12,0,23,0,0,33,35,53,6,7,6,35,34,39,38, 53,17,51,17,20,23,22,51,50,55,54,53,17,51,1,226, 75,56,74,20,25,107,41,19,83,59,22,27,85,38,20,83, 73,79,13,4,70,32,41,1,148,254,141,70,24,9,78,42, 57,1,41,0,0,1,0,10,0,0,1,230,2,12,0,6, 0,0,33,35,3,51,27,1,51,1,29,91,184,94,140,148, 94,2,12,254,87,1,169,0,0,1,0,6,0,0,2,196, 2,12,0,12,0,0,33,35,11,1,35,3,51,27,1,51, 27,1,51,2,42,95,106,101,94,152,92,107,100,102,103,104, 94,1,155,254,101,2,12,254,104,1,152,254,104,1,152,0, 0,1,0,17,0,0,1,217,2,12,0,11,0,0,1,19, 35,39,7,35,19,3,51,23,55,51,1,36,181,97,131,133, 95,185,175,95,126,126,94,1,15,254,241,201,201,1,11,1, 1,190,190,0,0,1,0,20,255,38,1,222,2,12,0,19, 0,0,1,51,3,6,7,6,35,34,39,53,22,51,50,55, 54,63,1,3,51,19,1,132,90,233,22,35,34,44,31,25, 27,17,45,18,2,2,32,177,89,134,2,12,253,134,57,26, 25,13,75,6,40,5,6,83,2,14,254,104,0,1,0,31, 0,0,1,201,2,12,0,9,0,0,1,21,1,33,21,33, 53,1,33,53,1,187,254,201,1,69,254,86,1,57,254,220, 2,12,74,254,135,73,75,1,120,73,0,1,0,43,255,44, 1,20,2,217,0,41,0,0,1,21,35,34,15,1,29,1, 20,15,1,6,7,22,29,1,20,23,22,59,1,21,35,34, 39,38,61,1,52,39,38,39,53,54,55,54,61,1,52,55, 54,51,1,20,15,47,11,5,41,23,8,10,82,25,13,25, 15,46,82,21,6,35,16,27,54,14,10,71,18,20,2,217, 65,27,26,14,181,98,35,16,4,4,38,120,181,50,11,6, 65,80,23,28,167,93,27,12,6,69,11,44,29,54,167,102, 23,6,0,1,0,100,255,44,0,160,2,217,0,3,0,0, 19,51,17,35,100,60,60,2,217,252,83,0,0,1,0,29, 255,44,1,6,2,217,0,38,0,0,23,53,51,50,55,54, 61,1,52,55,38,61,1,52,39,38,43,1,53,51,50,23, 22,29,1,20,23,22,23,21,6,7,6,29,1,20,7,6, 35,29,16,48,11,5,82,82,26,13,25,16,47,83,21,6, 36,15,25,52,15,9,73,17,20,212,65,27,14,26,181,120, 37,38,120,181,50,11,6,65,81,23,27,167,94,27,12,5, 69,11,46,28,53,167,103,23,5,0,0,1,0,75,1,12, 1,252,1,182,0,27,0,0,1,51,21,20,7,6,35,34, 47,1,38,35,34,7,6,7,35,54,55,54,51,50,31,1, 22,51,50,55,1,199,53,57,21,27,39,42,98,23,20,29, 16,5,3,53,7,84,8,9,27,27,117,28,22,44,6,1, 155,16,85,30,12,26,63,14,35,14,29,131,13,1,16,69, 17,49,255,255,0,0,0,0,0,0,0,0,16,6,0,3, 0,0,0,2,0,121,255,51,0,205,2,12,0,5,0,9, 0,0,23,17,55,51,23,17,3,53,51,21,122,22,39,22, 84,84,205,1,82,223,223,254,174,2,113,104,104,0,0,2, 0,52,255,136,1,254,2,116,0,30,0,37,0,0,1,17, 54,55,51,6,7,6,7,21,35,53,38,39,38,53,52,55, 54,55,53,51,21,22,23,22,23,35,38,39,38,3,17,6, 21,20,23,22,1,56,96,18,84,7,93,43,55,42,129,56, 33,98,51,69,42,136,42,12,2,84,9,69,14,58,131,85, 21,1,206,254,103,11,116,124,52,24,3,97,98,11,112,64, 88,163,76,39,7,90,89,9,109,33,40,85,23,5,254,106, 1,150,24,184,138,45,11,0,0,1,0,26,255,233,2,23, 2,217,0,63,0,0,1,21,35,22,21,20,7,6,7,54, 51,50,23,22,51,50,55,23,6,35,34,39,38,39,38,35, 34,7,39,54,55,54,53,52,39,35,53,51,38,39,38,53, 52,55,54,51,50,23,22,23,22,23,35,38,35,34,7,6, 21,20,31,1,22,23,1,110,136,15,58,23,37,59,63,35, 47,55,24,40,43,42,57,74,44,83,9,10,33,33,53,56, 48,102,18,5,24,110,81,46,5,2,80,66,92,113,62,9, 8,27,1,88,4,132,89,36,16,22,21,4,12,1,120,55, 43,28,55,69,28,37,39,15,16,30,66,56,28,3,4,11, 37,66,88,63,19,21,38,40,55,76,33,12,18,99,63,52, 74,12,13,46,87,154,63,29,36,38,42,39,4,24,0,2, 0,67,0,133,1,233,2,39,0,27,0,44,0,0,37,7, 39,6,35,34,39,7,39,55,38,53,52,55,39,55,23,54, 51,50,23,55,23,7,22,21,20,7,39,34,15,1,6,21, 20,23,22,51,50,55,54,53,52,39,38,1,229,58,53,40, 60,53,41,51,56,48,32,32,54,56,55,44,53,58,40,59, 57,55,26,29,157,57,31,12,6,47,27,33,55,32,19,48, 27,190,54,53,30,25,51,57,49,43,59,57,45,55,53,55, 26,28,53,58,55,41,52,50,47,201,47,24,17,17,55,31, 18,45,27,31,58,31,17,0,0,1,0,11,0,0,2,33, 2,197,0,22,0,0,1,21,35,21,51,21,35,21,35,53, 35,53,51,53,35,53,51,3,51,27,1,51,3,1,239,170, 170,170,88,172,172,172,151,205,85,185,179,85,201,1,98,51, 77,51,175,175,51,77,51,1,99,254,190,1,66,254,157,0, 0,2,0,100,255,44,0,160,2,217,0,3,0,7,0,0, 19,51,17,35,21,51,17,35,100,60,60,60,60,2,217,254, 111,139,254,111,0,2,0,43,255,43,1,250,2,217,0,66, 0,80,0,0,1,35,53,52,39,38,35,34,15,1,6,21, 20,23,22,31,1,22,23,22,21,20,7,22,23,22,21,20, 7,6,35,34,39,38,39,38,53,51,20,23,22,51,50,55, 54,53,52,47,1,38,39,38,53,52,55,54,55,38,53,52, 55,54,51,50,23,22,21,1,23,54,53,52,47,1,6,7, 6,21,20,23,22,1,208,84,55,19,23,54,24,9,2,43, 7,7,146,82,19,8,109,48,4,1,71,50,66,100,52,15, 8,11,85,18,29,55,64,23,9,55,170,84,7,1,79,12, 14,44,68,50,67,99,48,28,254,236,166,73,73,161,62,7, 2,30,13,2,12,26,71,23,8,43,23,9,10,36,31,5, 5,94,53,56,25,33,115,41,55,48,7,8,85,49,34,69, 20,24,33,53,54,24,44,47,18,21,50,38,117,58,81,9, 9,84,51,8,7,51,51,79,49,37,74,43,60,254,189,123, 39,63,61,51,109,40,42,9,10,41,29,12,0,2,0,30, 2,100,1,40,2,203,0,3,0,7,0,0,19,21,35,53, 33,21,35,53,134,104,1,10,104,2,203,103,103,103,103,0, 0,3,255,243,255,234,2,239,2,230,0,32,0,56,0,72, 0,0,19,20,23,22,51,50,55,54,55,51,6,7,6,35, 34,39,38,53,52,55,54,51,50,31,1,35,38,39,38,35, 34,7,6,19,50,23,22,23,22,21,20,7,6,7,6,35, 34,39,38,39,38,53,52,55,54,55,54,23,34,7,6,7, 20,23,22,23,50,55,54,53,52,39,38,250,54,31,40,82, 22,1,1,71,16,25,49,87,101,54,39,80,49,68,120,39, 7,71,20,50,12,16,75,32,18,119,151,110,108,12,1,106, 103,153,13,12,145,109,107,14,2,103,102,147,15,15,129,92, 92,1,91,95,124,135,92,91,92,91,1,102,95,48,27,114, 5,5,79,37,70,85,61,85,131,64,40,129,26,77,13,3, 76,41,1,73,103,101,147,15,15,155,110,108,9,1,102,101, 143,18,18,151,110,108,12,1,62,93,93,134,130,94,94,2, 95,93,133,131,94,93,0,3,0,37,1,47,1,77,2,230, 0,3,0,43,0,55,0,0,1,21,33,53,37,21,6,35, 34,39,52,39,6,35,34,39,38,53,52,55,54,55,54,55, 54,61,1,52,39,34,7,6,7,35,54,55,50,51,50,29, 1,20,51,50,39,53,6,7,6,15,1,22,23,50,55,54, 1,64,254,235,1,34,16,16,44,10,1,49,56,74,23,7, 57,32,68,43,5,1,67,47,13,5,3,59,3,115,5,6, 122,23,4,84,14,62,63,8,1,9,48,52,27,12,1,98, 51,51,95,44,6,37,3,3,43,56,18,22,62,25,13,5, 3,19,5,6,13,43,1,28,11,17,103,5,94,179,23,71, 51,6,10,8,32,14,43,4,35,15,0,2,0,98,0,106, 1,199,1,182,0,6,0,13,0,0,55,53,55,21,7,23, 21,55,53,55,21,7,23,21,98,152,106,106,53,152,106,106, 227,89,122,83,83,83,83,121,89,122,83,83,83,83,0,1, 0,40,0,86,2,32,1,119,0,5,0,0,19,33,17,35, 53,33,40,1,248,70,254,78,1,119,254,223,219,0,0,1, 0,46,0,240,1,28,1,56,0,3,0,0,1,21,35,53, 1,28,238,1,56,72,72,0,0,4,255,243,255,234,2,239, 2,230,0,25,0,33,0,57,0,73,0,0,1,21,35,17, 51,50,21,20,15,1,22,23,22,23,22,23,22,23,21,35, 38,53,55,52,47,2,51,54,55,52,47,1,35,55,50,23, 22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,53, 52,55,54,55,54,23,34,7,6,7,20,23,22,23,50,55, 54,53,52,39,38,1,16,70,206,141,32,22,33,7,4,1, 1,13,3,6,79,15,1,46,18,134,129,71,4,52,23,129, 97,151,110,108,12,1,106,103,153,13,12,145,109,107,14,2, 103,102,147,15,15,129,92,92,1,91,95,124,135,92,91,92, 91,1,69,185,1,189,126,51,30,18,21,29,19,43,61,14, 4,4,25,35,42,40,59,8,1,63,9,58,58,7,2,220, 103,101,147,15,15,155,110,108,9,1,102,101,143,18,18,151, 110,108,12,1,62,93,93,134,130,94,94,2,95,93,133,131, 94,93,0,1,0,28,2,119,1,46,2,189,0,3,0,0, 1,21,33,53,1,46,254,238,2,189,70,70,0,2,0,151, 1,127,1,198,2,174,0,15,0,31,0,0,1,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,23,34,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,1,47,74,45, 32,60,41,52,72,46,32,60,40,52,52,28,15,44,23,26, 55,27,14,44,23,2,174,59,41,51,76,45,31,59,41,52, 74,46,31,57,44,23,27,51,29,15,46,22,27,52,28,14, 0,2,0,50,255,245,2,22,2,111,0,11,0,15,0,0, 1,21,35,21,35,53,35,53,51,53,51,21,19,21,33,53, 2,22,207,70,207,207,70,207,254,28,1,160,70,207,207,70, 207,207,254,155,70,70,0,1,0,19,1,28,1,70,2,197, 0,33,0,0,1,21,33,54,55,54,63,1,54,53,52,39, 38,35,34,7,6,7,35,54,55,50,51,50,31,1,22,21, 20,15,1,6,15,1,1,67,254,208,4,38,26,59,58,59, 43,19,23,51,23,10,3,62,4,134,6,7,87,39,13,7, 96,63,49,16,8,1,86,58,85,42,29,31,31,32,47,45, 21,9,39,17,43,145,7,59,25,20,22,82,47,32,26,34, 20,0,0,1,0,16,1,14,1,66,2,197,0,45,0,0, 19,53,50,55,54,53,52,47,1,34,7,6,21,35,54,51, 50,23,22,21,20,7,22,21,20,7,6,35,34,39,38,53, 51,22,23,22,51,50,55,54,53,52,39,38,39,38,135,85, 17,8,50,26,53,19,9,63,3,141,96,32,11,57,71,71, 36,48,113,29,9,62,4,63,11,13,72,15,3,40,8,10, 15,1,220,51,26,13,22,52,13,3,35,17,37,142,66,24, 30,59,26,24,76,82,34,18,86,25,31,78,9,2,56,11, 14,46,18,4,2,2,0,1,0,92,2,80,1,45,2,228, 0,3,0,0,19,51,7,35,188,113,149,60,2,228,148,0, 0,1,0,65,255,36,2,32,2,12,0,30,0,0,37,21, 6,35,34,39,38,53,6,35,34,39,21,35,17,51,17,20, 23,22,51,50,55,54,53,17,51,17,20,51,50,2,32,33, 24,79,6,1,59,104,54,36,83,83,58,22,27,85,38,20, 83,45,8,49,63,9,73,5,5,83,26,223,2,232,254,141, 70,24,9,78,42,57,1,41,254,76,41,0,0,1,0,48, 255,79,2,10,2,217,0,19,0,0,1,21,35,17,35,17, 35,17,35,17,38,39,38,39,38,53,52,55,54,51,2,10, 57,64,82,64,77,48,73,8,1,77,62,85,2,217,64,252, 182,3,74,252,182,1,180,4,40,61,105,10,10,112,71,57, 0,1,0,87,1,46,0,211,1,171,0,3,0,0,19,21, 35,53,211,124,1,171,125,125,0,1,0,39,255,42,1,31, 0,0,0,29,0,0,59,1,7,54,51,50,23,22,21,20, 7,6,35,34,39,38,39,55,23,22,23,50,55,54,53,38, 39,34,7,39,165,38,23,13,15,70,8,1,66,25,32,44, 63,8,10,21,9,57,32,38,13,3,7,39,15,16,12,56, 2,55,5,7,63,22,8,26,4,4,40,4,28,1,29,7, 9,34,3,8,7,0,0,1,0,61,1,28,0,222,2,197, 0,10,0,0,19,35,53,55,54,55,54,55,51,17,35,160, 99,15,61,18,13,11,43,62,2,68,46,1,6,20,15,41, 254,87,0,3,0,40,1,47,1,68,2,230,0,3,0,19, 0,36,0,0,1,21,33,53,19,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,23,34,15,1,20,21,20,23, 22,51,50,55,54,53,52,39,38,1,58,254,249,131,108,26, 8,79,28,35,101,30,11,84,26,32,59,19,6,55,14,15, 59,19,6,58,12,1,98,51,51,1,132,106,31,37,119,37, 13,95,34,43,126,34,11,52,67,38,7,7,93,22,5,67, 22,29,97,20,4,0,0,2,0,98,0,106,1,195,1,182, 0,6,0,13,0,0,19,21,7,53,55,39,53,5,21,7, 53,55,39,53,252,154,108,108,1,97,154,108,108,1,61,89, 122,83,83,83,83,121,89,122,83,83,83,83,0,4,0,61, 255,236,3,81,2,197,0,10,0,14,0,25,0,28,0,0, 19,35,53,55,54,55,54,55,51,17,35,1,51,1,35,37, 35,53,19,51,17,51,21,35,21,35,61,1,7,160,99,15, 61,18,13,11,43,62,1,227,58,254,60,58,2,17,188,204, 46,67,67,62,129,2,68,46,1,6,20,15,41,254,87,1, 169,253,39,120,59,1,10,254,240,53,100,153,170,170,0,3, 0,61,255,236,3,76,2,197,0,10,0,14,0,49,0,0, 19,35,53,55,54,55,54,55,51,17,35,1,51,1,35,37, 21,33,54,55,54,63,1,54,53,52,39,38,35,34,7,6, 7,35,54,55,50,51,50,31,1,22,21,20,15,1,6,7, 6,7,160,99,15,61,18,13,11,43,62,1,203,58,254,60, 58,2,162,254,208,4,38,26,59,58,59,43,19,23,51,23, 10,3,62,4,134,6,7,87,39,13,7,96,63,49,16,5, 3,2,68,46,1,6,20,15,41,254,87,1,169,253,39,78, 58,85,42,29,31,31,32,47,45,21,9,39,17,43,145,7, 59,25,20,22,82,47,32,26,34,9,11,0,0,4,0,16, 255,236,3,81,2,197,0,45,0,49,0,60,0,63,0,0, 19,53,50,55,54,53,52,47,1,34,7,6,21,35,54,51, 50,23,22,21,20,7,22,21,20,7,6,35,34,39,38,53, 51,22,23,22,51,50,55,54,53,52,39,38,39,38,37,51, 1,35,37,35,53,19,51,17,51,21,35,21,35,61,1,7, 135,85,17,8,50,26,53,19,9,63,3,141,96,32,11,57, 71,71,36,48,113,29,9,62,4,63,11,13,72,15,3,40, 8,10,15,1,211,58,254,60,58,2,7,188,204,46,67,67, 62,129,1,220,51,26,13,22,52,13,3,35,17,37,142,66, 24,30,59,26,24,76,82,34,18,86,25,31,78,9,2,56, 11,14,46,18,4,2,2,233,253,39,120,59,1,10,254,240, 53,100,153,170,170,0,0,2,0,95,255,39,2,16,2,12, 0,35,0,39,0,0,1,51,21,20,7,6,7,6,7,6, 7,20,23,22,51,50,55,54,53,51,20,7,6,35,34,39, 38,53,52,55,54,55,54,55,54,61,2,51,21,1,19,90, 28,18,41,5,13,74,1,61,30,38,82,30,17,85,180,19, 20,129,55,30,49,20,31,63,11,6,90,1,69,55,50,37, 23,36,5,12,66,66,70,30,14,58,34,64,211,21,2,85, 45,62,70,58,22,29,57,26,15,26,142,104,104,0,0,3, 0,17,0,0,2,141,3,171,0,7,0,10,0,14,0,0, 37,33,7,35,1,51,1,35,11,2,19,23,35,39,1,218, 254,231,77,99,1,4,120,1,0,104,101,112,120,88,96,60, 149,219,219,2,217,253,39,1,41,1,76,254,180,2,130,148, 148,0,0,3,0,17,0,0,2,141,3,171,0,7,0,10, 0,14,0,0,37,33,7,35,1,51,1,35,11,2,19,51, 7,35,1,218,254,231,77,99,1,4,120,1,0,104,101,112, 120,154,113,149,60,219,219,2,217,253,39,1,41,1,76,254, 180,2,130,148,0,3,0,17,0,0,2,141,3,172,0,7, 0,10,0,17,0,0,37,33,7,35,1,51,1,35,11,2, 19,51,23,35,39,7,35,1,218,254,231,77,99,1,4,120, 1,0,104,101,112,120,72,95,96,63,81,79,64,219,219,2, 217,253,39,1,41,1,76,254,180,2,131,150,96,96,0,3, 0,17,0,0,2,141,3,148,0,7,0,10,0,32,0,0, 37,33,7,35,1,51,1,35,11,2,19,51,6,35,34,39, 38,35,34,7,35,54,55,54,51,50,23,22,23,22,51,50, 1,218,254,231,77,99,1,4,120,1,0,104,101,112,120,218, 58,15,74,21,64,35,14,23,10,58,16,59,5,6,23,42, 2,3,39,24,25,219,219,2,217,253,39,1,41,1,76,254, 180,2,107,104,25,13,37,93,9,1,17,1,1,18,0,4, 0,17,0,0,2,141,3,146,0,7,0,10,0,14,0,18, 0,0,37,33,7,35,1,51,1,35,11,2,19,21,35,53, 33,21,35,53,1,218,254,231,77,99,1,4,120,1,0,104, 101,112,120,90,104,1,10,104,219,219,2,217,253,39,1,41, 1,76,254,180,2,105,103,103,103,103,0,4,0,17,0,0, 2,141,3,185,0,7,0,10,0,27,0,43,0,0,37,33, 7,35,1,51,1,35,11,2,19,50,31,1,22,21,20,7, 6,35,34,39,38,53,52,55,54,23,34,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,1,218,254,231,77,99,1, 4,120,1,0,104,101,112,120,119,50,26,9,3,43,21,24, 48,27,13,42,21,25,29,12,3,27,8,9,29,12,3,28, 8,219,219,2,217,253,39,1,41,1,76,254,180,2,144,43, 23,11,11,49,26,12,42,21,25,47,27,13,44,27,8,8, 29,11,4,27,8,8,31,10,3,0,0,2,0,11,0,0, 3,182,2,217,0,15,0,19,0,0,37,33,7,35,1,33, 21,33,21,33,21,33,21,33,21,33,25,1,35,3,1,212, 254,243,85,103,1,43,2,110,254,141,1,96,254,160,1,133, 254,30,100,138,214,214,2,217,82,233,82,250,82,1,40,1, 95,254,161,0,0,1,0,48,255,42,2,165,2,229,0,66, 0,0,5,7,54,51,50,23,22,21,20,7,6,35,34,39, 38,39,55,23,22,51,50,55,54,53,38,39,34,7,39,55, 38,39,38,39,38,39,38,53,52,55,54,55,54,51,50,23, 35,38,39,38,39,34,7,6,21,20,23,22,51,50,55,54, 55,54,55,51,2,1,123,13,13,15,70,8,1,66,25,32, 46,68,5,6,21,9,57,32,38,13,3,7,39,15,16,11, 31,85,45,9,10,109,27,8,97,3,2,82,149,238,43,95, 15,38,55,88,129,61,40,96,59,82,109,51,6,4,22,11, 96,33,23,33,2,55,5,7,63,22,8,29,2,3,40,4, 29,29,7,9,34,3,8,7,69,12,27,6,7,78,159,43, 47,178,111,2,3,91,238,75,35,43,3,115,75,112,172,79, 48,77,8,9,43,71,254,223,0,2,0,90,0,0,2,101, 3,171,0,11,0,15,0,0,19,21,33,21,33,17,33,21, 33,21,33,21,1,23,35,39,183,1,174,253,245,1,249,254, 100,1,141,254,252,96,60,149,1,76,250,82,2,217,82,233, 82,2,95,148,148,0,0,2,0,90,0,0,2,101,3,171, 0,11,0,15,0,0,19,21,33,21,33,17,33,21,33,21, 33,21,3,51,7,35,183,1,174,253,245,1,249,254,100,1, 141,214,113,149,60,1,76,250,82,2,217,82,233,82,2,95, 148,0,0,2,0,90,0,0,2,101,3,172,0,11,0,18, 0,0,19,21,33,21,33,17,33,21,33,21,33,21,1,51, 23,35,39,7,35,183,1,174,253,245,1,249,254,100,1,141, 254,229,95,96,63,81,79,64,1,76,250,82,2,217,82,233, 82,2,96,150,96,96,0,3,0,90,0,0,2,101,3,146, 0,11,0,15,0,19,0,0,19,21,33,21,33,17,33,21, 33,21,33,21,1,21,35,53,33,21,35,53,183,1,174,253, 245,1,249,254,100,1,141,254,247,104,1,10,104,1,76,250, 82,2,217,82,233,82,2,70,103,103,103,103,0,2,0,1, 0,0,0,210,3,171,0,3,0,7,0,0,19,17,35,17, 55,23,35,39,193,93,14,96,60,149,2,217,253,39,2,217, 210,148,148,0,0,2,0,71,0,0,1,24,3,171,0,3, 0,7,0,0,19,17,35,17,55,51,7,35,193,93,67,113, 149,60,2,217,253,39,2,217,210,148,0,2,255,255,0,0, 1,30,3,172,0,3,0,10,0,0,19,17,35,17,39,51, 23,35,39,7,35,193,93,5,95,96,63,81,79,64,2,217, 253,39,2,217,211,150,96,96,0,3,0,9,0,0,1,19, 3,139,0,3,0,7,0,11,0,0,19,17,35,17,55,21, 35,53,33,21,35,53,193,93,13,104,1,10,104,2,217,253, 39,2,217,178,103,103,103,103,0,2,0,20,0,0,2,155, 2,217,0,15,0,30,0,0,19,35,53,51,17,33,50,31, 1,22,21,20,7,6,35,33,19,17,51,50,55,54,53,52, 39,38,43,1,21,51,21,89,69,69,1,26,163,78,22,33, 117,73,106,254,230,93,173,178,34,7,161,27,31,173,171,1, 83,67,1,67,132,43,81,108,211,95,59,1,83,254,255,191, 42,50,239,37,6,241,67,0,0,2,0,76,0,0,2,134, 3,148,0,9,0,31,0,0,1,17,35,1,17,35,17,51, 1,17,39,51,6,35,34,39,38,35,34,7,35,54,55,54, 51,50,23,22,23,22,51,50,2,134,105,254,135,88,101,1, 125,91,58,15,74,21,64,35,14,23,10,58,16,59,5,6, 23,42,2,3,39,24,25,2,217,253,39,2,79,253,177,2, 217,253,172,2,84,187,104,25,13,37,93,9,1,17,1,1, 18,0,0,3,0,38,255,233,2,230,3,171,0,18,0,34, 0,38,0,0,1,50,31,1,22,21,20,7,6,7,6,35, 34,39,38,53,52,55,54,23,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,3,23,35,39,1,133,174,97,26, 56,82,20,24,91,135,167,98,87,111,95,145,130,72,56,95, 67,97,129,72,58,98,66,126,96,60,149,2,229,123,38,96, 131,148,105,26,20,77,117,104,161,184,107,91,82,102,80,118, 158,83,59,100,79,117,165,83,56,1,24,148,148,0,0,3, 0,38,255,233,2,230,3,171,0,18,0,34,0,38,0,0, 1,50,31,1,22,21,20,7,6,7,6,35,34,39,38,53, 52,55,54,23,34,7,6,21,20,23,22,51,50,55,54,53, 52,39,38,3,51,7,35,1,133,174,97,26,56,82,20,24, 91,135,167,98,87,111,95,145,130,72,56,95,67,97,129,72, 58,98,66,67,113,149,60,2,229,123,38,96,131,148,105,26, 20,77,117,104,161,184,107,91,82,102,80,118,158,83,59,100, 79,117,165,83,56,1,24,148,0,3,0,38,255,233,2,230, 3,172,0,18,0,34,0,41,0,0,1,50,31,1,22,21, 20,7,6,7,6,35,34,39,38,53,52,55,54,23,34,7, 6,21,20,23,22,51,50,55,54,53,52,39,38,3,51,23, 35,39,7,35,1,133,174,97,26,56,82,20,24,91,135,167, 98,87,111,95,145,130,72,56,95,67,97,129,72,58,98,66, 142,95,96,63,81,79,64,2,229,123,38,96,131,148,105,26, 20,77,117,104,161,184,107,91,82,102,80,118,158,83,59,100, 79,117,165,83,56,1,25,150,96,96,0,3,0,38,255,233, 2,230,3,148,0,18,0,34,0,56,0,0,1,50,31,1, 22,21,20,7,6,7,6,35,34,39,38,53,52,55,54,23, 34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,19, 51,6,35,34,39,38,35,34,7,35,54,55,54,51,50,23, 22,23,22,51,50,1,133,174,97,26,56,82,20,24,91,135, 167,98,87,111,95,145,130,72,56,95,67,97,129,72,58,98, 66,7,58,15,74,21,64,35,14,23,10,58,16,59,5,6, 23,42,2,3,39,24,25,2,229,123,38,96,131,148,105,26, 20,77,117,104,161,184,107,91,82,102,80,118,158,83,59,100, 79,117,165,83,56,1,1,104,25,13,37,93,9,1,17,1, 1,18,0,4,0,38,255,233,2,230,3,146,0,18,0,34, 0,38,0,42,0,0,1,50,31,1,22,21,20,7,6,7, 6,35,34,39,38,53,52,55,54,23,34,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,3,21,35,53,33,21,35, 53,1,133,174,97,26,56,82,20,24,91,135,167,98,87,111, 95,145,130,72,56,95,67,97,129,72,58,98,66,124,104,1, 10,104,2,229,123,38,96,131,148,105,26,20,77,117,104,161, 184,107,91,82,102,80,118,158,83,59,100,79,117,165,83,56, 0,255,103,103,103,103,0,1,0,95,0,34,1,232,1,171, 0,11,0,0,1,23,7,23,7,39,7,39,55,39,55,23, 1,182,49,146,147,50,147,146,50,147,146,49,146,1,171,50, 146,147,50,147,146,49,147,146,49,145,0,3,0,30,255,233, 2,232,2,243,0,21,0,30,0,39,0,0,63,1,38,53, 52,55,54,51,50,23,55,23,7,22,21,20,7,6,35,34, 39,7,55,1,38,35,34,7,6,21,20,9,1,22,51,50, 55,54,53,52,30,81,76,112,95,145,137,93,87,40,89,84, 112,95,145,144,97,77,105,1,128,73,98,132,72,55,1,209, 254,125,74,107,132,72,55,19,89,106,146,184,106,91,81,95, 36,97,106,158,184,106,91,90,84,193,1,163,64,103,79,117, 104,1,42,254,91,74,103,79,117,114,0,2,0,85,255,233, 2,133,3,171,0,21,0,25,0,0,1,51,17,20,7,6, 35,34,39,38,53,17,51,17,20,23,22,51,50,55,54,53, 3,23,35,39,2,40,93,104,72,105,165,73,41,93,110,34, 42,124,45,19,218,96,60,149,2,217,254,0,130,65,45,101, 58,81,2,0,254,0,117,31,10,80,34,44,2,210,148,148, 0,2,0,85,255,233,2,133,3,171,0,21,0,25,0,0, 1,51,17,20,7,6,35,34,39,38,53,17,51,17,20,23, 22,51,50,55,54,53,3,51,7,35,2,40,93,104,72,105, 165,73,41,93,110,34,42,124,45,19,165,113,149,60,2,217, 254,0,130,65,45,101,58,81,2,0,254,0,117,31,10,80, 34,44,2,210,148,0,0,2,0,85,255,233,2,133,3,172, 0,21,0,28,0,0,1,51,17,20,7,6,35,34,39,38, 53,17,51,17,20,23,22,51,50,55,54,53,3,51,23,35, 39,7,35,2,40,93,104,72,105,165,73,41,93,110,34,42, 124,45,19,234,95,96,63,81,79,64,2,217,254,0,130,65, 45,101,58,81,2,0,254,0,117,31,10,80,34,44,2,211, 150,96,96,0,0,3,0,85,255,233,2,133,3,146,0,21, 0,25,0,29,0,0,1,51,17,20,7,6,35,34,39,38, 53,17,51,17,20,23,22,51,50,55,54,53,3,21,35,53, 33,21,35,53,2,40,93,104,72,105,165,73,41,93,110,34, 42,124,45,19,216,104,1,10,104,2,217,254,0,130,65,45, 101,58,81,2,0,254,0,117,31,10,80,34,44,2,185,103, 103,103,103,0,0,2,0,13,0,0,2,149,3,171,0,8, 0,12,0,0,1,17,35,17,1,51,27,1,51,37,51,7, 35,1,131,93,254,231,115,214,208,111,254,216,113,149,60,1, 30,254,226,1,30,1,187,254,157,1,99,210,148,0,0,2, 0,91,0,0,2,104,2,217,0,14,0,25,0,0,55,21, 35,17,51,21,51,50,23,22,21,20,7,6,35,39,51,50, 55,54,53,52,39,38,43,1,184,93,93,208,139,56,29,78, 53,72,229,194,100,29,9,78,26,34,194,189,189,2,217,120, 95,49,68,110,58,40,82,75,24,29,91,27,10,0,0,1, 0,67,255,241,2,59,2,216,0,49,0,0,1,54,55,52, 47,1,38,35,34,15,1,20,21,17,35,17,52,55,54,51, 50,23,22,21,20,7,34,7,22,23,22,21,20,7,6,35, 34,39,53,22,51,50,55,52,53,52,39,34,43,1,1,38, 148,7,75,38,18,21,115,21,6,88,93,56,82,147,61,31, 79,1,2,64,34,18,142,49,61,20,33,22,22,164,6,152, 9,9,16,1,171,9,104,74,26,9,3,86,40,8,8,254, 2,2,20,113,52,31,83,41,56,95,51,2,17,74,39,36, 180,52,17,7,75,3,140,5,5,133,7,0,0,3,0,42, 255,233,2,23,2,228,0,45,0,62,0,66,0,0,37,21, 6,35,34,39,38,39,6,7,34,39,38,53,52,55,54,55, 54,55,54,55,54,61,1,52,39,38,35,34,7,6,7,35, 54,55,54,51,50,23,22,21,17,20,51,50,39,53,6,7, 6,7,6,7,6,21,20,23,22,51,50,55,54,3,23,35, 39,2,23,35,22,71,13,1,1,87,91,110,43,19,92,36, 94,16,22,73,11,3,81,17,19,103,17,2,1,84,3,33, 55,119,176,19,2,45,9,137,32,82,9,11,106,16,4,67, 16,20,72,52,32,138,96,60,149,49,63,9,63,7,7,76, 1,75,35,45,102,38,15,12,2,3,9,29,8,12,22,64, 12,2,75,9,9,72,37,61,116,13,14,254,204,41,118,94, 15,11,1,2,15,54,12,15,65,15,4,47,29,2,102,148, 148,0,0,3,0,42,255,233,2,23,2,228,0,45,0,62, 0,66,0,0,37,21,6,35,34,39,38,39,6,7,34,39, 38,53,52,55,54,55,54,55,54,55,54,61,1,52,39,38, 35,34,7,6,7,35,54,55,54,51,50,23,22,21,17,20, 51,50,39,53,6,7,6,7,6,7,6,21,20,23,22,51, 50,55,54,3,51,7,35,2,23,35,22,71,13,1,1,87, 91,110,43,19,92,36,94,16,22,73,11,3,81,17,19,103, 17,2,1,84,3,33,55,119,176,19,2,45,9,137,32,82, 9,11,106,16,4,67,16,20,72,52,32,85,113,149,60,49, 63,9,63,7,7,76,1,75,35,45,102,38,15,12,2,3, 9,29,8,12,22,64,12,2,75,9,9,72,37,61,116,13, 14,254,204,41,118,94,15,11,1,2,15,54,12,15,65,15, 4,47,29,2,102,148,0,3,0,42,255,233,2,23,2,229, 0,45,0,62,0,69,0,0,37,21,6,35,34,39,38,39, 6,7,34,39,38,53,52,55,54,55,54,55,54,55,54,61, 1,52,39,38,35,34,7,6,7,35,54,55,54,51,50,23, 22,21,17,20,51,50,39,53,6,7,6,7,6,7,6,21, 20,23,22,51,50,55,54,3,51,23,35,39,7,35,2,23, 35,22,71,13,1,1,87,91,110,43,19,92,36,94,16,22, 73,11,3,81,17,19,103,17,2,1,84,3,33,55,119,176, 19,2,45,9,137,32,82,9,11,106,16,4,67,16,20,72, 52,32,160,95,96,63,81,79,64,49,63,9,63,7,7,76, 1,75,35,45,102,38,15,12,2,3,9,29,8,12,22,64, 12,2,75,9,9,72,37,61,116,13,14,254,204,41,118,94, 15,11,1,2,15,54,12,15,65,15,4,47,29,2,103,150, 96,96,0,3,0,42,255,233,2,23,2,205,0,45,0,62, 0,84,0,0,37,21,6,35,34,39,38,39,6,7,34,39, 38,53,52,55,54,55,54,55,54,55,54,61,1,52,39,38, 35,34,7,6,7,35,54,55,54,51,50,23,22,21,17,20, 51,50,39,53,6,7,6,7,6,7,6,21,20,23,22,51, 50,55,54,3,51,6,35,34,39,38,35,34,7,35,54,55, 54,51,50,23,22,23,22,51,50,2,23,35,22,71,13,1, 1,87,91,110,43,19,92,36,94,16,22,73,11,3,81,17, 19,103,17,2,1,84,3,33,55,119,176,19,2,45,9,137, 32,82,9,11,106,16,4,67,16,20,72,52,32,14,58,15, 74,21,64,35,14,23,10,58,16,59,5,6,23,42,2,3, 39,24,25,49,63,9,63,7,7,76,1,75,35,45,102,38, 15,12,2,3,9,29,8,12,22,64,12,2,75,9,9,72, 37,61,116,13,14,254,204,41,118,94,15,11,1,2,15,54, 12,15,65,15,4,47,29,2,79,104,25,13,37,93,9,1, 17,1,1,18,0,4,0,42,255,233,2,23,2,203,0,45, 0,62,0,66,0,70,0,0,37,21,6,35,34,39,38,39, 6,7,34,39,38,53,52,55,54,55,54,55,54,55,54,61, 1,52,39,38,35,34,7,6,7,35,54,55,54,51,50,23, 22,21,17,20,51,50,39,53,6,7,6,7,6,7,6,21, 20,23,22,51,50,55,54,3,21,35,53,33,21,35,53,2, 23,35,22,71,13,1,1,87,91,110,43,19,92,36,94,16, 22,73,11,3,81,17,19,103,17,2,1,84,3,33,55,119, 176,19,2,45,9,137,32,82,9,11,106,16,4,67,16,20, 72,52,32,144,104,1,10,104,49,63,9,63,7,7,76,1, 75,35,45,102,38,15,12,2,3,9,29,8,12,22,64,12, 2,75,9,9,72,37,61,116,13,14,254,204,41,118,94,15, 11,1,2,15,54,12,15,65,15,4,47,29,2,77,103,103, 103,103,0,4,0,42,255,233,2,23,2,242,0,45,0,62, 0,79,0,95,0,0,37,21,6,35,34,39,38,39,6,7, 34,39,38,53,52,55,54,55,54,55,54,55,54,61,1,52, 39,38,35,34,7,6,7,35,54,55,54,51,50,23,22,21, 17,20,51,50,39,53,6,7,6,7,6,7,6,21,20,23, 22,51,50,55,54,3,50,31,1,22,21,20,7,6,35,34, 39,38,53,52,55,54,23,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,2,23,35,22,71,13,1,1,87,91, 110,43,19,92,36,94,16,22,73,11,3,81,17,19,103,17, 2,1,84,3,33,55,119,176,19,2,45,9,137,32,82,9, 11,106,16,4,67,16,20,72,52,32,113,50,26,9,3,43, 21,24,48,27,13,42,21,25,29,12,3,27,8,9,29,12, 3,28,8,49,63,9,63,7,7,76,1,75,35,45,102,38, 15,12,2,3,9,29,8,12,22,64,12,2,75,9,9,72, 37,61,116,13,14,254,204,41,118,94,15,11,1,2,15,54, 12,15,65,15,4,47,29,2,116,43,23,11,11,49,26,12, 42,21,25,47,27,13,44,27,8,8,29,12,3,27,8,8, 31,10,3,0,0,3,0,34,255,233,3,77,2,27,0,59, 0,76,0,85,0,0,37,51,6,7,6,7,34,39,38,39, 38,39,6,7,6,35,34,39,38,53,52,55,54,55,54,55, 54,61,1,52,35,34,7,6,7,35,54,55,54,51,50,23, 54,55,54,51,50,23,22,23,22,23,22,21,33,22,23,22, 51,50,37,53,6,7,34,7,6,7,6,21,20,23,22,51, 50,55,54,55,33,52,39,38,35,34,7,6,2,239,84,22, 100,51,50,107,59,6,6,4,12,93,91,16,16,103,43,22, 100,54,106,70,12,5,118,103,16,2,1,84,3,33,55,117, 128,47,49,94,15,15,111,66,15,10,5,4,21,254,126,1, 27,43,83,101,254,179,33,91,5,5,103,18,5,60,18,22, 61,50,49,80,1,38,65,34,45,85,41,20,159,118,44,18, 2,67,8,8,6,21,97,11,2,72,36,47,105,37,20,9, 6,26,10,17,22,78,77,7,9,72,37,61,82,69,11,2, 80,18,21,9,10,55,112,72,40,68,103,101,14,14,1,15, 48,14,18,61,18,5,38,38,176,93,44,23,75,36,0,1, 0,31,255,42,1,221,2,27,0,63,0,0,5,7,54,51, 50,23,22,21,20,7,6,35,34,39,38,39,55,23,22,51, 50,55,54,53,38,39,34,7,39,55,38,39,38,39,38,53, 52,55,54,51,50,23,22,23,22,23,35,38,47,1,34,7, 6,21,20,23,22,51,50,55,51,6,7,6,1,8,13,14, 14,67,10,2,66,25,32,44,60,9,12,21,9,55,34,38, 13,3,7,39,15,16,12,31,57,36,90,10,1,92,59,82, 106,58,4,4,29,6,84,13,84,27,94,35,16,79,29,39, 107,21,84,7,91,50,23,33,2,50,8,9,63,22,8,24, 4,5,41,4,29,29,7,9,34,3,8,7,71,11,26,64, 142,15,16,160,77,49,68,5,5,43,70,97,15,2,100,46, 64,137,45,17,127,122,53,28,0,3,0,40,255,233,2,1, 2,228,0,25,0,36,0,40,0,0,37,33,22,23,22,51, 50,55,51,6,7,6,35,34,39,38,53,52,55,54,51,50, 23,22,23,22,5,33,54,53,52,39,38,35,34,7,6,19, 23,35,39,2,1,254,126,1,27,43,83,102,35,84,22,104, 44,54,136,63,39,94,60,86,115,65,20,12,21,254,128,1, 38,1,59,38,48,85,41,20,119,96,60,149,234,72,40,68, 105,121,43,18,110,68,100,158,77,49,82,25,31,55,44,2, 4,80,45,29,75,36,1,133,148,148,0,3,0,40,255,233, 2,1,2,228,0,25,0,36,0,40,0,0,37,33,22,23, 22,51,50,55,51,6,7,6,35,34,39,38,53,52,55,54, 51,50,23,22,23,22,5,33,54,53,52,39,38,35,34,7, 6,19,51,7,35,2,1,254,126,1,27,43,83,102,35,84, 22,104,44,54,136,63,39,94,60,86,115,65,20,12,21,254, 128,1,38,1,59,38,48,85,41,20,175,113,149,60,234,72, 40,68,105,121,43,18,110,68,100,158,77,49,82,25,31,55, 44,2,4,80,45,29,75,36,1,133,148,0,0,3,0,40, 255,233,2,1,2,229,0,25,0,36,0,43,0,0,37,33, 22,23,22,51,50,55,51,6,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,23,22,5,33,54,53,52,39,38,35, 34,7,6,19,51,23,35,39,7,35,2,1,254,126,1,27, 43,83,102,35,84,22,104,44,54,136,63,39,94,60,86,115, 65,20,12,21,254,128,1,38,1,59,38,48,85,41,20,106, 95,96,63,81,79,64,234,72,40,68,105,121,43,18,110,68, 100,158,77,49,82,25,31,55,44,2,4,80,45,29,75,36, 1,134,150,96,96,0,0,4,0,40,255,233,2,1,2,203, 0,25,0,36,0,40,0,44,0,0,37,33,22,23,22,51, 50,55,51,6,7,6,35,34,39,38,53,52,55,54,51,50, 23,22,23,22,5,33,54,53,52,39,38,35,34,7,6,19, 21,35,53,33,21,35,53,2,1,254,126,1,27,43,83,102, 35,84,22,104,44,54,136,63,39,94,60,86,115,65,20,12, 21,254,128,1,38,1,59,38,48,85,41,20,124,104,1,10, 104,234,72,40,68,105,121,43,18,110,68,100,158,77,49,82, 25,31,55,44,2,4,80,45,29,75,36,1,108,103,103,103, 103,0,0,2,255,251,0,0,0,204,2,228,0,3,0,7, 0,0,19,17,35,17,55,23,35,39,177,83,14,96,60,149, 2,12,253,244,2,12,216,148,148,0,0,2,0,65,0,0, 1,18,2,228,0,3,0,7,0,0,19,17,35,17,55,51, 7,35,177,83,67,113,149,60,2,12,253,244,2,12,216,148, 0,2,255,249,0,0,1,24,2,229,0,3,0,10,0,0, 19,17,35,17,39,51,23,35,39,7,35,177,83,5,95,96, 63,81,79,64,2,12,253,244,2,12,217,150,96,96,0,3, 0,3,0,0,1,13,2,196,0,3,0,7,0,11,0,0, 19,17,35,17,55,21,35,53,33,21,35,53,177,83,13,104, 1,10,104,2,12,253,244,2,12,184,103,103,103,103,0,2, 0,36,255,233,1,254,2,231,0,33,0,49,0,0,19,7, 39,55,38,39,55,22,23,55,23,7,22,31,1,22,23,20, 21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,38, 7,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 219,97,36,85,30,52,44,37,74,97,40,90,89,47,11,67, 5,121,50,66,155,56,26,104,52,62,24,39,39,5,93,38, 19,77,32,41,90,39,21,82,30,2,101,45,39,40,23,29, 44,16,47,45,37,41,68,65,17,102,113,11,12,193,63,26, 132,62,87,178,66,35,13,40,102,92,48,64,135,49,20,88, 47,66,145,46,16,0,0,2,0,70,0,0,1,231,2,205, 0,23,0,45,0,0,19,51,21,54,55,54,51,50,23,22, 21,17,35,17,52,39,38,35,34,7,6,21,17,35,1,51, 6,35,34,39,38,35,34,7,35,54,55,54,51,50,23,22, 23,22,51,50,70,77,54,76,20,24,105,42,19,83,59,21, 28,84,37,21,84,1,52,58,15,74,21,64,35,14,23,10, 58,16,59,5,6,23,42,2,3,39,24,25,2,12,88,85, 14,4,70,32,41,254,116,1,107,70,24,9,77,42,58,254, 223,2,205,104,25,13,37,93,9,1,17,1,1,18,0,3, 0,36,255,233,1,254,2,228,0,15,0,31,0,35,0,0, 1,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 23,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 3,23,35,39,1,16,152,57,29,102,56,79,144,60,33,105, 55,77,93,38,19,78,31,41,90,39,21,82,30,66,96,60, 149,2,27,129,65,91,167,71,39,119,67,95,174,70,37,77, 92,48,64,137,48,19,88,47,66,145,46,16,1,22,148,148, 0,3,0,36,255,233,1,254,2,228,0,15,0,31,0,35, 0,0,1,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,23,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,3,51,7,35,1,16,152,57,29,102,56,79,144,60, 33,105,55,77,93,38,19,78,31,41,90,39,21,82,30,13, 113,149,60,2,27,129,65,91,167,71,39,119,67,95,174,70, 37,77,92,48,64,137,48,19,88,47,66,145,46,16,1,22, 148,0,0,3,0,36,255,233,1,254,2,229,0,15,0,31, 0,38,0,0,1,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,23,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,3,51,23,35,39,7,35,1,16,152,57,29, 102,56,79,144,60,33,105,55,77,93,38,19,78,31,41,90, 39,21,82,30,85,95,96,63,81,79,64,2,27,129,65,91, 167,71,39,119,67,95,174,70,37,77,92,48,64,137,48,19, 88,47,66,145,46,16,1,23,150,96,96,0,0,3,0,36, 255,233,1,254,2,205,0,15,0,31,0,53,0,0,1,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,54,23,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,19,51, 6,35,34,39,38,35,34,7,35,54,55,54,51,50,23,22, 23,22,51,50,1,16,152,57,29,102,56,79,144,60,33,105, 55,77,93,38,19,78,31,41,90,39,21,82,30,64,58,15, 74,21,64,35,14,23,10,58,16,59,5,6,23,42,2,3, 39,24,25,2,27,129,65,91,167,71,39,119,67,95,174,70, 37,77,92,48,64,137,48,19,88,47,66,145,46,16,0,255, 104,25,13,37,93,9,1,17,1,1,18,0,0,4,0,36, 255,233,1,254,2,203,0,15,0,31,0,35,0,39,0,0, 1,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 23,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 39,21,35,53,33,21,35,53,1,16,152,57,29,102,56,79, 144,60,33,105,55,77,93,38,19,78,31,41,90,39,21,82, 30,67,104,1,10,104,2,27,129,65,91,167,71,39,119,67, 95,174,70,37,77,92,48,64,137,48,19,88,47,66,145,46, 16,253,103,103,103,103,0,3,0,50,0,0,2,22,1,216, 0,3,0,7,0,11,0,0,1,21,33,53,5,21,35,53, 19,21,35,53,2,22,254,28,1,38,104,104,104,1,15,70, 70,167,104,104,1,112,104,104,0,3,0,18,255,226,2,17, 2,27,0,21,0,30,0,39,0,0,1,7,22,21,20,7, 6,35,34,39,7,39,55,38,53,52,55,54,51,50,23,55, 7,3,22,51,50,55,54,53,52,5,19,38,35,34,7,6, 21,20,2,17,63,44,106,55,75,103,60,61,32,66,48,106, 55,76,101,65,58,92,238,43,63,93,38,19,254,233,239,41, 69,93,38,19,1,255,71,73,109,176,70,35,62,69,28,74, 71,115,175,70,36,65,65,168,254,243,48,92,48,64,66,183, 1,13,52,92,48,64,68,0,0,2,0,65,255,233,1,226, 2,228,0,23,0,27,0,0,33,35,53,6,7,6,35,34, 39,38,53,17,51,17,20,23,22,51,50,55,54,53,17,51, 39,23,35,39,1,226,75,56,74,20,25,107,41,19,83,59, 22,27,85,38,20,83,239,96,60,149,73,79,13,4,70,32, 41,1,148,254,141,70,24,9,78,42,57,1,41,216,148,148, 0,2,0,65,255,233,1,226,2,228,0,23,0,27,0,0, 33,35,53,6,7,6,35,34,39,38,53,17,51,17,20,23, 22,51,50,55,54,53,17,51,39,51,7,35,1,226,75,56, 74,20,25,107,41,19,83,59,22,27,85,38,20,83,186,113, 149,60,73,79,13,4,70,32,41,1,148,254,141,70,24,9, 78,42,57,1,41,216,148,0,0,2,0,65,255,233,1,226, 2,229,0,23,0,30,0,0,33,35,53,6,7,6,35,34, 39,38,53,17,51,17,20,23,22,51,50,55,54,53,17,51, 39,51,23,35,39,7,35,1,226,75,56,74,20,25,107,41, 19,83,59,22,27,85,38,20,83,255,95,96,63,81,79,64, 73,79,13,4,70,32,41,1,148,254,141,70,24,9,78,42, 57,1,41,217,150,96,96,0,0,3,0,65,255,233,1,226, 2,203,0,23,0,27,0,31,0,0,33,35,53,6,7,6, 35,34,39,38,53,17,51,17,20,23,22,51,50,55,54,53, 17,51,39,21,35,53,33,21,35,53,1,226,75,56,74,20, 25,107,41,19,83,59,22,27,85,38,20,83,237,104,1,10, 104,73,79,13,4,70,32,41,1,148,254,141,70,24,9,78, 42,57,1,41,191,103,103,103,103,0,0,2,0,20,255,38, 1,222,2,228,0,19,0,23,0,0,1,51,3,6,7,6, 35,34,39,53,22,51,50,55,54,63,1,3,51,27,1,51, 7,35,1,132,90,233,22,35,34,44,31,25,27,17,45,18, 2,2,32,177,89,134,28,113,149,60,2,12,253,134,57,26, 25,13,75,6,40,5,6,83,2,14,254,104,2,112,148,0, 0,2,0,54,255,38,2,10,2,202,0,18,0,34,0,0, 23,17,51,21,54,55,50,23,22,21,20,7,6,7,6,35, 34,39,17,19,34,7,6,21,20,23,22,51,50,55,54,53, 52,39,38,54,83,60,101,120,61,43,89,39,52,21,23,97, 64,146,83,39,24,69,33,44,84,42,26,71,35,218,3,164, 255,78,2,105,73,108,154,75,33,10,4,78,254,239,2,167, 84,50,69,125,52,26,81,50,69,127,53,26,0,3,0,20, 255,38,1,222,2,203,0,19,0,23,0,27,0,0,1,51, 3,6,7,6,35,34,39,53,22,51,50,55,54,63,1,3, 51,19,3,21,35,53,33,21,35,53,1,132,90,233,22,35, 34,44,31,25,27,17,45,18,2,2,32,177,89,134,26,104, 1,10,104,2,12,253,134,57,26,25,13,75,6,40,5,6, 83,2,14,254,104,2,87,103,103,103,103,0,0,3,0,17, 0,0,2,141,3,132,0,7,0,10,0,14,0,0,37,33, 7,35,1,51,1,35,11,2,1,21,33,53,1,218,254,231, 77,99,1,4,120,1,0,104,101,112,120,1,0,254,238,219, 219,2,217,253,39,1,41,1,76,254,180,2,91,70,70,0, 0,3,0,42,255,233,2,23,2,189,0,45,0,62,0,66, 0,0,37,21,6,35,34,39,38,39,6,7,34,39,38,53, 52,55,54,55,54,55,54,55,54,61,1,52,39,38,35,34, 7,6,7,35,54,55,54,51,50,23,22,21,17,20,51,50, 39,53,6,7,6,7,6,7,6,21,20,23,22,51,50,55, 54,19,21,33,53,2,23,35,22,71,13,1,1,87,91,110, 43,19,92,36,94,16,22,73,11,3,81,17,19,103,17,2, 1,84,3,33,55,119,176,19,2,45,9,137,32,82,9,11, 106,16,4,67,16,20,72,52,32,23,254,238,49,63,9,63, 7,7,76,1,75,35,45,102,38,15,12,2,3,9,29,8, 12,22,64,12,2,75,9,9,72,37,61,116,13,14,254,204, 41,118,94,15,11,1,2,15,54,12,15,65,15,4,47,29, 2,63,70,70,0,3,0,17,0,0,2,141,3,163,0,7, 0,10,0,24,0,0,37,33,7,35,1,51,1,35,11,3, 51,22,51,50,55,54,53,51,6,35,34,39,38,1,218,254, 231,77,99,1,4,120,1,0,104,101,112,120,31,59,8,84, 77,13,1,59,11,141,86,42,20,219,219,2,217,253,39,1, 41,1,76,254,180,2,122,66,57,4,5,135,57,26,0,3, 0,42,255,233,2,23,2,220,0,45,0,62,0,76,0,0, 37,21,6,35,34,39,38,39,6,7,34,39,38,53,52,55, 54,55,54,55,54,55,54,61,1,52,39,38,35,34,7,6, 7,35,54,55,54,51,50,23,22,21,17,20,51,50,39,53, 6,7,6,7,6,7,6,21,20,23,22,51,50,55,54,1, 51,22,51,50,55,54,53,51,6,35,34,39,38,2,23,35, 22,71,13,1,1,87,91,110,43,19,92,36,94,16,22,73, 11,3,81,17,19,103,17,2,1,84,3,33,55,119,176,19, 2,45,9,137,32,82,9,11,106,16,4,67,16,20,72,52, 32,254,249,59,8,84,77,13,1,59,11,141,86,42,20,49, 63,9,63,7,7,76,1,75,35,45,102,38,15,12,2,3, 9,29,8,12,22,64,12,2,75,9,9,72,37,61,116,13, 14,254,204,41,118,94,15,11,1,2,15,54,12,15,65,15, 4,47,29,2,94,66,57,4,5,135,57,28,0,2,0,17, 255,51,2,180,2,217,0,24,0,27,0,0,37,33,7,35, 1,51,1,6,21,20,51,50,55,21,6,35,34,39,38,53, 52,55,54,55,35,11,2,1,218,254,231,77,99,1,4,120, 1,0,96,72,37,26,48,28,33,36,63,70,14,17,36,101, 112,120,219,219,2,217,253,39,46,59,55,10,45,10,13,24, 57,58,38,7,8,1,41,1,76,254,180,0,0,2,0,43, 255,51,2,84,2,27,0,56,0,73,0,0,37,21,6,7, 20,51,50,55,21,6,35,34,39,38,39,52,55,54,55,38, 39,6,35,34,39,38,53,52,55,54,55,54,55,54,55,54, 61,1,52,39,34,7,6,7,35,54,55,54,51,50,23,22, 21,17,20,51,50,39,53,6,7,6,7,6,7,6,21,20, 23,22,51,50,55,54,2,24,72,4,72,38,26,42,29,31, 43,61,2,47,9,12,57,6,81,97,110,43,19,93,35,93, 17,23,70,12,4,117,104,16,1,1,84,3,32,56,118,176, 19,2,45,9,138,32,82,9,11,106,16,4,67,16,20,72, 52,32,49,63,35,56,55,10,45,10,13,20,60,46,30,7, 6,10,67,77,75,35,45,101,39,15,12,2,3,9,26,10, 13,22,77,1,77,7,9,71,38,61,116,13,14,254,204,41, 118,94,15,11,1,2,15,54,12,15,65,15,4,47,29,0, 0,2,0,48,255,233,2,165,3,171,0,31,0,35,0,0, 1,35,38,39,38,39,34,7,6,21,20,23,22,51,50,55, 54,55,54,55,51,2,33,34,39,38,53,52,55,54,51,50, 39,51,7,35,2,150,95,15,38,54,90,128,61,40,95,59, 83,109,51,6,4,22,11,96,33,254,245,141,82,106,102,82, 149,238,213,113,149,60,1,247,75,35,44,2,115,75,112,170, 79,49,77,8,9,42,71,254,223,85,109,185,183,111,91,198, 148,0,0,2,0,31,255,233,1,221,2,228,0,32,0,36, 0,0,1,35,38,47,1,34,7,6,21,20,23,22,51,50, 55,51,6,7,6,35,34,39,38,53,52,55,54,51,50,23, 22,23,22,3,51,7,35,1,215,84,13,84,27,94,35,16, 79,29,39,107,21,84,11,104,43,56,129,62,41,92,59,82, 106,58,4,4,29,167,113,149,60,1,92,97,15,2,100,46, 63,137,45,17,126,137,46,20,105,70,101,160,77,49,68,5, 5,43,1,66,148,0,255,255,0,48,255,233,2,165,3,151, 16,39,1,239,0,144,0,178,16,6,0,38,0,0,255,255, 0,31,255,233,1,221,2,202,16,39,1,239,0,131,255,229, 16,6,0,70,0,0,255,255,0,48,255,233,2,165,3,105, 16,39,1,244,0,218,0,157,16,6,0,38,0,0,255,255, 0,31,255,233,1,221,2,156,16,38,1,244,92,208,16,6, 0,70,0,0,0,2,0,48,255,233,2,165,3,172,0,31, 0,38,0,0,1,35,38,39,38,39,34,7,6,21,20,23, 22,51,50,55,54,55,54,55,51,2,33,34,39,38,53,52, 55,54,51,50,39,35,39,51,23,55,51,2,150,95,15,38, 54,90,128,61,40,95,59,83,109,51,6,4,22,11,96,33, 254,245,141,82,106,102,82,149,238,191,95,96,63,81,79,64, 1,247,75,35,44,2,115,75,112,170,79,49,77,8,9,42, 71,254,223,85,109,185,183,111,91,49,150,96,96,0,0,2, 0,31,255,233,1,221,2,229,0,32,0,39,0,0,1,35, 38,47,1,34,7,6,21,20,23,22,51,50,55,51,6,7, 6,35,34,39,38,53,52,55,54,51,50,23,22,23,22,39, 35,39,51,23,55,51,1,215,84,13,84,27,94,35,16,79, 29,39,107,21,84,11,104,43,56,129,62,41,92,59,82,106, 58,4,4,29,152,95,96,63,81,79,64,1,92,97,15,2, 100,46,63,137,45,17,126,137,46,20,105,70,101,160,77,49, 68,5,5,43,173,150,96,96,0,3,0,89,0,0,2,155, 3,172,0,11,0,22,0,29,0,0,51,17,33,50,31,1, 22,21,20,7,6,35,39,51,50,55,54,53,52,39,38,43, 1,55,35,39,51,23,55,51,89,1,25,163,79,22,33,116, 73,108,188,172,174,37,9,168,25,27,172,204,95,96,63,81, 79,64,2,217,132,43,81,108,209,95,61,82,181,45,56,246, 32,5,143,150,96,96,0,3,0,26,255,233,2,136,2,217, 0,18,0,36,0,50,0,0,1,17,35,53,6,7,6,35, 34,39,38,53,52,55,54,51,50,23,17,3,34,7,6,7, 6,21,20,23,22,51,50,55,54,53,52,39,38,19,51,21, 20,7,6,43,1,53,50,53,52,53,35,1,239,74,58,86, 11,12,130,60,38,89,57,79,108,53,147,85,41,20,5,1, 70,36,47,83,39,24,72,33,241,100,48,20,24,8,55,55, 2,217,253,39,69,83,8,1,112,71,103,154,75,47,81,1, 15,254,244,82,38,51,16,16,122,54,27,82,50,69,131,51, 23,1,12,103,76,32,13,38,78,4,4,0,0,2,0,20, 0,0,2,155,2,217,0,15,0,30,0,0,19,35,53,51, 17,33,50,31,1,22,21,20,7,6,35,33,19,17,51,50, 55,54,53,52,39,38,43,1,21,51,21,89,69,69,1,26, 163,78,22,33,117,73,106,254,230,93,173,178,34,7,161,27, 31,173,171,1,83,67,1,67,132,43,81,108,211,95,59,1, 83,254,255,191,42,50,239,37,6,241,67,0,0,2,0,26, 255,233,2,45,2,217,0,24,0,40,0,0,1,51,21,35, 17,35,53,6,35,34,39,38,53,52,55,54,51,50,23,53, 35,53,51,53,51,3,34,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,1,238,63,63,74,70,98,118,62,46,89, 56,79,97,64,150,150,83,229,85,41,26,68,36,48,84,39, 23,72,32,2,141,53,253,168,59,82,101,75,111,153,75,47, 78,139,53,76,254,240,81,49,69,118,53,28,82,49,66,128, 50,23,0,2,0,90,0,0,2,101,3,132,0,11,0,15, 0,0,19,21,33,21,33,17,33,21,33,21,33,21,3,21, 33,53,183,1,174,253,245,1,249,254,100,1,141,98,254,238, 1,76,250,82,2,217,82,233,82,2,56,70,70,0,0,3, 0,40,255,233,2,1,2,189,0,25,0,36,0,40,0,0, 37,33,22,23,22,51,50,55,51,6,7,6,35,34,39,38, 53,52,55,54,51,50,23,22,23,22,5,33,54,53,52,39, 38,35,34,7,6,1,21,33,53,2,1,254,126,1,27,43, 83,102,35,84,22,104,44,54,136,63,39,94,60,86,115,65, 20,12,21,254,128,1,38,1,59,38,48,85,41,20,1,33, 254,238,234,72,40,68,105,121,43,18,110,68,100,158,77,49, 82,25,31,55,44,2,4,80,45,29,75,36,1,94,70,70, 255,255,0,90,0,0,2,101,3,136,16,39,1,243,0,177, 0,172,16,6,0,40,0,0,255,255,0,40,255,233,2,1, 2,187,16,38,1,243,114,223,16,6,0,72,0,0,0,2, 0,90,0,0,2,101,3,147,0,11,0,15,0,0,19,21, 33,21,33,17,33,21,33,21,33,21,3,21,35,53,183,1, 174,253,245,1,249,254,100,1,141,183,104,1,76,250,82,2, 217,82,233,82,2,71,104,104,0,3,0,40,255,233,2,1, 2,204,0,25,0,36,0,40,0,0,37,33,22,23,22,51, 50,55,51,6,7,6,35,34,39,38,53,52,55,54,51,50, 23,22,23,22,5,33,54,53,52,39,38,35,34,7,6,19, 21,35,53,2,1,254,126,1,27,43,83,102,35,84,22,104, 44,54,136,63,39,94,60,86,115,65,20,12,21,254,128,1, 38,1,59,38,48,85,41,20,204,104,234,72,40,68,105,121, 43,18,110,68,100,158,77,49,82,25,31,55,44,2,4,80, 45,29,75,36,1,109,104,104,0,1,0,90,255,51,2,140, 2,217,0,28,0,0,19,21,33,21,6,21,20,51,50,55, 21,6,35,34,39,38,53,52,55,54,55,33,17,33,21,33, 21,33,21,183,1,174,96,72,37,26,46,29,33,37,63,76, 11,14,254,57,1,249,254,100,1,141,1,76,250,82,45,61, 54,10,45,10,13,24,57,61,38,6,6,2,217,82,233,82, 0,2,0,40,255,52,2,2,2,27,0,48,0,58,0,0, 37,33,22,23,22,51,50,55,51,6,7,6,7,6,21,20, 23,22,51,50,55,21,6,35,34,39,38,53,52,55,54,55, 6,35,34,39,38,53,52,55,54,51,50,23,22,23,22,21, 20,39,53,52,39,38,35,34,7,6,7,2,1,254,126,1, 27,45,81,101,37,84,14,67,63,7,1,49,11,12,38,26, 41,28,96,32,11,28,10,30,40,28,142,61,36,95,60,85, 113,65,20,14,21,89,59,38,48,85,41,20,3,234,70,42, 68,105,77,67,65,41,9,9,41,8,2,10,45,9,51,17, 20,37,31,10,23,8,114,67,96,159,77,49,79,25,34,54, 99,7,61,6,80,45,29,75,36,49,0,2,0,90,0,0, 2,101,3,172,0,11,0,18,0,0,19,21,33,21,33,17, 33,21,33,21,33,21,3,35,39,51,23,55,51,183,1,174, 253,245,1,249,254,100,1,141,188,95,96,63,81,79,64,1, 76,250,82,2,217,82,233,82,1,202,150,96,96,0,0,3, 0,40,255,233,2,1,2,229,0,25,0,36,0,43,0,0, 37,33,22,23,22,51,50,55,51,6,7,6,35,34,39,38, 53,52,55,54,51,50,23,22,23,22,5,33,54,53,52,39, 38,35,34,7,6,55,35,39,51,23,55,51,2,1,254,126, 1,27,43,83,102,35,84,22,104,44,54,136,63,39,94,60, 86,115,65,20,12,21,254,128,1,38,1,59,38,48,85,41, 20,201,95,96,63,81,79,64,234,72,40,68,105,121,43,18, 110,68,100,158,77,49,82,25,31,55,44,2,4,80,45,29, 75,36,240,150,96,96,255,255,0,44,255,233,2,197,3,152, 16,103,1,239,0,240,1,26,64,0,55,10,16,6,0,42, 0,0,255,255,0,29,255,38,1,233,2,202,16,38,1,239, 88,229,16,6,0,74,0,0,0,2,0,44,255,233,2,197, 3,163,0,41,0,55,0,0,1,17,35,39,6,35,34,39, 38,53,52,55,54,55,54,51,50,23,22,23,35,38,39,38, 35,34,7,6,21,20,23,22,23,22,23,50,55,54,61,1, 35,53,3,51,22,51,50,55,54,53,51,6,35,34,39,38, 2,197,59,23,104,145,153,94,87,102,14,16,85,133,179,81, 33,12,95,21,95,42,53,132,71,53,61,8,8,72,112,114, 66,49,222,156,59,8,84,77,13,1,59,11,141,86,42,20, 1,129,254,123,97,116,114,104,162,176,110,15,13,70,118,49, 66,98,36,17,104,78,115,126,84,10,9,72,2,80,60,84, 20,82,2,34,66,57,4,5,135,57,26,0,0,3,0,29, 255,38,1,233,2,220,0,39,0,55,0,69,0,0,1,51, 17,20,7,6,7,6,7,6,35,34,39,38,39,51,22,23, 22,51,50,55,54,61,1,6,15,1,34,39,38,39,38,53, 52,55,54,51,50,23,39,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,3,51,22,51,50,55,54,53,51,6, 35,34,39,38,1,156,77,41,7,7,48,109,11,11,138,50, 17,4,85,6,26,36,59,81,35,30,59,73,27,83,61,3, 3,66,85,57,81,98,62,151,88,37,20,78,29,39,89,35, 18,82,27,163,59,7,85,77,13,1,59,11,141,86,42,20, 2,12,254,74,154,64,10,9,60,6,1,88,31,39,39,21, 28,49,41,102,27,82,10,2,64,3,3,77,129,153,79,54, 91,14,90,48,66,139,47,18,92,46,63,150,43,14,1,14, 66,57,4,5,135,57,28,0,255,255,0,44,255,233,2,197, 3,105,16,39,1,244,0,229,0,157,16,6,0,42,0,0, 255,255,0,29,255,38,1,233,2,156,16,38,1,244,88,208, 16,6,0,74,0,0,0,2,0,44,254,227,2,197,2,229, 0,41,0,54,0,0,1,17,35,39,6,35,34,39,38,53, 52,55,54,55,54,51,50,23,22,23,35,38,39,38,35,34, 7,6,21,20,23,22,23,22,23,50,55,54,61,1,35,53, 3,51,21,20,7,6,35,53,50,53,52,53,35,2,197,59, 23,104,145,153,94,87,102,14,16,85,133,179,81,33,12,95, 21,95,42,53,132,71,53,61,8,8,72,112,114,66,49,222, 68,100,59,17,24,55,55,1,129,254,123,97,116,114,104,162, 176,110,15,13,70,118,49,66,98,36,17,104,78,115,126,84, 10,9,72,2,80,60,84,20,82,254,67,103,88,25,8,38, 78,4,4,0,0,3,0,29,255,38,1,233,3,49,0,39, 0,55,0,69,0,0,1,51,17,20,7,6,7,6,7,6, 35,34,39,38,39,51,22,23,22,51,50,55,54,61,1,6, 15,1,34,39,38,39,38,53,52,55,54,51,50,23,39,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,55,35, 53,52,55,54,51,21,7,6,21,20,21,51,1,156,77,41, 7,7,48,109,11,11,138,50,17,4,85,6,26,36,59,81, 35,30,59,73,27,83,61,3,3,66,85,57,81,98,62,151, 88,37,20,78,29,39,89,35,18,82,27,37,100,59,17,24, 2,53,55,2,12,254,74,154,64,10,9,60,6,1,88,31, 39,39,21,28,49,41,102,27,82,10,2,64,3,3,77,129, 153,79,54,91,14,90,48,66,139,47,18,92,46,63,150,43, 14,130,103,88,25,8,38,1,1,75,4,5,255,255,0,83, 0,0,2,132,3,151,16,39,1,239,0,200,0,178,16,6, 0,43,0,0,255,255,255,224,0,0,1,230,3,151,16,39, 1,239,255,204,0,178,16,6,0,75,0,0,0,2,0,39, 0,0,2,176,2,217,0,3,0,23,0,0,19,21,33,53, 37,53,51,21,33,53,51,21,51,21,35,17,35,17,33,17, 35,17,35,53,176,1,119,254,44,93,1,119,93,44,44,93, 254,138,94,44,1,248,90,90,72,153,153,153,153,70,254,6, 1,76,254,180,1,250,70,0,0,1,0,7,0,0,1,230, 2,217,0,31,0,0,19,51,21,35,21,54,55,54,51,50, 23,22,21,17,35,17,52,39,38,35,34,7,6,21,17,35, 17,35,53,51,53,51,153,150,150,54,66,21,27,110,39,16, 83,34,32,42,84,37,21,83,63,63,83,2,141,53,148,70, 13,4,74,30,39,254,116,1,107,55,24,24,77,42,58,254, 223,2,88,53,76,0,255,255,255,246,0,0,1,48,3,105, 16,39,1,247,255,241,0,156,16,6,0,44,0,0,255,255, 255,235,0,0,1,37,2,156,16,38,1,247,230,207,16,6, 0,243,0,0,0,2,0,20,0,0,1,18,3,132,0,3, 0,7,0,0,19,17,35,17,55,21,35,53,194,94,174,254, 2,217,253,39,2,217,171,70,70,0,0,2,255,240,0,0, 0,231,2,189,0,3,0,7,0,0,19,17,35,17,55,21, 35,53,149,83,165,247,2,12,253,244,2,12,177,70,70,0, 255,255,255,253,0,0,1,42,3,136,16,39,1,243,255,238, 0,172,16,6,0,44,0,0,255,255,255,241,0,0,1,30, 2,187,16,38,1,243,226,223,16,6,0,243,0,0,0,1, 0,66,255,52,0,234,2,217,0,22,0,0,19,17,6,21, 20,23,22,51,50,55,21,6,35,34,39,38,53,52,55,54, 55,35,17,194,56,34,8,9,18,27,32,27,73,26,10,51, 11,15,43,2,217,253,39,51,56,40,10,2,9,45,9,49, 17,22,52,44,9,11,2,217,0,2,0,25,255,52,0,190, 2,217,0,24,0,28,0,0,19,17,6,7,6,21,20,23, 22,51,50,55,21,6,35,34,39,38,53,52,55,54,55,35, 17,55,21,35,53,150,42,9,2,34,7,9,16,27,31,27, 70,27,10,45,12,17,32,83,84,2,12,253,244,38,49,9, 7,42,11,3,9,45,9,47,19,22,48,43,11,14,2,12, 205,105,105,0,0,2,0,96,0,0,0,200,3,147,0,3, 0,7,0,0,19,17,35,17,55,21,35,53,195,94,99,104, 2,217,253,39,2,217,186,104,104,0,0,1,0,94,0,0, 0,178,2,12,0,3,0,0,19,17,35,17,178,84,2,12, 253,244,2,12,255,255,0,100,255,233,2,114,2,217,16,39, 0,45,0,200,0,0,16,6,0,44,0,0,255,255,0,66, 255,38,1,49,2,217,16,39,0,77,0,152,0,0,16,6, 0,76,0,0,255,255,0,17,255,233,2,11,3,151,16,39, 1,239,0,216,0,178,16,6,0,45,0,0,0,2,255,224, 255,38,0,255,3,17,0,15,0,22,0,0,19,51,17,20, 7,34,35,34,39,53,22,51,50,55,54,53,3,51,23,35, 39,7,35,70,83,128,7,8,13,15,17,3,52,11,5,6, 95,96,63,81,79,64,2,12,253,135,103,6,3,71,1,32, 14,23,3,93,150,96,96,0,0,2,0,79,254,227,2,146, 2,217,0,11,0,24,0,0,19,21,35,17,51,17,1,51, 9,1,35,1,19,51,21,20,7,6,35,53,50,53,52,53, 35,172,93,93,1,107,120,254,215,1,44,110,254,255,8,100, 59,17,24,55,55,0,255,255,2,217,254,143,1,113,254,215, 254,80,1,118,254,78,103,88,25,8,38,78,4,4,0,2, 0,58,254,227,1,246,2,217,0,11,0,24,0,0,19,17, 55,51,7,19,35,3,7,21,35,17,19,51,21,20,7,6, 35,53,50,53,52,53,35,141,222,107,182,214,103,177,81,83, 159,100,59,17,24,55,55,2,217,254,85,222,181,254,169,1, 28,80,204,2,217,252,235,103,88,25,8,38,78,4,4,0, 0,1,0,58,0,0,1,246,2,12,0,10,0,0,19,21, 55,51,9,1,35,37,21,35,17,141,222,107,254,240,1,48, 103,254,254,83,2,12,222,222,254,252,254,248,216,216,2,12, 0,2,0,70,0,0,2,21,3,171,0,5,0,9,0,0, 19,17,33,21,33,17,55,51,7,35,173,1,104,254,59,86, 113,149,60,2,217,253,121,82,2,217,210,148,0,2,0,63, 0,0,1,16,3,171,0,3,0,7,0,0,19,17,35,17, 55,51,7,35,152,84,91,113,149,60,2,217,253,39,2,217, 210,148,0,2,0,80,254,227,2,21,2,217,0,5,0,18, 0,0,19,17,33,21,33,17,19,51,21,20,7,6,35,53, 50,53,52,53,35,173,1,104,254,59,177,100,59,17,24,55, 55,2,217,253,121,82,2,217,252,235,103,88,25,8,38,78, 4,4,0,2,0,63,254,227,0,163,2,217,0,3,0,16, 0,0,19,17,35,17,3,51,21,20,7,6,35,53,50,53, 52,53,35,152,84,5,100,59,17,24,55,55,2,217,253,39, 2,217,252,235,103,88,25,8,38,78,4,4,0,2,0,80, 0,0,2,21,2,217,0,5,0,19,0,0,19,17,33,21, 33,17,59,1,21,20,7,6,43,1,53,50,53,52,53,35, 173,1,104,254,59,193,100,48,20,24,8,55,55,2,217,253, 121,82,2,217,103,76,32,13,38,78,4,4,0,2,0,68, 0,0,1,49,2,217,0,3,0,17,0,0,19,17,35,17, 59,1,21,20,7,6,43,1,53,50,53,52,53,35,152,84, 137,100,48,20,24,8,55,55,2,217,253,39,2,217,103,76, 32,13,38,78,4,4,255,255,0,80,0,0,2,21,2,217, 16,39,0,121,1,0,0,0,16,6,0,47,0,0,255,255, 0,68,0,0,1,177,2,217,16,39,0,121,0,222,0,0, 16,6,0,79,0,0,0,1,0,0,0,0,2,40,2,217, 0,13,0,0,19,55,21,7,21,33,21,33,17,7,53,55, 17,51,173,171,171,1,123,254,40,80,80,93,1,150,121,76, 122,247,82,1,24,57,77,56,1,117,0,1,0,0,0,0, 0,212,2,217,0,11,0,0,19,55,21,7,17,35,17,7, 53,55,17,51,146,66,66,83,63,63,83,1,165,51,64,51, 254,155,1,57,50,64,50,1,96,0,0,2,0,76,0,0, 2,134,3,171,0,9,0,13,0,0,1,17,35,1,17,35, 17,51,1,17,39,51,7,35,2,134,105,254,135,88,101,1, 125,169,113,149,60,2,217,253,39,2,79,253,177,2,217,253, 172,2,84,210,148,0,0,2,0,70,0,0,1,231,2,228, 0,23,0,27,0,0,19,51,21,54,55,54,51,50,23,22, 21,17,35,17,52,39,38,35,34,7,6,21,17,35,19,51, 7,35,70,77,54,76,20,24,105,42,19,83,59,21,28,84, 37,21,84,240,113,149,60,2,12,88,85,14,4,70,32,41, 254,116,1,107,70,24,9,77,42,58,254,223,2,228,148,0, 0,2,0,76,254,227,2,134,2,217,0,9,0,22,0,0, 1,17,35,1,17,35,17,51,1,17,1,51,21,20,7,6, 35,53,50,53,52,53,35,2,134,105,254,135,88,101,1,125, 254,252,100,59,17,24,55,55,2,217,253,39,2,79,253,177, 2,217,253,172,2,84,252,235,103,88,25,8,38,78,4,4, 0,2,0,70,254,227,1,231,2,27,0,23,0,36,0,0, 19,51,21,54,55,54,51,50,23,22,21,17,35,17,52,39, 38,35,34,7,6,21,17,35,23,51,21,20,7,6,35,53, 50,53,52,53,35,70,77,54,76,20,24,105,42,19,83,59, 21,28,84,37,21,84,159,100,59,17,24,55,55,2,12,88, 85,14,4,70,32,41,254,116,1,107,70,24,9,77,42,58, 254,223,60,103,88,25,8,38,78,4,4,0,0,2,0,76, 0,0,2,134,3,172,0,9,0,16,0,0,1,17,35,1, 17,35,17,51,1,17,39,35,39,51,23,55,51,2,134,105, 254,135,88,101,1,125,149,95,96,63,81,79,64,2,217,253, 39,2,79,253,177,2,217,253,172,2,84,61,150,96,96,0, 0,2,0,70,0,0,1,231,2,229,0,23,0,30,0,0, 19,51,21,54,55,54,51,50,23,22,21,17,35,17,52,39, 38,35,34,7,6,21,17,35,1,35,39,51,23,55,51,70, 77,54,76,20,24,105,42,19,83,59,21,28,84,37,21,84, 1,0,95,96,63,81,79,64,2,12,88,85,14,4,70,32, 41,254,116,1,107,70,24,9,77,42,58,254,223,2,79,150, 96,96,0,1,0,70,0,0,1,231,2,27,0,23,0,0, 19,51,21,54,55,54,51,50,23,22,21,17,35,17,52,39, 38,35,34,7,6,21,17,35,70,77,54,76,20,24,105,42, 19,83,59,21,28,84,37,21,84,2,12,88,85,14,4,70, 32,41,254,116,1,107,70,24,9,77,42,58,254,223,0,2, 0,76,255,38,2,134,2,217,0,15,0,25,0,0,37,51, 17,20,7,6,35,34,39,53,22,51,50,55,54,53,19,17, 35,1,17,35,17,51,1,17,2,46,88,99,22,27,13,15, 17,3,52,11,5,88,105,254,135,88,101,1,125,224,254,179, 87,18,4,3,71,1,32,14,23,3,37,253,39,2,79,253, 177,2,217,253,172,2,84,0,0,1,0,70,255,38,1,231, 2,27,0,35,0,0,1,17,20,7,34,35,34,39,53,22, 51,50,55,54,53,17,52,39,38,35,34,7,6,21,17,35, 17,51,21,54,55,54,51,50,23,22,1,231,128,7,8,13, 15,17,3,52,11,5,59,21,28,84,37,21,84,77,54,76, 20,24,105,42,19,1,140,254,7,103,6,3,71,1,32,14, 23,1,183,70,24,9,77,42,58,254,223,2,12,88,85,14, 4,70,32,0,0,3,0,38,255,233,2,230,3,132,0,18, 0,34,0,38,0,0,1,50,31,1,22,21,20,7,6,7, 6,35,34,39,38,53,52,55,54,23,34,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,55,21,33,53,1,133,174, 97,26,56,82,20,24,91,135,167,98,87,111,95,145,130,72, 56,95,67,97,129,72,58,98,66,42,254,238,2,229,123,38, 96,131,148,105,26,20,77,117,104,161,184,107,91,82,102,80, 118,158,83,59,100,79,117,165,83,56,241,70,70,0,0,3, 0,36,255,233,1,254,2,189,0,15,0,31,0,35,0,0, 1,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 23,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 55,21,33,53,1,16,152,57,29,102,56,79,144,60,33,105, 55,77,93,38,19,78,31,41,90,39,21,82,30,99,254,238, 2,27,129,65,91,167,71,39,119,67,95,174,70,37,77,92, 48,64,137,48,19,88,47,66,145,46,16,239,70,70,255,255, 0,38,255,233,2,230,3,136,16,39,1,243,0,224,0,172, 16,6,0,50,0,0,255,255,0,36,255,233,1,254,2,187, 16,38,1,243,108,223,16,6,0,82,0,0,0,4,0,38, 255,233,2,230,3,171,0,18,0,34,0,38,0,42,0,0, 1,50,31,1,22,21,20,7,6,7,6,35,34,39,38,53, 52,55,54,23,34,7,6,21,20,23,22,51,50,55,54,53, 52,39,38,3,51,7,35,37,51,7,35,1,133,174,97,26, 56,82,20,24,91,135,167,98,87,111,95,145,130,72,56,95, 67,97,129,72,58,98,66,121,113,149,60,1,14,113,149,60, 2,229,123,38,96,131,148,105,26,20,77,117,104,161,184,107, 91,82,102,80,118,158,83,59,100,79,117,165,83,56,1,24, 150,150,150,0,0,4,0,36,255,233,2,14,2,228,0,15, 0,31,0,35,0,39,0,0,1,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,23,34,7,6,21,20,23,22, 51,50,55,54,53,52,39,38,3,51,7,35,37,51,7,35, 1,16,152,57,29,102,56,79,144,60,33,105,55,77,93,38, 19,78,31,41,90,39,21,82,30,72,113,149,60,1,14,113, 149,60,2,27,129,65,91,167,71,39,119,67,95,174,70,37, 77,92,48,64,137,48,19,88,47,66,145,46,16,1,22,150, 150,150,0,2,0,43,255,236,3,191,2,229,0,26,0,39, 0,0,1,21,33,21,33,53,6,7,34,39,38,53,52,55, 54,55,54,51,50,23,53,33,21,33,21,33,21,5,17,38, 35,34,7,6,21,20,23,22,51,50,2,106,1,85,254,78, 70,114,131,80,87,103,69,105,11,11,121,62,1,173,254,176, 1,72,254,91,59,124,101,54,51,51,54,100,125,1,71,245, 82,74,92,2,92,100,184,206,101,69,8,1,88,76,82,238, 82,145,1,101,120,78,77,144,144,76,78,0,0,3,0,40, 255,233,3,131,2,27,0,37,0,57,0,66,0,0,37,51, 6,7,6,35,34,39,38,39,6,35,34,39,38,53,52,55, 54,51,50,23,54,55,54,51,50,23,22,23,22,21,33,22, 23,22,51,50,1,34,7,6,7,20,21,20,23,22,51,50, 55,54,53,52,39,38,39,38,23,33,52,39,38,35,34,7, 6,3,36,84,22,102,44,55,124,64,3,3,63,131,155,56, 26,122,49,66,135,61,54,103,18,18,115,65,20,12,21,254, 126,1,27,43,83,102,254,20,93,38,16,3,79,31,40,91, 39,20,81,17,19,16,221,1,38,65,34,45,85,41,20,159, 120,43,19,93,5,5,103,133,62,87,192,63,25,106,88,15, 3,82,25,31,55,112,72,40,68,1,152,93,39,53,9,9, 139,47,19,89,48,65,143,46,9,4,4,160,93,44,23,75, 36,0,0,3,0,93,0,0,2,167,3,171,0,29,0,40, 0,44,0,0,19,17,35,17,33,50,23,22,21,20,7,6, 7,22,23,22,23,22,23,22,23,21,35,38,53,55,52,39, 38,35,39,51,50,55,54,53,52,39,38,43,1,19,51,7, 35,186,93,1,80,170,41,11,72,19,24,62,19,17,1,2, 17,9,16,113,21,1,80,18,22,240,225,121,18,4,38,32, 73,225,197,113,149,60,1,58,254,198,2,217,120,33,42,98, 51,13,12,27,40,37,86,96,27,13,11,23,48,71,65,109, 17,4,82,86,17,22,66,32,28,1,36,148,0,2,0,69, 0,0,1,75,2,228,0,17,0,21,0,0,19,51,21,54, 55,54,51,50,23,21,6,7,6,7,6,21,17,35,19,51, 7,35,69,77,58,58,13,14,11,21,72,31,3,3,59,84, 149,113,149,60,2,12,95,93,14,3,3,85,1,21,2,2, 43,110,254,240,2,228,148,0,0,3,0,93,254,227,2,167, 2,217,0,29,0,40,0,53,0,0,19,17,35,17,33,50, 23,22,21,20,7,6,7,22,23,22,23,22,23,22,23,21, 35,38,53,55,52,39,38,35,39,51,50,55,54,53,52,39, 38,43,1,19,51,21,20,7,6,35,53,50,53,52,53,35, 186,93,1,80,170,41,11,72,19,24,62,19,17,1,2,17, 9,16,113,21,1,80,18,22,240,225,121,18,4,38,32,73, 225,133,100,59,17,24,55,55,1,58,254,198,2,217,120,33, 42,98,51,13,12,27,40,37,86,96,27,13,11,23,48,71, 65,109,17,4,82,86,17,22,66,32,28,253,61,103,88,25, 8,38,78,4,4,0,0,2,0,65,254,227,1,65,2,27, 0,17,0,30,0,0,19,51,21,54,55,54,51,50,23,21, 6,7,6,7,6,21,17,35,7,51,21,20,7,6,35,53, 50,53,52,53,35,69,77,58,58,13,14,11,21,72,31,3, 3,59,84,4,100,59,17,24,55,55,2,12,95,93,14,3, 3,85,1,21,2,2,43,110,254,240,60,103,88,25,8,38, 78,4,4,0,0,3,0,93,0,0,2,167,3,172,0,29, 0,40,0,47,0,0,19,17,35,17,33,50,23,22,21,20, 7,6,7,22,23,22,23,22,23,22,23,21,35,38,53,55, 52,39,38,35,39,51,50,55,54,53,52,39,38,43,1,55, 35,39,51,23,55,51,186,93,1,80,170,41,11,72,19,24, 62,19,17,1,2,17,9,16,113,21,1,80,18,22,240,225, 121,18,4,38,32,73,225,218,95,96,63,81,79,64,1,58, 254,198,2,217,120,33,42,98,51,13,12,27,40,37,86,96, 27,13,11,23,48,71,65,109,17,4,82,86,17,22,66,32, 28,143,150,96,96,0,0,2,0,48,0,0,1,79,2,229, 0,17,0,24,0,0,19,51,21,54,55,54,51,50,23,21, 6,7,6,7,6,21,17,35,19,35,39,51,23,55,51,69, 77,58,58,13,14,11,21,72,31,3,3,59,84,170,95,96, 63,81,79,64,2,12,95,93,14,3,3,85,1,21,2,2, 43,110,254,240,2,79,150,96,96,0,0,2,0,48,255,233, 2,109,3,171,0,54,0,58,0,0,1,35,38,39,38,35, 34,15,1,6,21,20,23,22,31,1,22,23,22,21,20,7, 6,7,6,35,34,39,38,39,51,23,22,23,22,51,50,55, 54,55,54,53,52,47,2,38,53,52,55,54,51,50,23,22, 3,51,7,35,2,84,88,1,109,32,40,104,41,12,6,54, 25,41,183,120,28,7,58,11,11,73,132,169,76,42,1,88, 3,7,28,51,117,89,45,44,7,1,110,24,181,143,104,64, 91,176,63,28,234,113,149,60,2,3,111,29,8,62,24,17, 20,56,28,13,11,49,33,97,25,28,84,63,11,9,56,104, 57,94,38,41,33,61,31,31,56,7,7,76,35,7,48,37, 133,124,56,34,111,49,1,102,148,0,0,2,0,34,255,233, 1,203,2,228,0,48,0,52,0,0,1,35,38,35,34,7, 6,21,20,23,22,31,1,22,23,22,21,20,7,6,35,34, 39,38,53,51,22,23,22,51,50,55,54,53,52,47,2,38, 39,38,53,52,55,54,51,50,23,22,3,51,7,35,1,182, 88,3,102,82,23,6,66,14,17,80,118,23,7,90,52,74, 194,14,1,88,6,18,33,71,84,28,10,54,27,78,119,31, 16,84,49,68,145,35,10,163,113,149,60,1,122,84,49,14, 16,45,22,4,4,19,28,70,21,27,96,44,26,162,8,9, 47,20,35,47,16,19,46,19,8,19,29,51,28,43,93,42, 25,101,27,1,73,148,255,255,0,48,255,233,2,109,3,173, 16,39,1,239,0,172,0,200,16,6,0,54,0,0,255,255, 0,34,255,233,1,203,2,202,16,38,1,239,86,229,16,6, 0,86,0,0,0,1,0,47,255,42,2,109,2,229,0,87, 0,0,5,7,54,51,50,23,22,21,20,7,6,35,34,47, 1,55,23,22,51,50,55,54,53,38,39,34,7,39,55,38, 35,39,38,39,38,53,52,53,51,23,22,23,22,51,50,55, 54,55,54,53,52,47,2,38,53,52,55,54,51,50,23,22, 21,35,38,39,38,35,34,15,1,6,21,20,23,22,31,1, 22,23,22,21,20,7,6,7,6,1,79,15,14,14,70,8, 1,66,25,32,45,66,14,21,9,57,32,38,13,3,7,39, 14,17,11,31,9,2,44,117,49,26,88,3,7,28,51,117, 89,45,44,7,1,110,24,181,143,104,64,91,176,63,28,88, 1,109,32,40,104,41,12,6,54,25,41,183,120,28,7,71, 28,35,56,24,32,2,55,5,7,63,22,8,28,6,40,4, 29,29,7,9,34,3,7,6,69,3,7,25,98,52,62,4, 4,38,41,33,61,31,31,56,7,7,76,35,7,48,37,133, 124,56,34,111,49,66,111,29,8,62,24,17,20,56,28,13, 11,49,33,97,25,28,94,64,26,14,22,0,0,1,0,34, 255,42,1,203,2,27,0,77,0,0,23,7,54,51,50,23, 22,21,20,7,6,35,34,39,38,39,55,23,22,51,50,55, 54,53,38,39,34,7,39,55,38,39,51,22,23,22,51,50, 55,54,53,52,47,2,38,39,38,53,52,55,54,51,50,23, 22,21,35,38,35,34,7,6,21,20,23,22,31,1,22,23, 22,21,20,7,6,7,6,244,14,14,14,70,8,1,66,25, 32,45,66,6,8,21,9,57,32,38,13,3,7,39,14,17, 11,31,168,3,88,6,18,33,71,84,28,10,54,27,78,119, 31,16,84,49,68,145,35,10,88,3,102,82,23,6,66,14, 17,80,118,23,7,65,16,17,38,24,32,2,55,5,7,63, 22,8,28,3,3,40,4,29,29,7,9,34,3,7,6,71, 17,160,47,20,35,47,16,19,46,19,8,19,29,51,28,43, 93,42,25,101,27,33,84,49,14,16,45,22,4,4,19,28, 70,21,27,79,47,11,8,17,0,2,0,48,255,233,2,109, 3,172,0,54,0,61,0,0,1,35,38,39,38,35,34,15, 1,6,21,20,23,22,31,1,22,23,22,21,20,7,6,7, 6,35,34,39,38,39,51,23,22,23,22,51,50,55,54,55, 54,53,52,47,2,38,53,52,55,54,51,50,23,22,39,35, 39,51,23,55,51,2,84,88,1,109,32,40,104,41,12,6, 54,25,41,183,120,28,7,58,11,11,73,132,169,76,42,1, 88,3,7,28,51,117,89,45,44,7,1,110,24,181,143,104, 64,91,176,63,28,216,95,96,63,81,79,64,2,3,111,29, 8,62,24,17,20,56,28,13,11,49,33,97,25,28,84,63, 11,9,56,104,57,94,38,41,33,61,31,31,56,7,7,76, 35,7,48,37,133,124,56,34,111,49,209,150,96,96,0,2, 0,34,255,233,1,203,2,229,0,48,0,55,0,0,1,35, 38,35,34,7,6,21,20,23,22,31,1,22,23,22,21,20, 7,6,35,34,39,38,53,51,22,23,22,51,50,55,54,53, 52,47,2,38,39,38,53,52,55,54,51,50,23,22,39,35, 39,51,23,55,51,1,182,88,3,102,82,23,6,66,14,17, 80,118,23,7,90,52,74,194,14,1,88,6,18,33,71,84, 28,10,54,27,78,119,31,16,84,49,68,145,35,10,144,95, 96,63,81,79,64,1,122,84,49,14,16,45,22,4,4,19, 28,70,21,27,96,44,26,162,8,9,47,20,35,47,16,19, 46,19,8,19,29,51,28,43,93,42,25,101,27,180,150,96, 96,0,255,255,0,21,255,42,2,81,2,217,16,39,0,122, 0,128,0,0,16,6,0,55,0,0,255,255,0,14,255,19, 1,37,2,156,16,38,0,122,6,233,16,6,0,87,0,0, 0,2,0,21,0,0,2,81,3,172,0,7,0,14,0,0, 1,17,35,17,35,53,33,21,39,35,39,51,23,55,51,1, 98,93,240,2,60,238,95,96,63,81,79,64,2,135,253,121, 2,135,82,82,143,150,96,96,0,2,0,14,255,233,1,65, 3,32,0,23,0,37,0,0,19,21,35,17,20,23,22,51, 50,55,21,6,35,34,39,38,53,17,35,53,51,53,51,21, 19,51,21,20,7,6,43,1,53,50,53,52,53,35,254,86, 22,9,15,25,15,39,29,89,11,1,71,71,83,53,100,48, 20,24,8,55,55,2,12,68,254,153,38,6,3,4,70,7, 67,7,9,1,140,68,144,144,1,20,103,76,32,13,38,78, 4,4,0,1,0,21,0,0,2,81,2,217,0,7,0,0, 1,17,35,17,35,53,33,21,1,98,93,240,2,60,2,135, 253,121,2,135,82,82,0,1,0,14,255,233,0,254,2,156, 0,23,0,0,19,21,35,17,20,23,22,51,50,55,21,6, 35,34,39,38,53,17,35,53,51,53,51,21,254,86,22,9, 15,25,15,39,29,89,11,1,71,71,83,2,12,68,254,153, 38,6,3,4,70,7,67,7,9,1,140,68,144,144,255,255, 0,85,255,233,2,133,3,105,16,39,1,247,0,203,0,156, 16,6,0,56,0,0,255,255,0,65,255,233,1,226,2,156, 16,38,1,247,112,207,16,6,0,88,0,0,0,2,0,85, 255,233,2,133,3,132,0,21,0,25,0,0,1,51,17,20, 7,6,35,34,39,38,53,17,51,17,20,23,22,51,50,55, 54,53,3,21,33,53,2,40,93,104,72,105,165,73,41,93, 110,34,42,124,45,19,50,254,238,2,217,254,0,130,65,45, 101,58,81,2,0,254,0,117,31,10,80,34,44,2,171,70, 70,0,0,2,0,65,255,233,1,226,2,189,0,23,0,27, 0,0,33,35,53,6,7,6,35,34,39,38,53,17,51,17, 20,23,22,51,50,55,54,53,17,51,39,21,33,53,1,226, 75,56,74,20,25,107,41,19,83,59,22,27,85,38,20,83, 71,254,238,73,79,13,4,70,32,41,1,148,254,141,70,24, 9,78,42,57,1,41,177,70,70,0,255,255,0,85,255,233, 2,133,3,136,16,39,1,243,0,200,0,172,16,6,0,56, 0,0,255,255,0,65,255,233,1,226,2,187,16,38,1,243, 108,223,16,6,0,88,0,0,0,3,0,85,255,233,2,133, 3,185,0,21,0,38,0,54,0,0,1,51,17,20,7,6, 35,34,39,38,53,17,51,17,20,23,22,51,50,55,54,53, 3,50,31,1,22,21,20,7,6,35,34,39,38,53,52,55, 54,23,34,7,6,21,20,23,22,51,50,55,54,53,52,39, 38,2,40,93,104,72,105,165,73,41,93,110,34,42,124,45, 19,187,50,26,9,3,43,21,24,48,27,13,42,21,25,29, 12,3,27,8,9,29,12,3,28,8,2,217,254,0,130,65, 45,101,58,81,2,0,254,0,117,31,10,80,34,44,2,224, 43,23,11,11,49,26,12,42,21,25,47,27,13,44,27,8, 8,29,11,4,27,8,8,31,10,3,0,3,0,65,255,233, 1,226,2,242,0,23,0,40,0,56,0,0,33,35,53,6, 7,6,35,34,39,38,53,17,51,17,20,23,22,51,50,55, 54,53,17,51,39,50,31,1,22,21,20,7,6,35,34,39, 38,53,52,55,54,23,34,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,1,226,75,56,74,20,25,107,41,19,83, 59,22,27,85,38,20,83,209,50,26,9,3,43,21,24,48, 27,13,42,21,25,29,12,3,27,8,9,29,12,3,28,8, 73,79,13,4,70,32,41,1,148,254,141,70,24,9,78,42, 57,1,41,230,43,23,11,11,49,26,12,42,21,25,47,27, 13,44,27,8,8,29,12,3,27,8,8,31,10,3,0,3, 0,85,255,233,2,133,3,171,0,21,0,25,0,29,0,0, 1,51,17,20,7,6,35,34,39,38,53,17,51,17,20,23, 22,51,50,55,54,53,3,51,7,35,37,51,7,35,2,40, 93,104,72,105,165,73,41,93,110,34,42,124,45,19,223,113, 149,60,1,14,113,149,60,2,217,254,0,130,65,45,101,58, 81,2,0,254,0,117,31,10,80,34,44,2,210,150,150,150, 0,3,0,65,255,233,2,18,2,228,0,23,0,27,0,31, 0,0,33,35,53,6,7,6,35,34,39,38,53,17,51,17, 20,23,22,51,50,55,54,53,17,51,39,51,7,35,37,51, 7,35,1,226,75,56,74,20,25,107,41,19,83,59,22,27, 85,38,20,83,239,113,149,60,1,14,113,149,60,73,79,13, 4,70,32,41,1,148,254,141,70,24,9,78,42,57,1,41, 216,150,150,150,0,1,0,85,255,51,2,133,2,217,0,40, 0,0,5,21,6,35,34,39,38,53,52,55,54,55,6,35, 34,39,38,53,17,51,17,20,23,22,51,50,55,54,53,17, 51,17,20,7,6,7,6,21,20,51,50,2,90,48,27,33, 37,63,59,6,8,57,44,168,73,40,93,110,34,42,124,45, 19,93,50,15,48,65,72,37,150,45,10,13,24,56,52,41, 4,5,13,102,57,81,2,0,254,0,117,31,10,80,34,44, 2,0,254,0,84,67,20,46,62,44,54,0,0,1,0,65, 255,52,2,9,2,12,0,42,0,0,1,17,6,7,6,21, 20,23,22,51,50,55,21,7,35,34,39,38,53,52,55,35, 53,6,7,6,35,34,39,38,53,17,51,17,20,23,22,51, 50,55,54,53,17,1,226,59,15,3,45,10,12,23,26,51, 1,96,30,10,96,22,56,74,20,25,107,41,19,83,59,22, 27,85,38,20,2,12,253,244,34,52,11,11,40,10,2,10, 45,9,54,18,21,61,50,73,79,13,4,70,32,41,1,148, 254,141,70,24,9,78,42,57,1,41,255,255,0,22,0,0, 3,161,3,151,16,39,1,239,1,56,0,178,16,6,0,58, 0,0,255,255,0,6,0,0,2,196,2,202,16,39,1,239, 0,194,255,229,16,6,0,90,0,0,255,255,0,13,0,0, 2,149,3,151,16,39,1,239,0,174,0,178,16,6,0,60, 0,0,255,255,0,20,255,38,1,222,2,202,16,38,1,239, 86,229,16,6,0,92,0,0,0,3,0,13,0,0,2,149, 3,146,0,8,0,12,0,16,0,0,1,17,35,17,1,51, 27,1,51,37,21,35,53,33,21,35,53,1,131,93,254,231, 115,214,208,111,254,163,104,1,10,104,1,30,254,226,1,30, 1,187,254,157,1,99,185,103,103,103,103,0,0,2,0,28, 0,0,2,71,3,171,0,9,0,13,0,0,1,21,1,33, 21,33,53,1,33,53,37,51,7,35,2,69,254,76,1,182, 253,213,1,182,254,102,1,35,113,149,60,2,217,84,253,205, 82,82,2,53,82,210,148,0,0,2,0,31,0,0,1,201, 2,228,0,9,0,13,0,0,1,21,1,33,21,33,53,1, 33,53,55,51,7,35,1,187,254,201,1,69,254,86,1,57, 254,220,226,113,149,60,2,12,74,254,135,73,75,1,120,73, 216,148,0,2,0,28,0,0,2,71,3,147,0,9,0,13, 0,0,1,21,1,33,21,33,53,1,33,53,37,21,35,53, 2,69,254,76,1,182,253,213,1,182,254,102,1,59,104,2, 217,84,253,205,82,82,2,53,82,186,104,104,0,2,0,31, 0,0,1,201,2,204,0,9,0,13,0,0,1,21,1,33, 21,33,53,1,33,53,55,21,35,53,1,187,254,201,1,69, 254,86,1,57,254,220,251,104,2,12,74,254,135,73,75,1, 120,73,192,104,104,0,0,2,0,28,0,0,2,71,3,172, 0,9,0,16,0,0,1,21,1,33,21,33,53,1,33,53, 37,35,39,51,23,55,51,2,69,254,76,1,182,253,213,1, 182,254,102,1,54,95,96,63,81,79,64,2,217,84,253,205, 82,82,2,53,82,61,150,96,96,0,0,2,0,31,0,0, 1,201,2,229,0,9,0,16,0,0,1,21,1,33,21,33, 53,1,33,53,55,35,39,51,23,55,51,1,187,254,201,1, 69,254,86,1,57,254,220,246,95,96,63,81,79,64,2,12, 74,254,135,73,75,1,120,73,67,150,96,96,0,1,0,18, 0,0,1,2,2,220,0,17,0,0,51,35,17,35,53,51, 53,52,55,54,51,50,23,21,38,35,34,21,171,83,70,70, 74,22,27,23,24,19,10,58,1,200,68,89,88,24,7,5, 69,1,53,0,255,255,0,26,255,233,2,45,2,217,16,71, 0,211,2,71,0,0,192,0,64,0,255,255,0,79,0,0, 2,112,2,217,16,6,2,105,0,0,0,2,0,54,255,233, 2,11,2,217,0,15,0,34,0,0,1,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,1,17,33,21,33,21, 54,51,50,23,22,21,20,7,6,35,34,39,21,1,27,83, 39,24,69,33,44,84,42,27,72,37,254,239,1,135,254,204, 57,105,128,59,37,91,57,80,107,59,1,205,84,50,69,125, 52,26,79,51,70,127,53,25,254,52,2,217,73,203,86,108, 68,99,161,77,49,90,67,0,0,2,0,0,0,0,2,112, 2,217,0,10,0,31,0,0,55,51,50,55,54,53,52,39, 38,43,1,53,21,51,50,23,22,21,20,7,6,35,33,17, 7,53,55,53,51,21,55,21,172,212,81,41,24,65,35,46, 212,165,250,32,4,84,61,85,254,198,79,79,93,172,82,62, 35,46,84,39,21,170,88,173,24,28,114,65,47,1,221,52, 77,52,175,113,113,76,0,2,255,247,255,233,2,11,2,217, 0,15,0,40,0,0,1,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,39,21,54,51,50,23,22,21,20,7, 6,35,34,39,21,35,17,7,53,55,53,51,21,55,21,1, 27,83,39,24,69,33,44,84,42,27,72,37,190,57,105,128, 59,37,91,57,80,107,59,75,63,63,83,66,1,205,84,50, 69,125,52,26,79,51,70,127,53,25,127,134,86,108,68,99, 161,77,49,90,67,2,31,50,64,50,122,78,51,64,255,255, 0,48,255,233,2,165,2,229,16,15,0,38,2,213,2,206, 192,0,0,2,0,48,255,233,2,237,2,229,0,15,0,47, 0,0,1,53,52,55,54,51,50,23,21,38,35,34,7,6, 29,1,49,35,38,39,38,39,34,7,6,21,20,23,22,51, 50,55,54,55,54,55,51,2,33,34,39,38,53,52,55,54, 51,50,2,63,73,24,30,23,24,19,10,51,6,1,95,15, 38,54,90,128,61,40,95,59,83,109,51,6,4,22,11,96, 33,254,245,141,82,106,102,82,149,238,1,247,89,92,28,9, 5,79,1,40,6,7,82,75,35,44,2,115,75,112,170,79, 49,77,8,9,42,71,254,223,85,109,185,183,111,91,0,1, 0,31,255,233,2,46,2,44,0,40,0,0,1,54,51,50, 23,21,38,35,34,7,6,29,1,35,38,47,1,34,7,6, 21,20,23,22,51,50,55,51,6,7,6,35,34,39,38,53, 52,55,54,51,50,1,148,25,82,23,24,19,10,51,6,1, 84,13,84,27,94,35,16,79,29,39,107,21,84,11,104,43, 56,129,62,41,92,59,82,84,1,238,62,5,69,1,40,6, 7,82,97,15,2,100,46,63,137,45,17,126,137,46,20,105, 70,101,160,77,49,0,255,255,0,20,0,0,2,155,2,217, 16,6,0,146,0,0,255,255,0,78,0,0,2,112,2,217, 16,71,2,105,2,190,0,0,192,0,64,0,255,255,0,54, 255,233,2,11,2,217,16,71,1,68,2,65,0,0,192,0, 64,0,255,255,0,90,0,0,2,101,2,217,16,71,0,40, 2,191,0,0,192,0,64,0,0,2,0,38,255,233,2,230, 2,229,0,30,0,39,0,0,19,54,55,54,51,50,31,1, 22,21,20,7,6,7,6,35,34,39,38,53,52,55,33,38, 39,38,35,34,7,6,7,5,33,22,23,22,51,50,55,54, 47,29,123,82,108,174,97,26,56,82,20,24,91,135,167,98, 87,1,2,97,9,101,63,86,130,72,32,14,1,249,254,0, 19,101,59,77,129,72,44,1,196,160,77,52,123,38,96,131, 148,105,26,20,77,117,104,161,17,9,156,73,45,102,45,60, 149,141,65,38,100,60,0,1,0,48,255,233,2,109,2,229, 0,57,0,0,1,35,34,7,6,21,20,23,22,23,22,51, 50,55,54,53,52,53,51,6,7,6,35,34,39,38,39,38, 53,52,55,54,55,38,53,52,55,54,51,50,23,22,21,35, 38,39,38,35,34,15,1,6,21,20,23,22,59,1,1,156, 108,81,51,31,43,4,5,45,89,117,51,38,88,1,42,76, 169,132,73,64,13,3,109,10,11,105,104,64,91,176,63,28, 88,1,109,32,40,104,41,12,6,48,49,61,88,1,65,59, 35,36,56,38,4,3,31,61,45,62,3,2,94,57,104,56, 51,84,16,16,114,51,5,4,45,108,124,56,34,111,49,66, 111,29,8,62,24,17,20,47,45,45,0,2,0,2,255,38, 2,67,2,217,0,13,0,23,0,0,55,51,17,20,7,6, 35,34,39,53,22,51,50,53,19,17,35,17,33,21,33,21, 33,21,90,93,88,29,36,13,15,17,3,68,93,93,1,233, 254,116,1,92,224,254,179,79,23,7,3,81,1,59,1,152, 254,180,2,217,82,233,82,0,0,1,0,11,255,44,2,30, 2,226,0,33,0,0,1,21,35,3,6,7,6,7,34,39, 55,22,51,50,55,54,55,19,35,53,51,55,54,55,54,51, 50,23,7,38,35,34,15,1,1,211,126,75,19,46,58,77, 36,19,17,25,26,69,24,1,2,78,113,125,22,16,45,51, 64,35,44,30,32,20,71,23,12,1,206,70,254,115,103,47, 55,2,10,84,16,97,8,8,1,157,70,104,80,44,48,19, 79,18,126,70,0,2,0,44,255,233,3,18,2,229,0,15, 0,57,0,0,1,53,52,55,54,51,50,23,21,38,35,34, 7,6,29,1,23,17,35,39,6,35,34,39,38,53,52,55, 54,55,54,51,50,23,22,23,35,38,39,38,35,34,7,6, 21,20,23,22,23,22,23,50,55,54,61,1,35,53,2,100, 73,24,30,23,24,19,10,51,6,1,10,59,23,104,145,153, 94,87,102,14,16,85,133,179,81,33,12,95,21,95,42,53, 132,71,53,61,8,8,72,112,114,66,49,222,1,252,89,92, 28,9,5,79,1,40,6,7,82,123,254,123,97,116,114,104, 162,176,110,15,13,70,118,49,66,98,36,17,104,78,115,126, 84,10,9,72,2,80,60,84,20,82,0,1,0,58,0,0, 1,246,2,220,0,21,0,0,51,17,52,55,54,51,50,23, 21,38,35,34,21,17,55,51,7,19,35,3,7,21,58,74, 22,27,23,24,19,10,58,222,107,182,214,103,177,81,2,101, 88,24,7,5,69,1,53,254,208,222,181,254,169,1,28,80, 204,0,0,1,255,244,255,38,2,134,2,217,0,19,0,0, 23,17,51,1,17,51,17,35,1,17,20,7,6,35,34,39, 53,22,51,50,76,101,1,125,88,105,254,135,99,22,27,13, 15,17,3,66,76,3,37,253,172,2,84,253,39,2,79,253, 68,87,18,4,3,76,1,0,0,1,0,70,255,56,1,231, 2,27,0,23,0,0,19,51,21,54,55,54,51,50,23,22, 21,17,35,17,52,39,38,35,34,7,6,21,17,35,70,77, 54,76,20,24,105,42,19,83,59,21,28,84,37,21,84,2, 12,88,85,14,4,70,32,41,253,172,2,51,70,24,9,77, 42,58,254,223,0,3,0,38,255,233,2,230,2,229,0,18, 0,27,0,36,0,0,1,50,31,1,22,21,20,7,6,7, 6,35,34,39,38,53,52,55,54,1,38,39,38,35,34,7, 6,7,5,33,22,23,22,51,50,55,54,1,133,174,97,26, 56,82,20,24,91,135,167,98,87,111,95,1,148,9,101,63, 86,129,72,50,6,2,3,253,254,15,99,62,81,129,73,46, 2,229,123,38,96,131,148,105,26,20,77,117,104,161,184,107, 91,254,156,156,73,45,101,71,102,70,145,69,42,100,65,0, 0,3,0,54,255,38,2,72,2,80,0,15,0,34,0,50, 0,0,1,53,52,55,54,51,50,23,21,38,35,34,7,6, 29,1,1,17,51,21,54,51,50,23,22,21,20,7,6,7, 6,35,34,39,17,19,34,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,1,164,86,15,16,23,24,19,10,51,6, 1,254,69,77,59,108,127,60,38,89,39,52,21,23,97,64, 146,83,39,24,69,33,44,84,42,26,71,35,1,128,89,100, 16,3,5,69,1,40,6,7,82,253,166,2,230,79,94,111, 71,104,154,75,33,10,4,78,254,239,2,167,84,50,69,125, 52,26,81,50,69,127,53,26,255,255,0,48,255,233,2,109, 2,229,16,71,0,54,2,157,0,0,192,0,64,0,255,255, 0,34,255,233,1,203,2,27,16,71,0,86,1,237,0,0, 192,0,64,0,0,1,0,28,0,0,2,71,2,217,0,11, 0,0,19,3,53,33,21,33,19,3,33,21,33,53,247,217, 2,13,254,102,219,219,1,182,253,213,1,109,1,24,84,82, 254,230,254,229,82,82,0,1,0,14,255,38,0,254,2,156, 0,33,0,0,23,38,39,17,35,53,51,53,51,21,51,21, 35,17,20,23,22,51,50,55,21,20,7,6,35,34,39,53, 22,51,50,55,54,53,170,80,5,71,71,83,86,86,22,9, 15,25,15,114,14,16,13,15,17,3,52,11,5,22,15,67, 1,140,68,144,144,68,254,153,38,6,3,4,163,96,12,1, 3,71,1,32,14,23,0,1,0,14,255,233,0,255,2,220, 0,33,0,0,19,21,51,21,35,17,20,23,22,51,50,55, 21,6,35,34,39,38,53,17,35,53,51,53,52,55,54,51, 50,23,21,38,35,34,168,86,86,22,9,15,25,15,39,29, 89,11,1,71,71,74,22,27,23,24,19,10,58,2,94,82, 68,254,153,38,6,3,4,70,7,67,7,9,1,140,68,89, 88,24,7,5,69,1,0,2,0,21,255,38,2,81,2,217, 0,13,0,21,0,0,37,17,20,51,50,55,21,6,35,34, 39,38,53,17,19,17,35,17,35,53,33,21,1,98,68,3, 17,15,13,118,28,7,93,93,240,2,60,224,254,212,59,1, 81,3,70,18,21,1,77,1,167,253,121,2,135,82,82,0, 255,255,0,89,0,0,5,3,3,172,16,39,1,63,2,188, 0,0,16,6,0,39,0,0,255,255,0,89,0,0,4,141, 2,229,16,39,1,64,2,196,0,0,16,6,0,39,0,0, 255,255,0,26,255,233,3,245,2,229,16,39,1,64,2,44, 0,0,16,6,0,71,0,0,255,255,0,80,255,233,3,214, 2,217,16,39,0,45,2,44,0,0,16,6,0,47,0,0, 255,255,0,80,255,38,2,197,2,217,16,39,0,77,2,44, 0,0,16,6,0,47,0,0,255,255,0,68,255,38,1,119, 2,217,16,39,0,77,0,222,0,0,16,6,0,79,0,0, 255,255,0,76,255,233,4,110,2,217,16,39,0,45,2,196, 0,0,16,6,0,49,0,0,255,255,0,76,255,38,3,107, 2,217,16,39,0,77,2,210,0,0,16,6,0,49,0,0, 255,255,0,70,255,38,2,197,2,217,16,39,0,77,2,44, 0,0,16,6,0,81,0,0,255,255,0,17,0,0,2,141, 3,163,16,39,1,240,0,174,0,190,16,6,0,36,0,0, 255,255,0,42,255,233,2,23,2,217,16,38,1,240,112,244, 16,6,0,68,0,0,255,255,0,3,0,0,1,34,3,163, 16,39,1,240,255,240,0,190,16,6,0,44,0,0,255,255, 255,249,0,0,1,24,2,217,16,38,1,240,230,244,16,6, 0,243,0,0,255,255,0,38,255,233,2,230,3,163,16,39, 1,240,0,226,0,190,16,6,0,50,0,0,255,255,0,36, 255,233,1,254,2,217,16,38,1,240,110,244,16,6,0,82, 0,0,255,255,0,85,255,233,2,133,3,163,16,39,1,240, 0,202,0,190,16,6,0,56,0,0,255,255,0,65,255,233, 1,226,2,217,16,38,1,240,111,244,16,6,0,88,0,0, 255,255,0,85,255,233,2,133,4,0,16,39,0,113,0,200, 1,67,16,6,0,158,0,0,255,255,0,65,255,233,1,226, 3,57,16,38,0,113,109,124,16,6,0,190,0,0,255,255, 0,85,255,233,2,133,4,78,16,39,0,118,0,243,1,106, 16,6,0,158,0,0,255,255,0,65,255,233,1,226,3,135, 16,39,0,118,0,152,0,163,16,6,0,190,0,0,255,255, 0,85,255,233,2,133,4,80,16,39,1,240,0,202,1,107, 16,6,0,158,0,0,255,255,0,65,255,233,1,226,3,137, 16,39,1,240,0,112,0,164,16,6,0,190,0,0,255,255, 0,85,255,233,2,133,4,78,16,39,0,67,0,164,1,106, 16,6,0,158,0,0,255,255,0,65,255,233,1,226,3,135, 16,39,0,67,0,73,0,163,16,6,0,190,0,0,255,255, 0,40,255,233,2,1,2,27,16,15,0,72,2,41,2,4, 192,0,255,255,0,17,0,0,2,141,4,0,16,39,0,113, 0,170,1,67,16,6,0,134,0,0,255,255,0,42,255,233, 2,23,3,57,16,38,0,113,108,124,16,6,0,166,0,0, 255,255,0,17,0,0,2,141,3,227,16,39,0,113,0,172, 1,38,16,39,1,244,0,170,0,169,16,6,0,36,0,0, 255,255,0,42,255,233,2,23,3,25,16,38,0,113,110,92, 16,38,1,244,108,223,16,6,0,68,0,0,255,255,0,11, 0,0,3,182,3,83,16,39,0,113,1,200,0,150,16,6, 0,136,0,0,255,255,0,34,255,233,3,77,2,137,16,39, 0,113,1,18,255,204,16,6,0,168,0,0,255,255,0,44, 255,233,2,197,3,163,16,39,1,240,0,232,0,190,16,6, 0,42,0,0,255,255,0,29,255,38,1,233,2,217,16,38, 1,240,90,244,16,6,0,74,0,0,255,255,0,79,0,0, 2,146,3,163,16,39,1,240,0,204,0,190,16,6,0,46, 0,0,255,255,255,212,0,0,1,246,3,151,16,39,1,240, 255,193,0,178,16,6,0,78,0,0,255,255,0,38,255,35, 2,230,2,229,16,39,1,246,0,201,255,240,16,6,0,50, 0,0,255,255,0,36,255,35,1,254,2,27,16,38,1,246, 84,240,16,6,0,82,0,0,255,255,0,38,255,35,2,230, 3,83,16,39,0,113,0,224,0,150,16,39,1,246,0,201, 255,240,16,6,0,50,0,0,255,255,0,36,255,35,1,254, 2,137,16,38,0,113,107,204,16,38,1,246,84,240,16,6, 0,82,0,0,255,255,255,223,255,38,0,254,2,202,16,38, 1,240,204,229,16,6,8,70,0,0,255,255,0,89,0,0, 5,25,2,217,16,39,0,61,2,210,0,0,16,6,0,39, 0,0,255,255,0,89,0,0,4,155,2,217,16,39,0,93, 2,210,0,0,16,6,0,39,0,0,255,255,0,26,255,233, 3,245,2,217,16,39,0,93,2,44,0,0,16,6,0,71, 0,0,255,255,0,44,255,233,2,197,3,161,16,39,0,118, 1,16,0,189,16,6,0,42,0,0,255,255,0,29,255,38, 1,233,2,215,16,39,0,118,0,130,255,243,16,6,0,74, 0,0,255,255,0,76,0,0,2,134,3,161,16,39,0,67, 0,160,0,189,16,6,0,49,0,0,255,255,0,70,0,0, 1,231,2,215,16,38,0,67,78,243,16,6,0,81,0,0, 255,255,0,17,0,0,2,141,4,117,16,39,0,118,0,213, 1,145,16,6,0,135,0,0,255,255,0,42,255,233,2,23, 3,174,16,39,0,118,0,153,0,202,16,6,0,167,0,0, 255,255,0,11,0,0,3,182,3,161,16,39,0,118,1,243, 0,189,16,6,0,136,0,0,255,255,0,34,255,233,3,77, 2,215,16,39,0,118,1,61,255,243,16,6,0,168,0,0, 255,255,0,30,255,233,2,232,3,175,16,39,0,118,1,12, 0,203,16,6,0,154,0,0,255,255,0,18,255,226,2,17, 2,215,16,39,0,118,0,151,255,243,16,6,0,186,0,0, 255,255,254,250,0,0,2,141,3,163,16,39,2,4,0,106, 0,191,16,6,0,36,0,0,255,255,254,188,255,233,2,23, 2,217,16,38,2,4,44,245,16,6,0,68,0,0,255,255, 255,110,0,0,2,141,3,148,16,47,1,243,0,170,5,233, 192,0,16,6,0,36,0,0,255,255,255,48,255,233,2,23, 2,202,16,47,1,243,0,108,5,31,192,0,16,6,0,68, 0,0,255,255,255,0,0,0,2,101,3,163,16,39,2,4, 0,112,0,191,16,6,0,40,0,0,255,255,254,193,255,233, 2,1,2,217,16,38,2,4,49,245,16,6,0,72,0,0, 255,255,255,115,0,0,2,101,3,148,16,47,1,243,0,175, 5,233,192,0,16,6,0,40,0,0,255,255,255,52,255,233, 2,1,2,202,16,47,1,243,0,112,5,31,192,0,16,6, 0,72,0,0,255,255,254,60,0,0,0,194,3,163,16,39, 2,4,255,172,0,191,16,6,0,44,0,0,255,255,254,49, 0,0,0,178,2,217,16,38,2,4,161,245,16,6,0,243, 0,0,255,255,254,176,0,0,0,194,3,148,16,47,1,243, 255,236,5,233,192,0,16,6,0,44,0,0,255,255,254,164, 0,0,0,178,2,202,16,47,1,243,255,224,5,31,192,0, 16,6,0,243,0,0,255,255,255,46,255,233,2,230,3,163, 16,39,2,4,0,158,0,191,16,6,0,50,0,0,255,255, 254,185,255,233,1,254,2,217,16,38,2,4,41,245,16,6, 0,82,0,0,255,255,255,162,255,233,2,230,3,148,16,47, 1,243,0,222,5,233,192,0,16,6,0,50,0,0,255,255, 255,44,255,233,1,254,2,202,16,47,1,243,0,104,5,31, 192,0,16,6,0,82,0,0,255,255,254,174,0,0,2,167, 3,163,16,39,2,4,0,30,0,191,16,6,0,53,0,0, 255,255,254,108,0,0,1,65,2,217,16,38,2,4,220,245, 16,6,0,85,0,0,255,255,255,34,0,0,2,167,3,148, 16,47,1,243,0,94,5,233,192,0,16,6,0,53,0,0, 255,255,254,224,0,0,1,65,2,202,16,47,1,243,0,28, 5,31,192,0,16,6,0,85,0,0,255,255,255,22,255,233, 2,133,3,163,16,39,2,4,0,134,0,191,16,6,0,56, 0,0,255,255,254,186,255,233,1,226,2,217,16,38,2,4, 42,245,16,6,0,88,0,0,255,255,255,138,255,233,2,133, 3,148,16,47,1,243,0,198,5,233,192,0,16,6,0,56, 0,0,255,255,255,46,255,233,1,226,2,202,16,47,1,243, 0,106,5,31,192,0,16,6,0,88,0,0,0,2,0,48, 254,227,2,109,2,229,0,54,0,67,0,0,1,35,38,39, 38,35,34,15,1,6,21,20,23,22,31,1,22,23,22,21, 20,7,6,7,6,35,34,39,38,39,51,23,22,23,22,51, 50,55,54,55,54,53,52,47,2,38,53,52,55,54,51,50, 23,22,1,51,21,20,7,6,35,53,50,53,52,53,35,2, 84,88,1,109,32,40,104,41,12,6,54,25,41,183,120,28, 7,58,11,11,73,132,169,76,42,1,88,3,7,28,51,117, 89,45,44,7,1,110,24,181,143,104,64,91,176,63,28,254, 207,100,59,17,24,55,55,2,3,111,29,8,62,24,17,20, 56,28,13,11,49,33,97,25,28,84,63,11,9,56,104,57, 94,38,41,33,61,31,31,56,7,7,76,35,7,48,37,133, 124,56,34,111,49,253,127,103,88,25,8,38,78,4,4,0, 0,2,0,34,254,227,1,203,2,27,0,48,0,61,0,0, 1,35,38,35,34,7,6,21,20,23,22,31,1,22,23,22, 21,20,7,6,35,34,39,38,53,51,22,23,22,51,50,55, 54,53,52,47,2,38,39,38,53,52,55,54,51,50,23,22, 3,51,21,20,7,6,35,53,50,53,52,53,35,1,182,88, 3,102,82,23,6,66,14,17,80,118,23,7,90,52,74,194, 14,1,88,6,18,33,71,84,28,10,54,27,78,119,31,16, 84,49,68,145,35,10,241,100,59,17,24,55,55,1,122,84, 49,14,16,45,22,4,4,19,28,70,21,27,96,44,26,162, 8,9,47,20,35,47,16,19,46,19,8,19,29,51,28,43, 93,42,25,101,27,254,41,103,88,25,8,38,78,4,4,0, 0,2,0,21,254,227,2,81,2,217,0,7,0,20,0,0, 1,17,35,17,35,53,33,21,1,51,21,20,7,6,35,53, 50,53,52,53,35,1,98,93,240,2,60,254,179,100,59,17, 24,55,55,2,135,253,121,2,135,82,82,253,61,103,88,25, 8,38,78,4,4,0,0,2,0,14,254,227,0,254,2,156, 0,23,0,36,0,0,19,21,35,17,20,23,22,51,50,55, 21,6,35,34,39,38,53,17,35,53,51,53,51,21,3,51, 21,20,7,6,35,53,50,53,52,53,35,254,86,22,9,15, 25,15,39,29,89,11,1,71,71,83,57,100,59,17,24,55, 55,2,12,68,254,153,38,6,3,4,70,7,67,7,9,1, 140,68,144,144,253,184,103,88,25,8,38,78,4,4,255,255, 0,83,0,0,2,132,3,163,16,39,1,240,0,201,0,190, 16,6,0,43,0,0,255,255,0,70,0,0,1,230,3,151, 16,39,1,240,0,116,0,178,16,6,0,75,0,0,255,255, 0,17,0,0,2,141,3,117,16,39,1,244,0,170,0,169, 16,6,0,36,0,0,255,255,0,42,255,233,2,23,2,171, 16,38,1,244,108,223,16,6,0,68,0,0,255,255,0,90, 255,49,2,101,2,217,16,39,0,122,0,168,0,7,16,6, 0,40,0,0,255,255,0,40,255,26,2,1,2,27,16,38, 0,122,94,240,16,6,0,72,0,0,255,255,0,38,255,233, 2,230,4,0,16,39,0,113,0,225,1,67,16,6,0,152, 0,0,255,255,0,36,255,233,1,254,3,57,16,38,0,113, 108,124,16,6,0,184,0,0,255,255,0,38,255,233,2,230, 4,2,16,39,0,113,0,231,1,69,16,6,0,151,0,0, 255,255,0,36,255,233,1,254,3,59,16,38,0,113,114,126, 16,6,0,183,0,0,255,255,0,38,255,233,2,230,3,117, 16,39,1,244,0,222,0,169,16,6,0,50,0,0,255,255, 0,36,255,233,1,254,2,171,16,38,1,244,105,223,16,6, 0,82,0,0,255,255,0,38,255,233,2,230,3,227,16,39, 0,113,0,224,1,38,16,39,1,244,0,222,0,169,16,6, 0,50,0,0,255,255,0,36,255,233,1,254,3,25,16,38, 0,113,107,92,16,38,1,244,105,223,16,6,0,82,0,0, 255,255,0,13,0,0,2,149,3,83,16,39,0,113,0,172, 0,150,16,6,0,60,0,0,255,255,0,20,255,38,1,222, 2,137,16,38,0,113,84,204,16,6,0,92,0,0,255,255, 0,42,255,233,2,23,2,27,16,15,0,68,2,65,2,4, 192,0,0,2,0,26,255,242,1,229,2,26,0,19,0,35, 0,0,19,52,55,54,51,50,23,53,51,17,35,53,6,15, 1,34,35,34,39,38,37,52,39,38,35,34,7,6,21,20, 23,22,51,50,55,54,26,86,54,80,90,66,83,83,57,61, 49,1,1,85,62,60,1,115,58,38,53,74,38,23,55,41, 56,81,34,17,1,2,159,74,47,80,66,253,244,57,54,12, 5,86,84,107,111,59,38,89,55,66,96,60,45,96,48,0, 255,255,0,68,255,242,2,15,2,26,16,15,1,193,2,41, 2,12,192,0,0,3,0,54,255,233,2,11,2,220,0,13, 0,30,0,46,0,0,19,53,52,55,54,51,50,23,21,38, 35,34,29,1,35,51,21,54,51,50,23,22,21,20,7,6, 35,34,39,21,35,19,34,7,6,21,20,23,22,51,50,55, 54,53,52,39,38,54,74,22,27,23,24,19,10,58,83,83, 57,105,128,59,37,91,57,80,107,59,75,229,83,39,24,69, 33,44,84,42,27,72,37,2,12,89,88,24,7,5,69,1, 53,82,71,86,108,68,99,161,77,49,90,67,1,205,84,50, 69,125,52,26,79,51,70,127,53,25,255,255,0,31,255,233, 1,221,2,27,16,15,0,70,1,252,2,4,192,0,0,2, 0,26,255,38,2,76,2,217,0,17,0,46,0,0,1,34, 7,6,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 19,6,7,6,35,34,39,38,53,52,55,54,51,50,23,17, 51,17,20,23,22,51,50,55,21,6,35,34,53,1,9,85, 41,20,5,1,70,36,47,83,39,24,72,33,114,58,86,11, 12,130,60,38,89,57,79,108,53,83,42,13,18,3,17,15, 13,139,1,205,82,38,51,16,16,122,54,27,82,50,69,131, 51,23,254,120,83,8,1,112,71,103,154,75,47,81,1,15, 252,219,56,10,3,1,71,3,109,0,0,2,0,26,255,233, 2,70,2,220,0,17,0,46,0,0,1,34,7,6,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,55,17,35,53, 6,7,6,35,34,39,38,53,52,55,54,51,50,23,53,52, 55,54,51,50,23,21,38,35,34,1,9,85,41,20,5,1, 70,36,47,83,39,24,72,33,188,74,58,86,11,12,130,60, 38,89,57,79,108,53,74,22,27,23,24,19,10,58,1,205, 82,38,51,16,16,122,54,27,82,50,69,131,51,23,145,253, 162,69,83,8,1,112,71,103,154,75,47,81,155,88,24,7, 5,69,1,0,255,255,0,40,255,233,2,1,2,27,16,71, 0,72,2,41,0,0,192,0,64,0,255,255,0,40,255,233, 2,1,2,27,16,15,0,72,2,41,2,4,192,0,255,255, 0,34,255,233,1,203,2,27,16,71,2,143,1,237,0,0, 192,0,64,0,255,255,0,34,255,233,1,203,2,27,16,6, 2,143,0,0,0,3,0,29,255,38,2,64,2,138,0,15, 0,55,0,71,0,0,1,53,52,55,54,51,50,23,21,38, 35,34,7,6,29,1,39,51,17,20,7,6,7,6,7,6, 35,34,39,38,39,51,22,23,22,51,50,55,54,61,1,6, 15,1,34,39,38,39,38,53,52,55,54,51,50,23,39,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,1,156, 86,15,16,23,24,19,10,51,6,1,77,77,41,7,7,48, 109,11,11,138,50,17,4,85,6,26,36,59,81,35,30,59, 73,27,83,61,3,3,66,85,57,81,98,62,151,88,37,20, 78,29,39,89,35,18,82,27,1,186,89,100,16,3,5,69, 1,40,6,7,82,82,254,74,154,64,10,9,60,6,1,88, 31,39,39,21,28,49,41,102,27,82,10,2,64,3,3,77, 129,153,79,54,91,14,90,48,66,139,47,18,92,46,63,150, 43,14,255,255,0,29,255,38,1,233,2,27,16,6,0,74, 0,0,255,255,0,70,255,51,1,230,2,12,16,15,0,75, 2,44,2,12,192,0,0,2,0,70,0,0,1,230,2,220, 0,13,0,37,0,0,19,53,52,55,54,51,50,23,21,38, 35,34,29,1,35,51,21,54,55,54,51,50,23,22,21,17, 35,17,52,39,38,35,34,7,6,21,17,35,70,74,22,27, 23,24,19,10,58,83,83,54,66,21,27,110,39,16,83,34, 32,42,84,37,21,83,2,12,89,88,24,7,5,69,1,53, 82,72,70,13,4,74,30,39,254,116,1,107,55,24,24,77, 42,58,254,223,0,1,0,70,255,38,1,230,2,220,0,45, 0,0,5,17,52,39,38,35,34,7,6,21,17,35,17,52, 55,54,51,50,23,21,38,35,34,29,1,54,55,54,51,50, 23,22,21,17,20,7,34,35,34,39,53,22,51,50,55,54, 1,147,34,32,42,84,37,21,83,74,22,27,23,24,19,10, 58,54,66,21,27,110,39,16,128,7,8,13,15,17,3,52, 11,5,76,1,183,55,24,24,77,42,58,254,223,2,101,88, 24,7,5,69,1,53,154,70,13,4,74,30,39,254,7,103, 6,3,71,1,32,14,0,2,255,248,0,0,0,230,2,217, 0,3,0,15,0,0,19,21,35,53,19,53,51,21,51,21, 35,21,35,53,35,53,150,84,1,83,80,80,83,75,2,217, 105,105,254,95,212,212,72,240,240,72,0,1,0,66,255,233, 0,235,2,12,0,15,0,0,19,17,20,23,22,51,50,55, 21,6,35,34,39,38,53,17,149,22,9,15,25,15,39,29, 89,11,1,2,12,254,85,38,6,3,4,70,7,67,7,9, 1,208,255,255,0,94,0,0,0,178,2,12,16,6,0,243, 0,0,0,1,0,68,255,38,0,240,2,217,0,15,0,0, 23,17,51,17,20,23,22,51,50,55,21,6,35,34,39,38, 68,84,32,13,23,3,17,15,13,134,9,1,109,3,70,252, 219,53,11,5,1,71,3,96,6,0,255,255,0,70,255,241, 2,250,2,12,16,15,0,80,3,64,2,12,192,0,0,1, 0,70,255,56,2,250,2,12,0,40,0,0,5,35,17,6, 15,1,34,39,38,39,6,15,1,34,39,38,53,17,51,17, 20,23,22,51,50,55,54,53,17,51,17,20,23,22,51,50, 55,54,53,17,51,2,250,77,54,74,33,89,43,5,4,54, 63,44,122,25,5,84,63,16,18,62,37,24,84,71,12,14, 62,37,24,84,200,1,18,76,11,2,65,7,8,65,11,4, 98,22,26,1,137,254,151,81,19,5,56,36,45,1,73,254, 151,87,15,3,56,36,45,1,73,0,0,2,0,70,255,38, 2,250,2,27,0,15,0,58,0,0,37,51,17,20,7,6, 35,34,39,53,22,51,50,55,54,53,1,51,21,54,55,54, 51,50,23,22,23,54,55,54,51,50,23,22,21,17,35,17, 52,39,38,35,34,7,6,21,17,35,17,52,39,38,35,34, 7,6,21,17,35,2,166,84,114,14,16,13,15,17,3,52, 11,5,253,160,77,54,74,15,18,89,43,5,4,54,63,20, 24,122,25,5,84,63,16,18,61,37,25,84,71,12,14,62, 37,24,84,224,254,179,96,12,1,3,71,1,32,14,23,2, 88,74,76,11,2,65,7,8,65,11,4,98,22,26,254,119, 1,105,81,19,5,54,37,46,254,183,1,105,87,15,3,56, 36,45,254,183,0,2,255,238,255,38,1,231,2,27,0,15, 0,39,0,0,55,51,17,20,7,6,35,34,39,53,22,51, 50,55,54,53,17,51,21,54,55,54,51,50,23,22,21,17, 35,17,52,39,38,35,34,7,6,21,17,35,70,84,114,14, 16,13,15,17,3,52,11,5,77,54,76,20,24,105,42,19, 83,59,21,28,84,37,21,84,224,254,179,96,12,1,3,71, 1,32,14,23,2,88,88,85,14,4,70,32,41,254,116,1, 107,70,24,9,77,42,58,254,223,0,0,2,0,70,255,38, 2,64,2,27,0,15,0,39,0,0,37,17,20,23,22,51, 50,55,21,6,35,34,39,38,53,17,1,51,21,54,55,54, 51,50,23,22,21,17,35,17,52,39,38,35,34,7,6,21, 17,35,1,232,32,13,23,3,17,15,13,134,9,1,254,178, 77,54,76,20,24,105,42,19,83,59,21,28,84,37,21,84, 224,254,212,53,11,5,1,71,3,96,6,7,1,77,1,44, 88,85,14,4,70,32,41,254,116,1,107,70,24,9,77,42, 58,254,223,0,0,3,0,36,255,233,1,254,2,27,0,15, 0,24,0,33,0,0,1,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,23,38,39,38,35,34,7,6,7,5, 33,22,23,22,51,50,55,54,1,16,152,57,29,102,56,79, 144,60,33,105,55,226,12,87,23,27,92,38,15,4,1,41, 254,216,11,80,26,31,91,38,15,2,27,129,65,91,167,71, 39,119,67,95,174,70,37,249,131,32,9,91,35,46,70,119, 35,12,89,33,255,255,0,69,255,241,1,65,2,12,16,15, 0,85,1,134,2,12,192,0,0,1,0,69,255,241,1,65, 2,217,0,17,0,0,33,35,53,6,7,6,35,34,39,53, 54,55,54,55,54,53,17,51,1,65,77,58,58,13,14,11, 21,72,31,3,3,59,84,95,93,14,3,3,85,1,21,2, 2,43,110,1,221,0,0,2,0,69,255,38,1,153,2,12, 0,13,0,31,0,0,33,21,20,23,22,51,50,55,21,6, 35,34,61,1,51,35,53,6,7,6,35,34,39,53,54,55, 54,55,54,53,17,51,1,65,32,13,23,3,17,15,13,137, 77,77,58,58,13,14,11,21,72,31,3,3,59,84,76,53, 11,5,1,71,3,109,109,95,93,14,3,3,85,1,21,2, 2,43,110,1,16,0,0,1,0,69,255,56,1,65,2,27, 0,17,0,0,19,51,21,54,55,54,51,50,23,21,6,7, 6,7,6,21,17,35,69,77,58,58,13,14,11,21,72,31, 3,3,59,84,2,12,95,93,14,3,3,85,1,21,2,2, 43,110,254,40,0,1,0,69,255,38,1,65,2,27,0,29, 0,0,23,17,51,21,54,55,54,51,50,23,21,6,7,6, 7,6,21,17,20,23,22,51,50,55,21,6,35,34,39,38, 69,77,58,58,13,14,11,21,72,31,3,3,59,32,13,23, 3,17,15,13,134,9,1,109,2,121,95,93,14,3,3,85, 1,21,2,2,43,110,254,164,53,11,5,1,71,3,96,6, 0,1,0,84,0,0,1,0,2,27,0,15,0,0,51,35, 17,52,55,54,51,50,23,21,38,35,34,15,1,21,168,84, 114,14,16,13,15,17,3,52,11,5,1,174,96,12,1,3, 71,1,32,28,9,0,255,255,0,84,0,0,1,0,2,27, 16,71,1,223,1,84,0,0,192,0,64,0,0,1,255,202, 255,40,1,203,2,27,0,61,0,0,55,21,20,7,6,35, 34,39,53,22,51,50,55,54,61,1,51,22,23,22,51,50, 55,54,53,52,47,2,38,39,38,53,52,55,54,51,50,23, 22,21,35,38,35,34,7,6,21,20,23,22,31,1,22,23, 22,21,20,7,6,35,34,118,114,14,16,13,15,17,3,52, 11,5,88,6,18,33,71,84,28,10,54,27,78,119,31,16, 84,49,68,145,35,10,88,3,102,82,23,6,66,14,17,80, 118,23,7,90,52,74,77,2,109,96,12,1,3,71,1,32, 14,23,230,47,20,35,47,16,19,46,19,8,19,29,51,28, 43,93,42,25,101,27,33,84,49,14,16,45,22,4,4,19, 28,70,21,27,96,44,26,0,0,2,0,0,255,38,1,2, 2,220,0,15,0,37,0,0,55,51,17,20,7,6,35,34, 39,53,22,51,50,55,54,53,19,21,35,17,35,17,35,53, 51,53,52,55,54,51,50,23,21,38,35,34,29,1,88,84, 114,14,16,13,15,17,3,52,11,5,170,87,83,70,70,74, 22,27,23,24,19,10,58,224,254,179,96,12,1,3,71,1, 32,14,23,2,88,68,254,56,1,200,68,89,88,24,7,5, 69,1,53,82,0,2,0,0,255,38,1,2,2,220,0,15, 0,37,0,0,55,51,17,20,7,6,35,34,39,53,22,51, 50,55,54,53,19,21,35,17,35,17,35,53,51,53,52,55, 54,51,50,23,21,38,35,34,29,1,88,84,114,14,16,13, 15,17,3,52,11,5,170,87,83,70,70,74,22,27,23,24, 19,10,58,224,254,179,96,12,1,3,71,1,32,14,23,2, 88,68,254,56,1,200,68,89,88,24,7,5,69,1,53,82, 0,1,0,0,255,38,1,2,2,220,0,23,0,0,19,52, 35,34,7,53,54,51,50,23,22,21,17,20,23,22,51,50, 55,21,6,35,38,39,87,58,10,19,24,23,91,25,7,32, 13,23,3,17,15,13,138,5,2,94,53,1,69,5,71,22, 26,253,79,53,11,5,1,71,3,7,102,0,255,255,0,14, 255,233,0,254,2,156,16,15,0,87,1,12,2,133,192,0, 0,1,0,14,255,38,0,254,2,156,0,23,0,0,19,21, 35,17,20,23,22,51,50,55,21,6,35,34,39,38,53,17, 35,53,51,53,51,21,254,86,22,9,15,25,15,39,29,89, 11,1,71,71,83,2,12,68,253,214,38,6,3,4,70,7, 67,7,9,2,79,68,144,144,255,255,0,65,255,233,1,226, 2,12,16,6,0,88,0,0,255,255,0,10,0,0,1,230, 2,12,16,15,0,89,1,240,2,12,192,0,255,255,0,6, 0,0,2,196,2,12,16,15,0,90,2,202,2,12,192,0, 255,255,0,20,0,0,1,222,2,230,16,15,0,92,1,242, 2,12,192,0,0,1,0,31,255,40,2,33,2,12,0,23, 0,0,41,1,53,1,33,53,33,21,1,33,21,20,23,22, 51,50,55,21,6,35,34,39,38,53,1,117,254,170,1,57, 254,220,1,135,254,201,1,69,32,13,23,3,17,15,13,134, 9,1,75,1,120,73,74,254,135,147,53,11,5,1,71,3, 96,6,7,0,0,1,0,36,0,0,1,208,2,14,0,11, 0,0,37,33,21,35,17,51,21,33,53,51,17,35,1,125, 254,251,84,83,1,6,83,83,236,236,2,14,218,218,253,242, 255,255,0,58,0,0,1,246,2,217,16,15,0,78,2,48, 2,217,192,0,0,2,0,26,255,38,2,70,2,138,0,15, 0,44,0,0,1,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,23,53,52,55,54,51,50,23,21,38,35,34, 7,6,21,17,35,17,6,35,34,39,38,53,52,55,54,51, 50,1,10,84,42,27,70,36,47,82,40,24,71,33,110,86, 15,16,23,24,19,10,51,6,1,83,57,105,128,59,37,91, 57,80,104,1,205,81,51,71,122,54,27,81,50,69,131,51, 24,3,73,100,16,3,5,69,1,40,6,7,253,26,1,22, 83,108,68,99,161,77,49,0,0,1,0,20,2,79,1,51, 2,229,0,6,0,0,19,51,23,35,39,7,35,116,95,96, 63,81,79,64,2,229,150,96,96,0,0,1,0,19,2,79, 1,50,2,229,0,6,0,0,19,35,39,51,23,55,51,210, 95,96,63,81,79,64,2,79,150,96,96,0,255,255,0,92, 2,80,1,45,2,228,16,6,0,118,0,0,255,255,0,22, 2,80,0,231,2,228,16,6,0,67,0,0,0,1,0,15, 2,85,1,60,2,220,0,13,0,0,19,51,22,51,50,55, 54,53,51,6,35,34,39,38,15,59,8,84,77,13,1,59, 11,141,86,42,20,2,220,66,57,4,5,135,57,28,0,1, 0,115,2,100,0,219,2,204,0,3,0,0,19,21,35,53, 219,104,2,204,104,104,0,2,0,79,2,67,0,255,2,242, 0,16,0,32,0,0,19,50,31,1,22,21,20,7,6,35, 34,39,38,53,52,55,54,23,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,167,50,26,9,3,43,21,24,48, 27,13,42,21,25,29,12,3,27,8,9,29,12,3,28,8, 2,242,43,23,11,11,49,26,12,42,21,25,47,27,13,44, 27,8,8,29,12,3,27,8,8,31,10,3,0,1,0,57, 255,51,1,9,0,0,0,19,0,0,59,1,6,7,6,21, 20,51,50,55,21,6,35,34,39,38,53,52,55,54,154,70, 73,14,7,72,37,26,48,28,33,36,63,74,11,41,31,15, 19,54,10,45,10,13,24,57,64,37,6,0,0,1,0,5, 2,101,1,63,2,205,0,21,0,0,1,51,6,35,34,39, 38,35,34,7,35,54,55,54,51,50,23,22,23,22,51,50, 1,5,58,15,74,21,64,35,14,23,10,58,16,59,5,6, 23,42,2,3,39,24,25,2,205,104,25,13,37,93,9,1, 17,1,1,18,0,2,255,221,2,78,1,92,2,228,0,3, 0,7,0,0,19,51,7,35,37,51,7,35,61,113,149,60, 1,14,113,149,60,2,228,150,150,150,255,255,254,201,2,80, 255,154,2,228,16,7,0,67,254,179,0,0,255,255,255,15, 2,80,255,224,2,228,16,7,0,118,254,179,0,0,255,255, 254,199,2,79,255,230,2,229,16,7,1,239,254,179,0,0, 255,255,254,184,2,101,255,242,2,205,16,7,1,247,254,179, 0,0,255,255,254,207,2,119,255,225,2,189,16,7,0,113, 254,179,0,0,255,255,254,194,2,85,255,239,2,220,16,7, 1,243,254,179,0,0,255,255,255,38,2,100,255,142,2,204, 16,7,1,244,254,179,0,0,255,255,254,209,2,100,255,219, 2,203,16,7,0,106,254,179,0,0,255,255,255,2,2,67, 255,178,2,242,16,7,1,245,254,179,0,0,255,255,254,144, 2,78,0,15,2,228,16,7,1,248,254,179,0,0,255,255, 254,198,2,79,255,229,2,229,16,7,1,240,254,179,0,0, 0,2,254,144,2,78,0,15,2,228,0,3,0,7,0,0, 3,23,35,39,35,23,35,39,81,96,60,149,61,96,60,149, 2,228,150,150,150,150,255,255,254,194,2,85,255,239,2,220, 16,15,1,243,255,254,5,49,192,0,255,255,1,198,2,71, 2,23,2,228,16,15,2,7,1,77,5,43,192,0,0,1, 255,54,2,71,255,135,2,228,0,10,0,0,3,51,21,20, 35,53,50,55,54,53,35,202,81,81,28,8,5,41,2,228, 69,88,42,14,11,20,255,255,1,198,2,71,2,23,2,228, 16,71,2,7,1,77,0,0,192,0,64,0,0,1,255,28, 254,227,255,128,255,196,0,12,0,0,7,51,21,20,7,6, 35,53,50,53,52,53,35,228,100,59,17,24,55,55,60,103, 88,25,8,38,78,4,4,0,255,255,254,218,255,42,255,210, 0,0,16,7,0,122,254,179,0,0,255,255,254,236,255,51, 255,188,0,0,16,7,1,246,254,179,0,0,0,1,0,39, 2,68,0,156,3,12,0,3,0,0,19,7,39,55,156,106, 11,66,2,204,136,64,136,0,0,1,0,22,255,62,0,139, 0,6,0,3,0,0,23,55,23,7,22,106,11,66,130,136, 64,136,0,1,0,129,255,3,1,29,255,181,0,17,0,0, 5,20,15,1,34,35,34,61,1,51,22,21,23,22,51,54, 63,1,1,29,27,27,9,19,74,76,1,6,5,15,21,2, 5,192,47,9,5,79,99,106,2,21,12,1,5,18,255,255, 0,110,255,109,0,215,2,12,16,6,0,30,0,0,0,1, 0,174,2,73,0,255,2,208,0,3,0,0,1,7,35,39, 0,255,22,41,18,2,208,135,135,0,255,255,0,75,2,67, 1,85,3,75,16,38,2,16,253,123,16,6,0,106,45,223, 255,255,0,8,0,0,2,166,2,208,16,38,2,16,196,0, 16,6,2,27,0,0,0,1,0,89,0,200,0,188,1,48, 0,15,0,0,19,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,138,32,13,4,30,9,10,31,13,5,30,9, 1,47,30,10,11,34,14,4,30,10,12,34,13,4,255,255, 255,212,0,0,2,102,2,208,16,39,2,16,255,38,0,0, 16,6,2,31,0,0,255,255,255,185,0,0,2,113,2,208, 16,39,2,16,255,11,0,0,16,6,2,33,0,0,255,255, 255,194,0,0,0,163,2,208,16,39,2,16,255,20,0,0, 16,6,2,35,0,0,255,255,255,240,255,248,2,222,2,208, 16,39,2,16,255,66,0,0,16,6,2,41,0,0,255,255, 255,158,255,254,2,151,2,208,16,39,2,16,254,240,0,0, 16,6,2,46,0,0,255,255,255,250,255,255,2,192,2,208, 16,39,2,16,255,76,0,0,16,6,2,50,0,0,255,255, 255,223,255,248,1,14,3,95,16,39,2,16,255,145,0,143, 16,38,0,106,193,243,16,6,2,66,0,0,0,2,0,8, 0,0,2,166,2,204,0,7,0,15,0,0,33,35,39,33, 7,35,1,51,19,3,38,39,6,7,6,7,2,166,106,84, 254,212,78,102,1,20,102,72,104,13,9,16,61,26,13,218, 218,2,204,254,90,1,24,37,31,86,156,68,38,0,0,3, 0,74,0,0,2,103,2,204,0,22,0,35,0,44,0,0, 37,20,15,1,6,35,33,17,33,50,31,1,22,23,22,21, 20,7,6,7,22,23,22,39,52,39,38,39,38,43,1,21, 51,50,55,54,23,52,39,38,43,1,21,51,50,2,103,62, 13,60,134,254,240,1,12,148,59,16,2,2,11,85,7,8, 37,21,77,129,51,9,9,35,70,144,156,63,27,72,30,109, 31,42,166,178,170,212,94,59,11,48,2,204,80,27,6,5, 36,28,96,48,4,4,12,14,53,219,69,25,5,2,9,216, 8,20,236,98,19,5,246,0,0,1,0,82,0,0,2,54, 2,204,0,5,0,0,1,33,17,35,17,33,2,54,254,124, 96,1,228,2,120,253,136,2,204,0,0,2,0,13,255,255, 2,171,2,204,0,5,0,14,0,0,33,37,4,35,1,51, 19,3,38,39,38,39,6,7,3,2,171,254,226,254,143,15, 1,20,102,154,169,12,9,8,10,11,27,152,2,2,2,204, 253,136,1,188,32,27,17,38,65,73,254,92,0,1,0,80, 0,0,2,102,2,204,0,11,0,0,41,1,17,33,21,33, 21,33,21,33,21,33,2,102,253,234,2,6,254,88,1,140, 254,116,1,184,2,204,84,220,84,244,0,1,0,35,0,0, 2,89,2,204,0,11,0,0,41,1,53,1,54,55,33,53, 33,21,1,33,2,89,253,202,1,112,43,31,254,112,2,0, 254,68,1,200,88,1,202,55,31,84,84,253,220,0,0,1, 0,65,0,0,2,113,2,204,0,11,0,0,33,35,17,33, 17,35,17,51,17,33,17,51,2,113,94,254,140,94,94,1, 116,94,1,82,254,174,2,204,254,218,1,38,0,3,0,45, 255,243,2,217,2,201,0,19,0,36,0,40,0,0,1,20, 7,6,35,34,39,38,39,38,53,52,55,54,51,50,23,22, 23,20,5,20,23,22,51,50,55,54,53,52,47,1,38,35, 34,7,6,5,33,53,33,2,217,106,93,143,90,75,80,48, 49,108,90,144,139,96,104,3,253,180,86,64,94,149,66,31, 89,29,54,72,162,57,27,1,156,254,176,1,80,1,93,170, 102,89,36,37,79,77,125,184,102,85,86,92,175,5,15,141, 76,55,130,62,89,152,78,21,33,141,65,107,82,0,0,1, 0,69,0,0,0,163,2,204,0,3,0,0,51,35,17,51, 163,94,94,2,204,0,0,1,0,74,0,0,2,154,2,204, 0,11,0,0,33,35,1,7,21,35,17,51,17,1,51,1, 2,154,126,254,254,114,94,94,1,98,120,254,222,1,106,114, 248,2,204,254,158,1,98,254,222,0,0,1,0,8,255,255, 2,166,2,188,0,10,0,0,33,35,3,48,23,3,6,7, 35,1,51,2,166,106,240,1,154,32,37,102,1,20,102,2, 115,1,254,77,87,104,2,188,0,1,0,64,0,0,2,236, 2,204,0,15,0,0,33,35,17,3,35,3,17,35,17,51, 19,22,23,55,19,51,2,236,92,208,86,206,92,144,168,27, 7,38,172,128,2,88,253,168,2,98,253,158,2,204,254,6, 69,37,114,1,242,0,0,1,0,56,0,0,2,108,2,204, 0,9,0,0,33,35,1,17,35,17,51,1,17,51,2,108, 96,254,136,92,98,1,120,90,2,50,253,206,2,204,253,206, 2,50,0,3,0,65,255,255,2,100,2,187,0,3,0,7, 0,11,0,0,1,33,53,33,3,33,53,33,19,33,53,33, 2,83,253,238,2,18,57,254,103,1,153,73,253,222,2,34, 2,105,82,254,131,82,254,112,82,0,0,2,0,50,255,248, 2,222,2,190,0,17,0,35,0,0,19,52,55,54,51,50, 23,22,23,22,21,20,7,6,35,34,39,38,55,20,23,22, 51,50,55,54,53,52,39,38,39,38,35,34,7,6,50,111, 90,141,88,78,77,50,49,106,94,142,181,94,67,96,86,64, 94,149,66,31,102,2,3,55,82,161,58,27,1,82,182,99, 82,37,38,80,78,122,167,99,87,124,91,128,138,73,54,127, 61,87,160,75,2,2,38,138,64,0,0,1,0,80,255,255, 2,128,2,188,0,7,0,0,33,35,17,33,17,35,17,33, 2,128,94,254,140,94,2,48,2,105,253,151,2,188,0,2, 0,78,255,255,2,112,2,188,0,14,0,25,0,0,1,20, 7,34,43,1,17,35,17,33,50,23,22,23,22,7,52,39, 38,43,1,21,51,50,55,54,2,112,252,8,8,184,94,1, 14,127,52,16,14,67,98,82,26,62,184,186,141,22,5,1, 242,206,7,254,227,2,188,28,8,12,58,100,91,27,6,251, 86,19,0,1,0,40,255,254,2,94,2,189,0,14,0,0, 5,33,53,19,39,53,33,21,33,22,23,22,23,3,33,2, 94,253,202,236,202,2,0,254,112,37,116,32,21,242,1,200, 1,86,1,35,243,82,82,38,142,38,25,254,217,0,0,1, 0,39,255,254,2,95,2,187,0,7,0,0,1,35,17,35, 17,35,53,33,2,95,238,94,236,2,56,2,105,253,150,2, 106,82,0,1,0,21,255,254,2,151,2,187,0,11,0,0, 9,1,17,35,17,1,51,23,22,23,54,55,2,151,254,232, 92,254,242,112,159,29,21,62,151,2,186,254,110,254,214,1, 42,1,146,243,46,39,103,225,0,3,0,29,255,254,2,176, 2,191,0,21,0,30,0,41,0,0,1,20,7,6,35,21, 35,53,34,39,38,53,52,55,54,51,53,51,21,50,23,22, 7,52,39,38,39,17,54,55,54,5,17,6,7,6,7,6, 21,20,23,22,2,176,82,82,124,83,124,82,82,93,81,115, 81,135,83,71,91,92,46,59,112,53,32,254,232,111,54,23, 7,2,91,46,1,88,122,75,77,71,71,77,74,123,129,81, 69,80,80,91,77,106,112,56,28,6,254,99,11,84,50,145, 1,157,11,80,35,43,16,17,117,59,29,0,0,1,0,36, 0,0,2,168,2,176,0,21,0,0,33,35,3,7,49,15, 1,35,1,3,51,23,22,23,54,55,54,55,54,55,51,3, 2,168,116,207,19,14,176,112,1,16,238,109,153,22,9,15, 13,13,120,21,13,102,246,1,36,31,21,240,1,103,1,72, 211,32,18,27,16,19,154,27,18,254,188,0,0,1,0,52, 255,253,2,182,2,186,0,35,0,0,1,20,7,6,7,6, 43,1,21,35,53,35,34,39,38,39,38,53,17,23,17,20, 23,22,59,1,17,51,17,51,50,55,54,53,17,55,2,182, 40,40,64,32,74,24,94,24,105,48,13,14,70,90,67,35, 60,26,86,26,113,31,18,90,1,100,88,50,53,15,9,144, 144,27,7,11,57,113,1,86,2,254,184,103,29,15,1,219, 254,37,59,32,56,1,72,2,0,1,0,42,255,255,2,192, 2,181,0,41,0,0,19,52,55,54,51,50,23,22,23,22, 21,20,7,6,7,51,21,33,53,54,55,54,53,52,39,38, 35,34,7,6,21,20,23,22,23,21,33,53,51,38,39,38, 47,87,91,141,110,77,111,31,9,142,17,19,176,254,238,92, 46,47,83,65,97,123,65,46,115,26,31,254,248,174,143,22, 4,1,95,139,99,103,48,72,133,41,43,171,91,11,10,73, 77,36,74,77,90,131,76,60,104,71,95,156,84,20,14,77, 73,85,136,28,255,255,255,239,0,0,0,249,3,136,16,39, 0,106,255,209,0,189,16,6,2,35,0,0,255,255,0,21, 255,254,2,151,3,136,16,39,0,106,0,178,0,189,16,6, 2,46,0,0,255,255,0,48,255,243,2,71,2,208,16,38, 2,16,86,0,16,6,2,58,0,0,255,255,0,39,255,246, 1,220,2,208,16,38,2,16,63,0,16,6,2,62,0,0, 255,255,0,24,255,74,1,242,2,208,16,38,2,16,91,0, 16,6,2,64,0,0,255,255,0,56,255,248,1,14,2,208, 16,38,2,16,143,0,16,6,2,66,0,0,255,255,0,40, 255,242,1,222,3,95,16,39,2,16,0,48,0,143,16,38, 0,106,96,243,16,6,2,78,0,0,0,2,0,48,255,243, 2,71,2,18,0,34,0,50,0,0,5,34,39,38,61,1, 38,53,7,6,7,6,35,34,39,38,53,52,55,54,55,54, 51,22,31,1,53,51,17,20,51,50,55,23,6,3,52,39, 38,35,34,7,6,21,20,23,22,51,50,55,54,1,247,51, 12,2,1,17,14,41,39,50,213,14,1,21,33,97,35,42, 111,51,8,72,21,11,12,21,43,116,41,34,73,127,15,2, 122,10,10,116,27,7,13,41,8,10,9,5,5,27,17,17, 16,241,16,17,53,67,104,32,12,2,70,16,78,254,91,31, 9,69,21,1,23,67,66,55,156,19,21,177,14,1,126,33, 0,2,0,50,255,58,1,248,2,220,0,24,0,50,0,0, 37,20,7,6,35,34,39,38,39,21,35,17,52,55,54,55, 54,51,50,23,22,21,6,7,22,3,50,55,54,53,52,39, 38,43,1,53,51,50,55,54,53,52,39,38,35,34,7,6, 21,19,22,1,248,81,52,73,86,49,13,14,86,35,11,15, 53,86,137,45,18,8,96,158,224,105,23,6,39,47,76,50, 42,94,30,10,34,33,48,59,41,27,1,31,200,119,58,37, 40,11,15,250,2,176,112,52,16,15,47,98,39,51,122,34, 30,254,214,92,23,27,71,30,35,74,76,26,32,56,28,30, 41,27,106,254,170,83,0,1,0,25,255,58,2,11,2,18, 0,18,0,0,1,3,21,35,53,3,38,35,34,7,39,52, 55,50,23,22,23,27,1,2,11,188,86,167,9,16,13,13, 6,42,47,20,20,19,118,144,2,6,254,26,230,230,1,152, 14,6,70,7,5,18,20,52,254,208,1,126,0,2,0,37, 255,240,2,17,2,206,0,23,0,42,0,0,37,20,7,6, 35,34,39,38,53,52,55,54,51,50,23,39,53,33,21,33, 23,22,23,22,39,34,7,6,7,20,23,22,59,1,50,55, 54,55,54,53,52,39,38,2,17,120,53,81,105,68,65,148, 38,27,10,24,211,1,142,254,243,175,56,20,76,248,90,42, 20,2,95,24,29,28,47,22,54,12,3,82,33,250,190,53, 23,68,67,123,191,55,11,4,151,72,72,127,41,22,77,53, 84,43,55,142,34,8,16,40,92,19,19,122,41,17,0,1, 0,39,255,246,1,220,2,20,0,45,0,0,37,6,7,6, 35,34,53,52,55,38,53,52,55,54,55,51,50,23,22,23, 35,38,39,38,35,34,21,22,23,22,59,1,21,35,34,7, 6,7,20,23,22,51,50,55,54,55,1,220,15,106,42,60, 214,102,102,119,39,56,9,148,45,15,6,76,7,99,21,23, 129,9,61,23,35,46,46,92,25,8,3,104,12,13,101,36, 11,2,136,109,27,10,146,95,30,29,96,111,26,8,1,78, 28,40,60,13,3,85,66,15,6,59,48,16,23,74,9,1, 45,14,17,0,0,1,0,38,255,62,1,184,2,206,0,36, 0,0,5,20,7,39,54,53,52,39,38,35,34,39,38,53, 52,55,54,55,35,53,33,21,6,7,6,21,20,23,22,23, 22,23,22,23,22,23,22,1,184,38,76,34,30,13,23,87, 92,77,135,47,58,224,1,100,129,79,72,46,43,52,14,18, 75,26,2,3,31,42,55,97,28,69,33,46,10,4,61,50, 113,192,146,51,37,72,60,73,121,111,117,74,40,34,10,2, 2,6,21,2,3,31,0,1,0,24,255,74,1,242,2,19, 0,30,0,0,5,39,17,52,39,38,35,34,21,17,35,17, 52,35,34,7,39,54,51,50,31,2,54,51,50,23,22,23, 22,21,1,242,88,10,25,73,138,88,22,6,10,14,30,31, 49,16,5,1,67,97,147,26,3,1,1,182,24,1,218,53, 27,58,170,254,228,1,158,37,3,72,11,55,31,15,100,124, 17,18,7,44,0,3,0,45,255,244,1,234,2,218,0,15, 0,22,0,31,0,0,1,50,19,22,21,16,7,6,35,34, 39,38,39,38,53,18,23,34,17,33,52,39,38,19,33,20, 23,22,51,50,55,54,1,12,201,19,2,100,49,73,139,50, 11,8,15,7,216,137,1,19,29,29,58,254,237,80,24,33, 98,26,14,2,218,254,206,31,33,254,244,70,34,128,30,38, 72,104,1,108,66,255,0,108,76,72,254,184,209,45,14,119, 65,0,0,1,0,56,255,248,1,14,2,8,0,16,0,0, 55,20,23,22,59,1,54,55,23,6,35,34,39,38,53,17, 51,144,19,7,19,7,16,28,30,46,44,107,15,2,88,136, 27,20,10,2,13,81,21,108,15,18,1,131,0,1,0,66, 0,0,1,240,2,6,0,11,0,0,33,35,3,7,21,35, 17,51,21,55,51,7,1,240,108,172,62,88,88,208,114,198, 1,10,60,206,2,6,210,210,192,0,0,1,0,30,255,246, 2,44,2,220,0,40,0,0,37,6,35,34,47,1,53,39, 38,39,6,7,6,7,35,19,38,39,38,39,38,35,34,15, 1,55,54,51,50,23,22,23,22,31,1,19,23,22,51,50, 55,2,44,48,33,50,18,13,88,23,11,25,91,18,12,96, 198,24,12,13,20,13,26,19,24,11,10,33,23,53,32,8, 10,32,32,9,152,14,9,19,15,19,14,24,48,29,1,236, 64,54,87,249,48,36,2,8,69,17,19,12,7,6,2,82, 12,30,7,12,39,89,25,254,102,28,19,11,0,1,0,78, 255,56,1,242,2,6,0,28,0,0,5,34,39,38,39,21, 35,17,51,21,20,23,22,23,22,51,50,55,54,55,54,61, 1,51,17,35,53,6,7,1,32,65,39,8,10,88,88,12, 19,61,13,15,35,33,33,8,17,86,80,39,58,12,42,9, 13,252,2,206,218,120,35,61,13,3,22,22,25,55,106,220, 253,250,62,61,10,0,0,1,0,14,0,0,1,232,2,6, 0,10,0,0,1,3,35,3,51,19,22,23,54,55,19,1, 232,196,82,196,92,115,17,12,30,4,114,2,6,253,250,2, 6,254,194,52,44,89,9,1,60,0,0,1,0,15,255,62, 1,185,2,206,0,59,0,0,5,20,7,39,54,55,54,53, 52,39,38,43,1,34,39,38,53,52,53,54,55,54,55,38, 39,38,53,52,55,54,55,35,53,33,21,35,34,7,6,21, 20,23,22,59,1,21,35,34,7,6,21,20,23,22,51,50, 23,22,23,20,1,185,39,74,32,2,1,19,18,57,19,144, 59,31,4,50,53,61,75,32,15,52,12,12,100,1,116,166, 50,34,22,91,24,49,82,110,96,53,25,77,38,47,74,31, 69,5,39,61,94,28,81,25,2,12,30,7,9,78,40,56, 7,7,85,47,47,9,11,63,30,36,70,46,10,6,70,70, 56,37,39,76,28,8,64,68,31,43,77,34,17,7,11,80, 5,0,0,2,0,34,255,243,2,6,2,18,0,14,0,30, 0,0,5,34,39,38,53,52,55,54,50,23,22,21,20,7, 6,39,50,55,54,53,52,39,38,35,34,7,6,21,20,23, 22,1,20,147,61,34,68,67,214,67,68,93,61,88,101,36, 15,73,33,46,101,36,15,42,40,12,117,65,90,135,68,67, 67,68,135,151,73,48,74,100,42,56,129,47,22,103,42,53, 98,49,51,0,0,1,0,53,255,252,2,105,2,8,0,25, 0,0,37,6,35,34,39,38,53,17,35,17,7,19,35,39, 33,21,35,17,20,23,22,51,50,55,54,55,2,105,48,26, 55,17,18,236,94,1,70,1,2,40,64,11,7,12,12,13, 3,2,14,18,29,29,60,1,80,254,62,2,1,196,70,70, 254,178,39,8,5,9,1,2,0,2,0,57,255,56,2,29, 2,20,0,20,0,36,0,0,1,20,7,6,7,6,7,6, 35,34,39,17,35,17,52,55,54,51,50,23,22,7,52,39, 38,35,34,7,6,21,20,23,22,51,50,55,54,2,29,23, 30,34,16,27,43,71,99,53,88,71,71,98,140,65,39,90, 44,44,66,67,41,44,43,43,66,65,45,44,1,14,98,46, 58,26,12,15,25,71,254,251,1,214,138,62,62,106,65,97, 96,50,50,50,47,101,100,49,49,48,53,0,0,1,0,22, 255,74,1,245,2,24,0,46,0,0,1,35,52,39,38,35, 34,7,6,21,20,23,22,23,22,23,22,23,22,21,20,7, 39,54,55,54,53,52,39,38,35,38,39,38,47,1,38,39, 38,53,52,55,54,55,50,23,22,1,245,91,83,25,32,87, 43,22,81,24,34,17,90,87,26,23,48,90,26,14,1,72, 5,8,90,48,20,27,8,78,20,5,34,76,146,120,62,41, 1,68,98,28,8,78,40,66,104,46,13,11,5,8,12,30, 25,48,44,110,32,52,56,2,6,27,4,1,4,24,11,19, 6,53,104,28,29,83,58,117,2,81,54,0,0,2,0,34, 255,243,2,78,2,18,0,18,0,34,0,0,5,34,39,38, 53,52,55,54,51,50,23,33,21,35,22,21,20,7,6,39, 50,55,54,53,52,39,38,35,34,7,6,21,20,23,22,1, 20,147,61,34,68,67,107,31,19,1,8,136,64,93,61,88, 101,36,15,73,33,46,101,36,15,42,40,12,117,65,90,135, 68,67,4,82,82,102,151,73,48,74,100,42,56,129,47,22, 103,42,53,98,49,51,0,1,0,42,255,252,1,238,2,6, 0,23,0,0,1,35,17,20,23,22,23,22,51,50,55,23, 6,35,34,39,38,39,38,53,17,35,53,33,1,238,200,11, 3,5,9,22,13,20,19,35,33,80,26,2,2,12,164,1, 196,1,194,254,214,47,13,3,3,6,5,79,10,46,5,5, 30,62,1,50,68,0,0,1,0,40,255,242,1,222,2,6, 0,29,0,0,37,20,7,6,7,6,35,34,39,38,39,38, 53,17,51,17,20,23,22,23,22,51,50,55,54,55,52,53, 17,51,1,222,32,13,47,35,89,95,35,47,13,32,88,20, 6,9,36,61,60,35,32,3,88,198,97,51,16,28,20,20, 28,16,49,99,1,64,254,226,98,29,10,6,27,27,22,91, 12,18,1,30,0,2,0,46,255,56,2,185,2,10,0,36, 0,47,0,0,55,20,23,22,59,1,17,51,50,23,22,21, 20,7,6,7,6,43,1,21,35,53,35,34,39,38,39,38, 53,52,55,54,55,23,6,7,6,5,52,39,38,43,1,17, 51,50,55,54,130,69,48,66,20,88,137,78,61,108,2,2, 55,77,32,88,22,142,73,20,12,18,98,29,33,42,94,20, 4,1,227,69,43,60,20,24,95,46,27,254,91,54,38,1, 195,93,73,107,143,77,1,2,36,190,190,100,28,34,52,46, 134,88,25,17,68,60,91,20,25,101,50,31,254,151,76,44, 0,1,0,14,255,44,2,61,2,26,0,32,0,0,5,6, 43,1,34,47,1,3,35,19,3,38,39,38,35,6,35,53, 55,50,31,2,19,51,3,23,22,23,22,51,50,55,2,61, 25,26,8,66,49,97,184,104,234,149,15,15,11,17,13,11, 56,58,33,7,131,153,96,195,131,6,14,7,25,14,20,200, 12,89,197,254,238,1,104,1,4,28,6,4,4,78,6,49, 11,244,1,28,254,154,251,14,12,10,6,0,0,1,0,42, 255,56,2,108,2,6,0,27,0,0,37,20,7,6,35,21, 35,53,34,39,38,53,17,51,17,20,23,22,51,17,51,17, 50,55,54,53,17,51,2,108,157,40,49,86,199,38,9,90, 68,33,55,86,113,30,13,90,214,169,37,10,198,198,145,32, 39,1,48,254,236,121,33,16,1,172,254,84,78,35,57,1, 20,0,0,1,0,36,255,247,2,192,2,14,0,55,0,0, 37,50,55,54,53,52,39,55,22,23,22,21,20,15,1,6, 35,34,39,6,35,34,39,38,53,52,55,54,55,54,55,23, 6,7,6,7,6,21,20,23,22,51,54,55,54,55,54,61, 1,51,21,20,23,22,23,22,1,254,90,17,3,108,80,51, 36,25,99,9,34,48,96,48,46,98,117,48,25,51,3,4, 25,29,80,69,26,1,2,10,72,17,20,41,14,6,10,28, 84,28,22,17,10,63,122,23,27,148,117,26,41,106,74,64, 166,60,5,19,90,90,114,59,77,99,101,7,7,48,23,26, 69,94,7,7,40,48,137,28,7,2,11,4,9,28,36,223, 223,36,28,20,3,2,255,255,255,223,255,248,1,14,2,190, 16,38,0,106,193,243,16,6,2,66,0,0,255,255,0,40, 255,242,1,222,2,190,16,38,0,106,96,243,16,6,2,78, 0,0,255,255,0,34,255,244,2,6,2,208,16,38,2,16, 64,0,16,6,2,72,0,0,255,255,0,40,255,242,1,222, 2,208,16,38,2,16,53,0,16,6,2,78,0,0,255,255, 0,36,255,247,2,192,2,208,16,39,2,16,0,158,0,0, 16,6,2,82,0,0,255,255,0,90,0,0,2,101,3,149, 16,39,0,67,0,216,0,177,16,6,0,40,0,0,0,3, 0,79,0,0,2,90,3,146,0,11,0,15,0,19,0,0, 19,21,33,21,33,17,33,21,33,21,33,21,1,21,35,53, 33,21,35,53,172,1,174,253,245,1,249,254,100,1,141,254, 246,104,1,10,104,1,76,250,82,2,217,82,233,82,2,70, 103,103,103,103,0,1,0,28,255,108,2,206,2,216,0,32, 0,0,33,20,7,6,7,6,43,1,7,53,51,54,55,53, 19,52,39,35,17,35,3,35,53,33,21,35,21,51,50,23, 22,29,1,2,204,38,12,18,35,63,1,81,99,52,5,1, 66,238,93,1,199,1,234,197,232,99,44,22,71,34,11,10, 21,1,66,10,56,10,1,65,53,4,254,140,2,136,80,80, 194,75,37,44,1,0,0,2,0,90,0,0,2,67,3,149, 0,5,0,9,0,0,51,35,17,33,21,33,19,51,7,35, 183,93,1,233,254,116,143,113,149,60,2,217,82,1,14,148, 0,1,0,48,255,233,2,165,2,229,0,36,0,0,19,22, 23,22,51,50,55,54,55,54,55,51,2,33,34,39,38,53, 52,55,54,51,50,23,35,38,39,38,39,34,7,6,7,6, 7,33,21,142,8,98,56,74,109,51,6,4,22,11,96,33, 254,245,141,82,106,102,82,149,238,43,95,15,38,54,90,126, 61,22,10,5,2,1,108,1,76,163,71,39,77,8,9,42, 71,254,223,85,109,185,183,111,91,238,75,35,44,2,112,39, 50,21,23,82,255,255,0,48,255,233,2,109,2,229,16,6, 0,54,0,0,255,255,0,100,0,0,0,194,2,217,16,6, 0,44,0,0,255,255,0,8,0,0,1,18,3,140,16,39, 0,106,255,234,0,193,16,6,0,44,0,0,255,255,0,17, 255,233,1,170,2,217,16,6,0,45,0,0,0,2,0,83, 0,0,3,254,2,217,0,24,0,35,0,0,33,3,35,20, 7,2,7,6,35,53,50,55,54,39,53,33,17,51,23,22, 23,20,7,6,35,55,52,39,38,43,1,21,51,50,55,54, 2,2,1,225,3,19,139,20,24,82,21,9,1,1,157,144, 62,187,22,56,57,102,122,71,26,34,191,191,65,32,34,2, 135,220,54,254,186,41,6,94,205,91,177,162,254,198,3,23, 181,88,59,61,207,87,28,11,251,35,36,0,0,2,0,83, 0,0,3,204,2,217,0,19,0,30,0,0,33,17,33,17, 35,17,51,17,33,17,51,17,51,23,22,23,20,7,6,35, 55,52,39,38,43,1,21,51,50,55,54,1,225,254,208,94, 93,1,49,93,127,62,187,22,56,57,102,122,71,26,34,174, 174,65,32,34,1,76,254,180,2,217,254,197,1,59,254,198, 3,23,181,88,59,61,207,87,28,11,251,35,36,0,0,1, 0,28,0,0,2,206,2,216,0,19,0,0,1,51,50,23, 22,21,17,35,17,52,39,35,17,35,3,35,53,33,21,35, 1,65,232,99,44,22,93,66,238,93,1,199,1,234,197,1, 198,75,37,44,254,214,1,59,53,4,254,140,2,136,80,80, 0,2,0,79,0,0,2,146,3,149,0,10,0,14,0,0, 51,35,17,51,17,1,51,9,1,35,1,19,51,7,35,172, 93,93,1,107,120,254,100,1,159,110,254,136,186,113,149,60, 2,217,254,197,1,59,254,158,254,137,1,68,2,81,148,0, 0,2,0,76,0,0,2,134,3,149,0,9,0,13,0,0, 19,51,17,1,51,17,35,17,1,35,1,23,35,39,76,88, 1,125,101,88,254,135,105,1,38,96,60,149,2,217,253,172, 2,84,253,39,2,79,253,177,3,149,148,148,0,2,0,26, 0,0,2,107,3,136,0,7,0,21,0,0,51,35,55,3, 51,27,1,51,37,51,22,51,50,55,54,53,51,6,35,34, 39,38,252,113,129,242,113,185,184,111,254,65,59,7,85,77, 13,1,59,11,141,86,42,20,244,1,229,254,133,1,123,175, 66,57,4,5,135,57,28,0,0,1,0,83,255,121,2,133, 2,217,0,11,0,0,33,21,35,53,35,17,51,17,33,17, 51,17,1,148,80,241,94,1,118,94,135,135,2,217,253,121, 2,135,253,39,255,255,0,17,0,0,2,141,2,217,16,6, 0,36,0,0,0,2,0,79,0,0,2,112,2,217,0,16, 0,27,0,0,37,20,7,6,7,6,35,33,17,33,21,33, 21,51,32,23,20,5,51,50,55,54,55,52,39,38,43,1, 2,111,47,5,4,57,102,254,183,1,233,254,116,180,1,10, 5,254,61,227,65,32,32,2,34,32,65,227,218,88,59,5, 5,61,2,217,82,212,207,5,141,35,38,62,63,38,35,0, 255,255,0,79,0,0,2,111,2,217,16,6,0,37,0,0, 0,1,0,79,0,0,2,56,2,217,0,5,0,0,51,35, 17,33,21,33,172,93,1,233,254,116,2,217,82,0,0,2, 0,34,255,121,3,10,2,217,0,5,0,21,0,0,37,33, 17,33,21,6,7,54,55,54,39,53,33,17,51,21,35,53, 33,21,35,53,1,6,1,75,254,250,6,199,85,19,8,1, 1,194,91,80,253,184,80,82,2,53,228,238,107,39,212,86, 158,160,253,113,209,135,135,209,0,1,0,79,0,0,2,90, 2,217,0,11,0,0,19,21,33,21,33,17,33,21,33,21, 33,21,172,1,174,253,245,1,249,254,100,1,141,1,76,250, 82,2,217,82,233,82,0,1,0,63,0,0,3,180,2,217, 0,17,0,0,9,1,35,9,1,51,19,17,51,17,19,51, 9,1,35,1,17,35,1,203,254,226,110,1,69,254,229,116, 238,93,238,116,254,229,1,69,118,254,234,93,1,68,254,188, 1,119,1,98,254,204,1,52,254,204,1,52,254,158,254,137, 1,68,254,188,0,1,0,48,255,233,2,109,2,229,0,57, 0,0,1,53,51,50,55,54,53,52,39,38,35,34,7,6, 21,35,54,55,54,51,50,23,22,23,22,21,20,7,22,23, 22,21,20,7,6,7,6,35,34,39,38,39,51,23,22,23, 22,51,50,55,54,55,54,53,52,39,38,35,1,1,88,73, 52,33,72,39,52,143,31,8,88,1,122,60,84,157,66,24, 8,4,105,115,14,1,58,11,11,73,132,169,76,42,1,88, 3,7,28,51,117,89,45,44,7,1,51,48,64,1,65,82, 60,40,37,73,32,18,98,23,27,145,54,27,94,33,41,22, 24,108,45,43,106,12,13,84,63,11,9,56,104,57,94,38, 41,33,61,31,31,56,7,7,49,42,39,0,0,1,0,79, 0,0,2,137,2,217,0,9,0,0,19,51,17,1,51,17, 35,17,1,35,79,88,1,125,101,88,254,135,105,2,217,253, 165,2,91,253,39,2,86,253,170,0,0,2,0,79,0,0, 2,137,3,156,0,9,0,23,0,0,19,51,17,1,51,17, 35,17,1,35,19,51,22,51,50,55,54,53,51,6,35,34, 39,38,79,88,1,125,101,88,254,135,105,134,59,8,84,77, 13,1,59,11,141,86,42,20,2,217,253,165,2,91,253,39, 2,86,253,170,3,156,66,57,4,5,135,57,28,0,0,1, 0,79,0,0,2,109,2,217,0,10,0,0,51,35,17,51, 17,1,51,9,1,35,1,172,93,93,1,49,111,254,167,1, 122,124,254,187,2,217,254,206,1,50,254,167,254,128,1,77, 0,1,0,33,255,246,2,82,2,217,0,16,0,0,1,33, 20,7,2,7,6,35,53,50,55,54,39,53,33,17,35,1, 244,254,250,3,19,144,19,20,83,20,9,1,1,194,94,2, 135,223,54,254,173,36,5,94,216,91,175,163,253,39,0,1, 0,79,0,0,2,253,2,217,0,12,0,0,33,35,3,17, 35,17,51,27,1,51,17,35,17,1,216,98,207,88,129,216, 212,129,88,2,99,253,157,2,217,253,133,2,123,253,39,2, 99,0,0,1,0,79,0,0,2,128,2,217,0,11,0,0, 1,33,17,35,17,51,17,33,17,51,17,35,2,34,254,139, 94,93,1,118,94,94,1,76,254,180,2,217,254,197,1,59, 253,39,255,255,0,38,255,233,2,230,2,229,16,6,0,50, 0,0,0,1,0,79,0,0,2,128,2,217,0,7,0,0, 1,33,17,35,17,33,17,35,2,34,254,139,94,2,49,94, 2,135,253,121,2,217,253,39,0,2,0,79,0,0,2,93, 2,217,0,12,0,24,0,0,19,17,35,17,33,50,23,22, 21,20,7,6,35,39,51,50,55,54,53,52,47,1,38,43, 1,172,93,1,45,161,47,17,63,58,83,229,194,102,30,10, 79,34,14,15,194,1,53,254,203,2,217,118,41,55,97,57, 52,82,74,24,30,90,28,8,2,0,255,255,0,48,255,233, 2,165,2,229,16,6,0,38,0,0,255,255,0,21,0,0, 2,81,2,217,16,6,0,55,0,0,0,1,0,26,0,0, 2,107,2,217,0,7,0,0,51,35,55,3,51,27,1,51, 252,113,129,242,113,185,184,111,244,1,229,254,133,1,123,0, 0,3,0,64,0,0,3,61,2,217,0,24,0,33,0,42, 0,0,1,23,22,23,22,21,16,5,6,35,21,35,53,34, 39,38,53,52,55,54,51,50,51,53,51,17,50,55,54,53, 52,39,38,35,3,17,34,7,6,21,20,23,22,1,238,71, 217,39,8,254,221,19,25,95,165,78,92,204,54,68,4,5, 95,126,63,46,144,43,48,95,126,63,46,144,43,2,124,3, 21,171,35,41,254,254,12,1,94,94,58,67,146,211,48,12, 93,253,215,65,47,77,140,38,11,254,134,1,122,65,47,77, 140,38,11,0,255,255,0,22,0,0,2,137,2,217,16,6, 0,59,0,0,0,1,0,79,255,121,2,195,2,217,0,11, 0,0,37,17,51,17,51,21,35,53,33,17,51,17,2,34, 94,67,80,253,220,94,82,2,135,253,113,209,135,2,217,253, 121,0,0,1,0,79,0,0,2,57,2,217,0,15,0,0, 1,35,34,39,38,53,17,51,17,22,23,51,17,51,17,35, 1,220,232,99,44,22,93,10,66,228,93,93,1,19,75,37, 45,1,41,254,197,53,4,1,116,253,39,0,0,1,0,79, 0,0,2,237,2,217,0,11,0,0,37,51,17,51,17,33, 17,51,17,51,17,51,1,205,194,94,253,98,94,194,94,82, 2,135,253,39,2,217,253,121,2,135,0,1,0,79,255,121, 3,48,2,217,0,15,0,0,41,1,17,51,17,51,17,51, 17,51,17,51,17,51,21,35,2,224,253,111,94,194,94,194, 94,67,80,2,217,253,121,2,135,253,121,2,135,253,113,209, 0,2,0,81,0,0,3,89,2,217,0,14,0,25,0,0, 33,17,35,53,33,17,51,50,23,22,21,20,7,6,35,39, 51,50,55,54,53,52,39,38,43,1,1,56,231,1,68,165, 250,32,4,84,61,85,221,212,81,41,24,65,35,46,212,2, 135,82,254,234,173,24,28,114,65,47,82,62,35,46,84,39, 21,0,0,3,0,79,0,0,3,25,2,217,0,12,0,23, 0,27,0,0,37,20,7,6,35,33,17,51,17,51,50,23, 22,5,51,50,55,54,53,52,39,38,43,1,1,17,35,17, 2,111,84,61,85,254,198,93,165,250,32,4,254,61,212,81, 41,24,65,35,46,212,2,109,94,226,114,65,47,2,217,254, 234,173,24,172,62,35,46,84,39,21,1,104,253,39,2,217, 0,2,0,79,0,0,2,112,2,217,0,12,0,23,0,0, 37,20,7,6,35,33,17,51,17,51,50,23,22,5,51,50, 55,54,53,52,39,38,43,1,2,111,84,61,85,254,198,93, 165,250,32,4,254,61,212,81,41,24,65,35,46,212,226,114, 65,47,2,217,254,234,173,24,172,62,35,46,84,39,21,0, 0,1,0,48,255,233,2,165,2,229,0,35,0,0,1,33, 53,33,38,39,38,35,34,15,1,6,7,35,54,51,50,23, 22,21,20,7,6,35,32,3,51,22,23,22,23,22,51,50, 55,54,2,72,254,145,1,108,17,102,47,60,91,50,3,38, 15,95,43,238,149,82,102,106,82,141,254,245,33,96,11,22, 41,102,13,14,129,64,39,1,76,82,159,59,27,43,3,35, 75,238,91,111,183,185,109,85,1,33,71,42,82,11,1,111, 66,0,0,2,0,83,255,233,3,190,2,229,0,26,0,43, 0,0,1,35,17,35,17,51,17,51,54,55,54,51,50,23, 22,21,20,7,6,7,6,7,6,35,34,39,38,1,34,7, 6,21,20,23,22,51,50,55,54,53,52,47,1,38,1,39, 118,94,93,121,21,127,76,104,187,87,59,82,20,24,79,88, 17,19,177,90,61,1,68,141,61,36,102,56,81,139,62,38, 109,32,44,1,76,254,180,2,217,254,197,193,84,50,144,98, 146,148,105,26,20,67,8,2,133,90,1,203,124,73,103,181, 77,42,120,72,104,193,74,18,19,0,0,2,0,32,0,0, 2,111,2,217,0,15,0,26,0,0,9,1,35,1,34,39, 38,39,52,55,54,51,33,17,35,25,1,35,34,7,6,21, 20,23,22,59,1,1,163,254,235,110,1,17,157,51,13,5, 56,57,102,1,73,93,227,65,32,34,34,32,65,227,1,58, 254,198,1,58,134,33,40,88,59,61,253,39,1,58,1,77, 35,36,55,54,36,35,255,255,0,42,255,233,2,23,2,27, 16,6,0,68,0,0,0,2,0,36,255,233,1,254,3,7, 0,32,0,48,0,0,19,54,51,50,23,22,21,20,7,6, 35,34,39,38,53,16,55,54,63,1,54,55,54,53,51,20, 7,6,15,1,6,7,6,23,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,117,44,111,152,57,29,102,56,79, 144,60,33,126,21,24,133,36,15,5,74,17,24,70,135,58, 32,12,151,93,38,19,78,31,41,90,39,21,82,30,1,213, 70,129,65,91,167,71,39,119,67,95,1,78,79,13,6,26, 9,30,10,10,60,25,33,17,29,14,71,27,37,92,48,64, 137,48,19,88,47,66,145,46,16,0,0,3,0,70,0,0, 1,212,2,12,0,16,0,31,0,43,0,0,37,20,7,6, 43,1,17,51,50,23,22,21,20,7,22,23,22,37,51,50, 55,54,55,54,53,52,39,38,39,38,43,1,17,51,50,55, 54,53,52,47,1,38,43,1,1,212,65,38,52,243,219,73, 39,40,69,83,11,2,254,198,98,51,25,24,3,2,22,3, 4,24,52,98,132,46,23,22,10,12,31,38,132,150,85,41, 24,2,12,36,37,59,81,34,32,68,13,143,18,19,15,7, 10,30,18,3,3,19,254,139,26,22,31,34,11,11,20,0, 0,1,0,70,0,0,1,124,2,12,0,5,0,0,19,33, 21,35,17,35,70,1,54,226,84,2,12,76,254,64,0,2, 0,30,255,136,2,60,2,12,0,14,0,20,0,0,55,54, 19,54,53,33,17,51,21,35,53,33,21,35,53,55,51,17, 35,7,6,87,75,6,1,1,83,64,70,254,110,70,173,221, 172,1,7,64,8,1,111,39,46,254,52,184,120,120,184,12, 1,116,142,155,255,255,0,40,255,233,2,1,2,27,16,6, 0,72,0,0,0,1,0,44,0,0,3,21,2,12,0,17, 0,0,1,35,21,39,35,23,1,51,55,21,51,53,23,51, 1,55,35,7,1,202,83,192,107,242,254,238,106,225,83,225, 106,254,238,242,107,192,2,12,201,201,250,254,238,226,226,226, 226,1,18,250,201,0,0,1,0,34,255,233,1,203,2,27, 0,48,0,0,55,53,51,50,55,54,53,52,39,38,35,34, 7,35,54,55,54,51,50,23,22,21,20,7,6,7,22,23, 20,7,6,35,34,39,38,53,51,22,23,22,51,50,55,54, 53,52,39,38,35,192,62,69,22,6,60,23,28,102,3,88, 1,111,34,44,122,53,26,57,4,4,83,3,90,52,74,194, 14,1,88,6,18,33,71,85,26,7,39,28,35,221,76,55, 15,16,53,19,7,84,119,32,10,73,37,50,71,36,3,2, 44,80,96,44,26,162,8,9,47,20,35,50,15,17,37,28, 20,0,0,1,0,70,0,0,1,241,2,12,0,9,0,0, 19,51,17,19,51,17,35,17,3,35,70,84,235,108,83,235, 109,2,12,254,99,1,157,253,244,1,157,254,99,0,0,2, 0,70,0,0,1,241,2,187,0,9,0,23,0,0,19,51, 17,19,51,17,35,17,3,35,19,51,22,51,50,55,54,53, 51,6,35,34,39,38,70,84,235,108,83,235,109,63,59,8, 84,77,13,1,59,11,141,86,42,20,2,12,254,99,1,157, 253,244,1,157,254,99,2,187,66,57,4,5,135,57,28,0, 0,1,0,70,0,0,1,228,2,12,0,10,0,0,19,21, 55,51,7,1,35,39,21,35,17,153,212,96,251,1,18,106, 225,83,2,12,212,212,250,254,238,226,226,2,12,0,0,1, 0,70,255,246,1,231,2,12,0,12,0,0,19,33,17,35, 17,35,7,2,35,53,50,55,54,148,1,83,84,172,2,14, 145,60,13,5,2,12,253,244,1,192,145,254,199,80,186,73, 0,1,0,70,0,0,2,36,2,12,0,12,0,0,19,51, 27,1,51,17,35,17,3,35,3,17,35,70,104,135,135,104, 84,130,50,130,84,2,12,254,186,1,70,253,244,1,107,254, 189,1,67,254,149,0,0,1,0,70,0,0,1,232,2,12, 0,11,0,0,19,51,21,51,53,51,17,35,53,35,21,35, 70,84,250,84,84,250,84,2,12,215,215,253,244,233,233,0, 255,255,0,36,255,233,1,254,2,27,16,6,0,82,0,0, 0,1,0,70,0,0,1,231,2,12,0,7,0,0,19,33, 17,35,17,35,17,35,70,1,161,84,249,84,2,12,253,244, 1,192,254,64,0,2,0,70,255,38,2,27,2,27,0,18, 0,34,0,0,23,17,51,21,54,51,50,23,22,21,20,7, 6,7,6,35,34,39,17,19,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,70,77,59,108,127,60,38,89,39, 52,21,23,97,64,146,83,39,24,69,33,44,84,42,26,71, 35,218,2,230,79,94,111,71,104,154,75,33,10,4,78,254, 239,2,167,84,50,69,125,52,26,81,50,69,127,53,26,0, 255,255,0,31,255,233,1,221,2,27,16,6,0,70,0,0, 0,1,0,60,0,0,1,176,2,12,0,7,0,0,19,33, 21,35,17,35,17,35,60,1,116,144,84,144,2,12,76,254, 64,1,192,0,255,255,0,20,255,38,1,222,2,12,16,6, 0,92,0,0,0,3,0,61,255,38,3,82,2,162,0,34, 0,50,0,66,0,0,1,54,51,50,23,22,21,20,15,1, 6,35,34,39,38,39,17,35,17,6,7,6,35,34,39,38, 53,52,55,54,51,50,23,53,51,23,34,7,6,21,20,23, 22,51,50,55,54,53,52,47,1,37,34,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,1,239,45,100,141,48,21, 96,30,37,46,69,46,14,17,83,42,49,24,32,152,39,13, 104,44,60,94,49,83,131,95,27,9,84,21,26,94,31,12, 87,28,254,145,102,24,7,97,17,19,94,28,9,94,17,1, 189,94,141,61,84,174,68,17,17,43,14,21,254,239,1,22, 62,14,7,160,51,64,194,65,28,94,229,213,116,38,49,158, 36,9,104,42,54,159,37,8,2,126,34,43,170,28,5,112, 39,49,171,30,5,0,255,255,0,17,0,0,1,217,2,12, 16,6,0,91,0,0,0,1,0,70,255,136,2,36,2,12, 0,11,0,0,51,17,51,17,51,17,51,17,51,21,35,53, 70,84,249,84,61,70,2,12,254,64,1,192,254,52,184,120, 0,1,0,70,0,0,1,194,2,12,0,17,0,0,19,51, 21,20,23,22,59,1,53,51,17,35,53,35,34,39,38,53, 70,84,43,7,8,154,84,84,151,78,42,25,2,12,197,41, 8,1,247,253,244,201,50,31,42,0,0,1,0,70,0,0, 2,110,2,12,0,11,0,0,37,51,17,51,17,33,17,51, 17,51,17,51,1,132,150,84,253,216,84,150,84,76,1,192, 253,244,2,12,254,64,1,192,0,1,0,70,255,136,2,170, 2,12,0,15,0,0,41,1,17,51,17,51,17,51,17,51, 17,51,17,51,21,35,2,100,253,226,84,150,84,150,84,60, 70,2,12,254,64,1,192,254,64,1,192,254,52,184,0,2, 0,57,0,0,2,141,2,12,0,15,0,26,0,0,51,17, 35,53,33,21,51,23,22,23,20,21,20,7,6,35,39,51, 50,55,54,53,52,39,38,43,1,240,183,1,11,113,56,154, 6,69,42,56,162,124,105,8,1,83,14,17,124,1,192,76, 183,3,20,140,5,6,91,47,29,76,71,8,9,88,11,2, 0,3,0,70,0,0,2,108,2,12,0,13,0,24,0,28, 0,0,19,21,51,23,22,23,20,21,20,7,6,43,1,17, 19,51,50,55,54,53,52,39,38,43,1,1,17,35,17,154, 113,56,154,6,69,42,56,246,84,124,105,8,1,83,14,17, 124,1,210,83,2,12,183,3,20,140,5,6,91,47,29,2, 12,254,64,71,8,9,88,11,2,1,3,253,244,2,12,0, 0,2,0,70,0,0,1,227,2,12,0,13,0,24,0,0, 19,21,51,23,22,23,20,21,20,7,6,43,1,17,19,51, 50,55,54,53,52,39,38,43,1,154,113,56,154,6,69,42, 56,246,84,124,105,8,1,83,14,17,124,2,12,183,3,20, 140,5,6,91,47,29,2,12,254,64,71,8,9,88,11,2, 0,1,0,31,255,233,1,221,2,27,0,37,0,0,55,53, 51,38,39,38,35,34,7,6,7,35,54,55,54,55,54,51, 50,23,22,21,20,15,1,6,35,34,39,38,39,51,22,51, 50,55,54,55,163,224,17,84,19,22,94,25,3,2,84,6, 29,52,102,9,9,124,64,45,95,30,47,60,133,54,23,4, 84,21,107,96,35,14,2,232,77,121,26,6,89,12,13,70, 43,71,6,1,103,74,109,159,73,19,25,103,43,57,126,96, 36,46,0,2,0,70,255,233,2,209,2,27,0,22,0,39, 0,0,19,52,55,54,51,50,23,22,21,20,7,6,35,34, 39,38,53,35,21,35,17,51,21,37,34,7,6,21,20,23, 22,51,50,55,54,53,52,47,1,38,250,36,63,134,152,57, 29,102,56,79,154,57,25,94,84,84,1,74,93,38,19,78, 31,41,90,39,21,82,29,18,1,53,58,62,110,129,65,91, 167,71,39,135,58,63,233,2,12,215,153,92,48,64,137,48, 19,88,47,66,145,46,11,5,0,2,0,14,0,0,1,217, 2,12,0,15,0,28,0,0,55,38,39,38,53,52,55,54, 59,1,17,35,53,35,7,35,1,35,34,7,6,21,20,23, 22,23,22,59,1,219,110,30,9,41,40,74,248,84,69,203, 103,1,119,137,46,23,22,10,4,8,31,38,137,221,9,86, 26,33,62,44,43,253,244,218,218,1,193,26,22,31,34,11, 6,5,20,0,255,255,0,40,255,233,2,1,2,228,16,38, 0,67,116,0,16,6,0,72,0,0,255,255,0,40,255,233, 2,1,2,204,16,38,0,106,123,1,16,6,0,72,0,0, 0,1,0,18,255,92,2,5,2,217,0,42,0,0,1,34, 7,6,29,1,19,35,17,35,53,51,53,51,21,51,21,35, 7,54,55,54,51,50,23,22,29,1,3,6,7,6,7,39, 53,54,55,54,55,53,52,39,38,1,70,88,36,18,1,83, 84,84,83,171,171,1,53,67,19,29,111,39,15,1,7,107, 68,59,17,47,52,73,4,34,32,1,195,82,41,53,1,254, 238,2,84,64,69,69,64,159,69,14,4,74,29,39,1,254, 237,131,83,54,1,1,40,2,48,69,99,252,55,24,24,0, 0,2,0,70,0,0,1,109,2,200,0,5,0,9,0,0, 19,33,21,35,17,35,19,51,7,35,70,1,39,211,84,139, 113,149,60,2,12,76,254,64,2,200,148,0,0,1,0,31, 255,233,1,221,2,27,0,35,0,0,37,35,22,23,22,51, 50,55,51,6,7,6,35,34,39,38,53,52,55,54,51,50, 23,22,23,22,23,35,38,47,1,34,7,6,7,51,1,88, 226,7,82,26,32,107,21,84,11,104,43,56,129,62,41,92, 59,82,106,58,4,4,29,6,84,13,84,27,94,35,9,4, 223,232,129,37,12,126,137,46,20,105,70,101,160,77,49,68, 5,5,43,70,97,15,2,99,25,29,255,255,0,34,255,233, 1,203,2,27,16,6,0,86,0,0,255,255,0,66,0,0, 0,150,2,217,16,6,0,76,0,0,255,255,0,3,0,0, 1,13,2,196,16,38,0,106,229,249,16,6,0,243,0,0, 255,255,255,238,255,38,0,153,2,217,16,6,0,77,0,0, 0,2,0,70,0,0,3,48,2,12,0,31,0,45,0,0, 1,21,51,50,23,22,23,22,23,22,29,1,20,7,6,7, 6,43,1,17,35,7,6,7,6,35,53,50,55,54,61,1, 1,51,50,55,54,63,1,52,47,2,38,43,1,1,231,113, 142,45,16,7,2,2,2,54,7,8,43,55,246,172,3,5, 14,37,102,60,13,5,1,83,124,85,20,6,2,1,41,34, 8,18,13,124,2,12,214,55,20,29,10,11,18,11,1,72, 43,5,6,29,1,192,140,102,59,147,80,172,80,191,1,254, 64,34,10,15,17,55,16,8,1,2,0,2,0,70,0,0, 3,49,2,12,0,27,0,41,0,0,1,51,50,23,22,23, 22,23,22,29,1,20,7,6,7,6,43,1,53,35,21,35, 17,51,21,51,53,51,17,51,50,55,54,63,1,52,47,2, 38,43,1,1,232,113,142,45,16,7,2,2,2,54,7,8, 43,55,246,250,84,84,250,84,124,85,20,6,2,1,41,34, 8,18,13,124,1,54,55,20,29,10,11,18,11,1,72,43, 5,6,29,233,233,2,12,215,215,254,64,34,10,15,17,55, 16,8,1,2,0,1,0,18,0,0,2,5,2,217,0,33, 0,0,1,34,7,6,29,1,19,35,17,35,53,51,53,51, 21,51,21,35,7,54,55,54,51,50,23,22,29,1,3,35, 17,52,39,38,1,70,88,36,18,1,83,84,84,83,171,171, 1,53,67,19,29,111,39,15,1,82,34,32,1,195,82,41, 53,1,254,238,2,84,64,69,69,64,159,69,14,4,74,29, 39,1,254,131,1,92,55,24,24,0,0,2,0,58,0,0, 1,246,2,200,0,10,0,14,0,0,19,21,55,51,9,1, 35,37,21,35,17,55,51,7,35,141,222,107,254,240,1,48, 103,254,254,83,197,113,149,60,2,12,222,222,254,252,254,248, 216,216,2,12,188,148,0,2,0,70,0,0,1,231,2,200, 0,9,0,13,0,0,19,51,17,19,51,17,35,17,3,35, 19,23,35,39,70,84,235,98,83,235,99,217,96,60,149,2, 12,254,99,1,157,253,244,1,157,254,99,2,200,148,148,0, 255,255,0,20,255,38,1,222,2,187,16,38,1,243,83,223, 16,6,0,92,0,0,0,1,0,70,255,136,1,232,2,12, 0,11,0,0,33,21,35,53,35,17,51,17,51,17,51,17, 1,58,70,174,84,250,84,120,120,2,12,254,64,1,192,253, 244,0,0,2,0,79,0,0,2,111,2,217,0,11,0,22, 0,0,37,20,7,6,35,33,17,51,17,51,23,22,7,52, 39,38,43,1,21,51,50,55,54,2,111,56,57,102,254,183, 93,180,62,187,71,71,26,34,227,227,65,32,34,208,88,59, 61,2,217,254,198,3,23,182,87,28,11,251,35,36,0,2, 0,70,0,0,1,232,2,12,0,13,0,25,0,0,19,21, 50,23,22,23,22,21,20,7,6,35,33,17,19,51,50,55, 54,53,52,47,1,38,43,1,154,144,31,120,29,10,41,41, 73,254,249,84,152,46,23,22,12,10,31,38,152,2,12,217, 3,13,76,28,37,62,44,44,2,12,254,64,26,22,23,42, 14,8,20,0,255,255,0,91,0,0,2,105,2,217,16,6, 0,51,0,0,255,255,0,54,255,38,2,11,2,27,16,6, 0,83,0,0,0,1,0,90,0,0,2,67,3,57,0,7, 0,0,51,35,17,33,53,51,21,33,183,93,1,140,93,254, 116,2,217,96,178,0,0,1,0,70,0,0,1,109,2,117, 0,7,0,0,19,51,53,51,21,35,17,35,70,211,84,211, 84,2,12,105,181,254,64,0,0,1,0,90,0,0,2,67, 2,217,0,5,0,0,51,35,17,33,21,33,183,93,1,233, 254,116,2,217,82,0,0,1,0,70,0,0,1,109,2,12, 0,5,0,0,19,33,21,35,17,35,70,1,39,211,84,2, 12,76,254,64,0,1,0,90,0,0,2,67,2,217,0,5, 0,0,51,35,17,33,21,33,183,93,1,233,254,116,2,217, 82,0,0,1,0,70,0,0,1,109,2,12,0,5,0,0, 19,33,21,35,17,35,70,1,39,211,84,2,12,76,254,64, 0,1,0,63,0,0,3,180,2,217,0,17,0,0,9,1, 35,9,1,51,19,17,51,17,19,51,9,1,35,1,17,35, 1,203,254,226,110,1,69,254,225,120,238,93,238,120,254,225, 1,69,110,254,226,93,1,68,254,188,1,119,1,98,254,204, 1,52,254,204,1,52,254,158,254,137,1,68,254,188,0,1, 0,14,0,0,3,51,2,12,0,17,0,0,37,5,35,9, 1,51,23,53,51,21,55,51,9,1,35,37,21,35,1,119, 254,254,103,1,48,254,240,107,222,83,222,107,254,240,1,48, 103,254,254,83,216,216,1,8,1,4,222,222,222,222,254,252, 254,248,216,216,0,1,0,48,255,233,2,109,2,229,0,57, 0,0,1,53,51,50,55,54,53,52,39,38,35,34,7,6, 21,35,54,55,54,51,50,23,22,23,22,21,20,7,22,23, 22,21,20,7,6,7,6,35,34,39,38,39,51,23,22,23, 22,51,50,55,54,55,54,53,52,39,38,35,1,1,88,73, 52,33,72,39,52,143,31,8,88,1,122,60,84,157,66,24, 8,4,105,115,14,1,58,11,11,73,132,169,76,42,1,88, 3,7,28,51,117,89,45,44,7,1,51,48,64,1,65,82, 60,40,37,73,32,18,98,23,27,145,54,27,94,33,41,22, 24,108,45,43,106,12,13,84,63,11,9,56,104,57,94,38, 41,33,61,31,31,56,7,7,49,42,39,0,0,1,0,34, 255,233,1,203,2,27,0,48,0,0,55,53,51,50,55,54, 53,52,39,38,35,34,7,35,54,55,54,51,50,23,22,21, 20,7,6,7,22,23,20,7,6,35,34,39,38,53,51,22, 23,22,51,50,55,54,53,52,39,38,35,192,62,69,22,6, 60,23,28,102,3,88,1,111,34,44,122,53,26,57,4,4, 83,3,90,52,74,194,14,1,88,6,18,33,71,85,26,7, 39,28,35,221,76,55,15,16,53,19,7,84,119,32,10,73, 37,50,71,36,3,2,44,80,96,44,26,162,8,9,47,20, 35,50,15,17,37,28,20,0,0,1,0,79,0,0,2,146, 2,217,0,10,0,0,51,35,17,51,17,1,51,9,1,35, 1,172,93,93,1,107,120,254,100,1,159,110,254,136,2,217, 254,197,1,59,254,158,254,137,1,68,0,1,0,58,0,0, 1,246,2,12,0,10,0,0,19,21,55,51,9,1,35,37, 21,35,17,141,222,107,254,240,1,48,103,254,254,83,2,12, 222,222,254,252,254,248,216,216,2,12,0,1,0,79,0,0, 2,146,2,217,0,10,0,0,51,35,17,51,17,1,51,9, 1,35,1,172,93,93,1,107,120,254,100,1,159,110,254,136, 2,217,254,197,1,59,254,158,254,137,1,68,0,1,0,58, 0,0,1,246,2,12,0,10,0,0,19,21,55,51,9,1, 35,37,21,35,17,141,222,107,254,240,1,48,103,254,254,83, 2,12,222,222,254,252,254,248,216,216,2,12,0,1,0,79, 0,0,2,146,2,217,0,10,0,0,51,35,17,51,17,1, 51,9,1,35,1,172,93,93,1,107,120,254,100,1,159,110, 254,136,2,217,254,197,1,59,254,158,254,137,1,68,0,1, 0,58,0,0,1,246,2,12,0,10,0,0,19,21,55,51, 9,1,35,37,21,35,17,141,222,107,254,240,1,48,103,254, 254,83,2,12,222,222,254,252,254,248,216,216,2,12,0,1, 0,79,0,0,2,146,2,217,0,10,0,0,51,35,17,51, 17,1,51,9,1,35,1,172,93,93,1,107,120,254,100,1, 159,110,254,136,2,217,254,197,1,59,254,158,254,137,1,68, 0,1,0,58,0,0,1,246,2,12,0,10,0,0,19,21, 55,51,9,1,35,37,21,35,17,141,222,107,254,240,1,48, 103,254,254,83,2,12,222,222,254,252,254,248,216,216,2,12, 0,1,0,83,0,0,2,132,2,217,0,11,0,0,1,33, 17,35,17,51,17,33,17,51,17,35,2,38,254,139,94,93, 1,118,94,94,1,76,254,180,2,217,254,197,1,59,253,39, 0,1,0,70,0,0,1,232,2,12,0,11,0,0,19,51, 21,51,53,51,17,35,53,35,21,35,70,84,250,84,84,250, 84,2,12,215,215,253,244,233,233,0,0,1,0,83,0,0, 4,4,2,217,0,13,0,0,33,35,17,33,17,35,17,51, 17,33,17,33,21,33,2,132,94,254,139,94,93,1,118,1, 222,254,128,1,76,254,180,2,217,254,197,1,59,82,0,1, 0,70,0,0,2,187,2,12,0,13,0,0,33,35,53,35, 21,35,17,51,21,51,53,33,21,35,1,232,84,250,84,84, 250,1,39,211,233,233,2,12,215,215,76,0,0,1,0,83, 0,0,2,132,2,217,0,7,0,0,1,33,17,35,17,33, 17,35,2,38,254,139,94,2,49,94,2,135,253,121,2,217, 253,39,0,1,0,70,0,0,1,231,2,12,0,7,0,0, 19,33,17,35,17,35,17,35,70,1,161,84,249,84,2,12, 253,244,1,192,254,64,255,255,0,48,255,233,2,165,2,229, 16,6,0,38,0,0,255,255,0,31,255,233,1,221,2,27, 16,6,0,70,0,0,255,255,0,48,255,233,2,165,2,229, 16,6,0,38,0,0,255,255,0,31,255,233,1,221,2,27, 16,6,0,70,0,0,255,255,0,21,0,0,2,81,2,217, 16,6,0,55,0,0,0,1,0,60,0,0,1,176,2,12, 0,7,0,0,19,33,21,35,17,35,17,35,60,1,116,144, 84,144,2,12,76,254,64,1,192,0,255,255,0,13,0,0, 2,149,2,217,16,6,0,60,0,0,0,1,0,10,0,0, 1,230,2,12,0,6,0,0,33,35,3,51,27,1,51,1, 29,91,184,94,140,148,94,2,12,254,87,1,169,0,255,255, 0,13,0,0,2,149,2,217,16,6,0,60,0,0,0,1, 0,10,0,0,1,230,2,12,0,6,0,0,33,35,3,51, 27,1,51,1,29,91,184,94,140,148,94,2,12,254,87,1, 169,0,255,255,0,22,0,0,2,137,2,217,16,6,0,59, 0,0,255,255,0,17,0,0,1,217,2,12,16,6,0,91, 0,0,0,1,0,83,255,121,2,224,2,217,0,11,0,0, 37,17,51,17,51,21,35,53,33,17,51,17,2,38,94,92, 80,253,195,94,82,2,135,253,113,209,135,2,217,253,121,0, 0,1,0,70,255,136,2,56,2,12,0,11,0,0,51,17, 51,17,51,17,51,17,51,21,35,53,70,84,249,84,81,70, 2,12,254,64,1,192,254,52,184,120,0,1,0,83,0,0, 2,42,2,217,0,13,0,0,1,33,34,39,38,53,17,51, 17,33,17,51,17,35,1,205,254,227,78,13,2,93,1,29, 93,93,1,46,61,9,11,1,90,254,167,1,89,253,39,0, 0,1,0,69,0,0,1,176,2,12,0,13,0,0,19,51, 21,51,53,51,17,35,53,35,34,39,38,53,69,84,195,84, 84,195,64,14,6,2,12,225,225,253,244,223,33,15,25,0, 0,1,0,83,0,0,2,42,2,217,0,13,0,0,1,33, 34,39,38,53,17,51,17,33,17,51,17,35,1,205,254,227, 78,13,2,93,1,29,93,93,1,46,61,9,11,1,90,254, 167,1,89,253,39,0,0,1,0,69,0,0,1,176,2,12, 0,13,0,0,19,51,21,51,53,51,17,35,53,35,34,39, 38,53,69,84,195,84,84,195,64,14,6,2,12,225,225,253, 244,223,33,15,25,0,0,1,0,83,0,0,2,42,2,217, 0,13,0,0,19,33,50,23,22,21,17,35,17,33,17,35, 17,51,176,1,29,78,13,2,93,254,227,93,93,1,171,61, 9,11,254,166,1,89,254,167,2,217,0,1,0,69,0,0, 1,176,2,12,0,13,0,0,33,35,53,35,21,35,17,51, 21,51,50,23,22,21,1,176,84,195,84,84,195,64,14,6, 225,225,2,12,223,33,15,25,255,255,0,38,255,233,2,230, 2,229,16,15,1,78,3,12,2,206,192,0,255,255,0,40, 255,233,2,1,2,27,16,6,0,72,0,0,255,255,0,39, 255,233,2,154,2,143,16,70,0,72,243,5,84,179,77,24, 255,255,0,40,255,233,2,1,2,27,16,6,0,72,0,0, 255,255,0,100,0,0,0,194,2,217,16,6,0,44,0,0, 255,255,0,63,0,0,3,180,3,136,16,39,1,243,1,84, 0,172,16,6,2,110,0,0,255,255,0,44,0,0,3,21, 2,187,16,39,1,243,0,251,255,223,16,6,2,142,0,0, 0,1,0,79,0,0,2,146,2,217,0,10,0,0,51,35, 17,51,17,1,51,9,1,35,1,172,93,93,1,107,120,254, 100,1,159,110,254,136,2,217,254,197,1,59,254,158,254,137, 1,68,0,1,0,58,0,0,1,246,2,12,0,10,0,0, 19,21,55,51,9,1,35,37,21,35,17,141,222,107,254,240, 1,48,103,254,254,83,2,12,222,222,254,252,254,248,216,216, 2,12,0,1,0,83,0,0,2,132,2,217,0,11,0,0, 1,33,17,35,17,51,17,33,17,51,17,35,2,38,254,139, 94,93,1,118,94,94,1,76,254,180,2,217,254,197,1,59, 253,39,0,1,0,70,0,0,1,232,2,12,0,11,0,0, 19,51,21,51,53,51,17,35,53,35,21,35,70,84,250,84, 84,250,84,2,12,215,215,253,244,233,233,0,0,1,0,83, 0,0,2,42,2,217,0,13,0,0,1,33,34,39,38,53, 17,51,17,33,17,51,17,35,1,205,254,227,78,13,2,93, 1,29,93,93,1,46,61,9,11,1,90,254,167,1,89,253, 39,0,0,1,0,69,0,0,1,176,2,12,0,13,0,0, 19,51,21,51,53,51,17,35,53,35,34,39,38,53,69,84, 195,84,84,195,64,14,6,2,12,225,225,253,244,223,33,15, 25,0,255,255,0,17,0,0,2,141,3,136,16,39,1,243, 0,170,0,172,16,6,0,36,0,0,255,255,0,42,255,233, 2,23,2,187,16,38,1,243,103,223,16,6,0,68,0,0, 255,255,0,17,0,0,2,141,3,104,16,39,0,106,0,172, 0,157,16,6,0,36,0,0,255,255,0,42,255,233,2,23, 2,155,16,38,0,106,106,208,16,6,0,68,0,0,255,255, 0,11,0,0,3,182,2,217,16,6,0,136,0,0,255,255, 0,34,255,233,3,77,2,27,16,6,0,168,0,0,255,255, 0,79,0,0,2,90,3,136,16,39,1,243,0,177,0,172, 16,6,2,109,0,0,255,255,0,40,255,233,2,1,2,187, 16,39,1,243,0,156,255,223,16,6,0,72,0,0,255,255, 0,38,255,233,2,230,2,229,16,6,1,78,0,0,255,255, 0,40,255,233,2,1,2,27,16,15,0,72,2,41,2,4, 192,0,255,255,0,38,255,233,2,230,3,153,16,39,0,106, 0,225,0,206,16,6,1,78,0,0,255,255,0,40,255,233, 2,1,2,155,16,38,0,106,118,208,16,15,0,72,2,41, 2,4,192,0,255,255,0,63,0,0,3,180,3,104,16,39, 0,106,1,86,0,157,16,6,2,110,0,0,255,255,0,44, 0,0,3,21,2,155,16,39,0,106,0,254,255,208,16,6, 2,142,0,0,255,255,0,48,255,233,2,109,3,104,16,39, 0,106,0,168,0,157,16,6,2,111,0,0,255,255,0,34, 255,233,1,203,2,155,16,38,0,106,80,208,16,6,2,143, 0,0,0,1,0,48,255,233,2,109,2,229,0,57,0,0, 1,53,51,50,55,54,53,52,39,38,35,34,7,6,21,35, 54,55,54,51,50,23,22,23,22,21,20,7,22,23,22,21, 20,7,6,7,6,35,34,39,38,39,51,23,22,23,22,51, 50,55,54,55,54,53,52,39,38,35,1,1,88,73,52,33, 72,39,52,143,31,8,88,1,122,60,84,157,66,24,8,4, 105,115,14,1,58,11,11,73,132,169,76,42,1,88,3,7, 28,51,117,89,45,44,7,1,51,48,64,1,65,82,60,40, 37,73,32,18,98,23,27,145,54,27,94,33,41,22,24,108, 45,43,106,12,13,84,63,11,9,56,104,57,94,38,41,33, 61,31,31,56,7,7,49,42,39,0,0,1,0,34,255,233, 1,203,2,27,0,48,0,0,55,53,51,50,55,54,53,52, 39,38,35,34,7,35,54,55,54,51,50,23,22,21,20,7, 6,7,22,23,20,7,6,35,34,39,38,53,51,22,23,22, 51,50,55,54,53,52,39,38,35,192,62,69,22,6,60,23, 28,102,3,88,1,111,34,44,122,53,26,57,4,4,83,3, 90,52,74,194,14,1,88,6,18,33,71,85,26,7,39,28, 35,221,76,55,15,16,53,19,7,84,119,32,10,73,37,50, 71,36,3,2,44,80,96,44,26,162,8,9,47,20,35,50, 15,17,37,28,20,0,255,255,0,79,0,0,2,137,3,71, 16,39,0,113,0,196,0,138,16,6,2,112,0,0,255,255, 0,70,0,0,1,241,2,122,16,38,0,113,114,189,16,6, 2,144,0,0,255,255,0,79,0,0,2,137,3,104,16,39, 0,106,0,198,0,157,16,6,2,112,0,0,255,255,0,70, 0,0,1,241,2,155,16,38,0,106,116,208,16,6,2,144, 0,0,255,255,0,38,255,233,2,230,3,104,16,39,0,106, 0,227,0,157,16,6,0,50,0,0,255,255,0,36,255,233, 1,254,2,155,16,38,0,106,110,208,16,6,0,82,0,0, 255,255,0,38,255,233,2,230,2,229,16,6,0,50,0,0, 255,255,0,36,255,233,1,254,2,27,16,6,0,82,0,0, 255,255,0,38,255,233,2,230,3,104,16,39,0,106,0,227, 0,157,16,6,0,50,0,0,255,255,0,36,255,233,1,254, 2,155,16,38,0,106,110,208,16,6,0,82,0,0,255,255, 0,48,255,233,2,165,3,104,16,39,0,106,0,254,0,157, 16,6,2,133,0,0,255,255,0,31,255,233,1,221,2,155, 16,38,0,106,49,208,16,6,2,165,0,0,255,255,0,26, 0,0,2,107,3,71,16,39,0,113,0,158,0,138,16,6, 2,123,0,0,255,255,0,20,255,38,1,222,2,122,16,38, 0,113,84,189,16,6,0,92,0,0,255,255,0,26,0,0, 2,107,3,104,16,39,0,106,0,160,0,157,16,6,2,123, 0,0,255,255,0,20,255,38,1,222,2,155,16,38,0,106, 86,208,16,6,0,92,0,0,255,255,0,26,0,0,2,107, 3,151,16,39,1,248,0,166,0,179,16,6,2,123,0,0, 255,255,0,20,255,38,1,222,2,202,16,38,1,248,92,230, 16,6,0,92,0,0,255,255,0,79,0,0,2,57,3,104, 16,39,0,106,0,156,0,157,16,6,2,127,0,0,255,255, 0,70,0,0,1,194,2,155,16,38,0,106,88,208,16,6, 2,159,0,0,255,255,0,79,0,0,3,25,3,104,16,39, 0,106,1,22,0,157,16,6,2,131,0,0,255,255,0,70, 0,0,2,108,2,155,16,39,0,106,0,202,255,208,16,6, 2,163,0,0,0,1,0,79,255,215,2,217,2,204,0,28, 0,0,37,6,7,6,35,34,39,38,39,38,53,17,51,17, 20,23,22,23,22,23,50,55,54,53,17,51,17,23,7,2, 67,28,69,60,60,185,61,22,9,6,94,28,17,33,43,60, 102,45,46,95,87,59,60,31,22,19,116,40,57,45,56,1, 158,254,99,117,44,26,18,23,2,47,46,137,1,157,253,172, 93,68,0,1,0,79,255,254,2,130,2,214,0,32,0,0, 1,35,53,52,39,38,39,34,15,1,6,21,23,33,21,33, 7,35,17,52,55,54,55,54,51,50,23,22,23,22,23,22, 21,2,130,95,45,44,104,118,41,5,18,2,1,209,254,47, 1,94,57,24,37,64,101,104,63,63,25,3,12,10,1,74, 81,135,47,46,2,80,12,46,132,128,93,152,1,158,159,69, 30,21,35,39,40,64,8,47,55,61,0,2,0,83,255,255, 2,231,2,214,0,25,0,50,0,0,37,35,21,35,53,35, 34,39,38,47,1,52,55,54,55,54,51,50,23,22,29,2, 22,21,51,37,20,23,22,23,22,23,22,51,55,53,23,53, 52,39,53,52,39,38,39,34,7,6,7,6,2,231,107,95, 215,70,58,76,30,9,46,24,42,65,103,196,60,13,1,110, 253,198,9,5,10,30,89,21,23,180,2,1,7,37,126,117, 51,17,6,5,134,135,135,35,52,101,90,148,65,35,26,40, 135,29,81,28,163,36,24,217,56,24,20,27,71,16,4,1, 110,2,130,9,9,21,24,18,88,4,61,21,27,42,0,1, 0,82,0,1,2,215,2,217,0,29,0,0,1,52,39,38, 39,34,7,6,29,1,35,53,52,55,54,55,54,51,50,23, 22,23,22,29,1,51,21,35,21,35,2,38,4,14,162,103, 45,45,95,47,24,41,64,104,196,60,9,11,7,82,82,95, 1,158,51,31,144,4,48,46,136,81,82,149,66,33,25,41, 135,21,57,42,59,176,94,144,0,1,0,79,0,5,2,130, 2,221,0,29,0,0,1,20,7,6,7,6,7,34,39,38, 53,17,51,23,33,21,33,7,20,23,22,23,22,51,50,55, 54,61,1,51,2,130,50,24,39,61,106,199,57,27,94,1, 1,209,254,47,1,27,17,34,43,60,103,44,46,95,1,64, 149,68,33,24,39,2,135,66,114,1,157,152,93,168,115,43, 27,20,24,47,46,136,81,0,0,1,0,30,255,250,2,199, 2,223,0,73,0,0,1,52,39,38,39,38,39,38,43,1, 15,1,6,7,6,15,1,6,21,55,21,33,53,54,55,54, 55,54,55,51,50,23,50,23,22,23,22,23,22,23,22,23, 22,21,20,7,6,7,6,7,51,50,23,22,23,39,52,39, 33,21,35,53,51,21,51,50,55,54,55,54,55,54,55,54, 2,50,8,7,31,15,44,61,53,14,17,29,112,33,2,1, 8,2,188,254,230,6,26,9,16,71,156,37,14,11,12,7, 48,39,35,56,7,5,13,20,16,6,20,84,34,39,123,70, 39,25,2,83,69,254,89,90,90,127,48,81,8,6,94,36, 7,6,8,1,164,71,22,32,43,21,23,28,2,6,29,103, 5,4,40,18,15,2,81,67,95,59,20,25,99,11,2,2, 7,16,12,53,7,5,14,54,48,46,46,27,124,86,35,20, 46,33,58,1,55,2,54,186,55,44,4,4,51,83,18,20, 32,0,0,1,0,84,0,0,1,174,2,209,0,9,0,0, 37,21,35,17,51,21,51,21,35,17,1,78,250,96,250,250, 79,79,2,209,233,77,254,180,0,1,0,74,0,0,2,127, 2,217,0,29,0,0,1,35,53,52,39,38,39,34,15,1, 6,7,17,5,7,37,17,52,55,54,55,54,51,50,23,22, 31,1,22,21,2,125,95,45,45,103,108,43,12,16,2,1, 215,2,253,205,57,24,37,64,101,105,62,77,22,8,6,1, 18,140,134,48,47,1,68,24,41,97,254,186,1,87,1,1, 158,160,69,29,21,35,40,48,88,41,42,55,0,2,0,63, 255,254,3,15,2,216,0,15,0,65,0,0,37,20,23,22, 23,22,23,50,55,53,35,34,7,6,7,6,7,52,55,54, 59,1,53,52,39,38,39,35,34,39,35,34,7,17,35,17, 52,55,54,55,54,59,1,50,23,22,29,1,51,21,35,21, 20,7,6,43,1,34,39,34,39,34,39,38,39,38,1,84, 19,14,31,33,44,151,2,179,70,21,14,8,2,93,52,47, 108,180,44,42,62,179,9,1,15,122,2,95,13,48,143,16, 18,191,127,66,44,54,54,104,53,81,29,12,7,11,6,19, 32,89,25,14,218,78,26,19,11,7,1,137,155,26,19,49, 34,24,139,49,44,66,84,26,24,2,1,137,253,254,2,11, 40,39,112,13,1,80,52,73,75,78,164,120,57,31,1,1, 9,24,76,41,0,2,0,67,255,246,2,126,2,206,0,22, 0,41,0,0,5,34,39,38,61,1,52,55,54,55,50,59, 1,53,51,21,51,21,35,17,20,7,6,19,35,47,1,34, 7,6,7,21,20,23,22,23,50,55,54,55,54,55,1,48, 133,64,40,24,53,147,6,7,143,92,99,96,104,50,59,141, 9,14,43,39,37,2,23,46,73,72,32,8,8,21,2,10, 82,51,72,126,51,46,100,8,192,192,75,255,0,114,60,29, 1,203,1,1,30,27,87,107,60,29,46,2,30,7,10,29, 61,0,0,1,0,63,0,0,2,113,2,220,0,33,0,0, 1,34,7,6,7,6,7,17,35,17,51,21,54,55,54,51, 50,23,22,23,22,23,22,29,1,35,53,52,39,38,39,38, 39,38,1,95,130,43,10,4,5,2,94,98,13,98,38,29, 101,67,62,29,9,11,7,94,31,13,19,7,8,43,1,230, 68,17,20,29,66,254,226,2,220,214,31,19,7,38,32,68, 21,57,42,60,71,71,118,46,19,13,5,4,24,0,0,1, 0,93,0,0,1,117,2,204,0,5,0,0,51,17,51,17, 23,21,93,95,185,2,204,253,146,1,93,0,0,1,0,66, 255,244,3,15,2,211,0,41,0,0,37,55,61,1,51,21, 20,7,6,7,6,7,6,35,34,39,38,39,38,53,55,7, 17,35,17,51,21,23,21,20,23,22,23,22,23,50,55,54, 55,54,55,52,2,174,2,95,92,7,8,29,26,21,48,199, 57,13,7,8,1,108,95,95,203,28,17,32,43,60,49,18, 11,27,23,11,237,65,1,224,225,199,72,5,5,18,9,6, 135,37,41,48,86,114,1,254,64,2,211,195,1,224,117,44, 26,18,23,2,9,3,30,25,65,9,0,2,0,34,255,252, 3,0,2,250,0,38,0,54,0,0,1,7,38,39,38,35, 39,50,23,22,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,55,54,55,39,34,47,1,55,22,23,22,51,33,50, 23,3,52,39,38,35,34,7,6,21,20,23,22,23,50,55, 54,3,0,65,6,28,12,15,126,13,38,130,14,1,101,98, 138,136,96,96,103,19,21,41,9,81,114,9,1,83,2,6, 22,66,1,159,93,37,132,68,72,103,103,76,75,73,71,98, 101,77,75,2,134,63,33,9,2,1,27,83,176,15,15,134, 91,91,97,99,138,134,101,19,16,30,1,1,69,20,41,20, 8,27,45,254,166,109,77,80,82,82,106,96,73,71,2,74, 71,0,0,1,0,74,0,1,2,125,2,221,0,29,0,0, 37,35,53,6,7,6,35,34,39,38,39,38,53,17,51,17, 20,23,22,23,22,23,50,55,54,55,54,61,1,51,2,124, 97,12,58,55,54,100,68,95,18,5,94,28,16,34,41,62, 107,52,17,10,7,95,1,215,25,19,13,37,52,137,40,51, 1,1,255,0,116,44,26,20,22,2,52,17,45,41,75,76, 0,1,0,23,255,182,2,55,2,213,0,19,0,0,1,50, 23,21,39,38,39,34,7,1,5,21,35,38,39,38,39,37, 1,54,1,248,44,19,13,17,23,38,38,254,241,1,128,32, 8,26,29,55,254,134,1,116,44,2,213,15,103,16,14,2, 46,254,184,176,163,45,29,34,25,170,1,184,56,0,0,2, 0,51,255,214,2,80,2,216,0,65,0,79,0,0,1,50, 23,22,23,21,20,7,6,7,6,7,22,23,22,23,7,38, 39,6,15,1,34,39,38,47,2,52,55,54,55,50,31,1, 22,23,22,23,54,55,54,61,1,52,39,38,39,38,35,34, 7,6,7,6,7,6,29,1,39,53,52,55,54,55,54,3, 20,23,50,55,54,55,38,39,38,35,34,7,6,1,76,141, 71,46,2,41,41,43,40,22,19,47,8,7,73,47,28,73, 45,20,65,32,34,8,7,3,82,19,22,27,27,12,17,21, 43,30,66,48,34,103,10,11,31,12,15,25,55,38,3,3, 20,95,94,24,27,48,134,62,28,20,22,8,20,39,20,19, 19,14,8,2,216,96,62,88,63,93,76,74,40,37,15,16, 58,10,8,34,40,38,38,8,1,26,27,25,22,17,101,24, 5,1,8,3,4,13,22,49,42,98,65,86,44,122,42,4, 3,9,6,6,56,4,4,32,50,61,2,66,105,70,18,12, 21,253,143,32,7,13,14,8,34,18,10,15,17,0,0,1, 0,79,0,0,2,138,2,216,0,29,0,0,33,35,17,52, 39,38,39,34,7,6,7,6,29,1,35,53,52,55,54,55, 54,51,50,23,22,23,22,21,17,51,2,138,192,43,40,59, 68,33,9,8,24,95,25,42,108,29,33,140,61,5,5,26, 97,2,5,83,27,24,2,29,7,10,31,59,204,210,50,47, 81,21,6,89,8,9,47,52,254,64,0,2,0,47,0,0, 2,113,2,212,0,24,0,34,0,0,41,1,52,55,54,55, 54,55,38,39,55,22,23,22,23,54,55,23,6,7,50,23, 22,23,22,47,1,38,39,34,7,6,7,6,7,2,113,253, 190,105,23,27,45,9,25,47,60,59,9,10,11,61,136,66, 122,64,8,48,111,35,13,88,17,61,117,3,38,47,37,47, 20,219,181,40,34,61,1,17,19,71,20,5,5,7,55,63, 67,55,45,66,149,200,72,26,69,210,121,53,67,75,99,106, 0,1,0,45,0,0,2,202,2,217,0,30,0,0,1,7, 17,20,7,6,15,1,6,7,6,35,34,39,38,39,38,53, 17,51,17,20,23,22,51,50,55,54,53,17,51,2,202,106, 57,12,14,31,2,2,64,101,104,63,64,24,25,95,45,45, 103,124,39,18,199,2,124,1,254,191,161,69,14,12,21,2, 1,34,39,40,64,73,98,1,158,254,98,134,48,47,91,44, 94,1,159,0,0,1,0,49,255,244,2,42,2,216,0,65, 0,0,37,20,7,6,35,34,39,34,39,38,39,38,39,38, 53,51,20,23,22,23,50,55,54,53,52,39,38,43,1,53, 51,50,55,54,55,52,39,38,35,34,7,6,15,1,20,21, 35,52,55,54,55,54,51,50,23,22,21,20,7,6,7,22, 23,22,23,22,2,42,101,66,89,27,6,73,67,7,5,28, 20,16,93,59,60,40,39,60,60,52,53,48,232,231,50,41, 40,2,117,16,7,11,21,70,16,6,96,21,21,50,50,79, 119,60,53,32,29,24,11,23,22,26,25,203,118,59,38,1, 52,5,5,26,41,44,32,72,27,28,4,28,27,91,87,28, 28,77,23,22,70,92,15,2,3,19,40,25,5,5,40,40, 39,27,26,57,53,77,79,33,33,10,1,14,12,43,40,0, 0,1,0,9,0,0,2,214,2,217,0,31,0,0,19,51, 17,20,23,22,23,22,51,50,55,54,61,1,51,21,20,7, 6,7,6,7,6,35,34,39,38,39,38,39,17,39,9,249, 27,17,33,43,60,103,45,45,95,53,16,21,10,12,64,104, 199,57,13,7,5,2,154,2,217,254,97,115,43,27,20,24, 47,46,136,140,140,153,69,20,17,8,7,40,134,36,43,40, 61,1,65,1,0,1,0,40,255,244,2,44,2,227,0,50, 0,0,19,5,21,39,38,47,1,34,7,34,15,1,6,7, 6,29,1,20,23,22,31,3,50,55,54,55,53,51,21,20, 7,6,7,34,35,34,39,38,39,38,61,1,52,55,54,55, 54,55,39,92,1,166,114,9,9,22,18,30,9,15,25,48, 39,38,30,31,40,34,15,13,46,56,55,2,96,64,72,109, 5,5,123,77,27,16,18,43,41,43,40,25,140,2,227,97, 83,26,1,1,1,5,5,9,17,58,58,103,91,68,42,40, 15,11,2,1,34,32,92,64,70,78,73,72,4,84,29,35, 40,39,118,102,65,65,26,25,9,30,0,1,0,74,0,1, 2,125,2,217,0,27,0,0,37,35,17,52,39,38,39,34, 15,1,6,7,17,35,17,52,55,54,55,54,51,50,23,22, 31,1,22,21,2,125,95,45,45,103,108,43,12,16,2,94, 57,24,37,64,101,105,62,77,22,8,6,1,1,157,134,48, 47,1,68,24,41,97,254,99,1,158,160,69,29,21,35,40, 48,88,41,42,55,0,0,1,0,66,255,242,2,71,2,216, 0,42,0,0,5,37,53,23,54,55,54,55,54,55,54,61, 1,52,39,38,39,38,39,34,7,6,7,21,7,53,52,55, 54,51,50,23,22,31,1,20,7,6,15,1,6,7,23,1, 232,254,110,131,23,11,54,54,48,41,38,31,41,65,7,22, 78,50,29,2,95,64,75,115,173,71,16,2,1,35,38,55, 31,41,48,151,14,105,85,37,2,2,8,27,23,56,55,90, 85,67,37,47,11,1,3,57,34,67,64,1,72,83,68,75, 147,42,37,116,78,57,60,35,17,21,10,40,0,1,0,74, 0,1,2,125,2,217,0,36,0,0,37,35,17,34,15,1, 6,7,6,7,6,7,21,35,53,52,55,54,55,54,51,50, 23,22,31,1,22,21,17,35,17,52,39,38,39,17,20,1, 139,95,28,7,25,30,21,1,2,16,2,94,57,24,37,64, 101,105,62,77,22,8,6,95,44,31,70,223,1,165,3,14, 18,50,3,4,41,97,42,43,160,69,29,21,35,40,48,88, 41,42,55,254,98,1,157,133,49,31,18,254,112,21,0,2, 0,42,255,248,2,199,2,224,0,22,0,80,0,0,1,6, 15,1,6,7,6,7,51,50,23,22,23,54,55,52,39,38, 39,38,39,38,35,1,39,52,39,33,21,35,53,51,21,51, 50,55,54,61,1,39,38,39,38,35,39,34,39,34,39,53, 52,55,54,55,54,59,1,50,23,50,23,22,23,22,23,22, 23,22,23,22,21,20,7,6,7,6,7,51,50,23,22,1, 73,88,48,14,28,18,9,2,21,179,100,76,20,41,3,35, 5,6,15,44,61,53,1,112,83,69,254,89,90,90,127,90, 52,33,2,12,92,70,103,80,18,7,6,6,16,8,32,73, 160,21,14,11,12,7,48,39,35,56,7,5,13,20,16,6, 20,84,34,39,123,115,18,3,2,148,10,50,15,34,56,34, 27,49,37,67,86,71,74,59,8,9,21,23,28,253,100,3, 55,2,54,186,55,42,28,38,13,8,52,26,19,2,1,2, 89,68,35,21,58,104,2,2,7,16,12,53,7,5,14,54, 48,46,46,27,124,86,35,20,108,15,0,1,0,74,0,1, 2,201,2,217,0,31,0,0,37,51,23,7,23,7,17,52, 39,38,39,34,15,1,6,7,17,35,17,52,55,54,55,54, 51,50,23,22,31,1,22,21,2,125,75,1,79,1,93,45, 45,103,108,43,12,16,2,94,57,24,37,64,101,105,62,77, 22,8,6,250,80,1,167,1,1,157,134,48,47,1,68,24, 41,97,254,99,1,158,160,69,29,21,35,40,48,88,41,42, 55,0,0,1,0,79,255,244,2,130,2,204,0,27,0,0, 1,51,17,20,7,6,7,6,35,34,39,38,39,38,53,17, 51,17,20,23,22,23,22,23,50,55,54,53,2,35,95,50, 24,39,62,105,185,61,22,9,6,94,28,17,33,43,60,102, 45,46,2,204,254,98,147,69,32,26,40,116,40,57,45,56, 1,158,254,99,117,44,26,18,23,2,47,46,137,0,0,1, 0,74,0,1,2,215,2,217,0,31,0,0,37,53,6,7, 6,35,34,39,38,39,38,61,1,51,21,20,23,22,23,22, 23,50,55,54,55,54,61,1,51,17,51,21,2,27,12,58, 55,54,100,68,95,18,5,94,28,16,34,41,62,107,52,17, 10,7,95,90,1,215,25,19,13,37,52,137,40,51,101,100, 116,44,26,20,22,2,52,17,45,41,75,252,253,134,94,0, 0,1,0,45,255,243,2,103,2,216,0,55,0,0,1,34, 7,6,21,20,23,22,23,22,23,22,23,22,31,1,20,7, 6,7,6,35,34,39,38,53,55,22,31,1,50,55,54,53, 52,47,1,38,39,38,39,38,39,52,55,54,51,50,31,1, 22,31,1,21,7,38,1,72,120,34,10,27,29,114,116,43, 61,31,22,6,2,32,47,106,39,41,239,56,10,89,13,167, 32,99,49,29,84,210,88,37,3,3,23,3,101,64,87,164, 67,3,17,12,6,91,12,2,133,64,20,24,39,24,26,25, 25,21,28,45,30,45,27,54,52,74,25,9,175,31,36,8, 142,22,1,51,29,41,71,30,58,29,50,4,5,33,57,108, 54,35,96,5,29,35,38,11,7,135,0,1,0,74,0,1, 2,125,2,217,0,27,0,0,1,35,53,52,39,38,39,34, 15,1,6,7,17,35,17,52,55,54,55,54,51,50,23,22, 31,1,22,21,2,125,95,45,45,103,108,43,12,16,2,94, 57,24,37,64,101,105,62,77,22,8,6,1,38,120,134,48, 47,1,68,24,41,97,254,99,1,158,160,69,29,21,35,40, 48,88,41,42,55,0,0,2,0,60,255,244,2,57,2,216, 0,59,0,81,0,0,1,50,23,20,15,1,6,7,22,23, 22,23,22,23,20,7,6,7,6,35,34,39,38,39,51,20, 23,22,31,2,50,55,54,55,54,53,52,39,38,47,3,34, 7,39,54,55,54,55,38,39,38,39,52,55,54,55,54,19, 50,55,54,53,52,39,38,39,38,35,34,7,6,7,6,21, 20,23,22,23,22,1,56,231,3,50,9,15,14,49,36,5, 4,15,2,30,47,112,32,35,120,69,61,3,93,35,33,38, 34,20,23,37,37,32,33,29,30,36,34,21,11,104,35,106, 14,30,34,17,22,31,30,2,15,16,52,54,96,97,31,12, 28,28,35,35,15,12,18,45,33,33,22,18,36,33,2,216, 184,76,40,6,10,6,12,68,9,10,37,59,59,52,83,23, 6,63,55,97,56,31,29,14,8,2,9,9,32,33,65,61, 34,34,9,7,2,1,53,1,44,23,23,7,8,31,30,71, 36,42,41,32,33,254,216,60,23,29,46,25,25,6,6,3, 9,24,24,48,35,28,18,19,12,0,0,1,0,76,0,0, 1,95,2,211,0,7,0,0,19,51,21,51,21,35,17,35, 76,95,180,180,95,2,211,248,80,254,117,0,0,3,0,42, 0,1,2,228,2,213,0,35,0,42,0,53,0,0,19,52, 55,54,55,54,55,53,51,21,51,50,31,1,22,23,22,23, 22,21,20,7,6,7,6,7,21,35,53,38,39,38,39,38, 39,38,55,20,23,17,6,7,6,1,54,55,54,55,54,55, 52,39,38,39,42,67,65,70,60,41,94,8,6,4,22,27, 34,65,68,67,66,66,68,65,36,94,75,66,17,11,50,17, 67,95,208,122,57,27,1,44,137,50,4,3,13,2,134,34, 41,1,106,124,70,67,23,19,5,55,55,1,4,6,12,18, 70,70,127,126,71,69,23,22,3,47,47,9,33,8,8,37, 22,68,127,193,41,1,209,13,100,49,254,209,25,103,8,8, 35,55,158,54,13,6,0,2,0,36,0,0,2,86,2,216, 0,28,0,45,0,0,1,34,39,38,39,21,33,21,33,21, 35,53,35,53,51,17,52,55,54,55,54,51,50,23,22,23, 20,7,6,39,20,23,22,51,50,53,52,39,38,39,34,7, 6,7,6,21,1,115,65,39,38,12,1,125,254,130,93,87, 87,15,21,69,53,80,166,53,12,2,116,46,214,65,41,48, 128,48,45,46,63,46,4,4,26,1,19,21,23,16,136,78, 121,121,78,1,68,47,26,64,39,29,132,40,35,170,54,22, 197,62,36,22,159,82,30,28,2,43,4,4,29,55,0,2, 0,48,255,244,2,221,2,217,0,19,0,34,0,0,5,34, 39,38,39,52,55,54,55,50,23,22,23,22,23,20,7,6, 7,6,1,20,23,22,51,50,54,53,52,39,38,35,34,7, 6,1,135,163,97,81,2,96,94,153,157,97,27,18,41,2, 44,52,111,64,254,196,69,71,104,107,138,115,58,70,100,74, 72,12,119,99,143,176,102,100,2,112,31,36,83,110,107,86, 104,46,26,1,103,129,74,75,150,138,180,73,37,69,69,0, 0,3,0,39,255,247,2,161,2,213,0,11,0,19,0,65, 0,0,1,35,17,51,50,55,54,61,1,52,39,38,37,20, 51,55,53,35,39,34,7,38,39,38,53,52,55,54,55,54, 59,1,21,51,50,23,22,23,21,20,15,1,6,7,35,7, 34,39,38,39,38,39,38,53,51,20,23,22,23,22,51,17, 39,34,39,38,1,180,46,46,70,43,29,27,41,254,157,109, 34,19,22,102,9,38,13,9,29,41,96,18,25,95,46,166, 57,12,2,79,25,51,82,133,27,46,58,55,37,11,19,11, 93,11,8,40,37,71,45,16,23,34,1,177,254,146,52,34, 65,55,69,35,56,145,72,1,146,1,191,20,38,18,37,64, 32,47,5,1,217,134,41,35,86,101,67,19,31,2,1,16, 17,40,13,35,41,22,32,18,19,22,18,1,112,1,5,5, 0,1,0,53,1,233,0,155,2,211,0,10,0,0,19,53, 51,21,20,7,6,7,39,54,53,61,94,15,20,46,21,53, 2,109,102,80,65,30,36,23,34,20,78,0,0,1,0,24, 2,76,0,153,2,206,0,3,0,0,19,55,51,7,24,88, 41,104,2,76,130,130,0,1,0,23,2,73,1,46,2,218, 0,22,0,0,19,34,7,6,7,39,54,55,54,55,54,59, 1,31,1,50,55,21,6,7,6,43,1,116,44,28,3,10, 8,5,12,8,24,22,22,34,19,41,44,48,36,40,5,5, 78,2,127,36,3,15,47,8,11,9,14,11,1,2,48,45, 38,6,1,0,0,1,0,43,2,71,0,227,2,208,0,3, 0,0,19,35,39,51,227,71,113,118,2,71,137,0,0,1, 0,21,2,83,1,44,3,14,0,34,0,0,1,52,39,38, 39,34,7,6,21,35,53,54,55,54,55,54,51,50,23,22, 21,20,7,6,35,34,53,51,20,23,22,23,50,55,54,0, 255,33,8,36,68,22,20,47,12,36,14,18,38,63,74,17, 7,63,15,18,90,44,28,8,12,37,8,3,2,172,43,7, 2,3,39,38,53,30,73,30,11,10,19,48,20,31,68,16, 4,90,38,8,2,1,24,10,0,1,0,65,255,246,3,0, 2,8,0,40,0,0,23,34,39,17,51,17,20,23,22,23, 22,51,50,55,54,53,17,51,17,20,23,22,51,50,55,54, 55,52,53,17,51,17,35,53,6,7,6,35,34,39,6,226, 158,3,88,16,8,15,23,30,54,36,37,88,72,9,11,34, 33,56,5,88,79,33,71,26,27,116,30,61,10,174,1,100, 254,185,69,22,11,11,14,36,36,81,1,45,254,175,105,11, 1,18,37,107,11,12,1,13,253,249,73,57,20,7,91,91, 0,1,0,74,255,45,1,239,2,17,0,29,0,0,37,35, 53,52,39,38,39,38,35,34,15,1,6,7,23,33,21,33, 7,35,17,51,21,54,51,50,31,1,22,21,1,239,88,6, 12,55,16,18,71,39,13,13,2,1,1,74,254,182,1,88, 79,60,104,78,53,14,33,189,98,73,19,55,15,5,54,22, 31,70,181,96,211,2,217,77,88,47,14,44,104,0,0,2, 0,35,255,47,2,49,2,18,0,24,0,40,0,0,19,50, 23,22,23,53,51,3,51,21,35,21,39,17,6,7,34,39, 38,39,38,53,52,55,54,19,52,39,38,35,34,7,6,21, 20,23,22,51,50,55,54,254,84,48,9,10,80,1,77,77, 87,50,86,58,57,83,22,6,103,50,217,43,43,56,55,42, 41,41,42,59,57,41,40,2,18,55,11,13,68,254,72,79, 209,1,1,6,63,3,34,52,120,33,36,163,70,34,254,238, 101,52,52,49,50,98,103,50,50,47,47,0,0,1,0,73, 255,47,2,55,2,3,0,28,0,0,1,50,31,1,22,23, 17,51,21,35,21,35,17,52,39,34,7,6,7,17,35,17, 51,21,54,55,54,55,54,1,65,89,38,10,7,2,100,100, 86,80,110,25,6,1,86,83,18,22,26,69,15,2,3,65, 18,22,25,254,189,62,209,2,44,91,2,114,25,31,254,242, 1,249,80,25,24,30,9,2,0,1,0,60,255,245,1,230, 2,209,0,31,0,0,33,35,53,6,35,34,39,38,39,38, 39,38,39,17,55,21,5,21,33,7,20,23,22,23,22,51, 50,55,54,61,1,51,1,225,79,58,107,92,46,3,3,17, 11,3,2,89,1,81,254,175,1,27,8,11,28,34,54,43, 41,87,74,85,52,4,4,24,42,29,56,2,7,2,201,1, 92,223,77,29,9,7,17,35,36,100,97,0,0,2,0,42, 255,47,2,66,2,6,0,26,0,44,0,0,55,52,55,54, 51,50,23,22,23,53,51,17,51,21,35,17,6,7,6,35, 34,39,38,39,38,39,38,23,50,55,54,55,52,39,38,35, 34,7,6,21,20,23,22,23,22,42,77,55,83,62,34,34, 10,82,99,184,41,85,12,13,108,57,6,7,8,9,6,228, 72,35,19,1,62,30,40,97,28,9,55,19,24,18,245,142, 76,55,25,25,17,54,253,112,58,1,15,65,10,1,108,13, 15,26,35,35,162,89,47,55,128,50,24,116,38,46,105,54, 19,8,5,0,0,1,0,94,255,135,1,101,2,209,0,11, 0,0,37,21,47,1,35,17,51,21,51,21,35,17,1,62, 75,1,148,86,177,177,74,195,2,119,2,209,243,77,254,185, 0,1,0,63,255,48,1,228,2,17,0,32,0,0,5,35, 17,52,39,38,39,38,35,34,15,1,6,7,6,7,19,33, 21,37,17,51,21,54,51,50,23,22,23,22,23,22,21,1, 228,88,5,12,53,17,20,66,39,15,1,1,14,2,1,1, 72,254,95,79,60,105,73,52,11,8,18,10,5,1,1,32, 76,16,53,17,5,48,23,2,3,33,68,254,119,92,2,2, 212,77,88,42,9,10,24,42,40,42,0,2,0,68,255,35, 2,42,2,6,0,42,0,56,0,0,55,52,55,54,55,51, 53,38,39,34,7,6,7,6,7,17,7,19,51,21,54,55, 54,55,54,51,55,50,23,22,23,21,51,21,35,21,20,7, 6,7,34,39,38,23,50,55,54,61,1,35,34,7,6,7, 20,23,22,208,59,38,51,83,8,125,26,27,50,21,30,3, 81,2,78,10,31,18,44,5,5,32,116,45,48,3,49,48, 33,38,75,94,39,19,152,66,13,3,95,53,15,3,1,44, 19,126,78,43,28,1,65,112,4,6,21,35,48,47,253,248, 1,2,214,65,20,28,18,9,1,2,48,63,54,80,60,63, 66,43,54,2,66,32,33,71,14,16,64,62,14,16,45,20, 8,0,0,2,0,48,255,242,2,70,2,211,0,27,0,41, 0,0,19,52,55,54,59,1,53,51,21,51,21,35,21,20, 7,6,43,1,39,34,39,34,39,38,39,38,39,38,37,35, 34,7,20,23,22,23,50,55,54,55,54,53,48,66,56,85, 140,89,98,98,105,48,67,14,18,4,8,4,38,11,15,86, 15,3,1,94,122,133,5,31,30,73,60,35,16,7,9,1, 2,120,73,61,211,212,68,233,132,62,30,2,2,13,4,12, 56,134,24,213,190,90,55,53,2,51,27,38,48,82,0,1, 0,66,255,51,1,232,2,204,0,25,0,0,23,17,51,17, 54,51,50,23,22,21,22,21,17,35,17,52,39,38,35,34, 7,6,7,6,21,17,66,88,62,93,151,22,1,5,88,88, 10,11,68,40,8,6,15,205,3,153,254,255,71,128,3,3, 33,34,254,183,1,73,112,12,2,52,11,12,36,60,254,23, 0,1,0,60,255,48,0,247,2,7,0,5,0,0,23,21, 35,3,51,19,247,186,1,87,1,125,83,2,215,253,124,0, 0,1,0,66,255,46,2,214,2,201,0,33,0,0,1,35, 17,35,17,51,21,51,17,20,23,22,23,22,23,50,55,54, 53,17,51,17,35,53,6,7,34,39,38,39,38,39,38,53, 1,48,153,85,85,242,26,8,12,25,36,56,41,41,88,79, 56,109,87,48,5,4,20,8,7,1,183,253,119,3,155,193, 254,194,76,29,9,8,15,2,36,34,101,1,28,253,249,74, 84,2,49,5,6,29,37,54,87,0,0,2,0,43,255,242, 2,11,2,230,0,43,0,64,0,0,5,34,39,38,53,52, 55,54,63,2,54,55,54,51,55,38,39,38,39,52,55,23, 6,7,20,23,22,23,51,21,35,22,23,22,23,22,31,1, 20,23,20,7,6,39,50,55,54,55,54,55,52,39,38,39, 38,35,34,15,1,6,21,20,23,22,1,13,129,66,31,6, 1,2,10,6,22,48,46,65,22,16,24,22,2,85,51,59, 1,26,27,41,146,102,7,11,23,14,1,1,2,1,71,57, 81,84,28,6,5,2,1,35,5,6,24,31,120,30,10,4, 115,12,14,126,65,81,29,31,14,3,31,14,58,40,39,1, 11,30,28,40,61,54,52,22,40,26,32,32,28,64,5,17, 30,84,7,6,33,25,14,115,69,55,70,101,22,28,25,27, 86,64,10,7,30,94,42,28,36,181,17,2,0,1,0,71, 255,45,1,238,2,209,0,23,0,0,5,39,17,6,7,34, 39,38,39,38,39,17,51,17,20,51,50,55,54,55,54,53, 17,51,1,238,88,61,95,115,42,1,2,18,1,88,110,71, 38,7,5,16,88,211,1,1,20,69,2,78,3,4,41,76, 2,12,253,244,126,55,9,11,37,59,1,23,0,1,0,66, 0,0,1,232,2,204,0,25,0,0,51,17,51,17,54,51, 50,23,22,21,22,21,17,35,17,52,39,38,35,34,7,6, 7,6,21,17,66,88,62,93,151,22,1,5,88,88,10,11, 68,40,8,6,15,2,204,254,255,71,128,3,3,33,34,254, 183,1,73,112,12,2,52,11,12,36,60,254,228,0,0,2, 0,40,255,242,1,216,2,224,0,50,0,73,0,0,1,20, 15,1,22,23,22,21,17,35,53,6,7,6,35,34,39,38, 39,38,53,52,55,54,55,54,55,54,55,54,55,52,39,38, 39,38,39,52,55,51,14,1,21,20,31,1,50,23,22,23, 22,1,20,23,22,23,50,55,54,53,52,55,52,39,38,39, 38,43,1,34,7,6,7,6,1,145,76,14,97,42,22,77, 7,34,32,62,62,50,51,28,29,13,7,16,18,10,35,68, 83,14,42,36,30,25,4,41,72,3,18,15,56,22,24,20, 4,1,254,240,67,30,42,90,34,8,1,37,24,47,11,10, 12,7,9,39,38,38,2,108,31,61,11,19,101,54,67,254, 236,63,19,29,29,33,34,62,69,76,32,36,25,27,30,10, 48,50,59,25,4,4,4,7,6,18,42,49,12,30,6,9, 6,8,6,8,16,6,254,139,128,49,22,1,120,56,11,11, 4,92,46,44,11,2,4,11,54,55,0,1,0,39,255,47, 2,20,2,3,0,23,0,0,5,35,17,52,39,34,7,6, 7,17,35,17,51,21,54,55,54,51,50,23,22,21,17,51, 2,20,185,81,91,37,8,5,86,82,41,15,41,68,75,35, 36,100,209,2,44,91,2,83,23,32,254,210,1,249,83,51, 12,30,41,39,50,253,237,0,0,2,0,43,0,0,1,251, 2,219,0,25,0,39,0,0,1,6,7,22,23,22,21,23, 49,7,20,7,33,38,39,52,55,54,55,54,55,39,55,23, 54,55,3,38,39,38,39,38,39,38,35,7,6,7,6,21, 1,251,32,156,150,25,1,3,1,1,254,61,1,1,39,8, 8,38,69,64,49,62,102,104,36,19,49,5,10,14,21,28, 5,4,54,40,35,2,171,31,166,166,228,2,3,56,21,8, 2,14,17,92,117,22,15,92,92,49,64,50,122,85,253,107, 143,88,13,17,26,28,37,7,78,102,90,75,0,1,0,73, 255,246,1,213,2,213,0,48,0,0,19,52,55,54,59,1, 50,23,21,39,34,15,1,20,31,1,22,23,22,21,17,35, 53,7,6,7,34,35,34,39,38,53,17,51,17,22,23,50, 55,54,55,53,52,39,38,39,38,39,38,244,100,19,25,64, 9,4,84,40,9,5,27,49,44,12,10,84,56,35,67,4, 3,84,47,16,86,9,71,122,19,2,2,16,17,36,37,16, 18,2,128,74,9,2,1,68,1,12,11,20,27,49,46,27, 24,27,254,98,56,36,28,2,66,34,25,1,134,254,160,84, 4,112,11,26,203,28,21,22,30,33,25,27,0,1,255,210, 255,46,0,153,2,7,0,15,0,0,23,50,55,54,53,17, 51,17,20,7,6,35,34,39,55,22,12,44,7,2,88,54, 28,48,42,27,17,27,133,51,16,40,2,33,253,221,128,35, 19,9,75,7,0,1,0,73,255,246,1,210,2,214,0,45, 0,0,33,35,53,7,6,7,6,7,6,7,34,47,1,38, 47,1,19,52,55,54,55,54,59,1,21,34,15,2,6,7, 20,7,17,20,23,22,23,50,55,50,55,54,55,17,51,1, 210,80,28,28,17,13,17,23,40,27,38,17,40,20,5,1, 48,8,9,45,72,65,102,33,13,5,6,4,1,46,9,25, 6,16,26,37,40,17,87,83,30,34,10,7,3,7,2,10, 9,24,46,33,1,169,65,62,12,8,42,61,39,22,12,25, 30,16,10,254,149,57,23,5,2,2,20,25,90,1,51,0, 0,1,0,53,255,47,1,137,1,254,0,47,0,0,1,52, 39,38,35,34,7,39,54,55,50,23,22,21,20,15,2,6, 7,6,21,22,59,1,54,55,21,35,34,47,1,34,39,38, 39,38,39,38,39,52,55,54,55,54,63,1,54,1,61,41, 26,32,51,46,43,59,86,79,51,39,40,28,34,102,22,24, 4,92,12,12,131,127,70,60,10,4,6,11,3,21,13,7, 8,15,35,109,34,22,37,12,1,66,52,35,23,56,58,73, 3,64,48,60,64,59,42,48,143,38,38,23,31,1,1,63, 5,2,3,2,3,7,15,13,31,26,31,59,154,47,33,56, 20,0,0,1,0,69,255,255,1,234,2,17,0,26,0,0, 5,35,17,52,39,38,39,38,35,34,15,1,6,7,17,35, 17,51,21,54,51,50,23,22,23,22,21,1,234,88,6,9, 51,19,22,69,40,14,13,2,88,79,60,105,75,53,9,7, 33,1,1,32,73,19,50,18,7,52,24,34,67,254,234,2, 7,77,88,45,8,8,44,104,0,1,0,35,255,47,1,101, 2,9,0,50,0,0,5,35,34,39,34,39,38,39,38,39, 52,63,1,54,55,52,39,38,39,38,39,52,55,54,55,23, 7,6,21,20,31,1,22,23,22,21,20,15,1,6,7,6, 21,23,22,59,1,55,51,55,51,1,101,107,74,29,16,31, 35,11,17,2,39,139,5,1,62,23,23,20,6,44,41,32, 86,71,41,2,61,38,15,15,23,69,66,16,9,2,7,87, 11,17,8,99,2,209,3,7,13,14,24,39,36,52,195,6, 11,27,41,16,20,19,18,21,68,58,42,19,85,53,20,5, 1,54,32,18,18,19,22,32,94,91,29,18,15,13,31,1, 1,0,0,1,0,65,255,43,3,0,2,8,0,40,0,0, 23,34,39,17,51,17,20,23,22,23,22,51,50,55,54,53, 17,51,17,20,23,22,51,50,55,54,55,52,53,17,51,17, 35,17,6,7,6,35,34,39,6,226,158,3,88,16,8,15, 23,30,54,36,37,88,72,9,11,34,33,56,5,88,79,33, 71,26,27,116,30,61,10,174,1,100,254,185,69,22,11,11, 14,36,36,81,1,45,254,175,105,11,1,18,37,107,11,12, 1,13,253,35,1,31,57,20,7,91,91,0,0,2,0,38, 255,47,1,207,2,20,0,55,0,86,0,0,19,54,55,54, 51,23,50,23,22,23,22,23,22,21,20,7,6,15,1,6, 7,6,21,20,23,51,55,51,55,51,21,35,34,39,38,39, 52,55,54,55,54,55,54,53,52,47,2,38,39,38,53,55, 52,55,52,55,34,7,6,7,20,23,22,23,22,23,22,23, 54,63,1,54,55,54,55,54,53,52,39,52,39,38,39,38, 39,38,45,21,84,46,43,33,15,15,30,24,88,16,3,9, 33,117,55,21,35,22,112,11,17,8,92,2,147,72,31,71, 10,40,5,2,37,19,14,42,39,36,30,11,3,2,2,192, 92,29,7,2,23,1,2,13,31,78,1,3,12,24,33,30, 4,3,30,3,6,16,46,4,5,38,1,137,78,40,21,1, 6,6,16,46,109,18,18,41,31,119,103,44,17,33,22,14, 35,1,1,1,63,3,7,62,27,45,5,3,39,28,22,20, 40,38,35,30,25,76,20,17,31,9,5,8,72,83,21,26, 36,35,1,3,21,31,58,90,2,12,26,33,52,7,6,57, 59,19,12,12,12,55,21,2,2,16,0,1,0,80,255,254, 1,247,2,17,0,41,0,0,1,54,53,52,39,38,39,34, 7,6,7,6,21,17,35,17,51,21,54,51,50,23,22,23, 22,23,22,23,20,7,6,7,6,15,1,51,7,39,53,50, 55,54,1,159,3,46,26,40,72,39,7,5,15,88,79,60, 104,74,53,11,7,10,12,11,2,16,10,19,13,4,112,116, 1,176,2,31,93,1,52,16,14,62,34,19,1,55,10,11, 34,67,254,234,2,7,77,88,44,8,9,12,42,33,26,43, 37,28,31,20,3,114,81,1,77,32,97,0,0,1,0,64, 255,244,1,228,2,7,0,29,0,0,33,53,6,35,34,39, 38,39,38,39,38,53,17,51,17,20,23,22,23,22,51,50, 55,54,55,54,53,17,51,17,1,150,61,104,70,54,12,8, 19,9,5,88,5,12,56,16,18,72,38,7,5,15,88,76, 88,42,9,10,25,41,45,37,1,66,254,224,77,16,54,16, 4,54,11,11,34,67,1,22,253,249,0,1,0,71,255,45, 2,68,2,204,0,25,0,0,5,17,6,7,34,39,38,39, 38,39,17,51,17,20,51,50,55,54,55,54,53,17,51,3, 51,21,1,150,61,95,115,42,1,2,18,1,88,110,71,38, 7,5,16,88,2,88,210,1,20,69,2,78,3,4,41,76, 1,68,254,188,126,55,9,11,37,59,1,218,252,172,75,0, 0,1,0,73,255,243,3,64,2,17,0,53,0,0,5,35, 17,52,39,38,39,38,35,34,7,6,7,6,7,17,35,53, 6,35,34,39,38,39,38,39,38,53,17,51,17,20,23,22, 23,22,51,50,55,54,55,54,53,17,51,21,54,51,50,23, 22,23,22,21,3,64,88,6,12,55,16,18,72,39,7,5, 13,2,84,61,104,71,54,11,8,19,9,5,88,5,12,56, 16,18,70,39,8,5,15,85,60,104,76,53,9,7,33,1, 1,32,73,19,55,15,5,55,10,11,31,70,254,234,76,88, 43,9,9,25,41,45,37,1,66,254,224,77,16,54,16,4, 53,11,12,35,66,1,22,77,88,45,8,8,44,104,0,1, 0,69,255,45,1,234,2,17,0,26,0,0,5,35,17,52, 39,38,39,38,35,34,15,1,6,7,17,35,17,51,21,54, 51,50,23,22,23,22,21,1,234,88,6,9,51,19,22,69, 40,14,13,2,88,79,60,105,75,53,9,7,33,1,1,32, 73,19,50,18,7,52,24,34,67,254,24,2,217,77,88,45, 8,8,44,104,0,2,0,32,255,46,1,233,2,18,0,35, 0,51,0,0,19,52,55,54,51,50,23,53,51,17,20,7, 6,7,6,35,34,39,38,39,38,53,23,22,23,50,55,54, 55,54,55,6,35,34,39,38,55,20,23,22,51,50,55,54, 53,52,39,38,35,34,7,6,32,79,58,88,92,59,81,24, 37,107,31,35,134,48,6,4,13,85,9,110,104,30,3,3, 4,2,57,87,129,59,35,90,40,40,62,60,41,41,42,43, 59,58,42,40,1,6,138,75,55,74,63,254,63,119,51,81, 23,6,74,9,10,29,45,13,79,3,77,7,9,28,85,68, 111,64,94,103,46,47,47,47,99,95,48,49,48,43,0,1, 0,76,0,0,1,31,1,249,0,5,0,0,19,17,51,21, 35,17,161,126,211,1,249,254,69,62,1,249,0,1,0,43, 255,50,3,34,2,211,0,53,0,0,1,50,23,22,23,22, 23,22,21,17,35,17,52,39,38,47,1,35,34,7,6,7, 6,21,17,35,17,6,35,34,39,38,39,38,53,17,51,17, 20,23,22,23,22,51,50,55,54,55,54,55,17,51,17,54, 2,113,77,53,9,6,17,10,5,88,5,12,53,31,6,69, 39,9,5,15,85,61,103,71,54,11,8,34,88,6,13,58, 14,16,73,38,7,5,13,2,84,60,2,17,46,7,8,25, 41,40,42,254,191,1,32,76,16,53,17,5,53,11,12,34, 67,254,29,1,25,88,43,8,10,44,104,1,66,254,224,74, 19,57,14,3,55,10,11,31,70,1,227,254,230,88,0,2, 0,25,255,47,2,55,2,6,0,28,0,47,0,0,37,34, 39,21,33,21,33,21,35,53,35,53,51,17,51,21,54,55, 54,51,50,23,22,21,20,7,6,7,6,55,52,47,1,34, 35,34,7,6,21,20,23,22,23,50,55,50,55,54,1,85, 80,50,1,53,254,203,86,100,100,81,7,35,34,62,133,62, 28,56,45,72,17,102,92,36,6,6,63,32,33,56,30,41, 14,5,85,27,10,34,65,165,58,85,85,58,2,59,65,19, 30,29,116,59,80,99,59,53,13,3,237,145,25,6,48,47, 81,96,49,26,2,1,96,35,0,2,0,50,255,244,2,24, 2,18,0,17,0,33,0,0,19,52,55,54,51,50,23,22, 21,20,7,6,7,6,7,34,39,38,55,20,23,22,51,50, 55,54,53,52,39,38,39,34,7,6,50,154,40,49,106,68, 69,80,17,21,55,70,109,67,67,90,44,42,67,65,43,44, 44,42,66,65,44,42,1,3,199,57,15,71,69,123,154,67, 14,12,30,2,70,68,133,101,48,49,49,50,102,95,50,49, 2,50,48,0,0,3,0,42,255,47,2,111,2,214,0,38, 0,47,0,55,0,0,19,52,55,54,55,50,55,21,51,50, 31,1,22,21,20,7,6,35,7,21,35,53,7,39,34,47, 1,38,39,38,53,51,20,51,17,7,34,39,38,5,17,51, 50,55,54,53,52,35,39,20,23,22,51,53,34,7,89,125, 17,19,1,114,61,142,42,7,6,100,50,61,45,87,56,12, 12,15,19,45,39,40,78,160,21,59,56,55,1,22,37,95, 30,11,141,227,72,15,20,98,8,2,68,110,28,3,3,1, 223,151,28,29,31,167,64,32,1,208,208,1,2,3,5,10, 32,33,59,74,1,110,1,35,36,70,254,146,105,38,48,175, 150,69,11,2,157,62,0,1,0,70,255,248,2,33,2,211, 0,25,0,0,55,50,55,53,51,3,51,23,7,53,6,7, 6,7,6,7,34,39,38,39,38,53,3,51,17,22,236,140, 3,86,1,80,1,163,37,20,20,26,23,39,45,40,4,5, 52,1,86,6,67,143,146,254,227,68,1,82,47,15,14,8, 6,2,24,2,3,37,57,2,96,253,200,85,0,2,0,90, 0,0,0,190,2,7,0,3,0,7,0,0,19,53,51,21, 3,53,51,21,90,100,100,100,1,162,101,101,254,94,100,100, 0,1,0,12,0,166,1,38,1,7,0,11,0,0,37,6, 7,34,39,55,22,23,22,23,50,55,1,38,65,85,42,90, 46,38,25,27,33,39,48,203,34,3,21,76,24,10,7,2, 15,0,0,2,0,0,255,2,0,71,255,196,0,3,0,7, 0,0,21,51,21,35,53,51,21,35,71,71,71,71,184,70, 194,71,0,5,0,0,255,2,1,79,255,196,0,3,0,7, 0,11,0,15,0,19,0,0,21,51,21,35,55,51,21,35, 7,51,21,35,55,51,21,35,53,51,21,35,71,71,129,71, 71,64,70,70,200,70,70,70,70,60,71,71,71,53,70,70, 70,194,71,0,0,3,0,0,255,2,1,73,255,196,0,3, 0,7,0,11,0,0,21,51,21,35,5,51,21,35,53,51, 21,35,188,188,1,3,70,70,70,70,60,71,53,70,194,71, 0,3,0,0,255,2,1,73,255,196,0,3,0,7,0,15, 0,0,5,51,21,35,53,51,21,43,1,21,35,53,35,53, 51,21,1,3,70,70,70,70,130,70,59,188,184,70,194,71, 117,117,71,71,0,1,0,0,255,125,0,71,255,196,0,3, 0,0,21,51,21,35,71,71,60,71,0,2,0,0,255,125, 0,200,255,196,0,3,0,7,0,0,21,51,21,35,55,51, 21,35,71,71,129,71,71,60,71,71,71,0,0,3,0,0, 255,2,0,200,255,196,0,3,0,7,0,11,0,0,21,51, 21,35,55,51,21,35,7,51,21,35,71,71,129,71,71,64, 70,70,60,71,71,71,53,70,0,1,0,0,255,125,0,188, 255,196,0,3,0,0,21,51,21,35,188,188,60,71,0,1, 0,0,255,8,0,188,255,196,0,7,0,0,23,21,35,53, 35,53,51,21,129,70,59,188,131,117,117,71,71,0,0,1, 0,0,2,148,0,71,2,219,0,3,0,0,17,51,21,35, 71,71,2,219,71,0,0,3,0,0,255,2,1,73,255,196, 0,3,0,7,0,11,0,0,5,51,21,35,39,51,21,35, 39,51,21,35,1,3,70,70,130,71,71,129,71,71,184,70, 135,70,129,71,0,1,0,0,1,14,0,71,1,85,0,3, 0,0,17,51,21,35,71,71,1,85,71,0,0,1,0,0, 255,8,0,71,255,196,0,3,0,0,23,21,35,53,71,71, 60,188,188,0,0,1,0,38,2,12,1,177,2,88,0,3, 0,0,1,33,53,33,1,177,254,117,1,139,2,12,76,0, 0,1,0,0,2,148,0,200,2,219,0,3,0,0,17,51, 21,35,200,200,2,219,71,0,0,1,0,62,255,156,0,149, 2,188,0,3,0,0,23,17,51,17,62,87,100,3,32,252, 224,0,0,1,2,127,2,128,2,198,2,199,0,3,0,0, 1,51,21,35,2,127,71,71,2,199,71,0,0,1,0,70, 2,128,0,141,2,199,0,3,0,0,19,51,21,35,70,71, 71,2,199,71,255,255,0,110,0,0,0,214,2,12,16,6, 0,29,0,0,0,1,0,0,2,148,0,71,2,219,0,3, 0,0,17,51,21,35,71,71,2,219,71,0,0,1,0,58, 0,0,2,70,2,88,0,37,0,0,19,6,7,6,7,6, 7,21,35,53,55,54,55,54,55,54,55,39,51,19,54,55, 54,55,54,55,53,51,21,7,6,7,6,7,6,7,23,35, 252,25,7,48,10,8,1,87,3,10,60,4,5,20,38,148, 102,228,25,7,47,10,9,1,87,3,11,58,5,5,20,38, 148,102,1,69,17,11,62,32,25,37,141,141,45,65,78,5, 6,25,25,210,254,187,17,11,61,25,25,36,150,150,43,62, 73,5,7,25,25,210,0,1,0,58,0,0,2,54,2,88, 0,27,0,0,37,17,38,39,38,39,38,39,38,39,35,53, 51,22,23,22,23,22,23,22,23,22,23,17,51,21,33,53, 1,149,13,16,6,7,34,106,8,18,139,145,94,49,12,12, 40,24,41,13,2,2,74,254,4,76,1,39,54,23,8,9, 39,16,1,3,76,11,20,5,6,17,32,52,61,8,10,254, 210,76,76,0,0,1,0,30,0,0,1,177,2,88,0,26, 0,0,37,7,35,55,51,39,38,39,38,39,38,39,38,39, 38,39,38,35,53,50,23,22,23,22,23,19,35,1,66,175, 117,207,81,22,6,19,6,11,13,16,1,4,62,32,15,19, 82,87,70,34,14,4,50,88,172,172,203,167,46,27,9,13, 15,8,1,2,28,4,1,76,42,31,82,32,34,254,133,0, 0,1,0,38,0,0,2,31,2,88,0,7,0,0,1,17, 35,17,33,53,33,21,1,204,87,254,177,1,249,2,12,253, 244,2,12,76,76,0,0,2,0,63,0,0,2,58,2,88, 0,26,0,30,0,0,1,17,35,17,38,39,38,39,38,47, 1,38,39,34,39,35,53,33,22,23,22,23,22,23,22,23, 22,1,17,51,17,2,58,87,11,14,5,6,10,12,6,38, 57,2,10,249,1,1,83,50,6,6,35,22,33,13,1,254, 6,87,1,122,254,134,1,116,55,24,8,8,14,7,4,21, 9,2,76,11,25,4,3,19,31,50,66,6,254,127,1,119, 254,137,0,1,0,62,0,0,0,149,2,88,0,3,0,0, 51,17,51,17,62,87,2,88,253,168,0,1,0,39,0,0, 1,40,2,88,0,7,0,0,19,17,35,17,35,53,33,21, 213,87,87,1,1,2,12,253,244,2,12,76,76,0,0,1, 0,63,0,0,2,59,2,88,0,24,0,0,1,17,35,17, 38,39,38,39,38,47,1,38,39,34,39,35,17,35,17,33, 50,23,22,23,22,2,59,87,11,14,5,6,10,12,6,38, 57,2,10,163,87,1,1,64,63,8,11,81,1,122,254,134, 1,116,55,24,8,8,14,7,4,21,9,2,253,244,2,88, 33,4,6,41,0,1,0,61,0,0,2,58,2,88,0,68, 0,0,1,34,7,53,54,51,50,23,22,23,22,23,22,23, 21,6,7,6,7,6,7,6,35,34,39,38,39,38,39,38, 39,17,51,17,22,23,22,23,22,23,20,23,22,23,22,51, 54,55,54,55,54,55,52,55,54,55,52,55,53,38,39,38, 39,38,47,1,38,39,38,1,58,32,45,42,38,72,76,36, 20,34,12,2,1,12,27,5,5,21,35,77,72,73,77,33, 23,36,11,1,1,87,11,17,4,4,11,11,6,50,28,11, 15,43,35,8,17,16,9,3,24,10,2,11,17,4,4,11, 11,6,51,23,13,2,12,20,82,14,43,20,30,49,65,7, 8,156,71,44,7,7,33,17,43,43,17,33,52,64,6,7, 1,122,254,140,56,28,5,6,15,6,1,3,27,3,2,1, 17,5,9,10,10,1,4,34,49,4,8,144,56,28,5,6, 15,6,4,27,3,2,0,1,0,58,1,30,0,145,2,88, 0,3,0,0,19,51,17,7,58,87,87,2,88,254,233,35, 0,1,0,38,255,56,1,218,2,88,0,26,0,0,1,17, 35,17,38,39,38,39,38,47,1,38,39,34,39,35,53,51, 22,23,22,23,22,23,22,23,22,1,218,87,11,14,5,6, 10,12,6,38,57,2,10,178,186,83,50,6,6,35,22,33, 13,1,1,122,253,190,2,60,55,24,8,8,14,7,4,21, 9,2,76,11,25,4,3,19,31,50,66,6,0,1,0,57, 0,0,2,4,2,88,0,44,0,0,51,35,53,51,54,55, 54,55,54,55,54,55,54,63,1,53,38,39,38,39,38,39, 38,39,35,53,51,22,23,22,23,22,23,22,23,22,23,21, 6,7,6,7,6,7,6,227,170,164,78,30,11,12,21,11, 1,2,26,12,4,13,16,6,7,34,106,8,18,164,170,95, 55,8,9,40,24,41,13,2,2,13,34,5,6,53,172,3, 76,11,12,4,6,10,12,2,2,32,46,16,142,54,23,8, 9,39,16,1,3,76,11,24,3,4,17,32,52,61,8,10, 156,69,47,7,8,69,21,1,0,1,0,37,0,0,2,33, 2,237,0,27,0,0,37,6,29,1,35,52,55,54,55,54, 55,54,55,54,55,53,33,53,51,21,33,21,20,15,1,6, 7,6,1,148,27,87,5,7,24,23,46,28,8,26,1,254, 91,87,1,165,31,5,22,46,29,208,42,97,69,120,30,49, 43,36,37,22,17,41,86,43,225,149,153,60,57,10,36,36, 23,0,0,2,0,63,0,0,2,60,2,88,0,10,0,20, 0,0,41,1,17,51,50,23,22,23,22,31,1,3,17,38, 39,38,39,38,39,35,17,2,59,254,4,217,85,84,39,26, 51,5,1,87,1,41,21,13,57,71,130,2,88,42,19,30, 63,53,18,254,213,1,43,51,39,18,8,32,1,254,64,0, 0,1,0,48,0,0,2,58,2,88,0,24,0,0,19,3, 35,19,35,53,51,50,23,22,23,22,21,17,33,53,51,17, 52,39,38,47,1,38,35,214,58,88,58,78,231,77,53,85, 45,31,254,214,211,18,28,31,35,36,56,2,12,253,244,2, 12,76,23,33,65,45,59,254,137,76,1,43,38,26,37,17, 16,15,0,1,0,62,255,56,0,149,2,88,0,3,0,0, 23,17,51,17,62,87,200,3,32,252,224,0,0,1,0,51, 0,0,1,70,2,88,0,20,0,0,41,1,53,51,17,38, 39,38,39,38,47,1,38,39,38,35,53,50,23,22,23,1, 70,254,237,188,11,14,5,6,10,12,6,52,29,10,13,73, 77,85,20,76,1,40,55,24,8,8,14,7,4,28,3,1, 76,43,46,133,0,2,0,61,0,0,2,57,2,88,0,28, 0,66,0,0,33,34,39,38,39,38,39,52,39,17,33,50, 23,22,23,22,23,22,23,22,23,21,6,7,6,7,6,7, 6,39,54,55,54,55,54,55,52,55,54,55,52,55,53,38, 39,38,39,38,47,1,38,39,34,39,35,17,22,23,22,23, 22,23,20,23,22,23,22,1,59,73,77,33,23,40,7,1, 1,1,64,66,7,9,36,20,34,12,2,1,12,27,5,5, 21,35,77,72,43,35,8,17,16,9,3,24,10,2,11,17, 4,4,11,11,6,38,57,2,10,163,11,15,4,5,11,11, 6,50,28,11,43,17,33,58,57,7,7,1,122,34,4,5, 20,30,49,65,7,8,156,71,44,7,7,33,17,43,76,1, 17,5,9,10,10,1,4,34,49,4,8,144,56,28,5,6, 15,6,4,21,9,2,254,216,56,25,7,7,15,6,1,3, 27,3,2,0,0,1,0,36,255,201,2,19,2,88,0,24, 0,0,55,3,51,19,55,54,55,54,55,54,63,1,17,51, 17,6,7,6,7,6,15,2,5,55,205,120,89,115,15,63, 10,13,11,26,10,7,87,14,12,13,23,37,65,31,2,254, 214,1,67,2,21,254,0,4,26,7,8,13,29,46,35,1, 88,254,162,74,25,26,26,41,25,11,1,76,79,0,0,1, 0,57,255,56,2,11,2,88,0,41,0,0,19,51,50,23, 22,23,22,23,22,23,22,23,17,35,17,38,39,38,39,38, 47,1,38,39,34,39,35,21,22,23,22,23,51,21,47,1, 38,39,38,39,38,39,57,215,64,63,8,11,35,22,33,13, 1,1,87,11,14,5,6,10,12,6,38,57,2,10,121,8, 20,14,66,34,40,71,36,31,43,6,1,1,2,88,33,4, 6,19,31,50,66,6,7,253,190,2,60,55,24,8,8,14, 7,4,21,9,2,127,52,12,8,6,76,1,7,7,23,36, 55,7,11,0,0,1,0,63,0,0,2,21,2,88,0,57, 0,0,51,35,53,51,50,55,54,55,54,55,54,55,53,38, 39,38,39,38,39,34,43,1,21,22,23,22,23,51,21,47, 1,38,39,38,39,52,39,53,51,50,23,22,23,22,23,22, 23,22,31,1,21,20,7,6,7,6,7,6,244,181,175,56, 55,7,13,44,23,9,1,2,44,14,17,59,53,9,10,88, 8,20,14,66,34,40,71,37,30,43,7,1,181,76,66,11, 14,30,29,3,2,47,10,1,36,11,11,29,35,97,76,24, 3,6,19,60,22,19,142,57,42,13,8,30,3,127,52,12, 8,6,76,1,7,7,23,36,58,6,9,210,30,5,7,15, 29,3,2,53,63,15,156,38,61,19,13,33,16,42,0,1, 0,13,255,56,1,229,2,88,0,25,0,0,1,54,55,54, 55,54,55,54,55,48,55,53,51,21,6,15,1,6,7,6, 7,17,35,17,3,51,1,21,46,14,11,11,2,2,23,11, 1,87,10,33,6,24,34,38,44,87,196,99,1,84,5,7, 6,13,4,2,29,42,5,147,154,55,48,8,34,16,16,4, 254,47,1,234,1,54,0,1,0,51,0,0,2,21,2,88, 0,28,0,0,1,54,55,54,55,54,55,54,55,54,55,48, 55,53,51,21,6,15,1,6,7,6,7,19,33,53,33,1, 51,1,60,46,10,2,2,11,11,2,2,23,11,1,87,10, 33,6,24,34,30,25,171,254,38,1,70,254,178,100,1,85, 5,4,1,1,6,13,4,2,29,42,5,147,154,55,48,8, 34,16,13,3,254,243,76,2,12,0,0,2,0,62,255,56, 2,38,2,88,0,18,0,22,0,0,37,35,53,51,54,55, 54,63,1,17,33,53,33,17,6,7,6,7,6,1,17,35, 17,1,44,62,55,104,31,23,9,3,254,111,1,232,12,24, 5,7,48,254,207,87,33,76,14,42,33,50,13,1,7,76, 254,167,71,40,8,10,73,1,117,253,142,2,114,0,0,1, 0,37,0,0,1,239,2,88,0,26,0,0,1,17,35,17, 38,39,38,39,38,47,1,38,39,34,39,35,53,51,22,23, 22,23,22,23,22,23,22,1,239,87,11,14,5,6,10,12, 6,38,57,2,10,200,207,84,50,6,6,35,22,33,13,1, 1,122,254,134,1,116,55,24,8,8,14,7,4,21,9,2, 76,11,26,3,3,19,31,50,66,6,0,1,0,59,0,0, 2,209,2,88,0,60,0,0,55,22,23,22,23,22,23,59, 1,55,54,55,54,55,54,55,52,53,17,51,17,7,6,7, 6,7,6,7,35,38,39,38,39,38,39,38,53,52,53,17, 51,17,51,54,55,54,55,54,55,54,61,1,51,21,7,6, 7,6,35,34,35,151,13,61,17,16,36,47,8,82,34,38, 18,54,33,23,2,87,3,17,91,22,21,64,71,82,71,63, 67,45,4,4,35,87,99,39,17,6,10,24,3,1,87,3, 10,40,50,79,2,2,224,53,50,13,9,20,3,4,9,10, 27,52,38,40,3,3,1,82,254,174,39,92,71,16,11,31, 2,2,31,35,63,5,6,57,57,3,3,1,82,254,212,2, 12,4,8,24,28,6,9,207,207,36,49,34,50,0,0,1, 0,35,0,0,2,123,2,88,0,45,0,0,1,17,20,7, 6,7,6,15,1,6,43,1,53,51,50,55,54,55,54,55, 54,61,1,17,35,53,33,22,23,22,31,1,17,35,17,38, 39,38,39,38,39,38,39,38,47,1,1,16,9,6,11,13, 37,8,65,84,4,4,50,41,6,6,21,5,17,60,1,3, 155,48,33,12,3,87,11,15,4,6,11,12,2,3,38,59, 10,2,12,254,212,63,28,18,19,24,24,5,43,76,25,3, 4,14,8,24,44,29,1,41,76,21,72,50,64,15,254,134, 1,116,56,25,7,8,15,7,1,2,20,9,2,0,0,12, 0,56,0,2,2,55,1,248,0,15,0,31,0,47,0,63, 0,79,0,95,0,111,0,127,0,143,0,159,0,175,0,191, 0,0,37,50,23,22,21,20,15,1,35,34,39,38,53,52, 55,54,51,50,23,22,21,20,15,1,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,39,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,51,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,37,50,31,1,21,20,7,6,7,34,39,38,53,52, 55,54,51,50,31,1,21,20,7,6,7,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,39,50,23,22,21,20,15,1,35,34,39,38,53,52, 55,54,51,50,23,22,21,20,15,1,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,1,64,34,16,6,31,20,5,33,16,6,30,12,13, 34,16,6,31,20,5,33,16,6,30,12,13,36,14,5,33, 11,11,36,15,5,34,10,221,34,16,6,31,12,13,33,16, 6,30,12,13,34,16,6,31,12,13,33,16,6,30,12,13, 36,14,5,33,11,11,36,15,5,34,10,1,132,35,15,6, 31,15,10,32,16,7,29,12,14,35,15,6,31,15,10,32, 16,7,29,12,14,34,16,5,32,11,12,35,15,6,33,11, 205,36,15,5,30,19,7,33,16,6,30,12,13,36,15,5, 30,19,7,33,16,6,30,12,13,36,14,5,33,11,11,37, 14,5,33,11,113,30,12,14,34,15,6,30,11,14,34,16, 6,30,12,14,34,15,6,30,11,14,34,16,6,34,10,12, 35,15,5,33,10,12,37,14,5,196,30,19,7,34,15,6, 30,11,14,34,16,6,30,19,7,34,15,6,30,11,14,34, 16,6,34,10,12,35,15,5,33,10,12,37,14,5,1,31, 20,5,34,16,5,1,30,12,14,33,16,7,31,20,5,34, 16,5,1,30,12,14,33,16,7,33,11,12,35,15,6,32, 12,12,36,15,5,194,32,11,13,34,15,6,30,11,14,34, 16,6,32,11,13,34,15,6,30,11,14,34,16,6,34,10, 12,35,15,5,33,10,12,37,14,5,0,1,0,52,0,99, 0,163,0,210,0,15,0,0,55,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,107,34,16,6,31,12,13,33, 16,6,30,12,210,30,12,14,34,15,6,30,11,14,34,16, 6,0,0,1,0,50,255,144,0,161,255,255,0,15,0,0, 23,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 105,34,16,6,31,12,13,33,16,6,30,12,1,30,12,14, 34,15,6,30,12,13,34,16,6,0,0,6,0,51,0,100, 0,162,1,196,0,15,0,31,0,47,0,63,0,79,0,95, 0,0,55,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,39,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,51,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,106,36,15,5,30,12,14,33,16,6,30,12,13,36, 15,5,30,12,14,33,16,6,30,12,13,36,14,5,33,11, 11,37,14,5,33,11,12,34,16,6,31,12,13,33,16,6, 30,12,13,34,16,6,31,12,13,33,16,6,30,12,13,36, 14,5,33,11,11,36,15,5,34,10,211,32,11,13,34,15, 6,30,11,14,34,16,6,32,11,13,34,15,6,30,11,14, 34,16,6,34,10,12,35,15,5,33,10,12,37,14,5,241, 30,19,7,34,15,6,30,11,14,34,16,6,30,19,7,34, 15,6,30,11,14,34,16,6,34,10,12,35,15,5,33,10, 12,37,14,5,0,6,0,44,255,16,0,156,0,112,0,15, 0,31,0,47,0,63,0,79,0,95,0,0,23,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,51,34,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,39,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,51,34,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,100,34,16,6, 31,12,13,33,16,6,30,12,13,34,16,6,31,12,13,33, 16,6,30,12,13,36,14,5,33,11,11,36,15,5,34,10, 12,34,16,6,31,12,13,34,16,6,31,12,13,34,16,6, 31,12,13,34,16,6,31,12,13,35,15,6,32,12,12,36, 15,5,34,10,129,30,12,14,34,15,6,30,11,14,34,16, 6,30,12,14,34,15,6,30,11,14,34,16,6,34,10,12, 35,15,5,33,10,12,37,14,5,241,30,12,14,34,15,6, 31,11,13,34,16,6,30,12,14,34,15,6,31,11,13,34, 16,6,32,12,12,34,16,5,33,10,12,37,14,5,0,6, 0,106,0,1,1,138,0,113,0,15,0,31,0,47,0,63, 0,79,0,95,0,0,37,50,23,22,21,20,15,1,35,34, 39,38,53,52,55,54,51,50,23,22,21,20,15,1,35,34, 39,38,53,52,55,54,51,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,39,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,51,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,1,82,34,16,6,31,20,5,33,16, 6,30,12,13,34,16,6,31,20,5,33,16,6,30,12,13, 36,14,5,33,11,11,36,15,5,34,10,189,34,16,6,31, 12,13,33,16,6,30,12,13,34,16,6,31,12,13,33,16, 6,30,12,13,36,14,5,33,11,11,36,15,5,34,10,112, 30,12,14,34,15,6,30,11,14,34,16,6,30,12,14,34, 15,6,30,11,14,34,16,6,34,10,12,35,15,5,33,10, 12,37,14,5,1,30,12,14,34,15,6,30,11,14,34,16, 6,30,12,14,34,15,6,30,11,14,34,16,6,34,10,12, 35,15,5,33,10,12,37,14,5,0,0,6,0,106,255,146, 1,138,0,113,0,15,0,31,0,47,0,63,0,79,0,95, 0,0,37,50,23,22,21,20,15,1,35,34,39,38,53,52, 55,54,51,50,23,22,21,20,15,1,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,39,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,1,82,34,16,6,31,20,5,33,16,6,30,12,13, 34,16,6,31,20,5,33,16,6,30,12,13,36,14,5,33, 11,11,36,15,5,34,10,189,34,16,6,31,12,13,33,16, 6,30,12,13,34,16,6,31,12,13,33,16,6,30,12,13, 36,14,5,33,11,11,36,15,5,34,10,1,30,12,14,34, 15,6,30,11,14,34,16,6,30,12,14,34,15,6,30,11, 14,34,16,6,34,10,12,35,15,5,33,10,12,37,14,5, 112,30,12,14,34,15,6,30,11,14,34,16,6,30,12,14, 34,15,6,30,11,14,34,16,6,34,10,12,35,15,5,33, 10,12,37,14,5,0,0,6,0,106,255,147,1,138,0,112, 0,15,0,31,0,47,0,63,0,79,0,95,0,0,37,50, 23,22,21,20,15,1,35,34,39,38,53,52,55,54,51,50, 23,22,21,20,15,1,35,34,39,38,53,52,55,54,51,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,7,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,54,51,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,1,82, 34,16,6,31,20,5,33,16,6,30,12,13,34,16,6,31, 20,5,33,16,6,30,12,13,36,14,5,33,11,11,36,15, 5,34,10,189,34,16,6,31,12,13,33,16,6,30,12,13, 34,16,6,31,12,13,33,16,6,30,12,13,36,14,5,33, 11,11,36,15,5,34,10,112,30,12,14,34,15,6,30,11, 14,34,16,6,30,12,14,34,15,6,30,11,14,34,16,6, 34,10,12,35,15,5,33,10,12,37,14,5,110,30,12,14, 34,15,6,30,11,14,34,16,6,30,12,14,34,15,6,30, 11,14,34,16,6,34,10,12,35,15,5,33,10,12,37,14, 5,0,0,6,0,84,0,97,1,53,1,194,0,15,0,31, 0,47,0,63,0,79,0,95,0,0,55,50,23,22,21,20, 15,1,35,34,39,38,53,52,55,54,51,50,23,22,21,20, 15,1,35,34,39,38,53,52,55,54,51,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,39,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,51,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,51,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,254,34,15,6,31,20, 4,34,16,6,31,12,13,34,15,6,31,20,4,34,16,6, 31,12,13,35,15,6,32,12,12,36,14,5,33,10,127,36, 15,5,31,12,13,33,16,6,30,12,13,36,15,5,31,12, 13,33,16,6,30,12,13,36,14,5,31,12,12,36,15,5, 33,11,208,30,12,14,35,15,5,31,11,13,34,16,6,30, 12,14,35,15,5,31,11,13,34,16,6,32,12,12,34,16, 5,32,11,12,37,14,5,242,32,11,13,34,15,6,30,12, 13,34,16,6,32,11,13,34,15,6,30,12,13,34,16,6, 34,10,12,34,15,6,33,10,12,37,14,5,0,6,0,87, 255,15,1,57,0,112,0,15,0,31,0,47,0,63,0,79, 0,95,0,0,5,50,23,22,21,20,15,1,35,34,39,38, 53,52,55,54,51,50,23,22,21,20,15,1,35,34,39,38, 53,52,55,54,51,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,39,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,51,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,51,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,1,1,34,16,6,31,20,5,35,15,5,30, 12,13,34,16,6,31,20,5,35,15,5,30,12,13,36,14, 5,32,11,12,36,15,5,34,10,127,36,15,5,30,12,14, 33,16,6,31,11,13,36,15,5,30,12,14,33,16,6,31, 11,13,34,16,5,31,12,12,37,14,5,33,11,130,30,12, 14,34,15,6,31,11,13,34,16,6,30,12,14,34,15,6, 31,11,13,34,16,6,34,10,12,36,14,5,33,10,12,37, 14,5,242,32,11,13,34,15,6,30,12,13,34,16,6,32, 11,13,34,15,6,30,12,13,34,16,6,32,12,12,34,15, 6,33,10,12,37,14,5,0,0,13,0,26,0,3,2,36, 2,200,0,15,0,31,0,47,0,63,0,79,0,95,0,111, 0,127,0,143,0,159,0,175,0,191,0,195,0,0,1,50, 31,1,21,20,7,6,7,34,39,38,53,52,55,54,51,50, 31,1,21,20,7,6,7,34,39,38,53,52,55,54,51,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,7,50, 31,1,21,20,7,6,35,34,39,38,53,52,55,54,51,50, 31,1,21,20,7,6,35,34,39,38,53,52,55,54,51,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,19,50, 23,22,21,20,15,1,35,34,39,38,53,52,55,54,51,50, 23,22,21,20,15,1,35,34,39,38,53,52,55,54,51,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,39,50, 31,1,21,20,15,1,35,34,39,38,53,52,55,54,51,50, 31,1,21,20,15,1,35,34,39,38,53,52,55,54,51,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,55,21, 33,53,1,121,35,15,6,31,15,10,32,16,7,29,12,14, 35,15,6,31,15,10,32,16,7,29,12,14,34,16,5,32, 11,12,35,15,6,33,11,188,34,16,6,31,12,13,33,16, 6,30,12,13,34,16,6,31,12,13,33,16,6,30,12,13, 36,14,5,33,11,11,36,15,5,34,10,75,34,16,6,31, 20,5,33,16,6,30,12,13,34,16,6,31,20,5,33,16, 6,30,12,13,36,14,5,33,11,11,36,15,5,34,10,12, 34,16,6,31,20,5,33,16,6,30,12,13,34,16,6,31, 20,5,33,16,6,30,12,13,36,14,5,33,11,11,36,15, 5,34,10,248,253,246,2,200,31,20,5,34,16,5,1,30, 12,14,33,16,7,31,20,5,34,16,5,1,30,12,14,33, 16,7,33,11,12,35,15,6,32,12,12,36,15,5,1,30, 19,7,34,15,6,30,11,14,34,16,6,30,19,7,34,15, 6,30,11,14,34,16,6,34,10,12,35,15,5,33,10,12, 37,14,5,253,171,30,12,14,34,15,6,30,11,14,34,16, 6,30,12,14,34,15,6,30,11,14,34,16,6,34,10,12, 35,15,5,33,10,12,37,14,5,240,30,19,7,34,15,6, 30,11,14,34,16,6,30,19,7,34,15,6,30,11,14,34, 16,6,34,10,12,35,15,5,33,10,12,37,14,5,170,92, 92,0,0,4,0,26,0,245,2,36,2,12,0,15,0,31, 0,47,0,51,0,0,1,50,23,22,21,20,15,1,35,34, 39,38,53,52,55,54,51,50,23,22,21,20,15,1,35,34, 39,38,53,52,55,54,51,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,55,21,33,53,1,32,36,15,5,31, 20,5,33,16,6,30,12,13,36,15,5,31,20,5,33,16, 6,30,12,13,36,14,5,33,11,11,36,15,5,33,11,248, 253,246,1,100,32,11,13,34,15,6,30,11,14,34,16,6, 32,11,13,34,15,6,30,11,14,34,16,6,34,10,12,35, 15,5,33,10,12,37,14,5,168,92,92,0,0,1,0,136, 0,177,1,224,2,109,0,6,0,0,1,55,7,39,55,3, 55,1,176,48,24,140,50,230,77,1,16,31,126,24,30,1, 89,45,0,18,0,26,0,228,2,36,2,210,0,15,0,31, 0,47,0,63,0,79,0,95,0,99,0,103,0,119,0,135, 0,151,0,155,0,159,0,175,0,191,0,207,0,211,0,215, 0,0,1,50,31,1,21,20,7,6,7,34,39,38,53,52, 55,54,51,50,31,1,21,20,7,6,7,34,39,38,53,52, 55,54,51,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,3,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,37,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,19,50,31,1,21,20,7,6,35,34,39,38,53,52, 55,54,19,35,3,51,23,21,33,53,5,50,31,1,21,20, 7,6,35,34,39,38,53,52,55,54,37,50,31,1,21,20, 7,6,35,34,39,38,53,52,55,54,19,50,31,1,21,20, 7,6,35,34,39,38,53,52,55,54,19,35,3,51,23,21, 33,53,5,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,37,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,3,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,19,3,35,19,1,33,21,33,1,199,35,15,6,31, 15,10,32,16,7,29,12,14,35,15,6,31,15,10,32,16, 7,29,12,14,34,16,5,32,11,12,35,15,6,33,11,10, 34,15,6,30,12,13,34,16,6,30,12,254,193,34,16,6, 31,12,13,33,16,6,30,12,13,34,16,6,31,12,13,33, 16,6,30,12,231,101,1,101,207,253,246,1,175,34,15,6, 30,12,13,34,16,6,30,12,254,193,34,16,6,31,12,13, 33,16,6,30,12,13,34,16,6,31,12,13,33,16,6,30, 12,231,101,1,101,207,253,246,1,175,35,15,6,32,12,12, 36,14,5,33,10,254,167,36,14,5,33,11,11,36,15,5, 34,10,12,36,14,5,33,11,11,36,15,5,34,10,206,1, 101,1,1,51,253,246,2,10,2,177,31,20,5,34,16,5, 1,30,12,14,33,16,7,31,20,5,34,16,5,1,30,12, 14,33,16,7,33,11,12,35,15,6,32,12,12,36,15,5, 254,207,31,20,5,34,16,6,31,12,13,32,17,7,2,30, 19,7,34,15,6,30,11,14,34,16,6,1,46,30,19,7, 34,15,6,30,11,14,34,16,6,254,52,1,238,198,92,92, 140,31,20,5,34,16,6,31,12,13,32,17,7,2,30,19, 7,34,15,6,30,11,14,34,16,6,1,46,30,19,7,34, 15,6,30,11,14,34,16,6,254,52,1,238,198,92,92,140, 33,11,12,35,15,6,34,10,12,36,15,5,2,34,10,12, 35,15,5,33,10,12,37,14,5,1,46,34,10,12,35,15, 5,33,10,12,37,14,5,254,52,1,238,254,18,1,40,92, 0,1,0,35,255,119,1,159,2,122,0,29,0,0,33,35, 6,7,35,54,55,54,55,54,61,1,52,55,52,39,38,47, 1,38,39,51,22,31,1,22,21,20,7,51,1,159,220,33, 44,83,57,46,1,21,20,1,15,1,1,28,16,25,85,31, 24,27,9,27,171,78,59,79,135,3,65,56,45,42,28,14, 75,46,3,3,90,50,37,41,68,76,23,55,79,202,0,1, 0,57,1,116,1,130,3,50,0,30,0,0,1,35,7,6, 7,6,7,35,54,63,1,54,55,54,39,52,39,38,39,38, 39,51,22,23,22,23,20,7,6,7,51,1,130,189,12,20, 13,6,6,83,33,24,21,20,14,4,1,2,5,15,30,15, 85,23,19,13,8,4,1,2,140,1,198,27,29,14,6,6, 35,41,37,35,64,16,31,25,26,38,28,54,16,29,47,34, 37,64,35,13,15,0,0,1,255,184,0,0,2,26,1,171, 0,7,0,0,41,1,53,33,53,33,53,33,2,26,253,158, 2,4,254,220,1,130,90,249,88,0,0,1,255,184,255,25, 2,97,2,29,0,34,0,0,5,34,39,38,53,52,55,39, 33,53,33,1,55,1,51,21,35,34,7,34,39,38,53,39, 6,7,23,55,22,51,22,21,20,7,6,1,221,40,12,3, 25,116,254,109,1,166,254,251,77,1,12,175,28,19,10,100, 14,3,24,19,39,102,15,7,11,35,25,8,231,33,8,9, 19,21,141,90,1,150,45,254,61,90,1,35,7,9,6,30, 36,125,2,1,12,32,29,19,5,0,0,1,255,184,255,25, 2,97,2,29,0,37,0,0,5,34,39,38,53,52,55,39, 33,53,51,55,7,51,1,55,1,51,21,35,34,7,34,39, 38,53,39,6,7,23,55,22,51,22,21,20,7,6,1,221, 40,12,3,25,116,254,109,212,98,40,152,254,251,77,1,12, 175,28,19,10,100,14,3,24,19,39,102,15,7,11,35,25, 8,231,33,8,9,19,21,141,90,154,154,1,150,45,254,61, 90,1,35,7,9,6,30,36,125,2,1,12,32,29,19,5, 0,2,0,107,255,113,1,217,1,173,0,3,0,18,0,0, 23,35,53,51,55,33,53,33,55,53,52,39,38,35,53,50, 23,22,21,241,121,121,232,254,146,1,40,2,39,40,151,178, 59,61,143,83,60,90,120,1,83,22,23,90,25,24,83,0, 0,1,0,107,0,0,1,217,1,173,0,14,0,0,41,1, 53,33,55,53,52,39,38,35,53,50,23,22,21,1,217,254, 146,1,40,2,39,40,151,178,59,61,90,120,1,83,22,23, 90,25,24,83,0,2,0,109,255,187,2,133,1,173,0,22, 0,38,0,0,5,35,17,35,22,21,20,7,6,7,6,35, 34,39,38,39,38,53,52,55,54,51,5,1,50,55,54,53, 52,39,38,35,34,7,6,21,20,23,22,2,133,89,131,10, 14,39,75,13,13,69,53,26,11,13,66,46,68,1,100,254, 149,47,27,16,38,24,32,43,34,23,47,25,69,1,148,44, 69,88,33,86,15,2,59,29,34,38,44,118,64,45,2,254, 162,54,31,37,69,43,28,57,39,36,75,36,19,0,0,2, 0,100,0,0,2,26,1,171,0,15,0,31,0,0,55,52, 55,54,51,50,23,22,21,20,7,6,35,34,39,38,55,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,100,76, 60,84,103,62,53,77,59,82,104,62,54,217,60,40,27,54, 36,43,63,38,24,53,37,213,102,63,49,71,62,81,104,61, 48,71,61,205,51,33,38,60,39,26,52,31,38,57,40,29, 0,1,0,177,255,86,1,92,1,115,0,19,0,0,1,50, 21,20,15,1,6,7,39,54,55,54,55,38,39,38,53,52, 55,54,1,59,32,5,48,11,7,58,10,36,16,6,71,21, 17,16,23,1,115,215,115,49,133,26,3,16,6,94,42,6, 123,53,45,52,68,15,21,0,0,1,255,184,0,0,2,79, 1,34,0,14,0,0,33,35,39,21,35,39,21,33,53,51, 53,23,52,55,23,2,79,36,127,74,122,254,208,248,195,6, 214,112,112,115,115,90,189,195,92,114,193,0,0,2,255,184, 255,95,2,170,2,28,0,9,0,12,0,0,5,7,39,33, 53,33,1,55,1,51,7,35,23,2,170,175,95,254,28,1, 180,254,240,74,1,16,244,46,166,68,7,154,161,90,1,150, 44,254,62,90,95,0,0,1,255,184,255,95,2,170,2,28, 0,9,0,0,5,7,39,33,53,33,1,55,1,51,2,170, 175,95,254,28,1,180,254,240,74,1,16,244,7,154,161,90, 1,150,44,254,62,0,0,1,255,184,0,0,1,192,1,17, 0,7,0,0,37,39,7,33,53,33,53,23,1,192,106,7, 254,105,1,101,163,17,79,96,90,183,193,0,0,7,255,112, 255,83,2,245,3,0,0,15,0,31,0,47,0,63,0,65, 0,81,0,111,0,0,23,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,3,50,31,1,21,20,7,6,35,34, 39,38,53,52,55,54,51,50,31,1,21,20,15,1,35,34, 39,38,53,52,55,54,39,50,31,1,21,20,7,6,35,34, 39,38,53,52,55,54,1,23,55,50,55,54,53,52,39,38, 35,34,7,6,21,20,23,22,37,51,53,23,21,39,7,35, 7,17,35,22,21,20,7,6,7,6,35,34,39,38,39,38, 53,52,55,54,51,5,222,34,16,6,31,12,13,33,16,6, 30,12,85,34,16,6,31,12,13,33,16,6,30,12,209,34, 16,6,31,20,5,33,16,6,30,12,85,34,16,6,31,12, 13,33,16,6,30,12,254,159,1,238,47,27,16,38,24,32, 43,34,23,47,25,1,141,134,163,106,7,184,91,131,10,14, 39,75,13,13,69,54,26,11,12,66,46,68,1,100,62,30, 12,14,34,15,6,30,11,14,34,16,6,2,178,30,19,7, 34,15,6,30,11,14,34,16,6,30,19,7,34,15,6,30, 11,14,34,16,6,140,30,19,7,34,15,6,30,11,14,34, 16,6,253,0,1,79,53,32,37,69,43,28,57,39,36,75, 36,19,14,183,193,63,79,98,68,1,148,44,69,88,33,86, 15,2,60,29,34,36,45,118,64,45,2,0,0,1,0,97, 255,40,2,37,1,219,0,19,0,0,5,35,54,53,52,35, 34,7,3,37,21,5,23,54,51,50,23,22,21,20,1,215, 90,92,64,68,116,128,1,97,254,254,69,92,73,91,25,7, 216,149,87,72,79,1,93,113,90,85,180,59,82,25,30,110, 0,1,255,184,0,0,2,112,2,152,0,6,0,0,41,1, 53,33,1,55,1,2,112,253,72,2,102,254,85,74,1,179, 90,1,251,67,253,205,0,2,0,107,255,118,2,133,1,171, 0,7,0,11,0,0,41,1,7,35,19,35,53,33,3,53, 35,7,2,133,254,145,61,83,189,216,2,26,79,159,94,138, 1,221,88,254,175,249,249,0,0,1,0,107,254,167,2,147, 1,3,0,5,0,0,63,1,1,7,1,7,107,115,1,181, 39,254,191,60,158,101,253,200,36,1,144,55,0,3,255,184, 255,255,2,177,1,168,0,30,0,48,0,65,0,0,1,50, 23,22,21,20,7,6,35,39,43,1,34,39,21,33,53,33, 38,39,52,55,54,55,54,51,50,23,22,23,54,23,52,39, 38,35,34,7,6,7,6,7,20,21,22,59,1,55,54,39, 53,52,39,38,35,34,7,6,21,20,23,22,23,54,55,54, 2,47,83,32,15,71,36,64,70,1,11,27,170,254,201,1, 23,39,1,31,8,8,34,61,56,45,10,41,53,119,37,25, 31,39,34,4,5,16,3,34,28,26,21,85,233,15,27,42, 40,26,19,77,22,43,19,7,1,1,111,101,45,53,114,38, 17,1,85,85,90,43,97,89,55,13,7,30,27,7,58,35, 198,54,39,27,50,5,8,31,95,6,5,9,4,12,146,20, 34,18,38,34,31,42,78,42,13,17,48,78,12,0,0,3, 0,167,255,50,2,177,1,168,0,37,0,55,0,72,0,0, 1,50,23,22,21,20,7,6,35,39,43,1,34,39,6,15, 1,39,55,38,39,38,39,38,39,38,53,52,55,54,55,54, 51,50,23,22,23,54,23,52,39,38,35,34,7,6,7,6, 7,20,21,22,59,1,55,54,39,53,52,39,38,35,34,7, 6,21,20,23,22,23,54,55,54,2,47,83,32,15,71,36, 64,70,1,11,8,32,4,40,100,72,154,52,55,2,3,37, 7,11,31,8,8,34,61,56,45,10,41,53,119,37,25,31, 39,34,4,5,16,3,34,28,26,21,85,233,15,27,42,40, 26,19,77,22,43,19,7,1,1,111,101,45,53,114,38,17, 1,4,13,63,134,50,180,14,44,2,2,40,24,34,46,89, 55,13,7,30,27,7,58,35,198,54,39,27,50,5,8,31, 95,6,5,9,4,12,146,20,34,18,38,34,31,42,78,42, 13,17,48,78,12,0,0,1,255,184,0,0,2,164,2,28, 0,24,0,0,37,6,35,34,39,38,39,6,7,33,53,37, 50,55,3,55,19,22,23,22,51,50,55,54,55,2,164,107, 70,80,52,6,7,36,6,254,128,1,38,56,44,220,65,188, 42,31,38,42,58,75,4,6,75,62,82,10,12,68,49,90, 1,41,1,109,43,254,192,66,28,35,66,4,5,0,0,2, 255,184,0,0,2,28,2,64,0,15,0,28,0,0,41,1, 53,33,39,6,35,34,39,38,39,38,53,52,63,1,3,39, 48,15,1,49,6,21,20,23,22,51,50,2,28,253,156,2, 10,12,62,37,67,56,47,13,3,127,197,45,22,119,28,30, 60,13,15,70,90,145,6,25,18,74,19,19,99,42,51,254, 243,165,29,11,27,36,55,12,3,0,0,2,255,184,0,0, 2,28,2,64,0,15,0,26,0,0,35,19,23,22,21,20, 7,6,7,6,35,34,39,7,33,21,1,22,51,50,55,54, 53,52,39,38,39,72,63,197,127,41,10,12,56,67,37,62, 12,2,10,254,8,41,70,71,14,3,30,12,135,2,64,51, 42,99,78,38,9,5,25,6,145,90,1,51,8,49,10,11, 36,27,11,29,0,1,0,127,254,147,2,130,1,16,0,43, 0,0,1,33,53,33,34,39,38,39,38,39,38,53,52,55, 22,23,22,23,22,59,1,54,51,53,23,21,39,7,35,34, 39,38,39,6,21,20,23,22,23,22,23,22,21,20,2,105, 254,41,1,140,9,73,211,93,12,10,7,27,10,32,43,27, 68,60,25,12,1,162,105,9,172,56,21,4,3,4,34,55, 184,60,16,73,254,147,90,29,84,124,16,17,10,43,95,129, 16,65,91,3,9,2,180,194,62,79,93,29,5,6,4,10, 27,33,55,87,29,9,39,31,10,0,0,2,255,184,0,0, 2,38,1,171,0,14,0,18,0,0,41,1,34,39,38,39, 38,39,7,21,35,53,51,17,33,3,53,35,21,2,38,254, 205,13,26,34,7,2,2,25,206,224,1,142,70,253,22,28, 11,4,4,4,65,100,1,71,254,185,239,239,0,2,0,107, 0,0,1,217,2,96,0,3,0,18,0,0,1,35,53,51, 19,33,53,33,55,53,52,39,38,35,53,50,23,22,21,1, 29,123,123,188,254,146,1,40,2,39,40,151,178,59,61,2, 14,82,253,160,90,120,1,83,22,23,90,25,24,83,0,1, 255,184,0,0,2,133,1,171,0,15,0,0,33,35,34,39, 7,33,53,33,39,35,53,33,23,7,23,51,2,133,205,47, 21,24,254,92,1,176,10,200,1,193,1,160,10,195,59,59, 90,247,90,89,1,247,0,1,0,99,255,246,2,107,1,235, 0,30,0,0,37,1,6,21,20,51,50,55,54,55,23,22, 23,22,23,7,38,39,34,7,6,35,34,39,38,53,52,55, 54,55,1,2,107,254,175,110,42,24,49,63,4,13,35,50, 3,2,40,29,40,14,52,54,18,85,21,5,49,53,91,1, 71,4,1,136,192,74,42,18,23,1,1,10,66,3,3,57, 38,12,24,23,79,21,24,73,104,103,94,254,108,0,0,3, 0,0,0,0,1,140,3,18,0,15,0,18,0,20,0,0, 1,7,39,7,39,55,39,55,23,55,23,7,23,7,39,7, 39,55,39,3,23,1,31,24,13,38,6,37,24,26,89,40, 22,44,36,26,34,53,7,39,61,246,1,2,100,16,43,24, 29,22,106,14,65,24,15,27,30,16,30,33,27,23,53,253, 12,1,0,3,0,0,254,207,1,189,0,1,0,15,0,18, 0,20,0,0,5,55,23,55,23,7,23,7,39,7,39,55, 39,55,23,55,23,7,23,1,23,1,109,24,13,38,5,36, 24,26,89,40,22,43,35,26,34,53,7,40,62,254,106,1, 131,16,43,24,29,22,106,14,65,23,14,27,30,16,30,33, 26,24,53,1,21,1,0,3,0,0,254,247,1,79,2,233, 0,3,0,7,0,9,0,0,5,51,21,35,17,51,21,35, 1,23,1,44,35,35,35,35,254,212,1,115,150,3,242,150, 253,174,1,0,0,3,0,0,0,0,1,224,3,8,0,3, 0,7,0,9,0,0,1,23,7,47,1,23,7,39,3,23, 1,194,30,75,30,55,30,75,30,245,1,2,189,18,129,17, 205,18,129,17,253,123,1,0,0,3,0,0,254,252,1,184, 0,1,0,3,0,7,0,9,0,0,5,23,7,47,1,23, 7,47,1,23,1,154,30,75,30,55,30,75,30,205,1,113, 18,129,17,205,18,129,17,169,1,0,0,3,0,0,0,0, 1,248,3,0,0,15,0,31,0,33,0,0,1,50,23,22, 21,20,15,1,35,34,39,38,53,52,55,54,39,50,31,1, 21,20,15,1,35,34,39,38,53,52,55,54,1,23,1,192, 36,15,5,31,20,5,33,16,6,30,12,152,34,15,6,31, 20,4,34,16,6,31,12,254,242,1,2,164,32,11,13,34, 15,6,30,11,14,34,16,6,92,30,19,7,35,15,5,31, 11,13,34,16,6,253,1,1,0,2,0,0,0,0,1,224, 3,8,0,11,0,13,0,0,1,7,39,55,39,7,39,55, 23,7,39,55,1,23,1,140,56,33,56,32,56,30,75,160, 75,30,55,254,82,1,2,174,94,19,95,19,96,17,130,93, 129,17,95,253,103,1,0,2,0,0,254,252,1,184,0,1, 0,11,0,13,0,0,5,55,23,7,23,55,23,7,39,55, 23,7,39,23,1,33,57,32,56,32,56,30,75,160,75,30, 55,255,1,170,94,19,95,19,96,17,130,93,129,17,95,151, 1,0,0,3,0,0,255,31,1,149,0,1,0,3,0,7, 0,9,0,0,5,51,21,35,39,51,21,35,39,23,1,114, 35,35,150,35,35,220,1,75,150,150,150,226,1,0,0,3, 0,0,254,246,1,154,0,1,0,3,0,7,0,9,0,0, 5,23,7,47,1,23,7,47,1,23,1,124,30,75,30,105, 30,75,30,125,1,64,18,129,17,75,18,129,17,250,1,0, 0,2,0,0,0,0,1,91,2,202,0,11,0,13,0,0, 19,53,51,53,35,53,51,21,35,21,51,21,1,23,169,72, 72,178,73,73,254,165,1,2,76,34,60,32,32,60,34,253, 181,1,0,2,0,0,255,68,1,210,0,1,0,11,0,13, 0,0,5,53,51,53,35,53,51,21,35,21,51,21,37,23, 1,32,72,72,178,73,73,254,46,1,188,34,60,32,32,60, 34,189,1,0,0,2,0,0,255,79,1,118,0,1,0,15, 0,17,0,0,5,50,23,22,21,20,15,1,35,34,39,38, 53,52,55,54,37,23,1,62,34,16,6,31,20,5,33,16, 6,30,12,254,207,1,66,30,12,14,34,15,6,30,11,14, 34,16,6,67,1,0,0,3,0,0,0,0,1,123,3,15, 0,15,0,24,0,26,0,0,19,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,23,7,47,1,53,51,55,23, 7,1,23,249,29,11,4,27,8,9,28,13,4,27,9,139, 30,47,131,141,43,24,43,254,176,1,2,149,26,9,9,30, 11,4,26,9,10,29,12,3,85,10,121,4,33,59,18,57, 253,61,1,0,0,3,0,0,255,1,1,205,0,1,0,14, 0,23,0,25,0,0,5,50,23,22,21,20,15,1,34,39, 38,53,52,55,54,7,55,31,1,21,35,7,39,55,37,23, 1,121,30,11,4,27,18,29,11,4,27,8,115,31,46,131, 140,43,25,43,254,216,1,45,27,9,9,29,12,3,27,8, 9,30,11,4,2,10,119,6,34,59,19,56,181,1,0,2, 0,0,0,0,1,118,2,217,0,15,0,17,0,0,1,50, 31,1,21,20,15,1,35,34,39,38,53,52,55,54,1,23, 1,62,34,16,6,31,20,5,33,16,6,30,12,254,207,1, 2,217,30,19,7,34,15,6,30,11,14,34,16,6,253,40, 1,0,0,2,0,0,255,102,1,113,0,1,0,3,0,5, 0,0,5,35,53,51,37,23,1,113,98,98,254,143,1,154, 93,62,1,0,0,2,0,0,0,0,1,118,2,217,0,15, 0,17,0,0,1,50,31,1,21,20,15,1,35,34,39,38, 53,52,55,54,1,23,1,62,34,16,6,31,20,5,33,16, 6,30,12,254,207,1,2,217,30,19,7,34,15,6,30,11, 14,34,16,6,253,40,1,0,0,2,0,0,255,79,1,118, 0,1,0,15,0,17,0,0,5,50,23,22,21,20,15,1, 35,34,39,38,53,52,55,54,37,23,1,62,34,16,6,31, 20,5,33,16,6,30,12,254,207,1,66,30,12,14,34,15, 6,30,11,14,34,16,6,67,1,0,0,3,0,0,0,0, 1,120,3,0,0,15,0,31,0,33,0,0,1,50,23,22, 21,20,15,1,35,34,39,38,53,52,55,54,55,50,31,1, 21,20,15,1,35,34,39,38,53,52,55,54,1,23,1,64, 36,15,5,30,19,7,33,16,6,30,12,13,34,16,6,31, 20,5,33,16,6,30,12,254,205,1,2,86,32,11,13,34, 15,6,30,11,14,34,16,6,170,30,19,7,34,15,6,30, 11,14,34,16,6,253,1,1,0,3,0,0,254,177,1,119, 0,1,0,15,0,31,0,33,0,0,5,50,23,22,21,20, 15,1,35,34,39,38,53,52,55,54,55,50,23,22,21,20, 15,1,35,34,39,38,53,52,55,54,37,23,1,63,34,16, 6,31,20,5,35,15,5,30,12,13,34,15,6,31,20,4, 34,16,6,31,12,254,206,1,224,30,12,14,34,15,6,31, 11,13,34,16,6,170,30,12,14,35,15,5,30,12,13,34, 16,6,55,1,0,4,0,0,0,0,1,218,3,0,0,15, 0,31,0,47,0,49,0,0,19,50,31,1,21,20,7,6, 35,34,39,38,53,52,55,54,51,50,31,1,21,20,15,1, 35,34,39,38,53,52,55,54,39,50,31,1,21,20,15,1, 35,34,39,38,53,52,55,54,1,23,222,34,16,6,31,12, 13,33,16,6,30,12,209,34,16,6,31,20,5,33,16,6, 30,12,85,34,16,6,31,20,5,33,16,6,30,12,254,205, 1,2,116,30,19,7,34,15,6,30,11,14,34,16,6,30, 19,7,34,15,6,30,11,14,34,16,6,140,30,19,7,34, 15,6,30,11,14,34,16,6,253,1,1,0,0,4,0,0, 254,201,1,218,0,1,0,15,0,31,0,47,0,49,0,0, 23,52,55,54,51,50,23,22,21,20,7,6,35,34,39,38, 55,52,55,54,51,50,23,22,21,20,15,1,35,34,39,38, 7,50,23,22,21,20,15,1,35,34,39,38,53,52,55,54, 37,23,167,31,12,12,36,15,5,34,10,12,34,16,5,196, 31,12,12,36,15,5,34,21,1,34,16,5,44,34,16,6, 31,20,5,33,16,6,30,12,254,206,1,110,33,17,6,32, 11,13,38,13,4,32,11,12,33,17,6,32,11,13,38,13, 4,32,11,78,30,12,14,34,15,6,30,12,13,34,16,6, 201,1,0,2,0,0,0,0,1,216,3,12,0,3,0,5, 0,0,19,37,23,5,3,23,170,1,30,16,254,230,190,1, 2,190,78,44,96,253,129,1,0,2,0,0,255,72,1,218, 0,1,0,3,0,5,0,0,23,5,7,37,39,23,186,1, 32,20,254,226,168,1,30,82,72,102,83,1,0,1,0,167, 2,55,1,212,3,33,0,35,0,0,19,23,55,23,7,23, 55,23,7,23,55,23,7,23,55,23,7,23,7,39,7,39, 55,39,7,39,55,39,7,39,55,39,7,39,55,39,178,30, 22,31,21,30,22,30,21,31,20,36,22,31,23,34,22,36, 15,36,23,35,24,30,23,34,24,29,24,30,23,30,24,32, 23,30,2,239,9,59,9,59,9,59,8,62,9,63,10,63, 10,64,10,64,12,40,13,68,13,67,10,67,12,67,11,66, 12,64,12,66,12,65,11,0,0,14,0,0,0,0,1,165, 3,27,0,11,0,23,0,35,0,46,0,57,0,71,0,81, 0,92,0,106,0,116,0,127,0,139,0,148,0,150,0,0, 19,23,53,51,21,51,21,35,7,35,39,35,55,52,55,50, 23,22,21,20,7,34,39,38,53,52,55,50,23,22,21,20, 7,34,39,38,23,50,55,52,38,35,34,7,20,23,22,23, 34,39,52,54,51,50,23,20,7,6,39,20,7,6,35,34, 39,38,53,52,55,54,51,50,39,52,51,22,23,20,7,6, 35,34,23,34,39,52,54,51,50,23,20,7,6,39,20,7, 6,35,34,39,38,53,52,55,54,51,50,39,52,51,22,23, 20,7,6,35,34,23,52,39,34,6,21,20,23,50,55,54, 39,52,39,34,7,6,21,20,23,50,55,54,53,52,39,38, 35,34,20,51,54,1,23,213,86,39,83,82,1,39,1,85, 149,22,10,6,6,22,14,6,2,22,10,6,6,22,14,6, 2,22,19,3,12,10,20,2,16,3,4,19,3,12,10,20, 2,16,3,114,16,3,3,12,9,1,6,6,10,20,42,22, 18,4,17,2,3,22,155,19,3,12,10,20,2,16,3,114, 16,3,3,12,9,1,6,6,10,20,42,22,18,4,17,2, 3,22,177,22,10,12,22,16,5,1,133,22,10,6,6,22, 16,5,1,16,3,3,22,22,18,254,242,1,2,204,1,80, 79,37,81,81,81,19,3,6,6,10,20,2,15,4,3,19, 3,6,6,10,20,2,15,4,19,22,10,12,22,16,5,1, 122,22,10,12,22,16,5,1,23,16,5,1,14,2,6,10, 6,6,99,22,4,18,17,4,1,122,22,10,12,22,16,5, 1,23,16,5,1,14,2,6,10,6,6,99,22,4,18,17, 4,1,100,19,3,12,10,20,2,16,3,4,19,3,6,6, 10,19,3,16,3,124,16,5,1,44,4,253,27,1,0,2, 255,21,1,253,0,48,2,177,0,3,0,24,0,0,3,7, 39,55,23,6,7,6,35,34,39,38,39,38,53,52,51,50, 23,22,51,50,55,54,55,49,47,47,47,144,18,58,37,29, 53,55,22,9,2,12,9,5,46,69,24,28,37,18,2,131, 45,45,46,100,35,28,17,54,21,19,6,3,12,8,70,16, 19,35,0,1,255,112,2,28,255,214,2,130,0,3,0,0, 3,7,39,55,42,51,51,51,2,79,51,51,51,0,0,1, 0,41,255,254,2,139,1,205,0,70,0,0,19,50,23,22, 21,20,7,22,23,22,51,50,55,53,35,53,51,21,35,17, 39,53,6,35,34,39,38,39,22,21,20,7,6,35,34,39, 38,39,38,53,52,51,50,23,22,23,22,51,50,53,52,39, 38,35,34,7,39,54,55,54,51,54,55,54,53,52,35,34, 7,39,54,201,68,55,43,38,3,47,30,29,48,49,135,251, 71,45,28,44,35,23,6,4,5,62,38,43,82,91,21,16, 6,23,16,3,18,62,48,46,95,34,17,15,60,35,50,51, 44,17,24,33,6,3,118,47,29,38,37,1,205,40,31,39, 46,29,1,27,18,25,166,40,40,254,89,46,159,11,7,2, 2,12,12,57,33,21,100,23,23,9,7,16,8,56,42,32, 90,28,21,11,20,26,28,4,1,5,26,11,21,61,26,32, 34,0,0,1,0,41,255,254,3,53,1,205,0,74,0,0, 19,50,23,22,21,20,7,22,23,22,51,50,55,53,35,53, 33,21,35,17,39,17,35,17,39,53,6,35,34,39,38,39, 22,21,20,7,6,35,34,39,38,39,38,53,52,51,50,23, 22,23,22,51,50,53,52,39,38,35,34,7,39,54,55,54, 51,54,55,54,53,52,35,34,7,39,54,201,68,55,43,38, 3,47,30,29,48,49,135,1,165,69,45,127,45,28,44,35, 23,6,4,5,62,38,43,82,91,21,16,6,23,16,3,18, 62,48,46,95,34,17,15,60,35,50,51,44,17,24,33,6, 3,118,47,29,38,37,1,205,40,31,39,46,29,1,27,18, 25,166,40,40,254,89,46,1,121,254,89,46,159,11,7,2, 2,12,12,57,33,21,100,23,23,9,7,16,8,56,42,32, 90,28,21,11,20,26,28,4,1,5,26,11,21,61,26,32, 34,0,0,1,0,0,255,178,1,136,1,205,0,58,0,0, 55,34,39,38,53,52,55,54,59,1,53,35,53,33,21,35, 21,35,34,21,20,23,22,51,50,55,54,51,50,23,22,21, 20,7,6,7,23,7,39,35,38,39,38,53,52,51,50,23, 22,23,22,51,50,55,54,53,52,39,38,158,48,37,26,55, 21,23,99,245,1,136,100,157,37,29,11,11,4,4,17,11, 60,41,39,81,21,23,109,34,118,32,56,15,4,41,41,19, 3,2,8,9,46,36,22,36,5,184,41,28,31,47,18,7, 65,40,40,103,54,27,13,5,1,3,25,22,28,59,39,10, 6,97,15,108,7,42,11,12,34,44,7,8,3,32,20,22, 29,6,1,0,0,1,0,0,255,178,1,136,2,157,0,78, 0,0,55,34,39,38,53,52,55,54,59,1,53,35,53,51, 38,39,52,55,54,51,50,23,22,23,7,38,35,34,7,6, 21,20,23,51,21,35,21,35,34,21,20,23,22,51,50,55, 54,51,50,23,22,21,20,7,6,7,23,7,39,35,38,39, 38,53,52,51,50,23,22,23,22,51,50,55,54,53,52,39, 38,158,48,37,26,55,21,23,99,245,245,50,1,45,18,21, 45,40,11,8,17,33,42,30,12,4,38,110,100,157,37,29, 11,11,4,4,17,11,60,41,39,81,21,23,109,34,118,32, 56,15,4,41,41,19,3,2,8,9,46,36,22,36,5,184, 41,28,31,47,18,7,65,40,65,55,56,23,9,49,14,17, 36,69,38,11,13,49,50,40,103,54,27,13,5,1,3,25, 22,28,59,39,10,6,97,15,108,7,42,11,12,34,44,7, 8,3,32,20,22,29,6,1,0,1,0,0,0,32,1,203, 1,205,0,49,0,0,1,52,39,38,43,1,53,33,21,35, 22,21,20,7,22,21,20,7,6,35,34,39,38,39,38,53, 52,51,50,23,22,23,22,51,50,55,54,53,52,39,38,35, 34,7,39,54,55,54,51,54,1,63,52,30,35,202,1,203, 158,65,41,71,61,38,43,81,93,21,16,6,23,18,1,21, 61,47,46,66,22,8,32,19,16,60,35,49,50,47,16,22, 45,1,72,50,28,15,40,40,41,52,42,29,38,71,58,36, 22,101,23,23,9,7,16,9,56,41,33,52,19,23,29,28, 17,20,26,28,4,1,7,0,0,1,0,0,0,32,2,149, 1,205,0,70,0,0,1,52,39,38,39,38,43,1,53,33, 21,33,22,21,20,7,22,23,54,51,50,23,22,21,6,7, 6,7,39,54,53,52,35,34,7,22,21,20,7,6,35,34, 39,38,39,38,53,52,51,50,23,22,23,22,51,50,55,54, 53,52,39,38,35,34,7,39,54,55,54,51,54,1,67,54, 18,20,13,14,204,2,149,254,154,68,42,25,8,51,63,59, 36,21,4,31,11,6,56,63,57,58,44,12,62,38,44,82, 93,21,17,6,24,17,2,21,61,48,46,66,23,8,32,19, 16,61,35,50,50,54,14,19,46,1,72,51,27,9,4,2, 40,40,44,49,41,30,14,8,45,49,29,36,39,58,20,13, 22,70,57,56,41,24,28,58,36,22,101,23,23,9,7,16, 9,55,42,33,52,19,23,29,28,17,20,26,29,3,1,7, 0,1,0,0,255,254,2,133,1,205,0,62,0,0,1,33, 21,54,53,52,51,50,31,1,22,21,20,7,20,23,22,31, 1,6,21,20,51,50,55,23,6,35,34,39,38,53,52,55, 54,55,38,39,38,39,7,21,39,53,7,39,55,53,38,35, 34,7,39,54,51,50,23,22,23,53,33,53,33,2,133,254, 229,84,26,14,17,33,16,53,9,10,30,23,109,84,34,37, 14,29,41,70,47,31,55,7,8,14,7,2,2,96,45,214, 29,243,71,93,63,32,18,27,69,68,76,25,12,254,195,2, 133,1,165,173,39,45,32,9,18,9,11,18,32,4,15,15, 11,29,15,47,49,18,39,15,38,25,32,42,24,4,2,12, 17,4,4,48,204,46,137,104,32,118,18,53,24,42,21,33, 11,11,139,40,0,1,0,0,255,157,1,184,1,205,0,34, 0,0,5,7,39,54,53,52,47,1,38,61,1,35,53,33, 21,35,21,20,7,6,35,47,1,51,50,61,1,35,21,20, 31,1,22,21,20,1,174,25,48,18,23,240,70,42,1,169, 68,43,13,17,32,51,75,34,222,54,243,55,74,25,38,13, 9,8,12,125,36,26,253,40,40,217,36,13,4,1,39,15, 215,252,13,29,128,28,26,12,0,1,0,0,255,157,1,184, 2,160,0,44,0,0,1,51,21,35,21,20,7,6,35,47, 1,51,50,61,1,35,21,20,31,1,22,21,20,15,1,39, 54,53,52,47,1,38,61,1,35,53,33,38,43,1,39,51, 50,23,22,1,92,77,68,43,13,17,32,51,75,34,222,54, 243,55,10,25,48,18,23,240,70,42,1,54,84,46,56,37, 50,51,43,71,1,205,40,217,36,13,4,1,39,15,215,252, 13,29,128,28,26,12,7,25,38,13,9,8,12,125,36,26, 253,40,134,77,48,80,0,2,0,41,255,254,3,53,2,112, 0,20,0,95,0,0,1,6,7,6,35,34,39,38,39,38, 53,52,51,50,23,22,51,50,55,54,55,5,50,23,22,21, 20,7,22,23,22,51,50,55,53,35,53,33,21,35,17,39, 17,35,17,39,53,6,35,34,39,38,39,22,21,20,7,6, 35,34,39,38,39,38,53,52,51,50,23,22,23,22,51,50, 53,52,39,38,35,34,7,39,54,55,54,51,54,55,54,53, 52,35,34,7,39,54,3,42,18,58,37,29,53,55,22,9, 2,12,9,5,46,69,24,28,37,18,253,194,68,55,43,38, 3,47,30,29,48,49,135,1,165,69,45,127,45,28,44,35, 23,6,4,5,62,38,43,82,91,21,16,6,23,16,3,18, 62,48,46,95,34,17,15,60,35,50,51,44,17,24,33,6, 3,118,47,29,38,37,2,77,35,28,17,54,21,19,6,3, 12,8,70,16,19,35,155,40,31,39,46,29,1,27,18,25, 166,40,40,254,89,46,1,121,254,89,46,159,11,7,2,2, 12,12,57,33,21,100,23,23,9,7,16,8,56,42,32,90, 28,21,11,20,26,28,4,1,5,26,11,21,61,26,32,34, 0,1,0,41,255,254,3,53,2,160,0,84,0,0,19,50, 23,22,21,20,7,22,23,22,51,50,55,53,35,53,33,38, 43,1,39,51,50,23,22,23,51,21,35,17,39,17,35,17, 39,53,6,35,34,39,38,39,22,21,20,7,6,35,34,39, 38,39,38,53,52,51,50,23,22,23,22,51,50,53,52,39, 38,35,34,7,39,54,55,54,51,54,55,54,53,52,35,34, 7,39,54,201,68,55,43,38,3,47,30,29,48,49,135,1, 49,81,47,56,37,50,50,44,66,50,77,69,45,127,45,28, 44,35,23,6,4,5,62,38,43,82,91,21,16,6,23,16, 3,18,62,48,46,95,34,17,15,60,35,50,51,44,17,24, 33,6,3,118,47,29,38,37,1,205,40,31,39,46,29,1, 27,18,25,166,40,134,77,48,73,90,40,254,89,46,1,121, 254,89,46,159,11,7,2,2,12,12,57,33,21,100,23,23, 9,7,16,8,56,42,32,90,28,21,11,20,26,28,4,1, 5,26,11,21,61,26,32,34,0,1,0,41,255,254,3,53, 2,226,0,106,0,0,19,50,23,22,21,20,7,22,23,22, 51,50,55,53,35,53,33,38,39,38,35,7,39,38,53,52, 55,54,51,50,23,38,39,38,47,2,34,7,53,52,51,50, 23,22,23,22,23,51,21,35,17,39,17,35,17,39,53,6, 35,34,39,38,39,22,21,20,7,6,35,34,39,38,39,38, 53,52,51,50,23,22,23,22,51,50,53,52,39,38,35,34, 7,39,54,55,54,51,54,55,54,53,52,35,34,7,39,54, 201,68,55,43,38,3,47,30,29,48,49,135,1,45,50,29, 20,29,35,36,2,32,6,5,65,99,6,26,14,33,22,12, 5,6,20,33,40,40,24,3,2,76,69,45,127,45,28,44, 35,23,6,4,5,62,38,43,82,91,21,16,6,23,16,3, 18,62,48,46,95,34,17,15,60,35,50,51,44,17,24,33, 6,3,118,47,29,38,37,1,205,40,31,39,46,29,1,27, 18,25,166,40,53,11,8,2,42,2,4,19,5,1,102,31, 72,29,21,10,2,2,53,20,52,50,138,20,17,40,254,89, 46,1,121,254,89,46,159,11,7,2,2,12,12,57,33,21, 100,23,23,9,7,16,8,56,42,32,90,28,21,11,20,26, 28,4,1,5,26,11,21,61,26,32,34,0,0,2,0,0, 255,254,2,91,1,205,0,45,0,58,0,0,1,33,21,54, 55,54,51,50,23,22,21,20,7,6,7,39,54,55,54,53, 52,39,38,35,34,15,1,21,39,53,6,35,34,39,38,53, 52,55,54,51,50,23,53,33,53,33,5,53,38,35,34,7, 6,21,20,23,22,51,50,2,91,254,238,49,14,24,29,47, 36,25,42,11,10,32,35,9,3,33,12,14,22,33,62,45, 48,68,60,40,26,58,26,31,82,45,254,228,2,91,254,193, 52,64,42,26,13,41,11,13,80,1,165,176,43,8,13,59, 41,38,53,43,11,6,29,32,38,13,39,37,17,7,28,56, 188,46,113,30,47,31,37,58,26,11,63,147,40,253,18,72, 34,17,19,45,13,4,0,3,0,0,255,254,2,116,1,205, 0,25,0,34,0,62,0,0,1,35,17,39,53,6,35,34, 35,38,39,38,39,55,54,51,50,23,54,55,54,61,1,35, 53,33,7,53,38,35,34,21,20,51,50,23,53,6,35,34, 39,38,39,55,54,55,54,51,50,23,22,23,53,33,21,20, 15,1,22,23,22,51,50,2,116,61,45,105,88,3,2,84, 95,83,21,1,7,20,31,29,15,11,3,158,2,116,106,50, 68,98,97,57,62,46,61,85,45,24,2,3,13,67,25,24, 71,46,8,6,254,196,33,32,27,61,42,41,113,1,165,254, 89,46,23,58,1,89,77,68,9,12,38,10,31,9,6,138, 40,242,35,53,63,69,54,53,39,53,29,38,21,44,19,7, 33,6,7,121,138,55,33,28,58,36,25,0,0,1,0,0, 255,254,1,174,1,205,0,20,0,0,1,35,17,39,17,35, 21,20,35,34,47,1,38,53,52,59,1,53,35,53,33,1, 174,70,45,149,25,16,17,54,15,31,51,121,1,174,1,165, 254,89,46,1,121,229,40,17,56,15,10,15,156,40,0,2, 0,0,255,254,1,222,1,205,0,21,0,50,0,0,1,35, 17,39,53,6,35,34,39,38,53,52,55,38,39,38,53,52, 55,35,53,33,7,53,33,34,7,6,21,20,23,22,23,22, 23,22,31,1,38,35,34,7,6,21,20,23,22,51,50,55, 54,1,222,70,45,65,89,47,48,61,50,44,15,5,11,50, 1,222,115,255,0,14,7,1,19,7,1,16,65,34,28,31, 67,58,38,17,7,63,18,21,70,74,10,1,165,254,89,46, 131,56,27,34,58,37,20,26,37,11,11,14,27,40,236,196, 30,6,5,27,18,7,1,13,5,1,7,54,26,26,10,11, 53,15,5,56,8,0,0,2,0,0,0,0,2,0,1,205, 0,3,0,52,0,0,1,7,39,55,7,52,39,38,35,34, 39,38,53,52,55,54,59,1,53,33,53,33,21,35,21,35, 34,21,20,23,22,51,50,23,22,21,20,7,6,35,34,39, 38,53,52,51,50,23,22,51,50,55,54,1,252,45,46,46, 59,53,22,68,97,36,14,49,18,21,156,254,154,2,0,107, 203,38,49,17,38,71,56,55,75,31,40,138,117,6,14,11, 9,101,126,68,24,8,1,0,38,38,36,180,45,10,4,62, 25,23,50,18,7,65,40,40,103,62,36,7,2,29,28,34, 79,29,12,147,7,7,13,11,123,40,14,0,0,1,0,0, 255,254,2,12,1,205,0,29,0,0,1,35,17,39,53,6, 35,34,39,38,53,52,55,35,53,33,21,35,6,21,20,23, 22,51,50,55,53,33,53,33,2,12,70,45,65,75,68,49, 37,18,88,1,8,102,45,57,17,21,67,85,254,103,2,12, 1,165,254,89,46,122,50,50,37,44,26,21,40,40,20,37, 59,18,5,56,210,40,0,2,0,0,0,0,2,71,1,205, 0,60,0,73,0,0,1,35,21,22,23,22,21,20,7,6, 35,34,53,52,55,38,39,38,53,52,55,54,51,50,23,21, 38,35,34,21,20,23,22,51,50,55,51,23,35,34,21,20, 23,22,51,50,55,54,55,38,39,38,53,52,55,54,55,53, 33,53,33,7,34,7,6,21,20,23,22,23,54,53,52,39, 2,71,147,53,19,7,95,85,88,160,37,48,23,11,58,27, 30,41,31,35,46,58,56,23,19,11,12,54,12,75,67,40, 15,41,97,84,10,9,52,48,49,63,20,23,254,124,2,71, 183,29,26,16,41,38,42,18,45,1,165,89,20,59,22,24, 84,65,58,94,38,25,17,37,18,17,47,24,11,21,27,9, 62,29,16,7,4,40,55,39,10,4,74,9,9,19,37,39, 28,54,26,8,3,84,40,156,27,16,16,29,29,32,3,31, 49,55,14,0,0,1,0,0,255,254,2,41,1,205,0,36, 0,0,1,35,17,39,53,35,22,21,20,7,6,35,34,39, 38,39,55,54,51,50,23,22,23,22,51,50,53,52,39,38, 39,55,33,53,33,53,33,2,41,68,45,182,84,49,23,27, 52,65,70,14,1,2,7,11,6,29,57,44,40,57,37,41, 62,4,1,24,254,72,2,41,1,165,254,89,46,246,75,44, 49,24,11,56,60,71,11,4,13,67,47,36,60,23,37,41, 30,11,93,40,0,2,0,0,255,178,1,253,1,205,0,50, 0,70,0,0,55,34,39,38,53,52,55,54,59,1,53,35, 53,33,21,35,17,39,53,6,43,1,22,21,20,7,6,7, 23,7,39,35,38,39,38,53,52,51,50,23,22,23,22,51, 50,55,54,53,52,39,38,55,53,35,21,35,34,21,20,23, 22,51,50,55,54,51,50,23,22,51,50,158,48,37,26,55, 21,23,99,245,1,253,70,45,29,54,7,21,81,21,23,109, 33,119,32,56,15,4,41,41,19,3,2,8,10,45,37,23, 37,5,157,102,157,37,29,11,11,4,4,17,19,31,33,29, 12,49,184,41,28,31,47,18,7,65,40,40,254,89,46,158, 17,17,20,59,39,10,6,97,15,108,7,42,11,12,34,44, 7,8,3,32,20,22,29,6,1,70,167,103,54,27,13,5, 1,3,3,4,0,1,0,0,255,254,2,32,1,205,0,41, 0,0,1,35,17,39,53,35,6,7,6,35,34,39,38,53, 52,51,50,23,22,51,50,55,54,53,52,39,38,35,34,7, 39,54,51,50,23,22,23,51,53,33,53,33,2,32,70,45, 73,17,63,27,29,89,88,7,16,9,8,72,68,79,22,7, 32,10,10,56,22,46,25,76,68,34,12,4,69,254,83,2, 32,1,165,254,89,46,155,53,21,9,100,7,7,12,8,79, 45,13,16,43,14,4,28,21,46,54,17,20,183,40,0,1, 0,0,0,0,1,188,1,205,0,31,0,0,55,20,23,22, 51,50,55,54,55,23,6,35,34,39,38,53,52,55,54,59, 1,53,33,53,33,21,35,21,35,34,7,6,80,53,35,27, 92,34,15,15,27,52,77,102,62,43,46,37,38,98,254,251, 1,188,135,125,71,24,9,117,31,28,18,15,7,12,34,40, 50,36,50,53,46,36,150,40,40,190,63,23,0,2,0,0, 0,0,1,224,1,205,0,38,0,52,0,0,1,35,22,21, 20,7,6,21,20,23,22,23,22,21,20,7,6,35,34,39, 38,39,38,53,52,55,54,55,54,55,54,53,52,39,38,35, 33,53,33,3,52,35,34,7,6,21,20,23,22,51,50,55, 54,1,224,150,25,17,18,8,37,27,19,72,42,53,63,72, 58,9,3,100,30,102,20,12,4,29,8,10,254,252,1,224, 115,110,93,29,48,43,48,63,93,26,7,1,165,29,43,21, 28,24,5,5,5,18,46,31,27,76,39,24,57,47,44,14, 11,74,22,6,8,4,40,13,11,50,16,4,40,254,199,89, 9,15,54,35,39,45,65,19,0,1,0,0,0,0,2,10, 1,205,0,48,0,0,37,52,39,38,35,34,39,38,53,52, 55,54,59,1,53,33,53,33,21,35,21,35,34,21,20,23, 22,51,50,23,22,21,20,7,6,35,34,39,38,53,52,51, 50,23,22,51,50,55,54,1,150,53,22,68,99,36,14,49, 18,22,158,254,151,2,10,115,204,37,40,17,46,73,56,56, 74,32,41,141,117,6,15,12,9,102,126,62,26,11,112,45, 10,4,62,25,23,49,19,7,65,40,40,103,62,35,7,3, 29,29,33,77,30,13,147,7,7,13,11,123,37,16,0,2, 0,0,0,0,1,223,1,205,0,36,0,50,0,0,1,35, 21,35,34,21,20,23,22,23,38,53,52,55,54,51,50,23, 22,21,20,7,6,35,34,39,38,53,52,55,54,59,1,53, 33,53,33,3,52,39,38,35,34,21,20,23,22,51,50,55, 54,1,223,114,190,87,61,27,27,10,58,17,19,69,35,19, 66,25,32,100,71,74,31,37,75,133,254,194,1,223,107,37, 11,13,81,13,5,18,75,24,7,1,165,134,90,60,54,24, 10,24,41,74,20,5,45,25,31,75,27,10,68,65,94,37, 28,34,95,40,254,163,43,15,4,71,37,25,1,42,14,0, 0,2,0,0,255,254,1,254,1,205,0,18,0,27,0,0, 1,35,17,39,17,35,21,20,7,6,35,34,39,38,61,1, 35,53,33,5,53,35,21,20,23,22,51,50,1,254,69,45, 125,48,25,26,46,48,37,41,1,254,254,227,138,45,15,11, 67,1,165,254,89,46,1,121,201,44,25,13,36,28,27,192, 40,241,201,209,19,13,4,0,0,1,0,0,255,254,1,189, 1,205,0,24,0,0,1,35,17,39,53,35,34,21,20,23, 35,38,39,38,39,55,54,55,54,59,1,53,33,53,33,1, 189,70,45,179,64,125,45,80,25,20,1,3,15,72,15,16, 168,254,182,1,189,1,165,254,89,46,245,63,82,125,88,50, 40,36,26,55,12,2,93,40,0,2,0,43,255,254,2,36, 1,205,0,38,0,50,0,0,1,35,17,39,53,6,35,34, 39,38,39,54,55,38,39,38,53,52,55,54,51,50,23,22, 21,20,7,6,7,22,23,22,51,50,55,53,35,53,51,5, 52,35,34,21,20,23,22,51,50,55,54,2,36,70,45,62, 97,117,70,24,13,69,57,50,40,43,68,19,22,79,36,18, 94,37,35,16,72,32,22,80,92,96,211,254,202,75,73,63, 23,25,9,8,20,1,165,254,89,46,131,50,60,21,26,16, 31,5,30,31,24,69,18,5,50,26,33,58,51,20,10,27, 21,9,65,200,40,101,69,60,39,15,6,1,20,0,0,1, 0,0,255,206,1,171,1,205,0,42,0,0,55,52,55,54, 59,1,53,33,53,33,21,35,21,35,34,7,6,21,20,23, 22,51,50,55,38,53,52,55,23,22,23,22,21,20,7,23, 7,39,6,35,34,39,38,42,81,28,33,98,254,230,1,171, 99,121,84,26,9,54,47,53,7,7,2,44,24,32,7,1, 29,68,29,73,10,4,84,76,83,246,63,20,7,85,40,40, 124,47,15,19,45,33,31,1,6,11,44,6,1,8,31,6, 6,32,15,112,14,115,2,50,54,0,0,2,0,43,255,254, 2,14,1,205,0,48,0,62,0,0,1,35,17,39,53,6, 7,6,35,34,39,38,53,52,55,38,39,55,54,55,54,51, 50,23,22,21,20,7,6,7,22,23,51,23,7,38,35,34, 21,20,23,22,51,50,55,53,35,53,51,5,52,39,38,35, 34,21,20,23,22,51,50,55,54,2,14,69,45,44,82,22, 17,60,47,46,55,102,3,3,13,54,10,10,54,30,15,65, 6,6,26,38,54,37,10,23,42,96,70,17,17,103,65,108, 222,254,173,31,8,9,48,25,10,8,21,21,11,1,165,254, 89,46,108,29,12,3,34,34,33,49,25,36,68,22,41,9, 2,34,17,21,33,35,3,3,15,11,38,11,10,51,39,10, 3,64,210,40,75,24,9,3,43,22,15,5,27,13,0,1, 0,0,255,254,1,165,1,205,0,20,0,0,1,35,17,39, 53,35,21,20,35,34,47,1,38,53,52,59,1,53,33,53, 33,1,165,70,45,169,18,11,10,44,15,44,223,254,206,1, 165,1,165,254,89,46,191,51,25,10,48,17,13,27,147,40, 0,2,0,0,255,254,1,165,1,205,0,3,0,24,0,0, 55,7,39,55,1,35,17,39,53,35,21,20,35,34,47,1, 38,53,52,59,1,53,33,53,33,168,51,51,51,1,48,70, 45,169,18,11,10,44,15,44,223,254,206,1,165,50,51,51, 51,1,64,254,89,46,191,51,25,10,48,17,13,27,147,40, 0,2,0,0,255,254,1,150,1,205,0,14,0,23,0,0, 1,35,17,39,53,6,35,34,39,38,61,1,35,53,33,7, 53,35,21,20,23,22,51,50,1,150,69,45,47,73,49,46, 36,41,1,150,114,205,40,19,14,87,1,165,254,89,46,141, 47,42,34,33,174,40,208,168,195,24,18,8,0,2,0,0, 255,254,2,82,1,205,0,37,0,46,0,0,1,33,21,54, 51,50,23,22,21,20,7,6,7,39,54,55,54,53,52,39, 38,35,34,15,1,21,39,53,6,35,34,39,38,61,1,35, 53,33,5,53,35,21,20,23,22,51,50,2,82,254,255,61, 47,44,37,27,41,11,11,32,35,9,3,31,13,15,21,31, 57,45,47,73,49,46,36,41,2,82,254,210,205,40,19,14, 87,1,165,142,57,61,46,40,57,46,12,7,29,32,42,15, 42,40,21,9,26,51,222,46,141,47,42,34,33,174,40,208, 168,195,24,18,8,0,0,3,0,0,255,254,1,192,1,205, 0,22,0,31,0,40,0,0,1,35,17,39,53,6,7,6, 35,34,39,38,53,52,55,54,51,50,23,53,33,53,33,7, 53,38,39,38,43,1,23,54,7,39,6,21,20,23,22,51, 50,1,192,70,45,46,66,15,13,68,48,36,69,39,42,95, 47,254,179,1,192,115,37,33,25,45,17,93,26,59,95,54, 60,16,19,30,1,165,254,89,46,123,38,11,2,50,37,44, 55,29,16,65,139,40,247,22,46,15,12,135,12,24,137,24, 38,61,17,4,0,2,0,43,255,254,2,14,1,205,0,35, 0,46,0,0,1,35,17,39,53,35,21,20,35,34,47,1, 38,53,52,59,1,53,38,39,38,53,52,55,54,51,50,23, 22,29,1,51,53,35,53,51,5,53,52,39,38,35,34,21, 20,23,22,2,14,70,45,172,14,13,19,59,18,24,53,83, 43,24,43,22,22,44,34,31,172,132,247,254,179,26,9,8, 60,62,22,1,165,254,89,46,153,48,15,12,47,18,11,14, 53,9,41,22,28,36,24,12,34,31,28,132,185,40,147,69, 22,12,4,40,32,24,8,0,0,2,0,0,255,254,1,213, 1,205,0,20,0,24,0,0,1,35,17,39,53,35,21,20, 35,34,47,1,38,53,52,59,1,53,35,53,33,7,53,35, 21,1,213,70,45,196,21,16,19,47,15,32,40,112,1,213, 115,196,1,165,254,89,46,156,47,24,19,47,15,12,16,183, 40,223,183,183,0,2,0,0,255,254,1,201,1,205,0,18, 0,36,0,0,1,35,17,39,53,6,35,34,39,38,53,54, 53,52,47,1,35,53,33,7,53,35,22,21,20,7,6,7, 6,21,20,23,22,51,50,55,54,1,201,70,45,46,70,91, 56,38,133,33,12,129,1,201,115,159,43,40,42,43,3,39, 18,18,95,43,16,1,165,254,89,46,133,40,51,36,48,31, 48,31,30,9,40,231,191,37,47,19,29,29,10,8,7,33, 18,9,28,11,0,1,0,0,0,1,1,63,1,205,0,23, 0,0,1,35,21,20,7,23,7,39,38,53,52,51,50,23, 22,51,50,55,54,61,1,35,53,33,1,63,112,74,139,34, 135,56,25,31,26,2,1,9,9,11,161,1,63,1,165,147, 75,23,162,13,157,67,16,22,41,2,22,19,23,137,40,0, 0,2,0,0,255,255,1,63,1,205,0,3,0,27,0,0, 55,7,39,55,39,52,51,50,23,22,51,50,55,54,61,1, 35,53,33,21,35,21,20,7,23,7,39,38,136,51,51,51, 38,25,31,26,2,1,9,9,11,161,1,63,112,74,139,34, 135,56,50,51,51,51,140,22,41,2,22,19,23,137,40,40, 147,75,23,162,13,157,67,0,0,1,0,0,255,254,2,43, 1,205,0,47,0,0,1,35,17,39,53,38,35,34,15,2, 39,54,55,38,39,38,35,34,7,6,21,20,23,22,23,22, 21,20,35,34,39,38,53,52,55,54,51,50,23,54,51,50, 23,53,33,53,33,2,43,70,45,37,13,57,30,25,3,41, 3,19,19,43,16,15,58,12,5,94,24,22,43,18,11,16, 184,55,23,30,67,60,43,59,32,29,254,72,2,43,1,165, 254,89,46,227,8,47,48,6,15,27,22,33,15,6,42,16, 25,57,78,20,14,27,12,7,13,114,101,70,28,12,63,46, 20,122,40,0,0,3,0,0,0,48,2,129,1,205,0,32, 0,46,0,57,0,0,55,34,39,38,53,52,55,54,51,50, 23,54,55,53,33,53,33,21,35,21,22,23,22,21,20,15, 1,6,7,39,38,39,6,37,52,47,1,35,34,7,6,7, 22,51,50,55,54,39,38,35,34,21,20,23,22,51,50,55, 188,74,44,29,72,36,44,93,29,38,81,254,78,2,129,160, 41,32,20,63,29,19,22,44,77,13,41,1,5,30,25,11, 60,34,17,20,6,91,66,24,10,232,15,84,108,44,20,22, 66,27,48,61,39,50,64,30,15,56,54,2,114,40,40,115, 4,49,33,30,81,39,13,7,1,2,10,68,81,150,53,11, 5,28,14,39,99,60,23,43,54,105,43,22,10,51,0,2, 0,0,255,254,1,192,1,205,0,22,0,37,0,0,1,35, 17,39,53,6,7,6,35,34,39,38,53,52,55,54,51,50, 23,53,33,53,33,7,53,38,39,38,35,34,7,6,21,20, 23,22,51,50,1,192,70,45,46,66,15,13,68,48,36,69, 39,42,96,46,254,179,1,192,115,38,32,25,45,56,33,17, 60,16,19,68,1,165,254,89,46,123,38,11,2,50,37,44, 55,29,16,64,138,40,249,25,45,15,12,33,18,21,61,17, 4,0,0,2,0,0,255,243,2,81,1,205,0,14,0,52, 0,0,1,52,35,34,15,1,6,21,20,23,22,51,50,55, 54,37,33,21,35,17,39,17,35,22,21,20,7,6,7,23, 7,47,1,38,39,38,53,52,51,50,23,55,54,55,54,55, 38,39,38,53,52,55,35,1,51,101,45,23,8,2,58,43, 46,7,8,17,254,205,2,81,69,45,175,49,48,47,71,131, 31,141,36,35,23,8,27,55,26,24,47,37,7,4,91,65, 34,20,101,1,63,102,23,12,5,4,52,31,24,1,20,170, 40,254,89,46,1,121,34,67,58,56,54,17,131,17,141,1, 5,22,8,20,40,53,2,10,37,7,6,16,48,25,51,28, 20,0,0,3,0,0,255,254,1,148,1,205,0,16,0,21, 0,34,0,0,1,35,17,39,53,6,7,6,35,34,39,38, 61,1,35,53,33,7,53,35,23,22,7,53,52,47,1,21, 20,23,22,51,50,55,54,1,148,70,45,27,65,13,12,49, 46,36,41,1,148,115,192,186,3,25,12,162,40,19,14,62, 29,10,1,165,254,89,46,134,30,8,2,42,34,33,174,40, 202,162,156,1,53,27,4,10,136,162,24,18,8,19,7,0, 0,2,0,0,255,254,2,0,1,205,0,29,0,37,0,0, 55,50,55,54,61,1,35,53,33,21,35,17,39,53,6,35, 34,39,6,7,23,7,39,38,53,52,51,50,23,22,37,53, 35,7,21,22,51,50,133,13,13,4,163,2,0,70,45,29, 54,72,44,16,48,141,34,137,57,25,32,26,2,1,9,187, 1,24,52,67,220,41,14,9,137,40,40,254,89,46,149,12, 43,34,14,162,13,157,66,17,22,41,2,14,187,158,1,42, 0,1,0,0,255,215,1,174,1,205,0,56,0,0,1,35, 21,35,34,21,20,23,22,23,54,51,50,23,22,21,20,7, 6,35,34,52,51,50,55,54,53,52,35,34,7,6,21,20, 23,22,23,21,38,39,38,53,52,55,38,39,38,53,52,55, 54,59,1,53,33,53,33,1,174,89,223,27,33,8,7,28, 47,74,45,29,36,19,20,27,16,26,10,3,98,71,20,5, 43,49,116,113,77,65,32,30,21,12,58,18,20,156,254,217, 1,174,1,165,104,40,29,17,3,2,16,41,26,35,38,24, 12,34,36,10,11,45,45,12,15,50,33,37,28,23,13,54, 46,58,40,38,11,36,20,17,45,15,4,65,40,0,0,1, 254,238,255,115,255,84,255,217,0,3,0,0,15,1,39,55, 172,51,51,51,90,51,51,51,0,1,0,45,0,48,1,112, 1,205,0,39,0,0,1,35,34,21,20,31,1,22,21,20, 7,6,35,34,39,38,39,38,53,52,51,50,23,22,23,22, 51,50,53,52,39,38,39,38,53,52,55,54,59,1,1,112, 189,24,45,84,45,34,36,58,79,50,12,8,7,9,16,17, 19,40,11,10,93,45,15,70,45,43,19,20,171,1,153,30, 23,37,69,44,36,49,34,39,60,15,16,13,10,12,30,31, 11,3,80,41,48,14,59,39,18,36,19,8,0,1,255,251, 255,254,0,177,1,205,0,7,0,0,19,35,17,39,17,35, 53,51,177,69,45,68,182,1,165,254,89,46,1,121,40,0, 0,1,255,250,255,254,1,162,2,98,0,27,0,0,19,52, 55,54,51,50,23,7,38,39,38,35,34,15,1,21,20,23, 51,21,35,17,39,17,35,53,51,38,32,63,33,37,134,119, 14,48,93,42,42,73,19,5,18,78,70,45,69,67,29,2, 11,50,25,12,122,25,66,28,13,38,18,3,25,25,40,254, 89,46,1,121,40,29,0,1,255,63,255,254,0,177,2,126, 0,27,0,0,19,35,17,39,17,35,53,51,38,39,38,35, 34,21,20,23,35,38,53,52,55,54,51,50,23,22,23,51, 177,69,45,68,69,13,51,36,40,81,33,33,36,58,21,24, 89,58,32,9,79,1,165,254,89,46,1,121,40,65,44,30, 52,32,55,53,31,64,22,7,80,44,53,0,0,1,254,125, 255,79,0,14,0,0,0,25,0,0,23,20,7,6,35,34, 39,55,22,51,50,55,54,53,52,39,38,35,34,7,39,54, 51,50,23,22,14,97,27,30,114,133,26,112,109,55,35,18, 28,20,13,25,32,46,25,54,47,44,40,97,59,16,5,108, 19,89,24,13,15,22,15,12,22,26,34,36,33,0,0,1, 255,41,255,69,0,149,0,0,0,30,0,0,7,52,55,54, 51,50,31,1,35,39,38,35,34,7,6,21,20,23,22,51, 50,54,59,1,23,6,7,39,38,39,38,215,45,23,27,44, 47,178,48,145,35,41,39,7,3,22,9,7,30,36,4,13, 23,20,53,32,29,22,34,80,47,22,11,39,148,120,29,34, 12,22,16,13,5,16,19,32,2,3,6,20,31,0,0,1, 255,30,255,126,255,243,0,38,0,21,0,0,7,6,35,34, 39,38,53,52,55,54,51,23,34,7,6,21,20,23,22,51, 50,55,13,23,40,60,45,45,67,31,33,48,86,32,12,41, 12,12,48,22,114,16,25,24,40,47,22,10,37,32,12,15, 25,11,3,16,0,1,255,21,1,253,0,48,2,112,0,20, 0,0,19,6,7,6,35,34,39,38,39,38,53,52,51,50, 23,22,51,50,55,54,55,48,18,58,37,29,53,55,22,9, 2,12,9,5,46,69,24,28,37,18,2,77,35,28,17,54, 21,19,6,3,12,8,70,16,19,35,0,1,254,181,1,205, 255,186,2,160,0,9,0,0,3,35,38,43,1,39,51,50, 23,22,70,38,84,46,56,37,50,51,43,71,1,205,134,77, 48,80,0,1,254,204,1,205,255,194,2,230,0,31,0,0, 3,35,38,39,38,39,7,39,38,53,52,55,54,51,50,23, 38,39,38,39,38,35,34,7,53,52,51,50,23,22,23,22, 62,42,50,28,18,24,46,36,2,32,6,5,65,99,6,26, 14,33,19,15,5,6,20,33,40,41,24,3,1,205,55,12, 7,2,2,42,2,4,19,5,1,102,31,72,29,21,12,2, 53,20,52,51,141,20,0,2,255,201,255,254,0,228,2,112, 0,20,0,28,0,0,19,6,7,6,35,34,39,38,39,38, 53,52,51,50,23,22,51,50,55,54,55,7,35,17,39,17, 35,53,51,228,18,58,37,29,53,55,22,9,2,12,9,5, 46,69,24,28,37,18,16,69,45,68,182,2,77,35,28,17, 54,21,19,6,3,12,8,70,16,19,35,195,254,89,46,1, 121,40,0,1,255,96,255,254,0,177,2,160,0,17,0,0, 19,35,17,39,17,35,53,51,38,43,1,39,51,50,23,22, 23,51,177,69,45,68,66,81,47,56,37,50,50,44,66,50, 77,1,165,254,89,46,1,121,40,134,77,48,73,90,0,1, 255,112,255,254,0,177,2,226,0,40,0,0,19,35,17,39, 17,35,53,51,38,39,38,35,34,7,39,38,53,52,55,54, 51,50,23,38,39,38,39,38,35,34,7,53,52,51,50,23, 22,23,22,23,51,177,69,45,68,62,50,29,20,29,14,21, 36,2,32,6,5,65,99,6,26,14,33,19,15,5,6,20, 33,40,40,24,3,2,76,1,165,254,89,46,1,121,40,53, 11,8,2,42,2,4,19,5,1,102,31,72,29,21,12,2, 53,20,52,50,138,20,17,0,0,1,255,104,255,79,0,153, 255,255,0,11,0,0,23,35,38,39,38,43,1,39,51,22, 23,22,153,36,45,61,59,26,43,35,81,75,99,30,177,52, 44,42,38,21,100,29,0,4,0,40,0,68,3,87,2,40, 0,3,0,26,0,107,0,121,0,0,1,7,39,55,23,6, 7,6,35,34,39,38,39,38,53,52,51,50,23,22,23,22, 51,50,55,54,55,23,50,23,22,21,22,7,6,7,6,35, 34,39,38,39,6,35,34,39,22,21,20,7,6,35,34,39, 38,39,38,53,52,51,50,23,22,23,22,51,50,55,54,53, 52,39,38,35,34,7,39,54,55,54,51,54,55,54,53,52, 35,34,7,39,54,51,50,23,22,23,22,21,20,7,22,51, 22,51,50,63,1,54,23,52,35,34,7,6,7,22,23,22, 51,50,55,54,2,55,48,45,45,151,20,45,46,37,56,57, 26,10,3,15,10,5,30,52,20,20,22,31,39,19,112,56, 34,19,1,8,6,12,29,43,62,47,10,7,67,84,29,50, 4,64,38,43,82,92,22,17,7,24,16,3,19,62,49,47, 69,21,7,34,18,15,62,35,49,49,50,16,22,33,7,3, 121,43,34,38,37,78,68,56,21,12,12,38,73,1,41,30, 56,45,72,43,114,52,43,36,5,21,13,41,19,19,48,14, 3,2,1,37,37,39,87,33,25,25,53,24,22,6,4,13, 8,49,20,7,17,21,37,90,52,31,36,21,21,17,15,38, 51,11,12,76,29,9,13,58,33,20,99,23,24,8,8,16, 8,55,42,34,53,17,21,27,22,11,20,25,29,4,1,6, 23,11,23,61,26,32,34,39,15,18,18,20,46,29,41,20, 49,92,49,121,81,50,7,30,37,19,10,46,12,0,0,1, 255,148,1,205,255,245,2,115,0,3,0,0,3,7,35,55, 11,59,38,62,2,100,151,166,0,2,0,148,0,98,1,175, 1,107,0,15,0,31,0,0,37,20,7,6,35,34,39,38, 53,52,55,54,51,50,23,22,39,34,7,6,21,20,23,22, 51,50,55,54,53,52,39,38,1,175,49,43,50,87,36,18, 56,40,45,93,35,14,142,68,26,10,55,22,27,65,21,6, 33,20,245,62,45,40,61,29,38,61,44,32,60,25,46,50, 19,24,60,24,10,47,15,18,75,20,12,0,0,2,0,173, 255,178,1,193,1,205,0,29,0,42,0,0,5,22,21,20, 7,6,35,34,39,50,53,52,47,1,55,38,39,38,53,52, 55,54,51,50,23,22,21,20,15,1,55,52,39,38,35,34, 21,20,23,22,23,54,55,1,172,21,20,6,6,43,26,46, 5,178,96,68,40,26,59,23,28,55,38,25,29,105,86,32, 13,15,73,52,28,32,18,3,1,18,22,23,11,3,41,18, 4,5,153,96,15,49,32,34,61,22,9,55,38,40,57,29, 105,223,35,18,8,54,55,31,15,1,19,30,0,1,0,143, 255,189,1,196,1,205,0,36,0,0,1,50,23,22,21,20, 7,23,7,39,6,35,34,39,38,61,1,52,55,54,51,50, 23,22,51,50,55,54,53,52,39,38,35,34,7,39,54,1, 42,77,44,28,118,123,22,136,4,9,40,31,18,22,9,7, 29,23,20,10,55,30,16,47,31,32,71,60,29,71,1,205, 64,41,53,96,58,182,34,204,1,28,17,18,18,20,19,8, 50,5,48,26,30,49,37,23,27,33,33,0,0,1,0,133, 255,199,1,207,1,205,0,43,0,0,37,20,7,6,7,23, 7,39,38,39,38,53,52,55,54,51,50,23,55,54,55,54, 53,52,43,1,39,51,50,53,52,39,38,43,1,39,51,50, 23,22,21,20,7,22,1,207,90,13,14,78,33,83,58,36, 20,27,7,7,53,27,25,44,18,7,72,139,20,165,39,45, 17,19,137,31,158,61,44,32,31,66,178,72,45,7,5,93, 13,102,1,29,17,20,31,10,2,64,2,10,43,15,17,66, 39,69,44,18,7,40,49,35,40,43,30,42,0,2,0,47, 0,38,2,1,1,187,0,19,0,31,0,0,1,7,23,22, 21,20,7,6,35,34,39,38,53,52,63,1,39,55,23,55, 3,52,47,1,7,6,21,20,51,50,55,54,2,1,172,79, 38,68,32,33,53,40,41,37,53,234,13,246,189,84,35,58, 55,25,85,57,23,8,1,145,163,56,27,43,43,21,10,31, 32,30,25,34,50,169,32,177,179,254,196,21,23,44,52,24, 20,43,28,10,0,1,0,113,255,198,1,228,1,195,0,32, 0,0,5,7,39,6,35,34,39,38,39,53,54,55,23,6, 21,20,23,22,51,50,53,52,39,38,53,52,55,54,51,50, 21,20,7,1,228,31,88,35,51,94,46,21,4,5,36,30, 25,69,18,21,75,1,25,27,7,7,45,10,36,22,214,24, 72,32,42,41,59,73,42,66,83,68,17,4,31,5,3,21, 19,23,9,2,54,29,21,0,0,1,0,99,255,197,1,251, 1,205,0,54,0,0,5,7,39,7,49,34,39,38,39,38, 53,52,55,38,39,38,53,52,55,54,59,1,7,35,34,7, 6,21,20,23,22,59,1,7,35,34,21,20,23,22,51,50, 53,52,39,38,53,52,51,50,23,22,21,20,7,1,251,33, 83,59,130,65,22,10,3,49,33,17,2,50,28,34,159,22, 142,34,14,17,2,20,39,165,10,141,57,2,18,115,48,3, 6,34,36,26,14,15,44,15,117,2,68,24,29,9,8,39, 31,23,49,14,6,56,31,18,40,17,14,23,5,8,71,39, 46,4,14,81,19,5,6,12,11,27,38,21,20,18,11,0, 0,2,0,78,0,38,1,248,1,197,0,33,0,43,0,0, 37,20,7,6,35,34,39,38,53,52,51,50,21,20,23,22, 51,50,55,54,55,6,35,34,39,38,53,52,55,54,51,50, 23,22,35,52,35,34,7,6,21,20,51,50,1,248,71,40, 56,113,78,68,20,19,51,61,108,72,33,14,2,27,27,63, 37,22,42,21,24,82,36,17,46,82,34,15,6,70,67,234, 114,52,30,133,118,129,35,35,118,100,124,69,30,35,13,43, 25,31,51,27,13,72,35,68,33,12,14,53,0,1,0,102, 0,0,1,213,1,198,0,21,0,0,55,20,23,22,51,50, 55,23,6,7,6,35,34,39,38,53,52,55,1,23,3,6, 146,80,28,34,87,60,34,34,69,38,36,84,56,50,15,1, 7,27,250,11,129,63,20,7,92,29,56,29,17,49,42,51, 24,15,1,17,34,254,252,13,0,2,0,153,255,200,1,250, 1,205,0,27,0,41,0,0,5,20,7,6,35,34,53,50, 53,52,47,1,38,53,52,55,54,51,50,23,22,21,20,7, 6,7,23,22,3,52,47,1,35,34,21,20,23,22,51,50, 55,54,1,250,35,14,14,42,32,20,204,56,68,43,41,79, 36,18,40,33,78,175,43,113,31,26,5,130,27,17,16,56, 46,30,4,30,16,6,49,21,24,20,192,53,46,54,36,22, 52,26,34,40,31,28,27,164,40,1,76,55,11,4,91,24, 27,17,40,26,0,4,0,40,0,68,3,87,2,40,0,3, 0,26,0,107,0,121,0,0,1,7,39,55,23,6,7,6, 35,34,39,38,39,38,53,52,51,50,23,22,23,22,51,50, 55,54,55,23,50,23,22,21,22,7,6,7,6,35,34,39, 38,39,6,35,34,39,22,21,20,7,6,35,34,39,38,39, 38,53,52,51,50,23,22,23,22,51,50,55,54,53,52,39, 38,35,34,7,39,54,55,54,51,54,55,54,53,52,35,34, 7,39,54,51,50,23,22,23,22,21,20,7,22,51,22,51, 50,63,1,54,23,52,35,34,7,6,7,22,23,22,51,50, 55,54,2,55,48,45,45,151,20,45,46,37,56,57,26,10, 3,15,10,5,30,52,20,20,22,31,39,19,112,56,34,19, 1,8,6,12,29,43,62,47,10,7,67,84,29,50,4,64, 38,43,82,92,22,17,7,24,16,3,19,62,49,47,69,21, 7,34,18,15,62,35,49,49,50,16,22,33,7,3,121,43, 34,38,37,78,68,56,21,12,12,38,73,1,41,30,56,45, 72,43,114,52,43,36,5,21,13,41,19,19,48,14,3,2, 1,37,37,39,87,33,25,25,53,24,22,6,4,13,8,49, 20,7,17,21,37,90,52,31,36,21,21,17,15,38,51,11, 12,76,29,9,13,58,33,20,99,23,24,8,8,16,8,55, 42,34,53,17,21,27,22,11,20,25,29,4,1,6,23,11, 23,61,26,32,34,39,15,18,18,20,46,29,41,20,49,92, 49,121,81,50,7,30,37,19,10,46,12,0,0,2,0,20, 1,50,1,4,2,9,0,12,0,29,0,0,19,52,63,1, 22,31,1,20,15,1,38,39,38,39,22,31,1,54,55,54, 55,20,7,6,35,34,39,38,39,38,90,35,21,33,9,2, 35,21,34,8,2,70,38,64,21,56,41,11,9,64,25,30, 16,15,59,22,9,1,214,39,9,2,4,31,15,38,10,1, 3,32,7,52,141,21,3,3,102,27,33,134,53,22,6,24, 93,39,0,3,0,20,0,0,1,104,1,254,0,15,0,29, 0,40,0,0,19,20,23,22,51,50,55,54,53,52,39,38, 35,34,7,6,23,48,23,22,51,50,55,54,48,39,38,35, 34,15,1,22,31,1,22,23,7,48,39,38,39,20,51,31, 38,69,34,17,51,31,38,69,34,17,50,8,20,42,52,16, 2,8,20,42,52,16,52,118,110,102,5,5,40,34,104,122, 1,164,47,27,16,44,21,25,47,27,16,44,21,25,24,36, 52,8,24,36,52,128,11,130,128,6,5,20,54,149,37,0, 0,4,0,19,0,100,1,5,1,254,0,15,0,29,0,45, 0,61,0,0,19,34,39,38,53,52,55,54,51,50,23,22, 21,20,7,6,39,34,15,1,23,22,23,50,55,54,53,52, 39,38,3,34,39,38,53,52,55,54,51,50,23,22,21,20, 7,6,39,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,140,81,30,10,50,30,41,81,30,10,36,33,52,50, 16,3,3,13,53,51,15,4,7,18,45,81,30,10,50,30, 41,81,30,10,50,30,41,50,16,3,36,15,18,51,15,4, 7,18,1,74,52,18,20,50,25,15,52,18,20,41,25,24, 150,39,20,20,39,2,39,10,10,15,13,33,254,132,52,18, 20,50,25,15,52,18,20,50,25,15,150,39,11,11,38,15, 6,39,10,10,15,13,33,0,0,1,255,236,0,0,2,148, 2,88,0,44,0,0,1,23,35,17,39,6,7,35,38,39, 38,39,23,18,23,22,51,50,55,54,53,52,39,6,7,6, 35,34,39,38,39,54,55,54,51,50,23,22,21,20,7,23, 17,33,39,2,108,40,80,120,76,97,30,96,72,61,28,20, 67,121,36,36,71,46,38,24,3,46,13,15,18,15,39,1, 3,45,23,24,70,35,24,13,48,254,12,40,2,88,60,253, 228,165,152,11,14,150,130,204,20,254,225,76,23,75,61,81, 63,60,61,21,6,9,21,58,38,19,10,70,48,74,55,68, 76,1,174,60,0,1,255,236,0,0,3,32,2,88,0,53, 0,0,33,39,17,39,35,17,39,6,7,35,38,39,38,39, 23,18,23,22,51,50,55,54,53,52,39,20,7,6,35,39, 38,39,38,53,52,55,54,51,50,23,22,21,20,7,23,17, 33,39,33,23,53,51,23,35,2,208,60,39,41,118,77,98, 30,96,71,62,28,20,65,121,38,38,71,46,38,27,46,13, 15,22,45,8,1,43,24,26,74,35,23,14,49,254,12,40, 2,128,40,100,40,80,74,1,150,60,253,228,168,156,11,14, 150,130,205,20,254,230,78,24,73,60,80,66,63,63,21,7, 3,15,54,9,10,33,20,10,71,47,72,56,69,76,1,174, 60,60,60,60,0,2,255,236,0,0,2,28,3,22,0,18, 0,61,0,0,1,52,47,2,38,39,20,23,22,51,50,23, 22,21,33,23,33,39,1,22,23,22,23,7,38,39,38,49, 39,22,51,55,54,55,54,53,52,39,38,39,6,15,1,38, 39,38,53,52,55,54,51,22,23,22,23,22,21,7,6,7, 6,1,204,124,62,201,90,3,106,40,71,125,25,83,254,62, 40,2,8,40,254,160,23,146,100,43,40,112,227,41,40,39, 55,68,127,71,36,46,44,83,4,68,30,57,31,14,95,26, 31,123,91,50,17,9,4,24,166,71,2,88,102,24,7,3, 6,48,91,20,8,3,11,57,60,60,254,152,4,104,71,41, 20,124,99,17,60,12,4,14,44,22,23,25,21,20,15,76, 15,3,2,33,15,17,51,13,4,1,45,26,33,17,17,21, 67,35,15,0,0,2,255,236,0,0,2,28,3,22,0,18, 0,71,0,0,1,33,23,33,39,35,52,47,2,38,39,20, 23,22,51,50,23,22,19,7,39,38,53,52,55,6,7,6, 7,6,35,34,39,22,51,50,55,54,55,39,38,39,38,39, 20,7,6,35,34,39,38,53,55,54,55,54,51,50,23,22, 23,20,21,54,55,54,55,23,6,7,20,1,174,254,62,40, 2,8,40,40,124,62,201,90,3,106,40,71,125,25,83,10, 20,36,30,19,21,53,70,40,39,36,58,56,21,29,25,28, 64,39,2,2,18,3,2,49,15,16,48,22,11,2,11,46, 19,20,19,16,71,4,67,29,28,60,50,63,1,2,88,60, 60,102,24,7,3,6,48,91,20,8,3,11,253,131,20,67, 65,90,75,99,10,67,89,29,28,69,17,13,29,72,44,13, 18,3,2,63,21,6,43,21,28,22,41,17,8,6,26,110, 6,6,92,23,23,17,100,94,117,94,0,1,255,236,0,0, 2,38,3,22,0,51,0,0,19,51,21,23,54,55,21,6, 7,6,35,34,39,38,39,38,47,1,16,23,22,23,55,54, 55,54,53,52,39,6,15,2,53,33,39,35,52,47,2,38, 39,20,23,22,51,23,22,31,1,33,20,180,70,105,65,10, 77,43,51,56,49,109,22,2,1,20,124,59,75,37,89,56, 47,37,31,100,42,17,1,34,40,40,128,64,203,91,4,108, 41,74,124,100,11,2,254,52,2,28,240,70,39,71,52,116, 58,32,39,86,225,24,24,20,254,196,124,59,1,4,18,86, 74,94,81,83,73,47,17,3,240,60,103,23,7,3,11,43, 91,20,8,1,6,49,15,0,0,1,255,236,0,1,2,58, 3,22,0,63,0,0,1,51,23,33,21,54,55,54,55,22, 21,22,7,6,7,35,38,39,38,39,23,22,23,22,23,38, 39,38,53,52,55,23,18,23,22,51,50,55,54,55,6,7, 6,7,39,53,35,39,33,52,39,38,35,34,39,38,53,20, 23,22,23,50,23,22,1,234,40,40,254,222,107,48,9,6, 35,1,56,61,90,37,106,66,65,5,20,11,68,46,57,88, 26,9,1,20,10,89,36,41,65,48,40,11,62,52,17,18, 70,201,40,1,224,90,26,133,143,49,39,92,15,142,162,56, 43,2,88,60,240,46,68,13,13,84,80,105,76,83,10,10, 118,119,201,20,160,113,77,17,76,189,62,68,21,21,20,254, 247,95,37,83,70,104,68,27,8,7,70,240,60,57,11,3, 36,28,55,46,8,1,1,42,32,0,0,2,0,20,0,0, 2,118,2,88,0,37,0,43,0,0,33,17,51,39,35,17, 39,17,35,21,7,39,15,1,6,7,38,47,1,6,7,6, 21,20,31,1,54,55,54,55,23,5,23,22,23,22,21,53, 3,17,38,39,38,49,2,38,80,40,100,60,60,40,110,35, 14,11,14,6,42,22,39,13,4,47,25,57,39,27,5,80, 254,232,20,159,142,89,60,82,144,24,2,28,60,254,32,70, 1,154,100,20,120,84,21,13,5,50,11,2,3,34,11,12, 53,12,2,2,50,36,49,90,160,20,69,114,72,25,130,1, 59,254,197,106,56,8,0,1,0,20,255,254,1,124,2,88, 0,52,0,0,55,39,22,51,50,55,54,55,39,38,39,23, 6,7,6,35,34,39,38,53,52,55,51,22,23,22,21,20, 7,54,55,54,53,39,38,39,38,39,38,53,23,22,31,1, 22,21,20,7,6,7,6,35,38,50,30,25,34,51,28,12, 1,4,7,20,2,3,27,19,21,46,5,1,50,25,55,38, 27,15,99,9,2,4,12,76,90,14,94,20,8,97,135,100, 71,34,45,31,35,54,20,60,19,34,15,17,18,18,17,14, 21,14,12,49,6,6,63,8,7,48,36,41,30,29,21,105, 13,21,24,40,59,69,12,85,91,20,52,72,96,77,63,105, 64,31,13,9,1,0,0,1,0,20,0,0,1,184,2,88, 0,48,0,0,19,51,22,31,1,7,6,7,6,35,34,39, 38,53,52,55,54,55,54,49,23,17,38,35,34,15,1,6, 35,34,39,38,53,23,22,23,22,51,50,63,1,54,51,50, 23,17,48,7,6,207,17,34,13,5,3,1,2,18,46,46, 23,12,5,24,166,60,60,58,61,37,46,59,14,10,125,9, 1,20,13,42,10,14,19,35,60,25,23,56,43,59,91,1, 184,5,29,18,21,3,4,41,39,21,26,17,18,90,54,16, 70,253,238,64,25,33,6,208,15,17,20,117,17,4,10,22, 8,42,1,194,15,30,0,1,0,20,0,0,2,68,3,32, 0,72,0,0,1,52,39,38,39,38,39,38,53,20,31,1, 22,23,22,21,20,7,6,7,53,39,48,7,6,7,6,21, 23,22,31,1,54,55,54,53,52,39,38,39,38,35,34,7, 54,55,54,49,17,38,35,34,15,1,6,35,34,39,38,47, 1,22,23,50,55,54,51,50,23,19,50,55,54,2,68,149, 33,98,70,8,2,73,128,91,7,1,37,12,11,80,66,161, 23,5,3,12,44,24,44,18,6,10,5,9,17,19,5,4, 29,128,16,43,56,36,63,9,35,19,45,19,10,5,20,5, 130,16,48,60,45,66,70,1,45,39,35,1,234,154,65,14, 27,19,21,5,5,57,41,63,52,81,8,8,48,40,14,3, 145,70,18,54,88,18,16,27,45,12,3,1,40,13,12,16, 13,8,7,12,1,57,30,3,254,62,42,27,3,10,57,30, 51,20,235,5,27,34,61,1,109,43,37,0,0,1,0,20, 255,255,2,54,2,91,0,67,0,0,1,54,53,54,39,38, 39,38,35,34,7,6,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,35,54,51,50,23,22,21,20,7,38,39,7, 6,7,20,23,22,51,50,55,54,55,6,7,6,35,34,39, 38,47,1,18,23,22,51,50,55,54,53,52,39,54,2,49, 4,1,4,17,81,52,55,22,19,16,14,66,30,19,23,14, 14,39,19,9,11,13,32,55,49,48,27,39,32,21,33,5, 25,16,20,26,28,8,7,4,75,20,23,84,90,98,56,20, 75,160,50,55,87,63,52,32,5,1,129,18,19,17,16,76, 43,28,4,4,8,34,89,29,24,16,6,18,40,31,21,10, 19,43,42,55,39,40,28,1,4,18,37,32,26,16,28,7, 9,140,35,10,105,113,187,20,254,145,101,32,72,60,69,51, 38,10,0,1,0,20,0,0,2,168,3,32,0,95,0,0, 1,6,7,39,38,39,38,53,52,55,54,51,50,23,54,53, 39,38,39,38,35,7,6,7,23,22,31,1,22,21,20,7, 6,35,39,38,39,38,53,52,55,54,51,50,31,1,22,21, 20,7,54,55,54,53,52,47,2,38,53,20,23,22,23,22, 23,22,21,20,7,6,35,6,7,22,21,20,7,6,35,34, 39,38,39,38,39,23,22,23,22,51,50,55,54,55,54,1, 234,36,32,18,31,11,2,30,13,15,32,40,27,3,16,66, 35,32,23,14,8,11,8,6,10,4,39,13,14,21,34,14, 4,81,25,30,83,65,23,38,4,23,21,15,92,59,77,72, 4,13,76,113,48,106,56,35,33,20,6,31,62,61,79,24, 24,133,87,42,29,20,68,122,74,66,19,17,76,7,1,1, 4,43,1,3,13,42,9,7,36,16,7,29,39,39,29,60, 34,18,3,5,11,3,4,9,21,13,12,40,18,6,3,12, 35,10,9,101,29,9,55,23,46,55,19,19,7,40,30,28, 89,55,31,38,40,57,8,7,18,21,30,29,65,132,58,41, 26,62,13,38,50,77,63,61,6,36,213,104,140,20,225,113, 68,6,29,131,10,0,0,2,255,236,0,0,2,158,2,88, 0,5,0,38,0,0,1,7,48,23,22,23,19,50,23,22, 23,20,7,6,7,39,38,47,1,54,55,38,47,1,17,52, 39,38,39,38,47,1,37,53,33,39,33,23,33,1,94,250, 62,129,59,60,53,59,70,1,3,13,42,20,33,11,3,1, 71,16,100,14,94,143,132,11,10,20,1,94,254,182,40,2, 138,40,254,252,1,189,145,26,61,83,1,114,46,55,71,14, 14,62,3,2,11,32,20,46,24,52,16,2,254,72,23,78, 117,54,4,4,20,200,40,60,60,0,0,1,0,20,0,0, 1,254,2,88,0,46,0,0,19,54,55,23,22,21,20,7, 6,15,1,23,22,23,22,23,17,51,39,35,17,38,47,1, 55,54,53,52,39,38,35,48,23,6,7,38,39,7,6,7, 6,21,20,23,22,51,50,140,41,9,44,56,11,20,49,190, 20,134,148,107,1,80,40,100,77,149,24,140,59,57,47,65, 2,1,11,16,39,22,36,6,1,40,11,12,26,1,174,27, 83,2,9,32,14,16,29,28,110,20,54,114,83,29,2,28, 60,254,42,102,59,9,80,34,57,58,39,32,50,35,15,39, 1,3,11,32,5,5,53,15,4,0,0,1,0,20,0,0, 1,254,2,88,0,41,0,0,1,53,51,23,35,17,39,17, 38,35,7,6,7,6,7,54,55,23,22,23,7,6,7,39, 54,55,47,1,7,6,7,6,35,39,38,53,52,55,54,51, 50,23,1,114,100,40,80,60,82,79,25,58,39,12,5,43, 57,26,46,1,4,20,109,40,111,1,3,10,24,27,28,23, 20,16,11,82,45,63,72,70,1,189,155,60,253,228,64,1, 80,140,3,17,82,25,23,48,1,4,13,46,27,71,90,40, 98,29,7,4,3,8,15,13,3,6,14,151,64,35,120,0, 0,2,255,236,0,0,1,234,2,88,0,15,0,35,0,0, 1,33,6,21,20,23,22,23,55,23,7,23,22,23,22,23, 19,35,17,52,39,38,47,1,55,38,39,38,53,52,55,54, 55,35,39,33,1,94,254,242,5,96,56,3,50,40,220,29, 113,70,24,14,140,80,108,140,142,20,190,111,38,37,8,11, 27,30,40,1,214,2,28,7,7,28,42,24,2,30,30,130, 10,47,68,23,22,1,154,253,228,30,83,107,60,20,110,17, 18,17,23,10,12,15,18,60,0,2,0,18,0,0,1,250, 2,89,0,55,0,65,0,0,1,21,54,55,54,55,22,21, 20,7,6,7,6,35,34,39,38,39,38,53,23,22,23,22, 23,50,55,54,55,54,53,52,39,6,7,39,53,38,39,38, 39,22,51,52,55,54,51,23,22,23,22,21,7,6,7,6, 53,50,55,39,38,39,15,2,6,1,22,29,53,76,32,37, 13,31,85,47,51,50,45,119,34,12,20,12,110,53,63,32, 30,77,30,14,1,65,105,70,32,36,20,2,62,28,53,20, 22,22,20,9,15,3,16,75,7,50,1,3,6,11,11,9, 8,3,1,182,138,2,29,43,66,83,81,48,45,105,50,28, 28,73,227,78,94,20,248,101,49,1,14,34,94,44,51,11, 11,71,39,70,138,12,47,26,15,40,63,28,11,3,7,17, 29,23,22,47,13,1,60,25,15,14,1,3,9,18,11,0, 0,2,255,236,0,0,1,255,2,88,0,11,0,32,0,0, 19,17,54,55,54,53,39,38,39,38,39,38,39,22,31,1, 22,23,22,21,6,7,6,7,34,7,39,17,35,39,33,23, 33,110,101,88,91,2,5,61,126,55,18,13,53,93,110,47, 31,5,1,142,102,108,5,4,37,30,40,1,234,41,254,111, 1,224,254,107,30,70,72,65,21,8,15,31,54,18,61,73, 22,23,13,26,24,23,128,98,71,18,1,51,1,233,60,60, 0,2,255,236,255,176,2,39,2,88,0,8,0,47,0,0, 19,21,54,55,54,49,38,39,38,23,6,7,6,21,39,17, 35,39,33,23,33,21,22,31,1,22,31,1,6,7,6,7, 22,31,1,7,38,39,38,49,39,22,51,50,55,54,53,52, 110,73,82,3,39,60,37,197,75,156,11,37,30,40,2,18, 41,254,71,22,190,14,44,13,3,2,80,44,62,104,108,70, 40,110,214,46,30,47,45,119,53,27,1,196,154,6,64,2, 6,33,20,79,69,53,4,1,51,1,10,60,60,20,52,57, 5,21,58,33,80,43,24,7,30,102,68,20,121,74,15,60, 10,55,28,36,25,0,0,1,255,236,255,216,2,138,2,88, 0,63,0,0,1,35,21,22,51,55,54,55,54,55,22,23, 7,6,7,6,35,34,39,38,17,23,18,23,22,51,55,54, 55,54,53,6,35,34,47,1,53,35,39,33,23,33,48,23, 22,51,55,54,55,23,6,21,20,23,7,38,39,38,53,54, 55,48,39,38,1,64,90,1,7,17,41,36,11,7,45,1, 3,15,72,38,43,78,58,89,20,13,94,35,40,26,61,34, 27,97,34,21,23,15,140,40,2,118,40,254,222,22,45,51, 30,6,6,50,64,44,20,42,14,13,1,18,43,90,2,28, 220,6,5,20,50,16,15,95,92,49,109,52,29,87,134,1, 29,20,254,246,92,34,3,18,80,62,79,81,30,21,240,60, 60,24,43,3,2,2,100,94,124,97,85,20,80,60,57,67, 80,96,19,47,0,2,255,236,0,0,2,98,2,88,0,18, 0,24,0,0,33,17,51,39,35,17,39,17,33,23,33,21, 5,23,22,23,22,23,53,3,17,38,39,38,49,2,18,80, 40,100,60,254,82,40,1,74,254,162,20,154,150,84,2,60, 51,169,30,2,28,60,254,32,70,1,154,60,40,200,20,62, 125,71,22,130,1,59,254,197,85,73,12,0,0,2,0,24, 0,0,2,120,2,88,0,31,0,99,0,0,1,6,7,39, 38,39,55,54,55,50,23,22,23,54,53,39,38,35,7,6, 7,6,7,22,23,22,51,50,53,52,39,38,55,22,21,20, 7,6,35,34,39,38,39,17,38,39,7,6,7,6,35,34, 39,38,53,23,22,23,22,51,50,63,1,54,51,50,23,17, 48,7,6,7,51,22,31,1,7,6,7,6,35,34,39,38, 53,52,55,54,55,54,49,23,21,54,55,51,22,31,1,20, 2,52,26,20,13,22,1,3,9,23,10,13,11,13,17,2, 6,15,19,43,37,17,8,22,54,29,20,23,10,3,25,36, 43,14,16,15,16,55,37,58,58,30,25,56,32,16,125,9, 1,20,13,42,10,14,19,35,57,23,22,52,43,54,83,23, 17,32,13,4,4,1,1,18,46,46,23,12,5,24,159,57, 60,47,65,25,44,13,3,1,84,28,3,2,8,35,23,29, 1,7,7,12,46,27,19,15,4,17,57,25,25,65,46,26, 34,22,35,12,34,53,48,55,19,7,6,21,75,254,232,63, 1,4,7,34,19,208,15,17,20,117,17,4,10,23,7,42, 1,194,16,29,45,5,29,19,21,3,3,41,39,21,26,17, 18,90,54,16,70,90,85,10,7,44,27,46,0,1,255,236, 0,0,2,19,3,22,0,55,0,0,1,51,23,33,17,54, 55,54,55,39,38,53,6,35,39,38,39,38,53,52,55,54, 55,51,22,23,20,23,22,21,20,7,6,7,6,7,39,17, 35,39,33,52,39,38,35,34,39,38,53,20,23,22,23,50, 23,22,1,194,40,41,254,91,82,91,101,6,1,1,31,31, 21,37,13,4,9,20,49,29,66,20,1,5,131,97,104,16, 15,37,30,40,1,184,83,24,121,132,44,36,84,14,132,148, 52,40,2,88,60,254,47,23,82,93,75,25,2,1,30,3, 12,43,12,13,18,13,31,7,8,78,3,3,23,24,127,113, 85,28,4,2,51,1,233,60,57,11,3,36,28,55,46,8, 1,1,42,32,0,2,255,236,255,255,1,245,3,37,0,20, 0,66,0,0,19,35,22,21,20,7,6,7,6,15,1,22, 51,55,54,55,54,53,52,39,38,55,22,21,22,7,6,7, 6,7,34,39,38,47,1,55,54,63,1,54,53,52,39,35, 39,51,39,38,39,53,54,51,50,31,1,38,39,15,1,6, 7,20,23,22,23,51,23,250,40,27,33,14,43,38,5,1, 42,45,27,62,40,31,34,25,9,120,1,12,29,78,50,54, 16,17,40,35,47,3,9,50,47,39,21,130,60,163,5,57, 7,9,66,22,29,40,29,22,23,15,13,1,5,17,61,250, 31,2,28,105,70,76,42,16,29,25,29,18,42,3,18,83, 65,73,77,60,43,30,91,148,44,44,110,62,41,1,4,11, 36,51,49,68,43,39,40,68,53,79,60,6,75,56,25,43, 5,60,10,1,3,8,11,19,11,13,45,41,60,0,0,1, 255,236,255,250,2,28,2,88,0,36,0,0,1,23,33,21, 54,55,54,55,22,23,7,6,7,6,35,34,39,38,17,23, 22,23,22,51,55,54,55,54,53,6,7,6,7,39,53,35, 39,1,244,40,254,252,92,35,22,11,40,1,4,16,82,54, 61,101,70,93,20,12,111,50,59,34,78,44,32,40,81,9, 30,70,190,40,2,88,60,240,40,34,21,25,85,82,48,111, 61,39,101,135,1,14,20,254,99,44,3,17,81,60,76,44, 31,4,11,70,240,60,0,1,255,236,0,0,2,19,2,88, 0,38,0,0,1,23,33,17,54,55,54,55,39,38,53,6, 35,39,38,39,38,53,52,55,54,63,1,22,23,20,23,22, 21,20,7,6,7,6,7,39,17,35,39,1,234,41,254,91, 82,91,101,6,1,1,31,31,20,37,13,4,8,20,49,30, 70,20,1,5,124,96,109,21,18,37,30,40,2,88,60,254, 47,23,82,93,75,25,2,1,30,3,12,43,13,13,17,13, 31,7,1,8,79,3,3,23,23,122,111,86,32,6,3,51, 1,233,60,0,0,1,0,20,0,0,1,234,2,88,0,39, 0,0,19,38,39,38,53,52,55,54,51,22,23,22,49,53, 51,23,35,17,39,17,38,35,34,7,6,21,20,23,54,55, 23,22,23,22,21,20,7,6,35,34,120,68,23,9,53,40, 57,57,113,8,102,40,80,60,103,70,66,24,8,11,30,45, 20,34,14,5,12,24,63,9,1,4,11,77,29,33,90,56, 44,1,102,7,110,60,253,228,64,1,115,94,76,27,31,36, 19,78,3,2,12,43,14,15,22,18,36,0,0,2,255,236, 255,254,2,48,2,88,0,3,0,44,0,0,1,39,33,23, 1,54,53,52,39,38,35,34,7,6,21,20,23,22,51,55, 54,55,54,53,22,21,7,6,7,6,35,34,39,38,39,38, 47,1,18,23,22,51,50,55,54,2,48,40,253,228,40,1, 194,15,85,19,23,48,32,18,46,13,15,22,45,8,1,26, 3,15,65,33,38,31,31,115,68,9,8,20,41,113,56,63, 80,69,26,2,28,60,60,254,158,72,58,144,33,8,30,16, 18,63,21,7,3,15,54,9,10,63,65,47,98,46,23,15, 60,242,33,35,20,254,203,128,64,99,38,0,0,1,0,20, 0,0,1,254,2,88,0,43,0,0,19,50,23,22,21,20, 15,1,48,23,22,23,17,51,23,35,17,39,38,39,38,39, 38,47,1,55,54,55,39,38,35,22,21,7,6,15,1,38, 39,38,53,52,55,54,150,93,42,20,45,140,65,133,52,100, 40,80,5,19,60,147,153,3,3,20,190,45,6,1,12,98, 10,3,11,38,24,43,16,5,80,23,2,88,68,32,36,58, 26,80,27,62,81,1,214,60,253,228,13,28,50,124,63,1, 1,20,110,26,38,19,47,27,23,26,39,10,3,2,37,13, 16,87,25,8,0,1,255,236,0,0,1,235,2,88,0,25, 0,0,19,17,33,39,33,23,51,17,23,48,55,54,55,6, 21,20,31,1,55,38,53,54,55,39,6,7,110,1,125,41, 254,42,40,30,60,70,93,50,19,46,20,20,44,1,63,50, 86,115,1,18,1,10,60,60,254,222,71,85,106,26,99,75, 105,82,35,20,85,94,117,94,100,24,147,0,0,2,0,20, 0,0,1,254,2,88,0,5,0,36,0,0,1,7,48,23, 22,23,3,55,53,51,23,35,17,52,39,38,47,1,55,48, 39,38,39,55,54,55,54,51,23,22,31,1,6,7,22,23, 22,1,114,250,69,133,48,115,115,100,40,80,93,134,163,20, 211,50,90,1,4,4,8,20,33,23,38,12,3,1,48,17, 35,12,1,189,145,30,65,75,1,48,66,100,60,253,228,28, 74,107,71,20,122,15,34,53,22,12,12,29,3,12,34,19, 37,27,23,5,2,0,0,1,255,236,0,0,1,214,2,88, 0,29,0,0,1,17,38,47,1,6,7,6,21,20,23,22, 51,50,55,54,53,52,39,22,23,22,23,22,23,17,51,39, 33,23,1,74,85,125,31,61,21,7,48,16,17,48,16,4, 29,80,85,8,82,8,7,80,40,254,62,40,2,28,254,153, 205,20,1,5,58,21,23,46,16,5,31,10,10,29,36,19, 139,14,149,15,13,2,28,60,60,0,0,2,0,19,0,0, 2,69,2,88,0,33,0,49,0,0,63,1,54,53,52,39, 38,35,34,15,1,6,7,6,35,39,38,53,52,55,54,51, 50,31,1,53,51,23,35,17,39,17,39,5,55,38,39,38, 35,34,7,55,22,23,22,21,7,6,7,48,120,27,11,48, 23,12,4,1,3,4,8,10,10,10,5,152,23,25,65,135, 20,101,40,80,61,20,254,242,220,26,54,39,36,97,46,10, 31,38,31,3,5,11,240,24,10,13,30,31,14,2,13,7, 5,6,2,3,6,225,30,5,139,21,160,60,253,228,60,1, 84,20,210,240,42,29,20,148,2,2,31,27,26,17,11,10, 0,1,255,236,0,0,2,158,2,88,0,48,0,0,1,17, 38,37,38,49,39,55,38,39,38,53,52,55,54,55,35,39, 33,23,33,6,21,20,31,1,7,48,23,22,23,17,51,50, 23,22,23,20,7,6,7,39,38,47,1,54,55,38,39,1, 154,87,254,225,16,20,190,111,38,37,8,11,27,30,40,2, 138,40,253,178,5,55,160,190,103,91,56,60,53,59,70,1, 3,13,42,20,33,11,3,1,71,16,100,1,184,254,72,94, 176,10,20,110,17,18,17,23,10,12,15,18,60,60,8,7, 21,25,69,110,63,58,49,1,114,46,55,71,14,14,62,3, 2,11,32,20,46,24,52,16,0,2,255,236,0,0,1,234, 2,88,0,5,0,18,0,0,1,7,48,23,22,23,17,33, 39,33,23,35,17,52,39,38,47,1,37,1,94,250,63,129, 58,254,182,40,1,214,40,80,93,133,164,20,1,94,1,189, 145,26,61,83,1,154,60,60,253,228,26,74,107,73,20,200, 0,2,255,236,0,1,2,98,2,88,0,3,0,52,0,0, 19,39,33,23,3,6,7,34,39,38,39,38,39,23,18,23, 22,51,50,55,54,53,52,39,6,7,39,38,39,38,53,52, 55,54,55,23,22,23,22,21,20,7,6,7,55,54,55,54, 55,22,31,1,6,20,40,2,78,40,131,78,95,24,24,113, 76,44,25,20,78,136,40,41,82,54,46,17,59,88,30,50, 31,22,30,27,31,21,37,17,7,18,14,23,29,46,51,18, 21,41,9,1,4,2,28,60,60,254,86,112,1,8,37,191, 111,152,20,254,227,76,22,75,63,82,48,45,122,8,1,9, 43,32,37,42,34,29,1,3,12,42,17,17,28,22,17,10, 1,8,77,26,38,32,104,60,112,0,0,2,255,237,0,0, 1,234,2,88,0,36,0,54,0,0,1,17,38,47,1,6, 7,39,38,39,53,54,63,1,22,23,48,55,54,53,52,39, 38,39,38,39,38,39,55,54,55,54,55,35,39,33,23,5, 22,21,20,15,1,48,23,22,23,17,33,7,22,23,22,23, 22,1,154,76,134,30,43,34,19,39,7,7,39,22,33,41, 20,13,1,6,77,80,17,15,2,1,4,24,8,5,25,41, 1,213,40,254,246,6,48,12,74,59,47,254,240,3,2,48, 65,19,9,2,28,253,228,123,64,13,33,1,3,13,53,31, 53,12,3,2,32,27,22,16,4,4,25,22,24,11,10,12, 17,12,21,7,6,60,60,156,12,13,32,62,15,43,38,39, 1,154,13,19,34,45,23,11,0,2,255,236,0,0,1,234, 2,88,0,11,0,33,0,0,1,33,6,21,20,31,1,7, 48,23,22,23,19,17,52,39,38,39,38,47,1,55,38,39, 38,53,52,55,54,55,35,39,33,23,1,94,254,242,5,55, 160,190,70,138,42,60,84,143,154,4,5,20,190,111,38,37, 8,11,27,30,40,1,214,40,2,28,8,7,21,25,69,110, 29,66,75,1,154,253,228,22,71,122,61,2,2,20,110,17, 18,17,23,10,12,15,18,60,60,0,0,3,255,236,0,0, 1,234,2,88,0,13,0,19,0,32,0,0,55,52,63,1, 22,23,22,21,20,15,1,38,39,38,19,7,48,23,22,23, 17,33,39,33,23,35,17,52,39,38,47,1,37,140,35,21, 33,9,2,35,21,34,8,2,210,250,65,127,58,254,182,40, 1,214,40,80,95,135,160,20,1,94,50,39,9,2,4,31, 7,8,38,10,1,3,32,7,1,146,145,28,63,79,1,154, 60,60,253,228,29,76,107,68,20,200,0,1,255,236,0,0, 1,234,2,88,0,51,0,0,55,54,55,23,22,31,1,6, 7,39,38,39,48,39,38,53,55,54,55,54,51,50,23,54, 51,50,31,2,22,23,53,33,39,33,23,35,17,39,17,38, 35,34,7,38,35,34,7,6,21,20,23,73,24,38,17,30, 11,2,1,47,32,20,25,21,49,3,11,41,20,21,60,44, 39,41,12,11,15,16,9,7,254,182,40,1,214,40,80,60, 36,32,41,41,51,49,37,17,7,21,237,71,2,4,12,39, 24,42,3,2,3,9,23,64,83,27,53,27,13,100,100,9, 16,29,20,26,150,60,60,253,228,64,1,36,54,90,90,46, 21,22,40,29,0,1,0,20,0,0,2,18,2,88,0,51, 0,0,19,6,7,39,38,53,52,55,54,55,38,39,7,6, 7,39,48,55,54,51,23,22,23,22,23,54,55,23,22,23, 22,23,53,51,23,35,17,39,17,38,39,7,6,7,22,23, 7,6,35,34,39,38,190,39,39,15,23,5,14,47,18,34, 15,20,16,17,17,24,25,20,29,27,14,14,48,54,20,45, 25,5,3,100,40,80,60,54,39,13,25,19,61,5,2,8, 26,27,28,13,1,114,74,1,3,11,34,15,15,45,32,89, 1,4,10,28,39,23,25,3,11,45,24,32,114,1,3,18, 85,17,18,156,60,253,228,64,1,90,129,1,3,14,73,42, 57,25,31,36,16,0,0,3,255,236,0,0,1,234,2,88, 0,6,0,12,0,32,0,0,1,39,7,48,23,22,23,17, 53,33,6,21,22,37,17,52,39,38,47,1,55,38,39,38, 53,52,55,54,55,35,39,33,23,1,94,91,159,64,128,58, 254,242,5,1,1,78,75,140,175,20,190,111,38,37,8,11, 27,30,40,1,214,40,1,110,27,93,27,62,81,1,15,139, 6,6,48,60,253,228,22,65,122,71,20,110,17,18,17,23, 10,12,15,18,60,60,0,2,255,236,0,0,1,234,2,88, 0,32,0,48,0,0,17,22,51,50,55,54,49,38,39,38, 53,38,55,54,55,35,39,33,23,35,17,39,17,38,39,15, 1,6,7,6,7,39,38,55,54,51,50,23,22,31,1,53, 33,6,21,23,22,23,22,17,23,71,105,14,148,45,31,1, 38,3,4,30,40,1,214,40,80,60,14,25,16,22,12,59, 74,47,22,32,223,34,17,6,6,8,23,6,254,241,5,3, 15,99,48,1,44,12,103,14,21,23,17,20,22,27,3,2, 60,60,253,228,60,1,50,44,1,4,14,9,60,75,2,3, 10,170,31,4,6,41,10,140,6,7,11,23,38,18,0,2, 255,236,0,0,2,28,2,88,0,3,0,46,0,0,1,33, 23,33,1,22,23,22,23,7,38,39,38,49,39,22,51,55, 54,55,54,53,52,39,38,39,6,15,1,38,39,38,53,52, 55,54,51,22,23,22,23,22,21,7,6,7,6,1,244,253, 248,40,2,8,254,120,23,146,100,43,40,112,227,41,40,39, 55,68,127,71,36,46,44,83,4,68,30,57,31,14,95,26, 31,123,91,50,17,9,4,24,166,71,2,88,60,254,212,4, 104,71,41,20,124,99,17,60,12,4,14,44,22,23,25,21, 20,15,76,15,3,2,33,15,17,51,13,4,1,45,26,33, 17,17,21,67,35,15,0,1,0,20,255,156,0,120,0,1, 0,13,0,0,23,52,63,1,22,23,22,21,20,15,1,38, 39,38,20,35,21,33,9,2,35,21,34,8,2,50,39,9, 2,4,31,7,8,38,10,1,3,32,7,0,0,1,255,236, 0,0,0,200,2,88,0,9,0,0,19,23,53,51,23,35, 17,39,17,39,20,40,100,40,80,60,80,2,88,60,60,60, 253,228,60,1,164,120,0,1,255,236,0,0,2,168,3,33, 0,26,0,0,19,39,51,39,54,51,50,23,22,23,22,23, 35,39,38,35,34,7,6,7,23,51,23,35,17,39,17,20, 40,80,20,94,148,97,153,116,14,10,8,20,241,83,50,47, 39,48,52,20,40,40,80,60,2,28,60,30,170,84,62,7, 4,3,76,24,20,24,66,30,60,253,228,60,1,224,0,1, 254,12,0,0,0,200,3,33,0,38,0,0,19,35,17,39, 17,35,39,51,39,38,39,38,35,34,7,6,7,6,21,20, 31,1,22,23,35,52,47,1,38,53,52,55,54,51,50,23, 22,21,51,200,80,60,40,40,80,1,12,88,81,115,129,54, 12,5,3,94,148,137,1,60,96,163,121,98,77,100,176,96, 73,40,2,28,253,228,60,1,224,60,29,64,36,33,34,8, 9,6,5,25,1,2,9,63,33,3,1,7,56,48,30,23, 68,52,81,0,0,2,0,20,255,106,1,24,0,0,0,11, 0,33,0,0,23,39,6,21,20,23,22,23,55,54,55,54, 23,6,7,39,38,47,1,54,63,1,22,23,55,51,7,22, 23,22,23,38,39,38,148,34,66,1,6,19,18,32,19,3, 28,46,48,20,31,7,1,6,57,39,16,17,14,30,18,60, 32,4,2,30,50,17,60,1,3,28,4,4,22,1,4,13, 33,6,3,70,6,1,8,30,19,39,10,3,1,2,37,46, 23,66,9,6,38,31,11,0,0,1,0,28,255,76,1,13, 0,0,0,31,0,0,23,38,39,7,6,7,6,21,20,23, 51,54,55,22,31,1,38,47,1,6,7,39,38,39,53,54, 63,1,22,23,55,51,159,18,37,24,20,4,2,25,18,22, 25,59,60,6,26,73,21,33,28,19,33,7,7,42,27,17, 19,8,30,55,13,1,3,5,18,6,7,28,6,3,21,4, 78,8,29,25,6,26,1,2,11,40,25,43,9,1,1,7, 24,0,0,1,0,35,255,106,0,173,0,0,0,5,0,0, 23,55,23,7,23,7,35,115,23,82,82,23,75,75,23,52, 52,23,0,2,255,206,255,14,0,213,0,0,0,5,0,11, 0,0,7,55,23,7,23,7,63,1,23,7,23,7,50,116, 22,82,82,22,9,115,23,82,82,23,167,75,23,52,52,23, 167,75,23,52,52,23,0,1,255,236,0,3,1,104,2,88, 0,30,0,0,3,33,23,35,7,6,21,20,23,22,23,54, 51,50,23,22,21,7,6,35,34,39,38,53,38,55,54,55, 54,49,35,20,1,84,40,170,50,80,10,23,77,27,35,28, 14,5,3,10,37,17,22,189,1,4,21,118,17,140,2,88, 60,83,142,104,35,30,70,36,68,34,12,13,19,26,6,54, 146,21,23,123,144,19,0,1,255,236,0,3,1,104,3,22, 0,48,0,0,19,52,39,38,35,34,39,38,53,20,23,22, 23,50,31,1,22,21,35,23,51,48,7,6,21,6,23,22, 23,55,54,55,39,38,39,35,6,7,6,7,38,53,52,55, 54,63,1,51,39,190,70,14,59,50,12,5,55,10,52,45, 12,5,1,180,40,140,44,115,1,190,17,14,24,33,1,3, 11,26,15,23,19,6,6,110,7,22,99,2,170,40,2,88, 114,17,3,26,11,19,102,14,2,1,29,26,8,8,60,55, 155,119,147,54,5,1,2,7,33,23,33,5,6,36,11,14, 51,119,30,34,108,154,4,60,0,2,255,236,0,0,2,248, 2,88,0,9,0,40,0,0,1,23,53,51,23,35,17,39, 17,39,41,1,23,35,7,6,21,20,23,22,23,54,51,50, 23,22,21,7,6,35,34,39,38,53,38,55,54,55,54,49, 35,2,68,40,100,40,80,60,80,253,208,1,84,40,170,50, 80,10,23,77,27,35,28,14,5,3,10,37,17,22,189,1, 4,21,118,17,140,2,88,60,60,60,253,228,60,1,150,134, 60,83,142,104,35,30,70,36,68,34,12,13,19,26,6,54, 146,21,23,123,144,19,0,2,255,236,0,0,2,248,3,22, 0,25,0,56,0,0,1,21,39,35,23,17,23,17,51,39, 35,52,47,1,38,49,38,39,20,23,22,23,50,31,1,22, 5,33,23,35,7,6,21,20,23,22,23,54,51,50,23,22, 21,7,6,35,34,39,38,53,38,55,54,55,54,49,35,2, 108,40,40,80,60,80,40,70,70,35,62,41,2,55,10,52, 45,12,5,1,253,128,1,84,40,170,50,80,10,23,77,27, 35,28,14,5,3,10,37,17,22,189,1,4,21,118,17,140, 2,88,60,60,120,254,92,60,2,28,60,114,17,3,1,10, 45,102,14,2,1,29,26,8,8,60,83,142,104,35,30,70, 36,68,34,12,13,19,26,6,54,146,21,23,123,144,19,0, 0,1,0,120,255,71,1,34,255,221,0,9,0,0,23,22, 23,22,23,7,48,39,38,39,120,63,62,43,2,20,26,49, 55,35,6,78,54,2,10,39,64,17,0,1,255,136,0,0, 0,200,3,22,0,26,0,0,19,21,39,35,23,17,23,17, 51,39,35,52,39,38,35,34,39,38,53,20,23,22,23,50, 31,1,22,60,40,40,80,60,80,40,70,70,14,59,50,12, 5,55,10,52,45,12,5,1,2,88,60,60,120,254,92,60, 2,28,60,114,17,3,26,11,19,102,14,2,1,29,26,8, 0,2,255,236,255,106,2,48,2,88,0,13,0,54,0,0, 23,52,63,1,22,23,22,21,20,15,1,38,39,38,1,23, 33,21,54,55,54,55,22,21,20,7,6,7,6,35,34,39, 38,39,38,53,23,22,23,22,51,50,55,54,55,54,53,52, 39,6,7,39,53,35,39,200,35,21,33,9,2,35,21,34, 8,2,1,64,40,254,212,31,57,77,25,37,13,31,85,47, 51,50,45,119,34,12,20,12,110,53,63,29,27,75,34,18, 1,65,105,70,180,40,100,39,9,2,4,31,7,8,38,10, 1,3,32,7,2,195,60,240,1,34,45,60,83,81,48,45, 105,50,28,28,73,227,78,94,20,248,101,49,10,30,88,49, 59,11,11,71,39,70,240,60,0,2,255,236,255,106,2,19, 2,88,0,13,0,52,0,0,23,52,63,1,22,23,22,21, 20,15,1,38,39,38,55,54,55,54,55,39,38,53,6,7, 39,38,39,38,53,52,55,54,63,1,22,23,20,23,22,21, 20,7,6,7,6,7,39,17,35,39,33,23,33,100,35,21, 33,9,2,35,21,34,8,2,10,82,91,101,6,1,1,31, 32,20,37,13,4,9,18,46,30,67,20,1,5,130,96,104, 16,14,37,30,40,1,254,41,254,91,100,39,9,2,4,31, 7,8,38,10,1,3,32,7,182,23,82,93,75,25,2,1, 30,1,3,12,42,13,13,19,15,29,7,1,8,79,3,3, 23,24,127,114,84,28,4,2,51,1,233,60,60,0,0,3, 255,236,0,0,1,234,2,88,0,13,0,25,0,45,0,0, 55,52,63,1,22,23,22,21,20,15,1,38,39,38,19,33, 6,21,20,31,1,7,48,23,22,23,19,17,52,39,38,47, 1,55,38,39,38,53,52,55,54,55,35,39,33,23,140,35, 21,33,9,2,35,21,34,8,2,210,254,242,5,55,160,190, 68,133,49,60,98,139,153,20,190,111,38,37,8,11,27,30, 40,1,214,40,50,39,9,2,4,31,7,8,38,10,1,3, 32,7,1,241,8,7,21,25,69,110,29,65,76,1,154,253, 228,28,78,109,65,20,110,17,18,17,23,10,12,15,18,60, 60,0,0,3,0,20,0,0,2,118,2,88,0,5,0,43, 0,49,0,0,63,1,23,7,23,7,33,17,51,39,35,17, 39,17,35,21,7,39,15,1,6,7,38,47,1,6,7,6, 21,20,31,1,54,55,54,55,23,5,23,22,23,22,21,53, 3,17,38,39,38,49,65,115,23,82,82,23,1,114,80,40, 100,60,60,40,110,35,14,11,14,6,42,22,39,13,4,47, 25,57,39,27,5,80,254,232,20,159,142,89,60,82,144,24, 75,75,23,52,52,23,2,28,60,254,32,70,1,154,100,20, 120,84,21,13,5,50,11,2,3,34,11,12,53,12,2,2, 50,36,49,90,160,20,69,114,72,25,130,1,59,254,197,106, 56,8,0,2,0,20,255,110,1,124,2,88,0,37,0,90, 0,0,23,39,22,51,55,54,55,39,38,39,15,2,38,53, 52,51,23,22,21,20,7,54,55,52,39,38,39,23,22,23, 22,23,20,7,6,35,34,47,1,22,51,50,55,54,55,39, 38,39,23,6,7,6,35,34,39,38,53,52,55,51,22,23, 22,21,20,7,54,55,54,53,39,38,39,38,39,38,53,23, 22,31,1,22,21,20,7,6,7,6,35,38,128,8,6,7, 14,9,1,3,2,3,1,7,11,10,14,15,19,4,25,2, 30,38,3,5,2,38,40,3,31,10,12,13,92,30,25,34, 51,28,12,1,4,7,20,2,3,27,19,21,46,5,1,50, 25,55,38,27,15,99,9,2,4,12,76,90,14,94,20,8, 97,135,100,71,34,45,31,35,54,140,14,4,2,5,8,9, 2,3,7,6,2,2,13,17,4,10,18,7,7,5,33,13, 22,34,23,5,13,26,28,20,37,12,4,165,60,19,34,15, 17,18,18,17,14,21,14,12,49,6,6,63,8,7,48,36, 41,30,29,21,105,13,21,24,40,59,69,12,85,91,20,52, 72,96,77,63,105,64,31,13,9,1,0,1,0,100,255,110, 0,188,0,0,0,37,0,0,23,39,22,51,55,54,55,39, 38,39,15,2,38,53,52,51,23,22,21,20,7,54,55,52, 39,38,39,23,22,23,22,23,20,7,6,35,34,108,8,6, 7,14,9,1,3,2,3,1,7,11,10,14,15,19,4,25, 2,30,38,3,5,2,38,40,3,31,10,12,13,140,14,4, 2,5,8,9,2,3,7,6,2,2,13,17,4,10,18,7, 7,5,33,13,22,34,23,5,13,26,28,20,37,12,4,0, 0,2,0,100,255,110,1,42,0,50,0,37,0,75,0,0, 23,39,22,51,55,54,55,39,38,39,15,2,38,53,52,51, 23,22,21,20,7,54,55,52,39,38,39,23,22,23,22,23, 20,15,1,39,34,7,39,22,51,55,54,55,39,38,39,15, 2,38,53,52,51,23,22,21,20,7,54,55,52,39,38,39, 23,22,23,22,23,20,7,6,35,34,218,8,6,7,14,9, 1,3,2,3,1,7,11,10,14,15,19,4,25,2,30,38, 3,5,2,38,40,3,31,21,24,2,112,8,6,7,14,9, 1,3,2,3,1,7,11,10,14,15,19,4,25,2,30,38, 3,5,2,38,40,3,31,10,12,13,90,14,4,2,5,8, 9,2,3,7,6,2,2,13,17,4,10,18,7,7,5,33, 13,22,34,23,5,13,26,28,20,37,12,4,4,49,14,4, 2,5,8,9,2,3,7,6,2,2,13,17,4,10,18,7, 7,5,33,13,22,34,23,5,13,26,28,20,37,12,4,0, 0,2,0,22,0,0,1,162,2,88,0,15,0,35,0,0, 51,34,39,38,53,52,55,54,51,50,23,22,21,20,7,6, 39,50,55,54,53,52,39,38,39,38,35,34,7,6,21,20, 23,22,23,22,220,105,55,38,65,53,80,106,54,37,64,53, 80,84,42,26,13,29,76,16,18,85,41,24,10,26,71,21, 116,79,105,143,87,70,116,78,103,143,88,72,80,94,57,72, 50,43,100,20,4,95,55,69,44,41,102,27,7,0,0,1, 0,20,0,0,1,124,2,88,0,29,0,0,19,20,31,1, 22,21,20,7,34,39,38,53,52,55,54,51,50,31,1,6, 7,50,55,54,53,52,47,1,38,39,40,95,140,105,216,101, 33,10,36,19,25,61,11,1,2,11,104,34,12,73,111,104, 2,2,68,44,70,101,82,61,201,21,66,21,24,49,26,14, 62,33,29,26,93,34,43,47,60,86,94,93,0,1,0,19, 0,0,1,225,2,88,0,29,0,0,19,22,23,22,23,7, 38,39,38,49,39,22,23,55,54,55,52,39,38,37,48,39, 48,23,4,23,22,21,20,7,189,26,233,17,14,40,116,216, 28,60,120,133,63,83,1,6,37,254,255,50,116,1,21,18, 1,208,1,14,5,216,16,13,20,128,117,15,100,39,1,3, 10,31,8,9,57,82,80,37,99,87,6,5,97,1,0,1, 0,19,255,251,1,246,2,91,0,39,0,0,37,55,38,39, 38,35,7,6,7,6,7,21,22,23,22,51,50,55,54,55, 22,21,20,7,6,35,34,39,38,3,38,47,1,18,23,22, 51,50,55,54,1,243,3,2,87,23,27,26,50,24,5,3, 8,46,16,16,25,20,31,14,27,58,41,52,21,22,111,77, 20,17,20,46,115,57,62,41,40,67,228,93,211,56,15,4, 14,48,12,13,30,53,20,6,13,20,44,67,76,121,77,55, 10,51,1,22,72,85,20,254,134,152,74,34,57,0,0,3, 0,21,0,0,1,103,2,88,0,28,0,45,0,63,0,0, 19,38,53,52,55,54,55,54,51,50,23,22,21,20,7,6, 7,22,23,7,6,7,6,35,34,39,38,53,52,55,34,7, 6,21,20,23,22,51,50,55,54,55,39,38,39,38,39,50, 55,54,53,39,38,39,38,35,34,7,6,21,23,22,23,22, 73,52,14,29,63,31,32,77,52,40,13,14,25,51,1,4, 16,60,41,48,72,53,44,169,101,25,6,48,36,48,75,38, 18,1,4,11,43,31,43,98,27,7,4,14,55,27,32,74, 39,19,4,17,87,12,1,43,32,69,35,36,77,35,17,75, 57,63,34,27,28,16,33,71,38,79,47,32,73,60,65,69, 2,59,14,16,51,34,25,54,25,29,24,37,18,12,62,58, 15,17,25,50,23,11,54,26,29,24,57,8,1,0,0,2, 0,24,255,254,1,95,2,88,0,16,0,42,0,0,19,6, 21,20,23,22,23,22,23,38,39,53,54,55,38,39,38,55, 7,23,22,23,22,23,55,23,6,21,20,23,22,23,35,38, 39,38,39,38,53,52,55,54,55,225,134,10,15,35,27,57, 36,7,9,84,37,17,6,70,40,3,13,41,1,2,20,16, 113,61,4,2,22,60,67,20,16,96,122,53,76,1,244,74, 124,33,35,54,45,35,20,44,68,40,87,51,31,57,22,50, 20,27,58,42,2,1,10,54,18,103,68,134,9,4,8,53, 16,17,103,99,112,104,45,43,0,1,0,24,0,0,2,0, 2,89,0,44,0,0,19,38,39,55,54,51,50,23,22,23, 21,54,55,54,55,22,21,20,7,6,7,6,35,34,39,38, 39,38,53,23,22,23,22,51,50,55,54,55,54,53,52,39, 6,7,39,224,20,1,3,4,8,22,36,4,4,31,57,77, 25,37,13,31,85,47,51,50,45,119,34,12,20,12,110,53, 63,29,27,75,34,18,1,65,105,70,2,28,19,22,13,7, 49,6,6,240,1,34,45,60,83,81,48,45,105,50,28,28, 73,227,78,94,20,248,101,49,10,30,88,49,59,11,11,71, 39,70,0,2,0,20,0,2,1,94,2,86,0,18,0,32, 0,0,1,6,35,34,39,38,53,52,55,54,55,54,51,50, 23,17,47,2,17,53,38,39,7,6,7,6,21,20,23,22, 51,50,1,33,45,39,128,42,14,5,18,58,30,34,94,89, 3,52,5,32,53,27,55,35,21,69,21,25,46,1,18,9, 88,31,37,23,23,77,35,19,136,254,53,2,55,2,1,32, 135,56,1,4,14,53,32,30,54,14,4,0,0,2,0,21, 0,0,1,180,2,87,0,25,0,36,0,0,1,6,15,1, 22,21,20,7,6,7,39,17,38,39,55,54,51,23,22,31, 1,21,52,63,1,54,1,54,55,54,55,6,7,6,15,2, 1,180,7,44,6,16,111,86,116,38,21,1,3,3,8,13, 15,21,19,88,149,95,254,180,177,54,16,1,14,91,109,24, 8,2,1,199,90,18,2,34,35,99,84,66,27,50,1,224, 22,25,15,6,4,9,26,29,201,37,11,15,14,254,180,69, 124,37,35,12,7,8,22,12,11,0,0,1,0,20,0,0, 1,125,2,88,0,45,0,0,19,39,20,31,1,22,21,20, 7,6,7,54,53,52,39,38,39,38,35,34,7,6,21,20, 23,55,54,63,1,52,39,22,21,20,7,23,50,55,54,53, 52,39,38,47,1,38,40,20,109,128,53,87,11,12,14,6, 17,57,27,25,26,16,20,46,22,37,13,4,2,33,53,30, 149,58,24,1,10,108,143,73,2,68,20,96,95,105,47,37, 126,28,4,2,29,29,19,18,55,28,13,14,18,35,60,5, 1,9,27,15,5,4,24,44,51,21,40,110,46,48,9,7, 76,80,100,56,0,3,255,246,0,0,1,244,2,88,0,9, 0,15,0,28,0,0,19,22,23,22,23,7,48,39,38,39, 55,7,48,23,22,23,17,33,39,33,23,35,17,52,39,38, 47,1,37,198,63,62,43,2,20,26,49,55,142,250,63,129, 58,254,182,40,1,214,40,80,93,133,164,20,1,94,1,133, 6,78,54,2,10,39,64,17,86,145,26,61,83,1,154,60, 60,253,228,26,74,107,73,20,200,0,0,3,255,243,0,0, 1,241,2,88,0,5,0,18,0,28,0,0,1,7,48,23, 22,23,17,33,39,33,23,35,17,52,39,38,47,1,37,3, 22,23,22,23,7,48,39,38,39,1,101,250,63,129,58,254, 182,40,1,214,40,80,93,133,164,20,1,94,230,63,62,43, 2,20,26,49,55,1,189,145,26,61,83,1,154,60,60,253, 228,26,74,107,73,20,200,254,162,6,78,54,2,10,39,64, 17,0,0,1,0,20,0,20,1,104,1,91,0,14,0,0, 19,54,51,23,22,23,22,23,39,48,39,38,39,38,35,20, 29,27,40,130,77,27,10,40,15,53,110,38,44,1,84,7, 4,25,181,64,53,20,50,137,39,14,0,1,255,236,0,0, 1,235,3,35,0,52,0,0,17,54,55,50,23,22,21,7, 35,23,51,17,23,54,55,54,55,52,39,38,39,7,6,7, 6,7,21,22,23,22,51,50,55,22,21,20,7,6,7,6, 7,17,33,39,33,53,52,39,7,6,7,6,7,59,31,19, 7,5,1,140,40,100,37,150,56,49,1,8,17,54,21,36, 14,2,1,6,29,9,10,16,18,5,7,11,33,32,90,1, 55,41,254,242,59,24,55,57,2,3,2,178,62,1,25,16, 26,226,60,254,163,51,21,53,46,78,31,37,81,3,3,10, 30,4,3,18,39,13,3,9,20,17,20,16,25,19,19,25, 1,69,60,232,110,1,4,17,66,3,3,0,0,1,0,20, 0,93,1,104,1,164,0,14,0,0,55,22,51,55,54,55, 54,55,7,48,7,6,7,6,35,20,29,27,40,131,77,26, 10,40,15,53,110,38,44,100,7,4,25,183,62,53,20,50, 137,39,14,0,0,1,0,20,0,93,1,104,1,164,0,41, 0,0,55,7,22,51,50,55,54,55,7,48,7,6,7,6, 7,54,53,39,38,39,38,35,34,7,6,15,1,21,20,23, 22,51,50,55,54,53,52,39,22,23,7,6,80,40,29,27, 146,78,30,10,40,9,34,104,8,7,16,3,12,49,15,15, 17,13,18,7,5,37,9,10,16,12,20,4,24,1,4,13, 160,60,7,187,73,67,20,49,136,39,3,2,33,29,28,46, 17,5,6,8,17,20,4,45,14,4,9,14,29,12,15,18, 31,23,39,0,0,1,0,20,0,98,1,104,1,164,0,42, 0,0,55,50,55,54,53,52,39,23,6,7,35,38,39,38, 53,52,55,54,51,50,23,22,21,20,7,6,7,22,51,55, 54,55,54,63,1,6,7,6,7,34,39,38,39,80,40,25, 12,17,2,3,33,21,34,9,2,38,10,12,53,19,7,46, 23,30,20,26,27,63,53,47,4,40,17,85,66,66,36,27, 28,15,203,46,22,23,26,13,25,35,6,6,31,7,7,47, 12,3,54,19,21,63,33,17,3,15,3,18,80,72,72,20, 143,100,78,1,27,27,51,0,0,1,0,20,0,0,0,80, 2,88,0,3,0,0,19,17,23,17,20,60,2,88,253,228, 60,2,28,0,0,1,0,19,0,0,1,145,2,89,0,27, 0,0,19,17,23,48,55,54,55,6,21,20,31,1,55,38, 53,54,55,39,6,15,1,17,38,39,15,1,21,22,41,60, 70,93,50,19,46,20,20,44,1,63,50,86,115,49,40,25, 10,5,3,2,28,254,222,71,85,106,26,99,75,105,82,35, 20,85,94,117,94,100,24,147,65,1,10,59,2,3,8,15, 20,0,0,2,0,20,0,200,1,124,1,214,0,17,0,35, 0,0,55,34,39,38,53,55,54,55,54,51,50,23,22,21, 20,15,1,6,39,34,7,6,21,20,23,22,51,50,55,54, 53,52,39,38,39,38,200,111,47,22,4,16,73,38,49,112, 47,21,61,31,39,49,70,25,9,31,28,45,71,25,8,5, 19,60,10,200,67,31,36,29,65,27,15,69,30,36,66,39, 15,15,225,52,18,20,41,26,23,52,17,20,16,15,50,9, 1,0,0,2,0,20,0,176,1,124,1,234,0,14,0,32, 0,0,19,52,55,54,51,23,22,23,20,7,6,35,34,39, 38,39,22,23,22,51,50,55,54,55,20,7,6,7,34,39, 38,39,38,130,44,12,14,24,44,2,44,12,14,45,18,7, 110,53,87,20,20,78,60,24,18,83,43,53,24,23,77,35, 22,1,164,48,16,5,4,14,51,48,15,4,36,14,87,195, 42,10,128,51,68,185,84,44,1,10,32,114,69,0,0,1, 0,0,0,0,2,216,2,22,0,53,0,0,55,52,39,38, 39,35,53,51,22,23,22,23,54,55,54,55,22,23,22,23, 51,17,51,21,35,17,35,53,35,6,7,6,35,34,53,52, 55,54,55,52,39,38,39,6,7,6,7,22,21,20,35,34, 53,52,126,47,16,13,50,85,35,36,11,5,19,61,43,29, 52,38,20,28,152,114,50,64,152,6,32,30,34,49,59,16, 16,52,18,12,46,49,20,9,6,86,40,250,64,108,38,17, 57,39,104,31,22,39,47,32,6,18,65,35,76,1,10,57, 254,35,211,81,64,66,57,72,74,20,13,45,78,27,11,21, 65,25,21,43,37,141,58,65,255,255,0,0,0,0,3,116, 2,22,16,38,4,141,0,0,16,7,4,185,2,216,0,0, 255,255,0,0,255,245,2,146,2,187,16,38,4,186,0,0, 16,7,4,211,0,174,0,0,255,255,0,0,255,245,2,144, 2,187,16,38,4,211,0,0,16,7,4,187,1,226,0,0, 255,255,0,0,255,97,2,68,2,219,16,38,4,212,0,0, 16,7,4,188,2,48,0,0,255,255,0,0,255,13,2,68, 2,219,16,38,4,212,0,0,16,7,4,189,2,48,0,0, 255,255,0,0,255,245,1,228,2,209,16,38,4,211,0,0, 16,7,4,190,1,244,0,0,255,255,0,0,0,0,2,216, 3,11,16,38,4,141,0,0,16,7,4,191,2,198,0,0, 0,3,0,0,255,240,2,68,2,218,0,33,0,42,0,52, 0,0,1,51,21,35,34,7,6,7,33,21,35,20,7,6, 7,22,21,20,15,1,6,35,34,39,38,39,38,39,38,39, 35,53,51,54,19,50,55,54,53,52,39,33,22,1,33,7, 49,20,23,33,54,55,54,1,32,168,168,96,54,25,7,1, 218,22,57,18,21,36,81,33,27,31,104,81,36,19,29,19, 5,1,32,32,43,251,58,32,18,18,254,232,62,1,30,254, 134,2,14,1,36,32,23,19,2,218,67,62,29,38,57,94, 84,28,17,46,66,98,40,13,7,96,44,50,76,159,40,28, 57,196,253,89,43,25,31,42,33,174,1,160,55,72,48,19, 62,51,255,255,0,0,0,0,2,230,2,254,16,38,4,141, 0,0,16,7,4,193,3,42,0,0,0,2,0,0,0,0, 2,24,2,22,0,34,0,50,0,0,55,52,55,54,51,50, 23,22,23,54,55,54,53,33,53,33,21,35,20,15,1,6, 7,22,23,35,38,39,6,7,6,35,34,39,38,55,20,23, 22,51,50,55,54,55,38,39,38,35,34,7,6,35,72,43, 56,70,81,33,15,28,12,3,254,64,2,22,22,42,19,3, 2,64,26,66,17,38,31,95,49,36,99,46,24,69,52,21, 27,34,57,64,17,29,59,52,32,67,24,9,200,77,40,24, 40,17,16,32,123,31,23,57,57,118,102,39,4,4,82,128, 103,41,37,26,14,59,32,46,50,21,9,24,25,31,35,25, 20,44,16,0,0,2,0,0,0,0,2,6,2,22,0,22, 0,30,0,0,1,35,17,35,53,6,35,34,39,38,39,54, 53,52,39,35,53,51,22,23,33,53,51,3,53,33,6,7, 22,51,50,2,6,50,64,45,67,90,94,54,22,39,39,32, 86,42,6,1,14,114,114,254,242,3,25,84,98,80,1,221, 254,35,92,42,65,38,39,58,93,91,43,57,84,93,177,254, 153,125,53,51,84,0,0,2,0,0,255,244,2,90,2,22, 0,11,0,33,0,0,37,53,35,34,7,6,21,20,23,22, 51,50,17,33,53,33,21,35,17,35,17,35,17,20,35,34, 39,38,53,52,55,54,59,1,1,40,134,47,16,5,47,43, 36,76,254,216,2,90,50,64,128,122,90,61,57,63,26,33, 144,97,157,43,13,16,47,47,43,1,176,57,57,254,35,1, 221,254,125,102,61,57,76,85,31,13,0,1,0,0,0,0, 2,162,2,22,0,46,0,0,1,35,17,35,53,6,35,34, 39,6,35,34,39,38,39,54,53,52,39,35,53,51,22,21, 20,7,22,23,22,51,54,53,52,39,51,22,21,20,7,22, 23,22,51,50,55,17,51,2,162,50,64,21,55,96,52,22, 40,93,82,39,18,62,42,62,103,65,40,8,78,42,22,46, 50,68,46,20,23,59,18,16,57,19,114,1,221,254,35,68, 18,42,16,60,29,33,59,96,79,45,57,67,117,91,61,22, 26,13,46,112,137,102,114,144,75,45,29,13,4,49,1,119, 0,2,0,0,255,243,2,18,2,22,0,39,0,49,0,0, 1,33,21,33,50,23,22,21,20,7,22,23,22,23,35,38, 39,6,35,34,39,38,53,52,55,54,51,50,23,54,53,52, 39,38,35,33,53,35,53,33,3,38,39,38,35,34,21,20, 51,50,2,18,254,78,1,44,73,22,7,76,34,6,4,8, 70,6,25,73,87,79,47,31,80,34,40,115,57,64,54,11, 13,254,176,32,2,18,192,31,70,19,18,80,83,86,1,221, 116,67,22,26,98,55,45,14,11,23,15,33,61,48,32,41, 71,26,11,70,46,51,48,11,2,173,57,254,76,40,13,4, 56,53,0,2,0,0,255,243,1,246,2,22,0,21,0,31, 0,0,1,35,17,20,7,6,35,34,39,38,53,35,52,55, 54,51,21,33,53,33,53,33,3,33,21,22,23,22,51,50, 53,52,1,246,24,100,41,55,93,57,44,56,26,22,72,1, 6,254,98,1,246,88,254,250,5,26,41,58,133,1,221,254, 245,152,50,21,94,73,91,69,23,21,56,175,57,254,223,41, 46,45,69,168,22,0,0,3,0,0,255,244,2,64,2,22, 0,39,0,48,0,59,0,0,1,35,21,33,34,7,6,21, 20,51,33,50,23,22,21,20,7,6,7,6,35,34,39,38, 39,38,53,52,55,38,53,52,55,54,51,33,53,33,53,33, 3,52,43,1,21,51,50,55,54,37,20,23,22,59,1,53, 35,34,7,6,2,64,50,254,144,25,10,2,45,1,18,64, 23,8,41,13,15,44,110,104,60,50,21,10,23,32,55,22, 29,1,42,254,50,2,64,104,94,45,49,64,20,6,254,170, 48,20,24,47,45,58,25,11,1,221,149,32,8,9,43,64, 24,28,69,36,11,4,12,12,10,58,26,29,47,26,35,48, 68,27,11,92,57,254,93,64,128,38,12,14,40,17,7,128, 33,14,0,1,0,0,0,0,1,220,2,22,0,25,0,0, 1,35,17,35,53,35,20,7,6,7,35,54,55,35,38,53, 52,51,50,23,21,51,53,33,53,33,1,220,50,64,210,23, 2,1,64,25,1,56,1,96,16,9,210,254,150,1,220,1, 221,254,35,215,71,127,10,7,157,58,8,14,92,1,56,205, 57,0,0,2,0,0,0,0,2,46,2,22,0,6,0,57, 0,0,1,33,22,51,50,55,54,23,20,7,6,7,23,35, 47,1,38,39,38,53,52,55,54,51,50,23,22,51,50,55, 54,53,52,39,38,39,38,35,34,7,6,35,34,47,1,55, 38,39,35,53,33,21,35,6,7,6,7,22,1,216,254,166, 37,137,101,38,21,33,70,23,26,56,130,32,66,118,13,1, 43,15,16,43,43,48,43,70,24,9,4,5,11,34,73,42, 51,58,26,19,13,58,122,39,51,62,2,46,22,27,10,32, 41,67,1,221,139,53,30,235,71,37,13,5,60,38,1,9, 48,5,5,33,14,5,32,16,43,16,15,11,10,14,13,43, 17,20,4,64,14,30,127,57,57,77,23,65,18,34,0,2, 0,3,0,0,1,245,2,22,0,33,0,38,0,0,1,35, 21,33,34,21,20,23,22,51,33,21,35,20,51,55,49,21, 35,34,53,34,39,38,53,52,55,38,39,38,53,35,53,33, 7,53,33,20,23,1,245,32,254,185,41,31,9,11,1,61, 232,168,64,71,227,75,36,18,63,19,16,5,62,1,242,96, 254,236,38,1,221,154,48,39,13,4,57,107,2,57,162,51, 27,34,68,28,12,62,21,12,57,154,97,44,53,0,0,1, 0,0,255,244,1,254,2,22,0,33,0,0,1,35,21,38, 35,32,7,23,22,51,50,55,54,55,54,59,1,20,7,6, 35,34,39,38,39,54,55,54,59,1,53,33,53,33,1,254, 22,45,43,254,240,28,103,59,52,44,37,2,34,25,18,10, 56,54,60,58,76,75,73,33,90,74,183,12,254,88,1,254, 1,221,207,3,85,94,47,34,2,34,25,60,46,48,52,52, 90,90,30,25,150,57,0,2,0,0,255,244,2,28,2,22, 0,22,0,38,0,0,1,35,21,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,51,53,35,53,33,1,20,23, 22,51,50,55,54,53,52,39,38,35,34,7,6,2,28,232, 62,71,77,68,66,108,108,66,68,77,71,62,244,2,28,254, 76,65,55,52,60,56,56,72,47,53,77,54,41,1,221,123, 57,63,72,76,48,50,50,48,76,72,63,57,123,57,254,138, 43,38,31,37,38,37,67,39,26,48,37,0,0,2,0,0, 255,242,1,252,2,22,0,9,0,52,0,0,37,38,39,38, 35,34,21,20,51,50,1,53,33,21,35,20,7,22,21,20, 7,6,35,34,53,52,55,54,51,50,23,22,23,54,53,52, 39,38,35,34,35,6,35,34,53,52,51,23,49,50,55,54, 53,1,83,52,92,17,14,64,113,70,254,229,1,252,50,50, 68,20,55,177,184,99,21,22,101,68,21,12,27,29,30,48, 6,5,130,15,76,71,144,59,30,16,57,27,8,2,26,28, 1,181,57,57,140,39,85,70,37,32,88,88,61,12,3,39, 13,14,20,36,37,35,38,15,45,46,14,77,41,47,0,2, 0,0,255,243,2,0,2,22,0,30,0,42,0,0,37,20, 7,6,35,34,39,38,53,35,52,55,54,51,21,51,53,33, 53,33,21,35,21,33,20,23,54,51,50,23,22,7,52,39, 38,35,34,7,22,51,50,55,54,1,221,80,31,38,148,60, 32,56,31,25,64,246,254,114,2,0,50,254,202,28,46,97, 84,44,26,63,55,14,15,77,23,27,76,56,19,6,82,63, 23,9,123,66,91,75,21,17,56,153,57,57,210,104,37,61, 44,26,35,34,10,3,47,40,24,7,0,1,0,0,255,253, 2,46,2,22,0,42,0,0,5,34,39,38,39,54,55,54, 51,50,23,55,38,39,33,53,33,21,35,22,23,22,23,7, 38,47,1,7,38,35,34,7,6,7,22,23,22,51,50,55, 20,7,6,1,71,140,106,28,21,16,69,45,55,48,41,54, 38,34,254,224,2,46,214,12,90,50,40,30,51,53,20,83, 23,59,70,32,9,4,32,78,57,57,122,84,83,52,3,116, 30,35,78,43,29,23,51,31,90,57,57,48,60,34,13,71, 24,41,16,102,36,49,13,16,64,39,29,124,100,51,32,0, 0,1,0,0,255,250,1,212,2,22,0,47,0,0,17,53, 33,21,35,20,7,6,7,22,21,20,15,1,6,35,34,39, 38,39,51,55,51,22,23,55,54,55,54,53,52,39,38,35, 34,35,6,35,34,53,52,51,23,49,50,55,54,53,1,212, 22,47,11,12,79,78,29,33,52,118,68,26,13,5,7,2, 81,113,47,79,19,2,48,24,28,5,5,130,15,76,71,144, 59,30,16,1,219,59,59,101,62,15,9,55,75,80,52,16, 16,75,28,35,8,76,2,3,12,63,10,4,53,29,14,15, 45,46,14,76,41,46,0,3,0,0,0,0,2,6,2,22, 0,7,0,12,0,30,0,0,37,53,33,20,7,22,51,50, 39,33,53,33,22,39,35,53,33,21,35,17,35,53,6,35, 34,39,38,39,54,53,52,1,148,254,236,22,84,98,80,234, 1,14,254,209,26,95,32,2,6,50,64,45,67,90,94,54, 22,39,175,105,40,44,84,225,140,50,50,57,57,254,35,92, 42,65,38,39,58,93,91,0,0,1,0,0,255,243,1,232, 2,22,0,31,0,0,1,35,21,33,22,51,50,55,54,59, 1,6,7,6,35,34,39,38,39,35,53,52,55,54,59,1, 21,51,53,33,53,33,1,232,22,254,204,24,132,42,50,52, 16,10,2,62,48,58,163,45,9,3,56,37,19,36,28,244, 254,110,1,232,1,221,234,198,49,48,70,48,36,177,36,42, 29,71,18,10,71,177,57,0,0,2,0,0,0,0,2,6, 2,22,0,9,0,26,0,0,55,22,51,50,55,17,33,22, 21,20,39,35,53,33,21,35,17,35,53,6,35,34,39,38, 39,54,52,106,84,98,80,36,254,209,36,105,32,2,6,50, 64,45,67,90,94,54,22,39,226,84,63,1,16,73,70,65, 208,57,57,254,35,122,42,65,38,39,58,154,0,1,0,0, 255,254,2,10,2,22,0,44,0,0,1,35,21,22,23,22, 21,20,7,6,35,53,48,23,50,55,54,53,52,39,38,39, 6,7,6,21,20,23,22,51,55,49,21,34,39,38,53,52, 55,54,55,53,35,53,33,2,10,224,98,41,63,87,44,55, 14,44,38,26,76,49,45,61,57,54,49,31,28,16,99,54, 35,65,37,102,234,2,10,1,221,103,60,41,65,76,81,35, 18,59,2,35,23,25,64,63,41,11,15,59,55,50,36,29, 18,2,59,53,34,47,76,65,37,64,103,57,0,1,0,0, 0,0,2,6,2,22,0,26,0,0,55,22,51,50,55,17, 51,21,35,17,35,53,6,35,34,39,38,39,54,52,39,35, 53,51,22,21,20,106,84,98,80,36,114,50,64,45,67,90, 94,54,22,39,39,32,86,46,226,84,63,1,73,57,254,35, 122,42,65,38,39,58,154,43,57,82,101,68,0,2,0,0, 255,245,1,234,2,22,0,34,0,48,0,0,1,35,21,33, 34,7,20,23,54,55,54,51,50,23,22,21,20,7,6,35, 34,39,38,39,38,53,52,55,54,59,1,53,33,53,33,3, 52,35,34,7,6,21,20,23,22,51,50,55,54,1,234,22, 254,234,84,1,61,27,78,31,33,83,39,19,75,37,44,134, 93,8,7,38,124,12,14,214,254,108,1,234,68,86,60,32, 16,68,14,15,66,23,8,1,221,175,70,58,62,63,22,9, 48,24,32,68,30,15,108,9,10,53,64,114,11,1,118,57, 254,80,48,27,13,16,38,10,2,33,11,0,0,3,0,0, 0,0,2,34,2,22,0,17,0,22,0,34,0,0,1,35, 17,35,53,6,35,34,39,54,55,38,39,38,39,35,53,33, 7,53,33,22,31,1,53,35,34,7,6,7,22,23,22,51, 50,2,34,50,64,57,61,130,110,25,83,54,38,6,40,44, 2,34,114,254,193,23,104,192,116,94,45,14,13,39,75,32, 32,57,1,221,254,35,64,28,132,86,38,22,64,9,90,57, 209,152,108,44,200,143,47,14,21,59,24,10,0,2,0,0, 255,247,1,244,2,22,0,13,0,63,0,0,1,38,35,34, 7,6,21,20,23,22,51,50,55,54,5,22,23,22,51,50, 55,54,53,52,39,6,7,6,35,34,39,38,53,52,55,54, 51,50,23,54,53,52,39,33,53,33,21,35,20,15,1,22, 21,20,7,6,35,34,39,38,39,38,55,54,1,72,46,68, 62,25,14,41,21,24,64,42,20,254,219,40,96,54,35,67, 42,26,26,30,87,23,22,101,34,13,81,33,41,94,55,28, 2,254,126,1,244,50,30,18,46,85,46,58,122,82,20,15, 2,8,6,1,19,54,25,12,17,30,17,8,27,13,132,35, 30,17,44,28,35,33,34,41,13,4,59,22,29,74,28,11, 47,28,78,11,22,57,57,102,62,33,76,63,89,40,21,82, 20,23,2,4,4,0,0,1,0,0,255,251,2,18,2,22, 0,28,0,0,1,17,51,21,35,17,35,53,35,6,7,6, 35,38,53,52,55,54,63,1,38,39,35,53,51,22,23,22, 23,1,160,114,50,64,224,12,11,18,39,55,53,4,4,10, 25,31,72,128,25,30,7,2,1,12,1,10,57,254,35,211, 122,35,58,1,63,69,72,6,5,40,159,66,57,69,146,34, 17,0,0,2,0,0,0,0,2,142,2,22,0,17,0,29, 0,0,33,38,39,38,39,54,53,52,39,35,53,33,21,35, 17,35,53,35,37,22,21,20,7,22,23,22,23,53,51,53, 1,119,160,106,36,39,52,54,32,2,142,50,64,165,254,239, 45,37,23,100,49,29,229,2,81,28,43,56,95,99,73,57, 57,254,35,239,238,83,90,80,70,32,38,18,4,234,181,0, 0,2,0,0,255,245,2,10,2,22,0,19,0,33,0,0, 1,35,17,20,7,6,35,34,39,38,53,52,55,54,59,1, 53,33,53,33,3,53,35,34,21,20,23,22,23,22,51,50, 55,54,2,10,50,61,39,50,83,85,81,54,23,30,228,254, 104,2,10,114,206,67,59,7,7,55,54,64,20,7,1,221, 254,169,76,42,27,73,69,86,71,29,13,147,57,254,125,126, 56,56,56,6,6,43,56,19,0,2,0,0,255,254,2,198, 2,22,0,58,0,67,0,0,23,34,39,38,53,52,55,54, 55,38,39,35,53,33,21,35,6,7,22,23,22,21,20,7, 6,35,39,49,53,22,51,50,55,54,53,52,39,38,39,6, 7,6,7,38,39,38,39,6,7,6,21,20,23,22,51,50, 55,21,7,1,33,22,23,22,23,54,55,54,238,89,56,43, 49,24,75,19,35,144,2,198,134,35,19,74,25,49,63,55, 68,54,17,17,55,49,38,67,24,23,34,57,22,19,53,54, 16,9,51,37,26,59,42,39,19,17,52,1,18,254,208,15, 68,35,34,56,50,39,2,59,46,61,59,49,24,50,25,106, 57,57,106,25,49,25,49,59,78,47,41,2,57,4,42,33, 36,51,52,19,9,48,29,11,4,10,53,15,14,21,48,33, 29,48,37,26,4,57,2,1,223,80,78,41,18,28,78,60, 0,3,255,254,255,250,2,198,2,22,0,15,0,74,0,83, 0,0,55,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,23,34,39,38,53,52,55,54,55,38,39,35,53,33, 21,35,6,7,22,23,22,21,20,7,6,35,39,49,53,22, 51,50,55,54,53,52,39,38,39,6,7,6,7,38,39,38, 39,6,7,6,21,20,23,22,51,50,55,21,7,1,33,22, 23,22,23,54,55,54,31,25,7,1,21,6,6,23,8,2, 22,5,213,89,56,43,49,24,75,19,35,144,2,198,134,35, 19,74,25,49,63,55,68,54,17,17,55,49,38,67,24,23, 34,57,22,19,53,54,16,9,51,37,26,59,42,39,19,17, 52,1,18,254,208,15,68,35,34,56,50,39,60,23,5,5, 22,9,2,22,6,5,23,8,2,62,59,46,61,59,49,24, 50,25,106,57,57,106,25,49,25,49,59,78,47,41,2,57, 4,42,33,36,51,52,19,9,48,29,11,4,10,53,15,14, 21,48,33,29,48,37,26,4,57,2,1,223,80,78,41,18, 28,78,60,0,0,1,0,0,0,0,1,242,2,22,0,39, 0,0,1,35,21,33,34,7,6,21,20,23,22,51,33,21, 35,20,23,22,51,55,49,21,35,34,39,38,39,38,39,38, 53,52,55,54,59,1,53,33,53,33,1,242,32,254,176,31, 11,4,38,8,10,1,70,232,105,29,34,64,50,138,68,41, 1,84,36,18,56,28,34,254,254,110,1,242,1,221,154,28, 9,10,40,10,2,57,87,21,6,4,57,67,40,60,4,49, 24,31,62,29,14,97,57,0,0,3,0,0,255,250,2,18, 2,22,0,4,0,20,0,42,0,0,1,33,22,23,51,7, 50,23,22,21,20,7,6,35,34,39,38,53,52,55,54,19, 21,35,17,35,53,35,6,7,6,35,38,53,52,55,54,63, 1,38,39,35,53,1,160,254,240,28,20,224,126,25,7,1, 21,6,6,23,8,2,22,5,246,50,64,224,12,11,18,39, 55,53,4,4,10,25,31,72,1,221,82,127,208,23,5,5, 22,9,2,22,6,5,23,8,2,1,218,57,254,35,211,122, 35,58,1,63,69,72,6,5,40,159,66,57,0,2,0,0, 255,251,2,18,2,22,0,4,0,26,0,0,1,33,22,23, 51,19,21,35,17,35,53,35,6,7,6,35,38,53,52,55, 54,63,1,38,39,35,53,1,160,254,240,28,20,224,114,50, 64,224,12,11,18,39,55,53,4,4,10,25,31,72,1,221, 82,127,1,10,57,254,35,211,122,35,58,1,63,69,72,6, 5,40,159,66,57,0,0,1,0,0,255,244,1,245,2,22, 0,29,0,0,55,20,23,22,51,50,53,17,33,53,33,21, 35,17,20,35,34,39,38,39,38,53,52,55,54,59,1,21, 35,34,97,57,47,60,126,254,125,1,245,50,172,75,42,49, 42,39,58,28,35,52,56,52,210,70,52,43,127,1,49,57, 57,254,189,166,20,23,61,58,54,73,33,16,57,0,0,1, 0,84,0,0,0,194,0,114,0,3,0,0,55,21,35,53, 194,110,114,114,114,0,0,1,0,0,0,194,0,156,2,22, 0,7,0,0,19,17,35,17,35,53,51,21,124,64,60,156, 1,221,254,229,1,27,57,57,0,1,0,0,0,0,1,42, 2,187,0,29,0,0,1,35,53,52,39,38,35,34,7,6, 29,1,51,21,35,17,35,17,35,53,51,53,52,55,54,51, 50,23,22,21,1,42,64,37,11,12,41,15,4,60,60,64, 50,50,53,33,38,62,38,24,2,40,26,45,15,4,39,12, 13,44,57,254,35,1,221,57,46,60,37,22,51,32,38,0, 0,1,255,132,0,0,0,174,2,187,0,29,0,0,19,35, 17,35,17,35,53,51,53,52,39,38,35,34,7,6,29,1, 35,53,52,55,54,51,50,23,22,29,1,51,174,50,64,60, 60,37,11,12,41,15,4,64,53,33,38,62,38,24,50,1, 221,254,35,1,221,57,44,45,15,4,39,12,13,26,26,61, 37,23,50,32,37,46,0,1,254,97,255,97,255,150,255,164, 0,9,0,0,7,6,35,34,39,53,22,51,50,55,106,96, 59,58,96,96,58,59,96,151,8,8,59,8,8,0,0,2, 254,98,255,13,255,148,255,174,0,9,0,19,0,0,7,21, 6,35,34,39,53,22,51,55,29,1,6,35,34,39,53,22, 51,55,108,95,63,61,87,44,104,158,95,63,61,87,44,104, 158,82,56,4,4,56,6,6,101,56,4,4,56,6,6,0, 0,1,254,126,2,36,255,214,2,209,0,12,0,0,3,38, 35,34,39,38,53,52,55,23,22,23,22,42,158,115,38,24, 9,71,38,103,97,19,2,36,107,19,7,9,24,6,1,14, 112,22,0,1,254,120,2,32,255,208,3,11,0,27,0,0, 3,38,35,7,49,34,53,52,51,50,23,22,23,38,39,38, 35,34,35,39,38,53,52,63,1,22,23,22,48,103,109,80, 36,70,97,93,23,17,16,57,77,105,6,6,27,22,32,22, 81,95,100,2,32,64,7,28,37,56,15,15,40,42,54,2, 5,18,24,10,3,1,70,73,0,1,254,100,2,60,255,188, 3,2,0,13,0,0,3,35,38,43,1,34,39,51,22,59, 1,50,23,22,68,16,22,52,154,95,5,22,22,48,150,74, 19,7,2,60,64,134,70,60,26,0,0,1,254,55,2,32, 255,188,2,254,0,30,0,0,3,53,34,39,38,53,52,55, 51,22,51,55,49,50,29,1,35,53,50,53,52,39,38,35, 34,7,6,21,20,51,21,246,100,58,53,1,12,15,142,127, 92,64,13,24,8,8,26,10,3,16,2,32,82,40,35,52, 6,7,73,3,41,111,36,17,27,12,4,27,7,8,19,35, 0,1,255,52,255,72,0,50,255,232,0,12,0,0,23,38, 35,6,35,34,53,52,51,53,51,21,22,50,83,87,24,26, 34,72,64,87,184,77,12,24,45,26,36,30,0,3,0,0, 255,250,2,6,2,22,0,22,0,30,0,46,0,0,1,35, 17,35,53,6,35,34,39,38,39,54,53,52,39,35,53,51, 22,23,33,53,51,3,53,33,6,7,22,51,50,5,50,23, 22,21,20,7,6,35,34,39,38,53,52,55,54,2,6,50, 64,45,67,90,94,54,22,39,39,32,86,42,6,1,14,114, 114,254,242,3,25,84,98,80,254,239,25,7,1,21,6,6, 23,8,2,22,5,1,221,254,35,92,42,65,38,39,58,93, 91,43,57,84,93,177,254,153,125,53,51,84,52,23,5,5, 22,9,2,22,6,5,23,8,2,0,0,3,255,254,255,244, 2,90,2,22,0,11,0,33,0,49,0,0,37,53,35,34, 7,6,21,20,23,22,51,50,17,33,53,33,21,35,17,35, 17,35,17,20,35,34,39,38,53,52,55,54,59,1,5,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,54,1,40, 134,47,16,5,47,43,36,76,254,216,2,90,50,64,128,122, 90,61,57,63,26,33,144,254,247,25,7,1,21,6,6,23, 8,2,22,5,97,157,43,13,16,47,47,43,1,176,57,57, 254,35,1,221,254,125,102,61,57,76,85,31,13,251,23,5, 5,22,9,2,22,6,5,23,8,2,0,2,0,0,255,250, 1,220,2,22,0,25,0,41,0,0,1,35,17,35,53,35, 20,7,6,7,35,54,55,35,38,53,52,51,50,23,21,51, 53,33,53,33,3,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,1,220,50,64,210,23,2,1,64,25,1,56, 1,96,16,9,210,254,150,1,220,231,25,7,1,21,6,6, 22,9,2,22,5,1,221,254,35,215,71,127,10,7,157,58, 8,14,92,1,56,205,57,254,38,23,5,5,22,9,2,21, 6,6,23,8,2,0,0,1,0,0,0,0,1,212,2,22, 0,54,0,0,55,38,53,52,51,50,23,22,23,55,54,55, 54,53,52,39,38,35,34,7,6,35,34,53,52,51,50,23, 51,54,55,54,53,33,53,33,21,35,20,7,6,7,22,21, 20,7,23,35,39,6,35,34,39,23,35,48,17,40,27,62, 59,23,41,77,14,3,50,19,23,22,29,42,55,93,109,41, 62,27,37,28,32,254,132,1,212,32,49,11,12,79,73,72, 72,50,17,33,76,68,30,64,90,37,11,24,24,24,2,2, 11,50,9,11,48,19,8,8,13,47,57,9,6,37,44,46, 57,57,80,56,12,9,48,74,73,49,76,58,10,36,84,0, 0,3,0,0,255,245,1,234,2,22,0,34,0,48,0,64, 0,0,1,35,21,33,34,7,20,23,54,55,54,51,50,23, 22,21,20,7,6,35,34,39,38,39,38,53,52,55,54,59, 1,53,33,53,33,3,52,35,34,7,6,21,20,23,22,51, 50,55,54,5,50,23,22,21,20,7,6,35,34,39,38,53, 52,55,54,1,234,22,254,234,84,1,61,27,78,31,33,83, 39,19,75,37,44,134,93,8,7,38,124,12,14,214,254,108, 1,234,68,86,60,32,16,68,14,15,66,23,8,254,165,25, 7,1,21,6,6,23,8,2,22,5,1,221,175,70,58,62, 63,22,9,48,24,32,68,30,15,108,9,10,53,64,114,11, 1,118,57,254,80,48,27,13,16,38,10,2,33,11,28,23, 5,5,22,9,2,22,6,5,23,8,2,0,0,2,0,0, 255,242,2,56,2,34,0,13,0,29,0,0,17,52,55,54, 51,50,22,21,20,6,35,34,39,38,37,52,39,38,35,34, 7,6,21,20,23,22,51,50,55,54,90,78,114,118,168,168, 118,128,82,72,1,248,74,63,83,98,67,55,74,63,83,98, 67,55,1,10,128,81,71,162,118,118,162,89,79,112,98,67, 58,76,64,83,98,67,58,76,64,0,0,2,0,0,0,0, 1,218,2,36,0,24,0,41,0,0,33,35,34,39,38,61, 1,6,35,34,39,38,53,52,55,54,51,50,23,22,21,17, 20,23,22,3,52,39,38,35,34,15,1,6,21,20,23,22, 51,50,55,54,1,218,66,66,18,10,52,73,93,56,40,76, 50,63,93,56,40,47,22,133,63,28,34,75,34,11,5,63, 28,34,75,34,16,41,21,83,108,39,62,44,61,87,48,32, 62,44,61,254,249,64,35,17,1,123,69,28,13,52,24,16, 18,69,28,13,52,25,0,1,255,250,0,2,1,250,2,37, 0,37,0,0,37,39,6,7,6,35,34,39,38,53,52,51, 50,23,54,55,54,53,52,39,38,35,34,7,6,7,55,54, 51,50,23,22,21,20,7,6,7,23,1,172,117,51,91,22, 17,67,39,24,130,76,118,79,19,7,65,62,76,87,111,19, 15,6,102,121,104,74,93,89,20,23,144,2,120,26,11,3, 41,24,31,82,57,21,68,26,36,53,41,43,53,9,9,70, 58,47,60,110,103,55,13,8,150,0,0,1,255,254,0,0, 1,168,2,24,0,57,0,0,3,52,55,54,51,50,23,22, 51,50,55,54,53,52,39,38,35,34,7,53,54,51,50,23, 22,21,20,7,22,21,20,7,23,35,47,1,35,34,39,38, 53,52,51,50,23,54,53,52,39,38,35,34,6,35,34,7, 35,34,2,82,17,29,4,50,40,32,57,24,11,41,47,90, 107,59,66,100,174,49,17,36,28,58,84,100,40,92,6,112, 50,24,106,29,139,56,29,9,12,28,110,14,10,9,24,87, 1,36,42,5,1,10,11,35,15,18,35,23,27,35,69,30, 87,29,39,57,56,43,43,63,49,70,30,2,36,18,24,34, 42,24,63,45,17,6,18,1,0,2,0,0,0,0,1,164, 2,22,0,43,0,59,0,0,19,20,23,22,51,50,55,54, 53,52,47,1,38,35,53,50,23,22,21,20,7,22,21,20, 7,6,43,1,34,39,38,53,52,55,38,53,52,55,54,51, 21,6,7,6,23,20,23,22,51,50,55,54,53,52,39,38, 35,34,7,6,64,65,37,44,66,43,37,62,32,4,4,95, 45,26,80,56,67,43,54,44,78,50,36,56,80,76,39,51, 72,23,7,24,66,26,30,77,32,13,68,25,29,75,32,15, 1,126,52,28,16,33,28,35,65,22,7,1,57,64,36,48, 78,50,41,67,77,44,29,57,41,52,67,41,50,78,89,39, 20,57,4,53,17,253,62,22,9,47,20,26,53,19,7,39, 17,0,0,1,255,248,0,0,1,160,2,22,0,25,0,0, 55,50,55,54,53,17,51,17,35,53,6,35,34,39,38,39, 54,53,52,39,51,22,21,20,7,22,211,65,47,29,64,64, 38,89,125,73,18,12,29,34,66,31,21,51,181,28,17,21, 1,31,253,234,160,36,69,17,20,96,59,72,77,68,86,70, 71,58,0,1,255,252,0,0,1,194,2,189,0,66,0,0, 1,50,23,22,21,20,35,39,49,34,7,6,21,20,23,22, 51,33,21,33,34,39,38,53,52,55,38,39,38,53,52,55, 54,55,38,53,52,55,54,51,50,23,21,39,49,34,21,20, 23,50,23,22,21,20,35,34,38,35,34,7,6,21,20,23, 22,51,55,1,82,53,30,14,79,196,45,18,6,51,14,16, 1,22,254,222,79,36,18,57,51,25,12,161,30,33,39,144, 32,38,13,14,54,114,56,64,29,13,38,18,102,40,72,44, 38,59,21,26,168,1,20,32,15,17,40,18,37,13,15,50, 14,4,57,56,28,37,71,32,19,48,24,25,96,36,6,4, 62,45,89,19,4,1,59,2,70,53,38,34,15,19,36,38, 29,26,35,48,18,6,22,0,0,1,0,0,0,0,1,233, 2,10,0,33,0,0,19,38,53,52,55,54,51,50,23,22, 21,20,7,6,7,6,35,53,50,55,54,55,54,53,52,39, 38,35,34,7,6,21,20,23,114,10,79,47,61,104,57,37, 9,38,162,121,159,155,114,114,32,9,60,32,41,78,30,14, 9,1,34,33,33,94,45,27,69,46,63,31,33,148,75,57, 57,65,62,102,28,27,70,36,19,59,26,33,26,32,0,1, 0,0,255,252,2,12,2,22,0,19,0,0,1,21,33,20, 23,22,59,1,21,35,34,39,38,53,35,52,55,54,51,21, 2,12,254,132,64,72,198,46,46,230,92,76,80,28,27,89, 1,190,57,184,70,80,59,104,86,203,89,28,28,88,0,1, 0,4,255,252,2,2,2,217,0,40,0,0,1,20,23,22, 23,21,33,20,23,22,23,22,51,21,6,35,34,39,38,53, 35,52,55,54,51,21,51,38,53,52,55,54,51,50,23,21, 38,35,34,7,6,1,105,106,20,23,254,142,33,27,58,81, 171,46,18,222,83,65,72,34,27,75,238,87,102,40,51,19, 11,18,17,73,31,14,2,61,86,65,13,10,52,138,54,43, 23,34,57,2,98,77,176,84,24,20,72,73,101,104,34,14, 1,57,3,50,22,0,0,1,254,143,2,62,255,101,2,207, 0,23,0,0,3,35,54,53,52,39,38,35,34,21,20,23, 35,38,53,52,55,54,51,50,31,2,20,183,40,12,34,8, 10,50,10,38,28,58,23,26,66,29,9,3,2,62,8,22, 34,11,3,48,20,10,38,32,48,19,8,38,17,20,32,0, 0,2,0,0,255,244,1,228,2,22,0,34,0,41,0,0, 37,6,7,6,35,34,47,1,52,55,54,55,38,39,35,53, 33,21,35,21,35,38,35,34,7,6,7,22,23,22,51,50, 55,54,51,39,53,33,22,23,22,23,1,228,2,63,48,57, 96,71,103,67,12,13,78,26,32,1,226,22,44,51,39,37, 27,116,24,7,44,79,48,36,60,63,15,78,254,214,12,52, 17,19,142,70,47,36,50,83,66,72,14,10,55,138,57,57, 227,5,5,24,68,7,36,69,48,48,169,166,83,55,19,9, 0,4,0,0,255,240,2,68,2,219,0,31,0,40,0,50, 0,59,0,0,1,35,20,7,6,7,22,21,20,15,1,6, 35,34,39,38,39,38,39,38,39,35,53,51,54,55,23,22, 23,22,23,51,35,38,39,38,35,34,7,6,7,5,33,7, 49,20,23,33,54,55,54,3,50,55,54,53,52,39,33,22, 2,68,22,57,18,21,36,81,33,27,31,104,81,36,19,29, 19,5,1,32,32,42,214,55,129,56,24,6,22,96,8,74, 54,60,98,53,24,7,1,122,254,134,2,14,1,36,32,23, 19,158,58,32,18,18,254,232,62,1,221,94,84,28,17,46, 66,98,40,13,7,96,44,50,76,159,40,28,57,192,4,3, 15,92,38,48,60,40,29,63,29,37,67,55,72,48,19,62, 51,254,139,43,25,31,42,33,174,0,0,5,0,0,255,248, 3,212,2,192,0,51,0,74,0,84,0,93,0,109,0,0, 1,35,53,52,35,34,7,38,35,34,7,6,7,33,21,35, 20,7,6,7,22,21,20,7,6,35,34,39,38,39,38,39, 38,39,35,53,51,54,55,54,51,50,23,22,23,54,51,50, 31,1,22,21,1,34,39,38,53,52,55,54,51,50,23,22, 29,1,20,23,35,34,39,38,61,1,6,37,33,20,7,20, 23,51,54,55,54,7,52,39,35,22,51,50,55,54,37,52, 39,38,35,34,7,6,21,20,23,22,51,50,55,54,3,212, 64,57,117,67,43,50,62,43,18,7,1,151,19,55,13,15, 32,73,33,42,68,61,64,25,10,10,12,2,28,28,23,64, 43,51,40,51,5,9,89,105,54,36,13,8,252,195,73,46, 32,63,41,47,83,43,25,96,66,66,18,10,38,2,64,254, 188,1,11,251,35,19,9,43,15,241,54,110,55,26,11,254, 16,45,20,21,48,26,12,43,21,22,48,26,12,2,79,16, 40,99,58,74,32,35,57,83,71,17,13,41,55,87,34,15, 53,55,91,37,60,71,49,57,105,57,37,30,2,6,78,36, 17,14,15,254,115,49,34,43,64,38,24,54,31,41,233,108, 10,41,21,83,102,22,183,41,7,59,44,20,72,32,246,37, 28,149,42,19,239,40,20,9,34,16,19,39,20,10,34,16, 0,2,254,193,1,228,0,88,2,162,0,12,0,26,0,0, 3,50,31,1,20,7,6,35,34,39,38,53,54,23,6,7, 6,35,34,39,38,39,51,22,51,50,55,118,28,11,4,27, 8,8,27,11,3,1,246,8,22,54,118,119,55,24,7,92, 12,101,88,17,2,162,24,17,24,10,3,24,7,8,39,57, 39,27,67,67,29,37,80,80,0,1,255,72,1,253,255,198, 2,125,0,15,0,0,3,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,121,41,16,6,34,13,16,38,18,7, 37,12,2,125,37,13,15,38,18,7,34,13,16,44,16,5, 0,1,0,39,0,0,2,187,1,187,0,47,0,0,37,50, 55,54,61,1,51,21,51,53,51,17,35,53,35,21,20,7, 6,35,34,39,35,39,51,50,55,54,53,52,43,1,55,51, 50,23,22,23,20,21,20,7,6,39,23,22,23,22,1,46, 58,34,20,89,101,95,94,100,85,52,66,196,19,47,1,142, 41,11,2,59,111,1,158,68,25,8,2,70,42,33,2,1, 2,26,90,45,26,33,205,99,143,254,69,230,56,82,42,26, 163,72,40,9,11,56,68,67,23,27,6,5,82,31,20,5, 17,4,5,71,0,2,0,39,0,0,3,125,1,187,0,3, 0,51,0,0,33,35,17,51,1,50,55,54,61,1,51,21, 51,53,51,17,35,53,35,21,20,7,6,35,34,39,35,39, 51,50,55,54,53,52,43,1,55,51,50,23,22,23,20,21, 20,7,6,39,23,22,23,22,3,125,93,93,253,177,58,34, 20,89,101,95,94,100,85,52,66,196,19,47,1,142,41,11, 2,59,111,1,158,68,25,8,2,70,42,33,2,1,2,26, 1,187,254,159,45,26,33,205,99,143,254,69,230,56,82,42, 26,163,72,40,9,11,56,68,67,23,27,6,5,82,31,20, 5,17,4,5,71,0,0,1,0,40,255,254,1,241,1,189, 0,48,0,0,1,35,34,7,6,29,1,20,7,6,35,34, 39,52,55,38,53,52,55,54,59,1,7,35,34,7,6,59, 1,21,35,34,7,6,21,22,23,22,51,50,55,54,61,1, 52,55,54,59,1,1,241,34,20,9,3,84,45,56,205,1, 59,57,36,28,23,136,1,74,47,1,2,53,72,64,30,19, 10,2,55,18,21,39,28,30,68,5,6,83,1,117,19,6, 6,217,74,34,19,145,51,41,29,73,43,35,28,69,46,57, 73,31,15,20,44,15,6,17,21,25,223,84,7,1,0,1, 0,40,255,254,1,237,2,102,0,50,0,0,1,35,34,21, 3,20,7,6,35,34,39,52,63,2,38,53,52,55,54,59, 1,7,35,34,7,6,21,22,59,1,21,7,6,21,22,23, 22,51,50,51,54,55,54,53,17,52,55,54,59,1,1,237, 35,32,1,87,41,51,205,1,25,25,1,49,36,28,23,136, 1,74,32,13,5,1,51,72,64,65,2,51,24,26,2,3, 47,31,17,22,21,28,83,2,42,41,254,124,79,33,15,145, 42,28,21,1,33,69,43,35,28,69,33,11,13,52,59,1, 1,58,48,23,10,2,34,19,20,1,123,49,22,24,0,1, 0,40,255,245,1,203,2,118,0,61,0,0,1,52,39,38, 43,1,53,51,50,23,22,21,20,21,6,7,22,23,22,21, 20,7,6,7,6,39,38,53,17,52,55,54,55,23,22,23, 7,38,39,38,35,34,35,6,21,3,20,23,22,51,54,55, 52,47,1,43,1,39,51,50,55,54,1,102,37,10,11,83, 136,54,28,15,1,54,31,3,30,108,45,55,91,62,58,62, 60,106,46,84,58,52,6,26,40,59,3,3,129,1,53,27, 32,107,1,33,19,5,75,1,76,40,14,4,1,69,36,10, 3,69,48,26,30,2,2,90,18,15,3,29,57,86,33,13, 1,2,50,45,60,1,20,92,58,58,2,3,13,68,57,16, 23,35,4,128,254,219,43,22,12,2,64,44,17,6,72,36, 11,0,0,1,0,40,255,246,2,122,2,107,0,59,0,0, 23,34,39,38,53,17,52,55,54,51,50,23,22,21,3,35, 19,52,39,38,35,34,7,6,21,3,20,23,22,51,50,55, 54,55,39,38,43,1,39,51,50,53,38,43,1,53,51,50, 23,22,21,20,7,6,35,22,21,20,7,6,251,110,60,41, 110,73,98,123,93,97,1,94,1,64,69,84,120,47,22,1, 30,35,52,79,23,6,1,3,10,46,73,1,74,60,2,58, 83,136,56,27,14,35,22,14,80,100,48,10,58,39,56,1, 20,109,55,36,57,58,85,254,93,1,163,44,43,45,63,29, 40,254,232,27,26,30,44,12,14,26,39,70,62,51,69,51, 26,31,57,32,19,20,84,83,34,16,0,1,0,30,255,246, 3,48,1,187,0,64,0,0,1,7,21,35,53,7,39,55, 52,39,38,35,34,7,6,7,6,21,39,52,55,54,51,50, 23,22,23,22,29,1,63,1,51,21,55,38,53,52,51,50, 23,15,1,6,7,22,23,22,21,20,7,6,35,34,39,55, 22,51,50,55,54,53,52,39,38,2,115,139,95,231,65,183, 28,35,36,23,27,19,17,13,52,39,49,61,80,50,10,7, 13,54,1,95,112,6,56,67,3,3,7,10,18,36,52,45, 86,27,29,74,41,47,28,35,10,12,48,40,53,1,31,66, 221,184,134,64,84,18,66,83,32,24,39,27,7,82,16,44, 58,109,21,23,39,14,4,28,189,155,49,9,26,61,61,28, 18,15,7,30,55,53,57,77,32,10,71,41,42,5,23,37, 36,36,47,0,0,1,0,39,255,249,2,39,1,197,0,43, 0,0,1,50,23,22,23,7,38,35,34,7,22,23,22,51, 33,23,35,22,23,20,7,6,35,34,39,55,22,23,22,51, 50,55,52,39,38,35,7,39,55,38,53,54,55,54,1,3, 54,73,10,5,6,45,52,83,1,2,27,8,8,1,35,1, 174,82,1,109,40,50,112,92,72,7,32,45,49,102,1,39, 29,11,233,14,144,75,2,85,29,1,197,16,2,2,69,19, 41,33,12,3,56,30,82,93,29,11,70,69,14,19,30,73, 41,30,23,56,74,28,16,64,64,20,7,0,0,1,0,39, 0,0,2,71,1,187,0,33,0,0,1,53,51,17,35,53, 35,21,20,7,6,35,34,39,38,61,2,38,43,1,55,51, 50,31,1,21,20,51,50,61,1,51,21,1,234,93,93,88, 34,40,68,69,44,40,3,16,49,1,94,57,10,2,51,56, 90,1,57,130,254,69,237,15,41,34,41,39,34,51,117,17, 9,70,56,21,133,51,49,168,86,0,0,2,0,39,0,0, 2,39,1,197,0,3,0,36,0,0,33,35,17,51,37,50, 23,22,23,20,21,6,35,34,39,38,39,55,6,23,22,51, 50,55,54,55,39,38,39,38,35,34,7,6,7,53,54,2, 39,93,93,254,159,128,46,18,1,1,188,70,52,32,9,72, 5,26,30,39,72,19,5,1,3,5,18,27,50,46,33,5, 2,39,1,187,10,84,34,45,4,4,181,48,29,23,43,4, 32,36,68,18,21,30,26,19,31,11,2,2,73,10,0,1, 0,38,0,0,2,8,1,199,0,46,0,0,37,48,17,51, 17,35,53,6,7,6,35,34,39,38,53,52,55,38,39,38, 53,55,54,55,54,51,50,23,7,38,35,34,35,6,21,20, 59,1,23,35,34,7,6,23,22,55,54,1,171,93,93,40, 84,30,22,114,60,38,71,18,20,33,3,12,40,44,67,87, 36,1,34,38,4,4,109,62,106,1,105,62,1,1,112,57, 63,44,177,1,10,254,69,90,33,18,6,54,35,49,55,35, 5,18,27,37,25,38,20,24,12,71,12,1,45,54,67,52, 51,6,3,33,22,0,0,2,0,40,255,244,2,21,1,197, 0,15,0,60,0,0,1,50,31,1,21,20,7,6,35,34, 39,38,53,52,55,54,3,50,55,54,53,39,38,47,1,38, 39,38,39,38,53,55,54,55,50,23,7,38,35,34,21,20, 31,2,22,23,22,21,20,7,6,35,34,39,38,39,55,22, 23,22,1,223,35,14,5,30,12,13,36,13,4,31,11,211, 71,30,12,3,8,28,35,3,4,88,41,51,3,21,154,48, 46,2,39,55,83,86,32,2,102,30,10,102,44,56,85,73, 47,16,76,8,34,50,1,110,32,20,3,32,14,6,32,9, 11,35,15,5,254,206,38,15,20,19,21,15,14,1,1,24, 24,32,46,32,90,1,15,76,21,50,26,24,8,1,26,61, 20,22,104,37,16,46,28,26,53,15,27,39,0,1,0,39, 0,35,1,181,1,187,0,39,0,0,37,6,7,6,35,34, 39,38,39,35,55,51,50,55,54,55,39,38,43,1,55,51, 50,23,22,21,20,7,6,7,6,35,34,39,22,51,54,55, 54,55,1,181,20,39,58,50,103,50,18,13,47,1,152,48, 13,2,1,3,10,51,127,1,168,72,31,14,53,4,4,38, 52,15,3,13,97,43,52,47,2,96,17,17,27,77,28,55, 71,38,8,9,20,32,70,62,28,32,67,34,3,2,21,1, 86,2,33,29,11,0,0,2,0,40,255,254,2,39,1,193, 0,56,0,71,0,0,19,20,23,22,59,1,7,35,34,7, 6,21,23,22,51,50,55,6,35,34,39,52,55,54,55,23, 22,31,1,22,21,20,21,6,7,6,35,34,39,38,53,52, 53,54,55,34,39,38,53,52,55,54,59,1,7,35,34,5, 50,55,54,53,52,39,38,35,34,7,23,22,23,22,134,29, 10,11,60,1,32,31,19,7,3,18,113,114,52,18,13,132, 2,55,30,39,32,62,27,11,5,2,68,75,115,190,37,8, 1,72,18,27,43,40,24,28,115,1,61,50,1,28,37,11, 3,29,10,13,51,4,3,10,29,7,1,74,35,13,5,73, 31,13,12,23,54,105,2,122,85,43,23,1,3,14,74,44, 31,36,3,3,95,70,77,98,21,25,3,3,55,37,18,28, 54,51,33,19,69,141,44,12,13,47,21,7,73,21,37,11, 2,0,0,1,0,40,255,252,2,84,1,199,0,54,0,0, 55,34,39,38,53,52,55,54,51,50,23,22,23,22,21,55, 23,7,22,23,22,21,20,21,6,7,6,35,38,39,38,53, 52,55,54,55,54,39,38,35,34,7,6,21,20,23,22,51, 50,55,54,39,21,7,6,175,69,40,26,36,35,59,96,87, 6,5,29,139,64,161,8,13,18,2,56,13,20,66,19,6, 23,16,8,3,60,65,37,37,16,6,37,12,15,17,20,16, 1,18,19,164,58,38,49,66,39,41,113,7,8,41,5,170, 68,163,8,32,41,28,2,2,85,20,5,2,65,20,25,32, 48,32,8,7,71,77,43,16,17,47,19,7,12,11,1,73, 12,10,0,1,0,39,255,255,2,32,1,194,0,66,0,0, 55,50,55,54,53,52,39,38,35,34,7,55,54,51,22,23, 54,63,1,22,23,54,53,51,20,7,6,35,22,23,7,6, 7,6,7,39,38,39,38,53,55,22,51,55,54,55,54,53, 52,39,38,35,34,7,6,7,21,20,7,6,35,34,39,38, 39,53,22,103,70,26,10,15,24,51,25,37,1,54,31,120, 23,14,54,32,20,21,19,98,50,16,4,56,3,3,14,74, 18,21,32,7,8,27,1,21,19,15,17,16,19,42,16,21, 22,20,16,2,49,49,73,14,7,25,42,36,65,86,35,41, 52,42,63,25,74,17,2,113,12,21,3,1,6,19,60,57, 37,13,46,88,52,111,30,8,1,2,1,2,6,1,74,21, 3,8,26,36,58,69,26,10,24,18,9,46,80,61,64,1, 3,22,73,33,0,1,0,40,0,0,2,47,1,195,0,37, 0,0,19,54,51,50,23,22,23,51,53,51,17,35,53,35, 22,7,6,7,6,35,34,39,38,39,55,22,23,22,51,50, 55,39,38,39,38,35,34,7,78,49,52,91,60,36,10,90, 93,93,90,2,14,45,115,12,12,38,53,41,8,34,8,47, 26,15,110,5,3,13,54,21,24,62,29,1,168,26,67,40, 52,152,254,69,213,9,39,116,12,1,29,23,11,75,17,21, 11,126,31,58,23,9,23,0,0,1,0,40,255,244,1,179, 1,194,0,38,0,0,55,50,55,54,55,23,6,7,6,35, 34,39,38,53,52,55,54,55,38,39,38,35,34,7,55,54, 51,22,23,22,21,6,7,6,7,6,7,23,22,246,57,55, 19,10,48,42,97,28,28,127,49,24,148,104,1,2,43,14, 25,42,55,1,37,64,127,34,10,2,37,31,87,87,2,3, 15,56,54,19,19,77,60,18,5,76,36,50,80,42,29,36, 36,6,2,26,83,12,3,67,20,28,48,25,20,26,25,59, 24,49,0,2,0,40,255,244,1,203,1,194,0,33,0,53, 0,0,55,52,55,54,55,38,53,54,55,54,55,50,23,7, 38,35,34,7,23,22,23,22,23,22,23,22,21,20,7,6, 35,34,39,38,23,50,55,54,53,39,38,39,38,39,7,6, 7,6,21,20,23,22,23,22,40,61,27,31,46,2,98,33, 39,53,38,1,34,58,72,3,3,11,90,8,4,91,32,12, 93,45,60,182,33,6,219,48,32,20,3,12,56,34,40,14, 11,15,40,7,10,21,35,143,67,39,17,5,25,34,83,27, 9,1,12,75,20,56,10,19,16,1,1,15,63,25,29,101, 40,19,109,21,60,37,23,27,21,34,16,13,11,4,5,10, 26,42,16,16,22,15,26,0,0,1,0,40,255,244,1,206, 1,197,0,44,0,0,37,50,55,54,53,39,38,47,1,38, 39,38,39,38,53,55,54,55,50,23,7,38,35,34,21,20, 31,2,22,23,22,21,20,7,6,35,34,39,38,39,55,22, 23,22,0,255,73,29,11,3,8,28,35,3,4,89,40,51, 3,21,154,47,47,2,39,55,83,86,32,2,102,30,10,102, 44,56,85,73,48,14,75,7,35,49,60,39,15,19,19,21, 15,14,1,1,24,24,32,46,32,90,1,15,76,21,50,26, 24,8,1,26,61,20,22,104,37,16,46,30,24,53,15,27, 39,0,0,1,0,39,255,243,1,187,1,194,0,43,0,0, 37,50,23,20,21,6,7,6,39,38,39,55,54,55,54,53, 52,35,34,7,55,54,51,22,23,22,21,6,7,6,7,6, 21,20,23,22,51,50,55,54,55,54,55,54,1,84,101,1, 2,70,58,65,204,3,3,19,123,106,90,43,54,1,37,65, 129,39,13,2,39,36,85,85,48,22,17,6,6,1,2,9, 58,14,167,75,2,3,47,28,26,2,1,159,26,67,33,28, 35,42,26,85,12,3,64,22,31,50,26,23,18,18,54,57, 19,9,1,9,20,63,14,4,0,3,0,39,255,240,2,47, 1,193,0,3,0,31,0,50,0,0,33,35,17,51,7,6, 7,6,35,34,39,53,22,51,54,55,39,38,47,1,34,35, 6,7,55,54,51,50,23,22,21,20,7,50,55,54,55,23, 6,15,1,38,39,38,53,19,51,3,20,23,22,2,47,93, 93,150,2,86,26,31,30,31,33,18,66,1,2,11,40,24, 1,2,9,29,1,29,34,62,41,39,159,58,51,8,6,24, 33,89,29,96,58,53,1,96,1,52,28,1,187,143,112,29, 9,19,66,16,3,82,26,43,9,1,2,17,69,15,42,40, 61,3,249,22,4,4,76,15,6,1,3,61,56,76,1,6, 254,248,74,34,18,0,0,1,0,39,255,254,1,209,1,187, 0,26,0,0,1,53,51,17,35,17,35,34,7,6,21,23, 22,51,50,55,15,1,39,38,39,38,53,52,55,54,51,1, 116,93,93,134,70,25,9,3,17,107,18,5,23,27,35,120, 31,9,63,47,57,1,97,90,254,69,1,26,59,21,27,31, 72,1,73,1,5,20,101,29,35,78,50,36,0,1,0,39, 0,0,2,4,1,207,0,55,0,0,1,20,7,6,7,38, 35,6,21,20,23,22,23,55,54,55,54,55,53,51,17,35, 53,6,7,6,35,34,39,38,53,52,55,54,51,55,54,53, 52,39,38,35,34,21,20,23,35,38,53,52,55,54,51,50, 23,22,1,90,88,21,25,15,31,29,47,27,28,37,40,45, 54,8,93,93,23,37,56,64,108,58,38,33,12,51,48,80, 33,13,15,44,38,81,42,59,32,37,68,38,39,1,76,95, 28,7,2,1,2,15,34,22,13,1,3,7,25,29,16,249, 254,69,112,16,17,23,59,38,55,32,8,2,3,12,60,44, 20,7,44,22,26,26,36,55,28,14,35,33,0,1,0,40, 255,249,1,168,1,197,0,41,0,0,19,20,23,22,59,1, 21,35,34,7,6,21,22,23,22,23,55,54,55,23,6,35, 34,39,38,53,52,55,34,39,38,53,52,55,54,51,50,23, 21,38,35,34,139,39,11,12,119,114,44,16,6,1,27,28, 41,31,52,49,55,76,107,105,57,39,65,11,22,32,79,42, 52,51,74,51,36,111,1,69,30,11,3,66,40,14,14,34, 22,23,2,3,12,56,71,73,60,40,57,60,41,19,27,40, 68,31,17,15,71,15,0,1,0,36,0,0,2,3,2,3, 0,54,0,0,55,20,23,22,51,50,55,54,55,39,51,17, 35,55,6,7,34,35,39,38,39,38,53,52,55,38,39,38, 39,38,53,52,55,54,53,52,39,23,22,21,20,7,6,15, 1,6,21,20,23,22,59,1,23,35,34,140,63,21,22,47, 67,55,8,1,93,93,1,102,77,4,3,49,98,35,13,81, 54,23,5,2,3,107,27,3,76,5,55,40,8,5,1,23, 21,20,106,1,105,63,170,39,14,5,37,30,13,251,254,69, 99,53,6,3,14,62,23,29,55,35,29,42,9,9,14,10, 64,26,8,25,9,9,25,15,12,43,19,15,10,14,3,4, 19,16,18,69,0,2,0,39,0,0,2,27,1,187,0,12, 0,35,0,0,37,38,39,38,35,34,21,22,23,55,54,55, 54,23,20,7,6,35,34,39,38,53,52,55,54,51,33,53, 51,17,35,17,35,31,1,22,1,14,2,30,4,22,77,1, 65,23,36,8,2,73,69,33,41,102,40,19,65,33,41,1, 12,93,93,129,13,1,12,216,47,16,4,62,55,2,3,10, 28,6,10,62,28,13,60,28,37,74,35,17,94,254,69,1, 23,17,1,23,0,1,0,39,0,0,1,187,1,187,0,35, 0,0,37,17,51,17,35,53,6,15,1,38,39,38,61,1, 47,1,38,43,1,55,51,50,23,22,29,1,20,23,22,51, 55,54,55,50,55,54,1,94,93,93,32,65,20,69,45,29, 1,5,5,9,31,1,75,40,20,9,43,13,15,31,13,15, 11,21,3,185,1,2,254,69,111,23,5,1,3,49,33,40, 146,12,6,2,70,38,18,21,152,37,14,5,3,2,5,15, 2,0,0,1,0,40,255,151,2,18,1,197,0,55,0,0, 19,20,23,22,51,37,23,7,50,23,22,21,6,7,6,35, 34,39,23,35,39,38,39,38,39,55,22,23,22,51,50,55, 54,55,54,55,39,38,39,7,39,55,38,53,54,55,54,51, 50,23,22,23,7,38,7,6,219,25,9,5,1,3,13,170, 14,41,50,4,97,41,50,22,4,131,115,89,47,23,14,35, 72,7,30,41,50,27,23,13,12,36,2,3,15,79,220,11, 151,67,2,91,21,25,76,54,5,4,6,28,68,81,1,68, 13,13,4,33,75,14,30,37,47,84,30,12,2,105,110,12, 16,5,27,55,13,17,23,7,4,7,21,38,22,44,20,46, 84,15,25,57,68,16,4,17,1,2,62,13,1,3,0,1, 0,38,0,88,1,251,1,197,0,32,0,0,55,50,55,54, 61,1,51,21,51,7,35,21,6,7,6,7,39,38,53,52, 55,54,51,50,23,21,38,39,34,21,20,21,22,230,56,23, 9,92,97,1,96,5,46,47,71,51,151,70,32,42,34,41, 16,47,60,4,159,50,20,24,137,71,71,36,51,34,36,2, 3,21,173,107,41,19,11,63,5,1,102,4,5,115,0,1, 0,40,0,46,1,245,1,215,0,45,0,0,1,50,23,22, 29,1,51,21,35,21,20,7,6,35,34,35,38,39,38,53, 52,53,54,51,53,52,39,38,39,7,6,7,6,21,20,23, 22,23,7,38,39,38,53,52,55,54,1,1,71,48,35,90, 89,43,16,19,2,2,42,20,21,3,70,49,13,15,24,31, 25,34,32,23,14,68,19,29,42,89,53,1,215,49,35,44, 49,73,22,49,19,6,2,24,22,38,3,3,77,51,40,14, 4,1,3,8,33,44,65,65,56,39,8,37,15,47,68,65, 133,61,36,0,0,1,0,40,0,108,1,54,1,196,0,26, 0,0,55,34,39,38,53,52,51,53,52,39,38,35,34,7, 53,54,51,50,29,1,51,7,35,21,20,7,6,133,64,15, 4,82,20,5,6,29,32,48,26,106,90,1,89,49,18,108, 53,13,15,81,48,55,7,2,12,73,9,96,87,72,30,39, 15,5,0,1,255,175,0,0,2,2,1,188,0,57,0,0, 1,20,7,6,7,35,34,39,38,49,34,7,23,22,23,22, 51,50,51,54,55,17,51,3,35,39,6,7,6,35,34,39, 38,53,52,55,54,59,1,50,55,54,53,52,39,38,35,34, 7,6,7,55,54,55,23,22,23,22,1,85,58,18,20,36, 4,4,30,27,1,3,7,24,37,49,3,2,94,58,94,1, 93,1,11,34,53,52,87,68,75,26,10,11,86,40,24,10, 65,23,27,82,72,49,9,1,92,80,78,70,40,61,1,54, 63,27,8,2,1,2,21,17,18,18,30,2,67,1,9,254, 69,85,11,16,25,51,56,82,25,13,5,26,11,13,41,15, 6,30,26,5,86,39,2,3,6,20,33,0,0,1,0,39, 0,55,1,167,1,207,0,51,0,0,1,20,7,6,7,38, 35,6,21,20,23,22,23,55,54,55,54,55,21,6,7,6, 35,34,39,38,53,52,55,54,51,55,54,53,52,39,38,35, 34,21,20,23,35,38,53,52,55,54,51,50,23,22,1,90, 88,21,25,15,31,29,47,27,28,37,40,45,54,8,23,37, 56,64,108,58,38,33,12,51,48,80,33,13,15,44,38,81, 42,59,32,37,68,38,39,1,76,95,28,7,2,1,2,15, 34,22,13,1,3,7,25,29,16,82,16,17,23,59,38,55, 32,8,2,3,12,60,44,20,7,44,22,26,26,36,55,28, 14,35,33,0,0,2,0,39,0,0,1,240,1,189,0,28, 0,36,0,0,55,34,39,38,53,52,55,54,55,23,22,23, 7,38,35,34,7,6,21,20,23,22,51,50,55,54,55,7, 6,19,53,51,17,35,53,35,53,240,90,60,51,69,52,68, 52,20,20,1,29,21,91,32,12,84,22,28,23,22,4,3, 1,46,130,93,93,172,10,75,63,83,99,64,47,3,2,3, 4,67,10,78,31,39,116,28,8,12,2,2,73,11,0,255, 178,254,69,196,69,0,0,1,0,40,0,0,2,82,1,192, 0,41,0,0,1,38,35,6,21,20,21,7,6,7,6,35, 38,39,38,53,52,55,54,51,50,23,7,38,35,6,7,6, 21,22,23,54,55,54,53,52,55,54,59,1,17,35,1,245, 21,46,61,1,11,84,21,28,95,54,39,61,28,38,17,52, 1,21,21,44,12,3,1,87,53,12,4,65,28,41,169,93, 1,97,31,3,148,10,11,63,114,20,5,1,86,62,79,135, 52,23,15,64,8,3,89,22,22,156,1,2,69,28,58,148, 38,16,254,69,0,1,0,39,0,0,1,202,1,187,0,29, 0,0,37,6,35,34,39,38,53,52,55,54,55,54,23,21, 38,35,34,7,6,21,20,51,50,55,54,55,53,51,17,35, 1,109,72,72,129,39,14,83,35,45,40,41,22,28,45,22, 28,108,39,42,30,8,93,93,114,51,100,36,46,94,38,17, 2,2,14,66,7,16,21,52,90,24,16,11,246,254,69,0, 0,2,0,39,0,0,2,1,1,202,0,3,0,55,0,0, 33,35,17,51,7,6,7,6,7,22,31,1,22,23,22,23, 35,38,39,38,39,38,43,1,39,51,50,55,54,55,39,38, 39,7,6,7,23,22,23,50,55,23,6,43,1,38,39,38, 53,52,55,54,51,50,23,22,2,1,93,93,135,2,129,21, 23,41,45,3,22,24,9,1,107,22,68,4,3,16,49,39, 1,128,65,34,17,1,3,13,68,28,40,3,3,9,28,17, 15,13,17,33,8,70,29,13,84,28,34,105,52,31,1,187, 143,123,29,4,2,7,42,3,20,46,16,8,95,20,1,1, 3,71,54,27,34,27,55,6,3,9,35,15,21,1,10,54, 10,1,48,21,27,75,22,8,65,38,0,2,0,39,0,0, 1,226,1,187,0,9,0,29,0,0,37,39,21,20,23,22, 51,50,55,54,55,53,51,17,35,53,6,15,1,38,39,38, 53,55,39,38,43,1,55,51,1,126,191,44,12,14,51,40, 27,10,93,93,37,66,35,68,50,37,1,1,4,15,38,1, 109,206,152,144,46,13,4,26,18,53,195,254,69,128,31,13, 3,1,47,36,42,148,11,7,70,0,0,1,0,39,0,0, 2,23,1,187,0,40,0,0,1,53,51,17,35,53,35,6, 7,6,35,48,23,22,59,1,21,35,34,47,1,35,55,51, 50,55,54,53,38,39,38,43,1,53,51,50,31,1,22,23, 21,1,186,93,93,115,8,38,35,49,24,5,18,123,191,38, 9,31,59,1,159,34,19,9,1,38,12,13,123,162,65,34, 12,4,2,1,45,142,254,69,235,12,29,20,94,10,70,41, 133,70,34,15,18,42,15,5,70,52,26,13,14,37,0,1, 0,38,255,217,1,219,1,204,0,62,0,0,37,52,39,38, 35,34,7,6,7,6,23,22,51,55,54,55,21,6,35,34, 39,38,39,55,54,55,38,53,52,23,22,23,7,38,39,15, 1,6,21,20,23,22,23,22,23,22,23,22,21,20,15,1, 6,35,34,39,38,61,1,22,23,55,54,1,127,75,25,29, 88,23,6,1,2,47,44,65,55,67,48,66,104,114,66,68, 3,2,15,107,19,144,67,35,1,20,63,37,12,28,37,53, 21,86,34,12,2,1,65,41,17,21,21,42,31,16,56,30, 44,209,47,17,5,66,17,21,66,42,41,3,9,33,76,33, 57,58,95,38,88,37,28,28,70,1,2,14,66,20,3,1, 3,9,25,21,6,8,3,13,53,17,21,6,6,76,19,8, 2,5,5,1,68,5,8,2,9,0,0,1,0,40,255,244, 1,207,1,188,0,40,0,0,37,20,7,6,35,34,39,38, 39,55,22,23,22,51,50,55,39,38,39,38,39,38,39,55, 54,55,54,51,50,51,50,23,21,35,34,7,20,23,22,23, 22,1,206,130,33,39,85,73,46,16,64,3,43,55,51,114, 2,3,14,75,100,27,47,2,2,9,29,42,92,4,4,73, 39,115,80,2,43,52,25,143,136,116,25,7,49,31,26,64, 15,35,47,62,19,37,22,29,16,28,55,28,34,21,31,1, 69,44,22,16,16,7,44,0,0,1,0,70,0,0,0,163, 1,187,0,3,0,0,51,35,17,51,163,93,93,1,187,0, 0,1,0,69,0,0,2,46,2,151,0,20,0,0,1,34, 7,6,21,17,35,19,52,55,54,51,50,51,22,23,22,23, 7,39,38,1,36,82,33,14,94,1,88,44,60,3,2,144, 86,48,13,80,18,65,2,76,72,32,41,254,69,1,187,138, 54,27,2,68,39,36,35,28,75,0,0,1,255,77,0,0, 0,163,2,159,0,22,0,0,51,35,19,52,39,38,39,7, 6,21,20,23,35,38,53,52,53,54,51,50,23,22,21,163, 94,1,39,29,39,23,30,11,73,26,5,119,79,70,68,1, 155,85,58,42,1,3,10,43,24,36,29,45,3,3,110,88, 85,87,0,1,254,80,254,225,255,131,255,158,0,31,0,0, 5,50,55,54,53,52,35,34,35,6,7,39,63,1,54,51, 50,23,22,23,22,21,20,7,6,35,34,35,38,39,55,22, 254,215,64,28,9,51,6,7,47,15,33,25,1,34,39,24, 22,70,13,2,83,33,40,7,7,82,55,37,40,228,21,7, 8,34,3,15,47,15,1,14,6,17,57,10,11,57,21,8, 5,50,49,46,0,1,254,79,254,206,255,235,255,160,0,29, 0,0,5,52,55,54,51,50,23,22,23,7,52,39,38,39, 35,6,7,22,51,50,51,54,53,23,6,7,39,38,39,38, 254,79,91,33,41,106,79,45,17,64,41,55,70,38,62,6, 1,51,4,4,56,30,11,77,40,75,16,3,208,77,26,9, 79,43,43,45,21,53,69,4,14,36,40,3,8,52,12,1, 3,12,55,12,0,1,254,189,254,243,255,243,0,1,0,21, 0,0,5,52,55,54,59,1,21,35,34,7,6,21,22,51, 50,55,23,6,35,34,39,38,254,189,53,32,39,135,98,47, 23,11,1,98,41,52,38,55,82,74,49,50,129,67,38,24, 67,30,14,16,76,37,67,36,40,41,0,1,254,144,1,187, 255,192,2,153,0,3,0,0,3,35,39,51,64,80,224,124, 1,187,222,0,0,1,254,117,1,187,255,191,2,168,0,6, 0,0,3,39,55,23,35,39,55,181,97,86,127,77,253,67, 2,9,130,29,237,149,59,0,0,2,255,102,0,0,0,163, 2,153,0,3,0,7,0,0,19,35,39,51,19,35,17,51, 150,80,224,124,193,93,93,1,187,222,253,103,1,187,0,2, 255,75,0,0,0,163,2,168,0,6,0,10,0,0,19,39, 55,23,35,39,55,1,35,17,51,33,97,86,127,77,253,67, 1,21,93,93,2,9,130,29,237,149,59,253,117,1,187,0, 0,4,0,30,255,246,3,67,2,162,0,15,0,32,0,78, 0,127,0,0,1,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,23,6,7,6,7,39,38,39,38,39,51,22, 51,50,51,54,55,19,6,7,6,35,34,39,38,39,55,22, 23,22,51,50,55,54,53,52,39,38,35,34,15,1,6,35, 34,47,1,49,53,22,51,50,63,1,54,51,50,23,22,23, 22,21,20,37,34,15,1,39,54,51,50,51,22,21,20,7, 22,23,22,21,20,21,6,7,6,35,34,39,38,39,55,31, 1,22,51,50,55,39,38,39,38,43,1,55,51,50,55,39, 38,47,1,38,1,199,30,11,3,28,7,8,27,11,3,26, 7,233,10,5,52,155,55,117,38,7,6,92,39,85,4,3, 99,26,250,2,66,42,61,72,47,26,9,36,4,28,37,32, 42,29,32,13,16,33,35,23,44,29,76,18,9,13,20,13, 37,11,66,35,63,18,17,48,28,38,253,181,46,52,10,4, 80,45,4,4,164,56,28,5,30,2,103,36,44,94,73,47, 10,81,6,11,57,70,82,2,2,10,34,5,5,83,1,82, 49,1,3,6,21,26,14,2,162,26,7,8,26,9,2,24, 7,8,27,10,2,57,24,13,93,3,3,14,79,22,15,80, 3,77,254,126,125,63,42,26,21,7,72,9,20,25,44,48, 76,43,34,45,41,88,48,2,1,67,3,18,119,51,4,13, 43,56,88,3,146,12,3,68,15,3,108,90,20,19,5,30, 45,3,2,95,28,10,67,43,29,47,14,17,87,62,25,38, 7,1,72,60,20,18,10,7,2,0,0,2,0,39,0,33, 1,154,1,154,0,15,0,32,0,0,55,52,55,54,51,22, 23,22,21,20,7,6,35,34,39,38,23,50,55,54,53,52, 39,38,35,7,6,7,6,21,20,23,22,39,66,51,71,89, 54,40,53,52,78,79,54,55,189,48,20,8,19,21,37,21, 24,16,21,11,23,220,88,57,44,2,69,51,67,77,55,55, 55,54,32,60,25,28,45,30,36,3,8,25,31,43,32,27, 55,0,0,2,0,40,255,239,1,166,1,199,0,31,0,49, 0,0,19,50,23,22,21,17,20,23,55,54,55,23,6,35, 34,39,38,61,1,7,6,7,39,38,39,38,53,52,55,54, 55,54,23,34,7,6,21,20,23,22,51,55,54,55,54,61, 1,52,39,38,194,87,42,23,36,13,11,15,1,44,35,34, 23,40,20,26,34,29,31,26,40,39,2,3,40,73,44,17, 5,15,18,28,21,10,9,16,34,8,1,199,49,26,36,254, 249,29,2,3,6,19,83,12,12,20,55,122,13,11,1,3, 7,26,38,61,62,43,3,3,42,70,44,15,16,28,22,23, 4,3,8,13,5,77,28,8,2,0,0,1,0,38,255,249, 1,140,1,197,0,35,0,0,19,50,23,22,21,6,7,23, 21,22,51,50,55,21,6,35,34,39,38,53,38,39,54,51, 50,23,54,53,52,39,38,35,34,7,39,54,184,103,62,46, 1,161,14,23,44,34,48,58,43,88,36,19,111,2,2,71, 59,45,83,54,30,34,50,54,1,69,1,197,56,41,62,130, 26,35,1,35,20,75,19,68,34,36,7,72,68,76,24,67, 49,27,14,16,66,20,0,1,0,39,255,246,1,143,1,200, 0,49,0,0,37,20,7,6,35,34,39,55,22,51,54,55, 54,53,39,38,35,34,7,55,23,22,31,1,54,55,54,53, 39,38,35,34,7,6,7,39,54,51,50,51,22,23,22,23, 7,6,7,6,7,22,1,143,77,46,58,90,89,45,66,59, 79,15,3,3,18,101,29,32,1,3,11,8,49,84,12,1, 3,14,87,21,30,27,2,27,80,44,2,2,107,43,19,1, 3,6,21,7,26,83,130,77,39,24,58,63,47,3,55,9, 10,20,47,5,71,1,1,2,2,4,41,4,5,20,40,10, 9,2,67,27,2,58,26,34,33,30,17,7,8,20,0,2, 0,29,255,249,1,172,1,197,0,27,0,40,0,0,23,34, 39,38,53,54,55,38,39,38,47,1,22,23,22,23,22,21, 55,23,7,22,23,22,21,20,7,6,55,39,38,39,38,35, 6,21,20,23,22,51,50,225,82,45,28,2,103,18,53,28, 46,1,44,58,29,40,35,128,65,134,8,29,35,58,36,7, 3,6,17,24,5,64,16,16,28,55,7,56,35,49,77,75, 17,34,15,8,94,14,24,15,33,29,3,114,63,111,3,42, 53,44,72,42,26,142,21,19,22,31,58,45,22,19,19,0, 0,1,0,39,255,255,1,185,1,187,0,39,0,0,33,35, 39,38,61,1,6,35,34,35,38,39,38,53,55,39,38,43, 1,55,51,50,23,22,29,1,20,23,22,51,50,55,53,51, 17,20,23,22,59,1,1,185,81,24,33,48,35,3,2,75, 38,21,1,1,4,16,22,1,66,40,20,9,39,11,12,21, 44,92,5,6,8,28,2,8,33,94,22,4,51,29,36,112, 15,11,70,38,17,22,131,35,12,3,27,231,254,164,5,13, 7,0,0,1,0,39,255,106,1,145,1,197,0,55,0,0, 19,50,23,21,38,39,7,6,7,20,51,50,55,23,39,35, 6,7,6,21,23,22,23,22,23,22,21,20,7,6,35,34, 35,39,50,55,54,53,38,47,1,38,39,38,53,54,55,54, 55,38,39,38,53,52,55,54,218,22,87,22,72,35,47,3, 133,31,6,1,92,31,37,4,1,3,7,27,27,47,136,113, 25,28,6,6,13,76,18,4,2,58,57,76,22,46,2,39, 24,22,73,18,4,125,24,1,197,20,66,7,9,2,14,41, 68,3,82,10,6,36,4,4,16,16,12,9,14,40,66,93, 18,4,63,31,7,10,36,16,14,24,14,28,46,54,29,20, 1,31,46,11,11,94,13,3,0,2,0,39,255,255,1,187, 1,197,0,38,0,52,0,0,55,20,23,22,51,50,51,54, 55,54,39,34,39,55,54,55,54,51,50,51,22,23,22,21, 20,21,6,7,6,35,38,39,38,39,55,54,55,23,6,55, 39,38,39,7,6,21,20,21,22,23,22,51,54,116,48,20, 24,2,3,98,25,8,2,183,8,2,7,28,36,65,5,6, 85,38,19,3,114,38,55,144,37,10,1,2,5,14,65,10, 246,3,10,52,22,38,1,58,33,25,6,154,47,20,9,3, 65,20,4,149,37,41,23,32,4,69,35,46,3,2,225,51, 17,2,94,26,32,59,39,20,46,26,106,26,42,1,2,12, 60,3,3,47,26,16,13,0,0,1,0,40,255,249,1,130, 1,192,0,21,0,0,23,34,39,38,53,52,63,1,23,7, 6,21,20,23,22,51,50,55,23,6,7,6,226,97,54,35, 56,228,62,233,23,50,19,22,50,53,62,16,28,55,7,61, 40,56,75,44,179,66,182,18,40,47,18,7,68,82,16,16, 31,0,0,2,0,39,255,249,1,163,1,184,0,3,0,30, 0,0,37,35,53,51,5,52,55,54,51,50,23,21,38,35, 34,7,6,7,23,22,23,22,51,50,55,23,6,35,34,39, 38,1,163,198,198,254,132,80,66,88,31,38,33,29,66,46, 32,1,3,14,61,31,39,27,31,1,39,40,102,67,55,188, 68,36,101,65,54,12,73,11,54,38,48,35,72,33,17,16, 78,14,76,64,0,2,255,156,1,79,0,82,2,2,0,15, 0,31,0,0,19,20,7,6,35,34,39,38,53,52,55,54, 51,50,23,22,7,52,39,38,35,34,7,6,21,20,23,22, 51,50,55,54,82,43,23,26,52,26,12,44,21,25,39,26, 27,37,32,11,12,32,15,6,30,11,12,35,15,5,1,169, 49,27,14,44,21,25,52,25,12,26,24,39,35,15,5,31, 12,12,33,15,5,31,10,0,0,3,255,216,255,246,0,209, 2,35,0,29,0,43,0,58,0,0,55,20,7,6,35,34, 39,38,53,52,55,54,55,38,39,38,53,52,55,54,51,50, 23,22,21,20,7,22,23,22,3,52,39,38,35,34,7,6, 21,20,23,22,23,54,21,52,47,1,6,7,6,21,20,23, 22,51,50,55,54,209,61,27,34,73,34,17,40,33,11,13, 32,42,54,32,40,77,31,15,77,8,31,38,46,42,17,20, 49,23,9,42,10,32,76,38,38,9,31,38,49,13,16,52, 18,6,119,82,33,14,58,30,37,47,58,51,3,3,44,54, 44,68,38,22,62,28,36,70,77,3,49,62,1,2,58,22, 9,46,20,22,39,46,12,25,63,244,45,52,41,6,42,56, 36,61,16,5,48,16,0,1,0,0,255,253,1,202,2,25, 0,71,0,0,55,50,55,54,53,17,51,17,35,53,6,7, 6,35,34,39,38,53,52,55,54,55,54,55,54,53,52,47, 1,34,15,1,21,35,53,38,39,38,35,34,7,6,21,20, 31,1,21,34,39,38,53,52,55,54,51,50,23,54,51,50, 23,22,21,20,7,6,7,6,21,20,23,22,225,81,59,47, 46,46,38,84,37,34,100,58,41,98,24,43,51,36,24,34, 19,23,15,10,45,1,3,16,32,38,12,3,28,29,65,26, 11,47,24,28,43,31,29,48,54,25,12,46,20,164,45,70, 42,40,49,39,50,1,96,253,238,81,50,24,10,59,42,58, 82,50,12,17,17,41,28,26,48,14,3,15,16,71,66,8, 5,25,38,10,12,36,12,5,41,49,20,25,57,29,15,29, 29,53,25,29,57,40,18,83,32,53,55,32,20,0,0,2, 0,0,255,253,2,53,2,25,0,3,0,75,0,0,33,35, 3,51,1,50,55,54,53,17,51,17,35,53,6,7,6,35, 34,39,38,53,52,55,54,55,54,55,54,53,52,47,1,34, 15,1,21,35,53,38,39,38,35,34,7,6,21,20,31,1, 21,34,39,38,53,52,55,54,51,50,23,54,51,50,23,22, 21,20,7,6,7,6,21,20,23,22,2,52,43,1,45,254, 172,81,59,47,46,46,38,84,37,34,100,58,41,98,24,43, 51,36,24,34,19,23,15,10,45,1,3,16,32,38,12,3, 28,29,65,26,11,47,24,28,43,31,29,48,54,25,12,46, 20,164,45,70,42,2,18,254,22,49,39,50,1,96,253,238, 81,50,24,10,59,42,58,82,50,12,17,17,41,28,26,48, 14,3,15,16,71,66,8,5,25,38,10,12,36,12,5,41, 49,20,25,57,29,15,29,29,53,25,29,57,40,18,83,32, 53,55,32,20,0,3,255,253,255,252,2,22,2,25,0,59, 0,75,0,91,0,0,1,20,7,23,35,39,55,54,53,52, 39,38,35,34,7,6,21,20,31,1,55,54,51,50,23,22, 23,55,54,51,50,23,22,21,20,7,6,7,39,38,47,1, 7,6,35,34,39,38,61,1,55,38,53,52,55,54,51,50, 23,22,3,52,39,38,35,34,7,6,21,20,23,22,51,50, 55,54,39,52,39,38,35,34,7,6,21,20,23,22,51,50, 55,54,1,246,43,75,56,75,37,17,82,61,82,88,53,49, 25,27,7,21,40,26,26,8,2,16,23,24,60,18,5,51, 20,15,19,13,12,14,15,22,26,42,26,16,3,85,79,71, 80,106,79,90,168,26,9,12,32,13,4,24,12,15,34,9, 2,125,23,11,13,33,10,3,29,9,10,34,9,2,1,14, 95,59,117,115,69,48,42,109,64,47,56,52,73,46,34,27, 15,35,25,8,7,19,20,77,23,28,94,27,7,1,1,4, 12,21,19,19,56,33,36,29,8,58,98,100,66,56,64,73, 254,234,61,25,9,60,18,17,46,31,15,65,14,13,44,34, 17,66,15,14,62,19,6,62,12,0,0,1,255,253,255,248, 2,40,2,25,0,66,0,0,23,34,39,38,53,54,55,38, 53,52,55,54,51,50,23,22,21,20,7,23,35,39,54,55, 54,53,52,39,38,35,34,7,6,21,20,31,1,55,23,7, 6,7,6,21,20,23,22,51,50,55,54,61,1,52,39,38, 39,7,39,55,23,7,22,21,20,7,6,204,89,48,29,6, 4,51,84,76,88,109,76,90,43,75,56,76,37,13,4,84, 59,82,83,62,62,16,16,66,30,49,27,2,9,52,29,36, 69,33,17,21,4,3,66,31,128,34,34,44,50,50,8,64, 40,52,53,7,23,84,98,66,58,64,75,134,78,70,116,119, 37,72,20,19,119,63,44,53,54,69,34,22,14,65,27,50, 37,4,18,18,64,34,20,50,26,32,11,19,21,5,1,67, 32,128,31,32,37,53,67,42,44,0,0,2,255,253,255,165, 1,246,2,25,0,60,0,76,0,0,37,20,7,6,7,23, 35,39,51,50,53,52,39,38,39,54,53,52,39,38,35,34, 7,6,21,20,31,1,54,51,50,23,22,21,20,7,6,35, 34,39,38,53,52,55,38,53,52,55,54,51,50,23,22,21, 20,7,6,7,22,23,22,5,50,55,54,53,52,39,38,35, 34,7,6,21,20,23,22,1,246,50,9,9,52,55,70,11, 79,36,13,24,43,58,58,75,76,52,54,26,32,38,52,65, 40,25,58,32,40,64,40,27,12,80,82,67,89,95,70,72, 8,1,7,19,17,10,254,206,43,22,11,37,18,21,45,22, 10,39,17,134,56,39,7,5,118,160,63,43,18,5,3,37, 79,75,49,49,55,55,68,40,26,21,35,55,35,42,74,38, 20,54,35,43,16,38,48,81,103,67,56,63,62,95,26,35, 14,19,3,43,24,112,43,20,24,45,25,12,42,19,21,52, 24,11,0,1,255,237,0,0,1,237,2,18,0,27,0,0, 33,35,1,51,1,17,6,15,2,22,21,20,7,6,35,34, 39,38,53,52,55,54,55,54,55,54,55,1,237,63,254,63, 67,1,143,51,11,30,17,29,31,11,12,42,14,5,25,74, 51,11,13,53,14,1,122,254,178,1,151,18,9,23,15,14, 32,35,15,5,34,11,12,33,25,58,29,6,6,28,3,0, 0,1,255,255,255,251,1,170,2,25,0,69,0,0,37,20, 7,6,35,34,39,38,53,52,55,51,6,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,35,34,7,6,7,39,55, 54,51,50,55,54,53,52,39,38,39,38,35,34,7,6,21, 6,21,20,23,7,38,53,52,55,54,51,50,23,22,21,20, 7,6,7,22,1,170,77,46,59,187,45,13,80,58,30,34, 29,168,13,14,103,25,7,51,23,29,35,36,3,3,35,30, 36,38,75,23,7,31,10,11,5,6,36,16,6,1,13,47, 19,49,29,34,59,34,20,20,23,25,76,150,86,43,26,182, 53,66,122,112,19,78,69,68,233,18,1,68,18,23,66,28, 13,42,4,4,37,31,30,57,19,23,47,25,7,3,1,27, 10,11,6,6,24,13,26,29,33,56,33,19,56,33,39,42, 34,38,9,36,0,2,255,254,0,0,1,232,2,25,0,60, 0,76,0,0,37,34,7,6,7,21,35,53,6,35,34,39, 38,61,1,55,39,38,53,52,55,54,51,50,23,22,21,20, 7,20,7,39,54,55,52,39,38,39,38,35,34,7,6,21, 20,23,55,54,51,50,23,54,51,50,23,22,29,1,35,53, 38,7,50,55,54,53,52,39,38,35,34,7,6,21,20,23, 22,1,40,26,15,4,1,45,34,32,71,20,6,3,23,24, 81,66,88,104,73,78,5,5,43,5,1,73,51,65,9,8, 78,57,56,23,24,29,24,44,30,29,44,53,29,16,46,13, 185,39,11,3,42,6,7,35,15,6,32,12,233,33,10,10, 180,53,18,75,22,27,21,12,37,45,39,103,66,55,70,73, 111,17,25,9,15,18,24,26,94,62,43,5,1,51,51,65, 48,30,18,18,31,29,41,22,26,190,176,52,149,52,14,14, 65,10,1,43,16,17,52,20,8,0,0,2,255,254,255,251, 1,209,2,25,0,56,0,72,0,0,33,35,17,6,35,34, 39,38,53,52,55,6,7,6,21,20,31,1,55,54,51,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,38,53,52, 55,54,51,50,23,50,23,6,21,20,23,22,51,50,55,54, 55,53,51,3,52,39,38,35,34,7,6,21,20,23,22,51, 50,55,54,1,209,46,56,54,75,24,8,17,54,32,86,33, 36,22,28,29,71,36,19,49,33,40,71,40,24,19,85,83, 66,88,18,22,7,14,45,32,13,12,39,40,9,23,46,192, 44,16,18,49,23,9,46,16,19,62,13,3,1,130,66,55, 19,23,23,52,14,19,51,96,44,22,15,14,15,58,31,40, 65,43,28,57,35,44,31,30,28,91,107,66,53,5,6,76, 32,30,14,5,49,10,39,63,254,113,53,19,7,42,17,21, 59,19,7,59,12,0,0,2,255,254,255,251,1,207,2,27, 0,44,0,60,0,0,33,35,17,52,39,38,35,34,7,6, 21,20,23,22,23,54,55,54,51,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,38,53,52,55,54,51,50,23,22, 23,53,51,3,52,47,1,35,34,7,6,21,20,23,22,51, 50,55,54,1,207,45,73,54,72,82,52,38,30,5,25,29, 44,8,7,71,36,19,49,33,40,72,37,21,9,80,65,64, 94,59,53,62,23,45,193,45,23,8,45,22,11,40,17,21, 52,18,6,1,116,36,49,36,65,49,61,45,30,5,15,29, 7,1,58,31,40,65,43,28,60,33,43,26,30,36,92,101, 62,61,25,29,30,75,254,113,58,18,6,41,20,22,54,24, 10,51,18,0,0,2,0,1,255,248,1,205,2,25,0,30, 0,66,0,0,33,35,53,7,6,35,34,39,38,39,6,7, 6,35,34,39,38,53,52,63,1,38,53,52,55,54,51,50, 23,53,51,1,50,55,54,61,1,51,21,20,23,22,51,50, 63,1,17,38,39,38,35,34,7,6,21,20,23,22,51,54, 55,23,6,21,20,23,22,1,205,45,16,21,34,39,27,6, 14,17,12,25,31,57,37,23,23,6,85,95,59,81,85,93, 47,254,228,31,18,7,48,35,15,16,31,22,14,34,13,61, 71,97,55,37,24,24,28,8,43,36,97,36,13,34,21,21, 24,5,20,26,7,16,45,28,33,43,41,11,27,109,116,57, 35,73,66,254,22,33,13,13,81,80,36,17,7,37,37,1, 36,34,9,43,64,42,58,40,26,27,17,35,37,66,81,40, 17,6,0,2,255,254,255,255,2,11,2,27,0,45,0,61, 0,0,1,20,15,1,39,54,55,52,39,38,35,34,7,6, 21,20,23,22,23,54,55,54,51,50,23,22,21,20,7,6, 35,34,39,38,53,38,39,38,53,52,55,54,51,50,23,22, 3,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54, 2,11,14,32,48,41,2,50,63,107,76,62,65,56,14,17, 25,63,15,16,67,37,23,56,32,39,64,39,24,44,21,65, 91,80,85,113,77,79,191,39,17,21,44,23,11,39,18,21, 45,22,10,1,25,43,36,58,17,47,71,71,62,78,52,52, 68,80,45,11,7,60,14,3,54,32,40,68,37,22,51,32, 39,24,19,60,91,96,69,59,77,75,254,251,46,22,10,39, 18,21,44,23,10,39,18,0,0,1,255,255,255,246,1,246, 2,25,0,75,0,0,55,52,55,54,51,50,23,21,35,53, 38,35,34,7,6,21,20,23,22,23,20,7,6,35,34,39, 38,53,52,55,39,38,39,38,53,52,55,54,51,50,22,21, 20,7,39,54,55,52,39,38,35,34,7,6,21,20,23,22, 23,54,51,21,39,34,7,6,21,20,23,22,51,50,55,54, 55,38,186,56,24,29,58,37,46,15,36,44,13,3,29,5, 6,8,23,72,62,35,22,12,42,3,2,17,80,67,89,111, 156,12,49,9,3,73,62,83,89,56,42,21,6,16,35,48, 9,39,17,8,38,14,17,37,16,1,1,39,158,61,26,12, 28,229,195,15,34,9,11,32,11,1,2,40,20,60,60,37, 43,29,30,42,3,3,29,45,102,67,57,150,108,25,48,13, 30,34,92,62,53,65,49,64,42,25,7,9,35,46,1,49, 21,25,57,21,8,37,3,3,29,0,0,2,255,253,255,251, 1,232,2,63,0,67,0,83,0,0,1,52,39,38,35,55, 22,23,22,21,20,7,6,35,34,39,38,61,1,55,34,15, 1,6,21,20,31,1,55,54,51,50,23,22,21,20,7,23, 7,39,7,6,35,34,39,38,53,52,55,38,53,52,55,54, 51,50,23,22,23,34,21,20,23,22,51,50,55,54,3,52, 39,38,35,34,7,6,21,20,23,22,51,50,55,54,1,188, 33,17,17,15,82,12,2,54,33,41,79,36,18,2,144,32, 6,1,33,36,22,29,28,67,39,24,5,117,22,118,26,35, 37,71,40,24,19,85,94,61,83,39,16,4,3,26,44,19, 24,52,24,10,174,43,15,18,47,23,10,44,16,20,55,16, 5,1,197,38,28,14,42,31,68,12,15,65,40,24,64,33, 41,12,4,106,37,9,10,44,22,15,14,15,55,34,41,19, 20,50,46,49,24,25,57,35,44,31,30,27,92,113,57,38, 16,4,13,40,48,23,10,45,19,254,214,54,19,6,41,18, 21,57,21,7,53,15,0,2,255,253,255,255,1,207,2,20, 0,38,0,54,0,0,19,50,23,53,51,17,35,53,52,39, 38,35,34,7,6,21,20,23,54,55,50,23,22,21,20,7, 6,35,34,39,38,53,52,55,38,53,52,55,54,19,52,39, 38,35,34,7,6,21,20,23,22,51,50,55,54,233,115,69, 46,46,73,48,62,90,57,41,100,18,61,65,38,22,54,32, 39,76,34,18,16,116,85,68,150,39,18,21,45,22,9,38, 16,20,47,23,10,2,20,65,63,254,237,93,73,41,27,52, 37,52,73,50,26,1,55,32,40,67,37,22,62,31,39,10, 45,58,101,93,52,42,254,107,45,22,10,41,18,20,45,22, 9,40,17,0,0,2,0,1,255,248,1,215,2,25,0,15, 0,31,0,0,1,20,7,6,35,34,39,38,53,52,55,54, 51,50,23,22,5,20,23,22,51,50,55,54,53,52,39,38, 35,34,7,6,1,215,68,67,102,107,69,57,64,68,101,110, 69,58,254,89,63,50,72,93,56,41,63,52,75,94,53,38, 1,11,106,85,84,94,79,102,108,79,83,92,76,102,109,67, 54,86,63,81,103,68,57,87,62,0,0,1,255,254,0,0, 1,222,2,25,0,56,0,0,55,34,39,38,53,52,55,38, 39,38,53,52,55,54,51,50,23,22,21,20,7,39,55,54, 53,52,39,38,35,34,7,6,21,20,31,1,54,55,54,55, 54,55,23,6,21,20,23,22,51,50,55,53,51,17,35,53, 6,195,69,33,16,7,70,13,3,77,64,84,119,75,61,29, 45,11,11,57,57,91,72,55,49,27,31,29,31,9,14,6, 6,23,96,39,17,20,58,33,45,45,37,30,59,30,36,17, 21,27,68,13,14,100,66,56,83,68,95,72,41,18,21,31, 38,84,61,61,59,51,65,35,27,20,29,10,3,4,1,3, 46,20,68,42,21,10,65,128,254,241,67,37,0,2,0,1, 0,0,1,217,2,25,0,26,0,56,0,0,19,50,23,53, 51,17,35,53,6,7,6,35,34,39,38,53,52,55,52,55, 38,39,38,53,52,55,54,3,20,23,22,51,50,55,54,55, 53,52,39,38,35,34,7,6,21,20,31,1,54,51,50,51, 23,35,6,7,6,232,111,85,45,47,22,17,53,68,84,55, 51,5,6,69,13,4,88,62,26,58,35,42,61,55,43,9, 68,55,71,84,55,49,36,37,17,34,4,3,34,19,37,20, 10,2,25,89,82,253,238,76,25,12,37,48,44,57,22,18, 5,11,25,61,19,23,104,58,40,254,131,58,34,20,46,34, 32,215,37,47,37,50,46,63,53,24,13,20,34,8,34,15, 0,3,255,253,0,0,2,115,2,25,0,39,0,55,0,83, 0,0,19,50,23,53,51,21,54,55,54,51,50,23,22,21, 20,7,6,35,34,39,17,35,53,6,7,6,35,34,39,38, 53,52,55,38,39,38,53,52,55,54,5,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,1,20,23,22,51,50, 55,54,55,53,52,39,38,35,34,7,6,21,20,31,1,54, 51,23,35,6,7,6,227,111,85,46,2,35,13,12,50,29, 17,42,25,29,45,17,48,59,78,10,12,84,55,51,12,70, 13,4,86,62,1,129,33,13,5,31,10,12,31,15,6,17, 15,254,81,58,35,42,61,55,45,6,68,55,70,84,55,50, 36,37,20,40,33,19,16,21,30,2,25,89,82,40,25,12, 5,50,28,32,53,34,20,42,254,155,76,67,6,1,48,44, 57,25,31,23,63,19,23,102,58,42,48,38,13,15,44,16, 5,37,14,14,27,19,20,254,179,58,34,20,46,38,28,215, 37,47,37,50,45,64,53,24,13,20,34,4,14,23,0,2, 255,248,0,0,2,38,2,25,0,37,0,66,0,0,1,50, 23,53,51,17,35,53,6,7,6,35,34,39,38,53,52,55, 7,22,31,1,20,7,34,39,38,53,52,55,54,63,1,38, 53,52,55,54,3,20,23,22,51,50,55,54,55,53,52,39, 38,35,34,7,6,21,20,31,1,54,59,1,23,35,6,7, 6,1,52,107,89,46,48,22,17,53,68,84,55,51,4,92, 14,1,3,40,36,11,3,36,2,3,102,58,88,62,26,58, 35,42,61,55,43,9,68,55,71,85,51,52,36,37,26,17, 16,33,19,37,20,10,2,25,89,82,253,238,76,25,12,37, 48,44,57,20,7,56,16,6,13,39,7,31,8,9,43,24, 1,2,60,30,86,104,58,40,254,131,58,34,20,46,34,32, 215,37,47,37,48,46,65,53,24,13,20,34,8,34,15,0, 0,2,0,1,255,252,1,249,2,25,0,43,0,59,0,0, 19,34,7,6,21,20,31,1,54,51,50,23,22,21,20,7, 6,35,34,39,38,61,1,55,38,53,52,55,54,51,50,23, 22,21,20,7,23,35,39,54,53,52,39,38,3,50,55,54, 53,52,39,38,35,34,7,6,21,20,23,22,236,83,56,45, 26,32,38,52,65,40,26,57,33,41,64,40,27,13,81,81, 68,88,104,73,85,68,73,56,76,78,94,51,106,43,22,11, 40,16,20,45,22,10,37,19,1,234,63,51,64,40,26,21, 35,55,35,42,71,39,22,54,35,43,16,38,48,81,102,67, 57,63,73,135,70,87,113,118,86,69,134,57,30,254,63,43, 20,24,50,23,9,42,19,21,49,25,13,0,0,1,0,1, 255,255,2,52,2,20,0,66,0,0,5,35,39,54,55,54, 53,52,39,38,35,34,21,20,31,1,55,54,51,50,31,1, 54,55,50,23,22,23,21,35,53,38,35,34,7,21,35,53, 38,39,38,39,38,35,34,7,21,35,53,34,39,38,39,38, 53,52,55,54,51,50,23,22,21,20,7,6,7,2,52,55, 73,18,22,17,57,63,102,220,29,30,12,22,41,23,23,19, 40,23,56,26,7,8,51,12,28,27,12,51,9,9,2,3, 10,13,23,19,48,30,35,14,6,7,106,67,92,138,76,64, 20,18,13,1,115,13,47,40,37,90,66,74,185,33,32,26, 18,19,12,15,24,3,41,12,30,159,163,32,30,165,167,13, 5,1,2,5,30,163,156,59,22,19,20,28,129,61,38,96, 82,111,39,45,43,6,0,1,255,251,0,0,1,246,2,25, 0,64,0,0,19,34,7,6,21,20,23,22,23,54,55,54, 51,50,31,1,54,55,50,23,22,23,21,35,53,52,39,38, 35,34,15,1,21,35,53,38,47,1,38,35,34,15,1,21, 35,53,38,53,52,55,54,51,50,23,22,21,20,15,1,39, 54,53,52,39,38,238,102,54,36,33,7,7,10,39,17,17, 26,21,19,37,27,56,26,8,7,51,23,9,9,17,14,9, 51,9,8,5,12,12,16,15,10,49,89,91,63,90,106,79, 78,19,5,46,23,63,62,1,234,79,54,73,47,36,8,4, 29,16,8,12,15,26,1,41,12,30,159,163,18,10,4,15, 15,165,167,14,4,3,5,15,15,163,134,59,100,130,67,47, 71,70,105,44,48,10,18,50,31,80,61,61,0,2,255,253, 255,240,1,234,2,27,0,56,0,72,0,0,33,35,17,38, 35,34,7,6,21,20,31,1,7,47,1,34,15,1,20,23, 22,51,54,51,50,23,22,21,20,7,6,35,34,39,38,53, 63,1,38,53,52,55,54,59,1,23,52,55,54,51,50,23, 22,31,1,53,51,3,52,39,38,35,34,7,6,21,20,23, 22,51,50,55,54,1,234,45,81,101,43,21,9,42,65,22, 130,15,66,12,2,36,18,19,41,56,66,39,25,56,33,41, 70,39,24,1,9,100,79,21,26,8,4,52,33,44,77,71, 2,2,29,45,192,39,18,22,46,24,11,39,19,23,46,23, 10,1,115,119,34,15,18,38,18,33,37,58,1,51,19,41, 24,11,38,56,35,42,70,38,23,55,34,41,31,27,29,82, 88,22,6,1,75,41,25,63,2,2,28,86,254,97,48,25, 13,43,20,23,49,26,13,45,20,0,0,4,255,253,255,253, 1,213,2,25,0,24,0,32,0,44,0,57,0,0,19,50, 23,53,51,17,35,53,6,7,6,35,34,39,38,53,52,55, 54,55,38,53,52,55,54,1,53,52,39,38,35,34,7,23, 39,6,7,6,21,20,23,22,51,50,55,7,20,23,22,51, 50,63,1,39,7,6,7,6,227,111,85,46,46,32,21,70, 79,78,48,33,19,2,1,87,79,66,1,25,71,55,67,55, 31,95,135,22,7,29,36,18,18,14,15,38,62,28,33,78, 61,45,145,115,35,8,4,2,25,89,82,253,238,83,30,13, 43,52,35,46,33,36,3,2,33,78,100,67,55,254,162,184, 37,47,37,23,157,134,26,10,47,51,37,24,12,9,126,49, 21,10,48,51,140,76,22,27,14,0,0,2,255,254,0,0, 1,178,2,23,0,17,0,34,0,0,33,35,37,55,38,39, 38,53,52,55,54,51,50,23,22,23,53,51,3,17,38,35, 34,7,6,21,20,23,22,51,50,63,1,23,7,1,178,47, 254,150,110,129,7,1,74,64,84,78,52,14,23,47,47,54, 110,75,52,51,55,32,35,25,17,83,31,201,101,88,31,96, 7,7,100,56,49,44,12,33,84,254,26,1,57,131,48,50, 55,53,32,19,17,58,33,151,0,1,0,1,255,244,1,192, 2,25,0,64,0,0,19,34,7,6,21,20,31,1,54,55, 54,55,23,6,7,20,23,22,59,1,50,55,53,51,21,35, 53,6,35,34,35,7,5,7,37,55,38,39,38,39,38,61, 1,38,53,38,39,38,53,52,55,54,51,50,23,22,21,20, 7,39,54,53,52,39,38,211,83,46,30,22,25,6,18,20, 16,30,48,5,62,3,4,4,43,28,44,43,37,48,4,5, 71,1,17,19,254,158,120,33,10,1,2,3,2,27,15,42, 78,58,74,106,69,62,18,44,13,70,50,1,234,57,38,51, 29,19,15,10,25,18,10,33,45,35,55,8,1,39,112,234, 64,27,52,43,38,53,95,27,20,4,3,8,10,20,6,1, 11,10,32,58,91,57,43,70,64,88,28,70,22,52,24,86, 52,37,0,1,0,20,0,4,0,65,2,7,0,3,0,0, 55,35,3,51,64,43,1,45,4,2,3,0,0,1,254,38, 2,65,255,185,2,174,0,17,0,0,3,7,38,39,38,35, 34,7,6,7,39,54,55,54,51,50,23,22,71,32,61,80, 15,18,78,58,12,16,33,76,86,16,17,101,66,19,2,96, 31,55,7,1,42,8,13,34,66,8,1,45,13,0,0,1, 255,221,0,0,0,128,2,27,0,5,0,0,51,35,17,7, 39,55,128,46,93,24,163,1,204,62,34,107,0,2,254,223, 254,53,0,134,255,35,0,30,0,42,0,0,19,6,7,6, 35,34,39,38,39,7,6,35,34,39,38,53,52,55,54,51, 50,23,53,51,21,22,23,50,55,54,55,7,38,39,38,35, 34,7,6,21,20,51,50,134,7,39,27,22,41,60,6,2, 15,42,59,64,27,12,44,25,28,33,51,43,70,27,24,25, 18,4,209,28,40,7,7,30,16,7,58,51,254,163,26,26, 18,37,4,1,25,57,49,21,27,50,30,16,30,75,105,45, 2,25,18,9,27,28,8,2,30,12,13,49,0,1,255,44, 254,61,0,207,255,22,0,37,0,0,3,52,55,54,51,53, 51,21,39,34,15,1,21,20,23,22,51,50,55,54,53,22, 51,50,63,1,23,6,35,34,39,6,7,6,35,34,39,38, 212,48,26,33,43,42,37,16,7,38,13,14,52,40,30,18, 65,27,25,20,29,45,59,38,31,10,45,40,35,64,34,18, 254,163,51,27,14,23,60,3,34,22,7,33,15,5,52,39, 19,58,19,19,23,60,28,27,28,24,46,25,0,1,254,76, 255,0,255,56,255,226,0,33,0,0,5,20,23,22,51,54, 55,52,47,1,34,7,63,1,50,31,1,21,20,7,6,35, 34,39,38,53,52,55,54,55,23,34,7,6,254,118,41,16, 19,74,5,33,15,11,30,20,28,55,19,6,77,18,22,67, 34,18,42,31,15,37,5,38,40,157,37,17,7,5,35,28, 7,2,7,39,2,39,21,8,63,14,4,45,24,30,35,50, 35,7,17,41,46,0,0,2,255,250,255,247,1,82,2,25, 0,28,0,42,0,0,37,20,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,23,7,38,35,34,7,6,21,55,51, 50,23,22,7,52,39,38,35,15,1,22,23,22,51,50,55, 54,1,82,48,35,45,108,61,47,80,52,77,70,38,8,18, 39,31,64,69,43,47,62,1,96,67,68,49,61,61,63,31, 29,21,129,7,7,49,22,10,131,63,44,33,103,78,102,146, 71,46,47,10,38,25,75,54,62,64,5,56,55,68,54,39, 40,1,3,218,10,1,52,22,0,2,0,1,255,199,1,244, 2,25,0,72,0,88,0,0,19,50,23,22,21,20,7,22, 23,20,7,22,23,20,7,6,35,23,35,39,22,51,50,55, 54,53,52,39,54,55,54,53,52,39,38,39,34,7,55,54, 53,52,39,38,35,34,7,6,21,20,31,1,54,51,50,23, 22,21,20,7,6,35,34,39,38,61,1,55,38,53,52,55, 54,19,50,55,54,53,52,39,38,35,34,7,6,21,20,23, 22,238,108,70,61,12,33,2,30,26,4,35,13,16,53,52, 88,31,35,33,10,2,57,51,5,1,28,6,6,22,6,17, 17,73,53,66,76,52,54,26,32,38,52,65,40,26,57,33, 41,64,40,27,13,81,81,68,50,43,22,11,40,16,20,45, 22,10,37,19,2,25,71,61,88,14,18,21,42,42,21,24, 37,49,19,7,80,132,17,27,6,6,35,27,13,42,4,5, 22,12,2,1,5,19,23,20,84,52,37,55,55,68,40,26, 21,35,55,35,42,71,39,22,54,35,43,16,38,48,81,102, 67,57,254,16,43,20,24,50,23,9,42,19,21,49,25,13, 0,2,0,18,255,251,1,181,2,25,0,15,0,31,0,0, 1,20,7,6,35,34,39,38,53,52,55,54,51,50,23,22, 7,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54, 1,181,62,62,88,85,62,60,60,62,85,86,63,63,34,53, 54,72,69,51,52,50,49,73,73,53,53,1,14,115,80,80, 81,80,114,112,78,77,77,78,112,91,65,65,63,64,94,95, 67,68,68,67,0,2,0,25,255,236,1,101,2,47,0,30, 0,46,0,0,19,52,55,54,51,50,23,22,21,20,7,6, 35,34,39,22,23,22,23,22,23,7,38,39,38,39,38,39, 38,39,38,37,52,39,38,35,34,7,6,21,20,23,22,51, 50,55,54,25,72,42,55,80,49,34,60,41,55,60,49,6, 40,53,93,17,24,34,63,60,18,9,71,32,1,1,11,1, 22,52,27,32,63,32,18,50,29,34,59,34,18,1,127,101, 48,27,60,41,54,84,50,35,44,38,60,80,60,12,14,35, 35,54,17,12,83,114,3,3,44,53,63,32,17,51,27,34, 59,34,20,51,28,0,0,2,0,24,255,236,1,105,2,47, 0,31,0,47,0,0,1,20,7,6,7,6,7,6,7,6, 7,39,54,55,54,55,54,55,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,7,52,39,38,35,34,7,6,21,20, 23,22,51,50,55,54,1,105,91,12,12,27,77,3,2,17, 24,27,18,72,72,45,13,7,27,36,37,85,51,36,69,45, 56,100,44,23,47,53,30,37,68,35,20,53,32,38,61,36, 23,1,127,138,119,15,13,33,54,2,2,12,15,40,7,50, 59,85,24,22,14,14,63,44,58,79,46,30,78,42,41,65, 36,21,55,30,37,62,37,23,52,32,0,1,255,244,0,0, 2,7,2,47,0,52,0,0,33,35,17,52,39,38,35,34, 7,6,21,17,35,17,38,39,38,35,34,7,6,21,20,51, 50,55,52,39,55,22,21,20,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,23,54,51,50,23,22,23,2,7,46, 44,25,29,45,30,16,45,11,9,31,44,59,33,20,48,37, 5,37,10,70,37,18,21,84,15,2,67,39,54,63,45,2, 2,46,67,84,39,11,12,1,183,40,24,14,33,19,21,254, 68,1,188,21,12,34,69,40,45,118,37,22,19,40,25,53, 49,24,12,114,19,22,119,55,32,47,2,2,55,61,17,45, 0,2,0,0,255,247,1,250,2,51,0,34,0,50,0,0, 1,6,7,6,7,22,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,63,1,38,39,38,39,55,22,23,54,55,54, 55,54,55,3,52,39,38,39,6,7,6,21,20,23,22,51, 50,55,54,1,250,45,109,18,26,19,41,56,47,47,69,87, 47,31,58,11,11,34,129,63,10,8,52,77,130,91,67,4, 5,12,9,73,101,7,7,17,39,56,52,27,33,67,32,16, 2,28,94,83,15,18,3,47,62,62,76,44,45,67,43,57, 66,60,11,9,26,85,93,13,14,25,141,65,44,104,7,7, 19,28,254,107,69,71,5,5,10,35,56,55,65,32,17,56, 29,0,0,3,255,249,0,0,2,12,2,45,0,47,0,59, 0,71,0,0,37,7,38,47,2,23,22,21,20,7,6,35, 34,39,38,53,52,55,54,55,38,39,38,39,55,22,23,39, 38,53,52,55,54,51,50,23,22,21,20,7,6,7,22,23, 22,23,22,39,52,39,38,35,34,7,6,21,20,23,54,7, 52,39,6,21,20,23,22,51,50,55,54,2,12,27,49,26, 49,33,26,12,61,34,43,78,39,23,45,14,31,87,83,11, 16,35,66,100,19,19,58,37,46,72,40,24,48,11,38,96, 43,11,11,25,138,49,18,21,52,26,13,62,117,51,67,117, 45,20,24,74,17,4,162,34,51,16,28,16,46,30,25,78, 38,22,60,34,44,50,48,14,21,27,74,11,15,32,85,33, 30,37,38,72,42,26,58,36,44,61,44,11,20,34,35,9, 11,24,254,60,22,7,46,23,26,72,46,36,192,65,52,52, 69,56,25,12,64,15,0,1,0,0,255,255,1,222,2,56, 0,57,0,0,1,20,7,6,7,6,35,53,50,55,54,55, 54,53,52,39,38,35,34,7,6,21,20,31,1,22,31,2, 20,7,6,35,34,39,38,39,55,23,22,51,50,55,54,53, 52,39,38,39,38,53,52,55,54,51,50,23,22,1,222,184, 74,120,57,43,143,127,127,28,6,54,40,47,56,27,13,27, 54,31,3,1,1,56,32,36,58,47,32,6,39,26,35,41, 43,25,12,23,55,11,33,66,36,44,99,54,36,1,119,173, 117,46,26,13,49,78,79,111,26,26,69,48,35,36,16,21, 21,15,27,23,31,13,12,53,31,17,41,28,17,27,32,32, 30,14,17,20,14,27,8,25,37,67,35,20,75,50,0,2, 0,48,255,248,1,229,2,53,0,49,0,64,0,0,19,52, 55,54,51,50,23,22,21,20,7,6,7,6,15,1,53,50, 55,54,55,54,55,54,53,52,39,38,35,34,7,6,21,20, 31,1,55,54,51,50,23,22,21,20,7,6,35,34,39,38, 23,52,47,1,34,15,1,21,20,23,22,51,50,55,54,48, 70,63,81,102,67,54,134,25,32,60,101,85,16,67,90,47, 107,36,24,67,46,61,73,49,44,21,2,7,24,63,60,27, 12,46,24,29,78,50,36,215,31,18,35,14,5,30,12,12, 35,11,3,1,105,84,63,57,80,65,86,138,92,17,18,36, 25,16,46,19,25,27,58,66,46,58,94,53,35,52,47,59, 29,34,4,28,61,48,22,27,52,29,16,66,48,18,38,12, 3,29,18,3,31,15,6,31,9,0,0,1,0,56,0,0, 1,166,2,53,0,5,0,0,1,33,17,35,17,33,1,166, 254,192,46,1,110,2,11,253,245,2,53,0,0,1,0,47, 255,248,1,123,2,56,0,22,0,0,1,39,7,6,21,20, 23,22,51,7,34,39,38,39,38,53,52,55,54,55,23,53, 51,1,123,198,61,28,157,47,8,48,7,47,102,37,16,102, 14,28,143,45,1,61,197,80,57,69,144,114,33,25,38,83, 111,47,47,148,74,10,18,144,141,0,0,2,0,83,2,16, 1,128,3,62,0,15,0,32,0,0,19,50,55,54,53,52, 39,38,35,34,7,6,21,20,23,22,55,50,31,1,22,21, 20,7,6,35,34,39,38,53,52,55,54,234,55,25,12,47, 20,25,58,25,11,52,19,23,68,47,18,17,57,43,50,69, 47,35,57,43,2,70,48,22,26,61,26,11,50,22,26,66, 22,8,248,58,27,33,34,69,46,35,58,42,50,69,48,35, 0,6,0,16,255,254,3,84,2,218,0,16,0,32,0,47, 0,62,0,79,0,95,0,0,1,20,23,22,51,50,55,54, 53,52,39,38,35,34,15,1,6,1,20,23,22,51,50,55, 54,53,52,39,38,35,34,7,6,5,34,39,38,53,52,55, 54,51,50,22,21,20,7,6,1,50,23,22,21,20,7,6, 35,34,39,38,53,52,54,19,52,55,54,51,50,31,1,22, 21,20,7,6,35,34,39,38,1,52,39,38,35,34,7,6, 21,20,23,22,51,50,55,54,1,84,54,18,22,56,25,11, 26,24,42,60,24,8,2,254,247,54,18,21,60,22,8,47, 19,24,65,21,7,2,112,68,47,35,45,46,59,61,92,48, 46,253,178,60,44,46,46,45,59,60,46,46,92,175,57,42, 52,68,47,18,17,46,45,59,59,46,46,1,253,47,21,25, 61,22,9,50,19,23,58,25,10,2,66,68,21,7,49,21, 26,43,27,28,51,27,10,254,73,68,21,7,53,20,23,63, 24,10,56,19,173,56,42,52,61,45,47,92,61,58,46,46, 1,47,47,45,61,59,45,46,46,45,59,61,92,1,21,71, 47,34,58,26,33,35,59,45,46,46,45,254,142,60,26,11, 52,20,25,64,23,9,49,21,0,3,0,12,255,96,3,193, 1,226,0,13,0,22,0,71,0,0,1,34,21,20,23,22, 51,50,55,54,53,52,39,38,19,33,22,23,22,51,50,55, 54,1,52,55,54,51,50,23,22,21,20,7,51,17,51,17, 35,53,35,6,7,6,35,34,39,38,53,52,51,33,54,53, 52,47,1,38,35,34,7,22,23,22,21,6,7,6,35,34, 39,38,1,219,60,35,11,12,39,14,5,34,10,194,253,159, 23,107,77,84,174,104,23,254,205,80,53,67,109,68,53,14, 135,53,53,160,60,135,87,97,110,111,136,78,2,109,16,59, 25,42,49,23,27,50,23,11,7,62,20,24,81,28,7,1, 123,66,42,15,4,38,12,14,44,15,4,254,203,71,43,30, 97,22,1,23,81,46,31,89,70,94,50,48,1,84,253,137, 230,110,54,35,50,61,100,49,45,58,83,62,21,31,9,10, 53,25,27,79,24,7,81,18,0,3,0,8,254,244,4,115, 1,226,0,13,0,22,0,100,0,0,1,20,23,22,51,50, 55,54,53,52,35,34,7,6,5,33,22,23,22,51,50,55, 54,19,34,39,38,53,52,59,1,21,35,22,51,50,53,52, 47,1,38,35,34,7,21,35,53,35,6,7,6,35,34,39, 38,53,52,51,33,54,53,52,47,1,38,35,34,7,22,23, 22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,23, 22,21,20,7,51,17,51,17,54,51,50,23,22,21,20,1, 152,32,15,12,38,15,5,54,32,21,10,1,13,253,159,23, 107,77,84,172,102,26,191,198,50,14,60,194,205,10,195,248, 43,23,7,8,27,25,55,158,60,135,87,97,110,111,136,78, 2,109,16,59,25,42,49,23,27,57,18,7,51,27,35,71, 29,13,70,59,70,109,68,53,14,133,55,30,33,68,34,17, 1,51,25,20,10,38,12,15,62,36,19,254,71,43,30,93, 24,254,201,63,17,22,55,55,55,147,49,21,8,1,13,152, 230,110,54,35,50,61,100,49,45,58,83,62,21,31,9,13, 53,18,21,67,34,19,64,28,35,75,45,38,89,70,94,50, 48,1,84,254,82,15,60,31,39,194,0,5,255,176,254,239, 3,91,2,220,0,15,0,90,0,100,0,113,0,126,0,0, 1,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54, 1,54,55,54,55,54,55,38,53,52,55,54,51,50,23,22, 21,17,35,17,52,39,38,35,34,7,6,21,20,23,54,55, 54,51,50,23,54,53,52,39,38,35,22,21,20,7,6,35, 34,39,38,53,52,55,54,51,50,23,22,21,20,7,22,21, 20,7,6,35,34,39,6,35,34,39,38,1,38,35,34,7, 22,23,54,55,54,31,1,6,7,6,7,22,51,50,55,54, 53,52,5,6,7,6,7,23,22,23,22,51,50,55,38,1, 142,34,18,20,49,21,8,47,13,15,50,19,6,254,35,1, 40,11,29,14,63,67,131,127,185,252,98,54,48,150,83,119, 168,109,108,56,82,60,86,66,78,57,27,55,50,83,51,57, 30,36,56,38,39,83,52,65,120,71,57,34,106,74,53,66, 108,104,137,116,71,39,24,2,96,48,61,143,119,60,91,108, 90,12,59,2,91,109,9,9,76,76,72,30,38,253,221,41, 45,39,1,1,2,42,14,16,82,118,86,1,105,39,29,16, 47,19,22,48,14,4,40,13,254,30,56,42,12,26,13,45, 118,139,184,119,116,158,86,127,254,149,1,107,199,80,44,104, 104,169,123,102,44,18,24,22,54,54,73,71,65,47,62,70, 33,17,42,40,51,84,44,28,95,75,105,63,63,65,131,84, 50,36,62,91,57,34,1,25,14,76,88,63,58,123,16,6, 1,125,84,7,6,38,26,33,57,98,20,25,43,38,43,21, 42,15,5,76,65,0,0,3,0,16,255,254,2,133,1,226, 0,15,0,31,0,41,0,0,19,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,33,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,3,35,17,35,17,35,17,33, 21,35,197,30,13,4,29,8,10,32,11,4,31,7,1,68, 30,13,4,29,8,10,32,11,4,31,7,112,61,254,60,2, 117,254,1,8,29,9,10,32,12,4,30,8,10,35,11,2, 29,9,10,32,12,4,30,8,10,35,11,2,254,246,1,168, 254,88,1,228,60,0,0,2,0,12,255,254,3,19,1,226, 0,48,0,60,0,0,23,34,53,52,55,54,59,1,50,55, 54,53,52,39,38,35,34,7,50,23,22,21,20,7,6,35, 34,39,38,53,52,55,54,51,50,23,22,21,20,7,6,43, 1,34,21,20,51,33,21,1,34,7,6,21,20,51,50,55, 54,53,52,127,115,57,21,25,127,52,48,39,75,34,44,54, 41,53,18,7,53,19,24,64,27,12,73,61,84,100,60,46, 67,61,78,115,54,54,2,160,253,96,38,12,3,47,35,13, 4,2,84,57,21,8,42,34,39,92,36,17,26,54,19,22, 61,22,8,49,21,27,89,43,37,69,53,71,75,52,49,31, 29,55,1,107,35,10,11,47,33,11,11,48,0,4,0,6, 255,254,4,156,1,226,0,45,0,94,0,106,0,116,0,0, 1,54,55,54,59,1,21,35,17,35,17,35,6,29,1,35, 53,52,39,38,35,34,7,6,21,54,51,50,23,22,21,20, 7,6,7,34,39,38,53,52,55,54,51,50,23,22,1,21, 33,34,53,52,55,54,59,1,50,55,54,53,52,39,38,35, 34,7,50,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,51,50,23,22,21,20,7,6,43,1,34,21,20,51,39, 50,55,54,53,52,35,34,7,6,21,20,5,20,23,22,51, 50,53,52,35,34,3,54,32,50,17,17,242,145,55,37,89, 55,59,30,38,33,40,46,29,28,63,31,17,57,32,27,53, 37,25,49,53,80,92,45,8,1,107,251,221,115,57,21,25, 127,58,46,35,75,34,44,54,41,53,18,7,53,19,24,64, 27,12,73,61,85,95,61,49,74,60,71,116,54,54,5,36, 12,3,46,38,12,3,1,239,39,9,10,51,59,50,1,133, 56,19,7,55,254,215,1,41,8,101,188,188,68,31,16,29, 34,45,15,49,25,32,68,29,11,2,60,42,43,84,64,71, 65,11,254,164,55,84,57,21,8,43,33,39,92,36,17,26, 54,19,22,61,22,8,49,21,27,89,43,37,68,53,72,79, 54,43,31,29,205,35,9,11,48,34,10,11,48,29,40,10, 3,47,56,0,0,2,0,14,255,254,2,203,1,221,0,28, 0,44,0,0,1,33,21,35,17,35,17,35,34,7,6,21, 54,51,50,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,19,52,39,38,35,34,7,6,21,20,23,22,51,50,55, 54,1,12,1,191,180,60,207,89,59,46,44,95,93,39,20, 50,43,51,102,60,45,85,71,141,39,26,25,51,33,20,50, 20,24,66,24,10,1,221,61,254,94,1,162,65,51,66,65, 67,34,44,69,47,40,84,64,83,114,72,62,254,178,39,35, 23,43,25,29,55,23,9,46,18,0,0,2,0,14,255,61, 2,203,1,221,0,30,0,46,0,0,37,7,35,55,17,35, 34,7,6,21,54,51,50,23,22,21,20,7,6,35,34,39, 38,53,52,55,54,51,33,21,35,3,52,39,38,35,34,7, 6,21,20,23,22,51,50,55,54,2,23,140,67,147,207,89, 59,46,44,95,93,39,20,50,43,51,102,60,45,85,71,98, 1,191,180,224,39,26,25,51,33,20,50,20,24,66,24,10, 4,199,211,1,144,65,51,66,65,67,34,44,69,47,40,84, 64,83,114,72,62,61,254,239,39,35,23,43,25,29,55,23, 9,46,18,0,0,2,0,12,254,244,3,25,1,221,0,105, 0,121,0,0,37,52,39,38,35,34,7,6,29,1,35,53, 52,39,38,35,34,15,1,6,7,54,51,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,51,50,23,54,51,50, 23,22,21,20,7,6,35,33,34,7,6,21,20,23,22,51, 50,55,54,61,1,51,21,20,23,22,51,50,55,54,53,52, 47,1,52,55,54,51,22,21,20,7,6,35,34,39,38,39, 6,35,34,39,38,53,52,55,54,51,33,50,55,54,37,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,2,226, 51,41,54,74,40,25,55,60,45,57,67,41,15,2,2,25, 24,74,38,21,62,36,43,64,40,34,81,61,82,143,51,51, 111,96,59,46,84,53,76,254,168,95,42,21,60,37,42,76, 57,48,55,57,38,44,65,40,26,22,2,31,7,7,43,76, 53,66,94,56,15,9,56,141,115,55,33,103,53,68,1,82, 82,46,30,253,180,56,14,4,47,16,19,49,16,4,42,16, 240,78,58,46,66,41,51,151,145,78,52,40,41,19,3,4, 9,62,35,44,69,37,21,57,46,53,109,63,47,98,98,85, 66,86,132,64,40,48,24,32,58,34,21,52,43,55,18,41, 61,40,26,47,29,37,33,28,12,22,7,2,53,56,81,48, 34,61,16,19,93,68,40,57,97,41,21,73,47,134,48,13, 14,58,19,7,45,13,16,55,22,8,0,2,0,12,254,239, 2,244,1,226,0,97,0,113,0,0,1,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,6,21,20,23,22,59,1, 21,35,34,7,6,7,6,35,34,39,38,53,52,55,54,51, 50,23,22,21,35,38,35,34,7,6,21,20,51,50,55,54, 55,34,39,38,53,52,55,54,51,50,23,6,21,20,23,22, 51,50,55,54,53,52,39,38,35,34,7,6,7,54,51,50, 23,22,21,20,7,6,35,34,53,52,55,54,3,34,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,1,125,250,86, 39,60,40,56,79,32,14,9,49,50,32,40,66,66,33,29, 46,15,47,78,124,28,7,59,21,25,59,29,14,60,19,23, 27,12,5,92,67,33,49,21,53,30,17,45,43,63,30,26, 42,41,12,14,73,10,1,167,59,76,143,90,69,7,48,40, 78,29,12,50,32,39,152,123,103,74,48,22,10,42,15,16, 49,18,6,34,15,1,226,136,62,87,99,56,38,55,24,31, 24,30,31,58,66,39,25,54,44,68,12,44,85,21,26,67, 23,8,39,18,23,25,27,10,11,75,52,76,13,71,42,45, 63,51,52,21,53,43,49,15,4,104,13,15,171,49,17,69, 52,78,21,65,26,34,62,39,26,199,141,78,66,254,221,34, 15,17,44,16,6,38,13,15,36,21,9,0,0,3,0,12, 254,239,2,244,1,226,0,15,0,27,0,119,0,0,55,50, 55,54,53,52,39,38,35,34,7,6,21,20,23,22,19,50, 55,54,53,52,39,38,35,34,7,20,19,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,6,21,20,23,22,59,1, 21,35,34,7,6,7,6,35,34,53,52,55,54,51,50,23, 22,21,20,15,1,54,55,54,55,54,55,34,39,38,53,52, 55,54,51,50,23,6,21,20,23,22,51,50,55,54,53,52, 39,38,35,34,7,6,7,54,51,50,23,22,21,20,7,6, 35,34,53,52,55,54,150,59,16,5,41,15,16,51,18,5, 34,15,114,59,7,1,33,7,8,49,6,170,250,86,39,60, 40,56,79,32,14,9,49,50,32,40,66,66,33,29,46,15, 47,78,159,53,30,33,64,28,13,35,8,46,27,1,1,49, 21,53,30,17,45,43,63,30,26,42,41,12,14,73,10,1, 167,59,76,143,90,69,7,48,40,78,29,12,50,32,39,152, 123,103,59,41,12,13,42,16,6,38,12,14,36,21,9,254, 243,60,7,8,25,8,2,46,46,2,162,136,62,87,99,56, 38,55,24,31,24,30,31,58,66,39,25,54,44,68,12,44, 132,49,30,17,47,21,27,52,23,5,9,38,2,2,76,13, 71,42,45,63,51,52,21,53,43,49,15,4,104,13,15,171, 49,17,69,52,78,21,65,26,34,62,39,26,199,141,78,66, 0,4,0,12,254,239,5,200,1,226,0,45,0,55,0,153, 0,169,0,0,37,54,55,54,59,1,21,35,17,35,17,35, 6,21,17,35,17,52,39,38,35,34,7,6,21,54,51,50, 23,22,21,20,7,6,7,34,39,38,53,52,55,54,51,50, 23,22,5,20,23,22,51,50,53,52,35,34,1,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,6,21,20,23,22, 59,1,21,35,34,7,6,7,6,35,34,39,38,53,52,55, 54,51,50,23,22,21,35,38,35,34,7,6,21,20,51,50, 55,54,55,34,39,38,53,52,55,54,51,50,23,6,21,20, 23,22,51,50,55,54,53,52,39,38,35,34,7,6,7,54, 51,50,23,22,21,20,7,6,35,34,53,52,55,54,3,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,4,98, 32,50,17,17,242,145,55,37,89,55,59,30,38,33,40,46, 29,28,63,31,17,57,32,27,53,37,25,49,53,80,92,45, 8,254,246,39,9,10,51,59,50,254,42,250,86,39,60,40, 56,79,32,14,9,49,50,32,40,66,66,33,29,46,15,47, 78,124,28,7,59,21,25,59,29,14,60,19,23,27,12,5, 92,67,33,49,21,53,30,17,45,43,63,30,26,42,41,12, 14,73,10,1,167,59,76,143,90,69,7,48,40,78,29,12, 50,32,39,152,123,103,74,48,22,10,42,15,16,49,18,6, 34,15,170,56,19,7,55,254,115,1,141,8,101,254,224,1, 32,68,31,16,29,34,45,15,49,25,32,68,29,11,2,60, 42,43,84,64,71,65,11,172,40,10,3,47,56,1,166,136, 62,87,99,56,38,55,24,31,24,30,31,58,66,39,25,54, 44,68,12,44,85,21,26,67,23,8,39,18,23,25,27,10, 11,75,52,76,13,71,42,45,63,51,52,21,53,43,49,15, 4,104,13,15,171,49,17,69,52,78,21,65,26,34,62,39, 26,199,141,78,66,254,221,34,15,17,44,16,6,38,13,15, 36,21,9,0,0,3,0,16,255,254,2,121,1,226,0,3, 0,15,0,55,0,0,19,21,51,53,7,34,7,6,21,20, 23,22,51,50,61,1,7,34,39,38,53,52,55,54,59,1, 53,33,21,35,21,51,50,23,22,21,20,7,6,35,34,39, 53,22,51,50,55,54,53,52,43,1,21,20,7,6,180,162, 217,28,15,6,60,44,43,119,119,95,62,50,38,22,26,23, 1,174,159,110,64,38,25,62,39,48,32,36,29,35,67,23, 8,96,86,80,41,1,172,139,139,194,38,14,14,49,38,28, 115,66,236,63,50,69,55,34,20,193,54,139,61,39,46,69, 41,27,15,61,16,43,15,19,91,91,87,38,20,0,0,1, 0,14,255,254,2,179,1,226,0,35,0,0,19,33,21,35, 21,54,51,50,23,22,21,20,7,51,17,51,17,33,53,51, 54,55,54,53,38,39,38,35,34,7,21,35,17,35,17,35, 14,1,162,145,34,44,71,47,33,55,176,54,254,53,133,58, 20,6,1,47,20,23,44,27,55,164,54,1,226,54,133,28, 53,38,46,91,42,1,173,254,28,55,18,64,20,25,46,21, 10,34,92,1,41,254,82,0,0,3,0,16,255,254,2,115, 1,226,0,21,0,33,0,37,0,0,23,34,39,38,53,52, 55,54,59,1,53,33,21,35,21,51,21,35,21,20,7,6, 55,53,35,34,7,6,21,20,23,22,51,50,17,35,21,51, 223,95,62,50,39,21,26,23,1,174,159,231,231,80,41,67, 217,36,10,3,60,44,43,119,162,162,2,63,50,69,59,32, 18,193,54,139,55,91,87,38,20,170,66,43,11,12,49,38, 28,1,119,139,0,3,0,12,254,244,3,25,1,221,0,15, 0,31,0,128,0,0,5,20,23,22,51,50,55,54,53,52, 39,38,35,34,7,6,1,52,39,38,35,34,7,6,21,20, 23,22,51,50,55,54,7,34,39,38,53,52,55,54,51,50, 23,54,51,50,23,22,21,20,15,3,33,34,7,6,21,20, 23,22,51,50,63,1,54,51,50,23,22,21,20,15,1,6, 35,34,39,38,39,52,55,6,7,6,35,34,39,38,53,52, 55,54,51,33,50,55,54,53,52,39,38,35,34,7,6,29, 1,35,53,52,39,38,35,34,15,1,6,7,54,51,50,23, 22,21,20,7,6,2,84,45,10,11,50,19,7,40,14,16, 46,19,7,254,146,44,17,20,55,17,5,48,17,19,49,19, 6,80,94,32,12,81,61,82,143,51,51,111,96,59,46,104, 35,41,33,254,168,95,42,21,63,35,41,37,80,149,80,89, 73,39,23,57,28,21,21,61,33,16,1,14,19,198,76,59, 85,59,49,103,53,68,1,82,82,46,30,51,41,54,74,40, 25,55,60,45,57,67,41,15,2,2,25,24,74,38,21,62, 36,136,55,11,3,36,13,15,45,17,6,35,13,1,94,51, 20,8,45,13,16,51,19,6,40,14,110,83,32,41,109,63, 47,98,98,85,66,86,156,55,15,8,2,48,24,32,62,33, 18,51,96,52,57,33,42,63,34,13,6,55,28,33,34,26, 6,127,49,58,47,63,97,41,21,73,47,61,78,58,46,66, 41,51,151,145,78,52,40,41,19,3,4,9,62,35,44,69, 37,21,0,2,0,8,254,239,3,166,1,221,0,15,0,80, 0,0,37,20,23,22,51,50,55,54,53,52,39,38,35,34, 7,6,37,54,51,50,23,22,21,20,7,6,35,34,39,38, 53,52,63,1,50,21,6,21,20,23,22,51,50,55,54,53, 52,39,38,35,34,7,21,35,17,35,34,7,6,21,54,51, 50,23,22,21,20,7,6,35,34,39,38,53,52,55,54,51, 33,21,35,1,0,50,20,24,63,26,10,39,26,25,50,33, 20,1,162,40,56,98,43,23,145,122,175,193,142,149,78,11, 38,67,137,130,157,147,104,124,43,31,35,46,38,61,205,90, 59,46,50,90,93,39,19,56,39,50,101,60,46,76,76,104, 1,191,181,143,55,23,9,45,19,23,39,35,23,42,26,44, 33,88,47,61,164,88,74,119,126,190,198,97,2,25,109,163, 155,113,107,64,76,137,53,41,29,49,140,1,162,65,51,66, 65,68,33,44,75,48,33,83,64,84,105,72,71,61,0,1, 0,20,255,254,2,211,1,226,0,5,0,0,19,51,17,33, 21,33,20,54,2,137,253,65,1,226,254,83,55,0,0,4, 0,8,255,254,5,34,1,228,0,73,0,88,0,100,0,112, 0,0,1,50,23,54,55,54,51,33,21,35,17,35,17,35, 34,7,22,21,20,7,6,35,34,39,38,53,52,55,38,35, 34,7,22,21,20,15,1,6,35,34,39,38,53,52,55,38, 35,34,7,6,7,54,51,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,51,50,23,54,55,54,5,34,7,6, 15,1,20,23,22,51,50,53,52,39,38,5,20,23,22,51, 50,55,54,53,52,39,6,39,6,21,20,23,22,51,50,55, 54,53,52,2,168,116,65,60,64,8,7,1,58,156,60,98, 52,38,100,57,38,54,78,44,28,96,66,67,60,48,100,57, 23,32,38,76,44,29,94,53,62,137,74,39,10,42,48,82, 43,27,80,31,39,84,46,40,107,97,135,93,76,65,82,9, 254,18,44,34,18,2,2,48,23,29,95,43,24,2,46,39, 25,33,46,30,20,96,97,248,96,41,24,31,42,33,22,1, 226,41,35,5,1,54,254,82,1,174,18,82,137,98,56,39, 76,48,60,140,82,28,22,82,137,98,56,19,20,75,49,60, 144,78,24,71,37,50,27,64,39,51,99,33,13,66,55,72, 129,86,78,43,35,5,1,242,35,18,19,18,59,30,14,96, 48,31,18,49,72,44,28,63,41,40,121,65,79,79,75,111, 75,43,26,62,43,39,122,0,0,3,255,228,254,244,2,103, 1,226,0,57,0,61,0,73,0,0,23,34,39,38,53,52, 55,54,59,1,53,33,21,35,21,51,50,23,22,21,20,7, 6,7,6,43,1,34,7,6,21,20,23,22,49,35,52,39, 52,55,54,59,1,50,55,54,53,52,39,38,39,34,43,1, 21,20,7,6,3,51,53,35,23,35,34,7,6,21,20,23, 22,51,50,53,223,95,62,50,39,21,26,23,1,174,159,43, 96,49,31,113,37,46,25,27,242,66,18,16,1,1,52,3, 58,29,48,235,154,47,18,69,18,23,6,6,43,80,41,95, 162,162,162,217,36,10,3,63,39,45,119,2,63,50,69,59, 32,18,193,54,139,79,49,65,153,60,19,6,4,20,18,38, 11,12,23,1,49,90,24,12,97,36,47,104,31,9,2,91, 87,38,20,1,35,139,194,43,11,12,58,35,22,115,0,1, 255,232,254,244,2,4,1,226,0,43,0,0,19,33,21,35, 21,54,51,50,23,22,21,20,7,6,7,35,34,7,21,23, 35,39,55,54,55,54,59,1,50,55,54,53,52,39,38,35, 34,7,21,35,17,35,17,35,8,1,179,144,39,33,82,40, 23,87,60,70,170,94,3,1,54,2,2,10,79,19,24,182, 124,33,11,47,25,34,45,11,55,181,55,1,226,54,164,18, 87,51,62,129,61,36,2,82,11,29,46,42,73,12,3,102, 32,40,81,40,22,39,188,1,174,254,82,0,0,3,0,8, 255,254,3,209,1,231,0,51,0,63,0,78,0,0,1,22, 21,20,15,1,6,35,34,39,38,53,52,55,38,35,34,7, 6,7,54,51,50,23,22,21,20,7,6,35,34,39,38,53, 52,55,54,51,50,23,54,55,54,51,33,21,35,17,35,17, 35,34,7,6,21,20,23,22,51,50,55,54,53,52,1,50, 53,52,39,38,35,34,7,6,15,1,20,23,22,2,54,100, 57,23,32,38,76,44,29,94,53,62,137,74,39,10,42,48, 82,43,27,80,31,39,84,46,40,108,100,136,89,75,50,79, 9,8,1,59,159,60,96,54,92,96,41,24,31,42,33,22, 254,77,95,43,24,28,44,34,18,2,2,48,23,1,154,82, 137,98,56,19,20,75,49,60,144,78,24,71,37,50,27,64, 39,51,99,33,13,66,55,72,131,86,79,42,32,4,1,54, 254,82,1,174,51,75,111,75,43,26,62,43,39,122,254,246, 96,48,31,18,35,18,19,18,59,30,14,0,0,1,0,18, 255,254,2,39,1,226,0,7,0,0,19,51,17,33,17,51, 17,33,18,54,1,168,55,253,235,1,226,254,83,1,173,254, 28,0,0,2,0,14,255,254,2,133,1,226,0,17,0,31, 0,0,19,51,17,51,17,52,55,54,51,50,23,22,21,20, 7,6,35,33,37,52,39,38,35,34,7,6,21,17,51,50, 55,54,14,54,205,89,26,32,96,68,61,68,31,42,254,22, 2,66,53,48,69,67,17,10,176,52,24,12,1,226,254,83, 1,46,95,25,7,99,88,102,126,47,22,191,98,73,68,34, 20,38,254,229,68,32,0,1,0,14,255,251,2,131,1,226, 0,23,0,0,19,51,17,22,23,50,55,54,55,17,51,17, 33,17,51,17,33,53,6,7,6,35,34,53,14,54,6,37, 55,38,20,3,52,1,53,55,254,96,27,63,19,19,85,1, 226,254,132,46,4,53,28,29,1,64,254,83,1,173,254,28, 55,39,14,5,75,0,0,1,0,10,255,49,1,146,1,226, 0,11,0,0,19,33,21,35,17,7,53,55,17,35,17,35, 10,1,136,144,199,144,139,54,1,226,54,254,88,211,66,157, 1,156,254,82,0,1,255,253,254,244,2,56,1,226,0,59, 0,0,5,35,34,7,6,21,20,21,23,35,39,55,54,55, 54,59,1,50,55,54,53,52,35,34,7,6,21,17,35,17, 52,39,38,35,34,7,6,21,17,35,17,52,55,54,51,50, 23,22,23,54,55,54,51,50,23,22,21,20,7,6,1,53, 159,72,17,7,1,55,2,2,11,85,17,20,176,110,59,42, 145,44,29,17,55,43,22,26,35,25,13,54,55,31,41,68, 41,7,5,24,49,21,21,128,45,20,60,70,146,36,16,27, 5,4,34,45,42,76,11,2,106,76,101,237,45,26,27,254, 180,1,76,55,28,15,48,26,24,254,180,1,82,81,42,23, 53,9,10,43,20,9,142,62,81,137,94,112,0,2,0,12, 255,253,3,52,1,226,0,61,0,77,0,0,1,34,7,6, 21,54,51,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,51,50,23,22,21,20,21,20,7,6,49,23,22,23, 22,51,50,55,54,53,52,35,53,50,21,20,7,6,35,34, 39,38,53,52,53,55,39,38,39,38,7,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,1,8,70,63,61,51, 74,85,44,26,67,41,51,83,49,47,72,71,109,94,75,74, 1,2,2,11,66,10,11,96,43,23,176,230,71,55,79,97, 41,28,3,2,8,46,57,136,63,30,14,53,21,24,66,25, 10,40,24,1,172,61,60,67,57,65,39,50,78,41,26,67, 62,84,110,81,80,72,73,88,5,5,1,23,33,40,76,11, 2,83,45,59,188,54,242,119,70,53,65,44,56,5,6,55, 36,55,49,59,182,49,24,30,58,22,9,47,18,24,51,33, 19,0,0,2,0,10,255,254,3,64,1,226,0,47,0,63, 0,0,1,33,21,35,17,35,17,35,34,7,6,21,17,35, 17,52,39,38,35,34,7,6,21,54,51,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,51,50,23,22,23,54, 55,54,3,52,39,38,35,34,7,6,21,20,23,22,51,50, 55,54,2,60,1,4,144,55,67,51,25,13,55,60,47,51, 93,60,47,53,76,93,38,18,63,39,49,112,46,23,74,74, 112,77,64,17,11,12,61,28,251,43,26,29,44,31,20,51, 22,27,59,24,10,1,226,54,254,82,1,174,59,29,33,254, 203,1,29,60,48,37,69,54,71,56,73,35,45,74,40,25, 99,51,67,112,77,78,63,16,18,61,25,11,254,167,52,32, 19,43,26,28,54,24,11,44,17,0,0,2,0,8,254,244, 2,133,1,226,0,13,0,67,0,0,37,52,39,38,35,34, 7,6,21,17,51,50,55,54,5,20,23,22,59,1,21,35, 34,15,1,6,35,34,39,38,53,52,55,54,59,1,21,35, 34,7,6,21,20,51,50,55,54,51,38,53,33,17,51,17, 51,17,52,55,54,51,50,23,22,21,20,7,6,35,2,80, 53,48,69,67,17,10,176,52,24,12,254,248,34,20,44,17, 23,56,51,81,48,49,90,28,9,35,18,19,115,109,21,7, 1,78,35,83,41,34,55,254,253,54,205,89,26,32,96,68, 61,68,31,42,189,98,73,68,34,20,38,254,229,68,32,155, 57,13,8,49,36,67,36,66,22,28,41,25,12,55,21,5, 5,61,82,39,20,78,1,228,254,83,1,46,95,25,7,99, 88,102,126,47,22,0,0,2,0,16,255,254,3,48,1,226, 0,41,0,57,0,0,1,34,7,6,7,54,51,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,22, 21,20,7,33,17,51,17,33,53,54,55,54,53,52,39,38, 7,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 1,39,78,63,45,7,45,39,81,43,26,66,37,47,100,45, 25,80,81,118,100,79,81,78,1,27,56,254,63,83,30,14, 71,56,187,58,22,9,49,20,26,60,23,9,48,22,1,172, 56,40,49,20,67,41,52,83,40,22,85,46,62,119,86,86, 70,74,98,128,59,1,173,254,28,49,29,81,36,41,90,58, 46,182,50,20,24,63,25,11,49,19,24,61,27,13,0,4, 0,10,255,49,4,62,1,226,0,8,0,24,0,40,0,109, 0,0,37,51,50,55,54,53,52,43,1,37,34,7,6,21, 20,23,22,51,50,55,54,53,52,39,38,37,34,7,6,21, 20,23,22,51,55,54,55,52,47,1,38,33,34,7,6,7, 54,51,50,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,51,50,23,22,21,20,7,51,55,34,39,38,53,52,55, 54,51,50,23,22,21,20,15,1,51,50,23,22,21,20,15, 1,6,43,1,7,35,55,33,53,54,55,54,53,52,39,38, 2,254,207,42,17,7,98,115,253,116,58,22,9,49,20,26, 60,23,9,48,22,2,46,44,29,17,63,30,32,41,6,1, 44,27,6,254,35,78,63,45,7,45,39,81,43,26,66,37, 47,101,45,24,79,79,121,100,79,81,78,235,64,75,48,32, 43,42,60,75,39,23,10,35,107,80,32,15,57,26,14,16, 231,97,61,97,254,192,83,30,14,71,56,53,37,13,16,67, 60,50,20,24,63,25,11,49,19,24,61,27,13,182,52,32, 31,42,21,10,94,13,16,39,18,7,1,56,40,49,20,67, 41,52,83,40,22,85,47,61,122,85,84,70,74,98,128,59, 135,51,35,44,62,50,52,50,29,37,25,21,80,60,27,34, 77,31,10,3,205,205,49,29,81,36,41,90,58,46,0,2, 0,12,255,254,3,252,2,0,0,76,0,92,0,0,1,50, 23,22,7,20,21,15,1,20,51,50,55,54,53,52,39,53, 50,23,22,21,20,7,6,35,34,53,52,55,54,55,39,38, 39,38,35,34,7,6,21,17,35,17,52,39,38,35,34,7, 6,21,54,51,50,23,22,21,20,7,6,35,34,39,38,53, 52,55,54,51,50,23,22,23,54,55,54,1,20,23,22,51, 50,55,54,53,52,39,38,35,34,7,6,2,92,99,38,17, 1,3,5,77,64,43,32,139,96,56,42,67,51,76,133,7, 1,1,2,12,64,12,14,65,27,12,55,80,43,52,70,63, 61,51,74,85,44,26,67,41,51,83,49,47,72,71,109,108, 67,21,11,16,58,29,254,34,53,21,24,66,25,10,40,24, 28,63,30,14,1,226,81,35,45,7,8,42,72,139,81,60, 64,183,16,55,92,69,87,132,76,58,184,23,70,12,12,38, 75,13,3,59,25,31,254,197,1,47,74,34,19,61,60,67, 57,65,39,50,78,41,26,67,62,84,110,81,80,48,15,17, 46,22,12,254,173,58,22,9,47,18,24,51,33,19,49,24, 0,2,0,16,254,244,4,238,1,226,0,95,0,111,0,0, 1,34,7,6,7,54,51,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,51,50,23,22,21,20,7,51,17,52, 55,54,51,50,23,54,55,54,51,50,23,22,21,20,7,6, 35,33,34,15,1,20,21,23,35,39,55,54,55,54,51,33, 50,55,54,53,52,35,34,7,6,21,17,35,17,52,47,1, 38,35,34,7,6,21,17,33,53,54,55,54,53,52,39,38, 7,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 1,39,78,63,45,7,45,39,81,43,26,66,37,47,100,45, 25,80,81,118,100,79,81,78,228,55,31,41,85,36,32,51, 16,16,128,46,20,60,70,130,252,213,82,13,2,2,55,2, 2,11,85,17,20,3,54,110,62,45,145,43,29,17,55,43, 22,13,14,35,24,13,254,119,83,30,14,71,56,187,58,22, 9,49,20,26,60,23,9,48,22,1,172,56,40,49,20,67, 41,52,83,40,22,85,46,62,119,86,86,70,74,98,128,59, 1,27,81,42,23,72,51,16,5,140,63,82,137,94,112,52, 30,1,2,37,45,42,76,11,2,104,76,103,237,45,26,27, 254,180,1,76,54,29,11,4,47,26,25,254,180,49,29,81, 36,41,90,58,46,182,50,20,24,63,25,11,49,19,24,61, 27,13,0,1,0,10,255,254,1,140,1,226,0,9,0,0, 19,33,21,35,17,35,17,35,17,35,10,1,130,138,55,139, 54,1,226,54,254,82,1,174,254,82,0,1,254,143,255,254, 0,76,3,3,0,24,0,0,19,52,39,38,35,34,7,6, 21,20,23,35,38,53,52,55,54,51,50,31,1,22,21,17, 7,21,88,35,46,80,49,33,37,67,29,90,57,76,153,49, 13,7,55,2,6,144,47,18,55,37,49,52,52,60,47,98, 51,33,128,44,35,41,253,245,2,0,0,2,254,180,1,226, 255,244,3,2,0,27,0,39,0,0,3,35,38,39,38,53, 52,55,54,51,50,31,1,22,21,20,7,6,35,34,39,38, 53,52,55,6,21,20,55,34,7,6,21,20,51,50,53,52, 39,38,195,73,40,17,7,71,47,59,92,35,11,5,50,25, 30,57,32,18,13,65,153,35,10,3,54,49,32,11,1,226, 19,67,26,25,77,44,30,65,27,19,20,62,30,14,49,29, 33,27,22,12,78,87,179,36,9,10,56,50,40,16,5,0, 0,2,0,8,0,209,1,236,1,226,0,5,0,9,0,0, 19,33,17,33,53,35,33,21,51,53,8,1,228,254,247,219, 1,15,159,1,226,254,239,219,164,164,0,2,0,12,255,254, 2,39,3,9,0,37,0,53,0,0,19,52,55,54,51,50, 31,1,22,21,17,35,17,52,39,38,35,34,7,6,21,20, 23,54,55,54,51,50,23,22,21,20,7,6,35,34,39,38, 37,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 12,90,77,124,174,53,13,8,55,88,44,61,119,64,53,48, 12,70,33,41,98,31,12,65,36,45,143,67,44,1,9,57, 27,13,58,13,15,42,31,18,39,18,1,123,194,110,94,137, 44,36,42,253,248,2,13,126,50,26,118,97,128,116,104,83, 34,16,86,32,40,79,38,22,149,97,2,53,25,30,72,15, 4,44,26,26,60,29,14,0,0,3,0,10,255,254,2,97, 3,3,0,15,0,60,0,76,0,0,1,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,3,38,53,52,55,54, 51,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 51,50,23,22,21,20,15,1,6,35,34,39,38,53,52,55, 34,7,6,21,20,23,22,55,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,1,189,45,31,19,55,20,25,62, 26,11,46,29,124,56,63,42,52,65,52,41,94,62,80,145, 110,108,104,104,167,105,65,49,76,33,24,26,76,43,28,57, 127,85,80,79,86,217,52,32,19,50,23,27,66,28,13,45, 29,2,181,43,25,27,60,22,8,46,20,24,44,32,19,253, 134,56,68,78,45,30,56,44,50,101,53,34,117,117,147,167, 112,113,61,46,66,92,38,11,6,62,39,49,69,47,108,101, 127,127,94,101,224,49,28,32,57,25,12,50,22,28,45,35, 23,0,0,3,0,18,255,254,3,156,1,229,0,56,0,70, 0,82,0,0,1,34,7,6,7,54,51,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,51,50,23,54,51,50, 23,22,21,20,7,39,54,55,54,53,52,39,38,35,34,7, 22,21,20,7,6,35,34,39,38,53,52,55,38,7,34,7, 6,21,20,23,22,51,50,53,52,39,38,23,20,23,22,51, 50,55,54,53,52,39,6,1,99,130,74,45,8,40,49,81, 44,26,80,31,39,93,47,30,108,98,135,95,71,73,70,112, 74,70,96,55,71,21,6,67,66,87,39,36,100,58,39,54, 76,43,29,96,55,230,63,24,9,48,21,27,97,45,24,214, 41,23,31,46,32,20,98,95,1,172,64,39,55,27,65,39, 50,99,33,13,79,49,65,129,86,79,44,41,89,83,115,125, 72,18,60,92,27,28,86,57,59,15,82,137,100,56,37,75, 50,59,140,82,24,188,52,21,24,59,25,12,96,50,30,17, 49,77,42,25,63,41,40,115,71,81,0,3,0,12,255,254, 4,172,3,9,0,9,0,47,0,63,0,0,1,33,21,35, 17,35,17,35,17,35,1,52,55,54,51,50,31,1,22,21, 17,35,17,52,39,38,35,34,7,6,21,20,23,54,55,54, 51,50,23,22,21,20,7,6,35,34,39,38,37,34,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,3,42,1,130, 138,55,139,54,252,226,90,77,124,174,53,13,8,55,88,44, 61,119,64,53,48,12,70,33,41,98,31,12,65,36,45,143, 67,44,1,9,57,27,13,58,13,15,42,31,18,39,18,1, 226,54,254,82,1,174,254,82,1,125,194,110,94,137,44,36, 42,253,248,2,13,126,50,26,118,97,128,116,104,83,34,16, 86,32,40,79,38,22,149,97,2,53,25,30,72,15,4,44, 26,26,60,29,14,0,0,4,0,10,255,254,4,172,3,3, 0,15,0,60,0,76,0,86,0,0,1,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,3,38,53,52,55,54, 51,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 51,50,23,22,21,20,15,1,6,35,34,39,38,53,52,55, 34,7,6,21,20,23,22,55,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,37,33,21,35,17,35,17,35,17, 35,1,189,45,31,19,55,20,25,62,26,11,46,29,124,56, 63,42,52,65,52,41,94,62,80,145,110,108,104,104,167,105, 65,49,76,33,24,26,76,43,28,57,127,85,80,79,86,217, 52,32,19,50,23,27,66,28,13,45,29,1,79,1,130,138, 55,139,54,2,181,43,25,27,60,22,8,46,20,24,44,32, 19,253,134,56,68,78,45,30,56,44,50,101,53,34,117,117, 147,167,112,113,61,46,66,92,38,11,6,62,39,49,69,47, 108,101,127,127,94,101,224,49,28,32,57,25,12,50,22,28, 45,35,23,199,54,254,82,1,174,254,82,0,0,4,0,12, 255,254,6,96,3,9,0,48,0,64,0,102,0,118,0,0, 1,33,21,35,17,35,17,35,34,7,6,21,17,35,17,52, 39,38,35,34,7,6,21,54,51,50,23,22,21,20,15,1, 6,35,34,39,38,53,52,55,54,51,50,23,22,23,54,55, 54,3,52,39,38,35,34,7,6,21,20,23,22,51,50,55, 54,1,52,55,54,51,50,31,1,22,21,17,35,17,52,39, 38,35,34,7,6,21,20,23,54,55,54,51,50,23,22,21, 20,7,6,35,34,39,38,37,34,7,6,21,20,23,22,51, 50,55,54,53,52,39,38,5,92,1,4,144,55,67,51,25, 13,55,60,47,51,93,60,47,53,76,93,38,18,65,29,27, 30,112,46,23,74,74,112,77,64,17,11,12,61,28,251,43, 26,29,44,31,20,51,22,27,59,24,10,251,203,90,77,124, 174,53,13,8,55,88,44,61,119,64,53,48,12,70,33,41, 98,31,12,65,36,45,143,67,44,1,9,57,27,13,58,13, 15,42,31,18,39,18,1,226,54,254,82,1,174,59,29,33, 254,203,1,29,60,48,37,69,54,71,56,73,35,45,75,40, 14,10,99,51,67,112,77,78,63,16,18,61,25,11,254,167, 52,32,19,43,26,28,54,24,11,44,17,1,8,194,110,94, 137,44,36,42,253,248,2,13,126,50,26,118,97,128,116,104, 83,34,16,86,32,40,79,38,22,149,97,2,53,25,30,72, 15,4,44,26,26,60,29,14,0,1,0,118,2,164,0,213, 3,1,0,11,0,0,19,20,7,6,35,34,53,52,55,54, 51,50,213,28,10,10,47,31,8,9,47,2,213,31,14,4, 49,31,10,3,0,2,0,10,255,254,3,64,1,226,0,47, 0,63,0,0,1,33,21,35,17,35,17,35,34,7,6,21, 17,35,17,52,39,38,35,34,7,6,21,54,51,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,51,50,23,22, 23,54,55,54,3,52,39,38,35,34,7,6,21,20,23,22, 51,50,55,54,2,60,1,4,144,55,67,51,25,13,55,60, 47,51,93,60,47,53,76,93,38,18,63,39,49,112,46,23, 74,74,112,77,64,17,11,12,61,28,251,43,26,29,44,31, 20,51,22,27,59,24,10,1,226,54,254,82,1,174,59,29, 33,254,203,1,29,60,48,37,69,54,71,56,73,35,45,74, 40,25,99,51,67,112,77,78,63,16,18,61,25,11,254,167, 52,32,19,43,26,28,54,24,11,44,17,0,0,3,0,16, 255,254,2,199,1,226,0,11,0,15,0,39,0,0,37,53, 35,34,7,6,21,20,23,22,51,50,17,35,21,51,3,34, 39,38,53,52,55,54,59,1,53,33,21,35,21,33,53,51, 21,33,21,20,7,6,1,86,217,36,10,3,60,44,43,119, 162,162,119,95,62,50,39,21,26,23,1,174,159,0,255,60, 254,197,80,41,168,66,43,11,12,49,38,28,1,119,139,254, 221,63,50,69,59,32,18,193,54,139,193,248,91,87,38,20, 0,2,0,14,254,239,3,52,1,226,0,53,0,63,0,0, 37,52,39,38,47,1,38,35,34,7,53,54,55,54,51,50, 23,22,21,20,7,6,35,34,39,38,47,1,55,54,55,54, 55,54,51,50,23,22,21,7,6,7,6,21,20,21,23,22, 23,22,51,50,55,54,3,21,35,17,35,17,35,17,35,17, 2,254,44,10,11,22,16,18,67,41,18,53,22,20,98,46, 26,123,113,145,175,122,122,4,1,2,14,69,15,16,7,8, 20,4,1,3,59,28,12,1,6,105,101,152,121,100,111,90, 139,55,140,53,47,79,55,13,9,13,7,75,67,36,17,7, 99,56,73,141,93,86,106,108,172,32,64,139,84,18,13,6, 20,2,3,10,62,116,52,47,5,5,28,161,87,84,68,77, 2,38,54,254,82,1,174,254,82,1,228,0,0,5,0,16, 255,254,3,59,1,226,0,3,0,7,0,29,0,41,0,45, 0,0,37,51,21,35,39,51,21,35,5,34,39,38,53,52, 55,54,59,1,53,33,21,35,21,33,21,33,21,20,7,6, 39,20,23,22,51,50,61,1,35,34,7,6,37,35,21,51, 2,218,60,60,200,60,60,254,205,95,62,50,24,22,40,23, 1,174,159,1,175,254,81,78,41,201,58,44,45,119,217,36, 10,3,1,10,162,162,254,254,254,254,2,63,50,69,41,33, 35,193,54,139,55,91,86,38,21,170,49,38,28,115,66,43, 11,248,139,0,0,2,0,14,255,254,2,107,1,221,0,28, 0,44,0,0,1,33,21,35,17,35,17,35,34,7,6,21, 54,51,50,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,19,50,55,54,53,52,39,38,35,34,7,6,21,20,23, 22,1,12,1,95,84,60,207,89,59,46,44,95,93,39,20, 50,43,51,102,60,45,85,71,41,65,25,10,37,26,27,51, 33,20,50,20,1,221,61,254,94,1,162,65,51,66,65,67, 34,44,69,47,40,84,64,83,114,72,62,254,91,46,18,23, 38,34,25,42,25,30,56,22,9,0,0,1,0,16,255,251, 2,203,1,216,0,27,0,0,19,50,23,22,23,53,33,21, 35,17,35,17,35,17,35,17,38,39,38,35,34,7,17,35, 17,52,55,54,79,67,51,14,8,1,240,110,78,228,80,7, 39,16,18,41,4,78,31,13,1,216,42,11,13,66,57,254, 92,1,164,254,92,1,86,52,21,9,25,254,113,1,164,45, 8,4,0,4,0,22,255,253,1,39,1,199,0,13,0,23, 0,33,0,47,0,0,37,20,7,6,35,34,53,52,55,54, 51,50,23,22,39,51,50,53,52,43,1,34,21,20,23,34, 21,20,59,1,50,53,52,35,3,50,23,22,21,20,35,34, 39,38,53,52,55,54,1,39,73,29,36,135,70,29,36,92, 33,13,189,103,38,38,103,32,32,39,39,103,31,31,52,93, 33,12,138,68,41,26,71,29,98,66,24,10,100,65,24,10, 52,21,189,45,41,42,44,173,42,43,43,42,1,59,54,20, 26,100,41,26,33,66,24,10,0,1,0,22,255,254,2,89, 1,199,0,55,0,0,1,34,7,6,21,20,23,51,21,35, 53,51,38,53,52,55,54,51,50,23,22,21,20,7,6,35, 34,39,38,53,52,55,54,51,50,23,22,21,20,7,39,54, 53,52,35,34,21,20,23,22,51,50,55,54,53,52,1,211, 31,16,8,19,36,241,145,18,54,26,34,81,35,18,104,78, 107,127,81,82,46,46,60,66,25,9,13,52,6,33,93,61, 60,102,103,64,65,1,135,47,22,23,34,25,58,58,46,39, 78,35,17,106,54,68,117,64,48,66,64,99,93,68,67,49, 18,22,28,25,27,18,8,25,164,76,48,48,49,50,78,159, 0,2,0,17,255,254,2,54,1,199,0,59,0,69,0,0, 37,52,39,38,43,1,53,51,38,39,38,53,52,55,54,51, 50,23,22,21,20,7,22,21,20,35,34,39,38,53,52,55, 54,51,50,23,22,21,20,7,39,54,53,52,39,38,35,34, 7,34,21,20,21,22,23,22,51,50,55,54,55,52,39,38, 35,34,21,20,51,54,1,211,18,6,6,231,177,39,7,5, 32,31,50,68,34,19,68,37,244,109,79,86,44,37,57,62, 30,15,14,61,10,20,5,4,8,5,71,2,98,46,61,117, 42,17,31,33,10,10,42,50,45,151,18,10,3,58,34,28, 16,22,46,34,35,57,31,39,48,65,27,41,149,61,66,102, 111,62,55,43,21,26,23,26,24,13,11,19,7,1,4,152, 4,4,101,39,19,44,17,211,27,12,4,43,79,9,0,2, 0,17,255,254,2,53,1,199,0,60,0,73,0,0,19,52, 55,54,51,50,23,54,51,50,23,22,21,20,7,6,7,22, 23,35,52,39,6,35,34,39,38,53,52,55,54,51,50,23, 22,21,54,55,54,53,52,35,34,7,6,29,1,35,53,52, 39,38,35,34,21,20,23,7,38,39,38,23,20,23,22,51, 50,55,54,55,38,39,7,6,17,59,36,43,89,47,58,80, 81,36,19,22,26,27,48,1,59,25,85,95,94,52,43,128, 35,42,43,62,53,33,12,3,84,54,24,10,67,79,12,12, 69,51,61,42,10,7,128,57,26,27,27,50,61,11,25,114, 48,71,1,99,51,31,18,50,50,85,44,56,42,63,74,13, 54,26,18,31,49,34,28,38,85,22,6,30,25,24,31,71, 19,17,113,23,9,11,13,13,35,7,1,56,41,16,30,25, 32,21,206,35,17,8,12,13,21,52,2,3,10,0,0,4, 0,22,255,254,2,227,2,142,0,8,0,18,0,76,0,85, 0,0,1,34,7,6,7,33,52,39,38,5,50,55,54,53, 52,35,34,21,20,55,50,23,22,21,6,7,6,7,22,23, 22,21,20,7,35,54,53,52,39,35,6,7,6,35,34,39, 38,39,35,53,51,52,55,54,55,35,53,33,50,55,54,53, 52,39,55,22,21,20,7,22,21,51,38,53,52,55,54,1, 50,55,54,53,33,22,23,22,1,5,67,44,20,8,1,11, 51,43,1,75,33,14,5,69,52,59,89,26,8,7,40,25, 24,50,18,6,5,86,13,82,90,16,71,52,67,139,49,15, 4,32,32,61,14,11,103,1,54,56,20,7,15,52,32,120, 88,56,33,60,29,254,194,62,35,21,254,255,8,66,29,1, 127,65,29,34,55,41,32,128,41,15,16,56,56,72,200,87, 28,35,41,36,21,2,43,76,25,25,16,22,26,32,92,49, 99,57,43,115,37,47,58,47,71,16,10,56,59,22,25,35, 31,27,55,74,91,35,64,80,39,46,69,31,15,254,125,54, 33,42,83,32,14,0,0,1,0,14,255,254,4,80,1,205, 0,77,0,0,1,52,55,54,51,50,21,7,21,20,51,50, 55,54,53,52,39,38,39,55,22,23,22,23,16,35,34,39, 38,53,52,55,52,35,34,21,20,23,22,21,20,7,6,35, 34,39,38,53,52,55,54,51,50,21,20,7,6,7,39,54, 53,52,35,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,1,133,96,41,53,192,10,112,112,31,14,31,32,37, 71,55,32,12,4,231,117,43,19,7,122,126,7,11,81,50, 67,114,73,72,54,35,49,136,10,13,12,59,30,72,46,17, 7,50,52,89,101,23,5,11,2,1,33,111,39,16,163,104, 1,119,82,40,65,33,58,58,31,26,35,96,38,37,254,255, 90,40,54,38,35,128,86,18,24,41,36,100,49,31,79,79, 114,97,53,35,86,20,33,31,10,22,29,25,40,59,23,26, 90,61,64,81,19,23,34,30,32,0,0,1,0,14,255,254, 5,154,1,200,0,119,0,0,37,50,55,54,53,52,39,52, 55,54,51,50,23,22,21,20,15,2,35,34,39,38,53,52, 55,54,51,23,34,7,6,21,20,23,20,23,22,51,50,55, 39,38,39,38,35,34,7,6,21,22,21,20,7,6,35,34, 53,52,55,54,53,52,39,34,7,6,21,20,23,22,21,20, 35,34,39,38,53,52,55,54,51,50,23,22,21,20,15,1, 39,54,53,52,34,21,20,51,50,53,52,39,38,53,52,55, 54,51,50,51,22,23,22,23,22,21,20,7,6,21,20,3, 85,90,16,4,7,108,56,75,121,68,50,99,32,40,1,96, 30,10,70,29,37,10,54,16,4,6,45,11,12,92,3,3, 9,41,50,69,99,39,18,3,142,22,25,184,12,2,124,86, 28,9,4,9,216,93,62,64,43,38,57,66,43,27,17,8, 52,11,140,171,128,10,7,57,54,78,3,3,146,36,8,2, 1,9,2,68,69,19,25,36,38,125,50,25,87,65,92,156, 43,10,4,63,22,27,77,28,12,51,34,9,11,12,12,33, 10,2,158,39,53,36,44,61,29,38,29,23,176,25,4,166, 40,51,14,11,102,1,57,19,24,17,11,41,42,174,80,77, 115,92,49,44,42,28,33,31,20,10,14,17,14,47,100,215, 110,36,41,29,17,67,44,43,5,98,19,23,10,11,10,63, 15,13,120,0,0,1,0,17,255,253,2,35,1,248,0,44, 0,0,55,50,55,54,53,51,20,23,22,23,50,55,54,53, 52,39,38,39,38,39,55,22,21,20,7,6,35,38,39,6, 7,6,35,34,53,52,55,54,55,23,34,7,6,21,22,155, 50,32,21,67,33,25,34,6,6,46,5,6,44,43,52,36, 186,59,24,35,111,27,22,69,22,23,138,63,27,31,17,47, 17,5,3,68,43,27,32,52,29,23,1,1,4,63,7,57, 65,74,73,32,63,140,224,94,34,14,2,66,47,16,5,142, 65,33,14,3,64,28,9,14,72,0,0,1,0,17,255,254, 2,38,2,1,0,62,0,0,1,34,39,38,53,51,20,23, 22,51,50,55,23,22,23,22,23,22,21,20,7,6,35,34, 39,38,39,6,35,34,39,38,53,52,55,23,38,35,34,7, 6,21,20,23,22,51,50,55,54,53,51,20,51,50,55,54, 53,52,39,38,39,6,7,1,2,77,30,13,68,52,15,18, 44,3,39,107,44,17,4,1,61,26,34,71,44,18,5,42, 94,77,38,23,121,17,6,6,27,20,10,18,19,49,50,24, 12,67,88,47,13,8,40,41,48,29,32,1,113,73,31,40, 53,15,4,43,7,72,128,49,52,9,17,99,37,16,36,15, 19,70,61,35,46,81,34,71,3,24,12,11,38,18,16,49, 24,29,107,30,22,72,43,67,69,30,23,3,0,1,0,17, 255,254,2,35,1,199,0,62,0,0,1,34,7,6,21,35, 52,39,38,35,34,21,20,23,7,38,53,52,55,54,51,50, 23,54,51,50,23,22,29,1,20,15,1,6,35,34,39,6, 35,34,53,52,55,54,51,23,34,7,6,7,20,51,50,55, 54,53,51,20,51,50,61,1,52,1,138,45,26,13,52,48, 28,27,69,8,59,18,67,33,38,76,60,34,88,72,39,23, 65,26,13,14,105,33,49,87,138,74,21,26,17,42,20,6, 1,86,50,24,12,67,88,67,1,127,35,17,18,35,22,13, 43,21,14,8,30,42,51,23,12,64,64,60,36,46,173,99, 31,9,3,64,64,142,80,22,6,57,28,9,14,72,49,24, 29,102,116,86,113,0,0,1,255,251,255,254,2,47,1,199, 0,59,0,0,23,34,39,38,53,52,55,54,55,54,53,52, 35,34,21,20,23,7,38,53,52,55,54,51,50,23,22,21, 20,15,1,6,21,20,23,22,51,50,53,51,20,23,22,51, 50,55,54,53,52,39,55,22,21,20,7,6,35,34,39,6, 167,95,32,12,40,1,73,40,51,72,5,52,17,53,32,35, 94,31,11,40,75,40,22,17,47,88,67,58,12,16,52,14, 3,35,35,67,55,27,36,105,33,49,2,76,29,37,44,40, 1,60,31,24,59,45,12,15,14,14,42,44,27,15,55,20, 25,55,37,55,31,37,48,13,11,86,73,11,2,33,8,9, 29,23,57,31,56,85,38,19,64,64,0,1,255,251,255,253, 2,49,2,151,0,75,0,0,19,34,15,1,6,21,20,23, 7,38,53,52,55,54,55,52,39,38,53,52,55,23,6,21, 20,31,1,22,21,20,7,6,7,6,21,20,23,22,51,50, 53,51,20,23,22,51,50,55,54,53,52,39,55,22,23,20, 7,6,7,34,35,34,39,6,35,34,39,38,53,52,55,54, 55,54,55,52,131,49,19,6,1,8,52,17,24,24,36,31, 30,19,78,19,40,75,40,40,6,69,40,49,17,20,88,67, 56,14,16,53,11,2,32,35,53,16,66,21,27,3,3,105, 33,40,96,80,38,21,38,65,9,39,3,1,143,24,12,3, 3,9,14,21,14,42,29,30,28,5,27,44,42,30,28,31, 9,6,50,59,43,65,36,40,55,40,6,52,31,31,49,17, 6,86,66,16,4,36,7,7,29,29,56,23,69,98,32,11, 1,64,64,63,34,45,41,38,52,7,30,32,59,0,0,2, 255,251,255,254,2,107,2,112,0,35,0,92,0,0,1,20, 7,6,43,1,53,51,50,53,52,43,1,53,33,50,31,1, 22,23,7,6,7,6,35,34,53,51,20,23,50,53,52,43, 1,22,19,34,39,38,39,6,35,34,39,38,53,52,63,1, 54,53,52,35,34,21,20,23,7,38,53,52,55,54,51,50, 23,22,21,20,15,1,6,21,20,51,50,53,51,20,23,22, 51,50,53,52,39,55,22,21,20,7,6,1,21,42,17,19, 187,187,21,11,197,1,155,128,47,12,7,1,3,14,64,20, 24,122,70,42,78,138,152,6,154,80,31,9,8,40,96,85, 36,18,40,76,38,51,78,8,47,19,53,32,35,94,31,11, 40,75,40,86,88,67,56,14,16,70,26,26,68,38,37,2, 20,36,16,6,43,33,25,49,72,25,20,24,45,90,27,8, 112,55,5,103,107,7,253,198,38,11,15,64,66,33,43,42, 37,59,30,32,59,36,15,18,14,16,37,44,27,15,55,20, 25,55,37,55,31,37,72,86,66,16,4,57,29,37,49,26, 74,68,36,38,0,2,0,7,255,234,1,159,1,203,0,17, 0,51,0,0,37,52,39,38,35,34,7,6,21,20,21,22, 23,50,51,54,55,54,39,52,39,38,43,1,53,33,21,35, 22,20,7,51,21,35,22,21,20,7,6,35,34,39,38,53, 52,55,54,55,35,53,51,50,1,51,45,22,25,50,24,11, 10,66,5,4,65,21,6,101,16,6,5,172,1,40,52,14, 14,164,112,70,34,43,81,69,43,39,34,13,22,126,154,45, 127,47,25,12,39,17,20,4,4,82,1,4,47,15,249,20, 13,4,63,60,23,56,23,57,40,73,48,43,58,45,41,48, 75,31,11,11,57,0,0,2,0,14,255,254,2,240,1,192, 0,60,0,68,0,0,1,50,23,22,21,20,7,22,51,50, 53,52,39,38,39,35,53,51,23,22,21,20,7,6,35,34, 39,6,7,6,35,34,39,38,53,52,55,54,51,50,23,22, 23,54,53,52,47,1,38,35,34,7,23,21,7,38,53,55, 54,55,54,3,20,51,50,55,38,35,34,1,17,87,45,28, 42,115,40,136,67,18,18,20,79,54,60,94,41,54,121,76, 47,92,30,28,72,44,39,45,43,67,70,69,16,10,30,39, 18,16,18,65,1,4,69,4,5,3,34,38,136,87,70,49, 51,68,87,1,189,75,46,62,90,52,58,135,85,81,21,15, 49,69,77,105,133,46,20,70,47,17,6,34,28,38,43,27, 29,33,8,8,30,74,70,39,13,9,41,23,1,5,4,23, 37,25,19,24,254,165,43,43,42,0,0,1,0,14,255,254, 1,239,1,204,0,25,0,0,37,20,7,35,54,53,52,39, 38,35,34,7,6,21,20,23,35,38,53,52,55,35,53,33, 23,22,1,239,35,69,35,60,51,62,62,49,60,36,69,35, 102,102,1,68,83,74,140,89,53,56,86,114,67,58,58,67, 114,50,92,50,92,157,102,61,91,82,0,4,0,5,255,113, 3,14,1,204,0,13,0,17,0,21,0,77,0,0,1,50, 23,22,21,20,7,6,35,34,39,38,53,52,19,35,55,51, 1,33,53,33,23,20,7,6,35,34,39,38,39,21,20,7, 6,35,34,39,6,35,34,39,38,53,52,55,54,55,23,34, 21,20,23,22,51,50,55,54,53,51,20,51,50,55,54,53, 39,53,55,20,23,22,51,50,55,53,23,22,1,23,34,14, 4,33,10,9,29,14,5,84,69,17,35,1,137,253,90,2, 166,91,50,36,39,68,30,9,3,54,39,53,86,36,63,73, 77,39,22,83,18,20,26,78,50,17,19,50,24,12,69,86, 44,19,8,1,114,27,19,16,55,12,66,2,1,86,26,8, 9,27,9,3,23,7,9,40,254,30,114,1,172,61,146,56, 41,28,32,10,11,53,92,57,40,57,57,61,35,46,69,34, 8,4,58,70,40,14,5,49,24,29,102,61,27,31,105,1, 30,22,27,19,50,54,26,14,0,2,255,252,255,254,2,114, 1,254,0,78,0,92,0,0,1,50,31,1,22,21,35,39, 38,47,1,38,35,34,7,6,7,6,15,1,6,21,20,51, 50,55,54,53,51,6,21,20,23,22,51,50,53,52,39,55, 22,23,22,21,20,7,6,35,34,39,6,35,34,39,38,53, 52,63,1,54,53,52,39,38,35,34,21,20,23,7,38,53, 52,55,54,51,50,23,54,23,50,23,22,21,20,7,6,35, 34,39,52,55,54,1,199,86,43,14,10,78,3,9,35,33, 24,30,50,40,20,5,7,47,79,40,96,75,18,5,75,2, 52,22,25,75,26,28,48,19,8,62,30,40,103,52,65,87, 104,37,15,45,83,45,40,8,9,87,8,55,17,64,41,46, 87,47,60,55,31,17,6,29,12,13,36,18,29,12,1,254, 61,27,25,31,23,30,15,9,4,40,20,21,40,41,61,34, 33,81,62,15,19,16,3,48,20,9,63,33,34,63,18,60, 23,26,88,38,18,55,55,81,34,44,47,39,61,36,41,53, 11,2,49,13,19,15,15,47,49,29,19,74,74,160,27,10, 11,29,15,7,51,27,15,6,0,1,255,251,255,254,2,83, 1,200,0,69,0,0,55,20,23,22,51,50,53,51,20,51, 50,53,52,43,1,53,51,53,35,53,51,23,21,51,21,35, 22,31,1,20,15,1,6,35,34,39,6,35,34,39,38,53, 52,53,52,63,1,54,53,52,35,34,21,20,23,7,38,53, 52,55,54,51,50,23,22,21,20,15,1,6,96,49,17,20, 88,67,86,69,77,61,87,87,62,93,86,76,34,5,1,47, 21,23,27,105,36,46,87,55,41,43,40,76,38,51,77,10, 50,19,53,32,35,94,31,11,40,75,40,140,49,17,6,86, 86,72,87,58,114,57,36,135,58,14,44,29,70,43,16,13, 64,64,39,40,58,3,2,48,36,56,27,33,59,41,11,19, 13,15,39,44,27,15,55,20,25,52,40,57,31,0,0,1, 0,10,255,253,2,63,1,199,0,75,0,0,1,50,55,54, 53,51,20,7,6,7,6,35,34,39,6,15,1,6,21,6, 21,20,51,50,53,51,20,23,22,51,50,55,54,53,52,39, 55,22,23,22,21,20,7,6,35,34,39,6,35,34,39,38, 53,52,63,1,54,53,52,35,34,21,20,23,7,38,53,52, 55,54,51,50,23,22,23,22,1,113,78,29,11,71,61,38, 37,45,37,59,26,7,38,65,33,3,88,86,69,52,16,18, 45,23,9,35,27,42,18,8,56,28,36,110,28,51,86,91, 33,14,38,70,37,42,65,7,62,15,60,36,39,52,44,11, 6,42,1,113,38,15,19,52,43,27,5,8,29,44,38,55, 30,28,9,7,56,86,62,18,6,27,11,13,24,27,70,16, 52,22,23,77,35,17,70,70,73,30,39,49,35,54,27,35, 49,31,14,10,21,13,43,44,26,16,38,9,9,30,0,3, 0,17,255,246,3,67,1,211,0,11,0,27,0,119,0,0, 37,50,55,54,55,38,39,38,21,20,23,22,1,50,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,23,52,39,38, 35,34,7,6,21,20,23,6,7,21,20,7,22,21,35,52, 39,38,39,6,35,34,39,38,53,52,55,54,51,50,23,22, 23,54,53,52,47,2,34,7,6,29,1,35,53,38,35,34, 35,6,21,20,23,22,23,7,38,53,52,55,54,51,50,23, 54,55,54,51,50,23,22,23,52,55,54,51,50,23,22,23, 21,6,7,6,7,39,54,1,19,32,45,19,6,35,67,105, 63,23,1,185,16,10,4,20,5,5,19,8,3,18,6,83, 36,18,23,56,14,7,2,21,36,68,52,69,12,13,17,72, 101,84,50,45,128,35,42,33,45,54,22,52,43,19,22,54, 24,10,67,15,73,7,8,71,2,17,34,51,69,67,32,39, 103,33,32,60,18,28,62,41,11,6,49,39,42,84,45,24, 2,3,9,19,38,42,51,62,27,11,10,40,2,2,44,29, 14,5,1,57,23,8,7,16,7,2,16,4,5,18,15,5, 67,55,30,16,44,22,14,7,4,8,16,24,89,91,42,58, 12,22,20,11,57,34,28,38,85,22,6,19,22,30,45,85, 70,30,10,3,23,9,11,13,13,43,5,42,3,6,41,16, 30,40,75,60,27,13,46,36,5,1,59,15,16,43,35,28, 59,31,40,51,31,29,53,53,66,60,0,1,0,26,0,16, 2,68,2,114,0,96,0,0,19,52,55,54,59,1,21,35, 38,35,34,21,20,23,22,51,50,23,22,21,20,7,39,54, 53,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54, 53,51,7,20,23,22,51,50,55,54,53,52,35,53,51,50, 55,54,53,52,47,1,38,43,1,53,51,50,23,22,21,20, 7,6,7,34,39,22,21,20,7,6,15,1,34,39,38,39, 6,35,34,39,38,53,52,55,38,41,35,22,26,80,31,6, 12,49,37,21,24,67,27,11,22,58,14,30,12,12,27,26, 30,41,19,23,60,26,12,64,2,43,20,21,49,22,10,98, 34,36,27,17,41,22,8,9,17,32,72,37,22,30,27,24, 4,3,70,76,18,21,13,67,46,11,7,53,77,74,43,30, 80,65,2,19,46,30,19,69,2,43,38,27,15,50,21,25, 35,31,20,19,12,30,18,8,44,51,81,76,33,14,40,19, 23,15,37,21,9,43,18,21,151,53,44,26,25,59,25,8, 2,69,58,34,43,59,49,43,1,1,57,104,121,32,8,1, 1,35,9,10,54,74,50,65,149,68,56,0,0,3,0,5, 255,253,1,177,1,202,0,15,0,31,0,40,0,0,19,34, 7,6,7,20,23,22,51,50,55,54,53,52,39,38,37,51, 23,22,21,20,7,6,35,34,35,38,53,52,55,35,23,52, 55,54,51,50,20,35,34,229,80,39,16,4,77,27,35,100, 28,9,55,35,254,241,244,117,67,61,58,88,3,2,197,77, 96,182,29,6,7,41,41,42,1,127,81,34,41,112,35,12, 93,30,36,79,47,30,75,59,76,96,106,62,61,5,224,84, 88,172,39,11,2,104,0,2,0,10,255,254,2,3,1,202, 0,35,0,60,0,0,1,20,7,6,7,50,23,22,21,20, 15,1,6,35,34,39,6,7,6,35,34,39,38,53,52,55, 54,55,35,53,33,23,22,23,22,23,7,52,39,38,35,53, 50,53,52,35,34,7,6,7,21,22,23,22,51,50,53,51, 20,51,50,1,245,16,5,8,28,12,3,60,26,12,14,119, 19,10,68,21,21,63,42,30,59,24,27,110,1,69,103,27, 23,10,2,45,30,15,17,39,167,103,53,25,7,3,16,23, 26,87,68,87,68,1,41,64,15,4,3,56,17,15,84,30, 9,2,57,40,13,4,61,43,52,102,88,35,20,59,59,15, 43,20,16,165,27,20,10,43,48,95,97,45,57,33,28,23, 32,86,86,0,0,3,0,10,255,111,2,11,1,202,0,29, 0,33,0,64,0,0,37,52,47,1,38,35,53,50,53,52, 39,38,39,38,35,34,7,6,7,23,22,23,22,51,50,53, 51,20,51,50,7,55,51,23,55,20,15,1,6,35,34,39, 6,7,6,35,34,39,38,53,52,55,35,53,33,23,22,23, 22,23,20,7,22,23,22,1,199,29,16,4,3,39,4,19, 94,30,30,95,54,35,4,2,4,15,20,27,87,68,87,68, 223,16,35,17,223,51,28,20,21,119,19,10,68,21,21,63, 42,30,110,110,1,69,103,35,25,13,2,41,37,11,3,130, 19,32,14,2,43,50,14,9,48,17,5,80,52,67,36,28, 22,30,86,86,213,114,114,243,51,30,13,6,57,40,13,4, 61,43,52,150,95,59,59,21,37,19,19,75,17,16,65,16, 0,1,0,14,255,254,3,17,1,199,0,74,0,0,1,34, 15,1,6,21,35,52,39,38,35,34,21,20,51,21,34,21, 20,51,50,55,51,6,7,6,35,34,39,38,53,52,55,38, 39,38,53,52,55,54,51,50,23,54,51,50,23,22,23,22, 21,20,7,6,35,34,39,38,53,52,55,54,55,21,6,21, 20,51,50,55,54,53,52,39,38,2,51,68,42,15,12,86, 62,34,40,113,78,87,87,92,27,69,21,93,42,49,64,44, 30,68,46,9,3,87,41,52,106,81,52,120,119,61,35,6, 1,54,54,79,93,33,12,73,25,30,49,76,50,32,21,52, 48,1,127,41,18,19,22,55,29,16,70,86,57,43,65,48, 71,28,13,40,27,33,95,18,25,43,17,22,87,34,16,94, 94,92,53,73,13,13,95,58,60,54,20,26,64,30,10,3, 57,25,27,34,62,41,46,72,52,48,0,1,0,21,255,254, 1,243,1,202,0,44,0,0,1,52,39,38,35,33,53,33, 23,22,31,1,21,6,7,22,21,20,7,6,35,34,39,55, 54,55,23,6,21,22,51,50,55,54,53,52,39,38,43,1, 53,51,50,55,54,1,155,57,29,30,254,254,1,54,94,21, 12,3,8,38,68,72,69,97,235,4,2,12,70,34,51,1, 161,85,50,45,62,19,22,33,33,70,11,2,1,71,39,22, 11,59,59,13,50,31,6,50,22,30,66,59,38,36,142,30, 57,28,50,20,45,78,22,20,23,50,15,5,58,48,10,0, 0,4,0,10,255,111,2,11,1,202,0,23,0,39,0,43, 0,65,0,0,55,52,55,54,55,35,53,33,23,22,23,22, 21,20,7,6,35,34,39,6,35,34,39,38,37,20,7,6, 35,34,39,38,53,52,55,54,51,50,23,22,3,35,55,51, 55,50,55,54,53,52,39,38,39,38,35,34,7,6,7,21, 22,23,50,53,51,20,10,63,26,29,118,1,44,93,78,30, 12,47,32,41,118,22,48,87,51,33,34,1,47,27,10,11, 29,13,4,24,11,11,24,17,7,13,68,16,35,104,50,16, 5,3,15,56,54,65,78,59,44,7,15,53,87,68,140,104, 94,39,22,59,59,67,105,44,43,69,43,30,61,61,40,38, 194,25,12,4,24,8,9,23,18,8,27,11,254,86,114,99, 51,16,19,14,16,88,54,57,76,57,66,39,71,6,86,86, 0,2,0,10,255,253,2,11,1,202,0,20,0,44,0,0, 55,20,23,22,51,50,53,51,20,51,50,55,54,53,52,39, 38,35,34,7,6,37,23,22,23,22,21,20,7,6,7,6, 35,34,39,6,35,34,39,38,53,52,55,35,53,75,41,13, 16,87,68,87,39,20,10,65,53,73,79,57,54,1,9,73, 79,24,7,52,31,37,9,16,92,23,48,87,51,33,34,118, 118,161,65,21,7,86,86,47,23,27,99,65,54,73,68,216, 59,63,120,37,39,68,45,26,3,1,62,61,40,38,64,181, 78,59,0,3,0,10,255,111,2,11,1,202,0,22,0,44, 0,48,0,0,55,50,53,51,20,51,50,55,54,55,52,39, 38,39,38,35,34,7,6,7,6,21,20,37,20,7,6,35, 34,39,6,35,34,39,38,53,52,55,35,53,33,23,22,23, 22,5,51,23,35,145,87,68,87,28,21,20,1,10,17,36, 52,77,86,57,39,6,1,1,191,47,32,41,118,22,48,87, 51,33,34,108,108,1,84,63,81,22,7,254,237,35,17,68, 68,86,86,30,29,42,28,31,58,40,57,79,53,67,8,15, 93,72,69,43,30,61,61,40,38,64,187,72,59,59,76,115, 34,205,114,0,0,1,0,10,255,254,1,249,1,202,0,45, 0,0,55,52,55,54,51,50,23,22,21,23,22,51,50,53, 52,39,38,39,35,53,33,23,22,23,22,21,20,7,6,35, 34,39,38,39,38,39,38,35,34,7,6,21,20,23,7,38, 10,56,44,52,46,32,25,29,22,45,77,43,45,67,241,1, 37,85,45,26,14,66,37,50,63,44,9,7,20,4,16,34, 62,13,3,26,61,32,127,54,41,33,30,24,17,76,40,116, 57,62,68,28,59,89,47,73,37,28,108,50,28,73,16,17, 53,6,28,63,14,16,37,41,22,58,0,2,0,24,255,254, 1,177,1,202,0,19,0,33,0,0,19,23,22,23,22,21, 20,7,6,35,34,39,38,53,52,55,54,55,35,53,23,34, 7,6,21,20,23,22,51,50,53,52,39,38,249,107,44,23, 10,57,57,90,90,57,58,24,27,43,93,204,77,39,22,43, 43,59,130,57,34,1,202,39,52,79,34,27,102,63,64,66, 64,99,43,48,54,27,59,75,67,39,50,73,46,46,165,86, 44,26,0,4,0,10,255,255,2,39,1,205,0,30,0,44, 0,72,0,86,0,0,37,7,6,7,6,7,39,38,39,6, 35,38,39,38,55,52,55,54,51,50,21,20,7,51,38,53, 52,51,50,23,22,39,50,55,54,53,52,39,38,35,34,7, 6,21,20,23,52,39,6,7,6,7,21,33,53,38,39,38, 39,6,21,20,23,22,23,55,54,55,22,23,54,55,54,37, 20,23,22,51,50,53,52,39,38,35,34,7,6,2,38,3, 6,23,40,72,30,64,33,40,87,81,39,22,1,28,32,62, 83,6,138,5,83,91,25,7,123,36,11,3,10,28,22,25, 19,10,168,33,4,35,12,15,254,209,41,18,6,1,32,47, 38,47,27,59,31,40,77,59,40,35,254,65,29,10,11,63, 30,12,11,24,25,11,244,57,55,46,85,1,3,16,94,113, 2,106,62,77,89,60,65,121,14,20,25,9,121,136,37,18, 35,9,10,18,13,20,26,13,14,52,72,84,46,63,30,11, 2,19,20,6,59,19,21,47,83,65,51,41,1,3,17,99, 117,2,2,57,50,176,36,14,5,52,28,18,7,20,14,0, 0,1,0,12,255,254,2,83,1,199,0,42,0,0,1,52, 39,38,39,51,22,31,1,20,7,6,35,34,39,38,53,52, 55,54,51,22,23,22,21,20,7,39,54,53,52,35,34,15, 1,21,20,23,22,51,50,55,54,2,14,30,14,25,77,50, 8,3,94,79,119,111,85,95,48,49,65,64,32,16,35,52, 15,47,67,17,4,88,57,79,99,64,60,0,255,100,51,22, 27,54,81,65,130,69,58,65,74,118,83,59,58,8,38,18, 22,56,30,30,24,16,30,81,42,5,104,54,35,59,55,0, 0,2,0,12,255,254,2,63,2,97,0,84,0,96,0,0, 1,20,23,22,51,50,55,21,6,35,34,47,1,54,55,54, 51,50,51,22,31,1,22,21,20,7,6,7,22,21,20,7, 6,35,34,39,38,53,52,55,54,55,34,39,38,53,52,55, 54,51,50,31,1,20,21,20,7,6,35,34,39,53,22,51, 50,53,52,47,2,34,7,6,7,20,23,22,51,50,53,52, 39,38,35,34,3,20,51,50,53,52,39,38,39,15,1,6, 1,121,15,4,4,7,5,14,6,53,23,2,1,10,42,63, 3,4,87,34,12,5,104,37,46,17,54,30,35,64,35,20, 1,3,17,98,48,30,52,38,46,89,18,6,62,10,11,8, 12,10,9,16,10,15,1,52,25,9,2,137,33,37,220,45, 11,13,60,153,62,61,18,12,31,23,19,20,1,253,10,8, 2,4,60,2,62,21,34,10,50,4,92,41,28,31,145,75, 27,13,26,42,46,26,14,39,21,26,35,4,15,14,72,43, 60,63,43,32,55,30,5,6,61,9,2,2,51,6,21,19, 7,7,1,42,14,16,91,20,5,201,100,24,6,254,74,63, 57,38,9,5,2,2,8,14,0,2,0,64,255,254,2,32, 1,143,0,15,0,32,0,0,37,50,55,54,53,52,39,38, 35,34,7,6,21,20,23,22,19,50,23,22,23,22,21,20, 6,35,34,39,38,53,52,55,54,1,47,84,51,37,75,42, 55,73,52,47,67,49,56,120,69,33,12,7,138,103,102,69, 68,74,70,55,53,38,51,82,39,22,47,44,52,65,44,33, 1,88,71,34,44,26,27,85,114,57,57,85,85,60,57,0, 0,1,0,79,255,254,2,14,1,199,0,29,0,0,1,34, 7,6,15,1,21,20,23,7,38,39,38,53,52,55,54,51, 50,23,22,21,20,7,39,54,53,52,39,38,1,47,76,48, 32,1,2,38,51,35,10,7,61,64,99,97,66,60,67,70, 70,62,45,1,143,68,47,57,56,1,69,76,27,58,56,34, 81,95,64,69,76,71,81,138,91,27,88,114,90,50,30,0, 0,1,0,64,255,254,2,32,1,199,0,27,0,0,1,20, 23,22,51,21,38,53,52,51,50,23,22,21,20,7,6,35, 33,53,33,50,53,52,39,38,35,34,1,56,24,8,10,120, 137,109,43,21,126,42,54,254,254,1,2,153,29,28,39,67, 1,84,25,13,5,57,21,79,115,114,56,74,156,43,14,70, 159,66,49,49,0,2,0,79,255,254,2,32,1,227,0,41, 0,52,0,0,55,34,39,38,53,52,51,50,23,54,53,52, 39,38,35,34,15,1,21,39,54,51,50,21,20,7,20,23, 22,51,54,53,51,20,7,6,35,34,39,38,53,6,39,34, 15,1,20,51,50,53,52,39,38,200,69,34,18,120,52,61, 45,41,18,22,36,16,6,70,14,124,137,69,31,14,16,52, 77,63,26,32,59,38,40,43,44,41,11,2,37,88,39,17, 88,45,22,29,86,52,54,53,61,28,12,31,20,6,30,84, 156,99,74,50,25,11,13,29,73,28,11,32,30,50,22,139, 30,13,36,36,22,15,6,0,0,2,0,12,255,254,2,33, 1,199,0,7,0,58,0,0,37,50,55,52,35,34,21,20, 23,34,39,38,53,52,55,54,55,38,39,38,53,52,51,50, 21,35,55,38,53,38,35,52,35,34,21,20,23,20,23,22, 51,54,55,54,53,52,39,38,39,51,22,21,20,7,22,21, 20,7,6,1,30,46,5,51,52,42,56,34,19,11,7,12, 90,55,40,136,121,72,3,1,1,1,40,85,7,79,58,60, 135,41,24,8,8,1,67,19,174,31,68,26,47,51,56,56, 51,49,38,22,26,26,28,12,24,15,54,38,46,128,107,12, 2,2,9,26,46,13,13,53,37,26,30,65,38,55,19,16, 14,7,26,30,152,63,52,34,67,24,9,0,0,3,0,64, 255,253,2,14,1,199,0,9,0,70,0,80,0,0,55,50, 55,54,53,34,7,6,21,20,1,50,31,1,22,21,20,7, 6,7,20,23,22,23,22,21,20,7,35,54,53,52,39,6, 7,6,7,6,7,39,38,39,38,53,52,55,54,55,52,39, 38,35,34,21,35,52,55,54,51,22,23,22,21,48,55,54, 55,39,52,55,54,23,34,21,20,23,54,55,54,55,38,167, 27,29,21,14,26,52,1,15,62,28,10,3,22,20,43,21, 27,13,21,31,69,31,75,8,68,7,85,28,35,20,39,8, 2,45,38,72,22,21,24,45,58,58,20,25,65,34,19,52, 15,3,16,41,19,24,34,26,44,11,2,2,17,68,54,40, 29,17,35,45,26,1,131,41,21,11,13,28,22,20,29,12, 27,34,22,39,39,49,50,58,52,84,56,4,33,151,46,15, 1,2,12,52,10,10,53,45,35,38,54,45,45,44,70,22, 8,6,79,46,54,16,6,5,72,50,25,11,43,35,15,35, 20,24,5,7,29,0,0,2,0,64,255,254,2,14,1,191, 0,29,0,43,0,0,55,20,23,22,51,33,21,33,34,39, 38,53,52,55,39,55,23,50,23,22,21,6,7,6,35,34, 39,38,39,6,55,52,39,38,35,34,7,20,23,22,51,50, 55,54,140,61,23,27,1,19,254,220,95,47,28,103,27,69, 9,117,48,23,10,62,23,25,57,25,34,22,8,199,50,20, 18,75,19,52,36,25,33,25,11,145,51,19,7,70,66,38, 52,109,64,114,6,120,55,26,35,47,18,6,5,6,25,18, 69,27,15,6,27,24,24,16,23,10,0,1,0,96,255,254, 2,32,1,199,0,31,0,0,1,34,7,6,21,35,52,51, 50,23,22,21,6,15,1,6,21,20,23,22,51,33,21,33, 34,53,52,63,1,54,53,52,1,14,40,10,2,72,124,67, 34,18,3,58,106,56,51,16,18,1,37,254,219,155,59,108, 59,1,135,26,5,5,100,44,23,33,59,48,69,38,31,38, 13,4,57,112,59,42,59,33,37,51,0,1,0,64,255,254, 2,14,1,199,0,47,0,0,1,52,55,54,59,1,21,35, 34,21,20,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,51,50,23,22,21,39,52,39,38,35,34,7,6,21,20, 51,50,55,54,53,52,39,38,1,98,43,20,24,85,45,76, 52,52,67,65,91,137,56,29,34,33,51,70,29,14,61,31, 10,11,51,13,3,171,73,43,39,43,44,1,113,48,26,12, 56,32,16,65,62,40,76,54,56,102,53,74,65,38,39,56, 26,32,7,33,14,4,66,17,19,149,40,34,48,33,54,51, 0,2,0,80,255,254,2,14,1,199,0,7,0,47,0,0, 37,52,35,34,21,22,51,50,39,50,23,22,23,20,7,6, 35,34,39,6,21,20,23,22,51,50,55,21,34,39,38,53, 52,55,38,53,52,55,54,51,33,21,33,34,21,20,23,54, 1,66,61,79,23,42,75,52,65,25,10,1,51,24,26,58, 64,11,64,33,40,3,26,101,60,62,35,35,77,23,29,1, 61,254,185,65,14,64,240,30,52,16,111,44,18,24,43,20, 10,37,22,19,56,27,14,2,57,45,44,67,56,30,41,74, 73,21,6,56,60,23,33,30,0,2,0,60,0,104,1,143, 1,188,0,15,0,32,0,0,19,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,19,50,55,54,53,52,47,1, 38,35,34,7,6,21,20,23,22,227,85,51,36,49,48,70, 82,52,38,61,46,59,65,37,23,51,25,20,23,51,37,38, 50,31,1,188,64,45,59,70,50,52,63,47,61,81,51,37, 254,222,53,32,41,63,35,13,8,35,34,51,65,37,23,0, 0,4,0,7,0,50,0,210,2,13,0,14,0,30,0,48, 0,64,0,0,55,50,23,22,21,20,7,6,35,34,47,1, 52,55,54,23,52,39,38,35,34,7,6,21,20,23,22,51, 50,55,54,19,20,7,6,35,34,39,38,39,52,53,52,55, 54,51,50,23,22,7,52,39,38,35,34,7,6,21,20,23, 22,51,50,55,54,105,58,31,16,28,27,40,42,31,32,43, 23,106,40,17,20,29,19,19,40,17,20,37,20,10,26,43, 22,28,46,30,30,2,43,22,28,60,31,17,23,52,17,21, 25,17,18,41,17,21,44,19,8,250,46,24,31,41,28,30, 29,72,54,29,16,98,43,21,9,22,27,25,43,20,8,36, 17,1,34,55,28,15,29,26,27,6,12,57,28,15,46,25, 29,51,18,6,23,26,27,45,21,9,40,17,0,3,0,31, 255,12,2,123,2,108,0,70,0,86,0,103,0,0,1,20, 7,6,35,34,47,1,17,50,55,7,6,7,21,6,15,1, 34,39,53,35,34,39,38,53,52,55,54,51,23,50,23,50, 23,52,47,2,34,7,6,35,34,39,38,53,52,55,54,55, 50,23,22,31,2,22,23,54,55,54,55,22,23,6,21,23, 22,23,22,5,20,23,22,51,31,1,50,55,17,38,35,7, 6,7,6,37,50,55,54,53,52,39,38,53,55,52,55,6, 15,1,21,22,2,123,44,23,27,24,19,27,37,63,5,38, 56,3,6,9,19,8,91,120,88,97,118,76,108,32,14,25, 5,15,22,58,16,24,42,39,36,34,12,4,65,29,33,39, 42,48,21,16,23,5,2,23,102,7,8,7,9,27,1,6, 21,18,254,54,67,55,71,22,29,3,2,32,24,34,84,45, 30,1,115,33,14,4,14,32,1,5,47,16,21,25,1,142, 52,29,15,10,18,254,219,42,34,40,5,213,24,4,3,30, 214,59,64,107,139,65,43,1,7,5,38,22,31,1,36,36, 29,9,10,56,23,7,2,15,19,23,20,40,12,13,78,47, 4,3,8,24,42,20,10,17,38,29,185,90,60,48,1,1, 1,1,134,7,3,15,73,48,46,34,10,12,22,20,50,19, 22,8,15,47,25,44,60,36,0,2,0,36,255,14,2,187, 2,99,0,141,0,162,0,0,5,20,15,1,35,38,47,1, 34,7,6,15,1,20,31,1,22,51,55,54,55,54,53,52, 39,38,39,38,47,1,38,39,38,39,53,22,51,50,51,23, 55,54,55,54,55,54,55,54,53,52,47,1,38,39,38,47, 1,34,7,6,15,1,21,20,31,1,22,51,50,63,1,7, 34,39,38,53,52,55,54,51,50,23,22,21,20,7,6,7, 6,35,34,39,38,53,52,55,54,55,54,55,54,51,23,51, 22,23,22,23,22,29,1,6,7,6,7,6,7,6,7,22, 23,22,23,22,21,20,7,6,35,34,39,38,39,38,53,52, 55,54,51,50,23,22,19,52,39,38,35,34,7,6,7,20, 21,20,23,22,31,2,51,50,55,54,1,144,27,18,2,19, 10,9,18,11,3,1,2,30,31,20,19,17,50,31,18,13, 14,11,23,63,7,108,45,13,30,88,99,5,6,41,29,49, 67,11,7,29,31,19,78,32,30,33,30,37,82,167,46,18, 3,1,104,26,46,27,30,36,25,23,66,39,26,63,26,35, 90,33,15,76,12,17,51,46,36,45,176,90,27,34,97,26, 26,27,42,1,66,71,100,33,23,24,73,22,29,8,9,39, 51,34,27,24,3,1,86,31,40,30,18,62,29,15,37,23, 38,31,24,25,57,58,19,23,37,28,24,1,45,8,8,19, 18,1,52,26,13,71,20,11,4,2,6,3,21,5,4,16, 27,21,15,5,1,8,41,24,28,24,17,22,8,23,12,1, 9,17,5,14,10,22,1,2,9,39,7,5,23,53,34,41, 92,64,23,17,8,7,5,4,65,25,35,13,10,101,53,13, 15,14,12,2,52,34,45,79,31,13,69,29,39,76,49,8, 9,27,14,50,175,131,69,20,12,26,3,4,1,9,37,58, 72,50,68,34,134,65,20,17,4,5,21,11,9,30,44,23, 7,6,74,39,15,7,17,48,25,27,39,37,20,14,12,1, 72,70,22,7,27,27,28,4,7,48,33,6,4,7,1,44, 22,0,0,6,0,30,255,254,3,18,3,106,0,16,0,32, 0,87,0,122,0,139,0,155,0,0,1,52,55,54,51,50, 31,1,22,21,20,7,6,35,34,39,38,55,52,39,38,35, 34,7,6,21,20,23,22,51,50,55,54,1,52,55,54,63, 1,54,55,54,63,1,54,55,54,63,1,50,23,15,1,6, 7,6,7,6,7,51,50,23,50,23,22,23,22,23,22,23, 22,21,22,21,20,7,6,7,6,35,39,34,39,38,39,38, 39,38,55,22,31,2,50,55,54,55,54,55,54,55,54,55, 53,52,39,38,39,38,43,1,34,7,6,7,6,7,6,7, 6,7,20,23,1,20,7,6,35,34,39,38,53,52,55,54, 55,50,31,1,22,7,52,39,38,35,34,7,6,21,20,23, 22,51,50,55,54,1,91,38,17,20,49,23,8,2,39,18, 21,43,24,12,129,28,12,13,28,12,5,31,8,10,35,11, 3,254,66,121,19,22,195,32,26,69,21,81,15,15,26,28, 21,35,12,1,9,12,25,46,68,120,88,32,17,10,16,36, 65,42,41,40,12,5,7,2,11,10,51,97,158,58,74,76, 60,30,8,15,46,98,38,71,51,86,64,22,26,18,62,59, 5,5,40,4,51,59,107,21,20,29,94,59,15,19,39,20, 20,30,12,4,32,2,162,39,18,21,43,24,12,21,29,25, 49,23,8,2,28,28,12,13,28,12,5,31,8,10,35,11, 3,2,247,47,22,9,41,22,9,9,44,23,11,39,19,20, 27,16,7,27,10,11,36,12,3,31,9,254,22,152,84,13, 12,91,16,16,45,20,79,15,22,36,12,4,38,24,29,31, 26,49,33,48,19,2,9,14,30,27,57,17,13,19,3,5, 11,111,49,42,62,108,3,33,27,38,10,22,67,5,48,17, 5,2,5,3,8,26,53,4,5,46,63,11,70,48,51,12, 3,27,6,11,20,23,17,44,16,58,53,42,1,104,44,23, 11,39,19,23,31,24,22,1,41,22,9,9,27,16,7,27, 10,11,36,12,3,31,9,0,0,1,0,19,254,184,3,10, 2,91,0,80,0,0,1,34,39,38,47,1,54,55,23,51, 50,23,22,23,22,23,7,21,35,39,34,7,6,7,6,7, 6,7,6,21,20,23,22,23,22,51,50,55,54,55,54,55, 54,55,52,39,55,22,21,7,20,7,6,7,6,35,34,39, 36,3,52,55,54,55,54,55,54,55,54,51,23,55,52,39, 38,47,1,34,15,1,6,1,131,43,19,6,1,2,9,99, 51,3,39,27,28,40,52,3,1,212,19,91,48,7,7,60, 24,9,9,13,45,44,88,46,51,45,33,157,65,3,3,5, 1,84,12,97,3,49,60,104,82,40,77,71,255,0,17,29, 37,58,26,41,31,22,55,81,237,4,46,15,16,29,37,46, 42,6,1,232,20,6,6,22,57,3,3,13,10,28,33,73, 21,29,1,26,4,4,39,57,22,32,56,50,125,87,97,41, 21,11,38,201,9,9,36,44,149,68,18,97,158,58,76,85, 106,41,22,29,88,1,78,68,58,80,40,18,19,13,5,4, 1,12,47,26,8,3,3,17,18,3,0,2,0,37,255,252, 2,240,3,39,0,82,0,95,0,0,1,52,55,38,47,1, 22,23,22,23,22,23,22,21,16,7,6,35,34,39,38,53, 52,55,54,55,35,34,53,52,55,54,51,33,52,39,38,47, 1,34,7,6,35,34,39,38,47,1,52,55,54,51,50,23, 39,6,7,34,7,6,21,23,22,23,22,51,50,55,54,53, 52,39,38,39,6,7,6,35,34,39,38,39,38,23,22,51, 50,55,38,39,38,39,6,21,20,23,1,150,48,31,8,5, 85,70,48,71,20,23,25,219,61,78,146,97,114,95,2,3, 66,16,11,2,2,1,15,15,14,33,14,15,52,26,21,34, 9,3,3,1,61,24,25,146,17,76,17,16,72,55,53,1, 12,99,54,144,171,87,61,7,6,23,39,62,20,16,81,42, 1,2,9,76,42,44,41,44,56,11,41,69,26,21,2,129, 54,64,19,11,18,18,58,38,95,27,54,68,49,254,192,66, 18,62,72,130,109,60,1,2,16,12,4,1,27,24,23,11, 1,35,16,19,7,9,12,39,16,7,172,1,1,1,42,39, 67,15,91,31,15,89,63,96,61,29,36,39,34,14,5,89, 3,4,26,32,45,38,84,9,44,32,35,43,46,26,0,3, 0,32,0,0,3,14,3,58,0,14,0,129,0,179,0,0, 1,34,7,6,7,20,23,22,51,50,63,1,52,39,38,7, 52,39,38,35,34,15,1,6,7,6,21,20,23,22,59,1, 50,55,54,55,54,55,54,53,20,23,22,31,1,50,55,54, 55,54,55,23,6,7,6,7,6,7,6,35,34,39,38,39, 38,39,6,15,1,6,35,34,39,38,53,52,55,54,63,2, 50,23,22,23,20,7,6,21,20,23,22,51,50,55,54,53, 52,39,38,39,22,21,20,7,6,35,34,39,38,53,52,55, 54,51,50,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,5,54,53,52,61,1,39,52,39,38,39,38,39,38,39, 38,39,38,7,34,15,1,34,7,6,7,6,7,39,54,59, 1,50,23,22,23,22,23,22,23,22,23,22,23,22,21,20, 15,1,39,1,153,34,18,6,1,30,15,17,25,17,17,19, 17,173,23,8,7,15,12,28,56,24,13,52,52,69,19,61, 34,9,12,20,9,2,27,27,34,39,68,32,35,43,9,8, 40,11,53,24,34,13,24,22,26,46,30,30,30,7,9,11, 1,8,49,107,109,59,42,87,16,20,35,34,46,17,2,2, 12,27,110,21,22,132,18,3,18,19,34,13,24,22,33,60, 30,15,51,24,29,72,53,43,74,45,56,104,55,35,21,22, 1,189,22,4,5,3,12,40,33,31,83,30,58,44,49,18, 17,24,15,13,65,27,30,51,19,118,120,38,83,54,35,22, 54,69,17,9,26,33,41,4,1,22,40,12,2,26,31,11, 16,33,20,10,17,43,23,18,20,32,18,9,3,5,8,15, 74,51,82,67,46,47,20,6,8,14,25,6,5,15,30,26, 4,1,22,22,70,21,30,1,127,97,45,22,8,8,6,12, 15,37,8,38,33,1,11,65,114,82,111,158,62,12,9,15, 7,50,8,8,12,18,38,21,62,12,2,80,14,16,14,27, 28,10,19,33,34,26,27,42,20,26,52,26,12,51,42,52, 71,38,23,55,34,49,15,27,28,248,34,92,34,2,46,29, 19,15,12,23,85,33,34,43,14,18,11,1,1,1,4,7, 10,6,30,27,65,16,8,14,24,60,15,11,26,61,84,92, 19,22,84,48,80,66,0,2,0,35,0,0,3,145,2,89, 0,32,0,139,0,0,37,50,55,54,53,52,39,38,47,1, 6,7,6,7,23,48,23,22,59,1,54,55,54,55,54,53, 20,23,22,23,22,23,22,55,20,7,6,7,34,47,1,7, 6,7,6,35,34,39,38,39,38,35,34,7,6,35,39,38, 39,54,55,54,55,54,55,52,39,38,39,38,35,34,15,1, 6,35,34,39,38,53,39,52,55,54,51,50,23,22,23,22, 23,54,55,54,51,50,23,22,23,22,23,22,21,20,7,6, 15,2,6,43,1,34,47,1,23,51,50,55,54,55,54,55, 54,53,52,39,38,35,34,7,6,7,50,23,22,23,22,23, 22,1,243,67,31,15,117,58,47,55,72,42,55,54,69,49, 13,8,25,53,29,4,5,10,21,4,6,18,20,21,202,66, 35,53,86,46,7,11,23,44,30,26,42,35,21,16,4,27, 9,13,5,9,9,6,4,72,88,42,58,9,1,25,4,4, 13,23,39,23,20,6,61,35,16,7,1,51,51,68,20,11, 56,22,12,15,50,40,63,57,151,107,31,23,11,9,30,20, 21,44,45,31,44,39,13,17,18,6,15,16,35,20,55,33, 7,4,10,78,77,111,65,22,26,54,73,80,5,5,88,26, 15,138,69,34,42,78,51,28,12,1,47,53,69,96,44,14, 3,10,46,7,9,27,29,45,28,5,7,18,8,6,131,160, 70,38,1,114,26,30,51,35,24,50,34,51,16,25,18,3, 4,8,164,92,44,44,6,16,29,19,3,2,7,53,94,47, 30,12,14,13,66,52,54,4,13,28,16,35,38,27,36,83, 25,30,14,15,52,65,92,54,65,34,33,17,21,5,24,1, 7,14,67,13,14,41,73,112,84,83,7,6,40,45,3,3, 46,51,29,0,0,3,0,28,0,0,3,14,3,58,0,19, 0,92,0,142,0,0,37,52,39,38,35,34,7,6,7,6, 21,20,23,22,23,22,51,50,55,54,55,20,7,6,35,34, 39,38,53,52,55,54,51,50,23,22,21,20,7,6,15,1, 22,51,55,54,55,54,55,54,55,54,55,23,6,7,6,7, 6,35,34,35,34,39,7,39,63,1,54,55,54,53,52,39, 38,35,34,7,6,7,6,21,20,23,54,55,54,55,54,51, 50,23,22,37,54,53,52,61,1,39,52,39,38,39,38,39, 38,39,38,39,38,7,34,15,1,34,7,6,7,6,7,39, 54,59,1,50,23,22,23,22,23,22,23,22,23,22,23,22, 21,20,15,1,39,1,0,38,17,20,38,15,22,2,1,50, 2,2,17,16,35,21,10,26,40,23,29,92,44,26,66,66, 102,134,64,41,13,7,38,35,20,44,43,55,48,9,10,39, 44,9,8,40,10,10,24,96,42,40,3,8,89,64,75,16, 32,65,9,20,18,11,50,125,97,53,11,12,18,16,16,31, 11,10,11,19,39,30,32,1,169,22,4,5,3,12,40,33, 31,83,30,58,44,49,18,17,24,15,13,65,27,30,51,19, 118,120,38,83,54,35,22,54,69,17,9,26,33,41,4,1, 22,40,12,101,43,21,9,20,30,14,4,4,46,23,1,1, 5,37,18,19,51,31,18,100,59,77,103,81,80,83,54,77, 46,49,27,50,36,9,3,10,47,8,11,41,74,21,30,1, 108,28,95,58,23,64,65,16,30,67,9,41,41,29,24,19, 85,53,12,15,24,44,47,28,29,20,7,2,5,31,29,109, 34,92,34,2,46,29,19,15,12,23,85,33,34,43,14,18, 11,1,1,1,4,7,10,6,30,27,65,16,8,14,24,60, 15,11,26,61,84,92,19,22,84,48,80,66,0,1,0,63, 0,6,3,164,2,92,0,111,0,0,19,52,55,54,51,50, 23,22,23,21,38,39,35,6,7,6,21,23,20,23,22,23, 22,23,22,59,1,54,55,54,55,54,53,38,39,6,7,38, 39,52,55,54,55,54,55,54,51,50,23,22,21,7,20,7, 6,7,6,7,6,35,34,47,1,55,31,1,50,51,55,50, 55,54,55,54,55,52,39,38,39,38,39,38,35,34,7,6, 15,1,20,23,54,55,50,23,22,23,22,21,20,7,6,35, 34,35,39,38,39,38,39,38,39,38,63,93,70,107,38,19, 32,40,73,18,28,146,52,22,1,60,9,11,30,42,40,38, 31,83,20,6,4,45,4,73,16,38,8,1,11,8,34,30, 52,71,57,119,78,69,1,7,8,24,42,54,56,77,21,40, 33,1,47,29,1,1,13,37,26,19,31,57,1,13,22,81, 14,14,33,52,93,50,18,8,3,2,20,23,73,41,6,4, 13,48,71,122,4,4,10,102,19,66,54,17,10,23,1,44, 154,82,62,4,3,13,32,16,1,11,96,41,55,22,80,51, 7,8,22,19,13,14,10,3,3,24,39,74,13,2,12,40, 26,42,28,28,41,29,29,37,90,80,112,52,13,26,43,35, 71,38,36,12,12,20,17,3,1,17,12,31,64,105,77,39, 75,44,7,6,13,67,24,29,45,13,12,6,1,60,9,9, 35,42,63,49,66,2,19,8,25,72,23,22,54,0,0,4, 0,30,255,255,3,14,3,58,0,15,0,34,0,98,0,148, 0,0,19,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,23,20,15,1,55,54,51,54,55,54,55,52,47,1, 34,7,50,23,22,55,20,15,1,34,7,6,21,20,23,22, 51,50,63,1,54,55,54,55,20,23,22,23,22,51,50,55, 54,55,54,55,23,6,7,6,35,34,39,6,7,34,35,34, 39,38,39,52,53,52,55,54,55,35,34,39,38,53,52,55, 54,51,22,23,22,1,54,53,52,61,1,39,52,39,38,39, 38,39,38,39,38,39,38,7,34,15,1,34,7,6,7,6, 7,39,54,59,1,50,23,22,23,22,23,22,23,22,23,22, 23,22,21,20,15,1,39,95,30,11,3,26,10,11,35,11, 3,29,11,60,12,11,124,7,7,30,5,1,3,68,107,17, 14,27,17,8,181,91,34,72,41,44,57,39,87,40,25,14, 43,9,2,1,34,22,35,28,40,66,35,36,41,9,8,40, 11,50,47,104,107,74,50,100,6,6,84,56,48,4,52,12, 18,23,36,16,6,103,19,22,107,26,40,1,103,22,4,5, 3,12,40,33,31,83,30,58,44,49,18,17,24,15,13,65, 27,30,51,19,118,120,38,83,54,35,22,54,69,17,9,26, 33,41,4,1,22,40,12,1,253,28,8,9,32,12,5,31, 9,9,27,13,5,43,33,11,8,20,1,6,17,4,17,30, 11,3,2,28,13,6,73,8,2,37,37,57,80,32,19,16, 10,36,33,6,6,37,25,13,15,9,23,21,70,21,30,1, 127,96,89,95,90,6,71,64,79,10,10,84,53,12,15,37, 15,16,73,14,2,7,12,15,254,241,34,92,34,2,46,29, 19,15,12,23,85,33,34,43,14,18,11,1,1,1,4,7, 10,6,30,27,65,16,8,14,24,60,15,11,26,61,84,92, 19,22,84,48,80,66,0,2,0,35,0,10,2,253,3,58, 0,84,0,126,0,0,19,20,23,22,51,50,55,54,63,1, 54,55,54,55,54,55,51,21,6,49,20,7,6,7,6,7, 6,35,34,39,38,39,38,39,38,47,1,52,55,54,55,54, 55,54,55,39,38,53,52,55,5,52,39,38,35,34,7,6, 7,6,49,7,34,39,38,53,52,55,54,55,23,50,23,22, 23,22,23,22,21,35,34,7,6,7,6,37,38,39,52,39, 38,39,38,39,38,39,38,39,38,7,34,15,1,34,7,6, 7,6,7,39,54,59,1,50,23,22,23,22,23,22,23,22, 23,22,23,22,23,94,204,28,35,49,68,19,32,38,16,22, 67,29,9,8,47,2,9,11,26,39,104,70,100,56,46,51, 57,48,44,46,13,3,2,4,33,5,3,16,29,89,8,30, 1,40,51,32,31,33,11,6,30,8,21,29,9,3,47,34, 25,30,25,54,41,20,2,3,16,71,73,40,66,34,16,2, 114,4,7,5,3,12,40,33,31,83,30,58,44,49,18,17, 24,15,13,65,27,30,51,19,118,120,38,83,54,35,22,54, 69,17,9,43,34,14,5,3,1,1,70,113,45,5,11,4, 12,15,5,15,38,70,21,28,33,12,13,25,40,53,85,68, 43,10,9,25,20,50,49,49,62,20,21,29,35,5,3,13, 12,1,5,12,10,4,1,42,29,18,17,19,13,3,2,24, 7,7,37,16,8,3,3,27,23,33,4,5,31,42,8,8, 41,19,17,86,38,19,15,12,23,85,33,34,43,14,18,11, 1,1,1,4,7,10,6,30,27,65,16,8,14,24,60,15, 11,42,87,33,27,20,95,0,0,4,0,32,0,0,3,103, 3,37,0,14,0,29,0,37,0,140,0,0,1,34,15,1, 22,23,22,51,50,63,2,52,39,38,23,50,23,54,55,52, 39,34,7,6,21,51,50,23,50,39,52,55,54,55,6,15, 1,1,50,23,7,20,7,6,7,6,7,55,22,23,22,21, 6,7,22,23,22,21,20,7,6,15,1,34,39,38,53,52, 55,54,63,1,54,51,23,52,39,38,39,34,7,6,7,6, 35,39,38,39,52,55,54,51,23,50,23,22,23,22,21,7, 38,43,1,34,7,6,21,20,23,22,23,22,23,32,53,52, 47,1,38,39,6,7,34,35,34,39,38,39,35,52,55,54, 55,54,55,54,55,52,55,54,2,110,56,7,1,4,43,16, 18,24,15,27,3,61,12,42,10,26,6,1,93,53,10,5, 39,20,16,18,128,15,4,7,37,16,12,1,87,36,7,3, 10,36,61,121,21,30,25,25,59,1,6,58,17,12,129,98, 84,85,162,117,131,85,25,28,25,34,56,89,50,22,13,15, 24,18,47,33,11,17,21,7,64,36,38,22,48,33,40,19, 9,3,129,9,11,93,50,31,133,28,37,63,98,1,105,27, 19,6,7,23,62,6,5,65,35,11,5,70,15,24,68,61, 124,25,6,31,7,1,216,27,7,44,17,6,11,32,14,34, 8,2,18,8,22,12,67,10,33,15,48,2,3,47,21,5, 9,16,33,33,1,87,39,26,7,10,35,28,57,21,1,2, 12,33,64,16,22,45,41,30,75,113,71,51,6,2,75,84, 137,91,44,13,6,4,6,1,54,22,7,1,9,9,27,13, 2,8,35,37,22,12,1,21,19,46,22,24,39,1,50,31, 43,107,34,7,5,6,1,121,80,32,17,5,4,64,6,56, 19,22,48,30,45,24,56,53,11,49,42,12,3,0,0,2, 0,32,0,0,3,75,3,34,0,11,0,130,0,0,1,50, 55,52,39,38,35,15,1,20,23,22,19,20,15,1,6,7, 6,7,6,7,54,55,50,23,22,21,20,7,6,7,6,35, 34,39,38,39,38,53,52,55,6,7,6,7,51,23,50,23, 22,23,22,23,22,21,20,7,6,35,34,39,38,53,52,55, 54,63,1,54,51,23,38,39,34,7,6,7,6,35,39,38, 39,52,55,54,51,23,50,23,22,23,22,21,20,21,38,43, 1,34,7,6,21,20,23,22,23,22,23,50,55,54,53,52, 39,38,47,1,52,55,54,63,1,54,63,1,54,55,50,23, 22,2,110,48,5,30,11,12,53,1,31,11,233,41,69,47, 16,49,23,6,6,19,22,35,24,13,4,16,30,10,12,30, 14,2,3,30,5,27,20,21,1,65,59,33,28,33,25,66, 19,14,123,112,149,162,117,131,85,25,28,25,34,56,89,5, 80,15,24,18,47,33,11,17,21,7,64,36,38,22,48,33, 29,24,12,129,9,11,93,50,31,133,28,37,63,98,110,46, 195,39,31,59,213,63,21,25,9,58,68,44,22,19,43,18, 6,1,230,52,34,15,5,44,11,32,14,5,1,10,34,16, 10,9,8,16,32,9,12,7,1,37,20,22,15,8,40,8, 2,11,1,3,21,41,14,15,13,24,49,21,1,5,3,17, 43,44,31,43,126,78,70,75,84,137,91,44,13,6,4,6, 1,75,9,9,9,27,13,2,8,35,37,22,12,1,21,14, 37,25,53,8,13,1,50,31,43,107,34,7,5,6,1,7, 20,121,49,39,31,15,2,93,51,17,8,23,126,29,18,6, 1,28,10,0,0,3,0,25,255,48,4,194,2,97,0,33, 0,182,0,217,0,0,37,50,55,54,53,52,39,38,39,38, 35,34,7,6,7,6,7,54,55,50,23,22,23,50,55,54, 55,54,55,54,55,31,1,22,3,50,23,22,23,22,31,1, 54,55,54,55,50,31,1,54,55,50,23,22,23,22,21,20, 15,1,38,35,7,34,7,6,7,6,21,20,23,22,23,22, 23,55,50,63,1,23,7,6,35,34,39,38,53,52,55,54, 55,54,51,63,1,22,23,38,47,1,38,35,34,6,35,34, 39,38,39,38,53,38,35,34,7,6,7,23,50,23,22,23, 22,23,22,21,20,7,6,7,6,15,1,6,35,34,39,38, 53,20,7,6,35,34,39,38,39,38,35,7,6,15,1,39, 54,55,54,55,52,39,38,39,7,6,15,2,6,15,1,20, 7,6,7,6,35,34,39,38,53,52,55,54,1,54,55,54, 55,23,6,7,6,7,6,7,23,22,23,22,23,55,50,55, 54,63,1,21,6,7,34,39,38,39,38,53,52,55,54,1, 213,66,35,20,93,16,21,52,42,29,33,116,87,10,10,11, 30,9,61,18,13,13,6,64,24,3,2,15,1,3,16,35, 205,19,17,45,30,2,10,5,79,92,46,71,83,86,79,28, 97,63,51,51,21,43,1,1,30,45,100,74,54,52,30,18, 12,12,54,73,94,20,8,59,35,10,77,60,73,83,106,135, 69,69,90,37,95,42,58,34,39,8,51,36,28,42,22,82, 16,16,19,3,1,10,81,149,88,51,48,95,35,17,12,26, 33,134,28,6,51,2,1,27,26,30,9,10,21,48,57,46, 31,35,24,28,28,29,19,23,23,3,3,8,27,58,97,49, 75,12,12,23,19,14,12,26,6,1,3,2,10,30,26,7, 8,34,16,6,58,45,3,84,29,109,20,35,10,28,72,4, 3,28,4,1,1,1,15,60,12,8,26,3,2,12,62,59, 20,15,21,34,10,4,5,150,45,25,33,89,58,10,11,27, 10,91,150,19,19,5,5,16,5,2,2,16,39,4,4,37, 13,22,28,61,1,193,5,6,38,3,37,12,70,23,11,7, 20,19,33,4,21,22,20,34,60,9,9,22,7,4,23,24, 62,42,35,29,40,42,30,41,9,1,12,11,18,24,18,56, 69,97,106,57,54,9,4,1,1,2,7,66,20,9,6,60, 24,3,2,14,21,29,20,16,74,1,4,3,16,57,112,26, 28,100,65,2,2,38,9,5,1,30,36,36,48,33,21,25, 26,45,37,9,2,4,22,6,163,104,52,59,12,26,24,8, 1,4,12,30,12,2,55,16,9,10,37,6,1,37,15,16, 80,54,42,253,96,68,46,8,13,18,9,40,2,2,22,42, 25,3,3,51,5,1,9,1,1,6,23,40,3,5,4,39, 17,21,13,9,15,0,0,3,0,38,255,48,4,192,2,97, 0,23,0,143,0,178,0,0,1,52,39,38,47,2,34,7, 6,29,1,22,23,52,63,1,54,55,54,55,54,55,54,37, 50,23,22,23,22,21,20,15,1,38,35,15,1,34,7,6, 7,6,7,6,21,20,23,22,23,22,23,55,50,63,1,23, 7,6,35,34,39,38,53,52,55,54,55,54,51,54,55,50, 23,38,47,1,38,35,34,6,35,34,39,38,35,7,34,7, 6,21,31,1,22,23,20,7,6,35,34,39,38,53,52,55, 54,51,50,23,22,21,20,7,6,7,6,21,20,23,22,23, 22,23,22,59,1,50,55,54,53,52,39,38,35,34,7,52, 55,54,51,50,31,1,54,19,54,55,54,55,23,6,7,6, 7,6,7,23,22,23,22,23,55,50,55,54,63,1,21,6, 7,34,39,38,39,38,53,52,55,54,1,73,33,7,7,22, 19,71,44,47,2,24,3,19,23,30,8,10,73,12,46,2, 145,87,73,16,11,43,1,1,41,42,40,23,15,12,85,42, 60,27,18,12,12,54,73,94,20,8,59,35,10,77,60,73, 83,106,135,67,68,90,38,100,37,27,50,58,8,51,36,28, 42,22,82,16,22,26,48,35,94,75,68,69,23,31,109,4, 99,82,108,127,88,90,50,56,87,18,8,122,66,152,11,6, 10,18,55,42,79,3,4,14,93,64,52,45,26,37,21,18, 73,67,100,78,62,52,30,99,29,109,20,35,10,28,72,4, 3,28,4,1,1,1,15,60,12,8,26,3,2,12,62,59, 20,15,21,34,10,4,5,1,253,31,19,4,2,5,1,65, 62,87,19,31,58,41,18,49,47,18,5,5,19,5,19,133, 44,10,10,34,60,9,9,22,10,2,1,4,12,18,27,58, 42,35,29,40,42,30,41,9,1,12,11,18,24,18,56,69, 97,111,55,56,10,4,2,2,11,66,20,9,6,60,42,12, 4,60,58,79,1,8,32,71,106,66,55,90,92,123,112,91, 101,2,21,80,46,33,69,47,31,21,27,24,54,25,19,7, 1,47,38,53,34,21,12,4,133,87,79,17,13,36,253,87, 68,46,8,13,18,9,40,2,2,22,42,25,3,3,51,5, 1,9,1,1,6,23,40,3,5,4,39,17,21,13,9,15, 0,2,0,43,0,0,3,6,3,58,0,49,0,97,0,0, 19,20,33,50,55,54,55,54,55,54,55,51,20,7,6,15, 1,6,7,6,7,34,35,34,39,38,61,1,55,52,55,54, 55,54,59,1,22,23,22,23,21,38,35,34,7,6,7,6, 7,6,37,54,53,52,39,52,39,38,39,38,39,38,47,1, 38,39,38,39,38,7,34,15,1,34,7,6,7,6,7,39, 54,59,1,50,23,22,23,22,23,22,23,22,23,22,21,7, 20,7,92,1,32,81,58,38,48,39,29,35,11,47,12,19, 39,4,13,21,115,151,4,5,104,106,130,1,10,46,94,20, 24,31,21,23,40,17,47,59,48,33,25,18,15,17,16,2, 115,9,2,5,3,12,22,16,28,36,16,28,42,30,58,44, 49,18,17,24,15,13,65,27,30,51,19,118,120,38,83,54, 35,22,53,71,16,9,30,31,36,3,10,1,58,148,19,10, 30,21,36,47,51,45,36,68,64,7,20,21,115,4,56,67, 99,31,66,15,24,107,17,4,1,3,7,10,25,19,12,9, 17,13,30,33,22,37,41,21,19,19,15,12,23,47,25,46, 27,12,18,22,14,18,11,1,1,1,4,7,10,6,30,27, 65,16,8,14,24,61,14,10,33,59,72,28,64,21,40,0, 0,2,0,28,0,0,3,18,3,42,0,88,0,105,0,0, 55,34,39,38,47,1,52,55,54,55,54,55,21,34,7,6, 7,6,21,20,31,1,22,51,50,55,54,55,54,53,20,23, 22,23,22,23,22,51,50,55,54,55,54,61,1,38,39,6, 7,6,35,34,39,38,39,38,53,52,55,38,39,38,47,1, 22,23,22,23,22,23,22,29,1,7,6,7,6,7,6,7, 6,35,34,39,38,39,15,1,6,19,22,23,22,51,50,55, 54,55,54,55,38,39,38,39,7,6,247,108,65,31,12,3, 91,40,50,38,35,25,42,33,50,65,82,44,21,24,66,59, 11,14,13,30,4,5,36,33,23,35,83,49,29,4,6,13, 53,26,42,35,30,41,36,46,15,4,34,39,11,4,2,6, 34,120,51,48,75,45,44,4,10,16,22,55,19,18,36,54, 42,24,37,40,7,14,54,97,8,56,28,34,29,36,24,7, 1,2,68,124,4,5,12,12,1,109,53,67,42,121,72,32, 14,7,2,22,10,4,49,60,73,84,49,20,6,62,11,26, 42,26,64,32,4,5,36,12,9,58,33,42,57,33,36,86, 65,31,19,13,21,29,56,17,17,49,59,19,16,6,7,19, 14,66,30,42,68,82,82,95,29,31,80,36,52,51,18,10, 24,18,28,70,17,21,77,2,142,72,31,16,15,14,7,2, 2,86,62,3,2,25,29,0,0,2,0,30,0,0,3,14, 3,58,0,77,0,127,0,0,37,20,7,6,35,34,39,38, 53,52,55,54,55,35,53,33,52,39,38,39,38,39,38,35, 34,7,6,35,34,39,38,53,52,55,54,51,50,23,22,21, 7,39,34,7,6,21,23,22,23,22,31,1,50,55,54,53, 20,23,22,59,1,55,50,55,54,55,54,55,23,6,7,6, 7,6,35,34,39,38,37,54,53,52,61,1,39,52,39,38, 39,38,39,38,39,38,39,38,7,34,15,1,34,7,6,7, 6,7,39,54,59,1,50,23,22,23,22,23,22,23,22,23, 22,23,22,21,20,15,1,39,1,127,64,43,48,83,57,58, 14,16,48,72,1,70,26,3,3,23,18,9,12,29,33,36, 28,13,15,11,72,19,22,21,6,145,1,213,51,30,13,3, 17,124,10,11,24,53,32,27,56,21,30,26,28,66,35,36, 41,9,8,40,8,56,15,56,44,60,71,48,36,1,68,22, 4,5,3,12,40,33,31,83,30,58,44,49,18,17,24,15, 13,65,27,30,51,19,118,120,38,83,54,35,22,54,69,17, 9,26,33,41,4,1,22,40,12,115,55,36,24,72,73,95, 59,37,34,34,27,47,30,3,3,23,3,1,37,36,12,14, 16,57,15,4,2,15,133,37,1,60,39,24,27,87,20,2, 1,1,32,27,29,50,23,6,1,23,21,70,21,30,1,118, 106,32,34,23,43,32,175,34,92,34,2,46,29,19,15,12, 23,85,33,34,43,14,18,11,1,1,1,4,7,10,6,30, 27,65,16,8,14,24,60,15,11,26,61,84,92,19,22,84, 48,80,66,0,0,2,0,19,0,0,3,22,3,42,0,113, 0,130,0,0,37,50,55,54,63,1,54,53,20,23,22,23, 22,23,22,23,50,55,54,61,1,38,39,6,7,6,35,34, 39,38,39,38,53,52,55,38,39,38,47,1,22,23,22,23, 22,23,22,29,1,7,6,7,6,7,6,7,6,35,34,39, 38,39,20,7,6,35,34,47,1,38,53,52,55,54,63,1, 35,34,53,52,51,33,52,39,38,35,34,15,2,34,39,38, 39,52,55,54,55,50,23,22,23,22,21,7,34,7,6,7, 6,21,20,23,22,19,22,23,22,51,50,55,54,55,54,55, 38,39,38,39,7,6,1,6,67,32,8,10,20,13,9,35, 25,10,12,33,35,152,13,6,13,53,26,42,35,30,41,36, 46,15,4,34,39,11,4,2,6,34,120,51,48,75,45,44, 4,10,15,21,49,37,22,36,40,93,37,10,7,43,42,74, 55,40,14,110,23,12,25,31,85,18,17,1,54,26,23,41, 24,26,50,22,39,10,2,1,57,22,21,55,31,68,32,13, 161,46,55,12,7,22,92,40,225,8,56,28,34,29,36,24, 7,1,2,68,124,4,5,12,12,145,25,6,10,24,31,24, 28,18,40,12,5,4,8,2,131,60,32,36,86,65,31,19, 13,21,29,56,17,17,49,59,19,16,6,7,19,14,66,30, 42,68,82,82,95,29,31,80,37,54,40,30,13,17,61,18, 43,48,36,36,22,9,65,132,85,37,19,25,25,22,20,28, 17,20,13,22,3,33,4,5,31,21,8,2,11,16,67,32, 36,1,51,12,9,35,44,87,33,15,1,254,72,31,16,15, 14,7,2,2,86,62,3,2,25,29,0,5,0,15,255,255, 4,244,3,50,0,126,0,142,0,189,0,207,0,216,0,0, 37,20,7,6,35,34,39,38,53,55,6,7,6,7,6,35, 34,39,38,47,1,38,39,34,39,35,34,15,1,38,39,54, 55,54,63,1,39,52,55,52,55,54,51,50,23,22,23,37, 22,23,20,7,6,7,6,7,6,15,1,22,23,22,23,22, 23,54,55,54,51,50,23,22,23,54,51,50,31,1,7,20, 7,6,35,34,39,38,53,55,20,23,22,51,50,55,54,53, 39,53,52,39,38,39,38,47,2,34,7,6,7,52,39,38, 39,38,35,34,7,6,7,6,21,54,51,50,23,22,7,52, 39,38,35,34,7,6,21,20,23,22,51,50,55,54,37,52, 55,54,51,50,23,22,23,20,7,6,35,39,38,39,38,39, 38,39,7,50,23,22,23,22,23,22,51,50,55,54,55,54, 53,52,39,38,39,5,22,23,22,23,38,39,38,55,52,39, 38,39,38,35,34,7,6,21,20,23,22,51,50,55,54,55, 38,39,34,7,6,21,23,21,3,197,48,25,32,59,34,20, 1,33,33,26,53,66,90,69,58,39,63,51,29,34,6,9, 6,17,6,30,3,12,11,71,15,6,91,5,1,70,63,94, 58,25,29,63,2,67,15,3,22,2,46,91,126,54,167,56, 59,19,8,5,7,6,38,96,3,3,47,30,30,32,36,68, 59,40,42,2,50,26,33,72,26,11,20,32,16,23,61,4, 1,1,18,7,10,19,9,13,20,57,21,4,4,24,27,54, 9,12,49,43,4,3,32,36,45,62,36,21,31,44,22,26, 25,24,20,42,21,24,30,22,22,253,186,42,23,26,34,29, 32,4,52,27,35,55,49,45,8,5,14,27,135,31,35,50, 71,27,21,54,49,127,76,55,10,4,22,19,51,254,163,16, 69,30,35,46,8,3,155,34,9,10,6,5,35,16,6,33, 14,17,34,16,7,63,50,92,112,48,26,1,223,56,30,16, 44,28,35,11,98,38,31,33,40,40,26,74,59,25,5,1, 2,13,4,16,26,44,9,4,54,49,5,4,79,54,48,4, 3,33,248,22,30,24,21,2,27,41,25,12,55,18,48,31, 13,13,20,38,84,14,1,11,9,35,59,46,113,210,64,32, 16,79,31,38,4,54,29,16,108,12,14,59,25,90,33,12, 11,19,3,4,2,70,13,17,29,33,34,3,1,42,3,4, 41,50,33,49,29,34,45,25,12,24,29,25,45,25,12,22, 31,136,45,25,13,23,25,51,57,28,16,3,8,35,6,6, 17,47,79,20,28,23,8,8,14,70,50,42,15,17,59,37, 37,37,166,69,30,13,2,19,29,12,21,36,18,5,2,1, 31,13,15,37,18,7,33,12,238,23,3,63,33,46,41,4, 0,2,0,33,0,0,3,141,2,82,0,102,0,125,0,0, 19,34,15,2,20,7,6,35,34,39,38,53,52,55,54,55, 54,51,50,23,22,23,22,23,54,55,54,55,50,51,23,50, 23,50,23,22,23,22,21,20,7,6,7,6,43,1,34,47, 1,23,51,50,55,54,55,54,55,54,53,52,39,38,39,38, 39,38,35,34,7,6,7,23,50,31,1,22,23,22,21,20, 7,6,35,34,39,38,47,1,38,39,7,39,54,55,54,63, 1,54,55,52,39,38,3,50,23,22,23,22,31,1,51,50, 55,54,53,52,39,38,47,1,34,7,6,7,6,225,33,23, 7,3,5,18,51,20,18,14,34,43,81,5,17,43,23,7, 11,13,5,47,53,57,65,6,6,44,24,15,33,37,167,32, 8,52,18,26,79,65,13,17,18,6,15,16,35,20,58,27, 7,3,5,36,39,86,37,38,40,48,66,41,20,17,66,14, 15,29,115,41,36,57,69,112,101,78,14,15,58,24,28,24, 24,63,84,15,13,62,2,1,19,17,141,12,33,33,26,30, 24,42,33,154,51,20,113,29,45,44,13,13,71,84,31,2, 30,46,13,68,10,8,48,18,20,24,55,49,60,16,1,26, 8,15,21,30,48,25,28,1,1,4,16,62,139,36,42,123, 66,23,22,59,5,24,1,7,18,57,14,15,30,46,95,57, 65,45,19,9,10,26,11,17,3,4,8,33,50,42,64,84, 78,96,59,10,13,50,15,3,42,12,129,106,18,15,73,8, 15,20,18,20,254,146,14,14,19,19,6,6,89,35,48,92, 44,12,12,3,2,65,118,43,0,2,0,37,255,252,2,240, 3,39,0,58,0,71,0,0,1,52,55,39,38,39,22,23, 22,23,22,23,22,21,16,7,6,35,34,39,38,53,52,55, 54,55,54,51,23,50,23,7,38,39,34,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,39,6,7,6,35,34,39, 38,39,38,23,22,51,50,55,38,39,38,39,6,21,20,23, 1,150,48,31,9,4,85,70,48,71,20,23,25,219,61,78, 146,97,114,46,56,48,26,40,25,8,18,6,19,20,114,41, 18,127,89,93,171,87,61,7,6,23,39,62,20,16,81,42, 1,2,9,76,42,44,41,44,56,11,41,69,26,21,2,129, 54,64,19,10,19,18,58,38,95,27,54,68,49,254,192,66, 18,62,72,130,111,52,63,14,7,1,6,27,6,2,103,45, 60,68,41,28,89,63,96,61,29,36,39,34,14,5,89,3, 4,26,32,45,38,84,9,44,32,35,43,46,26,0,0,2, 0,28,255,48,2,77,2,95,0,70,0,104,0,0,1,6, 7,6,7,6,7,6,21,20,23,22,23,22,23,55,50,63, 1,23,7,6,35,34,39,38,53,52,55,54,59,1,55,22, 23,50,23,38,39,38,39,38,35,34,6,35,34,39,38,39, 38,53,54,63,2,50,23,22,23,22,23,7,38,39,38,35, 6,7,39,38,3,54,55,54,55,23,6,15,1,6,7,23, 22,23,22,23,55,50,55,54,63,1,21,6,7,34,39,38, 39,38,53,52,55,54,1,155,109,35,26,21,8,8,19,12, 12,54,73,94,20,8,59,35,10,77,60,73,83,106,135,66, 86,206,24,47,80,18,2,2,8,51,16,20,28,42,22,82, 16,16,20,2,1,10,3,40,42,50,64,50,53,18,40,4, 3,69,23,28,12,7,12,13,11,54,29,109,20,35,10,28, 72,7,28,4,1,1,1,15,60,12,8,26,3,2,12,62, 59,20,15,21,34,10,4,5,1,166,19,22,16,31,11,15, 47,32,29,40,42,30,41,9,1,12,11,18,24,18,56,69, 97,109,57,71,1,10,6,1,66,20,6,3,6,60,25,3, 1,14,21,23,18,12,4,22,24,17,33,59,42,11,2,2, 13,1,4,7,254,17,68,46,8,13,18,9,40,4,22,42, 25,3,3,51,5,1,9,1,1,6,23,40,3,5,4,39, 17,21,13,9,15,0,0,2,0,32,0,0,3,14,3,58, 0,53,0,103,0,0,55,50,55,54,55,22,23,22,51,50, 55,54,55,54,55,23,21,7,6,7,6,35,34,39,38,47, 2,6,7,6,7,6,35,34,39,38,53,52,55,54,51,55, 22,31,1,35,34,7,6,21,20,23,22,37,54,53,52,61, 1,39,52,39,38,39,38,39,38,39,38,39,38,7,34,15, 1,34,7,6,7,6,7,39,54,59,1,50,23,22,23,22, 23,22,23,22,23,22,23,22,21,20,15,1,39,220,107,63, 8,9,34,34,31,36,66,35,36,41,9,8,41,10,25,30, 47,101,37,22,23,33,26,19,29,16,20,34,39,36,87,56, 56,80,53,93,34,7,7,2,45,146,36,11,58,40,2,27, 22,4,5,3,12,40,33,31,83,30,58,44,49,18,17,24, 15,13,65,27,30,51,19,118,120,38,83,54,35,22,54,69, 17,9,26,33,41,4,1,22,40,12,150,73,10,12,46,28, 22,23,21,70,21,30,1,32,48,94,50,89,9,9,24,27, 36,51,15,18,14,7,74,74,96,190,64,41,1,1,1,27, 121,36,44,79,48,33,100,34,92,34,2,46,29,19,15,12, 23,85,33,34,43,14,18,11,1,1,1,4,7,10,6,30, 27,65,16,8,14,24,60,15,11,26,61,84,92,19,22,84, 48,80,66,0,0,2,0,31,0,2,3,130,2,87,0,116, 0,138,0,0,55,54,55,54,63,1,54,55,54,53,39,38, 35,34,7,6,21,20,23,20,7,6,7,6,35,34,47,1, 52,55,54,55,54,55,54,59,1,22,31,1,22,23,54,55, 54,55,54,55,50,23,22,23,22,23,20,7,6,7,6,7, 6,15,1,34,39,55,22,59,1,54,55,54,55,54,55,52, 39,38,35,34,15,1,6,7,55,50,23,22,23,22,23,22, 31,1,20,15,1,6,7,6,7,6,7,6,35,7,34,39, 38,39,38,39,38,39,22,23,22,1,7,6,15,1,6,7, 31,1,51,50,55,54,55,54,55,54,53,38,39,38,39,120, 14,16,16,30,55,9,7,9,2,12,43,35,26,4,4,5, 9,12,10,21,45,20,5,48,32,49,8,10,18,19,12,42, 20,6,11,6,36,65,27,34,18,74,95,93,120,16,7,1, 50,10,13,26,31,2,3,32,76,31,10,27,45,11,52,16, 7,4,8,2,81,85,140,36,20,73,34,16,64,27,27,73, 36,13,18,25,7,2,2,12,17,63,10,31,77,27,9,10, 71,56,34,32,47,9,22,17,29,53,22,3,1,16,42,94, 54,7,35,8,74,32,29,93,47,15,20,70,19,12,7,81, 17,23,126,64,45,51,57,76,14,14,23,15,18,37,56,12, 17,16,24,15,10,20,12,13,45,29,49,55,39,17,2,3, 6,5,24,8,22,50,49,30,16,8,5,10,45,60,115,61, 55,121,65,13,13,30,13,1,1,4,48,6,30,11,33,15, 22,46,55,126,81,85,3,24,18,18,7,9,16,36,14,24, 49,28,55,14,13,38,50,39,6,18,23,3,2,2,12,12, 30,7,25,19,49,30,2,1,1,27,3,16,106,15,110,39, 18,2,22,7,12,40,34,23,27,93,34,7,6,0,0,3, 0,26,255,21,2,70,2,108,0,45,0,78,0,118,0,0, 1,50,23,22,23,22,23,21,20,7,38,39,34,7,6,7, 6,21,20,23,22,23,22,51,63,1,15,1,6,35,38,39, 38,47,1,38,39,38,53,52,55,54,55,54,55,54,23,34, 39,38,39,38,39,6,7,6,21,20,23,54,55,54,51,23, 51,23,50,23,54,53,52,39,38,39,38,39,34,7,6,19, 54,55,54,55,23,6,7,6,7,6,21,20,23,22,23,22, 51,50,55,54,63,1,50,55,52,63,1,21,6,7,34,39, 38,39,38,55,52,55,54,1,87,89,68,48,17,9,7,2, 59,60,47,30,149,25,6,41,56,96,18,18,40,90,5,86, 57,59,75,8,81,21,6,83,29,26,29,6,10,40,92,68, 10,27,17,2,3,10,8,57,42,35,2,100,115,39,43,38, 22,15,21,70,3,23,19,30,9,26,22,76,38,13,33,107, 25,53,11,35,86,7,13,16,4,8,36,15,25,16,13,3, 2,9,3,2,17,6,68,68,23,17,22,40,12,1,4,6, 2,108,47,28,30,17,26,47,5,6,11,2,10,48,88,20, 22,74,48,71,13,2,2,20,18,22,13,4,3,22,11,4, 48,56,52,92,83,61,13,18,75,45,33,130,22,3,4,18, 1,12,67,55,59,18,6,116,25,8,1,4,15,4,7,17, 26,26,18,6,4,46,22,253,196,74,47,11,20,20,12,48, 5,19,29,29,14,11,37,16,10,4,1,1,2,1,1,6, 4,26,45,4,6,4,44,19,25,14,10,17,0,2,0,32, 0,0,3,58,2,105,0,82,0,97,0,0,19,52,55,54, 63,1,54,51,23,52,39,38,39,34,7,6,7,6,35,39, 38,39,52,55,54,51,23,50,23,22,23,22,21,7,38,43, 1,34,7,6,21,20,23,22,23,22,23,50,55,54,53,52, 39,38,47,2,52,55,54,55,54,59,1,23,50,31,1,22, 23,22,21,20,7,22,23,20,7,6,35,34,39,38,1,34, 7,6,21,63,1,50,63,1,52,39,38,39,38,32,85,25, 28,25,34,56,89,50,22,13,15,24,18,47,33,11,17,21, 7,64,36,38,22,48,33,40,19,9,3,129,9,11,93,50, 31,133,28,37,63,98,110,46,195,39,31,59,213,3,22,3, 2,58,91,28,18,7,10,26,39,18,8,47,98,1,123,112, 149,162,117,131,2,78,75,52,11,100,96,44,10,2,25,9, 3,37,1,40,91,44,13,6,4,6,1,54,22,7,1,9, 9,27,13,2,8,35,37,22,12,1,21,19,46,22,24,39, 1,50,31,43,107,34,7,5,6,1,7,20,121,49,39,31, 15,2,32,27,36,6,4,82,5,5,11,18,40,17,17,45, 24,35,126,126,78,70,75,84,1,167,73,20,28,1,2,30, 13,21,19,8,2,25,0,2,0,37,255,252,2,240,3,39, 0,79,0,92,0,0,1,52,55,38,47,1,22,23,22,23, 22,23,22,21,16,7,6,35,34,39,38,53,52,55,54,55, 54,55,23,50,23,52,39,38,47,1,34,7,6,35,34,39, 38,47,1,52,55,54,51,50,23,39,6,7,34,7,6,21, 23,22,23,22,51,50,55,54,53,52,39,38,39,6,7,6, 35,34,39,38,39,38,23,22,51,50,55,38,39,38,39,6, 21,20,23,1,150,48,31,8,5,85,70,48,71,20,23,25, 219,61,78,143,100,114,139,28,32,27,15,37,16,10,15,14, 33,14,15,52,26,21,34,9,3,3,1,61,24,25,146,17, 76,17,16,72,55,53,1,12,99,54,144,171,87,61,7,6, 23,39,62,20,16,81,42,1,2,9,76,42,44,41,44,56, 11,41,69,26,21,2,129,54,64,19,11,18,18,58,38,95, 27,54,68,49,254,192,66,18,67,75,122,139,51,10,6,1, 1,1,2,27,24,23,11,1,35,16,19,7,9,12,39,16, 7,172,1,1,1,42,39,67,15,91,31,15,89,63,96,61, 29,36,39,34,14,5,89,3,4,26,32,45,38,84,9,44, 32,35,43,46,26,0,0,3,0,32,255,255,3,14,3,58, 0,15,0,100,0,150,0,0,37,52,39,38,35,34,7,6, 21,20,23,22,51,50,55,54,55,20,7,6,43,1,39,22, 23,22,51,55,54,55,54,55,54,55,54,55,23,6,7,6, 7,6,35,34,39,38,39,38,39,38,39,53,55,22,55,50, 55,54,53,52,39,38,35,34,7,6,15,1,20,23,22,23, 52,55,54,51,50,23,22,21,20,7,6,35,34,39,38,39, 38,39,52,53,54,55,54,55,54,51,50,23,22,23,54,53, 52,61,1,39,52,39,38,39,38,39,38,39,38,39,38,7, 34,15,1,34,7,6,7,6,7,39,54,59,1,50,23,22, 23,22,23,22,23,22,23,22,23,22,21,20,15,1,39,1, 13,35,17,18,29,14,19,34,17,19,35,19,8,250,77,20, 24,11,20,17,46,44,50,31,58,46,16,45,4,11,1,1, 40,12,34,8,10,71,98,68,37,37,19,1,3,39,4,4, 16,25,12,12,55,63,40,82,67,64,66,4,3,28,2,1, 39,25,30,56,32,18,46,25,31,39,25,22,28,50,4,2, 47,13,18,66,94,109,73,65,188,22,4,5,3,12,40,33, 31,83,30,58,44,49,18,17,24,15,13,65,27,30,51,19, 118,120,38,83,54,35,22,54,69,17,9,26,33,41,4,1, 22,40,12,97,36,21,10,18,25,22,35,22,10,33,15,194, 95,23,6,2,27,22,22,3,9,61,22,87,6,40,3,2, 1,140,58,14,12,88,12,12,21,2,3,44,39,30,24,9, 1,2,18,56,48,20,10,30,30,28,35,34,71,5,3,49, 32,20,43,25,31,52,31,17,14,13,33,63,73,7,7,116, 63,17,16,63,67,59,109,34,92,34,2,46,29,19,15,12, 23,85,33,34,43,14,18,11,1,1,1,4,7,10,6,30, 27,65,16,8,14,24,60,15,11,26,61,84,92,19,22,84, 48,80,66,0,0,1,0,28,0,0,3,115,2,94,0,98, 0,0,1,20,7,6,35,34,39,55,23,22,49,23,50,55, 54,53,52,39,38,39,38,47,1,34,7,6,21,22,23,22, 21,20,7,6,7,6,35,34,39,38,53,52,55,35,34,39, 52,55,33,52,39,48,39,38,39,38,35,7,6,7,6,35, 34,39,38,53,52,55,54,51,50,23,22,23,22,31,1,7, 34,7,6,21,20,23,22,51,50,55,54,53,52,35,52,55, 54,51,50,23,22,3,115,156,33,39,37,71,8,34,30,35, 78,47,34,31,26,45,35,46,33,86,49,33,46,18,46,111, 41,51,22,24,104,78,80,98,80,11,3,14,1,50,8,10, 15,29,8,8,13,29,26,31,22,34,11,2,46,20,23,63, 39,45,22,8,2,4,172,45,45,47,71,68,100,98,54,34, 92,52,63,107,190,51,18,1,35,238,44,9,34,24,16,10, 6,75,54,69,78,54,45,27,21,9,3,51,34,47,10,15, 37,92,106,45,16,6,2,78,79,98,120,59,15,14,2,17, 24,20,28,9,3,2,6,32,31,31,8,8,37,19,8,17, 18,46,17,18,52,1,57,57,70,51,36,37,43,27,38,61, 107,85,104,171,57,0,0,3,0,29,0,0,2,253,3,54, 0,15,0,128,0,170,0,0,1,52,39,38,35,34,15,1, 20,23,22,51,55,54,55,54,7,34,39,38,39,52,55,54, 51,50,23,22,23,22,23,22,21,20,15,1,6,7,6,7, 6,35,34,39,38,53,54,55,54,63,1,52,39,38,35,34, 7,6,7,6,29,1,20,23,22,23,22,51,50,55,54,55, 54,63,1,54,55,23,21,6,49,20,7,6,15,1,6,7, 6,7,34,35,34,39,38,39,38,39,52,55,54,55,54,51, 50,23,22,21,20,7,6,21,20,23,22,51,50,55,54,53, 52,39,22,23,22,21,20,7,6,51,52,39,52,39,38,39, 38,39,38,39,38,39,38,7,34,15,1,34,7,6,7,6, 7,39,54,59,1,50,23,22,23,22,23,22,23,22,23,22, 23,22,21,1,232,40,14,17,32,23,20,34,19,22,11,40, 15,5,75,57,30,8,4,73,15,19,35,37,1,3,75,24, 9,6,3,7,18,32,51,40,66,93,63,47,2,30,16,6, 2,13,11,24,17,27,21,20,26,12,31,95,83,83,81,58, 38,48,39,29,11,9,21,51,2,9,19,39,4,13,21,115, 151,4,5,87,112,120,21,12,2,52,27,40,17,14,34,29, 23,27,21,82,35,42,111,48,30,71,12,8,1,20,29,247, 4,5,3,12,40,33,31,83,30,58,44,49,18,17,24,15, 13,65,27,30,51,19,118,120,38,83,54,35,22,54,69,17, 9,43,34,14,5,6,1,218,51,18,7,20,50,40,24,12, 1,4,39,12,88,55,15,18,100,21,4,17,1,1,32,59, 25,19,31,15,7,20,21,41,21,15,41,31,43,37,44,22, 12,14,13,17,20,17,18,27,44,53,44,13,24,63,45,40, 19,10,30,21,36,19,16,66,1,33,12,13,25,68,64,7, 20,21,115,4,67,72,83,56,68,106,78,39,18,7,32,24, 29,30,32,27,22,63,25,10,60,40,43,62,26,9,41,5, 4,29,29,42,91,20,19,15,12,23,85,33,34,43,14,18, 11,1,1,1,4,7,10,6,30,27,65,16,8,14,24,60, 15,11,42,87,33,27,68,48,0,3,0,31,0,0,3,14, 3,58,0,14,0,160,0,210,0,0,1,52,39,38,35,34, 15,1,20,23,22,51,50,55,54,19,23,51,55,54,55,54, 55,54,55,23,6,7,6,7,6,7,34,35,34,39,38,53, 52,63,2,54,55,52,35,7,35,34,7,6,21,20,23,22, 23,22,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 51,50,31,1,7,20,23,22,51,50,55,54,53,38,47,1, 22,23,20,7,6,35,34,39,38,53,52,55,54,51,50,23, 22,21,20,7,6,35,34,39,38,47,1,54,55,54,53,52, 39,38,39,38,35,34,7,6,21,20,23,22,31,1,22,51, 50,55,54,53,52,39,38,53,52,55,54,63,1,50,23,50, 23,22,21,20,7,6,7,22,23,22,55,54,53,52,61,1, 39,52,39,38,39,38,39,38,39,38,39,38,7,34,15,1, 34,7,6,7,6,7,39,54,59,1,50,23,22,23,22,23, 22,23,22,23,22,23,22,21,20,15,1,39,1,230,29,15, 16,28,20,21,33,13,14,42,19,8,11,37,1,15,63,33, 29,45,9,8,40,11,53,22,41,40,41,4,10,48,39,40, 17,4,36,6,2,56,20,14,39,20,19,25,3,1,24,4, 7,46,47,55,115,57,38,68,47,71,48,26,5,14,4,38, 85,78,41,22,5,25,19,8,2,43,21,26,55,23,11,79, 19,19,56,41,31,71,44,54,49,47,48,15,1,1,6,9, 19,4,3,10,19,97,31,12,63,15,20,46,39,34,35,25, 9,32,32,45,9,9,49,37,29,19,17,20,31,29,3,4, 6,20,215,22,4,5,3,12,40,33,31,83,30,58,44,49, 18,17,24,15,13,65,27,30,51,19,118,120,38,83,54,35, 22,54,69,17,9,26,33,41,4,1,22,40,12,1,248,34, 19,10,20,48,39,16,6,35,14,254,159,1,4,10,24,21, 71,21,30,1,127,97,41,24,23,1,36,36,52,27,22,5, 21,5,7,30,1,5,3,26,11,13,1,1,22,8,11,15, 52,34,36,121,80,110,149,78,55,41,19,57,10,7,84,40, 22,29,50,19,11,20,22,52,26,13,43,18,24,60,33,6, 50,37,43,73,40,24,37,38,53,22,13,12,19,6,13,12, 2,1,3,140,54,68,84,40,10,9,18,12,13,14,3,9, 17,15,20,35,13,3,1,3,5,14,12,23,18,18,15,11, 11,6,5,114,34,92,34,2,46,29,19,15,12,23,85,33, 34,43,14,18,11,1,1,1,4,7,10,6,30,27,65,16, 8,14,24,60,15,11,26,61,84,92,19,22,84,48,80,66, 0,2,0,44,0,2,3,61,2,97,0,98,0,110,0,0, 19,50,23,22,23,6,7,21,54,49,38,34,7,6,21,20, 23,22,59,1,54,49,50,55,54,55,54,63,1,51,23,22, 23,22,23,22,51,54,55,54,63,1,52,39,38,39,38,47, 1,38,39,38,43,1,53,54,55,54,51,50,23,22,21,20, 15,1,31,1,22,21,20,7,6,7,6,15,2,34,39,38, 47,1,38,39,6,15,1,6,15,1,39,34,39,38,53,52, 55,54,37,34,7,51,50,31,1,54,55,52,39,38,254,53, 45,7,13,25,4,18,45,108,57,63,49,54,75,33,12,16, 20,49,19,3,2,10,8,3,3,15,15,46,45,53,90,33, 23,15,1,41,1,2,32,1,27,3,4,30,35,134,10,66, 55,59,92,35,14,29,21,17,23,38,7,6,24,46,69,47, 50,49,41,6,7,27,11,3,2,22,21,34,56,29,21,8, 17,182,55,61,1,227,109,34,130,26,66,11,29,4,2,17, 2,0,29,4,9,29,7,2,16,36,51,55,71,53,49,56, 2,9,17,42,7,7,59,35,17,26,29,21,18,9,43,30, 67,17,41,42,1,2,26,1,11,1,1,10,35,52,40,34, 54,22,29,51,21,12,14,32,69,61,51,25,28,37,70,19, 8,2,39,5,7,37,20,28,18,36,26,40,15,3,1,7, 49,206,101,70,76,60,97,26,2,9,38,14,4,60,0,2, 0,26,255,253,2,253,3,105,0,51,0,87,0,0,55,38, 39,38,39,52,63,1,54,55,54,63,1,54,55,54,63,1, 50,23,15,1,6,7,6,7,6,7,51,50,23,50,23,22, 23,22,23,22,21,20,7,6,7,6,7,6,7,6,35,39, 38,39,55,50,55,54,55,54,55,54,53,55,52,47,1,38, 39,38,39,35,34,7,6,15,1,6,7,6,7,20,23,22, 23,22,23,22,23,22,72,15,17,12,2,162,195,32,26,69, 21,81,15,15,26,28,21,35,12,1,9,12,25,46,68,120, 88,32,17,10,56,84,14,8,67,30,15,50,12,18,45,65, 13,14,41,68,67,96,54,185,94,44,15,19,72,21,39,1, 112,44,12,12,40,38,29,63,37,42,45,38,45,26,14,2, 12,11,20,2,3,34,74,74,130,20,34,38,34,174,87,91, 16,16,45,20,79,15,22,36,12,4,38,24,29,31,26,49, 33,48,19,2,40,7,5,41,84,42,43,104,70,17,21,54, 26,5,3,15,3,9,24,97,19,7,12,42,23,39,55,20, 108,52,17,3,3,7,1,10,9,25,22,27,54,38,37,29, 33,31,17,2,2,22,26,24,0,1,0,31,255,98,2,249, 2,84,0,94,0,0,1,20,35,38,39,38,39,38,53,52, 55,39,34,39,54,55,31,1,50,23,20,7,39,6,21,22, 31,2,50,53,52,39,38,35,34,7,6,7,6,21,20,23, 22,23,22,23,22,51,50,55,54,55,54,55,54,55,52,39, 38,39,55,22,23,6,7,6,7,6,15,1,6,35,39,38, 39,38,39,38,39,38,53,54,55,54,55,54,55,54,55,54, 51,50,23,22,2,183,184,71,21,18,15,30,28,76,18,2, 12,7,230,17,5,3,25,120,31,3,62,44,38,142,61,59, 150,118,73,7,8,30,17,14,56,49,54,68,46,47,50,54, 43,42,12,7,1,40,6,3,19,53,9,4,25,12,27,49, 82,44,38,31,33,95,44,60,45,80,31,30,4,12,9,16, 36,78,42,38,54,72,186,58,59,1,137,125,3,8,6,13, 24,38,31,28,1,15,11,2,1,3,10,11,4,1,12,36, 35,9,5,1,91,88,33,34,115,12,14,55,102,86,44,46, 74,65,22,25,10,9,42,41,29,18,21,35,62,10,5,20, 79,71,45,42,20,25,55,17,8,6,1,16,27,33,47,82, 58,60,76,97,34,25,23,62,53,28,12,20,41,39,0,2, 0,42,0,0,2,254,3,58,0,79,0,124,0,0,19,20, 23,22,51,50,55,54,55,54,55,54,55,51,21,6,49,20, 7,6,15,1,6,7,6,7,34,35,34,39,38,61,1,54, 55,54,55,54,55,54,55,54,51,55,52,39,38,35,34,7, 6,7,6,49,7,34,39,38,53,52,55,54,55,23,50,23, 22,23,22,23,22,21,35,34,7,6,7,6,7,6,37,38, 53,52,55,39,52,39,38,39,38,39,38,39,38,39,38,7, 34,15,1,34,7,6,7,6,7,39,54,59,1,50,23,22, 23,22,23,22,23,22,23,22,23,22,21,92,228,28,32,81, 58,61,61,20,12,27,18,47,2,9,19,39,4,13,21,115, 151,4,5,104,106,130,4,9,3,23,15,50,3,2,49,38, 122,51,32,31,33,11,6,30,8,21,29,9,3,47,34,25, 30,25,54,41,20,2,3,16,71,73,40,61,29,6,6,16, 2,120,15,1,1,5,3,12,40,33,31,83,30,58,44,49, 18,17,24,15,13,65,27,30,51,19,118,120,38,83,54,35, 22,54,69,17,9,26,33,41,4,1,1,58,130,16,2,19, 15,50,17,15,36,64,33,12,13,25,68,64,7,20,21,115, 4,56,67,99,71,53,18,7,25,16,23,2,1,14,1,42, 29,18,17,19,13,3,2,24,7,7,37,16,8,3,3,27, 23,33,4,5,31,42,8,8,32,7,8,22,19,46,50,12, 12,11,19,15,12,23,85,33,34,43,14,18,11,1,1,1, 4,7,10,6,30,27,65,16,8,14,24,60,15,11,26,61, 84,92,19,22,0,2,0,31,255,255,3,109,2,88,0,18, 0,122,0,0,37,54,55,38,35,7,6,7,6,7,6,21, 20,31,1,55,51,50,23,3,34,7,6,7,50,23,22,23, 22,23,22,21,20,7,20,7,6,7,6,43,1,38,39,38, 47,1,38,39,38,53,52,55,54,55,54,63,1,54,51,50, 23,21,38,39,34,7,6,7,6,21,23,20,23,22,51,50, 63,1,52,39,38,47,1,7,52,55,54,51,50,23,22,21, 20,7,6,7,38,39,38,35,34,7,38,39,38,53,52,55, 54,55,54,51,50,23,22,23,54,55,52,39,38,39,38,3, 0,24,20,35,53,11,61,16,1,1,7,19,17,48,1,23, 6,154,147,40,8,4,26,37,52,23,2,2,5,2,5,14, 64,62,80,16,63,31,23,9,37,53,22,23,21,20,49,26, 53,49,27,25,42,66,60,51,74,44,12,15,62,1,80,47, 81,149,39,4,39,13,12,34,40,63,72,105,194,63,26,10, 12,82,17,31,9,8,39,37,30,1,10,18,24,61,12,12, 31,21,21,29,7,3,46,39,40,57,56,39,61,53,1,6, 48,3,3,22,18,27,13,5,11,2,1,135,83,17,20,14, 17,51,5,6,20,19,16,8,16,15,73,41,43,7,15,13, 7,32,47,52,52,68,73,51,52,52,27,23,15,5,21,32, 15,2,35,9,15,60,80,25,90,56,34,80,17,35,25,8, 2,2,4,94,90,101,143,59,81,37,65,68,143,26,11,3, 40,61,3,26,20,44,32,39,8,2,10,7,32,33,34,67, 51,47,19,22,0,3,0,53,0,2,3,79,2,104,0,18, 0,36,0,133,0,0,1,34,15,1,20,23,22,51,55,50, 55,54,53,52,39,38,39,38,35,55,54,55,54,55,52,47, 1,38,35,34,7,6,21,51,22,23,50,37,50,23,22,29, 1,7,35,34,21,20,23,22,31,1,49,51,54,49,54,55, 54,53,52,39,6,7,22,23,22,31,2,20,7,6,35,7, 34,39,38,53,52,55,54,59,1,55,38,35,39,52,55,54, 55,54,51,50,31,1,22,23,20,15,1,22,23,22,21,20, 7,6,35,32,39,38,53,52,55,54,51,23,52,35,34,7, 6,7,34,39,38,53,52,55,54,55,54,1,69,67,14,3, 18,20,46,249,30,17,7,34,2,2,21,26,190,41,7,2, 1,61,38,9,10,55,41,41,114,17,13,40,254,54,99,47, 27,2,99,225,55,38,91,151,149,14,155,36,13,56,64,98, 31,4,4,4,14,4,42,14,16,220,76,30,28,74,21,23, 215,176,32,33,173,19,26,69,34,36,95,38,4,9,2,37, 11,34,24,13,228,82,113,254,241,74,26,94,64,88,96,101, 28,30,55,15,34,8,2,8,25,61,15,1,91,40,18,30, 15,13,2,31,13,13,28,17,1,1,10,105,5,28,7,9, 44,19,7,1,32,33,38,1,2,149,62,35,49,12,17,154, 69,37,25,12,5,4,14,72,26,35,76,44,20,35,10,3, 3,4,21,28,45,16,5,3,18,19,45,47,15,4,57,16, 1,45,41,54,25,13,72,9,31,20,36,20,5,23,63,35, 29,194,58,19,150,52,68,106,55,38,1,87,18,36,5,31, 6,8,16,11,39,5,1,0,0,2,0,47,0,0,3,66, 2,104,0,104,0,122,0,0,1,52,39,38,35,39,52,55, 54,55,54,51,50,31,1,22,21,20,7,6,7,50,23,22, 21,20,7,6,35,34,39,38,47,1,7,6,7,6,35,34, 39,38,53,52,55,54,55,35,38,53,52,55,33,52,35,34, 7,6,7,34,39,38,53,52,55,54,55,54,51,50,23,22, 29,1,7,35,34,7,6,21,20,23,22,59,1,50,55,54, 55,54,55,54,53,21,20,23,22,23,22,23,22,51,50,55, 54,39,54,55,54,55,52,47,1,38,35,34,7,6,21,51, 22,23,50,3,19,59,35,45,173,19,26,70,34,35,95,38, 4,10,40,4,5,10,33,34,73,60,88,111,43,8,6,3, 8,27,81,24,34,112,63,46,40,17,30,73,12,12,1,61, 101,28,30,55,15,34,8,2,8,25,61,15,24,88,51,36, 4,194,39,40,51,51,52,86,28,37,18,33,30,8,4,10, 13,7,20,23,29,34,41,128,38,12,71,42,7,1,1,61, 38,9,10,55,41,41,114,17,13,40,1,33,82,42,24,1, 45,41,55,25,12,72,9,31,19,39,21,3,2,57,67,50, 114,72,60,86,15,19,20,34,74,25,7,92,67,93,98,46, 19,20,3,14,12,6,87,18,36,5,31,6,8,16,11,39, 5,1,55,38,51,18,13,37,45,68,51,45,43,5,5,41, 11,9,20,46,13,16,36,13,22,25,10,8,82,27,198,4, 33,5,7,44,19,7,1,32,33,38,1,2,0,1,0,29, 255,255,3,124,2,93,0,118,0,0,37,34,39,38,39,38, 39,52,55,54,55,54,51,22,23,38,39,38,43,1,34,7, 6,15,2,38,39,38,53,52,55,54,51,50,23,22,23,20, 7,20,7,38,43,1,6,7,6,21,20,23,22,23,51,50, 55,54,53,52,39,38,39,48,7,53,54,55,54,55,54,63, 2,50,23,22,23,22,29,1,15,1,6,7,6,7,34,47, 1,55,50,23,22,51,50,55,54,55,54,55,52,39,38,35, 15,1,35,6,7,6,21,23,22,23,22,23,20,7,6,1, 27,145,69,18,11,9,2,23,21,69,60,61,36,40,5,5, 30,57,9,20,14,41,3,20,10,19,11,9,55,40,40,100, 39,15,1,2,9,49,29,11,96,37,55,92,36,45,12,66, 55,59,45,3,4,26,2,14,12,65,75,71,21,14,148,64, 13,9,9,12,11,31,80,41,66,55,54,1,6,2,3,52, 40,20,11,89,30,4,3,55,55,79,26,55,1,4,32,92, 1,54,36,24,2,82,69,1,108,27,34,36,32,32,64,53, 40,35,2,10,36,11,64,20,56,1,10,2,1,15,12,16, 38,30,21,99,31,14,11,6,6,23,14,13,30,37,62,95, 41,16,4,29,27,35,59,13,1,1,1,69,34,25,39,53, 60,9,1,1,151,32,37,42,36,36,63,32,95,35,19,9, 51,4,1,2,28,4,20,103,14,16,107,83,81,1,8,2, 8,20,76,19,4,49,41,51,77,52,44,0,0,2,0,26, 255,48,3,21,2,102,0,93,0,117,0,0,1,50,23,22, 23,22,23,47,1,34,7,6,35,20,23,22,31,1,51,50, 55,54,55,47,1,52,55,31,1,22,21,22,21,20,7,20, 7,6,35,39,34,39,38,39,52,39,6,15,1,6,21,31, 1,22,23,22,51,50,55,54,53,52,39,38,47,1,52,55, 51,22,31,1,22,29,1,7,21,7,6,7,6,35,34,39, 38,53,52,55,54,63,1,54,55,54,23,34,39,38,39,55, 6,7,6,7,54,55,23,51,50,23,52,47,1,38,35,34, 7,6,1,196,152,52,16,10,8,1,145,105,36,130,3,3, 132,28,33,15,20,111,51,20,6,1,3,11,10,4,1,6, 1,72,74,88,24,87,65,63,9,1,23,20,3,5,1,3, 16,72,93,132,104,70,87,8,8,12,1,10,6,3,5,11, 27,1,9,40,101,79,141,157,118,117,157,22,25,9,21,24, 73,96,44,11,3,2,3,79,34,7,5,100,102,91,43,22, 29,39,13,21,31,18,32,28,2,102,62,20,28,32,41,2, 3,16,1,162,49,10,4,2,65,25,32,28,20,6,3,1, 6,2,1,39,9,6,5,80,48,48,1,71,69,103,28,10, 8,98,12,24,27,55,47,111,83,103,61,73,136,20,16,23, 13,6,4,12,2,4,21,48,47,12,16,1,32,140,50,39, 107,107,153,206,66,9,6,28,45,23,69,101,25,6,8,22, 13,76,13,17,16,3,1,4,47,22,5,6,18,18,0,1, 0,40,0,0,3,123,2,82,0,74,0,0,1,50,23,22, 23,22,23,20,7,6,7,6,43,1,47,2,53,22,23,50, 55,54,55,54,55,53,52,39,38,35,7,6,15,1,35,52, 47,1,38,39,38,35,34,7,6,7,6,21,20,23,22,23, 55,54,55,15,2,34,47,1,38,39,38,53,52,55,54,51, 50,23,54,55,54,2,161,114,62,23,11,7,1,22,68,166, 17,18,41,25,27,6,52,45,26,52,52,33,35,7,46,47, 60,28,52,38,39,16,18,2,24,38,47,51,79,62,28,13, 16,154,34,40,55,16,36,4,40,44,73,55,11,137,25,5, 67,73,109,133,61,48,106,18,2,79,122,46,57,43,45,77, 44,143,13,1,1,3,1,24,11,1,13,15,38,47,69,14, 77,62,63,3,12,44,92,32,36,4,51,26,30,62,27,32, 35,49,138,58,12,8,1,1,4,22,3,1,25,5,64,138, 28,30,120,88,94,123,101,16,3,0,0,2,253,30,1,233, 254,22,3,151,0,36,0,45,0,0,1,3,52,53,38,39, 38,35,15,2,39,38,53,52,55,54,51,23,51,50,23,54, 51,50,23,22,21,20,7,6,35,34,39,38,49,3,17,22, 51,54,55,38,39,34,7,253,122,1,1,14,11,9,18,4, 19,9,6,6,12,23,22,1,25,24,20,39,7,7,62,40, 11,18,23,19,17,1,10,33,38,3,7,40,20,16,1,233, 1,96,7,8,1,22,9,4,2,8,2,4,8,7,6,11, 1,20,28,1,23,59,52,24,7,9,12,254,242,1,47,27, 6,50,51,4,27,0,0,1,0,3,0,3,1,80,2,93, 0,58,0,0,19,52,55,54,51,23,50,23,22,23,22,23, 20,7,6,7,6,15,1,6,7,39,38,39,38,39,38,39, 38,39,53,51,22,23,22,23,22,23,22,23,50,55,54,55, 54,63,1,52,39,52,39,38,39,38,35,34,7,6,7,3, 51,35,44,25,9,18,115,21,11,4,5,4,32,3,2,27, 42,70,37,29,20,31,6,4,3,3,2,15,1,7,8,11, 7,23,17,20,23,26,24,10,2,1,9,3,12,12,56,18, 14,37,26,9,12,1,221,62,39,27,1,6,31,113,66,161, 43,20,28,54,5,4,28,38,3,2,5,15,32,11,5,7, 9,18,22,18,12,13,13,7,16,6,1,15,17,32,6,5, 235,39,24,21,50,49,20,6,31,14,42,0,0,1,0,1, 255,22,1,126,1,154,0,34,0,0,19,33,6,7,20,23, 22,23,22,51,55,22,23,6,7,6,35,38,39,38,39,38, 53,52,63,1,54,55,35,39,38,55,48,55,54,17,1,35, 133,8,10,9,31,57,84,21,2,1,10,55,42,35,68,38, 7,6,85,41,87,38,47,233,7,7,1,7,4,1,154,127, 231,45,30,35,37,74,1,4,4,16,25,17,7,24,4,5, 58,120,65,76,145,52,57,3,7,7,10,3,0,1,0,15, 255,19,1,202,1,150,0,54,0,0,5,34,39,38,39,38, 39,38,53,52,55,54,55,54,55,35,53,55,39,38,39,38, 39,52,63,1,23,7,55,15,1,6,7,6,29,1,23,22, 23,22,23,22,51,50,63,1,51,22,23,15,2,6,7,6, 1,46,88,40,17,25,83,22,12,18,18,74,33,66,184,92, 95,7,7,1,7,7,20,168,94,199,29,22,43,30,28,4, 17,53,18,26,36,32,27,20,41,11,5,4,1,7,3,69, 13,32,237,18,9,16,52,56,29,36,43,42,40,75,35,42, 9,104,2,1,1,2,11,8,6,6,1,116,1,21,20,39, 50,49,57,19,25,97,43,14,13,14,5,7,3,7,10,8, 2,33,4,11,0,1,252,237,2,213,254,251,3,213,0,44, 0,0,1,52,39,38,47,1,38,35,39,34,7,6,7,20, 23,22,23,7,34,47,1,38,53,52,55,54,55,54,51,50, 31,1,22,21,20,7,6,35,34,35,39,55,50,55,54,254, 218,32,3,4,33,16,27,124,126,51,34,9,20,50,18,12, 10,5,54,41,6,15,36,87,111,73,42,96,60,29,34,45, 4,5,1,18,50,13,4,3,63,38,19,2,2,10,3,3, 22,9,52,23,20,35,11,11,5,34,30,43,13,24,48,19, 40,8,29,25,81,34,34,35,21,1,47,12,0,2,253,16, 2,213,255,15,3,219,0,16,0,59,0,0,1,34,7,6, 21,20,23,22,23,55,54,55,54,53,52,39,38,23,20,15, 1,6,35,34,39,38,53,52,55,38,47,1,35,34,7,6, 21,20,23,22,23,7,34,47,1,38,53,52,55,54,55,50, 51,23,51,50,23,50,23,22,254,188,36,19,8,41,8,10, 18,29,9,2,30,11,70,45,26,10,10,34,24,26,35,22, 86,16,50,69,48,46,20,50,18,12,10,5,54,41,58,47, 58,11,28,87,29,14,20,45,37,77,3,117,31,14,16,42, 13,2,1,2,10,33,8,8,36,16,6,60,48,23,9,2, 25,23,34,46,29,11,4,1,30,32,29,23,20,35,11,11, 5,34,30,43,78,39,30,3,1,4,26,50,0,1,252,237, 254,250,255,158,1,40,0,35,0,0,5,20,23,22,59,1, 50,55,54,51,50,23,22,59,1,17,55,17,33,34,39,38, 53,52,55,54,51,23,22,23,7,47,1,34,7,6,253,24, 69,20,17,24,41,84,42,33,28,67,33,26,128,34,253,189, 57,33,20,61,31,37,28,13,18,1,23,24,58,26,13,132, 55,34,7,41,20,37,18,1,190,72,253,210,57,35,41,69, 32,16,1,4,10,37,12,3,40,19,0,1,252,227,255,7, 255,153,1,31,0,43,0,0,5,20,23,22,51,50,55,54, 51,50,23,22,31,1,22,23,19,55,17,7,38,39,38,35, 34,7,6,35,34,39,38,53,52,55,54,51,50,23,7,38, 35,34,7,6,253,12,54,25,31,66,78,81,64,39,59,47, 8,18,18,25,1,39,32,8,86,87,38,51,55,138,43,78, 46,32,59,43,43,28,39,11,24,30,48,37,21,117,56,24, 12,37,36,13,13,4,13,14,7,1,165,66,253,242,10,7, 24,23,16,37,49,34,47,41,30,23,20,25,12,26,16,0, 0,2,0,13,255,254,1,111,2,90,0,52,0,69,0,0, 19,50,23,54,55,52,39,38,39,38,35,34,7,6,15,1, 39,54,55,54,55,54,51,50,23,22,23,22,23,22,21,20, 7,6,7,6,7,39,38,35,34,7,6,7,38,39,38,53, 52,55,54,55,54,19,54,55,38,39,38,35,6,7,6,21, 20,23,54,55,50,23,167,48,71,6,2,6,3,16,38,68, 19,15,18,49,28,10,11,8,55,42,18,21,43,40,51,29, 5,7,13,12,9,52,1,1,41,42,27,14,45,20,20,33, 27,10,24,28,60,21,124,17,1,51,29,6,5,84,27,14, 24,21,65,25,41,1,80,31,43,46,24,27,26,24,65,5, 4,27,22,18,18,7,45,8,4,18,20,87,13,24,54,64, 32,116,55,116,3,2,22,21,13,8,18,18,60,36,30,53, 48,53,28,8,254,232,87,110,30,2,1,5,62,39,48,42, 35,27,7,18,0,2,0,33,0,0,2,105,2,110,0,65, 0,82,0,0,19,52,55,54,51,50,23,22,23,22,23,22, 21,20,7,6,35,34,39,38,39,38,53,52,55,54,51,50, 23,22,23,7,39,38,35,34,7,6,21,20,23,22,51,50, 55,54,53,52,47,1,38,39,38,35,22,23,22,21,6,15, 1,6,35,38,39,38,55,52,39,38,35,34,7,6,7,21, 20,23,22,51,50,55,54,206,68,42,52,100,54,20,19,49, 6,1,88,83,115,126,89,39,22,22,97,96,136,89,58,14, 19,20,66,51,41,113,83,82,91,67,90,106,62,44,27,18, 6,8,32,36,31,14,5,6,31,9,37,48,95,28,9,222, 47,25,28,36,25,24,1,48,24,28,48,25,13,1,91,73, 41,25,38,14,20,52,77,19,27,105,69,65,92,41,50,51, 65,133,94,96,34,8,13,12,26,13,82,84,106,95,56,41, 58,42,58,87,33,17,4,5,17,22,49,17,16,58,28,7, 30,6,68,22,38,48,27,14,28,27,27,11,52,27,14,47, 23,0,0,1,0,42,255,254,2,66,2,89,0,79,0,0, 19,50,55,54,53,52,39,38,39,52,55,54,51,50,23,22, 21,20,7,6,35,34,47,1,38,39,55,20,23,22,31,2, 50,55,54,55,54,53,52,47,1,38,35,34,15,1,6,21, 22,21,20,7,6,35,34,39,38,53,52,55,54,51,55,50, 31,1,7,6,35,39,34,7,6,7,6,21,20,23,22,192, 57,21,8,8,7,41,68,9,10,93,88,88,66,68,90,70, 43,16,6,2,12,11,3,26,33,44,32,27,4,6,24,69, 22,14,17,33,18,7,1,42,32,30,46,75,45,30,48,28, 36,21,20,7,1,1,9,13,18,11,7,24,12,10,42,23, 1,92,39,15,18,28,18,15,14,92,12,2,82,82,109,134, 98,98,60,22,17,19,2,19,11,5,18,10,3,51,9,12, 53,157,165,47,11,5,27,16,5,4,10,80,43,29,30,60, 39,51,68,38,23,1,18,11,2,9,1,4,12,24,26,29, 64,34,18,0,255,255,255,158,255,243,2,71,2,244,16,38, 2,7,104,16,16,6,2,58,0,0,255,255,0,48,255,243, 2,138,2,244,16,103,2,7,1,191,0,16,192,0,64,0, 16,6,2,58,0,0,255,255,255,29,255,243,2,71,2,244, 16,39,0,67,0,215,0,16,16,38,2,7,231,16,16,6, 2,58,0,0,255,255,0,48,255,243,2,71,2,244,16,39, 0,67,0,220,0,16,16,103,2,7,1,57,0,16,192,0, 64,0,16,6,2,58,0,0,255,255,255,29,255,243,2,71, 2,244,16,39,0,118,0,145,0,16,16,38,2,7,231,16, 16,6,2,58,0,0,255,255,0,48,255,243,2,71,2,244, 16,39,0,118,0,150,0,16,16,103,2,7,1,57,0,16, 192,0,64,0,16,6,2,58,0,0,255,255,255,163,255,243, 2,71,3,132,16,39,1,247,0,114,0,183,16,38,2,7, 109,16,16,6,2,58,0,0,255,255,0,48,255,243,2,133, 3,132,16,39,1,247,0,114,0,183,16,103,2,7,1,186, 0,16,192,0,64,0,16,6,2,58,0,0,255,255,255,27, 0,0,2,166,2,235,16,38,2,7,229,7,16,6,2,27, 0,0,255,255,0,8,0,0,2,166,2,229,16,103,2,7, 1,75,0,1,192,0,64,0,16,6,2,27,0,0,255,255, 254,33,0,0,2,166,2,232,16,38,0,67,219,4,16,39, 2,7,254,235,0,4,16,6,2,27,0,0,255,255,255,217, 0,0,2,166,2,235,16,38,0,67,195,7,16,102,2,7, 32,7,192,0,64,0,16,6,2,27,0,0,255,255,254,63, 0,0,2,166,2,229,16,38,0,118,179,1,16,39,2,7, 255,9,0,1,16,6,2,27,0,0,255,255,0,8,0,0, 2,166,2,229,16,38,0,118,179,1,16,102,2,7,86,1, 192,0,64,0,16,6,2,27,0,0,255,255,254,210,0,0, 2,166,2,229,16,38,1,247,161,24,16,39,2,7,255,157, 255,113,16,6,2,27,0,0,255,255,255,166,0,0,2,166, 2,229,16,38,1,247,161,24,16,103,2,7,0,233,255,113, 192,0,64,0,16,6,2,27,0,0,255,255,255,140,255,246, 1,220,2,244,16,38,2,7,86,16,16,6,2,62,0,0, 255,255,0,39,255,246,2,119,2,244,16,103,2,7,1,173, 0,16,192,0,64,0,16,6,2,62,0,0,255,255,255,10, 255,246,1,220,2,244,16,39,0,67,0,196,0,16,16,38, 2,7,213,16,16,6,2,62,0,0,255,255,0,39,255,246, 1,241,2,244,16,39,0,67,0,201,0,16,16,103,2,7, 1,38,0,16,192,0,64,0,16,6,2,62,0,0,255,255, 255,10,255,246,1,220,2,244,16,38,0,118,126,16,16,38, 2,7,213,16,16,6,2,62,0,0,255,255,0,39,255,246, 1,241,2,244,16,39,0,118,0,131,0,16,16,103,2,7, 1,38,0,16,192,0,64,0,16,6,2,62,0,0,255,255, 254,118,0,0,2,102,2,229,16,39,2,7,255,64,0,1, 16,6,2,31,0,0,255,255,0,80,0,0,2,102,2,229, 16,103,2,7,0,151,0,1,192,0,64,0,16,6,2,31, 0,0,255,255,253,115,0,0,2,102,2,229,16,39,0,67, 255,45,0,1,16,39,2,7,254,61,0,1,16,6,2,31, 0,0,255,255,255,67,0,0,2,102,2,229,16,39,0,67, 255,45,0,1,16,102,2,7,138,1,192,0,64,0,16,6, 2,31,0,0,255,255,253,115,0,0,2,102,2,229,16,39, 0,118,254,231,0,1,16,39,2,7,254,61,0,1,16,6, 2,31,0,0,255,255,255,67,0,0,2,102,2,229,16,39, 0,118,254,231,0,1,16,102,2,7,138,1,192,0,64,0, 16,6,2,31,0,0,255,255,255,168,255,74,1,242,2,241, 16,38,2,7,114,13,16,6,2,64,0,0,255,255,0,24, 255,74,2,139,2,244,16,103,2,7,1,192,0,16,192,0, 64,0,16,6,2,64,0,0,255,255,255,27,255,74,1,242, 2,238,16,39,0,67,0,213,0,10,16,38,2,7,229,10, 16,6,2,64,0,0,255,255,0,24,255,74,1,251,2,238, 16,39,0,67,0,212,0,10,16,103,2,7,1,49,0,10, 192,0,64,0,16,6,2,64,0,0,255,255,255,21,255,74, 1,242,2,241,16,39,0,118,0,137,0,13,16,38,2,7, 223,13,16,6,2,64,0,0,255,255,0,24,255,74,1,248, 2,244,16,39,0,118,0,139,0,16,16,103,2,7,1,46, 0,16,192,0,64,0,16,6,2,64,0,0,255,255,255,155, 255,74,1,242,3,129,16,39,1,247,0,106,0,180,16,38, 2,7,101,13,16,6,2,64,0,0,255,255,0,24,255,74, 2,143,3,129,16,39,1,247,0,124,0,180,16,103,2,7, 1,196,0,13,192,0,64,0,16,6,2,64,0,0,255,255, 254,103,0,0,2,113,2,229,16,39,2,7,255,49,0,1, 16,6,2,33,0,0,255,255,0,65,0,0,2,113,2,229, 16,103,2,7,0,136,0,1,192,0,64,0,16,6,2,33, 0,0,255,255,253,100,0,0,2,113,2,229,16,39,0,67, 255,30,0,1,16,39,2,7,254,46,0,1,16,6,2,33, 0,0,255,255,255,52,0,0,2,113,2,229,16,39,0,67, 255,30,0,1,16,103,2,7,255,123,0,1,192,0,64,0, 16,6,2,33,0,0,255,255,253,100,0,0,2,113,2,229, 16,39,0,118,254,216,0,1,16,39,2,7,254,46,0,1, 16,6,2,33,0,0,255,255,255,52,0,0,2,113,2,229, 16,39,0,118,254,216,0,1,16,103,2,7,255,123,0,1, 192,0,64,0,16,6,2,33,0,0,255,255,253,247,0,0, 2,113,2,229,16,39,1,247,254,198,0,24,16,39,2,7, 254,194,255,113,16,6,2,33,0,0,255,255,254,203,0,0, 2,113,2,229,16,39,1,247,254,198,0,24,16,103,2,7, 0,14,255,113,192,0,64,0,16,6,2,33,0,0,255,255, 254,238,255,248,1,14,2,244,16,38,2,7,185,16,16,6, 2,66,0,0,255,255,0,56,255,248,1,218,2,244,16,103, 2,7,1,15,0,16,192,0,64,0,16,6,2,66,0,0, 255,255,254,109,255,248,1,14,2,244,16,38,0,67,39,16, 16,39,2,7,255,55,0,16,16,6,2,66,0,0,255,255, 0,56,255,248,1,83,2,244,16,38,0,67,44,16,16,103, 2,7,0,137,0,16,192,0,64,0,16,6,2,66,0,0, 255,255,254,109,255,248,1,14,2,244,16,38,0,118,225,16, 16,39,2,7,255,55,0,16,16,6,2,66,0,0,255,255, 0,56,255,248,1,83,2,244,16,38,0,118,230,16,16,103, 2,7,0,137,0,16,192,0,64,0,16,6,2,66,0,0, 255,255,254,243,255,248,1,14,3,132,16,39,1,247,255,194, 0,183,16,38,2,7,190,16,16,6,2,66,0,0,255,255, 255,199,255,248,1,213,3,132,16,39,1,247,255,194,0,183, 16,103,2,7,1,10,0,16,192,0,64,0,16,6,2,66, 0,0,255,255,254,107,0,0,0,163,2,229,16,39,2,7, 255,53,0,1,16,6,2,35,0,0,255,255,0,69,0,0, 1,86,2,229,16,103,2,7,0,140,0,1,192,0,64,0, 16,6,2,35,0,0,255,255,253,104,0,0,0,163,2,229, 16,39,0,67,255,34,0,1,16,39,2,7,254,50,0,1, 16,6,2,35,0,0,255,255,255,56,0,0,0,163,2,229, 16,39,0,67,255,34,0,1,16,103,2,7,255,127,0,1, 192,0,64,0,16,6,2,35,0,0,255,255,253,104,0,0, 0,163,2,229,16,39,0,118,254,220,0,1,16,39,2,7, 254,50,0,1,16,6,2,35,0,0,255,255,255,56,0,0, 0,163,2,229,16,39,0,118,254,220,0,1,16,103,2,7, 255,127,0,1,192,0,64,0,16,6,2,35,0,0,255,255, 253,251,0,0,0,163,2,229,16,39,1,247,254,202,0,24, 16,39,2,7,254,198,255,113,16,6,2,35,0,0,255,255, 254,207,0,0,0,221,2,229,16,39,1,247,254,202,0,24, 16,103,2,7,0,18,255,113,192,0,64,0,16,6,2,35, 0,0,255,255,255,158,255,244,2,6,2,244,16,38,2,7, 104,16,16,6,2,72,0,0,255,255,0,34,255,244,2,138, 2,244,16,103,2,7,1,191,0,16,192,0,64,0,16,6, 2,72,0,0,255,255,255,29,255,244,2,6,2,244,16,39, 0,67,0,215,0,16,16,38,2,7,231,16,16,6,2,72, 0,0,255,255,0,34,255,244,2,6,2,244,16,39,0,67, 0,220,0,16,16,103,2,7,1,57,0,16,192,0,64,0, 16,6,2,72,0,0,255,255,255,29,255,244,2,6,2,244, 16,39,0,118,0,145,0,16,16,38,2,7,231,16,16,6, 2,72,0,0,255,255,0,34,255,244,2,6,2,244,16,39, 0,118,0,150,0,16,16,103,2,7,1,57,0,16,192,0, 64,0,16,6,2,72,0,0,255,255,254,157,255,248,2,222, 2,232,16,39,2,7,255,103,0,4,16,6,2,41,0,0, 255,255,0,50,255,248,2,222,2,235,16,103,2,7,0,172, 0,7,192,0,64,0,16,6,2,41,0,0,255,255,253,175, 255,248,2,222,2,226,16,39,0,67,255,105,255,254,16,39, 2,7,254,121,255,254,16,6,2,41,0,0,255,255,255,115, 255,248,2,222,2,223,16,39,0,67,255,93,255,251,16,102, 2,7,186,251,192,0,64,0,16,6,2,41,0,0,255,255, 253,235,255,248,2,222,2,226,16,39,0,118,255,95,255,254, 16,39,2,7,254,181,255,254,16,6,2,41,0,0,255,255, 255,166,255,248,2,222,2,229,16,39,0,118,255,74,0,1, 16,102,2,7,237,1,192,0,64,0,16,6,2,41,0,0, 255,255,255,141,255,242,1,222,2,244,16,38,2,7,87,16, 16,6,2,78,0,0,255,255,0,40,255,242,2,121,2,244, 16,103,2,7,1,174,0,16,192,0,64,0,16,6,2,78, 0,0,255,255,255,12,255,242,1,222,2,244,16,39,0,67, 0,198,0,16,16,38,2,7,214,16,16,6,2,78,0,0, 255,255,0,40,255,242,1,242,2,244,16,39,0,67,0,203, 0,16,16,103,2,7,1,40,0,16,192,0,64,0,16,6, 2,78,0,0,255,255,255,12,255,242,1,222,2,244,16,39, 0,118,0,128,0,16,16,38,2,7,214,16,16,6,2,78, 0,0,255,255,0,40,255,242,1,242,2,244,16,39,0,118, 0,133,0,16,16,103,2,7,1,40,0,16,192,0,64,0, 16,6,2,78,0,0,255,255,255,146,255,242,1,222,3,132, 16,39,1,247,0,97,0,183,16,38,2,7,92,16,16,6, 2,78,0,0,255,255,0,40,255,242,2,116,3,132,16,39, 1,247,0,97,0,183,16,103,2,7,1,169,0,16,192,0, 64,0,16,6,2,78,0,0,255,255,0,21,255,254,2,151, 2,229,16,102,2,7,85,1,192,0,64,0,16,6,2,46, 0,0,255,255,255,1,255,254,2,151,2,229,16,39,0,67, 254,235,0,1,16,103,2,7,255,72,0,1,192,0,64,0, 16,6,2,46,0,0,255,255,255,1,255,254,2,151,2,229, 16,39,0,118,254,165,0,1,16,103,2,7,255,72,0,1, 192,0,64,0,16,6,2,46,0,0,255,255,254,152,255,254, 2,151,2,229,16,39,1,247,254,147,0,24,16,103,2,7, 255,220,255,113,192,0,64,0,16,6,2,46,0,0,255,255, 255,252,255,247,2,192,2,244,16,39,2,7,0,198,0,16, 16,6,2,82,0,0,255,255,0,36,255,247,2,232,2,244, 16,103,2,7,2,29,0,16,192,0,64,0,16,6,2,82, 0,0,255,255,255,123,255,247,2,192,2,244,16,39,0,67, 1,53,0,16,16,38,2,7,69,16,16,6,2,82,0,0, 255,255,0,36,255,247,2,192,2,244,16,39,0,67,1,58, 0,16,16,103,2,7,1,151,0,16,192,0,64,0,16,6, 2,82,0,0,255,255,255,123,255,247,2,192,2,244,16,39, 0,118,0,239,0,16,16,38,2,7,69,16,16,6,2,82, 0,0,255,255,0,36,255,247,2,192,2,244,16,39,0,118, 0,244,0,16,16,103,2,7,1,151,0,16,192,0,64,0, 16,6,2,82,0,0,255,255,0,1,255,247,2,192,3,132, 16,39,1,247,0,208,0,183,16,39,2,7,0,203,0,16, 16,6,2,82,0,0,255,255,0,36,255,247,2,227,3,132, 16,39,1,247,0,208,0,183,16,103,2,7,2,24,0,16, 192,0,64,0,16,6,2,82,0,0,255,255,254,158,255,255, 2,192,2,226,16,39,2,7,255,104,255,254,16,6,2,50, 0,0,255,255,0,42,255,255,2,192,2,229,16,103,2,7, 0,191,0,1,192,0,64,0,16,6,2,50,0,0,255,255, 253,161,255,255,2,192,2,232,16,39,0,67,255,91,0,4, 16,39,2,7,254,107,0,4,16,6,2,50,0,0,255,255, 255,113,255,255,2,192,2,232,16,39,0,67,255,91,0,4, 16,102,2,7,184,4,192,0,64,0,16,6,2,50,0,0, 255,255,253,248,255,255,2,192,2,226,16,39,0,118,255,108, 255,254,16,39,2,7,254,194,255,254,16,6,2,50,0,0, 255,255,255,170,255,255,2,192,2,190,16,39,0,118,255,78, 255,218,16,102,2,7,241,218,192,0,64,0,16,6,2,50, 0,0,255,255,254,67,255,255,2,192,2,229,16,39,1,247, 255,18,0,24,16,39,2,7,255,14,255,113,16,6,2,50, 0,0,255,255,255,29,255,255,2,192,2,238,16,39,1,247, 255,24,0,33,16,103,2,7,0,96,255,122,192,0,64,0, 16,6,2,50,0,0,255,255,0,48,255,243,2,71,2,235, 16,39,0,67,0,149,0,7,16,6,2,58,0,0,255,255, 0,48,255,243,2,71,2,235,16,38,0,118,79,7,16,6, 2,58,0,0,255,255,0,39,255,246,1,220,2,235,16,39, 0,67,0,131,0,7,16,6,2,62,0,0,255,255,0,39, 255,246,1,220,2,235,16,38,0,118,61,7,16,6,2,62, 0,0,255,255,0,24,255,74,1,242,2,235,16,39,0,67, 0,162,0,7,16,6,2,64,0,0,255,255,0,24,255,74, 1,242,2,235,16,38,0,118,98,7,16,6,2,64,0,0, 255,255,255,251,255,248,1,14,2,235,16,38,0,67,230,7, 16,6,2,66,0,0,255,255,255,251,255,248,1,14,2,235, 16,38,0,118,160,7,16,6,2,66,0,0,255,255,0,34, 255,244,2,6,2,235,16,39,0,67,0,149,0,7,16,6, 2,72,0,0,255,255,0,34,255,244,2,6,2,235,16,38, 0,118,79,7,16,6,2,72,0,0,255,255,0,40,255,242, 1,222,2,235,16,39,0,67,0,132,0,7,16,6,2,78, 0,0,255,255,0,40,255,242,1,222,2,235,16,38,0,118, 62,7,16,6,2,78,0,0,255,255,0,36,255,247,2,192, 2,235,16,39,0,67,0,243,0,7,16,6,2,82,0,0, 255,255,0,36,255,247,2,192,2,235,16,39,0,118,0,173, 0,7,16,6,2,82,0,0,255,255,255,158,255,8,2,71, 2,244,16,38,2,14,114,5,16,38,2,7,104,16,16,6, 2,58,0,0,255,255,0,48,255,8,2,138,2,244,16,38, 2,14,114,5,16,103,2,7,1,191,0,16,192,0,64,0, 16,6,2,58,0,0,255,255,255,29,255,8,2,71,2,244, 16,38,2,14,114,5,16,39,0,67,0,215,0,16,16,38, 2,7,231,16,16,6,2,58,0,0,255,255,0,48,255,8, 2,71,2,244,16,38,2,14,114,5,16,39,0,67,0,220, 0,16,16,103,2,7,1,57,0,16,192,0,64,0,16,6, 2,58,0,0,255,255,255,29,255,8,2,71,2,244,16,38, 2,14,114,5,16,39,0,118,0,145,0,16,16,38,2,7, 231,16,16,6,2,58,0,0,255,255,0,48,255,8,2,71, 2,244,16,38,2,14,114,5,16,39,0,118,0,150,0,16, 16,103,2,7,1,57,0,16,192,0,64,0,16,6,2,58, 0,0,255,255,255,163,255,8,2,71,3,132,16,38,2,14, 114,5,16,39,1,247,0,114,0,183,16,38,2,7,109,16, 16,6,2,58,0,0,255,255,0,48,255,8,2,133,3,132, 16,38,2,14,114,5,16,39,1,247,0,114,0,183,16,103, 2,7,1,186,0,16,192,0,64,0,16,6,2,58,0,0, 255,255,255,27,255,241,3,89,2,235,16,39,2,14,2,60, 0,238,16,38,2,7,229,7,16,6,2,27,0,0,255,255, 0,8,255,241,3,89,2,229,16,39,2,14,2,60,0,238, 16,103,2,7,1,75,0,1,192,0,64,0,16,6,2,27, 0,0,255,255,254,33,255,241,3,89,2,232,16,39,2,14, 2,60,0,238,16,38,0,67,219,4,16,39,2,7,254,235, 0,4,16,6,2,27,0,0,255,255,255,217,255,241,3,89, 2,235,16,39,2,14,2,60,0,238,16,38,0,67,195,7, 16,102,2,7,32,7,192,0,64,0,16,6,2,27,0,0, 255,255,254,63,255,241,3,89,2,229,16,39,2,14,2,60, 0,238,16,38,0,118,179,1,16,39,2,7,255,9,0,1, 16,6,2,27,0,0,255,255,0,8,255,241,3,89,2,229, 16,39,2,14,2,60,0,238,16,38,0,118,179,1,16,102, 2,7,86,1,192,0,64,0,16,6,2,27,0,0,255,255, 254,210,255,241,3,89,2,229,16,39,2,14,2,60,0,238, 16,38,1,247,161,24,16,39,2,7,255,157,255,113,16,6, 2,27,0,0,255,255,255,166,255,241,3,89,2,229,16,39, 2,14,2,60,0,238,16,38,1,247,161,24,16,103,2,7, 0,233,255,113,192,0,64,0,16,6,2,27,0,0,255,255, 255,168,255,18,1,242,2,241,16,38,2,14,209,15,16,38, 2,7,114,13,16,6,2,64,0,0,255,255,0,24,255,18, 2,139,2,244,16,38,2,14,209,15,16,103,2,7,1,192, 0,16,192,0,64,0,16,6,2,64,0,0,255,255,255,27, 255,18,1,242,2,238,16,38,2,14,209,15,16,39,0,67, 0,213,0,10,16,38,2,7,229,10,16,6,2,64,0,0, 255,255,0,24,255,18,1,251,2,238,16,38,2,14,209,15, 16,39,0,67,0,212,0,10,16,103,2,7,1,49,0,10, 192,0,64,0,16,6,2,64,0,0,255,255,255,21,255,18, 1,242,2,241,16,38,2,14,209,15,16,39,0,118,0,137, 0,13,16,38,2,7,223,13,16,6,2,64,0,0,255,255, 0,24,255,18,1,248,2,244,16,38,2,14,209,15,16,39, 0,118,0,139,0,16,16,103,2,7,1,46,0,16,192,0, 64,0,16,6,2,64,0,0,255,255,255,155,255,18,1,242, 3,129,16,38,2,14,209,15,16,39,1,247,0,106,0,180, 16,38,2,7,101,13,16,6,2,64,0,0,255,255,0,24, 255,18,2,143,3,129,16,38,2,14,209,15,16,39,1,247, 0,124,0,180,16,103,2,7,1,196,0,13,192,0,64,0, 16,6,2,64,0,0,255,255,254,103,255,235,3,65,2,229, 16,39,2,14,2,36,0,232,16,39,2,7,255,49,0,1, 16,6,2,33,0,0,255,255,0,65,255,235,3,65,2,229, 16,39,2,14,2,36,0,232,16,103,2,7,0,136,0,1, 192,0,64,0,16,6,2,33,0,0,255,255,253,100,255,235, 3,65,2,229,16,39,2,14,2,36,0,232,16,39,0,67, 255,30,0,1,16,39,2,7,254,46,0,1,16,6,2,33, 0,0,255,255,255,52,255,235,3,65,2,229,16,39,2,14, 2,36,0,232,16,39,0,67,255,30,0,1,16,103,2,7, 255,123,0,1,192,0,64,0,16,6,2,33,0,0,255,255, 253,100,255,235,3,65,2,229,16,39,2,14,2,36,0,232, 16,39,0,118,254,216,0,1,16,39,2,7,254,46,0,1, 16,6,2,33,0,0,255,255,255,52,255,235,3,65,2,229, 16,39,2,14,2,36,0,232,16,39,0,118,254,216,0,1, 16,103,2,7,255,123,0,1,192,0,64,0,16,6,2,33, 0,0,255,255,253,247,255,235,3,65,2,229,16,39,2,14, 2,36,0,232,16,39,1,247,254,198,0,24,16,39,2,7, 254,194,255,113,16,6,2,33,0,0,255,255,254,203,255,235, 3,65,2,229,16,39,2,14,2,36,0,232,16,39,1,247, 254,198,0,24,16,103,2,7,0,14,255,113,192,0,64,0, 16,6,2,33,0,0,255,255,255,252,255,9,2,192,2,244, 16,39,2,14,0,203,0,6,16,39,2,7,0,198,0,16, 16,6,2,82,0,0,255,255,0,36,255,9,2,232,2,244, 16,39,2,14,0,203,0,6,16,103,2,7,2,29,0,16, 192,0,64,0,16,6,2,82,0,0,255,255,255,123,255,9, 2,192,2,244,16,39,2,14,0,203,0,6,16,39,0,67, 1,53,0,16,16,38,2,7,69,16,16,6,2,82,0,0, 255,255,0,36,255,9,2,192,2,244,16,39,2,14,0,203, 0,6,16,39,0,67,1,58,0,16,16,103,2,7,1,151, 0,16,192,0,64,0,16,6,2,82,0,0,255,255,255,123, 255,9,2,192,2,244,16,39,2,14,0,203,0,6,16,39, 0,118,0,239,0,16,16,38,2,7,69,16,16,6,2,82, 0,0,255,255,0,36,255,9,2,192,2,244,16,39,2,14, 0,203,0,6,16,39,0,118,0,244,0,16,16,103,2,7, 1,151,0,16,192,0,64,0,16,6,2,82,0,0,255,255, 0,1,255,9,2,192,3,132,16,39,2,14,0,203,0,6, 16,39,1,247,0,208,0,183,16,39,2,7,0,203,0,16, 16,6,2,82,0,0,255,255,0,36,255,9,2,227,3,132, 16,39,2,14,0,203,0,6,16,39,1,247,0,208,0,183, 16,103,2,7,2,24,0,16,192,0,64,0,16,6,2,82, 0,0,255,255,254,158,255,238,3,152,2,226,16,39,2,14, 2,123,0,235,16,39,2,7,255,104,255,254,16,6,2,50, 0,0,255,255,0,42,255,238,3,152,2,229,16,39,2,14, 2,123,0,235,16,103,2,7,0,191,0,1,192,0,64,0, 16,6,2,50,0,0,255,255,253,161,255,238,3,152,2,232, 16,39,2,14,2,123,0,235,16,39,0,67,255,91,0,4, 16,39,2,7,254,107,0,4,16,6,2,50,0,0,255,255, 255,113,255,238,3,152,2,232,16,39,2,14,2,123,0,235, 16,39,0,67,255,91,0,4,16,102,2,7,184,4,192,0, 64,0,16,6,2,50,0,0,255,255,253,248,255,238,3,152, 2,226,16,39,2,14,2,123,0,235,16,39,0,118,255,108, 255,254,16,39,2,7,254,194,255,254,16,6,2,50,0,0, 255,255,255,170,255,238,3,152,2,190,16,39,2,14,2,123, 0,235,16,39,0,118,255,78,255,218,16,102,2,7,241,218, 192,0,64,0,16,6,2,50,0,0,255,255,254,67,255,238, 3,152,2,229,16,39,2,14,2,123,0,235,16,39,1,247, 255,18,0,24,16,39,2,7,255,14,255,113,16,6,2,50, 0,0,255,255,255,29,255,238,3,152,2,238,16,39,2,14, 2,123,0,235,16,39,1,247,255,24,0,33,16,103,2,7, 0,96,255,122,192,0,64,0,16,6,2,50,0,0,255,255, 0,48,255,243,2,71,2,222,16,38,1,243,110,2,16,6, 2,58,0,0,255,255,0,48,255,243,2,71,2,157,16,38, 0,113,111,224,16,6,2,58,0,0,255,255,0,48,255,23, 2,71,2,235,16,38,2,14,105,20,16,39,0,67,0,149, 0,7,16,6,2,58,0,0,255,255,0,48,255,23,2,71, 2,18,16,38,2,14,105,20,16,6,2,58,0,0,255,255, 0,48,255,23,2,71,2,235,16,38,0,118,79,7,16,38, 2,58,0,0,16,6,2,14,105,20,255,255,0,48,255,243, 2,71,2,191,16,38,1,247,114,242,16,6,2,58,0,0, 255,255,0,48,255,23,2,71,2,191,16,38,2,14,105,20, 16,38,1,247,114,242,16,6,2,58,0,0,255,255,0,8, 0,0,2,166,3,168,16,39,1,243,0,169,0,204,16,6, 2,27,0,0,255,255,0,8,0,0,2,166,3,103,16,39, 0,113,0,170,0,170,16,6,2,27,0,0,255,255,0,8, 0,0,2,166,2,229,16,38,0,67,249,1,16,6,2,27, 0,0,255,255,0,8,0,0,2,166,2,229,16,38,0,118, 179,1,16,6,2,27,0,0,255,255,0,8,255,241,3,89, 2,204,16,39,2,14,2,60,0,238,16,6,2,27,0,0, 255,255,255,203,2,88,0,53,3,83,16,7,0,15,255,117, 2,235,255,255,0,23,0,0,0,179,0,178,16,7,2,14, 255,150,0,253,255,255,255,54,2,71,255,135,2,228,16,6, 2,7,0,0,255,255,255,99,2,108,0,157,2,212,16,7, 1,247,255,94,0,7,255,255,0,6,2,100,1,64,3,111, 16,39,1,247,0,1,0,162,16,6,0,106,0,0,255,255, 0,24,255,18,1,242,2,235,16,38,2,14,209,15,16,39, 0,67,0,162,0,7,16,6,2,64,0,0,255,255,0,24, 255,18,1,242,2,19,16,38,2,14,209,15,16,6,2,64, 0,0,255,255,0,24,255,18,1,242,2,235,16,38,0,118, 98,7,16,38,2,64,0,0,16,6,2,14,209,15,255,255, 0,24,255,74,1,242,2,224,16,38,1,247,109,19,16,6, 2,64,0,0,255,255,0,24,254,92,2,104,2,224,16,39, 2,14,1,75,255,89,16,38,1,247,109,19,16,6,2,64, 0,0,255,255,255,67,0,0,2,102,2,229,16,39,0,67, 255,45,0,1,16,6,2,31,0,0,255,255,255,67,0,0, 2,102,2,229,16,39,0,118,254,231,0,1,16,6,2,31, 0,0,255,255,255,52,0,0,2,113,2,229,16,39,0,67, 255,30,0,1,16,6,2,33,0,0,255,255,255,52,0,0, 2,113,2,229,16,39,0,118,254,216,0,1,16,6,2,33, 0,0,255,255,0,65,255,235,3,65,2,204,16,39,2,14, 2,36,0,232,16,6,2,33,0,0,255,255,255,54,2,71, 1,215,2,228,16,39,0,67,0,240,0,0,16,6,2,7, 0,0,255,255,255,54,2,71,1,215,2,228,16,39,0,118, 0,170,0,0,16,6,2,7,0,0,255,255,255,54,2,71, 1,68,3,116,16,39,1,247,0,4,0,167,16,6,2,7, 0,0,255,255,255,205,255,248,1,14,2,222,16,38,1,243, 191,2,16,6,2,66,0,0,255,255,255,219,255,248,1,14, 2,157,16,38,0,113,191,224,16,6,2,66,0,0,255,255, 255,223,255,248,1,14,3,122,16,39,0,67,255,230,0,150, 16,38,0,106,193,243,16,6,2,66,0,0,255,255,255,214, 255,248,1,14,3,104,16,39,0,118,255,190,0,132,16,38, 0,106,184,238,16,6,2,66,0,0,255,255,255,199,255,248, 1,14,2,191,16,38,1,247,194,242,16,6,2,66,0,0, 255,255,255,213,255,248,1,15,3,116,16,39,1,247,255,208, 0,167,16,38,0,106,193,243,16,6,2,66,0,0,255,255, 255,221,0,0,1,11,3,168,16,39,1,243,255,207,0,204, 16,6,2,35,0,0,255,255,255,235,0,0,0,253,3,103, 16,39,0,113,255,207,0,170,16,6,2,35,0,0,255,255, 255,56,0,0,0,163,2,229,16,39,0,67,255,34,0,1, 16,6,2,35,0,0,255,255,255,56,0,0,0,163,2,229, 16,39,0,118,254,220,0,1,16,6,2,35,0,0,255,255, 1,6,2,71,2,23,2,228,16,39,0,67,0,240,0,0, 16,71,2,7,1,77,0,0,192,0,64,0,255,255,1,6, 2,71,2,23,2,228,16,39,0,118,0,170,0,0,16,71, 2,7,1,77,0,0,192,0,64,0,255,255,0,9,2,71, 2,23,3,116,16,39,1,247,0,4,0,167,16,71,2,7, 1,77,0,0,192,0,64,0,255,255,0,40,255,242,1,222, 2,222,16,38,1,243,93,2,16,6,2,78,0,0,255,255, 0,40,255,242,1,222,2,157,16,38,0,113,94,224,16,6, 2,78,0,0,255,255,0,40,255,242,1,222,3,122,16,39, 0,67,0,132,0,150,16,38,0,106,96,243,16,6,2,78, 0,0,255,255,0,40,255,242,1,222,3,107,16,39,0,118, 0,82,0,135,16,38,0,106,76,241,16,6,2,78,0,0, 255,255,255,179,255,56,2,29,2,244,16,38,2,7,125,16, 16,6,2,74,0,0,255,255,0,57,255,56,2,159,2,244, 16,103,2,7,1,212,0,16,192,0,64,0,16,6,2,74, 0,0,255,255,0,40,255,242,1,222,2,191,16,38,1,247, 97,242,16,6,2,78,0,0,255,255,0,40,255,242,1,222, 3,118,16,39,1,247,0,99,0,169,16,38,0,106,96,243, 16,6,2,78,0,0,255,255,0,21,255,254,2,151,3,168, 16,39,1,243,0,176,0,204,16,6,2,46,0,0,255,255, 0,21,255,254,2,151,3,103,16,39,0,113,0,177,0,170, 16,6,2,46,0,0,255,255,255,1,255,254,2,151,2,229, 16,39,0,67,254,235,0,1,16,6,2,46,0,0,255,255, 255,1,255,254,2,151,2,229,16,39,0,118,254,165,0,1, 16,6,2,46,0,0,255,255,0,78,255,255,2,112,2,229, 16,103,2,7,0,149,0,1,192,0,64,0,16,6,2,43, 0,0,255,255,0,30,2,100,1,40,3,135,16,39,0,67, 0,36,0,163,16,6,0,106,0,0,255,255,0,30,2,100, 1,51,3,122,16,39,0,118,0,6,0,150,16,6,0,106, 0,0,255,255,0,22,2,80,0,231,2,228,16,6,0,67, 0,0,255,255,0,36,255,9,2,192,2,235,16,39,2,14, 0,203,0,6,16,39,0,67,0,243,0,7,16,6,2,82, 0,0,255,255,0,36,255,9,2,192,2,14,16,39,2,14, 0,203,0,6,16,6,2,82,0,0,255,255,0,36,255,9, 2,192,2,235,16,39,0,118,0,173,0,7,16,38,2,82, 0,0,16,7,2,14,0,203,0,6,255,255,0,36,255,247, 2,192,2,191,16,39,1,247,0,208,255,242,16,6,2,82, 0,0,255,255,0,36,255,9,2,192,2,191,16,39,2,14, 0,203,0,6,16,39,1,247,0,208,255,242,16,6,2,82, 0,0,255,255,255,121,255,248,2,222,2,226,16,39,0,67, 255,99,255,254,16,6,2,41,0,0,255,255,255,184,255,248, 2,222,2,220,16,39,0,118,255,92,255,248,16,6,2,41, 0,0,255,255,255,119,255,255,2,192,2,217,16,39,0,67, 255,97,255,245,16,6,2,50,0,0,255,255,255,158,255,255, 2,192,2,193,16,39,0,118,255,66,255,221,16,6,2,50, 0,0,255,255,0,42,255,238,3,152,2,181,16,39,2,14, 2,123,0,235,16,6,2,50,0,0,255,255,0,92,2,80, 1,45,2,228,16,6,0,118,0,0,255,255,1,198,2,71, 2,23,2,228,16,71,2,7,1,77,0,0,192,0,64,0, 0,1,0,46,0,240,1,28,1,56,0,3,0,0,1,21, 35,53,1,28,238,1,56,72,72,0,0,1,255,251,0,240, 2,49,1,56,0,3,0,0,1,21,33,53,2,49,253,202, 1,56,72,72,0,1,255,247,0,240,3,233,1,56,0,3, 0,0,1,21,33,53,3,233,252,14,1,56,72,72,0,1, 0,65,1,221,0,158,2,197,0,12,0,0,19,35,53,52, 55,54,55,21,6,21,20,21,51,158,93,76,8,9,48,48, 1,221,101,110,18,2,1,38,7,77,3,3,0,1,0,64, 1,241,0,157,2,217,0,11,0,0,19,51,21,20,7,6, 7,53,54,55,53,35,64,93,81,6,6,45,3,48,2,217, 101,114,15,1,1,38,6,66,18,0,0,1,0,64,255,128, 0,158,0,104,0,12,0,0,55,51,21,20,7,6,35,53, 54,55,52,53,35,65,93,84,5,5,48,1,48,104,101,116, 14,1,38,7,70,6,7,0,0,1,0,64,1,241,0,157, 2,217,0,11,0,0,19,21,35,23,22,23,21,38,39,38, 61,1,157,48,3,7,38,82,10,1,2,217,104,40,45,5, 38,7,100,11,13,101,0,2,0,48,1,221,1,43,2,197, 0,12,0,25,0,0,19,35,53,52,55,54,55,21,6,21, 20,21,51,23,35,53,52,55,54,55,21,6,21,20,21,51, 141,93,76,8,9,48,48,158,93,76,8,9,48,48,1,221, 101,110,18,2,1,38,7,77,3,3,104,101,110,18,2,1, 38,7,77,3,3,0,0,2,0,49,1,221,1,46,2,197, 0,11,0,23,0,0,19,51,21,20,7,6,7,53,54,55, 53,35,55,51,21,20,7,6,7,53,54,55,53,35,49,93, 81,6,6,45,3,48,160,93,81,6,6,45,3,48,2,197, 101,114,15,1,1,38,6,66,18,104,101,114,15,1,1,38, 6,66,18,0,0,2,0,47,255,128,1,44,0,104,0,11, 0,23,0,0,55,51,21,20,7,6,7,53,54,55,53,35, 55,51,21,20,7,6,7,53,54,55,53,35,47,93,81,6, 6,45,3,48,160,93,81,6,6,45,3,48,104,101,114,15, 1,1,38,6,66,18,104,101,114,15,1,1,38,6,66,18, 0,2,0,49,1,221,1,46,2,197,0,11,0,23,0,0, 19,21,35,23,22,23,21,38,39,38,61,1,51,21,35,23, 22,23,21,38,39,38,61,1,142,48,3,7,38,82,10,1, 253,48,3,7,38,82,10,1,2,197,104,40,45,5,38,7, 100,11,13,101,104,40,45,5,38,7,100,11,13,101,0,1, 0,38,255,79,2,1,2,197,0,11,0,0,1,21,35,17, 35,17,35,53,51,53,51,21,2,1,194,88,193,193,88,1, 246,82,253,171,2,85,82,207,207,0,0,1,0,38,255,79, 2,1,2,197,0,19,0,0,1,21,35,17,51,21,35,21, 35,53,35,53,51,17,35,53,51,53,51,21,2,1,194,194, 194,88,193,193,193,193,88,1,246,82,254,205,82,208,208,82, 1,51,82,207,207,0,0,1,0,50,0,220,1,44,1,214, 0,15,0,0,19,50,23,22,21,20,7,6,35,34,39,38, 53,52,55,54,175,66,37,22,53,33,39,64,38,23,52,33, 1,214,54,32,41,63,37,23,52,33,40,64,38,23,0,1, 0,70,0,220,1,44,1,214,0,4,0,0,19,48,23,20, 7,70,230,230,1,214,125,1,124,0,0,3,0,115,0,0, 3,117,0,104,0,3,0,7,0,11,0,0,55,21,35,53, 33,21,35,53,33,21,35,53,219,104,1,181,104,1,181,104, 104,104,104,104,104,104,104,0,0,7,0,9,255,234,3,225, 2,226,0,15,0,31,0,35,0,51,0,67,0,83,0,99, 0,0,19,50,23,22,21,20,7,6,35,34,39,38,53,52, 55,54,23,34,7,6,21,20,23,22,51,50,55,54,53,52, 39,38,37,51,1,35,1,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,23,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,37,50,23,22,21,20,7,6,35,34, 39,38,53,52,55,54,23,34,7,6,21,20,23,22,51,50, 55,54,53,52,39,38,158,76,44,30,59,40,50,75,45,30, 59,40,50,49,27,14,43,22,26,49,27,14,44,21,1,52, 66,254,117,66,1,130,76,44,30,59,40,50,75,45,30,59, 40,50,49,27,14,43,22,25,50,27,14,44,21,1,78,76, 44,30,59,40,50,75,45,30,59,40,50,49,27,14,43,22, 25,50,27,14,44,21,2,216,60,41,51,72,46,31,60,40, 51,74,45,31,60,42,22,26,50,27,14,42,22,26,52,26, 13,70,253,10,1,43,60,41,51,72,46,31,60,40,51,74, 45,31,60,42,22,26,50,27,14,43,22,25,52,26,13,60, 60,41,51,72,46,31,60,40,51,74,45,31,60,42,22,26, 50,27,14,43,22,25,52,26,13,0,0,9,0,9,255,234, 5,73,2,226,0,15,0,31,0,47,0,64,0,80,0,96, 0,100,0,116,0,132,0,0,1,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,23,34,7,6,21,20,23,22, 51,50,55,54,53,52,39,38,37,50,23,22,21,20,7,6, 35,34,39,38,53,52,55,54,23,34,7,6,21,20,23,22, 51,50,55,54,53,52,47,1,38,1,50,23,22,21,20,7, 6,35,34,39,38,53,52,55,54,23,34,7,6,21,20,23, 22,51,50,55,54,53,52,39,38,37,51,1,35,1,50,23, 22,21,20,7,6,35,34,39,38,53,52,55,54,23,34,7, 6,21,20,23,22,51,50,55,54,53,52,39,38,3,75,76, 44,30,59,40,50,75,45,30,59,40,50,49,27,14,43,22, 25,50,27,14,44,21,1,78,76,44,30,59,40,50,75,45, 30,59,40,50,49,27,14,43,22,25,50,27,14,44,24,11, 251,223,76,44,30,59,40,50,75,45,30,59,40,50,49,27, 14,43,22,26,49,27,14,44,21,1,52,66,254,117,66,1, 130,76,44,30,59,40,50,75,45,30,59,40,50,49,27,14, 43,22,25,50,27,14,44,21,1,23,60,41,51,72,46,31, 60,40,51,74,45,31,60,42,22,26,50,27,14,43,22,25, 52,26,13,60,60,41,51,72,46,31,60,40,51,74,45,31, 60,42,22,26,50,27,14,43,22,25,52,26,10,3,1,253, 60,41,51,72,46,31,60,40,51,74,45,31,60,42,22,26, 50,27,14,42,22,26,52,26,13,70,253,10,1,43,60,41, 51,72,46,31,60,40,51,74,45,31,60,42,22,26,50,27, 14,43,22,25,52,26,13,0,0,1,0,49,1,182,0,226, 2,204,0,5,0,0,19,23,15,1,39,55,141,85,56,85, 36,36,2,204,40,118,120,17,142,0,0,2,0,49,1,182, 1,181,2,204,0,5,0,11,0,0,19,23,15,1,39,55, 37,23,15,1,39,55,141,85,56,85,36,36,1,11,85,56, 85,36,36,2,204,40,118,120,17,142,119,40,118,120,17,142, 0,3,0,49,1,182,2,136,2,204,0,5,0,11,0,17, 0,0,1,23,15,1,39,55,39,23,15,1,39,55,37,23, 15,1,39,55,1,96,85,56,85,36,36,155,85,56,85,36, 36,1,222,85,56,85,36,36,2,204,40,118,120,17,142,119, 40,118,120,17,142,119,40,118,120,17,142,0,0,1,0,49, 1,182,0,226,2,204,0,5,0,0,19,31,1,7,47,1, 134,55,37,37,85,55,2,204,119,142,17,120,118,0,0,2, 0,49,1,182,1,181,2,204,0,5,0,11,0,0,1,31, 1,7,47,2,31,1,7,47,1,1,89,55,37,37,85,55, 126,55,37,37,85,55,2,204,119,142,17,120,118,40,119,142, 17,120,118,0,0,3,0,49,1,182,2,136,2,204,0,5, 0,11,0,17,0,0,1,31,1,7,47,1,37,31,1,7, 47,1,37,31,1,7,47,1,1,89,56,36,36,85,56,1, 40,56,36,36,85,56,254,175,56,36,36,85,56,2,204,119, 142,17,120,118,40,119,142,17,120,118,40,119,142,17,120,118, 0,1,0,91,0,106,0,243,1,182,0,6,0,0,55,53, 55,21,7,23,21,91,152,106,106,227,89,122,83,83,83,83, 0,1,0,85,0,106,0,239,1,182,0,6,0,0,19,21, 7,53,55,39,53,239,154,108,108,1,61,89,122,83,83,83, 83,0,0,5,0,98,0,68,2,12,1,237,0,15,0,30, 0,46,0,60,0,72,0,0,19,52,55,54,51,50,23,22, 21,20,7,6,35,34,39,38,55,50,23,22,21,20,7,6, 35,34,39,38,53,55,54,23,6,7,6,35,38,39,38,53, 52,55,54,51,50,23,22,7,34,47,1,52,55,54,51,23, 22,21,20,7,6,39,55,39,55,23,55,23,7,23,7,39, 7,98,23,8,7,22,12,4,24,7,7,22,12,4,213,22, 11,4,22,7,8,22,11,4,3,10,237,1,23,7,7,23, 11,4,23,8,7,21,13,4,213,23,11,3,22,7,8,15, 22,22,7,221,188,188,26,187,187,26,188,188,26,187,187,1, 24,23,11,4,23,8,7,21,13,4,22,8,220,22,7,8, 22,11,4,22,7,8,15,21,211,22,12,4,1,23,7,7, 23,11,4,22,8,220,22,15,22,11,4,3,11,23,22,11, 4,24,188,188,24,187,187,24,188,188,24,187,187,0,0,4, 0,124,0,0,1,230,2,217,0,5,0,9,0,15,0,19, 0,0,19,17,7,35,39,17,19,21,35,53,1,17,7,35, 39,17,19,21,35,53,208,22,39,22,83,84,1,106,22,39, 22,83,84,2,217,254,174,223,223,1,82,253,143,104,104,2, 113,254,174,223,223,1,82,253,143,104,104,0,0,3,0,77, 0,0,1,253,2,229,0,3,0,32,0,40,0,0,37,21, 35,53,17,6,15,1,21,35,52,55,54,51,50,31,1,22, 21,20,7,6,7,6,7,6,29,1,35,53,52,55,39,19, 21,55,54,55,52,39,38,1,74,90,61,13,4,85,180,19, 20,126,56,16,15,51,19,30,63,10,6,90,9,9,90,14, 74,1,62,13,104,104,104,2,39,20,70,49,9,211,21,2, 83,30,36,43,70,59,23,27,58,27,15,24,47,55,33,21, 83,1,12,255,13,66,66,71,30,6,0,1,255,82,255,236, 1,80,2,197,0,3,0,0,1,51,1,35,1,22,58,254, 60,58,2,197,253,39,255,255,0,77,0,0,4,41,2,229, 16,39,0,34,2,44,0,0,16,6,0,34,0,0,0,4, 0,77,0,0,2,252,2,229,0,5,0,9,0,47,0,51, 0,0,1,17,7,35,39,17,19,21,35,53,37,35,53,52, 55,54,55,54,55,54,55,52,47,1,38,35,34,7,6,21, 35,52,55,54,51,50,31,1,22,21,20,7,6,7,6,7, 6,29,2,35,53,2,252,22,39,22,83,84,254,162,90,28, 17,35,7,17,74,1,61,31,17,19,82,30,17,85,180,19, 20,126,56,16,15,51,19,30,63,10,6,90,2,217,254,174, 223,223,1,82,253,143,104,104,95,55,50,37,22,33,6,15, 66,66,70,30,10,4,58,34,64,211,21,2,83,30,36,43, 70,59,23,27,58,27,15,24,142,104,104,0,0,4,0,124, 0,0,3,19,2,229,0,5,0,9,0,46,0,50,0,0, 19,17,7,35,39,17,19,21,35,53,37,35,53,52,55,54, 55,54,55,54,55,52,39,38,35,34,7,6,21,35,52,55, 54,51,50,31,1,22,21,20,7,6,7,6,7,6,29,2, 35,53,208,22,39,22,83,84,1,228,90,28,17,35,7,17, 74,1,61,30,37,82,30,17,85,180,19,20,126,56,16,15, 51,19,30,63,10,6,90,2,217,254,174,223,223,1,82,253, 143,104,104,95,55,50,37,22,33,6,15,66,66,70,30,14, 58,34,64,211,21,2,83,30,36,43,70,59,23,27,58,27, 15,24,142,104,104,0,0,1,0,48,255,79,2,10,2,217, 0,18,0,0,19,51,50,23,22,21,20,15,1,6,7,17, 35,17,35,17,35,17,35,48,250,103,66,55,70,12,48,77, 64,82,64,57,2,217,81,67,92,107,68,11,40,4,254,76, 3,74,252,182,3,74,0,2,0,27,1,14,1,69,2,197, 0,13,0,23,0,0,19,50,21,20,7,6,35,34,39,38, 53,52,55,54,23,34,21,20,51,50,55,54,53,52,176,149, 111,18,20,130,17,2,44,38,67,91,90,82,9,1,2,197, 223,184,28,4,169,24,26,119,54,47,47,173,175,137,18,22, 171,0,0,2,0,160,255,56,0,222,0,131,0,3,0,7, 0,0,55,51,53,35,23,21,35,53,160,62,62,62,62,73, 58,106,225,225,0,2,0,20,1,28,1,81,2,197,0,10, 0,13,0,0,19,35,53,19,51,17,51,21,35,21,35,61, 1,7,208,188,204,46,67,67,62,129,1,128,59,1,10,254, 240,53,100,153,170,170,0,1,0,17,1,13,1,70,2,197, 0,34,0,0,1,21,35,7,54,51,50,31,1,22,21,20, 7,6,35,34,39,38,39,51,22,51,50,55,54,53,52,39, 38,35,34,15,1,35,55,1,46,190,18,38,46,87,40,13, 8,68,38,51,82,42,17,10,56,20,74,73,21,6,58,19, 23,46,33,5,52,34,2,197,52,119,26,64,28,23,27,86, 42,24,51,20,47,71,60,17,21,72,23,7,35,5,232,0, 0,2,0,16,1,14,1,63,2,197,0,26,0,42,0,0, 19,34,53,52,55,54,55,50,23,22,23,35,38,39,34,7, 6,21,54,51,50,23,22,21,20,7,6,39,34,7,6,21, 20,23,22,51,50,55,54,53,52,39,38,170,154,42,47,75, 86,32,8,3,56,19,58,82,16,4,38,67,81,38,21,63, 38,46,63,23,8,45,21,26,56,24,11,55,15,1,14,207, 112,59,59,2,72,18,21,60,4,111,23,27,47,61,32,42, 79,41,23,231,49,18,22,56,26,13,47,20,25,68,19,5, 0,1,0,22,1,28,1,71,2,197,0,12,0,0,1,21, 6,7,6,7,35,54,55,54,55,35,53,1,71,144,38,2, 1,61,35,75,31,47,247,2,197,44,179,186,8,8,143,118, 49,63,52,0,0,3,0,23,1,14,1,73,2,197,0,26, 0,42,0,58,0,0,19,22,21,20,7,6,35,34,39,38, 53,52,55,38,39,38,53,52,55,54,51,50,23,22,21,20, 7,39,34,7,6,21,20,23,22,51,50,55,54,53,52,39, 38,7,34,7,6,21,20,23,22,51,50,55,54,53,52,39, 38,251,78,66,37,50,90,42,21,78,52,8,2,60,34,43, 83,37,17,35,102,60,15,4,46,15,18,57,17,5,49,14, 16,64,23,8,51,19,24,68,21,7,50,20,1,251,34,72, 74,36,21,61,31,40,71,34,30,34,11,14,64,32,17,55, 26,32,45,26,137,44,11,12,47,15,5,41,12,13,50,14, 4,178,47,16,20,55,21,8,49,16,19,54,21,8,0,2, 0,23,1,14,1,70,2,197,0,28,0,45,0,0,19,50, 21,20,7,6,7,34,35,34,39,38,39,51,22,23,50,55, 54,53,6,35,34,39,38,53,52,55,54,23,34,15,1,6, 21,20,23,22,51,50,55,54,53,52,39,38,172,154,42,38, 73,5,6,85,33,8,4,57,19,58,79,18,4,41,63,82, 38,20,63,38,47,56,24,8,2,53,16,19,60,25,10,47, 21,2,197,208,110,61,55,5,70,19,22,60,4,105,25,31, 47,61,33,41,79,41,23,46,48,25,10,10,67,20,6,47, 19,24,58,26,12,0,255,255,0,27,255,42,1,69,0,225, 16,7,6,235,0,0,254,28,255,255,0,61,255,56,0,222, 0,225,16,7,0,123,0,0,254,28,255,255,0,19,255,56, 1,70,0,225,16,7,0,116,0,0,254,28,255,255,0,16, 255,42,1,66,0,225,16,7,0,117,0,0,254,28,255,255, 0,20,255,56,1,81,0,225,16,7,6,237,0,0,254,28, 255,255,0,17,255,41,1,70,0,225,16,7,6,238,0,0, 254,28,255,255,0,16,255,42,1,63,0,225,16,7,6,239, 0,0,254,28,255,255,0,22,255,56,1,71,0,225,16,7, 6,240,0,0,254,28,255,255,0,23,255,42,1,73,0,225, 16,7,6,241,0,0,254,28,255,255,0,23,255,42,1,70, 0,225,16,7,6,242,0,0,254,28,0,4,0,91,255,233, 5,124,2,217,0,48,0,72,0,85,0,97,0,0,1,35, 38,35,34,7,6,21,20,23,22,31,1,22,23,22,21,20, 7,6,35,34,39,38,53,51,22,23,22,51,50,55,54,53, 52,47,2,38,39,38,53,52,55,54,51,50,23,22,37,21, 35,17,20,23,22,51,50,55,21,6,35,34,39,38,53,17, 35,53,51,53,51,21,5,17,35,17,33,50,23,22,21,20, 7,6,35,39,51,50,55,54,53,52,47,1,38,43,1,5, 103,88,3,102,82,23,6,66,14,17,80,118,23,7,90,52, 74,194,14,1,88,6,18,33,71,84,28,10,54,27,78,119, 31,16,84,49,68,145,35,10,254,50,86,22,9,15,25,15, 39,29,89,11,1,71,71,83,253,117,93,1,45,161,47,17, 63,58,83,229,194,102,30,10,79,34,14,15,194,1,122,84, 49,14,16,45,22,4,4,19,28,70,21,27,96,44,26,162, 8,9,47,20,35,47,16,19,46,19,8,19,29,51,28,43, 93,42,25,101,27,113,68,254,153,38,6,3,4,70,7,67, 7,9,1,140,68,144,144,215,254,203,2,217,118,41,55,97, 57,52,82,74,24,30,90,28,8,2,0,3,0,93,255,233, 4,157,2,217,0,48,0,78,0,89,0,0,1,35,38,35, 34,7,6,21,20,23,22,31,1,22,23,22,21,20,7,6, 35,34,39,38,53,51,22,23,22,51,50,55,54,53,52,47, 2,38,39,38,53,52,55,54,51,50,23,22,5,17,35,17, 33,50,23,22,21,20,7,6,7,22,23,22,23,22,23,22, 23,21,35,38,53,55,52,39,38,35,39,51,50,55,54,53, 52,39,38,43,1,4,136,88,3,102,82,23,6,66,14,17, 80,118,23,7,90,52,74,194,14,1,88,6,18,33,71,84, 28,10,54,27,78,119,31,16,84,49,68,145,35,10,252,50, 93,1,80,170,41,11,72,19,24,62,19,17,1,2,17,9, 16,113,21,1,80,18,22,240,225,121,18,4,38,32,73,225, 1,122,84,49,14,16,45,22,4,4,19,28,70,21,27,96, 44,26,162,8,9,47,20,35,47,16,19,46,19,8,19,29, 51,28,43,93,42,25,101,27,97,254,198,2,217,120,33,42, 98,51,13,12,27,40,37,86,96,27,13,11,23,48,71,65, 109,17,4,82,86,17,22,66,32,28,0,2,0,60,0,0, 3,27,2,88,0,19,0,36,0,0,37,3,51,3,6,7, 6,7,5,17,51,17,51,54,55,54,55,54,55,54,3,19, 35,19,38,47,1,33,17,35,17,33,50,23,22,23,22,2, 197,1,87,1,17,94,35,41,254,175,87,241,49,13,6,7, 21,13,1,136,1,87,1,3,50,19,254,244,87,1,108,60, 32,7,6,43,156,1,188,254,58,86,39,15,5,1,1,119, 254,213,11,8,4,5,16,30,4,1,76,254,221,1,25,39, 8,1,253,245,2,87,19,4,5,33,0,1,0,2,255,233, 2,31,2,197,0,47,0,0,19,53,52,55,35,55,51,54, 55,54,51,50,23,7,38,47,1,34,7,6,7,33,7,33, 6,21,20,23,51,7,35,22,51,50,55,54,55,21,6,35, 34,39,38,39,38,39,35,55,79,2,79,22,63,15,51,70, 128,98,94,32,85,57,25,107,44,9,6,1,28,23,254,242, 2,1,246,24,214,38,131,54,70,18,24,77,89,107,66,14, 11,44,18,83,22,1,57,25,22,19,59,95,75,101,67,80, 63,7,1,139,25,31,59,16,20,15,15,59,199,38,10,14, 93,47,71,15,17,72,102,59,0,2,0,33,255,234,4,216, 2,205,0,131,0,143,0,0,37,20,7,6,15,1,6,35, 34,39,38,53,52,63,1,35,34,15,1,6,7,6,35,34, 39,38,53,52,55,54,55,50,21,20,7,6,35,34,39,6, 21,20,23,22,51,50,55,54,55,6,7,6,43,1,34,53, 55,54,63,1,6,35,34,39,38,53,52,55,54,53,52,35, 34,7,6,7,6,43,1,34,53,52,55,54,51,50,31,1, 20,7,6,21,20,51,50,55,54,63,1,54,51,50,23,20, 7,3,51,54,55,54,51,50,21,20,7,6,7,6,15,1, 6,21,20,51,50,55,54,55,54,59,1,50,19,34,7,6, 7,54,55,54,55,54,53,52,3,152,1,74,72,29,7,7, 104,10,1,76,64,60,46,23,121,76,111,85,68,92,30,10, 26,19,38,33,29,14,13,19,11,9,80,17,18,100,150,43, 72,177,74,1,6,11,8,1,86,210,74,51,46,57,12,2, 13,24,25,37,59,7,11,4,3,11,8,1,82,61,58,11, 2,21,12,20,65,63,25,16,153,3,3,6,5,2,228,128, 166,126,55,51,71,49,85,224,16,17,73,99,57,62,87,6, 5,2,5,11,8,245,81,177,19,22,202,82,9,7,48,140, 3,2,103,30,9,1,85,8,9,84,107,89,1,168,108,67, 52,46,15,18,29,38,27,2,34,20,13,6,15,19,15,49, 10,2,215,62,89,21,105,3,8,5,121,20,87,23,29,6, 6,15,19,34,21,23,80,10,15,4,9,3,1,118,40,14, 24,32,16,11,16,47,19,22,149,3,14,5,3,254,213,225, 61,26,64,54,70,121,20,1,1,102,141,69,51,116,7,8, 3,2,26,231,25,30,17,93,10,10,68,43,45,0,0,1, 0,17,255,144,2,80,2,206,0,147,0,0,1,23,7,35, 38,35,38,7,6,7,6,15,1,22,23,22,23,51,54,55, 54,55,54,51,50,23,22,23,22,23,22,21,20,7,6,15, 2,6,35,34,39,55,54,61,1,52,39,38,39,15,1,6, 21,23,22,51,22,55,54,55,23,6,35,34,39,38,47,1, 52,55,54,55,54,55,54,55,22,23,22,31,1,54,55,54, 55,52,53,52,39,38,39,38,39,7,6,7,6,7,21,23, 22,23,20,21,7,6,7,6,7,34,39,38,39,55,54,51, 50,23,22,23,63,1,54,55,54,53,52,39,38,39,38,39, 38,53,52,55,54,55,54,55,54,55,54,55,50,51,54,1, 131,18,91,1,23,38,17,16,34,12,1,1,2,2,34,2, 1,1,4,37,56,38,33,35,12,13,90,42,12,6,4,6, 19,87,44,55,4,3,7,6,3,2,1,13,42,23,14,40, 2,10,36,4,4,22,31,8,38,31,7,6,44,11,2,2, 13,79,4,46,18,3,19,1,9,11,19,18,11,45,4,7, 20,66,33,36,28,36,40,22,2,2,23,4,2,11,51,46, 57,26,21,11,9,67,5,2,2,27,24,13,12,1,12,8, 7,6,7,37,6,4,22,29,5,37,37,14,12,14,11,41, 3,2,47,2,206,12,128,27,1,7,13,32,3,4,25,31, 64,3,2,5,40,59,18,16,2,16,111,33,36,33,27,33, 26,77,89,44,55,4,13,9,3,1,16,3,3,34,1,3, 6,23,50,22,41,1,1,3,20,21,25,1,7,55,31,9, 9,58,50,3,27,10,1,44,1,15,4,3,1,10,36,111, 15,20,43,27,74,37,18,2,1,7,40,23,4,7,4,40, 57,3,2,45,78,48,43,1,11,5,8,78,5,22,20,1, 3,1,7,18,15,18,17,18,23,71,11,9,45,51,60,51, 9,47,46,12,10,5,5,1,2,0,0,2,0,58,255,239, 3,184,2,205,0,11,0,87,0,0,1,20,23,55,54,55, 54,55,7,6,7,6,37,52,55,51,50,23,22,21,20,7, 6,7,6,15,1,6,7,6,35,34,39,38,53,52,55,54, 55,50,21,20,7,6,35,34,39,6,21,20,23,50,51,50, 55,54,63,1,38,39,52,53,52,55,54,55,54,55,54,55, 54,51,50,31,1,20,7,6,7,6,7,6,7,54,55,54, 53,52,1,193,62,126,6,6,75,123,155,129,54,60,1,75, 14,2,6,2,2,36,43,81,32,30,18,66,126,98,82,96, 30,10,25,19,38,33,29,14,13,20,9,8,99,9,10,86, 112,47,37,17,87,7,53,63,134,15,149,73,49,1,2,6, 2,2,3,155,92,30,43,18,14,81,57,47,1,85,60,20, 196,9,8,105,83,51,49,77,84,85,11,1,7,22,13,60, 51,60,34,14,4,28,103,67,52,45,14,18,27,37,27,2, 34,20,13,6,15,15,16,52,6,111,45,53,24,26,78,5, 6,65,76,89,46,5,41,20,20,1,6,11,6,1,97,132, 42,98,41,26,15,69,57,64,8,0,0,2,0,16,255,117, 1,239,2,194,0,53,0,133,0,0,1,20,7,6,35,34, 39,38,47,1,38,39,38,35,34,7,6,7,6,21,22,23, 7,38,47,1,53,38,39,38,47,1,54,55,54,55,54,63, 1,22,23,22,31,1,22,23,50,55,54,55,47,1,55,22, 1,38,53,52,55,54,51,54,23,22,23,22,23,55,54,55, 54,53,52,39,38,39,38,39,38,53,52,55,54,55,54,63, 1,22,23,22,21,35,52,39,38,35,34,15,1,6,7,21, 22,23,22,23,22,23,22,21,20,21,6,7,6,7,6,35, 34,39,38,39,38,39,38,35,7,6,35,6,21,31,1,6, 1,239,39,23,29,13,13,38,50,41,1,1,41,32,18,13, 48,15,5,2,48,59,12,4,2,2,18,9,1,1,2,7, 26,89,43,47,34,15,11,25,31,22,31,32,6,6,24,4, 3,6,20,12,254,79,12,28,25,44,5,6,30,43,43,32, 29,60,20,6,1,6,56,45,12,24,9,25,61,5,5,26, 50,16,4,22,19,15,17,13,10,10,5,1,3,15,7,44, 28,9,6,4,70,21,23,45,46,13,7,26,37,14,8,27, 26,20,1,1,16,3,4,1,2,92,49,30,18,4,10,52, 39,1,1,31,4,17,59,17,17,64,39,71,6,10,19,1, 8,38,17,13,28,20,21,91,47,22,6,1,2,6,13,47, 32,39,1,2,6,30,16,15,9,26,253,23,28,28,43,26, 25,1,1,4,39,39,6,1,9,66,23,24,10,9,54,73, 60,21,45,40,25,21,51,14,1,1,1,6,59,17,18,39, 22,16,8,13,10,14,28,23,31,14,67,42,32,20,26,6, 6,86,89,27,19,38,1,6,39,14,7,23,3,1,6,19, 22,17,4,0,0,3,0,12,255,239,4,9,2,205,0,86, 0,98,0,106,0,0,1,50,21,22,21,20,15,1,6,35, 34,7,6,7,6,21,20,23,22,51,50,55,18,55,54,51, 50,23,22,21,20,7,6,15,1,6,7,22,51,50,55,54, 55,54,59,1,50,21,20,7,6,7,6,15,1,34,39,38, 39,6,43,1,34,53,52,55,54,55,50,59,1,50,23,54, 63,1,6,35,34,39,38,53,52,55,54,55,54,1,50,55, 38,35,34,7,6,21,20,23,50,1,34,3,54,55,54,53, 38,2,59,33,4,2,4,2,4,69,78,39,24,37,84,40, 51,15,30,205,110,33,27,81,7,1,46,98,238,100,61,100, 110,71,69,76,36,22,2,4,12,8,2,55,92,45,39,19, 83,106,6,9,102,82,16,132,11,33,92,7,11,6,69,87, 80,58,86,10,22,146,56,25,40,53,93,50,254,147,58,72, 64,62,68,25,5,76,8,3,18,38,231,193,85,47,6,2, 192,6,2,4,3,2,6,3,59,29,35,51,43,66,25,12, 2,1,24,59,18,65,6,6,54,66,140,35,140,85,61,27, 56,26,31,3,8,1,4,78,46,22,5,1,44,2,4,50, 38,10,16,46,2,20,58,82,122,1,61,28,36,47,57,76, 41,22,253,70,45,22,36,6,7,17,1,2,176,254,191,37, 120,67,46,48,0,4,0,76,0,0,3,210,2,217,0,3, 0,20,0,36,0,46,0,0,1,21,35,53,19,50,23,22, 21,20,15,1,6,35,34,39,38,53,52,55,54,23,34,7, 6,21,20,23,22,51,50,55,54,53,52,39,38,39,17,35, 1,17,35,17,51,1,17,3,180,238,117,74,45,32,60,28, 30,35,72,46,32,60,40,52,51,28,16,44,23,26,55,27, 14,44,23,208,105,254,135,88,101,1,125,1,29,72,72,1, 88,59,41,51,76,45,17,14,59,41,52,74,46,31,57,43, 23,28,51,29,15,46,22,27,52,28,14,157,253,39,2,79, 253,177,2,217,253,172,2,84,0,3,255,254,255,239,3,119, 2,205,0,11,0,151,0,156,0,0,1,50,23,54,55,54, 53,52,39,6,15,1,3,20,23,22,51,50,55,54,55,54, 59,1,50,21,20,7,6,7,6,35,34,39,38,39,38,53, 52,63,1,54,55,54,53,6,35,7,6,7,6,35,34,39, 38,53,52,55,54,55,50,21,20,7,6,35,34,39,6,21, 20,23,22,51,50,55,54,63,1,52,55,54,55,38,35,34, 7,6,7,6,21,23,22,51,50,55,54,63,1,54,61,1, 52,55,50,23,20,7,6,7,6,7,6,35,34,39,38,39, 38,53,52,55,54,55,54,51,50,23,55,54,51,50,23,20, 15,1,22,49,22,21,20,7,6,7,6,7,22,21,20,15, 1,6,19,35,15,1,54,2,100,25,20,81,54,43,24,106, 102,14,33,10,10,21,34,41,52,42,3,4,11,9,2,57, 81,35,25,18,16,52,19,6,15,81,46,5,1,34,34,74, 71,117,90,73,95,32,12,24,23,35,33,30,12,13,16,9, 5,83,14,16,88,118,29,27,91,12,143,142,60,123,109,114, 115,63,55,1,7,66,29,37,30,35,79,29,21,8,2,71, 3,12,39,67,44,38,71,20,3,1,1,56,64,128,125,113, 133,74,47,1,2,8,3,4,36,14,33,40,40,83,12,32, 12,34,75,27,55,34,4,1,24,1,109,10,31,70,56,54, 39,27,82,163,22,254,180,15,10,2,36,42,61,3,8,1, 4,79,50,23,9,11,38,13,14,22,20,113,63,25,4,7, 7,110,101,65,50,42,14,19,26,34,26,3,34,20,13,5, 8,13,9,46,9,1,134,33,37,128,11,4,190,102,44,60, 60,89,79,52,12,54,29,23,50,100,40,22,6,7,6,18, 50,101,4,18,55,36,23,54,8,9,6,11,63,78,90,67, 65,47,29,1,17,3,3,23,14,36,47,51,56,55,41,5, 12,14,27,43,48,105,40,1,26,4,1,2,0,2,0,16, 255,242,2,111,2,193,0,162,0,181,0,0,19,20,23,22, 51,55,54,63,1,53,38,39,38,39,38,39,38,61,2,52, 55,54,55,54,55,54,51,50,23,22,23,22,23,54,55,54, 55,54,55,54,51,50,23,22,31,1,22,23,20,7,6,15, 1,6,21,23,49,22,49,22,23,22,23,22,23,55,54,55, 54,49,23,6,7,6,7,38,39,38,53,39,38,47,1,6, 7,6,7,23,21,23,7,6,7,6,35,39,38,47,1,38, 35,34,7,6,15,1,39,38,39,52,55,54,53,52,39,22, 51,54,55,54,55,23,6,7,6,21,20,23,22,51,50,55, 54,55,54,63,1,38,39,38,39,38,35,34,7,6,21,22, 23,22,23,22,21,20,7,6,7,35,38,39,38,53,37,55, 54,53,47,1,38,39,38,35,34,7,6,7,23,22,21,23, 22,39,31,8,8,17,27,8,1,3,44,49,8,5,3,10, 1,10,56,4,4,32,42,32,30,11,10,44,22,25,39,50, 3,12,13,11,3,4,12,48,7,6,4,14,1,2,50,20, 7,7,27,8,7,7,11,7,8,10,4,4,18,19,3,99, 2,2,54,12,1,27,2,13,14,9,11,10,1,2,3,1, 11,75,38,45,26,6,5,61,16,15,11,10,3,3,10,2, 10,1,6,13,7,24,13,39,45,5,2,14,16,10,24,31, 18,22,10,10,37,22,12,2,2,1,6,15,67,34,42,62, 18,5,1,57,46,7,35,8,23,55,22,45,12,3,1,87, 97,9,1,14,7,15,12,17,35,25,9,2,3,1,9,14, 1,68,52,16,4,3,13,36,21,2,26,15,17,6,3,3, 12,24,13,64,32,16,79,42,2,3,21,12,5,6,29,49, 37,17,21,1,5,10,8,7,30,55,43,13,2,19,2,2, 30,12,5,2,32,214,74,19,17,11,7,1,4,3,6,24, 11,5,135,3,2,60,121,7,7,210,26,4,1,1,6,4, 6,22,1,61,81,159,64,31,3,2,2,35,7,4,1,2, 4,1,4,12,2,8,22,27,19,20,2,2,27,3,1,17, 7,9,22,34,35,24,14,3,5,56,38,50,117,63,59,158, 45,26,65,17,14,38,39,32,7,35,41,19,22,62,7,6, 59,14,14,110,56,6,5,9,71,25,12,11,31,10,10,12, 2,1,29,57,0,2,0,63,1,36,3,170,2,217,0,7, 0,20,0,0,1,17,35,17,35,53,33,21,1,35,3,17, 35,17,51,27,1,51,17,35,17,1,29,68,154,1,119,1, 54,70,121,67,94,132,131,91,67,2,162,254,130,1,126,55, 55,254,130,1,85,254,171,1,181,254,150,1,106,254,75,1, 85,0,255,255,0,42,255,255,2,192,2,181,16,6,2,50, 0,0,0,1,0,42,0,0,2,192,2,210,0,40,0,0, 37,50,55,54,53,52,39,38,39,53,33,21,35,22,23,22, 21,20,7,14,1,35,34,39,38,53,52,55,54,55,35,53, 33,21,6,7,6,21,20,23,22,1,112,131,68,46,47,46, 92,1,18,176,142,28,8,37,37,154,110,147,91,81,41,37, 91,174,1,8,127,34,11,76,63,76,106,73,99,94,80,76, 38,80,76,77,134,39,44,91,78,81,102,115,102,139,92,74, 68,56,76,80,59,135,43,48,132,81,68,0,0,1,0,16, 255,116,1,232,2,194,0,135,0,0,19,7,49,38,39,38, 53,52,55,54,55,54,55,23,22,23,22,23,22,21,20,7, 6,7,6,7,22,23,22,23,22,21,20,7,6,7,6,7, 39,34,47,1,38,35,34,7,54,53,52,39,38,39,38,39, 34,7,6,7,6,7,23,22,23,22,51,21,34,39,38,53, 52,55,54,55,54,51,50,51,23,51,55,54,55,21,20,23, 51,54,55,54,53,52,39,38,47,1,38,35,34,7,6,21, 35,52,55,54,55,54,55,53,38,47,1,54,55,51,22,51, 50,55,54,55,54,55,54,53,52,39,38,35,34,7,6,15, 1,22,69,30,5,11,6,10,29,84,46,54,42,95,61,31, 12,7,16,33,77,16,32,25,31,71,22,7,22,32,71,17, 18,30,3,3,65,9,9,13,17,14,11,2,2,11,18,12, 13,5,4,36,1,3,13,34,5,5,53,22,7,2,11,44, 20,21,3,4,59,1,30,11,19,27,16,30,22,23,14,27, 75,13,38,35,45,20,18,61,74,12,12,26,14,42,35,4, 1,16,1,57,82,41,35,69,24,2,1,5,55,51,70,83, 59,40,8,2,1,1,145,10,2,32,23,26,33,34,91,45, 25,3,1,12,72,37,46,25,27,42,35,73,35,7,10,6, 22,48,85,27,26,47,39,61,21,5,2,1,1,28,3,7, 30,27,23,15,3,2,11,1,6,2,2,22,41,21,38,6, 1,33,55,20,22,13,11,45,20,8,11,3,2,6,83,51, 3,4,29,30,46,36,44,87,42,7,16,30,26,54,67,45, 7,5,12,3,1,13,23,6,2,16,50,15,29,65,4,5, 18,26,65,49,44,54,37,48,32,16,255,255,0,79,0,0, 2,146,2,217,16,6,0,46,0,0,255,255,0,17,0,0, 2,141,3,185,16,6,0,135,0,0,0,3,0,34,255,242, 3,160,2,196,0,141,0,153,0,163,0,0,19,20,51,50, 55,54,55,54,55,54,61,1,52,55,50,21,22,21,20,7, 6,7,6,35,34,39,38,39,38,53,52,55,54,55,54,51, 50,23,55,54,51,50,23,20,7,6,7,22,21,20,7,6, 7,22,21,20,7,6,7,6,35,34,39,38,53,52,55,54, 55,54,51,50,23,20,15,1,6,35,34,7,6,7,6,21, 20,23,22,51,50,55,54,55,54,53,52,39,6,35,34,39, 7,6,7,6,35,34,39,38,53,52,55,54,55,50,21,20, 7,6,35,34,39,6,21,20,23,22,51,50,55,54,55,54, 55,54,55,38,35,34,7,6,7,6,5,50,23,54,55,54, 53,52,39,6,7,54,7,48,7,22,51,50,55,38,35,34, 189,75,40,46,39,32,72,9,2,14,9,2,56,40,79,50, 44,75,17,2,1,2,55,64,129,120,111,134,73,52,1,3, 8,3,4,21,16,53,109,15,15,56,86,79,87,15,15,63, 14,2,33,32,77,32,28,6,2,1,4,3,4,42,43,43, 18,30,46,7,8,41,51,42,46,51,37,68,53,29,17,70, 72,118,90,73,98,30,9,24,19,38,33,29,14,13,20,9, 8,93,13,14,87,116,31,29,137,80,82,85,63,121,106,115, 114,60,54,1,239,39,30,45,41,37,27,77,128,21,12,20, 2,9,36,47,23,24,16,1,100,65,28,25,46,102,42,9, 8,8,6,5,8,18,9,77,78,56,34,21,57,6,6,12, 7,60,78,90,64,59,42,33,1,16,3,4,14,14,44,57, 86,88,12,10,34,62,83,84,78,16,3,47,6,13,40,47, 46,21,9,8,4,1,6,3,18,20,26,42,32,39,7,1, 37,31,63,71,54,43,21,37,6,98,102,66,51,45,14,17, 28,34,27,2,34,20,13,6,15,18,11,50,7,1,131,35, 41,192,88,89,63,39,58,57,86,76,34,9,35,59,53,45, 40,27,79,174,3,28,27,1,29,5,0,2,0,16,255,243, 2,88,2,194,0,123,0,156,0,0,55,20,15,1,38,39, 38,39,52,55,6,7,23,22,23,22,51,50,55,54,55,53, 38,39,38,53,38,55,54,55,54,51,50,23,22,31,2,51, 54,49,54,55,22,23,55,23,7,39,7,23,21,23,6,7, 6,35,34,39,63,1,54,53,52,39,6,7,6,21,20,23, 22,31,1,22,23,7,6,7,6,7,23,22,55,50,55,54, 55,54,55,23,22,23,21,6,15,1,6,7,6,35,34,47, 1,38,35,34,7,6,35,34,39,38,39,38,53,52,55,54, 63,1,22,23,22,63,2,54,53,52,53,38,39,38,39,38, 53,52,55,54,55,54,55,38,39,38,39,34,7,6,7,6, 7,23,22,23,22,140,26,15,13,10,9,1,6,32,1,4, 7,16,29,41,26,24,13,39,35,32,93,1,13,31,94,34, 38,48,37,17,11,12,2,10,3,18,104,14,14,17,6,115, 33,28,7,2,3,15,5,2,8,6,1,8,4,5,29,16, 14,8,5,36,19,6,2,1,11,62,18,3,33,46,38,25, 20,38,44,12,3,7,3,2,1,21,86,2,38,4,8,76, 77,12,15,2,2,13,56,56,19,19,46,18,7,1,9,41, 23,39,8,2,161,18,1,21,3,35,10,6,13,8,18,34, 32,25,16,16,25,31,22,21,21,17,59,7,1,11,96,18, 93,29,6,1,3,11,11,14,10,11,6,30,19,20,12,24, 11,6,30,1,23,38,107,156,57,63,144,47,16,25,13,13, 14,1,1,4,12,54,48,4,21,33,118,6,26,1,32,29, 27,7,9,13,21,17,16,18,18,13,27,22,28,22,25,17, 72,47,20,19,32,67,62,18,4,15,17,1,7,14,44,12, 1,3,2,4,7,5,20,89,1,39,1,40,6,9,10,45, 6,15,39,15,17,7,7,40,10,1,3,34,7,26,28,1, 39,34,3,4,41,86,27,16,39,34,27,23,42,28,26,5, 21,10,16,1,8,9,15,56,126,60,155,92,17,0,0,2, 0,45,255,248,2,199,2,196,0,120,0,130,0,0,1,52, 55,54,51,50,21,20,15,1,6,35,34,7,6,21,20,51, 50,55,54,55,54,53,52,39,34,35,34,7,6,7,6,21, 20,23,54,51,50,31,1,21,20,7,6,35,34,39,6,7, 6,7,6,21,20,23,22,51,50,55,54,55,54,53,52,39, 34,35,34,7,6,7,20,7,35,34,53,54,55,54,51,50, 23,22,21,20,7,6,7,6,35,34,39,38,53,52,55,54, 55,54,55,38,53,52,55,54,55,54,51,50,31,1,22,21, 20,7,6,35,34,39,38,7,50,55,52,39,38,35,34,7, 22,1,236,51,42,38,9,2,4,2,5,38,38,25,45,36, 42,7,5,28,114,5,5,43,48,40,41,56,5,30,21,53, 20,5,40,8,8,63,37,27,20,56,38,62,92,22,25,53, 56,52,36,27,84,6,7,44,43,31,7,12,4,7,9,55, 45,43,103,30,10,24,45,91,62,56,132,44,18,51,55,106, 16,15,16,93,84,92,14,13,97,33,10,3,54,49,49,51, 13,3,82,18,7,6,14,34,16,15,20,1,243,47,46,38, 8,3,2,6,3,51,34,25,32,48,9,7,38,34,70,4, 33,29,59,80,45,14,10,5,19,10,2,25,8,1,28,11, 11,34,57,89,60,76,18,4,33,31,53,36,31,52,5,58, 43,47,5,5,9,69,57,45,52,17,21,32,34,63,39,27, 72,30,39,67,71,75,39,6,4,20,35,88,82,73,13,2, 53,21,12,13,57,56,52,36,9,121,10,2,2,6,3,17, 0,2,255,187,255,44,2,222,2,226,0,33,0,43,0,0, 1,21,35,3,6,7,6,7,34,39,55,22,51,50,55,54, 55,19,35,53,51,55,54,55,54,51,50,23,7,38,35,34, 15,2,3,35,19,33,7,33,7,33,7,1,131,126,75,19, 46,58,77,36,19,17,25,26,69,24,1,2,78,113,125,22, 16,45,51,64,35,44,30,32,20,71,23,12,19,71,94,155, 1,233,17,254,117,50,1,91,17,1,206,70,254,115,103,47, 55,2,10,84,16,97,8,8,1,157,70,104,80,44,48,19, 79,18,126,70,130,254,180,2,217,82,233,82,0,1,0,90, 0,0,2,67,2,217,0,9,0,0,1,17,51,17,33,53, 33,53,33,53,1,230,93,254,23,1,140,254,164,1,141,1, 76,253,39,82,233,82,0,1,0,29,255,220,4,191,2,207, 0,126,0,0,55,51,54,55,54,55,54,55,54,55,54,55, 54,55,54,51,23,22,49,23,20,15,1,1,6,7,6,21, 20,51,50,1,54,63,2,54,51,23,22,21,20,15,1,6, 7,6,7,6,7,6,21,20,51,50,55,54,55,54,59,1, 50,23,20,7,6,7,6,35,34,39,52,39,38,53,52,55, 54,55,54,55,6,7,2,7,6,35,34,61,1,54,55,54, 55,54,55,6,7,6,15,1,6,7,6,35,34,39,38,53, 52,55,54,51,54,51,50,23,20,7,6,35,34,39,21,20, 23,22,124,9,75,86,17,102,31,25,74,167,165,60,4,5, 2,3,4,12,1,2,117,254,237,52,23,12,3,15,1,15, 67,154,29,169,2,4,11,5,1,118,41,97,57,44,54,13, 4,17,35,55,56,42,1,6,11,6,2,2,43,65,64,44, 58,12,1,1,45,36,122,17,14,117,71,244,45,6,3,45, 7,49,33,162,44,30,161,66,19,16,145,119,93,9,10,61, 20,7,18,7,2,16,31,34,1,31,14,13,8,6,3,17, 14,4,94,18,125,37,29,83,125,124,54,5,4,3,1,8, 4,1,4,146,254,127,72,56,28,9,5,1,64,79,135,31, 151,2,3,3,5,4,1,147,58,166,98,62,77,55,13,12, 20,41,42,59,4,8,3,2,62,46,47,56,5,4,5,11, 64,63,51,192,27,22,105,87,254,224,25,3,57,14,74,71, 47,208,57,41,120,67,19,18,172,133,11,1,33,11,13,22, 25,7,21,36,20,14,7,3,4,10,5,17,255,255,0,61, 255,236,3,91,2,197,16,39,0,117,2,25,254,234,16,39, 6,230,1,109,0,0,16,6,0,123,0,0,255,255,0,20, 255,236,3,91,2,197,16,39,0,117,2,25,254,234,16,38, 0,116,1,0,16,7,6,230,1,109,0,0,255,255,0,61, 255,236,3,95,2,197,16,39,6,238,2,25,254,234,16,38, 0,123,0,0,16,7,6,230,1,109,0,0,255,255,0,19, 255,236,3,95,2,197,16,39,6,238,2,25,254,234,16,38, 0,116,0,0,16,7,6,230,1,109,0,0,255,255,0,16, 255,236,3,95,2,197,16,39,6,238,2,25,254,234,16,38, 0,117,0,0,16,7,6,230,1,109,0,0,255,255,0,20, 255,236,3,95,2,197,16,39,6,238,2,25,254,234,16,38, 6,237,0,0,16,7,6,230,1,109,0,0,255,255,0,61, 255,236,3,88,2,197,16,39,6,239,2,25,254,234,16,38, 0,123,0,0,16,7,6,230,1,109,0,0,255,255,0,17, 255,236,3,88,2,197,16,39,6,239,2,25,254,234,16,38, 6,238,0,0,16,7,6,230,1,109,0,0,255,255,0,61, 255,236,3,98,2,197,16,39,6,241,2,25,254,234,16,38, 0,123,0,0,16,7,6,230,1,109,0,0,255,255,0,16, 255,236,3,98,2,197,16,39,6,241,2,25,254,234,16,38, 0,117,0,0,16,7,6,230,1,109,0,0,255,255,0,17, 255,236,3,98,2,197,16,39,6,241,2,25,254,234,16,38, 6,238,0,0,16,7,6,230,1,109,0,0,255,255,0,22, 255,236,3,98,2,197,16,38,6,240,0,0,16,39,6,241, 2,25,254,234,16,7,6,230,1,109,0,0,255,255,0,61, 255,236,2,189,2,197,16,38,0,123,0,0,16,7,6,230, 1,109,0,0,255,255,0,100,0,0,0,194,2,217,16,6, 0,44,0,0,255,255,0,100,0,0,1,216,2,217,16,39, 0,44,1,22,0,0,16,6,0,44,0,0,255,255,0,100, 0,0,2,238,2,217,16,39,0,44,2,44,0,0,16,39, 0,44,1,22,0,0,16,6,0,44,0,0,255,255,0,100, 0,0,3,155,2,217,16,39,0,57,1,22,0,0,16,6, 0,44,0,0,255,255,0,30,0,0,2,133,2,217,16,6, 0,57,0,0,255,255,0,30,0,0,3,93,2,217,16,39, 0,44,2,155,0,0,16,6,0,57,0,0,255,255,0,30, 0,0,4,115,2,217,16,39,0,44,3,177,0,0,16,39, 0,44,2,155,0,0,16,6,0,57,0,0,255,255,0,30, 0,0,5,137,2,217,16,39,0,44,4,199,0,0,16,39, 0,44,3,177,0,0,16,39,0,44,2,155,0,0,16,6, 0,57,0,0,255,255,0,100,0,0,3,159,2,217,16,39, 0,59,1,22,0,0,16,6,0,44,0,0,255,255,0,22, 0,0,2,137,2,217,16,6,0,59,0,0,255,255,0,22, 0,0,3,93,2,217,16,39,0,44,2,155,0,0,16,6, 0,59,0,0,255,255,0,22,0,0,4,115,2,217,16,39, 0,44,3,177,0,0,16,39,0,44,2,155,0,0,16,6, 0,59,0,0,255,255,0,80,0,0,2,21,2,217,16,6, 0,47,0,0,255,255,0,48,255,233,2,165,2,229,16,6, 0,38,0,0,255,255,0,89,0,0,2,155,2,217,16,6, 0,39,0,0,255,255,0,75,0,0,2,249,2,217,16,6, 0,48,0,0,255,255,0,66,0,0,0,150,2,217,16,6, 0,76,0,0,255,255,0,66,0,0,1,116,2,217,16,39, 0,76,0,222,0,0,16,6,0,76,0,0,255,255,0,66, 0,0,2,82,2,217,16,39,0,76,1,188,0,0,16,39, 0,76,0,222,0,0,16,6,0,76,0,0,255,255,0,66, 0,0,2,196,2,217,16,39,0,89,0,222,0,0,16,6, 0,76,0,0,255,255,0,10,0,0,1,230,2,12,16,6, 0,89,0,0,255,255,0,10,0,0,2,138,2,217,16,39, 0,76,1,244,0,0,16,6,0,89,0,0,255,255,0,10, 0,0,3,104,2,217,16,39,0,76,2,210,0,0,16,39, 0,76,1,244,0,0,16,6,0,89,0,0,255,255,0,10, 0,0,4,70,2,217,16,39,0,76,3,176,0,0,16,39, 0,76,2,210,0,0,16,39,0,76,1,244,0,0,16,6, 0,89,0,0,255,255,0,66,0,0,2,183,2,217,16,39, 0,91,0,222,0,0,16,6,0,76,0,0,255,255,0,17, 0,0,1,217,2,12,16,6,0,91,0,0,255,255,0,17, 0,0,2,138,2,217,16,39,0,76,1,244,0,0,16,6, 0,91,0,0,255,255,0,17,0,0,3,104,2,217,16,39, 0,76,2,210,0,0,16,39,0,76,1,244,0,0,16,6, 0,91,0,0,255,255,0,68,0,0,0,152,2,217,16,6, 0,79,0,0,255,255,0,31,255,233,1,221,2,27,16,6, 0,70,0,0,255,255,0,26,255,233,1,239,2,217,16,6, 0,71,0,0,255,255,0,70,0,0,2,250,2,27,16,6, 0,80,0,0,0,1,0,32,255,241,3,174,1,255,0,12, 0,0,1,21,33,22,23,7,38,39,54,55,23,6,7,3, 174,252,229,50,121,35,100,151,151,100,35,121,50,1,20,56, 49,151,35,119,144,144,119,35,151,49,0,1,0,45,0,0, 2,59,3,142,0,12,0,0,33,35,17,6,7,39,54,55, 22,23,7,38,39,1,80,56,49,151,35,119,144,144,119,35, 151,49,3,27,50,121,35,100,151,151,100,35,121,50,0,1, 0,49,255,241,3,191,1,255,0,12,0,0,55,53,33,38, 39,55,22,23,6,7,39,54,55,49,3,27,50,121,35,100, 151,151,100,35,121,50,220,56,49,151,35,119,144,144,119,35, 151,49,0,1,0,45,255,234,2,59,3,120,0,12,0,0, 1,51,17,54,55,23,6,7,38,39,55,22,23,1,24,56, 49,151,35,119,144,144,119,35,151,49,3,120,252,229,50,121, 35,100,151,151,100,35,121,50,0,1,0,24,255,241,4,0, 1,255,0,35,0,0,19,33,38,39,38,39,55,22,23,22, 23,6,15,1,39,54,55,54,55,33,22,31,1,7,38,39, 38,39,54,55,54,55,23,6,7,6,139,3,2,88,46,14, 23,37,112,68,32,37,108,105,36,37,69,58,16,28,252,254, 88,46,37,37,112,68,32,37,108,105,6,30,37,69,58,16, 1,18,92,62,19,32,32,134,65,31,33,96,125,42,32,96, 63,17,29,92,62,51,32,134,65,31,33,96,125,6,36,32, 96,63,17,0,0,1,1,5,255,234,3,19,3,142,0,36, 0,0,37,17,6,15,1,39,54,55,54,55,22,23,22,23, 7,38,39,38,39,17,54,55,54,55,23,6,7,6,7,38, 39,38,39,55,22,23,22,1,242,92,62,51,32,134,65,31, 33,96,125,6,36,32,96,63,17,29,92,62,19,32,32,134, 65,31,33,96,125,6,36,32,96,63,17,93,2,190,88,46, 37,37,112,68,32,37,108,105,6,30,37,69,58,16,28,253, 66,88,46,14,23,37,112,68,32,37,108,105,6,30,37,69, 58,16,0,1,0,15,255,240,2,90,2,117,0,8,0,0, 1,51,17,33,21,39,55,21,33,2,35,55,254,91,166,166, 1,110,2,117,253,207,84,112,111,84,0,1,0,30,255,241, 3,171,2,1,0,19,0,0,1,21,33,7,23,33,21,33, 23,7,38,39,38,39,54,55,54,55,23,7,3,171,253,24, 81,81,2,232,253,72,77,41,92,94,25,38,129,69,22,29, 41,77,1,126,53,80,80,53,98,33,114,90,24,36,122,80, 26,36,33,98,0,1,0,39,0,2,2,55,3,143,0,19, 0,0,19,39,54,55,54,55,22,23,22,23,7,39,17,35, 17,39,7,17,35,17,72,33,114,90,24,36,122,80,26,36, 33,98,53,80,80,53,2,109,41,92,94,25,38,129,69,22, 29,41,77,253,72,2,232,81,81,253,24,2,184,0,0,1, 0,45,255,236,3,186,1,252,0,19,0,0,5,39,55,33, 53,33,55,39,33,53,33,39,55,22,23,22,23,6,7,6, 2,193,41,77,253,72,2,232,81,81,253,24,2,184,77,41, 92,94,25,38,129,69,22,20,33,98,53,80,80,53,98,33, 114,90,24,36,122,80,26,0,0,1,0,44,255,237,2,60, 3,122,0,19,0,0,1,23,6,7,6,7,38,39,38,39, 55,23,17,51,17,23,55,17,51,17,2,27,33,114,90,24, 36,122,80,26,36,33,98,53,80,80,53,1,15,41,92,94, 25,38,129,69,22,29,41,77,2,184,253,24,81,81,2,232, 253,72,0,2,0,27,255,236,3,255,1,254,0,25,0,31, 0,0,19,33,39,55,22,23,22,23,6,7,6,7,39,55, 33,23,7,38,39,38,39,54,55,54,55,23,3,33,55,39, 33,7,241,2,56,76,40,110,68,30,42,111,82,19,38,40, 76,253,200,76,40,110,68,30,42,111,82,19,38,40,120,2, 145,84,84,253,111,84,1,125,95,34,132,65,29,39,101,96, 23,45,34,95,95,34,132,65,29,39,101,96,23,45,34,254, 195,86,86,86,255,255,0,17,0,0,2,141,2,217,16,71, 0,36,0,0,2,217,64,0,192,0,0,3,0,36,255,233, 1,254,2,229,0,19,0,35,0,51,0,0,1,22,31,1, 35,52,39,38,39,38,39,38,35,34,7,39,54,51,22,23, 7,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 23,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 1,211,37,4,2,80,16,7,14,40,59,17,19,80,46,60, 69,117,137,65,188,152,57,29,102,56,79,144,60,33,105,55, 77,93,38,19,78,31,41,90,39,21,82,30,2,61,90,119, 110,160,63,30,36,95,18,5,51,54,77,1,149,52,129,65, 91,167,71,39,119,67,95,174,70,37,77,92,48,64,137,48, 19,88,47,66,145,46,16,0,0,1,0,90,0,0,2,84, 2,217,0,11,0,0,1,33,53,33,53,33,53,33,17,33, 53,33,1,247,254,99,1,157,254,100,1,249,254,6,1,157, 1,76,82,233,82,253,39,82,0,3,0,43,255,213,1,251, 2,217,0,3,0,21,0,31,0,0,1,51,1,35,19,50, 19,22,21,16,7,6,35,34,39,38,53,52,55,54,55,50, 23,34,17,16,51,50,55,54,53,16,1,117,59,254,255,59, 159,218,13,1,138,42,52,176,43,13,69,54,95,7,7,142, 140,118,21,5,2,217,252,252,2,240,254,183,21,22,254,241, 69,20,216,66,84,195,93,71,7,78,254,223,254,220,192,46, 57,1,30,0,0,2,0,10,0,0,2,189,2,217,0,3, 0,6,0,0,51,1,51,9,1,3,33,10,1,38,100,1, 41,254,166,212,1,167,2,217,253,39,2,104,253,234,255,255, 0,10,0,0,2,189,2,217,16,71,7,82,0,0,2,217, 64,0,192,0,0,1,0,45,0,0,1,249,1,212,0,23, 0,0,1,21,33,22,23,22,59,1,21,35,34,39,38,52, 55,54,59,1,21,35,34,7,6,7,1,249,254,108,14,40, 49,64,237,237,113,74,36,36,74,113,237,237,64,49,40,14, 1,5,54,70,37,46,54,106,50,156,50,106,54,46,37,70, 0,3,0,44,255,198,1,249,2,43,0,31,0,38,0,42, 0,0,1,21,35,7,22,59,1,21,35,34,39,7,39,55, 38,39,38,53,52,55,54,55,54,59,1,55,23,7,51,21, 35,7,55,35,34,7,6,7,51,7,55,35,22,1,249,216, 80,18,33,245,255,41,26,45,44,44,54,19,20,22,50,97, 26,21,116,49,46,35,68,99,87,29,93,58,52,42,3,159, 93,64,128,12,1,5,54,141,12,54,19,77,25,78,51,42, 45,52,56,42,97,30,8,87,25,62,54,153,155,59,47,49, 167,113,71,0,0,1,0,105,255,61,2,205,2,217,0,7, 0,0,19,33,17,35,17,33,17,35,105,2,100,118,254,136, 118,2,217,252,100,3,55,252,201,0,255,255,0,105,255,61, 2,205,2,217,16,71,7,86,0,0,2,22,64,0,192,0, 0,1,0,41,255,61,2,180,2,217,0,11,0,0,19,33, 21,33,9,1,33,21,33,53,9,1,56,2,111,254,37,1, 77,254,168,1,243,253,117,1,103,254,168,2,217,96,254,158, 254,133,95,74,1,141,1,109,0,1,0,40,0,197,2,32, 1,11,0,3,0,0,1,21,33,53,2,32,254,8,1,11, 70,70,0,2,0,50,255,245,2,22,2,111,0,11,0,15, 0,0,37,35,21,35,53,35,53,51,53,51,21,51,17,33, 53,33,2,22,207,70,207,207,70,207,254,28,1,228,196,207, 207,70,207,207,1,31,70,0,0,1,0,64,0,134,1,172, 2,40,0,114,0,0,55,38,39,53,54,55,54,53,52,39, 7,6,15,1,6,35,6,39,38,53,52,63,1,54,55,39, 38,39,38,39,38,39,38,39,38,53,52,55,54,51,50,23, 22,23,22,23,22,23,63,1,38,39,38,39,38,53,52,55, 23,22,21,15,1,6,49,6,7,31,1,54,55,54,55,54, 55,54,51,50,23,22,21,7,6,7,6,15,2,6,21,23, 22,31,1,22,21,7,21,6,39,34,47,2,38,47,1,6, 21,20,23,22,23,7,6,246,32,5,1,16,12,5,10,45, 38,13,11,15,24,9,3,27,96,35,1,3,3,6,45,41, 13,11,21,11,4,6,7,20,21,18,5,19,20,36,10,4, 4,2,2,12,4,3,7,36,19,17,4,3,16,3,2,2, 4,4,10,38,24,10,8,18,21,20,7,6,3,7,17,5, 4,62,48,12,3,8,25,96,27,3,9,24,15,11,43,29, 12,12,10,5,19,8,2,1,8,134,5,32,15,14,39,30, 36,17,2,3,26,48,15,9,1,16,7,9,30,10,28,10, 11,7,3,3,21,6,2,3,6,20,8,9,10,10,12,14, 4,26,27,19,5,1,3,15,44,32,11,9,23,13,33,1, 3,7,23,28,9,51,15,30,15,3,1,5,20,34,16,6, 14,12,10,10,15,15,9,3,1,12,20,6,6,7,8,7, 28,8,31,16,1,16,1,9,49,25,8,7,3,2,17,38, 44,20,17,21,26,0,0,1,0,7,255,220,2,0,3,145, 0,7,0,0,1,23,11,1,7,39,55,19,1,220,36,152, 241,94,18,148,193,3,145,5,252,80,1,241,46,33,73,254, 116,0,0,2,0,26,0,123,2,127,1,149,0,55,0,74, 0,0,1,7,38,35,34,7,6,7,6,7,22,23,22,23, 22,51,50,63,1,23,6,35,34,39,38,47,1,6,7,6, 7,6,35,34,39,38,39,52,55,54,55,54,51,50,23,22, 23,22,23,54,55,54,55,54,51,50,5,38,35,7,6,7, 6,7,23,22,23,22,51,50,55,54,55,39,38,2,122,28, 38,24,20,24,37,45,22,6,13,55,9,8,42,31,18,17, 24,32,37,55,46,45,44,39,18,46,66,8,6,32,31,73, 42,24,1,1,6,48,37,47,31,33,38,40,2,47,79,35, 10,11,28,26,42,254,141,28,23,26,44,16,2,1,2,10, 43,16,18,20,22,47,69,48,31,1,116,38,20,8,13,44, 20,6,23,36,6,4,23,8,14,34,36,27,26,38,18,56, 33,4,2,12,59,35,42,7,6,60,39,29,12,14,35,1, 41,69,17,5,4,10,63,11,3,13,50,8,7,25,48,17, 7,8,16,66,42,24,0,3,0,25,0,124,2,177,1,149, 0,39,0,60,0,80,0,0,1,54,55,54,55,54,51,50, 23,22,23,7,6,7,6,35,34,39,38,47,1,7,6,7, 39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22, 7,38,39,38,39,38,35,34,15,1,6,21,22,23,22,51, 50,55,54,55,54,55,22,23,22,31,1,54,55,54,55,39, 38,39,38,35,34,7,6,7,6,1,101,71,33,11,14,30, 31,46,37,52,6,1,8,51,34,40,7,6,86,80,18,48, 63,73,31,64,34,19,1,7,58,35,41,31,30,46,53,10, 13,77,36,3,3,20,19,30,23,16,21,2,47,21,24,11, 11,47,38,10,103,60,21,20,31,27,51,26,11,1,3,14, 43,14,16,19,20,38,71,5,1,41,64,18,6,6,13,27, 37,61,31,62,37,25,1,8,80,18,46,53,7,1,9,62, 33,36,7,6,66,37,22,13,21,46,9,51,64,15,1,1, 7,18,16,27,32,51,24,12,3,11,33,9,36,58,12,12, 7,2,2,42,19,23,24,48,16,5,7,14,59,4,0,1, 0,26,0,0,2,226,2,161,0,5,0,0,1,23,1,33, 21,33,2,185,41,253,190,2,32,253,90,2,161,37,253,187, 55,0,0,1,0,23,0,0,2,71,1,198,0,5,0,0, 33,35,11,1,35,1,2,71,65,215,215,65,1,24,1,94, 254,162,1,198,0,1,0,30,0,0,2,66,1,221,0,5, 0,0,19,55,27,1,23,1,30,44,230,230,44,254,238,1, 192,29,254,137,1,119,29,254,64,0,0,1,0,40,0,0, 2,220,1,253,0,25,0,0,33,35,53,52,39,38,35,34, 7,6,29,1,35,53,52,55,54,55,54,51,50,23,22,23, 22,21,2,220,55,91,87,113,113,87,91,55,93,95,136,11, 11,138,102,97,8,1,190,109,79,76,76,79,109,190,180,125, 96,99,8,1,95,91,123,10,10,0,0,1,0,40,255,239, 2,220,1,236,0,25,0,0,1,51,21,20,7,6,7,6, 35,34,39,38,39,38,61,1,51,21,20,23,22,51,50,55, 54,53,2,165,55,93,65,90,48,50,138,102,97,8,1,55, 91,87,113,113,87,91,1,236,180,125,96,68,26,14,95,91, 123,10,10,180,190,109,79,76,76,79,109,0,0,1,0,100, 255,10,1,198,2,255,0,27,0,0,23,17,52,55,54,51, 50,23,7,38,35,34,7,6,7,17,20,7,6,7,6,35, 34,39,55,22,51,50,230,39,52,81,19,33,15,29,13,8, 4,68,2,37,37,68,25,25,13,10,2,19,15,94,33,2, 83,79,55,71,7,83,9,1,13,128,253,222,104,56,56,20, 8,3,86,8,0,2,0,100,255,10,2,182,2,255,0,27, 0,55,0,0,5,17,52,55,54,51,50,23,7,38,35,34, 7,6,7,17,20,7,6,7,6,35,34,39,55,22,51,50, 39,17,52,55,54,51,50,23,7,38,35,34,7,6,7,17, 20,7,6,7,6,35,34,39,55,22,51,50,1,214,39,52, 81,19,33,15,29,13,8,4,68,2,37,37,68,25,25,13, 10,2,19,15,94,240,39,52,81,19,33,15,29,13,8,4, 68,2,37,37,68,25,25,13,10,2,19,15,94,33,2,83, 79,55,71,7,83,9,1,13,128,253,222,104,56,56,20,8, 3,86,8,132,2,83,79,55,71,7,83,9,1,13,128,253, 222,104,56,56,20,8,3,86,8,0,0,3,0,100,255,10, 3,86,2,255,0,27,0,55,0,83,0,0,5,17,52,55, 54,51,50,23,7,38,35,34,7,6,7,17,20,7,6,7, 6,35,34,39,55,22,51,50,39,17,52,55,54,51,50,23, 7,38,35,34,7,6,7,17,20,7,6,7,6,35,34,39, 55,22,51,50,39,17,52,55,54,51,50,23,7,38,35,34, 7,6,7,17,20,7,6,7,6,35,34,39,55,22,51,50, 2,118,39,52,81,19,33,15,29,13,8,4,68,2,37,37, 68,25,25,13,10,2,19,15,94,200,39,52,81,19,33,15, 29,13,8,4,68,2,37,37,68,25,25,13,10,2,19,15, 94,200,39,52,81,19,33,15,29,13,8,4,68,2,37,37, 68,25,25,13,10,2,19,15,94,33,2,83,79,55,71,7, 83,9,1,13,128,253,222,104,56,56,20,8,3,86,8,132, 2,83,79,55,71,7,83,9,1,13,128,253,222,104,56,56, 20,8,3,86,8,132,2,83,79,55,71,7,83,9,1,13, 128,253,222,104,56,56,20,8,3,86,8,0,0,1,0,100, 255,10,1,198,2,255,0,27,0,0,23,17,52,55,54,51, 50,23,7,38,35,34,7,6,7,17,20,7,6,7,6,35, 34,39,55,22,51,50,230,39,52,81,19,33,15,29,13,8, 4,68,2,37,37,68,25,25,13,10,2,19,15,94,33,2, 83,79,55,71,7,83,9,1,13,128,253,222,104,56,56,20, 8,3,86,8,0,3,0,163,0,0,2,189,1,222,0,15, 0,31,0,47,0,0,55,52,55,54,51,50,23,22,21,20, 7,6,35,34,39,38,37,52,55,54,51,50,23,22,21,20, 7,6,35,34,39,38,3,52,55,54,51,50,23,22,21,20, 7,6,35,34,39,38,163,36,13,16,40,18,7,36,13,16, 40,18,7,1,152,36,13,16,40,18,7,36,13,16,39,18, 8,204,36,13,16,40,18,7,36,13,16,40,18,7,65,40, 18,7,36,13,16,40,18,7,36,13,16,40,18,7,36,13, 16,40,18,7,34,15,1,108,40,18,7,36,13,16,40,18, 7,36,13,0,0,1,0,17,0,203,2,17,1,51,0,32, 0,0,1,23,7,6,7,6,35,34,47,1,38,35,34,7, 6,7,39,54,55,54,55,23,22,23,22,23,22,23,50,55, 54,55,54,1,236,37,20,17,26,34,37,44,75,10,66,41, 24,20,23,34,41,27,4,38,66,37,30,79,11,8,40,32, 26,21,26,27,2,1,51,24,29,20,12,16,26,3,23,8, 10,37,25,33,3,37,5,1,4,28,4,3,12,1,8,10, 33,2,0,1,0,75,1,12,1,252,1,182,0,27,0,0, 1,51,21,20,7,6,35,34,47,1,38,35,34,7,6,7, 35,54,55,54,51,50,31,1,22,51,50,55,1,199,53,57, 21,27,39,42,98,23,20,29,16,5,3,53,7,84,8,9, 27,27,117,28,22,44,6,1,155,16,85,30,12,26,63,14, 35,14,29,131,13,1,16,69,17,49,0,2,0,17,255,231, 2,17,1,230,0,32,0,36,0,0,1,23,7,6,7,6, 35,34,47,1,38,35,34,7,6,7,39,54,55,54,55,23, 22,23,22,23,22,23,50,55,54,55,54,39,23,1,39,1, 236,37,20,17,26,34,37,44,75,10,66,41,24,20,23,34, 41,27,4,38,66,37,30,79,11,8,40,32,26,21,26,27, 2,123,50,254,242,51,1,51,24,29,20,12,16,26,3,23, 8,10,37,25,33,3,37,5,1,4,28,4,3,12,1,8, 10,33,2,180,28,254,29,29,0,1,0,95,0,34,1,232, 1,171,0,11,0,0,1,23,7,23,7,39,7,39,55,39, 55,23,1,182,49,146,147,50,147,146,50,147,146,49,146,1, 171,50,146,147,50,147,146,49,147,146,49,145,0,3,0,50, 0,0,2,22,1,216,0,3,0,7,0,11,0,0,1,21, 33,53,5,21,35,53,19,21,35,53,2,22,254,28,1,38, 104,104,104,1,15,70,70,167,104,104,1,112,104,104,0,1, 0,53,255,204,2,71,2,54,0,47,0,0,37,6,35,34, 39,7,35,55,38,35,34,7,39,54,51,50,23,55,39,38, 35,34,7,39,54,51,50,23,22,23,55,51,7,22,51,50, 55,23,6,35,34,39,7,23,22,51,50,55,2,71,26,135, 52,77,71,54,82,27,23,70,37,40,41,124,26,33,37,63, 29,22,70,37,40,41,124,46,70,1,8,71,54,81,32,22, 71,31,40,26,135,28,35,37,67,31,21,71,31,223,148,51, 178,205,16,80,15,132,13,93,40,16,80,15,132,44,1,5, 177,204,18,98,16,148,14,93,42,16,98,0,0,1,0,32, 255,231,2,4,1,230,0,19,0,0,55,35,53,51,55,35, 53,33,55,23,7,51,21,35,7,51,21,33,7,39,157,125, 164,57,221,1,4,76,50,59,157,196,57,253,254,220,76,51, 111,70,102,70,133,28,105,70,102,70,136,29,0,2,0,45, 255,245,2,22,2,127,0,3,0,10,0,0,37,21,33,53, 17,53,37,21,13,1,21,2,22,254,23,1,233,254,118,1, 138,56,67,67,1,51,69,207,79,161,164,79,0,2,0,45, 255,245,2,22,2,127,0,3,0,10,0,0,37,21,33,53, 1,21,5,53,45,1,53,2,22,254,23,1,233,254,23,1, 138,254,118,56,67,67,1,120,69,207,79,161,164,79,0,3, 0,43,255,241,2,221,2,163,0,11,0,29,0,53,0,0, 1,51,21,51,21,35,21,35,53,35,53,51,5,20,23,22, 51,50,55,54,53,52,47,1,38,35,34,15,1,6,7,52, 55,54,55,50,51,50,23,22,23,20,21,20,7,6,7,34, 35,34,39,38,39,52,1,105,54,223,223,54,221,221,254,247, 88,85,119,123,86,83,88,31,77,96,123,86,26,57,53,97, 97,139,6,6,140,100,100,5,97,97,139,6,6,140,100,100, 5,2,65,220,54,223,223,54,27,123,86,83,88,85,119,123, 86,26,57,88,31,77,96,140,100,100,5,97,97,139,6,6, 140,100,100,5,97,97,139,6,0,3,0,43,255,241,2,221, 2,163,0,3,0,21,0,45,0,0,1,33,53,33,5,20, 23,22,51,50,55,54,53,52,47,1,38,35,34,15,1,6, 7,52,55,54,55,50,51,50,23,22,23,20,21,20,7,6, 7,34,35,34,39,38,39,52,2,126,254,14,1,242,253,226, 88,85,119,123,86,83,88,31,77,96,123,86,26,57,53,97, 97,139,6,6,140,100,100,5,97,97,139,6,6,140,100,100, 5,1,47,54,27,123,86,83,88,85,119,123,86,26,57,88, 31,77,96,140,100,100,5,97,97,139,6,6,140,100,100,5, 97,97,139,6,0,3,0,43,255,239,2,221,2,161,0,11, 0,35,0,53,0,0,19,55,23,55,23,7,23,7,39,7, 39,55,33,52,55,54,55,50,51,50,23,22,23,20,21,20, 7,6,7,34,35,34,39,38,39,52,55,20,23,22,51,50, 55,54,53,52,47,1,38,35,34,15,1,6,193,39,156,156, 39,156,156,39,156,156,39,156,254,206,97,97,139,6,6,140, 100,100,5,97,97,139,6,6,140,100,100,5,53,88,85,119, 123,86,83,88,31,77,96,123,86,26,57,1,228,39,157,156, 38,156,156,38,156,157,39,156,140,100,100,5,97,97,139,6, 6,140,100,100,5,97,97,139,6,6,123,86,83,88,85,119, 123,86,26,57,88,31,77,0,0,1,0,15,0,0,2,140, 2,162,0,7,0,0,37,21,33,53,33,17,51,17,2,140, 253,131,1,35,55,55,55,55,2,107,253,149,0,3,0,39, 255,232,3,13,2,207,0,8,0,18,0,44,0,0,9,1, 22,51,50,55,54,53,52,9,1,38,35,34,15,1,6,21, 20,1,23,7,22,21,20,7,6,7,6,35,34,39,7,39, 55,38,53,52,55,54,55,54,51,50,23,2,138,254,74,86, 116,129,92,91,253,217,1,183,87,113,129,92,28,63,2,130, 36,91,92,101,100,145,10,11,139,102,97,37,97,89,101,100, 145,10,11,136,104,2,42,254,70,74,92,91,129,117,254,195, 1,183,73,92,32,83,105,113,1,226,35,91,103,140,147,107, 104,8,1,91,98,37,98,102,137,147,107,104,8,1,89,0, 0,2,0,16,0,0,1,206,2,232,0,5,0,9,0,0, 1,19,3,35,3,27,2,11,1,1,14,192,192,62,192,192, 32,160,160,161,2,232,254,140,254,140,1,116,1,116,253,84, 1,56,1,56,254,200,0,1,0,55,0,0,1,242,2,182, 0,28,0,0,1,17,20,7,6,35,34,39,38,53,52,55, 54,51,50,23,17,51,21,20,23,22,29,1,35,53,52,39, 38,1,21,56,25,30,64,32,15,56,25,30,54,32,25,137, 84,25,137,38,1,247,254,92,50,23,10,39,20,24,50,23, 10,29,2,45,55,28,109,67,148,56,56,28,109,30,0,1, 0,102,0,87,1,88,1,47,0,11,0,0,19,22,23,22, 23,7,6,35,38,47,1,38,102,150,67,24,1,3,5,16, 33,36,68,38,1,47,77,77,28,17,9,7,3,46,85,44, 0,2,0,80,0,101,1,28,1,54,0,15,0,31,0,0, 19,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54, 23,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, 182,54,31,17,46,26,30,55,30,17,47,25,30,45,22,11, 40,17,21,45,23,10,40,18,1,54,47,26,32,56,31,17, 47,26,31,57,31,17,24,40,19,22,46,24,10,41,18,21, 48,23,10,0,0,2,0,152,0,170,3,64,3,94,0,30, 0,60,0,0,1,54,55,54,51,50,23,22,23,7,6,7, 6,7,6,7,6,7,6,7,6,39,38,53,52,55,54,55, 54,55,54,37,54,63,1,50,23,22,23,7,6,7,6,7, 6,7,6,7,6,7,6,35,39,38,52,55,54,55,54,55, 54,2,201,13,37,10,11,5,5,33,4,2,1,2,24,80, 20,11,26,77,28,15,8,12,5,4,42,72,25,25,14,254, 192,15,36,18,6,5,31,1,3,2,2,27,89,16,11,30, 86,33,18,7,9,4,5,5,46,87,27,35,17,3,17,53, 18,5,1,9,50,31,8,8,82,177,42,26,58,119,42,26, 12,1,3,7,6,7,74,181,62,148,82,44,50,14,4,2, 9,48,31,6,7,78,174,33,22,61,121,46,28,11,1,2, 13,7,77,192,59,148,70,0,0,1,1,8,0,97,3,35, 2,191,0,42,0,0,37,54,55,35,6,7,6,7,39,55, 54,55,54,55,22,23,15,1,6,7,6,7,51,55,23,22, 21,15,2,6,7,22,21,20,7,35,38,47,1,38,39,22, 2,10,89,86,222,79,126,1,2,2,1,109,62,22,31,71, 1,4,16,4,10,12,28,222,29,9,55,3,15,33,110,111, 74,14,11,33,34,66,36,41,90,226,126,171,153,115,1,1, 2,4,138,155,58,93,20,18,8,13,2,6,29,60,42,6, 43,12,8,7,9,171,115,72,34,13,1,7,50,98,48,42, 58,0,0,2,0,99,0,124,3,144,3,108,0,22,0,47, 0,0,37,54,55,54,55,54,53,38,39,38,39,38,35,34, 7,6,7,6,21,23,22,23,22,23,38,39,38,39,38,53, 52,55,54,55,54,51,23,22,23,22,23,22,21,20,7,6, 7,6,1,244,121,106,99,20,4,2,94,93,120,21,20,122, 106,100,19,3,3,18,98,109,122,136,118,111,28,7,101,97, 133,35,34,52,133,107,106,13,1,101,99,132,39,175,1,89, 83,107,22,23,108,93,93,16,3,87,83,106,19,18,41,107, 85,90,52,2,98,91,120,32,32,124,109,106,28,8,3,19, 102,102,122,14,13,122,109,106,29,9,0,1,1,207,0,24, 3,88,3,224,0,31,0,0,9,1,54,55,50,23,22,21, 7,6,7,9,1,22,23,20,7,6,7,6,35,34,39,1, 38,53,52,53,38,53,54,55,1,238,1,19,21,27,9,7, 12,3,4,8,254,234,1,32,15,1,4,3,5,7,8,28, 22,254,222,20,6,1,23,2,47,1,144,32,1,5,7,19, 22,11,11,254,106,254,101,23,21,11,7,6,3,5,32,1, 158,6,22,3,2,13,12,28,3,0,0,1,0,77,0,2, 1,254,3,228,0,28,0,0,9,1,38,53,52,55,54,51, 50,23,1,22,21,20,15,1,6,35,1,6,35,6,39,38, 53,52,55,54,55,1,168,254,198,17,11,6,10,28,22,1, 63,20,1,1,5,14,254,178,23,26,10,7,11,10,4,4, 1,245,1,163,23,23,17,8,4,30,254,87,5,24,6,6, 18,20,254,83,29,1,6,8,16,17,18,6,6,0,0,2, 2,88,0,0,3,207,3,232,0,5,0,11,0,0,1,51, 3,19,35,3,19,51,3,19,35,3,3,157,50,188,188,50, 188,50,50,187,187,50,187,3,232,254,12,254,12,1,244,1, 244,254,12,254,12,1,244,0,0,2,0,25,0,0,1,144, 3,232,0,5,0,11,0,0,1,3,51,19,3,35,3,51, 19,3,35,19,1,94,188,50,188,188,50,137,50,187,187,50, 187,1,244,1,244,254,12,254,12,3,232,254,12,254,12,1, 244,0,0,1,1,183,255,247,3,166,3,241,0,27,0,0, 1,33,50,23,22,21,20,15,1,35,33,17,20,7,6,35, 34,39,38,53,17,38,53,52,55,54,51,50,2,17,1,90, 41,14,4,33,25,1,254,174,25,6,7,23,10,4,23,29, 10,21,19,3,220,25,6,7,23,10,4,252,161,41,14,4, 33,12,14,3,103,11,18,22,10,27,0,1,0,190,255,247, 2,47,3,241,0,27,0,0,37,17,52,55,54,51,50,23, 22,21,17,22,21,20,7,6,35,34,39,35,34,39,38,53, 52,55,54,51,1,206,25,6,6,25,10,3,22,28,10,22, 18,11,220,43,14,3,32,13,15,88,3,94,43,13,3,34, 11,14,252,154,11,18,22,10,28,22,25,6,7,22,11,4, 0,2,2,188,0,50,3,182,3,232,0,5,0,11,0,0, 37,51,17,51,53,35,39,51,21,35,17,35,2,213,50,150, 200,25,250,150,100,75,3,82,50,25,100,252,174,0,0,2, 0,50,0,0,1,44,3,182,0,5,0,11,0,0,55,51, 17,35,17,35,7,53,51,17,51,17,75,200,50,150,25,150, 100,25,3,132,252,174,75,100,3,82,252,74,0,1,2,188, 0,0,3,182,3,232,0,13,0,0,1,51,6,7,6,7, 6,21,20,23,22,31,1,35,2,188,250,93,29,1,2,22, 22,24,88,13,250,3,232,196,114,8,7,93,96,96,90,102, 173,25,0,1,0,50,0,0,1,44,3,232,0,14,0,0, 19,51,17,35,54,55,54,55,54,53,52,39,38,39,38,50, 250,250,84,26,9,6,21,21,27,92,3,3,232,252,24,169, 79,27,25,90,96,96,93,115,197,6,0,1,1,170,255,251, 2,246,3,249,0,38,0,0,1,38,53,52,63,1,54,51, 50,23,22,21,20,7,6,15,1,23,21,17,23,22,21,20, 7,6,35,34,47,1,6,35,34,39,38,53,39,54,55,1, 189,19,25,230,23,25,14,8,7,6,7,12,214,1,204,23, 8,7,13,24,25,176,6,6,23,10,4,3,1,2,2,191, 4,20,27,24,217,21,8,7,11,11,13,13,12,202,3,1, 254,53,204,23,25,13,8,8,24,177,3,32,13,15,26,4, 2,0,0,1,0,197,255,246,1,246,3,237,0,43,0,0, 37,19,39,38,53,52,55,54,51,50,31,1,54,51,50,23, 22,23,22,23,20,15,1,3,22,21,20,7,6,7,34,39, 7,6,7,34,39,38,39,38,53,55,54,55,1,154,2,173, 25,7,8,14,24,23,152,2,6,23,10,2,1,11,1,4, 7,2,17,21,9,25,5,3,166,23,22,9,7,5,4,6, 4,7,18,214,2,41,161,24,24,11,9,8,21,141,1,33, 6,7,16,16,9,7,8,254,15,8,19,21,20,33,2,1, 133,18,1,4,2,5,7,10,17,18,14,0,0,3,0,177, 0,66,3,69,3,32,0,7,0,24,0,92,0,0,1,22, 23,54,55,15,1,6,7,38,39,6,7,6,7,6,21,20, 23,22,23,22,51,55,54,19,7,34,35,63,1,50,51,48, 55,23,6,7,54,55,23,6,7,6,21,54,51,50,23,55, 23,7,22,23,22,21,20,7,6,15,1,39,54,55,54,55, 54,53,52,39,38,39,6,7,23,7,6,35,34,39,38,39, 38,39,38,53,52,55,54,55,54,55,52,1,200,4,11,53, 63,55,58,8,50,18,5,29,21,72,22,5,2,10,26,3, 2,19,44,45,137,5,6,1,144,5,4,18,65,12,5,49, 108,15,121,57,5,65,59,24,24,50,55,38,46,31,64,29, 38,106,57,17,114,35,8,6,17,42,26,43,93,79,7,54, 78,66,7,8,58,28,6,3,7,85,19,22,36,50,1,176, 69,66,62,92,3,11,2,198,101,69,14,16,51,76,20,16, 11,8,29,7,1,2,14,1,158,1,65,1,147,9,88,43, 6,27,63,30,7,52,41,16,3,78,35,58,17,30,62,96, 63,49,64,34,17,63,31,36,8,10,29,44,76,41,25,12, 141,84,38,11,75,1,8,53,10,12,22,24,90,83,19,16, 26,22,48,0,0,3,0,132,0,90,3,117,3,165,0,6, 0,23,0,95,0,0,1,22,23,54,55,35,6,7,38,39, 6,7,6,7,6,21,20,23,22,23,22,51,55,54,19,6, 35,63,1,50,55,54,55,23,6,7,54,55,23,7,6,7, 6,21,54,51,50,23,55,23,7,22,23,22,21,20,7,6, 7,6,15,1,39,54,55,54,55,54,53,52,39,38,39,6, 7,23,7,34,53,6,35,34,39,38,39,38,39,38,53,52, 55,54,55,54,55,52,1,188,4,16,72,74,57,43,102,22, 5,34,32,81,27,8,3,11,31,5,5,21,51,58,39,137, 1,154,14,13,6,16,64,14,6,68,120,16,144,34,32,6, 73,72,31,31,59,55,47,55,38,73,12,8,13,43,116,70, 18,124,42,16,9,21,50,31,54,122,81,9,63,1,88,74, 7,8,61,32,8,5,7,88,26,30,40,61,2,0,82,90, 84,110,4,249,123,83,16,22,60,85,25,21,14,11,35,10, 2,2,14,1,236,2,65,1,1,58,116,9,106,53,10,30, 63,34,6,3,80,39,20,4,93,35,73,18,37,70,109,42, 38,25,22,71,38,21,63,34,37,13,16,35,54,88,49,31, 14,181,83,47,12,2,83,1,7,57,13,15,24,27,98,91, 26,22,30,26,45,0,0,2,0,206,0,136,3,32,2,170, 0,13,0,33,0,0,1,55,22,23,22,23,22,21,7,39, 53,38,39,38,37,23,6,21,20,23,22,23,54,55,23,6, 15,1,38,39,38,39,55,54,2,120,51,68,21,4,4,19, 1,65,3,11,17,254,62,63,44,1,4,36,31,28,57,45, 33,69,58,12,3,1,1,5,2,30,39,86,51,11,11,58, 86,57,1,94,50,35,50,231,17,157,77,12,12,77,96,76, 47,31,75,112,3,147,77,23,21,62,70,0,0,2,0,165, 0,166,3,73,3,28,0,15,0,34,0,0,1,55,22,23, 22,23,22,21,7,47,1,38,39,38,39,38,37,23,6,7, 21,22,23,54,55,23,6,15,1,38,39,38,39,53,54,2, 145,51,78,25,4,4,22,1,65,1,3,13,19,77,2,254, 70,63,47,3,5,47,30,42,57,45,46,69,63,14,7,2, 6,2,126,40,100,60,12,11,65,107,59,1,112,58,39,57, 101,3,161,17,175,83,42,88,127,82,73,31,76,143,3,160, 79,37,34,66,83,0,0,2,0,243,0,62,3,18,3,8, 0,34,0,47,0,0,1,39,54,55,54,23,50,23,22,21, 20,7,6,7,6,7,6,15,1,39,54,55,54,55,54,63, 1,38,39,38,39,7,34,35,6,39,55,22,23,22,51,50, 55,23,7,34,39,38,1,8,21,118,75,49,42,137,67,55, 5,24,113,3,4,54,112,6,19,104,52,72,32,8,4,3, 1,32,48,127,66,2,2,66,37,31,77,36,29,41,34,55, 5,99,44,34,49,1,181,61,39,9,6,1,59,49,77,22, 22,103,78,3,2,36,36,2,63,32,34,47,66,17,16,31, 47,28,41,1,4,8,246,57,39,8,6,5,65,5,8,10, 0,2,0,205,0,86,3,58,3,134,0,36,0,50,0,0, 19,39,54,55,54,51,50,23,22,23,20,7,6,7,6,7, 6,7,39,54,55,54,55,54,55,54,55,54,53,52,39,38, 35,7,34,7,6,3,55,22,23,22,51,50,55,23,6,35, 34,39,38,225,20,128,93,55,48,158,77,61,1,6,25,119, 10,10,67,131,19,119,54,4,4,85,37,11,4,4,40,56, 149,73,5,4,84,32,30,85,48,34,49,35,67,5,78,33, 52,41,58,2,6,62,43,12,6,68,53,89,25,24,111,87, 7,7,44,40,62,37,34,3,3,55,76,21,20,17,17,58, 36,49,3,1,10,1,28,58,45,10,7,5,65,6,9,12, 0,2,0,134,0,29,3,49,3,35,0,48,0,58,0,0, 19,55,22,51,50,55,23,7,6,7,6,7,54,55,54,51, 50,23,22,21,7,20,23,22,23,50,55,23,6,35,39,38, 39,38,61,1,52,53,34,7,6,7,6,7,39,1,6,35, 34,39,55,22,23,22,23,7,38,39,38,219,9,83,83,103, 124,33,198,7,50,17,7,56,39,12,12,42,17,10,2,8, 12,59,50,116,11,128,49,45,64,23,13,6,5,31,45,65, 166,43,1,155,68,77,88,1,29,74,45,52,129,1,133,62, 43,2,17,65,15,25,61,205,3,47,17,4,34,9,4,34, 21,28,43,61,13,18,1,21,65,21,3,10,46,26,50,80, 2,1,1,8,28,38,124,49,1,171,11,230,59,37,11,13, 2,65,2,15,10,0,0,2,0,80,0,48,3,98,3,164, 0,46,0,56,0,0,19,55,22,51,50,51,54,55,23,1, 54,55,54,51,50,23,22,21,7,23,22,23,22,51,50,55, 23,6,35,34,39,38,53,55,38,39,6,7,6,7,6,7, 39,1,6,35,34,19,55,22,23,22,23,7,38,39,38,176, 9,127,71,5,5,82,168,32,254,195,67,41,14,13,47,16, 12,3,2,5,30,20,40,51,142,11,148,56,116,32,15,1, 1,1,30,51,17,9,74,194,43,1,231,87,95,103,2,28, 93,47,64,146,1,154,71,55,2,114,64,18,1,29,61,254, 184,40,9,4,36,23,32,49,60,37,9,7,24,64,25,66, 25,59,91,7,5,2,28,9,5,44,144,49,1,249,15,1, 10,58,43,12,16,2,65,2,17,13,0,3,0,136,0,40, 3,101,2,240,0,8,0,22,0,109,0,0,1,55,22,23, 22,23,7,38,39,1,6,15,1,20,23,22,23,55,54,55, 54,63,1,3,38,39,55,22,23,54,55,23,6,7,54,55, 23,6,7,6,7,54,51,50,23,22,23,22,23,22,21,20, 7,6,35,34,39,38,39,38,53,52,63,1,23,6,21,20, 23,22,23,22,51,55,54,55,54,55,54,55,52,39,38,39, 38,39,38,35,34,7,23,6,7,6,7,6,35,34,39,38, 39,38,53,52,55,54,55,54,55,52,2,152,31,60,29,22, 49,51,48,73,254,174,113,28,1,1,10,44,29,6,4,45, 6,1,2,51,121,9,104,62,4,1,65,1,4,50,116,13, 124,58,2,2,123,91,50,43,96,39,11,4,4,72,67,96, 9,10,79,32,19,6,7,63,10,4,12,41,6,6,39,34, 28,55,21,6,1,2,11,63,15,17,29,40,84,134,7,1, 11,21,66,25,28,18,19,54,22,14,17,8,13,54,114,2, 81,57,31,24,18,59,41,67,39,254,233,55,83,20,3,1, 14,3,1,1,2,14,44,44,1,40,1,15,65,15,1,99, 61,1,64,93,5,22,63,25,4,41,86,44,13,29,74,21, 23,18,18,88,63,59,1,5,44,25,34,20,29,25,15,39, 22,13,5,16,6,1,1,4,13,29,63,21,19,9,8,53, 31,8,5,11,48,119,41,30,56,20,7,3,9,33,22,26, 29,34,15,19,75,51,53,0,0,3,0,85,0,60,3,154, 3,110,0,9,0,25,0,111,0,0,1,55,22,23,22,23, 7,38,39,38,1,6,7,6,15,1,23,22,23,55,54,55, 54,63,1,39,19,38,39,55,22,51,55,23,6,7,54,55, 23,6,7,6,21,54,51,50,23,22,23,22,23,22,21,6, 7,6,35,34,39,38,39,38,53,38,55,23,6,21,20,23, 22,23,22,23,55,54,55,54,55,54,53,52,39,38,39,38, 39,38,35,34,7,6,7,23,6,7,6,7,6,35,34,39, 38,39,38,53,52,55,54,63,1,54,2,180,31,70,32,36, 45,50,45,27,26,254,80,130,37,3,3,2,3,11,52,34, 9,7,54,8,3,6,2,69,134,9,134,63,7,64,3,3, 70,129,13,139,76,4,143,107,58,50,105,46,14,6,4,1, 76,77,111,12,12,89,36,20,1,16,63,12,6,14,49,8, 7,44,43,33,62,26,10,2,12,72,20,22,35,48,121,130, 2,2,8,1,13,21,72,30,34,21,21,60,25,14,43,60, 135,3,1,2,186,58,37,27,30,58,41,56,23,21,254,218, 64,88,8,8,21,10,18,4,1,1,3,16,51,42,100,1, 5,1,18,64,18,190,1,134,53,5,27,64,28,6,102,56, 53,15,32,80,26,28,19,20,96,71,72,1,7,48,27,38, 26,59,16,45,25,16,9,19,8,1,1,1,4,17,32,71, 27,26,11,10,61,38,11,7,11,55,1,1,145,43,32,60, 24,10,4,11,36,26,28,49,59,85,60,150,23,0,0,2, 0,119,0,121,3,139,3,142,0,15,0,75,0,0,1,55, 22,23,22,23,22,23,7,39,55,22,23,38,39,38,37,6, 35,34,39,55,22,51,50,55,54,55,23,6,7,55,22,23, 22,23,22,21,20,7,6,7,6,15,1,38,47,1,55,22, 51,50,51,54,55,54,55,54,53,52,39,38,39,38,47,1, 7,35,6,7,6,7,39,54,55,54,2,115,45,90,34,12, 11,42,46,52,159,14,32,92,36,35,38,254,104,37,48,56, 57,7,67,42,51,39,8,2,65,2,6,46,106,52,12,8, 11,63,38,24,27,36,28,35,61,10,33,59,24,2,2,22, 39,10,9,55,6,16,49,8,7,31,57,1,21,112,24,43, 55,94,31,47,2,164,47,89,46,17,17,67,151,55,35,64, 8,20,112,57,61,21,6,8,64,7,9,90,149,1,152,75, 4,1,79,18,22,32,37,81,142,84,27,31,8,2,2,37, 6,56,35,4,71,18,20,124,79,24,18,47,19,3,2,3, 6,186,196,42,67,34,154,69,108,0,0,4,0,89,0,93, 3,231,3,176,0,10,0,21,0,40,0,107,0,0,1,55, 22,23,22,23,22,23,7,38,39,7,55,22,23,22,23,22, 23,7,38,47,1,55,22,23,22,23,22,23,22,23,7,39, 55,23,38,39,38,39,38,5,6,35,34,39,55,22,51,50, 55,54,55,23,6,7,54,51,50,23,22,23,22,23,22,21, 20,7,6,7,6,7,6,15,1,38,39,38,39,55,22,23, 50,55,54,55,54,55,54,55,52,39,38,39,38,39,38,35, 34,7,6,7,6,7,39,54,55,54,3,89,30,60,20,2, 2,18,10,59,13,28,119,29,58,17,4,4,13,15,61,12, 25,183,46,100,41,8,8,46,48,1,1,52,174,15,138,40, 38,39,105,2,254,177,48,55,62,52,6,66,51,56,45,8, 4,64,2,7,30,24,28,25,81,40,9,6,11,62,2,3, 42,28,28,35,29,38,65,8,4,34,64,26,4,2,25,40, 12,10,60,1,7,17,54,9,9,16,20,25,38,21,117,27, 51,55,100,34,53,2,246,57,31,21,3,2,20,29,25,33, 17,31,58,31,16,4,4,16,37,23,34,16,12,47,96,61, 12,13,73,157,2,4,56,39,63,30,124,63,63,101,2,76, 6,8,64,8,10,84,178,2,166,82,4,6,18,71,15,17, 34,39,86,144,5,6,92,31,30,8,2,1,41,5,2,55, 38,1,1,5,74,21,24,134,85,27,20,52,21,4,2,3, 6,198,205,49,81,35,163,76,119,0,0,1,0,150,0,22, 3,104,3,164,0,77,0,0,1,7,39,55,22,55,50,55, 38,39,55,22,23,54,55,54,55,23,6,7,22,23,54,55, 23,6,7,22,23,7,38,35,34,7,6,7,6,7,20,23, 22,23,22,51,50,55,54,55,23,6,7,35,38,39,38,39, 38,53,52,55,54,55,54,51,50,23,38,39,6,35,34,39, 55,22,51,54,55,38,1,211,95,168,4,122,57,30,26,21, 32,62,36,22,54,108,29,20,20,135,70,27,38,80,172,19, 159,65,48,94,31,156,81,60,53,75,54,46,5,50,56,73, 51,57,95,177,5,8,17,175,91,68,48,44,87,63,78,77, 67,84,66,73,59,64,42,38,91,119,99,115,5,135,82,88, 70,45,2,164,2,7,65,8,1,1,57,118,17,128,59,4, 34,9,5,62,42,10,61,51,16,51,62,47,15,51,83,59, 38,15,19,40,33,33,27,37,38,17,13,48,2,2,63,48, 5,3,11,21,44,54,62,62,57,48,22,18,12,41,45,16, 11,64,10,1,9,74,0,3,0,122,255,241,3,184,3,199, 0,8,0,19,0,101,0,0,1,55,22,23,22,23,7,38, 39,7,55,22,23,22,23,22,23,7,38,39,5,7,38,39, 55,22,55,50,55,38,39,55,22,23,54,55,54,55,23,6, 7,22,23,54,55,23,6,7,22,23,7,38,7,34,7,6, 7,6,7,22,23,22,23,22,23,22,51,50,55,54,55,23, 6,15,1,38,39,38,39,38,53,55,54,55,54,55,54,51, 50,23,38,39,6,35,34,39,55,22,51,50,55,38,3,41, 31,61,23,14,14,60,13,27,120,30,56,17,5,4,17,11, 60,12,26,254,205,107,67,113,4,134,63,32,29,22,37,63, 33,30,70,143,10,8,19,147,77,30,43,95,180,18,159,87, 47,110,30,169,90,65,58,80,60,52,4,2,49,3,2,58, 82,56,62,103,186,8,11,17,183,95,72,57,52,94,67,83, 3,13,66,69,93,70,78,67,77,56,39,100,130,106,123,5, 142,91,100,77,51,3,130,57,32,25,15,34,25,33,17,31, 58,30,16,4,5,19,34,23,34,16,127,3,1,7,65,8, 1,1,60,132,18,125,80,8,44,3,2,62,46,11,69,57, 19,54,63,47,20,51,98,60,42,1,15,21,44,38,35,31, 37,1,2,41,19,14,51,2,3,63,50,7,1,2,13,24, 47,56,67,29,51,47,49,26,19,15,55,46,18,12,64,11, 12,84,0,1,0,243,0,59,2,150,3,160,0,38,0,0, 1,23,6,15,2,6,7,6,21,20,23,22,31,1,22,31, 1,7,38,39,38,47,1,38,39,38,53,52,55,52,55,54, 55,54,55,54,55,54,2,45,56,102,61,26,89,17,5,4, 5,11,84,14,77,157,5,47,158,69,3,3,79,33,15,11, 7,1,16,62,34,12,70,107,2,3,160,32,178,77,30,99, 21,14,11,9,10,11,24,67,11,62,162,5,46,162,57,3, 2,64,30,31,23,26,20,19,2,2,43,63,35,13,79,188, 3,0,0,3,0,225,0,25,3,116,3,194,0,10,0,21, 0,57,0,0,1,55,22,23,22,23,22,23,7,38,39,7, 55,22,23,22,23,22,23,7,38,39,3,23,6,15,2,6, 7,6,21,20,23,22,23,22,23,22,31,1,7,38,47,1, 38,39,38,53,52,55,54,55,54,55,54,55,54,2,230,30, 60,20,2,2,18,10,59,13,28,119,29,58,17,4,4,13, 15,61,12,25,143,56,104,58,42,96,19,6,5,6,12,79, 25,3,83,168,7,47,169,83,84,37,15,12,8,18,68,36, 12,71,109,4,2,231,57,31,21,3,2,20,29,25,33,17, 31,58,31,16,4,4,16,37,23,34,16,1,41,33,182,74, 51,107,23,16,11,11,11,13,25,64,20,3,67,173,7,46, 175,68,68,33,32,25,29,23,22,45,69,37,13,81,189,6, 0,2,0,117,0,53,3,165,3,98,0,34,0,48,0,0, 1,6,35,38,39,55,22,51,50,55,53,51,21,54,55,23, 6,7,21,20,7,6,7,6,7,6,15,1,39,54,55,54, 55,54,55,1,23,6,21,20,21,22,31,1,7,38,39,55, 54,2,200,47,55,82,139,9,149,65,54,46,65,41,95,20, 100,56,10,9,20,6,7,49,130,78,20,144,49,19,12,39, 1,253,209,64,34,2,45,3,64,48,3,2,5,2,93,8, 1,21,64,20,8,195,181,10,31,62,33,13,138,132,50,47, 35,11,10,68,47,27,62,48,38,15,17,56,167,1,122,10, 206,104,12,12,108,212,14,14,226,120,92,88,0,3,0,89, 0,20,3,199,3,157,0,8,0,52,0,69,0,0,1,55, 22,23,22,23,7,38,39,7,6,39,34,39,55,22,51,50, 55,53,23,21,22,23,22,23,7,38,39,38,39,21,54,55, 23,6,7,21,20,7,6,7,6,7,6,7,39,54,55,54, 55,54,55,1,23,6,21,20,21,22,31,1,21,7,38,39, 38,53,55,54,3,56,31,61,23,14,14,60,13,27,135,52, 59,90,151,9,158,75,59,51,65,41,21,17,11,60,13,12, 2,3,43,107,20,102,68,11,13,32,53,137,21,65,21,156, 53,22,13,43,1,253,163,65,38,3,48,4,64,47,7,1, 2,5,3,100,57,32,25,15,34,25,33,17,228,8,1,22, 64,22,9,214,1,35,20,24,19,34,23,31,9,2,2,88, 11,34,61,35,16,151,142,54,66,44,73,50,8,21,61,52, 41,17,18,62,176,1,158,11,222,122,9,8,116,226,18,2, 13,222,110,21,20,97,94,0,0,2,0,156,0,121,3,50, 3,70,0,25,0,37,0,0,19,23,6,21,20,23,22,23, 22,23,22,51,50,55,23,6,35,34,39,38,39,38,53,52, 55,54,19,55,22,51,50,55,23,6,35,34,39,38,189,61, 27,3,25,126,39,35,52,55,82,170,8,143,121,164,107,91, 25,11,30,2,91,11,126,137,77,87,4,122,62,33,29,70, 1,150,24,67,33,11,6,43,22,7,2,5,18,64,18,33, 29,53,23,27,35,76,5,1,115,64,26,8,65,9,2,4, 0,4,0,131,0,93,3,199,3,137,0,8,0,19,0,45, 0,58,0,0,1,55,22,23,22,23,7,38,39,7,55,22, 23,22,23,22,23,7,38,39,1,23,6,21,20,23,22,23, 22,23,22,51,50,55,23,6,35,34,39,38,39,38,53,52, 55,54,19,55,22,31,1,54,55,23,6,35,34,39,38,3, 56,31,61,23,14,14,60,13,27,120,30,56,17,5,4,17, 11,60,12,26,253,146,60,30,4,28,138,41,39,56,59,98, 176,7,152,132,177,116,96,27,12,34,1,95,12,134,69,102, 49,108,4,133,66,36,31,67,3,80,57,32,25,15,34,25, 33,17,31,58,30,16,4,5,19,34,23,34,16,254,139,23, 77,32,13,7,47,25,8,2,5,20,65,20,37,31,55,25, 29,40,81,4,1,147,65,24,4,1,2,7,65,9,2,4, 0,1,0,140,0,62,3,20,3,133,0,61,0,0,1,6, 39,34,39,55,22,51,50,55,38,39,55,22,23,54,55,23, 6,7,22,31,1,7,38,39,38,35,34,7,6,7,6,21, 23,22,23,22,23,22,51,50,55,23,6,35,34,39,38,39, 38,39,55,54,55,54,55,54,51,50,23,38,1,254,44,47, 101,149,9,157,93,32,31,17,16,64,20,14,70,144,18,144, 68,36,94,58,39,146,76,28,26,33,31,73,55,51,3,10, 45,57,75,42,45,67,131,16,139,77,51,49,87,67,82,4, 2,16,108,51,51,46,49,70,71,52,2,142,5,1,24,64, 23,2,70,104,10,117,57,12,42,62,42,13,93,108,65,54, 71,13,5,8,19,50,49,34,20,27,33,40,16,10,33,63, 35,11,21,46,57,68,32,83,64,31,13,12,25,71,0,3, 0,114,0,29,3,236,3,225,0,8,0,19,0,81,0,0, 1,55,22,23,22,23,7,38,39,7,55,22,23,22,23,22, 23,7,38,39,5,6,39,34,39,55,22,51,50,55,38,39, 55,22,23,54,55,23,6,7,22,31,1,7,38,39,38,7, 34,7,6,7,6,21,22,23,22,23,22,51,54,55,23,6, 7,39,38,39,38,39,38,39,55,54,55,54,55,54,51,50, 23,38,3,94,30,62,22,18,10,59,13,29,118,29,59,20, 2,2,14,14,61,12,27,254,200,48,51,113,159,10,184,75, 44,39,18,19,65,18,19,91,143,18,158,74,36,93,76,39, 156,83,32,30,36,33,77,63,56,3,61,64,80,46,49,73, 142,15,147,75,64,27,27,98,68,87,4,2,14,110,59,59, 48,51,81,86,72,3,168,57,32,25,20,29,25,33,18,33, 58,29,22,2,2,17,35,23,34,16,189,5,1,26,64,27, 5,69,121,10,118,73,17,43,63,46,14,98,108,86,53,76, 15,6,1,8,20,55,51,46,42,42,43,18,11,1,35,64, 35,2,3,3,6,24,48,60,73,31,85,70,38,14,13,32, 94,0,0,1,1,8,0,39,3,105,3,98,0,39,0,0, 1,51,7,6,7,6,7,23,22,23,22,23,22,55,50,55, 54,55,54,55,23,6,7,6,7,6,35,34,39,38,39,38, 53,52,55,54,55,54,53,52,1,35,65,1,2,6,15,1, 3,4,11,26,82,38,42,58,51,60,80,11,23,53,78,45, 35,38,67,76,115,77,35,18,25,16,1,1,10,3,98,203, 75,67,164,27,60,35,24,66,28,13,1,26,33,108,15,33, 37,112,42,34,21,35,71,33,41,57,82,39,144,12,9,104, 142,31,0,3,0,247,0,3,3,133,3,128,0,8,0,19, 0,59,0,0,1,55,22,23,22,23,7,38,39,7,55,22, 23,22,23,22,23,7,38,39,37,55,7,6,7,6,7,23, 22,23,22,23,22,51,50,55,54,55,54,55,23,6,7,6, 7,6,35,34,39,38,39,38,53,52,55,54,55,54,53,52, 2,60,30,62,22,18,10,59,13,29,118,29,59,20,2,2, 14,14,61,12,27,254,254,65,1,2,7,16,1,3,4,12, 33,87,41,43,64,57,67,86,14,22,53,82,46,40,43,71, 80,119,84,41,20,27,17,1,1,11,3,18,57,32,25,20, 29,25,33,18,33,58,29,22,2,2,17,35,23,34,16,187, 1,213,86,75,173,35,63,38,27,73,30,14,30,36,118,19, 32,37,117,45,40,23,38,74,36,46,60,90,42,153,13,11, 113,157,32,0,0,2,0,128,0,54,3,114,3,132,0,15, 0,68,0,0,1,38,39,6,7,6,21,23,22,23,22,23, 55,54,55,54,19,39,38,39,55,22,51,50,55,39,55,22, 49,54,55,23,6,7,23,20,7,22,21,20,7,6,7,6, 7,6,39,34,39,55,22,51,54,55,54,55,6,35,34,39, 38,53,52,55,54,51,50,23,39,2,22,23,97,59,29,23, 3,5,11,25,66,37,25,15,34,13,124,111,174,8,230,106, 32,30,9,65,9,90,182,11,175,106,3,2,7,8,28,87, 9,10,54,81,29,72,6,64,33,66,35,60,32,49,63,88, 53,38,44,52,84,68,55,2,1,165,62,2,2,29,23,39, 28,17,12,32,1,3,5,11,24,1,25,1,4,20,64,25, 1,206,3,204,8,30,64,30,9,156,27,24,27,33,35,39, 134,60,7,5,30,1,6,65,6,1,19,33,95,32,55,42, 59,64,44,50,34,109,0,4,0,98,0,20,3,144,3,200, 0,8,0,19,0,36,0,96,0,0,1,55,22,23,22,23, 7,38,39,7,55,22,23,22,23,22,23,7,38,39,3,38, 39,6,7,6,7,20,23,22,23,22,23,55,54,55,54,19, 7,38,39,55,22,51,50,55,39,55,22,23,54,55,23,6, 7,23,6,7,22,21,20,7,6,7,6,7,6,35,39,34, 39,55,22,51,50,55,54,55,54,55,6,7,6,35,34,39, 38,39,38,53,52,55,54,51,50,23,52,2,242,31,60,24, 14,14,60,13,29,118,30,58,21,1,2,17,11,60,13,27, 177,25,108,65,32,25,1,5,5,12,28,69,39,30,19,38, 13,121,121,202,8,240,127,34,33,10,64,8,3,83,214,10, 198,107,3,1,2,8,9,29,93,10,11,57,86,86,4,21, 6,67,37,73,39,64,35,3,2,4,3,53,67,44,38,41, 27,41,47,56,90,77,58,3,143,57,31,26,15,34,25,33, 17,32,58,29,22,2,2,19,33,23,34,16,254,94,69,2, 2,32,25,43,17,15,19,13,34,3,2,6,14,27,1,51, 1,4,24,64,27,1,225,3,148,75,7,34,64,34,8,175, 27,24,30,36,37,41,143,66,7,6,31,5,2,65,6,22, 35,96,8,8,2,3,34,15,15,29,44,63,69,47,53,40, 4,0,0,1,0,95,0,112,3,93,3,85,0,70,0,0, 19,7,39,54,49,54,55,23,6,7,54,51,38,53,51,31, 1,50,23,7,39,34,35,22,21,20,7,6,7,6,35,34, 39,38,39,55,22,31,1,50,55,54,53,52,39,34,7,23, 22,23,22,23,22,51,50,55,23,7,38,39,38,39,38,39, 38,39,52,39,38,53,52,241,137,9,147,2,6,65,3,4, 172,156,5,65,3,2,54,106,1,148,3,2,5,5,10,42, 18,23,21,31,26,70,25,79,16,31,5,4,21,6,164,171, 1,2,3,6,21,61,234,43,81,1,184,47,39,129,52,8, 6,37,9,1,7,2,55,18,65,18,69,152,2,65,146,18, 70,124,138,56,2,65,2,55,37,38,30,68,21,9,9,8, 28,60,31,4,4,1,22,80,42,47,19,187,45,33,63,20, 49,2,65,1,1,3,11,39,6,6,34,81,4,5,81,111, 35,0,0,3,0,63,0,84,3,219,3,114,0,8,0,19, 0,93,0,0,1,55,22,23,22,23,7,38,39,7,55,22, 23,22,23,22,23,7,38,39,5,7,34,35,39,55,54,55, 23,6,7,54,51,38,53,52,55,23,20,23,50,23,7,38, 35,22,21,6,7,6,7,6,35,47,1,38,39,55,22,51, 50,55,54,53,52,39,7,6,7,21,22,23,22,23,22,23, 22,51,50,55,23,7,39,38,39,38,39,38,39,38,53,38, 53,52,3,76,31,61,23,14,14,60,13,27,120,30,56,17, 5,4,17,11,60,12,26,253,182,148,2,2,8,161,2,6, 65,6,1,177,183,6,1,64,6,88,87,1,112,56,6,1, 4,12,43,20,24,34,21,34,70,26,95,38,7,7,24,6, 150,104,113,2,4,7,23,40,130,60,99,21,105,1,198,94, 148,56,2,2,40,9,1,8,3,35,57,32,25,15,34,25, 33,17,31,58,30,16,4,5,19,34,23,34,16,150,19,64, 21,77,164,3,156,75,20,107,64,22,20,1,141,71,3,64, 2,67,39,39,30,72,22,10,4,6,9,30,60,42,1,23, 85,42,61,3,4,13,184,61,44,69,23,38,10,5,1,64, 1,4,12,49,2,2,39,86,4,4,77,123,41,0,0,1, 0,82,0,41,3,119,3,97,0,48,0,0,1,55,22,51, 50,51,54,55,23,5,54,51,50,31,1,6,7,6,7,6, 21,20,23,22,23,22,5,7,38,39,38,39,38,53,54,55, 54,55,54,63,1,6,5,39,37,39,35,39,38,1,17,9, 139,73,5,5,71,152,21,254,46,191,231,87,89,7,229,82, 143,32,12,6,2,3,39,1,23,16,163,46,110,39,20,1, 19,42,144,11,13,71,222,254,212,21,1,196,28,1,87,51, 3,24,64,20,1,28,63,245,26,4,65,53,29,51,58,20, 21,15,14,6,5,65,73,63,43,17,42,66,33,39,40,34, 74,55,4,5,28,10,49,63,238,8,3,4,0,3,0,49, 0,6,3,166,3,124,0,10,0,21,0,72,0,0,1,55, 22,23,22,23,22,23,7,38,39,7,55,22,23,22,23,22, 23,7,38,39,37,55,22,51,50,51,54,55,23,1,54,33, 50,31,1,6,7,6,7,6,21,20,23,22,23,22,23,22, 23,7,38,39,38,39,38,53,52,55,54,55,39,35,7,35, 6,5,39,1,47,1,38,3,24,30,60,20,2,2,18,10, 59,13,28,119,29,58,17,4,4,13,15,61,12,25,254,10, 9,158,73,5,4,90,152,22,253,249,210,1,10,92,96,3, 230,95,151,43,22,8,3,4,43,245,26,31,16,170,53,119, 43,24,32,58,174,46,1,36,2,139,254,232,21,1,249,49, 85,59,3,45,57,31,21,3,2,20,29,25,33,17,31,58, 31,16,4,4,16,37,23,34,16,83,65,23,2,30,63,254, 239,31,4,65,34,26,42,66,32,40,23,21,8,7,73,62, 7,7,64,41,21,45,74,41,50,58,50,86,49,7,12,10, 44,62,1,10,6,2,4,0,0,3,0,40,0,76,3,102, 3,114,0,20,0,35,0,62,0,0,1,55,22,23,22,51, 50,51,54,55,23,6,7,47,3,38,39,38,39,19,39,54, 51,50,23,22,31,1,7,38,47,1,7,34,37,38,39,55, 22,23,54,55,23,6,7,54,55,54,55,23,6,7,6,7, 6,15,1,39,54,55,54,1,138,63,18,23,29,87,8,8, 70,151,10,158,71,66,46,34,26,3,2,40,17,101,9,86, 53,21,19,64,132,5,20,131,56,56,84,5,254,245,49,95, 4,102,47,7,10,65,13,3,51,106,4,3,19,119,73,16, 32,40,108,26,55,113,44,40,1,35,12,84,20,26,2,25, 65,24,3,1,8,13,16,2,2,34,83,1,10,64,14,2, 5,41,1,62,40,4,1,9,89,1,6,65,6,1,65,127, 5,156,28,3,30,1,1,62,35,4,122,93,118,177,41,35, 177,116,106,0,0,5,0,4,0,43,3,131,3,145,0,8, 0,19,0,41,0,54,0,83,0,0,1,55,22,23,22,23, 7,38,39,7,55,22,23,22,23,22,23,7,38,39,1,55, 22,23,22,23,22,51,50,51,54,55,23,6,7,39,38,39, 38,39,38,39,19,39,54,51,50,23,22,23,7,38,39,35, 7,37,38,39,55,22,51,54,55,23,6,7,54,55,23,6, 7,6,35,6,7,6,15,1,39,54,55,54,55,54,2,212, 31,60,24,14,14,60,13,29,118,30,58,21,1,2,17,11, 60,13,27,254,213,63,19,21,2,3,34,96,7,8,76,163, 9,170,76,71,73,41,3,2,42,18,106,9,106,45,21,20, 74,143,19,142,61,63,91,254,223,71,88,4,131,33,11,8, 65,8,10,79,102,19,126,68,8,7,18,34,42,115,31,56, 114,41,15,12,30,3,63,57,31,26,15,34,25,33,17,32, 58,29,22,2,2,19,33,23,34,16,254,33,13,87,22,3, 2,29,2,27,65,26,3,2,6,32,2,2,37,88,1,34, 65,14,2,6,45,62,44,5,9,96,1,7,64,7,93,117, 5,104,99,8,31,62,36,5,1,133,102,126,186,50,35,181, 97,36,34,89,0,1,0,126,0,54,3,102,3,152,0,66, 0,0,1,38,39,55,22,23,54,55,23,6,7,54,63,1, 23,6,7,6,35,6,7,6,7,54,51,50,23,22,23,22, 21,20,7,6,7,6,7,6,35,34,39,38,39,55,22,31, 1,54,55,54,55,54,55,53,38,39,38,39,38,35,34,7, 6,7,39,55,54,1,71,62,139,12,123,75,4,2,65,2, 4,98,211,7,14,188,73,39,38,23,79,2,3,163,102,78, 64,76,55,45,2,23,139,40,45,34,35,112,175,14,32,22, 170,87,62,26,26,95,59,31,7,6,26,44,60,49,63,99, 192,14,18,43,80,43,2,194,5,23,64,22,6,49,101,1, 113,37,2,46,2,63,41,7,4,122,138,4,5,56,28,33, 70,59,56,12,11,99,45,13,6,5,62,4,12,61,61,10, 3,1,3,13,46,24,28,22,32,35,54,27,22,68,4,7, 53,140,83,0,0,2,0,96,0,21,3,139,3,186,0,8, 0,87,0,0,1,55,22,23,22,23,7,38,39,5,38,39, 55,22,23,54,55,23,6,7,54,63,1,22,23,22,23,22, 23,7,38,39,38,39,6,7,6,35,6,7,6,7,54,51, 50,23,22,23,22,21,20,7,6,7,6,7,6,35,34,39, 38,39,55,22,23,22,51,50,55,54,55,54,55,53,38,39, 38,39,38,35,34,7,6,7,39,54,55,54,2,252,31,60, 24,14,14,60,13,29,254,23,76,144,12,147,70,5,2,65, 2,5,106,204,17,58,21,1,2,17,11,60,15,4,2,3, 195,68,51,47,20,78,8,13,181,111,84,69,83,55,50,2, 22,149,44,50,36,38,121,186,17,35,22,181,95,33,32,31, 30,98,65,39,8,5,30,45,69,54,69,71,96,67,115,44, 80,17,39,3,98,57,31,26,15,34,25,33,17,117,5,26, 64,26,4,53,111,2,109,55,2,44,34,29,22,2,2,19, 33,23,31,4,2,2,41,7,6,118,142,15,23,63,30,37, 71,66,60,13,12,101,50,14,8,5,66,5,13,61,65,11, 4,4,12,48,29,33,23,36,39,58,30,24,26,18,42,54, 137,35,80,0,0,1,0,184,0,101,3,83,2,99,0,44, 0,0,19,55,23,54,63,1,54,51,50,23,22,23,22,21, 20,21,6,7,6,7,6,15,1,39,54,55,54,55,54,55, 54,55,39,38,39,38,39,38,35,34,7,6,7,6,35,184, 3,125,62,49,124,32,27,40,35,83,50,36,3,118,23,25, 91,161,42,3,155,74,21,20,83,34,13,1,3,15,57,26, 26,21,27,32,102,23,17,66,86,1,245,65,2,1,10,30, 6,13,30,81,59,61,3,4,105,76,15,12,43,7,1,65, 5,24,7,9,39,63,26,24,28,62,51,24,9,8,24,6, 3,14,0,1,0,135,0,130,3,133,2,198,0,45,0,0, 19,55,23,54,63,1,54,51,50,23,22,23,22,21,20,21, 6,7,6,7,6,7,34,7,39,54,55,54,55,54,55,54, 55,39,38,39,38,39,38,35,34,15,1,6,35,34,135,3, 131,80,63,143,37,30,46,39,91,57,45,4,126,29,33,102, 175,17,45,2,167,76,38,32,97,40,17,1,3,16,64,33, 34,26,32,35,54,113,77,98,39,2,81,65,3,1,13,34, 7,15,32,88,70,73,3,4,116,85,20,15,48,9,2,65, 6,21,11,15,46,73,31,30,32,71,59,32,12,9,12,26, 15,0,0,3,0,106,0,103,3,194,3,182,0,8,0,19, 0,66,0,0,1,55,22,23,22,23,7,38,39,7,55,22, 23,22,23,22,23,7,38,39,5,55,23,54,63,1,54,51, 50,23,22,23,22,21,20,21,6,7,6,7,6,7,6,7, 39,54,55,54,55,54,55,54,55,39,38,39,38,39,38,35, 7,6,7,6,7,6,35,3,51,31,61,23,14,14,60,13, 27,120,30,56,17,5,4,17,11,60,12,26,253,90,2,143, 87,68,155,40,33,48,41,96,61,49,4,133,32,37,110,190, 21,44,2,181,86,39,34,101,45,22,1,3,16,67,38,40, 29,35,52,10,123,19,15,83,107,3,125,57,32,25,15,34, 25,33,17,31,58,30,16,4,5,19,34,23,34,16,212,65, 3,1,14,37,7,15,35,93,74,79,4,5,122,91,22,18, 52,9,1,1,65,6,24,11,16,48,76,37,36,33,76,64, 38,14,10,4,2,28,4,3,16,0,0,1,0,127,0,85, 3,90,2,254,0,32,0,0,19,53,36,37,23,6,7,6, 7,6,21,20,23,22,23,22,23,22,23,7,38,39,38,39, 38,53,52,55,54,55,54,55,4,127,1,59,1,150,10,235, 94,79,33,30,11,8,11,42,147,29,47,14,140,56,71,37, 44,12,10,18,69,101,254,247,2,166,65,1,22,64,60,52, 43,56,50,66,39,33,22,16,60,39,7,11,63,30,26,33, 54,62,84,43,41,35,31,115,46,6,0,3,0,97,0,54, 3,174,3,17,0,8,0,19,0,48,0,0,1,55,22,23, 22,23,7,38,39,7,55,22,23,22,23,22,23,7,38,39, 37,53,36,37,23,6,7,6,7,6,21,20,23,22,23,22, 23,7,38,39,38,39,38,53,52,55,54,55,4,3,31,31, 60,24,14,14,60,13,29,118,30,58,21,1,2,17,11,60, 13,27,253,103,1,78,1,190,10,246,101,95,37,33,34,44, 154,34,56,15,148,59,79,41,46,42,73,135,254,206,2,129, 57,31,26,15,34,25,33,17,32,58,29,22,2,2,19,33, 23,34,16,133,64,1,24,64,63,53,50,63,56,71,73,48, 65,41,8,13,63,32,27,36,58,67,90,87,73,124,56,8, 0,1,0,185,0,79,3,24,3,128,0,37,0,0,1,54, 55,23,4,7,6,7,6,21,22,23,22,23,22,51,50,55, 23,7,34,39,38,39,38,39,38,53,52,55,54,55,38,53, 52,53,55,20,1,218,70,208,13,254,255,102,90,35,30,1, 16,37,150,60,88,60,127,2,200,83,61,171,58,3,3,28, 42,55,130,33,65,2,69,24,45,63,57,49,42,54,45,53, 38,24,58,16,6,4,65,4,7,17,77,4,4,43,55,69, 65,83,55,127,192,8,9,1,205,0,0,3,0,162,0,48, 3,161,3,160,0,8,0,19,0,57,0,0,1,55,22,23, 22,23,7,38,39,7,55,22,23,22,23,22,23,7,38,39, 5,54,55,23,4,7,6,7,6,21,20,23,22,23,22,51, 50,55,23,7,34,39,38,39,38,39,38,53,52,55,54,55, 38,53,52,53,51,22,3,19,30,62,22,18,10,59,13,29, 118,29,59,20,2,2,14,14,61,12,27,254,232,80,223,13, 254,239,112,100,39,33,18,41,163,66,95,65,136,3,218,89, 64,181,63,5,4,30,45,61,140,36,65,2,2,254,57,32, 25,20,29,25,33,18,33,58,29,22,2,2,17,35,23,34, 16,104,27,49,64,60,52,46,60,49,58,42,28,64,17,6, 4,65,4,7,18,79,6,6,45,60,75,68,92,57,140,209, 8,9,227,0,0,3,0,58,0,31,3,85,3,147,0,18, 0,64,0,89,0,0,37,38,39,38,35,34,7,6,7,6, 21,23,22,23,22,31,1,54,55,19,38,39,55,22,23,22, 23,15,1,6,7,6,21,23,22,21,22,23,7,38,39,6, 7,6,35,34,39,38,39,38,55,52,55,54,55,54,51,50, 23,52,47,1,52,55,54,37,34,39,55,22,51,54,55,23, 6,7,54,55,54,55,23,6,7,6,15,1,39,54,55,54, 2,54,14,15,66,42,30,21,20,13,6,2,8,41,14,15, 51,84,10,108,29,89,2,113,55,51,78,13,94,91,26,15, 5,14,63,111,32,111,37,16,52,41,57,26,27,97,28,10, 1,54,8,8,34,48,57,83,14,4,30,29,254,177,37,106, 6,94,57,12,17,64,16,10,51,96,22,15,22,132,87,38, 122,66,56,103,25,60,179,7,5,25,12,12,24,11,10,9, 16,14,5,3,3,3,66,1,171,5,4,65,4,13,12,33, 65,2,6,31,29,48,67,116,21,31,65,56,63,19,68,29, 22,5,17,56,20,21,55,43,7,5,22,32,11,110,64,65, 41,38,95,9,65,9,60,116,10,108,54,4,35,8,5,61, 50,8,181,215,113,33,179,50,123,0,0,3,0,135,0,103, 3,85,3,89,0,19,0,29,0,43,0,0,1,55,22,23, 22,23,22,51,50,55,23,6,35,34,39,38,39,38,39,38, 19,55,22,51,54,55,23,6,35,34,37,23,6,7,23,22, 31,1,7,38,53,52,53,54,1,76,58,46,33,9,10,44, 94,75,143,9,166,63,70,50,27,22,58,48,4,77,7,71, 67,104,108,10,112,114,72,254,202,64,41,3,2,4,16,6, 65,28,3,1,59,29,92,29,8,6,26,19,64,23,17,8, 13,35,93,7,1,172,64,9,1,22,64,24,151,10,234,123, 109,87,137,46,8,245,113,16,15,127,0,4,0,97,0,102, 3,187,3,88,0,15,0,23,0,39,0,105,0,0,37,38, 7,34,7,6,15,1,23,22,23,22,51,50,55,54,1,22, 23,54,55,54,55,6,3,38,39,6,7,6,21,20,23,22, 23,22,51,50,55,54,3,38,39,55,22,23,54,63,1,23, 6,7,55,22,23,22,21,20,7,23,7,38,39,6,7,6, 35,34,39,38,47,1,53,54,55,54,63,1,22,23,54,53, 52,39,38,35,34,7,6,7,23,7,39,6,7,6,35,34, 39,38,39,38,53,52,55,54,3,31,89,48,8,7,33,19, 5,4,16,34,27,28,46,35,11,254,53,24,60,15,49,2, 2,85,11,79,34,85,20,8,36,11,12,13,13,14,17,51, 76,15,25,64,23,12,85,107,36,63,17,12,68,169,68,43, 37,70,41,57,5,13,14,53,75,41,38,78,13,2,4,69, 17,19,37,69,90,27,34,51,142,35,40,42,50,56,49,36, 56,69,30,32,34,27,53,24,12,10,31,223,58,1,1,6, 27,12,12,28,15,12,33,11,1,125,71,85,37,163,7,6, 20,254,250,98,92,62,73,24,30,76,56,18,7,8,9,28, 1,127,54,120,13,111,42,42,21,136,17,63,46,2,4,111, 72,109,104,88,56,50,43,4,18,14,51,17,34,59,26,1, 62,31,7,4,3,1,61,65,86,95,53,84,5,157,128,66, 42,41,116,39,17,19,34,86,44,44,39,36,107,0,0,2, 0,77,0,89,3,187,3,129,0,20,0,99,0,0,37,38, 39,38,35,34,7,6,15,1,21,22,23,22,31,1,54,55, 54,55,54,1,55,23,7,55,23,7,21,54,55,54,55,54, 51,50,23,22,23,22,7,20,7,22,23,7,38,39,6,7, 6,35,34,39,38,39,38,47,1,54,55,54,55,54,51,50, 23,54,53,52,39,38,47,1,38,35,6,7,6,7,20,23, 35,2,53,6,7,39,19,54,63,1,53,6,35,34,39,63, 1,54,3,14,40,11,56,36,17,10,24,9,1,4,34,8, 8,24,58,50,6,5,4,254,14,3,65,3,38,41,82,36, 100,5,5,116,87,32,29,90,39,22,1,34,28,58,36,68, 14,45,73,35,32,18,17,63,28,9,3,1,6,53,5,4, 25,33,63,110,26,11,25,59,11,15,19,75,99,85,97,3, 65,3,46,100,54,180,11,10,2,67,90,21,22,2,103,53, 250,22,5,27,6,12,35,21,2,32,18,5,2,1,5,54, 6,6,6,1,249,145,2,132,7,58,137,11,31,63,3,3, 76,10,32,116,63,72,93,81,17,38,54,44,8,67,31,15, 5,15,56,19,20,32,67,34,3,2,14,62,66,77,48,42, 92,31,5,5,1,63,55,104,181,181,1,32,1,54,126,36, 1,67,18,18,92,1,11,1,65,1,2,0,0,2,0,85, 0,109,3,165,3,27,0,44,0,59,0,0,1,2,7,6, 7,39,38,39,38,39,52,55,54,55,54,55,54,55,54,51, 22,23,22,23,22,21,20,7,6,15,1,39,54,55,54,55, 54,53,52,39,38,39,38,35,34,7,6,7,6,7,6,23, 20,23,22,31,1,54,55,54,2,12,48,102,47,51,28,63, 53,46,1,18,1,2,45,119,90,104,36,37,151,113,59,33, 39,57,61,148,97,19,151,58,40,23,44,29,48,115,70,71, 4,72,124,93,51,22,17,1,36,29,38,15,22,29,95,2, 217,254,139,160,67,5,1,10,87,76,90,54,51,5,4,123, 84,64,16,6,1,82,43,57,69,83,104,80,85,52,30,62, 46,39,26,32,61,86,67,51,83,42,25,7,27,100,55,60, 45,47,72,60,48,16,4,2,42,154,0,3,0,123,0,108, 3,94,3,98,0,19,0,68,0,81,0,0,37,38,35,34, 7,6,15,1,23,22,23,22,23,22,51,50,55,54,55,54, 3,6,35,34,39,55,22,55,50,55,54,55,23,6,7,54, 55,23,6,15,1,22,23,22,23,7,38,39,6,7,6,15, 1,38,39,38,39,52,55,54,55,54,55,51,22,23,38,53, 52,1,23,6,15,1,22,23,7,38,53,52,55,54,2,159, 120,72,8,8,47,26,5,3,10,21,5,6,44,72,22,22, 58,14,8,6,59,68,82,85,5,94,73,67,57,4,3,65, 3,4,31,85,13,72,58,1,2,8,21,102,35,77,17,4, 13,32,85,56,89,61,73,1,3,17,100,9,9,47,75,91, 7,254,18,64,38,5,1,1,14,65,16,2,5,243,64,1, 4,26,7,15,24,18,4,4,30,3,8,22,11,1,128,6, 9,64,9,1,7,125,60,2,56,117,6,17,63,17,9,149, 87,95,12,65,55,48,10,18,19,46,12,4,1,41,51,61, 11,11,69,16,1,1,6,46,121,100,31,1,39,10,239,116, 117,86,179,5,207,103,42,38,118,0,0,5,0,95,0,78, 3,201,3,128,0,10,0,29,0,36,0,92,0,105,0,0, 1,55,22,23,22,23,22,23,7,38,39,3,38,35,34,7, 6,7,6,7,23,22,23,22,51,50,55,54,55,54,19,54, 55,38,47,1,6,7,6,35,34,39,55,22,51,50,55,54, 55,23,6,7,55,22,23,22,23,22,23,7,55,23,6,15, 1,22,31,1,7,38,39,6,7,6,7,6,35,34,39,38, 53,52,55,54,55,54,55,51,22,23,38,53,52,1,23,6, 15,1,22,23,7,38,53,52,55,54,3,59,30,60,20,2, 2,18,10,59,13,28,181,131,80,9,8,52,27,6,1,2, 13,34,48,78,24,24,63,18,8,62,58,21,11,27,39,2, 67,58,72,72,119,4,118,70,71,59,2,6,64,2,2,29, 58,17,4,4,13,15,32,17,14,90,53,1,2,9,134,36, 24,79,7,13,33,91,30,29,96,66,79,3,18,112,7,7, 48,80,105,7,253,233,64,41,6,1,1,15,65,17,2,6, 3,60,57,31,21,3,2,20,29,25,33,17,253,188,70,1, 4,29,6,4,14,36,23,33,4,8,26,11,1,240,11,5, 30,16,21,54,104,8,10,64,9,8,67,136,3,70,35,57, 31,16,4,4,16,37,12,4,64,19,9,165,101,95,84,55, 16,49,26,18,47,14,4,45,52,67,11,12,74,16,1,1, 6,52,106,111,47,1,76,11,248,135,127,102,185,5,235,105, 42,39,134,0,0,5,0,95,0,78,3,144,3,128,0,15, 0,31,0,50,0,98,0,111,0,0,1,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,39,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,3,38,35,34,7,6, 7,6,7,23,22,23,22,51,50,55,54,55,54,3,6,35, 34,39,55,22,51,50,55,54,55,23,7,54,55,23,6,15, 1,22,31,1,7,38,39,6,7,6,7,6,35,34,39,38, 53,52,55,54,55,54,55,51,22,23,38,53,52,1,23,6, 15,1,22,23,7,38,53,52,55,54,3,74,31,11,3,28, 8,9,30,12,4,29,8,9,41,20,9,37,15,18,41,19, 9,37,15,137,131,80,9,8,52,27,6,1,2,13,34,48, 78,24,24,63,18,8,5,58,72,72,119,4,118,70,71,59, 2,6,64,6,31,96,14,90,53,1,2,9,134,36,24,79, 7,13,33,91,30,29,96,66,79,3,18,112,7,7,48,80, 105,7,253,233,64,41,6,1,1,15,65,17,2,6,3,78, 29,8,9,30,12,3,27,8,10,31,12,3,24,36,16,18, 41,20,8,36,15,18,43,19,8,253,122,70,1,4,29,6, 4,14,36,23,33,4,8,26,11,1,165,8,10,64,9,8, 67,136,3,190,6,20,64,19,9,165,101,95,84,55,16,49, 26,18,47,14,4,45,52,67,11,12,74,16,1,1,6,52, 106,111,47,1,76,11,248,135,127,102,185,5,235,105,42,39, 134,0,0,1,0,114,0,47,3,162,3,59,0,48,0,0, 19,39,54,55,23,6,7,6,7,6,21,20,23,22,31,1, 50,55,54,55,54,55,54,53,52,39,55,22,23,7,38,39, 6,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55, 6,162,1,147,160,30,140,59,37,27,54,23,35,100,55,63, 44,99,42,2,2,33,1,64,88,100,56,70,58,3,34,49, 134,61,75,33,33,117,54,39,63,68,146,97,2,224,65,1, 25,61,140,81,51,52,104,82,50,28,47,14,4,20,40,146, 7,7,123,229,37,75,13,245,159,33,117,123,172,125,188,55, 25,5,17,68,49,71,92,121,132,148,13,0,0,2,0,85, 0,13,3,209,3,107,0,8,0,72,0,0,1,55,22,23, 22,23,7,38,39,7,22,23,7,38,39,6,7,6,7,6, 7,34,39,38,39,38,53,52,55,54,55,54,55,6,35,39, 50,55,23,6,7,6,7,6,21,20,23,22,23,22,51,50, 55,54,55,54,55,54,53,52,39,55,23,55,22,23,22,23, 22,23,7,38,39,3,66,31,61,23,14,14,60,13,27,84, 67,103,57,92,51,3,37,53,143,71,81,136,82,18,13,41, 68,70,158,4,4,124,130,1,135,198,30,146,62,47,31,58, 25,36,106,31,31,70,50,106,47,3,3,35,1,64,15,13, 56,17,5,4,17,11,60,13,16,3,50,57,32,25,15,34, 25,33,17,51,178,168,33,157,117,200,136,203,59,26,1,66, 15,16,52,76,98,132,136,163,4,4,17,65,28,61,145,83, 62,62,113,88,55,31,51,16,5,22,43,156,9,10,136,242, 48,77,12,39,26,30,16,4,5,19,34,23,32,12,0,2, 0,85,0,13,3,195,3,83,0,15,0,82,0,0,1,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,7,22, 23,7,38,39,6,7,6,7,6,7,34,39,38,39,38,53, 52,55,54,55,54,55,6,35,39,50,55,23,6,7,6,7, 6,21,20,23,22,23,22,51,50,55,54,55,54,55,54,53, 52,39,55,23,55,54,55,50,31,1,22,21,20,7,6,35, 34,3,104,30,12,3,25,10,10,30,12,4,28,8,67,44, 104,57,92,51,3,37,53,143,71,81,136,82,18,13,41,68, 70,158,4,4,124,130,1,135,198,30,146,62,47,31,58,25, 36,106,31,31,70,50,106,47,3,3,35,1,64,44,2,12, 55,41,20,8,1,37,15,18,37,3,5,28,8,9,29,12, 5,28,8,10,29,12,4,84,117,175,33,157,117,200,136,203, 59,26,1,66,15,16,52,76,98,132,136,163,4,4,17,65, 28,61,145,83,62,62,113,88,55,31,51,16,5,22,43,156, 9,10,136,242,48,77,12,116,27,47,5,36,20,7,6,41, 20,9,0,4,0,64,0,89,3,173,3,115,0,9,0,21, 0,54,0,62,0,0,1,55,22,23,22,23,7,38,39,38, 37,23,6,7,6,7,6,7,39,54,55,54,19,55,22,23, 22,21,20,7,6,7,6,7,6,35,34,39,38,39,55,22, 23,22,51,50,55,54,55,54,55,39,38,39,38,3,55,22, 23,7,38,39,38,2,170,42,74,27,40,76,55,77,33,25, 254,38,56,58,38,6,5,40,92,30,84,33,38,148,48,129, 44,74,1,8,57,19,22,17,19,43,53,43,84,37,77,42, 41,29,8,7,30,19,9,2,1,8,53,43,116,48,94,122, 36,88,38,46,1,211,49,65,31,46,120,34,119,38,30,40, 32,102,40,6,5,38,48,57,44,32,36,1,0,44,141,64, 105,81,10,11,76,42,14,6,5,28,21,60,53,55,21,21, 2,9,40,17,18,31,56,75,63,1,118,43,110,74,55,59, 32,40,0,6,0,29,0,59,3,206,3,144,0,8,0,19, 0,29,0,42,0,76,0,84,0,0,1,55,22,23,22,23, 7,38,39,7,55,22,23,22,23,22,23,7,38,39,23,55, 22,23,22,23,7,38,39,38,37,23,6,15,1,6,7,6, 7,39,54,55,54,19,55,22,23,22,21,20,7,6,7,6, 7,6,35,34,47,1,38,39,55,22,23,22,51,50,55,54, 55,54,55,53,38,39,38,3,55,22,23,7,38,39,38,2, 192,31,60,24,14,14,60,13,29,118,30,58,21,1,2,17, 11,60,13,27,31,43,79,29,45,80,54,78,42,35,254,8, 57,62,37,17,41,97,2,2,31,92,36,41,160,48,136,52, 79,1,10,59,21,24,18,18,42,54,8,39,98,37,85,44, 44,31,10,9,33,21,10,2,8,59,47,125,48,101,133,36, 91,45,38,2,189,57,31,26,15,34,25,33,17,32,58,29, 22,2,2,19,33,23,34,16,157,49,70,33,52,127,35,123, 48,39,34,33,106,41,18,39,51,1,1,57,48,35,38,1, 25,44,148,73,114,86,11,11,82,44,15,7,5,26,4,20, 67,54,60,23,23,3,9,43,20,20,32,61,85,67,1,149, 43,118,81,55,60,38,32,0,0,6,0,29,0,59,3,206, 3,144,0,14,0,32,0,42,0,55,0,89,0,97,0,0, 1,34,15,1,20,23,22,51,50,55,54,53,52,39,38,39, 50,31,1,22,21,20,15,1,6,35,34,39,38,53,52,55, 54,7,55,22,23,22,23,7,38,39,38,37,23,6,15,1, 6,7,6,7,39,54,55,54,19,55,22,23,22,21,20,7, 6,7,6,7,6,35,34,47,1,38,39,55,22,23,22,51, 50,55,54,55,54,55,53,38,39,38,3,55,22,23,7,38, 39,38,2,218,31,12,3,26,9,11,29,12,4,28,8,9, 42,19,7,1,36,20,7,6,42,20,8,36,16,14,43,79, 29,45,80,54,78,42,35,254,8,57,62,37,17,41,97,2, 2,31,92,36,41,160,48,136,52,79,1,10,59,21,24,18, 18,42,54,8,39,98,37,85,44,44,31,10,9,33,21,10, 2,8,59,47,125,48,101,133,36,91,45,38,2,181,28,17, 29,12,5,28,8,10,30,12,3,24,37,21,6,5,41,20, 8,1,37,15,18,41,20,8,251,49,70,33,52,127,35,123, 48,39,34,33,106,41,18,39,51,1,1,57,48,35,38,1, 25,44,148,73,114,86,11,11,82,44,15,7,5,26,4,20, 67,54,60,23,23,3,9,43,20,20,32,61,85,67,1,149, 43,118,81,55,60,38,32,0,0,1,0,76,0,180,3,162, 2,210,0,29,0,0,19,39,55,54,55,54,51,50,23,22, 31,1,22,23,22,23,7,38,39,38,47,1,38,47,1,34, 7,6,15,1,123,47,98,58,30,57,60,19,20,72,86,96, 82,156,6,14,42,153,72,21,19,120,67,36,23,27,29,31, 60,6,1,174,44,108,69,24,46,4,20,104,120,96,131,5, 12,49,129,78,22,22,140,73,10,3,20,20,71,7,0,3, 0,43,0,156,3,195,3,62,0,10,0,21,0,56,0,0, 1,55,22,23,22,23,22,23,7,38,39,7,55,22,23,22, 23,22,23,7,38,39,1,39,54,55,54,55,54,55,54,51, 50,23,22,31,1,22,23,22,23,7,38,39,38,47,1,38, 39,38,35,34,7,6,15,1,6,2,185,30,60,20,2,2, 18,10,59,13,28,119,29,58,17,4,4,13,15,61,12,25, 253,197,48,95,12,61,8,25,25,49,52,21,20,75,91,107, 88,164,9,18,42,161,76,26,23,129,73,40,12,13,30,33, 34,67,5,36,3,5,57,31,21,3,2,20,29,25,33,17, 31,58,31,16,4,4,16,37,23,34,16,254,243,44,103,14, 69,8,25,16,32,5,22,109,132,103,139,7,15,49,136,81, 27,27,151,80,11,4,22,22,79,6,42,0,0,3,0,43, 0,156,3,195,3,22,0,15,0,31,0,66,0,0,1,34, 7,6,21,20,23,22,51,50,55,54,53,52,39,38,39,50, 23,22,21,20,7,6,35,34,39,38,53,52,55,54,1,39, 54,55,54,55,54,55,54,51,50,23,22,31,1,22,23,22, 23,7,38,39,38,47,1,38,39,38,35,34,7,6,15,1, 6,2,210,31,11,3,28,8,9,30,12,4,29,8,9,41, 20,9,37,15,18,41,19,9,37,15,253,154,48,95,12,61, 8,25,25,49,52,21,20,75,91,107,88,164,9,18,42,161, 76,26,23,129,73,40,12,13,30,33,34,67,5,36,2,254, 29,8,9,30,12,3,27,8,10,31,12,3,24,36,16,18, 41,20,8,36,15,18,43,19,8,254,148,44,103,14,69,8, 25,16,32,5,22,109,132,103,139,7,15,49,136,81,27,27, 151,80,11,4,22,22,79,6,42,0,0,3,0,123,0,108, 3,162,3,104,0,19,0,75,0,88,0,0,37,38,35,34, 7,6,15,1,23,22,23,22,23,22,51,50,55,54,55,54, 3,6,35,34,39,55,22,51,50,51,54,55,23,6,15,1, 54,55,23,6,7,23,22,23,22,23,7,38,39,6,7,6, 15,1,38,39,38,39,52,55,54,63,1,22,23,38,39,7, 47,1,55,22,51,50,55,54,37,23,6,15,1,22,23,7, 38,53,52,55,54,2,160,115,73,10,10,49,25,5,3,11, 22,4,5,44,72,22,22,58,14,8,3,39,43,79,117,8, 118,64,11,10,79,152,12,86,25,4,53,114,18,127,58,3, 2,5,64,128,34,108,52,5,15,32,85,56,89,61,73,1, 3,18,117,49,74,90,5,2,85,114,88,6,144,65,39,33, 2,254,16,64,38,5,1,1,14,65,16,2,5,253,54,1, 4,26,7,15,24,19,4,3,30,3,8,22,11,2,50,4, 16,64,15,2,29,63,17,3,198,10,32,62,36,10,124,45, 61,34,80,55,66,28,29,21,46,12,4,1,41,51,61,11, 11,75,12,1,4,40,48,140,3,5,8,65,13,3,134,151, 10,239,116,117,86,179,5,207,103,42,38,118,0,4,0,95, 0,78,3,211,3,132,0,10,0,28,0,99,0,112,0,0, 1,55,22,23,22,23,22,23,7,38,39,3,38,35,34,7, 6,15,1,23,22,23,22,51,50,55,54,55,54,3,6,35, 34,39,55,22,51,50,51,54,55,23,6,7,6,7,54,55, 38,47,1,55,22,23,22,23,22,23,54,55,23,6,7,20, 23,22,23,7,38,39,6,7,6,7,6,35,34,39,38,53, 55,54,63,1,22,23,39,52,53,7,38,39,55,22,51,54, 55,50,55,52,37,23,6,15,1,22,23,7,38,53,52,55, 54,3,69,30,60,20,2,2,18,10,59,13,28,191,125,81, 11,11,53,27,6,2,12,35,48,78,24,24,62,19,10,5, 45,52,83,123,9,134,75,6,5,79,170,13,48,74,4,1, 46,47,11,25,41,29,58,17,4,4,12,16,12,16,18,127, 75,11,58,151,34,130,46,7,16,33,91,30,29,96,66,78, 2,20,124,49,81,102,7,88,75,150,7,159,64,43,37,1, 2,253,234,64,41,6,1,1,15,65,17,2,6,2,226,57, 31,21,3,2,20,29,25,33,17,254,32,60,1,6,26,10, 15,35,24,33,4,8,25,14,2,99,6,18,65,18,3,32, 64,9,13,148,71,9,12,29,15,23,58,31,16,4,4,14, 38,3,5,63,37,13,143,110,30,93,55,78,25,33,23,48, 14,4,45,52,66,23,79,14,1,4,46,193,9,9,4,1, 14,64,14,1,3,1,70,240,11,248,135,127,102,185,5,235, 105,42,39,134,0,4,0,95,0,78,3,196,3,132,0,14, 0,32,0,104,0,117,0,0,1,34,7,6,21,20,23,22, 51,50,55,54,53,52,39,3,38,35,34,7,6,15,1,23, 22,23,22,51,50,55,54,55,54,3,6,35,34,39,55,22, 51,50,51,54,55,23,6,7,6,7,54,55,38,39,52,55, 54,51,23,22,31,1,6,7,55,23,6,7,20,23,22,23, 7,38,39,6,7,6,7,6,35,34,39,38,53,55,54,63, 1,22,23,39,52,53,7,38,39,55,22,51,54,55,50,55, 52,37,23,6,15,1,22,23,7,38,53,52,55,54,3,92, 32,11,3,29,8,9,30,12,3,28,189,125,81,11,11,53, 27,6,2,12,35,48,78,24,24,62,19,10,5,45,52,83, 123,9,134,75,6,5,79,170,13,48,74,4,1,28,56,35, 3,38,15,17,21,35,10,3,1,9,9,18,127,75,11,58, 151,34,130,46,7,16,33,91,30,29,96,66,78,2,20,124, 49,81,102,7,88,75,150,7,159,64,43,37,1,2,253,234, 64,41,6,1,1,15,65,17,2,6,2,209,29,8,9,31, 11,3,28,8,9,31,12,254,28,60,1,6,26,10,15,35, 24,33,4,8,25,14,2,99,6,18,65,18,3,32,64,9, 13,148,71,5,14,22,39,43,19,8,3,11,38,23,17,14, 3,63,37,13,143,110,30,93,55,78,25,33,23,48,14,4, 45,52,66,23,79,14,1,4,46,193,9,9,4,1,14,64, 14,1,3,1,70,240,11,248,135,127,102,185,5,235,105,42, 39,134,0,2,0,88,0,59,3,35,3,169,0,17,0,88, 0,0,37,38,35,34,7,6,7,20,23,22,23,22,51,22, 55,54,55,54,3,55,23,7,55,50,23,7,39,6,7,6, 23,54,55,23,6,7,22,23,22,23,22,23,7,38,39,6, 7,6,7,6,35,38,39,38,39,38,53,52,55,54,55,54, 51,50,23,39,53,7,38,39,38,53,55,31,3,22,31,1, 55,51,53,54,55,6,7,39,54,1,204,82,85,66,51,19, 3,11,18,27,44,65,36,31,47,17,10,21,7,65,7,186, 37,74,2,224,39,35,6,3,93,131,9,160,69,1,18,5, 2,92,183,34,155,88,5,14,34,92,31,32,81,63,59,20, 7,3,11,48,60,80,83,84,20,94,129,39,23,1,64,2, 6,2,19,94,56,36,1,1,1,75,234,7,213,231,30,19, 9,7,12,16,25,18,30,1,10,15,30,17,2,119,110,4, 103,1,2,65,2,1,1,108,105,9,19,64,22,7,28,121, 37,26,38,112,56,96,40,31,26,61,20,7,1,41,38,51, 17,17,10,9,37,21,25,26,181,1,3,2,58,30,52,35, 1,51,22,4,26,6,1,1,152,31,32,5,24,64,24,0, 0,2,0,109,0,61,3,152,3,71,0,17,0,71,0,0, 1,6,7,6,7,6,7,20,51,48,23,54,51,54,55,54, 55,54,55,54,55,6,35,34,39,55,23,54,55,23,6,7, 22,23,54,55,23,6,7,22,23,7,38,39,6,7,6,7, 6,7,39,54,55,54,55,38,39,6,7,6,7,6,35,34, 39,38,39,52,55,54,55,54,1,116,106,60,12,8,9,2, 2,20,3,4,82,48,14,16,3,34,39,66,86,100,33,32, 4,72,90,111,51,74,38,101,161,8,6,65,6,9,27,96, 23,57,57,16,25,49,124,18,38,32,107,26,83,23,171,104, 49,23,35,47,60,36,35,27,23,1,5,4,10,73,1,157, 13,70,14,15,20,18,14,3,1,15,79,22,34,8,77,94, 188,26,3,65,3,2,34,53,212,93,9,50,53,115,3,135, 52,9,36,61,22,20,53,40,78,72,11,21,56,63,19,63, 96,56,3,102,32,49,26,28,22,23,34,15,17,19,20,136, 0,3,0,78,0,53,3,168,3,150,0,9,0,26,0,108, 0,0,1,55,22,23,22,23,7,38,39,38,5,38,39,38, 39,7,6,7,6,7,6,23,20,23,22,23,54,19,7,34, 39,55,22,51,50,55,52,39,55,22,23,54,55,23,6,7, 6,7,22,21,6,7,6,21,20,23,22,23,22,55,50,55, 54,55,54,55,39,38,39,55,22,21,20,7,6,15,1,35, 6,35,34,39,38,39,52,55,52,55,6,7,34,39,38,39, 38,39,38,53,52,55,54,55,54,51,50,23,22,23,54,2, 239,34,61,27,27,36,59,28,24,19,253,209,4,8,14,17, 12,8,7,20,10,4,1,8,5,19,40,63,84,21,70,4, 73,44,29,26,5,65,4,2,58,120,20,129,70,5,26,3, 1,26,10,37,2,2,36,95,36,51,161,53,56,2,4,2, 7,64,15,9,36,185,100,4,79,28,96,55,69,1,5,1, 23,22,8,7,43,23,2,3,12,6,14,47,28,29,8,7, 29,24,5,2,162,55,35,30,31,72,29,62,26,20,201,19, 19,31,7,2,4,7,17,36,16,20,31,27,13,29,27,1, 61,1,4,65,5,2,85,108,3,94,94,11,38,62,42,11, 136,92,24,23,45,82,32,16,41,26,2,1,24,1,3,9, 27,25,58,45,20,31,13,76,28,31,25,104,22,7,5,35, 47,81,20,22,3,3,17,1,2,10,62,7,8,38,39,27, 24,60,36,20,1,7,27,37,0,3,0,96,0,137,3,147, 3,88,0,7,0,24,0,83,0,0,1,22,23,54,55,54, 55,6,3,38,39,6,7,6,21,20,31,1,22,23,22,51, 50,55,54,3,38,39,55,22,23,54,63,1,23,7,23,22, 31,1,22,21,20,7,6,7,6,7,6,7,39,54,55,54, 55,54,55,53,38,39,38,39,38,35,34,7,6,7,23,7, 39,6,7,6,35,34,39,38,39,38,53,52,55,54,1,74, 26,60,16,48,3,2,84,13,76,38,84,20,8,35,15,5, 4,13,13,14,17,51,77,10,29,64,19,14,89,105,36,63, 30,65,166,69,9,33,67,6,7,65,143,25,62,2,144,58, 29,19,49,9,3,18,45,125,35,38,13,14,53,39,56,49, 36,56,69,30,33,33,27,53,24,12,72,35,2,84,76,84, 40,159,8,8,15,254,243,92,101,63,75,24,31,76,55,18, 4,3,8,9,28,1,131,36,134,13,98,51,44,16,135,17, 113,3,18,109,16,62,78,118,83,8,7,70,12,3,2,65, 6,26,14,20,52,99,50,48,33,83,22,6,1,184,99,66, 42,41,116,39,16,17,36,84,44,42,105,86,42,0,0,1, 0,137,0,63,3,79,3,139,0,74,0,0,1,54,55,23, 6,7,54,55,23,6,7,6,7,50,55,23,6,35,34,35, 7,22,23,22,23,22,23,22,55,50,55,54,55,54,53,38, 39,38,39,55,22,23,22,23,7,6,7,6,7,6,35,34, 39,38,39,38,39,38,53,52,55,38,39,55,22,23,55,54, 55,38,39,38,39,55,22,1,104,7,5,65,4,8,53,99, 11,118,52,1,33,69,130,9,132,66,9,9,1,1,5,20, 72,12,14,41,48,60,45,57,23,9,2,76,7,8,51,67, 19,19,1,2,15,78,12,12,62,77,61,55,94,43,11,6, 9,2,67,107,22,111,49,31,1,1,56,85,23,11,29,83, 2,211,90,94,4,89,92,2,19,64,21,2,11,185,17,64, 18,53,22,20,87,50,8,7,19,1,28,35,69,25,25,57, 99,8,11,40,84,45,43,41,40,92,62,9,8,39,25,44, 101,25,26,36,43,17,20,9,42,60,39,8,174,10,10,6, 40,11,5,58,42,0,0,1,0,101,0,68,3,77,2,235, 0,63,0,0,1,7,39,55,39,55,23,55,54,55,38,39, 55,22,23,54,51,50,23,22,23,22,23,7,6,7,6,7, 6,39,34,47,1,55,22,51,55,54,55,54,55,54,55,38, 39,38,47,1,38,35,34,7,22,23,7,38,39,6,7,22, 19,7,3,38,1,21,143,33,150,87,59,86,109,17,15,26, 55,45,70,29,54,45,33,31,95,46,24,3,3,17,90,35, 35,33,36,59,91,29,23,106,51,38,7,6,51,46,34,1, 3,61,25,25,6,23,25,29,32,6,25,59,20,15,86,67, 51,109,61,135,11,1,201,83,55,88,197,27,192,57,7,6, 31,50,47,63,40,18,9,27,66,36,40,30,75,54,21,10, 10,1,33,11,61,40,4,1,2,12,46,36,32,43,39,17, 6,2,6,9,10,51,29,44,24,38,38,117,254,231,23,1, 85,25,0,1,0,41,0,89,3,126,3,101,0,61,0,0, 19,7,39,55,39,55,23,54,55,38,39,55,22,23,54,51, 50,23,22,23,22,23,7,6,7,6,7,6,35,34,47,1, 55,22,23,55,54,55,54,55,54,55,38,39,38,39,38,35, 34,7,22,23,7,38,39,6,7,22,19,7,3,38,245,171, 33,178,103,59,101,80,94,23,74,44,82,34,64,52,38,35, 70,56,62,3,3,17,97,44,43,38,41,72,122,11,23,119, 61,41,11,11,61,52,42,2,4,69,36,34,27,29,36,43, 19,20,59,22,20,80,106,67,119,60,168,8,2,32,99,56, 104,231,27,227,44,43,29,69,48,76,46,21,10,18,50,55, 67,32,80,62,28,12,11,47,4,61,46,1,3,2,3,14, 53,43,41,51,46,24,8,7,12,35,42,28,47,35,33,59, 155,254,203,23,1,164,18,0,0,2,0,146,0,14,3,121, 2,244,0,11,0,73,0,0,37,55,54,55,54,53,38,39, 38,39,23,20,3,6,7,6,7,6,7,39,38,55,52,55, 54,55,23,6,7,54,55,54,55,54,55,38,39,55,23,21, 22,23,22,23,22,21,6,7,6,7,6,35,34,39,6,15, 1,39,54,55,38,39,38,39,38,39,55,22,23,22,23,54, 53,52,2,93,45,104,45,24,6,71,36,48,4,70,157,80, 61,54,7,11,65,15,1,2,7,40,63,50,1,37,63,88, 146,23,27,4,3,65,7,67,49,81,26,8,1,75,21,25, 65,81,31,30,54,125,6,33,104,45,6,3,63,49,6,11, 59,41,26,25,33,63,210,1,10,84,44,55,121,52,25,2, 111,188,1,39,28,99,75,195,24,42,5,145,81,38,34,92, 157,15,196,153,110,79,105,36,6,5,56,29,5,85,1,3, 30,51,108,36,39,115,74,20,15,37,6,58,72,4,55,63, 40,4,1,37,97,10,24,29,84,28,25,14,83,190,45,0, 0,2,0,96,0,29,3,176,3,115,0,18,0,81,0,0, 37,51,54,55,54,55,54,53,52,39,38,39,38,39,38,39, 22,21,20,3,6,7,6,7,6,7,39,38,53,52,55,54, 55,54,55,23,6,7,23,20,21,54,55,54,55,54,55,39, 55,23,22,23,22,23,22,21,6,7,6,7,6,35,34,39, 6,15,1,39,54,55,38,39,38,39,55,22,23,22,23,54, 53,52,2,101,52,64,43,79,22,6,54,19,21,4,3,37, 59,5,71,180,103,70,60,9,15,66,17,3,7,45,1,1, 64,51,6,1,49,72,88,160,38,44,8,64,9,78,58,88, 31,12,1,81,25,32,73,92,38,35,58,130,27,33,130,49, 85,64,6,9,58,46,24,34,48,76,246,5,26,46,98,27, 27,93,73,25,16,2,2,23,3,67,59,221,1,87,26,123, 87,214,33,58,5,178,87,42,38,92,188,4,3,15,200,133, 97,2,2,154,90,110,47,12,6,103,6,105,2,35,55,120, 45,46,126,84,27,18,42,8,62,79,16,55,80,45,40,128, 14,19,28,91,29,41,17,101,225,53,0,2,0,138,0,49, 3,8,3,36,0,19,0,59,0,0,37,38,35,34,7,6, 15,1,23,22,23,22,51,50,55,54,55,54,53,52,39,38, 53,52,55,23,6,7,22,51,50,55,23,6,35,34,39,20, 23,22,31,1,7,38,39,6,7,6,35,34,39,38,53,52, 55,54,55,54,51,50,1,203,76,65,21,20,50,19,3,1, 12,35,38,54,33,27,34,13,7,7,15,12,65,8,3,47, 44,74,95,13,98,90,44,42,21,82,147,16,41,134,67,6, 79,43,51,74,59,76,4,19,105,27,28,62,237,32,3,10, 23,6,15,40,27,30,12,15,29,17,33,7,81,97,127,106, 165,5,120,94,7,23,63,25,6,111,129,42,115,13,51,106, 39,90,42,22,45,57,65,14,14,67,18,5,0,2,0,86, 0,70,3,51,3,169,0,22,0,69,0,0,1,38,35,34, 7,6,7,6,7,23,22,23,22,23,22,51,50,55,54,55, 54,53,52,39,38,39,38,53,54,55,23,6,7,22,51,50, 55,23,6,35,34,39,23,22,23,22,23,22,23,7,38,39, 38,39,6,7,6,35,34,39,38,39,55,52,55,54,55,54, 51,50,1,202,91,77,25,23,58,24,5,1,1,9,39,5, 4,46,64,50,37,28,12,10,9,2,6,10,1,13,65,10, 2,57,52,92,105,14,117,99,55,50,2,5,16,99,162,6, 18,40,156,67,9,9,3,86,50,62,84,68,81,4,3,1, 21,118,30,32,73,1,30,39,4,11,28,5,5,16,43,33, 4,3,37,23,18,27,22,37,11,85,18,53,85,106,103,213, 4,169,84,8,27,64,29,9,101,74,113,49,128,5,14,51, 121,40,6,5,102,50,29,50,62,72,29,3,3,74,20,6, 0,2,0,122,0,52,3,87,3,137,0,46,0,56,0,0, 19,23,6,7,54,55,54,51,50,51,22,23,22,23,22,21, 20,15,1,6,7,6,35,34,39,55,22,51,54,55,54,55, 54,53,52,39,38,39,38,39,7,6,7,6,7,39,54,19, 55,22,23,22,23,7,38,39,38,201,65,24,32,118,58,110, 104,7,8,109,70,40,14,7,79,31,13,13,85,143,40,93, 5,82,45,125,67,63,30,14,4,15,68,44,47,43,102,135, 58,94,57,62,95,2,125,62,58,112,28,99,59,53,2,180, 8,190,119,90,32,61,6,67,38,49,25,27,98,87,30,11, 9,59,7,65,7,1,46,44,80,35,30,15,13,53,34,23, 2,1,12,96,41,80,36,220,1,65,65,4,15,14,53,59, 48,15,13,0,0,1,1,9,0,46,3,43,3,156,0,53, 0,0,1,23,6,15,1,20,23,54,55,54,55,54,51,50, 23,22,23,22,31,1,6,7,6,7,6,7,6,7,39,54, 55,54,55,54,55,54,39,52,39,38,39,7,6,7,6,7, 6,7,39,38,53,52,55,54,1,81,62,57,10,3,2,114, 116,23,24,41,34,14,13,46,26,19,6,4,1,89,15,18, 73,151,25,55,14,145,58,40,27,75,23,8,1,24,15,15, 17,15,17,114,104,24,59,67,9,6,10,3,156,19,180,112, 85,27,28,226,99,19,16,26,4,14,66,52,72,83,213,132, 24,19,78,38,6,12,63,32,32,22,29,83,169,52,52,97, 75,37,4,1,4,10,77,191,46,120,12,123,62,59,50,99, 0,1,0,163,0,65,3,113,3,102,0,77,0,0,1,55, 22,51,50,55,23,1,54,55,54,51,50,23,22,23,22,21, 20,7,6,7,6,7,6,35,34,39,38,53,52,55,54,55, 54,51,50,23,22,23,22,23,7,38,47,1,6,7,6,7, 6,21,20,23,22,51,50,55,54,55,54,55,39,38,47,2, 38,35,34,7,6,7,39,1,6,35,34,1,53,6,58,55, 108,128,32,254,170,25,91,95,71,58,47,83,37,19,1,13, 113,56,64,45,42,92,54,50,15,24,54,24,22,26,22,55, 28,2,10,62,28,29,23,42,22,3,2,4,29,36,64,33, 37,86,65,42,5,1,8,55,28,7,34,45,61,84,89,200, 39,1,159,62,73,65,3,15,64,7,30,59,254,173,11,31, 32,20,37,77,40,42,11,10,102,74,37,18,12,56,52,59, 31,25,38,16,7,9,22,84,8,34,19,95,12,3,1,22, 3,3,7,12,39,30,36,10,24,67,45,40,27,59,42,18, 3,15,28,30,102,54,1,154,10,0,0,2,0,77,0,89, 3,217,3,129,0,3,0,78,0,0,1,55,53,6,19,55, 23,7,55,23,7,21,54,55,54,51,50,23,22,23,22,23, 22,21,15,2,23,22,23,55,54,55,54,55,23,6,7,6, 7,6,35,34,39,38,47,1,52,55,54,53,52,39,38,39, 38,35,34,15,1,6,7,20,23,35,3,7,39,19,63,1, 53,6,35,34,39,63,1,54,1,12,9,9,13,3,65,3, 38,41,82,128,106,68,58,25,24,72,30,6,4,7,5,35, 2,1,5,11,17,10,6,24,18,64,14,16,12,19,33,39, 12,12,51,11,3,26,16,4,14,54,15,17,34,40,20,103, 162,3,65,3,146,54,151,50,2,67,90,21,22,2,103,53, 1,192,11,4,15,1,48,145,2,132,7,58,137,51,124,55, 35,7,23,69,14,15,26,35,63,204,50,13,29,3,3,4, 6,23,107,10,91,33,25,18,32,4,15,69,41,41,135,84, 43,24,18,57,16,4,17,10,53,165,169,169,1,14,162,38, 1,16,86,92,1,11,1,65,1,2,0,1,0,163,0,34, 3,119,3,102,0,47,0,0,1,55,22,51,50,55,23,1, 54,55,50,23,22,23,22,23,7,6,7,6,15,1,39,54, 55,54,55,54,55,54,53,52,53,38,39,38,39,38,35,34, 7,6,7,39,1,6,35,34,1,53,6,58,55,108,128,32, 254,199,129,104,46,43,95,52,30,4,1,13,120,79,149,37, 17,141,59,23,21,76,24,7,4,58,34,38,26,30,116,222, 37,53,40,1,159,62,73,65,3,15,64,7,30,59,254,202, 60,1,12,26,74,41,47,36,100,85,56,41,10,63,38,32, 12,15,54,66,20,17,3,3,49,45,26,11,7,122,20,31, 52,1,155,10,0,1,0,130,0,69,3,86,3,0,0,64, 0,0,1,55,23,6,21,54,55,23,15,1,21,54,55,54, 51,50,23,22,31,1,6,7,6,7,6,7,39,54,55,54, 55,54,53,52,39,38,39,38,35,34,7,6,7,6,7,20, 23,7,38,53,6,7,39,19,54,63,1,53,6,35,34,39, 63,1,54,1,50,3,65,2,10,15,41,69,1,56,105,64, 57,75,50,66,10,2,3,12,35,135,35,105,21,166,56,36, 12,9,24,13,17,30,51,32,37,14,14,85,101,2,65,2, 55,63,55,161,7,6,1,57,72,20,19,1,90,42,2,135, 121,1,74,35,1,4,59,115,13,1,43,42,25,43,56,96, 44,35,31,90,56,15,34,61,55,43,27,32,22,29,53,47, 25,14,27,11,4,6,34,99,98,198,1,154,76,61,77,37, 1,31,11,11,72,1,8,1,65,1,2,0,0,1,0,77, 0,89,3,135,3,129,0,58,0,0,1,55,23,7,55,23, 7,21,54,55,54,51,50,23,22,31,1,6,7,6,7,6, 7,39,54,55,54,55,54,39,52,39,38,39,38,35,34,7, 6,7,20,23,35,3,6,7,39,19,54,63,1,53,6,35, 34,39,63,1,54,1,25,3,65,3,38,41,82,88,105,72, 66,84,56,73,14,2,2,15,39,148,45,124,20,185,67,47, 16,11,1,43,9,11,38,62,53,59,97,121,3,65,3,37, 109,54,180,11,10,2,67,90,21,22,2,103,53,2,240,145, 2,132,7,58,137,37,71,42,29,48,63,107,47,43,38,100, 63,20,40,62,60,49,34,41,27,35,82,59,13,9,33,24, 39,118,171,174,1,22,40,129,36,1,67,18,18,92,1,11, 1,65,1,2,0,3,0,56,0,79,3,165,3,105,0,14, 0,32,0,102,0,0,37,38,35,34,7,6,7,23,22,23, 22,51,50,55,54,1,6,7,6,7,6,21,22,23,22,23, 22,23,54,55,54,55,54,63,1,6,7,39,54,55,23,7, 54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39, 38,39,38,47,1,52,55,54,55,54,55,51,22,23,22,23, 54,53,52,47,1,38,39,38,7,34,7,6,15,1,6,7, 6,35,34,35,38,39,38,39,38,53,52,55,54,2,254,92, 62,38,35,23,3,5,16,30,22,34,70,61,8,254,147,148, 73,3,3,47,1,9,13,22,15,14,19,29,10,86,33,63, 88,129,173,6,164,188,43,93,47,44,87,67,104,44,23,88, 26,32,78,81,40,35,7,8,73,14,2,1,14,93,19,21, 41,67,98,5,6,54,69,30,14,17,52,77,62,68,50,54, 61,28,30,28,32,3,2,41,36,30,15,12,63,97,197,61, 20,14,11,13,28,14,13,41,5,1,105,48,74,4,3,52, 59,28,30,41,28,21,3,5,53,21,194,73,124,164,34,13, 65,10,50,56,170,6,25,40,98,49,56,114,91,28,21,51, 13,2,4,33,55,26,5,6,67,24,5,2,8,63,3,4, 69,72,88,58,21,9,6,21,1,13,97,121,141,56,34,29, 2,48,39,49,37,37,89,70,106,0,0,4,0,107,0,30, 3,177,3,142,0,9,0,23,0,47,0,128,0,0,37,55, 22,23,22,23,7,38,39,38,37,54,55,39,38,47,1,6, 7,6,21,20,23,22,31,1,54,55,54,55,54,53,52,39, 38,35,34,7,6,7,55,22,23,22,21,20,7,6,39,6, 7,39,54,55,39,38,39,55,22,51,50,55,23,6,7,54, 55,54,51,50,23,22,21,20,7,6,7,6,35,34,39,6, 7,6,15,2,54,51,50,23,22,23,22,23,51,54,55,54, 55,23,6,7,6,35,34,39,38,39,38,39,38,39,38,35, 34,7,6,7,6,7,39,54,55,38,39,38,53,38,2,231, 36,71,30,30,35,58,36,20,23,254,87,59,9,22,8,8, 29,18,10,21,7,11,102,52,99,66,51,15,5,11,20,74, 28,31,91,129,47,71,30,8,43,14,147,37,74,39,182,192, 109,57,76,6,122,58,43,123,23,186,139,110,115,45,35,97, 40,24,8,22,68,87,121,52,54,53,9,7,29,18,2,47, 36,42,32,23,44,28,15,16,17,22,28,62,43,72,26,46, 35,15,13,30,37,2,1,39,26,15,18,17,21,11,13,52, 103,35,136,88,28,16,16,1,247,54,46,34,34,72,29,70, 22,26,162,54,32,11,3,1,1,1,6,12,28,13,11,18, 33,3,1,48,39,62,19,20,30,17,29,5,15,57,3,3, 46,19,18,35,48,16,159,17,38,53,193,134,2,2,8,65, 12,11,63,128,119,48,20,7,58,34,48,28,30,84,52,62, 12,50,8,1,23,11,1,13,18,11,46,30,7,4,14,17, 55,49,60,18,29,4,8,42,2,1,42,9,5,5,2,4, 14,49,56,112,80,19,27,27,31,54,0,1,0,148,0,43, 3,119,3,170,0,84,0,0,1,38,39,55,22,23,54,55, 23,6,7,51,54,55,54,51,23,6,7,39,6,7,54,55, 54,23,50,23,22,23,54,55,23,6,7,22,21,7,47,1, 38,39,6,7,6,7,6,21,20,23,22,23,22,23,50,23, 22,23,7,38,39,38,39,38,39,38,53,54,55,54,55,54, 55,38,35,34,7,6,7,6,7,39,54,55,54,1,62,51, 100,9,110,58,28,33,64,33,24,88,60,184,2,3,10,199, 92,81,41,45,57,85,45,34,56,35,9,8,92,148,17,149, 81,12,1,65,1,2,5,112,69,26,9,16,5,1,1,25, 109,3,3,67,198,5,192,81,128,43,7,5,17,1,26,39, 152,19,25,14,24,28,34,88,161,7,9,46,123,43,2,2, 136,5,14,65,16,5,76,151,14,147,70,3,27,1,64,31, 2,2,94,66,31,23,12,1,30,8,9,30,40,63,40,27, 54,87,50,1,107,34,27,38,57,21,18,26,26,14,13,2, 2,40,23,1,15,16,64,14,17,25,53,9,9,28,35,44, 42,71,67,9,10,6,8,23,105,5,6,48,168,88,4,0, 0,1,0,76,0,75,3,142,3,154,0,52,0,0,1,20, 23,22,23,51,54,55,54,55,54,55,23,6,7,6,7,6, 35,34,39,38,47,1,38,39,34,7,6,7,6,7,39,18, 55,54,55,23,6,3,51,7,51,54,55,54,51,50,23,22, 23,22,23,2,66,10,11,21,20,40,40,53,81,3,4,49, 79,49,13,14,68,51,18,17,80,7,1,1,12,3,21,33, 58,79,179,51,184,91,59,104,59,81,151,1,1,1,63,44, 24,24,15,14,14,10,27,1,1,104,133,39,39,6,5,26, 34,95,3,5,42,93,38,10,9,43,5,24,158,96,71,34, 7,15,50,67,189,40,1,17,158,102,213,29,169,254,243,14, 55,20,12,5,6,12,33,73,0,2,2,255,2,251,3,219, 3,180,0,8,0,19,0,0,1,55,22,23,22,23,7,38, 39,7,55,22,23,22,23,22,23,7,38,39,3,76,31,60, 24,14,14,60,13,29,118,30,58,21,1,2,17,11,60,13, 27,3,123,57,31,26,15,34,25,33,17,32,58,29,22,2, 2,19,33,23,34,16,255,255,2,255,2,251,3,219,3,180, 16,6,7,221,0,0,0,1,0,207,0,44,3,28,2,150, 0,30,0,0,1,54,55,5,34,35,39,37,51,23,6,7, 6,7,39,6,7,6,15,1,39,54,55,54,55,54,53,52, 53,55,20,2,15,119,62,254,59,24,23,1,1,250,54,29, 67,49,46,95,12,2,38,36,100,37,41,98,34,14,9,33, 65,1,232,42,67,2,65,2,65,74,34,31,35,33,149,80, 73,80,30,51,77,46,19,19,68,159,17,27,1,27,0,1, 0,162,0,63,3,72,3,1,0,36,0,0,1,54,55,54, 55,4,35,53,50,37,23,6,7,6,7,6,7,39,20,7, 6,7,6,7,6,7,39,54,55,54,55,54,53,52,39,55, 23,2,14,143,79,2,2,254,120,198,217,1,176,29,78,44, 7,6,53,109,17,44,1,1,42,114,15,28,40,105,37,25, 14,39,1,65,1,2,53,49,86,2,2,2,65,2,65,86, 31,5,4,36,40,47,178,94,2,2,84,92,12,22,51,84, 44,30,30,80,178,24,34,1,53,0,0,1,0,168,0,77, 2,188,2,209,0,19,0,0,1,6,15,1,39,54,55,54, 55,54,55,54,55,23,6,7,6,7,17,35,1,201,82,172, 8,27,167,70,17,15,79,111,8,12,53,105,56,8,9,65, 1,152,62,78,4,59,77,51,12,12,65,153,11,17,39,144, 57,9,8,254,125,0,0,1,0,118,0,98,2,215,3,71, 0,19,0,0,1,6,15,1,39,54,55,54,55,54,55,54, 55,23,6,7,6,7,17,35,1,199,93,188,29,27,186,81, 24,21,90,120,12,22,53,113,62,16,16,65,1,234,72,87, 13,59,86,56,17,17,73,165,17,31,38,156,66,17,15,254, 63,0,0,1,0,169,0,19,3,42,3,15,0,25,0,0, 1,53,51,21,33,6,7,6,7,6,7,6,7,39,54,55, 54,55,54,55,54,55,33,21,35,17,1,181,65,1,52,22, 6,27,62,67,155,27,60,21,158,62,36,23,60,27,4,4, 254,9,65,2,96,175,175,176,32,138,75,81,57,10,20,61, 54,41,25,28,72,187,24,32,196,1,5,0,0,1,0,122, 0,35,3,85,3,146,0,24,0,0,1,53,51,21,33,6, 7,6,7,6,15,1,39,54,55,54,55,54,55,54,55,33, 21,35,17,1,176,65,1,100,24,12,31,67,74,166,115,21, 182,74,43,27,71,31,4,5,253,175,65,2,194,208,208,195, 57,145,81,89,64,40,62,61,50,28,33,87,215,31,39,231, 1,40,0,1,0,140,0,163,3,78,2,160,0,11,0,0, 1,35,53,33,21,35,17,33,21,33,53,33,1,189,221,2, 8,234,1,80,253,62,1,49,2,95,65,65,254,133,65,65, 0,1,0,83,0,202,3,132,3,12,0,11,0,0,1,33, 53,33,21,33,17,33,21,33,53,33,1,186,254,250,2,90, 254,237,1,137,252,207,1,103,2,203,65,65,254,64,65,65, 0,1,0,132,0,78,3,52,3,21,0,57,0,0,1,5, 34,35,39,37,50,51,38,39,55,23,55,50,51,23,7,35, 22,23,22,21,20,7,6,7,34,7,6,35,47,1,55,22, 51,50,55,54,55,54,55,54,53,52,39,38,39,6,7,6, 15,1,39,54,55,54,55,54,1,205,254,236,8,7,1,1, 68,12,11,6,11,65,18,227,5,5,1,222,10,13,15,8, 13,25,61,2,3,20,22,42,53,17,54,27,13,9,31,15, 2,1,6,7,13,13,86,63,59,132,14,39,130,54,5,6, 62,2,25,2,65,2,66,114,7,186,1,65,1,133,111,61, 15,34,26,54,19,1,5,4,13,63,15,3,7,26,3,2, 12,22,21,45,100,132,152,73,69,103,10,51,102,59,7,6, 72,0,0,1,0,77,0,104,3,102,3,152,0,54,0,0, 1,34,7,53,37,39,55,23,37,50,51,23,5,34,35,22, 23,22,21,20,7,6,7,6,35,34,39,55,22,51,50,55, 54,55,54,55,54,53,52,39,38,39,6,7,6,7,6,15, 1,39,54,55,54,55,54,1,208,116,230,1,151,21,65,21, 1,9,7,7,1,254,251,7,6,19,14,9,14,30,72,22, 25,33,76,17,66,28,16,12,39,19,1,1,7,8,15,17, 102,73,2,2,73,153,10,40,153,68,3,3,69,2,122,2, 65,3,214,6,220,2,65,2,186,101,70,18,38,29,62,20, 6,19,63,16,3,9,34,2,2,15,25,24,54,117,167,183, 85,3,2,85,117,8,51,118,76,4,3,81,0,1,0,136, 0,119,3,2,3,140,0,49,0,0,1,38,35,53,50,23, 54,53,52,39,55,21,6,7,5,50,51,6,7,6,7,6, 7,6,7,47,2,55,22,51,50,55,54,55,54,55,39,34, 35,6,7,6,7,6,7,39,54,55,54,1,134,68,135,139, 69,4,1,65,1,1,1,36,9,8,32,12,18,25,9,12, 35,54,37,46,18,23,50,21,27,21,28,20,17,17,229,6, 5,13,34,44,123,16,43,47,111,42,85,2,105,1,65,1, 65,88,32,40,1,182,23,21,1,254,77,109,44,17,13,41, 3,3,13,7,61,19,22,31,119,105,151,1,113,83,110,131, 17,44,46,114,60,122,0,3,0,109,0,90,4,3,3,173, 0,8,0,19,0,65,0,0,1,55,22,23,22,23,7,38, 39,7,55,22,23,22,23,22,23,7,38,39,5,34,39,53, 51,54,53,52,39,55,21,7,5,50,51,2,7,6,7,6, 7,6,7,39,38,39,55,22,51,50,55,54,55,54,55,38, 35,6,7,6,15,1,39,54,55,54,3,116,31,61,23,14, 14,60,13,27,120,30,56,17,5,4,17,11,60,12,26,254, 47,148,74,227,4,1,65,2,1,58,10,10,34,13,19,25, 11,13,39,56,35,22,51,22,56,23,31,22,32,20,18,20, 88,177,13,37,49,133,63,46,116,45,98,3,70,57,32,25, 15,34,25,33,17,31,58,30,16,4,5,19,34,23,34,16, 130,1,64,61,86,32,66,1,199,48,1,254,240,83,117,46, 19,15,43,2,2,3,19,61,21,25,35,128,110,170,1,123, 90,119,141,66,46,120,62,138,0,1,0,164,0,111,3,52, 3,131,0,19,0,0,1,7,39,55,39,55,23,55,23,7, 23,37,23,5,19,7,3,5,39,37,1,118,186,24,181,92, 58,95,199,25,195,83,1,20,26,254,240,145,58,147,254,224, 25,1,27,2,117,75,60,73,183,29,188,81,60,79,166,117, 59,116,254,223,29,1,36,122,60,121,0,3,0,137,0,81, 3,166,3,172,0,10,0,21,0,41,0,0,1,55,22,23, 22,23,22,23,7,38,39,7,55,22,23,22,23,22,23,7, 38,39,5,7,39,55,39,55,23,55,23,7,23,37,23,5, 19,7,3,5,39,37,3,24,30,60,20,2,2,18,10,59, 13,28,119,29,58,17,4,4,13,15,61,12,25,254,120,203, 25,199,101,59,103,218,24,213,93,1,44,26,254,215,158,58, 160,254,199,26,1,54,3,115,57,31,21,3,2,20,29,25, 33,17,31,58,31,16,4,4,16,37,23,34,16,162,83,61, 80,200,29,205,88,60,86,184,127,59,127,254,198,29,1,62, 133,59,132,0,0,1,0,107,0,57,3,29,3,86,0,37, 0,0,1,6,7,6,15,1,39,54,55,54,55,54,55,54, 55,23,6,7,37,51,23,6,7,6,7,6,7,6,7,39, 54,55,54,55,54,55,54,55,1,139,24,32,49,115,28,40, 115,44,10,9,46,44,2,3,63,16,9,1,62,17,44,82, 63,37,41,100,201,33,63,26,192,79,62,43,89,87,10,13, 2,169,62,49,72,89,22,51,88,56,12,13,69,161,7,10, 17,60,30,5,64,201,94,55,43,101,94,15,28,59,86,53, 40,45,92,201,23,31,0,3,0,77,0,23,3,234,3,135, 0,8,0,19,0,57,0,0,1,55,22,23,22,23,7,38, 39,7,55,22,23,22,23,22,23,7,38,39,5,6,7,6, 7,6,7,39,54,55,54,55,54,55,54,55,23,6,7,37, 23,6,7,6,7,6,7,6,7,39,54,55,54,55,54,55, 54,55,3,91,31,60,24,14,14,60,13,29,118,30,58,21, 1,2,17,11,60,13,27,254,75,25,36,52,118,10,27,40, 117,45,17,14,50,47,2,4,63,20,9,1,112,44,87,65, 42,47,103,205,35,85,26,209,92,62,44,99,95,10,13,3, 78,57,31,26,15,34,25,33,17,32,58,29,22,2,2,19, 33,23,34,16,69,67,55,76,93,7,21,51,90,52,21,20, 75,170,10,13,18,72,28,6,64,213,100,64,49,105,97,17, 38,60,92,63,42,46,103,221,24,31,0,1,0,105,0,74, 3,129,3,122,0,34,0,0,1,33,6,15,1,39,54,55, 54,55,54,55,54,53,23,6,7,33,21,35,6,7,6,7, 6,15,1,39,54,55,54,55,54,55,54,2,77,254,238,40, 110,11,49,118,40,7,6,29,25,1,64,22,26,2,38,243, 14,34,13,17,46,113,49,38,111,42,22,15,48,18,1,2, 111,72,126,13,43,136,72,13,12,62,135,3,2,11,123,68, 65,190,92,35,30,81,85,36,53,81,48,26,27,82,196,16, 0,3,0,75,0,42,3,226,3,153,0,10,0,21,0,55, 0,0,1,55,22,23,22,23,22,23,7,38,39,7,55,22, 23,22,23,22,23,7,38,39,7,33,6,15,1,39,54,55, 54,55,54,55,23,6,7,33,21,33,6,7,6,7,6,7, 6,7,39,54,55,54,55,54,55,54,3,84,30,60,20,2, 2,18,10,59,13,28,119,29,58,17,4,4,13,15,61,12, 25,218,254,212,46,120,9,49,130,44,6,5,33,27,64,24, 30,2,88,254,246,15,34,15,20,50,122,17,35,38,118,45, 26,17,54,18,2,3,90,57,31,21,3,2,20,29,25,33, 17,31,58,31,16,4,4,16,37,23,34,16,145,80,137,11, 42,149,82,11,11,70,149,11,137,73,65,202,97,42,35,87, 92,13,25,52,87,52,29,30,94,217,15,0,0,1,0,187, 0,163,2,251,2,241,0,7,0,0,19,53,33,17,33,53, 33,17,194,2,57,253,192,1,255,2,176,65,253,178,65,1, 204,0,0,3,0,162,0,138,3,216,3,150,0,8,0,19, 0,27,0,0,1,55,22,23,22,23,7,38,39,7,55,22, 23,22,23,22,23,7,38,39,5,53,33,17,33,53,33,17, 3,74,30,62,22,18,10,59,13,29,118,29,59,20,2,2, 14,14,61,12,27,253,133,2,100,253,148,2,43,3,93,57, 32,25,20,29,25,33,18,33,58,29,22,2,2,17,35,23, 34,16,78,65,253,136,65,1,246,0,0,1,0,153,0,51, 3,92,3,94,0,30,0,0,1,35,53,51,53,51,21,51, 54,55,23,6,7,51,21,35,6,7,6,15,1,39,54,55, 54,55,54,55,35,21,35,1,75,178,178,65,249,3,2,65, 3,1,149,153,14,53,47,118,44,44,112,45,22,15,45,15, 245,65,2,83,65,201,201,65,137,1,168,33,65,184,112,99, 109,40,48,101,64,31,32,93,175,236,0,3,0,125,0,16, 3,194,3,145,0,8,0,19,0,51,0,0,1,55,22,23, 22,23,7,38,39,7,55,22,23,22,23,22,23,7,38,39, 5,35,53,51,53,51,21,33,54,55,23,20,7,51,21,35, 6,7,6,7,6,7,39,54,55,54,55,54,55,33,17,35, 3,51,31,60,24,14,14,60,13,29,118,30,58,21,1,2, 17,11,60,13,27,254,50,195,195,65,1,18,4,2,64,4, 165,169,16,56,49,123,15,38,44,116,48,27,19,50,15,254, 242,65,3,88,57,31,26,15,34,25,33,17,32,58,29,22, 2,2,19,33,23,34,16,173,65,220,220,72,149,1,123,97, 65,202,119,103,116,14,35,49,103,67,38,39,105,188,254,255, 0,3,0,138,0,81,3,158,3,46,0,17,0,27,0,37, 0,0,37,39,54,55,54,55,54,55,54,55,23,6,7,6, 7,6,7,6,3,55,22,23,22,23,7,38,39,38,19,55, 22,23,22,23,7,38,39,38,1,18,21,198,86,47,36,95, 106,17,31,57,100,60,51,54,100,197,24,202,7,93,41,46, 70,41,71,64,36,43,38,69,31,30,62,56,52,32,27,81, 62,67,50,27,30,80,186,30,56,32,181,78,65,46,83,72, 8,1,101,65,11,17,20,59,50,62,18,9,1,47,53,50, 33,33,97,34,85,34,29,0,0,5,0,109,0,50,3,190, 3,105,0,8,0,19,0,37,0,49,0,59,0,0,1,55, 22,23,22,23,7,38,39,7,55,22,23,22,23,22,23,7, 38,39,1,39,54,55,54,55,54,55,54,55,23,6,7,6, 7,6,7,6,3,55,22,23,22,23,22,23,7,38,39,38, 19,55,22,23,22,23,7,38,39,38,2,202,31,60,24,14, 14,60,13,29,118,30,58,21,1,2,17,11,60,13,27,254, 90,21,202,84,64,47,102,112,20,36,57,104,60,58,63,109, 210,31,214,6,98,43,2,2,49,76,41,69,41,36,7,39, 77,30,37,62,56,55,36,27,3,48,57,31,26,15,34,25, 33,17,32,58,29,22,2,2,19,33,23,34,16,253,80,61, 70,45,34,40,86,194,35,66,31,189,81,77,52,91,76,11, 1,132,64,10,18,1,1,21,63,51,58,18,15,1,77,53, 57,32,40,101,33,90,39,29,0,1,0,82,0,94,3,94, 3,19,0,36,0,0,1,6,7,6,15,1,39,54,55,54, 55,54,55,54,55,6,5,39,37,50,51,23,6,7,6,7, 22,23,22,31,1,7,38,39,38,39,38,1,201,2,6,96, 188,48,35,183,81,30,26,98,127,2,1,146,254,216,1,1, 182,22,21,38,122,80,2,1,63,53,67,170,8,26,158,63, 21,18,52,1,104,3,6,101,124,32,54,121,73,27,27,104, 218,2,2,2,2,65,4,64,211,98,2,2,82,43,53,73, 3,60,70,41,14,14,41,0,0,3,0,49,0,63,3,174, 3,212,0,8,0,19,0,57,0,0,1,55,22,23,22,23, 7,38,39,7,55,22,23,22,23,22,23,7,38,39,1,6, 7,6,7,39,54,55,54,55,54,55,54,55,5,34,35,53, 37,54,51,23,6,7,6,7,22,23,22,23,22,23,7,38, 39,38,39,38,3,31,31,61,23,14,14,60,13,27,120,30, 56,17,5,4,17,11,60,12,26,254,202,116,221,15,17,36, 197,90,32,28,105,136,4,4,254,72,22,21,1,214,26,25, 38,129,80,8,7,70,58,70,173,8,14,26,179,80,11,10, 57,3,155,57,32,25,15,34,25,33,17,31,58,30,16,4, 5,19,34,23,34,16,254,19,124,144,10,11,55,129,80,29, 29,111,232,7,7,4,65,4,1,65,221,102,9,9,90,46, 56,75,4,6,59,76,57,8,8,45,0,1,0,95,0,80, 3,30,3,39,0,43,0,0,19,7,39,55,54,55,23,6, 7,37,23,6,7,6,7,39,54,55,54,55,5,23,22,23, 22,23,22,23,22,51,50,55,23,6,35,34,39,38,39,38, 39,38,53,52,250,137,18,156,2,6,65,3,4,1,136,52, 40,41,30,80,48,72,30,33,30,254,141,1,2,5,7,27, 18,50,52,86,74,155,5,165,70,91,61,78,37,28,9,9, 1,248,42,63,47,75,160,2,66,148,118,52,139,71,51,91, 44,80,51,58,97,112,150,60,42,65,21,13,14,12,12,65, 13,14,19,43,35,72,73,128,19,0,0,3,0,63,0,48, 3,196,3,112,0,10,0,21,0,65,0,0,1,55,22,23, 22,23,22,23,7,38,39,7,55,22,23,22,23,22,23,7, 38,39,5,7,39,55,54,55,23,6,7,37,23,6,7,6, 7,39,54,55,54,55,5,23,22,23,22,23,22,23,22,51, 50,55,23,6,35,34,39,38,39,38,39,38,53,52,3,54, 30,60,20,2,2,18,10,59,13,28,119,29,58,17,4,4, 13,15,61,12,25,253,214,152,18,171,2,6,65,6,1,1, 172,53,47,41,33,86,49,81,30,34,36,254,104,1,3,5, 8,30,20,54,55,91,81,171,5,178,77,97,65,84,39,29, 11,9,3,55,57,31,21,3,2,20,29,25,33,17,31,58, 31,16,4,4,16,37,23,34,16,238,45,62,52,85,171,3, 157,77,129,52,156,72,57,96,44,88,54,57,116,123,176,59, 40,70,24,15,16,13,14,65,14,15,18,48,36,78,81,138, 21,0,0,2,0,137,0,69,3,50,3,38,0,16,0,26, 0,0,1,23,6,7,6,7,6,15,1,39,54,55,54,55, 54,55,54,37,55,22,23,22,23,7,38,39,38,2,243,63, 58,39,35,44,75,157,72,37,155,65,39,29,76,63,10,253, 167,45,67,29,34,46,59,44,29,27,3,37,17,217,91,83, 61,104,113,50,54,107,65,39,40,106,226,34,19,47,63,41, 48,101,27,97,41,37,0,4,0,110,0,36,3,221,3,220, 0,8,0,19,0,36,0,46,0,0,1,55,22,23,22,23, 7,38,39,7,55,22,23,22,23,22,23,7,38,39,7,23, 6,7,6,7,6,15,1,39,54,55,54,55,54,55,54,37, 55,22,23,22,23,7,38,39,38,3,79,30,62,22,18,10, 59,13,29,118,29,59,20,2,2,14,14,61,12,27,32,63, 62,44,37,47,78,164,86,37,162,69,47,34,83,68,11,253, 118,44,71,33,34,52,59,51,28,24,3,163,57,32,25,20, 29,25,33,18,33,58,29,22,2,2,17,35,23,34,16,24, 17,232,102,88,66,109,118,61,54,112,67,46,47,116,242,40, 22,47,65,47,46,115,26,109,40,33,0,1,0,115,0,29, 3,61,3,153,0,41,0,0,1,6,7,6,7,39,54,55, 54,55,54,55,54,55,23,7,37,23,6,7,6,7,6,15, 1,39,54,55,54,55,38,39,38,39,55,22,23,22,23,54, 55,6,1,107,46,141,9,9,43,97,38,6,6,47,50,2, 3,63,39,1,141,44,96,70,35,37,90,180,71,33,165,63, 87,54,72,46,34,83,15,87,41,48,80,59,77,135,2,195, 119,123,7,8,50,83,51,9,9,73,178,8,10,18,130,9, 64,229,109,53,42,103,110,43,55,102,50,70,78,50,21,15, 20,63,21,18,21,55,96,183,4,0,0,3,0,86,255,249, 3,221,3,217,0,10,0,21,0,68,0,0,1,55,22,23, 22,23,22,23,7,38,39,7,55,22,23,22,23,22,23,7, 38,39,5,6,7,6,15,1,39,54,55,54,55,54,55,54, 55,23,6,7,54,37,23,6,7,6,7,6,7,6,7,39, 54,55,54,55,38,39,38,39,55,22,23,22,23,54,55,5, 6,3,79,30,60,20,2,2,18,10,59,13,28,119,29,58, 17,4,4,13,15,61,12,25,254,50,22,29,46,106,19,42, 100,38,12,9,49,53,3,6,62,22,21,145,1,34,44,99, 71,42,46,93,185,25,64,34,185,84,80,53,115,111,15,16, 14,97,42,52,88,63,87,254,112,17,3,160,57,31,21,3, 2,20,29,25,33,17,31,58,31,16,4,4,16,37,23,34, 16,124,52,46,73,90,17,50,87,49,15,14,76,183,10,22, 17,85,60,4,6,63,238,112,67,53,108,114,16,38,55,111, 71,68,77,83,26,4,3,64,24,18,23,61,101,207,10,1, 0,1,0,113,0,86,3,102,3,172,0,35,0,0,1,33, 53,33,39,38,39,6,7,39,54,55,54,55,23,6,7,22, 21,20,21,33,21,33,6,7,6,7,6,7,39,54,55,54, 55,54,1,196,254,173,1,87,2,2,3,91,212,10,202,97, 103,178,25,151,77,9,1,92,254,161,10,38,44,117,18,42, 38,111,41,31,18,31,1,244,65,127,36,41,26,34,64,32, 27,30,78,60,65,26,140,66,9,9,65,114,78,89,89,14, 30,52,82,46,35,36,63,0,0,3,0,82,0,54,3,209, 3,205,0,8,0,19,0,55,0,0,1,55,22,23,22,23, 7,38,39,7,55,22,23,22,23,22,23,7,38,39,1,33, 53,33,39,38,39,6,7,39,54,55,54,55,23,6,7,22, 21,20,21,33,21,33,6,7,6,7,6,7,39,54,55,54, 55,54,3,66,31,61,23,14,14,60,13,27,120,30,56,17, 5,4,17,11,60,12,26,254,164,254,143,1,117,1,2,4, 98,233,10,218,105,107,197,26,158,91,10,1,123,254,130,10, 42,47,123,20,47,39,123,49,28,18,35,3,140,57,32,25, 15,34,25,33,17,31,58,30,16,4,5,19,34,23,34,16, 254,185,65,118,44,64,28,38,65,33,31,30,86,60,68,31, 145,71,15,15,65,126,83,95,95,16,34,53,89,57,34,35, 70,0,0,3,0,158,0,48,3,45,2,191,0,17,0,23, 0,29,0,0,1,23,6,7,6,7,6,7,6,7,39,54, 55,54,55,54,55,54,37,55,22,23,7,38,37,55,22,23, 7,38,2,238,63,59,42,33,40,70,145,17,29,33,143,60, 22,18,73,65,9,254,200,61,38,10,65,9,254,212,47,85, 37,59,40,2,165,19,203,87,68,51,87,87,10,17,55,84, 59,22,22,92,213,31,54,23,89,125,7,115,8,45,86,93, 27,91,0,3,0,108,0,68,3,89,3,52,0,16,0,22, 0,28,0,0,1,23,6,7,6,7,6,15,1,39,54,55, 54,55,54,55,54,37,55,22,23,7,38,37,55,22,23,7, 38,3,26,63,66,45,40,49,76,155,69,34,156,67,34,26, 84,73,12,254,153,61,46,9,65,10,254,163,48,94,45,58, 46,3,21,18,226,96,87,62,96,95,41,56,92,61,30,33, 105,238,39,74,24,107,140,7,135,11,44,93,112,27,103,0, 0,5,0,78,0,35,3,236,3,249,0,8,0,19,0,36, 0,44,0,52,0,0,1,55,22,23,22,23,7,38,39,7, 55,22,23,22,23,22,23,7,38,39,7,23,6,7,6,7, 6,15,1,39,54,55,54,55,54,55,54,37,55,22,23,22, 23,7,38,37,55,22,23,7,38,39,38,3,94,30,61,23, 18,10,59,13,29,118,29,59,20,2,2,14,14,61,12,27, 4,62,68,44,46,58,79,161,83,34,161,69,44,33,88,77, 14,254,128,60,28,9,10,13,65,12,254,135,48,101,49,58, 40,15,20,3,193,56,32,24,20,29,25,33,18,33,58,29, 22,2,2,17,35,23,34,16,71,18,233,98,105,73,99,101, 50,56,96,59,39,41,111,247,44,93,24,74,35,41,116,7, 146,13,44,102,119,27,81,22,30,0,0,2,0,90,0,51, 3,120,3,68,0,20,0,24,0,0,1,33,53,33,21,33, 23,6,7,6,7,6,7,39,54,55,54,55,54,53,52,3, 53,33,21,1,203,254,143,3,30,254,148,1,3,20,29,99, 9,24,49,103,32,8,6,19,243,1,246,2,5,65,65,95, 75,56,85,117,10,28,43,118,66,17,17,56,89,25,1,33, 65,65,0,4,0,57,0,17,3,239,3,135,0,8,0,19, 0,40,0,44,0,0,1,55,22,23,22,23,7,38,39,7, 55,22,23,22,23,22,23,7,38,39,5,33,53,33,21,33, 23,6,7,6,7,6,7,39,54,55,54,55,54,53,52,1, 53,33,21,3,96,31,60,24,14,14,60,13,29,118,30,58, 21,1,2,17,11,60,13,27,254,143,254,111,3,95,254,116, 1,3,22,30,103,9,31,50,109,35,11,7,21,254,247,2, 30,3,78,57,31,26,15,34,25,33,17,32,58,29,22,2, 2,19,33,23,34,16,248,65,65,101,82,62,90,122,10,36, 42,125,69,22,21,61,94,29,1,59,65,65,0,1,1,121, 0,100,3,30,3,130,0,17,0,0,1,17,35,17,51,17, 55,22,23,22,31,1,7,38,39,38,39,38,1,186,65,65, 6,121,59,63,102,5,46,99,48,6,6,51,2,47,254,53, 3,30,254,223,17,41,36,39,102,5,46,97,32,4,4,32, 0,3,1,114,0,68,3,52,3,162,0,8,0,19,0,37, 0,0,1,55,22,23,22,23,7,38,39,7,55,22,23,22, 23,22,23,7,38,39,7,17,35,17,51,17,55,22,23,22, 31,1,7,38,39,38,39,38,2,122,31,61,23,14,14,60, 13,27,120,30,56,17,5,4,17,11,60,12,26,164,65,65, 7,131,64,65,108,10,46,104,54,7,7,48,3,20,57,32, 25,15,34,25,33,17,31,58,30,16,4,5,19,34,23,34, 16,142,254,12,3,94,254,192,24,44,39,41,106,10,47,104, 36,4,4,31,0,1,0,118,0,55,3,106,3,106,0,32, 0,0,1,6,35,53,50,55,54,53,52,39,55,23,6,7, 37,50,51,21,5,34,35,6,7,6,7,6,7,39,54,55, 54,55,54,1,204,114,228,232,115,4,2,65,2,1,2,1, 66,11,10,254,186,11,11,14,31,39,108,10,27,48,101,38, 20,13,26,1,255,1,65,1,63,86,48,99,2,213,46,39, 1,65,1,117,77,100,121,11,30,44,112,63,33,34,69,0, 0,2,0,99,0,181,3,139,2,238,0,3,0,7,0,0, 55,53,33,21,1,53,33,21,99,3,40,253,69,2,50,181, 65,65,1,248,65,65,0,1,0,108,0,54,3,45,2,255, 0,31,0,0,1,54,55,33,53,33,23,6,7,22,31,1, 7,38,39,6,7,6,15,1,39,54,55,54,55,34,39,38, 47,1,55,22,2,45,63,83,254,17,2,22,37,105,64,70, 121,12,49,125,70,46,33,98,189,62,33,215,109,47,38,1, 1,71,149,15,18,171,1,223,85,138,65,65,175,86,57,137, 14,43,143,56,55,32,97,114,37,56,124,102,45,47,1,45, 45,4,62,48,0,2,0,50,0,96,3,136,3,191,0,9, 0,37,0,0,1,55,22,23,22,23,7,38,39,38,19,6, 15,1,39,54,55,54,55,54,55,33,53,33,23,6,7,22, 23,22,23,7,38,39,38,39,17,35,1,117,31,68,32,33, 59,50,72,82,9,59,115,238,14,25,217,101,5,5,106,155, 254,104,1,227,24,130,43,89,64,67,119,42,108,70,60,117, 65,3,134,57,37,26,27,70,42,90,45,5,254,49,78,101, 6,59,94,62,3,3,66,133,65,65,112,34,38,38,40,101, 50,93,43,36,49,254,131,0,0,1,0,184,0,149,2,167, 3,80,0,17,0,0,1,23,6,7,6,7,6,7,6,7, 39,54,55,54,55,54,55,54,2,104,63,34,33,26,36,70, 161,28,72,35,166,67,48,31,64,41,5,3,80,11,196,88, 70,54,104,110,19,47,55,108,63,44,46,97,204,29,0,2, 0,78,0,196,3,126,2,181,0,5,0,20,0,0,1,55, 22,23,7,38,37,23,6,7,6,7,6,15,1,39,54,55, 54,55,54,2,51,53,185,93,58,106,254,67,64,28,30,5, 5,38,101,17,47,102,35,4,4,33,2,143,38,254,214,27, 231,210,13,144,65,11,10,76,107,17,45,107,61,8,8,65, 0,4,0,46,0,173,3,181,3,112,0,10,0,21,0,29, 0,47,0,0,1,55,22,23,22,23,22,23,7,38,39,7, 55,22,23,22,23,22,23,7,38,39,7,55,18,23,7,38, 39,38,37,23,6,7,6,7,6,7,6,7,39,54,55,54, 55,54,55,52,3,39,30,60,20,2,2,18,10,59,13,28, 119,29,58,17,4,4,13,15,61,12,25,202,54,194,106,59, 67,49,51,254,84,64,31,35,3,4,40,105,5,18,47,110, 39,4,4,36,30,3,55,57,31,21,3,2,20,29,25,33, 17,31,58,31,16,4,4,16,37,23,34,16,76,38,254,245, 238,28,144,84,87,160,12,159,76,7,7,78,113,4,20,45, 116,69,8,7,70,155,2,0,0,4,0,46,0,173,3,169, 3,49,0,15,0,32,0,40,0,58,0,0,1,34,7,6, 21,20,23,22,51,50,55,54,53,52,39,38,39,50,31,1, 22,21,20,7,6,35,34,39,38,53,52,55,54,5,55,18, 23,7,38,39,38,37,23,6,7,6,7,6,7,6,7,39, 54,55,54,55,54,55,52,3,99,30,12,3,25,10,10,30, 12,4,28,8,10,41,20,8,1,37,15,18,41,20,8,37, 15,254,232,54,194,106,59,67,49,51,254,84,64,31,35,3, 4,40,105,5,18,47,110,39,4,4,36,30,3,25,28,8, 9,29,12,5,28,8,10,29,12,4,24,36,20,7,6,41, 20,9,37,15,18,42,19,8,148,38,254,245,238,28,144,84, 87,160,12,159,76,7,7,78,113,4,20,45,116,69,8,7, 70,155,2,0,0,1,0,135,0,63,3,31,3,17,0,31, 0,0,19,21,23,22,23,22,23,22,51,50,55,23,6,35, 34,39,38,39,38,61,1,17,51,21,54,55,54,55,23,6, 7,6,201,2,6,39,18,35,63,113,102,213,7,229,93,119, 77,88,34,23,65,133,83,93,192,25,200,93,95,1,214,150, 62,57,26,12,13,20,21,64,24,25,28,61,42,86,15,1, 209,249,20,22,25,78,60,80,26,25,0,3,0,109,0,30, 3,144,3,120,0,8,0,19,0,53,0,0,1,55,22,23, 22,23,7,38,39,7,55,22,23,22,23,22,23,7,38,39, 1,20,7,20,23,22,23,22,51,50,55,23,6,35,34,39, 38,39,38,53,52,53,17,51,22,21,54,55,54,55,23,6, 7,6,3,1,31,60,24,14,14,60,13,29,118,30,58,21, 1,2,17,11,60,13,27,253,211,1,16,25,69,70,123,111, 228,7,250,99,127,82,97,34,24,64,1,158,78,95,214,24, 211,105,101,3,63,57,31,26,15,34,25,33,17,32,58,29, 22,2,2,19,33,23,34,16,254,229,116,49,91,30,43,22, 22,23,64,25,26,32,63,44,79,10,21,1,246,93,180,26, 21,25,86,60,85,29,27,0,0,3,0,109,0,30,3,129, 3,87,0,15,0,31,0,65,0,0,1,34,7,6,21,20, 23,22,51,50,55,54,53,52,39,38,39,50,23,22,21,20, 7,6,35,34,39,38,53,52,55,54,1,20,7,20,23,22, 23,22,51,50,55,23,6,35,34,39,38,39,38,53,52,53, 17,51,22,21,54,55,54,55,23,6,7,6,3,59,31,11, 3,28,8,9,30,12,4,29,8,9,41,20,9,37,15,18, 41,19,9,37,15,253,133,1,16,25,69,70,123,111,228,7, 250,99,127,82,97,34,24,64,1,158,78,95,214,24,211,105, 101,3,63,29,8,9,30,12,3,27,8,10,31,12,3,24, 36,16,18,41,20,8,36,15,18,43,19,8,254,127,116,49, 91,30,43,22,22,23,64,25,26,32,63,44,79,10,21,1, 246,93,180,26,21,25,86,60,85,29,27,0,0,1,0,127, 0,106,3,56,3,5,0,20,0,0,19,53,33,23,6,7, 6,7,6,7,6,7,39,54,55,54,55,54,55,54,55,127, 2,132,53,40,44,25,33,73,162,27,66,28,162,64,48,31, 69,45,6,7,2,196,65,65,195,93,53,42,92,82,14,31, 58,78,49,36,39,86,196,26,34,0,0,3,0,97,0,76, 3,201,3,207,0,10,0,21,0,41,0,0,1,55,22,23, 22,23,22,23,7,38,39,7,55,22,23,22,23,22,23,7, 38,39,5,53,33,23,6,7,6,7,6,15,1,39,54,55, 54,55,54,55,54,55,3,59,30,60,20,2,2,18,10,59, 13,28,119,29,58,17,4,4,13,15,61,12,25,253,73,2, 186,54,43,45,29,37,77,171,106,28,174,72,51,34,75,49, 6,8,3,150,57,31,21,3,2,20,29,25,33,17,31,58, 31,16,4,4,16,37,23,34,16,112,65,65,207,98,63,47, 98,87,52,59,83,54,39,42,95,214,28,38,0,3,0,97, 0,76,3,171,3,167,0,14,0,30,0,50,0,0,1,34, 7,6,21,20,23,22,51,50,55,54,53,52,47,1,50,23, 22,21,20,7,6,35,34,39,38,53,52,55,54,5,53,33, 23,6,7,6,7,6,15,1,39,54,55,54,55,54,55,54, 55,3,102,32,11,3,29,8,9,30,12,3,28,17,41,20, 8,36,15,18,43,19,8,38,15,253,12,2,186,54,43,45, 29,37,77,171,106,28,174,72,51,34,75,49,6,8,3,143, 29,8,9,31,11,3,28,8,9,31,12,27,36,16,18,41, 19,9,37,15,17,43,19,8,207,65,65,207,98,63,47,98, 87,52,59,83,54,39,42,95,214,28,38,0,0,1,0,106, 1,1,3,163,2,147,0,24,0,0,19,39,54,55,54,55, 54,51,50,23,22,23,22,23,7,0,47,1,38,39,34,7, 6,7,6,158,52,110,50,40,34,16,17,26,33,110,246,29, 114,40,254,178,119,28,24,15,7,6,18,27,48,1,107,39, 148,52,42,10,5,12,39,188,22,89,52,1,6,54,12,8, 1,2,7,28,51,0,0,3,0,76,0,240,3,196,3,60, 0,8,0,19,0,44,0,0,1,55,22,23,22,23,7,38, 39,7,55,22,23,22,23,22,23,7,38,39,1,39,54,55, 54,55,54,51,50,23,22,5,22,23,7,36,39,38,39,38, 35,34,15,1,6,2,205,30,62,22,18,10,59,13,29,118, 29,59,20,2,2,14,14,61,12,27,253,216,52,117,55,46, 34,16,18,27,36,119,1,5,42,117,39,254,183,125,39,28, 29,15,22,25,17,48,3,3,57,32,25,20,29,25,33,18, 33,58,29,22,2,2,17,35,23,34,16,254,173,38,157,59, 46,10,5,13,41,200,33,91,51,254,69,22,10,9,24,17, 49,0,0,3,0,76,0,240,3,196,3,64,0,14,0,32, 0,57,0,0,1,34,15,1,20,23,22,51,50,55,54,53, 52,39,38,39,50,31,1,22,21,20,15,1,6,35,34,39, 38,53,52,55,54,1,39,54,55,54,55,54,51,50,23,22, 5,22,23,7,36,39,38,39,38,35,34,15,1,6,2,188, 31,12,3,26,9,11,29,12,4,28,8,9,42,19,7,1, 36,20,7,6,42,20,8,36,16,253,214,52,117,55,46,34, 16,18,27,36,119,1,5,42,117,39,254,183,125,39,28,29, 15,22,25,17,48,3,40,28,17,29,12,5,28,8,10,30, 12,3,24,37,21,6,5,41,20,8,1,37,15,18,41,20, 8,254,34,38,157,59,46,10,5,13,41,200,33,91,51,254, 69,22,10,9,24,17,49,0,0,3,0,73,0,137,3,94, 3,98,0,9,0,24,0,36,0,0,1,55,22,23,22,23, 7,38,39,38,37,23,6,7,6,7,6,15,1,39,54,55, 54,55,54,55,33,53,33,53,51,21,33,21,33,17,35,2, 83,59,51,34,35,88,45,91,40,36,254,115,63,32,29,3, 2,33,86,14,44,88,29,2,2,28,210,254,212,1,44,65, 1,49,254,207,65,1,231,27,116,48,50,84,47,87,57,50, 134,16,121,52,5,4,55,79,12,48,79,46,3,3,45,251, 65,173,173,65,254,21,0,5,0,40,0,108,3,141,3,165, 0,8,0,19,0,32,0,43,0,55,0,0,1,55,22,23, 22,23,7,38,39,7,55,22,23,22,23,22,23,7,38,39, 3,55,22,23,22,31,1,7,38,39,38,39,38,37,23,6, 7,6,15,1,39,54,55,54,19,33,53,33,53,51,21,33, 21,33,17,35,2,255,30,62,22,18,10,59,13,29,118,29, 59,20,2,2,14,14,61,12,27,125,59,52,40,34,96,3, 44,99,43,39,57,1,254,142,62,32,39,34,89,20,44,97, 35,32,226,254,184,1,72,65,1,76,254,180,65,3,108,57, 32,25,20,29,25,33,18,33,58,29,22,2,2,17,35,23, 34,16,254,201,27,120,57,49,94,3,46,93,61,54,130,2, 11,16,132,64,58,81,19,49,86,56,54,1,13,65,190,190, 65,253,236,0,0,5,0,40,0,108,3,121,3,144,0,14, 0,32,0,45,0,56,0,68,0,0,1,34,15,1,20,23, 22,51,50,55,54,53,52,39,38,39,50,31,1,22,21,20, 15,1,6,35,34,39,38,53,52,55,54,3,55,22,23,22, 31,1,7,38,39,38,39,38,37,23,6,7,6,15,1,39, 54,55,54,19,33,53,33,53,51,21,33,21,33,17,35,3, 12,31,12,3,26,9,11,29,12,4,28,8,9,42,19,7, 1,36,20,7,6,42,20,8,36,16,157,59,52,40,34,96, 3,44,99,43,39,57,1,254,142,62,32,39,34,89,20,44, 97,35,32,226,254,184,1,72,65,1,76,254,180,65,3,120, 28,17,29,12,5,28,8,10,30,12,3,24,37,21,6,5, 41,20,8,1,37,15,18,41,20,8,254,87,27,120,57,49, 94,3,46,93,61,54,130,2,11,16,132,64,58,81,19,49, 86,56,54,1,13,65,190,190,65,253,236,0,0,1,0,139, 0,194,3,73,3,36,0,21,0,0,1,54,55,54,55,33, 53,33,23,6,7,6,7,22,23,7,38,39,38,39,55,22, 1,221,124,57,50,60,253,139,2,150,40,75,59,57,124,53, 76,48,116,59,46,116,38,100,1,163,82,65,57,116,65,65, 147,69,65,85,52,83,44,126,52,40,85,53,71,0,0,3, 0,219,0,80,3,50,3,54,0,19,0,29,0,39,0,0, 55,39,54,51,50,23,22,23,22,23,7,38,39,38,39,38, 35,34,7,6,19,55,22,23,22,23,7,38,39,38,3,55, 22,23,22,23,7,38,39,38,225,6,121,64,57,50,109,181, 7,10,26,174,85,16,16,46,54,49,71,20,78,6,110,64, 69,124,27,114,68,54,149,6,143,68,69,126,27,120,65,64, 174,65,13,8,17,80,3,5,59,75,18,4,2,7,6,2, 1,50,65,10,16,19,55,59,52,18,14,1,27,65,14,19, 20,59,59,57,18,17,0,1,0,135,0,155,3,135,3,36, 0,24,0,0,55,39,54,55,54,55,54,55,23,6,7,6, 7,54,55,38,39,55,22,23,7,39,4,5,39,186,4,113, 40,1,2,42,51,63,52,44,41,91,249,205,48,69,48,143, 109,53,85,254,250,254,152,8,229,1,175,90,3,4,97,205, 15,209,104,93,144,32,55,58,76,44,156,154,39,115,71,41, 65,0,0,1,0,174,0,94,2,225,3,136,0,25,0,0, 1,38,39,55,22,23,54,55,23,6,7,6,7,22,23,7, 38,39,6,7,6,7,39,54,55,54,1,225,64,154,25,149, 64,30,26,65,27,30,3,3,68,110,45,98,58,58,157,39, 67,41,128,41,96,1,244,40,65,60,63,39,105,236,7,240, 110,11,10,49,103,48,92,44,144,138,33,53,50,105,42,97, 0,1,0,90,0,75,3,120,3,91,0,38,0,0,1,35, 53,33,21,33,22,21,33,21,33,20,7,21,22,23,22,23, 22,51,50,55,23,6,35,34,39,38,39,38,53,52,55,54, 53,33,53,33,52,1,149,245,2,107,254,203,2,1,160,254, 96,2,2,6,17,56,43,66,57,117,6,123,60,70,51,82, 31,20,2,2,254,195,1,61,3,26,65,65,154,72,65,154, 60,68,22,10,26,12,10,10,64,12,12,20,48,32,52,3, 49,59,153,65,72,0,0,1,0,153,0,62,3,40,3,11, 0,20,0,0,1,7,39,55,39,55,23,37,23,6,7,6, 7,39,54,55,54,55,5,19,7,1,88,174,17,163,96,59, 100,1,124,49,36,35,34,84,47,99,42,10,9,254,187,196, 59,1,232,48,63,45,204,27,214,105,53,103,56,53,86,45, 98,87,22,24,89,254,95,27,0,1,0,100,0,82,3,85, 3,139,0,20,0,0,1,7,39,55,39,55,23,37,23,6, 7,6,7,39,54,55,54,55,5,19,7,1,66,205,17,194, 113,59,118,1,189,50,45,38,43,93,47,112,49,16,12,254, 122,228,58,2,67,57,63,54,241,27,251,123,53,125,60,67, 93,45,109,101,33,36,108,254,25,28,0,1,0,168,0,173, 3,64,2,122,0,9,0,0,37,17,33,53,33,17,51,21, 33,53,2,97,254,157,1,164,158,253,104,238,1,75,65,254, 116,65,65,0,0,1,0,116,0,214,3,115,2,224,0,9, 0,0,1,17,33,53,33,17,51,21,33,53,2,119,254,96, 1,225,187,253,1,1,23,1,136,65,254,55,65,65,0,1, 0,232,0,95,2,248,2,200,0,11,0,0,1,53,33,53, 33,17,33,53,33,53,33,53,2,183,254,67,1,254,253,240, 1,207,254,113,1,192,199,65,253,151,65,223,65,0,0,1, 0,190,0,123,3,28,3,59,0,11,0,0,1,53,33,53, 33,17,33,53,33,17,33,53,2,219,253,247,2,74,253,162, 2,29,254,45,2,9,241,65,253,64,65,1,12,65,0,2, 0,183,0,49,3,117,3,86,0,20,0,24,0,0,19,53, 33,23,6,7,6,7,6,7,6,7,39,54,55,54,55,54, 55,54,55,37,53,33,21,183,2,150,40,91,64,34,36,84, 165,16,48,24,163,69,34,27,86,94,7,9,253,243,1,195, 2,46,65,65,183,82,43,33,75,68,6,19,61,64,45,22, 25,76,183,15,18,231,65,65,0,2,1,19,0,36,2,249, 3,141,0,19,0,23,0,0,1,55,22,21,2,7,6,7, 6,7,6,7,39,54,55,54,55,54,17,52,37,51,17,35, 2,175,65,9,1,98,13,14,64,141,17,33,24,140,55,20, 15,110,254,91,65,65,3,138,3,151,89,254,205,143,18,16, 71,58,7,13,60,57,43,16,17,123,1,68,93,129,254,57, 0,2,0,81,0,157,3,117,3,35,0,13,0,29,0,0, 1,51,17,54,55,54,55,23,6,7,6,15,1,39,3,55, 23,6,7,6,15,1,39,54,55,54,55,54,53,52,1,174, 65,145,62,53,80,50,80,64,73,166,7,65,187,65,1,4, 45,32,85,20,42,78,28,8,7,42,3,35,253,192,59,46, 39,97,41,99,48,53,67,3,44,2,55,1,171,168,92,66, 75,17,49,69,43,13,13,87,219,38,0,1,0,178,0,135, 3,79,3,54,0,16,0,0,19,51,17,54,55,54,55,54, 55,23,6,7,6,7,6,7,39,178,65,183,91,97,152,10, 28,43,145,76,40,39,107,197,65,3,54,253,147,43,47,50, 132,8,25,48,128,50,27,20,54,44,51,0,0,2,0,190, 0,198,3,51,2,250,0,3,0,11,0,0,1,17,33,17, 29,1,35,17,33,17,35,53,2,242,254,13,65,2,117,65, 1,73,1,112,254,144,65,66,2,52,253,208,62,0,0,1, 0,183,0,51,3,40,2,136,0,20,0,0,19,21,35,17, 33,6,7,6,7,6,15,1,39,54,55,54,55,54,55,54, 55,248,65,2,113,10,3,16,55,66,165,125,21,185,72,43, 24,53,12,2,1,2,71,196,1,5,164,28,129,75,90,65, 46,61,66,50,30,33,72,178,19,23,0,1,0,139,0,72, 3,82,2,241,0,21,0,0,19,21,35,17,33,6,7,6, 7,6,7,6,7,39,54,55,54,55,54,55,54,55,204,65, 2,199,9,6,19,61,73,180,42,114,22,199,80,65,34,61, 15,2,2,2,176,231,1,40,180,46,141,83,99,74,17,41, 61,71,50,41,47,83,192,30,41,0,0,2,0,93,0,87, 3,145,3,160,0,3,0,23,0,0,1,35,17,51,3,35, 53,33,53,51,21,51,21,35,17,33,21,33,17,35,17,33, 53,51,2,29,189,189,254,74,1,72,65,192,192,1,51,254, 205,65,254,64,194,2,180,254,235,1,21,65,171,171,65,254, 235,65,254,249,1,7,65,0,0,2,0,111,0,167,3,122, 2,220,0,7,0,16,0,0,37,17,51,17,33,21,33,53, 19,53,33,23,6,7,39,54,55,1,190,65,1,123,252,245, 109,2,29,28,104,142,32,127,61,232,1,31,254,225,65,65, 1,179,65,65,118,72,56,70,64,0,0,1,0,208,0,71, 3,74,2,245,0,20,0,0,1,54,55,33,53,33,23,6, 7,6,7,6,15,1,39,54,55,54,55,33,53,2,217,18, 28,253,201,2,71,51,46,43,29,37,80,175,104,27,169,68, 118,48,254,16,2,14,52,114,65,65,193,90,59,46,97,87, 49,59,78,48,84,121,65,0,0,2,0,185,0,103,3,148, 3,18,0,16,0,27,0,0,55,39,54,55,54,55,54,55, 54,55,23,6,7,6,7,6,7,3,55,22,23,22,31,1, 7,38,39,38,213,5,215,94,66,45,92,85,19,32,60,76, 49,56,68,108,211,163,19,94,40,42,70,5,46,68,36,35, 103,65,17,31,21,33,67,182,42,75,26,180,76,87,50,78, 24,2,97,62,30,24,25,70,5,46,68,22,21,0,0,3, 0,95,0,0,3,219,3,180,0,8,0,19,0,44,0,0, 1,55,22,23,22,23,7,38,39,7,55,22,23,22,23,22, 23,7,38,39,5,53,51,21,33,6,7,6,7,6,15,1, 39,54,55,54,55,54,55,54,55,33,21,35,17,3,76,31, 60,24,14,14,60,13,29,118,30,58,21,1,2,17,11,60, 13,27,254,135,65,1,128,25,12,34,73,79,179,125,20,189, 79,52,32,76,33,6,6,253,123,65,3,123,57,31,26,15, 34,25,33,17,32,58,29,22,2,2,19,33,23,34,16,93, 228,228,204,57,162,90,96,67,44,61,64,52,33,39,92,223, 38,53,252,1,61,0,0,1,0,182,0,93,2,226,3,10, 0,49,0,0,1,38,35,55,50,23,55,38,53,55,21,20, 7,23,50,51,6,7,6,15,2,6,7,47,1,38,39,55, 22,51,50,55,54,55,54,55,54,55,39,35,6,7,6,15, 1,39,54,55,54,1,143,56,114,1,117,58,3,1,65,1, 254,7,6,28,10,17,20,17,2,31,50,33,40,3,13,23, 43,16,18,15,3,3,24,16,12,18,193,7,10,29,42,115, 40,47,98,34,72,2,10,1,65,1,144,21,25,1,165,13, 13,1,229,63,96,37,25,2,36,3,2,12,1,5,61,16, 12,2,3,27,101,71,145,1,95,72,99,121,42,45,101,49, 103,0,0,1,0,155,0,53,3,76,2,251,0,33,0,0, 1,35,6,7,6,7,39,54,55,54,55,54,55,23,6,7, 33,21,35,6,7,6,7,6,15,1,39,54,55,54,55,54, 55,54,2,60,229,35,100,2,2,49,105,32,6,4,24,24, 63,18,21,1,214,207,13,31,10,13,40,99,42,39,104,39, 11,9,44,14,1,2,15,60,116,3,2,43,121,60,10,9, 52,122,11,103,57,65,169,79,27,23,69,76,31,53,75,50, 15,16,75,182,4,0,255,255,0,139,0,72,3,219,3,180, 16,38,7,221,0,0,16,6,8,45,0,0,255,255,0,93, 0,87,3,219,3,180,16,38,7,221,0,0,16,6,8,46, 0,0,255,255,0,111,0,167,3,219,3,180,16,38,7,221, 0,0,16,6,8,47,0,0,255,255,0,208,0,71,3,219, 3,180,16,38,7,221,0,0,16,6,8,48,0,0,255,255, 0,87,1,46,0,211,1,171,16,6,0,121,0,0,255,255, 255,247,1,134,3,233,1,206,16,7,6,203,0,0,0,150, 0,1,0,184,0,149,2,167,3,80,0,17,0,0,37,38, 39,38,39,38,39,38,39,55,22,23,22,23,22,23,22,23, 2,104,37,36,21,26,64,161,29,58,35,157,64,68,42,72, 40,6,11,149,204,89,51,39,94,109,20,38,55,102,56,59, 63,109,205,29,65,0,255,255,0,184,0,149,3,101,3,80, 16,38,7,221,138,132,16,6,8,59,0,0,255,255,0,43, 255,233,1,251,2,197,16,6,0,19,0,0,255,255,0,34, 0,0,1,255,2,197,16,6,0,21,0,0,255,255,0,32, 255,233,1,250,2,197,16,6,0,22,0,0,255,255,0,28, 0,0,2,8,2,197,16,6,0,23,0,0,255,255,0,35, 255,233,2,1,2,197,16,6,0,24,0,0,255,255,0,43, 255,233,2,1,2,197,16,6,0,25,0,0,255,255,0,46, 0,0,2,8,2,197,16,6,0,26,0,0,255,255,0,37, 255,233,2,1,2,197,16,6,0,27,0,0,255,255,0,38, 255,233,1,253,2,197,16,6,0,28,0,0,0,1,255,238, 255,38,0,153,2,12,0,15,0,0,19,51,17,20,7,34, 35,34,39,53,22,51,50,55,54,53,70,83,128,7,8,13, 15,17,3,52,11,5,2,12,253,135,103,6,3,71,1,32, 14,23,0,1,0,116,254,227,0,216,255,196,0,12,0,0, 23,51,21,20,7,6,35,53,50,53,52,53,35,116,100,59, 17,24,55,55,60,103,88,25,8,38,78,4,4,0,255,255, 0,102,0,0,1,91,2,197,16,6,0,20,0,0,0,2, 0,18,0,0,2,18,2,220,0,21,0,43,0,0,1,21, 35,17,35,17,35,53,51,53,52,55,54,51,50,23,21,38, 35,34,29,1,33,21,35,17,35,17,35,53,51,53,52,55, 54,51,50,23,21,38,35,34,29,1,1,2,87,83,70,70, 74,22,27,23,24,19,10,58,1,103,87,83,70,70,74,22, 27,23,24,19,10,58,2,12,68,254,56,1,200,68,89,88, 24,7,5,69,1,53,82,68,254,56,1,200,68,89,88,24, 7,5,69,1,53,82,0,3,0,12,0,0,1,180,2,220, 0,21,0,25,0,29,0,0,19,21,35,17,35,17,35,53, 51,53,52,55,54,51,50,23,21,38,35,34,29,1,33,17, 35,17,55,21,35,53,252,87,83,70,70,74,22,27,23,24, 19,10,58,1,15,83,83,83,2,12,68,254,56,1,200,68, 89,88,24,7,5,69,1,53,82,253,244,2,12,205,105,105, 0,2,0,17,0,0,1,174,2,220,0,21,0,25,0,0, 1,21,35,17,35,17,35,53,51,53,52,55,54,51,50,23, 21,38,35,34,29,1,37,17,35,17,1,1,87,83,70,70, 74,22,27,23,24,19,10,58,1,4,83,2,12,68,254,56, 1,200,68,89,88,24,7,5,69,1,53,82,205,253,39,2, 217,0,0,4,0,18,0,0,2,202,2,220,0,21,0,43, 0,47,0,51,0,0,1,21,35,17,35,17,35,53,51,53, 52,55,54,51,50,23,21,38,35,34,29,1,33,21,35,17, 35,17,35,53,51,53,52,55,54,51,50,23,21,38,35,34, 29,1,33,17,35,17,55,21,35,53,1,2,87,83,70,70, 74,22,27,23,24,19,10,58,1,103,87,83,70,70,74,22, 27,23,24,19,10,58,1,15,83,83,83,2,12,68,254,56, 1,200,68,89,88,24,7,5,69,1,53,82,68,254,56,1, 200,68,89,88,24,7,5,69,1,53,82,253,244,2,12,205, 105,105,0,3,0,18,0,0,2,196,2,220,0,21,0,43, 0,47,0,0,1,21,35,17,35,17,35,53,51,53,52,55, 54,51,50,23,21,38,35,34,29,1,33,21,35,17,35,17, 35,53,51,53,52,55,54,51,50,23,21,38,35,34,29,1, 37,17,35,17,1,2,87,83,70,70,74,22,27,23,24,19, 10,58,1,108,87,83,70,70,74,22,27,23,24,19,10,58, 1,4,83,2,12,68,254,56,1,200,68,89,88,24,7,5, 69,1,53,82,68,254,56,1,200,68,89,88,24,7,5,69, 1,53,82,205,253,39,2,217,0,2,0,18,255,233,2,20, 2,220,0,23,0,41,0,0,1,21,35,17,20,23,22,51, 50,55,21,6,35,34,39,38,53,17,35,53,51,53,51,21, 1,35,17,35,53,51,53,52,55,54,51,50,23,21,38,35, 34,21,2,20,86,22,9,15,25,15,39,29,89,11,1,71, 71,83,254,237,83,70,70,74,22,27,23,24,19,10,58,2, 12,68,254,153,38,6,3,4,70,7,67,7,9,1,140,68, 144,144,253,244,1,200,68,89,88,24,7,5,69,1,53,0, 0,2,0,34,255,233,2,242,2,156,0,23,0,72,0,0, 1,21,35,17,20,23,22,51,50,55,21,6,35,34,39,38, 53,17,35,53,51,53,51,21,7,35,38,35,34,7,6,21, 20,23,22,31,1,22,23,22,21,20,7,6,35,34,39,38, 53,51,22,23,22,51,50,55,54,53,52,47,2,38,39,38, 53,52,55,54,51,50,23,22,2,242,86,22,9,15,25,15, 39,29,89,11,1,71,71,83,230,88,3,102,82,23,6,66, 14,17,80,118,23,7,90,52,74,194,14,1,88,6,18,33, 71,84,28,10,54,27,78,119,31,16,84,49,68,145,35,10, 2,12,68,254,153,38,6,3,4,70,7,67,7,9,1,140, 68,144,144,146,84,49,14,16,45,22,4,4,19,28,70,21, 27,96,44,26,162,8,9,47,20,35,47,16,19,46,19,8, 19,29,51,28,43,93,42,25,101,27,0,2,0,58,0,149, 0,145,2,88,0,3,0,7,0,0,19,51,17,7,23,51, 21,35,58,87,87,8,71,71,2,88,254,233,35,66,71,0, 0,1,0,0,2,148,1,50,3,45,0,24,0,0,19,35, 48,23,22,23,22,23,22,51,50,55,54,55,54,55,35,48, 7,6,7,6,34,39,38,71,71,10,6,8,17,30,39,43, 43,39,30,17,18,6,71,8,7,8,23,72,23,18,3,45, 48,21,13,30,17,24,24,17,30,29,53,34,17,8,23,23, 18,0,0,3,0,58,0,149,1,89,2,88,0,3,0,7, 0,11,0,0,1,51,17,7,3,51,17,7,23,51,21,35, 1,2,87,87,200,87,87,50,188,188,2,88,254,233,35,1, 58,254,233,35,66,71,0,1,0,37,0,0,2,19,2,88, 0,24,0,0,37,54,55,54,55,54,55,54,53,17,51,17, 20,7,6,7,6,35,34,35,7,53,51,3,51,1,34,24, 40,40,16,6,9,19,87,31,34,68,63,64,3,3,228,165, 139,90,78,2,20,21,20,7,13,28,37,1,118,254,138,57, 46,56,33,33,1,76,2,12,0,1,0,58,0,0,3,64, 2,88,0,37,0,0,1,6,7,6,7,6,7,21,35,53, 55,54,55,54,55,54,55,39,51,1,54,55,54,55,54,55, 53,51,21,7,6,7,6,7,6,7,23,35,1,53,60,29, 48,10,8,1,87,3,11,68,32,65,3,2,192,122,1,144, 65,25,47,10,9,1,87,3,11,60,3,5,25,78,193,125, 1,112,32,39,62,32,25,37,141,141,46,73,80,39,41,2, 1,177,254,143,39,33,61,25,25,36,150,150,43,64,73,5, 5,31,52,177,0,1,0,38,0,0,3,25,2,88,0,7, 0,0,1,17,35,17,33,53,33,21,2,198,87,253,183,2, 243,2,12,253,244,2,12,76,76,0,0,2,0,63,0,0, 3,52,2,88,0,26,0,30,0,0,1,17,35,17,38,39, 38,39,38,47,1,38,39,34,39,33,53,33,22,23,22,23, 22,23,22,23,22,1,17,51,17,3,52,87,11,14,5,6, 10,12,6,38,57,2,10,254,13,1,251,83,50,6,6,35, 22,33,13,1,253,12,87,1,122,254,134,1,116,55,24,8, 8,14,7,4,21,9,2,76,11,25,4,3,19,31,50,66, 6,254,127,1,119,254,137,0,0,1,0,57,0,0,2,254, 2,88,0,44,0,0,41,1,53,33,54,55,54,55,54,55, 54,55,54,63,1,53,38,39,38,39,38,39,38,39,33,53, 33,22,23,22,23,22,23,22,23,22,23,21,6,7,6,7, 6,7,6,1,221,254,92,1,158,78,30,11,12,21,11,1, 2,26,12,4,13,16,6,7,34,106,8,18,254,98,1,164, 95,55,8,9,40,24,41,13,2,2,13,34,5,6,53,172, 3,76,11,12,4,6,10,12,2,2,32,46,16,142,54,23, 8,9,39,16,1,3,76,11,24,3,4,17,32,52,61,8, 10,156,69,47,7,8,69,21,1,0,0,1,0,37,0,0, 3,27,2,237,0,28,0,0,37,7,35,52,55,54,55,54, 55,54,55,54,55,52,55,53,33,53,51,21,33,21,20,7, 6,7,6,7,6,1,247,1,87,23,13,22,37,113,21,7, 46,10,1,253,97,87,2,159,56,25,78,58,25,40,86,86, 114,55,29,30,50,64,12,4,29,57,4,4,72,225,149,153, 69,51,23,46,34,28,45,0,0,2,0,63,0,0,3,54, 2,88,0,10,0,20,0,0,41,1,17,33,50,23,22,23, 22,31,1,3,17,38,39,38,39,38,39,33,17,3,53,253, 10,1,211,85,84,39,26,51,5,1,87,1,41,21,13,57, 71,254,132,2,88,42,19,30,63,53,18,254,213,1,43,51, 39,18,8,32,1,254,64,0,0,1,0,37,0,0,2,233, 2,88,0,26,0,0,1,17,35,17,38,39,38,39,38,47, 1,38,39,34,39,33,53,33,22,23,22,23,22,23,22,23, 22,2,233,87,11,14,5,6,10,12,6,38,57,2,10,254, 62,1,201,84,50,6,6,35,22,33,13,1,1,122,254,134, 1,116,55,24,8,8,14,7,4,21,9,2,76,11,26,3, 3,19,31,50,66,6,0,1,0,35,0,0,3,117,2,88, 0,45,0,0,1,17,20,7,6,7,6,15,1,6,43,1, 53,51,50,55,54,55,54,55,54,61,1,17,35,53,33,22, 23,22,31,1,17,35,17,38,39,38,39,38,39,38,39,38, 47,1,1,16,9,6,11,13,37,8,65,84,4,4,50,41, 6,6,21,5,17,60,1,253,155,48,33,12,3,87,11,15, 4,6,11,12,2,3,38,59,10,2,12,254,212,63,28,18, 19,24,24,5,43,76,25,3,4,14,8,24,44,29,1,41, 76,21,72,50,64,15,254,134,1,116,56,25,7,8,15,7, 1,2,20,9,2,0,0,1,0,50,0,197,2,22,1,218, 0,7,0,0,1,21,33,53,51,53,51,21,2,22,254,28, 207,70,1,11,70,70,207,207,0,2,0,59,0,0,2,209, 2,199,0,60,0,64,0,0,55,22,23,22,23,22,23,59, 1,55,54,55,54,55,54,55,52,53,17,51,17,7,6,7, 6,7,6,7,35,38,39,38,39,38,39,38,53,52,53,17, 51,17,51,54,55,54,55,54,55,54,61,1,51,21,7,6, 7,6,35,34,35,1,51,21,35,151,13,61,17,16,36,47, 8,82,34,38,18,54,33,23,2,87,3,17,91,22,21,64, 71,82,71,63,67,45,4,4,35,87,99,39,17,6,10,24, 3,1,87,3,10,40,50,79,2,2,1,136,71,71,224,53, 50,13,9,20,3,4,9,10,27,52,38,40,3,3,1,82, 254,174,39,92,71,16,11,31,2,2,31,35,63,5,6,57, 57,3,3,1,82,254,212,2,12,4,8,24,28,6,9,207, 207,36,49,34,50,1,231,71,0,2,0,59,0,0,2,209, 2,199,0,60,0,64,0,0,55,22,23,22,23,22,23,59, 1,55,54,55,54,55,54,55,52,53,17,51,17,7,6,7, 6,7,6,7,35,38,39,38,39,38,39,38,53,52,53,17, 51,17,51,54,55,54,55,54,55,54,61,1,51,21,7,6, 7,6,35,34,35,3,51,21,35,151,13,61,17,16,36,47, 8,82,34,38,18,54,33,23,2,87,3,17,91,22,21,64, 71,82,71,63,67,45,4,4,35,87,99,39,17,6,10,24, 3,1,87,3,10,40,50,79,2,2,177,71,71,224,53,50, 13,9,20,3,4,9,10,27,52,38,40,3,3,1,82,254, 174,39,92,71,16,11,31,2,2,31,35,63,5,6,57,57, 3,3,1,82,254,212,2,12,4,8,24,28,6,9,207,207, 36,49,34,50,1,231,71,0,0,3,0,59,0,0,2,209, 2,199,0,60,0,64,0,68,0,0,55,22,23,22,23,22, 23,59,1,55,54,55,54,55,54,55,52,53,17,51,17,7, 6,7,6,7,6,7,35,38,39,38,39,38,39,38,53,52, 53,17,51,17,51,54,55,54,55,54,55,54,61,1,51,21, 7,6,7,6,35,34,35,55,51,21,35,19,51,21,35,151, 13,61,17,16,36,47,8,82,34,38,18,54,33,23,2,87, 3,17,91,22,21,64,71,82,71,63,67,45,4,4,35,87, 99,39,17,6,10,24,3,1,87,3,10,40,50,79,2,2, 195,71,71,197,71,71,224,53,50,13,9,20,3,4,9,10, 27,52,38,40,3,3,1,82,254,174,39,92,71,16,11,31, 2,2,31,35,63,5,6,57,57,3,3,1,82,254,212,2, 12,4,8,24,28,6,9,207,207,36,49,34,50,19,71,2, 27,71,0,3,0,59,0,0,2,209,2,199,0,60,0,64, 0,68,0,0,55,22,23,22,23,22,23,59,1,55,54,55, 54,55,54,55,52,53,17,51,17,7,6,7,6,7,6,7, 35,38,39,38,39,38,39,38,53,52,53,17,51,17,51,54, 55,54,55,54,55,54,61,1,51,21,7,6,7,6,35,34, 35,55,51,21,35,1,51,21,35,151,13,61,17,16,36,47, 8,82,34,38,18,54,33,23,2,87,3,17,91,22,21,64, 71,82,71,63,67,45,4,4,35,87,99,39,17,6,10,24, 3,1,87,3,10,40,50,79,2,2,195,71,71,254,140,71, 71,224,53,50,13,9,20,3,4,9,10,27,52,38,40,3, 3,1,82,254,174,39,92,71,16,11,31,2,2,31,35,63, 5,6,57,57,3,3,1,82,254,212,2,12,4,8,24,28, 6,9,207,207,36,49,34,50,19,71,2,27,71,0,0,2, 0,58,255,125,2,70,2,88,0,37,0,41,0,0,19,6, 7,6,7,6,7,21,35,53,55,54,55,54,55,54,55,39, 51,19,54,55,54,55,54,55,53,51,21,7,6,7,6,7, 6,7,23,35,7,51,21,35,252,25,7,48,10,8,1,87, 3,10,60,4,5,20,38,148,102,228,25,7,47,10,9,1, 87,3,11,58,5,5,20,38,148,102,254,188,188,1,69,17, 11,62,32,25,37,141,141,45,65,78,5,6,25,25,210,254, 187,17,11,61,25,25,36,150,150,43,62,73,5,7,25,25, 210,60,71,0,0,2,0,58,255,8,2,70,2,88,0,37, 0,45,0,0,19,6,7,6,7,6,7,21,35,53,55,54, 55,54,55,54,55,39,51,19,54,55,54,55,54,55,53,51, 21,7,6,7,6,7,6,7,23,35,7,21,35,53,35,53, 51,21,252,25,7,48,10,8,1,87,3,10,60,4,5,20, 38,148,102,228,25,7,47,10,9,1,87,3,11,58,5,5, 20,38,148,102,137,70,59,188,1,69,17,11,62,32,25,37, 141,141,45,65,78,5,6,25,25,210,254,187,17,11,61,25, 25,36,150,150,43,62,73,5,7,25,25,210,131,117,117,71, 71,0,0,2,0,58,0,0,2,70,2,88,0,37,0,41, 0,0,19,6,7,6,7,6,7,21,35,53,55,54,55,54, 55,54,55,39,51,19,54,55,54,55,54,55,53,51,21,7, 6,7,6,7,6,7,23,35,37,51,21,35,252,25,7,48, 10,8,1,87,3,10,60,4,5,20,38,148,102,228,25,7, 47,10,9,1,87,3,11,58,5,5,20,38,148,102,254,248, 71,71,1,69,17,11,62,32,25,37,141,141,45,65,78,5, 6,25,25,210,254,187,17,11,61,25,25,36,150,150,43,62, 73,5,7,25,25,210,195,71,0,2,0,58,0,0,2,54, 2,88,0,27,0,31,0,0,37,17,38,39,38,39,38,39, 38,39,35,53,51,22,23,22,23,22,23,22,23,22,23,17, 51,21,33,53,19,51,21,35,1,149,13,16,6,7,34,106, 8,18,139,145,94,49,12,12,40,24,41,13,2,2,74,254, 4,160,71,71,76,1,39,54,23,8,9,39,16,1,3,76, 11,20,5,6,17,32,52,61,8,10,254,210,76,76,1,9, 71,0,0,2,0,30,0,0,1,177,2,88,0,26,0,30, 0,0,37,7,35,55,51,39,38,39,38,39,38,39,38,39, 38,39,38,35,53,50,23,22,23,22,23,19,35,3,51,21, 35,1,66,175,117,207,81,22,6,19,6,11,13,16,1,4, 62,32,15,19,82,87,70,34,14,4,50,88,191,71,71,172, 172,203,167,46,27,9,13,15,8,1,2,28,4,1,76,42, 31,82,32,34,254,133,1,85,71,0,0,2,0,38,0,0, 2,31,2,88,0,7,0,11,0,0,1,17,35,17,33,53, 33,21,5,51,21,35,1,204,87,254,177,1,249,254,199,71, 71,2,12,253,244,2,12,76,76,183,71,0,0,3,0,63, 0,0,2,58,2,88,0,26,0,30,0,34,0,0,1,17, 35,17,38,39,38,39,38,47,1,38,39,34,39,35,53,33, 22,23,22,23,22,23,22,23,22,1,17,51,17,19,51,21, 35,2,58,87,11,14,5,6,10,12,6,38,57,2,10,249, 1,1,83,50,6,6,35,22,33,13,1,254,6,87,128,71, 71,1,122,254,134,1,116,55,24,8,8,14,7,4,21,9, 2,76,11,25,4,3,19,31,50,66,6,254,127,1,119,254, 137,1,85,71,0,2,0,18,0,0,0,199,2,88,0,3, 0,7,0,0,51,17,51,17,3,51,21,35,112,87,181,71, 71,2,88,253,168,1,85,71,0,2,0,14,0,0,1,40, 2,88,0,7,0,11,0,0,19,17,35,17,35,53,33,21, 5,51,21,35,213,87,87,1,1,254,230,71,71,2,12,253, 244,2,12,76,76,183,71,0,0,2,0,61,0,0,2,58, 2,88,0,68,0,72,0,0,1,34,7,53,54,51,50,23, 22,23,22,23,22,23,21,6,7,6,7,6,7,6,35,34, 39,38,39,38,39,38,39,17,51,17,22,23,22,23,22,23, 20,23,22,23,22,51,54,55,54,55,54,55,52,55,54,55, 52,55,53,38,39,38,39,38,47,1,38,39,38,7,51,21, 35,1,58,32,45,42,38,72,76,36,20,34,12,2,1,12, 27,5,5,21,35,77,72,73,77,33,23,36,11,1,1,87, 11,17,4,4,11,11,6,50,28,11,15,43,35,8,17,16, 9,3,24,10,2,11,17,4,4,11,11,6,51,23,13,50, 71,71,2,12,20,82,14,43,20,30,49,65,7,8,156,71, 44,7,7,33,17,43,43,17,33,52,64,6,7,1,122,254, 140,56,28,5,6,15,6,1,3,27,3,2,1,17,5,9, 10,10,1,4,34,49,4,8,144,56,28,5,6,15,6,4, 27,3,2,183,71,0,0,2,0,12,1,30,0,215,2,88, 0,3,0,7,0,0,19,51,17,7,39,51,21,35,128,87, 87,116,71,71,2,88,254,233,35,119,71,0,0,2,0,38, 255,56,1,218,2,88,0,26,0,30,0,0,1,17,35,17, 38,39,38,39,38,47,1,38,39,34,39,35,53,51,22,23, 22,23,22,23,22,23,22,7,51,21,35,1,218,87,11,14, 5,6,10,12,6,38,57,2,10,178,186,83,50,6,6,35, 22,33,13,1,251,71,71,1,122,253,190,2,60,55,24,8, 8,14,7,4,21,9,2,76,11,25,4,3,19,31,50,66, 6,44,71,0,0,2,0,57,0,0,2,4,2,88,0,44, 0,48,0,0,51,35,53,51,54,55,54,55,54,55,54,55, 54,63,1,53,38,39,38,39,38,39,38,39,35,53,51,22, 23,22,23,22,23,22,23,22,23,21,6,7,6,7,6,7, 6,3,51,21,35,227,170,164,78,30,11,12,21,11,1,2, 26,12,4,13,16,6,7,34,106,8,18,164,170,95,55,8, 9,40,24,41,13,2,2,13,34,5,6,53,172,3,8,71, 71,76,11,12,4,6,10,12,2,2,32,46,16,142,54,23, 8,9,39,16,1,3,76,11,24,3,4,17,32,52,61,8, 10,156,69,47,7,8,69,21,1,1,85,71,0,2,0,37, 0,0,2,33,2,237,0,3,0,31,0,0,19,51,21,35, 23,6,29,1,35,52,55,54,55,54,55,54,55,54,55,53, 33,53,51,21,33,21,20,15,1,6,7,6,226,71,71,178, 27,87,5,7,24,23,46,28,8,26,1,254,91,87,1,165, 31,5,22,46,29,1,155,71,132,42,97,69,120,30,49,43, 36,37,22,17,41,86,43,225,149,153,60,57,10,36,36,23, 0,2,0,48,0,0,2,58,2,88,0,24,0,28,0,0, 19,3,35,19,35,53,51,50,23,22,23,22,21,17,33,53, 51,17,52,39,38,47,1,38,35,23,51,21,35,214,58,88, 58,78,231,77,53,85,45,31,254,214,211,18,28,31,35,36, 56,17,71,71,2,12,253,244,2,12,76,23,33,65,45,59, 254,137,76,1,43,38,26,37,17,16,15,183,71,0,0,2, 0,51,0,0,1,70,2,88,0,20,0,24,0,0,41,1, 53,51,17,38,39,38,39,38,47,1,38,39,38,35,53,50, 23,22,23,7,51,21,35,1,70,254,237,188,11,14,5,6, 10,12,6,52,29,10,13,73,77,85,20,236,71,71,76,1, 40,55,24,8,8,14,7,4,28,3,1,76,43,46,133,37, 71,0,0,3,0,61,0,0,2,57,2,88,0,28,0,66, 0,70,0,0,33,34,39,38,39,38,39,52,39,17,33,50, 23,22,23,22,23,22,23,22,23,21,6,7,6,7,6,7, 6,39,54,55,54,55,54,55,52,55,54,55,52,55,53,38, 39,38,39,38,47,1,38,39,34,39,35,17,22,23,22,23, 22,23,20,23,22,23,22,3,51,21,35,1,59,73,77,33, 23,40,7,1,1,1,64,66,7,9,36,20,34,12,2,1, 12,27,5,5,21,35,77,72,43,35,8,17,16,9,3,24, 10,2,11,17,4,4,11,11,6,38,57,2,10,163,11,15, 4,5,11,11,6,50,28,11,24,71,71,43,17,33,58,57, 7,7,1,122,34,4,5,20,30,49,65,7,8,156,71,44, 7,7,33,17,43,76,1,17,5,9,10,10,1,4,34,49, 4,8,144,56,28,5,6,15,6,4,21,9,2,254,216,56, 25,7,7,15,6,1,3,27,3,2,1,9,71,0,0,2, 0,57,255,56,2,11,2,88,0,41,0,45,0,0,19,51, 50,23,22,23,22,23,22,23,22,23,17,35,17,38,39,38, 39,38,47,1,38,39,34,39,35,21,22,23,22,23,51,21, 47,1,38,39,38,39,38,39,37,51,21,35,57,215,64,63, 8,11,35,22,33,13,1,1,87,11,14,5,6,10,12,6, 38,57,2,10,121,8,20,14,66,34,40,71,36,31,43,6, 1,1,0,255,71,71,2,88,33,4,6,19,31,50,66,6, 7,253,190,2,60,55,24,8,8,14,7,4,21,9,2,127, 52,12,8,6,76,1,7,7,23,36,55,7,11,20,71,0, 0,2,0,63,0,0,2,21,2,88,0,57,0,61,0,0, 51,35,53,51,50,55,54,55,54,55,54,55,53,38,39,38, 39,38,39,34,43,1,21,22,23,22,23,51,21,47,1,38, 39,38,39,52,39,53,51,50,23,22,23,22,23,22,23,22, 31,1,21,20,7,6,7,6,7,6,19,51,21,35,244,181, 175,56,55,7,13,44,23,9,1,2,44,14,17,59,53,9, 10,88,8,20,14,66,34,40,71,37,30,43,7,1,181,76, 66,11,14,30,29,3,2,47,10,1,36,11,11,29,35,97, 12,71,71,76,24,3,6,19,60,22,19,142,57,42,13,8, 30,3,127,52,12,8,6,76,1,7,7,23,36,58,6,9, 210,30,5,7,15,29,3,2,53,63,15,156,38,61,19,13, 33,16,42,1,155,71,0,2,0,51,0,0,2,21,2,88, 0,28,0,32,0,0,1,54,55,54,55,54,55,54,55,54, 55,48,55,53,51,21,6,15,1,6,7,6,7,19,33,53, 33,1,51,3,51,21,35,1,60,46,10,2,2,11,11,2, 2,23,11,1,87,10,33,6,24,34,30,25,171,254,38,1, 70,254,178,100,19,71,71,1,85,5,4,1,1,6,13,4, 2,29,42,5,147,154,55,48,8,34,16,13,3,254,243,76, 2,12,254,189,71,0,0,3,0,62,255,56,2,38,2,88, 0,18,0,22,0,26,0,0,37,35,53,51,54,55,54,63, 1,17,33,53,33,17,6,7,6,7,6,1,17,35,17,23, 51,21,35,1,44,62,55,104,31,23,9,3,254,111,1,232, 12,24,5,7,48,254,207,87,208,71,71,33,76,14,42,33, 50,13,1,7,76,254,167,71,40,8,10,73,1,117,253,142, 2,114,85,71,0,2,0,37,0,0,1,239,2,88,0,26, 0,30,0,0,1,17,35,17,38,39,38,39,38,47,1,38, 39,34,39,35,53,51,22,23,22,23,22,23,22,23,22,5, 51,21,35,1,239,87,11,14,5,6,10,12,6,38,57,2, 10,200,207,84,50,6,6,35,22,33,13,1,254,246,71,71, 1,122,254,134,1,116,55,24,8,8,14,7,4,21,9,2, 76,11,26,3,3,19,31,50,66,6,44,71,0,2,0,59, 0,0,2,209,2,88,0,60,0,64,0,0,55,22,23,22, 23,22,23,59,1,55,54,55,54,55,54,55,52,53,17,51, 17,7,6,7,6,7,6,7,35,38,39,38,39,38,39,38, 53,52,53,17,51,17,51,54,55,54,55,54,55,54,61,1, 51,21,7,6,7,6,35,34,35,55,51,21,35,151,13,61, 17,16,36,47,8,82,34,38,18,54,33,23,2,87,3,17, 91,22,21,64,71,82,71,63,67,45,4,4,35,87,99,39, 17,6,10,24,3,1,87,3,10,40,50,79,2,2,195,71, 71,224,53,50,13,9,20,3,4,9,10,27,52,38,40,3, 3,1,82,254,174,39,92,71,16,11,31,2,2,31,35,63, 5,6,57,57,3,3,1,82,254,212,2,12,4,8,24,28, 6,9,207,207,36,49,34,50,19,71,0,2,0,35,0,0, 2,123,2,88,0,45,0,49,0,0,1,17,20,7,6,7, 6,15,1,6,43,1,53,51,50,55,54,55,54,55,54,61, 1,17,35,53,33,22,23,22,31,1,17,35,17,38,39,38, 39,38,39,38,39,38,47,1,7,51,21,35,1,16,9,6, 11,13,37,8,65,84,4,4,50,41,6,6,21,5,17,60, 1,3,155,48,33,12,3,87,11,15,4,6,11,12,2,3, 38,59,10,3,71,71,2,12,254,212,63,28,18,19,24,24, 5,43,76,25,3,4,14,8,24,44,29,1,41,76,21,72, 50,64,15,254,134,1,116,56,25,7,8,15,7,1,2,20, 9,2,183,71,0,2,0,62,0,0,0,149,2,219,0,3, 0,7,0,0,51,17,51,17,3,51,21,35,62,87,79,71, 71,2,88,253,168,2,219,71,0,2,0,58,0,0,2,54, 2,219,0,27,0,31,0,0,37,17,38,39,38,39,38,39, 38,39,35,53,51,22,23,22,23,22,23,22,23,22,23,17, 51,21,33,53,19,51,21,35,1,149,13,16,6,7,34,106, 8,18,139,145,94,49,12,12,40,24,41,13,2,2,74,254, 4,110,200,200,76,1,39,54,23,8,9,39,16,1,3,76, 11,20,5,6,17,32,52,61,8,10,254,210,76,76,2,143, 71,0,0,2,0,57,0,0,2,4,2,219,0,44,0,48, 0,0,51,35,53,51,54,55,54,55,54,55,54,55,54,63, 1,53,38,39,38,39,38,39,38,39,35,53,51,22,23,22, 23,22,23,22,23,22,23,21,6,7,6,7,6,7,6,3, 51,21,35,227,170,164,78,30,11,12,21,11,1,2,26,12, 4,13,16,6,7,34,106,8,18,164,170,95,55,8,9,40, 24,41,13,2,2,13,34,5,6,53,172,3,86,200,200,76, 11,12,4,6,10,12,2,2,32,46,16,142,54,23,8,9, 39,16,1,3,76,11,24,3,4,17,32,52,61,8,10,156, 69,47,7,8,69,21,1,2,219,71,0,2,0,63,0,0, 2,21,2,219,0,57,0,61,0,0,51,35,53,51,50,55, 54,55,54,55,54,55,53,38,39,38,39,38,39,34,43,1, 21,22,23,22,23,51,21,47,1,38,39,38,39,52,39,53, 51,50,23,22,23,22,23,22,23,22,31,1,21,20,7,6, 7,6,7,6,3,51,21,35,244,181,175,56,55,7,13,44, 23,9,1,2,44,14,17,59,53,9,10,88,8,20,14,66, 34,40,71,37,30,43,7,1,181,76,66,11,14,30,29,3, 2,47,10,1,36,11,11,29,35,97,136,200,200,76,24,3, 6,19,60,22,19,142,57,42,13,8,30,3,127,52,12,8, 6,76,1,7,7,23,36,58,6,9,210,30,5,7,15,29, 3,2,53,63,15,156,38,61,19,13,33,16,42,2,219,71, 0,1,0,72,0,0,2,70,2,237,0,22,0,0,19,53, 51,21,19,54,55,54,55,54,55,53,51,21,7,6,7,6, 7,6,7,23,35,72,87,229,25,7,47,10,9,1,87,3, 11,58,5,5,20,38,148,102,2,68,169,149,254,187,17,11, 61,25,25,36,150,150,43,62,73,5,7,25,25,210,0,3, 0,35,255,242,2,242,2,193,0,33,0,37,0,41,0,0, 37,53,52,55,54,55,54,55,54,53,52,39,38,39,38,35, 6,7,51,52,55,54,51,50,23,22,21,20,7,6,7,6, 29,1,23,35,21,51,7,9,2,1,160,21,10,19,55,6, 1,67,16,20,14,16,132,5,53,11,19,51,57,18,5,47, 37,11,17,56,56,56,21,254,152,1,104,1,103,233,30,27, 22,10,18,51,42,9,10,78,29,7,4,2,10,136,40,21, 36,43,13,15,41,41,34,14,22,32,35,59,65,123,1,104, 1,103,254,153,0,1,0,0,0,1,69,30,40,17,139,253, 95,15,60,245,2,19,3,232,0,0,0,0,187,169,178,179, 0,0,0,0,187,169,178,179,252,227,254,53,6,96,4,117, 0,0,0,8,0,0,0,1,0,0,0,0,0,1,0,0, 4,117,254,53,0,90,6,170,252,227,253,58,6,96,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,127, 1,176,0,33,0,0,0,0,1,77,0,0,1,22,0,0, 1,22,0,124,1,99,0,52,2,44,0,14,2,44,0,32, 3,121,0,29,2,155,0,52,0,191,0,48,1,77,0,73, 1,77,0,38,1,133,0,40,2,72,0,50,1,22,0,87, 1,77,0,46,1,22,0,87,1,22,255,248,2,44,0,43, 2,44,0,102,2,44,0,34,2,44,0,32,2,44,0,28, 2,44,0,35,2,44,0,43,2,44,0,46,2,44,0,37, 2,44,0,38,1,22,0,110,1,22,0,110,2,72,0,45, 2,72,0,50,2,72,0,50,2,44,0,77,3,247,0,34, 2,155,0,17,2,155,0,79,2,210,0,48,2,210,0,89, 2,155,0,90,2,99,0,90,3,10,0,44,2,210,0,83, 1,22,0,100,1,244,0,17,2,155,0,79,2,44,0,80, 3,65,0,75,2,210,0,76,3,10,0,38,2,155,0,91, 3,10,0,38,2,210,0,93,2,155,0,48,2,99,0,21, 2,210,0,85,2,155,0,30,3,176,0,22,2,155,0,22, 2,155,0,13,2,99,0,28,1,22,0,64,1,22,255,248, 1,22,0,23,1,213,0,44,2,44,255,234,1,77,0,22, 2,44,0,42,2,44,0,54,1,244,0,31,2,44,0,26, 2,44,0,40,1,22,0,18,2,44,0,29,2,44,0,70, 0,222,0,66,0,222,255,238,1,244,0,58,0,222,0,68, 3,65,0,70,2,44,0,70,2,44,0,36,2,44,0,54, 2,44,0,26,1,77,0,69,1,244,0,34,1,22,0,14, 2,44,0,65,1,244,0,10,2,210,0,6,1,244,0,17, 1,244,0,20,1,244,0,31,1,78,0,43,1,4,0,100, 1,78,0,29,2,72,0,75,1,22,0,0,1,77,0,121, 2,44,0,52,2,44,0,26,2,44,0,67,2,44,0,11, 1,4,0,100,2,44,0,43,1,77,0,30,2,225,255,243, 1,114,0,37,2,44,0,98,2,72,0,40,1,77,0,46, 2,225,255,243,1,77,0,28,2,94,0,151,2,72,0,50, 1,95,0,19,1,95,0,16,1,77,0,92,2,44,0,65, 2,25,0,48,1,22,0,87,1,77,0,39,1,95,0,61, 1,109,0,40,2,44,0,98,3,101,0,61,3,101,0,61, 3,101,0,16,2,99,0,95,2,155,0,17,2,155,0,17, 2,155,0,17,2,155,0,17,2,155,0,17,2,155,0,17, 3,232,0,11,2,210,0,48,2,155,0,90,2,155,0,90, 2,155,0,90,2,155,0,90,1,22,0,1,1,22,0,71, 1,22,255,255,1,22,0,9,2,210,0,20,2,210,0,76, 3,10,0,38,3,10,0,38,3,10,0,38,3,10,0,38, 3,10,0,38,2,72,0,95,3,10,0,30,2,210,0,85, 2,210,0,85,2,210,0,85,2,210,0,85,2,154,0,13, 2,154,0,91,2,99,0,67,2,44,0,42,2,44,0,42, 2,44,0,42,2,44,0,42,2,44,0,42,2,44,0,42, 3,121,0,34,1,244,0,31,2,44,0,40,2,44,0,40, 2,44,0,40,2,44,0,40,1,22,255,251,1,22,0,65, 1,22,255,249,1,22,0,3,2,44,0,36,2,44,0,70, 2,44,0,36,2,44,0,36,2,44,0,36,2,44,0,36, 2,44,0,36,2,72,0,50,2,99,0,18,2,44,0,65, 2,44,0,65,2,44,0,65,2,44,0,65,1,244,0,20, 2,43,0,54,1,244,0,20,2,155,0,17,2,44,0,42, 2,155,0,17,2,44,0,42,2,155,0,17,2,44,0,43, 2,210,0,48,1,244,0,31,2,210,0,48,1,244,0,31, 2,210,0,48,1,244,0,31,2,210,0,48,1,244,0,31, 2,210,0,89,2,123,0,26,2,210,0,20,2,44,0,26, 2,155,0,90,2,44,0,40,2,155,0,90,2,44,0,40, 2,155,0,90,2,44,0,40,2,155,0,90,2,44,0,40, 2,155,0,90,2,44,0,40,3,10,0,44,2,44,0,29, 3,10,0,44,2,44,0,29,3,10,0,44,2,44,0,29, 3,10,0,44,2,44,0,29,2,210,0,83,2,44,255,224, 2,210,0,39,2,44,0,7,1,22,255,246,1,22,255,235, 1,22,0,20,0,222,255,240,1,22,255,253,1,22,255,241, 1,22,0,66,0,222,0,25,1,22,0,96,1,22,0,94, 2,188,0,100,1,118,0,66,1,244,0,17,0,222,255,224, 2,155,0,79,1,244,0,58,1,244,0,58,2,44,0,70, 0,222,0,63,2,44,0,80,0,222,0,63,2,44,0,80, 1,36,0,68,2,44,0,80,1,244,0,68,2,44,0,0, 0,222,0,0,2,210,0,76,2,44,0,70,2,210,0,76, 2,44,0,70,2,210,0,76,2,44,0,70,2,44,0,70, 2,210,0,76,2,44,0,70,3,10,0,38,2,44,0,36, 3,10,0,38,2,44,0,36,3,10,0,38,2,44,0,36, 3,232,0,43,3,176,0,40,2,210,0,93,1,77,0,69, 2,210,0,93,1,77,0,65,2,210,0,93,1,77,0,48, 2,155,0,48,1,244,0,34,2,155,0,48,1,244,0,34, 2,155,0,47,1,244,0,34,2,155,0,48,1,244,0,34, 2,99,0,21,1,22,0,14,2,99,0,21,1,52,0,14, 2,99,0,21,1,22,0,14,2,210,0,85,2,44,0,65, 2,210,0,85,2,44,0,65,2,210,0,85,2,44,0,65, 2,210,0,85,2,44,0,65,2,210,0,85,2,44,0,65, 2,210,0,85,2,44,0,65,3,176,0,22,2,210,0,6, 2,155,0,13,1,244,0,20,2,155,0,13,2,99,0,28, 1,244,0,31,2,99,0,28,1,244,0,31,2,99,0,28, 1,244,0,31,1,22,0,18,2,44,0,26,2,155,0,79, 2,44,0,54,2,155,0,0,2,44,255,247,2,210,0,48, 2,210,0,48,1,244,0,31,2,210,0,20,2,155,0,78, 2,44,0,54,2,155,0,90,3,10,0,38,2,155,0,48, 2,99,0,2,2,44,0,11,3,10,0,44,1,244,0,58, 2,210,255,244,2,44,0,70,3,10,0,38,2,44,0,54, 2,155,0,48,1,244,0,34,2,99,0,28,1,22,0,14, 1,22,0,14,2,99,0,21,5,31,0,89,4,184,0,89, 4,32,0,26,4,32,0,80,3,10,0,80,1,188,0,68, 4,134,0,76,3,176,0,76,3,10,0,70,2,155,0,17, 2,44,0,42,1,22,0,3,1,22,255,249,3,10,0,38, 2,44,0,36,2,210,0,85,2,44,0,65,2,210,0,85, 2,44,0,65,2,210,0,85,2,44,0,65,2,210,0,85, 2,44,0,65,2,210,0,85,2,44,0,65,2,44,0,40, 2,155,0,17,2,44,0,42,2,155,0,17,2,44,0,42, 3,232,0,11,3,121,0,34,3,10,0,44,2,44,0,29, 2,155,0,79,1,244,255,212,3,10,0,38,2,44,0,36, 3,10,0,38,2,44,0,36,0,222,255,223,5,53,0,89, 4,198,0,89,4,32,0,26,3,10,0,44,2,44,0,29, 2,210,0,76,2,44,0,70,2,155,0,17,2,44,0,42, 3,232,0,11,3,121,0,34,3,10,0,30,2,99,0,18, 2,155,254,250,2,44,254,188,2,155,255,110,2,44,255,48, 2,155,255,0,2,44,254,193,2,155,255,115,2,44,255,52, 1,22,254,60,1,22,254,49,1,22,254,176,1,22,254,164, 3,10,255,46,2,44,254,185,3,10,255,162,2,44,255,44, 2,210,254,174,1,77,254,108,2,210,255,34,1,77,254,224, 2,210,255,22,2,44,254,186,2,210,255,138,2,44,255,46, 2,155,0,48,1,244,0,34,2,99,0,21,1,22,0,14, 2,210,0,83,2,44,0,70,2,155,0,17,2,44,0,42, 2,155,0,90,2,44,0,40,3,10,0,38,2,44,0,36, 3,10,0,38,2,44,0,36,3,10,0,38,2,44,0,36, 3,10,0,38,2,44,0,36,2,155,0,13,1,244,0,20, 2,44,0,42,2,44,0,26,2,44,0,68,2,44,0,54, 1,244,0,31,2,44,0,26,2,44,0,26,2,44,0,40, 2,44,0,40,1,244,0,34,1,244,0,34,2,44,0,29, 2,44,0,29,2,44,0,70,2,44,0,70,2,44,0,70, 0,222,255,248,0,222,0,66,1,22,0,94,0,222,0,68, 3,65,0,70,3,65,0,70,3,65,0,70,2,44,255,238, 2,44,0,70,2,44,0,36,1,77,0,69,1,77,0,69, 1,77,0,69,1,77,0,69,1,77,0,69,1,22,0,84, 1,22,0,84,1,244,255,202,1,22,0,0,1,22,0,0, 1,22,0,0,1,22,0,14,1,22,0,14,2,44,0,65, 1,244,0,10,2,210,0,6,1,244,0,20,1,244,0,31, 1,244,0,36,1,244,0,58,2,44,0,26,1,77,0,20, 1,77,0,19,1,77,0,92,1,77,0,22,1,77,0,15, 1,77,0,115,1,77,0,79,1,77,0,57,1,77,0,5, 1,77,255,221,0,0,254,201,0,0,255,15,0,0,254,199, 0,0,254,184,0,0,254,207,0,0,254,194,0,0,255,38, 0,0,254,209,0,0,255,2,0,0,254,144,0,0,254,198, 0,0,254,144,0,0,254,194,0,0,1,198,0,0,255,54, 0,0,1,198,0,0,255,28,0,0,254,218,0,0,254,236, 0,199,0,39,0,199,0,22,1,76,0,129,1,22,0,110, 1,158,0,174,2,235,0,75,2,218,0,8,1,22,0,89, 2,152,255,212,2,169,255,185,0,230,255,194,3,24,255,240, 2,198,255,158,2,246,255,250,1,30,255,223,2,172,0,8, 2,116,0,74,2,70,0,82,2,172,0,13,2,138,0,80, 2,116,0,35,2,171,0,65,2,238,0,45,0,236,0,69, 2,172,0,74,2,172,0,8,3,32,0,64,2,142,0,56, 2,118,0,65,2,238,0,50,2,209,0,80,2,126,0,78, 2,116,0,40,2,116,0,39,2,172,0,21,2,205,0,29, 2,211,0,36,2,233,0,52,2,208,0,42,0,236,255,239, 2,172,0,21,2,96,0,48,2,16,0,39,2,35,0,24, 1,51,0,56,2,3,0,40,2,84,0,48,2,4,0,50, 2,19,0,25,2,48,0,37,1,254,0,39,1,206,0,38, 2,14,0,24,2,14,0,45,1,30,0,56,2,4,0,66, 2,48,0,30,2,62,0,78,1,248,0,14,1,214,0,15, 2,38,0,34,2,149,0,53,2,54,0,57,2,23,0,22, 2,104,0,34,2,20,0,42,2,3,0,40,2,229,0,46, 2,60,0,14,2,150,0,42,2,228,0,36,1,30,255,223, 2,3,0,40,2,41,0,34,2,6,0,40,2,228,0,36, 2,155,0,90,2,155,0,79,2,254,0,28,2,99,0,90, 2,210,0,48,2,155,0,48,1,22,0,100,1,22,0,8, 1,244,0,17,4,56,0,83,3,246,0,83,2,254,0,28, 2,155,0,79,2,210,0,76,2,138,0,26,2,210,0,83, 2,155,0,17,2,155,0,79,2,155,0,79,2,99,0,79, 3,44,0,34,2,155,0,79,3,255,0,63,2,155,0,48, 2,216,0,79,2,216,0,79,2,155,0,79,2,161,0,33, 3,76,0,79,2,207,0,79,3,10,0,38,2,207,0,79, 2,155,0,79,2,210,0,48,2,99,0,21,2,138,0,26, 3,168,0,64,2,155,0,22,2,229,0,79,2,136,0,79, 3,60,0,79,3,82,0,79,3,129,0,81,3,104,0,79, 2,155,0,79,2,210,0,48,4,8,0,83,2,190,0,32, 2,44,0,42,2,44,0,36,2,10,0,70,1,174,0,70, 2,90,0,30,2,44,0,40,3,69,0,44,1,244,0,34, 2,55,0,70,2,55,0,70,1,254,0,70,2,45,0,70, 2,106,0,70,2,46,0,70,2,44,0,36,2,45,0,70, 2,64,0,70,1,244,0,31,1,240,0,60,1,244,0,20, 3,144,0,61,1,244,0,17,2,66,0,70,2,8,0,70, 2,180,0,70,2,200,0,70,2,222,0,57,2,178,0,70, 2,40,0,70,1,244,0,31,2,246,0,70,2,31,0,14, 2,44,0,40,2,44,0,40,2,56,0,18,1,174,0,70, 1,244,0,31,1,244,0,34,0,222,0,66,1,22,0,3, 0,222,255,238,3,72,0,70,3,82,0,70,2,56,0,18, 1,244,0,58,2,44,0,70,1,244,0,20,2,44,0,70, 2,155,0,79,2,40,0,70,2,155,0,91,2,44,0,54, 2,99,0,90,1,174,0,70,2,99,0,90,1,174,0,70, 2,99,0,90,1,174,0,70,3,255,0,63,3,69,0,14, 2,155,0,48,1,244,0,34,2,155,0,79,1,244,0,58, 2,155,0,79,1,244,0,58,2,155,0,79,1,244,0,58, 2,155,0,79,1,244,0,58,2,210,0,83,2,44,0,70, 4,36,0,83,2,252,0,70,2,210,0,83,2,44,0,70, 2,210,0,48,1,244,0,31,2,210,0,48,1,244,0,31, 2,99,0,21,1,240,0,60,2,155,0,13,1,244,0,10, 2,155,0,13,1,244,0,10,2,155,0,22,1,244,0,17, 3,6,0,83,2,96,0,70,2,130,0,83,1,252,0,69, 2,130,0,83,1,252,0,69,2,130,0,83,1,252,0,69, 3,10,0,38,2,44,0,40,2,176,0,39,2,44,0,40, 1,22,0,100,3,255,0,63,3,69,0,44,2,155,0,79, 1,244,0,58,2,210,0,83,2,44,0,70,2,130,0,83, 1,252,0,69,2,155,0,17,2,44,0,42,2,155,0,17, 2,44,0,42,3,232,0,11,3,121,0,34,2,155,0,79, 2,44,0,40,3,10,0,38,2,44,0,40,3,10,0,38, 2,44,0,40,3,255,0,63,3,69,0,44,2,155,0,48, 1,244,0,34,2,155,0,48,1,244,0,34,2,216,0,79, 2,55,0,70,2,216,0,79,2,55,0,70,3,10,0,38, 2,44,0,36,3,10,0,38,2,44,0,36,3,10,0,38, 2,44,0,36,2,210,0,48,1,244,0,31,2,138,0,26, 1,244,0,20,2,138,0,26,1,244,0,20,2,138,0,26, 1,244,0,20,2,136,0,79,2,8,0,70,3,104,0,79, 2,178,0,70,2,210,0,79,2,193,0,79,3,6,0,83, 2,242,0,82,2,210,0,79,2,239,0,30,1,229,0,84, 2,210,0,74,3,14,0,63,2,143,0,67,2,187,0,63, 1,161,0,93,3,85,0,66,3,23,0,34,2,199,0,74, 2,76,0,23,2,151,0,51,2,153,0,79,2,153,0,47, 2,244,0,45,2,111,0,49,3,5,0,9,2,91,0,40, 2,210,0,74,2,136,0,66,2,210,0,74,2,239,0,42, 2,238,0,74,2,210,0,79,2,236,0,74,2,155,0,45, 2,187,0,74,2,111,0,60,1,161,0,76,3,17,0,42, 2,126,0,36,3,10,0,48,2,204,0,39,0,222,0,53, 0,133,0,24,1,69,0,23,1,77,0,43,1,88,0,21, 3,65,0,65,2,44,0,74,2,60,0,35,2,69,0,73, 2,38,0,60,2,76,0,42,1,192,0,94,2,44,0,63, 2,56,0,68,2,70,0,48,2,33,0,66,1,45,0,60, 3,31,0,66,2,44,0,43,2,42,0,71,2,21,0,66, 2,36,0,40,2,40,0,39,2,40,0,43,2,32,0,73, 0,222,255,210,2,32,0,73,1,200,0,53,2,44,0,69, 1,134,0,35,3,65,0,65,1,253,0,38,2,35,0,80, 2,21,0,64,2,98,0,71,3,119,0,73,2,44,0,69, 2,33,0,32,1,96,0,76,3,85,0,43,2,76,0,25, 2,67,0,50,2,178,0,42,2,33,0,70,1,22,0,90, 1,111,0,12,0,70,0,0,1,79,0,0,1,73,0,0, 1,73,0,0,0,70,0,0,0,200,0,0,0,200,0,0, 0,188,0,0,0,188,0,0,0,70,0,0,1,73,0,0, 0,70,0,0,0,70,0,0,1,232,0,38,0,200,0,0, 0,212,0,62,0,0,2,127,0,0,0,70,1,22,0,110, 0,70,0,0,2,128,0,58,2,79,0,58,1,210,0,30, 2,86,0,38,2,110,0,63,0,212,0,62,1,95,0,39, 2,111,0,63,2,96,0,61,0,200,0,58,2,14,0,38, 2,38,0,57,2,88,0,37,2,111,0,63,2,109,0,48, 0,212,0,62,1,122,0,51,2,95,0,61,2,75,0,36, 2,63,0,57,2,56,0,63,2,28,0,13,2,78,0,51, 2,94,0,62,2,35,0,37,3,8,0,59,2,175,0,35, 2,88,0,56,0,201,0,52,0,201,0,50,0,201,0,51, 0,201,0,44,1,244,0,106,1,244,0,106,1,244,0,106, 1,114,0,84,1,114,0,87,2,62,0,26,2,62,0,26, 2,133,0,136,2,62,0,26,1,196,0,35,1,196,0,57, 2,62,255,184,2,133,255,184,2,133,255,184,1,253,0,107, 1,253,0,107,2,170,0,109,2,73,0,100,1,148,0,177, 2,115,255,184,2,206,255,184,2,206,255,184,1,228,255,184, 2,170,255,112,2,88,0,97,2,148,255,184,2,170,0,107, 2,26,0,107,2,206,255,184,2,206,0,167,2,206,255,184, 2,62,255,184,2,62,255,184,2,126,0,127,2,73,255,184, 1,253,0,107,2,170,255,184,2,170,0,99,0,1,0,0, 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, 0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0, 0,1,0,167,0,1,0,0,0,6,255,21,0,6,255,112, 2,132,0,41,3,48,0,41,1,136,0,0,1,136,0,0, 1,203,0,0,2,149,0,0,2,129,0,0,1,167,0,0, 1,167,0,0,3,48,0,41,3,48,0,41,3,48,0,41, 1,137,0,0,2,110,0,0,1,168,0,0,1,216,0,0, 1,252,0,0,2,5,0,0,2,71,0,0,2,37,0,0, 1,247,0,0,2,26,0,0,1,188,0,0,1,224,0,0, 2,7,0,0,1,223,0,0,1,248,0,0,1,183,0,0, 2,30,0,43,1,171,0,0,2,8,0,43,1,159,0,0, 1,159,0,0,1,145,0,0,1,145,0,0,1,186,0,0, 2,8,0,43,1,207,0,0,1,195,0,0,1,63,0,0, 1,63,0,0,2,37,0,0,2,129,0,0,1,186,0,0, 2,77,0,0,1,142,0,0,1,250,0,0,1,174,0,0, 0,6,254,238,1,182,0,45,0,172,255,251,0,172,255,250, 0,172,255,63,0,6,254,125,0,6,255,41,0,6,255,30, 0,6,255,21,0,6,254,181,0,6,254,204,0,172,255,201, 0,172,255,96,0,172,255,112,0,6,255,104,3,130,0,40, 0,6,255,148,2,72,0,148,2,72,0,173,2,72,0,143, 2,72,0,133,2,72,0,47,2,72,0,113,2,72,0,99, 2,72,0,78,2,72,0,102,2,72,0,153,3,130,0,40, 1,44,0,20,1,144,0,20,1,44,0,19,2,128,255,236, 3,12,255,236,2,8,255,236,2,8,255,236,2,18,255,236, 2,38,255,236,2,108,0,20,1,164,0,20,1,224,0,20, 2,108,0,20,2,108,0,20,2,208,0,20,2,140,255,236, 1,244,0,20,1,234,0,20,1,210,255,236,2,28,0,18, 1,234,255,236,2,28,255,236,2,118,255,236,2,78,255,236, 2,168,0,24,1,254,255,236,1,234,255,236,2,8,255,236, 2,8,255,236,1,214,0,20,2,28,255,236,1,234,0,20, 1,214,255,236,1,234,0,20,1,196,255,236,2,48,0,19, 2,138,255,236,1,224,255,236,2,76,255,236,1,224,255,237, 1,214,255,236,1,224,255,236,1,216,255,236,2,0,0,20, 1,214,255,236,1,214,255,236,2,8,255,236,0,160,0,20, 0,180,255,236,0,180,255,236,0,180,254,12,1,64,0,20, 1,73,0,28,0,195,0,35,1,4,255,206,1,84,255,236, 1,84,255,236,2,228,255,236,2,228,255,236,1,144,0,120, 0,180,255,136,2,28,255,236,2,8,255,236,1,214,255,236, 2,100,0,20,1,164,0,20,0,234,0,100,1,104,0,100, 1,204,0,22,1,164,0,20,2,8,0,19,2,28,0,19, 1,144,0,21,1,144,0,24,2,48,0,24,1,134,0,20, 1,224,0,21,1,164,0,20,1,224,255,246,1,214,255,243, 1,144,0,20,1,214,255,236,1,144,0,20,1,144,0,20, 1,144,0,20,0,120,0,20,1,184,0,19,1,164,0,20, 1,164,0,20,2,232,0,0,3,146,0,0,2,178,0,0, 2,158,0,0,2,84,0,0,2,84,0,0,1,242,0,0, 2,232,0,0,2,84,0,0,2,232,0,0,2,38,0,0, 2,22,0,0,2,106,0,0,2,178,0,0,2,34,0,0, 2,6,0,0,2,80,0,0,1,236,0,0,2,62,0,0, 2,2,0,3,2,14,0,0,2,44,0,0,2,12,0,0, 2,16,0,0,2,62,0,0,1,228,0,0,2,22,0,0, 1,248,0,0,2,22,0,0,2,26,0,0,2,22,0,0, 1,250,0,0,2,50,0,0,2,4,0,0,2,34,0,0, 2,158,0,0,2,26,0,0,2,214,0,0,2,214,255,254, 2,2,0,0,2,34,0,0,2,34,0,0,2,5,0,0, 1,30,0,84,0,172,0,0,0,190,0,0,0,190,255,132, 0,1,254,97,0,1,254,98,0,1,254,126,0,1,254,120, 0,1,254,100,0,1,254,56,0,1,255,52,2,22,0,0, 2,106,255,254,1,236,0,0,1,228,0,0,1,250,0,0, 2,104,0,0,1,224,0,0,2,48,255,250,1,224,255,254, 1,212,0,0,1,236,255,248,2,2,255,252,2,26,0,0, 2,60,0,0,2,48,0,4,0,1,254,143,1,242,0,0, 2,84,0,0,3,132,0,0,0,33,254,193,0,33,255,72, 2,255,0,39,3,193,0,39,1,244,0,40,1,239,0,40, 2,16,0,40,2,190,0,40,3,117,0,30,1,245,0,39, 2,100,0,39,2,107,0,39,2,57,0,38,2,20,0,40, 1,102,0,39,2,108,0,40,2,94,0,40,2,90,0,39, 2,119,0,40,1,239,0,40,2,16,0,40,2,19,0,40, 1,255,0,39,2,102,0,39,1,38,0,39,1,88,0,39, 1,169,0,40,1,89,0,36,2,99,0,39,2,0,0,39, 2,66,0,40,1,172,0,38,1,167,0,40,0,231,0,40, 2,70,255,175,1,88,0,39,2,46,0,39,2,158,0,40, 2,25,0,39,2,80,0,39,2,56,0,39,2,88,0,39, 2,32,0,38,2,19,0,40,0,232,0,70,0,232,0,69, 0,232,255,78,0,33,254,80,0,33,254,79,0,33,254,189, 0,33,254,144,0,33,254,117,0,232,255,102,0,232,255,75, 3,135,0,30,1,223,0,39,1,160,0,40,1,209,0,38, 1,213,0,39,1,242,0,29,1,207,0,39,1,195,0,39, 1,254,0,39,1,199,0,40,1,232,0,39,0,131,255,156, 1,46,255,216,2,48,0,0,2,132,0,0,2,120,255,253, 2,118,255,253,2,41,255,253,2,92,255,237,2,8,255,255, 2,60,255,254,2,58,255,254,2,68,255,254,2,53,0,1, 2,68,255,254,2,52,255,255,2,63,255,253,2,53,255,253, 2,53,0,1,2,12,255,254,2,60,0,1,2,188,255,253, 2,143,255,248,2,108,0,1,2,140,0,1,2,48,255,251, 2,53,255,253,2,53,255,253,2,33,255,254,2,12,0,1, 0,128,0,20,0,1,254,38,0,190,255,221,0,1,254,223, 0,1,255,44,0,1,254,76,1,140,255,250,2,51,0,1, 1,252,0,18,1,168,0,25,1,184,0,24,2,88,255,244, 2,88,0,0,2,88,255,249,2,88,0,0,2,88,0,48, 1,255,0,56,1,227,0,47,1,223,0,83,3,125,0,16, 3,250,0,12,4,146,0,8,3,148,255,177,2,164,0,16, 3,68,0,12,4,201,0,6,2,232,0,14,2,232,0,14, 3,80,0,12,3,45,0,12,3,45,0,12,3,45,0,12, 2,176,0,16,2,232,0,14,2,164,0,16,3,80,0,12, 3,216,0,8,3,9,0,20,5,58,0,8,2,152,255,228, 2,49,255,233,4,5,0,8,2,95,0,18,2,185,0,14, 2,185,0,14,1,178,0,10,2,105,255,254,3,101,0,12, 3,91,0,10,2,185,0,8,3,101,0,16,4,121,0,10, 4,40,0,12,5,36,0,16,1,168,0,10,0,125,254,143, 2,84,254,180,2,27,0,8,2,84,0,12,2,138,0,10, 3,205,0,18,5,6,0,12,5,6,0,10,6,170,0,12, 1,77,0,118,3,91,0,10,3,10,0,16,3,113,0,14, 3,108,0,16,2,136,0,14,2,232,0,16,1,86,0,22, 2,108,0,22,2,79,0,17,2,88,0,17,3,8,0,22, 4,114,0,14,5,184,0,14,2,62,0,17,2,58,0,17, 2,68,0,17,2,77,255,251,2,85,255,251,2,113,255,251, 1,0,0,7,2,53,0,14,1,70,0,14,2,92,0,5, 2,139,255,252,1,152,255,251,2,99,0,10,3,75,0,17, 2,98,0,26,1,2,0,5,1,61,0,10,1,72,0,10, 3,35,0,14,1,61,0,21,1,72,0,10,1,96,0,10, 1,96,0,10,1,61,0,10,0,248,0,24,2,109,0,10, 2,108,0,12,2,108,0,12,2,137,0,64,2,38,0,79, 2,61,0,64,2,55,0,79,2,50,0,12,2,45,0,64, 2,50,0,64,2,55,0,96,2,45,0,64,2,45,0,80, 1,212,0,60,1,62,0,7,2,148,0,31,3,10,0,36, 3,39,0,30,3,62,0,19,3,70,0,37,3,92,0,32, 3,232,0,0,3,205,0,35,3,92,0,28,3,229,0,63, 2,228,0,30,3,70,0,35,3,118,0,32,3,118,0,32, 5,15,0,25,5,15,0,38,3,70,0,43,3,92,0,28, 3,92,0,30,3,92,0,19,5,123,0,15,3,205,0,33, 3,70,0,37,2,148,0,28,3,92,0,32,3,205,0,31, 2,148,0,26,3,118,0,32,3,70,0,37,3,92,0,32, 3,205,0,28,3,70,0,29,3,92,0,31,3,118,0,44, 3,39,0,26,3,62,0,31,3,70,0,42,3,205,0,31, 3,118,0,53,3,118,0,47,3,205,0,29,3,62,0,26, 3,205,0,40,0,0,253,31,1,176,0,3,1,124,0,1, 1,164,0,15,0,0,252,237,0,0,253,16,0,0,252,237, 0,0,252,227,1,245,0,13,2,140,0,33,2,136,0,42, 2,84,255,159,2,84,0,48,2,84,255,29,2,84,0,48, 2,84,255,29,2,84,0,48,2,84,255,164,2,84,0,48, 2,172,255,27,2,172,0,8,2,172,254,33,2,172,255,217, 2,172,254,63,2,172,0,8,2,172,254,211,2,172,255,166, 1,254,255,140,1,254,0,39,1,254,255,11,1,254,0,39, 1,254,255,11,1,254,0,39,2,138,254,118,2,138,0,80, 2,138,253,115,2,138,255,67,2,138,253,115,2,138,255,67, 2,14,255,169,2,14,0,24,2,14,255,27,2,14,0,24, 2,14,255,21,2,14,0,24,2,14,255,156,2,14,0,24, 2,171,254,103,2,171,0,65,2,171,253,100,2,171,255,52, 2,171,253,100,2,171,255,52,2,171,253,248,2,171,254,203, 1,30,254,239,1,30,0,56,1,30,254,109,1,30,0,56, 1,30,254,109,1,30,0,56,1,30,254,244,1,30,255,199, 0,236,254,107,0,236,0,69,0,236,253,104,0,236,255,56, 0,236,253,104,0,236,255,56,0,236,253,252,0,236,254,207, 2,38,255,159,2,38,0,34,2,38,255,29,2,38,0,34, 2,38,255,29,2,38,0,34,2,238,254,157,2,238,0,50, 2,238,253,175,2,238,255,115,2,238,253,235,2,238,255,166, 2,3,255,142,2,3,0,40,2,3,255,12,2,3,0,40, 2,3,255,12,2,3,0,40,2,3,255,147,2,3,0,40, 2,172,0,21,2,172,255,1,2,172,255,1,2,172,254,152, 2,228,255,253,2,228,0,36,2,228,255,123,2,228,0,36, 2,228,255,123,2,228,0,36,2,228,0,1,2,228,0,36, 2,208,254,158,2,208,0,42,2,208,253,161,2,208,255,113, 2,208,253,248,2,208,255,170,2,208,254,68,2,208,255,29, 2,84,0,48,2,84,0,48,1,254,0,39,1,254,0,39, 2,14,0,24,2,14,0,24,1,30,255,252,1,30,255,252, 2,38,0,34,2,38,0,34,2,3,0,40,2,3,0,40, 2,228,0,36,2,228,0,36,2,84,255,159,2,84,0,48, 2,84,255,29,2,84,0,48,2,84,255,29,2,84,0,48, 2,84,255,164,2,84,0,48,3,114,255,27,3,114,0,8, 3,114,254,33,3,114,255,217,3,114,254,63,3,114,0,8, 3,114,254,211,3,114,255,166,2,14,255,169,2,14,0,24, 2,14,255,27,2,14,0,24,2,14,255,21,2,14,0,24, 2,14,255,156,2,14,0,24,3,89,254,103,3,89,0,65, 3,89,253,100,3,89,255,52,3,89,253,100,3,89,255,52, 3,89,253,248,3,89,254,203,2,228,255,253,2,228,0,36, 2,228,255,123,2,228,0,36,2,228,255,123,2,228,0,36, 2,228,0,1,2,228,0,36,3,177,254,158,3,177,0,42, 3,177,253,161,3,177,255,113,3,177,253,248,3,177,255,170, 3,177,254,68,3,177,255,29,2,84,0,48,2,84,0,48, 2,84,0,48,2,84,0,48,2,84,0,48,2,84,0,48, 2,84,0,48,2,172,0,8,2,172,0,8,2,172,0,8, 2,172,0,8,3,114,0,8,1,22,255,204,0,201,0,23, 1,77,255,54,1,22,255,99,1,77,0,6,2,14,0,24, 2,14,0,24,2,24,0,24,2,14,0,24,2,14,0,24, 2,138,255,67,2,138,255,67,2,171,255,52,2,171,255,52, 3,89,0,65,2,70,255,54,2,70,255,54,1,77,255,54, 1,30,255,206,1,30,255,219,1,30,255,223,1,30,255,214, 1,30,255,199,1,56,255,213,0,236,255,222,0,236,255,235, 0,236,255,56,0,236,255,56,2,70,1,6,2,70,1,6, 1,77,0,9,2,3,0,40,2,3,0,40,2,3,0,40, 2,3,0,40,2,54,255,180,2,54,0,57,2,3,0,40, 2,3,0,40,2,172,0,21,2,172,0,21,2,172,255,1, 2,172,255,1,2,126,0,78,1,77,0,30,1,137,0,30, 1,77,0,22,2,228,0,36,2,228,0,36,2,228,0,36, 2,228,0,36,2,228,0,36,2,238,255,121,2,238,255,184, 2,208,255,119,2,208,255,158,3,171,0,42,1,77,0,92, 1,77,1,198,1,77,0,46,2,44,255,251,3,232,255,247, 0,222,0,65,0,221,0,64,0,222,0,64,0,221,0,64, 1,77,0,48,1,77,0,49,1,77,0,47,1,77,0,49, 2,44,0,38,2,44,0,38,1,94,0,50,1,94,0,70, 3,232,0,115,3,232,0,9,5,80,0,9,1,22,0,49, 1,213,0,49,2,168,0,49,1,22,0,49,1,213,0,49, 2,168,0,49,1,77,0,91,1,77,0,85,2,110,0,98, 2,44,0,124,2,44,0,77,0,167,255,82,4,88,0,77, 3,66,0,77,3,66,0,124,2,25,0,48,1,95,0,27, 1,95,0,160,1,95,0,20,1,95,0,17,1,95,0,16, 1,95,0,22,1,95,0,23,1,95,0,23,1,95,0,27, 1,95,0,61,1,95,0,19,1,95,0,16,1,95,0,20, 1,97,0,17,1,95,0,16,1,95,0,22,1,95,0,23, 1,95,0,23,5,165,0,91,4,198,0,93,3,101,0,60, 2,44,0,2,3,201,0,33,2,103,0,17,3,41,0,58, 2,7,0,16,3,106,0,12,3,240,0,76,3,82,255,254, 2,132,0,16,3,232,0,63,2,208,0,42,2,208,0,42, 2,0,0,16,2,155,0,79,2,155,0,17,3,140,0,34, 2,111,0,16,2,50,0,45,2,99,255,187,2,99,0,90, 4,56,0,29,3,101,0,61,3,101,0,20,3,101,0,61, 3,101,0,19,3,101,0,16,3,101,0,20,3,101,0,61, 3,101,0,17,3,101,0,61,3,101,0,16,3,101,0,17, 3,101,0,22,3,101,0,61,1,22,0,100,2,44,0,100, 3,66,0,100,3,177,0,100,2,155,0,30,3,177,0,30, 4,199,0,30,5,221,0,30,3,177,0,100,2,155,0,22, 3,177,0,22,4,199,0,22,2,44,0,80,2,210,0,48, 2,210,0,89,3,65,0,75,0,222,0,66,1,188,0,66, 2,154,0,66,2,210,0,66,1,244,0,10,2,210,0,10, 3,176,0,10,4,142,0,10,2,210,0,66,1,244,0,17, 2,210,0,17,3,176,0,17,0,222,0,68,1,244,0,31, 2,44,0,26,3,65,0,70,3,219,0,32,2,91,0,45, 3,219,0,49,2,91,0,45,4,18,0,24,4,18,1,5, 2,146,0,15,3,219,0,30,2,91,0,39,3,219,0,45, 2,91,0,44,4,18,0,27,2,155,0,17,2,44,0,36, 2,155,0,90,2,44,0,43,2,199,0,10,2,199,0,10, 2,201,0,45,2,201,0,44,3,55,0,105,3,55,0,105, 3,36,0,41,2,72,0,40,2,72,0,50,1,244,0,64, 2,30,0,7,2,201,0,26,2,201,0,25,3,0,0,26, 2,91,0,23,2,91,0,30,3,0,0,40,3,0,0,40, 2,44,0,100,3,28,0,100,3,188,0,100,2,44,0,100, 3,95,0,163,2,37,0,17,2,72,0,75,2,72,0,17, 2,72,0,95,2,72,0,50,2,124,0,53,2,36,0,32, 2,72,0,45,2,72,0,45,3,0,0,43,3,0,0,43, 3,0,0,43,2,146,0,15,3,55,0,39,1,233,0,16, 2,43,0,55,3,232,0,102,3,232,0,80,3,232,0,152, 3,232,1,8,3,232,0,99,3,232,1,207,3,232,0,77, 3,232,2,88,3,232,0,25,3,232,1,183,3,232,0,190, 3,232,2,188,3,232,0,50,3,232,2,188,3,232,0,50, 3,232,1,170,3,232,0,197,3,232,0,177,3,232,0,132, 3,232,0,206,3,232,0,165,3,232,0,243,3,232,0,205, 3,232,0,134,3,232,0,80,3,232,0,136,3,232,0,85, 3,232,0,119,3,232,0,89,3,232,0,150,3,232,0,122, 3,232,0,243,3,232,0,225,3,232,0,117,3,232,0,89, 3,232,0,156,3,232,0,131,3,232,0,140,3,232,0,114, 3,232,1,8,3,232,0,247,3,232,0,128,3,232,0,98, 3,232,0,95,3,232,0,63,3,232,0,82,3,232,0,49, 3,232,0,40,3,232,0,4,3,232,0,126,3,232,0,96, 3,232,0,184,3,232,0,135,3,232,0,106,3,232,0,127, 3,232,0,97,3,232,0,185,3,232,0,162,3,232,0,58, 3,232,0,135,3,232,0,97,3,232,0,77,3,232,0,85, 3,232,0,123,3,232,0,95,3,232,0,95,3,232,0,114, 3,232,0,85,3,232,0,85,3,232,0,64,3,232,0,29, 3,232,0,29,3,232,0,76,3,232,0,43,3,232,0,43, 3,232,0,123,3,232,0,95,3,232,0,95,3,232,0,88, 3,232,0,109,3,232,0,78,3,232,0,96,3,232,0,137, 3,232,0,101,3,232,0,41,3,232,0,146,3,232,0,96, 3,232,0,138,3,232,0,86,3,232,0,122,3,232,1,9, 3,232,0,163,3,232,0,77,3,232,0,163,3,232,0,130, 3,232,0,77,3,232,0,56,3,232,0,107,3,232,0,148, 3,232,0,76,3,232,2,255,3,232,2,255,3,232,0,207, 3,232,0,162,3,232,0,168,3,232,0,118,3,232,0,169, 3,232,0,122,3,232,0,140,3,232,0,83,3,232,0,132, 3,232,0,77,3,232,0,136,3,232,0,109,3,232,0,164, 3,232,0,137,3,232,0,107,3,232,0,77,3,232,0,105, 3,232,0,75,3,232,0,187,3,232,0,162,3,232,0,153, 3,232,0,125,3,232,0,138,3,232,0,109,3,232,0,82, 3,232,0,49,3,232,0,95,3,232,0,63,3,232,0,137, 3,232,0,110,3,232,0,115,3,232,0,86,3,232,0,113, 3,232,0,82,3,232,0,158,3,232,0,108,3,232,0,78, 3,232,0,90,3,232,0,57,3,232,1,121,3,232,1,114, 3,232,0,118,3,232,0,99,3,232,0,108,3,232,0,50, 3,232,0,184,3,232,0,78,3,232,0,46,3,232,0,46, 3,232,0,135,3,232,0,109,3,232,0,109,3,232,0,127, 3,232,0,97,3,232,0,97,3,232,0,106,3,232,0,76, 3,232,0,76,3,232,0,73,3,232,0,40,3,232,0,40, 3,232,0,139,3,232,0,219,3,232,0,135,3,232,0,174, 3,232,0,90,3,232,0,153,3,232,0,100,3,232,0,168, 3,232,0,116,3,232,0,232,3,232,0,190,3,232,0,183, 3,232,1,19,3,232,0,81,3,232,0,178,3,232,0,190, 3,232,0,183,3,232,0,139,3,232,0,93,3,232,0,111, 3,232,0,208,3,232,0,185,3,232,0,95,3,232,0,182, 3,232,0,155,3,232,0,139,3,232,0,93,3,232,0,111, 3,232,0,208,1,22,0,87,3,232,255,247,3,232,0,184, 3,232,0,184,2,44,0,43,2,44,0,34,2,44,0,32, 2,44,0,28,2,44,0,35,2,44,0,43,2,44,0,46, 2,44,0,37,2,44,0,38,0,222,255,238,1,77,0,116, 2,44,0,102,2,44,0,18,1,244,0,12,1,244,0,17, 3,10,0,18,3,10,0,18,2,44,0,18,3,10,0,34, 0,200,0,58,1,49,0,0,1,144,0,58,2,75,0,37, 3,122,0,58,3,80,0,38,3,104,0,63,3,32,0,57, 3,82,0,37,3,105,0,63,3,29,0,37,3,169,0,35, 2,72,0,50,3,8,0,59,3,8,0,59,3,8,0,59, 3,8,0,59,2,128,0,58,2,128,0,58,2,128,0,58, 2,79,0,58,1,210,0,30,2,86,0,38,2,110,0,63, 1,6,0,18,1,95,0,14,2,96,0,61,1,14,0,12, 2,14,0,38,2,38,0,57,2,88,0,37,2,109,0,48, 1,122,0,51,2,95,0,61,2,63,0,57,2,56,0,63, 2,78,0,51,2,94,0,62,2,35,0,37,3,8,0,59, 2,175,0,35,0,212,0,62,2,79,0,58,2,38,0,57, 2,56,0,63,2,128,0,72,3,20,0,35,0,0,0,0, 0,0,0,86,0,0,0,86,0,0,0,86,0,0,0,86, 0,0,0,130,0,0,0,178,0,0,1,18,0,0,1,220, 0,0,2,176,0,0,3,126,0,0,3,156,0,0,3,220, 0,0,4,26,0,0,4,86,0,0,4,128,0,0,4,170, 0,0,4,196,0,0,4,220,0,0,4,246,0,0,5,82, 0,0,5,130,0,0,5,246,0,0,6,136,0,0,6,190, 0,0,7,48,0,0,7,188,0,0,7,242,0,0,8,164, 0,0,9,54,0,0,9,90,0,0,9,146,0,0,9,182, 0,0,9,222,0,0,10,4,0,0,10,128,0,0,11,128, 0,0,11,182,0,0,12,48,0,0,12,150,0,0,12,224, 0,0,13,14,0,0,13,56,0,0,13,182,0,0,13,230, 0,0,14,0,0,0,14,70,0,0,14,124,0,0,14,156, 0,0,14,208,0,0,15,0,0,0,15,110,0,0,15,192, 0,0,16,52,0,0,16,178,0,0,17,84,0,0,17,120, 0,0,17,192,0,0,17,228,0,0,18,28,0,0,18,86, 0,0,18,130,0,0,18,176,0,0,18,210,0,0,18,238, 0,0,19,16,0,0,19,52,0,0,19,78,0,0,19,104, 0,0,20,32,0,0,20,134,0,0,20,236,0,0,21,96, 0,0,21,212,0,0,22,24,0,0,22,190,0,0,23,12, 0,0,23,50,0,0,23,116,0,0,23,166,0,0,23,192, 0,0,24,62,0,0,24,138,0,0,24,238,0,0,25,90, 0,0,25,190,0,0,25,252,0,0,26,140,0,0,26,212, 0,0,27,32,0,0,27,68,0,0,27,124,0,0,27,176, 0,0,27,248,0,0,28,38,0,0,28,158,0,0,28,184, 0,0,29,38,0,0,29,126,0,0,29,142,0,0,29,186, 0,0,30,52,0,0,30,234,0,0,31,116,0,0,31,188, 0,0,31,224,0,0,32,200,0,0,32,236,0,0,33,194, 0,0,34,102,0,0,34,154,0,0,34,186,0,0,34,212, 0,0,35,174,0,0,35,200,0,0,36,44,0,0,36,98, 0,0,36,206,0,0,37,82,0,0,37,108,0,0,37,200, 0,0,38,12,0,0,38,36,0,0,38,130,0,0,38,174, 0,0,39,34,0,0,39,88,0,0,39,186,0,0,40,88, 0,0,41,18,0,0,41,138,0,0,41,206,0,0,42,16, 0,0,42,90,0,0,42,202,0,0,43,22,0,0,43,166, 0,0,43,240,0,0,44,180,0,0,44,242,0,0,45,46, 0,0,45,114,0,0,45,184,0,0,45,224,0,0,46,6, 0,0,46,52,0,0,46,100,0,0,46,196,0,0,47,46, 0,0,47,170,0,0,48,36,0,0,48,166,0,0,49,78, 0,0,49,210,0,0,50,6,0,0,50,134,0,0,50,220, 0,0,51,50,0,0,51,144,0,0,51,240,0,0,52,42, 0,0,52,122,0,0,53,8,0,0,53,206,0,0,54,146, 0,0,55,94,0,0,56,80,0,0,57,30,0,0,58,48, 0,0,59,42,0,0,59,228,0,0,60,102,0,0,60,232, 0,0,61,114,0,0,61,254,0,0,62,38,0,0,62,76, 0,0,62,122,0,0,62,170,0,0,63,66,0,0,63,202, 0,0,64,60,0,0,64,174,0,0,65,40,0,0,65,200, 0,0,66,66,0,0,66,116,0,0,66,244,0,0,67,76, 0,0,67,164,0,0,68,4,0,0,68,102,0,0,68,188, 0,0,69,40,0,0,69,136,0,0,69,204,0,0,70,144, 0,0,70,234,0,0,71,200,0,0,72,40,0,0,72,252, 0,0,73,110,0,0,73,226,0,0,73,250,0,0,74,18, 0,0,74,42,0,0,74,64,0,0,74,186,0,0,75,52, 0,0,75,146,0,0,76,40,0,0,76,136,0,0,76,254, 0,0,77,58,0,0,77,188,0,0,77,212,0,0,77,234, 0,0,78,36,0,0,78,164,0,0,78,252,0,0,79,166, 0,0,79,234,0,0,80,114,0,0,80,142,0,0,80,164, 0,0,81,72,0,0,82,20,0,0,82,44,0,0,82,66, 0,0,82,224,0,0,83,168,0,0,83,192,0,0,83,216, 0,0,84,36,0,0,84,130,0,0,84,154,0,0,84,176, 0,0,84,214,0,0,84,252,0,0,85,20,0,0,85,42, 0,0,85,116,0,0,85,208,0,0,85,246,0,0,86,16, 0,0,86,40,0,0,86,64,0,0,86,88,0,0,86,164, 0,0,86,250,0,0,87,76,0,0,87,124,0,0,87,168, 0,0,87,206,0,0,88,14,0,0,88,72,0,0,88,136, 0,0,88,194,0,0,88,218,0,0,88,242,0,0,89,38, 0,0,89,86,0,0,89,146,0,0,89,236,0,0,90,60, 0,0,90,168,0,0,90,236,0,0,91,78,0,0,91,154, 0,0,91,244,0,0,92,96,0,0,92,218,0,0,93,74, 0,0,93,98,0,0,93,120,0,0,94,0,0,0,94,126, 0,0,94,248,0,0,95,190,0,0,96,72,0,0,96,148, 0,0,97,50,0,0,97,144,0,0,98,34,0,0,98,118, 0,0,99,38,0,0,99,194,0,0,99,218,0,0,99,240, 0,0,100,232,0,0,101,196,0,0,102,122,0,0,103,30, 0,0,103,54,0,0,103,76,0,0,103,132,0,0,103,238, 0,0,104,18,0,0,104,90,0,0,104,114,0,0,104,136, 0,0,104,222,0,0,105,54,0,0,105,78,0,0,105,100, 0,0,106,6,0,0,106,170,0,0,107,12,0,0,107,112, 0,0,107,232,0,0,108,102,0,0,108,126,0,0,108,150, 0,0,108,174,0,0,108,196,0,0,109,8,0,0,109,68, 0,0,109,126,0,0,109,184,0,0,109,242,0,0,110,54, 0,0,110,120,0,0,110,176,0,0,110,198,0,0,110,214, 0,0,111,68,0,0,111,162,0,0,112,26,0,0,112,46, 0,0,112,186,0,0,113,50,0,0,113,66,0,0,113,88, 0,0,113,110,0,0,113,132,0,0,114,2,0,0,114,166, 0,0,114,244,0,0,115,96,0,0,116,6,0,0,116,78, 0,0,116,148,0,0,116,224,0,0,117,92,0,0,117,244, 0,0,118,10,0,0,118,32,0,0,118,82,0,0,118,178, 0,0,119,18,0,0,119,92,0,0,119,116,0,0,119,140, 0,0,119,164,0,0,119,188,0,0,119,212,0,0,119,236, 0,0,120,4,0,0,120,28,0,0,120,52,0,0,120,76, 0,0,120,98,0,0,120,122,0,0,120,144,0,0,120,168, 0,0,120,190,0,0,120,214,0,0,120,236,0,0,121,4, 0,0,121,26,0,0,121,50,0,0,121,74,0,0,121,98, 0,0,121,122,0,0,121,146,0,0,121,170,0,0,121,190, 0,0,121,214,0,0,121,236,0,0,122,12,0,0,122,40, 0,0,122,64,0,0,122,88,0,0,122,112,0,0,122,134, 0,0,122,158,0,0,122,182,0,0,122,206,0,0,122,228, 0,0,123,4,0,0,123,32,0,0,123,54,0,0,123,78, 0,0,123,102,0,0,123,126,0,0,123,150,0,0,123,174, 0,0,123,198,0,0,123,220,0,0,123,244,0,0,124,12, 0,0,124,36,0,0,124,60,0,0,124,84,0,0,124,108, 0,0,124,132,0,0,124,154,0,0,124,180,0,0,124,206, 0,0,124,230,0,0,124,252,0,0,125,22,0,0,125,48, 0,0,125,72,0,0,125,94,0,0,125,120,0,0,125,146, 0,0,125,170,0,0,125,192,0,0,125,218,0,0,125,244, 0,0,126,12,0,0,126,34,0,0,126,60,0,0,126,86, 0,0,126,110,0,0,126,132,0,0,126,158,0,0,126,184, 0,0,127,124,0,0,128,44,0,0,128,114,0,0,128,218, 0,0,128,242,0,0,129,10,0,0,129,34,0,0,129,56, 0,0,129,80,0,0,129,102,0,0,129,126,0,0,129,148, 0,0,129,172,0,0,129,194,0,0,129,218,0,0,129,240, 0,0,130,16,0,0,130,44,0,0,130,68,0,0,130,90, 0,0,130,110,0,0,130,220,0,0,130,240,0,0,131,118, 0,0,131,138,0,0,132,22,0,0,132,160,0,0,132,182, 0,0,132,202,0,0,132,224,0,0,132,240,0,0,133,190, 0,0,133,206,0,0,133,226,0,0,134,80,0,0,134,210, 0,0,135,6,0,0,135,62,0,0,135,78,0,0,135,134, 0,0,135,154,0,0,136,22,0,0,136,192,0,0,137,54, 0,0,137,176,0,0,138,32,0,0,138,52,0,0,138,114, 0,0,138,210,0,0,139,16,0,0,139,108,0,0,139,162, 0,0,139,184,0,0,140,100,0,0,140,208,0,0,141,60, 0,0,141,136,0,0,141,156,0,0,141,228,0,0,141,244, 0,0,142,8,0,0,142,28,0,0,142,48,0,0,142,128, 0,0,142,172,0,0,142,192,0,0,143,68,0,0,143,102, 0,0,143,136,0,0,143,152,0,0,143,168,0,0,143,218, 0,0,143,242,0,0,144,88,0,0,144,152,0,0,144,224, 0,0,145,6,0,0,145,24,0,0,145,42,0,0,145,60, 0,0,145,78,0,0,145,96,0,0,145,114,0,0,145,132, 0,0,145,150,0,0,145,168,0,0,145,186,0,0,145,204, 0,0,145,242,0,0,146,6,0,0,146,26,0,0,146,66, 0,0,146,88,0,0,146,132,0,0,146,150,0,0,146,168, 0,0,146,196,0,0,146,222,0,0,147,26,0,0,147,42, 0,0,147,70,0,0,147,92,0,0,147,114,0,0,147,170, 0,0,147,194,0,0,147,218,0,0,147,242,0,0,148,10, 0,0,148,34,0,0,148,58,0,0,148,88,0,0,148,154, 0,0,149,36,0,0,149,70,0,0,149,136,0,0,149,182, 0,0,149,234,0,0,150,24,0,0,150,154,0,0,150,178, 0,0,150,230,0,0,151,20,0,0,151,82,0,0,151,126, 0,0,151,182,0,0,152,38,0,0,152,74,0,0,152,158, 0,0,152,218,0,0,152,254,0,0,153,52,0,0,153,184, 0,0,154,8,0,0,154,116,0,0,154,240,0,0,155,8, 0,0,155,32,0,0,155,54,0,0,155,76,0,0,155,98, 0,0,155,120,0,0,155,150,0,0,156,44,0,0,156,194, 0,0,157,8,0,0,157,138,0,0,158,16,0,0,158,130, 0,0,158,224,0,0,159,78,0,0,159,136,0,0,159,182, 0,0,160,56,0,0,160,146,0,0,160,198,0,0,161,110, 0,0,161,208,0,0,162,36,0,0,162,152,0,0,163,40, 0,0,163,146,0,0,163,226,0,0,164,64,0,0,164,204, 0,0,165,56,0,0,165,142,0,0,166,50,0,0,166,72, 0,0,166,94,0,0,166,116,0,0,166,138,0,0,166,162, 0,0,166,186,0,0,167,0,0,0,167,98,0,0,167,140, 0,0,168,0,0,0,168,16,0,0,168,32,0,0,168,56, 0,0,168,72,0,0,168,184,0,0,169,26,0,0,169,92, 0,0,169,156,0,0,169,216,0,0,170,36,0,0,170,80, 0,0,170,96,0,0,170,188,0,0,170,204,0,0,170,234, 0,0,171,52,0,0,171,98,0,0,171,176,0,0,172,88, 0,0,172,134,0,0,172,218,0,0,173,12,0,0,173,74, 0,0,173,126,0,0,173,174,0,0,173,190,0,0,173,228, 0,0,174,54,0,0,174,70,0,0,174,86,0,0,174,124, 0,0,175,0,0,0,175,16,0,0,175,62,0,0,175,120, 0,0,175,166,0,0,175,220,0,0,176,46,0,0,176,140, 0,0,176,220,0,0,177,78,0,0,177,214,0,0,178,50, 0,0,178,66,0,0,178,214,0,0,179,92,0,0,179,122, 0,0,179,192,0,0,179,208,0,0,180,18,0,0,180,158, 0,0,180,202,0,0,181,28,0,0,181,74,0,0,181,124, 0,0,181,178,0,0,181,220,0,0,181,236,0,0,182,16, 0,0,182,124,0,0,182,140,0,0,182,176,0,0,182,192, 0,0,183,130,0,0,183,146,0,0,183,188,0,0,183,246, 0,0,184,36,0,0,184,90,0,0,184,172,0,0,185,12, 0,0,185,92,0,0,185,206,0,0,186,68,0,0,186,160, 0,0,186,182,0,0,186,204,0,0,187,76,0,0,187,120, 0,0,187,230,0,0,187,246,0,0,188,6,0,0,188,28, 0,0,188,44,0,0,188,182,0,0,189,48,0,0,189,150, 0,0,189,210,0,0,190,12,0,0,190,34,0,0,190,78, 0,0,190,154,0,0,190,240,0,0,191,0,0,0,191,16, 0,0,191,50,0,0,191,84,0,0,191,114,0,0,191,144, 0,0,191,174,0,0,191,204,0,0,192,26,0,0,192,96, 0,0,193,8,0,0,193,148,0,0,193,198,0,0,193,246, 0,0,194,40,0,0,194,88,0,0,194,138,0,0,194,186, 0,0,194,236,0,0,195,28,0,0,195,76,0,0,195,118, 0,0,195,170,0,0,195,216,0,0,195,254,0,0,196,34, 0,0,196,50,0,0,196,66,0,0,196,82,0,0,196,98, 0,0,196,114,0,0,196,150,0,0,196,166,0,0,196,202, 0,0,196,218,0,0,196,254,0,0,197,14,0,0,197,30, 0,0,197,76,0,0,197,118,0,0,197,172,0,0,197,220, 0,0,198,18,0,0,198,66,0,0,198,118,0,0,198,164, 0,0,198,184,0,0,198,200,0,0,198,220,0,0,198,236, 0,0,198,252,0,0,199,20,0,0,199,44,0,0,199,94, 0,0,199,142,0,0,199,190,0,0,199,232,0,0,200,30, 0,0,200,78,0,0,200,102,0,0,200,124,0,0,200,148, 0,0,200,170,0,0,200,186,0,0,200,202,0,0,200,226, 0,0,200,250,0,0,201,10,0,0,201,30,0,0,201,54, 0,0,201,80,0,0,201,104,0,0,201,128,0,0,201,152, 0,0,201,174,0,0,202,86,0,0,202,226,0,0,202,250, 0,0,203,16,0,0,203,40,0,0,203,62,0,0,203,86, 0,0,203,108,0,0,203,124,0,0,203,140,0,0,203,164, 0,0,203,186,0,0,203,210,0,0,203,232,0,0,204,0, 0,0,204,22,0,0,204,46,0,0,204,68,0,0,204,92, 0,0,204,114,0,0,204,138,0,0,204,160,0,0,204,184, 0,0,204,208,0,0,205,46,0,0,205,150,0,0,206,42, 0,0,206,132,0,0,206,228,0,0,207,190,0,0,207,228, 0,0,208,72,0,0,209,0,0,0,209,126,0,0,209,234, 0,0,210,8,0,0,210,134,0,0,211,46,0,0,211,140, 0,0,211,218,0,0,212,202,0,0,213,38,0,0,213,156, 0,0,214,0,0,0,214,188,0,0,215,32,0,0,215,182, 0,0,216,18,0,0,216,152,0,0,217,10,0,0,217,246, 0,0,218,94,0,0,218,186,0,0,219,28,0,0,219,198, 0,0,220,34,0,0,221,22,0,0,221,56,0,0,221,226, 0,0,222,106,0,0,222,220,0,0,223,156,0,0,223,200, 0,0,223,226,0,0,224,48,0,0,224,74,0,0,224,180, 0,0,225,44,0,0,225,138,0,0,226,8,0,0,226,100, 0,0,226,200,0,0,227,80,0,0,227,124,0,0,227,230, 0,0,228,142,0,0,229,10,0,0,229,92,0,0,229,124, 0,0,229,230,0,0,230,168,0,0,230,248,0,0,231,74, 0,0,232,38,0,0,232,116,0,0,232,248,0,0,233,136, 0,0,233,192,0,0,234,76,0,0,234,222,0,0,235,52, 0,0,235,206,0,0,236,72,0,0,237,70,0,0,237,200, 0,0,238,38,0,0,238,124,0,0,239,26,0,0,239,112, 0,0,240,10,0,0,240,40,0,0,240,202,0,0,241,84, 0,0,241,192,0,0,242,98,0,0,242,184,0,0,242,220, 0,0,243,14,0,0,243,46,0,0,243,112,0,0,243,156, 0,0,243,208,0,0,243,230,0,0,244,8,0,0,244,52, 0,0,244,74,0,0,244,106,0,0,244,130,0,0,244,176, 0,0,244,200,0,0,244,224,0,0,244,252,0,0,245,20, 0,0,245,46,0,0,245,72,0,0,245,96,0,0,245,112, 0,0,245,136,0,0,246,2,0,0,246,96,0,0,246,188, 0,0,246,226,0,0,247,78,0,0,247,102,0,0,247,138, 0,0,247,224,0,0,248,178,0,0,248,204,0,0,249,40, 0,0,249,180,0,0,250,14,0,0,250,92,0,0,250,174, 0,0,250,200,0,0,251,16,0,0,251,224,0,0,252,58, 0,0,252,192,0,0,253,106,0,0,253,194,0,0,254,38, 0,0,254,122,0,0,254,214,0,0,255,138,0,1,0,26, 0,1,2,38,0,1,2,94,0,1,2,150,0,1,3,160, 0,1,4,170,0,1,5,182,0,1,6,194,0,1,7,206, 0,1,8,216,0,1,9,228,0,1,11,254,0,1,12,152, 0,1,12,190,0,1,15,44,0,1,15,138,0,1,15,242, 0,1,16,22,0,1,16,134,0,1,16,252,0,1,17,60, 0,1,17,112,0,1,17,234,0,1,18,76,0,1,18,148, 0,1,18,200,0,1,19,2,0,1,19,50,0,1,19,88, 0,1,20,152,0,1,20,220,0,1,21,2,0,1,21,52, 0,1,21,88,0,1,22,26,0,1,22,242,0,1,23,74, 0,1,23,166,0,1,24,0,0,1,24,134,0,1,24,200, 0,1,25,10,0,1,25,66,0,1,25,170,0,1,25,254, 0,1,26,82,0,1,26,128,0,1,26,180,0,1,26,230, 0,1,27,84,0,1,27,146,0,1,27,206,0,1,27,250, 0,1,28,44,0,1,28,94,0,1,28,144,0,1,28,210, 0,1,29,48,0,1,29,138,0,1,29,206,0,1,29,240, 0,1,30,52,0,1,30,118,0,1,30,228,0,1,31,80, 0,1,31,232,0,1,32,126,0,1,32,164,0,1,32,200, 0,1,33,68,0,1,34,234,0,1,35,62,0,1,35,90, 0,1,36,30,0,1,36,238,0,1,37,144,0,1,38,100, 0,1,38,244,0,1,39,188,0,1,40,112,0,1,40,212, 0,1,41,82,0,1,42,92,0,1,43,68,0,1,44,104, 0,1,45,18,0,1,45,200,0,1,46,10,0,1,46,162, 0,1,47,56,0,1,47,146,0,1,48,96,0,1,48,208, 0,1,49,144,0,1,50,10,0,1,50,104,0,1,51,4, 0,1,51,138,0,1,52,28,0,1,52,116,0,1,52,196, 0,1,53,90,0,1,53,214,0,1,54,138,0,1,54,204, 0,1,55,28,0,1,55,104,0,1,55,242,0,1,56,112, 0,1,56,244,0,1,57,64,0,1,57,176,0,1,57,252, 0,1,58,84,0,1,58,224,0,1,59,138,0,1,59,254, 0,1,60,158,0,1,61,12,0,1,61,124,0,1,62,26, 0,1,62,52,0,1,62,168,0,1,62,204,0,1,63,34, 0,1,63,120,0,1,63,202,0,1,64,42,0,1,64,112, 0,1,64,182,0,1,64,222,0,1,65,66,0,1,65,158, 0,1,65,218,0,1,66,84,0,1,66,130,0,1,67,218, 0,1,67,244,0,1,68,88,0,1,68,216,0,1,69,72, 0,1,69,200,0,1,70,48,0,1,70,148,0,1,71,44, 0,1,71,168,0,1,71,244,0,1,72,112,0,1,73,200, 0,1,74,46,0,1,74,172,0,1,75,100,0,1,75,240, 0,1,76,144,0,1,77,80,0,1,78,38,0,1,78,196, 0,1,79,134,0,1,80,18,0,1,80,178,0,1,81,66, 0,1,82,24,0,1,82,222,0,1,83,242,0,1,84,118, 0,1,85,6,0,1,85,140,0,1,86,4,0,1,86,204, 0,1,87,60,0,1,87,210,0,1,88,144,0,1,88,232, 0,1,90,8,0,1,90,176,0,1,91,122,0,1,91,242, 0,1,92,112,0,1,92,232,0,1,93,120,0,1,94,0, 0,1,94,88,0,1,94,210,0,1,95,54,0,1,95,204, 0,1,96,100,0,1,96,172,0,1,97,86,0,1,98,4, 0,1,98,118,0,1,98,230,0,1,99,128,0,1,100,34, 0,1,100,146,0,1,101,42,0,1,101,194,0,1,101,248, 0,1,102,34,0,1,102,122,0,1,102,240,0,1,103,100, 0,1,103,206,0,1,103,238,0,1,104,34,0,1,104,130, 0,1,105,20,0,1,105,146,0,1,106,60,0,1,106,102, 0,1,106,188,0,1,107,100,0,1,108,10,0,1,108,158, 0,1,109,62,0,1,110,70,0,1,110,188,0,1,111,156, 0,1,112,10,0,1,112,104,0,1,112,202,0,1,113,74, 0,1,114,10,0,1,114,148,0,1,115,30,0,1,115,136, 0,1,116,6,0,1,116,144,0,1,116,246,0,1,117,94, 0,1,117,150,0,1,118,56,0,1,118,112,0,1,118,240, 0,1,119,116,0,1,119,144,0,1,119,238,0,1,120,94, 0,1,120,202,0,1,121,100,0,1,121,124,0,1,121,148, 0,1,121,172,0,1,121,196,0,1,121,220,0,1,121,244, 0,1,122,12,0,1,122,174,0,1,122,198,0,1,123,96, 0,1,123,194,0,1,124,38,0,1,124,172,0,1,125,62, 0,1,125,162,0,1,126,78,0,1,126,158,0,1,127,74, 0,1,127,186,0,1,128,34,0,1,128,152,0,1,129,42, 0,1,129,166,0,1,130,44,0,1,130,178,0,1,131,20, 0,1,131,116,0,1,131,200,0,1,132,72,0,1,132,152, 0,1,133,40,0,1,133,152,0,1,134,82,0,1,134,174, 0,1,135,12,0,1,135,116,0,1,136,60,0,1,137,48, 0,1,137,164,0,1,138,40,0,1,138,130,0,1,138,218, 0,1,138,242,0,1,139,20,0,1,139,108,0,1,139,194, 0,1,139,234,0,1,140,44,0,1,140,94,0,1,140,180, 0,1,140,230,0,1,141,60,0,1,141,104,0,1,141,246, 0,1,142,134,0,1,143,2,0,1,143,156,0,1,144,88, 0,1,144,182,0,1,145,50,0,1,145,166,0,1,146,68, 0,1,146,238,0,1,147,62,0,1,147,244,0,1,148,90, 0,1,148,154,0,1,149,18,0,1,149,92,0,1,149,220, 0,1,150,150,0,1,151,204,0,1,152,36,0,1,152,92, 0,1,152,224,0,1,153,114,0,1,153,250,0,1,154,138, 0,1,155,62,0,1,155,230,0,1,156,160,0,1,157,40, 0,1,157,134,0,1,157,250,0,1,158,130,0,1,159,56, 0,1,159,178,0,1,160,126,0,1,161,30,0,1,161,224, 0,1,162,84,0,1,162,206,0,1,163,116,0,1,163,254, 0,1,164,132,0,1,165,34,0,1,165,120,0,1,166,24, 0,1,166,146,0,1,167,48,0,1,167,160,0,1,168,14, 0,1,168,186,0,1,169,26,0,1,169,160,0,1,169,238, 0,1,170,152,0,1,171,48,0,1,171,162,0,1,172,32, 0,1,172,124,0,1,173,38,0,1,173,134,0,1,173,250, 0,1,174,182,0,1,175,52,0,1,175,76,0,1,175,150, 0,1,175,222,0,1,176,64,0,1,176,160,0,1,176,230, 0,1,177,0,0,1,177,36,0,1,177,74,0,1,177,124, 0,1,178,230,0,1,179,78,0,1,179,230,0,1,180,82, 0,1,180,234,0,1,181,108,0,1,181,222,0,1,182,132, 0,1,183,36,0,1,183,110,0,1,183,208,0,1,184,52, 0,1,184,226,0,1,185,170,0,1,186,128,0,1,187,134, 0,1,188,70,0,1,189,30,0,1,189,124,0,1,190,64, 0,1,191,22,0,1,191,226,0,1,192,144,0,1,193,78, 0,1,194,4,0,1,194,214,0,1,195,194,0,1,196,96, 0,1,196,198,0,1,197,104,0,1,198,12,0,1,198,250, 0,1,199,188,0,1,200,104,0,1,201,34,0,1,201,216, 0,1,202,166,0,1,203,86,0,1,203,196,0,1,204,126, 0,1,204,152,0,1,204,218,0,1,204,248,0,1,205,120, 0,1,205,232,0,1,206,82,0,1,206,212,0,1,207,204, 0,1,208,48,0,1,208,194,0,1,209,86,0,1,209,236, 0,1,210,142,0,1,211,98,0,1,212,10,0,1,212,198, 0,1,212,232,0,1,213,54,0,1,213,156,0,1,214,180, 0,1,215,132,0,1,216,150,0,1,218,2,0,1,218,130, 0,1,219,40,0,1,220,96,0,1,220,230,0,1,221,112, 0,1,222,182,0,1,223,232,0,1,225,44,0,1,226,240, 0,1,227,138,0,1,227,244,0,1,228,96,0,1,229,190, 0,1,230,154,0,1,230,186,0,1,231,244,0,1,232,186, 0,1,233,56,0,1,234,24,0,1,234,62,0,1,234,162, 0,1,234,242,0,1,235,32,0,1,235,200,0,1,236,158, 0,1,237,86,0,1,238,18,0,1,238,186,0,1,239,234, 0,1,240,236,0,1,242,30,0,1,242,70,0,1,242,150, 0,1,243,12,0,1,243,54,0,1,243,212,0,1,244,174, 0,1,245,150,0,1,246,82,0,1,247,72,0,1,248,148, 0,1,248,192,0,1,249,120,0,1,249,236,0,1,250,168, 0,1,251,48,0,1,251,182,0,1,252,14,0,1,252,148, 0,1,253,44,0,1,253,234,0,1,254,186,0,1,255,178, 0,2,0,134,0,2,1,192,0,2,2,70,0,2,2,248, 0,2,3,162,0,2,4,70,0,2,5,26,0,2,6,16, 0,2,6,162,0,2,7,102,0,2,7,182,0,2,8,148, 0,2,9,148,0,2,10,74,0,2,11,26,0,2,12,102, 0,2,13,104,0,2,13,226,0,2,14,144,0,2,15,76, 0,2,16,22,0,2,16,156,0,2,17,92,0,2,17,222, 0,2,18,112,0,2,18,246,0,2,19,94,0,2,20,92, 0,2,20,220,0,2,21,228,0,2,22,76,0,2,22,172, 0,2,23,0,0,2,23,148,0,2,24,56,0,2,25,34, 0,2,25,166,0,2,26,6,0,2,26,140,0,2,27,20, 0,2,27,124,0,2,28,56,0,2,29,100,0,2,31,46, 0,2,32,244,0,2,33,230,0,2,34,250,0,2,36,242, 0,2,36,242,0,2,38,128,0,2,40,24,0,2,41,90, 0,2,43,2,0,2,44,116,0,2,46,10,0,2,47,128, 0,2,49,242,0,2,51,236,0,2,53,12,0,2,54,68, 0,2,55,176,0,2,57,38,0,2,59,140,0,2,60,244, 0,2,61,202,0,2,63,2,0,2,64,48,0,2,65,202, 0,2,67,40,0,2,68,66,0,2,69,82,0,2,71,0, 0,2,72,18,0,2,73,244,0,2,76,60,0,2,77,122, 0,2,78,132,0,2,79,154,0,2,81,0,0,2,82,96, 0,2,83,212,0,2,85,40,0,2,86,120,0,2,87,202, 0,2,88,166,0,2,89,50,0,2,89,232,0,2,90,88, 0,2,91,0,0,2,91,136,0,2,92,56,0,2,92,166, 0,2,93,44,0,2,94,0,0,2,94,238,0,2,95,208, 0,2,95,230,0,2,96,2,0,2,96,32,0,2,96,68, 0,2,96,98,0,2,96,134,0,2,96,164,0,2,96,200, 0,2,96,222,0,2,96,250,0,2,97,24,0,2,97,56, 0,2,97,86,0,2,97,118,0,2,97,148,0,2,97,182, 0,2,97,204,0,2,97,232,0,2,98,6,0,2,98,42, 0,2,98,70,0,2,98,106,0,2,98,130,0,2,98,158, 0,2,98,190,0,2,98,224,0,2,99,0,0,2,99,34, 0,2,99,56,0,2,99,84,0,2,99,114,0,2,99,150, 0,2,99,180,0,2,99,216,0,2,99,246,0,2,100,26, 0,2,100,50,0,2,100,78,0,2,100,110,0,2,100,146, 0,2,100,178,0,2,100,214,0,2,100,246,0,2,101,26, 0,2,101,48,0,2,101,76,0,2,101,106,0,2,101,140, 0,2,101,170,0,2,101,204,0,2,101,234,0,2,102,14, 0,2,102,38,0,2,102,66,0,2,102,98,0,2,102,134, 0,2,102,166,0,2,102,202,0,2,102,234,0,2,103,14, 0,2,103,36,0,2,103,64,0,2,103,94,0,2,103,130, 0,2,103,160,0,2,103,196,0,2,103,220,0,2,103,248, 0,2,104,24,0,2,104,58,0,2,104,90,0,2,104,124, 0,2,104,146,0,2,104,174,0,2,104,204,0,2,104,240, 0,2,105,14,0,2,105,50,0,2,105,80,0,2,105,116, 0,2,105,142,0,2,105,178,0,2,105,214,0,2,105,250, 0,2,106,18,0,2,106,46,0,2,106,76,0,2,106,112, 0,2,106,142,0,2,106,178,0,2,106,210,0,2,106,246, 0,2,107,14,0,2,107,42,0,2,107,74,0,2,107,108, 0,2,107,140,0,2,107,174,0,2,107,206,0,2,107,242, 0,2,108,10,0,2,108,32,0,2,108,56,0,2,108,78, 0,2,108,102,0,2,108,124,0,2,108,146,0,2,108,168, 0,2,108,192,0,2,108,214,0,2,108,238,0,2,109,4, 0,2,109,28,0,2,109,52,0,2,109,80,0,2,109,114, 0,2,109,150,0,2,109,192,0,2,109,228,0,2,110,14, 0,2,110,50,0,2,110,92,0,2,110,122,0,2,110,158, 0,2,110,196,0,2,110,236,0,2,111,18,0,2,111,58, 0,2,111,96,0,2,111,138,0,2,111,166,0,2,111,200, 0,2,111,236,0,2,112,22,0,2,112,58,0,2,112,100, 0,2,112,136,0,2,112,178,0,2,112,210,0,2,112,246, 0,2,113,30,0,2,113,74,0,2,113,114,0,2,113,158, 0,2,113,198,0,2,113,242,0,2,114,18,0,2,114,54, 0,2,114,92,0,2,114,136,0,2,114,174,0,2,114,218, 0,2,115,2,0,2,115,46,0,2,115,78,0,2,115,114, 0,2,115,154,0,2,115,196,0,2,115,236,0,2,116,22, 0,2,116,62,0,2,116,106,0,2,116,128,0,2,116,150, 0,2,116,180,0,2,116,202,0,2,116,230,0,2,116,252, 0,2,117,24,0,2,117,48,0,2,117,72,0,2,117,94, 0,2,117,116,0,2,117,140,0,2,117,158,0,2,117,176, 0,2,117,192,0,2,117,210,0,2,117,234,0,2,118,8, 0,2,118,30,0,2,118,58,0,2,118,80,0,2,118,110, 0,2,118,134,0,2,118,158,0,2,118,182,0,2,118,206, 0,2,118,230,0,2,118,254,0,2,119,22,0,2,119,46, 0,2,119,68,0,2,119,90,0,2,119,120,0,2,119,150, 0,2,119,172,0,2,119,202,0,2,119,226,0,2,119,250, 0,2,120,18,0,2,120,42,0,2,120,72,0,2,120,102, 0,2,120,132,0,2,120,154,0,2,120,176,0,2,120,206, 0,2,120,236,0,2,121,2,0,2,121,30,0,2,121,52, 0,2,121,82,0,2,121,106,0,2,121,130,0,2,121,154, 0,2,121,178,0,2,121,206,0,2,121,230,0,2,121,254, 0,2,122,14,0,2,122,46,0,2,122,70,0,2,122,102, 0,2,122,126,0,2,122,158,0,2,122,182,0,2,122,206, 0,2,122,230,0,2,122,254,0,2,123,22,0,2,123,38, 0,2,123,60,0,2,123,86,0,2,123,112,0,2,123,138, 0,2,123,184,0,2,123,230,0,2,124,20,0,2,124,66, 0,2,124,146,0,2,124,224,0,2,125,44,0,2,125,122, 0,2,125,166,0,2,125,226,0,2,126,26,0,2,126,54, 0,2,126,100,0,2,127,134,0,2,129,4,0,2,129,38, 0,2,129,92,0,2,129,168,0,2,129,202,0,2,130,0, 0,2,130,76,0,2,130,108,0,2,130,142,0,2,131,106, 0,2,131,184,0,2,132,54,0,2,132,82,0,2,132,106, 0,2,133,8,0,2,133,162,0,2,133,226,0,2,134,46, 0,2,134,80,0,2,134,130,0,2,134,236,0,2,135,108, 0,2,135,160,0,2,136,74,0,2,136,210,0,2,136,228, 0,2,136,246,0,2,137,8,0,2,137,26,0,2,137,44, 0,2,137,62,0,2,137,80,0,2,137,98,0,2,137,116, 0,2,137,134,0,2,138,150,0,2,139,150,0,2,140,22, 0,2,140,164,0,2,142,42,0,2,143,214,0,2,144,214, 0,2,146,96,0,2,147,144,0,2,148,36,0,2,149,216, 0,2,151,224,0,2,152,46,0,2,152,62,0,2,152,184, 0,2,154,54,0,2,154,70,0,2,154,86,0,2,156,22, 0,2,157,218,0,2,159,60,0,2,159,200,0,2,159,242, 0,2,161,88,0,2,161,120,0,2,161,152,0,2,161,184, 0,2,161,216,0,2,161,248,0,2,162,24,0,2,162,56, 0,2,162,88,0,2,162,120,0,2,162,152,0,2,162,184, 0,2,162,216,0,2,162,240,0,2,163,0,0,2,163,24, 0,2,163,56,0,2,163,80,0,2,163,96,0,2,163,120, 0,2,163,152,0,2,163,192,0,2,163,216,0,2,163,232, 0,2,164,0,0,2,164,32,0,2,164,48,0,2,164,64, 0,2,164,80,0,2,164,96,0,2,164,112,0,2,164,136, 0,2,164,168,0,2,164,192,0,2,164,208,0,2,164,232, 0,2,165,8,0,2,165,48,0,2,165,72,0,2,165,88, 0,2,165,112,0,2,165,144,0,2,165,160,0,2,165,176, 0,2,165,192,0,2,165,208,0,2,166,6,0,2,166,58, 0,2,166,110,0,2,166,164,0,2,167,32,0,2,167,158, 0,2,167,198,0,2,168,16,0,2,168,90,0,2,168,164, 0,2,168,238,0,2,169,96,0,2,169,118,0,2,170,20, 0,2,170,68,0,2,170,176,0,2,170,218,0,2,170,240, 0,2,171,60,0,2,171,192,0,2,171,230,0,2,171,252, 0,2,172,52,0,2,172,78,0,2,172,132,0,2,173,210, 0,2,173,254,0,2,174,226,0,2,175,218,0,2,175,254, 0,2,176,32,0,2,176,70,0,2,176,150,0,2,176,232, 0,2,177,64,0,2,177,230,0,2,178,216,0,2,179,48, 0,2,179,192,0,2,180,46,0,2,180,134,0,2,181,4, 0,2,181,56,0,2,181,106,0,2,181,248,0,2,182,56, 0,2,182,104,0,2,182,154,0,2,183,52,0,2,183,192, 0,2,184,100,0,2,184,136,0,2,185,28,0,2,185,82, 0,2,185,170,0,2,185,220,0,2,186,64,0,2,187,4, 0,2,187,142,0,2,188,38,0,2,188,150,0,2,188,250, 0,2,189,52,0,2,189,110,0,2,189,198,0,2,190,28, 0,2,190,74,0,2,190,120,0,2,190,174,0,2,190,230, 0,2,191,94,0,2,191,232,0,2,193,0,0,2,194,34, 0,2,194,152,0,2,195,18,0,2,195,172,0,2,196,76, 0,2,197,2,0,2,197,182,0,2,199,4,0,2,200,90, 0,2,201,70,0,2,202,150,0,2,203,130,0,2,204,190, 0,2,205,62,0,2,205,252,0,2,206,152,0,2,207,116, 0,2,207,236,0,2,208,172,0,2,209,106,0,2,210,110, 0,2,210,238,0,2,211,176,0,2,212,130,0,2,213,174, 0,2,214,126,0,2,215,154,0,2,216,56,0,2,217,36, 0,2,217,240,0,2,219,0,0,2,219,208,0,2,220,224, 0,2,221,110,0,2,221,254,0,2,222,214,0,2,223,70, 0,2,223,236,0,2,224,102,0,2,225,32,0,2,226,54, 0,2,226,198,0,2,228,10,0,2,229,56,0,2,229,246, 0,2,230,246,0,2,232,64,0,2,233,142,0,2,234,40, 0,2,235,10,0,2,235,254,0,2,236,206,0,2,237,228, 0,2,239,20,0,2,239,122,0,2,240,56,0,2,241,6, 0,2,242,24,0,2,243,112,0,2,244,206,0,2,245,220, 0,2,246,188,0,2,248,4,0,2,249,10,0,2,249,242, 0,2,250,190,0,2,251,132,0,2,252,108,0,2,253,102, 0,2,254,24,0,2,254,236,0,2,255,160,0,3,0,76, 0,3,1,54,0,3,2,38,0,3,2,192,0,3,3,136, 0,3,4,64,0,3,5,118,0,3,6,246,0,3,7,252, 0,3,8,164,0,3,8,242,0,3,9,2,0,3,9,106, 0,3,9,230,0,3,10,50,0,3,10,126,0,3,10,216, 0,3,11,46,0,3,11,92,0,3,11,140,0,3,12,62, 0,3,12,232,0,3,13,130,0,3,14,84,0,3,14,166, 0,3,15,64,0,3,15,194,0,3,16,134,0,3,16,252, 0,3,17,184,0,3,17,222,0,3,18,70,0,3,18,166, 0,3,19,76,0,3,19,212,0,3,20,164,0,3,21,36, 0,3,21,230,0,3,22,118,0,3,23,78,0,3,23,178, 0,3,24,86,0,3,24,230,0,3,25,204,0,3,26,68, 0,3,26,254,0,3,27,110,0,3,27,220,0,3,28,150, 0,3,28,238,0,3,29,136,0,3,29,204,0,3,30,80, 0,3,30,188,0,3,30,226,0,3,31,80,0,3,31,212, 0,3,32,26,0,3,32,108,0,3,33,20,0,3,33,208, 0,3,34,54,0,3,34,228,0,3,35,168,0,3,35,246, 0,3,36,136,0,3,37,40,0,3,37,130,0,3,38,30, 0,3,38,212,0,3,39,82,0,3,40,16,0,3,40,232, 0,3,41,58,0,3,41,194,0,3,42,30,0,3,42,124, 0,3,42,242,0,3,43,68,0,3,43,150,0,3,43,192, 0,3,43,234,0,3,44,26,0,3,44,74,0,3,44,164, 0,3,44,252,0,3,45,102,0,3,45,168,0,3,45,218, 0,3,46,38,0,3,46,118,0,3,46,196,0,3,47,6, 0,3,47,84,0,3,47,186,0,3,48,82,0,3,48,238, 0,3,49,98,0,3,49,120,0,3,49,142,0,3,49,164, 0,3,49,186,0,3,49,202,0,3,49,220,0,3,50,34, 0,3,50,56,0,3,50,72,0,3,50,88,0,3,50,104, 0,3,50,120,0,3,50,136,0,3,50,152,0,3,50,168, 0,3,50,184,0,3,50,200,0,3,50,254,0,3,51,42, 0,3,51,58,0,3,51,178,0,3,52,12,0,3,52,94, 0,3,52,238,0,3,53,116,0,3,53,236,0,3,54,182, 0,3,54,220,0,3,55,46,0,3,55,98,0,3,55,180, 0,3,56,48,0,3,56,86,0,3,56,196,0,3,57,86, 0,3,57,180,0,3,58,4,0,3,58,98,0,3,58,242, 0,3,59,20,0,3,59,212,0,3,60,148,0,3,61,94, 0,3,62,42,0,3,62,176,0,3,63,62,0,3,63,196, 0,3,64,46,0,3,64,150,0,3,64,200,0,3,65,64, 0,3,65,100,0,3,65,148,0,3,66,114,0,3,66,152, 0,3,67,0,0,3,67,152,0,3,67,252,0,3,68,90, 0,3,68,174,0,3,69,138,0,3,70,28,0,3,70,210, 0,3,71,66,0,3,71,160,0,3,72,8,0,3,72,198, 0,3,73,96,0,3,73,132,0,3,73,238,0,3,74,134, 0,3,75,60,0,3,75,138,0,3,76,16,0,1,0,0, 8,127,0,218,0,18,0,77,0,7,0,2,0,0,0,1, 0,1,0,0,0,64,0,46,0,4,0,2,0,0,0,34, 1,158,0,0,0,3,0,0,0,0,0,90,0,0,0,0, 0,3,0,0,0,1,0,16,0,92,0,0,0,3,0,0, 0,2,0,12,0,110,0,0,0,3,0,0,0,3,0,68, 0,124,0,0,0,3,0,0,0,4,0,18,0,194,0,0, 0,3,0,0,0,5,0,52,0,214,0,0,0,3,0,0, 0,6,0,16,1,12,0,0,0,3,0,0,0,13,0,140, 1,30,0,0,0,3,0,0,0,14,0,72,1,172,0,0, 0,3,0,0,0,19,0,88,1,246,0,1,0,0,0,0, 0,0,0,45,2,80,0,1,0,0,0,0,0,1,0,8, 2,126,0,1,0,0,0,0,0,2,0,6,2,135,0,1, 0,0,0,0,0,3,0,34,2,142,0,1,0,0,0,0, 0,4,0,9,2,177,0,1,0,0,0,0,0,5,0,26, 2,187,0,1,0,0,0,0,0,6,0,8,2,214,0,1, 0,0,0,0,0,13,0,70,2,223,0,1,0,0,0,0, 0,14,0,36,3,38,0,1,0,0,0,0,0,19,0,44, 3,75,0,3,0,1,4,9,0,0,0,90,0,0,0,3, 0,1,4,9,0,1,0,16,0,92,0,3,0,1,4,9, 0,2,0,12,0,110,0,3,0,1,4,9,0,3,0,68, 0,124,0,3,0,1,4,9,0,4,0,18,0,194,0,3, 0,1,4,9,0,5,0,52,0,214,0,3,0,1,4,9, 0,6,0,16,1,12,0,3,0,1,4,9,0,13,0,140, 1,30,0,3,0,1,4,9,0,14,0,72,1,172,0,3, 0,1,4,9,0,19,0,88,1,246,0,3,0,1,4,36, 0,2,0,14,3,120,0,3,0,1,4,36,0,13,0,134, 3,136,0,3,0,1,4,36,0,14,0,72,4,16,0,3, 0,1,4,36,0,19,0,84,4,90,0,67,0,111,0,112, 0,121,0,108,0,101,0,102,0,116,0,32,0,50,0,48, 0,48,0,50,0,44,0,32,0,50,0,48,0,48,0,51, 0,32,0,70,0,114,0,101,0,101,0,32,0,83,0,111, 0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,70, 0,111,0,117,0,110,0,100,0,97,0,116,0,105,0,111, 0,110,0,46,0,0,0,70,0,114,0,101,0,101,0,83, 0,97,0,110,0,115,0,0,0,77,0,101,0,100,0,105, 0,117,0,109,0,0,0,80,0,102,0,97,0,69,0,100, 0,105,0,116,0,32,0,49,0,46,0,48,0,32,0,58, 0,32,0,70,0,114,0,101,0,101,0,32,0,83,0,97, 0,110,0,115,0,32,0,58,0,32,0,56,0,45,0,57, 0,45,0,50,0,48,0,48,0,51,0,0,0,70,0,114, 0,101,0,101,0,32,0,83,0,97,0,110,0,115,0,0, 0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32, 0,36,0,82,0,101,0,118,0,105,0,115,0,105,0,111, 0,110,0,58,0,32,0,49,0,46,0,50,0,55,0,32, 0,36,0,32,0,0,0,70,0,114,0,101,0,101,0,83, 0,97,0,110,0,115,0,0,0,84,0,104,0,101,0,32, 0,117,0,115,0,101,0,32,0,111,0,102,0,32,0,116, 0,104,0,105,0,115,0,32,0,102,0,111,0,110,0,116, 0,32,0,105,0,115,0,32,0,103,0,114,0,97,0,110, 0,116,0,101,0,100,0,32,0,115,0,117,0,98,0,106, 0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,71, 0,78,0,85,0,32,0,71,0,101,0,110,0,101,0,114, 0,97,0,108,0,32,0,80,0,117,0,98,0,108,0,105, 0,99,0,32,0,76,0,105,0,99,0,101,0,110,0,115, 0,101,0,46,0,0,0,104,0,116,0,116,0,112,0,58, 0,47,0,47,0,119,0,119,0,119,0,46,0,103,0,110, 0,117,0,46,0,111,0,114,0,103,0,47,0,99,0,111, 0,112,0,121,0,108,0,101,0,102,0,116,0,47,0,103, 0,112,0,108,0,46,0,104,0,116,0,109,0,108,0,0, 0,84,0,104,0,101,0,32,0,113,0,117,0,105,0,99, 0,107,0,32,0,98,0,114,0,111,0,119,0,110,0,32, 0,102,0,111,0,120,0,32,0,106,0,117,0,109,0,112, 0,115,0,32,0,111,0,118,0,101,0,114,0,32,0,116, 0,104,0,101,0,32,0,108,0,97,0,122,0,121,0,32, 0,100,0,111,0,103,0,46,0,0,67,111,112,121,108,101, 102,116,32,50,48,48,50,44,32,50,48,48,51,32,70,114, 101,101,32,83,111,102,116,119,97,114,101,32,70,111,117,110, 100,97,116,105,111,110,46,0,70,114,101,101,83,97,110,115, 0,77,101,100,105,117,109,0,80,102,97,69,100,105,116,32, 49,46,48,32,58,32,70,114,101,101,32,83,97,110,115,32, 58,32,56,45,57,45,50,48,48,51,0,70,114,101,101,32, 83,97,110,115,0,86,101,114,115,105,111,110,32,36,82,101, 118,105,115,105,111,110,58,32,49,46,50,55,32,36,32,0, 70,114,101,101,83,97,110,115,0,84,104,101,32,117,115,101, 32,111,102,32,116,104,105,115,32,102,111,110,116,32,105,115, 32,103,114,97,110,116,101,100,32,115,117,98,106,101,99,116, 32,116,111,32,71,78,85,32,71,101,110,101,114,97,108,32, 80,117,98,108,105,99,32,76,105,99,101,110,115,101,46,0, 104,116,116,112,58,47,47,119,119,119,46,103,110,117,46,111, 114,103,47,99,111,112,121,108,101,102,116,47,103,112,108,46, 104,116,109,108,0,84,104,101,32,113,117,105,99,107,32,98, 114,111,119,110,32,102,111,120,32,106,117,109,112,115,32,111, 118,101,114,32,116,104,101,32,108,97,122,121,32,100,111,103, 46,0,0,110,0,97,0,118,0,97,0,100,0,110,0,111, 0,0,0,68,0,111,0,118,0,111,0,108,0,106,0,101, 0,110,0,97,0,32,0,106,0,101,0,32,0,117,0,112, 0,111,0,114,0,97,0,98,0,97,0,32,0,118,0,32, 0,115,0,107,0,108,0,97,0,100,0,117,0,32,0,122, 0,32,0,108,0,105,0,99,0,101,0,110,0,99,0,111, 0,32,0,71,0,78,0,85,0,32,0,71,0,101,0,110, 0,101,0,114,0,97,0,108,0,32,0,80,0,117,0,98, 0,108,0,105,0,99,0,32,0,76,0,105,0,99,0,101, 0,110,0,115,0,101,0,46,0,0,0,104,0,116,0,116, 0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,46, 0,103,0,110,0,117,0,46,0,111,0,114,0,103,0,47, 0,99,0,111,0,112,0,121,0,108,0,101,0,102,0,116, 0,47,0,103,0,112,0,108,0,46,0,104,0,116,0,109, 0,108,0,0,1,96,0,101,0,114,0,105,0,102,0,32, 0,98,0,111,0,32,0,122,0,97,0,32,0,118,0,97, 0,106,0,111,0,32,0,115,0,112,0,101,0,116,0,32, 0,107,0,117,0,104,0,97,0,108,0,32,0,100,0,111, 0,109,0,97,1,13,0,101,0,32,1,126,0,103,0,97, 0,110,0,99,0,101,0,46,0,0,0,0,0,2,0,0, 0,0,0,0,255,105,0,50,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,8,127,0,0, 0,1,0,2,1,2,1,3,1,4,1,5,1,6,1,7, 1,8,1,9,1,10,1,11,1,12,1,13,1,14,1,15, 1,16,1,17,1,18,1,19,1,20,1,21,1,22,1,23, 1,24,1,25,1,26,1,27,1,28,1,29,1,30,1,31, 1,32,1,33,1,34,1,35,1,36,1,37,1,38,1,39, 1,40,1,41,1,42,1,43,1,44,1,45,1,46,1,47, 1,48,1,49,1,50,1,51,1,52,1,53,1,54,1,55, 1,56,1,57,1,58,1,59,1,60,1,61,1,62,1,63, 1,64,1,65,1,66,1,67,1,68,1,69,1,70,1,71, 1,72,1,73,1,74,1,75,1,76,1,77,1,78,1,79, 1,80,1,81,1,82,1,83,1,84,1,85,1,86,1,87, 1,88,1,89,1,90,1,91,1,92,1,93,1,94,1,95, 1,96,0,172,0,163,0,132,0,133,0,189,0,150,0,232, 0,134,0,142,0,139,0,157,0,169,0,164,1,97,0,138, 0,218,0,131,0,147,0,242,0,243,0,141,0,151,0,136, 0,195,0,222,0,241,0,158,0,170,0,245,0,244,0,246, 0,162,0,173,0,201,0,199,0,174,0,98,0,99,0,144, 0,100,0,203,0,101,0,200,0,202,0,207,0,204,0,205, 0,206,0,233,0,102,0,211,0,208,0,209,0,175,0,103, 0,240,0,145,0,214,0,212,0,213,0,104,0,235,0,237, 0,137,0,106,0,105,0,107,0,109,0,108,0,110,0,160, 0,111,0,113,0,112,0,114,0,115,0,117,0,116,0,118, 0,119,0,234,0,120,0,122,0,121,0,123,0,125,0,124, 0,184,0,161,0,127,0,126,0,128,0,129,0,236,0,238, 0,186,1,98,1,99,1,100,1,101,1,102,1,103,0,253, 0,254,1,104,1,105,1,106,1,107,0,255,1,0,1,108, 1,109,1,110,1,1,1,111,1,112,1,113,1,114,1,115, 1,116,1,117,1,118,1,119,1,120,1,121,1,122,0,248, 0,249,1,123,1,124,1,125,1,126,1,127,1,128,1,129, 1,130,1,131,1,132,1,133,1,134,1,135,1,136,1,137, 1,138,0,250,0,215,1,139,1,140,1,141,1,142,1,143, 1,144,1,145,1,146,1,147,1,148,1,149,1,150,1,151, 1,152,1,153,0,226,0,227,1,154,1,155,1,156,1,157, 1,158,1,159,1,160,1,161,1,162,1,163,1,164,1,165, 1,166,1,167,1,168,0,176,0,177,1,169,1,170,1,171, 1,172,1,173,1,174,1,175,1,176,1,177,1,178,0,251, 0,252,0,228,0,229,1,179,1,180,1,181,1,182,1,183, 1,184,1,185,1,186,1,187,1,188,1,189,1,190,1,191, 1,192,1,193,1,194,1,195,1,196,1,197,1,198,1,199, 1,200,0,187,1,201,1,202,1,203,1,204,0,230,0,231, 1,205,1,206,1,207,1,208,1,209,1,210,1,211,1,212, 1,213,1,214,1,215,1,216,1,217,1,218,1,219,1,220, 0,166,1,221,1,222,1,223,1,224,1,225,1,226,1,227, 1,228,1,229,1,230,1,231,1,232,1,233,1,234,1,235, 1,236,1,237,1,238,1,239,1,240,1,241,1,242,1,243, 1,244,1,245,1,246,1,247,1,248,1,249,1,250,1,251, 1,252,1,253,1,254,1,255,2,0,2,1,2,2,2,3, 2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11, 2,12,2,13,2,14,2,15,2,16,2,17,2,18,2,19, 2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27, 2,28,2,29,2,30,2,31,2,32,2,33,2,34,2,35, 2,36,2,37,2,38,2,39,2,40,2,41,2,42,2,43, 2,44,2,45,2,46,2,47,2,48,2,49,2,50,2,51, 2,52,2,53,2,54,2,55,2,56,2,57,2,58,2,59, 2,60,2,61,2,62,2,63,2,64,2,65,2,66,2,67, 2,68,2,69,2,70,2,71,2,72,2,73,2,74,2,75, 2,76,2,77,2,78,2,79,2,80,2,81,2,82,2,83, 2,84,2,85,2,86,2,87,2,88,2,89,2,90,2,91, 2,92,2,93,2,94,2,95,2,96,2,97,2,98,2,99, 2,100,2,101,2,102,2,103,2,104,2,105,2,106,2,107, 2,108,2,109,2,110,2,111,2,112,2,113,2,114,2,115, 2,116,2,117,2,118,2,119,2,120,2,121,0,216,0,225, 2,122,2,123,0,219,0,220,0,221,0,224,0,217,0,223, 2,124,2,125,2,126,2,127,2,128,2,129,2,130,2,131, 2,132,2,133,2,134,2,135,2,136,2,137,2,138,2,139, 2,140,2,141,2,142,2,143,2,144,2,145,2,146,2,147, 2,148,2,149,2,150,2,151,2,152,2,153,2,154,2,155, 2,156,2,157,2,158,2,159,2,160,2,161,2,162,2,163, 2,164,2,165,2,166,2,167,2,168,2,169,2,170,2,171, 2,172,2,173,2,174,2,175,2,176,2,177,2,178,2,179, 2,180,2,181,2,182,2,183,2,184,2,185,2,186,2,187, 2,188,2,189,2,190,2,191,2,192,2,193,2,194,2,195, 2,196,2,197,2,198,2,199,2,200,2,201,2,202,2,203, 0,155,2,204,2,205,2,206,2,207,2,208,2,209,2,210, 2,211,2,212,2,213,2,214,2,215,2,216,2,217,2,218, 2,219,2,220,2,221,2,222,2,223,2,224,2,225,2,226, 2,227,2,228,2,229,2,230,2,231,2,232,2,233,2,234, 2,235,2,236,2,237,2,238,2,239,2,240,2,241,2,242, 2,243,2,244,2,245,2,246,2,247,2,248,2,249,2,250, 2,251,2,252,2,253,2,254,2,255,3,0,3,1,3,2, 3,3,3,4,3,5,3,6,3,7,3,8,3,9,3,10, 3,11,3,12,3,13,3,14,3,15,3,16,3,17,3,18, 3,19,3,20,3,21,3,22,3,23,3,24,3,25,3,26, 3,27,3,28,3,29,3,30,3,31,3,32,3,33,3,34, 3,35,3,36,3,37,3,38,3,39,3,40,3,41,3,42, 3,43,3,44,3,45,3,46,3,47,3,48,3,49,3,50, 3,51,3,52,3,53,3,54,3,55,3,56,3,57,3,58, 3,59,3,60,3,61,3,62,3,63,3,64,3,65,3,66, 3,67,3,68,3,69,3,70,3,71,3,72,3,73,3,74, 3,75,3,76,3,77,3,78,3,79,3,80,3,81,3,82, 3,83,3,84,3,85,3,86,3,87,3,88,3,89,3,90, 3,91,3,92,3,93,3,94,3,95,3,96,3,97,3,98, 3,99,3,100,3,101,3,102,3,103,3,104,3,105,3,106, 3,107,3,108,3,109,3,110,3,111,3,112,3,113,3,114, 3,115,3,116,3,117,3,118,3,119,3,120,3,121,3,122, 3,123,3,124,3,125,3,126,3,127,3,128,3,129,3,130, 3,131,3,132,3,133,3,134,3,135,3,136,3,137,3,138, 3,139,3,140,3,141,3,142,3,143,3,144,3,145,3,146, 3,147,3,148,3,149,3,150,3,151,3,152,3,153,3,154, 3,155,3,156,3,157,3,158,3,159,3,160,3,161,3,162, 3,163,3,164,3,165,3,166,3,167,3,168,3,169,3,170, 3,171,3,172,3,173,3,174,3,175,3,176,3,177,3,178, 3,179,3,180,3,181,3,182,3,183,3,184,3,185,3,186, 3,187,3,188,3,189,3,190,3,191,3,192,3,193,3,194, 3,195,3,196,3,197,3,198,3,199,3,200,3,201,3,202, 3,203,3,204,3,205,3,206,3,207,3,208,3,209,3,210, 3,211,3,212,3,213,3,214,3,215,3,216,3,217,3,218, 3,219,3,220,3,221,3,222,3,223,3,224,3,225,3,226, 3,227,3,228,3,229,3,230,3,231,3,232,3,233,3,234, 3,235,3,236,3,237,3,238,3,239,3,240,3,241,3,242, 3,243,3,244,3,245,3,246,3,247,3,248,3,249,3,250, 3,251,3,252,3,253,3,254,3,255,4,0,4,1,4,2, 4,3,4,4,4,5,4,6,4,7,4,8,4,9,4,10, 4,11,4,12,4,13,4,14,4,15,4,16,4,17,4,18, 4,19,4,20,4,21,4,22,4,23,4,24,4,25,4,26, 4,27,4,28,4,29,4,30,4,31,4,32,4,33,4,34, 4,35,4,36,4,37,4,38,4,39,4,40,4,41,4,42, 4,43,4,44,4,45,4,46,4,47,4,48,4,49,4,50, 4,51,4,52,4,53,4,54,4,55,4,56,4,57,4,58, 4,59,4,60,4,61,4,62,4,63,4,64,4,65,4,66, 4,67,4,68,4,69,4,70,4,71,4,72,4,73,4,74, 4,75,4,76,4,77,4,78,4,79,4,80,4,81,4,82, 4,83,4,84,4,85,4,86,4,87,4,88,4,89,4,90, 4,91,4,92,4,93,4,94,4,95,4,96,4,97,4,98, 4,99,4,100,4,101,4,102,4,103,4,104,4,105,4,106, 4,107,4,108,4,109,4,110,4,111,4,112,4,113,4,114, 4,115,4,116,4,117,4,118,4,119,4,120,4,121,4,122, 4,123,4,124,4,125,4,126,4,127,4,128,4,129,4,130, 4,131,4,132,4,133,4,134,4,135,4,136,4,137,4,138, 4,139,4,140,4,141,4,142,4,143,4,144,4,145,4,146, 4,147,4,148,4,149,4,150,4,151,4,152,4,153,4,154, 4,155,4,156,4,157,4,158,4,159,4,160,4,161,4,162, 4,163,4,164,4,165,4,166,4,167,4,168,4,169,4,170, 4,171,4,172,4,173,4,174,4,175,4,176,4,177,4,178, 4,179,4,180,4,181,4,182,4,183,4,184,4,185,4,186, 4,187,4,188,4,189,4,190,4,191,4,192,4,193,4,194, 4,195,4,196,4,197,4,198,4,199,4,200,4,201,4,202, 4,203,4,204,4,205,4,206,4,207,4,208,4,209,4,210, 4,211,4,212,4,213,4,214,4,215,4,216,4,217,4,218, 4,219,4,220,4,221,4,222,4,223,4,224,4,225,4,226, 4,227,4,228,4,229,4,230,4,231,4,232,4,233,4,234, 4,235,4,236,4,237,4,238,4,239,4,240,4,241,4,242, 4,243,4,244,4,245,4,246,4,247,4,248,4,249,4,250, 4,251,4,252,4,253,4,254,4,255,5,0,5,1,5,2, 5,3,5,4,5,5,5,6,5,7,5,8,5,9,5,10, 5,11,5,12,5,13,5,14,5,15,5,16,5,17,5,18, 5,19,5,20,5,21,5,22,5,23,5,24,5,25,5,26, 5,27,5,28,5,29,5,30,5,31,5,32,5,33,5,34, 5,35,5,36,5,37,5,38,5,39,5,40,5,41,5,42, 5,43,5,44,5,45,5,46,5,47,5,48,5,49,5,50, 5,51,5,52,5,53,5,54,5,55,5,56,5,57,5,58, 5,59,5,60,5,61,5,62,5,63,5,64,5,65,5,66, 5,67,5,68,5,69,5,70,5,71,5,72,5,73,5,74, 5,75,5,76,5,77,5,78,5,79,5,80,5,81,5,82, 5,83,5,84,5,85,5,86,5,87,5,88,5,89,5,90, 5,91,5,92,5,93,5,94,5,95,5,96,5,97,5,98, 5,99,5,100,5,101,5,102,5,103,5,104,5,105,5,106, 5,107,5,108,5,109,5,110,5,111,5,112,5,113,5,114, 5,115,5,116,5,117,5,118,5,119,5,120,5,121,5,122, 5,123,5,124,5,125,5,126,5,127,5,128,5,129,5,130, 5,131,5,132,5,133,5,134,5,135,5,136,5,137,5,138, 5,139,5,140,5,141,5,142,5,143,5,144,5,145,5,146, 5,147,5,148,5,149,5,150,5,151,5,152,5,153,5,154, 5,155,5,156,5,157,5,158,5,159,5,160,5,161,5,162, 5,163,5,164,5,165,5,166,5,167,5,168,5,169,5,170, 5,171,5,172,5,173,5,174,5,175,5,176,5,177,5,178, 5,179,5,180,5,181,5,182,5,183,5,184,5,185,5,186, 5,187,5,188,5,189,5,190,5,191,5,192,5,193,5,194, 5,195,5,196,5,197,5,198,5,199,5,200,5,201,5,202, 5,203,5,204,5,205,5,206,5,207,5,208,5,209,5,210, 5,211,5,212,5,213,5,214,5,215,5,216,5,217,5,218, 5,219,5,220,5,221,5,222,5,223,5,224,5,225,5,226, 5,227,5,228,5,229,5,230,5,231,5,232,5,233,5,234, 5,235,5,236,5,237,5,238,5,239,5,240,5,241,5,242, 5,243,5,244,5,245,5,246,5,247,5,248,5,249,5,250, 5,251,5,252,5,253,5,254,5,255,6,0,6,1,6,2, 6,3,6,4,6,5,6,6,6,7,6,8,6,9,6,10, 6,11,6,12,6,13,6,14,6,15,6,16,6,17,6,18, 6,19,6,20,6,21,6,22,6,23,6,24,6,25,6,26, 6,27,6,28,6,29,6,30,6,31,6,32,6,33,6,34, 6,35,6,36,6,37,6,38,6,39,6,40,6,41,6,42, 6,43,6,44,6,45,6,46,6,47,6,48,6,49,6,50, 6,51,6,52,6,53,6,54,6,55,6,56,6,57,6,58, 6,59,6,60,6,61,6,62,6,63,6,64,6,65,6,66, 6,67,6,68,6,69,6,70,6,71,6,72,6,73,6,74, 6,75,6,76,6,77,6,78,6,79,6,80,6,81,6,82, 6,83,6,84,6,85,6,86,6,87,6,88,6,89,6,90, 6,91,6,92,6,93,6,94,6,95,6,96,6,97,6,98, 6,99,6,100,6,101,6,102,6,103,6,104,6,105,6,106, 6,107,6,108,6,109,6,110,6,111,6,112,6,113,6,114, 6,115,6,116,6,117,6,118,6,119,6,120,6,121,6,122, 6,123,6,124,6,125,6,126,6,127,6,128,6,129,6,130, 6,131,6,132,6,133,6,134,6,135,6,136,6,137,6,138, 6,139,6,140,6,141,6,142,6,143,6,144,6,145,6,146, 6,147,6,148,6,149,6,150,6,151,6,152,6,153,6,154, 6,155,6,156,6,157,6,158,6,159,6,160,6,161,6,162, 6,163,6,164,6,165,6,166,6,167,6,168,6,169,6,170, 6,171,6,172,6,173,6,174,6,175,6,176,6,177,6,178, 6,179,6,180,6,181,6,182,6,183,6,184,6,185,6,186, 6,187,6,188,6,189,6,190,6,191,6,192,6,193,6,194, 6,195,6,196,6,197,6,198,6,199,6,200,6,201,6,202, 6,203,6,204,6,205,6,206,6,207,6,208,6,209,6,210, 6,211,6,212,6,213,6,214,6,215,6,216,6,217,6,218, 6,219,6,220,6,221,6,222,6,223,6,224,6,225,6,226, 6,227,6,228,6,229,6,230,6,231,6,232,6,233,6,234, 6,235,6,236,6,237,6,238,6,239,6,240,6,241,6,242, 6,243,6,244,6,245,6,246,6,247,6,248,6,249,6,250, 6,251,6,252,6,253,6,254,6,255,7,0,7,1,7,2, 7,3,7,4,7,5,7,6,7,7,7,8,7,9,7,10, 7,11,7,12,7,13,7,14,7,15,7,16,7,17,7,18, 7,19,7,20,7,21,7,22,7,23,7,24,7,25,7,26, 7,27,7,28,7,29,7,30,7,31,7,32,7,33,7,34, 7,35,7,36,7,37,7,38,7,39,7,40,7,41,7,42, 7,43,7,44,7,45,7,46,7,47,7,48,7,49,7,50, 7,51,7,52,7,53,7,54,7,55,7,56,7,57,7,58, 7,59,7,60,7,61,7,62,7,63,7,64,7,65,7,66, 7,67,7,68,7,69,7,70,7,71,7,72,7,73,7,74, 7,75,0,178,0,179,0,182,0,183,0,196,7,76,0,180, 0,181,0,197,7,77,0,130,0,194,0,135,7,78,0,171, 0,198,7,79,7,80,7,81,7,82,7,83,7,84,7,85, 0,190,0,191,7,86,7,87,7,88,0,188,7,89,7,90, 7,91,7,92,7,93,7,94,7,95,7,96,7,97,7,98, 7,99,7,100,7,101,7,102,7,103,7,104,7,105,7,106, 7,107,7,108,7,109,7,110,7,111,7,112,7,113,7,114, 7,115,7,116,7,117,7,118,7,119,7,120,7,121,7,122, 0,140,7,123,7,124,7,125,7,126,7,127,7,128,7,129, 7,130,7,131,7,132,7,133,7,134,7,135,7,136,7,137, 7,138,7,139,7,140,7,141,7,142,7,143,7,144,7,145, 7,146,7,147,7,148,7,149,7,150,7,151,7,152,7,153, 7,154,7,155,7,156,7,157,7,158,7,159,7,160,7,161, 7,162,7,163,7,164,7,165,7,166,7,167,7,168,7,169, 7,170,7,171,7,172,7,173,7,174,7,175,7,176,7,177, 7,178,7,179,7,180,7,181,7,182,7,183,7,184,7,185, 7,186,7,187,7,188,7,189,7,190,7,191,0,152,7,192, 7,193,0,168,7,194,7,195,7,196,0,154,7,197,0,153, 0,239,7,198,7,199,0,165,7,200,0,146,7,201,7,202, 7,203,7,204,7,205,0,156,7,206,7,207,7,208,7,209, 7,210,7,211,7,212,7,213,7,214,7,215,0,143,0,148, 0,149,7,216,7,217,7,218,7,219,7,220,0,185,7,221, 7,222,7,223,7,224,7,225,7,226,7,227,7,228,7,229, 7,230,7,231,7,232,7,233,7,234,7,235,7,236,7,237, 7,238,7,239,7,240,7,241,7,242,7,243,7,244,7,245, 7,246,7,247,7,248,7,249,7,250,7,251,7,252,7,253, 7,254,7,255,8,0,8,1,8,2,8,3,8,4,8,5, 8,6,8,7,8,8,8,9,8,10,8,11,8,12,8,13, 8,14,8,15,8,16,8,17,8,18,8,19,8,20,8,21, 8,22,8,23,8,24,8,25,8,26,8,27,8,28,8,29, 8,30,8,31,8,32,8,33,8,34,8,35,8,36,8,37, 8,38,8,39,8,40,8,41,8,42,8,43,8,44,8,45, 8,46,8,47,8,48,8,49,8,50,8,51,8,52,8,53, 8,54,8,55,8,56,8,57,8,58,8,59,8,60,8,61, 8,62,8,63,8,64,8,65,8,66,8,67,8,68,8,69, 8,70,8,71,8,72,8,73,8,74,8,75,8,76,8,77, 8,78,8,79,8,80,8,81,8,82,8,83,8,84,8,85, 8,86,8,87,8,88,8,89,8,90,8,91,8,92,8,93, 8,94,8,95,8,96,8,97,8,98,8,99,8,100,8,101, 8,102,8,103,8,104,8,105,8,106,8,107,8,108,8,109, 8,110,8,111,8,112,8,113,8,114,8,115,8,116,8,117, 8,118,8,119,8,120,8,121,8,122,8,123,8,124,8,125, 8,126,8,127,8,128,8,129,8,130,8,131,8,132,8,133, 8,134,8,135,8,136,8,137,8,138,8,139,8,140,8,141, 8,142,8,143,8,144,8,145,8,146,8,147,8,148,8,149, 8,150,8,151,8,152,8,153,8,154,8,155,8,156,8,157, 8,158,8,159,8,160,8,161,8,162,8,163,8,164,8,165, 8,166,8,167,8,168,8,169,8,170,8,171,8,172,8,173, 8,174,0,192,0,193,8,175,8,176,8,177,8,178,8,179, 8,180,8,181,8,182,8,183,8,184,8,185,8,186,8,187, 8,188,8,189,8,190,8,191,8,192,8,193,8,194,8,195, 8,196,8,197,8,198,8,199,8,200,8,201,8,202,8,203, 8,204,8,205,8,206,8,207,8,208,8,209,8,210,8,211, 8,212,8,213,8,214,8,215,8,216,8,217,8,218,8,219, 8,220,8,221,8,222,8,223,8,224,8,225,5,115,112,97, 99,101,6,101,120,99,108,97,109,8,113,117,111,116,101,100, 98,108,10,110,117,109,98,101,114,115,105,103,110,6,100,111, 108,108,97,114,7,112,101,114,99,101,110,116,9,97,109,112, 101,114,115,97,110,100,11,113,117,111,116,101,115,105,110,103, 108,101,9,112,97,114,101,110,108,101,102,116,10,112,97,114, 101,110,114,105,103,104,116,8,97,115,116,101,114,105,115,107, 4,112,108,117,115,5,99,111,109,109,97,6,104,121,112,104, 101,110,6,112,101,114,105,111,100,5,115,108,97,115,104,4, 122,101,114,111,3,111,110,101,3,116,119,111,5,116,104,114, 101,101,4,102,111,117,114,4,102,105,118,101,3,115,105,120, 5,115,101,118,101,110,5,101,105,103,104,116,4,110,105,110, 101,5,99,111,108,111,110,9,115,101,109,105,99,111,108,111, 110,4,108,101,115,115,5,101,113,117,97,108,7,103,114,101, 97,116,101,114,8,113,117,101,115,116,105,111,110,2,97,116, 1,65,1,66,1,67,1,68,1,69,1,70,1,71,1,72, 1,73,1,74,1,75,1,76,1,77,1,78,1,79,1,80, 1,81,1,82,1,83,1,84,1,85,1,86,1,87,1,88, 1,89,1,90,11,98,114,97,99,107,101,116,108,101,102,116, 9,98,97,99,107,115,108,97,115,104,12,98,114,97,99,107, 101,116,114,105,103,104,116,11,97,115,99,105,105,99,105,114, 99,117,109,10,117,110,100,101,114,115,99,111,114,101,5,103, 114,97,118,101,1,97,1,98,1,99,1,100,1,101,1,102, 1,103,1,104,1,105,1,106,1,107,1,108,1,109,1,110, 1,111,1,112,1,113,1,114,1,115,1,116,1,117,1,118, 1,119,1,120,1,121,1,122,9,98,114,97,99,101,108,101, 102,116,3,98,97,114,10,98,114,97,99,101,114,105,103,104, 116,10,97,115,99,105,105,116,105,108,100,101,10,115,111,102, 116,104,121,112,104,101,110,7,65,109,97,99,114,111,110,7, 97,109,97,99,114,111,110,6,65,98,114,101,118,101,6,97, 98,114,101,118,101,7,65,111,103,111,110,101,107,7,97,111, 103,111,110,101,107,11,67,99,105,114,99,117,109,102,108,101, 120,11,99,99,105,114,99,117,109,102,108,101,120,10,67,100, 111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99, 101,110,116,6,68,99,97,114,111,110,6,100,99,97,114,111, 110,6,68,99,114,111,97,116,7,69,109,97,99,114,111,110, 7,101,109,97,99,114,111,110,6,69,98,114,101,118,101,6, 101,98,114,101,118,101,10,69,100,111,116,97,99,99,101,110, 116,10,101,100,111,116,97,99,99,101,110,116,7,69,111,103, 111,110,101,107,7,101,111,103,111,110,101,107,6,69,99,97, 114,111,110,6,101,99,97,114,111,110,11,71,99,105,114,99, 117,109,102,108,101,120,11,103,99,105,114,99,117,109,102,108, 101,120,10,71,100,111,116,97,99,99,101,110,116,10,103,100, 111,116,97,99,99,101,110,116,12,71,99,111,109,109,97,97, 99,99,101,110,116,12,103,99,111,109,109,97,97,99,99,101, 110,116,11,72,99,105,114,99,117,109,102,108,101,120,11,104, 99,105,114,99,117,109,102,108,101,120,4,72,98,97,114,4, 104,98,97,114,6,73,116,105,108,100,101,6,105,116,105,108, 100,101,7,73,109,97,99,114,111,110,7,105,109,97,99,114, 111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101, 7,73,111,103,111,110,101,107,7,105,111,103,111,110,101,107, 2,73,74,2,105,106,11,74,99,105,114,99,117,109,102,108, 101,120,11,106,99,105,114,99,117,109,102,108,101,120,12,75, 99,111,109,109,97,97,99,99,101,110,116,12,107,99,111,109, 109,97,97,99,99,101,110,116,12,107,103,114,101,101,110,108, 97,110,100,105,99,6,76,97,99,117,116,101,6,108,97,99, 117,116,101,12,76,99,111,109,109,97,97,99,99,101,110,116, 12,108,99,111,109,109,97,97,99,99,101,110,116,6,76,99, 97,114,111,110,6,108,99,97,114,111,110,4,76,100,111,116, 4,108,100,111,116,6,78,97,99,117,116,101,6,110,97,99, 117,116,101,12,78,99,111,109,109,97,97,99,99,101,110,116, 12,110,99,111,109,109,97,97,99,99,101,110,116,6,78,99, 97,114,111,110,6,110,99,97,114,111,110,11,110,97,112,111, 115,116,114,111,112,104,101,3,69,110,103,3,101,110,103,7, 79,109,97,99,114,111,110,7,111,109,97,99,114,111,110,6, 79,98,114,101,118,101,6,111,98,114,101,118,101,13,79,104, 117,110,103,97,114,117,109,108,97,117,116,13,111,104,117,110, 103,97,114,117,109,108,97,117,116,6,82,97,99,117,116,101, 6,114,97,99,117,116,101,12,82,99,111,109,109,97,97,99, 99,101,110,116,12,114,99,111,109,109,97,97,99,99,101,110, 116,6,82,99,97,114,111,110,6,114,99,97,114,111,110,6, 83,97,99,117,116,101,6,115,97,99,117,116,101,11,83,99, 105,114,99,117,109,102,108,101,120,11,115,99,105,114,99,117, 109,102,108,101,120,7,117,110,105,48,49,54,50,7,117,110, 105,48,49,54,51,6,84,99,97,114,111,110,6,116,99,97, 114,111,110,4,84,98,97,114,4,116,98,97,114,6,85,116, 105,108,100,101,6,117,116,105,108,100,101,7,85,109,97,99, 114,111,110,7,117,109,97,99,114,111,110,6,85,98,114,101, 118,101,6,117,98,114,101,118,101,5,85,114,105,110,103,5, 117,114,105,110,103,13,85,104,117,110,103,97,114,117,109,108, 97,117,116,13,117,104,117,110,103,97,114,117,109,108,97,117, 116,7,85,111,103,111,110,101,107,7,117,111,103,111,110,101, 107,11,87,99,105,114,99,117,109,102,108,101,120,11,119,99, 105,114,99,117,109,102,108,101,120,11,89,99,105,114,99,117, 109,102,108,101,120,11,121,99,105,114,99,117,109,102,108,101, 120,6,90,97,99,117,116,101,6,122,97,99,117,116,101,10, 90,100,111,116,97,99,99,101,110,116,10,122,100,111,116,97, 99,99,101,110,116,5,108,111,110,103,115,7,117,110,105,48, 49,56,48,7,117,110,105,48,49,56,50,7,117,110,105,48, 49,56,51,7,117,110,105,48,49,56,52,7,117,110,105,48, 49,56,53,7,117,110,105,48,49,56,54,7,117,110,105,48, 49,56,55,7,117,110,105,48,49,56,56,7,117,110,105,48, 49,56,57,7,117,110,105,48,49,56,66,7,117,110,105,48, 49,56,67,7,117,110,105,48,49,56,69,7,117,110,105,48, 49,56,70,7,117,110,105,48,49,57,48,7,117,110,105,48, 49,57,49,7,117,110,105,48,49,57,51,7,117,110,105,48, 49,57,57,7,117,110,105,48,49,57,68,7,117,110,105,48, 49,57,69,7,117,110,105,48,49,57,70,7,117,110,105,48, 49,65,53,7,117,110,105,48,49,65,55,7,117,110,105,48, 49,65,56,7,117,110,105,48,49,65,57,7,117,110,105,48, 49,65,66,7,117,110,105,48,49,65,68,7,117,110,105,48, 49,65,69,7,117,110,105,48,49,67,52,7,117,110,105,48, 49,67,53,7,117,110,105,48,49,67,54,7,117,110,105,48, 49,67,55,7,117,110,105,48,49,67,56,7,117,110,105,48, 49,67,57,7,117,110,105,48,49,67,65,7,117,110,105,48, 49,67,66,7,117,110,105,48,49,67,67,7,117,110,105,48, 49,67,68,7,117,110,105,48,49,67,69,7,117,110,105,48, 49,67,70,7,117,110,105,48,49,68,48,7,117,110,105,48, 49,68,49,7,117,110,105,48,49,68,50,7,117,110,105,48, 49,68,51,7,117,110,105,48,49,68,52,7,117,110,105,48, 49,68,53,7,117,110,105,48,49,68,54,7,117,110,105,48, 49,68,55,7,117,110,105,48,49,68,56,7,117,110,105,48, 49,68,57,7,117,110,105,48,49,68,65,7,117,110,105,48, 49,68,66,7,117,110,105,48,49,68,67,7,117,110,105,48, 49,68,68,7,117,110,105,48,49,68,69,7,117,110,105,48, 49,68,70,7,117,110,105,48,49,69,48,7,117,110,105,48, 49,69,49,7,117,110,105,48,49,69,50,7,117,110,105,48, 49,69,51,6,71,99,97,114,111,110,6,103,99,97,114,111, 110,7,117,110,105,48,49,69,56,7,117,110,105,48,49,69, 57,7,117,110,105,48,49,69,65,7,117,110,105,48,49,69, 66,7,117,110,105,48,49,69,67,7,117,110,105,48,49,69, 68,7,117,110,105,48,49,70,48,7,117,110,105,48,49,70, 49,7,117,110,105,48,49,70,50,7,117,110,105,48,49,70, 51,7,117,110,105,48,49,70,52,7,117,110,105,48,49,70, 53,7,117,110,105,48,49,70,56,7,117,110,105,48,49,70, 57,10,65,114,105,110,103,97,99,117,116,101,10,97,114,105, 110,103,97,99,117,116,101,7,65,69,97,99,117,116,101,7, 97,101,97,99,117,116,101,11,79,115,108,97,115,104,97,99, 117,116,101,11,111,115,108,97,115,104,97,99,117,116,101,7, 117,110,105,48,50,48,48,7,117,110,105,48,50,48,49,7, 117,110,105,48,50,48,50,7,117,110,105,48,50,48,51,7, 117,110,105,48,50,48,52,7,117,110,105,48,50,48,53,7, 117,110,105,48,50,48,54,7,117,110,105,48,50,48,55,7, 117,110,105,48,50,48,56,7,117,110,105,48,50,48,57,7, 117,110,105,48,50,48,65,7,117,110,105,48,50,48,66,7, 117,110,105,48,50,48,67,7,117,110,105,48,50,48,68,7, 117,110,105,48,50,48,69,7,117,110,105,48,50,48,70,7, 117,110,105,48,50,49,48,7,117,110,105,48,50,49,49,7, 117,110,105,48,50,49,50,7,117,110,105,48,50,49,51,7, 117,110,105,48,50,49,52,7,117,110,105,48,50,49,53,7, 117,110,105,48,50,49,54,7,117,110,105,48,50,49,55,12, 83,99,111,109,109,97,97,99,99,101,110,116,12,115,99,111, 109,109,97,97,99,99,101,110,116,12,84,99,111,109,109,97, 97,99,99,101,110,116,12,116,99,111,109,109,97,97,99,99, 101,110,116,7,117,110,105,48,50,49,69,7,117,110,105,48, 50,49,70,7,117,110,105,48,50,50,54,7,117,110,105,48, 50,50,55,7,117,110,105,48,50,50,56,7,117,110,105,48, 50,50,57,7,117,110,105,48,50,50,65,7,117,110,105,48, 50,50,66,7,117,110,105,48,50,50,67,7,117,110,105,48, 50,50,68,7,117,110,105,48,50,50,69,7,117,110,105,48, 50,50,70,7,117,110,105,48,50,51,48,7,117,110,105,48, 50,51,49,7,117,110,105,48,50,51,50,7,117,110,105,48, 50,51,51,7,117,110,105,48,50,53,48,7,117,110,105,48, 50,53,49,7,117,110,105,48,50,53,50,7,117,110,105,48, 50,53,51,7,117,110,105,48,50,53,52,7,117,110,105,48, 50,53,54,7,117,110,105,48,50,53,55,7,117,110,105,48, 50,53,56,7,117,110,105,48,50,53,57,7,117,110,105,48, 50,53,66,7,117,110,105,48,50,53,67,7,117,110,105,48, 50,54,48,7,117,110,105,48,50,54,49,7,117,110,105,48, 50,54,53,7,117,110,105,48,50,54,54,7,117,110,105,48, 50,54,55,7,117,110,105,48,50,54,56,7,117,110,105,48, 50,54,57,7,117,110,105,48,50,54,65,7,117,110,105,48, 50,54,68,7,117,110,105,48,50,54,70,7,117,110,105,48, 50,55,48,7,117,110,105,48,50,55,49,7,117,110,105,48, 50,55,50,7,117,110,105,48,50,55,51,7,117,110,105,48, 50,55,53,7,117,110,105,48,50,55,57,7,117,110,105,48, 50,55,65,7,117,110,105,48,50,55,66,7,117,110,105,48, 50,55,67,7,117,110,105,48,50,55,68,7,117,110,105,48, 50,55,69,7,117,110,105,48,50,55,70,7,117,110,105,48, 50,56,50,7,117,110,105,48,50,56,51,7,117,110,105,48, 50,56,52,7,117,110,105,48,50,56,53,7,117,110,105,48, 50,56,55,7,117,110,105,48,50,56,56,7,117,110,105,48, 50,56,57,7,117,110,105,48,50,56,67,7,117,110,105,48, 50,56,68,7,117,110,105,48,50,56,69,7,117,110,105,48, 50,57,48,7,117,110,105,48,50,57,67,7,117,110,105,48, 50,57,69,7,117,110,105,48,50,65,48,7,117,110,105,48, 50,67,65,7,117,110,105,48,50,67,66,9,103,114,97,118, 101,99,111,109,98,9,97,99,117,116,101,99,111,109,98,7, 117,110,105,48,51,48,50,9,116,105,108,100,101,99,111,109, 98,7,117,110,105,48,51,48,52,7,117,110,105,48,51,48, 54,7,117,110,105,48,51,48,55,7,117,110,105,48,51,48, 56,7,117,110,105,48,51,48,65,7,117,110,105,48,51,48, 66,7,117,110,105,48,51,48,67,7,117,110,105,48,51,48, 70,7,117,110,105,48,51,49,49,7,117,110,105,48,51,49, 50,7,117,110,105,48,51,49,51,7,117,110,105,48,51,49, 52,7,117,110,105,48,51,50,54,7,117,110,105,48,51,50, 55,7,117,110,105,48,51,50,56,7,117,110,105,48,51,55, 52,7,117,110,105,48,51,55,53,7,117,110,105,48,51,55, 65,7,117,110,105,48,51,55,69,5,116,111,110,111,115,13, 100,105,101,114,101,115,105,115,116,111,110,111,115,10,65,108, 112,104,97,116,111,110,111,115,9,97,110,111,116,101,108,101, 105,97,12,69,112,115,105,108,111,110,116,111,110,111,115,8, 69,116,97,116,111,110,111,115,9,73,111,116,97,116,111,110, 111,115,12,79,109,105,99,114,111,110,116,111,110,111,115,12, 85,112,115,105,108,111,110,116,111,110,111,115,10,79,109,101, 103,97,116,111,110,111,115,17,105,111,116,97,100,105,101,114, 101,115,105,115,116,111,110,111,115,5,65,108,112,104,97,4, 66,101,116,97,5,71,97,109,109,97,7,117,110,105,48,51, 57,52,7,69,112,115,105,108,111,110,4,90,101,116,97,3, 69,116,97,5,84,104,101,116,97,4,73,111,116,97,5,75, 97,112,112,97,6,76,97,109,98,100,97,2,77,117,2,78, 117,2,88,105,7,79,109,105,99,114,111,110,2,80,105,3, 82,104,111,5,83,105,103,109,97,3,84,97,117,7,85,112, 115,105,108,111,110,3,80,104,105,3,67,104,105,3,80,115, 105,7,117,110,105,48,51,65,57,12,73,111,116,97,100,105, 101,114,101,115,105,115,15,85,112,115,105,108,111,110,100,105, 101,114,101,115,105,115,10,97,108,112,104,97,116,111,110,111, 115,12,101,112,115,105,108,111,110,116,111,110,111,115,8,101, 116,97,116,111,110,111,115,9,105,111,116,97,116,111,110,111, 115,20,117,112,115,105,108,111,110,100,105,101,114,101,115,105, 115,116,111,110,111,115,5,97,108,112,104,97,4,98,101,116, 97,5,103,97,109,109,97,5,100,101,108,116,97,7,101,112, 115,105,108,111,110,4,122,101,116,97,3,101,116,97,5,116, 104,101,116,97,4,105,111,116,97,5,107,97,112,112,97,6, 108,97,109,98,100,97,7,117,110,105,48,51,66,67,2,110, 117,2,120,105,7,111,109,105,99,114,111,110,3,114,104,111, 6,115,105,103,109,97,49,5,115,105,103,109,97,3,116,97, 117,7,117,112,115,105,108,111,110,3,112,104,105,3,99,104, 105,3,112,115,105,5,111,109,101,103,97,12,105,111,116,97, 100,105,101,114,101,115,105,115,15,117,112,115,105,108,111,110, 100,105,101,114,101,115,105,115,12,111,109,105,99,114,111,110, 116,111,110,111,115,12,117,112,115,105,108,111,110,116,111,110, 111,115,10,111,109,101,103,97,116,111,110,111,115,7,117,110, 105,48,52,48,48,9,97,102,105,105,49,48,48,50,51,9, 97,102,105,105,49,48,48,53,49,9,97,102,105,105,49,48, 48,53,50,9,97,102,105,105,49,48,48,53,51,9,97,102, 105,105,49,48,48,53,52,9,97,102,105,105,49,48,48,53, 53,9,97,102,105,105,49,48,48,53,54,9,97,102,105,105, 49,48,48,53,55,9,97,102,105,105,49,48,48,53,56,9, 97,102,105,105,49,48,48,53,57,9,97,102,105,105,49,48, 48,54,48,9,97,102,105,105,49,48,48,54,49,7,117,110, 105,48,52,48,68,9,97,102,105,105,49,48,48,54,50,9, 97,102,105,105,49,48,49,52,53,9,97,102,105,105,49,48, 48,49,55,9,97,102,105,105,49,48,48,49,56,9,97,102, 105,105,49,48,48,49,57,9,97,102,105,105,49,48,48,50, 48,9,97,102,105,105,49,48,48,50,49,9,97,102,105,105, 49,48,48,50,50,9,97,102,105,105,49,48,48,50,52,9, 97,102,105,105,49,48,48,50,53,9,97,102,105,105,49,48, 48,50,54,9,97,102,105,105,49,48,48,50,55,9,97,102, 105,105,49,48,48,50,56,9,97,102,105,105,49,48,48,50, 57,9,97,102,105,105,49,48,48,51,48,9,97,102,105,105, 49,48,48,51,49,9,97,102,105,105,49,48,48,51,50,9, 97,102,105,105,49,48,48,51,51,9,97,102,105,105,49,48, 48,51,52,9,97,102,105,105,49,48,48,51,53,9,97,102, 105,105,49,48,48,51,54,9,97,102,105,105,49,48,48,51, 55,9,97,102,105,105,49,48,48,51,56,9,97,102,105,105, 49,48,48,51,57,9,97,102,105,105,49,48,48,52,48,9, 97,102,105,105,49,48,48,52,49,9,97,102,105,105,49,48, 48,52,50,9,97,102,105,105,49,48,48,52,51,9,97,102, 105,105,49,48,48,52,52,9,97,102,105,105,49,48,48,52, 53,9,97,102,105,105,49,48,48,52,54,9,97,102,105,105, 49,48,48,52,55,9,97,102,105,105,49,48,48,52,56,9, 97,102,105,105,49,48,48,52,57,9,97,102,105,105,49,48, 48,54,53,9,97,102,105,105,49,48,48,54,54,9,97,102, 105,105,49,48,48,54,55,9,97,102,105,105,49,48,48,54, 56,9,97,102,105,105,49,48,48,54,57,9,97,102,105,105, 49,48,48,55,48,9,97,102,105,105,49,48,48,55,50,9, 97,102,105,105,49,48,48,55,51,9,97,102,105,105,49,48, 48,55,52,9,97,102,105,105,49,48,48,55,53,9,97,102, 105,105,49,48,48,55,54,9,97,102,105,105,49,48,48,55, 55,9,97,102,105,105,49,48,48,55,56,9,97,102,105,105, 49,48,48,55,57,9,97,102,105,105,49,48,48,56,48,9, 97,102,105,105,49,48,48,56,49,9,97,102,105,105,49,48, 48,56,50,9,97,102,105,105,49,48,48,56,51,9,97,102, 105,105,49,48,48,56,52,9,97,102,105,105,49,48,48,56, 53,9,97,102,105,105,49,48,48,56,54,9,97,102,105,105, 49,48,48,56,55,9,97,102,105,105,49,48,48,56,56,9, 97,102,105,105,49,48,48,56,57,9,97,102,105,105,49,48, 48,57,48,9,97,102,105,105,49,48,48,57,49,9,97,102, 105,105,49,48,48,57,50,9,97,102,105,105,49,48,48,57, 51,9,97,102,105,105,49,48,48,57,52,9,97,102,105,105, 49,48,48,57,53,9,97,102,105,105,49,48,48,57,54,9, 97,102,105,105,49,48,48,57,55,7,117,110,105,48,52,53, 48,9,97,102,105,105,49,48,48,55,49,9,97,102,105,105, 49,48,48,57,57,9,97,102,105,105,49,48,49,48,48,9, 97,102,105,105,49,48,49,48,49,9,97,102,105,105,49,48, 49,48,50,9,97,102,105,105,49,48,49,48,51,9,97,102, 105,105,49,48,49,48,52,9,97,102,105,105,49,48,49,48, 53,9,97,102,105,105,49,48,49,48,54,9,97,102,105,105, 49,48,49,48,55,9,97,102,105,105,49,48,49,48,56,9, 97,102,105,105,49,48,49,48,57,7,117,110,105,48,52,53, 68,9,97,102,105,105,49,48,49,49,48,9,97,102,105,105, 49,48,49,57,51,7,117,110,105,48,52,56,67,7,117,110, 105,48,52,56,68,7,117,110,105,48,52,56,69,7,117,110, 105,48,52,56,70,9,97,102,105,105,49,48,48,53,48,9, 97,102,105,105,49,48,48,57,56,7,117,110,105,48,52,57, 50,7,117,110,105,48,52,57,51,7,117,110,105,48,52,57, 52,7,117,110,105,48,52,57,53,7,117,110,105,48,52,57, 54,7,117,110,105,48,52,57,55,7,117,110,105,48,52,57, 56,7,117,110,105,48,52,57,57,7,117,110,105,48,52,57, 65,7,117,110,105,48,52,57,66,7,117,110,105,48,52,57, 67,7,117,110,105,48,52,57,68,7,117,110,105,48,52,57, 69,7,117,110,105,48,52,57,70,7,117,110,105,48,52,65, 48,7,117,110,105,48,52,65,49,7,117,110,105,48,52,65, 50,7,117,110,105,48,52,65,51,7,117,110,105,48,52,65, 52,7,117,110,105,48,52,65,53,7,117,110,105,48,52,65, 54,7,117,110,105,48,52,65,55,7,117,110,105,48,52,65, 56,7,117,110,105,48,52,65,57,7,117,110,105,48,52,65, 65,7,117,110,105,48,52,65,66,7,117,110,105,48,52,65, 67,7,117,110,105,48,52,65,68,7,117,110,105,48,52,65, 69,7,117,110,105,48,52,65,70,7,117,110,105,48,52,66, 48,7,117,110,105,48,52,66,49,7,117,110,105,48,52,66, 50,7,117,110,105,48,52,66,51,7,117,110,105,48,52,66, 52,7,117,110,105,48,52,66,53,7,117,110,105,48,52,66, 54,7,117,110,105,48,52,66,55,7,117,110,105,48,52,66, 56,7,117,110,105,48,52,66,57,7,117,110,105,48,52,66, 65,7,117,110,105,48,52,66,66,7,117,110,105,48,52,66, 67,7,117,110,105,48,52,66,68,7,117,110,105,48,52,66, 69,7,117,110,105,48,52,66,70,7,117,110,105,48,52,67, 48,7,117,110,105,48,52,67,49,7,117,110,105,48,52,67, 50,7,117,110,105,48,52,67,51,7,117,110,105,48,52,67, 52,7,117,110,105,48,52,67,55,7,117,110,105,48,52,67, 56,7,117,110,105,48,52,67,66,7,117,110,105,48,52,67, 67,7,117,110,105,48,52,68,48,7,117,110,105,48,52,68, 49,7,117,110,105,48,52,68,50,7,117,110,105,48,52,68, 51,7,117,110,105,48,52,68,52,7,117,110,105,48,52,68, 53,7,117,110,105,48,52,68,54,7,117,110,105,48,52,68, 55,7,117,110,105,48,52,68,56,9,97,102,105,105,49,48, 56,52,54,7,117,110,105,48,52,68,65,7,117,110,105,48, 52,68,66,7,117,110,105,48,52,68,67,7,117,110,105,48, 52,68,68,7,117,110,105,48,52,68,69,7,117,110,105,48, 52,68,70,7,117,110,105,48,52,69,48,7,117,110,105,48, 52,69,49,7,117,110,105,48,52,69,50,7,117,110,105,48, 52,69,51,7,117,110,105,48,52,69,52,7,117,110,105,48, 52,69,53,7,117,110,105,48,52,69,54,7,117,110,105,48, 52,69,55,7,117,110,105,48,52,69,56,7,117,110,105,48, 52,69,57,7,117,110,105,48,52,69,65,7,117,110,105,48, 52,69,66,7,117,110,105,48,52,69,67,7,117,110,105,48, 52,69,68,7,117,110,105,48,52,69,69,7,117,110,105,48, 52,69,70,7,117,110,105,48,52,70,48,7,117,110,105,48, 52,70,49,7,117,110,105,48,52,70,50,7,117,110,105,48, 52,70,51,7,117,110,105,48,52,70,52,7,117,110,105,48, 52,70,53,7,117,110,105,48,52,70,56,7,117,110,105,48, 52,70,57,7,117,110,105,48,53,51,49,7,117,110,105,48, 53,51,50,7,117,110,105,48,53,51,51,7,117,110,105,48, 53,51,52,7,117,110,105,48,53,51,53,7,117,110,105,48, 53,51,54,7,117,110,105,48,53,51,55,7,117,110,105,48, 53,51,56,7,117,110,105,48,53,51,57,7,117,110,105,48, 53,51,65,7,117,110,105,48,53,51,66,7,117,110,105,48, 53,51,67,7,117,110,105,48,53,51,68,7,117,110,105,48, 53,51,69,7,117,110,105,48,53,51,70,7,117,110,105,48, 53,52,48,7,117,110,105,48,53,52,49,7,117,110,105,48, 53,52,50,7,117,110,105,48,53,52,51,7,117,110,105,48, 53,52,52,7,117,110,105,48,53,52,53,7,117,110,105,48, 53,52,54,7,117,110,105,48,53,52,55,7,117,110,105,48, 53,52,56,7,117,110,105,48,53,52,57,7,117,110,105,48, 53,52,65,7,117,110,105,48,53,52,66,7,117,110,105,48, 53,52,67,7,117,110,105,48,53,52,68,7,117,110,105,48, 53,52,69,7,117,110,105,48,53,52,70,7,117,110,105,48, 53,53,48,7,117,110,105,48,53,53,49,7,117,110,105,48, 53,53,50,7,117,110,105,48,53,53,51,7,117,110,105,48, 53,53,52,7,117,110,105,48,53,53,53,7,117,110,105,48, 53,53,54,7,117,110,105,48,53,53,65,7,117,110,105,48, 53,53,66,7,117,110,105,48,53,53,67,7,117,110,105,48, 53,53,68,7,117,110,105,48,53,53,69,7,117,110,105,48, 53,54,49,7,117,110,105,48,53,54,50,7,117,110,105,48, 53,54,51,7,117,110,105,48,53,54,52,7,117,110,105,48, 53,54,53,7,117,110,105,48,53,54,54,7,117,110,105,48, 53,54,55,7,117,110,105,48,53,54,56,7,117,110,105,48, 53,54,57,7,117,110,105,48,53,54,65,7,117,110,105,48, 53,54,66,7,117,110,105,48,53,54,67,7,117,110,105,48, 53,54,68,7,117,110,105,48,53,54,69,7,117,110,105,48, 53,54,70,7,117,110,105,48,53,55,48,7,117,110,105,48, 53,55,49,7,117,110,105,48,53,55,50,7,117,110,105,48, 53,55,51,7,117,110,105,48,53,55,52,7,117,110,105,48, 53,55,53,7,117,110,105,48,53,55,54,7,117,110,105,48, 53,55,55,7,117,110,105,48,53,55,56,7,117,110,105,48, 53,55,57,7,117,110,105,48,53,55,65,7,117,110,105,48, 53,55,66,7,117,110,105,48,53,55,67,7,117,110,105,48, 53,55,68,7,117,110,105,48,53,55,69,7,117,110,105,48, 53,55,70,7,117,110,105,48,53,56,48,7,117,110,105,48, 53,56,49,7,117,110,105,48,53,56,50,7,117,110,105,48, 53,56,51,7,117,110,105,48,53,56,52,7,117,110,105,48, 53,56,53,7,117,110,105,48,53,56,54,7,117,110,105,48, 53,56,55,7,117,110,105,48,53,56,57,7,117,110,105,48, 53,56,65,9,97,102,105,105,53,55,55,57,57,9,97,102, 105,105,53,55,56,48,49,9,97,102,105,105,53,55,56,48, 48,9,97,102,105,105,53,55,56,48,50,9,97,102,105,105, 53,55,55,57,51,9,97,102,105,105,53,55,55,57,52,9, 97,102,105,105,53,55,55,57,53,9,97,102,105,105,53,55, 55,57,56,9,97,102,105,105,53,55,55,57,55,9,97,102, 105,105,53,55,56,48,54,9,97,102,105,105,53,55,55,57, 54,9,97,102,105,105,53,55,56,48,55,9,97,102,105,105, 53,55,56,51,57,9,97,102,105,105,53,55,54,52,53,9, 97,102,105,105,53,55,56,52,49,9,97,102,105,105,53,55, 56,52,50,9,97,102,105,105,53,55,56,48,52,9,97,102, 105,105,53,55,56,48,51,9,97,102,105,105,53,55,54,53, 56,7,117,110,105,48,53,67,52,9,97,102,105,105,53,55, 54,54,52,9,97,102,105,105,53,55,54,54,53,9,97,102, 105,105,53,55,54,54,54,9,97,102,105,105,53,55,54,54, 55,9,97,102,105,105,53,55,54,54,56,9,97,102,105,105, 53,55,54,54,57,9,97,102,105,105,53,55,54,55,48,9, 97,102,105,105,53,55,54,55,49,9,97,102,105,105,53,55, 54,55,50,9,97,102,105,105,53,55,54,55,51,9,97,102, 105,105,53,55,54,55,52,9,97,102,105,105,53,55,54,55, 53,9,97,102,105,105,53,55,54,55,54,9,97,102,105,105, 53,55,54,55,55,9,97,102,105,105,53,55,54,55,56,9, 97,102,105,105,53,55,54,55,57,9,97,102,105,105,53,55, 54,56,48,9,97,102,105,105,53,55,54,56,49,9,97,102, 105,105,53,55,54,56,50,9,97,102,105,105,53,55,54,56, 51,9,97,102,105,105,53,55,54,56,52,9,97,102,105,105, 53,55,54,56,53,9,97,102,105,105,53,55,54,56,54,9, 97,102,105,105,53,55,54,56,55,9,97,102,105,105,53,55, 54,56,56,9,97,102,105,105,53,55,54,56,57,9,97,102, 105,105,53,55,54,57,48,7,117,110,105,48,55,48,48,7, 117,110,105,48,55,48,49,7,117,110,105,48,55,48,50,7, 117,110,105,48,55,48,51,7,117,110,105,48,55,48,52,7, 117,110,105,48,55,48,53,7,117,110,105,48,55,48,54,7, 117,110,105,48,55,48,55,7,117,110,105,48,55,48,56,7, 117,110,105,48,55,48,57,7,117,110,105,48,55,48,65,7, 117,110,105,48,55,48,66,7,117,110,105,48,55,48,67,7, 117,110,105,48,55,48,68,7,117,110,105,48,55,49,48,7, 117,110,105,48,55,49,49,7,117,110,105,48,55,49,50,7, 117,110,105,48,55,49,51,7,117,110,105,48,55,49,52,7, 117,110,105,48,55,49,53,7,117,110,105,48,55,49,54,7, 117,110,105,48,55,49,55,7,117,110,105,48,55,49,56,7, 117,110,105,48,55,49,57,7,117,110,105,48,55,49,65,7, 117,110,105,48,55,49,66,7,117,110,105,48,55,49,67,7, 117,110,105,48,55,49,68,7,117,110,105,48,55,49,69,7, 117,110,105,48,55,49,70,7,117,110,105,48,55,50,48,7, 117,110,105,48,55,50,49,7,117,110,105,48,55,50,50,7, 117,110,105,48,55,50,51,7,117,110,105,48,55,50,52,7, 117,110,105,48,55,50,53,7,117,110,105,48,55,50,54,7, 117,110,105,48,55,50,55,7,117,110,105,48,55,50,56,7, 117,110,105,48,55,50,57,7,117,110,105,48,55,50,65,7, 117,110,105,48,55,50,66,7,117,110,105,48,55,50,67,7, 117,110,105,48,55,51,48,7,117,110,105,48,55,51,49,7, 117,110,105,48,55,51,50,7,117,110,105,48,55,51,51,7, 117,110,105,48,55,51,52,7,117,110,105,48,55,51,53,7, 117,110,105,48,55,51,54,7,117,110,105,48,55,51,55,7, 117,110,105,48,55,51,56,7,117,110,105,48,55,51,57,7, 117,110,105,48,55,51,65,7,117,110,105,48,55,51,66,7, 117,110,105,48,55,51,67,7,117,110,105,48,55,51,68,7, 117,110,105,48,55,51,69,7,117,110,105,48,55,51,70,7, 117,110,105,48,55,52,48,7,117,110,105,48,55,52,49,7, 117,110,105,48,55,52,50,7,117,110,105,48,55,52,51,7, 117,110,105,48,55,52,52,7,117,110,105,48,55,52,53,7, 117,110,105,48,55,52,54,7,117,110,105,48,55,52,55,7, 117,110,105,48,55,52,56,7,117,110,105,48,55,52,57,7, 117,110,105,48,55,52,65,7,117,110,105,48,57,48,49,7, 117,110,105,48,57,48,50,7,117,110,105,48,57,48,53,7, 117,110,105,48,57,48,54,7,117,110,105,48,57,48,55,7, 117,110,105,48,57,48,56,7,117,110,105,48,57,48,57,7, 117,110,105,48,57,48,65,7,117,110,105,48,57,48,66,7, 117,110,105,48,57,48,68,7,117,110,105,48,57,49,48,7, 117,110,105,48,57,49,49,7,117,110,105,48,57,49,51,7, 117,110,105,48,57,49,52,7,117,110,105,48,57,49,53,7, 117,110,105,48,57,49,54,7,117,110,105,48,57,49,55,7, 117,110,105,48,57,49,56,7,117,110,105,48,57,49,57,7, 117,110,105,48,57,49,65,7,117,110,105,48,57,49,66,7, 117,110,105,48,57,49,67,7,117,110,105,48,57,49,68,7, 117,110,105,48,57,49,69,7,117,110,105,48,57,49,70,7, 117,110,105,48,57,50,48,7,117,110,105,48,57,50,49,7, 117,110,105,48,57,50,50,7,117,110,105,48,57,50,51,7, 117,110,105,48,57,50,52,7,117,110,105,48,57,50,53,7, 117,110,105,48,57,50,54,7,117,110,105,48,57,50,55,7, 117,110,105,48,57,50,56,7,117,110,105,48,57,50,57,7, 117,110,105,48,57,50,65,7,117,110,105,48,57,50,66,7, 117,110,105,48,57,50,67,7,117,110,105,48,57,50,68,7, 117,110,105,48,57,50,69,7,117,110,105,48,57,50,70,7, 117,110,105,48,57,51,48,7,117,110,105,48,57,51,49,7, 117,110,105,48,57,51,50,7,117,110,105,48,57,51,51,7, 117,110,105,48,57,51,53,7,117,110,105,48,57,51,54,7, 117,110,105,48,57,51,55,7,117,110,105,48,57,51,56,7, 117,110,105,48,57,51,57,7,117,110,105,48,57,51,67,7, 117,110,105,48,57,51,68,7,117,110,105,48,57,51,69,7, 117,110,105,48,57,51,70,7,117,110,105,48,57,52,48,7, 117,110,105,48,57,52,49,7,117,110,105,48,57,52,50,7, 117,110,105,48,57,52,51,7,117,110,105,48,57,52,53,7, 117,110,105,48,57,52,55,7,117,110,105,48,57,52,56,7, 117,110,105,48,57,52,57,7,117,110,105,48,57,52,66,7, 117,110,105,48,57,52,67,7,117,110,105,48,57,52,68,7, 117,110,105,48,57,53,48,7,117,110,105,48,57,53,49,7, 117,110,105,48,57,54,54,7,117,110,105,48,57,54,55,7, 117,110,105,48,57,54,56,7,117,110,105,48,57,54,57,7, 117,110,105,48,57,54,65,7,117,110,105,48,57,54,66,7, 117,110,105,48,57,54,67,7,117,110,105,48,57,54,68,7, 117,110,105,48,57,54,69,7,117,110,105,48,57,54,70,7, 117,110,105,48,57,55,48,7,117,110,105,48,57,56,49,7, 117,110,105,48,57,56,50,7,117,110,105,48,57,56,51,7, 117,110,105,48,57,56,53,7,117,110,105,48,57,56,54,7, 117,110,105,48,57,56,55,7,117,110,105,48,57,56,56,7, 117,110,105,48,57,56,57,7,117,110,105,48,57,56,65,7, 117,110,105,48,57,56,66,7,117,110,105,48,57,56,67,7, 117,110,105,48,57,56,70,7,117,110,105,48,57,57,48,7, 117,110,105,48,57,57,51,7,117,110,105,48,57,57,52,7, 117,110,105,48,57,57,53,7,117,110,105,48,57,57,54,7, 117,110,105,48,57,57,55,7,117,110,105,48,57,57,56,7, 117,110,105,48,57,57,57,7,117,110,105,48,57,57,65,7, 117,110,105,48,57,57,66,7,117,110,105,48,57,57,67,7, 117,110,105,48,57,57,68,7,117,110,105,48,57,57,69,7, 117,110,105,48,57,57,70,7,117,110,105,48,57,65,48,7, 117,110,105,48,57,65,49,7,117,110,105,48,57,65,50,7, 117,110,105,48,48,67,49,7,117,110,105,48,57,65,52,7, 117,110,105,48,57,65,53,7,117,110,105,48,48,67,52,7, 117,110,105,48,57,65,55,7,117,110,105,48,48,67,54,7, 117,110,105,48,48,67,56,7,117,110,105,48,57,65,66,7, 117,110,105,48,57,65,67,7,117,110,105,48,57,65,68,7, 117,110,105,48,57,65,69,7,117,110,105,48,57,65,70,7, 117,110,105,48,57,66,48,7,117,110,105,48,57,66,50,7, 117,110,105,48,48,66,54,7,117,110,105,48,57,66,55,7, 117,110,105,48,57,66,56,7,117,110,105,48,57,66,57,7, 117,110,105,48,57,66,67,7,117,110,105,48,48,68,65,7, 117,110,105,48,57,66,70,7,117,110,105,48,57,67,48,7, 117,110,105,48,57,67,49,7,117,110,105,48,57,67,50,7, 117,110,105,48,57,67,51,7,117,110,105,48,57,67,52,7, 117,110,105,48,57,67,55,7,117,110,105,48,57,67,56,7, 117,110,105,48,57,67,66,7,117,110,105,48,57,67,67,7, 117,110,105,48,57,67,68,7,117,110,105,48,57,68,55,7, 117,110,105,48,57,68,67,7,117,110,105,48,57,68,68,7, 117,110,105,48,57,68,70,7,117,110,105,48,57,69,48,7, 117,110,105,48,57,69,49,7,117,110,105,48,57,69,50,7, 117,110,105,48,57,69,51,7,117,110,105,48,48,70,49,7, 117,110,105,48,48,70,50,7,117,110,105,48,48,70,51,7, 117,110,105,48,48,70,52,7,117,110,105,48,48,70,53,7, 117,110,105,48,48,70,54,7,117,110,105,48,48,70,55,7, 117,110,105,48,48,70,56,7,117,110,105,48,48,70,57,7, 117,110,105,48,48,70,65,7,117,110,105,48,57,70,48,7, 117,110,105,48,57,70,49,7,117,110,105,48,57,70,50,7, 117,110,105,48,57,70,51,7,117,110,105,48,57,70,52,7, 117,110,105,48,57,70,53,7,117,110,105,48,57,70,54,7, 117,110,105,48,57,70,55,7,117,110,105,48,57,70,56,7, 117,110,105,48,57,70,57,7,117,110,105,48,57,70,65,7, 117,110,105,48,65,48,53,7,117,110,105,48,65,48,54,7, 117,110,105,48,65,48,55,7,117,110,105,48,65,48,56,7, 117,110,105,48,65,48,57,7,117,110,105,48,65,48,65,7, 117,110,105,48,65,48,70,7,117,110,105,48,65,49,48,7, 117,110,105,48,65,49,51,7,117,110,105,48,65,49,52,7, 117,110,105,48,65,49,53,7,117,110,105,48,65,49,54,7, 117,110,105,48,65,49,55,7,117,110,105,48,65,49,56,7, 117,110,105,48,65,49,57,7,117,110,105,48,65,49,65,7, 117,110,105,48,65,49,66,7,117,110,105,48,65,49,67,7, 117,110,105,48,65,49,68,7,117,110,105,48,65,49,69,7, 117,110,105,48,65,49,70,7,117,110,105,48,65,50,48,7, 117,110,105,48,65,50,49,7,117,110,105,48,65,50,50,7, 117,110,105,48,65,50,51,7,117,110,105,48,65,50,52,7, 117,110,105,48,65,50,53,7,117,110,105,48,65,50,54,7, 117,110,105,48,65,50,55,7,117,110,105,48,65,50,56,7, 117,110,105,48,65,50,65,7,117,110,105,48,65,50,66,7, 117,110,105,48,65,50,67,7,117,110,105,48,65,50,68,7, 117,110,105,48,65,50,69,7,117,110,105,48,65,50,70,7, 117,110,105,48,65,51,48,7,117,110,105,48,65,51,50,7, 117,110,105,48,65,51,51,7,117,110,105,48,65,51,53,7, 117,110,105,48,65,51,54,7,117,110,105,48,65,51,56,7, 117,110,105,48,65,51,57,7,117,110,105,48,65,51,67,7, 117,110,105,48,65,51,69,7,117,110,105,48,65,51,70,7, 117,110,105,48,65,52,48,7,117,110,105,48,65,52,49,7, 117,110,105,48,65,52,50,7,117,110,105,48,65,52,55,7, 117,110,105,48,65,52,56,7,117,110,105,48,65,52,66,7, 117,110,105,48,65,52,67,7,117,110,105,48,65,52,68,7, 117,110,105,48,65,53,57,7,117,110,105,48,65,53,65,7, 117,110,105,48,65,53,66,7,117,110,105,48,65,53,67,7, 117,110,105,48,65,53,69,7,117,110,105,48,65,54,54,7, 117,110,105,48,65,54,55,7,117,110,105,48,65,54,56,7, 117,110,105,48,65,54,57,7,117,110,105,48,65,54,65,7, 117,110,105,48,65,54,66,7,117,110,105,48,65,54,67,7, 117,110,105,48,65,54,68,7,117,110,105,48,65,54,69,7, 117,110,105,48,65,54,70,7,117,110,105,48,65,55,48,7, 117,110,105,48,65,55,50,7,117,110,105,48,65,55,51,7, 117,110,105,48,65,55,52,7,117,110,105,48,65,56,49,7, 117,110,105,48,65,56,50,7,117,110,105,48,65,56,53,7, 117,110,105,48,65,56,54,7,117,110,105,48,65,56,55,7, 117,110,105,48,65,56,56,7,117,110,105,48,65,56,57,7, 117,110,105,48,65,56,65,7,117,110,105,48,65,56,66,7, 117,110,105,48,65,57,53,7,117,110,105,48,65,57,54,7, 117,110,105,48,65,57,55,7,117,110,105,48,65,57,56,7, 117,110,105,48,65,57,57,7,117,110,105,48,65,57,65,7, 117,110,105,48,65,57,66,7,117,110,105,48,65,57,67,7, 117,110,105,48,65,57,68,7,117,110,105,48,65,57,69,7, 117,110,105,48,65,57,70,7,117,110,105,48,65,65,48,7, 117,110,105,48,65,65,49,7,117,110,105,48,65,65,50,7, 117,110,105,48,65,65,51,7,117,110,105,48,65,65,52,7, 117,110,105,48,65,65,53,7,117,110,105,48,65,65,54,7, 117,110,105,48,65,65,55,7,117,110,105,48,65,65,56,7, 117,110,105,48,65,65,65,7,117,110,105,48,65,65,66,7, 117,110,105,48,65,65,67,7,117,110,105,48,65,65,68,7, 117,110,105,48,65,65,69,7,117,110,105,48,65,65,70,7, 117,110,105,48,65,66,48,7,117,110,105,48,65,66,50,7, 117,110,105,48,65,66,51,7,117,110,105,48,65,66,53,7, 117,110,105,48,65,66,54,7,117,110,105,48,65,66,55,7, 117,110,105,48,65,66,56,7,117,110,105,48,65,66,57,7, 117,110,105,48,65,66,68,7,117,110,105,48,65,66,69,7, 117,110,105,48,65,66,70,7,117,110,105,48,65,67,48,7, 117,110,105,48,65,67,49,7,117,110,105,48,65,67,50,7, 117,110,105,48,65,67,51,7,117,110,105,48,65,67,55,7, 117,110,105,48,65,67,56,7,117,110,105,48,65,67,66,7, 117,110,105,48,65,67,67,7,117,110,105,48,65,68,48,7, 117,110,105,48,65,69,54,7,117,110,105,48,65,69,55,7, 117,110,105,48,65,69,56,7,117,110,105,48,65,69,57,7, 117,110,105,48,65,69,65,7,117,110,105,48,65,69,66,7, 117,110,105,48,65,69,67,7,117,110,105,48,65,69,68,7, 117,110,105,48,65,69,69,7,117,110,105,48,65,69,70,7, 117,110,105,48,66,48,50,7,117,110,105,48,66,48,51,7, 117,110,105,48,66,48,53,7,117,110,105,48,66,48,54,7, 117,110,105,48,66,48,55,7,117,110,105,48,66,48,57,7, 117,110,105,48,66,48,66,7,117,110,105,48,66,48,70,7, 117,110,105,48,66,49,51,7,117,110,105,48,66,49,53,7, 117,110,105,48,66,49,54,7,117,110,105,48,66,49,55,7, 117,110,105,48,66,49,56,7,117,110,105,48,66,49,65,7, 117,110,105,48,66,49,67,7,117,110,105,48,66,49,68,7, 117,110,105,48,66,49,70,7,117,110,105,48,66,50,48,7, 117,110,105,48,66,50,49,7,117,110,105,48,66,50,65,7, 117,110,105,48,66,50,66,7,117,110,105,48,66,50,70,7, 117,110,105,48,66,51,48,7,117,110,105,48,66,51,50,7, 117,110,105,48,66,51,51,7,117,110,105,48,66,51,54,7, 117,110,105,48,66,51,55,7,117,110,105,48,66,51,56,7, 117,110,105,48,66,51,57,7,117,110,105,48,66,51,69,7, 117,110,105,48,66,51,70,7,117,110,105,48,66,52,48,7, 117,110,105,48,66,52,49,7,117,110,105,48,66,52,50,7, 117,110,105,48,66,52,51,7,117,110,105,48,66,52,55,7, 117,110,105,48,66,54,48,7,117,110,105,48,66,54,54,7, 117,110,105,48,66,54,55,7,117,110,105,48,66,54,56,7, 117,110,105,48,66,54,57,7,117,110,105,48,66,54,65,7, 117,110,105,48,66,54,66,7,117,110,105,48,66,54,67,7, 117,110,105,48,66,54,68,7,117,110,105,48,66,54,69,7, 117,110,105,48,66,54,70,7,117,110,105,48,66,56,50,7, 117,110,105,48,66,56,51,7,117,110,105,48,66,56,53,7, 117,110,105,48,66,56,54,7,117,110,105,48,66,56,55,7, 117,110,105,48,66,56,56,7,117,110,105,48,66,56,57,7, 117,110,105,48,66,56,65,7,117,110,105,48,66,56,69,7, 117,110,105,48,66,56,70,7,117,110,105,48,66,57,48,7, 117,110,105,48,66,57,50,7,117,110,105,48,66,57,51,7, 117,110,105,48,66,57,52,7,117,110,105,48,66,57,53,7, 117,110,105,48,66,57,57,7,117,110,105,48,66,57,65,7, 117,110,105,48,66,57,67,7,117,110,105,48,66,57,69,7, 117,110,105,48,66,57,70,7,117,110,105,48,66,65,51,7, 117,110,105,48,66,65,52,7,117,110,105,48,66,65,56,7, 117,110,105,48,66,65,57,7,117,110,105,48,66,65,65,7, 117,110,105,48,66,65,69,7,117,110,105,48,66,65,70,7, 117,110,105,48,66,66,48,7,117,110,105,48,66,66,49,7, 117,110,105,48,66,66,50,7,117,110,105,48,66,66,51,7, 117,110,105,48,66,66,52,7,117,110,105,48,66,66,53,7, 117,110,105,48,66,66,55,7,117,110,105,48,66,66,56,7, 117,110,105,48,66,66,57,7,117,110,105,48,66,66,69,7, 117,110,105,48,66,66,70,7,117,110,105,48,66,67,48,7, 117,110,105,48,66,67,49,7,117,110,105,48,66,67,54,7, 117,110,105,48,66,67,55,7,117,110,105,48,66,67,56,7, 117,110,105,48,66,67,65,7,117,110,105,48,66,67,66,7, 117,110,105,48,66,67,67,7,117,110,105,48,66,67,68,7, 117,110,105,48,66,68,55,7,117,110,105,48,66,68,65,7, 117,110,105,48,66,68,66,7,117,110,105,48,66,68,67,7, 117,110,105,48,66,68,68,7,117,110,105,48,66,69,49,7, 117,110,105,48,67,56,51,7,117,110,105,48,67,56,53,7, 117,110,105,48,67,56,54,7,117,110,105,48,67,56,55,7, 117,110,105,48,67,56,56,7,117,110,105,48,67,56,57,7, 117,110,105,48,67,56,65,7,117,110,105,48,67,56,69,7, 117,110,105,48,67,56,70,7,117,110,105,48,67,57,48,7, 117,110,105,48,67,57,50,7,117,110,105,48,67,57,51,7, 117,110,105,48,67,57,52,7,117,110,105,48,67,57,53,7, 117,110,105,48,67,57,54,7,117,110,105,48,67,57,55,7, 117,110,105,48,67,57,56,7,117,110,105,48,67,57,57,7, 117,110,105,48,67,57,65,7,117,110,105,48,67,57,67,7, 117,110,105,48,67,57,69,7,117,110,105,48,67,57,70,7, 117,110,105,48,67,65,48,7,117,110,105,48,67,65,49,7, 117,110,105,48,67,65,50,7,117,110,105,48,67,65,51,7, 117,110,105,48,67,65,52,7,117,110,105,48,67,65,53,7, 117,110,105,48,67,65,54,7,117,110,105,48,67,65,55,7, 117,110,105,48,67,65,56,7,117,110,105,48,67,66,48,7, 117,110,105,48,67,66,49,7,117,110,105,48,67,66,50,7, 117,110,105,48,67,66,51,7,117,110,105,48,67,69,54,7, 117,110,105,48,67,69,55,7,117,110,105,48,67,69,56,7, 117,110,105,48,67,69,57,7,117,110,105,48,67,69,65,7, 117,110,105,48,67,69,66,7,117,110,105,48,67,69,67,7, 117,110,105,48,67,69,68,7,117,110,105,48,67,69,69,7, 117,110,105,48,67,69,70,7,117,110,105,48,68,56,50,7, 117,110,105,48,68,56,51,7,117,110,105,48,68,56,53,7, 117,110,105,48,68,56,57,7,117,110,105,48,68,56,65,7, 117,110,105,48,68,56,66,7,117,110,105,48,68,57,49,7, 117,110,105,48,68,57,52,7,117,110,105,48,68,57,57,7, 117,110,105,48,68,57,65,7,117,110,105,48,68,57,66,7, 117,110,105,48,68,57,67,7,117,110,105,48,68,57,69,7, 117,110,105,48,68,65,48,7,117,110,105,48,68,65,49,7, 117,110,105,48,68,65,50,7,117,110,105,48,68,65,52,7, 117,110,105,48,68,65,53,7,117,110,105,48,68,65,55,7, 117,110,105,48,68,65,56,7,117,110,105,48,68,65,57,7, 117,110,105,48,68,65,65,7,117,110,105,48,68,65,66,7, 117,110,105,48,68,65,68,7,117,110,105,48,68,65,69,7, 117,110,105,48,68,65,70,7,117,110,105,48,68,66,48,7, 117,110,105,48,68,66,49,7,117,110,105,48,68,66,51,7, 117,110,105,48,68,66,52,7,117,110,105,48,68,66,53,7, 117,110,105,48,68,66,54,7,117,110,105,48,68,66,55,7, 117,110,105,48,68,66,56,7,117,110,105,48,68,66,57,7, 117,110,105,48,68,66,65,7,117,110,105,48,68,66,66,7, 117,110,105,48,68,66,68,7,117,110,105,48,68,67,48,7, 117,110,105,48,68,67,49,7,117,110,105,48,68,67,50,7, 117,110,105,48,68,67,51,7,117,110,105,48,68,67,52,7, 117,110,105,48,68,67,53,7,117,110,105,48,68,67,54,7, 117,110,105,48,68,67,65,7,117,110,105,48,68,67,70,7, 117,110,105,48,68,68,48,7,117,110,105,48,68,68,49,7, 117,110,105,48,68,68,50,7,117,110,105,48,68,68,51,7, 117,110,105,48,68,68,52,7,117,110,105,48,68,68,54,7, 117,110,105,48,68,68,56,7,117,110,105,48,68,68,57,7, 117,110,105,48,68,68,70,7,117,110,105,49,70,48,48,7, 117,110,105,49,70,48,49,7,117,110,105,49,70,48,50,7, 117,110,105,49,70,48,51,7,117,110,105,49,70,48,52,7, 117,110,105,49,70,48,53,7,117,110,105,49,70,48,54,7, 117,110,105,49,70,48,55,7,117,110,105,49,70,48,56,7, 117,110,105,49,70,48,57,7,117,110,105,49,70,48,65,7, 117,110,105,49,70,48,66,7,117,110,105,49,70,48,67,7, 117,110,105,49,70,48,68,7,117,110,105,49,70,48,69,7, 117,110,105,49,70,48,70,7,117,110,105,49,70,49,48,7, 117,110,105,49,70,49,49,7,117,110,105,49,70,49,50,7, 117,110,105,49,70,49,51,7,117,110,105,49,70,49,52,7, 117,110,105,49,70,49,53,7,117,110,105,49,70,49,56,7, 117,110,105,49,70,49,57,7,117,110,105,49,70,49,65,7, 117,110,105,49,70,49,66,7,117,110,105,49,70,49,67,7, 117,110,105,49,70,49,68,7,117,110,105,49,70,50,48,7, 117,110,105,49,70,50,49,7,117,110,105,49,70,50,50,7, 117,110,105,49,70,50,51,7,117,110,105,49,70,50,52,7, 117,110,105,49,70,50,53,7,117,110,105,49,70,50,54,7, 117,110,105,49,70,50,55,7,117,110,105,49,70,50,56,7, 117,110,105,49,70,50,57,7,117,110,105,49,70,50,65,7, 117,110,105,49,70,50,66,7,117,110,105,49,70,50,67,7, 117,110,105,49,70,50,68,7,117,110,105,49,70,50,69,7, 117,110,105,49,70,50,70,7,117,110,105,49,70,51,48,7, 117,110,105,49,70,51,49,7,117,110,105,49,70,51,50,7, 117,110,105,49,70,51,51,7,117,110,105,49,70,51,52,7, 117,110,105,49,70,51,53,7,117,110,105,49,70,51,54,7, 117,110,105,49,70,51,55,7,117,110,105,49,70,51,56,7, 117,110,105,49,70,51,57,7,117,110,105,49,70,51,65,7, 117,110,105,49,70,51,66,7,117,110,105,49,70,51,67,7, 117,110,105,49,70,51,68,7,117,110,105,49,70,51,69,7, 117,110,105,49,70,51,70,7,117,110,105,49,70,52,48,7, 117,110,105,49,70,52,49,7,117,110,105,49,70,52,50,7, 117,110,105,49,70,52,51,7,117,110,105,49,70,52,52,7, 117,110,105,49,70,52,53,7,117,110,105,49,70,52,56,7, 117,110,105,49,70,52,57,7,117,110,105,49,70,52,65,7, 117,110,105,49,70,52,66,7,117,110,105,49,70,52,67,7, 117,110,105,49,70,52,68,7,117,110,105,49,70,53,48,7, 117,110,105,49,70,53,49,7,117,110,105,49,70,53,50,7, 117,110,105,49,70,53,51,7,117,110,105,49,70,53,52,7, 117,110,105,49,70,53,53,7,117,110,105,49,70,53,54,7, 117,110,105,49,70,53,55,7,117,110,105,49,70,53,57,7, 117,110,105,49,70,53,66,7,117,110,105,49,70,53,68,7, 117,110,105,49,70,53,70,7,117,110,105,49,70,54,48,7, 117,110,105,49,70,54,49,7,117,110,105,49,70,54,50,7, 117,110,105,49,70,54,51,7,117,110,105,49,70,54,52,7, 117,110,105,49,70,54,53,7,117,110,105,49,70,54,54,7, 117,110,105,49,70,54,55,7,117,110,105,49,70,54,56,7, 117,110,105,49,70,54,57,7,117,110,105,49,70,54,65,7, 117,110,105,49,70,54,66,7,117,110,105,49,70,54,67,7, 117,110,105,49,70,54,68,7,117,110,105,49,70,54,69,7, 117,110,105,49,70,54,70,7,117,110,105,49,70,55,48,7, 117,110,105,49,70,55,49,7,117,110,105,49,70,55,50,7, 117,110,105,49,70,55,51,7,117,110,105,49,70,55,52,7, 117,110,105,49,70,55,53,7,117,110,105,49,70,55,54,7, 117,110,105,49,70,55,55,7,117,110,105,49,70,55,56,7, 117,110,105,49,70,55,57,7,117,110,105,49,70,55,65,7, 117,110,105,49,70,55,66,7,117,110,105,49,70,55,67,7, 117,110,105,49,70,55,68,7,117,110,105,49,70,56,48,7, 117,110,105,49,70,56,49,7,117,110,105,49,70,56,50,7, 117,110,105,49,70,56,51,7,117,110,105,49,70,56,52,7, 117,110,105,49,70,56,53,7,117,110,105,49,70,56,54,7, 117,110,105,49,70,56,55,7,117,110,105,49,70,56,56,7, 117,110,105,49,70,56,57,7,117,110,105,49,70,56,65,7, 117,110,105,49,70,56,66,7,117,110,105,49,70,56,67,7, 117,110,105,49,70,56,68,7,117,110,105,49,70,56,69,7, 117,110,105,49,70,56,70,7,117,110,105,49,70,57,48,7, 117,110,105,49,70,57,49,7,117,110,105,49,70,57,50,7, 117,110,105,49,70,57,51,7,117,110,105,49,70,57,52,7, 117,110,105,49,70,57,53,7,117,110,105,49,70,57,54,7, 117,110,105,49,70,57,55,7,117,110,105,49,70,57,56,7, 117,110,105,49,70,57,57,7,117,110,105,49,70,57,65,7, 117,110,105,49,70,57,66,7,117,110,105,49,70,57,67,7, 117,110,105,49,70,57,68,7,117,110,105,49,70,57,69,7, 117,110,105,49,70,57,70,7,117,110,105,49,70,65,48,7, 117,110,105,49,70,65,49,7,117,110,105,49,70,65,50,7, 117,110,105,49,70,65,51,7,117,110,105,49,70,65,52,7, 117,110,105,49,70,65,53,7,117,110,105,49,70,65,54,7, 117,110,105,49,70,65,55,7,117,110,105,49,70,65,56,7, 117,110,105,49,70,65,57,7,117,110,105,49,70,65,65,7, 117,110,105,49,70,65,66,7,117,110,105,49,70,65,67,7, 117,110,105,49,70,65,68,7,117,110,105,49,70,65,69,7, 117,110,105,49,70,65,70,7,117,110,105,49,70,66,48,7, 117,110,105,49,70,66,49,7,117,110,105,49,70,66,50,7, 117,110,105,49,70,66,51,7,117,110,105,49,70,66,52,7, 117,110,105,49,70,66,54,7,117,110,105,49,70,66,55,7, 117,110,105,49,70,66,56,7,117,110,105,49,70,66,57,7, 117,110,105,49,70,66,65,7,117,110,105,49,70,66,66,7, 117,110,105,49,70,66,67,7,117,110,105,49,70,66,68,7, 117,110,105,49,70,66,69,7,117,110,105,49,70,66,70,7, 117,110,105,49,70,67,48,7,117,110,105,49,70,67,49,7, 117,110,105,49,70,67,50,7,117,110,105,49,70,67,51,7, 117,110,105,49,70,67,52,7,117,110,105,49,70,67,54,7, 117,110,105,49,70,67,55,7,117,110,105,49,70,67,56,7, 117,110,105,49,70,67,57,7,117,110,105,49,70,67,65,7, 117,110,105,49,70,67,66,7,117,110,105,49,70,67,67,7, 117,110,105,49,70,67,68,7,117,110,105,49,70,67,69,7, 117,110,105,49,70,67,70,7,117,110,105,49,70,68,48,7, 117,110,105,49,70,68,49,7,117,110,105,49,70,68,50,7, 117,110,105,49,70,68,51,7,117,110,105,49,70,68,54,7, 117,110,105,49,70,68,55,7,117,110,105,49,70,68,56,7, 117,110,105,49,70,68,57,7,117,110,105,49,70,68,65,7, 117,110,105,49,70,68,66,7,117,110,105,49,70,68,68,7, 117,110,105,49,70,68,69,7,117,110,105,49,70,68,70,7, 117,110,105,49,70,69,48,7,117,110,105,49,70,69,49,7, 117,110,105,49,70,69,50,7,117,110,105,49,70,69,51,7, 117,110,105,49,70,69,52,7,117,110,105,49,70,69,53,7, 117,110,105,49,70,69,54,7,117,110,105,49,70,69,55,7, 117,110,105,49,70,69,56,7,117,110,105,49,70,69,57,7, 117,110,105,49,70,69,65,7,117,110,105,49,70,69,66,7, 117,110,105,49,70,69,67,7,117,110,105,49,70,69,68,7, 117,110,105,49,70,69,69,7,117,110,105,49,70,69,70,7, 117,110,105,49,70,70,50,7,117,110,105,49,70,70,51,7, 117,110,105,49,70,70,52,7,117,110,105,49,70,70,54,7, 117,110,105,49,70,70,55,7,117,110,105,49,70,70,56,7, 117,110,105,49,70,70,57,7,117,110,105,49,70,70,65,7, 117,110,105,49,70,70,66,7,117,110,105,49,70,70,67,7, 117,110,105,49,70,70,68,7,117,110,105,49,70,70,69,7, 117,110,105,50,48,49,48,13,113,117,111,116,101,114,101,118, 101,114,115,101,100,7,117,110,105,50,48,49,70,7,117,110, 105,50,48,50,51,7,117,110,105,50,48,51,49,6,109,105, 110,117,116,101,6,115,101,99,111,110,100,7,117,110,105,50, 48,51,52,7,117,110,105,50,48,51,53,7,117,110,105,50, 48,51,54,7,117,110,105,50,48,51,55,7,117,110,105,50, 48,51,66,9,101,120,99,108,97,109,100,98,108,7,117,110, 105,50,48,51,68,7,117,110,105,50,48,52,55,7,117,110, 105,50,48,52,56,7,117,110,105,50,48,52,57,7,117,110, 105,50,48,52,66,12,122,101,114,111,115,117,112,101,114,105, 111,114,7,117,110,105,50,48,55,49,12,102,111,117,114,115, 117,112,101,114,105,111,114,12,102,105,118,101,115,117,112,101, 114,105,111,114,11,115,105,120,115,117,112,101,114,105,111,114, 13,115,101,118,101,110,115,117,112,101,114,105,111,114,13,101, 105,103,104,116,115,117,112,101,114,105,111,114,12,110,105,110, 101,115,117,112,101,114,105,111,114,12,122,101,114,111,105,110, 102,101,114,105,111,114,11,111,110,101,105,110,102,101,114,105, 111,114,11,116,119,111,105,110,102,101,114,105,111,114,13,116, 104,114,101,101,105,110,102,101,114,105,111,114,12,102,111,117, 114,105,110,102,101,114,105,111,114,12,102,105,118,101,105,110, 102,101,114,105,111,114,11,115,105,120,105,110,102,101,114,105, 111,114,13,115,101,118,101,110,105,110,102,101,114,105,111,114, 13,101,105,103,104,116,105,110,102,101,114,105,111,114,12,110, 105,110,101,105,110,102,101,114,105,111,114,6,112,101,115,101, 116,97,7,117,110,105,50,48,65,56,9,97,102,105,105,53, 55,54,51,54,4,69,117,114,111,7,117,110,105,50,49,48, 66,7,117,110,105,50,49,48,67,7,117,110,105,50,49,49, 48,8,73,102,114,97,107,116,117,114,7,117,110,105,50,49, 49,50,9,97,102,105,105,54,49,51,53,50,7,117,110,105, 50,49,49,66,8,82,102,114,97,107,116,117,114,7,117,110, 105,50,49,50,54,7,117,110,105,50,49,50,55,7,117,110, 105,50,49,50,56,7,117,110,105,50,49,50,65,7,117,110, 105,50,49,50,66,7,117,110,105,50,49,50,67,7,117,110, 105,50,49,50,68,7,117,110,105,50,49,51,48,7,117,110, 105,50,49,51,49,7,117,110,105,50,49,51,50,7,117,110, 105,50,49,51,51,8,111,110,101,116,104,105,114,100,9,116, 119,111,116,104,105,114,100,115,7,117,110,105,50,49,53,53, 7,117,110,105,50,49,53,54,7,117,110,105,50,49,53,55, 7,117,110,105,50,49,53,56,7,117,110,105,50,49,53,57, 7,117,110,105,50,49,53,65,9,111,110,101,101,105,103,104, 116,104,12,116,104,114,101,101,101,105,103,104,116,104,115,11, 102,105,118,101,101,105,103,104,116,104,115,12,115,101,118,101, 110,101,105,103,104,116,104,115,7,117,110,105,50,49,53,70, 7,117,110,105,50,49,54,48,7,117,110,105,50,49,54,49, 7,117,110,105,50,49,54,50,7,117,110,105,50,49,54,51, 7,117,110,105,50,49,54,52,7,117,110,105,50,49,54,53, 7,117,110,105,50,49,54,54,7,117,110,105,50,49,54,55, 7,117,110,105,50,49,54,56,7,117,110,105,50,49,54,57, 7,117,110,105,50,49,54,65,7,117,110,105,50,49,54,66, 7,117,110,105,50,49,54,67,7,117,110,105,50,49,54,68, 7,117,110,105,50,49,54,69,7,117,110,105,50,49,54,70, 7,117,110,105,50,49,55,48,7,117,110,105,50,49,55,49, 7,117,110,105,50,49,55,50,7,117,110,105,50,49,55,51, 7,117,110,105,50,49,55,52,7,117,110,105,50,49,55,53, 7,117,110,105,50,49,55,54,7,117,110,105,50,49,55,55, 7,117,110,105,50,49,55,56,7,117,110,105,50,49,55,57, 7,117,110,105,50,49,55,65,7,117,110,105,50,49,55,66, 7,117,110,105,50,49,55,67,7,117,110,105,50,49,55,68, 7,117,110,105,50,49,55,69,7,117,110,105,50,49,55,70, 9,97,114,114,111,119,108,101,102,116,7,97,114,114,111,119, 117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114, 114,111,119,100,111,119,110,9,97,114,114,111,119,98,111,116, 104,9,97,114,114,111,119,117,112,100,110,14,99,97,114,114, 105,97,103,101,114,101,116,117,114,110,12,97,114,114,111,119, 100,98,108,108,101,102,116,10,97,114,114,111,119,100,98,108, 117,112,13,97,114,114,111,119,100,98,108,114,105,103,104,116, 12,97,114,114,111,119,100,98,108,100,111,119,110,12,97,114, 114,111,119,100,98,108,98,111,116,104,9,117,110,105,118,101, 114,115,97,108,11,101,120,105,115,116,101,110,116,105,97,108, 8,101,109,112,116,121,115,101,116,8,103,114,97,100,105,101, 110,116,7,101,108,101,109,101,110,116,10,110,111,116,101,108, 101,109,101,110,116,7,117,110,105,50,50,49,48,7,117,110, 105,50,50,49,51,12,97,115,116,101,114,105,115,107,109,97, 116,104,12,112,114,111,112,111,114,116,105,111,110,97,108,5, 97,110,103,108,101,10,108,111,103,105,99,97,108,97,110,100, 9,108,111,103,105,99,97,108,111,114,12,105,110,116,101,114, 115,101,99,116,105,111,110,5,117,110,105,111,110,7,117,110, 105,50,50,50,67,7,117,110,105,50,50,50,68,7,117,110, 105,50,50,50,69,9,116,104,101,114,101,102,111,114,101,7, 115,105,109,105,108,97,114,7,117,110,105,50,50,51,69,7, 117,110,105,50,50,52,49,7,117,110,105,50,50,52,50,7, 117,110,105,50,50,52,51,7,117,110,105,50,50,52,57,10, 99,105,114,99,108,101,112,108,117,115,7,117,110,105,50,50, 57,54,14,99,105,114,99,108,101,109,117,108,116,105,112,108, 121,13,112,101,114,112,101,110,100,105,99,117,108,97,114,7, 117,110,105,50,51,48,48,11,109,117,115,105,99,97,108,110, 111,116,101,7,117,110,105,51,48,48,49,7,117,110,105,51, 48,48,50,7,117,110,105,51,48,48,51,7,117,110,105,51, 48,48,53,7,117,110,105,51,48,48,55,7,117,110,105,51, 48,48,56,7,117,110,105,51,48,48,57,7,117,110,105,51, 48,48,65,7,117,110,105,51,48,48,66,7,117,110,105,51, 48,48,67,7,117,110,105,51,48,48,68,7,117,110,105,51, 48,48,69,7,117,110,105,51,48,48,70,7,117,110,105,51, 48,49,48,7,117,110,105,51,48,49,49,7,117,110,105,51, 48,49,52,7,117,110,105,51,48,49,53,7,117,110,105,51, 48,52,49,7,117,110,105,51,48,52,50,7,117,110,105,51, 48,52,51,7,117,110,105,51,48,52,52,7,117,110,105,51, 48,52,53,7,117,110,105,51,48,52,54,7,117,110,105,51, 48,52,55,7,117,110,105,51,48,52,56,7,117,110,105,51, 48,52,57,7,117,110,105,51,48,52,65,7,117,110,105,51, 48,52,66,7,117,110,105,51,48,52,67,7,117,110,105,51, 48,52,68,7,117,110,105,51,48,52,69,7,117,110,105,51, 48,52,70,7,117,110,105,51,48,53,48,7,117,110,105,51, 48,53,49,7,117,110,105,51,48,53,50,7,117,110,105,51, 48,53,51,7,117,110,105,51,48,53,52,7,117,110,105,51, 48,53,53,7,117,110,105,51,48,53,54,7,117,110,105,51, 48,53,55,7,117,110,105,51,48,53,56,7,117,110,105,51, 48,53,57,7,117,110,105,51,48,53,65,7,117,110,105,51, 48,53,66,7,117,110,105,51,48,53,67,7,117,110,105,51, 48,53,68,7,117,110,105,51,48,53,69,7,117,110,105,51, 48,53,70,7,117,110,105,51,48,54,48,7,117,110,105,51, 48,54,49,7,117,110,105,51,48,54,50,7,117,110,105,51, 48,54,51,7,117,110,105,51,48,54,52,7,117,110,105,51, 48,54,53,7,117,110,105,51,48,54,54,7,117,110,105,51, 48,54,55,7,117,110,105,51,48,54,56,7,117,110,105,51, 48,54,57,7,117,110,105,51,48,54,65,7,117,110,105,51, 48,54,66,7,117,110,105,51,48,54,67,7,117,110,105,51, 48,54,68,7,117,110,105,51,48,54,69,7,117,110,105,51, 48,54,70,7,117,110,105,51,48,55,48,7,117,110,105,51, 48,55,49,7,117,110,105,51,48,55,50,7,117,110,105,51, 48,55,51,7,117,110,105,51,48,55,52,7,117,110,105,51, 48,55,53,7,117,110,105,51,48,55,54,7,117,110,105,51, 48,55,55,7,117,110,105,51,48,55,56,7,117,110,105,51, 48,55,57,7,117,110,105,51,48,55,65,7,117,110,105,51, 48,55,66,7,117,110,105,51,48,55,67,7,117,110,105,51, 48,55,68,7,117,110,105,51,48,55,69,7,117,110,105,51, 48,55,70,7,117,110,105,51,48,56,48,7,117,110,105,51, 48,56,49,7,117,110,105,51,48,56,50,7,117,110,105,51, 48,56,51,7,117,110,105,51,48,56,52,7,117,110,105,51, 48,56,53,7,117,110,105,51,48,56,54,7,117,110,105,51, 48,56,55,7,117,110,105,51,48,56,56,7,117,110,105,51, 48,56,57,7,117,110,105,51,48,56,65,7,117,110,105,51, 48,56,66,7,117,110,105,51,48,56,67,7,117,110,105,51, 48,56,68,7,117,110,105,51,48,56,69,7,117,110,105,51, 48,56,70,7,117,110,105,51,48,57,48,7,117,110,105,51, 48,57,49,7,117,110,105,51,48,57,50,7,117,110,105,51, 48,57,51,7,117,110,105,51,48,57,57,7,117,110,105,51, 48,57,66,7,117,110,105,51,48,65,49,7,117,110,105,51, 48,65,50,7,117,110,105,51,48,65,51,7,117,110,105,51, 48,65,52,7,117,110,105,51,48,65,53,7,117,110,105,51, 48,65,54,7,117,110,105,51,48,65,55,7,117,110,105,51, 48,65,56,7,117,110,105,51,48,65,57,7,117,110,105,51, 48,65,65,7,117,110,105,51,48,65,66,7,117,110,105,51, 48,65,67,7,117,110,105,51,48,65,68,7,117,110,105,51, 48,65,69,7,117,110,105,51,48,65,70,7,117,110,105,51, 48,66,48,7,117,110,105,51,48,66,49,7,117,110,105,51, 48,66,50,7,117,110,105,51,48,66,51,7,117,110,105,51, 48,66,52,7,117,110,105,51,48,66,53,7,117,110,105,51, 48,66,54,7,117,110,105,51,48,66,55,7,117,110,105,51, 48,66,56,7,117,110,105,51,48,66,57,7,117,110,105,51, 48,66,65,7,117,110,105,51,48,66,66,7,117,110,105,51, 48,66,67,7,117,110,105,51,48,66,68,7,117,110,105,51, 48,66,69,7,117,110,105,51,48,66,70,7,117,110,105,51, 48,67,48,7,117,110,105,51,48,67,49,7,117,110,105,51, 48,67,50,7,117,110,105,51,48,67,51,7,117,110,105,51, 48,67,52,7,117,110,105,51,48,67,53,7,117,110,105,51, 48,67,54,7,117,110,105,51,48,67,55,7,117,110,105,51, 48,67,56,7,117,110,105,51,48,67,57,7,117,110,105,51, 48,67,65,7,117,110,105,51,48,67,66,7,117,110,105,51, 48,67,67,7,117,110,105,51,48,67,68,7,117,110,105,51, 48,67,69,7,117,110,105,51,48,67,70,7,117,110,105,51, 48,68,48,7,117,110,105,51,48,68,49,7,117,110,105,51, 48,68,50,7,117,110,105,51,48,68,51,7,117,110,105,51, 48,68,52,7,117,110,105,51,48,68,53,7,117,110,105,51, 48,68,54,7,117,110,105,51,48,68,55,7,117,110,105,51, 48,68,56,7,117,110,105,51,48,68,57,7,117,110,105,51, 48,68,65,7,117,110,105,51,48,68,66,7,117,110,105,51, 48,68,67,7,117,110,105,51,48,68,68,7,117,110,105,51, 48,68,69,7,117,110,105,51,48,68,70,7,117,110,105,51, 48,69,48,7,117,110,105,51,48,69,49,7,117,110,105,51, 48,69,50,7,117,110,105,51,48,69,51,7,117,110,105,51, 48,69,52,7,117,110,105,51,48,69,53,7,117,110,105,51, 48,69,54,7,117,110,105,51,48,69,55,7,117,110,105,51, 48,69,56,7,117,110,105,51,48,69,57,7,117,110,105,51, 48,69,65,7,117,110,105,51,48,69,66,7,117,110,105,51, 48,69,67,7,117,110,105,51,48,69,68,7,117,110,105,51, 48,69,69,7,117,110,105,51,48,69,70,7,117,110,105,51, 48,70,48,7,117,110,105,51,48,70,49,7,117,110,105,51, 48,70,50,7,117,110,105,51,48,70,51,7,117,110,105,51, 48,70,52,7,117,110,105,51,48,70,53,7,117,110,105,51, 48,70,54,7,117,110,105,51,48,70,55,7,117,110,105,51, 48,70,56,7,117,110,105,51,48,70,57,7,117,110,105,51, 48,70,65,7,117,110,105,51,48,70,66,7,117,110,105,51, 48,70,67,7,117,110,105,51,48,70,68,7,117,110,105,51, 48,70,69,7,117,110,105,70,54,51,57,7,117,110,105,70, 54,51,65,7,117,110,105,70,54,51,66,7,117,110,105,70, 54,51,67,7,117,110,105,70,54,51,68,7,117,110,105,70, 54,51,69,7,117,110,105,70,54,51,70,7,117,110,105,70, 54,52,48,7,117,110,105,70,54,52,49,8,100,111,116,108, 101,115,115,106,11,99,111,109,109,97,97,99,99,101,110,116, 9,111,110,101,102,105,116,116,101,100,2,102,102,3,102,102, 105,3,102,102,108,7,117,110,105,70,66,48,53,7,117,110, 105,70,66,48,54,7,117,110,105,70,66,49,68,7,117,110, 105,70,66,49,69,9,97,102,105,105,53,55,55,48,53,7, 117,110,105,70,66,50,48,7,117,110,105,70,66,50,49,7, 117,110,105,70,66,50,50,7,117,110,105,70,66,50,51,7, 117,110,105,70,66,50,52,7,117,110,105,70,66,50,53,7, 117,110,105,70,66,50,54,7,117,110,105,70,66,50,55,7, 117,110,105,70,66,50,56,7,117,110,105,70,66,50,57,9, 97,102,105,105,53,55,54,57,52,9,97,102,105,105,53,55, 54,57,53,7,117,110,105,70,66,50,67,7,117,110,105,70, 66,50,68,7,117,110,105,70,66,50,69,7,117,110,105,70, 66,50,70,7,117,110,105,70,66,51,48,7,117,110,105,70, 66,51,49,7,117,110,105,70,66,51,50,7,117,110,105,70, 66,51,51,7,117,110,105,70,66,51,52,9,97,102,105,105, 53,55,55,50,51,7,117,110,105,70,66,51,54,7,117,110, 105,70,66,51,56,7,117,110,105,70,66,51,57,7,117,110, 105,70,66,51,65,7,117,110,105,70,66,51,66,7,117,110, 105,70,66,51,67,7,117,110,105,70,66,51,69,7,117,110, 105,70,66,52,48,7,117,110,105,70,66,52,49,7,117,110, 105,70,66,52,51,7,117,110,105,70,66,52,52,7,117,110, 105,70,66,52,54,7,117,110,105,70,66,52,55,7,117,110, 105,70,66,52,56,7,117,110,105,70,66,52,57,7,117,110, 105,70,66,52,65,9,97,102,105,105,53,55,55,48,48,7, 117,110,105,70,66,52,67,7,117,110,105,70,66,52,68,7, 117,110,105,70,66,52,69,7,117,110,105,70,66,52,70,7, 117,110,105,70,70,70,68,0,}; size_t lxFNTFreeSans_ttf_size = 264072; therion/loch/lxFile.cxx0000664000175000017500000010331312047407154014147 0ustar useruser#include "lxFile.h" // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #include #if defined LXWIN32 || defined THWIN32 #include "getline.h" #endif #endif //LXDEPCHECK - standart libraries #include "lxMath.h" #include "img.h" #if defined LXWIN32 || defined THWIN32 #define strcasecmp stricmp #endif lxFileSizeT lxFileSize::Save(lxFileBuff & ptr) { lxFileSizeT s(sizeof(uint32_t)); *((uint32_t *)(ptr)) = (uint32_t) this->m_size; lxFile::switchEndian(ptr, s); ptr += s; return s; } lxFileSizeT lxFileSize::Load(lxFileBuff & ptr) { lxFileSizeT s(sizeof(lxFileSizeT)); this->m_size = (lxFileSizeT) *((uint32_t *)(ptr)); lxFile::switchEndian((char *)(&this->m_size), s); ptr += s; return s; } lxFileSizeT lxFileDbl::Save(lxFileBuff & ptr) { lxFileSizeT s(sizeof(this->m_num)); *((double *)(ptr)) = this->m_num; lxFile::switchEndian(ptr, s); ptr += s; return s; } lxFileSizeT lxFileDbl::Load(lxFileBuff & ptr) { lxFileSizeT s(sizeof(this->m_num)); this->m_num = *((double *)(ptr)); lxFile::switchEndian((char *)(&this->m_num), s); ptr += s; return s; } lxFileDataPtr::lxFileDataPtr() { this->Clear(); } void lxFileDataPtr::Clear() { this->m_position = 0; this->m_size = 0; } lxFileSizeT lxFileDataPtr::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_position.Save(ptr); s += this->m_size.Save(ptr); return s; } lxFileSizeT lxFileDataPtr::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_position.Load(ptr); s += this->m_size.Load(ptr); return s; } lxFileData::lxFileData() { this->m_data = NULL; this->m_size = 0; this->m_buffSize = 0; } void lxFileData::Clear() { if (this->m_data != NULL) free(this->m_data); this->m_data = NULL; this->m_size = 0; this->m_buffSize = 0; } void lxFileData::Copy(lxFileSizeT size, const void * src) { this->Clear(); this->m_data = malloc(size); this->m_size = size; this->m_buffSize = size; memcpy(this->m_data, src, size); } const void * lxFileData::GetData(lxFileDataPtr ptr) { if (ptr.m_size <= 1) return NULL; else return (void *)(&(((char *)this->m_data)[ptr.m_position])); } FILE * lxFileData::GetTmpFile(lxFileDataPtr ptr) { FILE * rf; if (ptr.m_size <= 1) return NULL; rf = tmpfile(); //rf = fopen("TMPFILE.JPG","wb"); if (rf != NULL) { fwrite(&(((char *)this->m_data)[ptr.m_position]), 1, ptr.m_size, rf); fseek(rf, 0, SEEK_SET); //fclose(rf); //rf = fopen("TMPFILE.JPG","rb"); } return rf; } const char * lxFileData::GetString(lxFileDataPtr ptr) { if (ptr.m_size <= 1) return ""; else return &(((char *)this->m_data)[ptr.m_position]); } void lxFileData::BuffResize(lxFileSizeT size) { lxFileSizeT nsize; void * ndata; if (this->m_buffSize > 0) nsize = this->m_buffSize; else nsize = 1024; while (size >= nsize) nsize *= 2; this->m_buffSize = nsize; ndata = malloc(nsize); if (this->m_size > 0) memcpy(ndata, this->m_data, this->m_size); free(this->m_data); this->m_data = ndata; } lxFileDataPtr lxFileData::AppendStr(const char * str) { lxFileDataPtr res; lxFileSizeT strln; if (str == NULL) return res; strln = strlen(str); if (strln == 0) return res; return this->AppendData(str, strln + 1); } lxFileDataPtr lxFileData::AppendFile(const char * fnm) { lxFileDataPtr res; FILE * xf; xf = fopen(fnm, "rb"); if (xf != NULL) { fseek(xf, 0, SEEK_END); lxFileSizeT fsz = ftell(xf); fseek(xf, 0, SEEK_SET); if (fsz > 0) { char * cdata = new char [fsz]; fread((void *) cdata, 1, fsz, xf); res = this->AppendData(cdata, fsz); delete [] cdata; } fclose(xf); } return res; } lxFileDataPtr lxFileData::AppendData(const void * data, lxFileSizeT size) { lxFileDataPtr res; if ((data == NULL) || (size == 0)) return res; if (this->m_buffSize < this->m_size + size) this->BuffResize(this->m_size + size); res.m_position = this->m_size; res.m_size = size; memcpy(&(((char *)this->m_data)[this->m_size]), data, size); this->m_size += size; return res; } lxFileStation::lxFileStation() { this->m_flags = 0; } bool lxFileIsBigEndian() { unsigned long i = 1; const unsigned char * p = (const unsigned char *) &i; return (p[0] != 1); } bool lxFile::m_bigEndian(lxFileIsBigEndian()); void lxFile::switchEndian(char * data, lxFileSizeT size) { if (m_bigEndian) { char temp; lxFileSizeT index, rindex, total; total = size / 2; for (index = 0; index < total; index++) { rindex = size - index - 1; temp = data[index]; data[index] = data[rindex]; data[rindex] = temp; } } } lxFileShot::lxFileShot() { this->m_flags = 0; this->m_threshold = 60.0; this->m_sectionType = LXFILE_SHOT_SECTION_NONE; } lxFile::lxFile() { this->Clear(); } lxFile::~lxFile() { this->Clear(); } void lxFile::Clear() { this->m_surveys.clear(); this->m_surveysData.Clear(); this->m_nSurveys = 0; this->m_stations.clear(); this->m_stationsData.Clear(); this->m_nStations = 0; this->m_shots.clear(); this->m_shotsData.Clear(); this->m_scraps.clear(); this->m_scrapsData.Clear(); this->m_surfaces.clear(); this->m_surfacesData.Clear(); this->m_surfaceBitmaps.clear(); this->m_surfaceBitmapsData.Clear(); } enum { LXFILE_CHUNK_SURVEY = 1, LXFILE_CHUNK_STATION = 2, LXFILE_CHUNK_SHOT = 3, LXFILE_CHUNK_SCRAP = 4, LXFILE_CHUNK_SURFACE = 5, LXFILE_CHUNK_SURFACEBMP = 6, }; struct lxFileChunkHdr { lxFileSize m_type, m_recSize, m_recCount, m_dataSize; lxFileSizeT Save(lxFileBuff & ptr); lxFileSizeT Load(lxFileBuff & ptr); }; lxFileSizeT lxFileChunkHdr::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_type.Save(ptr); s += this->m_recSize.Save(ptr); s += this->m_recCount.Save(ptr); s += this->m_dataSize.Save(ptr); return s; } lxFileSizeT lxFileChunkHdr::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_type.Load(ptr); s += this->m_recSize.Load(ptr); s += this->m_recCount.Load(ptr); s += this->m_dataSize.Load(ptr); return s; } lxFileSizeT lxFile3Point::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_c[0].Save(ptr); s += this->m_c[1].Save(ptr); s += this->m_c[2].Save(ptr); return s; } lxFileSizeT lxFile3Angle::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_v[0].Load(ptr); s += this->m_v[1].Load(ptr); s += this->m_v[2].Load(ptr); return s; } void lxFile::ExportLOX(const char * fn) { this->m_error.clear(); this->m_file = fopen(fn,"wb"); if (this->m_file == NULL) { this->m_error = "unable to open file for output"; return; } // write data lxFileChunkHdr chunkHdr; char * tmpPtr, * chunkHdrPtr, chunkHdrBuffer [sizeof(chunkHdr)]; lxFileSizeT chunkHdrSize, tmpSize; bool writeErr; writeErr = false; lxFileSizeT x, size; #define lxFileExportItem(expID, expClass, expRecs, expData) \ size = this->expRecs.size(); \ if ((!writeErr) && (size > 0)) { \ char * tmpData = new char [size * sizeof(expClass)]; \ tmpPtr = tmpData; tmpSize = 0; \ expClass##_list::iterator tmpIter = this->expRecs.begin(); \ for (x = 0; x < size; x++) { \ tmpSize += tmpIter->Save(tmpPtr); \ tmpIter++; \ } \ chunkHdr.m_type = expID; \ chunkHdr.m_recSize = tmpSize; \ chunkHdr.m_recCount = size; \ chunkHdr.m_dataSize = this->expData.m_size; \ chunkHdrPtr = chunkHdrBuffer; \ chunkHdrSize = chunkHdr.Save(chunkHdrPtr); \ if (fwrite(&chunkHdrBuffer, chunkHdrSize, 1, this->m_file) != 1) \ writeErr = true; \ if (fwrite(tmpData, tmpSize, 1, this->m_file) != 1) \ writeErr = true; \ if (chunkHdr.m_dataSize > 0) \ if (fwrite(this->expData.m_data, chunkHdr.m_dataSize, 1, this->m_file) != 1) \ writeErr = true; \ delete [] tmpData; \ } lxFileExportItem(LXFILE_CHUNK_SURVEY, lxFileSurvey, m_surveys, m_surveysData); lxFileExportItem(LXFILE_CHUNK_STATION, lxFileStation, m_stations, m_stationsData); lxFileExportItem(LXFILE_CHUNK_SHOT, lxFileShot, m_shots, m_shotsData); lxFileExportItem(LXFILE_CHUNK_SCRAP, lxFileScrap, m_scraps, m_scrapsData); lxFileExportItem(LXFILE_CHUNK_SURFACE, lxFileSurface, m_surfaces, m_surfacesData); lxFileExportItem(LXFILE_CHUNK_SURFACEBMP, lxFileSurfaceBitmap, m_surfaceBitmaps, m_surfaceBitmapsData); /* size = this->m_surveys.size(); if ((!writeErr) && (size > 0)) { lxFileSurvey * tmpData = new lxFileSurvey [size]; lxFileSurvey_list::iterator tmpIter = this->m_surveys.begin(); for (x = 0; x < size; x++) { tmpData[x] = *tmpIter; tmpIter++; } chunkHdr.m_type = LXFILE_CHUNK_SURVEY; chunkHdr.m_recSize = sizeof(lxFileSurvey); chunkHdr.m_recCount = size; chunkHdr.m_dataSize = this->m_surveysData.m_size; if (fwrite(&chunkHdr, sizeof(chunkHdr), 1, this->m_file) != 1) writeErr = true; if (fwrite(tmpData, chunkHdr.m_recSize, size, this->m_file) != size) writeErr = true; if (chunkHdr.m_dataSize > 0) if (fwrite(this->m_surveysData.m_data, chunkHdr.m_dataSize, 1, this->m_file) != 1) writeErr = true; delete [] tmpData; } */ fclose(this->m_file); if (writeErr) this->m_error = "error writing to file."; } void lxFile::ImportLOX(const char * fn) { this->m_error.clear(); this->m_file = fopen(fn,"rb"); if (this->m_file == NULL) { this->m_error = "unable to open file for input"; return; } lxFileChunkHdr chunkHdr; lxFileSizeT i, orig_size, orig_survey_id, orig_station_id; char * tmpPtr, * chunkHdrPtr, * tmpRecsData, chunkHdrBuffer [sizeof(chunkHdr)]; lxFileSizeT chunkHdrSize; chunkHdrPtr = chunkHdrBuffer; chunkHdrSize = chunkHdr.Save(chunkHdrPtr); orig_survey_id = 0; for(lxFileSurvey_list::iterator itsurv = this->m_surveys.begin(); itsurv != this->m_surveys.end(); itsurv++) { if (orig_survey_id < itsurv->m_id) orig_survey_id = itsurv->m_id; } orig_station_id = 0; for(lxFileStation_list::iterator itstat = this->m_stations.begin(); itstat != this->m_stations.end(); itstat++) { if (orig_station_id < itstat->m_id) orig_station_id = itstat->m_id; } bool readErr = false; while ((!readErr) && (!feof(this->m_file)) && (fread(chunkHdrBuffer, chunkHdrSize, 1, this->m_file) == 1)) { chunkHdrPtr = chunkHdrBuffer; chunkHdr.Load(chunkHdrPtr); switch (chunkHdr.m_type) { /* case LXFILE_CHUNK_SURVEY: if (chunkHdr.m_recCount > 0) { orig_size = this->m_surveysData.m_size; lxFileSurvey * tmpRecs = new lxFileSurvey [chunkHdr.m_recCount]; if (fread(tmpRecs, sizeof(lxFileSurvey), chunkHdr.m_recCount, this->m_file) != chunkHdr.m_recCount) readErr = true; if ((!readErr) && (chunkHdr.m_dataSize > 0)) { void * tmpData = malloc(chunkHdr.m_dataSize); if (fread(tmpData, chunkHdr.m_dataSize, 1, this->m_file) != 1) readErr = true; else this->m_surveysData.AppendData(tmpData, chunkHdr.m_dataSize); free(tmpData); } if (!readErr) { for(i = 0; i < chunkHdr.m_recCount; i++) { tmpRecs[i].m_namePtr.m_position += orig_size; tmpRecs[i].m_titlePtr.m_position += orig_size; this->m_surveys.push_back(tmpRecs[i]); } } delete [] tmpRecs; } break; */ #define lxFileStartImportItem(impID, impClass, impData) \ case impID: \ if (chunkHdr.m_recCount > 0) { \ orig_size = this->impData.m_size; \ tmpRecsData = new char [chunkHdr.m_recSize]; \ impClass tmpRec; \ if (fread(tmpRecsData, chunkHdr.m_recSize, 1, this->m_file) != 1) \ readErr = true; \ if ((!readErr) && (chunkHdr.m_dataSize > 0)) { \ void * tmpData = malloc(chunkHdr.m_dataSize); \ if (fread(tmpData, chunkHdr.m_dataSize, 1, this->m_file) != 1) \ readErr = true; \ else \ this->impData.AppendData(tmpData, chunkHdr.m_dataSize); \ free(tmpData); \ } \ if (!readErr) { \ tmpPtr = tmpRecsData; \ for(i = 0; i < chunkHdr.m_recCount; i++) { \ tmpRec.Load(tmpPtr); #define lxFileEndImportItem() \ } \ } \ delete [] tmpRecsData; \ } \ break; lxFileStartImportItem(LXFILE_CHUNK_SURVEY, lxFileSurvey, m_surveysData) tmpRec.m_id += orig_survey_id; tmpRec.m_namePtr.m_position += orig_size; tmpRec.m_titlePtr.m_position += orig_size; this->m_surveys.push_back(tmpRec); this->m_nSurveys++; lxFileEndImportItem() lxFileStartImportItem(LXFILE_CHUNK_STATION, lxFileStation, m_stationsData) tmpRec.m_id += orig_station_id; tmpRec.m_surveyId += orig_survey_id; tmpRec.m_namePtr.m_position += orig_size; tmpRec.m_commentPtr.m_position += orig_size; this->m_stations.push_back(tmpRec); this->m_nStations++; lxFileEndImportItem() lxFileStartImportItem(LXFILE_CHUNK_SHOT, lxFileShot, m_shotsData) tmpRec.m_from += orig_station_id; tmpRec.m_to += orig_station_id; tmpRec.m_surveyId += orig_survey_id; this->m_shots.push_back(tmpRec); lxFileEndImportItem() lxFileStartImportItem(LXFILE_CHUNK_SCRAP, lxFileScrap, m_scrapsData) tmpRec.m_pointsPtr.m_position += orig_size; tmpRec.m_3AnglesPtr.m_position += orig_size; tmpRec.m_surveyId += orig_survey_id; this->m_scraps.push_back(tmpRec); lxFileEndImportItem() lxFileStartImportItem(LXFILE_CHUNK_SURFACE, lxFileSurface, m_surfacesData) tmpRec.m_dataPtr.m_position += orig_size; this->m_surfaces.push_back(tmpRec); lxFileEndImportItem() lxFileStartImportItem(LXFILE_CHUNK_SURFACEBMP, lxFileSurfaceBitmap, m_surfaceBitmapsData) tmpRec.m_dataPtr.m_position += orig_size; this->m_surfaceBitmaps.push_back(tmpRec); lxFileEndImportItem() default: readErr = true; } } fclose(this->m_file); } lxFileSizeT lxFile__SplitTokens(unsigned char * str, unsigned char ** tokens, lxFileSizeT max_tokens) { lxFileSizeT nt = 0, sl, sp; unsigned char * cc; bool inside = false; if ((str == NULL) || (max_tokens == 0)) return 0; sl = strlen((char *)str); max_tokens--; for (sp = 0, cc = str; (sp < sl) && (nt < max_tokens); sp++, cc++) { if (inside && (*cc < 33)) { *cc = 0; inside = false; nt++; } else if ((!inside) && (*cc > 32)) { inside = true; tokens[nt] = cc; } } return nt; } bool lxFile__CheckLRUD(double & du, double & dd, double & dl, double & dr, double mv, double mh) { if ((du <= 0.0) && (dd <= 0.0) && (dl <= 0.0) && (dr <= 0.0)) { return false; } else { if (mv > 0.0) { if (du < 0.0) du = mv; if (dd < 0.0) dd = mv; if (dl < 0.0) dl = mv; if (dr < 0.0) dr = mv; return true; } else { // LR if ((du < 0.0) && (dd >= 0.0)) du = dd; if ((dd < 0.0) && (du >= 0.0)) dd = du; // UD if ((dl < 0.0) && (dr >= 0.0)) dl = dr; if ((dr < 0.0) && (dl >= 0.0)) { dr = dl; if (dr > mh) dr = mh; } if (du < 0.0) { du = dd = (dl + dr) / 2.0; } if (dl < 0.0) { dl = dr = (du + dd) / 2.0; if (dr > mh) dr = mh; } return true; } } } lxFileSizeT lxFileSurvey::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Save(ptr); s += this->m_namePtr.Save(ptr); s += this->m_parent.Save(ptr); s += this->m_titlePtr.Save(ptr); return s; } lxFileSizeT lxFileSurvey::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Load(ptr); s += this->m_namePtr.Load(ptr); s += this->m_parent.Load(ptr); s += this->m_titlePtr.Load(ptr); return s; } lxFileSurvey * lxFile::NewSurvey() { lxFileSurvey tmp; tmp.m_id = this->m_nSurveys++; this->m_surveys.push_back(tmp); return &(this->m_surveys.back()); } lxFileStation * lxFile::NewStation() { lxFileStation tmp; tmp.m_id = this->m_nStations++; this->m_stations.push_back(tmp); return &(this->m_stations.back()); } lxFileShot * lxFile::NewShot() { this->m_shots.push_back(lxFileShot()); return &(this->m_shots.back()); } #define PltLrudNaN(x) {if ((x < 0.0) || (long(x*100) == 99900)) x = -999.0;} void lxFile::ImportPLT(const char * fn) { this->m_error.clear(); char * prevlocale = setlocale(LC_NUMERIC,NULL); setlocale(LC_NUMERIC,"C"); size_t lns; char * lnp; char ln[1024]; lns = 1024; lnp = &(ln[0]); bool lrudOK, lrudOKPrev = false; unsigned char * tok[16]; lxFileDbl lrud[4], lrudPrev[4]; lrudPrev[0] = lrudPrev[1] = lrudPrev[2] = lrudPrev[3] = -1.0; lxFileSizeT nt; this->m_file = fopen(fn,"r"); if (this->m_file == NULL) { this->m_error = "unable to open file for input"; return; } #define tok2num(v, n) v = atof((const char *)tok[n]); lxFileSurvey * tmpSurvey; lxFileShot * shPtr; lxFileStation * stPtr, * stPtrPrev; stPtrPrev = 0; bool hasPT = false; char * sname = new char [strlen(fn)+1]; int x, xx; xx = 0; for (x = (strlen(fn) - 1); x >= 0; x--) { if ((fn[x] == '\\') || (fn[x] == '/')) { xx = x + 1; break; } } for (x = xx; (x < int(strlen(fn))) && (strcasecmp(&(fn[x]),".PLT") != 0); x++) { sname[x - xx] = fn[x]; sname[x - xx + 1] = 0; } tmpSurvey = this->NewSurvey(); tmpSurvey->m_namePtr = this->m_surveysData.AppendStr(sname); delete [] sname; while (!feof(this->m_file)) { getline(&lnp, &lns, this->m_file); nt = lxFile__SplitTokens((unsigned char *) lnp, &(tok[0]), 16); switch (*(tok[0])) { case 'M': case 'D': if (!hasPT && (*(tok[0]) == 'D')) { *(tok[0]) = 'M'; } tok2num(lrud[0],6);PltLrudNaN(lrud[0]); tok2num(lrud[1],9);PltLrudNaN(lrud[1]); tok2num(lrud[2],7);PltLrudNaN(lrud[2]); tok2num(lrud[3],8);PltLrudNaN(lrud[3]); lrudOK = lxFile__CheckLRUD(lrud[0], lrud[1], lrud[2], lrud[3], 2.0, 5.0); if (lrudOK) { lrud[0] *= 0.3048; lrud[1] *= 0.3048; lrud[2] *= 0.3048; lrud[3] *= 0.3048; } stPtr = this->NewStation(); tok2num(stPtr->m_c[0],2); tok2num(stPtr->m_c[1],1); tok2num(stPtr->m_c[2],3); stPtr->m_c[0] *= 0.3048; stPtr->m_c[1] *= 0.3048; stPtr->m_c[2] *= 0.3048; stPtr->m_surveyId = tmpSurvey->m_id; hasPT = true; if (*(tok[0]) == 'D') { shPtr = this->NewShot(); shPtr->m_from = stPtrPrev->m_id; shPtr->m_to = stPtr->m_id; shPtr->m_fLRUD[0] = lrudPrev[0]; shPtr->m_fLRUD[1] = lrudPrev[1]; shPtr->m_fLRUD[2] = lrudPrev[2]; shPtr->m_fLRUD[3] = lrudPrev[3]; shPtr->m_tLRUD[0] = lrud[0]; shPtr->m_tLRUD[1] = lrud[1]; shPtr->m_tLRUD[2] = lrud[2]; shPtr->m_tLRUD[3] = lrud[3]; shPtr->m_surveyId = tmpSurvey->m_id; if (lrudOK && lrudOKPrev) { shPtr->m_sectionType = LXFILE_SHOT_SECTION_OVAL; } else { shPtr->m_sectionType = LXFILE_SHOT_SECTION_NONE; } } lrudPrev[0] = lrud[0]; lrudPrev[1] = lrud[1]; lrudPrev[2] = lrud[2]; lrudPrev[3] = lrud[3]; lrudOKPrev = lrudOK; stPtrPrev = stPtr; break; } } fclose(this->m_file); setlocale(LC_NUMERIC,prevlocale); } struct imp3Dpos { double x, y, z; imp3Dpos(double xx, double yy, double zz) : x(xx), y(yy), z(zz) {} }; bool operator < (const imp3Dpos & p1, const imp3Dpos & p2) { if (p1.x < p2.x) return true; if (p1.x > p2.x) return false; if (p1.y < p2.y) return true; if (p1.y > p2.y) return false; if (p1.z < p2.z) return true; return false; } void lxFile::Import3D(const char * fn) { this->m_error.clear(); img_point imgpt; img * pimg; int result; bool lrudOK, lrudOKPrev = false; lxFileDbl lrud[4], lrudPrev[4]; lrudPrev[0] = lrudPrev[1] = lrudPrev[2] = lrudPrev[3] = -1.0; pimg = img_open(fn); if (pimg == NULL) { this->m_error = "unable to open file for input"; return; } lxFileSurvey * tmpSurvey; lxFileShot * shPtr; lxFileStation * stPtr, * stPtrPrev, * stPtrLRUD, * stPtrLRUDPrev; stPtr = NULL; stPtrPrev = NULL; stPtrLRUDPrev = NULL; bool hasPT = false; char * sname = new char [strlen(fn)+1]; int x, xx; xx = 0; for (x = (strlen(fn) - 1); x >= 0; x--) { if ((fn[x] == '\\') || (fn[x] == '/')) { xx = x + 1; break; } } for (x = xx; (x < int(strlen(fn))) && (strcasecmp(&(fn[x]),".PLT") != 0); x++) { sname[x - xx] = fn[x]; sname[x - xx + 1] = 0; } tmpSurvey = this->NewSurvey(); tmpSurvey->m_namePtr = this->m_surveysData.AppendStr(sname); delete [] sname; int last_result; std::map label_map; std::map::iterator lmi; std::map pos_map; std::map::iterator pmi; // Create all stations with names // Set HAS_WALLS flag if applicable do { result = img_read_item(pimg, &imgpt); switch (result) { case img_LABEL: if (pimg->label != NULL) { stPtr = this->NewStation(); stPtr->m_c[0] = imgpt.x; stPtr->m_c[1] = imgpt.y; stPtr->m_c[2] = imgpt.z; stPtr->m_surveyId = tmpSurvey->m_id; label_map[std::string(pimg->label)] = stPtr; pos_map[imp3Dpos(imgpt.x, imgpt.y, imgpt.z)] = stPtr; } break; case img_XSECT: lmi = label_map.find(pimg->label); if (lmi != label_map.end()) { stPtr = lmi->second; stPtr->SetFlag(LXFILE_STATION_FLAG_HAS_WALLS, true); } break; case img_BAD: this->m_error = "invalid file format"; return; } } while (result != img_STOP); img_rewind(pimg); stPtr = NULL; do { result = img_read_item(pimg, &imgpt); switch (result) { case img_MOVE: case img_LINE: if ((!hasPT) && (result == img_LINE)) { result = img_MOVE; } pmi = pos_map.find(imp3Dpos(imgpt.x, imgpt.y, imgpt.z)); if (pmi != pos_map.end()) { stPtr = pmi->second; } else { stPtr = this->NewStation(); stPtr->m_c[0] = imgpt.x; stPtr->m_c[1] = imgpt.y; stPtr->m_c[2] = imgpt.z; stPtr->m_surveyId = tmpSurvey->m_id; } hasPT = true; if (result == img_LINE) { shPtr = this->NewShot(); shPtr->m_from = stPtrPrev->m_id; shPtr->m_to = stPtr->m_id; shPtr->m_surveyId = tmpSurvey->m_id; shPtr->m_sectionType = LXFILE_SHOT_SECTION_NONE; if ((pimg->flags & img_FLAG_SURFACE) != 0) { shPtr->SetFlag(LXFILE_SHOT_FLAG_SURFACE, true); } if ((pimg->flags & img_FLAG_DUPLICATE) != 0) { shPtr->SetFlag(LXFILE_SHOT_FLAG_DUPLICATE, true); } if (stPtr->GetFlag(LXFILE_STATION_FLAG_HAS_WALLS) || stPtrPrev->GetFlag(LXFILE_STATION_FLAG_HAS_WALLS)) { shPtr->SetFlag(LXFILE_SHOT_FLAG_NOT_LRUD, true); } } stPtrPrev = stPtr; last_result = result; break; case img_XSECT: lmi = label_map.find(pimg->label); if (lmi != label_map.end()) { stPtrLRUD = lmi->second; lrud[0] = pimg->l; lrud[1] = pimg->r; lrud[2] = pimg->u; lrud[3] = pimg->d; lrudOK = lxFile__CheckLRUD(lrud[0], lrud[1], lrud[2], lrud[3], 2.0, 5.0); if (lrudOK) { stPtr->SetFlag(LXFILE_STATION_FLAG_HAS_WALLS, true); } if ((stPtrLRUDPrev != NULL) && lrudOK && lrudOKPrev) { shPtr = this->NewShot(); shPtr->m_from = stPtrLRUDPrev->m_id; shPtr->m_to = stPtrLRUD->m_id; shPtr->m_fLRUD[0] = lrudPrev[0]; shPtr->m_fLRUD[1] = lrudPrev[1]; shPtr->m_fLRUD[2] = lrudPrev[2]; shPtr->m_fLRUD[3] = lrudPrev[3]; shPtr->m_tLRUD[0] = lrud[0]; shPtr->m_tLRUD[1] = lrud[1]; shPtr->m_tLRUD[2] = lrud[2]; shPtr->m_tLRUD[3] = lrud[3]; shPtr->m_surveyId = tmpSurvey->m_id; shPtr->m_sectionType = LXFILE_SHOT_SECTION_OVAL; shPtr->SetFlag(LXFILE_SHOT_FLAG_NOT_VISIBLE, true); shPtr->SetFlag(LXFILE_SHOT_FLAG_NOT_LRUD, true); } } else { stPtrLRUD = NULL; lrud[0] = lrud[1] = lrud[2] = lrud[3] = -999.0; lrudOK = false; lrud[0] = -999.0; } lrudPrev[0] = lrud[0]; lrudPrev[1] = lrud[1]; lrudPrev[2] = lrud[2]; lrudPrev[3] = lrud[3]; stPtrLRUDPrev = stPtrLRUD; lrudOKPrev = lrudOK; break; case img_XSECT_END: stPtrLRUDPrev = NULL; break; case img_BAD: this->m_error = "invalid file format"; return; } } while (result != img_STOP); img_close(pimg); } struct missingShot { lxFileSizeT f, t; double length; }; struct missingStation { lxVec position; double average, sum, count; }; void lxFile::InterpolateMissingLRUD() { if (this->m_shots.size() == 0) return; if (this->m_stations.size() == 0) return; std::map stmap; std::vector osts; std::vector stations; std::list shots; lxFileSizeT ns, i; // 0. vytvorit vector originalnych stations lxFileStation_list::iterator osti; osts.resize(this->m_stations.size()); for (osti = this->m_stations.begin(); osti != this->m_stations.end(); osti++) { osts[osti->m_id] = &(*osti); } // 1. vytvorit zoznam identickych bodov a zamer medzi nimi ns = 0; std::list::iterator shi; std::map::iterator stmi; lxFileStation * st; missingStation tst; missingShot ts; lxVec fp, tp; for (shi = this->m_shots.begin(); shi != this->m_shots.end(); shi++) { if (!(shi->GetFlag(LXFILE_SHOT_FLAG_SURFACE) || shi->GetFlag(LXFILE_SHOT_FLAG_DUPLICATE) || shi->GetFlag(LXFILE_SHOT_FLAG_NOT_VISIBLE) || shi->GetFlag(LXFILE_SHOT_FLAG_NOT_LRUD))) { // from st = osts[shi->m_from]; fp = lxVec(st->m_c[0],st->m_c[1],st->m_c[2]); stmi = stmap.find(fp); if (stmi == stmap.end()) { ts.f = ns; stmap[fp] = ts.f; tst.position = fp; stations.push_back(tst); ns++; } else { ts.f = stmi->second; } // to st = osts[shi->m_to]; tp = lxVec(st->m_c[0],st->m_c[1],st->m_c[2]); stmi = stmap.find(tp); if (stmi == stmap.end()) { ts.t = ns; stmap[tp] = ts.t; ns++; tst.position = tp; stations.push_back(tst); } else { ts.t = stmi->second; } ts.length = (tp - fp).Length(); shots.push_back(ts); } } // 2. zratat priemerne dlzky if (ns == 0) return; std::list::iterator shli; for(i = 0; i < ns; i++) { stations[i].sum = 0.0; stations[i].count = 0.0; } for(shli = shots.begin(); shli != shots.end(); shli++) { stations[shli->f].sum += shli->length; stations[shli->f].count += 1.0; stations[shli->t].sum += shli->length; stations[shli->t].count += 1.0; } for(i = 0; i < ns; i++) { stations[i].average = stations[i].sum / stations[i].count; stations[i].sum = stations[i].average; stations[i].count = 1.0; } // 3. urobit klzavy priemer for(shli = shots.begin(); shli != shots.end(); shli++) { stations[shli->f].sum += stations[shli->t].average; stations[shli->t].sum += stations[shli->f].average; stations[shli->f].count += 1.0; stations[shli->t].count += 1.0; } double avg; for(i = 0; i < ns; i++) { avg = 0.25 * stations[i].sum / stations[i].count; if (avg < 0.5) avg = 0.3048; stations[i].average = avg; } // 4. interpolovat LRUD vsade kde ho nemame a neni surface for (shi = this->m_shots.begin(); shi != this->m_shots.end(); shi++) { if (!(shi->GetFlag(LXFILE_SHOT_FLAG_SURFACE) || shi->GetFlag(LXFILE_SHOT_FLAG_DUPLICATE) || shi->GetFlag(LXFILE_SHOT_FLAG_NOT_VISIBLE) || shi->GetFlag(LXFILE_SHOT_FLAG_NOT_LRUD))) { if (shi->m_sectionType == LXFILE_SHOT_SECTION_NONE) { shi->m_sectionType = LXFILE_SHOT_SECTION_OVAL; st = osts[shi->m_from]; fp = lxVec(st->m_c[0],st->m_c[1],st->m_c[2]); i = stmap[fp]; avg = stations[i].average; shi->m_fLRUD[0] = avg; shi->m_fLRUD[1] = avg; shi->m_fLRUD[2] = avg; shi->m_fLRUD[3] = lxMin(avg, 1.5); st = osts[shi->m_to]; tp = lxVec(st->m_c[0],st->m_c[1],st->m_c[2]); i = stmap[tp]; avg = stations[i].average; shi->m_tLRUD[0] = avg; shi->m_tLRUD[1] = avg; shi->m_tLRUD[2] = avg; shi->m_tLRUD[3] = lxMin(avg, 1.5); } } } } lxFileSizeT lxFileStation::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Save(ptr); s += this->m_surveyId.Save(ptr); s += this->m_namePtr.Save(ptr); s += this->m_commentPtr.Save(ptr); s += this->m_flags.Save(ptr); s += this->m_c[0].Save(ptr); s += this->m_c[1].Save(ptr); s += this->m_c[2].Save(ptr); return s; } lxFileSizeT lxFileStation::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Load(ptr); s += this->m_surveyId.Load(ptr); s += this->m_namePtr.Load(ptr); s += this->m_commentPtr.Load(ptr); s += this->m_flags.Load(ptr); s += this->m_c[0].Load(ptr); s += this->m_c[1].Load(ptr); s += this->m_c[2].Load(ptr); return s; } void lxFileStation::SetFlag(int flag, bool value) { if (value) this->m_flags |= flag; else this->m_flags &= ~flag; } bool lxFileStation::GetFlag(int flag) { return ((this->m_flags & flag) != 0); } lxFileSizeT lxFileShot::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_from.Save(ptr); s += this->m_to.Save(ptr); s += this->m_fLRUD[0].Save(ptr); s += this->m_fLRUD[1].Save(ptr); s += this->m_fLRUD[2].Save(ptr); s += this->m_fLRUD[3].Save(ptr); s += this->m_tLRUD[0].Save(ptr); s += this->m_tLRUD[1].Save(ptr); s += this->m_tLRUD[2].Save(ptr); s += this->m_tLRUD[3].Save(ptr); s += this->m_flags.Save(ptr); s += this->m_sectionType.Save(ptr); s += this->m_surveyId.Save(ptr); s += this->m_threshold.Save(ptr); return s; } lxFileSizeT lxFileShot::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_from.Load(ptr); s += this->m_to.Load(ptr); s += this->m_fLRUD[0].Load(ptr); s += this->m_fLRUD[1].Load(ptr); s += this->m_fLRUD[2].Load(ptr); s += this->m_fLRUD[3].Load(ptr); s += this->m_tLRUD[0].Load(ptr); s += this->m_tLRUD[1].Load(ptr); s += this->m_tLRUD[2].Load(ptr); s += this->m_tLRUD[3].Load(ptr); s += this->m_flags.Load(ptr); s += this->m_sectionType.Load(ptr); s += this->m_surveyId.Load(ptr); s += this->m_threshold.Load(ptr); return s; } void lxFileShot::SetFlag(int flag, bool value) { if (value) this->m_flags |= flag; else this->m_flags &= ~flag; } bool lxFileShot::GetFlag(int flag) { return ((this->m_flags & flag) != 0); } lxFileSizeT lxFileScrap::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Save(ptr); s += this->m_surveyId.Save(ptr); s += this->m_numPoints.Save(ptr); s += this->m_pointsPtr.Save(ptr); s += this->m_num3Angles.Save(ptr); s += this->m_3AnglesPtr.Save(ptr); return s; } lxFileSizeT lxFileScrap::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Load(ptr); s += this->m_surveyId.Load(ptr); s += this->m_numPoints.Load(ptr); s += this->m_pointsPtr.Load(ptr); s += this->m_num3Angles.Load(ptr); s += this->m_3AnglesPtr.Load(ptr); return s; } lxFileSizeT lxFileSurface::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Save(ptr); s += this->m_width.Save(ptr); s += this->m_height.Save(ptr); s += this->m_dataPtr.Save(ptr); s += this->m_calib[0].Save(ptr); s += this->m_calib[1].Save(ptr); s += this->m_calib[2].Save(ptr); s += this->m_calib[3].Save(ptr); s += this->m_calib[4].Save(ptr); s += this->m_calib[5].Save(ptr); return s; } lxFileSizeT lxFileSurface::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_id.Load(ptr); s += this->m_width.Load(ptr); s += this->m_height.Load(ptr); s += this->m_dataPtr.Load(ptr); s += this->m_calib[0].Load(ptr); s += this->m_calib[1].Load(ptr); s += this->m_calib[2].Load(ptr); s += this->m_calib[3].Load(ptr); s += this->m_calib[4].Load(ptr); s += this->m_calib[5].Load(ptr); return s; } lxFileSizeT lxFileSurfaceBitmap::Save(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_surfaceId.Save(ptr); s += this->m_type.Save(ptr); s += this->m_dataPtr.Save(ptr); s += this->m_calib[0].Save(ptr); s += this->m_calib[1].Save(ptr); s += this->m_calib[2].Save(ptr); s += this->m_calib[3].Save(ptr); s += this->m_calib[4].Save(ptr); s += this->m_calib[5].Save(ptr); return s; } lxFileSizeT lxFileSurfaceBitmap::Load(lxFileBuff & ptr) { lxFileSizeT s(0); s += this->m_surfaceId.Load(ptr); s += this->m_type.Load(ptr); s += this->m_dataPtr.Load(ptr); s += this->m_calib[0].Load(ptr); s += this->m_calib[1].Load(ptr); s += this->m_calib[2].Load(ptr); s += this->m_calib[3].Load(ptr); s += this->m_calib[4].Load(ptr); s += this->m_calib[5].Load(ptr); return s; } bool lxFile::HasAnyWalls() { if (this->m_scraps.size() > 0) return true; std::list::iterator shi; for (shi = this->m_shots.begin(); shi != this->m_shots.end(); shi++) { if (!(shi->GetFlag(LXFILE_SHOT_FLAG_SURFACE) || shi->GetFlag(LXFILE_SHOT_FLAG_DUPLICATE) || shi->GetFlag(LXFILE_SHOT_FLAG_NOT_LRUD))) { if (shi->m_sectionType != LXFILE_SHOT_SECTION_NONE) { return true; } } } return false; } therion/loch/loch.res0000664000175000017500000006162210344434474013651 0ustar useruserL|c.rsrca<La8@À¸›’CH€€h€X€ ˆ€X€ˆ€¸›’CÈ€à€ø€€(€@€X€p€ ˆ€  € ¸€ Ѐ 耀¸›’C H ¸›’C X ¸›’C h ¸›’C x ¸›’C ˆ ¸›’C ˜ ¸›’C ¨ ¸›’C ¸ ¸›’C È ¸›’C Ø ¸›’C è ¸›’C ø ¸›’C  ¸›’C  ¸›’C¸€8€È€P€¸›’C ( ¸›’C 8 ¸›’Cð€€ €8€P€h€€€˜€ °€ È€ à€ ø€ €(€@€¸›’C H ¸›’C X ¸›’C h ¸›’C x ¸›’C ˆ ¸›’C ˜ ¸›’C ¨ ¸›’C ¸ ¸›’C È ¸›’C Ø ¸›’C è ¸›’C ø ¸›’C  ¸›’C  ¸›’C ( ¸›’Cò€p€¸›’C 8 ¸›’C €€*€ €N€8€l€P€ˆ€h€®€€€Ò€˜€ò€°€ €È€0 €à€P €ø€p €€š €(€º €@€¸›’C H ¸›’C X ¸›’C h ¸›’C x ¸›’C ˆ ¸›’C ˜ ¸›’C ¨ ¸›’C ¸ ¸›’C È ¸›’C Ø ¸›’C è ¸›’C ø ¸›’C ¸›’C ¸›’C Ø €°€ê €È€ €à€F €ø€r €€˜ €(€¼ €@€ä €X€ €p€¸›’C (¸›’C 8¸›’C H¸›’C X¸›’C h¸›’C x¸›’C ˆ¸›’C ˜¸›’C ¨¸›’C €¸›’C ¸CSQUERYWXBITMAP_STD_COLOURS WXWINDOWMENUWXCURSOR_BLANKWXCURSOR_BULLSEYEWXCURSOR_CROSS WXCURSOR_HANDWXCURSOR_MAGNIFIERWXCURSOR_NO_ENTRYWXCURSOR_PBRUSHWXCURSOR_PENCILWXCURSOR_PLEFTWXCURSOR_PRIGHTWXCURSOR_QARROWWXCURSOR_RIGHT_ARROWWXCURSOR_ROLLERWXCURSOR_WATCHLOCHICONWXICON_SMALL_CDROMWXICON_SMALL_CLOSED_FOLDERWXICON_SMALL_COMPUTERWXICON_SMALL_DRIVEWXICON_SMALL_FILEWXICON_SMALL_FLOPPYWXICON_SMALL_OPEN_FOLDERWXICON_SMALL_REMOVEABLEÈ4ü404d4˜4Ì4444h4œ4Ð4484l4 À` lÌ (ô!èÜ$hD+h ¬5è”Lè|O(¤P(ÌQè´T(ÜU(W(,X(TY(|Z(¤[´X\l\€\”\¨\¼\Ð\ä\ø\ ] ]4]H]\]p]L¼]Ð]"ô]^^"@^T^h^|^’ ( @ÿÿÿððøø?ø?üü_üßüßüŸìlh`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿàÿÿàÿÿÀÿÿÀÿÿ€ÿÿ€ÿÿÿÿÿþÿüÿüÿü@ÿÿÀÿÿÀÿÿÀÿÿÀÿÿÿÃÿÿÿÃÿÿÿÃÿÿÿÃÿÿÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿÿÿÀ ` cŒFÄDDFÄcŒ  `ÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÀÿÿãÿÿ?ùÿþüÿüø>ùóŸ?ùïï?óß÷ŸóŸóŸó¿ûŸó¿ûŸó¿ûŸóŸóŸóß÷Ÿùïï?ùóŸ?üø>þüÿÿ?ùÿÿãÿÿÀÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿÿÿ€4:€@ Ðèt:ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÀÿÿà?ÿÿðÿÿøÿÿüÿÿþÿÿÿÿÿÿ€ÿÿÿÀÿÿàÿÿðÿÿÿùÿÿ ( @ÿÿÿ0Hˆ ô@€€€€€ ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿÿÿ‡ÿÿÿÿÿþÿÿüÿÿ?ÿüÿøðÿÿóüÿÿóœÿÿçžÿæÿæÿçžÿóœÿÿóüÿÿøñÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿÿÿà C⌠€ D€ Œ@A@B"@DB@H‚@1@"€€Œ1C àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿàÿÿÀÿÿ€ÿÿàÿþÀþ€ü?ü> ?ü<?ü8ý¿|=ûß¼=ûß¼{ü?Þ{ÿÿÞ{ÿÿÞ{ÿÿÞkÿÖ{ÿÞ{ÿÞ{ÿÞ=ÿ¼=ÿ¼6ÿl~ø¿}øÏsððà¿}Àÿ€þñ€ð€ü?ü?ü?ü?øðàÀÀ€€€€€€ÀÀàðøü?ü?ü?ü? ( @ÿÿÿU@U@U@àààà€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿàÿÿðÿÿÿðÿÿÿðÿÿÿðÿÿÿðÿÿÿðÿÿÿðÿÿÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ( @ÿÿÿž_€?Àx¿À~ÀÀøÀÿ¿À?ÿÀÿ€÷þ?øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿð`ÿàÿàÿÀÿ€ÿÿÿþ€€`øøÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ( @ÿÿÿpy€ú8üÀýþ~þàþýÿÿüÿñþïàüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿ€ÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿÿÿÀ    ÀçÀÈ È ˆ ˆ  Gf~ð‚AAAA~A|ƒx@p `@àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø?ÿÿðÿÿðÿÿðÿÿðÿÿø?ÿþÿÿþ?ÿþÿüÿüÿ80ÿ0ÿxÿ|ÿÿÿ€ÿ€ÿ€ÿ€ÿ€ÿÿ€ÿÀÿàÿðÿøÿ( @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿÿÿ ˜¸øøøøøøx8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿÿÿáÿÿÿáÿÿÿðÿÿÿðûÿÿøsÿÿøcÿÿüÿÿüÿÿÀÿÿàÿÿðÿÿøÿÿüÿÿþÿÿÿÿÿÿƒÿÿÿÃÿÿÿãÿÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿðÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( X  €€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿwwwwwwwwpwwwwpwwwwwwwwwwpwwwwpwwwwwwwwppwwppwwwwwwwwwww(€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿ( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€€Àùçóóãóãñáñàñðøþÿÿÿÿ( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿ€à€ÀÀÀøÀÿàÿþðþø?ü?üü?þü?þøÿøÿøÿ‡øÿ‡øÿ‡ø?ÿ‡ü?ÿ‡üÿ‡þÿ‡þÿÿ~ÿÀÿàÿø?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0`€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÀüÀøÀðÀðàðþðÿðøÿÿà?üÿÿà?þÿÿàþÿÿÀÿÿÿÀÿ€ÿ€ÿÿÀÿ€ÿÿà?ÿÿÿà?ÿÿÿð?ÿÿÿðÿÿÿøÿÿÿøÿÿÿøÿÿÿøÿÿÿüÿÿÿüÿÿÿüÿÿÿüÿÿÿüÿ€ÿÿüÿ€ÿÿüÿÀÿüÿÀ?ÿüÿàÿüÿðÿøÿøÿðÿüàÿþ?ÿÿ€?ÿÿÀÿÿðÿÿÿüÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@€€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿÿÿÿÿÿàÿþÀÿüÀøÀ?ðÀ?ðÀ?ðà?ððøÿ€ø?ÿþÿüÿÿÿüÿþÿÿüÿÿ?ÿÿøÿÿ€ÿÿøÿÿÀÿÿðÿÿÀÿÿðÿÿàÿÿðÿÿðÿÿàÿÿøÿÿàÿÿøÿÿÀÿÿüÿÿÀÿÿüÿÿÀÿÿþÿÿÀÿÿþÿÿ€?ÿÿþÿÿ€?ÿÿÿÿ€?ÿÿÿÿ€?ÿÿÿÿ€?ÿÿÿÿ€?ÿÿÿ€?ÿ€?ÿÿÿ€?ÿ€?ÿÿÿ€?ÿ€ÿÿÿ€?ÿ€ÿÿÿ€?ÿÀÿÿÿ€?ÿÀÿÿÿ€?ÿÀÿÿÿ€?ÿàÿÿÿ€?ÿàÿÿÿ€?ÿðÿÿÿ€?ÿð?ÿÿ?ÿøÿÿÿüÿþÿþÿüÿÿðÿÿ€ÿÿÿÀÿÿÿðÿÿÿøÿÿÿþÿÿÿÿ€ÿÿÿÿàÿÿÿÿüÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(`À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿøÿÿÿà?øÿÿ€ðÿÿðÿÿðÿþðÿþðÿüøÿüøÿüüÿüÿÿþÿðÿþ?ÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ€ÿÿÿÿþÿÿÀ?ÿÿÿÿüÿÿàÿÿÿÿüÿÿðÿÿÿÿüÿÿðÿÿÿÿøÿÿøÿÿÿÿø?ÿÿüÿÿÿÿð?ÿÿþÿÿÿÿðÿÿÿÿÿÿÿàÿÿÿ€ÿÿÿÿàÿÿÿÀÿÿÿÿÀÿÿÿÿàÿÿÿÿÀÿÿÿÿàÿÿÿÀÿÿÿÿðÿÿÿ€ÿÿÿÿð?ÿÿÿ€ÿÿÿÿø?ÿÿÿ€ÿÿÿÿøÿÿÿÿÿÿÿüÿÿÿÿÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿ€ÿÿþÿÿÿÿÿÀÿÿþÿÿÿÿÿÀÿÿþÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÿÀÿÿÿ€ÿÿÿÿÀÿÿÿÀ?ÿÿÿÿÀÿÿÿÀÿÿÿÿÀÿÿÿàÿÿÿÿÀÿÿÿàÿÿÿÿÀÿÿÿðÿÿÿÿ€ÿÿÿøÿÿÿÿ€ÿÿÿü?ÿÿÿ€ÿÿÿüÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿüÿÿÿÿ€ÿøÿÿÿÿÀÿÀÿÿÿÿàÿÿÿÿøÿÿÿÿüÿÿÿÿþÿÿÿÿÿ€?ÿÿÿÿÿÀÿÿÿÿÿðÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿø?ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆ€û{{{{{€÷·····€û{{{{{€÷·····€û{{{{{€÷·····€û{{{{{€ÿÿÿÿÿÿ€···¸ˆˆ€‹{{€ˆˆÿÿÿÿÀ€€€€€€€€€€Ààÿÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆ÷···»€{{{{{·····û{{{{°ˆÿÿÿÿÿˆxˆˆˆˆˆˆ¸·····¸{{ÿÿø··¿ˆˆˆÿÿøˆˆ€ÿÿÿÿðààÀÀ€€€ÀÀÀà?ðÿÿ( @€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( €€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðððÿÿðÿÿÿÿÀÀÀÀÀÀÀÀÀÀÀÀÀ?ÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆ‡÷wwww€€€€€€ˆ€wwwww€ˆˆˆˆˆpˆˆˆˆ€€÷wwwxðfffx€ðhˆ†x€ðgw†x€ðhˆÆx€ðx€ÿÿÿÿø€wwwww€ˆˆˆˆˆ€€Ààààààààààààð( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆˆ‡ÿÿÿÿÿx€‡ˆˆˆˆˆx€‡wwwwwx€‡wwww¢x€ÿÿÿÿÿø€wwwwww€ˆˆˆˆˆˆ€ÿÿÿÿÿÿ€€Àÿÿÿÿÿÿÿÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆ€¢ÿw€ˆ{pwx‡{|Àÿˆ‡{Œ÷ˆˆxˆGw€‡ÿpwxwpˆ‡€ˆwpŒˆxwwˆŒ‹wwÈ{wpˆ{x€ˆ€ÿÿ€€àààððøüÿ( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆ€‡wÿÿwwˆ‡ˆˆ‡ˆ‡wˆˆwwˆ‡wwww—ˆÿÿÿðwww‡€pˆˆˆ‡ˆˆp‡wwpŽîîàŽîîàŽîî‡wwpˆˆÿÿ€€Àÿÿÿÿÿÿ€( À€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿÿÿˆˆˆˆˆˆwwwwwx€wÿÿ÷x€wðx€‘€x€wwwwwx€ÿÿÿÿÿø€wwwwww€ˆˆˆˆˆˆ€ÿÿÿÿÿÿ€€Àÿÿÿÿÿÿ&Window¢&Cascade¡Tile &Horizontally¥Tile &Verticallyÿÿ£&Arrange Icons€¤&Next @4  @4 @4 @4 @4 @4 @4 @4 @4  @4  @4  @4  @4 @4( è00h@@h ``è(  è(( (  è ( ((( wxWindows application H X h x ˆ ˜ ¨ ¸ È Ø è ø   ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø   ( 8 H X h x ˆ ˜ ¨ ¸ È Ø è ø (8HXhxˆ˜¨¸.rsrctherion/loch/README0000664000175000017500000000047610507526040013061 0ustar useruserTo compile loch, you will need following packages: freetype (version 2 and above, freetype-config must work) wxWidgets (version 2.6 and above, wx-config must work) VTK (version 5.0 and above installed at /usr/local or modify VTKPATH and VTKLIBPATH in Makefile) Then following should work: make config-linux maketherion/loch/lxGUI.cxx0000664000175000017500000011616212447660615013731 0ustar useruser/** * @file lxGUI.cxx * Loch user interface implementation. */ /* Copyright (C) 2004 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ */ // Standard libraries #ifndef LXDEPCHECK #include #include #include #include #include #include #include #include #include #include #include #endif //LXDEPCHECK - standart libraries #include "lxGUI.h" #include "lxData.h" #include "lxSetup.h" #include "lxRender.h" #include "lxOptDlg.h" #include "lxAboutDlg.h" #include "lxSView.h" #include "lxSScene.h" #include "lxSTree.h" #include "lxPres.h" #include "icons/open.xpm" #include "icons/render.xpm" #include "icons/reload.xpm" #include "icons/stereo.xpm" #include "icons/rotation.xpm" #include "icons/lockrot.xpm" #include "icons/fit.xpm" #include "icons/home.xpm" #include "icons/rendersetup.xpm" #include "icons/plan.xpm" #include "icons/profile.xpm" #include "icons/fullscreen.xpm" #include "icons/orto.xpm" #include "icons/camera.xpm" #include "icons/scene.xpm" #include "icons/viscline.xpm" #include "icons/vissurface.xpm" #include "icons/visbbox.xpm" #include "icons/viswalls.xpm" #include "icons/visinds.xpm" #include "icons/visentrance.xpm" #include "icons/visfix.xpm" #include "icons/visstation.xpm" #include "icons/vislabel.xpm" #ifndef LXGNUMSW #include "loch.xpm" #endif //////////////////////////////////////////////////////////////////////// // Main frame //////////////////////////////////////////////////////////////////////// BEGIN_EVENT_TABLE(lxFrame, wxFrame) EVT_MENU(wxID_EXIT, lxFrame::OnExit) EVT_MENU(LXMENU_CAMERA_ROTCW, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_ROTCCW, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_UPPER, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_LOWER, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_UP, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_DOWN, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_LEFT, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_RIGHT, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_ZOOMIN, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_ZOOMOUT, lxFrame::OnMenuCameraMove) EVT_MENU(LXMENU_CAMERA_PERSP, lxFrame::OnAll) EVT_MENU(LXMENU_CAMERA_AUTOROTATE, lxFrame::OnAll) EVT_MENU(LXMENU_CAMERA_LOCKROT, lxFrame::OnAll) EVT_MENU(LXMENU_CAMERA_ORIENT_HOME, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_ORIENT_PLAN, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_ORIENT_PROFILE, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_ORIENT_NORTH, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_ORIENT_WEST, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_ORIENT_EAST, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_ORIENT_SOUTH, lxFrame::OnMenuCameraOrient) EVT_MENU(LXMENU_CAMERA_EXTENDS, lxFrame::OnAll) EVT_MENU_RANGE(LXMENU_VIEW, LXMENU_VIEWEND, lxFrame::OnAll) EVT_MENU(LXMENU_FILE_OPEN, lxFrame::OnAll) EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, lxFrame::OnAll) EVT_MENU(LXMENU_FILE_RELOAD, lxFrame::OnAll) EVT_MENU(LXMENU_FILE_RENDER, lxFrame::OnAll) EVT_MENU(LXMENU_FILE_RENDER_SETUP, lxFrame::OnAll) EVT_MENU(LXMENU_FILE_EXPORT, lxFrame::OnAll) EVT_MENU(LXMENU_FILE_IMPORT, lxFrame::OnAll) EVT_MENU(LXMENU_EXPROT, lxFrame::OnAll) EVT_MENU(LXMENU_EXPFIT, lxFrame::OnAll) EVT_MENU_RANGE(LXMENU_HELP_CONTENTS, LXMENU_HELP_ABOUT, lxFrame::OnAll) EVT_TOOL_RANGE(LXTB, LXTBEND, lxFrame::OnAll) EVT_SIZE(lxFrame::OnSize) EVT_MOVE(lxFrame::OnMove) END_EVENT_TABLE() #if wxUSE_DRAG_AND_DROP class DnDFile : public wxFileDropTarget { lxFrame * m_Parent; public: DnDFile(lxFrame *parent) : m_Parent(parent) { } virtual bool OnDropFiles(wxCoord, wxCoord, const wxArrayString &filenames); }; bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString &filenames) { assert(filenames.GetCount() > 0); m_Parent->OpenFile(filenames[0]); return TRUE; } #endif lxFrame::lxFrame(class lxApp * app, const wxString& title, const wxPoint& pos, const wxSize& size, long style) : wxFrame(NULL, wxID_ANY, title, pos, size, style), m_modelSetupDlg(NULL), m_modelSetupDlgOn(false), m_selectionSetupDlg(NULL), m_selectionSetupDlgOn(false), m_presentationDlg(NULL), m_presentationDlgOn(false), m_viewpointSetupDlg(NULL), m_viewpointSetupDlgOn(false) { // // Give it an icon #ifdef LXGNUMSW this->SetIcon(wxIcon(_T("LOCHICON"))); #else this->SetIcon(wxIcon(loch_xpm)); #endif this->m_app = app; this->data = new lxData; this->setup = new lxSetup(data); this->m_fileToOpen = _T(""); this->m_renderData = new lxRenderData(); this->m_fileName = _("noname"); this->m_fileConfig = new wxFileConfig(_T("loch")); this->m_fileHistory = new wxFileHistory; this->m_pres = new wxXmlDocument(); this->m_helpController = new wxHelpController; wxString hlpFName = _T("loch"), tmpHlpFName; #ifdef LXWIN32 hlpFName += _T(".chm"); #else hlpFName += _T(".htb"); #endif wxFileName hlpFN; hlpFN = wxFileName(this->m_app->m_path); hlpFN.AppendDir(this->m_app->m_locale.GetCanonicalName()); hlpFN.SetFullName(hlpFName); if (hlpFN.FileExists()) { hlpFName = hlpFN.GetFullPath(); } else { hlpFN = wxFileName(this->m_app->m_path); hlpFN.AppendDir(this->m_app->m_locale.GetCanonicalName().Left(2)); hlpFN.SetFullName(hlpFName); if (hlpFN.FileExists()) { hlpFName = hlpFN.GetFullPath(); } else { hlpFName = _T("en/loch"); } } this->m_helpController->Initialize(hlpFName); this->m_fileConfig->Read(_T("startup_dir"), &this->m_iniDirectory, wxEmptyString); this->m_fileConfig->Read(_T("startup_dir_last"), &this->m_fileDir, ::wxGetCwd()); this->m_fileConfig->Read(_T("units"), &this->m_iniUnits, LXUNITS_METRIC); if (this->m_iniDirectory.Length() > 0) { this->m_fileDir = this->m_iniDirectory; } this->m_fileConfig->Read(_T("stereo_channels_last"), &this->m_iniStereoGlassesLast, 0); this->m_fileConfig->Read(_T("stereo_channels"), &this->m_iniStereoGlasses, 8); if (this->m_iniStereoGlasses == 8) this->setup->cam_anaglyph_glasses = this->m_iniStereoGlassesLast; else this->setup->cam_anaglyph_glasses = this->m_iniStereoGlasses; this->m_fileConfig->Read(_T("wall_extra"), &this->m_iniWallsInterpolate, LXWALLS_INTERP_NONE); this->m_toolBar = CreateToolBar(); this->m_toolBar->AddTool(LXTB_OPEN, _("Open"), wxBitmap(open_xpm), _("Open file")); this->m_toolBar->AddTool(LXTB_RELOAD, _("Reload"), wxBitmap(reload_xpm), _("Reload file")); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXTB_RENDER, _("Render"), wxBitmap(render_xpm), _("Render to file")); this->m_toolBar->AddTool(LXTB_RENDER_SETUP, _("Rendering setup"), wxBitmap(rendersetup_xpm), _("Rendering setup")); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXTB_ROTATION, _("Rotation"), wxBitmap(rotation_xpm), _("Rotation"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_LOCKROT, _("Lock rotation"), wxBitmap(lockrot_xpm), _("Lock rotation"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_PERSP, _("Ortho"), wxBitmap(orto_xpm), _("Orthogonal view"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_STEREO, _("Stereo"), wxBitmap(stereo_xpm), _("Stereo mode"), wxITEM_CHECK); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXMENU_CAMERA_ORIENT_PLAN, _("Plan"), wxBitmap(plan_xpm), _("Plan view")); this->m_toolBar->AddTool(LXMENU_CAMERA_ORIENT_PROFILE, _("Profile"), wxBitmap(profile_xpm), _("Profile view")); this->m_toolBar->AddTool(LXTB_FIT, _("Fit zoom"), wxBitmap(fit_xpm), _("Zoom to fit")); this->m_toolBar->AddTool(LXMENU_CAMERA_ORIENT_HOME, _("Reset"), wxBitmap(home_xpm), _("Reset viewpoint")); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXTB_VISENTRANCE, _("Entrances"), wxBitmap(visentrance_xpm), _("Show entrances"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISFIX, _("Fixed stations"), wxBitmap(visfix_xpm), _("Show fixed stations"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISSTATION, _("All stations"), wxBitmap(visstation_xpm), _("Show all stations"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISLABEL, _("Labels"), wxBitmap(vislabel_xpm), _("Toggle station labeling")); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXTB_VISCENTERLINE, _("Centerline"), wxBitmap(viscline_xpm), _("Show centerline"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISWALLS, _("Walls"), wxBitmap(viswalls_xpm), _("Show walls"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISSURFACE, _("Surface"), wxBitmap(vissurface_xpm), _("Show surface"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISBBOX, _("Bounding box"), wxBitmap(visbbox_xpm), _("Show bounding box"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_VISINDS, _("Indicators"), wxBitmap(visinds_xpm), _("Show indicators"), wxITEM_CHECK); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXTB_VIEWSTP, _("Camera setup"), wxBitmap(camera_xpm), _("Camera setup"), wxITEM_CHECK); this->m_toolBar->AddTool(LXTB_SCENESTP, _("Scene setup"), wxBitmap(scene_xpm), _("Scene setup"), wxITEM_CHECK); this->m_toolBar->AddSeparator(); this->m_toolBar->AddTool(LXTB_FULLSCREEN, _("Full screen"), wxBitmap(fullscreen_xpm), _("Full screen"), wxITEM_CHECK); this->m_toolBar->Realize(); // Make a menubar wxMenu *fileMenu = new wxMenu; fileMenu->Append(LXMENU_FILE_OPEN, _("&Open...\tCtrl+O")); fileMenu->Append(LXMENU_FILE_RELOAD, _("&Reload\tCtrl+R")); fileMenu->AppendSeparator(); fileMenu->Append(LXMENU_FILE_RENDER, _("&Render to file\tCtrl+P")); fileMenu->Append(LXMENU_FILE_RENDER_SETUP, _("Rendering &setup...")); fileMenu->AppendSeparator(); fileMenu->Append(LXMENU_FILE_IMPORT, _("&Import...\tCtrl+I")); fileMenu->Append(LXMENU_FILE_EXPORT, _("&Export...\tCtrl+X")); fileMenu->AppendSeparator(); fileMenu->Append(wxID_EXIT, _("E&xit\tCtrl+Q")); this->m_fileHistory->UseMenu(fileMenu); this->m_fileHistory->Load(*this->m_fileConfig); wxMenu *cameraAdjustMenu = new wxMenu; cameraAdjustMenu->Append(LXMENU_CAMERA_ROTCW, _("Rotate left\tRight")); cameraAdjustMenu->Append(LXMENU_CAMERA_ROTCCW, _("Rotate right\tLeft")); cameraAdjustMenu->AppendSeparator(); cameraAdjustMenu->Append(LXMENU_CAMERA_UPPER, _("Upper viewpoint\tDown")); cameraAdjustMenu->Append(LXMENU_CAMERA_LOWER, _("Lower viewpoint\tUp")); cameraAdjustMenu->AppendSeparator(); cameraAdjustMenu->Append(LXMENU_CAMERA_UP, _("Move up\tShift+Down")); cameraAdjustMenu->Append(LXMENU_CAMERA_DOWN, _("Move down\tShift+Up")); cameraAdjustMenu->Append(LXMENU_CAMERA_LEFT, _("Move left\tShift+Right")); cameraAdjustMenu->Append(LXMENU_CAMERA_RIGHT, _("Move right\tShift+Left")); cameraAdjustMenu->AppendSeparator(); cameraAdjustMenu->Append(LXMENU_CAMERA_ZOOMIN, _("Zoom in\tCtrl+Up")); cameraAdjustMenu->Append(LXMENU_CAMERA_ZOOMOUT, _("Zoom out\tCtrl+Down")); cameraAdjustMenu->Append(LXMENU_CAMERA_EXTENDS,_("Zoom to fit\tSpace")); wxMenu *cameraOrientMenu = new wxMenu; cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_PLAN,_("&Plan")); cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_PROFILE,_("Pro&file")); cameraOrientMenu->AppendSeparator(); cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_NORTH, _("&North")); cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_WEST, _("&West")); cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_EAST, _("&East")); cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_SOUTH, _("&South")); cameraOrientMenu->AppendSeparator(); cameraOrientMenu->Append(LXMENU_CAMERA_ORIENT_HOME,_("&Reset")); this->m_viewpointMenu = cameraOrientMenu; this->m_toolMenu = new wxMenu; this->m_toolMenu->AppendCheckItem(LXMENU_CAMERA_AUTOROTATE, _("Rotation")); this->m_toolMenu->AppendCheckItem(LXMENU_CAMERA_LOCKROT, _("Lock rotation")); this->m_toolMenu->AppendSeparator(); this->m_toolMenu->AppendCheckItem(LXMENU_VIEW_VIEWPOINTSTP, _("Camera")); this->m_toolMenu->AppendCheckItem(LXMENU_VIEW_MODELSTP, _("Scene")); wxMenu *viewMenu = new wxMenu; viewMenu->Append(LXMENU_CAMERA_ADJUST, _("Action"), cameraAdjustMenu); viewMenu->AppendCheckItem(LXMENU_CAMERA_AUTOROTATE, _("Rotation")); viewMenu->AppendCheckItem(LXMENU_CAMERA_LOCKROT, _("Lock rotation")); viewMenu->Append(LXMENU_CAMERA_ORIENT, _("Orientation"), cameraOrientMenu); viewMenu->AppendCheckItem(LXMENU_CAMERA_PERSP, _("Orthogonal")); viewMenu->AppendSeparator(); viewMenu->Append(LXMENU_VIEW_FULLSCREEN, _("Full screen\tF11")); viewMenu->Append(LXMENU_EXPFIT, _("&Size...")); wxMenu *winMenu = new wxMenu; winMenu->AppendCheckItem(LXMENU_VIEW_VIEWPOINTSTP, _("&Camera")); winMenu->AppendCheckItem(LXMENU_VIEW_MODELSTP, _("&Scene")); winMenu->AppendCheckItem(LXMENU_VIEW_SELECTIONSTP, _("&Selection")); winMenu->AppendCheckItem(LXMENU_VIEW_PRESENTDLG, _("&Presentation")); winMenu->Append(LXMENU_EXPROT, _("&Animation")); winMenu->AppendSeparator(); winMenu->Append(LXMENU_TOOLS_OPTIONS, _("&Options...")); wxMenu * hlpMenu = new wxMenu; hlpMenu->Append(LXMENU_HELP_CONTENTS, _("&Contents...\tF1")); hlpMenu->Append(LXMENU_HELP_CONTROL, _("&Control")); hlpMenu->Append(LXMENU_HELP_RENDERING, _("&Rendering")); hlpMenu->Append(LXMENU_HELP_BUGS, _("&Bugs")); hlpMenu->AppendSeparator(); hlpMenu->Append(LXMENU_HELP_ABOUT, _("&About...")); m_menuBar = new wxMenuBar; m_menuBar->Append(fileMenu, _("&File")); m_menuBar->Append(viewMenu, _("&View")); m_menuBar->Append(winMenu, _("&Tools")); m_menuBar->Append(hlpMenu, _("&Help")); this->SetMenuBar(m_menuBar); this->canvas = new lxGLCanvas(this->setup, this->data, this, wxID_ANY, wxDefaultPosition, wxDefaultSize); this->canvas->frame = this; wxBoxSizer * ms = new wxBoxSizer(wxVERTICAL); ms->SetMinSize(192, 128); ms->Add(this->canvas, 1, wxEXPAND, 0); SetSizer(ms); ms->SetSizeHints(this); this->SetPosition(pos); this->SetSize(size); this->m_modelSetupDlg = new lxModelSetupDlg(this); this->m_modelSetupDlgOn = false; this->m_selectionSetupDlg = new lxModelTreeDlg(this); this->m_presentationDlg = new lxPresentDlg(this); this->m_selectionSetupDlgOn = false; this->m_presentationDlgOn = false; wxSize csize = this->GetClientSize(); #ifdef __WXMSW__ lxTBoxPos::m_fsOffset = size.y - csize.y; this->m_selectionSetupDlg->m_toolBoxPosition.Set(0, size.x - csize.x, size.y - csize.y); this->m_presentationDlg->m_toolBoxPosition.Set(0, size.x - csize.x, size.y - csize.y); #else wxSize tbsize = this->m_toolBar->GetSize(); lxTBoxPos::m_fsOffset = size.y - csize.y + tbsize.y; this->m_selectionSetupDlg->m_toolBoxPosition.Set(0, size.x - csize.x, size.y - csize.y + tbsize.y); #endif this->m_viewpointSetupDlg = new lxViewpointSetupDlg(this); #ifdef __WXMSW__ this->m_viewpointSetupDlg->m_toolBoxPosition.Set(1, size.x - csize.x, size.y - csize.y); #else tbsize = this->m_toolBar->GetSize(); this->m_viewpointSetupDlg->m_toolBoxPosition.Set(1, size.x - csize.x, size.y - csize.y + tbsize.y); #endif this->m_viewpointSetupDlgOn = false; this->UpdateM2TB(); #if wxUSE_DRAG_AND_DROP SetDropTarget(new DnDFile(this)); #endif // Show the frame this->Show(true); } void lxFrame::OnExit( wxCommandEvent& WXUNUSED(event) ) { // true is to force the frame to close Close(true); } lxFrame::~lxFrame() { this->m_fileHistory->Save(*this->m_fileConfig); this->m_fileConfig->Write(_T("startup_dir"), this->m_iniDirectory); this->m_fileConfig->Write(_T("startup_dir_last"), this->m_fileDir); this->m_fileConfig->Write(_T("units"), this->m_iniUnits); this->m_fileConfig->Write(_T("stereo_channels_last"), this->m_iniStereoGlassesLast); this->m_fileConfig->Write(_T("stereo_channels"), this->m_iniStereoGlasses); this->m_fileConfig->Write(_T("wall_extra"), this->m_iniWallsInterpolate); #ifdef LXVCPPMSW SetToolBar(NULL); #endif delete this->m_fileHistory; delete this->m_fileConfig; delete this->m_toolMenu; delete this->setup; delete this->data; delete this->m_renderData; delete this->m_helpController; delete this->m_pres; } void lxFrame::OnMenuCameraMove(wxCommandEvent& event){ wxKeyEvent ke; ke.m_keyCode = 0; ke.m_shiftDown = false; ke.m_controlDown = false; switch (event.GetId()) { case LXMENU_CAMERA_ROTCW: ke.m_keyCode = WXK_RIGHT; break; case LXMENU_CAMERA_ROTCCW: ke.m_keyCode = WXK_LEFT; break; case LXMENU_CAMERA_UPPER: ke.m_keyCode = WXK_DOWN; break; case LXMENU_CAMERA_LOWER: ke.m_keyCode = WXK_UP; break; case LXMENU_CAMERA_UP: ke.m_keyCode = WXK_DOWN; ke.m_shiftDown = true; break; case LXMENU_CAMERA_DOWN: ke.m_keyCode = WXK_UP; ke.m_shiftDown = true; break; case LXMENU_CAMERA_LEFT: ke.m_keyCode = WXK_RIGHT; ke.m_shiftDown = true; break; case LXMENU_CAMERA_RIGHT: ke.m_keyCode = WXK_LEFT; ke.m_shiftDown = true; break; case LXMENU_CAMERA_ZOOMIN: ke.m_keyCode = WXK_UP; ke.m_controlDown = true; break; case LXMENU_CAMERA_ZOOMOUT: ke.m_keyCode = WXK_DOWN; ke.m_controlDown = true; break; } if (ke.GetKeyCode() != 0) this->canvas->OnKeyPress(ke); } void lxFrame::OnMenuCameraOrient(wxCommandEvent& event) { switch (event.GetId()) { case LXMENU_CAMERA_ORIENT_HOME: this->setup->cam_tilt = 90.0; this->setup->cam_dir = 0.0; this->setup->ResetCamera(); break; case LXMENU_CAMERA_ORIENT_PLAN: this->setup->cam_tilt = 90.0; this->setup->UpdatePos(); break; case LXMENU_CAMERA_ORIENT_PROFILE: this->setup->cam_tilt = 0.0; this->setup->UpdatePos(); break; case LXMENU_CAMERA_ORIENT_NORTH: this->setup->cam_dir = 0.0; this->setup->UpdatePos(); break; case LXMENU_CAMERA_ORIENT_EAST: this->setup->cam_dir = 90.0; this->setup->UpdatePos(); break; case LXMENU_CAMERA_ORIENT_SOUTH: this->setup->cam_dir = 180.0; this->setup->UpdatePos(); break; case LXMENU_CAMERA_ORIENT_WEST: this->setup->cam_dir = 270.0; this->setup->UpdatePos(); break; } this->canvas->ForceRefresh(); } void lxFrame::ToggleFullScreen() { this->ShowFullScreen(!this->IsFullScreen()); this->UpdateM2TB(); } int lxFrame::GetFileType(wxString fName) { #define matchtype(w,t) if (fName.EndsWith((const wxChar *)wxString(_T(w)))) return t; matchtype(".lox",1); matchtype(".LOX",1); matchtype(".plt",2); matchtype(".PLT",2); matchtype(".3d",3); matchtype(".3D",3); return 1; } void lxFrame::DetectFileType() { if (this->m_fileType == 0) { this->m_fileType = this->GetFileType(this->m_fileName); } } void lxFrame::OnAll(wxCommandEvent& event) { switch (event.GetId()) { case LXMENU_HELP_CONTENTS: this->m_helpController->DisplayContents(); break; case LXMENU_EXPROT: this->ExportRotationPictures(); break; case LXMENU_EXPFIT: this->canvas->SetSize(720,576); this->Fit(); break; case LXMENU_HELP_CONTROL: this->m_helpController->DisplaySection(_T("Control")); break; case LXMENU_HELP_RENDERING: this->m_helpController->DisplaySection(_T("Rendering")); break; case LXMENU_HELP_BUGS: this->m_helpController->DisplaySection(_T("Bugs")); break; case LXMENU_HELP_ABOUT: lxShowAboutDialog(this); break; case LXTB_VIEWPOINT: lxSize = this->m_toolBar->GetSize(); lxPoint = wxGetMousePosition() - this->GetPosition(); #ifdef __WXMSW__ this->PopupMenu(this->m_viewpointMenu, lxPoint.x - 8, lxSize.y); #else this->PopupMenu(this->m_viewpointMenu, lxPoint.x - 8, 0); #endif this->m_toolBar->ToggleTool(LXTB_VIEWPOINT, false); break; case LXTB_LOCKROT: case LXMENU_CAMERA_LOCKROT: this->ToggleRotLock(); break; case LXTB_FULLSCREEN: case LXMENU_VIEW_FULLSCREEN: this->ToggleFullScreen(); break; case LXTB_STEREO: this->ToggleStereo(); break; case LXTB_VIEWSTP: this->ToggleViewpointSetup(); break; case LXTB_SCENESTP: this->ToggleModelSetup(); break; case LXMENU_TOOLS_OPTIONS: lxShowOptionsDialog(this); break; case wxID_FILE1: case wxID_FILE2: case wxID_FILE3: case wxID_FILE4: case wxID_FILE5: case wxID_FILE6: case wxID_FILE7: case wxID_FILE8: case wxID_FILE9: this->m_fileName = this->m_fileHistory->GetHistoryFile(event.GetId() - wxID_FILE1); this->m_fileDir = wxFileName(this->m_fileName).GetPath(); this->m_fileType = 0; this->DetectFileType(); this->ReloadData(); this->setup->ResetCamera(); this->canvas->ForceRefresh(); break; case LXMENU_FILE_EXPORT: { wxFileDialog dialog ( this, _("Export"), wxEmptyString, wxEmptyString, _("VTK file (*.vtk)|*.vtk|Loch file (*.lox)|*.lox"), wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); dialog.SetDirectory(this->m_fileDir); dialog.CentreOnParent(); if (dialog.ShowModal() == wxID_OK) { switch (dialog.GetFilterIndex()) { case 0: this->data->ExportVTK(dialog.GetPath()); break; case 1: this->data->m_input.ExportLOX(dialog.GetPath().mbc_str()); break; } this->canvas->ForceRefresh(); } } break; case LXTB_OPEN: case LXMENU_FILE_OPEN: case LXMENU_FILE_IMPORT: { wxFileDialog dialog ( this, _("Open"), wxEmptyString, wxEmptyString, _("All supported files (*.lox;*.plt;*.3d)|*.lox;*.plt;*.3d|Loch files (*.lox)|*.lox|Compass PLT files (*.plt)|*.plt|Survex 3D files (*.3d)|*.3d") ); dialog.SetDirectory(this->m_fileDir); dialog.CentreOnParent(); if (dialog.ShowModal() == wxID_OK) { if (event.GetId() == LXMENU_FILE_IMPORT) { this->ImportFile(dialog.GetPath(), this->GetFileType(dialog.GetPath())); } else { this->m_fileName = dialog.GetPath(); this->m_fileDir = dialog.GetDirectory(); this->m_fileType = 0; this->DetectFileType(); this->ReloadData(); this->setup->ResetCamera(); } this->canvas->ForceRefresh(); } } break; case LXTB_RELOAD: case LXMENU_FILE_RELOAD: this->ReloadData(); this->canvas->ForceRefresh(); break; case LXTB_RENDER_SETUP: case LXMENU_FILE_RENDER_SETUP: this->m_renderData->Configure(this, this->canvas); break; case LXTB_RENDER: case LXMENU_FILE_RENDER: this->m_renderData->Render(this, this->canvas); break; case LXTB_ROTATION: case LXMENU_CAMERA_AUTOROTATE: this->ToggleRotation(); break; case LXTB_PERSP: case LXMENU_CAMERA_PERSP: this->TogglePerspective(); break; case LXTB_FIT: case LXMENU_CAMERA_EXTENDS: this->setup->ResetCamera(); this->canvas->ForceRefresh(); break; case LXMENU_VIEW_MODELSTP: this->ToggleModelSetup(); break; case LXMENU_VIEW_SELECTIONSTP: this->ToggleSelectionSetup(); break; case LXMENU_VIEW_PRESENTDLG: this->TogglePresentationDlg(); break; case LXMENU_VIEW_VIEWPOINTSTP: this->ToggleViewpointSetup(); break; case LXTB_VISENTRANCE: this->ToggleVisibilityCenterlineEntrance(); break; case LXTB_VISFIX: this->ToggleVisibilityCenterlineFix(); break; case LXTB_VISSTATION: this->ToggleVisibilityCenterlineStation(); break; case LXTB_VISLABEL: { int cmode = 0; if (this->setup->m_stlabel_comment) cmode = 1; if (this->setup->m_stlabel_name) cmode = 2; if (this->setup->m_stlabel_name && this->setup->m_stlabel_survey) cmode = 3; if (this->setup->m_stlabel_altitude) cmode = 4; cmode = (cmode + 1) % 5; this->setup->m_stlabel_comment = false; this->setup->m_stlabel_name = false; this->setup->m_stlabel_survey = false; this->setup->m_stlabel_altitude = false; switch (cmode) { case 1: this->setup->m_stlabel_comment = true; break; case 2: this->setup->m_stlabel_name = true; break; case 3: this->setup->m_stlabel_name = true; this->setup->m_stlabel_survey = true; break; case 4: this->setup->m_stlabel_altitude = true; break; } this->canvas->UpdateRenderList(); this->canvas->ForceRefresh(); this->UpdateM2TB(); } break; case LXTB_VISBBOX: this->ToggleVisibilityBBox(); break; case LXTB_VISCENTERLINE: this->ToggleVisibilityCenterline(); break; case LXTB_VISWALLS: this->ToggleVisibilityWalls(); break; case LXTB_VISSURFACE: this->ToggleVisibilitySurface(); break; case LXTB_VISINDS: this->ToggleVisibilityIndicators(); break; default: event.Skip(); } } void lxFrame::OnSize(wxSizeEvent& event) { wxFrame::OnSize(event); if (this->m_viewpointSetupDlg != NULL) { this->m_viewpointSetupDlg->m_toolBoxPosition.Restore(); } if (this->m_modelSetupDlg != NULL) { this->m_modelSetupDlg->m_toolBoxPosition.Restore(); } if (this->m_selectionSetupDlg != NULL) { this->m_selectionSetupDlg->m_toolBoxPosition.Restore(); } if (this->m_presentationDlg != NULL) { this->m_presentationDlg->m_toolBoxPosition.Restore(); } } void lxFrame::OnMove(wxMoveEvent& event) { if ((event.GetPosition().x > 0) || (event.GetPosition().y > 0)) { if (this->m_viewpointSetupDlg != NULL) { this->m_viewpointSetupDlg->m_toolBoxPosition.Restore(); } if (this->m_modelSetupDlg != NULL) { this->m_modelSetupDlg->m_toolBoxPosition.Restore(); } if (this->m_selectionSetupDlg != NULL) { this->m_selectionSetupDlg->m_toolBoxPosition.Restore(); } if (this->m_presentationDlg != NULL) { this->m_presentationDlg->m_toolBoxPosition.Restore(); } } } void lxFrame::UpdateM2TB() { // perspective this->m_menuBar->Check(LXMENU_CAMERA_PERSP, !this->setup->cam_persp); this->m_menuBar->Check(LXMENU_VIEW_MODELSTP, this->m_modelSetupDlgOn); this->m_menuBar->Check(LXMENU_VIEW_VIEWPOINTSTP, this->m_viewpointSetupDlgOn); this->m_menuBar->Check(LXMENU_VIEW_SELECTIONSTP, this->m_selectionSetupDlgOn); this->m_menuBar->Check(LXMENU_VIEW_PRESENTDLG, this->m_presentationDlgOn); this->m_toolBar->ToggleTool(LXTB_PERSP, !this->setup->cam_persp); // visibility this->m_toolBar->ToggleTool(LXTB_VISCENTERLINE, this->setup->m_vis_centerline); this->m_toolBar->ToggleTool(LXTB_VISWALLS, this->setup->m_vis_walls); this->m_toolBar->ToggleTool(LXTB_VISSURFACE, this->setup->m_vis_surface); this->m_toolBar->ToggleTool(LXTB_VISBBOX, this->setup->m_vis_bbox); this->m_toolBar->ToggleTool(LXTB_VISINDS, this->setup->m_vis_indicators); this->m_toolBar->ToggleTool(LXTB_VISENTRANCE, this->setup->m_vis_centerline_entrance); this->m_toolBar->ToggleTool(LXTB_VISFIX, this->setup->m_vis_centerline_fix); this->m_toolBar->ToggleTool(LXTB_VISSTATION, this->setup->m_vis_centerline_station); // rotation this->m_menuBar->Check(LXMENU_CAMERA_AUTOROTATE, this->canvas->m_sCameraAutoRotate); this->m_toolMenu->Check(LXMENU_CAMERA_AUTOROTATE, this->canvas->m_sCameraAutoRotate); this->m_toolBar->ToggleTool(LXTB_ROTATION, this->canvas->m_sCameraAutoRotate); // lock rotation this->m_menuBar->Check(LXMENU_CAMERA_LOCKROT, this->canvas->m_sCameraLockRotation); this->m_toolMenu->Check(LXMENU_CAMERA_LOCKROT, this->canvas->m_sCameraLockRotation); this->m_toolBar->ToggleTool(LXTB_LOCKROT, this->canvas->m_sCameraLockRotation); // stereo this->m_toolBar->ToggleTool(LXTB_STEREO, this->setup->cam_anaglyph); // dialogs this->m_toolBar->ToggleTool(LXTB_VIEWSTP, this->m_viewpointSetupDlgOn); this->m_toolMenu->Check(LXMENU_VIEW_VIEWPOINTSTP, this->m_viewpointSetupDlgOn); this->m_toolBar->ToggleTool(LXTB_SCENESTP, this->m_modelSetupDlgOn); this->m_toolMenu->Check(LXMENU_VIEW_MODELSTP, this->m_modelSetupDlgOn); // TODO: Tree button // this->m_toolMenu->Check(LXMENU_VIEW_SELECTIONSTP, this->m_selectionSetupDlgOn); // full screen this->m_toolBar->ToggleTool(LXTB_FULLSCREEN, this->IsFullScreen()); #ifdef LXLINUX this->m_toolBar->Show(!this->IsFullScreen()); #endif this->SetupUpdate(); } void lxFrame::TogglePerspective() { this->setup->cam_persp = !this->setup->cam_persp; this->canvas->ForceRefresh(); this->UpdateM2TB(); } #define lxFrameToggle(proc,item) void lxFrame::Toggle##proc() { \ this->setup->item = !this->setup->item; \ this->canvas->UpdateContents(); \ this->UpdateM2TB(); \ } #define lxFrameFastToggle(proc,item) void lxFrame::Toggle##proc() { \ this->setup->item = !this->setup->item; \ this->canvas->UpdateRenderList(); \ this->canvas->ForceRefresh(); \ this->UpdateM2TB(); \ } #define lxFrameFastSet(proc,item) void lxFrame::Set##proc(int value) { \ this->setup->item = value; \ this->canvas->UpdateRenderList(); \ this->canvas->ForceRefresh(); \ this->UpdateM2TB(); \ } lxFrameToggle(VisibilityCenterline, m_vis_centerline) lxFrameToggle(VisibilityCenterlineCave, m_vis_centerline_cave) lxFrameToggle(VisibilityCenterlineSurface, m_vis_centerline_surface) lxFrameToggle(VisibilityCenterlineSplay, m_vis_centerline_splay) lxFrameToggle(VisibilityCenterlineDuplicate, m_vis_centerline_duplicate) lxFrameToggle(VisibilityCenterlineFix, m_vis_centerline_fix) lxFrameToggle(VisibilityCenterlineEntrance, m_vis_centerline_entrance) lxFrameToggle(VisibilityCenterlineStation, m_vis_centerline_station) lxFrameToggle(VisibilityWalls, m_vis_walls) lxFrameToggle(VisibilitySurface, m_vis_surface) lxFrameToggle(VisibilityLabels, m_vis_labels) lxFrameToggle(VisibilityBBox, m_vis_bbox) lxFrameToggle(VisibilityGrid, m_vis_grid) lxFrameToggle(VisibilityIndicators, m_vis_indicators) lxFrameToggle(VisibilityStLabelName, m_stlabel_name) lxFrameToggle(VisibilityStLabelComment, m_stlabel_comment) lxFrameToggle(VisibilityStLabelAltitude, m_stlabel_altitude) lxFrameToggle(VisibilityStLabelSurvey, m_stlabel_survey) lxFrameFastSet(ColorMode, m_colormd) lxFrameFastToggle(ColorsApplyCenterline, m_colormd_app_centerline) lxFrameFastToggle(ColorsApplyWalls, m_colormd_app_walls) lxFrameToggle(WallsTransparency, m_walls_transparency) lxFrameToggle(SurfaceLighting, m_srf_lighting) lxFrameToggle(SurfaceTransparency, m_srf_transparency) void lxFrame::ToggleSurfaceTexture() { this->setup->m_srf_texture = !this->setup->m_srf_texture; this->setup->m_srf_lighting = !this->setup->m_srf_texture; this->canvas->UpdateContents(); this->UpdateM2TB(); } void lxFrame::ToggleStereo() { this->setup->cam_anaglyph = !this->setup->cam_anaglyph; this->canvas->SetFontColors(); this->canvas->UpdateRenderContents(); this->canvas->UpdateRenderList(); this->canvas->ForceRefresh(); this->UpdateM2TB(); } void lxFrame::ToggleStereoBW() { this->setup->cam_anaglyph_bw = !this->setup->cam_anaglyph_bw; this->canvas->UpdateRenderContents(); this->canvas->UpdateRenderList(); this->canvas->ForceRefresh(); this->UpdateM2TB(); } void lxFrame::ToggleRotation() { this->canvas->m_sCameraAutoRotate = !this->canvas->m_sCameraAutoRotate; if (this->canvas->m_sCameraAutoRotate) { this->canvas->m_sCameraAutoRotateCounter = 0; this->canvas->m_sCameraAutoRotateSWatch.Start(); this->setup->StartCameraMovement(); } else { ((wxStaticText *)(this->m_viewpointSetupDlg->FindWindow(LXVSTP_RENSPEED)))->SetLabel(_T("")); } this->UpdateM2TB(); } void lxFrame::ToggleRotLock() { this->canvas->m_sCameraLockRotation = !this->canvas->m_sCameraLockRotation; this->UpdateM2TB(); } void lxFrame::ToggleModelSetup() { if (this->m_modelSetupDlgOn) { this->m_modelSetupDlg->m_toolBoxPosition.Save(); this->m_modelSetupDlg->Show(false); } else { this->m_modelSetupDlg->m_toolBoxPosition.Restore(); this->m_modelSetupDlg->Show(true); } this->m_modelSetupDlgOn = !this->m_modelSetupDlgOn; this->UpdateM2TB(); } void lxFrame::ToggleSelectionSetup() { if (this->m_selectionSetupDlgOn) { this->m_selectionSetupDlg->m_toolBoxPosition.Save(); this->m_selectionSetupDlg->Show(false); } else { this->m_selectionSetupDlg->m_toolBoxPosition.Restore(); this->m_selectionSetupDlg->Show(true); } this->m_selectionSetupDlgOn = !this->m_selectionSetupDlgOn; this->UpdateM2TB(); } void lxFrame::TogglePresentationDlg() { if (this->m_presentationDlgOn) { this->m_presentationDlg->m_toolBoxPosition.Save(); this->m_presentationDlg->Show(false); } else { this->m_presentationDlg->m_toolBoxPosition.Restore(); this->m_presentationDlg->Show(true); } this->m_presentationDlgOn = !this->m_presentationDlgOn; this->UpdateM2TB(); } void lxFrame::ToggleViewpointSetup() { if (this->m_viewpointSetupDlgOn) { this->m_viewpointSetupDlg->m_toolBoxPosition.Save(); this->m_viewpointSetupDlg->Show(false); } else { this->m_viewpointSetupDlg->m_toolBoxPosition.Restore(); this->m_viewpointSetupDlg->Show(true); } this->m_viewpointSetupDlgOn = !this->m_viewpointSetupDlgOn; this->UpdateM2TB(); } void lxFrame::SetupUpdate() { if (this == NULL) return; if (this->m_viewpointSetupDlgOn) this->m_viewpointSetupDlg->LoadSetup(); if (this->m_modelSetupDlgOn) this->m_modelSetupDlg->LoadSetup(); } void lxFrame::SetupApply() { } void lxFrame::ImportFile(wxString fName, int fType) { if (fType == 0) fType = this->GetFileType(fName); this->LoadData(fName, fType); } void lxFrame::LoadData(wxString fName, int fType) { #if wxCHECK_VERSION(3,0,0) wxWindowDisabler disableAll; #endif wxBusyInfo info(_("Building 3D model, please wait...")); #if wxCHECK_VERSION(3,0,0) wxTheApp->Yield(); #endif switch (fType) { case 1: this->data->m_input.ImportLOX(fName.mbc_str()); break; case 2: this->data->m_input.ImportPLT(fName.mbc_str()); break; case 3: this->data->m_input.Import3D(fName.mbc_str()); break; default: this->data->m_input.m_error = "unable to detect file format"; break; } #if wxCHECK_VERSION(3,0,0) wxTheApp->Yield(); #endif switch (this->m_iniWallsInterpolate) { case LXWALLS_INTERP_ALL_ONLY: if (!this->data->m_input.HasAnyWalls()) this->data->m_input.InterpolateMissingLRUD(); break; case LXWALLS_INTERP_MISSING: this->data->m_input.InterpolateMissingLRUD(); break; } #if wxCHECK_VERSION(3,0,0) wxTheApp->Yield(); #endif if (this->data->m_input.m_error.length() > 0) { wxMessageBox(_("Error reading input file"), _("Error"), wxICON_ERROR | wxOK); } else { this->m_fileHistory->AddFileToHistory(this->m_fileName); } this->data->Rebuild(); #if wxCHECK_VERSION(3,0,0) wxTheApp->Yield(); #endif this->canvas->UpdateRenderContents(); #if wxCHECK_VERSION(3,0,0) wxTheApp->Yield(); #endif this->canvas->UpdateRenderList(); } void lxFrame::ReloadData() { this->canvas->Refresh(false); this->data->m_input.Clear(); this->LoadData(this->m_fileName, this->m_fileType); this->m_modelSetupDlg->InitSetup(); this->m_selectionSetupDlg->LoadData(); } //////////////////////////////////////////////////////////////////////// // Application //////////////////////////////////////////////////////////////////////// IMPLEMENT_APP(lxApp) bool lxApp::OnInit() { #if wxCHECK_VERSION(3,0,0) m_locale.Init(wxLANGUAGE_DEFAULT, wxLOCALE_LOAD_DEFAULT); #else m_locale.Init(wxLANGUAGE_DEFAULT, wxLOCALE_LOAD_DEFAULT | wxLOCALE_CONV_ENCODING); #endif m_locale.AddCatalog(wxT("loch")); m_path = wxFileName(this->argv[0]); vtkObject::GlobalWarningDisplayOff(); #if wxUSE_DISPLAY //multi screen support wxDisplay display(0); //Get the settings for screen 0 wxRect displayRect = display.GetGeometry(); #else wxSize scr = wxGetDisplaySize(); #endif wxFileSystem::AddHandler(new wxZipFSHandler); // Use a double-buffered visual if available, as it will give much smoother // animation. bool double_buffered = true; int wx_gl_attribs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, 0 }; if (!InitGLVisual(wx_gl_attribs)) { int wx_gl_attribs_no_db[] = { WX_GL_RGBA, 0 }; if (!InitGLVisual(wx_gl_attribs_no_db)) { wxString m; m.Printf(_T("This version of loch requires OpenGL to work, but it isn't available")); wxMessageBox(m,_T("Loch") , wxOK | wxCENTRE | wxICON_EXCLAMATION); exit(1); } double_buffered = false; } #if wxUSE_DISPLAY this->frame = new lxFrame(this, _T("Loch"), wxPoint(displayRect.width / 8, displayRect.height / 8), wxSize(3 * displayRect.width / 4, 3 * displayRect.height / 4)); #else this->frame = new lxFrame(this, _T("Loch"), wxPoint(scr.x / 8, scr.y / 8), wxSize(3 * scr.x / 4, 3 * scr.y / 4)); #endif this->frame->Show(true); this->frame->canvas->SetFocus(); #if wxUSE_DISPLAY this->frame->canvas->OSCInit(displayRect.width, displayRect.height); #else this->frame->canvas->OSCInit(wxGetDisplaySize().x, wxGetDisplaySize().y); #endif if (this->argc > 1) { this->frame->m_fileToOpen = wxString(this->argv[1]); } return true; } void lxFrame::OpenFile(const wxString & fName) { wxFileName tmpFN(fName); this->m_fileName = tmpFN.GetFullPath(); this->m_fileDir = tmpFN.GetPath(); this->m_fileType = 0; this->DetectFileType(); this->ReloadData(); this->setup->ResetCamera(); this->canvas->ForceRefresh(); } void lxFrame::ExportRotationPictures() { wxMessageDialog dlg(this, _("This is only EXPERIMENTAL function! Are you sure?"), _("Warning"), wxYES_NO | wxNO_DEFAULT | wxICON_EXCLAMATION | wxCENTRE); if (dlg.ShowModal() != wxID_YES) return; int i; lxRenderData * tmpRD = new lxRenderData(); tmpRD->m_imgFileType = 1; tmpRD->m_askFName = false; this->canvas->setup->cam_orig_dir = this->canvas->setup->cam_dir; this->canvas->setup->cam_orig_dist = this->canvas->setup->cam_dist; this->canvas->setup->cam_orig_tilt = this->canvas->setup->cam_tilt; this->canvas->setup->cam_orig_center = this->canvas->setup->cam_center; this->canvas->setup->cam_orig_pos = this->canvas->setup->cam_pos; for(i = 0; i < 600; i++) { tmpRD->m_imgFileName = this->m_fileDir; tmpRD->m_imgFileName += _T("/"); tmpRD->m_imgFileName += wxString::Format(_T("ROT%04d.png"), i); tmpRD->Render(this, this->canvas); this->canvas->SwapBuffers(); if (i == 0) { tmpRD->Render(this, this->canvas); this->canvas->SwapBuffers(); tmpRD->Render(this, this->canvas); this->canvas->SwapBuffers(); } if (i < 599) { this->canvas->setup->RotateCameraF(0.6); } } delete tmpRD; } #ifdef LXMACOSX void lxApp::MacOpenFile(const wxString &fileName) { this->frame->OpenFile(fileName); } #endif therion/loch/lxRender.h0000664000175000017500000000135410763455544014147 0ustar useruser/** * @file lxRender.h * Loch printing module. */ #ifndef lxRender_h #define lxRender_h // Standard libraries #ifndef LXDEPCHECK #include #endif //LXDEPCHECK - standart libraries enum { LXRENDER_FIT_SCREEN, LXRENDER_FIT_WIDTH, LXRENDER_FIT_HEIGHT, LXRENDER_FIT_SCALE, }; struct lxRenderData { long m_scaleMode; bool m_printRenderer, m_imgWhiteBg, m_askFName; wxString m_imgFileName; int m_imgFileType; double m_scale, m_imgResolution, m_imgWidth, m_imgHeight, m_imgPixW, m_imgPixH; lxRenderData(); void Configure(wxWindow * parent, class lxGLCanvas * glc); void Render(wxWindow * parent, class lxGLCanvas * glc); void CalcImageDimensions(class lxGLCanvas * glc); }; #endif therion/loch/lxFNT6x13_bdf.h0000664000175000017500000637363110537464734014634 0ustar useruserFT_Byte lxFNT6x13_bdf[] = { 83,84,65,82,84,70,79,78,84,32,50,46,49,10,67,79, 77,77,69,78,84,32,36,73,100,58,32,54,120,49,51,46, 98,100,102,44,118,32,49,46,49,49,50,32,50,48,48,50, 45,49,49,45,49,48,32,49,56,58,51,51,58,49,54,43, 48,48,32,109,103,107,50,53,32,82,101,108,32,109,103,107, 50,53,32,36,10,67,79,77,77,69,78,84,32,83,101,110, 100,32,98,117,103,32,114,101,112,111,114,116,115,32,116,111, 32,77,97,114,107,117,115,32,75,117,104,110,32,60,104,116, 116,112,58,47,47,119,119,119,46,99,108,46,99,97,109,46, 97,99,46,117,107,47,126,109,103,107,50,53,47,62,10,70, 79,78,84,32,45,77,105,115,99,45,70,105,120,101,100,45, 77,101,100,105,117,109,45,82,45,83,101,109,105,67,111,110, 100,101,110,115,101,100,45,45,49,51,45,49,50,48,45,55, 53,45,55,53,45,67,45,54,48,45,73,83,79,49,48,54, 52,54,45,49,10,83,73,90,69,32,49,50,32,55,53,32, 55,53,10,70,79,78,84,66,79,85,78,68,73,78,71,66, 79,88,32,54,32,49,51,32,48,32,45,50,10,83,84,65, 82,84,80,82,79,80,69,82,84,73,69,83,32,50,50,10, 70,79,78,84,78,65,77,69,95,82,69,71,73,83,84,82, 89,32,34,34,10,70,79,85,78,68,82,89,32,34,77,105, 115,99,34,10,70,65,77,73,76,89,95,78,65,77,69,32, 34,70,105,120,101,100,34,10,87,69,73,71,72,84,95,78, 65,77,69,32,34,77,101,100,105,117,109,34,10,83,76,65, 78,84,32,34,82,34,10,83,69,84,87,73,68,84,72,95, 78,65,77,69,32,34,83,101,109,105,67,111,110,100,101,110, 115,101,100,34,10,65,68,68,95,83,84,89,76,69,95,78, 65,77,69,32,34,34,10,80,73,88,69,76,95,83,73,90, 69,32,49,51,10,80,79,73,78,84,95,83,73,90,69,32, 49,50,48,10,82,69,83,79,76,85,84,73,79,78,95,88, 32,55,53,10,82,69,83,79,76,85,84,73,79,78,95,89, 32,55,53,10,83,80,65,67,73,78,71,32,34,67,34,10, 65,86,69,82,65,71,69,95,87,73,68,84,72,32,54,48, 10,67,72,65,82,83,69,84,95,82,69,71,73,83,84,82, 89,32,34,73,83,79,49,48,54,52,54,34,10,67,72,65, 82,83,69,84,95,69,78,67,79,68,73,78,71,32,34,49, 34,10,68,69,70,65,85,76,84,95,67,72,65,82,32,48, 10,70,79,78,84,95,68,69,83,67,69,78,84,32,50,10, 70,79,78,84,95,65,83,67,69,78,84,32,49,49,10,67, 79,80,89,82,73,71,72,84,32,34,80,117,98,108,105,99, 32,100,111,109,97,105,110,32,102,111,110,116,46,32,32,83, 104,97,114,101,32,97,110,100,32,101,110,106,111,121,46,34, 10,95,88,77,66,68,70,69,68,95,73,78,70,79,32,34, 69,100,105,116,101,100,32,119,105,116,104,32,120,109,98,100, 102,101,100,32,52,46,53,46,34,10,67,65,80,95,72,69, 73,71,72,84,32,57,10,88,95,72,69,73,71,72,84,32, 54,10,69,78,68,80,82,79,80,69,82,84,73,69,83,10, 67,72,65,82,83,32,52,52,51,48,10,83,84,65,82,84, 67,72,65,82,32,99,104,97,114,48,10,69,78,67,79,68, 73,78,71,32,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,56,10,48,48,10,56, 56,10,48,48,10,56,56,10,48,48,10,56,56,10,48,48, 10,65,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,115,112,97,99, 101,10,69,78,67,79,68,73,78,71,32,51,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,101,120,99,108,97,109,10,69,78,67,79,68, 73,78,71,32,51,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,113,117,111, 116,101,100,98,108,10,69,78,67,79,68,73,78,71,32,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,53,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,110,117,109,98,101,114,115,105, 103,110,10,69,78,67,79,68,73,78,71,32,51,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,53,48,10,53,48,10,70,56,10,53,48, 10,70,56,10,53,48,10,53,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,100,111,108,108,97,114,10,69,78,67,79, 68,73,78,71,32,51,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,55,56, 10,65,48,10,65,48,10,55,48,10,50,56,10,50,56,10, 70,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,112,101, 114,99,101,110,116,10,69,78,67,79,68,73,78,71,32,51, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,56,10,65,56,10,53,48,10,49,48, 10,50,48,10,52,48,10,53,48,10,65,56,10,57,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,109,112,101,114,115,97,110, 100,10,69,78,67,79,68,73,78,71,32,51,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,52,48,10,65,48,10,65,48,10,52,48,10, 65,48,10,57,56,10,57,48,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,113,117,111,116,101,115,105,110,103,108,101,10, 69,78,67,79,68,73,78,71,32,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,112,97,114,101,110,108,101,102,116,10,69,78,67,79, 68,73,78,71,32,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,48,10,50,48,10,50,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 50,48,10,50,48,10,49,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,112,97, 114,101,110,114,105,103,104,116,10,69,78,67,79,68,73,78, 71,32,52,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,52,48,10,50,48,10,50,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,50,48,10, 50,48,10,52,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,97,115,116,101,114, 105,115,107,10,69,78,67,79,68,73,78,71,32,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,65,56,10,55,48,10,65,56,10,50, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,112,108,117,115,10,69,78,67,79,68, 73,78,71,32,52,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,70,56,10,50,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,99,111,109, 109,97,10,69,78,67,79,68,73,78,71,32,52,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,51,48,10,50,48,10,52,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,104,121,112,104,101,110,10,69,78,67,79, 68,73,78,71,32,52,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,112,101, 114,105,111,100,10,69,78,67,79,68,73,78,71,32,52,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,48,10,55,48,10,50, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,115,108,97,115,104,10,69,78,67, 79,68,73,78,71,32,52,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,56,10,48, 56,10,49,48,10,49,48,10,50,48,10,52,48,10,52,48, 10,56,48,10,56,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,122, 101,114,111,10,69,78,67,79,68,73,78,71,32,52,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,53,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,53,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,111,110,101,10,69,78,67,79,68,73, 78,71,32,52,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,54,48,10,65, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,116,119,111,10, 69,78,67,79,68,73,78,71,32,53,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,56,56,10,56,56,10,48,56,10,49,48,10,50,48, 10,52,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,116,104,114,101,101,10,69,78,67,79,68,73,78,71, 32,53,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,48,56,10,49,48,10, 50,48,10,55,48,10,48,56,10,48,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,102,111,117,114,10,69, 78,67,79,68,73,78,71,32,53,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,49,48,10,51,48,10,53,48,10,53,48,10,57,48,10, 70,56,10,49,48,10,49,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,102,105,118,101,10,69,78,67,79,68,73,78,71,32,53, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,56,48,10,56,48,10,66,48, 10,67,56,10,48,56,10,48,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,115,105,120,10,69,78,67,79, 68,73,78,71,32,53,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,70,48,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,115,101, 118,101,110,10,69,78,67,79,68,73,78,71,32,53,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,48,56,10,49,48,10,49,48,10,50, 48,10,50,48,10,52,48,10,52,48,10,52,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,101,105,103,104,116,10,69,78,67,79, 68,73,78,71,32,53,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,55,48,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,110,105, 110,101,10,69,78,67,79,68,73,78,71,32,53,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,55,56, 10,48,56,10,48,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,99,111,108,111,110,10,69,78,67,79,68, 73,78,71,32,53,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,55,48,10,50,48,10,48,48,10,48,48,10,50, 48,10,55,48,10,50,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,115,101,109, 105,99,111,108,111,110,10,69,78,67,79,68,73,78,71,32, 53,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,55, 48,10,50,48,10,48,48,10,48,48,10,51,48,10,50,48, 10,52,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,108,101,115,115,10,69,78, 67,79,68,73,78,71,32,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,56,10, 49,48,10,50,48,10,52,48,10,56,48,10,52,48,10,50, 48,10,49,48,10,48,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 101,113,117,97,108,10,69,78,67,79,68,73,78,71,32,54, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,48,10,48,48,10,70,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,103,114,101,97,116,101,114,10, 69,78,67,79,68,73,78,71,32,54,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,52,48,10,50,48,10,49,48,10,48,56,10,49,48, 10,50,48,10,52,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,113,117,101,115,116,105,111,110,10,69,78,67,79,68, 73,78,71,32,54,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,48,56,10,49,48,10,50,48,10,50,48,10,48, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,97,116,10, 69,78,67,79,68,73,78,71,32,54,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,56,56,10,56,56,10,57,56,10,65,56,10,65,56, 10,66,48,10,56,48,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,65,10,69,78,67,79,68,73,78,71,32,54,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,53,48,10,56,56,10,56,56,10,56, 56,10,70,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,66,10,69,78,67,79,68,73,78,71, 32,54,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,52,56,10,52,56,10, 52,56,10,55,48,10,52,56,10,52,56,10,52,56,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,67,10,69,78,67,79, 68,73,78,71,32,54,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,68,10, 69,78,67,79,68,73,78,71,32,54,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,52,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,70,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,69,10,69,78,67,79,68,73,78,71,32,54,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,56,48,10,56,48,10,56,48,10,70, 48,10,56,48,10,56,48,10,56,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,70,10,69,78,67,79,68,73,78,71, 32,55,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,56,48,10,56,48,10, 56,48,10,70,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,71,10,69,78,67,79, 68,73,78,71,32,55,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,56,48,10,57,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,72,10, 69,78,67,79,68,73,78,71,32,55,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,70,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,73,10,69,78,67,79,68,73,78,71,32,55,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,74,10,69,78,67,79,68,73,78,71, 32,55,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,51,56,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,75,10,69,78,67,79, 68,73,78,71,32,55,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,57,48,10,65,48,10,67,48,10,65,48,10,57,48,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,76,10, 69,78,67,79,68,73,78,71,32,55,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,77,10,69,78,67,79,68,73,78,71,32,55,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,68,56,10,65,56,10,65, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,78,10,69,78,67,79,68,73,78,71, 32,55,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,67,56,10,67,56,10, 65,56,10,65,56,10,57,56,10,57,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,79,10,69,78,67,79, 68,73,78,71,32,55,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,80,10, 69,78,67,79,68,73,78,71,32,56,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,70,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,81,10,69,78,67,79,68,73,78,71,32,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,65,56,10,55,48,10,48,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,82,10,69,78,67,79,68,73,78,71, 32,56,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,56,56,10,56,56,10, 56,56,10,70,48,10,65,48,10,57,48,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,83,10,69,78,67,79, 68,73,78,71,32,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,55,48,10,48,56,10,48,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,84,10, 69,78,67,79,68,73,78,71,32,56,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,85,10,69,78,67,79,68,73,78,71,32,56,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,86,10,69,78,67,79,68,73,78,71, 32,56,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,53,48,10,53,48,10,53,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,87,10,69,78,67,79, 68,73,78,71,32,56,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,65,56,10,65,56,10,65,56,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,88,10, 69,78,67,79,68,73,78,71,32,56,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,53,48,10,53,48,10,50,48,10,53,48, 10,53,48,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,89,10,69,78,67,79,68,73,78,71,32,56,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,53,48,10,53,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,90,10,69,78,67,79,68,73,78,71, 32,57,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,48,56,10,49,48,10, 49,48,10,50,48,10,52,48,10,52,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,98,114,97,99,107,101, 116,108,101,102,116,10,69,78,67,79,68,73,78,71,32,57, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,55,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 55,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,98,97,99,107,115,108,97,115, 104,10,69,78,67,79,68,73,78,71,32,57,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,52,48,10,52,48,10,50,48,10, 49,48,10,49,48,10,48,56,10,48,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,98,114,97,99,107,101,116,114,105,103,104,116, 10,69,78,67,79,68,73,78,71,32,57,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,55,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,55,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,97,115,99,105,105,99,105,114,99,117,109,10,69, 78,67,79,68,73,78,71,32,57,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,50,48, 10,53,48,10,56,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,100,101,114,115,99,111,114,101,10,69,78,67,79, 68,73,78,71,32,57,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,103,114, 97,118,101,10,69,78,67,79,68,73,78,71,32,57,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 50,48,10,49,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,10,69,78,67,79,68,73,78,71, 32,57,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,48,56,10,55,56,10,56,56,10,57,56,10,54, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,98,10,69,78,67,79, 68,73,78,71,32,57,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,48,10,56,48, 10,56,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,99,10, 69,78,67,79,68,73,78,71,32,57,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,56,48, 10,56,48,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,100,10,69,78,67,79,68,73,78,71,32,49,48,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,48,56,10,48,56,10,55,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,55,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,101,10,69,78,67,79,68,73,78, 71,32,49,48,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,70,56,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,102,10,69,78, 67,79,68,73,78,71,32,49,48,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,51,48, 10,52,56,10,52,48,10,52,48,10,70,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,103,10,69,78,67,79,68,73,78,71,32,49,48,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,55,56,10,48,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,104,10,69,78,67,79,68,73,78,71, 32,49,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,56,48,10,56,48,10,56,48, 10,66,48,10,67,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,105,10,69,78,67, 79,68,73,78,71,32,49,48,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,48,48,10,54,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 106,10,69,78,67,79,68,73,78,71,32,49,48,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,49,48,10,48,48,10,51,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,57,48,10,57,48,10, 54,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,107,10,69,78,67,79,68,73,78,71,32, 49,48,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 57,48,10,65,48,10,67,48,10,65,48,10,57,48,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,108,10,69,78,67,79, 68,73,78,71,32,49,48,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,54,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,109, 10,69,78,67,79,68,73,78,71,32,49,48,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,68,48,10,65,56,10, 65,56,10,65,56,10,65,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,110,10,69,78,67,79,68,73,78,71,32,49, 49,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,66, 48,10,67,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,111,10,69,78,67,79,68, 73,78,71,32,49,49,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,112,10, 69,78,67,79,68,73,78,71,32,49,49,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,48,10,56,56,10,56, 56,10,56,56,10,70,48,10,56,48,10,56,48,10,56,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,113,10,69,78,67,79,68,73,78,71,32,49,49, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,56, 10,56,56,10,56,56,10,56,56,10,55,56,10,48,56,10, 48,56,10,48,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,114,10,69,78,67,79,68,73, 78,71,32,49,49,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,66,48,10,67,56,10,56,48,10,56,48,10,56, 48,10,56,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,115,10,69, 78,67,79,68,73,78,71,32,49,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,54,48, 10,49,48,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,116,10,69,78,67,79,68,73,78,71,32,49,49,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,52,48,10,52,48,10,70,48,10, 52,48,10,52,48,10,52,48,10,52,56,10,51,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,10,69,78,67,79,68,73,78, 71,32,49,49,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,118,10,69,78, 67,79,68,73,78,71,32,49,49,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 53,48,10,53,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,119,10,69,78,67,79,68,73,78,71,32,49,49,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,65,56,10,65,56,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,120,10,69,78,67,79,68,73,78,71, 32,49,50,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,56,56,10,53,48,10,50,48,10,50,48,10,53,48,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,121,10,69,78,67, 79,68,73,78,71,32,49,50,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,56,10,56,56,10,56,56,10,57, 56,10,54,56,10,48,56,10,56,56,10,55,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 122,10,69,78,67,79,68,73,78,71,32,49,50,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,56,10,49,48, 10,50,48,10,52,48,10,56,48,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,98,114,97,99,101,108,101,102,116,10,69, 78,67,79,68,73,78,71,32,49,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,50, 48,10,50,48,10,50,48,10,50,48,10,67,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,49,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,98,97,114,10,69,78,67,79,68,73,78,71,32,49, 50,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,98,114,97,99,101,114,105, 103,104,116,10,69,78,67,79,68,73,78,71,32,49,50,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 49,56,10,50,48,10,50,48,10,50,48,10,50,48,10,67, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,97,115,99,105,105,116,105,108,100, 101,10,69,78,67,79,68,73,78,71,32,49,50,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,56,10,65,56,10,57,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,115,112,97,99,101,10,69,78,67,79,68, 73,78,71,32,49,54,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,101,120, 99,108,97,109,100,111,119,110,10,69,78,67,79,68,73,78, 71,32,49,54,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,48,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,99,101,110,116, 10,69,78,67,79,68,73,78,71,32,49,54,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,55,48,10,65,56,10,65,48,10,65,48,10, 65,56,10,55,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,115,116,101,114,108,105,110,103,10,69,78,67, 79,68,73,78,71,32,49,54,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,48,10, 52,56,10,52,48,10,52,48,10,69,48,10,52,48,10,52, 48,10,52,56,10,66,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 99,117,114,114,101,110,99,121,10,69,78,67,79,68,73,78, 71,32,49,54,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,56, 56,10,55,48,10,53,48,10,53,48,10,55,48,10,56,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,121,101,110,10, 69,78,67,79,68,73,78,71,32,49,54,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,56,10,56,56,10,53,48,10,53,48,10,70,56,10,50, 48,10,70,56,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,98,114,111,107,101,110,98,97,114,10,69,78,67, 79,68,73,78,71,32,49,54,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 115,101,99,116,105,111,110,10,69,78,67,79,68,73,78,71, 32,49,54,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,51,48,10,52,56,10,52,48,10,51,48, 10,52,56,10,52,56,10,51,48,10,48,56,10,52,56,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,100,105,101,114,101, 115,105,115,10,69,78,67,79,68,73,78,71,32,49,54,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,53,48,10,53,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,99,111,112,121,114,105,103,104,116, 10,69,78,67,79,68,73,78,71,32,49,54,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,55,48, 10,56,56,10,65,56,10,68,56,10,67,56,10,68,56,10, 65,56,10,56,56,10,55,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,111,114,100,102,101,109,105,110,105,110,101,10, 69,78,67,79,68,73,78,71,32,49,55,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,48,56,10,55,56,10,56,56,10,55,56,10,48, 48,10,70,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,103,117,105,108,108,101,109,111,116,108,101,102,116, 10,69,78,67,79,68,73,78,71,32,49,55,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,56,10,53,48,10,65,48,10, 65,48,10,53,48,10,50,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,108,111,103,105,99,97,108,110,111,116,10,69, 78,67,79,68,73,78,71,32,49,55,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,56,10,48,56, 10,48,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,104,121,112,104,101,110,10,69,78,67,79,68,73,78, 71,32,49,55,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,114,101,103,105, 115,116,101,114,101,100,10,69,78,67,79,68,73,78,71,32, 49,55,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,55,48,10,56,56,10,69,56,10,68,56,10, 68,56,10,69,56,10,68,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,109,97,99,114,111,110, 10,69,78,67,79,68,73,78,71,32,49,55,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,100,101,103,114,101,101,10,69,78,67,79,68, 73,78,71,32,49,55,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,48,10,52,56, 10,52,56,10,51,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,112,108, 117,115,109,105,110,117,115,10,69,78,67,79,68,73,78,71, 32,49,55,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,50,48,10,50,48, 10,70,56,10,50,48,10,50,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,116,119,111,115,117, 112,101,114,105,111,114,10,69,78,67,79,68,73,78,71,32, 49,55,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,48,10,65,48,10,50,48,10,52,48,10, 69,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,116,104,114,101,101,115, 117,112,101,114,105,111,114,10,69,78,67,79,68,73,78,71, 32,49,55,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,52,48,10,65,48,10,52,48,10,50,48, 10,67,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,97,99,117,116,101, 10,69,78,67,79,68,73,78,71,32,49,56,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,109,117,10,69,78,67,79,68,73,78,71,32, 49,56,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,57,56,10,69, 56,10,56,48,10,56,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,112,97,114,97,103,114, 97,112,104,10,69,78,67,79,68,73,78,71,32,49,56,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,56,10,69,56,10,69,56,10,69,56,10, 69,56,10,54,56,10,50,56,10,50,56,10,50,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,112,101,114,105,111,100,99,101,110, 116,101,114,101,100,10,69,78,67,79,68,73,78,71,32,49, 56,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,51,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,99,101,100,105,108,108,97, 10,69,78,67,79,68,73,78,71,32,49,56,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,49,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,111,110,101,115,117,112,101,114,105,111,114,10, 69,78,67,79,68,73,78,71,32,49,56,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,48,10, 67,48,10,52,48,10,52,48,10,69,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,111,114,100,109,97,115,99,117,108,105,110,101,10, 69,78,67,79,68,73,78,71,32,49,56,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,56,56,10,56,56,10,55,48,10,48, 48,10,70,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,103,117,105,108,108,101,109,111,116,114,105,103,104, 116,10,69,78,67,79,68,73,78,71,32,49,56,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,65,48,10,53,48,10,50,56, 10,50,56,10,53,48,10,65,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,111,110,101,113,117,97,114,116,101,114,10, 69,78,67,79,68,73,78,71,32,49,56,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,48,10, 67,48,10,52,48,10,52,48,10,69,48,10,48,56,10,49, 56,10,50,56,10,51,56,10,48,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,111,110,101,104,97,108,102,10,69,78,67,79,68, 73,78,71,32,49,56,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,48,10,67,48,10,52,48, 10,52,48,10,69,48,10,49,48,10,50,56,10,48,56,10, 49,48,10,51,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,116,104, 114,101,101,113,117,97,114,116,101,114,115,10,69,78,67,79, 68,73,78,71,32,49,57,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,52,48,10,65,48,10,52, 48,10,50,48,10,65,48,10,52,56,10,49,56,10,50,56, 10,51,56,10,48,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,113, 117,101,115,116,105,111,110,100,111,119,110,10,69,78,67,79, 68,73,78,71,32,49,57,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,48, 48,10,50,48,10,50,48,10,52,48,10,56,48,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,65, 103,114,97,118,101,10,69,78,67,79,68,73,78,71,32,49, 57,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,52,48,10,50,48,10,48,48,10,50,48,10,53, 48,10,56,56,10,56,56,10,70,56,10,56,56,10,56,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,65,97,99,117,116,101,10, 69,78,67,79,68,73,78,71,32,49,57,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,49,48,10, 50,48,10,48,48,10,50,48,10,53,48,10,56,56,10,56, 56,10,70,56,10,56,56,10,56,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,65,99,105,114,99,117,109,102,108,101,120,10,69, 78,67,79,68,73,78,71,32,49,57,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,51,48,10,52, 56,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,65,116,105,108,100,101,10,69,78,67,79,68,73,78, 71,32,49,57,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,50,56,10,53,48,10,48,48,10,50, 48,10,53,48,10,56,56,10,56,56,10,70,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,65,100,105,101, 114,101,115,105,115,10,69,78,67,79,68,73,78,71,32,49, 57,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,53,48,10,53,48,10,48,48,10,50,48,10,53, 48,10,56,56,10,56,56,10,70,56,10,56,56,10,56,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,65,114,105,110,103,10,69, 78,67,79,68,73,78,71,32,49,57,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,53, 48,10,50,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,65,69,10,69,78,67,79,68,73,78,71,32,49,57, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,56,10,65,48,10,65,48,10,65,48, 10,66,48,10,69,48,10,65,48,10,65,48,10,66,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,67,99,101,100,105,108,108,97, 10,69,78,67,79,68,73,78,71,32,49,57,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,56,10,55,48,10,50,48,10,52, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,69,103,114,97,118,101,10,69,78,67,79,68, 73,78,71,32,50,48,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,48,10,50,48,10,48,48, 10,70,56,10,56,48,10,56,48,10,70,48,10,56,48,10, 56,48,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,69,97, 99,117,116,101,10,69,78,67,79,68,73,78,71,32,50,48, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,48,10,50,48,10,48,48,10,70,56,10,56,48, 10,56,48,10,70,48,10,56,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,69,99,105,114,99,117,109,102, 108,101,120,10,69,78,67,79,68,73,78,71,32,50,48,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,51,48,10,52,56,10,48,48,10,70,56,10,56,48,10, 56,48,10,70,48,10,56,48,10,56,48,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,69,100,105,101,114,101,115,105,115, 10,69,78,67,79,68,73,78,71,32,50,48,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,70,56,10,56,48,10,56,48,10, 70,48,10,56,48,10,56,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,73,103,114,97,118,101,10,69,78,67,79,68, 73,78,71,32,50,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,48,10,50,48,10,48,48, 10,55,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,73,97, 99,117,116,101,10,69,78,67,79,68,73,78,71,32,50,48, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,48,10,50,48,10,48,48,10,55,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,73,99,105,114,99,117,109,102, 108,101,120,10,69,78,67,79,68,73,78,71,32,50,48,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,51,48,10,52,56,10,48,48,10,55,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,73,100,105,101,114,101,115,105,115, 10,69,78,67,79,68,73,78,71,32,50,48,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,55,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,69,116,104,10,69,78,67,79,68,73,78,71, 32,50,48,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,48,10,52,56,10,52,56, 10,52,56,10,69,56,10,52,56,10,52,56,10,52,56,10, 70,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,78,116,105,108,100, 101,10,69,78,67,79,68,73,78,71,32,50,48,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,50, 56,10,53,48,10,48,48,10,56,56,10,56,56,10,67,56, 10,65,56,10,57,56,10,56,56,10,56,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,79,103,114,97,118,101,10,69,78,67,79, 68,73,78,71,32,50,49,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,52,48,10,50,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,79, 97,99,117,116,101,10,69,78,67,79,68,73,78,71,32,50, 49,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,49,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,79,99,105,114,99,117,109, 102,108,101,120,10,69,78,67,79,68,73,78,71,32,50,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,52,56,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,79,116,105,108,100,101,10,69, 78,67,79,68,73,78,71,32,50,49,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,56,10,53, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,79,100,105,101,114,101,115,105,115,10,69,78,67,79, 68,73,78,71,32,50,49,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,53,48,10,53,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,109, 117,108,116,105,112,108,121,10,69,78,67,79,68,73,78,71, 32,50,49,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,56,56,10,53,48,10,50,48,10,53,48,10,56,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,79,115,108,97,115, 104,10,69,78,67,79,68,73,78,71,32,50,49,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 56,10,55,48,10,57,56,10,57,56,10,65,56,10,65,56, 10,65,56,10,67,56,10,67,56,10,55,48,10,56,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,85,103,114,97,118,101,10,69,78,67,79, 68,73,78,71,32,50,49,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,52,48,10,50,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,85, 97,99,117,116,101,10,69,78,67,79,68,73,78,71,32,50, 49,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,49,48,10,50,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,85,99,105,114,99,117,109, 102,108,101,120,10,69,78,67,79,68,73,78,71,32,50,49, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,52,56,10,48,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,85,100,105,101,114,101,115,105, 115,10,69,78,67,79,68,73,78,71,32,50,50,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,53, 48,10,53,48,10,48,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,89,97,99,117,116,101,10,69,78,67,79, 68,73,78,71,32,50,50,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,49,48,10,50,48,10,48, 48,10,56,56,10,56,56,10,53,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,84, 104,111,114,110,10,69,78,67,79,68,73,78,71,32,50,50, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,70,48,10,56,56,10,56,56, 10,56,56,10,70,48,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,103,101,114,109,97,110,100,98, 108,115,10,69,78,67,79,68,73,78,71,32,50,50,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,54,48,10,57,48,10,57,48,10,65,48,10,65, 48,10,57,48,10,56,56,10,56,56,10,66,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,103,114,97,118,101,10,69,78,67, 79,68,73,78,71,32,50,50,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,55,48,10,48,56,10,55,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,97,99,117,116,101,10,69,78,67,79,68,73,78,71,32, 50,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,49,48,10,50,48,10,48,48,10, 55,48,10,48,56,10,55,56,10,56,56,10,57,56,10,54, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,99,105,114,99,117, 109,102,108,101,120,10,69,78,67,79,68,73,78,71,32,50, 50,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,51,48,10,52,56,10,48,48,10,55, 48,10,48,56,10,55,56,10,56,56,10,57,56,10,54,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,97,116,105,108,100,101,10, 69,78,67,79,68,73,78,71,32,50,50,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,56,10,53,48,10,48,48,10,55,48,10,48,56,10,55, 56,10,56,56,10,57,56,10,54,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,97,100,105,101,114,101,115,105,115,10,69,78,67, 79,68,73,78,71,32,50,50,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,48,56,10,55,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,114,105,110,103,10,69,78,67,79,68,73,78,71,32,50, 50,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,51,48,10,52,56,10,51,48,10,48,48,10,55, 48,10,48,56,10,55,56,10,56,56,10,57,56,10,54,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,97,101,10,69,78,67,79, 68,73,78,71,32,50,51,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,50,56,10,55,48,10,65,48, 10,65,56,10,53,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,99, 99,101,100,105,108,108,97,10,69,78,67,79,68,73,78,71, 32,50,51,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,48,10,56,48,10,56,56,10, 55,48,10,50,48,10,52,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,101,103,114,97,118, 101,10,69,78,67,79,68,73,78,71,32,50,51,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,48,10,50,48,10,48,48,10,55,48,10,56,56, 10,70,56,10,56,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,101,97,99,117,116,101,10,69,78,67,79, 68,73,78,71,32,50,51,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,49,48,10,50, 48,10,48,48,10,55,48,10,56,56,10,70,56,10,56,48, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,101, 99,105,114,99,117,109,102,108,101,120,10,69,78,67,79,68, 73,78,71,32,50,51,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,48,10,52,56, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,101,100, 105,101,114,101,115,105,115,10,69,78,67,79,68,73,78,71, 32,50,51,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,53,48,10,53,48,10,48,48, 10,55,48,10,56,56,10,70,56,10,56,48,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,105,103,114,97,118, 101,10,69,78,67,79,68,73,78,71,32,50,51,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,48,10,50,48,10,48,48,10,54,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,105,97,99,117,116,101,10,69,78,67,79, 68,73,78,71,32,50,51,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,49,48,10,50, 48,10,48,48,10,54,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,105, 99,105,114,99,117,109,102,108,101,120,10,69,78,67,79,68, 73,78,71,32,50,51,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,48,10,52,56, 10,48,48,10,54,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,105,100, 105,101,114,101,115,105,115,10,69,78,67,79,68,73,78,71, 32,50,51,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,53,48,10,53,48,10,48,48, 10,54,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,101,116,104,10,69, 78,67,79,68,73,78,71,32,50,52,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,53,48,10,50, 48,10,54,48,10,49,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,110,116,105,108,100,101,10,69,78,67,79,68,73,78, 71,32,50,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,56,10,53,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,111,103,114,97, 118,101,10,69,78,67,79,68,73,78,71,32,50,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,111,97,99,117,116,101,10,69,78,67, 79,68,73,78,71,32,50,52,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 111,99,105,114,99,117,109,102,108,101,120,10,69,78,67,79, 68,73,78,71,32,50,52,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,51,48,10,52, 56,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,111, 116,105,108,100,101,10,69,78,67,79,68,73,78,71,32,50, 52,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,56,10,53,48,10,48,48,10,55, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,111,100,105,101,114,101,115, 105,115,10,69,78,67,79,68,73,78,71,32,50,52,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,48,10,53,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,100,105,118,105,100,101,10,69,78,67, 79,68,73,78,71,32,50,52,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,48,48,10,70,56,10,48,48,10,50, 48,10,50,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 111,115,108,97,115,104,10,69,78,67,79,68,73,78,71,32, 50,52,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,56,10, 55,48,10,57,56,10,65,56,10,65,56,10,67,56,10,55, 48,10,56,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,103,114,97,118,101, 10,69,78,67,79,68,73,78,71,32,50,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,48,10,50,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,97,99,117,116,101,10,69,78,67,79,68, 73,78,71,32,50,53,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,50,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,99, 105,114,99,117,109,102,108,101,120,10,69,78,67,79,68,73, 78,71,32,50,53,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,51,48,10,52,56,10, 48,48,10,56,56,10,56,56,10,56,56,10,56,56,10,57, 56,10,54,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,100,105, 101,114,101,115,105,115,10,69,78,67,79,68,73,78,71,32, 50,53,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,53,48,10,53,48,10,48,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,57,56,10,54, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,121,97,99,117,116,101, 10,69,78,67,79,68,73,78,71,32,50,53,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,50,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,57,56,10,54,56,10,48,56,10,56,56,10,55, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,116,104,111,114,110,10,69,78,67,79,68,73, 78,71,32,50,53,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,56,48,10, 56,48,10,66,48,10,67,56,10,56,56,10,56,56,10,67, 56,10,66,48,10,56,48,10,56,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,121,100,105, 101,114,101,115,105,115,10,69,78,67,79,68,73,78,71,32, 50,53,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,53,48,10,53,48,10,48,48,10, 56,56,10,56,56,10,56,56,10,57,56,10,54,56,10,48, 56,10,56,56,10,55,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,65,109,97,99,114,111, 110,10,69,78,67,79,68,73,78,71,32,50,53,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,70, 56,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,56,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,97,109,97,99,114,111,110,10,69,78,67, 79,68,73,78,71,32,50,53,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,48,10,55,48,10,48,56,10,55,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 65,98,114,101,118,101,10,69,78,67,79,68,73,78,71,32, 50,53,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,56,56,10,55,48,10,48,48,10,50,48,10, 53,48,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,98,114,101,118,101, 10,69,78,67,79,68,73,78,71,32,50,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,56,10,55,48,10,48,48,10,55,48,10,48,56,10, 55,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,65,111,103,111,110,101,107,10,69,78,67,79, 68,73,78,71,32,50,54,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,53, 48,10,56,56,10,56,56,10,56,56,10,70,56,10,56,56, 10,56,56,10,56,56,10,48,56,10,48,52,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,97, 111,103,111,110,101,107,10,69,78,67,79,68,73,78,71,32, 50,54,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,48,56,10,55,56,10,56,56,10,57,56,10,54, 56,10,48,56,10,48,52,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,67,97,99,117,116,101, 10,69,78,67,79,68,73,78,71,32,50,54,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,50,48,10,48,48,10,55,48,10,56,56,10,56,48,10, 56,48,10,56,48,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,99,97,99,117,116,101,10,69,78,67,79,68, 73,78,71,32,50,54,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,50,48, 10,48,48,10,55,48,10,56,56,10,56,48,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,67,99, 105,114,99,117,109,102,108,101,120,10,69,78,67,79,68,73, 78,71,32,50,54,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,51,48,10,52,56,10,48,48,10, 55,48,10,56,56,10,56,48,10,56,48,10,56,48,10,56, 56,10,55,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,99,99,105, 114,99,117,109,102,108,101,120,10,69,78,67,79,68,73,78, 71,32,50,54,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,51,48,10,52,56,10,48, 48,10,55,48,10,56,56,10,56,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,67,100,111,116, 97,99,99,101,110,116,10,69,78,67,79,68,73,78,71,32, 50,54,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,48,48,10,55,48,10, 56,56,10,56,48,10,56,48,10,56,48,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,99,100,111,116,97,99, 99,101,110,116,10,69,78,67,79,68,73,78,71,32,50,54, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,48,48,10,55,48, 10,56,56,10,56,48,10,56,48,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,67,99,97,114,111,110,10,69, 78,67,79,68,73,78,71,32,50,54,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,52,56,10,51, 48,10,48,48,10,55,48,10,56,56,10,56,48,10,56,48, 10,56,48,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,99,99,97,114,111,110,10,69,78,67,79,68,73,78, 71,32,50,54,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,56,10,51,48,10,48, 48,10,55,48,10,56,56,10,56,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,68,99,97,114, 111,110,10,69,78,67,79,68,73,78,71,32,50,55,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,56,10,51,48,10,48,48,10,70,48,10,52,56,10,52, 56,10,52,56,10,52,56,10,52,56,10,70,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,100,99,97,114,111,110,10,69,78,67, 79,68,73,78,71,32,50,55,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,52,56,10,51,48,10,48,48,10, 48,56,10,48,56,10,55,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 68,99,114,111,97,116,10,69,78,67,79,68,73,78,71,32, 50,55,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,52,56,10,52,56,10, 52,56,10,69,56,10,52,56,10,52,56,10,52,56,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,100,99,114,111,97,116, 10,69,78,67,79,68,73,78,71,32,50,55,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,56,10,49,67,10,48,56,10,55,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,69,109,97,99,114,111,110,10,69,78,67,79, 68,73,78,71,32,50,55,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,56,10,48,48,10,70, 56,10,56,48,10,56,48,10,70,48,10,56,48,10,56,48, 10,56,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,101, 109,97,99,114,111,110,10,69,78,67,79,68,73,78,71,32, 50,55,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,48,10, 55,48,10,56,56,10,70,56,10,56,48,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,69,98,114,101,118,101, 10,69,78,67,79,68,73,78,71,32,50,55,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,56,56, 10,55,48,10,48,48,10,70,56,10,56,48,10,56,48,10, 70,48,10,56,48,10,56,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,101,98,114,101,118,101,10,69,78,67,79,68, 73,78,71,32,50,55,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,55,48, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,69,100, 111,116,97,99,99,101,110,116,10,69,78,67,79,68,73,78, 71,32,50,55,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,50,48,10,50,48,10,48,48,10,70, 56,10,56,48,10,56,48,10,70,48,10,56,48,10,56,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,101,100,111,116, 97,99,99,101,110,116,10,69,78,67,79,68,73,78,71,32, 50,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,48,48,10, 55,48,10,56,56,10,70,56,10,56,48,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,69,111,103,111,110,101, 107,10,69,78,67,79,68,73,78,71,32,50,56,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,56,48,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,56,48,10,70,56,10,50,48,10, 49,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,101,111,103,111,110,101,107,10,69,78,67, 79,68,73,78,71,32,50,56,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,70,56,10,56, 48,10,56,56,10,55,48,10,50,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 69,99,97,114,111,110,10,69,78,67,79,68,73,78,71,32, 50,56,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,56,10,51,48,10,48,48,10,70,56,10, 56,48,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,101,99,97,114,111,110, 10,69,78,67,79,68,73,78,71,32,50,56,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,56,10,51,48,10,48,48,10,55,48,10,56,56,10, 70,56,10,56,48,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,71,99,105,114,99,117,109,102,108,101,120,10, 69,78,67,79,68,73,78,71,32,50,56,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,51,48,10, 52,56,10,48,48,10,55,48,10,56,56,10,56,48,10,56, 48,10,57,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,103,99,105,114,99,117,109,102,108,101,120,10,69, 78,67,79,68,73,78,71,32,50,56,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 48,10,52,56,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,55,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,71,98,114,101,118,101,10,69,78,67,79,68,73,78, 71,32,50,56,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,56,56,10,55,48,10,48,48,10,55, 48,10,56,56,10,56,48,10,56,48,10,57,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,103,98,114,101, 118,101,10,69,78,67,79,68,73,78,71,32,50,56,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,55,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,55,56,10,48,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,71,100,111,116,97,99,99,101,110,116, 10,69,78,67,79,68,73,78,71,32,50,56,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,50,48, 10,50,48,10,48,48,10,55,48,10,56,56,10,56,48,10, 56,48,10,57,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,103,100,111,116,97,99,99,101,110,116,10,69, 78,67,79,68,73,78,71,32,50,56,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,55,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,71,99,111,109,109,97,97,99,99,101,110,116,10,69, 78,67,79,68,73,78,71,32,50,57,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,56,56,10,56,48,10,56,48,10,56,48,10,57,56, 10,56,56,10,56,56,10,55,48,10,50,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,103,99,111,109,109,97,97,99,99,101,110,116,10,69, 78,67,79,68,73,78,71,32,50,57,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,48,10,50, 48,10,54,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,55,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,72,99,105,114,99,117,109,102,108,101,120,10,69,78, 67,79,68,73,78,71,32,50,57,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,51,48,10,52,56, 10,48,48,10,56,56,10,56,56,10,56,56,10,70,56,10, 56,56,10,56,56,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,104,99,105,114,99,117,109,102,108,101,120,10,69,78,67, 79,68,73,78,71,32,50,57,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,52,56,10, 48,48,10,56,48,10,56,48,10,66,48,10,67,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 72,98,97,114,10,69,78,67,79,68,73,78,71,32,50,57, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,70,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,104,98,97,114,10,69,78,67, 79,68,73,78,71,32,50,57,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 70,48,10,56,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 73,116,105,108,100,101,10,69,78,67,79,68,73,78,71,32, 50,57,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,56,10,53,48,10,48,48,10,55,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,105,116,105,108,100,101, 10,69,78,67,79,68,73,78,71,32,50,57,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,53,48,10,65,48,10,48,48,10,54,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,73,109,97,99,114,111,110,10,69,78,67,79, 68,73,78,71,32,50,57,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,56,10,48,48,10,55, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,105, 109,97,99,114,111,110,10,69,78,67,79,68,73,78,71,32, 50,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,48,10, 54,48,10,50,48,10,50,48,10,50,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,73,98,114,101,118,101, 10,69,78,67,79,68,73,78,71,32,51,48,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,56,56, 10,55,48,10,48,48,10,55,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,105,98,114,101,118,101,10,69,78,67,79,68, 73,78,71,32,51,48,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,55,48, 10,48,48,10,54,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,73,111, 103,111,110,101,107,10,69,78,67,79,68,73,78,71,32,51, 48,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,55,48, 10,50,48,10,49,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,105,111,103,111,110,101,107, 10,69,78,67,79,68,73,78,71,32,51,48,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,48,48,10,54,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,50,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,73,100,111,116,97,99,99,101,110,116,10,69, 78,67,79,68,73,78,71,32,51,48,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,55,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,100,111,116,108,101,115,115,105,10,69,78,67,79,68, 73,78,71,32,51,48,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,54,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,73,74, 10,69,78,67,79,68,73,78,71,32,51,48,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,67,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,65,56,10,68,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,105,106,10,69,78,67,79,68,73,78,71,32, 51,48,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,52,56,10,48,48,10, 68,56,10,52,56,10,52,56,10,52,56,10,52,56,10,69, 56,10,52,56,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,74,99,105,114,99,117, 109,102,108,101,120,10,69,78,67,79,68,73,78,71,32,51, 48,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,51,48,10,52,56,10,48,48,10,51,56,10,49, 48,10,49,48,10,49,48,10,49,48,10,57,48,10,54,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,106,99,105,114,99,117,109, 102,108,101,120,10,69,78,67,79,68,73,78,71,32,51,48, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,51,48,10,52,56,10,48,48,10,51,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,57,48,10, 57,48,10,54,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,75,99,111,109,109,97,97,99, 99,101,110,116,10,69,78,67,79,68,73,78,71,32,51,49, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,57,48,10,65,48, 10,67,48,10,65,48,10,57,48,10,56,56,10,56,56,10, 52,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,107,99,111,109,109,97,97,99, 99,101,110,116,10,69,78,67,79,68,73,78,71,32,51,49, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,57,48, 10,65,48,10,67,48,10,65,48,10,57,48,10,56,56,10, 52,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,107,103,114,101,101,110,108,97, 110,100,105,99,10,69,78,67,79,68,73,78,71,32,51,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,57,48,10,65,48,10,69,48,10,57,48,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,76,97,99,117,116,101,10,69, 78,67,79,68,73,78,71,32,51,49,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,52,48,10,56, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,108,97,99,117,116,101,10,69,78,67,79,68,73,78, 71,32,51,49,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,49,48,10,50,48,10,48,48,10,54,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,76,99,111,109, 109,97,97,99,99,101,110,116,10,69,78,67,79,68,73,78, 71,32,51,49,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,70,56,10,50,48,10,52,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,108,99,111,109, 109,97,97,99,99,101,110,116,10,69,78,67,79,68,73,78, 71,32,51,49,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,54,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,55,48,10,50,48,10,52,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,76,99,97,114, 111,110,10,69,78,67,79,68,73,78,71,32,51,49,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 57,48,10,54,48,10,48,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,55,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,108,99,97,114,111,110,10,69,78,67, 79,68,73,78,71,32,51,49,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,57,48,10,54,48,10,48,48,10, 54,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 76,100,111,116,10,69,78,67,79,68,73,78,71,32,51,49, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,57,48, 10,57,48,10,56,48,10,56,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,108,100,111,116,10,69,78,67, 79,68,73,78,71,32,51,50,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,48,10, 50,48,10,50,48,10,50,56,10,50,56,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 76,115,108,97,115,104,10,69,78,67,79,68,73,78,71,32, 51,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,52,48,10,54,48,10, 52,48,10,67,48,10,52,48,10,52,48,10,52,48,10,55, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,108,115,108,97,115,104, 10,69,78,67,79,68,73,78,71,32,51,50,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,48,10,50,48,10,51,48,10,50,48,10,54,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,78,97,99,117,116,101,10,69,78,67,79,68, 73,78,71,32,51,50,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,48,10,50,48,10,48,48, 10,56,56,10,67,56,10,67,56,10,65,56,10,57,56,10, 57,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,110,97, 99,117,116,101,10,69,78,67,79,68,73,78,71,32,51,50, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,50,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,78,99,111,109,109,97,97,99, 99,101,110,116,10,69,78,67,79,68,73,78,71,32,51,50, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,67,56,10,67,56,10,65,56, 10,65,56,10,57,56,10,57,56,10,56,56,10,56,56,10, 52,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,110,99,111,109,109,97,97,99, 99,101,110,116,10,69,78,67,79,68,73,78,71,32,51,50, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 52,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,78,99,97,114,111,110,10,69, 78,67,79,68,73,78,71,32,51,50,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,52,56,10,51, 48,10,48,48,10,56,56,10,67,56,10,67,56,10,65,56, 10,57,56,10,57,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,110,99,97,114,111,110,10,69,78,67,79,68,73,78, 71,32,51,50,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,56,10,51,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,110,97,112,111, 115,116,114,111,112,104,101,10,69,78,67,79,68,73,78,71, 32,51,50,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,67,48,10,52,48,10,56,48,10,48,48, 10,66,48,10,67,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,69,110,103,10,69, 78,67,79,68,73,78,71,32,51,51,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,67,56,10,67,56,10,65,56,10,65,56,10,57,56, 10,57,56,10,56,56,10,56,56,10,50,56,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,101,110,103,10,69,78,67,79,68,73,78,71,32,51, 51,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,66, 48,10,67,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,50,56,10,49,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,79,109,97,99,114,111,110, 10,69,78,67,79,68,73,78,71,32,51,51,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,70,56, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,111,109,97,99,114,111,110,10,69,78,67,79, 68,73,78,71,32,51,51,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,70, 56,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,79, 98,114,101,118,101,10,69,78,67,79,68,73,78,71,32,51, 51,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,56,56,10,55,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,111,98,114,101,118,101,10, 69,78,67,79,68,73,78,71,32,51,51,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,56,10,55,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,79,104,117,110,103,97,114,117,109,108,97,117,116, 10,69,78,67,79,68,73,78,71,32,51,51,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,52,56, 10,57,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,111,104,117,110,103,97,114,117,109,108,97,117, 116,10,69,78,67,79,68,73,78,71,32,51,51,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,56,10,57,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,79,69,10,69,78,67,79,68,73,78,71, 32,51,51,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,65,48,10,65,48, 10,65,48,10,66,48,10,65,48,10,65,48,10,65,48,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,111,101,10,69,78, 67,79,68,73,78,71,32,51,51,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,53,48,10,65,56,10,66,56,10, 65,48,10,65,56,10,53,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,82,97,99,117,116,101,10,69,78,67,79,68,73,78,71, 32,51,52,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,49,48,10,50,48,10,48,48,10,70,48, 10,56,56,10,56,56,10,70,48,10,57,48,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,114,97,99,117,116, 101,10,69,78,67,79,68,73,78,71,32,51,52,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,49,48,10,50,48,10,48,48,10,66,48,10,67,56, 10,56,48,10,56,48,10,56,48,10,56,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,82,99,111,109,109,97,97,99,99,101,110, 116,10,69,78,67,79,68,73,78,71,32,51,52,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,48,10,56,56,10,56,56,10,56,56,10,70,48, 10,65,48,10,57,48,10,56,56,10,56,56,10,52,48,10, 56,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,114,99,111,109,109,97,97,99,99,101,110, 116,10,69,78,67,79,68,73,78,71,32,51,52,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,66,48,10,67,56, 10,56,48,10,56,48,10,56,48,10,56,48,10,52,48,10, 56,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,82,99,97,114,111,110,10,69,78,67,79, 68,73,78,71,32,51,52,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,57,48,10,54,48,10,48, 48,10,70,48,10,56,56,10,56,56,10,70,48,10,57,48, 10,56,56,10,56,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,114, 99,97,114,111,110,10,69,78,67,79,68,73,78,71,32,51, 52,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,57,48,10,54,48,10,48,48,10,66, 48,10,67,56,10,56,48,10,56,48,10,56,48,10,56,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,83,97,99,117,116,101,10, 69,78,67,79,68,73,78,71,32,51,52,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,48,10,55, 48,10,48,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,115,97,99,117,116,101,10,69,78,67,79,68,73, 78,71,32,51,52,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,49,48,10,50,48,10, 48,48,10,55,48,10,56,56,10,54,48,10,49,48,10,56, 56,10,55,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,83,99,105, 114,99,117,109,102,108,101,120,10,69,78,67,79,68,73,78, 71,32,51,52,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,52,56,10,48,48,10,55, 48,10,56,56,10,56,48,10,55,48,10,48,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,115,99,105,114, 99,117,109,102,108,101,120,10,69,78,67,79,68,73,78,71, 32,51,52,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,51,48,10,52,56,10,48,48, 10,55,48,10,56,56,10,54,48,10,49,48,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,83,99,101,100,105, 108,108,97,10,69,78,67,79,68,73,78,71,32,51,53,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,56,48,10,56,48,10, 55,48,10,48,56,10,48,56,10,56,56,10,55,48,10,50, 48,10,52,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,115,99,101,100,105,108,108,97,10, 69,78,67,79,68,73,78,71,32,51,53,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,54, 48,10,49,48,10,56,56,10,55,48,10,50,48,10,52,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,83,99,97,114,111,110,10,69,78,67,79,68,73, 78,71,32,51,53,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,52,56,10,51,48,10,48,48,10, 55,48,10,56,56,10,56,48,10,55,48,10,48,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,115,99,97, 114,111,110,10,69,78,67,79,68,73,78,71,32,51,53,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,57,48,10,54,48,10,48,48,10,55,48,10, 56,56,10,54,48,10,49,48,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,84,99,111,109,109,97,97,99,99, 101,110,116,10,69,78,67,79,68,73,78,71,32,51,53,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,49, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,116,99,111,109,109,97,97,99,99, 101,110,116,10,69,78,67,79,68,73,78,71,32,51,53,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,52,48,10,52,48,10,70,48,10, 52,48,10,52,48,10,52,48,10,52,56,10,51,48,10,50, 48,10,52,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,84,99,97,114,111,110,10,69,78, 67,79,68,73,78,71,32,51,53,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,56,10,51,48, 10,48,48,10,70,56,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,116,99,97,114,111,110,10,69,78,67,79,68,73,78,71, 32,51,53,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,57,48,10,54,48,10,48,48,10,52,48, 10,70,48,10,52,48,10,52,48,10,52,48,10,52,56,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,84,98,97,114,10, 69,78,67,79,68,73,78,71,32,51,53,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,56,10,50,48,10,50,48,10,55,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,116,98,97,114,10,69,78,67,79,68,73,78,71, 32,51,53,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,52,48,10,52,48, 10,70,48,10,52,48,10,69,48,10,52,48,10,52,56,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,85,116,105,108,100, 101,10,69,78,67,79,68,73,78,71,32,51,54,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,50, 56,10,53,48,10,48,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,116,105,108,100,101,10,69,78,67,79, 68,73,78,71,32,51,54,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,56,10,53, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,57,56,10,54,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,85, 109,97,99,114,111,110,10,69,78,67,79,68,73,78,71,32, 51,54,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,70,56,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,109,97,99,114,111, 110,10,69,78,67,79,68,73,78,71,32,51,54,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,70,56,10,48,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,57,56,10,54,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,85,98,114,101,118,101,10,69,78,67,79, 68,73,78,71,32,51,54,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,56,56,10,55,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 98,114,101,118,101,10,69,78,67,79,68,73,78,71,32,51, 54,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,56,56,10,55,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,57,56,10,54,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,85,114,105,110,103,10,69, 78,67,79,68,73,78,71,32,51,54,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,50, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,114,105,110,103,10,69,78,67,79,68,73,78,71, 32,51,54,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,50,48,10,53,48,10,50,48,10,48,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,57,56,10, 54,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,85,104,117,110,103, 97,114,117,109,108,97,117,116,10,69,78,67,79,68,73,78, 71,32,51,54,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,52,56,10,57,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,104,117,110, 103,97,114,117,109,108,97,117,116,10,69,78,67,79,68,73, 78,71,32,51,54,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,52,56,10,57,48,10, 48,48,10,56,56,10,56,56,10,56,56,10,56,56,10,57, 56,10,54,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,85,111,103, 111,110,101,107,10,69,78,67,79,68,73,78,71,32,51,55, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 50,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,111,103,111,110,101,107,10, 69,78,67,79,68,73,78,71,32,51,55,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,57,56,10,54,56,10,50,48,10,49,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,87,99,105,114,99,117,109,102,108,101,120,10,69, 78,67,79,68,73,78,71,32,51,55,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,51,48,10,52, 56,10,48,48,10,56,56,10,56,56,10,56,56,10,65,56, 10,65,56,10,68,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,119,99,105,114,99,117,109,102,108,101,120,10,69,78, 67,79,68,73,78,71,32,51,55,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,51,48, 10,52,56,10,48,48,10,56,56,10,56,56,10,65,56,10, 65,56,10,65,56,10,53,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,89,99,105,114,99,117,109,102,108,101,120,10,69,78,67, 79,68,73,78,71,32,51,55,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,52,56,10, 48,48,10,56,56,10,53,48,10,53,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 121,99,105,114,99,117,109,102,108,101,120,10,69,78,67,79, 68,73,78,71,32,51,55,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,51,48,10,52, 56,10,48,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,56,10,56,56,10,55,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,89, 100,105,101,114,101,115,105,115,10,69,78,67,79,68,73,78, 71,32,51,55,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,56, 56,10,53,48,10,53,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,90,97,99,117, 116,101,10,69,78,67,79,68,73,78,71,32,51,55,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,48,10,50,48,10,48,48,10,70,56,10,48,56,10,49, 48,10,50,48,10,52,48,10,56,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,122,97,99,117,116,101,10,69,78,67, 79,68,73,78,71,32,51,55,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 50,48,10,48,48,10,70,56,10,49,48,10,50,48,10,52, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 90,100,111,116,97,99,99,101,110,116,10,69,78,67,79,68, 73,78,71,32,51,55,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,50,48,10,48,48, 10,70,56,10,48,56,10,49,48,10,50,48,10,52,48,10, 56,48,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,122,100, 111,116,97,99,99,101,110,116,10,69,78,67,79,68,73,78, 71,32,51,56,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,50,48,10,48, 48,10,70,56,10,49,48,10,50,48,10,52,48,10,56,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,90,99,97,114, 111,110,10,69,78,67,79,68,73,78,71,32,51,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,56,10,51,48,10,48,48,10,70,56,10,48,56,10,49, 48,10,50,48,10,52,48,10,56,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,122,99,97,114,111,110,10,69,78,67, 79,68,73,78,71,32,51,56,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,56,10, 51,48,10,48,48,10,70,56,10,49,48,10,50,48,10,52, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 108,111,110,103,115,10,69,78,67,79,68,73,78,71,32,51, 56,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,51,48,10,52,56,10,52,48,10,52, 48,10,67,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,56,48, 10,69,78,67,79,68,73,78,71,32,51,56,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,48,10,69,48,10,52,48,10,55,48,10,52,56,10, 52,56,10,52,56,10,52,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,56,49,10,69,78,67,79, 68,73,78,71,32,51,56,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,65, 56,10,50,56,10,50,56,10,51,48,10,50,56,10,50,56, 10,50,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,49,56,50,10,69,78,67,79,68,73,78,71,32, 51,56,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,56,56,10,56,48,10, 56,48,10,70,48,10,56,56,10,56,56,10,56,56,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,56, 51,10,69,78,67,79,68,73,78,71,32,51,56,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,56,10,52,56,10,52,48,10,52,48,10,55,48, 10,52,56,10,52,56,10,52,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,56,52,10,69,78,67, 79,68,73,78,71,32,51,56,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 67,48,10,52,48,10,52,48,10,55,48,10,52,56,10,52, 56,10,52,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,56,53,10,69,78,67,79,68,73,78,71, 32,51,56,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,52,48,10,67,48,10,52,48, 10,52,48,10,54,48,10,53,48,10,53,48,10,53,48,10, 54,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 56,54,10,69,78,67,79,68,73,78,71,32,51,57,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,56,55,10,69,78, 67,79,68,73,78,71,32,51,57,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,52,10,55,56, 10,56,56,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,56,56,10,69,78,67,79,68,73,78, 71,32,51,57,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 52,10,55,56,10,56,56,10,56,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,56,57,10,69,78,67,79,68,73,78,71,32,51,57,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,48,10,52,56,10,52,56,10,52,56,10, 69,56,10,52,56,10,52,56,10,52,56,10,70,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,56,65,10,69, 78,67,79,68,73,78,71,32,51,57,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,65,56,10,50,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,50,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,56,66,10,69,78,67,79,68,73, 78,71,32,51,57,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,56,56,10, 48,56,10,48,56,10,55,56,10,56,56,10,56,56,10,56, 56,10,55,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,56,67,10,69,78,67,79,68,73,78,71,32,51,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,56,10,52,56,10,48,56,10,48,56, 10,51,56,10,52,56,10,52,56,10,52,56,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,49,56,68,10, 69,78,67,79,68,73,78,71,32,51,57,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,56,10,56,56,10,55,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,49,56,69,10,69,78,67,79,68, 73,78,71,32,51,57,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,56,10,48,56, 10,48,56,10,48,56,10,55,56,10,48,56,10,48,56,10, 48,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,49,56,70,10,69,78,67,79,68,73,78,71,32,51, 57,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,48,10,56,56,10,48,56,10,48, 56,10,70,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,57,48, 10,69,78,67,79,68,73,78,71,32,52,48,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,48,10,56,48,10,54,48,10, 56,48,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,57,49,10,69,78,67,79, 68,73,78,71,32,52,48,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,51,56,10,50, 48,10,50,48,10,50,48,10,51,56,10,50,48,10,50,48, 10,50,48,10,50,48,10,65,48,10,52,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,102, 108,111,114,105,110,10,69,78,67,79,68,73,78,71,32,52, 48,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,49,48,10,50,56,10,50,48,10,50, 48,10,55,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,65,48,10,52,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,57,51, 10,69,78,67,79,68,73,78,71,32,52,48,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,52, 10,55,56,10,56,56,10,56,48,10,56,48,10,56,48,10, 57,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,57,52,10,69,78,67,79, 68,73,78,71,32,52,48,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,56,56,10,56,56,10,53,48,10,50,48, 10,50,48,10,53,48,10,53,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,49,57,53,10,69,78,67,79,68,73,78,71,32, 52,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 67,56,10,65,56,10,65,56,10,65,56,10,65,56,10,57, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,57, 54,10,69,78,67,79,68,73,78,71,32,52,48,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,54,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,56,10,49,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,57,55,10,69,78,67, 79,68,73,78,71,32,52,48,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,57,56,10,69,78,67,79,68,73,78,71, 32,52,48,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,56,56,10,57,52,10,57,48, 10,65,48,10,67,48,10,65,48,10,57,48,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 57,57,10,69,78,67,79,68,73,78,71,32,52,48,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,65,48,10,56,48,10,57,48,10,65, 48,10,67,48,10,65,48,10,57,48,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,57,65,10,69,78, 67,79,68,73,78,71,32,52,49,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,54,48, 10,50,48,10,50,48,10,50,48,10,55,48,10,50,48,10, 50,48,10,50,48,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,57,66,10,69,78,67,79,68,73,78, 71,32,52,49,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,57,48,10,54,48,10,52, 48,10,65,48,10,50,48,10,53,48,10,53,48,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,57,67,10,69,78,67,79,68,73,78,71,32,52,49,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,65,56,10,65,56,10,65,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,65,56,10,53,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,57,68,10,69, 78,67,79,68,73,78,71,32,52,49,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,52, 56,10,52,56,10,54,56,10,54,56,10,55,56,10,53,56, 10,53,56,10,52,56,10,52,56,10,67,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,57,69,10,69,78,67,79,68,73, 78,71,32,52,49,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,66,48,10,67,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,48,56,10,48,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,57,70,10,69,78,67,79,68,73,78,71,32,52,49, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,79,104,111,114,110,10,69,78, 67,79,68,73,78,71,32,52,49,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,54,52, 10,57,52,10,57,56,10,57,48,10,57,48,10,57,48,10, 57,48,10,57,48,10,54,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,111,104,111,114,110,10,69,78,67,79,68,73,78,71,32, 52,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 54,52,10,57,52,10,57,56,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,65, 50,10,69,78,67,79,68,73,78,71,32,52,49,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,53,48,10,65,56,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,52,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,65,51,10,69,78,67, 79,68,73,78,71,32,52,49,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,48,10,65,56,10,65,56,10,65, 56,10,65,56,10,52,56,10,48,56,10,48,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,65,52,10,69,78,67,79,68,73,78,71, 32,52,50,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,65,56,10,65,56, 10,50,56,10,51,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 65,53,10,69,78,67,79,68,73,78,71,32,52,50,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,65,48,10,56,48,10,70,48,10,56, 56,10,56,56,10,56,56,10,70,48,10,56,48,10,56,48, 10,56,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,65,54,10,69,78, 67,79,68,73,78,71,32,52,50,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,56,48, 10,56,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 70,48,10,65,48,10,57,48,10,48,56,10,48,56,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,65,55,10,69,78,67,79,68,73,78, 71,32,52,50,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,48, 56,10,48,56,10,55,48,10,56,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,65,56,10,69,78,67,79,68,73,78,71,32,52,50,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 56,56,10,51,48,10,52,48,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,65,57,10,69, 78,67,79,68,73,78,71,32,52,50,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,56,48,10,52,48,10,50,48,10,49,48,10,50,48, 10,52,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,65,65,10,69,78,67,79,68,73, 78,71,32,52,50,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,52,48,10,65,48,10, 54,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,56,10,49,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,65,66,10,69,78,67,79,68,73,78,71,32,52,50, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,52,48,10,52,48,10,70,48, 10,52,48,10,52,48,10,52,48,10,52,56,10,51,48,10, 49,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,49,65,67,10, 69,78,67,79,68,73,78,71,32,52,50,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,56,10,65,48,10,65,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,49,65,68,10,69,78,67,79,68, 73,78,71,32,52,50,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,53,48, 10,52,48,10,70,48,10,52,48,10,52,48,10,52,48,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,49,65,69,10,69,78,67,79,68,73,78,71,32,52, 51,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,56,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,56,10,49,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,85,104,111,114,110,10,69, 78,67,79,68,73,78,71,32,52,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,57, 52,10,57,52,10,57,56,10,57,48,10,57,48,10,57,48, 10,57,48,10,57,48,10,54,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,104,111,114,110,10,69,78,67,79,68,73,78,71, 32,52,51,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,57,52,10,57,52,10,57,56,10,57,48,10,66,48,10, 53,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 66,49,10,69,78,67,79,68,73,78,71,32,52,51,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,68,56,10,53,48,10,53,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,66,50,10,69,78, 67,79,68,73,78,71,32,52,51,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,57,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,66,51,10,69,78,67,79,68,73,78, 71,32,52,51,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,54,56,10,65,56,10,65, 56,10,50,56,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,66,52,10,69,78,67,79,68,73,78,71,32,52,51,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,56,10,57,52,10, 57,48,10,57,48,10,57,48,10,55,48,10,49,48,10,57, 48,10,54,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,66,53,10,69, 78,67,79,68,73,78,71,32,52,51,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,48,56,10,49,48,10,49,48,10,70,56,10,52,48, 10,52,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,66,54,10,69,78,67,79,68,73, 78,71,32,52,51,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,49,48,10,70,56,10,52,48,10,56, 48,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,66,55,10,69,78,67,79,68,73,78,71,32,52,51, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,48,56,10,49,48,10,50,48, 10,55,48,10,48,56,10,48,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,49,66,56,10, 69,78,67,79,68,73,78,71,32,52,52,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,56,10,56,48,10,52,48,10,50,48,10,55,48,10,56, 48,10,56,48,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,49,66,57,10,69,78,67,79,68, 73,78,71,32,52,52,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,52,48,10,50,48,10,55,48,10, 56,48,10,56,48,10,56,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,49,66,65,10,69,78,67,79,68,73,78,71,32,52, 52,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,49,48,10,50,48,10,55,48,10,49,48,10,54,48, 10,56,56,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,66,66, 10,69,78,67,79,68,73,78,71,32,52,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,56,10,48,56,10,49,48,10, 70,56,10,52,48,10,56,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,66,67,10,69,78,67,79, 68,73,78,71,32,52,52,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,56, 56,10,56,48,10,66,48,10,67,56,10,48,56,10,48,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,49,66,68,10,69,78,67,79,68,73,78,71,32, 52,52,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,56,10,52,56,10,52,48,10, 53,48,10,54,56,10,48,56,10,48,56,10,52,56,10,51, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,66, 69,10,69,78,67,79,68,73,78,71,32,52,52,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,55,48, 10,50,48,10,49,48,10,53,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,66,70,10,69,78,67, 79,68,73,78,71,32,52,52,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,48,10,54,56,10,52,56,10,52, 56,10,53,48,10,54,48,10,52,48,10,67,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,67,48,10,69,78,67,79,68,73,78,71, 32,52,52,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 67,49,10,69,78,67,79,68,73,78,71,32,52,52,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,67,50,10,69,78, 67,79,68,73,78,71,32,52,53,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,70,56,10,50,48,10, 70,56,10,50,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,67,51,10,69,78,67,79,68,73,78, 71,32,52,53,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,67,52,10,69,78,67,79,68,73,78,71,32,52,53,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,50,56,10,49,48,10,48,48,10,68,56,10,65,56,10, 65,56,10,66,48,10,66,48,10,66,48,10,68,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,67,53,10,69, 78,67,79,68,73,78,71,32,52,53,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 56,10,49,48,10,67,48,10,65,48,10,66,56,10,65,56, 10,65,56,10,66,48,10,68,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,67,54,10,69,78,67,79,68,73, 78,71,32,52,53,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,50,56,10,49,48,10,48,48,10, 50,48,10,50,48,10,55,56,10,65,56,10,65,56,10,66, 48,10,55,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,67,55,10,69,78,67,79,68,73,78,71,32,52,53, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,65,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,49,67,56,10, 69,78,67,79,68,73,78,71,32,52,53,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,48,10,56,56,10,56,48,10,57,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,70,56,10,50,56,10,49,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,49,67,57,10,69,78,67,79,68, 73,78,71,32,52,53,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,67,48,10,52,56, 10,52,48,10,53,56,10,52,56,10,52,56,10,52,56,10, 52,56,10,69,56,10,50,56,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,49,67,65,10,69,78,67,79,68,73,78,71,32,52, 53,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,66,56,10,65,56,10,69,56,10,69, 56,10,69,56,10,69,56,10,69,56,10,66,56,10,66,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,67,66, 10,69,78,67,79,68,73,78,71,32,52,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,65,48,10,65,56,10,69,48,10,70,56,10,69,56,10, 69,56,10,69,56,10,65,56,10,65,56,10,50,56,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,67,67,10,69,78,67,79, 68,73,78,71,32,52,54,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 56,10,48,48,10,67,56,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,50,56,10,49,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,49,67,68,10,69,78,67,79,68,73,78,71,32, 52,54,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,56,10,51,48,10,48,48,10,50,48,10, 53,48,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,67, 69,10,69,78,67,79,68,73,78,71,32,52,54,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,56,10,51,48,10,48,48,10,55,48,10,48,56, 10,55,56,10,56,56,10,57,56,10,54,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,67,70,10,69,78,67, 79,68,73,78,71,32,52,54,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,52,56,10,51,48,10, 48,48,10,55,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,68,48,10,69,78,67,79,68,73,78,71, 32,52,54,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,57,48,10,54,48,10,48,48, 10,54,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 68,49,10,69,78,67,79,68,73,78,71,32,52,54,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,56,10,51,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,68,50,10,69,78, 67,79,68,73,78,71,32,52,54,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,52,56, 10,51,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,68,51,10,69,78,67,79,68,73,78, 71,32,52,54,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,52,56,10,51,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,68,52,10,69,78,67,79,68,73,78,71,32,52,54,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,52,56,10,51,48,10,48,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,57,56,10,54,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,68,53,10,69, 78,67,79,68,73,78,71,32,52,54,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,70,56,10,48, 48,10,53,48,10,48,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,68,54,10,69,78,67,79,68,73, 78,71,32,52,55,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,70,56,10,48,48,10,53,48,10, 53,48,10,48,48,10,56,56,10,56,56,10,56,56,10,57, 56,10,54,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,68,55,10,69,78,67,79,68,73,78,71,32,52,55, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,49, 48,10,50,48,10,48,48,10,53,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,49,68,56,10, 69,78,67,79,68,73,78,71,32,52,55,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,49,48,10,50,48,10, 48,48,10,53,48,10,53,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,57,56,10,54,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,49,68,57,10,69,78,67,79,68, 73,78,71,32,52,55,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,52,56,10,51,48,10,48,48,10,53,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,49,68,65,10,69,78,67,79,68,73,78,71,32,52, 55,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 52,56,10,51,48,10,48,48,10,53,48,10,53,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,57,56,10,54,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,68,66, 10,69,78,67,79,68,73,78,71,32,52,55,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,52,48,10,50,48, 10,48,48,10,53,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,68,67,10,69,78,67,79, 68,73,78,71,32,52,55,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,52,48,10,50,48,10,48,48,10,53, 48,10,53,48,10,48,48,10,56,56,10,56,56,10,56,56, 10,57,56,10,54,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,49,68,68,10,69,78,67,79,68,73,78,71,32, 52,55,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,48,56,10,70,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,68, 69,10,69,78,67,79,68,73,78,71,32,52,55,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,70,56,10,48, 48,10,53,48,10,48,48,10,50,48,10,53,48,10,56,56, 10,56,56,10,70,56,10,56,56,10,56,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,68,70,10,69,78,67, 79,68,73,78,71,32,52,55,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,70,56,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,48,56,10,55,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,69,48,10,69,78,67,79,68,73,78,71, 32,52,56,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,70,56,10,48,48,10,50,48,10,48,48,10,50,48, 10,53,48,10,56,56,10,56,56,10,70,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 69,49,10,69,78,67,79,68,73,78,71,32,52,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,70,56,10, 48,48,10,50,48,10,50,48,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,69,50,10,69,78, 67,79,68,73,78,71,32,52,56,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,56, 10,48,48,10,53,56,10,65,48,10,65,48,10,70,48,10, 65,48,10,65,48,10,66,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,69,51,10,69,78,67,79,68,73,78, 71,32,52,56,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,56,10,48, 48,10,55,48,10,50,56,10,55,48,10,65,48,10,65,56, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,69,52,10,69,78,67,79,68,73,78,71,32,52,56,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,54,48,10,57,48,10,56,48,10,56,48,10, 56,48,10,66,48,10,66,56,10,57,48,10,54,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,69,53,10,69, 78,67,79,68,73,78,71,32,52,56,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,54,48,10,57,48,10,57,48, 10,57,48,10,55,48,10,49,48,10,70,56,10,54,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,71,99,97,114,111,110,10,69,78,67,79,68,73,78, 71,32,52,56,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,52,56,10,51,48,10,48,48,10,55, 48,10,56,56,10,56,48,10,57,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,103,99,97,114, 111,110,10,69,78,67,79,68,73,78,71,32,52,56,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,56,10,51,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,55,56,10,48,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,69,56,10,69,78, 67,79,68,73,78,71,32,52,56,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,56,10,51,48, 10,48,48,10,56,56,10,57,48,10,65,48,10,67,48,10, 65,48,10,57,48,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,69,57,10,69,78,67,79,68,73,78, 71,32,52,56,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,52,56,10,51,48,10,48,48,10,56, 48,10,56,48,10,57,48,10,65,48,10,67,48,10,65,48, 10,57,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 49,69,65,10,69,78,67,79,68,73,78,71,32,52,57,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,55,48,10,50, 48,10,49,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,49,69,66,10,69, 78,67,79,68,73,78,71,32,52,57,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,50,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,49,69,67,10,69,78,67,79,68,73, 78,71,32,52,57,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,48,48,10, 55,48,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,55,48,10,50,48,10,49,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,49,69,68,10,69,78,67,79,68,73,78,71,32,52,57, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 50,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,49,69,69,10, 69,78,67,79,68,73,78,71,32,52,57,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,56,10, 51,48,10,48,48,10,70,56,10,49,48,10,50,48,10,55, 48,10,48,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,49,69,70,10,69,78,67,79,68, 73,78,71,32,52,57,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,56,10,51,48, 10,48,48,10,70,56,10,49,48,10,50,48,10,55,48,10, 48,56,10,48,56,10,56,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,49,70,48,10,69,78,67,79,68,73,78,71,32,52, 57,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,52,56,10,51,48,10,48,48,10,51, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,57,48, 10,57,48,10,54,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,49,70,49, 10,69,78,67,79,68,73,78,71,32,52,57,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 66,48,10,66,48,10,66,48,10,68,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,49,70,50,10,69,78,67,79, 68,73,78,71,32,52,57,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,67,48,10,65, 48,10,65,48,10,66,56,10,65,56,10,65,56,10,66,48, 10,66,48,10,68,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,49,70,51,10,69,78,67,79,68,73,78,71,32, 52,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 55,56,10,65,56,10,65,56,10,66,48,10,66,48,10,55, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,49,70, 52,10,69,78,67,79,68,73,78,71,32,53,48,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,49, 48,10,50,48,10,48,48,10,55,48,10,56,56,10,56,48, 10,57,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,49,70,53,10,69,78,67, 79,68,73,78,71,32,53,48,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,55,56,10,48,56,10,56,56,10,55,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,49,70,54,10,69,78,67,79,68,73,78,71, 32,53,48,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,65,48,10,65,48,10,65,48, 10,65,56,10,69,56,10,65,56,10,65,56,10,65,56,10, 57,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,49, 70,55,10,69,78,67,79,68,73,78,71,32,53,48,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,66,48,10,67,56,10,56,56,10,56,56,10,57, 48,10,65,48,10,67,48,10,56,48,10,56,48,10,56,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,49,70,56,10,69,78, 67,79,68,73,78,71,32,53,48,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,48,10,50,48, 10,48,48,10,56,56,10,67,56,10,67,56,10,65,56,10, 57,56,10,57,56,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,49,70,57,10,69,78,67,79,68,73,78, 71,32,53,48,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,50,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,65,114,105,110, 103,97,99,117,116,101,10,69,78,67,79,68,73,78,71,32, 53,48,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,49,48,10,50,48,10,48,48,10,50,48,10,53,48,10, 50,48,10,50,48,10,53,48,10,56,56,10,70,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,114,105,110,103,97, 99,117,116,101,10,69,78,67,79,68,73,78,71,32,53,48, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,49, 48,10,50,48,10,51,48,10,52,56,10,51,48,10,55,48, 10,48,56,10,55,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,65,69,97,99,117,116,101,10, 69,78,67,79,68,73,78,71,32,53,48,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,49,48,10, 50,48,10,48,48,10,53,56,10,65,48,10,65,48,10,70, 48,10,65,48,10,65,48,10,66,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,97,101,97,99,117,116,101,10,69,78,67,79,68, 73,78,71,32,53,48,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,50,48, 10,48,48,10,55,48,10,50,56,10,55,48,10,65,48,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,79,115, 108,97,115,104,97,99,117,116,101,10,69,78,67,79,68,73, 78,71,32,53,49,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,48,10,50,48,10,48,56,10, 55,48,10,57,56,10,57,56,10,65,56,10,67,56,10,67, 56,10,55,48,10,56,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,111,115,108, 97,115,104,97,99,117,116,101,10,69,78,67,79,68,73,78, 71,32,53,49,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 56,10,55,48,10,57,56,10,65,56,10,65,56,10,67,56, 10,55,48,10,56,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,48,48,10,69,78,67,79,68,73,78,71,32,53,49,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,57,48,10,52,56,10,48,48,10,50,48,10,53,48,10, 56,56,10,56,56,10,70,56,10,56,56,10,56,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,48,49,10,69, 78,67,79,68,73,78,71,32,53,49,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,57, 48,10,52,56,10,48,48,10,55,48,10,48,56,10,55,56, 10,56,56,10,57,56,10,54,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,48,50,10,69,78,67,79,68,73, 78,71,32,53,49,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,48,10,56,56,10,48,48,10, 50,48,10,53,48,10,56,56,10,56,56,10,70,56,10,56, 56,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,48,51,10,69,78,67,79,68,73,78,71,32,53,49, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,48,48,10,55,48, 10,48,56,10,55,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,48,52,10, 69,78,67,79,68,73,78,71,32,53,49,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,57,48,10, 52,56,10,48,48,10,70,56,10,56,48,10,56,48,10,70, 48,10,56,48,10,56,48,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,48,53,10,69,78,67,79,68, 73,78,71,32,53,49,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,57,48,10,52,56, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,48,54,10,69,78,67,79,68,73,78,71,32,53, 49,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,55,48,10,56,56,10,48,48,10,70,56,10,56, 48,10,56,48,10,70,48,10,56,48,10,56,48,10,70,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,48,55, 10,69,78,67,79,68,73,78,71,32,53,49,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,48,48,10,55,48,10,56,56,10, 70,56,10,56,48,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,48,56,10,69,78,67,79, 68,73,78,71,32,53,50,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,57,48,10,52,56,10,48, 48,10,55,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,48,57,10,69,78,67,79,68,73,78,71,32, 53,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,57,48,10,52,56,10,48,48,10, 54,48,10,50,48,10,50,48,10,50,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,48, 65,10,69,78,67,79,68,73,78,71,32,53,50,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,55, 48,10,56,56,10,48,48,10,55,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,48,66,10,69,78,67, 79,68,73,78,71,32,53,50,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,48,48,10,54,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,48,67,10,69,78,67,79,68,73,78,71, 32,53,50,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,57,48,10,52,56,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 48,68,10,69,78,67,79,68,73,78,71,32,53,50,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,57,48,10,52,56,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,48,69,10,69,78, 67,79,68,73,78,71,32,53,50,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,55,48,10,56,56, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,48,70,10,69,78,67,79,68,73,78, 71,32,53,50,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,49,48,10,69,78,67,79,68,73,78,71,32,53,50,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,57,48,10,52,56,10,48,48,10,70,48,10,56,56,10, 56,56,10,70,48,10,57,48,10,56,56,10,56,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,49,49,10,69, 78,67,79,68,73,78,71,32,53,50,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,57, 48,10,52,56,10,48,48,10,66,48,10,67,56,10,56,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,49,50,10,69,78,67,79,68,73, 78,71,32,53,51,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,48,10,56,56,10,48,48,10, 70,48,10,56,56,10,56,56,10,70,48,10,57,48,10,56, 56,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,49,51,10,69,78,67,79,68,73,78,71,32,53,51, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,48,48,10,66,48, 10,67,56,10,56,48,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,49,52,10, 69,78,67,79,68,73,78,71,32,53,51,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,57,48,10, 52,56,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,49,53,10,69,78,67,79,68, 73,78,71,32,53,51,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,57,48,10,52,56, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,49,54,10,69,78,67,79,68,73,78,71,32,53, 51,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,55,48,10,56,56,10,48,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,49,55, 10,69,78,67,79,68,73,78,71,32,53,51,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,83,99,111,109,109,97,97,99,99,101,110,116, 10,69,78,67,79,68,73,78,71,32,53,51,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,48,10,56,48,10,55,48,10, 48,56,10,48,56,10,56,56,10,55,48,10,50,48,10,52, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,115,99,111,109,109,97,97,99,99,101,110,116, 10,69,78,67,79,68,73,78,71,32,53,51,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,48,10,56,56,10, 54,48,10,49,48,10,56,56,10,55,48,10,50,48,10,52, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,84,99,111,109,109,97,97,99,99,101,110,116, 10,69,78,67,79,68,73,78,71,32,53,51,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,49,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,116,99,111,109,109,97,97,99,99,101,110,116, 10,69,78,67,79,68,73,78,71,32,53,51,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,52,48,10,52,48,10,70,48,10,52,48,10, 52,48,10,52,48,10,52,56,10,51,48,10,49,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,49,67,10,69,78,67,79, 68,73,78,71,32,53,52,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,48,10,56, 56,10,48,56,10,49,48,10,51,48,10,52,56,10,48,56, 10,49,48,10,69,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,49,68,10,69,78,67,79,68,73,78,71,32, 53,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,48,10,56,56,10,49,48,10,51,48,10,52,56,10,48, 56,10,49,48,10,69,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,49, 69,10,69,78,67,79,68,73,78,71,32,53,52,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,52, 56,10,51,48,10,48,48,10,56,56,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,56,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,49,70,10,69,78,67, 79,68,73,78,71,32,53,52,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,52,56,10,51,48,10, 48,48,10,56,48,10,56,48,10,66,48,10,67,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,50,48,10,69,78,67,79,68,73,78,71, 32,53,52,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,66,48,10,67,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,48,56,10,48,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 50,50,10,69,78,67,79,68,73,78,71,32,53,52,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,52,56,10,56,56,10,56,56,10,55, 48,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,50,51,10,69,78, 67,79,68,73,78,71,32,53,52,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,53,48,10,56,56,10,56,56,10,55,48,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,50,52,10,69,78,67,79,68,73,78, 71,32,53,52,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,48,56,10,49, 48,10,49,48,10,50,48,10,52,48,10,52,48,10,56,48, 10,70,56,10,48,56,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,50,53,10,69,78,67,79,68,73,78,71,32,53,52,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 49,48,10,50,48,10,52,48,10,56,48,10,70,56,10,48, 56,10,49,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,50,54,10,69, 78,67,79,68,73,78,71,32,53,53,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,50,55,10,69,78,67,79,68,73, 78,71,32,53,53,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,50,48,10, 48,48,10,55,48,10,48,56,10,55,56,10,56,56,10,57, 56,10,54,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,50,56,10,69,78,67,79,68,73,78,71,32,53,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,56,48,10,56,48,10,56,48, 10,70,48,10,56,48,10,56,48,10,56,48,10,70,56,10, 49,48,10,54,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,50,57,10, 69,78,67,79,68,73,78,71,32,53,53,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,70, 56,10,56,48,10,56,56,10,55,48,10,49,48,10,54,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,50,65,10,69,78,67,79,68, 73,78,71,32,53,53,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,55,48,10,48,48,10,53,48,10,48,48, 10,55,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,50,66,10,69,78,67,79,68,73,78,71,32,53, 53,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,55,48,10,48,48,10,53,48,10,48,48,10,55, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,50,67, 10,69,78,67,79,68,73,78,71,32,53,53,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,55,56,10,48,48, 10,50,56,10,53,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,50,68,10,69,78,67,79, 68,73,78,71,32,53,53,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,55,56,10,48,48,10,50,56,10,53, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,50,69,10,69,78,67,79,68,73,78,71,32, 53,53,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,50, 70,10,69,78,67,79,68,73,78,71,32,53,53,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,50,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,51,48,10,69,78,67, 79,68,73,78,71,32,53,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,55,48,10,48,48,10,50,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,51,49,10,69,78,67,79,68,73,78,71, 32,53,54,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,55,48,10,48,48,10,50,48,10,48,48, 10,55,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 51,50,10,69,78,67,79,68,73,78,71,32,53,54,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 55,48,10,48,48,10,56,56,10,56,56,10,53,48,10,53, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,51,51,10,69,78, 67,79,68,73,78,71,32,53,54,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,55,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,56,10,56,56,10,55,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,53,48,10,69,78,67,79,68,73,78, 71,32,53,57,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,70,48,10,56,48, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,53,49,10,69,78,67,79,68,73,78,71,32,53,57,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,54,56,10, 57,56,10,56,56,10,56,56,10,57,56,10,54,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,53,50,10,69, 78,67,79,68,73,78,71,32,53,57,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,66,48,10,67,56,10,56,56, 10,56,56,10,67,56,10,66,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,53,51,10,69,78,67,79,68,73, 78,71,32,53,57,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,54,48,10,57,48,10, 56,48,10,70,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,70,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,53,52,10,69,78,67,79,68,73,78,71,32,53,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,48,56,10,48,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,53,53,10, 69,78,67,79,68,73,78,71,32,53,57,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 48,10,66,48,10,67,56,10,55,48,10,56,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,53,54,10,69,78,67,79,68, 73,78,71,32,53,57,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,49,48, 10,49,48,10,55,48,10,57,48,10,57,48,10,57,48,10, 57,48,10,55,48,10,49,52,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,53,55,10,69,78,67,79,68,73,78,71,32,53, 57,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,56,10,49,52,10,49,48,10,49,48,10,55, 48,10,57,48,10,57,48,10,57,48,10,57,48,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,53,56, 10,69,78,67,79,68,73,78,71,32,54,48,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,48,10,56,56,10, 70,56,10,48,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,53,57,10,69,78,67,79, 68,73,78,71,32,54,48,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,56,56,10,48,56,10,70,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,53,65,10,69,78,67,79,68,73,78,71,32, 54,48,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 54,48,10,57,56,10,51,52,10,53,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,53, 66,10,69,78,67,79,68,73,78,71,32,54,48,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,54,48,10,56,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,53,67,10,69,78,67, 79,68,73,78,71,32,54,48,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,51,48,10,48, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,53,68,10,69,78,67,79,68,73,78,71, 32,54,48,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,54,48,10,57,56,10,50,52,10,49,48,10,57,48,10, 54,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 53,69,10,69,78,67,79,68,73,78,71,32,54,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,66,48,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,53,70,10,69,78, 67,79,68,73,78,71,32,54,48,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 55,56,10,49,48,10,49,48,10,57,48,10,54,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,54,48,10,69,78,67,79,68,73,78, 71,32,54,48,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,56,10,49,52,10,49, 48,10,55,48,10,57,48,10,57,48,10,57,48,10,55,48, 10,49,48,10,57,48,10,54,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,54,49,10,69,78,67,79,68,73,78,71,32,54,48,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,56,10, 56,56,10,56,56,10,56,56,10,55,56,10,48,56,10,56, 56,10,55,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,54,50,10,69, 78,67,79,68,73,78,71,32,54,49,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,56,48, 10,57,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,54,51,10,69,78,67,79,68,73, 78,71,32,54,49,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,56,56,10,56,56,10,53,48,10,53,48,10,50, 48,10,50,48,10,53,48,10,50,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,54,52,10,69,78,67,79,68,73,78,71,32,54,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,53,48, 10,65,56,10,50,48,10,53,48,10,53,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,54,53,10, 69,78,67,79,68,73,78,71,32,54,49,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,57,56,10,54,56,10,48,56,10,48,56, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,54,54,10,69,78,67,79,68, 73,78,71,32,54,49,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,54,48,10,57,48, 10,56,48,10,66,48,10,67,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,54,55,10,69,78,67,79,68,73,78,71,32,54, 49,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,54,48,10,57,48,10,56,48,10,66, 48,10,67,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,50,56,10,49,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,54,56, 10,69,78,67,79,68,73,78,71,32,54,49,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,48,48,10,54,48,10,50,48,10, 55,48,10,50,48,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,54,57,10,69,78,67,79, 68,73,78,71,32,54,49,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,54,48,10,50,48,10,50,48,10,50,48, 10,50,56,10,49,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,54,65,10,69,78,67,79,68,73,78,71,32, 54,49,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,50,48,10,50,48,10,50,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,54, 66,10,69,78,67,79,68,73,78,71,32,54,49,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,54,48,10,50,48,10,50,48,10,54,56,10,66,48, 10,50,48,10,50,48,10,50,48,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,54,67,10,69,78,67, 79,68,73,78,71,32,54,50,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,48,10, 50,48,10,50,48,10,54,48,10,65,48,10,55,56,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,54,68,10,69,78,67,79,68,73,78,71, 32,54,50,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,54,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,56,10,49,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 54,69,10,69,78,67,79,68,73,78,71,32,54,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,67,48,10,52,48,10,52,48,10,55,56,10,52, 56,10,53,48,10,55,48,10,52,56,10,69,56,10,48,56, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,54,70,10,69,78, 67,79,68,73,78,71,32,54,50,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,56,10,65,56,10,65,56,10, 65,56,10,65,56,10,53,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,55,48,10,69,78,67,79,68,73,78, 71,32,54,50,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,55,49,10,69,78,67,79,68,73,78,71,32,54,50,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,68,48,10, 65,56,10,65,56,10,65,56,10,65,56,10,56,56,10,50, 56,10,49,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,55,50,10,69, 78,67,79,68,73,78,71,32,54,50,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,53,48,10,54,56,10,52,56, 10,52,56,10,52,56,10,52,56,10,52,48,10,56,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,55,51,10,69,78,67,79,68,73, 78,71,32,54,50,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,65,48,10,68,48,10,57,48,10,57,48,10,57, 48,10,57,48,10,49,52,10,48,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,55,52,10,69,78,67,79,68,73,78,71,32,54,50, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,67,56,10,65,56,10,65,56,10,57,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,55,53,10, 69,78,67,79,68,73,78,71,32,54,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,70, 56,10,56,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,55,54,10,69,78,67,79,68, 73,78,71,32,54,51,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,65,48,10,66,48,10,65,48,10, 65,48,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,55,55,10,69,78,67,79,68,73,78,71,32,54, 51,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,53,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,55,56, 10,69,78,67,79,68,73,78,71,32,54,51,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,55,48,10,65,56,10, 65,56,10,65,56,10,65,56,10,55,48,10,50,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,55,57,10,69,78,67,79, 68,73,78,71,32,54,51,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,48,56,10,48,56,10,48,56, 10,57,56,10,54,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,55,65,10,69,78,67,79,68,73,78,71,32, 54,51,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,56,10,48,56,10,48,56,10,57,56,10,54, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,55, 66,10,69,78,67,79,68,73,78,71,32,54,51,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,66,48,10,53,48,10,49,52,10, 48,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,55,67,10,69,78,67, 79,68,73,78,71,32,54,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,66,48,10,67,56,10,56,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,55,68,10,69,78,67,79,68,73,78,71, 32,54,51,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,66,48,10,67,56,10,56,48,10,56,48,10,56,48,10, 56,48,10,65,48,10,52,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 55,69,10,69,78,67,79,68,73,78,71,32,54,51,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,48,10,52, 56,10,56,48,10,56,48,10,56,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,55,70,10,69,78, 67,79,68,73,78,71,32,54,51,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,54,48,10,57,48,10,48,56,10, 48,56,10,48,56,10,48,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,56,48,10,69,78,67,79,68,73,78, 71,32,54,52,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,48,10,56,56,10,70,48,10,65,48,10,57,48, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,56,49,10,69,78,67,79,68,73,78,71,32,54,52,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,56,10, 57,48,10,65,48,10,70,48,10,56,56,10,70,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,56,50,10,69, 78,67,79,68,73,78,71,32,54,52,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,56,10,56,48,10,55,48, 10,48,56,10,48,56,10,70,48,10,56,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,56,51,10,69,78,67,79,68,73, 78,71,32,54,52,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,49,48,10,50,56,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,65,48,10,52,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,56,52,10,69,78,67,79,68,73,78,71,32,54,52, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,50,56,10,50,48,10,50,48, 10,50,48,10,50,48,10,55,48,10,50,48,10,50,48,10, 65,48,10,52,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,56,53,10, 69,78,67,79,68,73,78,71,32,54,52,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,65,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,56,10,49,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,56,54,10,69,78,67,79,68, 73,78,71,32,54,52,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,50,56, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 54,48,10,66,48,10,65,56,10,52,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,56,55,10,69,78,67,79,68,73,78,71,32,54, 52,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,54, 48,10,57,48,10,49,48,10,49,48,10,49,48,10,55,56, 10,49,48,10,49,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,56,56, 10,69,78,67,79,68,73,78,71,32,54,52,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,52,48,10,52,48,10,70,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,52,56,10,51, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,56,57,10,69,78,67,79, 68,73,78,71,32,54,52,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,56,10,52,56,10,70,67,10,52,56, 10,53,56,10,50,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,56,65,10,69,78,67,79,68,73,78,71,32, 54,53,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,56,10,53,48,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,56, 66,10,69,78,67,79,68,73,78,71,32,54,53,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,57,48,10,56,56, 10,56,56,10,56,56,10,57,48,10,54,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,56,67,10,69,78,67, 79,68,73,78,71,32,54,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,53,48,10,53,48,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,56,68,10,69,78,67,79,68,73,78,71, 32,54,53,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,53,48,10,65,56,10,65,56,10,65,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 56,69,10,69,78,67,79,68,73,78,71,32,54,53,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,49,48,10,49,48,10,50,48,10,50, 48,10,53,48,10,53,48,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,56,70,10,69,78, 67,79,68,73,78,71,32,54,53,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,56,10,53,48,10,53,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,57,48,10,69,78,67,79,68,73,78, 71,32,54,53,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,49,48,10,50,48,10,52,48,10,56,48, 10,70,56,10,49,48,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,57,49,10,69,78,67,79,68,73,78,71,32,54,53,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 49,48,10,50,48,10,53,48,10,65,56,10,70,48,10,52, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,57,50,10,69, 78,67,79,68,73,78,71,32,54,53,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,49,48,10,50,48, 10,55,48,10,48,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,57,51,10,69,78,67,79,68,73, 78,71,32,54,53,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,49,48,10,50,48,10,55,48,10,48, 56,10,54,56,10,57,56,10,55,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,57,52,10,69,78,67,79,68,73,78,71,32,54,54, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,51,48,10,52,56,10,48,56,10,48,56, 10,51,48,10,50,48,10,50,48,10,50,48,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,57,53,10, 69,78,67,79,68,73,78,71,32,54,54,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 51,48,10,52,56,10,52,48,10,52,48,10,51,48,10,49, 48,10,49,48,10,49,48,10,51,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,57,54,10,69,78,67,79,68, 73,78,71,32,54,54,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,50,48, 10,50,48,10,50,48,10,51,48,10,48,56,10,48,56,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,57,55,10,69,78,67,79,68,73,78,71,32,54, 54,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,56,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,57,56, 10,69,78,67,79,68,73,78,71,32,54,54,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 56,56,10,65,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,57,57,10,69,78,67,79, 68,73,78,71,32,54,54,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,48,10,56,56,10,70,48,10,56,56, 10,56,56,10,70,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,57,65,10,69,78,67,79,68,73,78,71,32, 54,54,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,54,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,57, 66,10,69,78,67,79,68,73,78,71,32,54,54,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,52,10,55,56,10,56,56, 10,56,48,10,57,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,57,67,10,69,78,67, 79,68,73,78,71,32,54,54,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,56,10,56,56,10,70,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,57,68,10,69,78,67,79,68,73,78,71, 32,54,54,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,49,48,10,48,48, 10,51,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 55,48,10,57,56,10,54,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 57,69,10,69,78,67,79,68,73,78,71,32,54,55,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,52, 56,10,50,56,10,49,56,10,50,56,10,52,56,10,48,56, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,57,70,10,69,78, 67,79,68,73,78,71,32,54,55,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,52,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,55,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,65,48,10,69,78,67,79,68,73,78, 71,32,54,55,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,56,10,49, 52,10,55,48,10,57,48,10,57,48,10,57,48,10,55,48, 10,49,48,10,49,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,65,49,10,69,78,67,79,68,73,78,71,32,54,55,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,51,48,10,52,56,10,48,56,10,48,56,10, 51,48,10,50,48,10,55,48,10,50,48,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,65,50,10,69, 78,67,79,68,73,78,71,32,54,55,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 48,10,52,56,10,52,48,10,52,48,10,51,48,10,49,48, 10,51,56,10,49,48,10,51,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,65,51,10,69,78,67,79,68,73, 78,71,32,54,55,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,55,56,10,65,56,10,65,56,10,66,48,10,66, 48,10,55,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,65,52,10,69,78,67,79,68,73,78,71,32,54,55, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,50,48,10,55,56, 10,65,56,10,65,56,10,66,48,10,66,48,10,54,56,10, 48,56,10,51,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,65,53,10, 69,78,67,79,68,73,78,71,32,54,55,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,55,56,10,65,56,10,65, 56,10,66,67,10,66,52,10,55,56,10,49,48,10,50,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,65,54,10,69,78,67,79,68, 73,78,71,32,54,55,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,52,48, 10,52,48,10,69,48,10,53,56,10,54,48,10,53,48,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,65,55,10,69,78,67,79,68,73,78,71,32,54, 55,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,56,10,53,48,10,53,48,10,70, 56,10,53,48,10,53,48,10,53,48,10,53,48,10,51,48, 10,53,48,10,50,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,65,56, 10,69,78,67,79,68,73,78,71,32,54,56,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,52,48,10,52,48,10,69,48,10,53,56,10, 54,48,10,54,56,10,55,52,10,51,56,10,50,48,10,52, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,65,57,10,69,78,67,79, 68,73,78,71,32,54,56,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,54,48,10,57, 48,10,56,48,10,56,48,10,70,48,10,65,56,10,65,56, 10,65,56,10,65,56,10,48,56,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,65,65,10,69,78,67,79,68,73,78,71,32, 54,56,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 66,48,10,67,56,10,65,48,10,57,48,10,67,56,10,66, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,65, 66,10,69,78,67,79,68,73,78,71,32,54,56,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,56,48,10,56,48,10,56,48,10,70,56,10,56,56, 10,57,48,10,65,48,10,67,48,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,65,67,10,69,78,67, 79,68,73,78,71,32,54,56,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,65,56,10, 65,56,10,53,48,10,53,48,10,48,48,10,65,56,10,65, 56,10,53,48,10,53,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,65,68,10,69,78,67,79,68,73,78,71, 32,54,56,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,55,56, 10,52,56,10,48,48,10,55,56,10,52,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 66,48,10,69,78,67,79,68,73,78,71,32,54,56,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,53,48,10,54,56,10,52,56,10,52, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,66,49,10,69,78, 67,79,68,73,78,71,32,54,56,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,50,48,10,52,48, 10,53,48,10,54,56,10,52,56,10,52,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,66,50,10,69,78,67,79,68,73,78, 71,32,54,57,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,48,10,48,48,10,49,48,10,49, 48,10,53,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,66,51,10,69,78,67,79,68,73,78,71,32,54,57,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,53,48,10,54,48,10,52,48,10,52,48,10, 52,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,66,52,10,69, 78,67,79,68,73,78,71,32,54,57,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,49, 48,10,49,48,10,49,48,10,51,48,10,53,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,66,53,10,69,78,67,79,68,73, 78,71,32,54,57,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,49,48,10,49,48,10, 49,48,10,51,48,10,53,48,10,48,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,66,54,10,69,78,67,79,68,73,78,71,32,54,57, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,54,48,10,53,48, 10,54,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,66,55,10, 69,78,67,79,68,73,78,71,32,54,57,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,56,10,65,56,10,65,56,10,53,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,66,56,10,69,78,67,79,68, 73,78,71,32,54,57,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,53,48, 10,50,48,10,50,48,10,52,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,66,57,10,69,78,67,79,68,73,78,71,32,54, 57,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,48,10,50,48,10,52,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,66,65, 10,69,78,67,79,68,73,78,71,32,54,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,56,10,50,56,10,53,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,66,66,10,69,78,67,79, 68,73,78,71,32,54,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,49,48,10,50, 48,10,51,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,97, 102,105,105,53,55,57,50,57,10,69,78,67,79,68,73,78, 71,32,55,48,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,51,48,10,49,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 54,52,57,51,55,10,69,78,67,79,68,73,78,71,32,55, 48,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,66,69, 10,69,78,67,79,68,73,78,71,32,55,48,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,50,48, 10,49,48,10,49,48,10,50,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,66,70,10,69,78,67,79, 68,73,78,71,32,55,48,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,49,48,10,50,48,10,50, 48,10,49,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,67,48,10,69,78,67,79,68,73,78,71,32, 55,48,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,53,48,10,49,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,67, 49,10,69,78,67,79,68,73,78,71,32,55,48,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,50, 48,10,53,48,10,52,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,67,50,10,69,78,67, 79,68,73,78,71,32,55,48,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,49,48,10,50,48,10, 52,48,10,50,48,10,49,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,67,51,10,69,78,67,79,68,73,78,71, 32,55,48,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,52,48,10,50,48,10,49,48,10,50,48, 10,52,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 67,52,10,69,78,67,79,68,73,78,71,32,55,48,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 50,48,10,53,48,10,56,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,67,53,10,69,78, 67,79,68,73,78,71,32,55,48,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,56,56,10,53,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,99,105,114,99,117,109,102,108,101,120,10,69,78,67,79, 68,73,78,71,32,55,49,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,51,48,10,52,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,99, 97,114,111,110,10,69,78,67,79,68,73,78,71,32,55,49, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,52,56,10,51,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,67,56,10, 69,78,67,79,68,73,78,71,32,55,49,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,109,97,99,114,111,110,10,69,78,67,79,68,73, 78,71,32,55,49,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,67,65,10,69,78,67,79,68,73,78,71,32,55,49, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,50,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,67,66,10, 69,78,67,79,68,73,78,71,32,55,49,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,49,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,67,67,10,69,78,67,79,68, 73,78,71,32,55,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,67,68,10,69,78,67,79,68,73,78,71,32,55, 49,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,67,69, 10,69,78,67,79,68,73,78,71,32,55,49,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,67,70,10,69,78,67,79, 68,73,78,71,32,55,49,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,52,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,68,48,10,69,78,67,79,68,73,78,71,32, 55,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,50,48,10,48,48,10,48,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,68, 49,10,69,78,67,79,68,73,78,71,32,55,50,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,68,50,10,69,78,67, 79,68,73,78,71,32,55,50,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,49,48,10,49,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,68,51,10,69,78,67,79,68,73,78,71, 32,55,50,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,52,48,10,52,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 68,52,10,69,78,67,79,68,73,78,71,32,55,50,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,48,10,50,48,10,70, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,68,53,10,69,78, 67,79,68,73,78,71,32,55,50,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,50,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,68,54,10,69,78,67,79,68,73,78, 71,32,55,50,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,50, 48,10,50,48,10,70,56,10,50,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,68,55,10,69,78,67,79,68,73,78,71,32,55,50,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,56,10, 70,56,10,56,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,98,114,101,118,101,10,69,78,67, 79,68,73,78,71,32,55,50,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,56,56,10,55,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 100,111,116,97,99,99,101,110,116,10,69,78,67,79,68,73, 78,71,32,55,50,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,114,105,110, 103,10,69,78,67,79,68,73,78,71,32,55,51,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,50, 48,10,53,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,111,103,111,110,101,107,10,69,78,67,79, 68,73,78,71,32,55,51,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,49,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,116, 105,108,100,101,10,69,78,67,79,68,73,78,71,32,55,51, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,50,56,10,53,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,104,117,110,103,97,114,117,109, 108,97,117,116,10,69,78,67,79,68,73,78,71,32,55,51, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,52,56,10,57,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,68,69,10, 69,78,67,79,68,73,78,71,32,55,51,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,67,56,10,51, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,50,68,70,10,69,78,67,79,68, 73,78,71,32,55,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,53,48,10,50,48,10,53,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,50,69,48,10,69,78,67,79,68,73,78,71,32,55, 51,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,52,56,10,51,48,10,51,48,10,51, 48,10,51,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,50,69,49, 10,69,78,67,79,68,73,78,71,32,55,51,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,54,48, 10,50,48,10,50,48,10,50,48,10,55,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,50,69,50,10,69,78,67,79, 68,73,78,71,32,55,51,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,51,48,10,52, 48,10,50,48,10,49,48,10,54,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,50,69,51,10,69,78,67,79,68,73,78,71,32, 55,51,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,56,10,51,48,10,51,48,10, 52,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,50,69, 52,10,69,78,67,79,68,73,78,71,32,55,52,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,51,48,10,52,56,10,52,48,10,52,48,10,51,48, 10,49,48,10,51,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,50,69,53,10,69,78,67, 79,68,73,78,71,32,55,52,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,50,69,54,10,69,78,67,79,68,73,78,71, 32,55,52,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,49,48,10,49,48,10,55,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,50, 69,55,10,69,78,67,79,68,73,78,71,32,55,52,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,55,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,50,69,56,10,69,78, 67,79,68,73,78,71,32,55,52,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,55,48,10,49,48,10,49,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,50,69,57,10,69,78,67,79,68,73,78, 71,32,55,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,55,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 50,69,65,10,69,78,67,79,68,73,78,71,32,55,52,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,52,48,10,52,48,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,50,69,66,10,69, 78,67,79,68,73,78,71,32,55,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,52,48,10,52,48, 10,55,48,10,52,48,10,52,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,50,69,67,10,69,78,67,79,68,73, 78,71,32,55,52,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,56,56,10,53,48,10,50,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,50,69,68,10,69,78,67,79,68,73,78,71,32,55,52, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,48,48,10,70,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,50,69,69,10, 69,78,67,79,68,73,78,71,32,55,53,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 68,56,10,52,56,10,57,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,103,114,97,118,101,99,111,109,98,10,69,78,67, 79,68,73,78,71,32,55,54,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,50,48,10,49,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,99,117,116,101,99,111,109,98,10,69,78,67,79,68,73, 78,71,32,55,54,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,48,50,10,69,78,67,79,68,73,78,71,32,55,55, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,52,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,116,105,108,100,101,99,111,109, 98,10,69,78,67,79,68,73,78,71,32,55,55,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,50, 56,10,53,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,48,52,10,69,78,67, 79,68,73,78,71,32,55,55,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,48,53,10,69,78,67,79,68,73,78,71, 32,55,55,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,67,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 48,54,10,69,78,67,79,68,73,78,71,32,55,55,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,48,55,10,69,78, 67,79,68,73,78,71,32,55,55,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,50,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,48,56,10,69,78,67,79,68,73,78, 71,32,55,55,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,104,111,111,107, 97,98,111,118,101,99,111,109,98,10,69,78,67,79,68,73, 78,71,32,55,55,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,50,48,10,53,48,10,49,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,48,65,10,69,78,67,79,68,73,78,71,32,55,55, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,50, 48,10,53,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,48,66,10, 69,78,67,79,68,73,78,71,32,55,55,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,56,10, 57,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,48,67,10,69,78,67,79,68, 73,78,71,32,55,56,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,56,10,51,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,48,68,10,69,78,67,79,68,73,78,71,32,55, 56,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,50,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,48,69, 10,69,78,67,79,68,73,78,71,32,55,56,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,53,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,48,70,10,69,78,67,79, 68,73,78,71,32,55,56,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,57,48,10,52,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,49,48,10,69,78,67,79,68,73,78,71,32, 55,56,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,49, 49,10,69,78,67,79,68,73,78,71,32,55,56,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,55, 48,10,56,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,49,50,10,69,78,67, 79,68,73,78,71,32,55,56,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,49,48,10,50,48,10, 54,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,49,51,10,69,78,67,79,68,73,78,71, 32,55,56,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,51,48,10,50,48,10,52,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 49,52,10,69,78,67,79,68,73,78,71,32,55,56,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 54,48,10,50,48,10,49,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,49,53,10,69,78, 67,79,68,73,78,71,32,55,56,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,67,10,48,56, 10,49,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,49,54,10,69,78,67,79,68,73,78, 71,32,55,57,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 51,49,55,10,69,78,67,79,68,73,78,71,32,55,57,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,49,56,10,69, 78,67,79,68,73,78,71,32,55,57,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,49,48,10,51,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,49,57,10,69,78,67,79,68,73, 78,71,32,55,57,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,51,48,10,50,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,49,65,10,69,78,67,79,68,73,78,71,32,55,57, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,67,10,48,52,10,48,52,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,49,66,10, 69,78,67,79,68,73,78,71,32,55,57,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,52,10,48,52,10,48,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,49,67,10,69,78,67,79,68, 73,78,71,32,55,57,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,49,48,10,50,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,49,68,10,69,78,67,79,68,73,78,71,32,55, 57,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,49,69, 10,69,78,67,79,68,73,78,71,32,55,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,49,70,10,69,78,67,79, 68,73,78,71,32,55,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,48,10,55,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,50,48,10,69,78,67,79,68,73,78,71,32, 56,48,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,50, 49,10,69,78,67,79,68,73,78,71,32,56,48,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,56,10,50,56,10, 49,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,50,50,10,69,78,67, 79,68,73,78,71,32,56,48,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,48,56,10,48,52,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 100,111,116,98,101,108,111,119,99,111,109,98,10,69,78,67, 79,68,73,78,71,32,56,48,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,50,52,10,69,78,67,79,68,73,78,71, 32,56,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 50,53,10,69,78,67,79,68,73,78,71,32,56,48,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,53,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,50,54,10,69,78, 67,79,68,73,78,71,32,56,48,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,48,10,50,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,50,55,10,69,78,67,79,68,73,78, 71,32,56,48,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 51,50,56,10,69,78,67,79,68,73,78,71,32,56,48,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,50, 48,10,49,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,50,57,10,69, 78,67,79,68,73,78,71,32,56,48,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,50,65,10,69,78,67,79,68,73, 78,71,32,56,49,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,56,10,52,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,50,66,10,69,78,67,79,68,73,78,71,32,56,49, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 65,56,10,53,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,50,67,10, 69,78,67,79,68,73,78,71,32,56,49,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,52,56,10,51,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,50,68,10,69,78,67,79,68, 73,78,71,32,56,49,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,51,48,10,52,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,50,69,10,69,78,67,79,68,73,78,71,32,56, 49,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,56,56,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,50,70, 10,69,78,67,79,68,73,78,71,32,56,49,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,51,48,10,69,78,67,79, 68,73,78,71,32,56,49,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,56,10,53,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,51,49,10,69,78,67,79,68,73,78,71,32, 56,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,51, 50,10,69,78,67,79,68,73,78,71,32,56,49,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,67,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,51,51,10,69,78,67, 79,68,73,78,71,32,56,49,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,67,10,48,48,10,70,67,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,51,52,10,69,78,67,79,68,73,78,71, 32,56,50,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,56,10,53,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 51,53,10,69,78,67,79,68,73,78,71,32,56,50,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,51,54,10,69,78, 67,79,68,73,78,71,32,56,50,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,51,55,10,69,78,67,79,68,73,78, 71,32,56,50,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,49,48,10,50,48,10,52,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 51,51,56,10,69,78,67,79,68,73,78,71,32,56,50,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,48,56,10,49,48,10,49,48,10, 50,48,10,52,48,10,52,48,10,56,48,10,56,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,51,57,10,69, 78,67,79,68,73,78,71,32,56,50,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,49,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,51,65,10,69,78,67,79,68,73, 78,71,32,56,50,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,56,10,55,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,51,66,10,69,78,67,79,68,73,78,71,32,56,50, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 53,48,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,51,67,10, 69,78,67,79,68,73,78,71,32,56,50,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,53,48,10,65,56, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,51,68,10,69,78,67,79,68, 73,78,71,32,56,50,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,53,48,10,50,48,10,53,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,51,69,10,69,78,67,79,68,73,78,71,32,56, 51,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 49,48,10,50,48,10,49,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,51,70, 10,69,78,67,79,68,73,78,71,32,56,51,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,70,67,10,48,48, 10,70,67,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,52,48,10,69,78,67,79, 68,73,78,71,32,56,51,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,56,48,10,52,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,52,49,10,69,78,67,79,68,73,78,71,32, 56,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,52,10,48,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,52, 50,10,69,78,67,79,68,73,78,71,32,56,51,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,54,56,10,66, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,52,51,10,69,78,67, 79,68,73,78,71,32,56,51,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,52,52,10,69,78,67,79,68,73,78,71, 32,56,51,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,49,48,10,50,48,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 52,53,10,69,78,67,79,68,73,78,71,32,56,51,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,52,54,10,69,78, 67,79,68,73,78,71,32,56,51,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,55,48,10,53,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,52,55,10,69,78,67,79,68,73,78, 71,32,56,51,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,48,10,48,48,10,55,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 51,52,56,10,69,78,67,79,68,73,78,71,32,56,52,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,53, 48,10,53,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,52,57,10,69, 78,67,79,68,73,78,71,32,56,52,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,51,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,52,65,10,69,78,67,79,68,73, 78,71,32,56,52,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,49,48,10,54,56,10,66,48,10,52,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,52,66,10,69,78,67,79,68,73,78,71,32,56,52, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,49, 48,10,48,48,10,54,56,10,66,48,10,48,48,10,52,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,52,67,10, 69,78,67,79,68,73,78,71,32,56,52,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,50,56,10,53,48,10, 50,56,10,53,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,52,68,10,69,78,67,79,68, 73,78,71,32,56,52,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,53,48,10,70,56,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,52,69,10,69,78,67,79,68,73,78,71,32,56, 52,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,52,70, 10,69,78,67,79,68,73,78,71,32,56,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,54,48,10,69,78,67,79, 68,73,78,71,32,56,54,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,51,48,10,52,67,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,54,49,10,69,78,67,79,68,73,78,71,32, 56,54,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,51,56,10,52,52,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,54, 50,10,69,78,67,79,68,73,78,71,32,56,54,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,56,10,70,67,10, 48,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,54,51,10,69,78,67, 79,68,73,78,71,32,56,54,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,50,48,10,49,48,10,51,48,10, 53,48,10,51,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,54,52,10,69,78,67,79,68,73,78,71, 32,56,54,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,50,48,10,53,48,10,55,48,10,52,48,10,51,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 54,53,10,69,78,67,79,68,73,78,71,32,56,54,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,54,54,10,69,78, 67,79,68,73,78,71,32,56,55,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,51,48,10,52,56,10,52,56, 10,51,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,54,55,10,69,78,67,79,68,73,78, 71,32,56,55,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,53,48,10,53,48,10,51,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 51,54,56,10,69,78,67,79,68,73,78,71,32,56,55,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,51,48, 10,52,48,10,51,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,54,57,10,69, 78,67,79,68,73,78,71,32,56,55,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,51,48,10,53, 48,10,51,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,54,65,10,69,78,67,79,68,73, 78,71,32,56,55,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,52,48,10,54,48,10,53,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,54,66,10,69,78,67,79,68,73,78,71,32,56,55, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,68, 48,10,65,56,10,65,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,54,67,10, 69,78,67,79,68,73,78,71,32,56,55,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,53,48,10,54,48,10, 52,48,10,52,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,54,68,10,69,78,67,79,68, 73,78,71,32,56,55,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,55,48,10,50,48,10,51,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,54,69,10,69,78,67,79,68,73,78,71,32,56, 55,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 53,48,10,53,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,54,70, 10,69,78,67,79,68,73,78,71,32,56,55,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,53,48,10,50,48, 10,53,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,55,52,10,69,78,67,79, 68,73,78,71,32,56,56,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,49,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,55,53,10,69,78,67,79,68,73,78,71,32, 56,56,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,55, 65,10,69,78,67,79,68,73,78,71,32,56,57,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 51,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,55,69,10,69,78,67, 79,68,73,78,71,32,56,57,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,55,48,10,50,48,10,48,48,10,48, 48,10,51,48,10,50,48,10,52,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 116,111,110,111,115,10,69,78,67,79,68,73,78,71,32,57, 48,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,49,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,100,105,101,114,101,115,105, 115,116,111,110,111,115,10,69,78,67,79,68,73,78,71,32, 57,48,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,49,48,10,50,48,10,68,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,65,108,112,104,97,116, 111,110,111,115,10,69,78,67,79,68,73,78,71,32,57,48, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,65,56,10,50,56,10,50,56, 10,50,56,10,51,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,110,111,116,101,108,101,105, 97,10,69,78,67,79,68,73,78,71,32,57,48,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,55,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,69,112,115,105,108,111,110,116,111,110,111, 115,10,69,78,67,79,68,73,78,71,32,57,48,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,56,10,65,48,10,50,48,10,50,48,10,51,48, 10,50,48,10,50,48,10,50,48,10,51,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,69,116,97,116,111,110,111,115,10,69,78, 67,79,68,73,78,71,32,57,48,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,54,56, 10,65,56,10,50,56,10,50,56,10,51,56,10,50,56,10, 50,56,10,50,56,10,50,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,73,111,116,97,116,111,110,111,115,10,69,78,67,79,68, 73,78,71,32,57,48,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,56,10,57,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,51,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,79,109, 105,99,114,111,110,116,111,110,111,115,10,69,78,67,79,68, 73,78,71,32,57,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,65,56, 10,50,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 50,56,10,49,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,85,112, 115,105,108,111,110,116,111,110,111,115,10,69,78,67,79,68, 73,78,71,32,57,49,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,54,56,10,65,56, 10,50,56,10,50,56,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,79,109, 101,103,97,116,111,110,111,115,10,69,78,67,79,68,73,78, 71,32,57,49,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,53,48,10,65,56,10,50, 56,10,50,56,10,50,56,10,50,56,10,49,48,10,49,48, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,105,111,116,97, 100,105,101,114,101,115,105,115,116,111,110,111,115,10,69,78, 67,79,68,73,78,71,32,57,49,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,49,48,10,50,48, 10,68,56,10,48,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,56,10,49,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,65,108,112,104,97,10,69,78,67,79,68,73,78,71,32, 57,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,53,48,10,56,56,10, 56,56,10,56,56,10,70,56,10,56,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,66,101,116,97,10,69, 78,67,79,68,73,78,71,32,57,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,70,48,10,56,56, 10,56,56,10,56,56,10,70,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,71,97,109,109,97,10,69,78,67,79,68,73,78,71, 32,57,49,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,68,101,108,116,97, 10,69,78,67,79,68,73,78,71,32,57,49,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,50,48,10,53,48,10,53,48,10,53,48,10, 56,56,10,56,56,10,56,56,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,69,112,115,105,108,111,110,10,69,78,67,79, 68,73,78,71,32,57,49,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,56, 48,10,56,48,10,56,48,10,70,48,10,56,48,10,56,48, 10,56,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,90, 101,116,97,10,69,78,67,79,68,73,78,71,32,57,49,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,48,56,10,49,48,10,49,48,10, 50,48,10,52,48,10,52,48,10,56,48,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,69,116,97,10,69,78,67,79,68, 73,78,71,32,57,49,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,70,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,84,104, 101,116,97,10,69,78,67,79,68,73,78,71,32,57,50,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 70,56,10,56,56,10,56,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,73,111,116,97,10,69,78,67,79, 68,73,78,71,32,57,50,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,75, 97,112,112,97,10,69,78,67,79,68,73,78,71,32,57,50, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,57,48,10,65,48, 10,67,48,10,65,48,10,57,48,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,76,97,109,98,100,97,10,69, 78,67,79,68,73,78,71,32,57,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,53,48,10,53,48,10,53,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,77,117,10,69,78,67,79,68,73,78,71,32,57,50, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,68,56,10,65,56, 10,65,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,78,117,10,69,78,67,79,68, 73,78,71,32,57,50,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,67,56, 10,67,56,10,65,56,10,65,56,10,57,56,10,57,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,88,105, 10,69,78,67,79,68,73,78,71,32,57,50,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,55,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,79,109,105,99,114,111,110,10,69,78,67,79, 68,73,78,71,32,57,50,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,80, 105,10,69,78,67,79,68,73,78,71,32,57,50,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,82,104,111,10,69,78,67,79,68,73,78, 71,32,57,50,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,48,10,56,56,10,56, 56,10,56,56,10,70,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,83,105,103,109, 97,10,69,78,67,79,68,73,78,71,32,57,51,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,56,48,10,52,48,10,50,48,10,49,48, 10,50,48,10,52,48,10,56,48,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,84,97,117,10,69,78,67,79,68,73,78, 71,32,57,51,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,85,112,115,105, 108,111,110,10,69,78,67,79,68,73,78,71,32,57,51,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,56,56,10,56,56,10,53,48,10,53,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,80,104,105,10,69,78,67,79,68, 73,78,71,32,57,51,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,55,48, 10,65,56,10,65,56,10,65,56,10,65,56,10,55,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,67,104, 105,10,69,78,67,79,68,73,78,71,32,57,51,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,56,56,10,56,56,10,53,48,10,53,48,10,50,48, 10,53,48,10,53,48,10,56,56,10,56,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,80,115,105,10,69,78,67,79,68,73,78, 71,32,57,51,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,56,10,65,56,10,65, 56,10,65,56,10,65,56,10,55,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,79,109,101,103, 97,10,69,78,67,79,68,73,78,71,32,57,51,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,53,48,10,53,48,10,68,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,73,111,116,97,100,105,101,114,101,115,105, 115,10,69,78,67,79,68,73,78,71,32,57,51,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,48,48,10,55,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,85,112,115,105,108,111,110,100,105,101,114, 101,115,105,115,10,69,78,67,79,68,73,78,71,32,57,51, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,56,10,48,48,10,56,56,10,53,48,10,53,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,108,112,104,97,116,111,110, 111,115,10,69,78,67,79,68,73,78,71,32,57,52,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,101,112,115,105,108,111,110,116,111,110, 111,115,10,69,78,67,79,68,73,78,71,32,57,52,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,54,48,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,101,116,97,116,111,110,111,115,10,69, 78,67,79,68,73,78,71,32,57,52,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,49, 48,10,50,48,10,48,48,10,66,48,10,67,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,48,56,10,48,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,105,111,116,97,116,111,110,111,115,10,69,78,67,79, 68,73,78,71,32,57,52,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,52, 48,10,48,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,53,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 112,115,105,108,111,110,100,105,101,114,101,115,105,115,116,111, 110,111,115,10,69,78,67,79,68,73,78,71,32,57,52,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,49,48,10,50,48,10,68,56,10,48,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,97,108,112,104,97,10,69,78,67, 79,68,73,78,71,32,57,52,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 98,101,116,97,10,69,78,67,79,68,73,78,71,32,57,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,54,48,10,57,48,10,57,48,10,70,48, 10,56,56,10,56,56,10,56,56,10,67,56,10,66,48,10, 56,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,103,97,109,109,97,10,69,78, 67,79,68,73,78,71,32,57,52,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 53,48,10,53,48,10,50,48,10,50,48,10,50,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,100,101,108,116,97,10,69,78,67,79,68,73,78,71,32, 57,52,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,56,56,10,52,48,10, 55,48,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,101,112,115,105,108,111, 110,10,69,78,67,79,68,73,78,71,32,57,52,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,54,48,10,56,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,122,101,116,97,10,69,78,67,79,68,73, 78,71,32,57,53,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,50,48,10, 52,48,10,52,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,55,48,10,48,56,10,49,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,101,116,97, 10,69,78,67,79,68,73,78,71,32,57,53,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,48, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,116,104,101,116,97,10,69,78,67,79,68,73, 78,71,32,57,53,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,54,48,10,57,48,10, 57,48,10,57,48,10,70,48,10,57,48,10,57,48,10,57, 48,10,54,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,105,111,116, 97,10,69,78,67,79,68,73,78,71,32,57,53,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,53,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,107,97,112,112,97,10,69,78,67,79,68, 73,78,71,32,57,53,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,57,48,10,65,48,10,69,48,10, 57,48,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,108,97, 109,98,100,97,10,69,78,67,79,68,73,78,71,32,57,53, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,48,56,10,54,56, 10,57,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,109,117,10,69,78,67,79,68, 73,78,71,32,57,53,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,69,56,10,56,48,10,56,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,110,117, 10,69,78,67,79,68,73,78,71,32,57,53,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,53,48,10,53,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,120,105,10,69,78,67,79,68,73,78,71,32, 57,53,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,50,48,10,52,48,10, 52,48,10,51,48,10,52,48,10,56,48,10,56,48,10,55, 48,10,48,56,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,111,109,105,99,114,111, 110,10,69,78,67,79,68,73,78,71,32,57,53,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,112,105,10,69,78,67,79,68,73,78,71, 32,57,54,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,53,48,10,53,48,10,53,48,10,53,48,10, 53,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,114,104,111,10,69, 78,67,79,68,73,78,71,32,57,54,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,70,48,10,56,48,10,56,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,115,105,103,109,97,49,10,69,78,67,79,68,73,78, 71,32,57,54,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,48,10,56,48,10,56,48, 10,55,48,10,48,56,10,51,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,115,105,103,109, 97,10,69,78,67,79,68,73,78,71,32,57,54,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,56,10,57,48, 10,56,56,10,56,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,116,97,117,10,69,78,67,79,68,73,78, 71,32,57,54,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,50,48,10,50,48,10,50,48,10,50,48, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,112,115,105, 108,111,110,10,69,78,67,79,68,73,78,71,32,57,54,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,112,104,105,10,69,78,67,79,68, 73,78,71,32,57,54,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,66,48,10,65,56,10,65,56,10,65,56,10, 65,56,10,55,48,10,50,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,99,104, 105,10,69,78,67,79,68,73,78,71,32,57,54,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,53,48, 10,53,48,10,50,48,10,50,48,10,53,48,10,53,48,10, 56,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,112,115,105,10,69,78,67,79,68,73,78, 71,32,57,54,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,65,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,55,48,10,50,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,111,109,101,103, 97,10,69,78,67,79,68,73,78,71,32,57,54,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,53,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,105,111,116,97,100,105,101,114,101,115,105, 115,10,69,78,67,79,68,73,78,71,32,57,55,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,68,56,10,48,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,56,10,49,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,112,115,105,108,111,110,100,105,101,114, 101,115,105,115,10,69,78,67,79,68,73,78,71,32,57,55, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,68,56,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,111,109,105,99,114,111,110,116, 111,110,111,115,10,69,78,67,79,68,73,78,71,32,57,55, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,50,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,112,115,105,108,111,110,116, 111,110,111,115,10,69,78,67,79,68,73,78,71,32,57,55, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,50,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,111,109,101,103,97,116,111,110, 111,115,10,69,78,67,79,68,73,78,71,32,57,55,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,50,48,10,48,48,10,56,56,10,65, 56,10,65,56,10,65,56,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,68,48,10,69,78, 67,79,68,73,78,71,32,57,55,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,54,48, 10,57,48,10,57,48,10,66,48,10,67,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,116,104,101,116,97,49,10,69,78,67,79,68,73,78,71, 32,57,55,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,51,48,10,52,56,10,52,56, 10,51,67,10,48,56,10,67,56,10,52,56,10,52,56,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,85,112,115,105,108, 111,110,49,10,69,78,67,79,68,73,78,71,32,57,55,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,56,56,10,53,52,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,68,51,10,69, 78,67,79,68,73,78,71,32,57,55,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,54, 56,10,49,52,10,53,48,10,57,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,68,52,10,69,78,67,79,68,73, 78,71,32,57,56,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,68,56,10,48,48,10,56,56,10, 53,52,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,112,104,105, 49,10,69,78,67,79,68,73,78,71,32,57,56,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,50,48,10,50,48,10,55,48,10,65,56, 10,65,56,10,65,56,10,65,56,10,55,48,10,50,48,10, 50,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,111,109,101,103,97,49,10,69,78,67,79, 68,73,78,71,32,57,56,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,56,56,10,65,56,10,65,56, 10,65,56,10,53,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,68,55,10,69,78,67,79,68,73,78,71,32, 57,56,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,50,48,10,48,48,10, 56,56,10,52,56,10,53,48,10,55,48,10,53,48,10,56, 56,10,48,56,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,68, 56,10,69,78,67,79,68,73,78,71,32,57,56,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,55,48,10,50,48,10, 50,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,48,51,68,57,10,69,78,67, 79,68,73,78,71,32,57,56,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,51,68,65,10,69,78,67,79,68,73,78,71, 32,57,56,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,51,48,10,52,56,10,56,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,55,48,10, 48,56,10,49,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,48,51, 68,66,10,69,78,67,79,68,73,78,71,32,57,56,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,55,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,55,48,10,48,56, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,68,67,10,69,78, 67,79,68,73,78,71,32,57,56,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,56, 10,56,48,10,56,48,10,56,48,10,69,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,48,51,68,68,10,69,78,67,79,68,73,78, 71,32,57,56,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,48,10,56,48,10,56,48,10,69,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 51,68,69,10,69,78,67,79,68,73,78,71,32,57,57,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,56,48,10,56,48,10,56,56,10,57,56,10, 65,56,10,67,56,10,56,56,10,48,56,10,48,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,48,51,68,70,10,69, 78,67,79,68,73,78,71,32,57,57,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,52,48,10,52,48,10,56,48,10,70,56, 10,48,56,10,49,48,10,49,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,69,48,10,69,78,67,79,68,73, 78,71,32,57,57,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,50,48,10, 53,48,10,53,48,10,53,48,10,57,56,10,65,56,10,65, 56,10,65,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 48,51,69,49,10,69,78,67,79,68,73,78,71,32,57,57, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,67,48,10,50,48,10,49,48,10,51,48, 10,52,56,10,57,56,10,50,56,10,52,56,10,48,56,10, 48,56,10,48,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,51,69,50,10, 69,78,67,79,68,73,78,71,32,57,57,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 65,56,10,65,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,55,56,10,48,56,10,70,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,48,51,69,51,10,69,78,67,79,68, 73,78,71,32,57,57,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,65,56,10,65,56,10,65,56,10,65,56,10, 55,56,10,48,56,10,70,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,69,52,10,69,78,67,79,68,73,78,71,32,57, 57,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,52,56,10,65,56,10,56,56,10,56, 56,10,56,56,10,55,56,10,48,56,10,48,56,10,48,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,48,51,69,53, 10,69,78,67,79,68,73,78,71,32,57,57,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,52,56,10,65,56,10, 56,56,10,55,56,10,48,56,10,48,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,51,69,54,10,69,78,67,79, 68,73,78,71,32,57,57,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,56,48,10,56, 48,10,56,48,10,66,48,10,67,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,70,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,48,51,69,55,10,69,78,67,79,68,73,78,71,32, 57,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 55,48,10,65,56,10,65,56,10,52,56,10,48,56,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,69, 56,10,69,78,67,79,68,73,78,71,32,49,48,48,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,52,56,10,49,48,10,50, 48,10,52,48,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,69,57,10,69,78, 67,79,68,73,78,71,32,49,48,48,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,55,48,10,56,48,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,69,65,10,69,78,67,79,68,73, 78,71,32,49,48,48,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,65,56, 10,50,48,10,53,48,10,53,48,10,53,48,10,56,56,10, 56,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,69,66,10,69,78,67,79,68,73,78,71,32,49, 48,48,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 53,48,10,65,56,10,50,48,10,53,48,10,56,56,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,69, 67,10,69,78,67,79,68,73,78,71,32,49,48,48,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,55,48,10,56,48,10,66,48,10,67, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,69,68,10,69,78, 67,79,68,73,78,71,32,49,48,48,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,55,48,10,56,48,10,66,48, 10,67,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,69,69,10,69,78,67,79,68,73, 78,71,32,49,48,48,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,50,48, 10,70,56,10,65,56,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,69,70,10,69,78,67,79,68,73,78,71,32,49, 48,48,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,51,48,10,50,48,10, 70,56,10,65,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,54,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,70, 48,10,69,78,67,79,68,73,78,71,32,49,48,48,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,52, 56,10,53,48,10,55,48,10,53,48,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,70,49,10,69,78, 67,79,68,73,78,71,32,49,48,48,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,70,48,10,56,48,10,55,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,70,50,10,69,78,67,79,68,73, 78,71,32,49,48,49,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,56,48,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,51,70,51,10,69,78,67,79,68,73,78,71,32,49, 48,49,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,49,48,10,48,48,10, 51,48,10,49,48,10,49,48,10,49,48,10,49,48,10,57, 48,10,57,48,10,54,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,51,70, 52,10,69,78,67,79,68,73,78,71,32,49,48,49,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,56,56,10,70, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,51,70,53,10,69,78, 67,79,68,73,78,71,32,49,48,49,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,56,10,52,48,10,55,48, 10,52,48,10,52,48,10,51,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,51,70,54,10,69,78,67,79,68,73, 78,71,32,49,48,49,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,48,56,10,51,56,10,48,56,10, 48,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,48,48,10,69,78,67,79,68,73,78,71,32,49, 48,50,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,48,10,50,48,10,48,48,10,70,56,10, 56,48,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,50,51,10,69,78,67,79,68,73,78,71,32,49,48,50, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,53,48,10,53,48,10,48,48,10,70,56,10,56,48, 10,56,48,10,70,48,10,56,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,53, 49,10,69,78,67,79,68,73,78,71,32,49,48,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,50,48,10,50,48,10,51,48,10,50, 56,10,50,56,10,50,56,10,50,56,10,50,56,10,48,56, 10,49,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,53,50,10, 69,78,67,79,68,73,78,71,32,49,48,50,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,50,48, 10,52,48,10,48,48,10,70,56,10,56,56,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,53,51,10,69,78, 67,79,68,73,78,71,32,49,48,50,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 56,10,52,48,10,56,48,10,56,48,10,70,48,10,56,48, 10,56,48,10,52,48,10,51,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,53,52,10,69,78,67,79, 68,73,78,71,32,49,48,50,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,48,10,56,48,10,55,48,10,48,56,10,48, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,53,53,10,69,78,67,79,68,73, 78,71,32,49,48,51,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,53,54,10,69,78,67,79,68,73,78,71, 32,49,48,51,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,70, 56,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,53,55,10,69,78,67,79,68,73,78,71,32,49, 48,51,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,51,56,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,53,56,10,69,78,67,79,68,73,78,71,32,49,48,51, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,54,48,10,65,48,10,65,48,10,65,48, 10,66,48,10,65,56,10,65,56,10,65,56,10,66,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,53, 57,10,69,78,67,79,68,73,78,71,32,49,48,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,65,48,10,65,48,10,65,48,10,65,48,10,70, 48,10,65,56,10,65,56,10,65,56,10,66,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,54,48,10, 69,78,67,79,68,73,78,71,32,49,48,51,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,50,48,10,50,48,10,51,48,10,50,56,10, 50,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,54,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,48,10,56, 56,10,56,56,10,57,48,10,65,48,10,67,48,10,65,48, 10,57,48,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,48,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,48,10,50,48,10,48,48, 10,56,56,10,57,56,10,57,56,10,65,56,10,67,56,10, 67,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,54,50,10,69,78,67,79,68,73,78,71, 32,49,48,51,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,56,56,10,55,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,55,56,10,48,56,10,48,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,49,52,53,10,69,78,67,79,68,73,78,71,32,49, 48,51,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,70, 56,10,50,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,49,55,10,69,78,67,79,68,73,78,71,32,49,48,52, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,56,56,10,70,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,49, 56,10,69,78,67,79,68,73,78,71,32,49,48,52,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,48,10,56,48,10,56,48,10,56,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,70,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,49,57,10, 69,78,67,79,68,73,78,71,32,49,48,52,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,48,10,56,56,10,56,56,10,56,56,10,70,48,10, 56,56,10,56,56,10,56,56,10,70,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,50,48,10,69,78, 67,79,68,73,78,71,32,49,48,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,56,56,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,50,49,10,69,78,67,79, 68,73,78,71,32,49,48,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,48,10, 53,48,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,70,56,10,56,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,50,50,10,69,78,67,79,68,73, 78,71,32,49,48,52,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,56,10,56,48, 10,56,48,10,56,48,10,70,48,10,56,48,10,56,48,10, 56,48,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,50,52,10,69,78,67,79,68,73,78,71, 32,49,48,52,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,56,10,65,56,10,65, 56,10,55,48,10,50,48,10,55,48,10,65,56,10,65,56, 10,65,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,50,53,10,69,78,67,79,68,73,78,71,32,49, 48,52,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,56,56,10,48,56,10, 48,56,10,51,48,10,48,56,10,48,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,50,54,10,69,78,67,79,68,73,78,71,32,49,48,52, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,57,56,10,57,56, 10,65,56,10,65,56,10,67,56,10,67,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,50, 55,10,69,78,67,79,68,73,78,71,32,49,48,52,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 56,56,10,55,48,10,48,48,10,56,56,10,57,56,10,57, 56,10,65,56,10,67,56,10,67,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,50,56,10, 69,78,67,79,68,73,78,71,32,49,48,53,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,56,10,56,56,10,57,48,10,65,48,10,67,48,10, 65,48,10,57,48,10,56,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,50,57,10,69,78, 67,79,68,73,78,71,32,49,48,53,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 56,10,52,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,51,48,10,69,78,67,79, 68,73,78,71,32,49,48,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,56,10, 68,56,10,68,56,10,65,56,10,65,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,51,49,10,69,78,67,79,68,73, 78,71,32,49,48,53,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,70,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,51,50,10,69,78,67,79,68,73,78,71, 32,49,48,53,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,51,51,10,69,78,67,79,68,73,78,71,32,49, 48,53,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,51,52,10,69,78,67,79,68,73,78,71,32,49,48,53, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,70,48,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,51, 53,10,69,78,67,79,68,73,78,71,32,49,48,53,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,48,10,56,48,10,56, 48,10,56,48,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,51,54,10, 69,78,67,79,68,73,78,71,32,49,48,53,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,51,55,10,69,78, 67,79,68,73,78,71,32,49,48,53,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,55,56, 10,48,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,51,56,10,69,78,67,79, 68,73,78,71,32,49,48,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 55,48,10,65,56,10,65,56,10,65,56,10,65,56,10,55, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,51,57,10,69,78,67,79,68,73, 78,71,32,49,48,54,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,53,48,10,53,48,10,50,48,10,53,48,10,53,48,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,52,48,10,69,78,67,79,68,73,78,71, 32,49,48,54,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,57,48,10,57,48,10,57, 48,10,57,48,10,57,48,10,57,48,10,57,48,10,57,48, 10,70,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,52,49,10,69,78,67,79,68,73,78,71,32,49, 48,54,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,56,10,48,56,10,48,56,10,48,56,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,52,50,10,69,78,67,79,68,73,78,71,32,49,48,54, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,65,56,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,52, 51,10,69,78,67,79,68,73,78,71,32,49,48,54,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,65,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,65,56,10,65,56,10,70,56,10,48,56, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,52,52,10, 69,78,67,79,68,73,78,71,32,49,48,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,67,48,10,52,48,10,52,48,10,52,48,10,55,48,10, 52,56,10,52,56,10,52,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,52,53,10,69,78, 67,79,68,73,78,71,32,49,48,54,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,69,56,10,57,56,10,57,56, 10,57,56,10,57,56,10,69,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,52,54,10,69,78,67,79, 68,73,78,71,32,49,48,54,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,70,48,10,56,56,10,56, 56,10,56,56,10,70,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,52,55,10,69,78,67,79,68,73, 78,71,32,49,48,54,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,69,48,10,49,48, 10,48,56,10,48,56,10,55,56,10,48,56,10,48,56,10, 49,48,10,69,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,52,56,10,69,78,67,79,68,73,78,71, 32,49,48,55,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,57,48,10,65,56,10,65, 56,10,65,56,10,69,56,10,65,56,10,65,56,10,65,56, 10,57,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,52,57,10,69,78,67,79,68,73,78,71,32,49, 48,55,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,56,10,56,56,10,56,56,10, 56,56,10,55,56,10,50,56,10,52,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,54,53,10,69,78,67,79,68,73,78,71,32,49,48,55, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,48,56,10,55,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,54, 54,10,69,78,67,79,68,73,78,71,32,49,48,55,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,55,48,10,56,48,10,70,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,54,55,10, 69,78,67,79,68,73,78,71,32,49,48,55,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,48,10,56,56,10, 70,48,10,56,56,10,56,56,10,70,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,54,56,10,69,78, 67,79,68,73,78,71,32,49,48,55,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,56,56,10,56,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,54,57,10,69,78,67,79, 68,73,78,71,32,49,48,55,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,51,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,70,56,10,56,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,55,48,10,69,78,67,79,68,73, 78,71,32,49,48,55,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,55,50,10,69,78,67,79,68,73,78,71, 32,49,48,55,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,65,56,10,65,56,10,55,48,10,55,48,10,65,56, 10,65,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,55,51,10,69,78,67,79,68,73,78,71,32,49, 48,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,51,48,10,48,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,55,52,10,69,78,67,79,68,73,78,71,32,49,48,56, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,56,56,10,57,56,10,65,56,10,67,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,55, 53,10,69,78,67,79,68,73,78,71,32,49,48,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,55,48,10,48,48,10,56,56,10,56, 56,10,57,56,10,65,56,10,67,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,55,54,10, 69,78,67,79,68,73,78,71,32,49,48,56,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,56,56,10,57,48,10, 69,48,10,57,48,10,56,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,55,55,10,69,78, 67,79,68,73,78,71,32,49,48,56,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,55,56,10,69,78,67,79, 68,73,78,71,32,49,48,56,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,56,10,68,56,10,65,56,10,65, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,55,57,10,69,78,67,79,68,73, 78,71,32,49,48,56,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,70,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,56,48,10,69,78,67,79,68,73,78,71, 32,49,48,56,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,56,49,10,69,78,67,79,68,73,78,71,32,49, 48,56,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,56,50,10,69,78,67,79,68,73,78,71,32,49,48,56, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,48, 10,56,56,10,56,56,10,56,56,10,70,48,10,56,48,10, 56,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,56, 51,10,69,78,67,79,68,73,78,71,32,49,48,56,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,48,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,56,52,10, 69,78,67,79,68,73,78,71,32,49,48,57,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,65,56,10, 50,48,10,50,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,56,53,10,69,78, 67,79,68,73,78,71,32,49,48,57,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,56,56,10,56,56,10,56,56, 10,57,56,10,54,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,56,54,10,69,78,67,79, 68,73,78,71,32,49,48,57,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,55,48,10,65,56,10,65,56,10,65, 56,10,65,56,10,55,48,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,56,55,10,69,78,67,79,68,73, 78,71,32,49,48,57,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,53,48,10,50,48,10,53,48,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,56,56,10,69,78,67,79,68,73,78,71, 32,49,48,57,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,57,48,10,57,48,10,57,48,10,57,48,10,57,48, 10,70,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,56,57,10,69,78,67,79,68,73,78,71,32,49, 48,57,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,56,10,56,56,10,56,56,10,55,56,10,48,56,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 48,57,48,10,69,78,67,79,68,73,78,71,32,49,48,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,48,57, 49,10,69,78,67,79,68,73,78,71,32,49,48,57,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,65,56,10,65, 56,10,65,56,10,65,56,10,65,56,10,70,56,10,48,56, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,57,50,10, 69,78,67,79,68,73,78,71,32,49,48,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,67,48,10,52,48,10, 55,48,10,52,56,10,52,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,57,51,10,69,78, 67,79,68,73,78,71,32,49,48,57,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,56,56,10,56,56,10,69,56, 10,57,56,10,57,56,10,69,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,48,57,52,10,69,78,67,79, 68,73,78,71,32,49,49,48,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,48,10,56,48,10,70,48,10,56, 56,10,56,56,10,70,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,48,57,53,10,69,78,67,79,68,73, 78,71,32,49,49,48,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,48,10,48,56,10,51,56,10,48,56,10, 48,56,10,70,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,48,57,54,10,69,78,67,79,68,73,78,71, 32,49,49,48,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,57,48,10,65,56,10,65,56,10,69,56,10,65,56, 10,57,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,48,57,55,10,69,78,67,79,68,73,78,71,32,49, 49,48,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,56,10,56,56,10,56,56,10,55,56,10,52,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,53, 48,10,69,78,67,79,68,73,78,71,32,49,49,48,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,55,49,10, 69,78,67,79,68,73,78,71,32,49,49,48,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,53,48,10,53,48,10,48,48,10,55,48,10,56,56,10, 70,56,10,56,48,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,57,57,10,69,78, 67,79,68,73,78,71,32,49,49,48,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,52, 48,10,69,48,10,52,48,10,53,48,10,54,56,10,52,56, 10,52,56,10,52,56,10,52,56,10,48,56,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,49,48,48,10,69,78,67,79, 68,73,78,71,32,49,49,48,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 52,48,10,48,48,10,70,56,10,56,56,10,56,48,10,56, 48,10,56,48,10,56,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,49,48,49,10,69,78,67,79,68,73, 78,71,32,49,49,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,56,48,10,69,48,10,56,48,10, 56,48,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,49,48,50,10,69,78,67,79,68,73,78,71, 32,49,49,48,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,54,48,10,49,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,49,48,51,10,69,78,67,79,68,73,78,71,32,49, 49,49,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,48,10,48,48,10, 54,48,10,50,48,10,50,48,10,50,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 49,48,52,10,69,78,67,79,68,73,78,71,32,49,49,49, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,48,48,10,54,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,49,48, 53,10,69,78,67,79,68,73,78,71,32,49,49,49,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,49,48,10,48,48,10,51,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,57,48,10,57,48, 10,54,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,49,48,54,10, 69,78,67,79,68,73,78,71,32,49,49,49,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,54,48,10,65,48,10, 66,48,10,65,56,10,65,56,10,66,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,49,48,55,10,69,78, 67,79,68,73,78,71,32,49,49,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,65,48,10,65,48,10,70,48, 10,65,56,10,65,56,10,66,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,49,48,56,10,69,78,67,79, 68,73,78,71,32,49,49,49,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 69,48,10,52,48,10,53,48,10,54,56,10,52,56,10,52, 56,10,52,56,10,52,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,49,48,57,10,69,78,67,79,68,73, 78,71,32,49,49,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,52,48, 10,48,48,10,56,56,10,57,48,10,69,48,10,57,48,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,53,68,10,69,78,67,79,68,73,78,71,32,49, 49,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,50,48,10,48,48,10, 56,56,10,56,56,10,57,56,10,65,56,10,67,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 49,49,48,10,69,78,67,79,68,73,78,71,32,49,49,49, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,55,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,57,56,10,54,56,10,48,56,10, 56,56,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,49,48,49,57, 51,10,69,78,67,79,68,73,78,71,32,49,49,49,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,70,56,10,50,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,54,48,10,69,78, 67,79,68,73,78,71,32,49,49,50,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,53, 48,10,56,56,10,56,56,10,56,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,53,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,54,49,10,69,78,67,79,68,73, 78,71,32,49,49,50,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,53,48,10,56,56,10,65,56,10,65,56,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,49,52,54,10,69,78,67,79,68,73,78,71, 32,49,49,50,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,70,48,10,52, 48,10,52,48,10,55,48,10,52,56,10,52,56,10,52,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,49,57,52,10,69,78,67,79,68,73,78,71,32,49, 49,50,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,52,48,10,52,48,10, 69,48,10,52,48,10,55,48,10,52,56,10,52,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,54, 52,10,69,78,67,79,68,73,78,71,32,49,49,50,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,57,56,10,65,48,10,65,48,10,65,48,10,70, 56,10,65,48,10,65,48,10,65,48,10,57,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,54,53,10,69,78, 67,79,68,73,78,71,32,49,49,50,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,57,56,10,65,48,10,70,56, 10,65,48,10,65,48,10,57,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,54,54,10,69,78,67,79,68,73, 78,71,32,49,49,50,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,53,48,10,53,48,10,53,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,54,55,10,69,78,67,79,68,73,78,71,32,49, 49,50,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,53,48,10,53,48,10,56,56,10,65,56,10,65, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,54, 56,10,69,78,67,79,68,73,78,71,32,49,49,50,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,57,48,10,57,48,10,57,48,10,66,56,10,70, 56,10,66,56,10,66,56,10,66,56,10,66,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,54,57,10,69,78, 67,79,68,73,78,71,32,49,49,50,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,57,48,10,57,48,10,70,56, 10,66,56,10,66,56,10,66,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,54,65,10,69,78,67,79,68,73, 78,71,32,49,49,51,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,56,10,56,56, 10,53,48,10,53,48,10,55,48,10,65,56,10,65,56,10, 65,56,10,65,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,54,66,10,69,78,67,79,68,73,78,71,32,49, 49,51,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,53,48,10,53,48,10,55,48,10,65,56,10,65, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,54, 67,10,69,78,67,79,68,73,78,71,32,49,49,51,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,66,56,10,65,56,10,65,56,10,65,56,10,70, 48,10,66,56,10,68,52,10,68,52,10,68,52,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,54,68,10,69,78, 67,79,68,73,78,71,32,49,49,51,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,66,56,10,65,56,10,57,48, 10,70,56,10,66,56,10,66,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,54,69,10,69,78,67,79,68,73, 78,71,32,49,49,51,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,56,10,51,48,10,48,48, 10,55,48,10,56,56,10,48,56,10,51,48,10,48,56,10, 48,56,10,55,48,10,56,48,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,54,70,10,69,78,67,79,68,73,78,71,32,49, 49,51,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,56,10,51,48,10,48,48,10, 55,48,10,56,56,10,51,48,10,48,56,10,48,56,10,55, 48,10,56,48,10,55,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,55, 48,10,69,78,67,79,68,73,78,71,32,49,49,51,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,65,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,55,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,55,49,10,69,78, 67,79,68,73,78,71,32,49,49,51,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,55,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,49,48,49,52,55,10,69,78,67,79, 68,73,78,71,32,49,49,51,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,49,48,49,57,53,10,69,78,67,79,68,73, 78,71,32,49,49,51,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,51,48,10,52,56,10,55,56,10,52,56,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,49,48,49,52,56,10,69,78,67,79,68,73,78,71, 32,49,49,52,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,57,56,10,57,48,10,57, 48,10,57,48,10,53,48,10,53,48,10,53,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 49,48,49,57,54,10,69,78,67,79,68,73,78,71,32,49, 49,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 57,56,10,57,48,10,57,48,10,53,48,10,53,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,55, 54,10,69,78,67,79,68,73,78,71,32,49,49,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 57,48,10,52,56,10,48,48,10,57,67,10,57,48,10,57, 48,10,53,48,10,53,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,55,55,10,69,78, 67,79,68,73,78,71,32,49,49,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,57, 48,10,52,56,10,48,48,10,57,56,10,57,48,10,57,48, 10,53,48,10,53,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,55,56,10,69,78,67,79,68,73, 78,71,32,49,49,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,48,10,65,48, 10,65,48,10,66,56,10,66,56,10,66,56,10,66,56,10, 66,56,10,53,56,10,48,56,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,55,57,10,69,78,67,79,68,73,78,71,32,49, 49,52,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 53,56,10,66,56,10,66,56,10,66,56,10,66,56,10,53, 56,10,48,56,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,55, 65,10,69,78,67,79,68,73,78,71,32,49,49,52,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 50,48,10,55,48,10,65,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,65,56,10,55,48,10,50,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,55,66,10,69,78, 67,79,68,73,78,71,32,49,49,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,55,48,10,65,56,10,56,56, 10,56,56,10,65,56,10,55,48,10,50,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,55,67,10,69,78,67,79,68,73, 78,71,32,49,49,52,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,54,48,10,57,56,10,54,48,10,48,48, 10,53,48,10,56,56,10,65,56,10,65,56,10,65,56,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,55,68,10,69,78,67,79,68,73,78,71,32,49, 49,52,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,54,48,10,57,56,10,54,48,10,48,48,10, 53,48,10,56,56,10,65,56,10,65,56,10,65,56,10,53, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,55, 69,10,69,78,67,79,68,73,78,71,32,49,49,53,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 70,56,10,65,56,10,48,48,10,53,48,10,56,56,10,65, 56,10,65,56,10,65,56,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,55,70,10,69,78, 67,79,68,73,78,71,32,49,49,53,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,65,56,10,48,48,10,53,48,10,56,56,10,65,56, 10,65,56,10,65,56,10,53,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,56,48,10,69,78,67,79,68,73, 78,71,32,49,49,53,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,55,48,10,49,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,56,49,10,69,78,67,79,68,73,78,71,32,49, 49,53,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,56,48,10,56,48,10,55,48,10,49, 48,10,49,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,56, 50,10,69,78,67,79,68,73,78,71,32,49,49,53,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,56,10,49,48,10,66,48,10,52, 56,10,52,48,10,65,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,56,51,10,69,78, 67,79,68,73,78,71,32,49,49,53,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,52,10,70,67,10,56, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,56,52,10,69,78,67,79,68,73, 78,71,32,49,49,53,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,55,48,10,56,67,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,56,53,10,69,78,67,79,68,73,78,71,32,49, 49,53,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,55,48,10,67,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,56, 54,10,69,78,67,79,68,73,78,71,32,49,49,53,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 55,48,10,57,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,56,56,10,69,78, 67,79,68,73,78,71,32,49,49,54,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,52,48,10,65,48,10,48, 56,10,49,52,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,52,48,10,65,48,10,48,56,10,49,52,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,56,57,10,69,78,67,79,68,73, 78,71,32,49,49,54,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,52,48,10,56,52,10,67,56,10,48,67, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 52,48,10,56,52,10,67,56,10,48,67,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,56,65,10,69,78,67,79,68,73,78,71,32,49, 49,54,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,56,56,10,55,48,10,48,48,10,56,56,10, 57,56,10,57,56,10,65,56,10,67,56,10,67,56,10,56, 56,10,49,48,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,56, 66,10,69,78,67,79,68,73,78,71,32,49,49,54,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,55,48,10,48,48,10,56,56,10,56, 56,10,57,56,10,65,56,10,67,56,10,56,56,10,49,48, 10,49,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,56,67,10,69,78, 67,79,68,73,78,71,32,49,49,54,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,52, 48,10,52,48,10,69,48,10,52,48,10,55,48,10,52,56, 10,52,56,10,52,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,56,68,10,69,78,67,79,68,73, 78,71,32,49,49,54,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,52,48,10,69,48,10,52,48,10,55,48,10,52,56,10, 52,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,56,69,10,69,78,67,79,68,73,78,71,32,49, 49,54,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,56,56,10,56,56,10, 56,56,10,65,56,10,70,48,10,56,56,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,56, 70,10,69,78,67,79,68,73,78,71,32,49,49,54,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,48,10,56, 56,10,56,56,10,65,56,10,70,48,10,56,56,10,56,48, 10,56,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,49,48,48,53,48,10, 69,78,67,79,68,73,78,71,32,49,49,54,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,56, 10,70,56,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,49,48,48,57,56,10,69,78, 67,79,68,73,78,71,32,49,49,54,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,70,56,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,57,50,10,69,78,67,79,68,73, 78,71,32,49,49,55,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,56,10,52,56, 10,52,48,10,52,48,10,69,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,57,51,10,69,78,67,79,68,73,78,71,32,49, 49,55,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,56,10,52,56,10,69,48,10,52,48,10,52,48,10,52, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,57, 52,10,69,78,67,79,68,73,78,71,32,49,49,55,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,56,48,10,56,48,10,56,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,49,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,57,53,10,69,78, 67,79,68,73,78,71,32,49,49,55,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,56,48,10,70,48, 10,56,56,10,56,56,10,56,56,10,49,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,57,54,10,69,78,67,79,68,73, 78,71,32,49,49,55,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,65,56,10,65,56, 10,65,56,10,55,48,10,50,48,10,55,48,10,65,56,10, 65,56,10,65,67,10,48,52,10,48,52,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,57,55,10,69,78,67,79,68,73,78,71,32,49, 49,55,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 65,56,10,65,56,10,55,48,10,55,48,10,65,56,10,65, 67,10,48,52,10,48,52,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,57, 56,10,69,78,67,79,68,73,78,71,32,49,49,55,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,48,56,10,48,56,10,51, 48,10,48,56,10,48,56,10,56,56,10,55,48,10,50,48, 10,52,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,57,57,10,69,78, 67,79,68,73,78,71,32,49,49,55,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,51,48, 10,48,56,10,56,56,10,55,48,10,50,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,57,65,10,69,78,67,79,68,73, 78,71,32,49,49,55,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,57,48,10,57,48, 10,65,48,10,65,48,10,67,48,10,65,48,10,57,48,10, 57,48,10,57,56,10,48,56,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,57,66,10,69,78,67,79,68,73,78,71,32,49, 49,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 57,48,10,65,48,10,67,48,10,65,48,10,57,48,10,57, 56,10,48,56,10,48,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,57, 67,10,69,78,67,79,68,73,78,71,32,49,49,56,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,65,56,10,66,48,10,65,48,10,69, 48,10,65,48,10,66,48,10,65,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,57,68,10,69,78, 67,79,68,73,78,71,32,49,49,56,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,65,56,10,66,48,10,69,48, 10,66,48,10,65,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,57,69,10,69,78,67,79,68,73, 78,71,32,49,49,56,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,56,10,69,56, 10,53,48,10,54,48,10,54,48,10,54,48,10,53,48,10, 52,56,10,52,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,57,70,10,69,78,67,79,68,73,78,71,32,49, 49,56,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,52,48,10,69,48,10, 52,56,10,53,48,10,54,48,10,53,48,10,52,56,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,65, 48,10,69,78,67,79,68,73,78,71,32,49,49,56,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,67,56,10,52,56,10,53,48,10,54,48,10,54, 48,10,54,48,10,53,48,10,52,56,10,52,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,65,49,10,69,78, 67,79,68,73,78,71,32,49,49,56,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,67,56,10,53,48,10,54,48, 10,53,48,10,52,56,10,52,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,65,50,10,69,78,67,79,68,73, 78,71,32,49,49,56,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,57,48,10,57,48, 10,57,48,10,57,48,10,70,48,10,57,48,10,57,48,10, 57,48,10,57,56,10,48,56,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,65,51,10,69,78,67,79,68,73,78,71,32,49, 49,56,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 57,48,10,57,48,10,70,48,10,57,48,10,57,48,10,57, 56,10,48,56,10,48,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,65, 52,10,69,78,67,79,68,73,78,71,32,49,49,56,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,66,56,10,65,48,10,65,48,10,65,48,10,69, 48,10,65,48,10,65,48,10,65,48,10,65,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,65,53,10,69,78, 67,79,68,73,78,71,32,49,49,56,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,66,56,10,65,48,10,69,48, 10,65,48,10,65,48,10,65,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,65,54,10,69,78,67,79,68,73, 78,71,32,49,49,57,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,69,48,10,65,48, 10,65,48,10,65,48,10,66,48,10,65,56,10,65,56,10, 65,56,10,65,56,10,48,56,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,65,55,10,69,78,67,79,68,73,78,71,32,49, 49,57,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,48,10,65,48,10,66,48,10,65,56,10,65,56,10,65, 56,10,48,56,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,65, 56,10,69,78,67,79,68,73,78,71,32,49,49,57,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,48,10,57,48,10,65, 56,10,65,56,10,65,56,10,55,48,10,50,48,10,49,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,65,57,10,69,78, 67,79,68,73,78,71,32,49,49,57,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,48,10,57,48, 10,65,56,10,55,48,10,50,48,10,49,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,65,65,10,69,78,67,79,68,73, 78,71,32,49,49,57,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,56,10,55,48,10,50,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,65,66,10,69,78,67,79,68,73,78,71,32,49, 49,57,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,56,48,10,56,48,10,56,56,10,55, 48,10,50,48,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,65, 67,10,69,78,67,79,68,73,78,71,32,49,49,57,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,51,48,10,49,48, 10,49,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,65,68,10,69,78, 67,79,68,73,78,71,32,49,49,57,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,65,56,10,50,48, 10,50,48,10,50,48,10,51,48,10,49,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,65,69,10,69,78,67,79,68,73, 78,71,32,49,49,57,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,53,48,10,53,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,65,70,10,69,78,67,79,68,73,78,71,32,49, 49,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,56,10,56,56,10,53,48,10,53,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,66, 48,10,69,78,67,79,68,73,78,71,32,49,50,48,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,53,48,10,53,48,10,50, 48,10,70,56,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,66,49,10,69,78, 67,79,68,73,78,71,32,49,50,48,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,56,56,10,56,56,10,53,48, 10,53,48,10,50,48,10,70,56,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,66,50,10,69,78,67,79,68,73, 78,71,32,49,50,48,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,53,48,10,53,48,10,50,48,10,53,48,10,53,48,10, 56,56,10,56,67,10,48,52,10,48,52,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,66,51,10,69,78,67,79,68,73,78,71,32,49, 50,48,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,56,10,53,48,10,50,48,10,53,48,10,56,56,10,56, 67,10,48,52,10,48,52,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,66, 52,10,69,78,67,79,68,73,78,71,32,49,50,48,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,69,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,52,56,10,52,56,10,52,56,10,55,56,10,48,56, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,66,53,10,69,78, 67,79,68,73,78,71,32,49,50,48,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,55,56,10,48,56,10,48,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,66,54,10,69,78,67,79,68,73, 78,71,32,49,50,48,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,57,48,10,57,48, 10,57,48,10,57,48,10,57,48,10,55,48,10,49,48,10, 49,48,10,49,56,10,48,56,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,66,55,10,69,78,67,79,68,73,78,71,32,49, 50,48,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 57,48,10,57,48,10,57,48,10,55,48,10,49,48,10,49, 56,10,48,56,10,48,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,66, 56,10,69,78,67,79,68,73,78,71,32,49,50,48,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,56,56,10,65,56,10,65, 56,10,55,56,10,50,56,10,50,56,10,48,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,66,57,10,69,78, 67,79,68,73,78,71,32,49,50,48,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,56,56,10,56,56,10,65,56, 10,55,56,10,50,56,10,48,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,66,65,10,69,78,67,79,68,73, 78,71,32,49,50,49,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,48,10,56,48, 10,56,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,66,66,10,69,78,67,79,68,73,78,71,32,49, 50,49,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,69,48,10,57,48,10,57,48,10,57,48,10,57, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,66, 67,10,69,78,67,79,68,73,78,71,32,49,50,49,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,51,48,10,52,56,10,52,56,10,52,56,10,70, 56,10,52,48,10,52,48,10,52,56,10,51,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,66,68,10,69,78, 67,79,68,73,78,71,32,49,50,49,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,52,56,10,70,56, 10,52,48,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,66,69,10,69,78,67,79,68,73, 78,71,32,49,50,49,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,48,10,52,56, 10,52,56,10,52,56,10,70,56,10,52,48,10,52,48,10, 52,56,10,51,48,10,50,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,66,70,10,69,78,67,79,68,73,78,71,32,49, 50,49,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 51,48,10,52,56,10,70,56,10,52,48,10,52,56,10,51, 48,10,50,48,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,67, 48,10,69,78,67,79,68,73,78,71,32,49,50,49,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,67,49,10,69,78, 67,79,68,73,78,71,32,49,50,49,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,56,56,10,55,48,10,48, 48,10,65,56,10,65,56,10,65,56,10,55,48,10,55,48, 10,65,56,10,65,56,10,65,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,67,50,10,69,78,67,79,68,73, 78,71,32,49,50,49,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,55,48, 10,48,48,10,65,56,10,65,56,10,55,48,10,55,48,10, 65,56,10,65,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,67,51,10,69,78,67,79,68,73,78,71,32,49, 50,49,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,57,48,10, 65,48,10,67,48,10,65,48,10,57,48,10,56,56,10,56, 56,10,48,56,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,67, 52,10,69,78,67,79,68,73,78,71,32,49,50,50,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,57, 48,10,69,48,10,57,48,10,56,56,10,56,56,10,48,56, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,67,53,10,69,78, 67,79,68,73,78,71,32,49,50,50,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 56,10,52,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,56,56,10,56,56,10,49,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,67,54,10,69,78,67,79,68,73, 78,71,32,49,50,50,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,51,56,10,52,56,10,52,56,10,52,56,10, 52,56,10,56,56,10,49,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,67,55,10,69,78,67,79,68,73,78,71,32,49, 50,50,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,48,56,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,67, 56,10,69,78,67,79,68,73,78,71,32,49,50,50,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,70,56,10,56,56,10,56,56,10,56,56,10,48,56, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,67,57,10,69,78, 67,79,68,73,78,71,32,49,50,50,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,70,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,49,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,67,65,10,69,78,67,79,68,73, 78,71,32,49,50,50,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,70,56,10,56,56,10, 56,56,10,56,56,10,49,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,67,66,10,69,78,67,79,68,73,78,71,32,49, 50,50,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,56,10,48,56,10,48,56,10,49, 56,10,49,48,10,49,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,67, 67,10,69,78,67,79,68,73,78,71,32,49,50,50,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,55,56,10,48,56,10,49,56,10,49,48, 10,49,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,67,68,10,69,78, 67,79,68,73,78,71,32,49,50,50,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,68,56,10,68,56,10,65,56,10,65,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,49,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,67,69,10,69,78,67,79,68,73, 78,71,32,49,50,51,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,68,56,10,65,56,10,65,56,10, 56,56,10,56,56,10,49,48,10,49,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,68,48,10,69,78,67,79,68,73,78,71,32,49, 50,51,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,56,56,10,55,48,10,48,48,10,50,48,10, 53,48,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,68, 49,10,69,78,67,79,68,73,78,71,32,49,50,51,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,55,48,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,68,50,10,69,78, 67,79,68,73,78,71,32,49,50,51,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,53,48,10,53, 48,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,68,51,10,69,78,67,79,68,73, 78,71,32,49,50,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,53,48, 10,48,48,10,55,48,10,48,56,10,55,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,68,52,10,69,78,67,79,68,73,78,71,32,49, 50,51,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,53,56,10,65,48,10,65,48,10, 65,48,10,66,48,10,69,48,10,65,48,10,65,48,10,66, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,52,68, 53,10,69,78,67,79,68,73,78,71,32,49,50,51,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,50, 56,10,55,48,10,65,48,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,52,68,54,10,69,78, 67,79,68,73,78,71,32,49,50,51,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,56,56,10,55, 48,10,48,48,10,70,56,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,52,68,55,10,69,78,67,79,68,73, 78,71,32,49,50,51,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,55,48, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,52,68,56,10,69,78,67,79,68,73,78,71,32,49, 50,52,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,56,56,10,48,56,10, 48,56,10,70,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,49,48, 56,52,54,10,69,78,67,79,68,73,78,71,32,49,50,52, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,48,56,10,70,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,68,65,10, 69,78,67,79,68,73,78,71,32,49,50,52,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,55,48,10,56,56,10,48,56,10, 70,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,68,66,10,69,78,67,79, 68,73,78,71,32,49,50,52,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,56,56,10,48,56,10,70, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,68,67,10,69,78,67,79,68,73,78,71, 32,49,50,52,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,65, 56,10,65,56,10,55,48,10,50,48,10,55,48,10,65,56, 10,65,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,68,68,10,69,78,67,79,68,73,78,71,32,49,50,52, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,48,48,10,65,56, 10,65,56,10,55,48,10,55,48,10,65,56,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,68,69,10, 69,78,67,79,68,73,78,71,32,49,50,52,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,55,48,10,56,56,10,48,56,10, 51,48,10,48,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,68,70,10,69,78,67,79, 68,73,78,71,32,49,50,52,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,56,56,10,51,48,10,48, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,69,48,10,69,78,67,79,68,73,78,71, 32,49,50,52,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,48,56,10,49, 48,10,50,48,10,55,48,10,48,56,10,48,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,69,49,10,69,78,67,79,68,73,78,71,32,49,50,52, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,49,48,10,50,48,10,55,48,10,48,56,10,48,56,10, 56,56,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,69,50,10, 69,78,67,79,68,73,78,71,32,49,50,53,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,48,48,10,56,56,10,57,56,10,57,56,10, 65,56,10,67,56,10,67,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,69,51,10,69,78,67,79, 68,73,78,71,32,49,50,53,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,48,10,56,56,10,56,56,10,57,56,10,65, 56,10,67,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,69,52,10,69,78,67,79,68,73,78,71, 32,49,50,53,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,56, 56,10,57,56,10,57,56,10,65,56,10,67,56,10,67,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,69,53,10,69,78,67,79,68,73,78,71,32,49,50,53, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,48,48,10,56,56, 10,56,56,10,57,56,10,65,56,10,67,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,69,54,10, 69,78,67,79,68,73,78,71,32,49,50,53,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,69,55,10,69,78,67,79, 68,73,78,71,32,49,50,53,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,69,56,10,69,78,67,79,68,73,78,71, 32,49,50,53,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,69,56,10,66,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,69,57,10,69,78,67,79,68,73,78,71,32,49,50,53, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,69,56,10,66,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,69,65,10, 69,78,67,79,68,73,78,71,32,49,50,53,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,55,48,10,56,56,10,69,56,10, 66,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,69,66,10,69,78,67,79, 68,73,78,71,32,49,50,53,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,56,56,10,69,56,10,66, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,69,67,10,69,78,67,79,68,73,78,71, 32,49,50,54,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,69, 48,10,49,48,10,48,56,10,55,56,10,48,56,10,49,48, 10,69,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,69,68,10,69,78,67,79,68,73,78,71,32,49,50,54, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,48,48,10,70,48, 10,48,56,10,51,56,10,48,56,10,48,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,69,69,10, 69,78,67,79,68,73,78,71,32,49,50,54,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,48,48,10,56,56,10,56,56,10,57,56,10, 54,56,10,48,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,69,70,10,69,78,67,79, 68,73,78,71,32,49,50,54,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,48,10,56,56,10,56,56,10,56,56,10,57, 56,10,54,56,10,48,56,10,56,56,10,55,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,70,48,10,69,78,67,79,68,73,78,71, 32,49,50,54,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,56, 56,10,56,56,10,57,56,10,54,56,10,48,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,70,49,10,69,78,67,79,68,73,78,71,32,49,50,54, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,57,56,10,54,56,10,48,56,10, 56,56,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,70,50,10, 69,78,67,79,68,73,78,71,32,49,50,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,52,56, 10,57,48,10,48,48,10,56,56,10,56,56,10,57,56,10, 54,56,10,48,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,70,51,10,69,78,67,79, 68,73,78,71,32,49,50,54,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,56,10, 57,48,10,48,48,10,56,56,10,56,56,10,56,56,10,57, 56,10,54,56,10,48,56,10,56,56,10,55,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,52,70,52,10,69,78,67,79,68,73,78,71, 32,49,50,54,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,53,48,10,53,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,55,56,10,48,56,10,48,56, 10,48,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 52,70,53,10,69,78,67,79,68,73,78,71,32,49,50,54, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,55,56,10,48,56,10,48,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,52,70,56,10, 69,78,67,79,68,73,78,71,32,49,50,55,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,53,48,10,48,48,10,56,56,10,56,56,10,69,56,10, 57,56,10,57,56,10,57,56,10,69,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,52,70,57,10,69,78,67,79, 68,73,78,71,32,49,50,55,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 53,48,10,48,48,10,56,56,10,56,56,10,69,56,10,57, 56,10,57,56,10,69,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,48,48,10,69,78,67,79,68,73,78,71, 32,49,50,56,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,56,10,48,56,10,48, 56,10,55,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,48,49,10,69,78,67,79,68,73,78,71,32,49,50,56, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,56,10,48,56,10,48,56,10,51,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,48,50,10, 69,78,67,79,68,73,78,71,32,49,50,56,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,50,48,10,50,48,10,54,48,10,65,48,10, 65,56,10,65,56,10,65,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,48,51,10,69,78,67,79, 68,73,78,71,32,49,50,56,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,54,48,10,65,48,10,65, 56,10,65,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,48,52,10,69,78,67,79,68,73,78,71, 32,49,50,56,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,65,48,10,50, 48,10,50,48,10,50,48,10,52,56,10,50,56,10,50,56, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,48,53,10,69,78,67,79,68,73,78,71,32,49,50,56, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,67,48, 10,50,48,10,50,48,10,52,56,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,48,54,10, 69,78,67,79,68,73,78,71,32,49,50,56,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,48,10,57,48,10,49,48,10,49,48,10,49,48,10, 54,48,10,49,48,10,49,48,10,49,48,10,48,56,10,48, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,48,55,10,69,78,67,79, 68,73,78,71,32,49,50,56,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,48,10,49,48,10,49,48,10,54, 48,10,49,48,10,49,48,10,48,56,10,48,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,48,56,10,69,78,67,79,68,73,78,71, 32,49,50,56,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,54,48,10,65,48,10,65, 48,10,65,48,10,65,48,10,65,56,10,65,56,10,65,56, 10,57,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,48,57,10,69,78,67,79,68,73,78,71,32,49,50,56, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,54,48, 10,65,48,10,65,48,10,65,56,10,65,56,10,57,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,48,65,10, 69,78,67,79,68,73,78,71,32,49,50,57,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,65,48,10,65,48,10,65,48,10,65,48,10,69,48,10, 65,56,10,65,56,10,65,56,10,57,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,48,66,10,69,78,67,79, 68,73,78,71,32,49,50,57,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,65,48,10,65,48,10,69,48,10,65, 56,10,65,56,10,57,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,48,67,10,69,78,67,79,68,73,78,71, 32,49,50,57,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 48,10,56,48,10,56,48,10,57,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,48,68,10,69,78,67,79,68,73,78,71,32,49,50,57, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,48,10,57,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,48,69,10, 69,78,67,79,68,73,78,71,32,49,50,57,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,56,10,50,56,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,48,70,10,69,78,67,79, 68,73,78,71,32,49,50,57,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,50,48,10,50,48,10,50, 56,10,50,56,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,51,49,10,69,78,67,79,68,73,78,71, 32,49,51,50,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,48,10,65,48,10,65, 48,10,65,48,10,65,48,10,65,48,10,65,48,10,66,48, 10,52,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,51,50,10,69,78,67,79,68,73,78,71,32,49,51,51, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,56,48, 10,70,48,10,56,56,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,51,51,10, 69,78,67,79,68,73,78,71,32,49,51,51,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,48,10,65,48,10,65,48,10,65,48,10,55,48,10, 50,56,10,50,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,51,52,10,69,78,67,79, 68,73,78,71,32,49,51,51,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 65,48,10,65,48,10,50,48,10,51,48,10,50,56,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,51,53,10,69,78,67,79,68,73,78,71, 32,49,51,51,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,70, 48,10,56,56,10,56,48,10,56,48,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,51,54,10,69,78,67,79,68,73,78,71,32,49,51,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,54,48,10,57,48,10,57,48,10,57,48, 10,55,48,10,49,48,10,65,48,10,70,48,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,51,55,10, 69,78,67,79,68,73,78,71,32,49,51,51,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,56,48,10,70,48,10,56,56,10, 56,48,10,56,48,10,56,48,10,55,48,10,48,56,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,51,56,10,69,78,67,79, 68,73,78,71,32,49,51,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,48,10, 57,48,10,57,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,70,48,10,48,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,51,57,10,69,78,67,79,68,73,78,71, 32,49,51,51,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,54,48,10,57,48,10,57, 48,10,66,56,10,68,48,10,68,48,10,65,48,10,56,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,51,65,10,69,78,67,79,68,73,78,71,32,49,51,51, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,55,56,10,57,48,10,57,48,10,57,48,10,54,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,51,66,10, 69,78,67,79,68,73,78,71,32,49,51,51,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,56,48,10,70,48,10,56,56,10, 56,56,10,56,48,10,56,48,10,56,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,51,67,10,69,78,67,79, 68,73,78,71,32,49,51,52,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,55,48,10,48,56,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,51,68,10,69,78,67,79,68,73,78,71, 32,49,51,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,69, 56,10,65,56,10,65,56,10,57,48,10,56,48,10,56,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,51,69,10,69,78,67,79,68,73,78,71,32,49,51,52, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,51,70,10, 69,78,67,79,68,73,78,71,32,49,51,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,56,10,48,56,10,48,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,52,48,10,69,78,67,79, 68,73,78,71,32,49,51,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 50,48,10,49,48,10,50,48,10,52,48,10,56,48,10,67, 48,10,51,48,10,48,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,52,49,10,69,78,67,79,68,73,78,71, 32,49,51,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,51,48,10,52,56,10,52, 56,10,52,56,10,51,56,10,48,56,10,55,48,10,57,48, 10,54,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,52,50,10,69,78,67,79,68,73,78,71,32,49,51,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,48,10,65,48,10,65,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,51,48,10, 48,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,52,51,10, 69,78,67,79,68,73,78,71,32,49,51,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,49,48,10,49,48,10,69,48,10,53,48,10, 53,48,10,56,56,10,56,56,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,52,52,10,69,78,67,79, 68,73,78,71,32,49,51,52,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,66,56,10, 65,56,10,65,48,10,65,48,10,65,48,10,65,48,10,65, 48,10,65,48,10,52,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,52,53,10,69,78,67,79,68,73,78,71, 32,49,51,52,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,50,56,10,51,48,10,50,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,52,54,10,69,78,67,79,68,73,78,71,32,49,51,53, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,48,10,56,48,10,67,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,56,10,51,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,52,55,10, 69,78,67,79,68,73,78,71,32,49,51,53,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,56,10,70,48,10,52,48,10,56,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,52,56,10,69,78,67,79, 68,73,78,71,32,49,51,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,52,57,10,69,78,67,79,68,73,78,71, 32,49,51,53,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,55,56,10,49,48,10,49,48,10,50,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,52,65,10,69,78,67,79,68,73,78,71,32,49,51,53, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,65,56,10,65,56,10,65,56, 10,50,56,10,50,56,10,48,56,10,48,56,10,48,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,52,66,10, 69,78,67,79,68,73,78,71,32,49,51,53,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,48,10,57,48,10,57,48,10,57,48,10,53,48,10, 51,48,10,65,48,10,70,48,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,52,67,10,69,78,67,79, 68,73,78,71,32,49,51,53,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 65,48,10,65,48,10,66,48,10,65,56,10,65,56,10,65, 48,10,65,48,10,65,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,52,68,10,69,78,67,79,68,73,78,71, 32,49,51,53,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,52,69,10,69,78,67,79,68,73,78,71,32,49,51,53, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,65,48,10,65,48, 10,65,48,10,65,48,10,54,48,10,50,48,10,51,48,10, 48,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,52,70,10, 69,78,67,79,68,73,78,71,32,49,51,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,48,10,56,48,10,55,48,10, 48,56,10,48,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,53,48,10,69,78,67,79, 68,73,78,71,32,49,51,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,56,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,53,49,10,69,78,67,79,68,73,78,71, 32,49,51,54,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,55,48,10,56,56,10,48,56,10,48,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,53,50,10,69,78,67,79,68,73,78,71,32,49,51,54, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,69,48, 10,57,48,10,57,48,10,56,56,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,53,51,10, 69,78,67,79,68,73,78,71,32,49,51,54,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,55,48,10,65,56,10,65,56,10,65,56,10, 65,56,10,55,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,53,52,10,69,78,67,79, 68,73,78,71,32,49,51,54,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 50,56,10,50,56,10,51,48,10,65,48,10,55,48,10,50, 56,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,53,53,10,69,78,67,79,68,73,78,71, 32,49,51,54,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,53,54,10,69,78,67,79,68,73,78,71,32,49,51,54, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,48,10,65,48,10,65,48,10,55,48, 10,50,56,10,50,56,10,65,56,10,65,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,53,57,10, 69,78,67,79,68,73,78,71,32,49,51,54,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,50,48, 10,52,48,10,52,48,10,50,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,53,65,10,69,78,67,79, 68,73,78,71,32,49,51,55,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,48,10, 49,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,53,66,10,69,78,67,79,68,73,78,71, 32,49,51,55,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,53,67,10,69,78,67,79,68,73,78,71,32,49,51,55, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,56,10,55,48,10,56,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,53,68,10, 69,78,67,79,68,73,78,71,32,49,51,55,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,49,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,53,69,10,69,78,67,79, 68,73,78,71,32,49,51,55,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,65,56,10,65,56,10,57,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,53,70,10,69,78,67,79,68,73,78,71, 32,49,51,55,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,67,48,10,56,56,10,55, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,54,49,10,69,78,67,79,68,73,78,71,32,49,51,55, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,53,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,54,50,10, 69,78,67,79,68,73,78,71,32,49,51,55,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,48,10,56,56,10, 56,56,10,56,56,10,56,48,10,70,56,10,56,48,10,56, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,54,51,10,69,78,67,79, 68,73,78,71,32,49,51,55,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,57,48,10,57,48,10,57, 48,10,57,48,10,55,56,10,49,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,54,52,10,69,78,67,79,68,73,78,71, 32,49,51,56,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,65,48,10,68,48,10,57,48,10,57,48,10,57,48, 10,57,56,10,49,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,54,53,10,69,78,67,79,68,73,78,71,32,49,51,56, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,70,56, 10,56,48,10,56,56,10,56,56,10,67,56,10,66,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,54,54,10, 69,78,67,79,68,73,78,71,32,49,51,56,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,48,10,57,48,10, 57,48,10,57,48,10,57,48,10,55,48,10,49,48,10,49, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,54,55,10,69,78,67,79, 68,73,78,71,32,49,51,56,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,70,56,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,55,48,10,48,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,54,56,10,69,78,67,79,68,73,78,71, 32,49,51,56,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,48,10,70,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,54,57,10,69,78,67,79,68,73,78,71,32,49,51,56, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,65,48, 10,68,48,10,57,48,10,66,56,10,68,48,10,65,48,10, 56,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,54,65,10, 69,78,67,79,68,73,78,71,32,49,51,56,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,49,48,10,49,48,10,55,56,10,57,48,10, 57,48,10,57,48,10,57,48,10,54,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,54,66,10,69,78,67,79, 68,73,78,71,32,49,51,56,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,65,48,10,68,48,10,57,48,10,57, 48,10,57,48,10,57,48,10,56,48,10,56,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,54,67,10,69,78,67,79,68,73,78,71, 32,49,51,56,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,67,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,51,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,54,68,10,69,78,67,79,68,73,78,71,32,49,51,56, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,69,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,57,48,10, 56,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,54,69,10, 69,78,67,79,68,73,78,71,32,49,51,57,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,56,48,10,52,48,10,50,48,10,55,56,10, 57,48,10,57,48,10,57,48,10,54,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,54,70,10,69,78,67,79, 68,73,78,71,32,49,51,57,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,56,10,48,56,10,48,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,55,48,10,69,78,67,79,68,73,78,71, 32,49,51,57,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,56, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,55,49,10,69,78,67,79,68,73,78,71,32,49,51,57, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,52,48,10,50,48,10,55,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,55,50,10, 69,78,67,79,68,73,78,71,32,49,51,57,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,65,48,10,68,48,10, 57,48,10,57,48,10,57,48,10,57,48,10,49,48,10,49, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,55,51,10,69,78,67,79, 68,73,78,71,32,49,51,57,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,48,10, 52,56,10,52,48,10,70,56,10,52,56,10,52,56,10,52, 56,10,53,56,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,55,52,10,69,78,67,79,68,73,78,71, 32,49,51,57,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,56,10,49,48,10,49, 48,10,57,48,10,57,48,10,57,48,10,57,48,10,66,48, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,55,53,10,69,78,67,79,68,73,78,71,32,49,51,57, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,49,56, 10,48,56,10,48,56,10,48,56,10,48,56,10,56,56,10, 56,56,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,55,54,10, 69,78,67,79,68,73,78,71,32,49,51,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,48,10,57,56,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,55,55,10,69,78,67,79, 68,73,78,71,32,49,51,57,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,51,48,10,52,56,10,48,56,10,48, 56,10,49,48,10,50,48,10,52,48,10,51,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,55,56,10,69,78,67,79,68,73,78,71, 32,49,52,48,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,55,57,10,69,78,67,79,68,73,78,71,32,49,52,48, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,52,48,10,50,48,10,50,48, 10,52,48,10,52,48,10,56,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,55,65,10, 69,78,67,79,68,73,78,71,32,49,52,48,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,53,56,10,48,56,10,48, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,55,66,10,69,78,67,79, 68,73,78,71,32,49,52,48,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,53,48,10,50,48,10,52,48,10,51,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,55,67,10,69,78,67,79,68,73,78,71, 32,49,52,48,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,65,48,10,68,48,10,57,48,10,57,48,10,57,48, 10,57,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,55,68,10,69,78,67,79,68,73,78,71,32,49,52,48, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,55,69,10, 69,78,67,79,68,73,78,71,32,49,52,48,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,49,48,10,49,48,10,57,48,10,57,48,10, 57,48,10,57,48,10,57,48,10,55,48,10,49,48,10,49, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,55,70,10,69,78,67,79, 68,73,78,71,32,49,52,48,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,66,48,10,65,56,10,65,56,10,65, 56,10,65,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,56,48,10,69,78,67,79,68,73,78,71, 32,49,52,48,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,66, 48,10,67,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,48,10,56,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,56,49,10,69,78,67,79,68,73,78,71,32,49,52,48, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,55,56,10,48,56,10, 56,56,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,56,50,10, 69,78,67,79,68,73,78,71,32,49,52,49,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,54,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,49,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,56,51,10,69,78,67,79, 68,73,78,71,32,49,52,49,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,66,48,10,65,56,10,65,56,10,65, 56,10,65,56,10,54,56,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,56,52,10,69,78,67,79,68,73,78,71, 32,49,52,49,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,56,10,50,48,10,50, 48,10,70,56,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,56,53,10,69,78,67,79,68,73,78,71,32,49,52,49, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,56,54,10, 69,78,67,79,68,73,78,71,32,49,52,49,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,48,10,65,48,10,65,48,10,55,48,10,50,56,10, 65,56,10,65,56,10,65,56,10,55,48,10,50,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,56,55,10,69,78,67,79, 68,73,78,71,32,49,52,49,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,57,48,10,57,48,10,57,48,10,57, 48,10,57,48,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,56,57,10,69,78,67,79,68,73,78,71, 32,49,52,49,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 48,10,51,48,10,48,48,10,51,48,10,51,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,56,65,10,69,78,67,79,68,73,78,71,32,49,52,49, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,52,48, 10,51,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,57,49,10, 69,78,67,79,68,73,78,71,32,49,52,50,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,53, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,57,50,10,69,78,67,79, 68,73,78,71,32,49,52,50,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 56,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,57,51,10,69,78,67,79,68,73,78,71, 32,49,52,50,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,49,48,10,50,48,10,49,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,57,52,10,69,78,67,79,68,73,78,71,32,49,52,50, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,50,48,10,48,48,10,50,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,57,53,10, 69,78,67,79,68,73,78,71,32,49,52,50,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,53,48, 10,52,48,10,53,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,57,54,10,69,78,67,79, 68,73,78,71,32,49,52,51,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,57,55,10,69,78,67,79,68,73,78,71, 32,49,52,51,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,50,48,10,55,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,57,56,10,69,78,67,79,68,73,78,71,32,49,52,51, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,52,56,10,65,56,10,57,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,57,57,10, 69,78,67,79,68,73,78,71,32,49,52,51,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,56,48, 10,52,48,10,52,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,57,65,10,69,78,67,79, 68,73,78,71,32,49,52,51,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,52,10,48,56,10,48,52,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,57,67,10,69,78,67,79,68,73,78,71, 32,49,52,51,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,50,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,57,68,10,69,78,67,79,68,73,78,71,32,49,52,51, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,52,10,48,56,10,48,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,57,69,10, 69,78,67,79,68,73,78,71,32,49,52,51,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,49,48,10,50,52, 10,50,56,10,50,56,10,48,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,57,70,10,69,78,67,79, 68,73,78,71,32,49,52,51,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,53,48,10,65,56,10, 53,48,10,53,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,65,48,10,69,78,67,79,68,73,78,71, 32,49,52,52,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,48,10,50,56,10,49,48,10,49, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,65,49,10,69,78,67,79,68,73,78,71,32,49,52,52, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,53,48,10,68,48,10,50,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,65,51,10, 69,78,67,79,68,73,78,71,32,49,52,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,49,48,10,55, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,65,52,10,69,78,67,79, 68,73,78,71,32,49,52,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,52,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,65,53,10,69,78,67,79,68,73,78,71, 32,49,52,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,65,54,10,69,78,67,79,68,73,78,71,32,49,52,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 52,56,10,57,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,65,56,10, 69,78,67,79,68,73,78,71,32,49,52,52,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,52,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,65,57,10,69,78,67,79, 68,73,78,71,32,49,52,52,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,52,48,10,65,48,10, 52,48,10,52,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,65,65,10,69,78,67,79,68,73,78,71, 32,49,52,53,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,53,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,48, 53,65,66,10,69,78,67,79,68,73,78,71,32,49,52,53, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,50,48,10,52,48,10,50,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,48,53,65,67,10, 69,78,67,79,68,73,78,71,32,49,52,53,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,49,48,10,55,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,48,53,65,68,10,69,78,67,79, 68,73,78,71,32,49,52,53,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,56,10,48,52,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,48,53,65,70,10,69,78,67,79,68,73,78,71, 32,49,52,53,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,50,48,10,53,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,55,57,57,10,69,78,67,79,68,73,78,71,32,49, 52,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,50, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 56,48,49,10,69,78,67,79,68,73,78,71,32,49,52,53, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,65,56,10, 48,48,10,52,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,56,48, 48,10,69,78,67,79,68,73,78,71,32,49,52,53,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,56,10,69,48, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,53,55,56,48,50,10, 69,78,67,79,68,73,78,71,32,49,52,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,69,48,10,52, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,55,57,51,10,69,78, 67,79,68,73,78,71,32,49,52,54,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,53,55,55,57,52,10,69,78,67,79, 68,73,78,71,32,49,52,54,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,53,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,53,55,55,57,53,10,69,78,67,79,68,73, 78,71,32,49,52,54,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,56,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,53,55,55,57,56,10,69,78,67,79,68,73,78,71, 32,49,52,54,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,55,57,55,10,69,78,67,79,68,73,78,71,32,49, 52,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 56,48,54,10,69,78,67,79,68,73,78,71,32,49,52,54, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,52,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,55,57, 54,10,69,78,67,79,68,73,78,71,32,49,52,54,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,48,10,50,48, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,53,55,56,48,55,10, 69,78,67,79,68,73,78,71,32,49,52,54,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,56,51,57,10,69,78, 67,79,68,73,78,71,32,49,52,54,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,53,55,54,52,53,10,69,78,67,79, 68,73,78,71,32,49,52,55,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,53,55,56,52,49,10,69,78,67,79,68,73, 78,71,32,49,52,55,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,55,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,53,55,56,52,50,10,69,78,67,79,68,73,78,71, 32,49,52,55,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,56,48,52,10,69,78,67,79,68,73,78,71,32,49, 52,55,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 56,48,51,10,69,78,67,79,68,73,78,71,32,49,52,55, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,56,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,54,53, 56,10,69,78,67,79,68,73,78,71,32,49,52,55,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,53,67,52,10,69,78, 67,79,68,73,78,71,32,49,52,55,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,50,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,53,55,54,54,52,10,69,78,67,79, 68,73,78,71,32,49,52,56,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,57,48,10,52,56,10,54,56,10,57, 48,10,56,56,10,67,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,53,55,54,54,53,10,69,78,67,79,68,73, 78,71,32,49,52,56,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,53,55,54,54,54,10,69,78,67,79,68,73,78,71, 32,49,52,57,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,48,10,50,48,10,49,48,10,49,48,10,50,56, 10,52,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,54,54,55,10,69,78,67,79,68,73,78,71,32,49, 52,57,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 54,54,56,10,69,78,67,79,68,73,78,71,32,49,52,57, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,56,10,48,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,54,54, 57,10,69,78,67,79,68,73,78,71,32,49,52,57,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,53,55,54,55,48,10, 69,78,67,79,68,73,78,71,32,49,52,57,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,50,48,10, 50,48,10,49,48,10,49,48,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,54,55,49,10,69,78, 67,79,68,73,78,71,32,49,52,57,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,52,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,53,55,54,55,50,10,69,78,67,79, 68,73,78,71,32,49,52,57,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,57,56,10,65,56,10,65,56,10,56, 56,10,56,56,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,53,55,54,55,51,10,69,78,67,79,68,73, 78,71,32,49,52,57,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,51,48,10,49,48,10,49,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,53,55,54,55,52,10,69,78,67,79,68,73,78,71, 32,49,52,57,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,48,56,10,48,56,10,48,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,54,55,53,10,69,78,67,79,68,73,78,71,32,49, 52,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,56,10,48,56,10,48,56,10,48,56,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 54,55,54,10,69,78,67,79,68,73,78,71,32,49,53,48, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,70,56, 10,48,56,10,48,56,10,48,56,10,49,48,10,54,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,54,55, 55,10,69,78,67,79,68,73,78,71,32,49,53,48,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,56,10,52, 56,10,52,56,10,52,56,10,52,56,10,55,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,53,55,54,55,56,10, 69,78,67,79,68,73,78,71,32,49,53,48,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,57,48,10,65,56,10, 52,56,10,56,56,10,56,56,10,66,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,54,55,57,10,69,78, 67,79,68,73,78,71,32,49,53,48,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,53,55,54,56,48,10,69,78,67,79, 68,73,78,71,32,49,53,48,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,49,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,55,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,53,55,54,56,49,10,69,78,67,79,68,73, 78,71,32,49,53,48,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,52,56,10,52,56,10,52,56,10, 53,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,53,55,54,56,50,10,69,78,67,79,68,73,78,71, 32,49,53,48,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,68,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,70,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,54,56,51,10,69,78,67,79,68,73,78,71,32,49, 53,48,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,52,56,10,52,56,10,52,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 54,56,52,10,69,78,67,79,68,73,78,71,32,49,53,48, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,52,56,10,52,56,10,48,56,10,48,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,54,56, 53,10,69,78,67,79,68,73,78,71,32,49,53,48,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,57,48,10,52, 56,10,52,56,10,53,48,10,54,48,10,52,48,10,52,48, 10,52,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,53,55,54,56,54,10, 69,78,67,79,68,73,78,71,32,49,53,49,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,57,48,10,52,56,10, 50,56,10,49,48,10,48,56,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,54,56,55,10,69,78, 67,79,68,73,78,71,32,49,53,49,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,56,10,56,56, 10,56,56,10,56,56,10,66,48,10,56,48,10,56,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,102,105,105,53,55,54,56,56,10,69,78,67,79, 68,73,78,71,32,49,53,49,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,48,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,53,55,54,56,57,10,69,78,67,79,68,73, 78,71,32,49,53,49,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,65,56,10,65,56,10,65,56,10,69,56,10, 56,56,10,70,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,53,55,54,57,48,10,69,78,67,79,68,73,78,71, 32,49,53,49,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,67,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,55,49,54,10,69,78,67,79,68,73,78,71,32,49, 53,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,56,10,52,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,53,55, 55,49,55,10,69,78,67,79,68,73,78,71,32,49,53,50, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,68,56, 10,52,56,10,52,56,10,48,56,10,48,56,10,48,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,55,49, 56,10,69,78,67,79,68,73,78,71,32,49,53,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,68,56,10,52, 56,10,52,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,53,70,51,10,69,78, 67,79,68,73,78,71,32,49,53,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,49,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,53,70,52,10,69,78,67,79,68,73, 78,71,32,49,53,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,52,56,10,57,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,48,49,10,69,78,67,79,68,73,78,71,32,51, 53,56,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,67,56,10,52,56,10,52,56,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,48, 50,10,69,78,67,79,68,73,78,71,32,51,53,56,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,54,56,10,54, 56,10,50,56,10,52,56,10,52,56,10,51,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,48,51,10,69,78, 67,79,68,73,78,71,32,51,53,56,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,65,56,10,69,56,10,50,56, 10,52,56,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,48,52,10,69,78,67,79,68,73, 78,71,32,51,53,56,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,69,56,10,69,56,10, 67,56,10,52,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,48,53,10,69,78,67,79,68,73,78,71,32,51, 53,56,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 53,48,10,65,56,10,69,56,10,69,56,10,67,56,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,48, 54,10,69,78,67,79,68,73,78,71,32,51,53,57,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,65,56,10,69, 56,10,50,56,10,52,56,10,69,56,10,68,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,48,55,10,69,78, 67,79,68,73,78,71,32,51,53,57,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,51,48,10,49,48, 10,57,48,10,53,48,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,48,56,10,69,78,67,79,68,73, 78,71,32,51,53,57,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,54,56,10,54,56,10, 50,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,48,57,10,69,78,67,79,68,73,78,71,32,51, 53,57,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,48,10,49,48,10,68,48,10,68,48,10,55,56,10,53, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,48, 65,10,69,78,67,79,68,73,78,71,32,51,53,57,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,48,10,68,48,10,69, 48,10,53,48,10,57,48,10,57,48,10,54,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,48,66,10,69,78, 67,79,68,73,78,71,32,51,53,57,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,65,56,10,70,48,10,50,56, 10,52,56,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,48,67,10,69,78,67,79,68,73, 78,71,32,51,53,57,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,54,56,10,65,56,10,54,56,10,65,56,10, 70,56,10,69,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,48,68,10,69,78,67,79,68,73,78,71,32,51, 53,57,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 54,56,10,65,56,10,54,56,10,66,56,10,69,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,48, 69,10,69,78,67,79,68,73,78,71,32,51,53,57,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,52,56,10,52,56,10,67,56,10,68,56,10,51,56, 10,52,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,48,70,10,69,78, 67,79,68,73,78,71,32,51,53,57,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,52,56, 10,52,56,10,67,56,10,68,56,10,65,56,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,49,48,10,69,78,67,79,68,73, 78,71,32,51,54,48,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,56,48,10,55,48,10,54,56,10, 54,56,10,49,56,10,65,56,10,53,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,49,49,10,69,78,67,79,68,73,78,71,32,51, 54,48,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 65,56,10,70,56,10,50,56,10,52,56,10,52,56,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,49, 50,10,69,78,67,79,68,73,78,71,32,51,54,48,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,65,56,10,69, 56,10,65,56,10,65,56,10,70,56,10,69,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,49,51,10,69,78, 67,79,68,73,78,71,32,51,54,48,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,54,56,10,65,56,10,54,56, 10,66,48,10,66,56,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,49,52,10,69,78,67,79,68,73, 78,71,32,51,54,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,69,56,10,69,56,10, 65,56,10,52,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,49,53,10,69,78,67,79,68,73,78,71,32,51, 54,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 53,48,10,65,56,10,69,56,10,69,56,10,65,56,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,49, 54,10,69,78,67,79,68,73,78,71,32,51,54,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,67,56,10,52,56,10,54,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,49,55,10,69,78, 67,79,68,73,78,71,32,51,54,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,68,48,10,69,56,10,52,56, 10,52,56,10,52,56,10,52,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,49,56,10,69,78,67,79,68,73, 78,71,32,51,54,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,56,48,10,70,48,10,52,56,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,49,57,10,69,78,67,79,68,73,78,71,32,51, 54,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,48,10,68,48,10,53,48,10,57,48,10,66,56,10,53, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,49, 65,10,69,78,67,79,68,73,78,71,32,51,54,49,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,67,56,10,67, 56,10,52,56,10,52,56,10,52,56,10,51,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,49,66,10,69,78, 67,79,68,73,78,71,32,51,54,49,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,56,10,48,56,10,67,56,10,67,56,10,52,56, 10,52,56,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,49,67,10,69,78,67,79,68,73, 78,71,32,51,54,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,67,56,10,67,56,10,56,56,10,65,56,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,49,68,10,69,78,67,79,68,73,78,71,32,51, 54,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,56,10,48,56,10, 67,56,10,67,56,10,56,56,10,65,56,10,65,56,10,53, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,49, 69,10,69,78,67,79,68,73,78,71,32,51,54,49,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,67,56,10,67, 56,10,52,56,10,65,56,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,49,70,10,69,78, 67,79,68,73,78,71,32,51,54,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,56,10,48,56,10,67,56,10,67,56,10,52,56, 10,65,56,10,65,56,10,53,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,50,48,10,69,78,67,79,68,73, 78,71,32,51,54,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,67,56,10,52,56,10, 67,56,10,67,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,50,49,10,69,78,67,79,68,73,78,71,32,51, 54,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 67,56,10,67,56,10,52,56,10,52,56,10,69,56,10,68, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,50, 50,10,69,78,67,79,68,73,78,71,32,51,54,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,67,56,10,67, 56,10,56,56,10,54,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,50,51,10,69,78, 67,79,68,73,78,71,32,51,54,49,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,69,48, 10,49,48,10,51,48,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,50,52,10,69,78,67,79,68,73, 78,71,32,51,54,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,67,56,10,52,56,10, 54,56,10,54,56,10,48,56,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,50,53,10,69,78,67,79,68,73,78,71,32,51, 54,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,54,56,10,57,56,10,67,56,10,67, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,50, 54,10,69,78,67,79,68,73,78,71,32,51,54,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,67,56,10,52,56,10,67,56,10,67,56,10,48,56, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,50,55,10,69,78, 67,79,68,73,78,71,32,51,54,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,56,56,10,48,56, 10,48,56,10,49,56,10,49,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,50,56,10,69,78,67,79,68,73, 78,71,32,51,54,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,56, 10,48,56,10,55,48,10,56,56,10,69,56,10,69,56,10, 67,56,10,52,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,50,57,10,69,78,67,79,68,73,78,71,32,51, 54,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,48,10,68,48,10,55,48,10,66,56,10,57,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,50, 65,10,69,78,67,79,68,73,78,71,32,51,54,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,56,10,48,56,10,55,48,10,56, 56,10,54,56,10,57,56,10,67,56,10,67,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,50,66,10,69,78, 67,79,68,73,78,71,32,51,54,50,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,68,56,10,68,56,10,53,48, 10,54,56,10,52,56,10,52,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,50,67,10,69,78,67,79,68,73, 78,71,32,51,54,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,56, 10,48,56,10,68,48,10,67,56,10,52,56,10,65,56,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,50,68,10,69,78,67,79,68,73,78,71,32,51, 54,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,48,10,48,56,10,67,56,10,67,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,50, 69,10,69,78,67,79,68,73,78,71,32,51,54,51,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,56,10,48,56,10,70,48,10,48, 56,10,67,56,10,67,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,50,70,10,69,78, 67,79,68,73,78,71,32,51,54,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,68,56,10,69,56,10,48,56, 10,48,56,10,48,56,10,49,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,51,48,10,69,78,67,79,68,73, 78,71,32,51,54,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,54,56,10,55,48,10,48,48,10, 54,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,51,49,10,69,78,67,79,68,73,78,71,32,51, 54,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,55,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,51, 50,10,69,78,67,79,68,73,78,71,32,51,54,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,48,56,10,48,56,10,48,56,10,48,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,51,51,10,69,78, 67,79,68,73,78,71,32,51,54,51,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,67,48,10,67,48,10,51,48,10,52,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,51,52,10,69,78,67,79,68,73, 78,71,32,51,54,51,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,55,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,51,53,10,69,78,67,79,68,73,78,71,32,51, 54,51,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,55,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,51, 54,10,69,78,67,79,68,73,78,71,32,51,54,51,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,56,10,55,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,51,55,10,69,78, 67,79,68,73,78,71,32,51,54,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 56,10,55,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,51,56,10,69,78,67,79,68,73, 78,71,32,51,54,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,49,56,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,51,57,10,69,78,67,79,68,73,78,71,32,51, 54,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,51,56,10,49,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,51, 65,10,69,78,67,79,68,73,78,71,32,51,54,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,49,56, 10,49,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,51,70,10,69,78, 67,79,68,73,78,71,32,51,54,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,50,48,10,70,48,10,65,56,10,65,56,10,70,48, 10,65,56,10,65,56,10,70,48,10,50,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,52,48,10,69,78,67,79,68,73, 78,71,32,51,54,52,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 54,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,52,49,10,69,78,67,79,68,73,78,71,32,51, 54,52,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 57,48,10,57,48,10,57,48,10,57,48,10,68,56,10,68, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,52, 50,10,69,78,67,79,68,73,78,71,32,51,54,53,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,55,56,10,56,48,10,70,48,10,49, 48,10,49,48,10,49,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,52,51,10,69,78, 67,79,68,73,78,71,32,51,54,53,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,55,48,10,57,48,10,66,48,10,55,48,10,49,48, 10,49,48,10,49,56,10,49,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,52,52,10,69,78,67,79,68,73, 78,71,32,51,54,53,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,66,48, 10,53,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,56,10,49,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,52,53,10,69,78,67,79,68,73,78,71,32,51, 54,53,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,48,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,52, 54,10,69,78,67,79,68,73,78,71,32,51,54,53,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,56,10,68, 56,10,48,56,10,48,56,10,48,56,10,48,56,10,49,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,52,55,10,69,78, 67,79,68,73,78,71,32,51,54,53,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,55,56,10,54, 48,10,53,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,52,56,10,69,78,67,79,68,73, 78,71,32,51,54,53,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,56,10,48,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,52,57,10,69,78,67,79,68,73,78,71,32,51, 54,53,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,54,56,10,51,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,52, 65,10,69,78,67,79,68,73,78,71,32,51,54,53,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,53,52,10, 55,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,52,66,10,69,78, 67,79,68,73,78,71,32,51,54,53,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,51,56,10,49, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,52,67,10,69,78,67,79,68,73, 78,71,32,51,54,54,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,49,56,10,49,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,52,68,10,69,78,67,79,68,73,78,71,32,51, 54,54,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,52, 69,10,69,78,67,79,68,73,78,71,32,51,54,54,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,56,10,51,56,10,51,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,52,70,10,69,78, 67,79,68,73,78,71,32,51,54,54,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,65,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,53,48,10,69,78,67,79,68,73, 78,71,32,51,54,54,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,53,49,10,69,78,67,79,68,73,78,71,32,51, 54,54,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,65,56,10,69,56,10,48,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,53, 50,10,69,78,67,79,68,73,78,71,32,51,54,54,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,56,48,10,56,48,10,65, 56,10,66,56,10,66,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,53,51,10,69,78, 67,79,68,73,78,71,32,51,54,54,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,53,48,10,65,56, 10,56,56,10,67,56,10,67,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,53,52,10,69,78,67,79,68,73, 78,71,32,51,54,54,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,56,10,48,56,10,55,48,10,56,48,10,66,48,10, 66,48,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,53,53,10,69,78,67,79,68,73,78,71,32,51, 54,54,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,56,10, 54,56,10,55,48,10,56,48,10,66,48,10,66,48,10,55, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,53, 54,10,69,78,67,79,68,73,78,71,32,51,54,55,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,48,10,53, 48,10,50,56,10,48,56,10,54,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,53,55,10,69,78, 67,79,68,73,78,71,32,51,54,55,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,48,56,10,65,56,10,69,56, 10,65,56,10,65,56,10,68,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,48,69,53,56,10,69,78,67,79,68,73, 78,71,32,51,54,55,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,56,10,55,48,10,56,48,10,57,56,10, 65,56,10,68,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,48,69,53,57,10,69,78,67,79,68,73,78,71,32,51, 54,55,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,56,10, 48,56,10,51,48,10,54,48,10,65,48,10,68,48,10,67, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,48,69,53, 65,10,69,78,67,79,68,73,78,71,32,51,54,55,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,53,52,10,55, 52,10,49,52,10,49,52,10,49,52,10,50,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,48,69,53,66,10,69,78, 67,79,68,73,78,71,32,51,54,55,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,67,48,10,67,48,10,65,56, 10,66,48,10,65,48,10,52,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,68,48,10,69,78,67,79,68,73, 78,71,32,52,51,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,52,48,10,51,48,10,48,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,68,49,10,69,78,67,79,68,73,78,71,32,52, 51,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,54,48,10,50,48,10, 50,48,10,55,48,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,68, 50,10,69,78,67,79,68,73,78,71,32,52,51,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,65,48,10,65, 48,10,50,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,68,51,10,69,78, 67,79,68,73,78,71,32,52,51,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,65,56, 10,65,56,10,57,48,10,56,48,10,54,48,10,49,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,68,52,10,69,78,67,79,68,73, 78,71,32,52,51,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,48,10,56,56,10,56,56,10,48,56,10,48,56,10, 48,56,10,56,56,10,56,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,68,53,10,69,78,67,79,68,73,78,71,32,52, 51,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,51,48,10,48,56,10,48,56,10,56, 56,10,56,56,10,55,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,68, 54,10,69,78,67,79,68,73,78,71,32,52,51,49,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,65,48,10,65,56,10,55,48,10,51, 48,10,50,56,10,50,56,10,50,56,10,49,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,68,55,10,69,78, 67,79,68,73,78,71,32,52,51,49,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,53,48,10,65,56, 10,65,56,10,65,56,10,52,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,68,56,10,69,78,67,79,68,73, 78,71,32,52,51,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,68,57,10,69,78,67,79,68,73,78,71,32,52, 51,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,48,10, 48,56,10,48,56,10,51,48,10,48,56,10,48,56,10,56, 56,10,56,56,10,55,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,68, 65,10,69,78,67,79,68,73,78,71,32,52,51,49,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,53, 56,10,66,56,10,66,56,10,65,56,10,56,48,10,55,48, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,68,66,10,69,78, 67,79,68,73,78,71,32,52,51,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,56,56,10,56,56,10,48,56,10,55,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,68,67,10,69,78,67,79,68,73, 78,71,32,52,51,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,56,10,56,48, 10,56,48,10,56,48,10,70,48,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,68,68,10,69,78,67,79,68,73,78,71,32,52, 51,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,53,48,10,65,56,10,65,56,10,65,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,68, 69,10,69,78,67,79,68,73,78,71,32,52,51,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,49,48,10,48,56,10,48,56,10,51, 48,10,48,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,68,70,10,69,78, 67,79,68,73,78,71,32,52,51,49,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,56,10,49,56,10,65,56, 10,65,56,10,52,56,10,48,56,10,52,56,10,51,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,69,48,10,69,78,67,79,68,73, 78,71,32,52,51,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,56, 10,55,48,10,56,48,10,68,48,10,65,56,10,65,56,10, 65,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,69,49,10,69,78,67,79,68,73,78,71,32,52, 51,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 57,48,10,65,48,10,57,48,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,69, 50,10,69,78,67,79,68,73,78,71,32,52,51,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,53,48,10,53,48,10,55,48,10,68, 56,10,68,56,10,65,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,69,51,10,69,78, 67,79,68,73,78,71,32,52,51,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,66,48,10,52,56,10,52,56,10,48,56, 10,48,56,10,48,56,10,52,56,10,52,56,10,51,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,69,52,10,69,78,67,79,68,73, 78,71,32,52,51,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,53,48,10,65,56,10,65,56,10, 53,48,10,48,56,10,52,56,10,51,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,69,53,10,69,78,67,79,68,73,78,71,32,52, 51,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,49,56,10,48,56,10, 48,56,10,51,56,10,52,56,10,48,56,10,48,56,10,48, 56,10,56,56,10,55,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,69, 54,10,69,78,67,79,68,73,78,71,32,52,51,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,53, 48,10,65,56,10,65,56,10,56,56,10,56,48,10,55,48, 10,48,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,69,55,10,69,78, 67,79,68,73,78,71,32,52,51,50,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,56,56, 10,56,56,10,55,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,69,56,10,69,78,67,79,68,73, 78,71,32,52,51,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,65,56, 10,65,56,10,65,56,10,56,56,10,51,56,10,52,56,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,69,57,10,69,78,67,79,68,73,78,71,32,52, 51,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,48,10,57,48,10,57,48,10, 69,48,10,56,48,10,70,48,10,56,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,69, 65,10,69,78,67,79,68,73,78,71,32,52,51,51,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,57,48,10,56,56,10,56, 56,10,66,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,69,66,10,69,78, 67,79,68,73,78,71,32,52,51,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,49, 48,10,48,56,10,48,56,10,48,56,10,55,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,69,67,10,69,78,67,79,68,73, 78,71,32,52,51,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,65,56, 10,65,56,10,56,48,10,56,48,10,70,56,10,56,56,10, 53,48,10,53,48,10,50,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,69,68,10,69,78,67,79,68,73,78,71,32,52, 51,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,54,48,10,65,48,10, 50,48,10,54,56,10,66,48,10,54,56,10,50,48,10,50, 48,10,65,48,10,67,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,69, 69,10,69,78,67,79,68,73,78,71,32,52,51,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,57,48,10,65,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,69,70,10,69,78, 67,79,68,73,78,71,32,52,51,51,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,53,48, 10,50,48,10,53,48,10,56,56,10,52,48,10,56,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,70,48,10,69,78,67,79,68,73, 78,71,32,52,51,51,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,48,10,51,48,10,48,56, 10,51,48,10,48,56,10,48,56,10,51,48,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,70,49,10,69,78,67,79,68,73,78,71,32,52, 51,51,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,65,48,10,57,48,10,56,56,10,66,48,10, 56,56,10,56,56,10,66,48,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,70, 50,10,69,78,67,79,68,73,78,71,32,52,51,51,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,53,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,70,51,10,69,78, 67,79,68,73,78,71,32,52,51,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,56,10,48,56,10,49,48, 10,51,48,10,48,56,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,70,52,10,69,78,67,79,68,73, 78,71,32,52,51,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,52,48, 10,51,48,10,48,56,10,48,56,10,51,48,10,48,56,10, 48,56,10,56,56,10,56,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,70,53,10,69,78,67,79,68,73,78,71,32,52, 51,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,48,10,57,48,10,57,48,10, 55,56,10,49,48,10,55,56,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,48,70, 54,10,69,78,67,79,68,73,78,71,32,52,51,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,52,48,10,50,48,10,50,48,10,55, 48,10,65,56,10,65,56,10,55,48,10,50,48,10,50,48, 10,49,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,48,70,55,10,69,78, 67,79,68,73,78,71,32,52,51,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 48,10,52,56,10,48,56,10,49,48,10,50,48,10,52,48, 10,52,56,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,48,70,56,10,69,78,67,79,68,73, 78,71,32,52,51,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,56,56,10,70,48,10,56,48,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,48,70,66,10,69,78,67,79,68,73,78,71,32,52, 51,52,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,67,48,10, 67,48,10,49,56,10,49,56,10,67,48,10,67,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,65, 56,10,69,78,67,79,68,73,78,71,32,52,53,50,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,49,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,65,57,10,69,78, 67,79,68,73,78,71,32,52,53,50,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,50,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,53,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,65,65,10,69,78,67,79,68,73, 78,71,32,52,53,50,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,67,56, 10,52,56,10,53,48,10,53,48,10,53,56,10,54,56,10, 65,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,65,66,10,69,78,67,79,68,73,78,71,32,52, 53,50,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,65, 67,10,69,78,67,79,68,73,78,71,32,52,53,50,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,66,56,10,57,48,10,57,48,10,57, 48,10,65,56,10,65,56,10,69,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,65,68,10,69,78, 67,79,68,73,78,71,32,52,53,50,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,66,56,10,56,48,10,66,56,10,56,48,10,66,56, 10,65,56,10,68,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,65,69,10,69,78,67,79,68,73, 78,71,32,52,53,50,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,70,56, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 70,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,65,70,10,69,78,67,79,68,73,78,71,32,52, 53,50,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,56,10, 48,56,10,70,56,10,56,48,10,56,48,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,66, 48,10,69,78,67,79,68,73,78,71,32,52,53,50,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,50,56,10,50,56,10,69, 56,10,56,56,10,65,56,10,67,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,66,49,10,69,78, 67,79,68,73,78,71,32,52,53,50,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,68,67,10,53,52,10,53,52,10,68,52,10,57,52, 10,66,52,10,68,67,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,66,50,10,69,78,67,79,68,73, 78,71,32,52,53,51,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,68,52, 10,53,52,10,53,52,10,68,67,10,57,52,10,66,52,10, 68,67,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,66,51,10,69,78,67,79,68,73,78,71,32,52, 53,51,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,69,52,10,50,52,10, 50,56,10,69,56,10,57,52,10,66,52,10,68,52,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,66, 52,10,69,78,67,79,68,73,78,71,32,52,53,51,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,68,56,10,53,48,10,53,48,10,68, 56,10,57,48,10,66,48,10,68,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,66,53,10,69,78, 67,79,68,73,78,71,32,52,53,51,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,68,67,10,52,48,10,53,52,10,68,52,10,57,52, 10,65,56,10,68,67,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,66,54,10,69,78,67,79,68,73, 78,71,32,52,53,51,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,69,67, 10,50,48,10,51,67,10,69,56,10,57,67,10,66,52,10, 68,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,66,55,10,69,78,67,79,68,73,78,71,32,52, 53,51,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,66, 56,10,69,78,67,79,68,73,78,71,32,52,53,51,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,56,56,10,56,56,10,56,56,10,70, 56,10,56,56,10,56,56,10,70,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,66,57,10,69,78, 67,79,68,73,78,71,32,52,53,51,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,65,56,10,65,56,10,65,56,10,69,56,10,66,52, 10,66,52,10,68,52,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,66,65,10,69,78,67,79,68,73, 78,71,32,52,53,51,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,49,48, 10,49,48,10,50,48,10,50,48,10,53,48,10,53,48,10, 56,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,66,66,10,69,78,67,79,68,73,78,71,32,52, 53,51,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,56,10,50,56,10, 53,48,10,53,48,10,53,56,10,65,56,10,65,52,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,66, 67,10,69,78,67,79,68,73,78,71,32,52,53,52,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,51,48,10,52,56,10,56,52,10,56, 52,10,56,52,10,52,56,10,51,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,66,68,10,69,78, 67,79,68,73,78,71,32,52,53,52,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,48,56,10,49,48,10,51,48,10,52,56, 10,52,56,10,56,52,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,66,69,10,69,78,67,79,68,73, 78,71,32,52,53,52,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,55,48, 10,48,48,10,70,56,10,50,48,10,50,48,10,53,48,10, 56,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,66,70,10,69,78,67,79,68,73,78,71,32,52, 53,52,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,56,10, 48,56,10,70,56,10,48,56,10,48,56,10,49,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,67, 48,10,69,78,67,79,68,73,78,71,32,52,53,52,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,56,48,10,56,48,10,70, 56,10,56,48,10,56,48,10,70,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,49,67,49,10,69,78, 67,79,68,73,78,71,32,52,53,52,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,49,67,50,10,69,78,67,79,68,73, 78,71,32,52,53,52,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,48,48, 10,70,56,10,48,48,10,55,48,10,56,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,49,69,66,10,69,78,67,79,68,73,78,71,32,52, 53,56,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 53,48,10,53,48,10,53,48,10,56,56,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,49,70, 57,10,69,78,67,79,68,73,78,71,32,52,54,48,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,48,48,10,55, 48,10,56,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,56,48,10,69,78, 67,79,68,73,78,71,32,53,55,54,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,67,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,56,49,10,69,78,67,79,68,73, 78,71,32,53,55,54,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,67,10,48,56,10,48,56,10, 48,56,10,48,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,56,50,10,69,78,67,79,68,73,78,71,32,53, 55,54,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,67,10,50,56,10,50,56,10,50,56,10,50, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,56, 51,10,69,78,67,79,68,73,78,71,32,53,55,54,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 67,10,51,56,10,51,56,10,51,56,10,51,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,56,52,10,69,78, 67,79,68,73,78,71,32,53,55,54,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,67,10,55,56, 10,55,56,10,55,56,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,56,53,10,69,78,67,79,68,73, 78,71,32,53,55,54,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,67,10,70,56,10,70,56,10, 70,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,56,54,10,69,78,67,79,68,73,78,71,32,53, 55,54,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,48,56,10,48,56,10, 48,56,10,70,67,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,56, 55,10,69,78,67,79,68,73,78,71,32,53,55,54,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,56,10,50,56,10,50,56,10,50,56,10,70, 67,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,56,56,10,69,78, 67,79,68,73,78,71,32,53,55,54,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 56,10,51,56,10,51,56,10,51,56,10,70,67,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,56,57,10,69,78,67,79,68,73, 78,71,32,53,55,54,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,56,10,55,56, 10,55,56,10,55,56,10,70,67,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,56,65,10,69,78,67,79,68,73,78,71,32,53, 55,55,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,70,56,10,70,56,10, 70,56,10,70,67,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,56, 66,10,69,78,67,79,68,73,78,71,32,53,55,55,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,49,48,10,49,48,10,49,48,10,70, 67,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,56,67,10,69,78, 67,79,68,73,78,71,32,53,55,55,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 56,10,50,56,10,50,56,10,50,56,10,70,67,10,53,48, 10,53,48,10,53,48,10,53,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,56,68,10,69,78,67,79,68,73, 78,71,32,53,55,55,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,56,10,51,56, 10,51,56,10,51,56,10,70,67,10,55,48,10,55,48,10, 55,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,56,69,10,69,78,67,79,68,73,78,71,32,53, 55,55,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,51,67,10,51,67,10,51,67,10, 51,67,10,70,67,10,55,56,10,55,56,10,55,56,10,55, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,56, 70,10,69,78,67,79,68,73,78,71,32,53,55,55,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,67,10,55,67,10,55,67,10,55,67,10,70, 67,10,70,56,10,70,56,10,70,56,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,57,48,10,69,78, 67,79,68,73,78,71,32,53,55,55,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,49,48,10,70,67,10,49,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,57,49,10,69,78,67,79,68,73, 78,71,32,53,55,55,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,56,10,70,67,10,50,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,57,50,10,69,78,67,79,68,73,78,71,32,53, 55,55,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 51,56,10,70,67,10,51,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,57, 51,10,69,78,67,79,68,73,78,71,32,53,55,55,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,56,10,70, 67,10,55,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,57,52,10,69,78, 67,79,68,73,78,71,32,53,55,56,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,70,67,10,70,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,57,53,10,69,78,67,79,68,73, 78,71,32,53,55,56,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,56,10,50,56, 10,49,48,10,49,48,10,70,67,10,49,48,10,49,48,10, 50,56,10,50,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,57,54,10,69,78,67,79,68,73,78,71,32,53, 55,56,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,51,48,10,52,56,10,52,56,10, 56,52,10,70,67,10,56,52,10,52,56,10,52,56,10,51, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,57, 55,10,69,78,67,79,68,73,78,71,32,53,55,56,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 67,10,52,48,10,53,56,10,52,56,10,55,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,57,56,10,69,78, 67,79,68,73,78,71,32,53,55,56,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,67,10,68,56, 10,55,48,10,55,48,10,68,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,57,57,10,69,78,67,79,68,73, 78,71,32,53,55,56,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,53,48,10,70,56,10,53,48, 10,70,56,10,53,48,10,70,67,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,57,65,10,69,78,67,79,68,73,78,71,32,53, 55,56,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,67,10,48,48,10,55,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,57, 66,10,69,78,67,79,68,73,78,71,32,53,55,56,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,56,48,10,52,48,10,50,48,10,49, 67,10,50,48,10,52,48,10,56,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,57,67,10,69,78, 67,79,68,73,78,71,32,53,55,56,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,52,10,48,56,10,49,48,10,69,48,10,49,48, 10,48,56,10,48,52,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,65,48,10,69,78,67,79,68,73, 78,71,32,53,55,57,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,56,10,53,48, 10,54,48,10,52,56,10,53,48,10,54,48,10,52,48,10, 52,48,10,52,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,65,49,10,69,78,67,79,68,73,78,71,32,53, 55,57,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,49,48,10,48,48,10,52,56,10,53,48,10,54,48,10, 52,56,10,53,48,10,54,48,10,52,48,10,52,48,10,52, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,65, 50,10,69,78,67,79,68,73,78,71,32,53,55,57,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,67,48,10,65,48,10,57,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,65,51,10,69,78, 67,79,68,73,78,71,32,53,55,57,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,67,48,10,65,48,10,57,48,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,65,52,10,69,78,67,79,68,73, 78,71,32,53,55,57,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,48,10,67,48, 10,65,48,10,57,48,10,56,56,10,65,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,65,53,10,69,78,67,79,68,73,78,71,32,53, 55,57,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,67,48,10,65,48,10, 57,48,10,67,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,65, 54,10,69,78,67,79,68,73,78,71,32,53,55,57,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,52,48,10,55,48,10,52,56,10,52, 56,10,52,56,10,55,48,10,52,48,10,52,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,65,55,10,69,78, 67,79,68,73,78,71,32,53,55,57,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,70,48,10,56,56,10,65,56,10,56,56, 10,70,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,65,56,10,69,78,67,79,68,73, 78,71,32,53,56,48,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,67,48,10,65,48, 10,57,48,10,67,48,10,65,48,10,57,48,10,56,48,10, 56,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,65,57,10,69,78,67,79,68,73,78,71,32,53, 56,48,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,67,56,10,66,48,10,56,48,10, 67,56,10,66,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,65, 65,10,69,78,67,79,68,73,78,71,32,53,56,48,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,68,48,10,65,48,10,56,48,10,67, 48,10,66,48,10,56,48,10,56,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,65,66,10,69,78, 67,79,68,73,78,71,32,53,56,48,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,54, 48,10,53,48,10,52,56,10,54,48,10,53,48,10,52,56, 10,52,48,10,52,48,10,52,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,65,67,10,69,78,67,79,68,73, 78,71,32,53,56,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,65,48, 10,54,48,10,51,48,10,65,56,10,54,48,10,51,48,10, 50,56,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,65,68,10,69,78,67,79,68,73,78,71,32,53, 56,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 51,48,10,50,56,10,50,48,10,51,48,10,50,56,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,65, 69,10,69,78,67,79,68,73,78,71,32,53,56,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,50,48,10,54,48,10,65, 48,10,50,48,10,54,48,10,65,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,65,70,10,69,78, 67,79,68,73,78,71,32,53,56,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,56,10,51,48,10,54,48,10,65,56,10,51,48, 10,54,48,10,65,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,66,48,10,69,78,67,79,68,73, 78,71,32,53,56,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,56, 10,51,48,10,54,48,10,65,48,10,50,48,10,54,48,10, 65,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,66,49,10,69,78,67,79,68,73,78,71,32,53, 56,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,67,48,10,66,48,10,56,56,10, 66,48,10,67,48,10,65,48,10,57,48,10,56,56,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,66, 50,10,69,78,67,79,68,73,78,71,32,53,56,49,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,56,10,49,48,10,50,48,10,52, 48,10,50,48,10,49,48,10,48,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,66,51,10,69,78, 67,79,68,73,78,71,32,53,56,49,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,67,48, 10,65,48,10,57,48,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,66,52,10,69,78,67,79,68,73, 78,71,32,53,56,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,57,48, 10,65,48,10,67,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,66,53,10,69,78,67,79,68,73,78,71,32,53, 56,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,56,56,10,57,48,10,65,48,10, 67,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,66, 54,10,69,78,67,79,68,73,78,71,32,53,56,49,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,57,48,10,69,48,10,67,48,10,67, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,66,55,10,69,78, 67,79,68,73,78,71,32,53,56,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,53,48,10,53,48,10,50,48,10,53,48, 10,53,48,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,66,56,10,69,78,67,79,68,73, 78,71,32,53,56,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,56,56, 10,53,48,10,53,48,10,65,56,10,53,48,10,53,48,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,66,57,10,69,78,67,79,68,73,78,71,32,53, 56,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,67,48,10,66,48,10,56,56,10, 66,48,10,67,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,66, 65,10,69,78,67,79,68,73,78,71,32,53,56,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,56,56,10,67,56,10,65, 56,10,57,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,66,66,10,69,78, 67,79,68,73,78,71,32,53,56,49,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,67,56,10,65,56,10,68,56,10,65,56, 10,57,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,66,67,10,69,78,67,79,68,73, 78,71,32,53,56,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,65,56,10,55,48,10,50,48,10,55,48,10,65,56,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,66,68,10,69,78,67,79,68,73,78,71,32,53, 56,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 55,48,10,55,48,10,55,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,66, 69,10,69,78,67,79,68,73,78,71,32,53,56,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,65,48,10,54,48,10,50, 48,10,51,48,10,50,56,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,66,70,10,69,78, 67,79,68,73,78,71,32,53,56,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,51,48,10,50,56, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,67,48,10,69,78,67,79,68,73, 78,71,32,53,56,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,65,48,10,55,48,10,55,48,10,55,48,10,50,56,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,67,49,10,69,78,67,79,68,73,78,71,32,53, 56,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,67, 50,10,69,78,67,79,68,73,78,71,32,53,56,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,50,48,10,55,48,10,55, 48,10,55,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,67,51,10,69,78, 67,79,68,73,78,71,32,53,56,50,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,52,48,10,57,48,10,52,56, 10,49,48,10,50,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,67,52,10,69,78,67,79,68,73, 78,71,32,53,56,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,65,56,10,55,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,67,53,10,69,78,67,79,68,73,78,71,32,53, 56,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,56,10, 51,48,10,50,48,10,54,48,10,65,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,67, 54,10,69,78,67,79,68,73,78,71,32,53,56,51,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,50,48,10,50,48,10,54, 48,10,65,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,67,55,10,69,78, 67,79,68,73,78,71,32,53,56,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,51,48,10,50,56,10,50,48,10,50,48,10,50,48, 10,65,48,10,54,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,67,56,10,69,78,67,79,68,73, 78,71,32,53,56,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,67,56,10,66,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 66,48,10,67,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,67,57,10,69,78,67,79,68,73,78,71,32,53, 56,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,65,56,10,55,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,67, 65,10,69,78,67,79,68,73,78,71,32,53,56,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,50,48,10,52,48,10,50,48,10,49, 48,10,50,48,10,52,48,10,50,48,10,49,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,67,66,10,69,78, 67,79,68,73,78,71,32,53,56,51,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,56,10,57,56,10,65,56,10,67,56, 10,56,56,10,48,56,10,48,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,67,67,10,69,78,67,79,68,73, 78,71,32,53,56,51,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,67,68,10,69,78,67,79,68,73,78,71,32,53, 56,51,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,55,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,67, 69,10,69,78,67,79,68,73,78,71,32,53,56,51,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,50,48,10,65,56,10,55, 48,10,50,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,67,70,10,69,78, 67,79,68,73,78,71,32,53,56,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,55,48,10,65,56,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,68,48,10,69,78,67,79,68,73, 78,71,32,53,56,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,54,48, 10,65,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,68,49,10,69,78,67,79,68,73,78,71,32,53, 56,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,54,48,10,65,48,10, 50,48,10,55,48,10,55,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,68, 50,10,69,78,67,79,68,73,78,71,32,53,56,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,67,48,10,66,48,10,56,56,10,66,48,10,67, 48,10,66,48,10,56,56,10,66,48,10,67,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,68,51,10,69,78, 67,79,68,73,78,71,32,53,56,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,50,56,10,51,48,10,50,48,10,50,56, 10,51,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,68,52,10,69,78,67,79,68,73, 78,71,32,53,56,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,48,10,56,56, 10,65,56,10,56,56,10,70,48,10,56,56,10,65,56,10, 56,56,10,70,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,68,53,10,69,78,67,79,68,73,78,71,32,53, 56,52,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,57,48,10,65,48,10, 67,48,10,56,48,10,67,48,10,65,48,10,57,48,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,68, 54,10,69,78,67,79,68,73,78,71,32,53,56,52,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,68,56,10,65,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,68,55,10,69,78, 67,79,68,73,78,71,32,53,56,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,68,56,10,65,56,10,68,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,68,56,10,69,78,67,79,68,73, 78,71,32,53,56,52,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,65,56,10,65,56, 10,55,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,68,57,10,69,78,67,79,68,73,78,71,32,53, 56,52,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,55,48,10,55,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,68, 65,10,69,78,67,79,68,73,78,71,32,53,56,53,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,51,48,10,50,56,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,68,66,10,69,78, 67,79,68,73,78,71,32,53,56,53,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,51,48,10,50,56,10,50,48,10,55,48,10,55,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,68,67,10,69,78,67,79,68,73, 78,71,32,53,56,53,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,53,48,10,56,56,10,53,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,68,68,10,69,78,67,79,68,73,78,71,32,53, 56,53,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,53,48,10,50,48,10, 53,48,10,56,56,10,53,48,10,50,48,10,53,48,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,68, 69,10,69,78,67,79,68,73,78,71,32,53,56,53,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,68,56,10,68,56,10,65,56,10,65, 56,10,65,56,10,68,56,10,68,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,68,70,10,69,78, 67,79,68,73,78,71,32,53,56,53,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,53,48,10,56,56,10,56,56,10,53,48,10,50,48, 10,53,48,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,69,48,10,69,78,67,79,68,73, 78,71,32,53,56,53,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,56,10,55,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,69,49,10,69,78,67,79,68,73,78,71,32,53, 56,53,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,65,56,10, 55,48,10,50,48,10,55,48,10,65,56,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,69, 50,10,69,78,67,79,68,73,78,71,32,53,56,53,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,56,10,51,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,54,48,10,65,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,69,51,10,69,78, 67,79,68,73,78,71,32,53,56,53,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,65,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,69,52,10,69,78,67,79,68,73, 78,71,32,53,56,54,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,65,56,10,65,56, 10,55,48,10,65,56,10,65,56,10,65,56,10,55,48,10, 65,56,10,65,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,69,53,10,69,78,67,79,68,73,78,71,32,53, 56,54,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,68,56,10,65,56,10, 68,56,10,56,56,10,68,56,10,65,56,10,68,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,69, 54,10,69,78,67,79,68,73,78,71,32,53,56,54,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,65,56,10,65,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,69,55,10,69,78, 67,79,68,73,78,71,32,53,56,54,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,69,56,10,69,78,67,79,68,73, 78,71,32,53,56,54,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,55,48, 10,65,56,10,50,48,10,50,48,10,50,48,10,65,56,10, 55,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,69,57,10,69,78,67,79,68,73,78,71,32,53, 56,54,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,49,56,10,54,56,10,56,56,10, 54,56,10,49,56,10,48,56,10,48,56,10,48,56,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,69, 65,10,69,78,67,79,68,73,78,71,32,53,56,54,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,69,48,10,52,48,10,53,48,10,55, 48,10,53,48,10,49,48,10,51,56,10,49,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,69,66,10,69,78, 67,79,68,73,78,71,32,53,56,54,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,69,67,10,69,78,67,79,68,73, 78,71,32,53,56,54,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,54,69,68,10,69,78,67,79,68,73,78,71,32,53, 56,54,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 50,48,10,70,56,10,50,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,54,69, 69,10,69,78,67,79,68,73,78,71,32,53,56,55,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,51,48,10,50,56,10,50,48,10,54, 48,10,65,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,54,69,70,10,69,78, 67,79,68,73,78,71,32,53,56,55,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,65, 56,10,65,56,10,55,48,10,50,48,10,50,48,10,50,48, 10,55,48,10,65,56,10,65,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,54,70,48,10,69,78,67,79,68,73, 78,71,32,53,56,55,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,55,48,10,65,56,10,65,56,10,65,56,10,55,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,48,48,10,69,78,67,79,68,73,78,71,32,55, 54,56,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,53,48,10,56,56,10, 56,56,10,70,56,10,56,56,10,56,56,10,56,56,10,50, 48,10,53,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,48, 49,10,69,78,67,79,68,73,78,71,32,55,54,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,48,56,10,55, 56,10,56,56,10,57,56,10,54,56,10,50,48,10,53,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,48,50,10,69,78, 67,79,68,73,78,71,32,55,54,56,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,70,48,10,52,56,10,52,56,10,55,48, 10,52,56,10,52,56,10,70,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,48,51,10,69,78,67,79,68,73, 78,71,32,55,54,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,65,48,10,56,48, 10,56,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,48,52,10,69,78,67,79,68,73,78,71,32,55, 54,56,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,52,56,10,52,56,10, 52,56,10,55,48,10,52,56,10,52,56,10,52,56,10,70, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,48, 53,10,69,78,67,79,68,73,78,71,32,55,54,56,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,70,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,70,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,48,54,10,69,78, 67,79,68,73,78,71,32,55,54,56,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,52,56,10,52,56,10,52,56,10,55,48,10,52,56, 10,52,56,10,52,56,10,70,48,10,48,48,10,70,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,48,55,10,69,78,67,79,68,73, 78,71,32,55,54,56,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,48,10,56,48, 10,56,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,48,10,48,48,10,70,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,48,56,10,69,78,67,79,68,73,78,71,32,55, 54,56,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,49,48,10,50,48,10,48,48,10,55,48,10, 56,56,10,56,48,10,56,48,10,56,48,10,56,56,10,55, 48,10,50,48,10,52,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,48, 57,10,69,78,67,79,68,73,78,71,32,55,54,56,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,56,48,10,56,48,10,56,56,10,55,48,10,50,48, 10,52,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,48,65,10,69,78, 67,79,68,73,78,71,32,55,54,57,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,70,48,10,52,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,70,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,48,66,10,69,78,67,79,68,73, 78,71,32,55,54,57,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,50,56,10,48,56, 10,48,56,10,55,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,48,67,10,69,78,67,79,68,73,78,71,32,55, 54,57,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,52,56,10,52,56,10, 52,56,10,52,56,10,52,56,10,52,56,10,52,56,10,70, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,48, 68,10,69,78,67,79,68,73,78,71,32,55,54,57,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,48,56,10,48,56,10,55,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,56,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,48,69,10,69,78, 67,79,68,73,78,71,32,55,54,57,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,52,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,70,48,10,48,48,10,70,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,48,70,10,69,78,67,79,68,73, 78,71,32,55,54,57,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,48,56, 10,48,56,10,55,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,56,10,48,48,10,70,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,49,48,10,69,78,67,79,68,73,78,71,32,55, 54,57,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,52,56,10,52,56,10, 52,56,10,52,56,10,52,56,10,52,56,10,52,56,10,70, 48,10,50,48,10,52,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,49, 49,10,69,78,67,79,68,73,78,71,32,55,54,57,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,48,56,10,48,56,10,55,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,56,10,50,48, 10,52,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,49,50,10,69,78, 67,79,68,73,78,71,32,55,54,57,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,52,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,70,48,10,48,48,10,50,48,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,49,51,10,69,78,67,79,68,73, 78,71,32,55,54,57,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,48,56, 10,48,56,10,55,56,10,56,56,10,56,56,10,56,56,10, 55,56,10,48,48,10,50,48,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,49,52,10,69,78,67,79,68,73,78,71,32,55, 55,48,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,52,48,10,50,48,10,70,56,10,48,48,10,70,56,10, 56,48,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,49, 53,10,69,78,67,79,68,73,78,71,32,55,55,48,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,48,10,50,48,10,70,56,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,49,54,10,69,78, 67,79,68,73,78,71,32,55,55,48,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,48,10,70, 56,10,48,48,10,70,56,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,49,55,10,69,78,67,79,68,73, 78,71,32,55,55,48,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,48,10,50,48,10,70,56, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,49,56,10,69,78,67,79,68,73,78,71,32,55, 55,48,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,56,48,10,56,48,10, 70,48,10,56,48,10,56,48,10,56,48,10,70,56,10,48, 48,10,50,48,10,53,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,49, 57,10,69,78,67,79,68,73,78,71,32,55,55,48,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,70, 56,10,56,48,10,56,56,10,55,48,10,48,48,10,50,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,49,65,10,69,78, 67,79,68,73,78,71,32,55,55,48,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,56,48,10,56,48,10,70,48,10,56,48,10,56,48, 10,56,48,10,70,56,10,48,48,10,50,56,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,49,66,10,69,78,67,79,68,73, 78,71,32,55,55,48,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,48,10,56,56,10,70,56,10,56,48,10,56,56,10, 55,48,10,48,48,10,50,56,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,49,67,10,69,78,67,79,68,73,78,71,32,55, 55,48,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,56,56,10,55,48,10,48,48,10,70,56,10, 56,48,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,50,48,10,52,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,49, 68,10,69,78,67,79,68,73,78,71,32,55,55,48,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,55,48,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,50,48, 10,52,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,49,69,10,69,78, 67,79,68,73,78,71,32,55,55,49,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,70,56,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,49,70,10,69,78,67,79,68,73, 78,71,32,55,55,49,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,50,48,10,48,48, 10,51,48,10,52,56,10,52,48,10,70,48,10,52,48,10, 52,48,10,52,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,50,48,10,69,78,67,79,68,73,78,71,32,55, 55,49,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,70,56,10,48,48,10,55,48,10,56,56,10, 56,48,10,56,48,10,57,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,50, 49,10,69,78,67,79,68,73,78,71,32,55,55,49,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,55,56,10,48,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,50,50,10,69,78, 67,79,68,73,78,71,32,55,55,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,70,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,50,51,10,69,78,67,79,68,73, 78,71,32,55,55,49,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,65,48,10,56,48, 10,56,48,10,66,48,10,67,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,50,52,10,69,78,67,79,68,73,78,71,32,55, 55,49,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,50, 53,10,69,78,67,79,68,73,78,71,32,55,55,49,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,66,48,10,67, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,50,54,10,69,78, 67,79,68,73,78,71,32,55,55,49,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,53,48,10,53, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,70,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,50,55,10,69,78,67,79,68,73, 78,71,32,55,55,49,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,53,48,10,53,48,10,48,48, 10,56,48,10,56,48,10,66,48,10,67,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,50,56,10,69,78,67,79,68,73,78,71,32,55, 55,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,49,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,50, 57,10,69,78,67,79,68,73,78,71,32,55,55,50,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,66,48,10,67, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,49,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,50,65,10,69,78, 67,79,68,73,78,71,32,55,55,50,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,70,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,48,48,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,50,66,10,69,78,67,79,68,73, 78,71,32,55,55,50,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,48,10,56,48, 10,56,48,10,66,48,10,67,56,10,56,56,10,56,56,10, 56,56,10,48,48,10,56,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,50,67,10,69,78,67,79,68,73,78,71,32,55, 55,50,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,55,48,10,48, 48,10,50,56,10,53,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,50, 68,10,69,78,67,79,68,73,78,71,32,55,55,50,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,48,48,10,54,48,10,50, 48,10,50,48,10,50,48,10,55,48,10,48,48,10,50,56, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,50,69,10,69,78, 67,79,68,73,78,71,32,55,55,50,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,48,10,48, 48,10,53,48,10,48,48,10,55,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,50,70,10,69,78,67,79,68,73, 78,71,32,55,55,50,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,49,48,10,50,48,10,48,48,10,53,48, 10,48,48,10,54,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,51,48,10,69,78,67,79,68,73,78,71,32,55, 55,50,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,49,48,10,50,48,10,48,48,10,56,56,10, 57,48,10,65,48,10,67,48,10,65,48,10,57,48,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,51, 49,10,69,78,67,79,68,73,78,71,32,55,55,50,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,48,10,65,48,10,56,48,10,56,48,10,57,48,10,65, 48,10,67,48,10,65,48,10,57,48,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,51,50,10,69,78, 67,79,68,73,78,71,32,55,55,51,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,57,48,10,65,48,10,67,48,10,65,48, 10,57,48,10,56,56,10,56,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,51,51,10,69,78,67,79,68,73, 78,71,32,55,55,51,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,48,10,56,48, 10,56,48,10,57,48,10,65,48,10,67,48,10,65,48,10, 57,48,10,56,56,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,51,52,10,69,78,67,79,68,73,78,71,32,55, 55,51,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,57,48,10, 65,48,10,67,48,10,65,48,10,57,48,10,56,56,10,56, 56,10,48,48,10,70,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,51, 53,10,69,78,67,79,68,73,78,71,32,55,55,51,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,57,48,10,65, 48,10,67,48,10,65,48,10,57,48,10,56,56,10,48,48, 10,70,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,51,54,10,69,78, 67,79,68,73,78,71,32,55,55,51,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,51,55,10,69,78,67,79,68,73, 78,71,32,55,55,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,54,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,51,56,10,69,78,67,79,68,73,78,71,32,55, 55,51,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,70,56,10,48,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,51, 57,10,69,78,67,79,68,73,78,71,32,55,55,51,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 70,56,10,48,48,10,54,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,55,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,51,65,10,69,78, 67,79,68,73,78,71,32,55,55,51,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,70,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,51,66,10,69,78,67,79,68,73, 78,71,32,55,55,51,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,54,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,55,48,10,48,48,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,51,67,10,69,78,67,79,68,73,78,71,32,55, 55,52,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,70,56,10,48, 48,10,50,48,10,53,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,51, 68,10,69,78,67,79,68,73,78,71,32,55,55,52,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,54,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,55,48,10,48,48,10,50,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,51,69,10,69,78, 67,79,68,73,78,71,32,55,55,52,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,48,10,50, 48,10,56,56,10,56,56,10,68,56,10,65,56,10,65,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,51,70,10,69,78,67,79,68,73, 78,71,32,55,55,52,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,50,48, 10,48,48,10,68,48,10,65,56,10,65,56,10,65,56,10, 65,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,52,48,10,69,78,67,79,68,73,78,71,32,55, 55,52,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,56,56,10,56,56,10, 68,56,10,65,56,10,65,56,10,56,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,52, 49,10,69,78,67,79,68,73,78,71,32,55,55,52,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,68,48,10,65, 56,10,65,56,10,65,56,10,65,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,52,50,10,69,78, 67,79,68,73,78,71,32,55,55,52,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,68,56,10,65,56,10,65,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,52,51,10,69,78,67,79,68,73, 78,71,32,55,55,52,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,68,48,10,65,56,10,65,56,10,65,56,10, 65,56,10,56,56,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,52,52,10,69,78,67,79,68,73,78,71,32,55, 55,52,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,56,56,10,67,56,10, 67,56,10,65,56,10,65,56,10,57,56,10,57,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,52, 53,10,69,78,67,79,68,73,78,71,32,55,55,52,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,66,48,10,67, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,52,54,10,69,78, 67,79,68,73,78,71,32,55,55,53,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,67,56,10,67,56,10,65,56,10,65,56,10,57,56, 10,57,56,10,56,56,10,56,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,52,55,10,69,78,67,79,68,73, 78,71,32,55,55,53,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,66,48,10,67,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,52,56,10,69,78,67,79,68,73,78,71,32,55, 55,53,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,67,56,10,67,56,10, 65,56,10,65,56,10,57,56,10,57,56,10,56,56,10,56, 56,10,48,48,10,70,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,52, 57,10,69,78,67,79,68,73,78,71,32,55,55,53,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,66,48,10,67, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,70,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,52,65,10,69,78, 67,79,68,73,78,71,32,55,55,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,67,56,10,67,56,10,65,56,10,65,56,10,57,56, 10,57,56,10,56,56,10,56,56,10,50,48,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,52,66,10,69,78,67,79,68,73, 78,71,32,55,55,53,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,66,48,10,67,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,50,48,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,52,67,10,69,78,67,79,68,73,78,71,32,55, 55,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,49,48,10,50,48,10,48,48,10,50,56,10,53,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,52, 68,10,69,78,67,79,68,73,78,71,32,55,55,53,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,48,10,50,48,10,48,48,10,50,56,10,53,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,52,69,10,69,78, 67,79,68,73,78,71,32,55,55,53,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,53,48,10,53,48,10,48, 48,10,50,56,10,53,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,52,70,10,69,78,67,79,68,73, 78,71,32,55,55,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,53,48,10,53,48,10,48,48, 10,50,56,10,53,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,53,48,10,69,78,67,79,68,73,78,71,32,55, 55,54,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,52,48,10,50,48,10,48,48,10,70,56,10,48,48,10, 55,48,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,53, 49,10,69,78,67,79,68,73,78,71,32,55,55,54,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,48,10,50,48,10,48,48,10,70,56,10,48,48,10,55, 48,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,53,50,10,69,78, 67,79,68,73,78,71,32,55,55,54,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,48,10,48, 48,10,70,56,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,53,51,10,69,78,67,79,68,73, 78,71,32,55,55,54,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,48,10,50,48,10,48,48, 10,70,56,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,53,52,10,69,78,67,79,68,73,78,71,32,55, 55,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,49,48,10,50,48,10,48,48,10,70,48,10, 56,56,10,56,56,10,70,48,10,56,48,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,53, 53,10,69,78,67,79,68,73,78,71,32,55,55,54,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,48,10,50,48,10,48,48,10,70,48,10,56, 56,10,56,56,10,56,56,10,70,48,10,56,48,10,56,48, 10,56,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,53,54,10,69,78, 67,79,68,73,78,71,32,55,55,54,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,70,48,10,56,56,10,56,56,10,70,48, 10,56,48,10,56,48,10,56,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,53,55,10,69,78,67,79,68,73, 78,71,32,55,55,54,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,48,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 70,48,10,56,48,10,56,48,10,56,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,53,56,10,69,78,67,79,68,73,78,71,32,55, 55,54,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,48,48,10,70,48,10, 56,56,10,56,56,10,70,48,10,65,48,10,57,48,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,53, 57,10,69,78,67,79,68,73,78,71,32,55,55,54,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,66,48,10,67, 56,10,56,48,10,56,48,10,56,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,53,65,10,69,78, 67,79,68,73,78,71,32,55,55,55,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,70,48,10,65,48, 10,57,48,10,56,56,10,56,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,53,66,10,69,78,67,79,68,73, 78,71,32,55,55,55,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,66,48,10,67,56,10,56,48,10,56,48,10, 56,48,10,56,48,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,53,67,10,69,78,67,79,68,73,78,71,32,55, 55,55,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,70,56,10,48,48,10,70,48,10,56,56,10, 56,56,10,56,56,10,70,48,10,65,48,10,57,48,10,56, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,53, 68,10,69,78,67,79,68,73,78,71,32,55,55,55,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,48,10,66,48,10,67, 56,10,56,48,10,56,48,10,56,48,10,56,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,53,69,10,69,78, 67,79,68,73,78,71,32,55,55,55,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,56,56,10,56,56,10,56,56,10,70,48,10,65,48, 10,57,48,10,56,56,10,56,56,10,48,48,10,70,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,53,70,10,69,78,67,79,68,73, 78,71,32,55,55,55,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,66,48,10,67,56,10,56,48,10,56,48,10, 56,48,10,56,48,10,48,48,10,70,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,54,48,10,69,78,67,79,68,73,78,71,32,55, 55,55,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,48,48,10,55,48,10, 56,56,10,56,48,10,55,48,10,48,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,54, 49,10,69,78,67,79,68,73,78,71,32,55,55,55,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,54,48,10,49,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,54,50,10,69,78, 67,79,68,73,78,71,32,55,55,55,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,56,56,10,56,48,10,56,48,10,55,48,10,48,56, 10,48,56,10,56,56,10,55,48,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,54,51,10,69,78,67,79,68,73, 78,71,32,55,55,55,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,54,48,10,49,48,10, 56,56,10,55,48,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,54,52,10,69,78,67,79,68,73,78,71,32,55, 55,56,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,52,48,10,49,48,10,50,48,10,48,48,10,55,48,10, 56,56,10,56,48,10,55,48,10,48,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,54, 53,10,69,78,67,79,68,73,78,71,32,55,55,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,52,48,10, 49,48,10,50,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,54,48,10,49,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,54,54,10,69,78, 67,79,68,73,78,71,32,55,55,56,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,48,48,10,53, 48,10,50,48,10,55,48,10,56,56,10,56,48,10,55,48, 10,48,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,54,55,10,69,78,67,79,68,73, 78,71,32,55,55,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,48,48,10,53,48,10,50,48, 10,48,48,10,55,48,10,56,56,10,54,48,10,49,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,54,56,10,69,78,67,79,68,73,78,71,32,55, 55,56,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,48,48,10,55,48,10, 56,56,10,56,48,10,55,48,10,48,56,10,56,56,10,55, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,54, 57,10,69,78,67,79,68,73,78,71,32,55,55,56,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,55,48,10,56, 56,10,54,48,10,49,48,10,56,56,10,55,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,54,65,10,69,78, 67,79,68,73,78,71,32,55,55,56,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,70,56,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,54,66,10,69,78,67,79,68,73, 78,71,32,55,55,56,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,50,48,10,48,48, 10,52,48,10,52,48,10,70,48,10,52,48,10,52,48,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,54,67,10,69,78,67,79,68,73,78,71,32,55, 55,56,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,54, 68,10,69,78,67,79,68,73,78,71,32,55,55,56,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,52,48,10,52,48,10,70,48,10,52, 48,10,52,48,10,52,48,10,52,56,10,51,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,54,69,10,69,78, 67,79,68,73,78,71,32,55,55,57,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,70,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,54,70,10,69,78,67,79,68,73, 78,71,32,55,55,57,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,52,48, 10,52,48,10,70,48,10,52,48,10,52,48,10,52,48,10, 52,56,10,51,48,10,48,48,10,70,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,55,48,10,69,78,67,79,68,73,78,71,32,55, 55,57,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,50,48,10,53,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,55, 49,10,69,78,67,79,68,73,78,71,32,55,55,57,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,52,48,10,52,48,10,70,48,10,52, 48,10,52,48,10,52,56,10,51,48,10,48,48,10,50,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,55,50,10,69,78, 67,79,68,73,78,71,32,55,55,57,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,55,51,10,69,78,67,79,68,73, 78,71,32,55,55,57,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,55,52,10,69,78,67,79,68,73,78,71,32,55, 55,57,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,55,48,10,48, 48,10,50,56,10,53,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,55, 53,10,69,78,67,79,68,73,78,71,32,55,55,57,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,57,56,10,54,56,10,48,48,10,50,56, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,55,54,10,69,78, 67,79,68,73,78,71,32,55,55,57,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,50,48,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,55,55,10,69,78,67,79,68,73, 78,71,32,55,55,57,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,57,56,10, 54,56,10,48,48,10,50,48,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,55,56,10,69,78,67,79,68,73,78,71,32,55, 56,48,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,49,48,10,50,48,10,48,48,10,50,56,10,53,48,10, 48,48,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,55, 57,10,69,78,67,79,68,73,78,71,32,55,56,48,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,49,48,10, 50,48,10,48,48,10,50,56,10,53,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,55,65,10,69,78, 67,79,68,73,78,71,32,55,56,48,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,53,48,10,53,48,10,48, 48,10,70,56,10,48,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,55,66,10,69,78,67,79,68,73, 78,71,32,55,56,48,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,53,48,10,53,48,10,48,48,10,70,56, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,55,67,10,69,78,67,79,68,73,78,71,32,55, 56,48,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,56,10,53,48,10,48,48,10,56,56,10, 56,56,10,56,56,10,53,48,10,53,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,55, 68,10,69,78,67,79,68,73,78,71,32,55,56,48,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,56,10,53,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,53,48,10,53,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,55,69,10,69,78, 67,79,68,73,78,71,32,55,56,48,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,53,48,10,53,48, 10,53,48,10,50,48,10,50,48,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,55,70,10,69,78,67,79,68,73, 78,71,32,55,56,48,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,53,48,10, 53,48,10,50,48,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,87,103, 114,97,118,101,10,69,78,67,79,68,73,78,71,32,55,56, 48,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,52,48,10,50,48,10,48,48,10,56,56,10,56, 56,10,65,56,10,65,56,10,65,56,10,68,56,10,56,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,119,103,114,97,118,101,10, 69,78,67,79,68,73,78,71,32,55,56,48,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,48,10,50,48,10,48,48,10,56,56,10,56,56,10, 65,56,10,65,56,10,65,56,10,53,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,87,97,99,117,116,101,10,69,78,67,79,68, 73,78,71,32,55,56,49,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,49,48,10,50,48,10,48, 48,10,56,56,10,56,56,10,65,56,10,65,56,10,65,56, 10,68,56,10,56,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,119, 97,99,117,116,101,10,69,78,67,79,68,73,78,71,32,55, 56,49,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,49,48,10,50,48,10,48,48,10, 56,56,10,56,56,10,65,56,10,65,56,10,65,56,10,53, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,87,100,105,101,114,101, 115,105,115,10,69,78,67,79,68,73,78,71,32,55,56,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,53,48,10,53,48,10,48,48,10,56,56,10,56,56, 10,65,56,10,65,56,10,65,56,10,68,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,119,100,105,101,114,101,115,105, 115,10,69,78,67,79,68,73,78,71,32,55,56,49,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,48,10,53,48,10,48,48,10,56,56,10,56, 56,10,65,56,10,65,56,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,56,54,10,69,78, 67,79,68,73,78,71,32,55,56,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,56,56,10,56,56,10,65,56,10,65,56, 10,65,56,10,68,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,56,55,10,69,78,67,79,68,73, 78,71,32,55,56,49,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,48,48,10,56,56,10,56,56,10,65,56,10,65,56,10, 65,56,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,56,56,10,69,78,67,79,68,73,78,71,32,55, 56,49,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,65,56,10,65,56,10,65,56,10,68,56,10,56, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,56, 57,10,69,78,67,79,68,73,78,71,32,55,56,49,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,65,56,10,65,56,10,65,56,10,53,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,56,65,10,69,78, 67,79,68,73,78,71,32,55,56,49,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,56,56,10,56,56,10,53,48,10,50,48, 10,53,48,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,56,66,10,69,78,67,79,68,73, 78,71,32,55,56,49,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,48,48,10,56,56,10,53,48,10,50,48,10,50,48,10, 53,48,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,56,67,10,69,78,67,79,68,73,78,71,32,55, 56,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,53,48,10,53,48,10,48,48,10,56,56,10, 56,56,10,53,48,10,50,48,10,53,48,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,56, 68,10,69,78,67,79,68,73,78,71,32,55,56,50,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,48,10,53,48,10,48,48,10,56,56,10,53, 48,10,50,48,10,50,48,10,53,48,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,56,69,10,69,78, 67,79,68,73,78,71,32,55,56,50,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,50, 48,10,48,48,10,56,56,10,56,56,10,53,48,10,53,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,56,70,10,69,78,67,79,68,73, 78,71,32,55,56,50,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,57,56,10, 54,56,10,48,56,10,56,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,57,48,10,69,78,67,79,68,73,78,71,32,55, 56,50,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,51,48,10,52,56,10,48,48,10,70,56,10, 48,56,10,49,48,10,50,48,10,52,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,57, 49,10,69,78,67,79,68,73,78,71,32,55,56,50,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,51,48,10,52,56,10,48,48,10,70,56,10,49, 48,10,50,48,10,52,48,10,56,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,57,50,10,69,78, 67,79,68,73,78,71,32,55,56,50,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,48,56,10,49,48,10,49,48,10,50,48,10,52,48, 10,52,48,10,56,48,10,70,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,57,51,10,69,78,67,79,68,73, 78,71,32,55,56,50,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,49,48,10,50,48,10,52,48,10, 56,48,10,70,56,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,57,52,10,69,78,67,79,68,73,78,71,32,55, 56,50,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,48,56,10,49,48,10, 49,48,10,50,48,10,52,48,10,52,48,10,56,48,10,70, 56,10,48,48,10,70,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,57, 53,10,69,78,67,79,68,73,78,71,32,55,56,50,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,56,10,49, 48,10,50,48,10,52,48,10,56,48,10,70,56,10,48,48, 10,70,56,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,57,54,10,69,78, 67,79,68,73,78,71,32,55,56,51,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,48,10,66,48,10,67,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,48,48,10,70,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,57,55,10,69,78,67,79,68,73, 78,71,32,55,56,51,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,53,48,10,53,48,10,48,48, 10,52,48,10,52,48,10,70,48,10,52,48,10,52,48,10, 52,56,10,51,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,57,56,10,69,78,67,79,68,73,78,71,32,55, 56,51,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,53,48,10,50,48,10,48,48,10, 56,56,10,56,56,10,65,56,10,65,56,10,65,56,10,53, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,57, 57,10,69,78,67,79,68,73,78,71,32,55,56,51,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 50,48,10,53,48,10,50,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,57,56,10,54,56,10,48,56,10,56,56, 10,55,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,57,65,10,69,78, 67,79,68,73,78,71,32,55,56,51,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,56,10,48,52,10,48, 52,10,48,56,10,48,48,10,55,48,10,48,56,10,55,56, 10,56,56,10,56,56,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,57,66,10,69,78,67,79,68,73, 78,71,32,55,56,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,50,48,10,48,48, 10,51,48,10,52,56,10,52,48,10,67,48,10,52,48,10, 52,48,10,52,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,65,48,10,69,78,67,79,68,73,78,71,32,55, 56,52,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,53,48,10,56,56,10, 56,56,10,56,56,10,70,56,10,56,56,10,56,56,10,56, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,65, 49,10,69,78,67,79,68,73,78,71,32,55,56,52,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,65,50,10,69,78, 67,79,68,73,78,71,32,55,56,52,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,49, 48,10,50,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,65,51,10,69,78,67,79,68,73, 78,71,32,55,56,52,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,53,48,10,49,48,10,50,48, 10,50,48,10,55,48,10,48,56,10,55,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,65,52,10,69,78,67,79,68,73,78,71,32,55, 56,52,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,52,10,65,56,10,48,48,10,50,48,10, 53,48,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,65, 53,10,69,78,67,79,68,73,78,71,32,55,56,52,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,52,10,65,56,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,65,54,10,69,78, 67,79,68,73,78,71,32,55,56,52,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,56,56,10,53, 52,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,65,55,10,69,78,67,79,68,73, 78,71,32,55,56,52,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,53,52, 10,48,48,10,55,48,10,48,56,10,55,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,65,56,10,69,78,67,79,68,73,78,71,32,55, 56,52,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,56,10,53,52,10,65,52,10,48,56,10,50,56,10, 53,48,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,65, 57,10,69,78,67,79,68,73,78,71,32,55,56,52,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,56,10,53,52,10,65,52,10,48,56,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,65,65,10,69,78, 67,79,68,73,78,71,32,55,56,53,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,56,10,53,48,10,48, 48,10,51,48,10,52,56,10,50,48,10,53,48,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,65,66,10,69,78,67,79,68,73, 78,71,32,55,56,53,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,56,10,53,48,10,51,48,10,52,56, 10,48,48,10,55,48,10,48,56,10,55,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,65,67,10,69,78,67,79,68,73,78,71,32,55, 56,53,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,51,48,10,52,56,10,48,48,10,50,48,10, 53,48,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,65, 68,10,69,78,67,79,68,73,78,71,32,55,56,53,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,51,48,10,52,56,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,65,69,10,69,78, 67,79,68,73,78,71,32,55,56,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,48,10,56, 56,10,55,48,10,48,48,10,50,48,10,53,48,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,65,70,10,69,78,67,79,68,73, 78,71,32,55,56,53,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,49,48,10,50,48,10,56,56,10,55,48, 10,48,48,10,55,48,10,48,56,10,55,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,66,48,10,69,78,67,79,68,73,78,71,32,55, 56,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,52,48,10,50,48,10,56,56,10,55,48,10,48,48,10, 50,48,10,53,48,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,66, 49,10,69,78,67,79,68,73,78,71,32,55,56,53,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,52,48,10, 50,48,10,56,56,10,55,48,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,66,50,10,69,78, 67,79,68,73,78,71,32,55,56,53,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,49, 48,10,65,56,10,55,48,10,50,48,10,53,48,10,56,56, 10,56,56,10,70,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,66,51,10,69,78,67,79,68,73, 78,71,32,55,56,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,53,48,10,49,48,10,65,56, 10,55,48,10,48,48,10,55,48,10,48,56,10,55,56,10, 56,56,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,66,52,10,69,78,67,79,68,73,78,71,32,55, 56,54,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,53,48,10,65,48,10,56,56,10,55,48,10,48,48,10, 50,48,10,53,48,10,56,56,10,70,56,10,56,56,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,66, 53,10,69,78,67,79,68,73,78,71,32,55,56,54,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,53,48,10, 65,48,10,56,56,10,55,48,10,48,48,10,55,48,10,48, 56,10,55,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,66,54,10,69,78, 67,79,68,73,78,71,32,55,56,54,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,56,56,10,55, 48,10,48,48,10,50,48,10,53,48,10,56,56,10,56,56, 10,70,56,10,56,56,10,56,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,66,55,10,69,78,67,79,68,73, 78,71,32,55,56,54,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,55,48, 10,48,48,10,55,48,10,48,56,10,55,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,66,56,10,69,78,67,79,68,73,78,71,32,55, 56,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,56,10,56,48,10,56,48,10, 56,48,10,70,48,10,56,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,66, 57,10,69,78,67,79,68,73,78,71,32,55,56,54,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,66,65,10,69,78, 67,79,68,73,78,71,32,55,56,54,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,49, 48,10,50,48,10,70,56,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,66,66,10,69,78,67,79,68,73, 78,71,32,55,56,54,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,53,48,10,49,48,10,50,48, 10,50,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,66,67,10,69,78,67,79,68,73,78,71,32,55, 56,54,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,56,10,53,48,10,48,48,10,70,56,10, 56,48,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,66, 68,10,69,78,67,79,68,73,78,71,32,55,56,54,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,56,10,53,48,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,66,69,10,69,78, 67,79,68,73,78,71,32,55,56,55,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,52,52,10,65, 56,10,48,48,10,70,56,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,66,70,10,69,78,67,79,68,73, 78,71,32,55,56,55,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,52,10,65,56, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,67,48,10,69,78,67,79,68,73,78,71,32,55, 56,55,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,56,56,10,53,52,10,48,48,10,70,56,10, 56,48,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,67, 49,10,69,78,67,79,68,73,78,71,32,55,56,55,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,53,52,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,67,50,10,69,78, 67,79,68,73,78,71,32,55,56,55,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,56,10,53,52,10,65, 56,10,48,56,10,48,48,10,70,56,10,56,48,10,69,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,67,51,10,69,78,67,79,68,73, 78,71,32,55,56,55,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,56,10,53,52,10,65,56, 10,48,56,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,67,52,10,69,78,67,79,68,73,78,71,32,55, 56,55,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,56,10,53,48,10,51,48,10,52,56,10,48,48,10, 70,56,10,56,48,10,70,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,67, 53,10,69,78,67,79,68,73,78,71,32,55,56,55,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,56,10, 53,48,10,51,48,10,52,56,10,48,48,10,55,48,10,56, 56,10,70,56,10,56,48,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,67,54,10,69,78, 67,79,68,73,78,71,32,55,56,55,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,51,48,10,52, 56,10,48,48,10,70,56,10,56,48,10,56,48,10,70,48, 10,56,48,10,56,48,10,70,56,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,67,55,10,69,78,67,79,68,73, 78,71,32,55,56,55,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,48,10,52,56, 10,48,48,10,55,48,10,56,56,10,70,56,10,56,48,10, 56,56,10,55,48,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,67,56,10,69,78,67,79,68,73,78,71,32,55, 56,56,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,53,48,10,49,48,10,50,48,10,70,56,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,67, 57,10,69,78,67,79,68,73,78,71,32,55,56,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 53,48,10,50,48,10,50,48,10,48,48,10,54,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,67,65,10,69,78, 67,79,68,73,78,71,32,55,56,56,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,55,48,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,67,66,10,69,78,67,79,68,73, 78,71,32,55,56,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,50,48, 10,48,48,10,54,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,70,56,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,67,67,10,69,78,67,79,68,73,78,71,32,55, 56,56,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,67, 68,10,69,78,67,79,68,73,78,71,32,55,56,56,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,67,69,10,69,78, 67,79,68,73,78,71,32,55,56,56,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,49, 48,10,50,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,67,70,10,69,78,67,79,68,73, 78,71,32,55,56,56,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,53,48,10,49,48,10,50,48, 10,50,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,68,48,10,69,78,67,79,68,73,78,71,32,55, 56,56,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,52,10,65,56,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,68, 49,10,69,78,67,79,68,73,78,71,32,55,56,56,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,52,10,65,56,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,68,50,10,69,78, 67,79,68,73,78,71,32,55,56,57,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,56,56,10,53, 52,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,68,51,10,69,78,67,79,68,73, 78,71,32,55,56,57,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,56,56,10,53,52, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,68,52,10,69,78,67,79,68,73,78,71,32,55, 56,57,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,56,10,53,52,10,65,52,10,48,56,10,55,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,68, 53,10,69,78,67,79,68,73,78,71,32,55,56,57,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,56,10,53,52,10,65,52,10,48,56,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,68,54,10,69,78, 67,79,68,73,78,71,32,55,56,57,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,56,10,53,48,10,51, 56,10,52,56,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,68,55,10,69,78,67,79,68,73, 78,71,32,55,56,57,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,56,10,53,48,10,51,48,10,52,56, 10,48,48,10,55,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,68,56,10,69,78,67,79,68,73,78,71,32,55, 56,57,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,51,48,10,52,56,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,68, 57,10,69,78,67,79,68,73,78,71,32,55,56,57,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,51,48,10,52,56,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,68,65,10,69,78, 67,79,68,73,78,71,32,55,56,57,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,52, 48,10,48,48,10,54,52,10,57,52,10,57,56,10,57,48, 10,57,48,10,57,48,10,54,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,68,66,10,69,78,67,79,68,73, 78,71,32,55,56,57,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,52,48, 10,48,48,10,54,52,10,57,52,10,57,56,10,57,48,10, 57,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,68,67,10,69,78,67,79,68,73,78,71,32,55, 57,48,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,52,48,10,50,48,10,48,48,10,54,52,10, 57,52,10,57,56,10,57,48,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,68, 68,10,69,78,67,79,68,73,78,71,32,55,57,48,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,48,10,50,48,10,48,48,10,54,52,10,57, 52,10,57,56,10,57,48,10,57,48,10,54,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,68,69,10,69,78, 67,79,68,73,78,71,32,55,57,48,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,49, 48,10,50,48,10,54,52,10,57,52,10,57,56,10,57,48, 10,57,48,10,57,48,10,54,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,68,70,10,69,78,67,79,68,73, 78,71,32,55,57,48,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,53,48,10,49,48, 10,50,48,10,54,52,10,57,52,10,57,56,10,57,48,10, 57,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,69,48,10,69,78,67,79,68,73,78,71,32,55, 57,48,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,53,48,10,65,48,10,48,48,10,54,52,10, 57,52,10,57,56,10,57,48,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,69, 49,10,69,78,67,79,68,73,78,71,32,55,57,48,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,48,10,65,48,10,48,48,10,54,52,10,57, 52,10,57,56,10,57,48,10,57,48,10,54,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,69,50,10,69,78, 67,79,68,73,78,71,32,55,57,48,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,54, 52,10,57,52,10,57,56,10,57,48,10,57,48,10,57,48, 10,57,48,10,57,48,10,54,48,10,48,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,69,51,10,69,78,67,79,68,73, 78,71,32,55,57,48,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,54,52,10,57,52,10,57,56,10,57,48,10, 57,48,10,54,48,10,48,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,69,52,10,69,78,67,79,68,73,78,71,32,55, 57,48,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,69, 53,10,69,78,67,79,68,73,78,71,32,55,57,48,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,57,56,10,54,56,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,69,54,10,69,78, 67,79,68,73,78,71,32,55,57,49,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,53,48,10,49, 48,10,50,48,10,65,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,69,55,10,69,78,67,79,68,73, 78,71,32,55,57,49,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,53,48,10,49,48,10,50,48, 10,50,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,69,56,10,69,78,67,79,68,73,78,71,32,55, 57,49,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,52,48,10,48,48,10,57,52,10, 57,52,10,57,56,10,57,48,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,69, 57,10,69,78,67,79,68,73,78,71,32,55,57,49,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,52,48,10,48,48,10,57,52,10,57, 52,10,57,56,10,57,48,10,66,48,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,69,65,10,69,78, 67,79,68,73,78,71,32,55,57,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,52,48,10,50, 48,10,48,48,10,57,52,10,57,52,10,57,56,10,57,48, 10,57,48,10,57,48,10,54,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,69,66,10,69,78,67,79,68,73, 78,71,32,55,57,49,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,48,10,50,48, 10,48,48,10,57,52,10,57,52,10,57,56,10,57,48,10, 66,48,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,69,67,10,69,78,67,79,68,73,78,71,32,55, 57,49,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,53,48,10,49,48,10,50,48,10,66,52,10, 57,52,10,57,56,10,57,48,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,69, 68,10,69,78,67,79,68,73,78,71,32,55,57,49,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 53,48,10,49,48,10,50,48,10,50,48,10,57,52,10,57, 52,10,57,56,10,57,48,10,66,48,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,49,69,69,69,10,69,78, 67,79,68,73,78,71,32,55,57,49,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,53,48,10,65, 48,10,48,48,10,57,52,10,57,52,10,57,56,10,57,48, 10,57,48,10,57,48,10,54,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,49,69,69,70,10,69,78,67,79,68,73, 78,71,32,55,57,49,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,65,48, 10,48,48,10,57,52,10,57,52,10,57,56,10,57,48,10, 66,48,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,49,69,70,48,10,69,78,67,79,68,73,78,71,32,55, 57,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,57,52,10, 57,52,10,57,56,10,57,48,10,57,48,10,57,48,10,54, 48,10,48,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,49,69,70, 49,10,69,78,67,79,68,73,78,71,32,55,57,50,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,57,52,10,57, 52,10,57,56,10,57,48,10,66,48,10,53,48,10,48,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,89,103,114,97,118,101,10,69,78,67, 79,68,73,78,71,32,55,57,50,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,48,10,50,48, 10,48,48,10,56,56,10,56,56,10,53,48,10,53,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,121,103,114,97,118,101,10,69,78,67,79,68,73,78,71, 32,55,57,50,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,50,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,57,56,10,54,56, 10,48,56,10,56,56,10,55,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 69,70,52,10,69,78,67,79,68,73,78,71,32,55,57,50, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,56,56,10,53,48,10,53,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,69,70,53,10, 69,78,67,79,68,73,78,71,32,55,57,50,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,57,56,10, 54,56,10,48,56,10,56,56,10,55,48,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,69,70,54,10,69,78,67,79, 68,73,78,71,32,55,57,50,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,50,48,10,53,48,10,49,48,10, 50,48,10,56,56,10,53,48,10,53,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,69,70,55,10,69,78,67,79,68,73,78,71, 32,55,57,50,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,50,48,10,53,48,10,49,48,10,50,48,10,50, 48,10,56,56,10,56,56,10,56,56,10,57,56,10,54,56, 10,48,56,10,56,56,10,55,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 69,70,56,10,69,78,67,79,68,73,78,71,32,55,57,50, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,50,56,10,53,48,10,48,48,10,56,56,10,53,48, 10,53,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,69,70,57,10, 69,78,67,79,68,73,78,71,32,55,57,50,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,56,10,53,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,57,56,10,54,56,10,48,56,10,56,56,10,55, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,48,48,10,69,78,67,79, 68,73,78,71,32,55,57,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,48,49,10,69,78,67,79,68,73,78,71, 32,55,57,51,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,48,50,10,69,78,67,79,68,73,78,71,32,55,57,51, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,48,51,10, 69,78,67,79,68,73,78,71,32,55,57,51,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,48,52,10,69,78,67,79, 68,73,78,71,32,55,57,52,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,48,53,10,69,78,67,79,68,73,78,71, 32,55,57,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,48,54,10,69,78,67,79,68,73,78,71,32,55,57,52, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,54, 56,10,66,48,10,49,48,10,50,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,48,55,10, 69,78,67,79,68,73,78,71,32,55,57,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,54,56,10,66,48, 10,50,48,10,49,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,48,56,10,69,78,67,79, 68,73,78,71,32,55,57,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,50,56,10,50,56,10,51,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,48,57,10,69,78,67,79,68,73,78,71, 32,55,57,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,50,56,10,50,56,10,51,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,48,65,10,69,78,67,79,68,73,78,71,32,55,57,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,65,56, 10,54,56,10,51,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,48,66,10, 69,78,67,79,68,73,78,71,32,55,57,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,65,56,10,54,56,10, 51,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,48,67,10,69,78,67,79, 68,73,78,71,32,55,57,52,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,54,56,10,65,56,10,51,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,48,68,10,69,78,67,79,68,73,78,71, 32,55,57,52,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,54,56,10,65,56,10,51,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,48,69,10,69,78,67,79,68,73,78,71,32,55,57,53, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,50,56,10,69,56,10,54,56, 10,65,56,10,51,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,48,70,10, 69,78,67,79,68,73,78,71,32,55,57,53,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,50,56,10,69,56,10,65,56,10,54,56,10, 51,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,49,48,10,69,78,67,79, 68,73,78,71,32,55,57,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,54,48,10,56, 48,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,49,49,10,69,78,67,79,68,73,78,71, 32,55,57,53,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,55,48,10,56,56,10,54,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,49,50,10,69,78,67,79,68,73,78,71,32,55,57,53, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,55,48, 10,56,56,10,54,48,10,56,48,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,49,51,10, 69,78,67,79,68,73,78,71,32,55,57,53,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,55,48,10,56,56,10, 54,48,10,56,48,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,49,52,10,69,78,67,79, 68,73,78,71,32,55,57,53,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,55,48,10,56,56,10,54,48,10,56, 48,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,49,53,10,69,78,67,79,68,73,78,71, 32,55,57,53,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,55,48,10,56,56,10,54,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,49,56,10,69,78,67,79,68,73,78,71,32,55,57,54, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,54,48,10,65,48,10,50,48, 10,51,48,10,50,48,10,50,48,10,50,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,49,57,10, 69,78,67,79,68,73,78,71,32,55,57,54,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,65,48,10,54,48,10,50,48,10,51,48,10, 50,48,10,50,48,10,50,48,10,51,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,49,65,10,69,78,67,79, 68,73,78,71,32,55,57,54,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 54,48,10,65,48,10,65,48,10,55,48,10,50,48,10,50, 48,10,50,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,49,66,10,69,78,67,79,68,73,78,71, 32,55,57,54,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,65,48,10,54, 48,10,65,48,10,55,48,10,50,48,10,50,48,10,50,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,49,67,10,69,78,67,79,68,73,78,71,32,55,57,54, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,54,48,10,65,48,10,54,48, 10,66,48,10,50,48,10,50,48,10,50,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,49,68,10, 69,78,67,79,68,73,78,71,32,55,57,54,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,65,48,10,54,48,10,54,48,10,66,48,10, 50,48,10,50,48,10,50,48,10,51,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,50,48,10,69,78,67,79, 68,73,78,71,32,55,57,54,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,56,10,48,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,50,49,10,69,78,67,79,68,73,78,71, 32,55,57,54,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,50,50,10,69,78,67,79,68,73,78,71,32,55,57,55, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,56,10,48,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,50,51,10, 69,78,67,79,68,73,78,71,32,55,57,55,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,48, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,50,52,10,69,78,67,79, 68,73,78,71,32,55,57,55,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,56,10,48,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,50,53,10,69,78,67,79,68,73,78,71, 32,55,57,55,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,50,54,10,69,78,67,79,68,73,78,71,32,55,57,55, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,54, 56,10,66,48,10,49,48,10,50,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,56,10,48,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,50,55,10, 69,78,67,79,68,73,78,71,32,55,57,55,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,54,56,10,66,48, 10,50,48,10,49,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,48, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,50,56,10,69,78,67,79, 68,73,78,71,32,55,57,55,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,69,56,10, 54,56,10,65,56,10,50,56,10,51,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,50,57,10,69,78,67,79,68,73,78,71, 32,55,57,55,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,69,56,10,65,56,10,54, 56,10,50,56,10,51,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,50,65,10,69,78,67,79,68,73,78,71,32,55,57,55, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,56,10,54,56,10,65,56,10,65,56, 10,55,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,50,66,10, 69,78,67,79,68,73,78,71,32,55,57,55,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,69,56,10,65,56,10,54,56,10,65,56,10,55,56,10, 50,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,50,67,10,69,78,67,79, 68,73,78,71,32,55,57,56,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,69,56,10, 54,56,10,65,56,10,54,56,10,66,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,50,68,10,69,78,67,79,68,73,78,71, 32,55,57,56,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,69,56,10,65,56,10,54, 56,10,54,56,10,66,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,50,69,10,69,78,67,79,68,73,78,71,32,55,57,56, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,56,10,50,56,10,69,56,10,54,56, 10,66,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,50,70,10, 69,78,67,79,68,73,78,71,32,55,57,56,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,69,56,10,50,56,10,69,56,10,65,56,10,55,56,10, 50,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,51,48,10,69,78,67,79, 68,73,78,71,32,55,57,56,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,54,48,10,50,48,10, 52,48,10,48,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,53,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,51,49,10,69,78,67,79,68,73,78,71, 32,55,57,56,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,54,48,10,52,48,10,50,48,10,48, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,53,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,51,50,10,69,78,67,79,68,73,78,71,32,55,57,56, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,51,51,10, 69,78,67,79,68,73,78,71,32,55,57,56,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,51,52,10,69,78,67,79, 68,73,78,71,32,55,57,56,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,56,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,51,53,10,69,78,67,79,68,73,78,71, 32,55,57,56,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,56, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,51,54,10,69,78,67,79,68,73,78,71,32,55,57,57, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,54, 56,10,66,48,10,49,48,10,50,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,51,55,10, 69,78,67,79,68,73,78,71,32,55,57,57,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,54,56,10,66,48, 10,50,48,10,49,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,51,56,10,69,78,67,79, 68,73,78,71,32,55,57,57,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 53,48,10,57,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,51,57,10,69,78,67,79,68,73,78,71, 32,55,57,57,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,57,48,10,53, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,51,65,10,69,78,67,79,68,73,78,71,32,55,57,57, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,53,48,10,57,48,10,57,48, 10,53,48,10,49,48,10,49,48,10,49,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,51,66,10, 69,78,67,79,68,73,78,71,32,55,57,57,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,57,48,10,53,48,10,57,48,10,53,48,10, 49,48,10,49,48,10,49,48,10,51,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,51,67,10,69,78,67,79, 68,73,78,71,32,55,57,57,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 53,48,10,57,48,10,53,48,10,57,48,10,49,48,10,49, 48,10,49,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,51,68,10,69,78,67,79,68,73,78,71, 32,55,57,57,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,57,48,10,53, 48,10,51,48,10,53,48,10,49,48,10,49,48,10,49,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,51,69,10,69,78,67,79,68,73,78,71,32,55,57,57, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,49,48,10,68,48,10,53,48, 10,57,48,10,49,48,10,49,48,10,49,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,51,70,10, 69,78,67,79,68,73,78,71,32,55,57,57,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,49,48,10,68,48,10,57,48,10,53,48,10, 49,48,10,49,48,10,49,48,10,51,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,52,48,10,69,78,67,79, 68,73,78,71,32,56,48,48,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,52,49,10,69,78,67,79,68,73,78,71, 32,56,48,48,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,52,50,10,69,78,67,79,68,73,78,71,32,56,48,48, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,52,51,10, 69,78,67,79,68,73,78,71,32,56,48,48,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,52,52,10,69,78,67,79, 68,73,78,71,32,56,48,48,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,52,53,10,69,78,67,79,68,73,78,71, 32,56,48,48,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,52,56,10,69,78,67,79,68,73,78,71,32,56,48,48, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,50,56, 10,50,56,10,50,56,10,50,56,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,52,57,10, 69,78,67,79,68,73,78,71,32,56,48,48,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,50,56,10,50,56,10, 50,56,10,50,56,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,52,65,10,69,78,67,79, 68,73,78,71,32,56,48,49,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,65,56,10,54,56,10,50,56,10,50, 56,10,50,56,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,52,66,10,69,78,67,79,68,73,78,71, 32,56,48,49,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,65,56,10,54,56,10,50,56,10,50,56,10,50,56, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,52,67,10,69,78,67,79,68,73,78,71,32,56,48,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,54,56, 10,65,56,10,50,56,10,50,56,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,52,68,10, 69,78,67,79,68,73,78,71,32,56,48,49,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,54,56,10,65,56,10, 50,56,10,50,56,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,53,48,10,69,78,67,79, 68,73,78,71,32,56,48,49,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,53,49,10,69,78,67,79,68,73,78,71, 32,56,48,49,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,53,50,10,69,78,67,79,68,73,78,71,32,56,48,49, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,53,51,10, 69,78,67,79,68,73,78,71,32,56,48,49,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,53,52,10,69,78,67,79, 68,73,78,71,32,56,48,50,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,53,53,10,69,78,67,79,68,73,78,71, 32,56,48,50,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,53,54,10,69,78,67,79,68,73,78,71,32,56,48,50, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,54, 56,10,66,48,10,49,48,10,50,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,53,55,10, 69,78,67,79,68,73,78,71,32,56,48,50,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,54,56,10,66,48, 10,50,48,10,49,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,53,57,10,69,78,67,79, 68,73,78,71,32,56,48,50,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,69,56,10, 65,56,10,54,56,10,50,56,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,53,66,10,69,78,67,79,68,73,78,71, 32,56,48,50,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,69,56,10,65,56,10,54, 56,10,65,56,10,53,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,53,68,10,69,78,67,79,68,73,78,71,32,56,48,50, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,56,10,65,56,10,54,56,10,54,56, 10,57,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,53,70,10, 69,78,67,79,68,73,78,71,32,56,48,51,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,69,56,10,50,56,10,69,56,10,65,56,10,53,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,54,48,10,69,78,67,79, 68,73,78,71,32,56,48,51,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,49,48,10, 50,48,10,48,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,54,49,10,69,78,67,79,68,73,78,71, 32,56,48,51,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,50,48,10,49,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,54,50,10,69,78,67,79,68,73,78,71,32,56,48,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,68,48,10,52,56,10,56,48,10,48,48,10,56,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,53,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,54,51,10, 69,78,67,79,68,73,78,71,32,56,48,51,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,68,48, 10,56,56,10,52,48,10,48,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,53,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,54,52,10,69,78,67,79, 68,73,78,71,32,56,48,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,67,56,10,53,48,10, 56,48,10,48,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,54,53,10,69,78,67,79,68,73,78,71, 32,56,48,51,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,67,56,10,57,48,10,52,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,54,54,10,69,78,67,79,68,73,78,71,32,56,48,51, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,54, 56,10,66,48,10,49,48,10,50,48,10,48,48,10,56,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,53,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,54,55,10, 69,78,67,79,68,73,78,71,32,56,48,51,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,54,56,10,66,48, 10,50,48,10,49,48,10,48,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,53,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,54,56,10,69,78,67,79, 68,73,78,71,32,56,48,52,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,50,56,10,50,56,10,50,56,10,49, 48,10,49,48,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,54,57,10,69,78,67,79,68,73,78,71, 32,56,48,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,50,56,10,50,56,10,50,56,10,49,48,10,49,48, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,54,65,10,69,78,67,79,68,73,78,71,32,56,48,52, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,65,56, 10,54,56,10,50,56,10,49,48,10,49,48,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,54,66,10, 69,78,67,79,68,73,78,71,32,56,48,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,65,56,10,54,56,10, 50,56,10,49,48,10,49,48,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,54,67,10,69,78,67,79, 68,73,78,71,32,56,48,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,54,56,10,65,56,10,50,56,10,49, 48,10,49,48,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,54,68,10,69,78,67,79,68,73,78,71, 32,56,48,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,54,56,10,65,56,10,50,56,10,49,48,10,49,48, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,54,69,10,69,78,67,79,68,73,78,71,32,56,48,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,50,56,10,69,56,10,54,56, 10,65,56,10,50,56,10,49,48,10,49,48,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,54,70,10, 69,78,67,79,68,73,78,71,32,56,48,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,50,56,10,69,56,10,65,56,10,54,56,10, 50,56,10,49,48,10,49,48,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,55,48,10,69,78,67,79, 68,73,78,71,32,56,48,52,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,55,49,10,69,78,67,79,68,73,78,71, 32,56,48,52,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,55,50,10,69,78,67,79,68,73,78,71,32,56,48,53, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,48,10,50,48,10,48,48,10,55,48, 10,56,56,10,54,48,10,56,48,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,55,51,10, 69,78,67,79,68,73,78,71,32,56,48,53,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,50,48,10,48,48,10,55,48,10,56,56,10, 54,48,10,56,48,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,55,52,10,69,78,67,79, 68,73,78,71,32,56,48,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,56,10,48,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,55,53,10,69,78,67,79,68,73,78,71, 32,56,48,53,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,48,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,55,54,10,69,78,67,79,68,73,78,71,32,56,48,53, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,52,48,10,48,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,53,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,55,55,10, 69,78,67,79,68,73,78,71,32,56,48,53,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,52,48,10,48,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,53,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,55,56,10,69,78,67,79, 68,73,78,71,32,56,48,53,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,55,57,10,69,78,67,79,68,73,78,71, 32,56,48,53,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,55,65,10,69,78,67,79,68,73,78,71,32,56,48,53, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,48,10,50,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,55,66,10, 69,78,67,79,68,73,78,71,32,56,48,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,50,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,55,67,10,69,78,67,79, 68,73,78,71,32,56,48,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,55,68,10,69,78,67,79,68,73,78,71, 32,56,48,54,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,56,48,10,69,78,67,79,68,73,78,71,32,56,48,54, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,49,48,10,50,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,56,49,10, 69,78,67,79,68,73,78,71,32,56,48,54,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,51,48, 10,50,48,10,49,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,56,50,10,69,78,67,79, 68,73,78,71,32,56,48,54,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,68,48,10,52,56,10, 56,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,56,51,10,69,78,67,79,68,73,78,71, 32,56,48,54,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,68,48,10,56,56,10,52,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,56,52,10,69,78,67,79,68,73,78,71,32,56,48,54, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,67,56,10,53,48,10,56,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,56,53,10, 69,78,67,79,68,73,78,71,32,56,48,54,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,67,56, 10,57,48,10,52,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,56,54,10,69,78,67,79, 68,73,78,71,32,56,48,55,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,54,56,10,66,48,10,49,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,56,55,10,69,78,67,79,68,73,78,71, 32,56,48,55,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,54,56,10,66,48,10,50,48,10,49,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,56,56,10,69,78,67,79,68,73,78,71,32,56,48,55, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,50,56, 10,50,56,10,51,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,56,57,10, 69,78,67,79,68,73,78,71,32,56,48,55,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,50,56,10,50,56,10, 51,56,10,50,56,10,50,56,10,50,56,10,48,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,56,65,10,69,78,67,79, 68,73,78,71,32,56,48,55,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,65,56,10,54,56,10,51,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,56,66,10,69,78,67,79,68,73,78,71, 32,56,48,55,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,65,56,10,54,56,10,51,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,56,67,10,69,78,67,79,68,73,78,71,32,56,48,55, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,54,56, 10,65,56,10,51,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,56,68,10, 69,78,67,79,68,73,78,71,32,56,48,55,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,54,56,10,65,56,10, 51,56,10,50,56,10,50,56,10,50,56,10,48,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,56,69,10,69,78,67,79, 68,73,78,71,32,56,48,55,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 50,56,10,69,56,10,54,56,10,65,56,10,51,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,56,70,10,69,78,67,79,68,73,78,71, 32,56,48,55,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,50,56,10,69, 56,10,65,56,10,54,56,10,51,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,57,48,10,69,78,67,79,68,73,78,71,32,56,48,56, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,49,48,10,50,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,56,10,56,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,57,49,10, 69,78,67,79,68,73,78,71,32,56,48,56,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,51,48, 10,50,48,10,49,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,56, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,57,50,10,69,78,67,79, 68,73,78,71,32,56,48,56,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,68,48,10,52,56,10, 56,48,10,48,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,56,10,56,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,57,51,10,69,78,67,79,68,73,78,71, 32,56,48,56,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,68,48,10,56,56,10,52,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,56,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,57,52,10,69,78,67,79,68,73,78,71,32,56,48,56, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,67,56,10,53,48,10,56,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,56,10,56,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,57,53,10, 69,78,67,79,68,73,78,71,32,56,48,56,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,67,56, 10,57,48,10,52,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,56, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,57,54,10,69,78,67,79, 68,73,78,71,32,56,48,56,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,54,56,10,66,48,10,49,48,10, 50,48,10,48,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,56,10,56,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,57,55,10,69,78,67,79,68,73,78,71, 32,56,48,56,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,54,56,10,66,48,10,50,48,10,49,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,56,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,57,56,10,69,78,67,79,68,73,78,71,32,56,48,56, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,56,10,54,56,10,65,56,10,50,56, 10,51,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,57,57,10, 69,78,67,79,68,73,78,71,32,56,48,56,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,69,56,10,65,56,10,54,56,10,50,56,10,51,56,10, 50,56,10,50,56,10,50,56,10,50,56,10,48,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,57,65,10,69,78,67,79, 68,73,78,71,32,56,48,57,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,69,56,10, 54,56,10,65,56,10,65,56,10,55,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,57,66,10,69,78,67,79,68,73,78,71, 32,56,48,57,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,69,56,10,65,56,10,54, 56,10,65,56,10,55,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,57,67,10,69,78,67,79,68,73,78,71,32,56,48,57, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,56,10,54,56,10,65,56,10,54,56, 10,66,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,57,68,10, 69,78,67,79,68,73,78,71,32,56,48,57,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,69,56,10,65,56,10,54,56,10,54,56,10,66,56,10, 50,56,10,50,56,10,50,56,10,50,56,10,48,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,57,69,10,69,78,67,79, 68,73,78,71,32,56,48,57,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,69,56,10, 50,56,10,69,56,10,54,56,10,66,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,57,70,10,69,78,67,79,68,73,78,71, 32,56,48,57,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,69,56,10,50,56,10,69, 56,10,65,56,10,55,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,48,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,65,48,10,69,78,67,79,68,73,78,71,32,56,48,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,49,48,10,50,48,10,48,48,10,56,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,53,48,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,65,49,10, 69,78,67,79,68,73,78,71,32,56,48,57,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,51,48, 10,50,48,10,49,48,10,48,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,53,48,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,65,50,10,69,78,67,79, 68,73,78,71,32,56,48,57,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,68,48,10,52,56,10, 56,48,10,48,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,65,51,10,69,78,67,79,68,73,78,71, 32,56,48,57,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,68,48,10,56,56,10,52,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,65,52,10,69,78,67,79,68,73,78,71,32,56,49,48, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,67,56,10,53,48,10,56,48,10,48,48,10,56,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,53,48,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,65,53,10, 69,78,67,79,68,73,78,71,32,56,49,48,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,67,56, 10,57,48,10,52,48,10,48,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,53,48,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,65,54,10,69,78,67,79, 68,73,78,71,32,56,49,48,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,54,56,10,66,48,10,49,48,10, 50,48,10,48,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,65,55,10,69,78,67,79,68,73,78,71, 32,56,49,48,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,54,56,10,66,48,10,50,48,10,49,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,65,56,10,69,78,67,79,68,73,78,71,32,56,49,48, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,50,56, 10,50,56,10,50,56,10,49,48,10,49,48,10,50,56,10, 48,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,65,57,10, 69,78,67,79,68,73,78,71,32,56,49,48,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,50,56,10,50,56,10, 50,56,10,49,48,10,49,48,10,50,56,10,48,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,65,65,10,69,78,67,79, 68,73,78,71,32,56,49,48,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 54,56,10,65,56,10,65,56,10,54,56,10,50,56,10,49, 48,10,49,48,10,50,56,10,48,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,65,66,10,69,78,67,79,68,73,78,71, 32,56,49,48,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,65,56,10,54, 56,10,65,56,10,54,56,10,50,56,10,49,48,10,49,48, 10,50,56,10,48,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,65,67,10,69,78,67,79,68,73,78,71,32,56,49,48, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,54,56,10,65,56,10,54,56, 10,65,56,10,50,56,10,49,48,10,49,48,10,50,56,10, 48,48,10,49,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,65,68,10, 69,78,67,79,68,73,78,71,32,56,49,48,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,48,10,65,56,10,54,56,10,54,56,10,65,56,10, 50,56,10,49,48,10,49,48,10,50,56,10,48,48,10,49, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,65,69,10,69,78,67,79, 68,73,78,71,32,56,49,49,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,48,10, 50,56,10,69,56,10,54,56,10,65,56,10,50,56,10,49, 48,10,49,48,10,50,56,10,48,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,65,70,10,69,78,67,79,68,73,78,71, 32,56,49,49,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,50,56,10,69, 56,10,65,56,10,54,56,10,50,56,10,49,48,10,49,48, 10,50,56,10,48,48,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,66,48,10,69,78,67,79,68,73,78,71,32,56,49,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,56,10,55,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,66,49,10, 69,78,67,79,68,73,78,71,32,56,49,49,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,66,50,10,69,78,67,79, 68,73,78,71,32,56,49,49,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,66,51,10,69,78,67,79,68,73,78,71, 32,56,49,49,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,57,56, 10,54,56,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,66,52,10,69,78,67,79,68,73,78,71,32,56,49,49, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,49,48,10,50,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,57,56,10,54,56,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,66,54,10, 69,78,67,79,68,73,78,71,32,56,49,49,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,56,10,66,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,57,56,10,54,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,66,55,10,69,78,67,79, 68,73,78,71,32,56,49,49,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,56,10, 66,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,66,56,10,69,78,67,79,68,73,78,71, 32,56,49,50,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,56,56,10,55,48,10,48,48,10,50, 48,10,53,48,10,56,56,10,56,56,10,70,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,66,57,10,69,78,67,79,68,73,78,71,32,56,49,50, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,70,56,10,48,48,10,50,48,10,53,48,10,56,56, 10,56,56,10,70,56,10,56,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,66,65,10, 69,78,67,79,68,73,78,71,32,56,49,50,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,57,48,10,54,56,10,50,56,10,50,56,10,50,56,10, 51,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,66,66,10,69,78,67,79, 68,73,78,71,32,56,49,50,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,53,48,10, 65,56,10,50,56,10,50,56,10,50,56,10,51,56,10,50, 56,10,50,56,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,66,67,10,69,78,67,79,68,73,78,71, 32,56,49,50,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,53,48,10,56, 56,10,56,56,10,56,56,10,70,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,66,68,10,69,78,67,79,68,73,78,71,32,56,49,50, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,51,48,10,49,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,66,69,10, 69,78,67,79,68,73,78,71,32,56,49,50,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,66,70,10,69,78,67,79, 68,73,78,71,32,56,49,50,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,48,10, 49,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,67,48,10,69,78,67,79,68,73,78,71, 32,56,49,50,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,54,56,10,66,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,67,49,10,69,78,67,79,68,73,78,71,32,56,49,50, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,54,56,10,66,48,10,48,48,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,67,50,10, 69,78,67,79,68,73,78,71,32,56,49,51,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,48,10,50,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,56, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,67,51,10,69,78,67,79, 68,73,78,71,32,56,49,51,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,66,48,10,67,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,56,10,56,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,67,52,10,69,78,67,79,68,73,78,71, 32,56,49,51,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,48,10,48, 48,10,66,48,10,67,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,56,10,56,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,67,54,10,69,78,67,79,68,73,78,71,32,56,49,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,54,56,10,66,48,10,48,48,10,66,48, 10,67,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 48,56,10,48,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,67,55,10, 69,78,67,79,68,73,78,71,32,56,49,51,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,56,10,66,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,56, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,67,56,10,69,78,67,79, 68,73,78,71,32,56,49,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,66,56,10, 54,48,10,50,48,10,50,48,10,51,48,10,50,48,10,50, 48,10,50,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,67,57,10,69,78,67,79,68,73,78,71, 32,56,49,51,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,56,10,65,48,10,50, 48,10,50,48,10,51,48,10,50,48,10,50,48,10,50,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,67,65,10,69,78,67,79,68,73,78,71,32,56,49,51, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,65,56,10,54,56,10,50,56,10,50,56, 10,51,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,67,66,10, 69,78,67,79,68,73,78,71,32,56,49,51,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,56,10,65,56,10,50,56,10,50,56,10,51,56,10, 50,56,10,50,56,10,50,56,10,50,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,67,67,10,69,78,67,79, 68,73,78,71,32,56,49,52,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,70,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,48,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,67,68,10,69,78,67,79,68,73,78,71, 32,56,49,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,68,48,10,52,56,10,56, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,67,69,10,69,78,67,79,68,73,78,71,32,56,49,52, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,67,56,10,53,48,10,56,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,67,70,10, 69,78,67,79,68,73,78,71,32,56,49,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,56,10,66,48,10,49,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,68,48,10,69,78,67,79, 68,73,78,71,32,56,49,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,56,10, 55,48,10,48,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,56,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,68,49,10,69,78,67,79,68,73,78,71, 32,56,49,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,56,10,48, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,56, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,68,50,10,69,78,67,79,68,73,78,71,32,56,49,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,52,48,10,50,48,10,68,56,10,48,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,68,51,10, 69,78,67,79,68,73,78,71,32,56,49,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,50,48,10,68,56,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,68,54,10,69,78,67,79, 68,73,78,71,32,56,49,53,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,56,10, 66,48,10,48,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,56,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,68,55,10,69,78,67,79,68,73,78,71, 32,56,49,53,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,54,56,10,66,48,10,48,48,10,68,56,10,48, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,56, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,68,56,10,69,78,67,79,68,73,78,71,32,56,49,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,56,56,10,55,48,10,48,48,10,55,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,68,57,10, 69,78,67,79,68,73,78,71,32,56,49,53,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,48,48,10,55,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,68,65,10,69,78,67,79, 68,73,78,71,32,56,49,53,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,66,56,10, 53,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,68,66,10,69,78,67,79,68,73,78,71, 32,56,49,53,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,56,10,57,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,68,68,10,69,78,67,79,68,73,78,71,32,56,49,53, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,48,10,56,56,10,52,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,68,69,10, 69,78,67,79,68,73,78,71,32,56,49,53,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,67,56,10,57,48,10,52,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,68,70,10,69,78,67,79, 68,73,78,71,32,56,49,53,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,56,10, 66,48,10,50,48,10,49,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,69,48,10,69,78,67,79,68,73,78,71, 32,56,49,54,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,55,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,69,49,10,69,78,67,79,68,73,78,71,32,56,49,54, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,69,50,10, 69,78,67,79,68,73,78,71,32,56,49,54,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,52,48, 10,50,48,10,68,56,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,69,51,10,69,78,67,79, 68,73,78,71,32,56,49,54,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,49,48,10,50,48,10, 68,56,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,69,52,10,69,78,67,79,68,73,78,71, 32,56,49,54,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,51,48,10,49,48,10,50,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,70,48,10,56,48,10,56,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,69,53,10,69,78,67,79,68,73,78,71,32,56,49,54, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,50,48,10,49,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,70,48,10, 56,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,69,54,10, 69,78,67,79,68,73,78,71,32,56,49,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,56,10,66,48,10,48,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,69,55,10,69,78,67,79, 68,73,78,71,32,56,49,54,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,54,56,10,66,48,10,48,48,10, 68,56,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,69,56,10,69,78,67,79,68,73,78,71, 32,56,49,54,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,56,56,10,55,48,10,48,48,10,56, 56,10,53,48,10,53,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,69,57,10,69,78,67,79,68,73,78,71,32,56,49,54, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,70,56,10,48,48,10,56,56,10,56,56,10,53,48, 10,53,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,69,65,10, 69,78,67,79,68,73,78,71,32,56,49,55,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,65,56,10,54,56,10,50,56,10,50,56,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,69,66,10,69,78,67,79, 68,73,78,71,32,56,49,55,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,56,10, 65,56,10,50,56,10,50,56,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,69,67,10,69,78,67,79,68,73,78,71, 32,56,49,55,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,48,10,65,56,10,54, 56,10,50,56,10,51,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,69,68,10,69,78,67,79,68,73,78,71,32,56,49,55, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,52,48,10,50,48,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,69,69,10, 69,78,67,79,68,73,78,71,32,56,49,55,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,50,48,10,68,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,69,70,10,69,78,67,79, 68,73,78,71,32,56,49,55,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,70,50,10,69,78,67,79,68,73,78,71, 32,56,49,55,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,50,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,70,51,10,69,78,67,79,68,73,78,71,32,56,49,55, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,53,48,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,70,52,10, 69,78,67,79,68,73,78,71,32,56,49,56,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,50,48,10,48,48,10,56,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,53,48,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,70,54,10,69,78,67,79, 68,73,78,71,32,56,49,56,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,56,10, 66,48,10,48,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,70,55,10,69,78,67,79,68,73,78,71, 32,56,49,56,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,54,56,10,66,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,53,48,10,48,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,70,56,10,69,78,67,79,68,73,78,71,32,56,49,56, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,57,48,10,54,56,10,50,56,10,50,56, 10,50,56,10,50,56,10,50,56,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,70,57,10, 69,78,67,79,68,73,78,71,32,56,49,56,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,53,48,10,65,56,10,50,56,10,50,56,10,50,56,10, 50,56,10,50,56,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,70,65,10,69,78,67,79, 68,73,78,71,32,56,49,56,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,57,48,10, 54,56,10,50,56,10,50,56,10,50,56,10,50,56,10,49, 48,10,49,48,10,50,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,49,70,70,66,10,69,78,67,79,68,73,78,71, 32,56,49,56,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,53,48,10,65,56,10,50, 56,10,50,56,10,50,56,10,50,56,10,49,48,10,49,48, 10,50,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,49, 70,70,67,10,69,78,67,79,68,73,78,71,32,56,49,56, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,53,48,10,53,48,10,68,56,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,49,70,70,68,10, 69,78,67,79,68,73,78,71,32,56,49,56,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,49,48,10,50,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,49,70,70,69,10,69,78,67,79, 68,73,78,71,32,56,49,57,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,48,10, 50,48,10,49,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,48,48,10,69,78,67,79,68,73,78,71, 32,56,49,57,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,48,49,10,69,78,67,79,68,73,78,71,32,56,49,57, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,48,50,10, 69,78,67,79,68,73,78,71,32,56,49,57,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,48,51,10,69,78,67,79, 68,73,78,71,32,56,49,57,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,48,52,10,69,78,67,79,68,73,78,71, 32,56,49,57,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,48,53,10,69,78,67,79,68,73,78,71,32,56,49,57, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,48,54,10, 69,78,67,79,68,73,78,71,32,56,49,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,48,55,10,69,78,67,79, 68,73,78,71,32,56,49,57,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,48,56,10,69,78,67,79,68,73,78,71, 32,56,50,48,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,48,57,10,69,78,67,79,68,73,78,71,32,56,50,48, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,48,65,10, 69,78,67,79,68,73,78,71,32,56,50,48,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,48,66,10,69,78,67,79, 68,73,78,71,32,56,50,48,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,102,105,105,54,49,54,54,52,10,69,78,67,79,68,73, 78,71,32,56,50,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,102, 105,105,51,48,49,10,69,78,67,79,68,73,78,71,32,56, 50,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,97,102,105,105,50,57, 57,10,69,78,67,79,68,73,78,71,32,56,50,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,102,105,105,51,48,48,10,69,78, 67,79,68,73,78,71,32,56,50,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,49,48,10,69,78,67,79,68,73, 78,71,32,56,50,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,49,49,10,69,78,67,79,68,73,78,71,32,56, 50,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,102,105,103,117,114,101, 100,97,115,104,10,69,78,67,79,68,73,78,71,32,56,50, 49,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,101,110,100,97,115,104,10, 69,78,67,79,68,73,78,71,32,56,50,49,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,101,109,100,97,115,104,10,69,78,67,79,68, 73,78,71,32,56,50,49,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,67,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,97, 102,105,105,48,48,50,48,56,10,69,78,67,79,68,73,78, 71,32,56,50,49,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,67,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,48,49,54,10,69,78,67,79,68,73,78,71,32,56,50, 49,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,100,101,114,115,99, 111,114,101,100,98,108,10,69,78,67,79,68,73,78,71,32, 56,50,49,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,48,10,70,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,113,117,111,116,101, 108,101,102,116,10,69,78,67,79,68,73,78,71,32,56,50, 49,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,49,48,10,50,48,10,51,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,113,117,111,116,101,114,105, 103,104,116,10,69,78,67,79,68,73,78,71,32,56,50,49, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,51,48,10,49,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,113,117,111,116,101,115,105,110, 103,108,98,97,115,101,10,69,78,67,79,68,73,78,71,32, 56,50,49,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,51,48,10, 49,48,10,50,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,113,117,111,116,101, 114,101,118,101,114,115,101,100,10,69,78,67,79,68,73,78, 71,32,56,50,49,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,51,48,10,50,48,10, 49,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,113,117,111, 116,101,100,98,108,108,101,102,116,10,69,78,67,79,68,73, 78,71,32,56,50,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,56,10,57,48, 10,68,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,113,117, 111,116,101,100,98,108,114,105,103,104,116,10,69,78,67,79, 68,73,78,71,32,56,50,50,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,68,56,10, 52,56,10,57,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 113,117,111,116,101,100,98,108,98,97,115,101,10,69,78,67, 79,68,73,78,71,32,56,50,50,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,52,56,10,57,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,48,49,70,10,69,78,67,79,68,73,78, 71,32,56,50,50,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,68,56,10,57,48,10, 52,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,100,97,103, 103,101,114,10,69,78,67,79,68,73,78,71,32,56,50,50, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,70,56,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,100,97,103,103,101,114,100,98, 108,10,69,78,67,79,68,73,78,71,32,56,50,50,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,70,56,10,50,48,10,50, 48,10,70,56,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,98,117,108,108,101,116,10,69,78,67, 79,68,73,78,71,32,56,50,50,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,70,56,10,70,56,10,70,56,10, 55,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,48,50,51,10,69,78,67,79,68,73,78, 71,32,56,50,50,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,52,48,10, 54,48,10,55,48,10,55,56,10,55,48,10,54,48,10,52, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,111,110,101, 100,111,116,101,110,108,101,97,100,101,114,10,69,78,67,79, 68,73,78,71,32,56,50,50,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 116,119,111,100,111,116,101,110,108,101,97,100,101,114,10,69, 78,67,79,68,73,78,71,32,56,50,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,101,108,108,105,112,115,105,115,10,69,78,67,79, 68,73,78,71,32,56,50,51,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,65,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,50,55,10,69,78,67,79,68,73,78,71, 32,56,50,51,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,50,70,10,69,78,67,79,68,73,78,71,32,56,50,51, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,112,101,114,116,104,111,117,115, 97,110,100,10,69,78,67,79,68,73,78,71,32,56,50,52, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,56,10,65,56,10,53,48,10,49,48, 10,50,48,10,52,48,10,54,56,10,68,52,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,51,49,10, 69,78,67,79,68,73,78,71,32,56,50,52,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,56,10,65,56,10,53,48,10,49,48,10,50,56,10, 53,52,10,54,56,10,68,52,10,65,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,109,105,110,117,116,101,10,69,78,67,79,68, 73,78,71,32,56,50,52,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,52,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,115, 101,99,111,110,100,10,69,78,67,79,68,73,78,71,32,56, 50,52,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,53,48,10,53,48,10,65,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,51, 52,10,69,78,67,79,68,73,78,71,32,56,50,52,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,52,10,53,52,10,65,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,51,53,10,69,78, 67,79,68,73,78,71,32,56,50,52,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,52, 48,10,52,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,51,54,10,69,78,67,79,68,73, 78,71,32,56,50,52,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,65,48,10,65,48, 10,53,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,51,55,10,69,78,67,79,68,73,78,71,32,56, 50,52,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,65,56,10,65,56,10,53,52,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,51, 56,10,69,78,67,79,68,73,78,71,32,56,50,52,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,53,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,103,117,105,108,115,105,110,103,108,108, 101,102,116,10,69,78,67,79,68,73,78,71,32,56,50,52, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,48,10,50,48, 10,52,48,10,52,48,10,50,48,10,49,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,103,117,105,108,115,105,110,103, 108,114,105,103,104,116,10,69,78,67,79,68,73,78,71,32, 56,50,53,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,52,48, 10,50,48,10,49,48,10,49,48,10,50,48,10,52,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,48, 51,66,10,69,78,67,79,68,73,78,71,32,56,50,53,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,65,56,10,56,56,10,53,48,10,50,48,10, 65,56,10,50,48,10,53,48,10,56,56,10,65,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,101,120,99,108,97,109,100,98,108, 10,69,78,67,79,68,73,78,71,32,56,50,53,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,48,48,10,53,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,48,51,68,10,69,78,67, 79,68,73,78,71,32,56,50,53,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,55,48, 10,65,56,10,50,56,10,50,56,10,51,48,10,50,48,10, 50,48,10,48,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,48,51,69,10,69,78,67,79,68,73,78, 71,32,56,50,53,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,70,67,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,48,51,70,10,69,78,67,79,68,73,78,71,32,56,50, 53,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,56,56,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,48,52,48, 10,69,78,67,79,68,73,78,71,32,56,50,53,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,55, 48,10,56,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,48,52,49,10,69,78,67, 79,68,73,78,71,32,56,50,53,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,56,10,48,56,10,49,48,10, 49,48,10,50,48,10,50,48,10,53,48,10,53,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,48,52,50,10,69,78,67,79,68,73,78, 71,32,56,50,53,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,55,48,10,50,48,10,53,48,10,70,56,10,53, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,48,52,51,10,69,78,67,79,68,73,78,71,32,56,50, 53,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,55,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,102,114,97,99,116,105,111, 110,10,69,78,67,79,68,73,78,71,32,56,50,54,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,49,48,10,49,48,10,50,48,10,50, 48,10,52,48,10,52,48,10,56,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,52,53,10,69,78, 67,79,68,73,78,71,32,56,50,54,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,52,48,10,52,48,10,52,48,10,55,48,10,52,48, 10,52,48,10,52,48,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,52,54,10,69,78,67,79,68,73, 78,71,32,56,50,54,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,49,48, 10,49,48,10,49,48,10,55,48,10,49,48,10,49,48,10, 49,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,52,55,10,69,78,67,79,68,73,78,71,32,56, 50,54,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,56,10,66,52,10,66,52,10, 50,52,10,52,56,10,52,56,10,52,56,10,48,48,10,52, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,52, 56,10,69,78,67,79,68,73,78,71,32,56,50,54,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,56,10,65,56,10,65,56,10,50,56,10,52, 56,10,52,56,10,52,56,10,48,48,10,52,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,52,57,10,69,78, 67,79,68,73,78,71,32,56,50,54,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,57, 48,10,65,56,10,65,56,10,56,56,10,57,48,10,57,48, 10,57,48,10,48,48,10,57,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,52,65,10,69,78,67,79,68,73, 78,71,32,56,50,54,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,52,66,10,69,78,67,79,68,73,78,71,32,56, 50,54,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,48,10,66,56,10,66,56,10, 66,56,10,66,56,10,66,48,10,65,48,10,65,48,10,65, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,52, 67,10,69,78,67,79,68,73,78,71,32,56,50,54,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,56,10,69,56,10,69, 56,10,69,56,10,55,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,52,68,10,69,78, 67,79,68,73,78,71,32,56,50,54,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,48,10,66,56,10,66,56,10,66,56, 10,70,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,52,69,10,69,78,67,79,68,73, 78,71,32,56,50,55,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,65,56,10,55,48,10, 65,56,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,52,70,10,69,78,67,79,68,73,78,71,32,56, 50,55,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 55,48,10,50,48,10,48,48,10,48,48,10,54,48,10,50, 48,10,49,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,53, 48,10,69,78,67,79,68,73,78,71,32,56,50,55,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,48,48,10,48, 48,10,48,48,10,56,56,10,55,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,53,49,10,69,78, 67,79,68,73,78,71,32,56,50,55,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,65,56,10,55,48,10,65,56,10,50,48,10,65,56, 10,55,48,10,65,56,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,53,50,10,69,78,67,79,68,73, 78,71,32,56,50,55,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,67,56,10,67,56, 10,49,48,10,49,48,10,50,48,10,52,48,10,52,48,10, 57,56,10,57,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,53,55,10,69,78,67,79,68,73,78,71,32,56, 50,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,67,10,55,67,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,53, 70,10,69,78,67,79,68,73,78,71,32,56,50,56,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,54,48,10,69,78, 67,79,68,73,78,71,32,56,50,56,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,54,49,10,69,78,67,79,68,73, 78,71,32,56,50,56,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,48,54,50,10,69,78,67,79,68,73,78,71,32,56, 50,57,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,54, 51,10,69,78,67,79,68,73,78,71,32,56,50,57,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,122,101,114,111,115,117,112,101,114,105, 111,114,10,69,78,67,79,68,73,78,71,32,56,51,48,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,52,48, 10,65,48,10,65,48,10,65,48,10,52,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,48,55,49,10,69, 78,67,79,68,73,78,71,32,56,51,48,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,52,48,10,48,48,10, 52,48,10,52,48,10,52,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,102,111,117,114,115,117,112,101,114,105,111,114,10, 69,78,67,79,68,73,78,71,32,56,51,48,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,56,48,10,56,48, 10,67,48,10,69,48,10,52,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,102,105,118,101,115,117,112,101,114,105,111,114, 10,69,78,67,79,68,73,78,71,32,56,51,48,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,69,48,10,56, 48,10,67,48,10,50,48,10,67,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,115,105,120,115,117,112,101,114,105,111,114, 10,69,78,67,79,68,73,78,71,32,56,51,49,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,54,48,10,56, 48,10,67,48,10,65,48,10,52,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,115,101,118,101,110,115,117,112,101,114,105, 111,114,10,69,78,67,79,68,73,78,71,32,56,51,49,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,69,48, 10,50,48,10,52,48,10,52,48,10,52,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,101,105,103,104,116,115,117,112,101, 114,105,111,114,10,69,78,67,79,68,73,78,71,32,56,51, 49,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 52,48,10,65,48,10,52,48,10,65,48,10,52,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,110,105,110,101,115,117,112, 101,114,105,111,114,10,69,78,67,79,68,73,78,71,32,56, 51,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,52,48,10,65,48,10,54,48,10,50,48,10,67,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,48,55, 65,10,69,78,67,79,68,73,78,71,32,56,51,49,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 52,48,10,69,48,10,52,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,48,55,66,10,69,78, 67,79,68,73,78,71,32,56,51,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,69, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,55,67,10,69,78,67,79,68,73, 78,71,32,56,51,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,69,48,10,48,48,10,69,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,112,97, 114,101,110,108,101,102,116,115,117,112,101,114,105,111,114,10, 69,78,67,79,68,73,78,71,32,56,51,49,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,52,48,10,56,48, 10,56,48,10,56,48,10,52,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,112,97,114,101,110,114,105,103,104,116,115,117, 112,101,114,105,111,114,10,69,78,67,79,68,73,78,71,32, 56,51,49,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,52,48,10,50,48,10,50,48,10,50,48,10,52,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,110,115,117,112,101, 114,105,111,114,10,69,78,67,79,68,73,78,71,32,56,51, 49,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,67,48,10,65,48,10,65,48,10,65,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,122,101,114,111,105,110,102, 101,114,105,111,114,10,69,78,67,79,68,73,78,71,32,56, 51,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,65,48,10,65, 48,10,65,48,10,52,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,111,110,101,105,110,102, 101,114,105,111,114,10,69,78,67,79,68,73,78,71,32,56, 51,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,67,48,10,52, 48,10,52,48,10,69,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,116,119,111,105,110,102, 101,114,105,111,114,10,69,78,67,79,68,73,78,71,32,56, 51,50,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,65,48,10,50, 48,10,52,48,10,69,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,116,104,114,101,101,105, 110,102,101,114,105,111,114,10,69,78,67,79,68,73,78,71, 32,56,51,50,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,52,48,10,65,48, 10,52,48,10,50,48,10,67,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,102,111,117,114, 105,110,102,101,114,105,111,114,10,69,78,67,79,68,73,78, 71,32,56,51,50,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,48,10,56, 48,10,67,48,10,69,48,10,52,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,102,105,118, 101,105,110,102,101,114,105,111,114,10,69,78,67,79,68,73, 78,71,32,56,51,50,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,48,10, 56,48,10,67,48,10,50,48,10,67,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,115,105, 120,105,110,102,101,114,105,111,114,10,69,78,67,79,68,73, 78,71,32,56,51,50,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,54,48,10, 56,48,10,67,48,10,65,48,10,52,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,115,101, 118,101,110,105,110,102,101,114,105,111,114,10,69,78,67,79, 68,73,78,71,32,56,51,50,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 48,10,50,48,10,52,48,10,52,48,10,52,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 101,105,103,104,116,105,110,102,101,114,105,111,114,10,69,78, 67,79,68,73,78,71,32,56,51,50,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,52,48,10,65,48,10,52,48,10,65,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,110,105,110,101,105,110,102,101,114,105,111,114,10,69, 78,67,79,68,73,78,71,32,56,51,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,48,10,65,48,10,54,48,10,50,48,10,67,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,48,56,65,10,69,78,67,79,68, 73,78,71,32,56,51,51,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,52,48,10,69,48,10,52,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,48,56,66,10,69,78,67,79,68,73,78,71,32, 56,51,51,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,48, 56,67,10,69,78,67,79,68,73,78,71,32,56,51,51,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,48,10,48,48,10,69, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,112,97,114,101,110,108,101,102,116, 105,110,102,101,114,105,111,114,10,69,78,67,79,68,73,78, 71,32,56,51,51,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,52,48,10,56, 48,10,56,48,10,56,48,10,52,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,112,97,114, 101,110,114,105,103,104,116,105,110,102,101,114,105,111,114,10, 69,78,67,79,68,73,78,71,32,56,51,51,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,52,48,10,50,48,10,50,48,10,50,48,10,52, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,65,48,10,69,78,67,79, 68,73,78,71,32,56,51,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 54,48,10,56,48,10,56,48,10,66,56,10,65,48,10,55, 48,10,50,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 99,111,108,111,110,109,111,110,101,116,97,114,121,10,69,78, 67,79,68,73,78,71,32,56,51,53,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,56,10,55, 56,10,57,56,10,57,48,10,65,48,10,65,48,10,65,48, 10,67,48,10,67,56,10,70,48,10,56,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,48,65,50,10,69,78,67,79,68,73, 78,71,32,56,51,53,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,65,56,10,66,48,10,65,48,10, 65,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,102,114, 97,110,99,10,69,78,67,79,68,73,78,71,32,56,51,53, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,56,48,10,56,48,10,56,48, 10,69,56,10,66,48,10,65,48,10,65,48,10,65,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,108,105,114,97,10,69,78,67, 79,68,73,78,71,32,56,51,53,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,51,48, 10,52,56,10,52,48,10,69,48,10,52,48,10,69,48,10, 52,48,10,52,56,10,66,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,48,65,53,10,69,78,67,79,68,73,78, 71,32,56,51,53,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,49,48,10, 49,48,10,68,48,10,65,56,10,65,56,10,65,56,10,65, 56,10,67,56,10,67,48,10,52,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,48,65,54,10,69,78,67,79,68,73,78,71,32,56,51, 53,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,52,56,10,52,56,10,54,56,10,70, 67,10,54,56,10,70,67,10,53,56,10,53,56,10,52,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,112,101,115,101,116,97,10, 69,78,67,79,68,73,78,71,32,56,51,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,52,56,10,70,67,10,52,56,10,55,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,65,56,10,69,78,67,79, 68,73,78,71,32,56,51,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,67,48,10, 65,48,10,65,48,10,65,48,10,68,56,10,65,48,10,66, 48,10,65,56,10,66,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,65,57,10,69,78,67,79,68,73,78,71, 32,56,51,54,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,56,56,10,70, 56,10,56,56,10,70,56,10,65,56,10,65,56,10,68,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,102,105,105, 53,55,54,51,54,10,69,78,67,79,68,73,78,71,32,56, 51,54,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,52,10,57,52,10,66,52,10, 66,52,10,66,52,10,66,52,10,66,52,10,65,52,10,57, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,100,111,110,103,10,69, 78,67,79,68,73,78,71,32,56,51,54,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 49,48,10,55,48,10,49,48,10,55,48,10,57,48,10,57, 48,10,57,48,10,57,48,10,55,48,10,48,48,10,70,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,69,117,114,111,10,69,78,67,79,68,73,78,71, 32,56,51,54,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,51,56,10,52,48,10,52, 48,10,70,48,10,52,48,10,70,48,10,52,48,10,52,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,65,68,10,69,78,67,79,68,73,78,71,32,56,51,54, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,52,10,52,52,10,52,56,10,53,48, 10,70,67,10,53,48,10,52,56,10,52,52,10,52,52,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,65,69,10, 69,78,67,79,68,73,78,71,32,56,51,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,50,48,10,50,48,10,51,48,10,54,48,10, 51,48,10,54,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,65,70,10,69,78,67,79, 68,73,78,71,32,56,51,54,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 55,48,10,67,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,69,56,10,68,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,66,48,10,69,78,67,79,68,73,78,71, 32,56,51,54,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,49,48,10,50,56,10,50, 56,10,50,56,10,49,48,10,49,48,10,53,48,10,54,56, 10,65,56,10,48,56,10,49,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,66,49,10,69,78,67,79,68,73,78,71,32,56,51,54, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,54,48,10,53,48,10,70,56,10,70,56, 10,53,48,10,54,48,10,52,48,10,52,48,10,52,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,68,48,10, 69,78,67,79,68,73,78,71,32,56,52,48,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,50,48,10,52,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,68,49,10,69,78,67,79, 68,73,78,71,32,56,52,48,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,50,48,10,49,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,68,50,10,69,78,67,79,68,73,78,71, 32,56,52,48,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,68,51,10,69,78,67,79,68,73,78,71,32,56,52,48, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,68,52,10, 69,78,67,79,68,73,78,71,32,56,52,48,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,51,48, 10,67,56,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,68,53,10,69,78,67,79, 68,73,78,71,32,56,52,48,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,54,48,10,57,56,10, 49,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,68,54,10,69,78,67,79,68,73,78,71, 32,56,52,48,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,52,48,10,70,56,10,52,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,68,55,10,69,78,67,79,68,73,78,71,32,56,52,48, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,48,10,70,56,10,49,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,68,56,10, 69,78,67,79,68,73,78,71,32,56,52,48,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,53,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,68,57,10,69,78,67,79, 68,73,78,71,32,56,52,48,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,51,48,10,52,56,10,69, 56,10,52,56,10,51,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,68,65,10,69,78,67,79,68,73,78,71, 32,56,52,49,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,54,48,10,57,48,10,66,56,10,57,48, 10,54,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,68,66,10,69,78,67,79,68,73,78,71,32,56,52,49, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,65,56,10,65,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,68,67,10, 69,78,67,79,68,73,78,71,32,56,52,49,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,66,52, 10,66,52,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,68,68,10,69,78,67,79, 68,73,78,71,32,56,52,49,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,55,56,10,56,52,10,56,52,10, 56,52,10,56,52,10,56,52,10,56,52,10,56,52,10,56, 52,10,56,52,10,56,52,10,56,52,10,55,56,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,68,69,10,69,78,67,79,68,73,78,71, 32,56,52,49,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,70,67,10,56,52,10,56,52,10,56,52,10,56, 52,10,56,52,10,56,52,10,56,52,10,56,52,10,56,52, 10,56,52,10,56,52,10,70,67,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,68,70,10,69,78,67,79,68,73,78,71,32,56,52,49, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,51, 48,10,52,56,10,56,52,10,56,52,10,56,52,10,56,52, 10,56,52,10,56,52,10,56,52,10,56,52,10,56,52,10, 52,56,10,51,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,69,48,10, 69,78,67,79,68,73,78,71,32,56,52,49,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,55,56,10,67,52, 10,65,52,10,65,52,10,65,52,10,65,52,10,65,52,10, 57,52,10,57,52,10,57,52,10,57,52,10,56,67,10,55, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,69,49,10,69,78,67,79, 68,73,78,71,32,56,52,49,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,53,48,10,70,56,10, 53,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,69,50,10,69,78,67,79,68,73,78,71, 32,56,52,49,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,55,56,10,56,52,10,56,52,10,56, 52,10,56,52,10,56,52,10,56,52,10,56,52,10,56,52, 10,56,52,10,55,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,69,51,10,69,78,67,79,68,73,78,71,32,56,52,49, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,70, 67,10,70,67,10,56,52,10,56,52,10,56,52,10,56,52, 10,56,52,10,56,52,10,56,52,10,56,52,10,56,52,10, 70,67,10,70,67,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,69,52,10, 69,78,67,79,68,73,78,71,32,56,52,50,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,51,48,10,52,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,56,52,10, 56,52,10,56,52,10,56,52,10,56,52,10,56,52,10,55, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,69,53,10,69,78,67,79, 68,73,78,71,32,56,52,50,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,52,48,10,52,48,10,50,48,10,49,48,10,49, 48,10,48,56,10,48,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,69,54,10,69,78,67,79,68,73,78,71, 32,56,52,50,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 48,69,55,10,69,78,67,79,68,73,78,71,32,56,52,50, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,70,67,10,48,52,10,48,52,10,48,52,10,48,52, 10,48,52,10,48,52,10,48,52,10,48,52,10,48,52,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,48,69,56,10, 69,78,67,79,68,73,78,71,32,56,52,50,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,65, 56,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,48,69,57,10,69,78,67,79, 68,73,78,71,32,56,52,50,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,70,56,10,56,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,48,69,65,10,69,78,67,79,68,73,78,71, 32,56,52,50,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,52,48,10,70,56,10,52,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,48,48,10,69,78,67,79,68,73,78,71,32,56,52,52, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,54,56,10,65,56,10,65,56,10,55,48, 10,54,48,10,53,56,10,65,48,10,65,48,10,57,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,48,49,10, 69,78,67,79,68,73,78,71,32,56,52,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,54,56,10,65,56,10,65,56,10,55,48,10,51,56,10, 54,48,10,57,48,10,56,56,10,66,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,48,50,10,69,78,67,79, 68,73,78,71,32,56,52,53,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 65,56,10,65,48,10,65,48,10,65,48,10,65,48,10,65, 48,10,65,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,48,51,10,69,78,67,79,68,73,78,71, 32,56,52,53,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,52,48,10,65,48,10,52,48,10,51,56,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,48,52,10,69,78,67,79,68,73,78,71,32,56,52,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,55,48,10,65,48, 10,65,48,10,65,48,10,55,48,10,50,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,54,49,50,52, 56,10,69,78,67,79,68,73,78,71,32,56,52,53,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,56,10,56,56,10,57,48,10,53,48,10,50, 48,10,53,48,10,54,56,10,65,56,10,57,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,49,48,54,10,69,78, 67,79,68,73,78,71,32,56,52,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,52, 56,10,56,56,10,57,48,10,53,48,10,50,48,10,54,56, 10,54,56,10,65,56,10,57,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,49,48,55,10,69,78,67,79,68,73, 78,71,32,56,52,53,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,56,10,56,56, 10,56,48,10,56,48,10,54,48,10,56,48,10,56,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,49,48,56,10,69,78,67,79,68,73,78,71,32,56, 52,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,48,10,57,48,10,48,56,10, 52,56,10,55,56,10,52,56,10,48,56,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,49,48, 57,10,69,78,67,79,68,73,78,71,32,56,52,53,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,52,48,10, 65,48,10,52,48,10,55,56,10,52,48,10,52,48,10,55, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,49,48,65,10,69,78, 67,79,68,73,78,71,32,56,52,53,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,52,56,10,56,56, 10,56,56,10,55,48,10,49,48,10,57,48,10,54,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,49,48,66,10,69,78,67,79,68,73, 78,71,32,56,52,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,67,56,10,52,56, 10,52,56,10,52,56,10,55,56,10,57,48,10,57,48,10, 57,48,10,57,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,49,48,67,10,69,78,67,79,68,73,78,71,32,56, 52,54,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,56,10,57,48,10,56,48,10, 66,48,10,67,56,10,52,56,10,50,56,10,65,56,10,52, 56,10,49,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,49,48, 68,10,69,78,67,79,68,73,78,71,32,56,52,54,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,65,56,10,65,56,10,65,56,10,65,56,10,66, 56,10,65,56,10,65,56,10,65,56,10,65,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,49,48,69,10,69,78, 67,79,68,73,78,71,32,56,52,54,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,50,48,10,52,48,10,55,48,10,52,56, 10,52,56,10,57,48,10,57,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,49,48,70,10,69,78,67,79,68,73, 78,71,32,56,52,54,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,51,48, 10,54,48,10,67,48,10,55,48,10,52,56,10,52,56,10, 57,48,10,57,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,49,49,48,10,69,78,67,79,68,73,78,71,32,56, 52,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,51,56,10,48,56,10,48,56,10, 49,48,10,49,48,10,49,48,10,50,48,10,65,48,10,52, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,73,102,114,97,107,116, 117,114,10,69,78,67,79,68,73,78,71,32,56,52,54,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,56,56,10,52,56,10,48,56,10, 49,48,10,49,48,10,48,56,10,67,56,10,51,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,49,50,10,69, 78,67,79,68,73,78,71,32,56,52,54,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 49,56,10,53,52,10,51,56,10,49,48,10,49,48,10,50, 48,10,54,48,10,65,56,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,97,102,105,105,54,49,50,56,57,10,69,78,67, 79,68,73,78,71,32,56,52,54,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,50,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 49,48,10,51,48,10,52,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,49,52,10,69,78,67,79,68,73,78, 71,32,56,52,54,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,65,48,10,70,56,10, 65,48,10,66,48,10,65,56,10,65,56,10,65,56,10,65, 56,10,66,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,49,53,10,69,78,67,79,68,73,78,71,32,56,52, 54,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,67,52,10,67,52,10,65,52,10,65, 52,10,66,52,10,66,52,10,65,67,10,65,67,10,65,52, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,97,102,105,105,54,49,51, 53,50,10,69,78,67,79,68,73,78,71,32,56,52,55,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,57,48,10,57,48,10,68,48,10,68,48,10, 68,67,10,66,52,10,66,52,10,57,52,10,57,67,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,49,55,10,69, 78,67,79,68,73,78,71,32,56,52,55,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,69,56,10,68,56,10,69,56,10,67, 56,10,67,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,119,101,105,101,114,115,116,114,97,115,115,10,69, 78,67,79,68,73,78,71,32,56,52,55,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,48,10,52,56,10,52,56,10,52,56,10,55,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,49,57,10,69,78,67,79,68, 73,78,71,32,56,52,55,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,48,10,65, 56,10,65,56,10,65,56,10,65,56,10,66,48,10,65,48, 10,65,48,10,65,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,49,65,10,69,78,67,79,68,73,78,71,32, 56,52,55,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 55,48,10,48,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 49,66,10,69,78,67,79,68,73,78,71,32,56,52,55,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,48,10,52,56,10,52,56,10,52,56,10, 55,48,10,65,48,10,57,48,10,57,48,10,57,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,82,102,114,97,107,116,117,114,10, 69,78,67,79,68,73,78,71,32,56,52,55,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,48,10,65,56,10,54,56,10,50,56,10,51,48,10, 51,48,10,66,48,10,65,56,10,52,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,49,68,10,69,78,67,79, 68,73,78,71,32,56,52,55,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,48,10, 65,56,10,65,56,10,65,56,10,66,48,10,66,48,10,65, 56,10,65,56,10,65,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 112,114,101,115,99,114,105,112,116,105,111,110,10,69,78,67, 79,68,73,78,71,32,56,52,55,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,48, 10,56,56,10,56,56,10,56,56,10,70,48,10,65,56,10, 57,48,10,65,56,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,49,70,10,69,78,67,79,68,73,78, 71,32,56,52,55,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,54,48,10,50,48,10,70,48,10,65,56,10, 65,56,10,65,56,10,70,48,10,65,48,10,66,48,10,65, 56,10,65,56,10,50,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,50,48,10,69,78,67,79,68,73,78,71,32,56,52, 56,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 54,56,10,66,56,10,54,56,10,65,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,50,49, 10,69,78,67,79,68,73,78,71,32,56,52,56,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,69, 48,10,52,48,10,55,48,10,54,48,10,51,48,10,50,48, 10,51,48,10,48,48,10,49,48,10,49,48,10,49,48,10, 49,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,116,114,97,100,101,109,97,114,107,10,69, 78,67,79,68,73,78,71,32,56,52,56,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,52,10,53,67,10,53,52,10,53,52,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,50,51,10,69,78,67,79,68, 73,78,71,32,56,52,56,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,54,48,10,50,48,10,65,56,10,65, 56,10,65,56,10,65,56,10,55,48,10,55,48,10,55,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,50,52,10,69,78,67,79,68,73,78,71,32, 56,52,56,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,50,56,10,50,56, 10,53,48,10,53,48,10,53,48,10,65,48,10,65,48,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 50,53,10,69,78,67,79,68,73,78,71,32,56,52,56,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,56,10,49,48,10,50,48,10,55,56,10, 49,48,10,50,48,10,55,48,10,48,56,10,48,56,10,56, 56,10,55,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,79,109,101,103,97,10,69,78,67, 79,68,73,78,71,32,56,52,56,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 53,48,10,53,48,10,68,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,50,55,10,69,78,67,79,68,73,78, 71,32,56,52,56,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,68,56,10,53,48,10, 53,48,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,50,56,10,69,78,67,79,68,73,78,71,32,56,52, 56,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,48,10,56,56,10,48,56,10,52, 56,10,51,48,10,52,56,10,48,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,50,57, 10,69,78,67,79,68,73,78,71,32,56,52,56,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,54,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,49,50,65,10,69,78,67, 79,68,73,78,71,32,56,52,57,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,56,56, 10,56,56,10,57,48,10,65,48,10,67,48,10,65,48,10, 57,48,10,56,56,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,50,66,10,69,78,67,79,68,73,78, 71,32,56,52,57,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,50,48,10,53,48,10,50,48,10, 50,48,10,53,48,10,56,56,10,56,56,10,70,56,10,56, 56,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,50,67,10,69,78,67,79,68,73,78,71,32,56,52, 57,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,48,10,52,56,10,52,56,10,52, 56,10,55,48,10,57,48,10,57,48,10,57,48,10,69,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,50,68, 10,69,78,67,79,68,73,78,71,32,56,52,57,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,51,56,10,53,48,10,57,48,10,56,56,10,65,56, 10,57,48,10,56,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,101,115,116,105,109,97,116,101,100,10,69, 78,67,79,68,73,78,71,32,56,52,57,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,68,56,10,68,56,10,70, 56,10,67,48,10,67,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,50,70,10,69,78,67,79,68, 73,78,71,32,56,52,57,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,51,56,10,52,56,10,55,56,10,56,48, 10,57,48,10,54,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,51,48,10,69,78,67,79,68,73,78,71,32, 56,52,57,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,48,10,54,48,10,56,48,10,56,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 51,49,10,69,78,67,79,68,73,78,71,32,56,52,57,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,67,10,57,48,10,49,48,10,49,48,10, 55,56,10,50,48,10,50,48,10,65,48,10,52,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,51,50,10,69, 78,67,79,68,73,78,71,32,56,52,57,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,56,10,48,56,10,48,56,10,48,56,10,55,56,10,48, 56,10,48,56,10,48,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,51,51,10,69,78,67,79,68, 73,78,71,32,56,52,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,52,10,54, 67,10,53,52,10,53,52,10,52,52,10,56,56,10,56,56, 10,56,56,10,56,52,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,51,52,10,69,78,67,79,68,73,78,71,32, 56,53,48,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,51,56,10,52,56,10,52,56,10,57,48,10,57,48,10, 69,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,97,108,101,112,104, 10,69,78,67,79,68,73,78,71,32,56,53,48,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,57,48,10,52,56, 10,54,56,10,57,48,10,56,56,10,67,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,49,51,54,10,69,78,67, 79,68,73,78,71,32,56,53,48,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,51,55,10,69,78,67,79,68,73,78, 71,32,56,53,48,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,52,48,10,50,48,10,49,48,10,49,48,10,50, 56,10,52,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,51,56,10,69,78,67,79,68,73,78,71,32,56,53, 48,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,51,57, 10,69,78,67,79,68,73,78,71,32,56,53,48,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,51,48,10,51,48,10,48,48,10,55,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,55,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,49,51,65,10,69,78,67, 79,68,73,78,71,32,56,53,48,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,52,10,55,67,10,56,67,10, 56,52,10,56,52,10,55,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,51,68,10,69,78,67,79,68,73,78, 71,32,56,53,48,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,65,56,10,65,56,10,65,56,10,53,48,10,53, 48,10,65,48,10,65,48,10,67,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,51,69,10,69,78,67,79,68,73,78,71,32,56,53, 49,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,56,10,65,56,10,65,48,10,65, 48,10,65,48,10,65,48,10,65,48,10,65,48,10,65,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,51,70, 10,69,78,67,79,68,73,78,71,32,56,53,49,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,49,52,48,10,69,78,67, 79,68,73,78,71,32,56,53,49,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,56, 10,65,48,10,53,48,10,53,48,10,50,56,10,53,48,10, 53,48,10,65,48,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,52,49,10,69,78,67,79,68,73,78, 71,32,56,53,49,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,67,56,10,48,56,10,48,56,10,48,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,52,50,10,69,78,67,79,68,73,78,71,32,56,53, 49,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,48,56,10,48,56,10,48,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,52,51, 10,69,78,67,79,68,73,78,71,32,56,53,49,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,56,10,48,56,10,48,56,10,48,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,49,52,52,10,69,78,67, 79,68,73,78,71,32,56,53,49,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,53,48,10, 53,48,10,56,56,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,52,53,10,69,78,67,79,68,73,78, 71,32,56,53,49,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,56,10,53,52,10, 53,52,10,53,52,10,65,56,10,65,56,10,65,56,10,65, 56,10,70,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,52,54,10,69,78,67,79,68,73,78,71,32,56,53, 49,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,49,52,10,49,52,10,49,52,10,55, 52,10,65,56,10,65,56,10,65,56,10,65,56,10,54,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,52,55, 10,69,78,67,79,68,73,78,71,32,56,53,49,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,56,10,53,52, 10,53,52,10,66,56,10,65,48,10,55,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,49,52,56,10,69,78,67, 79,68,73,78,71,32,56,53,50,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,49,48,10,48,48,10,55,56,10,50,56,10,50,56,10, 53,48,10,53,48,10,53,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,49,52,57,10,69,78,67,79,68,73,78, 71,32,56,53,50,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,49,48,10,49,48,10, 48,48,10,55,56,10,50,56,10,50,56,10,53,48,10,53, 48,10,53,48,10,53,48,10,69,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,49,52,65,10,69,78,67,79,68,73,78,71,32,56,53, 50,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,48,10,50,48,10,70,48,10,65, 56,10,65,56,10,65,56,10,66,48,10,50,48,10,51,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,49,52,66, 10,69,78,67,79,68,73,78,71,32,56,53,50,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,66,48,10,52,56,10,67,56,10,50,56, 10,49,48,10,50,56,10,50,56,10,49,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,111,110,101,116,104,105,114,100,10,69,78, 67,79,68,73,78,71,32,56,53,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,57,48,10,50,56, 10,49,48,10,48,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,116,119,111,116,104,105,114,100,115,10,69,78,67,79, 68,73,78,71,32,56,53,51,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 65,48,10,52,48,10,56,48,10,70,48,10,50,56,10,49, 48,10,48,56,10,51,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,53,53,10,69,78,67,79,68,73,78,71, 32,56,53,51,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,66,56,10,50,48,10,51,48,10,48,56, 10,51,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,53,54,10,69,78,67,79,68,73,78,71,32,56,53,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,52,48,10,65,48,10,52,48,10,56,48,10,69,48, 10,51,56,10,50,48,10,51,48,10,48,56,10,51,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,53,55,10, 69,78,67,79,68,73,78,71,32,56,53,51,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,52,48, 10,65,48,10,52,48,10,50,48,10,67,48,10,51,56,10, 50,48,10,51,48,10,48,56,10,51,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,53,56,10,69,78,67,79, 68,73,78,71,32,56,53,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 67,48,10,69,48,10,52,48,10,51,56,10,50,48,10,51, 48,10,48,56,10,51,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,53,57,10,69,78,67,79,68,73,78,71, 32,56,53,51,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,57,56,10,50,48,10,51,48,10,50,56, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,53,65,10,69,78,67,79,68,73,78,71,32,56,53,51, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,48,10,56,48,10,67,48,10,50,48, 10,68,56,10,50,48,10,51,48,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,111,110,101,101,105,103,104,116, 104,10,69,78,67,79,68,73,78,71,32,56,53,51,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,56,48,10,57, 48,10,50,56,10,49,48,10,50,56,10,49,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,116,104,114,101,101,101,105,103,104,116, 104,115,10,69,78,67,79,68,73,78,71,32,56,53,52,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,52,48,10,65,48,10,52,48,10,50,48,10, 68,48,10,50,56,10,49,48,10,50,56,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,102,105,118,101,101,105,103,104,116, 104,115,10,69,78,67,79,68,73,78,71,32,56,53,52,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,69,48,10,56,48,10,69,48,10,50,48,10, 68,48,10,50,56,10,49,48,10,50,56,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,115,101,118,101,110,101,105,103,104, 116,104,115,10,69,78,67,79,68,73,78,71,32,56,53,52, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,69,48,10,50,48,10,52,48,10,52,48, 10,53,48,10,50,56,10,49,48,10,50,56,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,53,70,10, 69,78,67,79,68,73,78,71,32,56,53,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,54,48,10,69,78,67,79, 68,73,78,71,32,56,53,52,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,54,49,10,69,78,67,79,68,73,78,71, 32,56,53,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,54,50,10,69,78,67,79,68,73,78,71,32,56,53,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,65,56,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,54,51,10, 69,78,67,79,68,73,78,71,32,56,53,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,65,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 65,56,10,65,56,10,57,48,10,57,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,54,52,10,69,78,67,79, 68,73,78,71,32,56,53,52,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,56,10, 56,56,10,56,56,10,56,56,10,53,48,10,53,48,10,53, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,54,53,10,69,78,67,79,68,73,78,71, 32,56,53,52,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,56,10,65,56,10,65, 56,10,65,56,10,65,56,10,65,56,10,65,56,10,52,56, 10,52,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,54,54,10,69,78,67,79,68,73,78,71,32,56,53,53, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,68,52,10,68,52,10,68,52,10,68,52, 10,68,52,10,68,52,10,68,52,10,53,52,10,53,52,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,54,55,10, 69,78,67,79,68,73,78,71,32,56,53,53,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,68,67,10,68,67,10,68,67,10,68,67,10,68,67,10, 68,67,10,68,67,10,53,67,10,53,67,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,54,56,10,69,78,67,79, 68,73,78,71,32,56,53,53,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,65,56,10, 65,56,10,65,56,10,57,48,10,57,48,10,57,48,10,65, 56,10,65,56,10,65,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,54,57,10,69,78,67,79,68,73,78,71, 32,56,53,53,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,56,56,10,53, 48,10,53,48,10,50,48,10,53,48,10,53,48,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,54,65,10,69,78,67,79,68,73,78,71,32,56,53,53, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,65,56,10,65,56,10,65,56,10,52,56, 10,52,56,10,52,56,10,65,56,10,65,56,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,54,66,10, 69,78,67,79,68,73,78,71,32,56,53,53,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,65,67,10,65,67,10,65,67,10,52,67,10,52,67,10, 52,67,10,65,67,10,65,67,10,65,67,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,54,67,10,69,78,67,79, 68,73,78,71,32,56,53,53,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,54,68,10,69,78,67,79,68,73,78,71, 32,56,53,53,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,54,69,10,69,78,67,79,68,73,78,71,32,56,53,53, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,48,10,52,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,54,70,10, 69,78,67,79,68,73,78,71,32,56,53,53,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,56,10,56,56,10,68,56,10,65,56,10,65,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,55,48,10,69,78,67,79, 68,73,78,71,32,56,53,54,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,48,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,55,49,10,69,78,67,79,68,73,78,71, 32,56,53,54,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,53,48,10,48, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,55,50,10,69,78,67,79,68,73,78,71,32,56,53,54, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,65,56,10,48,48,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,55,51,10, 69,78,67,79,68,73,78,71,32,56,53,54,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,56,48,10,48,48,10,65,56,10,65,56,10, 65,56,10,65,56,10,57,48,10,57,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,55,52,10,69,78,67,79, 68,73,78,71,32,56,53,54,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,56,10,56,56,10,56,56,10,53, 48,10,53,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,55,53,10,69,78,67,79,68,73,78,71, 32,56,53,54,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,56,10,48, 48,10,65,56,10,65,56,10,65,56,10,65,56,10,52,56, 10,52,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,55,54,10,69,78,67,79,68,73,78,71,32,56,53,54, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,49,52,10,48,48,10,68,52, 10,68,52,10,68,52,10,68,52,10,53,52,10,53,52,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,55,55,10, 69,78,67,79,68,73,78,71,32,56,53,54,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,49,67,10,48,48,10,68,67,10,68,67,10, 68,67,10,68,67,10,53,67,10,53,67,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,55,56,10,69,78,67,79, 68,73,78,71,32,56,53,54,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 56,48,10,48,48,10,65,56,10,65,56,10,57,48,10,57, 48,10,65,56,10,65,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,55,57,10,69,78,67,79,68,73,78,71, 32,56,53,54,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,56,56,10,53,48,10,50,48,10,50,48,10,53,48, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,55,65,10,69,78,67,79,68,73,78,71,32,56,53,55, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,56,10,48,48,10,65,56, 10,65,56,10,52,56,10,52,56,10,65,56,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,55,66,10, 69,78,67,79,68,73,78,71,32,56,53,55,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,67,10,48,48,10,65,67,10,65,67,10, 52,67,10,52,67,10,65,67,10,65,67,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,55,67,10,69,78,67,79, 68,73,78,71,32,56,53,55,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,54,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,55,68,10,69,78,67,79,68,73,78,71, 32,56,53,55,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,48,10,56,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,55,69,10,69,78,67,79,68,73,78,71,32,56,53,55, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,56,10,48,56,10,48,56,10,55,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,55,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,55,70,10, 69,78,67,79,68,73,78,71,32,56,53,55,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,68,48,10,65,56,10, 65,56,10,65,56,10,65,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,56,48,10,69,78,67,79, 68,73,78,71,32,56,53,55,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 65,56,10,65,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,56,49,10,69,78,67,79,68,73,78,71, 32,56,53,55,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,48,10,56,56,10,69, 56,10,65,56,10,65,56,10,65,56,10,69,56,10,56,56, 10,70,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,56,50,10,69,78,67,79,68,73,78,71,32,56,53,55, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,65,56,10,65,56,10,70,56, 10,65,56,10,70,56,10,65,56,10,65,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,56,51,10, 69,78,67,79,68,73,78,71,32,56,53,55,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,114,114,111,119,108,101,102,116,10,69,78, 67,79,68,73,78,71,32,56,53,57,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,52,48,10,70,56, 10,52,48,10,50,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,114,114,111,119,117,112,10,69,78,67,79,68,73, 78,71,32,56,53,57,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,55,48, 10,65,56,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,114, 114,111,119,114,105,103,104,116,10,69,78,67,79,68,73,78, 71,32,56,53,57,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,49,48,10,70,56,10,49,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,97,114,114, 111,119,100,111,119,110,10,69,78,67,79,68,73,78,71,32, 56,53,57,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,65,56,10,55,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,97,114,114,111,119, 98,111,116,104,10,69,78,67,79,68,73,78,71,32,56,53, 57,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,56,10,70,67,10,52,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,97,114,114,111,119,117,112, 100,110,10,69,78,67,79,68,73,78,71,32,56,53,57,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,55,48,10,65,56,10,50,48,10, 50,48,10,50,48,10,65,56,10,55,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,57,54,10,69, 78,67,79,68,73,78,71,32,56,53,57,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 67,48,10,70,48,10,69,48,10,65,48,10,50,48,10,49, 48,10,49,48,10,48,56,10,48,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,57,55,10,69,78,67,79,68, 73,78,71,32,56,53,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,49,56,10,55, 56,10,51,56,10,50,56,10,50,48,10,52,48,10,52,48, 10,56,48,10,56,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,57,56,10,69,78,67,79,68,73,78,71,32, 56,54,48,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,56,48,10,56,48,10,52,48, 10,52,48,10,50,48,10,50,56,10,51,56,10,55,56,10, 49,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 57,57,10,69,78,67,79,68,73,78,71,32,56,54,48,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,48,56,10,49,48,10,49,48,10, 50,48,10,65,48,10,69,48,10,70,48,10,67,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,57,65,10,69, 78,67,79,68,73,78,71,32,56,54,48,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,56,10,52,56,10,70, 67,10,53,48,10,51,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,57,66,10,69,78,67,79,68, 73,78,71,32,56,54,48,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,51,48,10,50,56,10,70,67,10,52,56, 10,53,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,57,67,10,69,78,67,79,68,73,78,71,32, 56,54,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,67,48,10,68,56,10,54,52,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 57,68,10,69,78,67,79,68,73,78,71,32,56,54,48,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,67,10, 54,67,10,57,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,57,69,10,69, 78,67,79,68,73,78,71,32,56,54,48,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,56,10,53,48,10,70, 67,10,53,48,10,50,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,57,70,10,69,78,67,79,68, 73,78,71,32,56,54,48,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,55, 48,10,65,56,10,55,48,10,65,56,10,50,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,65,48,10,69,78,67,79,68,73,78,71,32, 56,54,48,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,53,48,10,50,56,10,70,67,10,50,56,10,53,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 65,49,10,69,78,67,79,68,73,78,71,32,56,54,48,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 65,56,10,55,48,10,65,56,10,55,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,65,50,10,69, 78,67,79,68,73,78,71,32,56,54,49,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,52,10,52,56,10,70, 48,10,52,56,10,50,52,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,65,51,10,69,78,67,79,68, 73,78,71,32,56,54,49,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,57,48,10,52,56,10,51,67,10,52,56, 10,57,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,65,52,10,69,78,67,79,68,73,78,71,32, 56,54,49,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,52,56,10,70,56,10,52,56,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 65,53,10,69,78,67,79,68,73,78,71,32,56,54,49,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,55,48,10,65,56,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,65,54,10,69, 78,67,79,68,73,78,71,32,56,54,49,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,48,10,57,48,10,70, 56,10,57,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,65,55,10,69,78,67,79,68, 73,78,71,32,56,54,49,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,65,56, 10,55,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,97, 114,114,111,119,117,112,100,110,98,115,101,10,69,78,67,79, 68,73,78,71,32,56,54,49,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 55,48,10,65,56,10,50,48,10,50,48,10,65,56,10,55, 48,10,50,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,65,57,10,69,78,67,79,68,73,78,71, 32,56,54,49,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,56,10,52,52,10,70,56,10,52,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,65,65,10,69,78,67,79,68,73,78,71,32,56,54,49, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,53,48, 10,56,56,10,55,67,10,48,56,10,49,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,65,66,10, 69,78,67,79,68,73,78,71,32,56,54,49,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,52,67,10, 70,67,10,52,56,10,50,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,65,67,10,69,78,67,79, 68,73,78,71,32,56,54,50,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,49,48,10,67,56,10,70,67,10,52, 56,10,53,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,65,68,10,69,78,67,79,68,73,78,71, 32,56,54,50,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,56,10,68,67,10,69,67,10,52,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,65,69,10,69,78,67,79,68,73,78,71,32,56,54,50, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,56, 10,53,56,10,70,67,10,54,56,10,52,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,65,70,10, 69,78,67,79,68,73,78,71,32,56,54,50,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,57,48,10,66,48,10,68,48,10, 57,48,10,49,48,10,51,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,66,48,10,69,78,67,79, 68,73,78,71,32,56,54,50,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 52,48,10,70,56,10,52,56,10,50,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,49,66,49,10,69,78,67,79,68,73,78,71, 32,56,54,50,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,49,48,10,70, 56,10,57,48,10,65,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 49,66,50,10,69,78,67,79,68,73,78,71,32,56,54,50, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,56,10,48,56,10,48,56,10,48,56, 10,50,56,10,52,56,10,70,56,10,52,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,49,66,51,10, 69,78,67,79,68,73,78,71,32,56,54,50,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,65,48,10, 57,48,10,70,56,10,49,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,49,66,52,10,69,78,67,79, 68,73,78,71,32,56,54,50,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,48,10,49,48,10,49,48,10,51, 56,10,49,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 99,97,114,114,105,97,103,101,114,101,116,117,114,110,10,69, 78,67,79,68,73,78,71,32,56,54,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,56,10,48,56,10,48,56,10,52, 56,10,70,56,10,52,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,66,54,10,69,78,67,79,68, 73,78,71,32,56,54,51,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,51,48,10,52,56,10,52,56,10,69,56, 10,52,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,66,55,10,69,78,67,79,68,73,78,71,32, 56,54,51,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,54,48,10,57,48,10,57,48,10,66,56,10,57,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 66,56,10,69,78,67,79,68,73,78,71,32,56,54,51,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,56,48,10,69,48,10,67,48,10, 65,48,10,50,48,10,49,48,10,49,48,10,48,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,66,57,10,69, 78,67,79,68,73,78,71,32,56,54,51,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 65,48,10,67,48,10,70,56,10,67,48,10,65,56,10,49, 56,10,70,56,10,49,56,10,50,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,66,65,10,69,78,67,79,68, 73,78,71,32,56,54,51,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,51,56,10,51,48,10,65,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,66,66,10,69,78,67,79,68,73,78,71,32, 56,54,51,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,69,48, 10,54,48,10,65,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 66,67,10,69,78,67,79,68,73,78,71,32,56,54,51,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 52,48,10,70,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,66,68,10,69, 78,67,79,68,73,78,71,32,56,54,51,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,52,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,66,69,10,69,78,67,79,68, 73,78,71,32,56,54,51,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,51, 48,10,50,56,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,66,70,10,69,78,67,79,68,73,78,71,32, 56,54,51,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,54,48,10,65,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 67,48,10,69,78,67,79,68,73,78,71,32,56,54,52,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 49,48,10,70,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,67,49,10,69, 78,67,79,68,73,78,71,32,56,54,52,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,49,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,67,50,10,69,78,67,79,68, 73,78,71,32,56,54,52,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,56, 10,51,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,67,51,10,69,78,67,79,68,73,78,71,32, 56,54,52,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,65,48,10,54,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 67,52,10,69,78,67,79,68,73,78,71,32,56,54,52,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,49,48,10,70,56,10,49,48,10, 50,48,10,52,48,10,70,56,10,52,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,67,53,10,69, 78,67,79,68,73,78,71,32,56,54,52,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 53,48,10,70,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,55,56,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,67,54,10,69,78,67,79,68, 73,78,71,32,56,54,52,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,52, 48,10,70,56,10,52,48,10,50,48,10,49,48,10,70,56, 10,49,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,67,55,10,69,78,67,79,68,73,78,71,32, 56,54,52,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,52,48,10,70,56, 10,52,48,10,50,48,10,52,48,10,70,56,10,52,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 67,56,10,69,78,67,79,68,73,78,71,32,56,54,52,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,53,48,10,70,56,10,53,48,10,53,48,10, 53,48,10,53,48,10,53,48,10,53,48,10,53,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,67,57,10,69, 78,67,79,68,73,78,71,32,56,54,52,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,49,48,10,70,56,10,49,48,10,50,48,10,49, 48,10,70,56,10,49,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,67,65,10,69,78,67,79,68, 73,78,71,32,56,54,53,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,70,56,10,53,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,67,66,10,69,78,67,79,68,73,78,71,32, 56,54,53,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,52,48,10,70,56,10,48,48,10,70,56,10,49,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 67,67,10,69,78,67,79,68,73,78,71,32,56,54,53,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,49,48,10, 70,56,10,48,48,10,70,56,10,52,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,67,68,10,69, 78,67,79,68,73,78,71,32,56,54,53,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,49,52,10,50,56,10,55,67,10,57, 48,10,55,67,10,50,48,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,67,69,10,69,78,67,79,68, 73,78,71,32,56,54,53,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,56,10,53,56,10,70,67,10,65,52,10,70,67, 10,54,56,10,52,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,67,70,10,69,78,67,79,68,73,78,71,32, 56,54,53,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,65,48, 10,53,48,10,70,56,10,50,52,10,70,56,10,49,48,10, 50,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,97,114,114,111,119, 100,98,108,108,101,102,116,10,69,78,67,79,68,73,78,71, 32,56,54,53,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 48,10,50,48,10,55,67,10,56,48,10,55,67,10,50,48, 10,49,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,97,114,114,111, 119,100,98,108,117,112,10,69,78,67,79,68,73,78,71,32, 56,54,53,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,53,48,10,68,56, 10,53,48,10,53,48,10,53,48,10,53,48,10,53,48,10, 53,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,97,114,114,111,119, 100,98,108,114,105,103,104,116,10,69,78,67,79,68,73,78, 71,32,56,54,53,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,49,48,10,70,56,10,48,52,10,70,56,10,49, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,97,114,114, 111,119,100,98,108,100,111,119,110,10,69,78,67,79,68,73, 78,71,32,56,54,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,68,56,10, 53,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,97,114, 114,111,119,100,98,108,98,111,116,104,10,69,78,67,79,68, 73,78,71,32,56,54,54,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,56,10,70,67,10,56,52,10,70,67, 10,52,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,68,53,10,69,78,67,79,68,73,78,71,32, 56,54,54,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,53,48,10,68,56, 10,53,48,10,53,48,10,53,48,10,68,56,10,53,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 68,54,10,69,78,67,79,68,73,78,71,32,56,54,54,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,65,48,10, 68,48,10,65,56,10,57,52,10,48,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,68,55,10,69, 78,67,79,68,73,78,71,32,56,54,54,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,67,10,49,52,10,50,67,10,53, 52,10,65,52,10,52,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,68,56,10,69,78,67,79,68, 73,78,71,32,56,54,54,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,48,10,65,52,10,53,52,10,50,67,10,49,52, 10,55,67,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,68,57,10,69,78,67,79,68,73,78,71,32, 56,54,54,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,56, 10,57,52,10,65,56,10,68,48,10,65,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 68,65,10,69,78,67,79,68,73,78,71,32,56,54,54,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,48,10,51,67,10, 52,48,10,70,67,10,52,48,10,51,67,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,68,66,10,69, 78,67,79,68,73,78,71,32,56,54,54,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,70,48,10,48,56,10,70, 67,10,48,56,10,70,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,68,67,10,69,78,67,79,68, 73,78,71,32,56,54,54,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,48,10,69,56,10,68,52,10,52,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,68,68,10,69,78,67,79,68,73,78,71,32, 56,54,54,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,56,10,53,67,10,65,67,10,48,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 68,69,10,69,78,67,79,68,73,78,71,32,56,54,55,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,55,48,10,65,56,10,50,48,10, 55,48,10,50,48,10,55,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,68,70,10,69, 78,67,79,68,73,78,71,32,56,54,55,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,55,48,10,50,48,10,55,48,10,50, 48,10,65,56,10,55,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,69,48,10,69,78,67,79,68, 73,78,71,32,56,54,55,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,52,48,10,65,56,10,52,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,69,49,10,69,78,67,79,68,73,78,71,32, 56,54,55,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,55,48,10,65,56, 10,48,48,10,50,48,10,50,48,10,48,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 69,50,10,69,78,67,79,68,73,78,71,32,56,54,55,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 49,48,10,65,56,10,49,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,69,51,10,69, 78,67,79,68,73,78,71,32,56,54,55,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,48,48,10,50,48,10,50,48,10,48, 48,10,65,56,10,55,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,69,52,10,69,78,67,79,68, 73,78,71,32,56,54,55,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,65,48,10,67,48,10,70,56,10,67,48, 10,65,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,69,53,10,69,78,67,79,68,73,78,71,32, 56,54,55,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,56,10,49,56,10,70,56,10,49,56,10,50,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 69,54,10,69,78,67,79,68,73,78,71,32,56,54,55,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 55,56,10,56,56,10,55,56,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,69,55,10,69, 78,67,79,68,73,78,71,32,56,54,55,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,53,48,10,68,56,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,69,56,10,69,78,67,79,68, 73,78,71,32,56,54,56,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,70,48,10,56,56,10,70,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,69,57,10,69,78,67,79,68,73,78,71,32, 56,54,56,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,68,56,10,53,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 69,65,10,69,78,67,79,68,73,78,71,32,56,54,56,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,50,48,10,53,48,10,68,56,10,53,48,10,53,48,10, 55,48,10,48,48,10,55,48,10,53,48,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,69,66,10,69, 78,67,79,68,73,78,71,32,56,54,56,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,53,48,10,68,56,10,53,48,10,53,48,10,53, 48,10,68,56,10,56,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,69,67,10,69,78,67,79,68, 73,78,71,32,56,54,56,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,53, 48,10,70,56,10,56,56,10,53,48,10,53,48,10,68,56, 10,56,56,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,69,68,10,69,78,67,79,68,73,78,71,32, 56,54,56,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,55,48,10,70,56, 10,55,48,10,55,48,10,55,48,10,70,56,10,65,56,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 69,69,10,69,78,67,79,68,73,78,71,32,56,54,56,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,53,48,10,68,56,10,53,48,10, 68,56,10,53,48,10,53,48,10,53,48,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,69,70,10,69, 78,67,79,68,73,78,71,32,56,54,56,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,53,48,10,68,56,10,53,48,10,68,56,10,53, 48,10,68,56,10,56,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,70,48,10,69,78,67,79,68, 73,78,71,32,56,54,56,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,65,48,10,70,48,10,56,56,10,70,48, 10,65,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,70,49,10,69,78,67,79,68,73,78,71,32, 56,54,56,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,56,48,10,66,48, 10,69,48,10,57,48,10,49,48,10,48,56,10,48,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 70,50,10,69,78,67,79,68,73,78,71,32,56,54,57,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,56,48,10,56,48,10,52,48,10, 52,56,10,51,56,10,54,56,10,48,56,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,70,51,10,69, 78,67,79,68,73,78,71,32,56,54,57,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,53,48,10,68,56,10,53,48,10,53,48,10,53, 48,10,68,56,10,53,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,70,52,10,69,78,67,79,68, 73,78,71,32,56,54,57,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,49,48,10,54,56,10,70,67,10,54,56, 10,49,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,70,53,10,69,78,67,79,68,73,78,71,32, 56,54,57,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,53,48,10,55,56,10,53,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,70,48,10, 53,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 70,54,10,69,78,67,79,68,73,78,71,32,56,54,57,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,49,48,10,70,56,10,49,48,10,49,48,10, 70,56,10,49,48,10,49,48,10,70,56,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,70,55,10,69, 78,67,79,68,73,78,71,32,56,54,57,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,56,10,52,56,10,70, 67,10,52,56,10,50,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,70,56,10,69,78,67,79,68, 73,78,71,32,56,54,57,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,53,48,10,52,56,10,70,67,10,52,56, 10,53,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,70,57,10,69,78,67,79,68,73,78,71,32, 56,54,57,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,51,48, 10,55,56,10,70,67,10,55,56,10,51,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 70,65,10,69,78,67,79,68,73,78,71,32,56,54,57,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,51,56,10, 53,56,10,70,67,10,53,56,10,51,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,70,66,10,69, 78,67,79,68,73,78,71,32,56,54,57,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,54,56,10,70, 67,10,54,56,10,55,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,49,70,67,10,69,78,67,79,68, 73,78,71,32,56,55,48,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,51,48,10,55,56,10,70,67,10,55,56,10,51,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,49,70,68,10,69,78,67,79,68,73,78,71,32, 56,55,48,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,54,48,10,66,56,10,54,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,49, 70,69,10,69,78,67,79,68,73,78,71,32,56,55,48,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 51,48,10,69,56,10,51,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,49,70,70,10,69, 78,67,79,68,73,78,71,32,56,55,48,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,51,48,10,55,56,10,66,52,10,55, 56,10,51,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,118,101,114,115,97,108,10,69,78,67, 79,68,73,78,71,32,56,55,48,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,70,56,10,56,56,10,56,56,10, 53,48,10,53,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,50,48,49,10,69,78,67,79,68,73,78, 71,32,56,55,48,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,53,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,52,48,10,53, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,112,97,114, 116,105,97,108,100,105,102,102,10,69,78,67,79,68,73,78, 71,32,56,55,48,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,51,48,10, 52,56,10,48,56,10,51,56,10,52,56,10,52,56,10,52, 56,10,51,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,101,120,105, 115,116,101,110,116,105,97,108,10,69,78,67,79,68,73,78, 71,32,56,55,48,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,48,56,10, 48,56,10,48,56,10,55,56,10,48,56,10,48,56,10,48, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,50,48,52,10,69,78,67,79,68,73,78,71,32,56,55, 48,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 49,48,10,49,48,10,70,56,10,49,56,10,50,56,10,50, 56,10,55,56,10,50,56,10,50,56,10,52,56,10,70,56, 10,52,48,10,52,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,101,109,112,116,121,115,101, 116,10,69,78,67,79,68,73,78,71,32,56,55,48,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,48,10,49,48,10,55,48,10,57,56,10,65,56,10,65, 56,10,65,56,10,67,56,10,55,48,10,52,48,10,52,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,68,101,108,116,97,10,69,78,67,79, 68,73,78,71,32,56,55,49,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,53,48,10,53,48,10,53,48,10,56, 56,10,56,56,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 103,114,97,100,105,101,110,116,10,69,78,67,79,68,73,78, 71,32,56,55,49,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,56,56,10, 56,56,10,53,48,10,53,48,10,53,48,10,50,48,10,50, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,101,108,101, 109,101,110,116,10,69,78,67,79,68,73,78,71,32,56,55, 49,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,56,10,52, 48,10,56,48,10,70,48,10,56,48,10,52,48,10,51,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,110,111,116,101,108,101,109, 101,110,116,10,69,78,67,79,68,73,78,71,32,56,55,49, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,51,56,10,54,48, 10,65,48,10,70,48,10,65,48,10,54,48,10,51,56,10, 50,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,48,65,10, 69,78,67,79,68,73,78,71,32,56,55,49,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,51,56,10,52,48,10, 55,48,10,52,48,10,51,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,115,117,99,104,116,104,97,116,10,69,78,67, 79,68,73,78,71,32,56,55,49,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,48,10,49,48,10,48,56,10,55,56,10, 48,56,10,49,48,10,69,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,50,48,67,10,69,78,67,79,68,73,78, 71,32,56,55,49,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,50,48,10, 69,48,10,51,48,10,50,56,10,55,56,10,50,56,10,51, 48,10,69,48,10,50,48,10,50,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,50,48,68,10,69,78,67,79,68,73,78,71,32,56,55, 49,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 48,10,48,56,10,51,56,10,48,56,10,55,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,50,48,69, 10,69,78,67,79,68,73,78,71,32,56,55,49,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,70,56,10,70,56,10,70,56,10,70,56, 10,70,56,10,70,56,10,70,56,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,112,114,111,100,117,99,116,10,69,78,67, 79,68,73,78,71,32,56,55,49,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,70,67,10,52,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,52,56,10, 52,56,10,52,56,10,52,56,10,69,67,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,50,49,48,10,69,78,67,79,68,73,78, 71,32,56,55,50,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,69,67,10,52,56,10,52,56,10, 52,56,10,52,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,52,56,10,70,67,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,115,117,109, 109,97,116,105,111,110,10,69,78,67,79,68,73,78,71,32, 56,55,50,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,67,10,56,48,10,52,48,10,50,48, 10,49,48,10,48,56,10,49,48,10,50,48,10,52,48,10, 56,48,10,70,67,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,109,105,110,117,115, 10,69,78,67,79,68,73,78,71,32,56,55,50,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,50,49,51,10,69,78,67, 79,68,73,78,71,32,56,55,50,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,70,56,10,48,48,10,50,48,10,50,48,10,70,56,10, 50,48,10,50,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,50,49,52,10,69,78,67,79,68,73,78, 71,32,56,55,50,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,50,48,10, 48,48,10,50,48,10,50,48,10,70,56,10,50,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,102,114,97, 99,116,105,111,110,10,69,78,67,79,68,73,78,71,32,56, 55,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,48,56,10,49,48,10, 49,48,10,50,48,10,50,48,10,52,48,10,52,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,49, 54,10,69,78,67,79,68,73,78,71,32,56,55,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,56,48,10,52,48,10,52,48,10,50, 48,10,50,48,10,49,48,10,49,48,10,48,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,97,115,116,101,114,105,115,107,109,97, 116,104,10,69,78,67,79,68,73,78,71,32,56,55,50,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,50,48,10,65,56,10,55,48,10, 70,56,10,55,48,10,65,56,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,50,49,56,10,69, 78,67,79,68,73,78,71,32,56,55,50,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,48,10,53,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,112,101,114,105,111,100,99,101,110,116,101,114,101, 100,10,69,78,67,79,68,73,78,71,32,56,55,50,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,55, 48,10,50,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,114,97,100,105,99,97,108,10,69,78, 67,79,68,73,78,71,32,56,55,51,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,52,10,48, 52,10,48,52,10,48,56,10,48,56,10,48,56,10,49,48, 10,57,48,10,57,48,10,54,48,10,54,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,49,66,10,69,78,67,79,68,73, 78,71,32,56,55,51,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,52,10,52,52,10,65,52, 10,52,56,10,50,56,10,67,56,10,49,48,10,57,48,10, 57,48,10,54,48,10,54,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,49,67,10,69,78,67,79,68,73,78,71,32,56, 55,51,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,52,10,56,52,10,56,52,10,67,56,10, 69,56,10,52,56,10,49,48,10,57,48,10,57,48,10,54, 48,10,54,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,112,114,111,112,111,114, 116,105,111,110,97,108,10,69,78,67,79,68,73,78,71,32, 56,55,51,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,53,48,10,65,48,10,65,48,10,53,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,105,110,102,105,110, 105,116,121,10,69,78,67,79,68,73,78,71,32,56,55,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,53,48, 10,65,56,10,65,56,10,53,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,111,114,116,104,111,103,111,110, 97,108,10,69,78,67,79,68,73,78,71,32,56,55,51,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,97,110,103,108,101,10,69,78,67, 79,68,73,78,71,32,56,55,51,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,56,10,49,48,10,50,48,10,52,48,10, 56,48,10,70,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,50,50,49,10,69,78,67,79,68,73,78, 71,32,56,55,51,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,56,10,57,48,10,54,48,10,54,48,10,65,48,10,70, 56,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,50,50,50,10,69,78,67,79,68,73,78,71,32,56,55, 51,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,56,10,49,48,10,51,48,10,52, 56,10,56,56,10,52,56,10,51,48,10,49,48,10,48,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,50,50,51, 10,69,78,67,79,68,73,78,71,32,56,55,51,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,50,50,52,10,69,78,67, 79,68,73,78,71,32,56,55,52,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,51,48,10,50,48,10,54,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,50,50,53,10,69,78,67,79,68,73,78, 71,32,56,55,52,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,53,48,10,53,48,10, 53,48,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,50,50,54,10,69,78,67,79,68,73,78,71,32,56,55, 52,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,53,48,10,53,48,10,53,56,10,53, 48,10,55,48,10,53,48,10,68,48,10,53,48,10,53,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,108,111,103,105,99,97,108, 97,110,100,10,69,78,67,79,68,73,78,71,32,56,55,52, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,50,48,10,53,48,10,53,48,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,108,111,103,105,99,97,108,111, 114,10,69,78,67,79,68,73,78,71,32,56,55,52,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,56, 56,10,53,48,10,53,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,105,110,116,101,114,115,101,99,116,105, 111,110,10,69,78,67,79,68,73,78,71,32,56,55,52,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,111,110,10,69,78,67, 79,68,73,78,71,32,56,55,52,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,105,110,116,101,103,114,97,108,10,69,78,67,79,68,73, 78,71,32,56,55,52,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,49,48,10,50,56,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,65,48,10,52,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,50,67,10,69,78,67,79,68,73,78,71,32,56, 55,52,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,52,10,52,56,10,52,56,10,52,56,10, 52,56,10,52,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,52,56,10,57,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,50, 68,10,69,78,67,79,68,73,78,71,32,56,55,52,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 53,52,10,65,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,65,56,10,65,56,10,65,56,10,65,56, 10,68,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,50,69,10,69,78, 67,79,68,73,78,71,32,56,55,53,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,56,10,50, 48,10,50,48,10,55,48,10,65,56,10,65,56,10,65,56, 10,55,48,10,50,48,10,50,48,10,65,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,50,70,10,69,78,67,79,68,73, 78,71,32,56,55,53,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,52,10,52,56,10,52,56, 10,55,56,10,67,67,10,67,67,10,67,67,10,55,56,10, 52,56,10,52,56,10,52,56,10,57,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,51,48,10,69,78,67,79,68,73,78,71,32,56, 55,53,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,53,52,10,65,56,10,65,56,10,70,56,10, 65,67,10,65,67,10,65,67,10,70,56,10,65,56,10,65, 56,10,65,56,10,68,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,51, 49,10,69,78,67,79,68,73,78,71,32,56,55,53,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,49,48,10, 50,56,10,50,48,10,50,48,10,50,48,10,55,52,10,65, 67,10,51,67,10,50,48,10,50,48,10,50,48,10,65,48, 10,52,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,51,50,10,69,78, 67,79,68,73,78,71,32,56,55,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,49,48,10,50,56,10,50, 48,10,50,48,10,55,52,10,65,67,10,66,67,10,65,56, 10,55,48,10,50,48,10,50,48,10,65,48,10,52,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,51,51,10,69,78,67,79,68,73, 78,71,32,56,55,53,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,49,48,10,50,56,10,50,48,10,50,48, 10,55,48,10,65,56,10,66,67,10,65,67,10,55,52,10, 50,48,10,50,48,10,65,48,10,52,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,116,104, 101,114,101,102,111,114,101,10,69,78,67,79,68,73,78,71, 32,56,55,53,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,48,48,10,48,48,10,56,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,51,53,10,69,78,67,79,68,73,78,71,32,56,55,53, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,56,56,10,48,48,10,48,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,51,54,10, 69,78,67,79,68,73,78,71,32,56,55,53,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 48,48,10,48,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,51,55,10,69,78,67,79, 68,73,78,71,32,56,55,53,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,56,10,48,48,10,48, 48,10,52,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,51,56,10,69,78,67,79,68,73,78,71, 32,56,55,54,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,48,48,10,70,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,51,57,10,69,78,67,79,68,73,78,71,32,56,55,54, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,56, 10,48,48,10,69,48,10,48,48,10,48,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,51,65,10, 69,78,67,79,68,73,78,71,32,56,55,54,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,56,56,10,48,48,10, 70,56,10,48,48,10,56,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,51,66,10,69,78,67,79, 68,73,78,71,32,56,55,54,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,49,48,10,52,48,10,65,56,10,65, 56,10,49,48,10,52,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 115,105,109,105,108,97,114,10,69,78,67,79,68,73,78,71, 32,56,55,54,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,48,10,65,56,10,65,56,10,49,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,51,68,10,69,78,67,79,68,73,78,71,32,56,55,54, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,49,48,10,65,56,10,65,56,10,52,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,51,69,10, 69,78,67,79,68,73,78,71,32,56,55,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,52,56,10,65,52,10, 57,52,10,52,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,51,70,10,69,78,67,79, 68,73,78,71,32,56,55,54,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 52,48,10,65,48,10,65,48,10,65,48,10,50,56,10,50, 56,10,50,56,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,52,48,10,69,78,67,79,68,73,78,71, 32,56,55,54,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,49,48,10,49, 48,10,49,48,10,50,48,10,52,48,10,52,48,10,52,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,52,49,10,69,78,67,79,68,73,78,71,32,56,55,54, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,50,48, 10,54,48,10,65,56,10,65,56,10,51,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,52,50,10, 69,78,67,79,68,73,78,71,32,56,55,55,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,48,10, 52,56,10,65,56,10,57,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,52,51,10,69,78,67,79, 68,73,78,71,32,56,55,55,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,52,56,10,65,56,10,57,48,10,48, 48,10,70,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,52,52,10,69,78,67,79,68,73,78,71, 32,56,55,55,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,50,48,10,50, 48,10,54,56,10,65,56,10,66,48,10,50,48,10,70,56, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,99,111,110,103, 114,117,101,110,116,10,69,78,67,79,68,73,78,71,32,56, 55,55,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,52,56,10,65,56,10, 57,48,10,48,48,10,70,56,10,48,48,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,52, 54,10,69,78,67,79,68,73,78,71,32,56,55,55,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,52,56,10,65,56,10,57,48,10,50, 48,10,70,56,10,50,48,10,70,56,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,52,55,10,69,78, 67,79,68,73,78,71,32,56,55,55,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,54,56,10,65,56,10,66,48,10,50,48,10,70,56, 10,50,48,10,70,56,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,112,112,114,111,120,101,113,117,97,108,10,69,78, 67,79,68,73,78,71,32,56,55,55,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,56,10,65,56,10,57,48,10,52,56, 10,65,56,10,57,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,52,57,10,69,78,67,79,68,73, 78,71,32,56,55,55,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,54,56,10,65,56,10,66,48,10,54,56,10,65,56,10, 66,48,10,50,48,10,50,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,52,65,10,69,78,67,79,68,73,78,71,32,56, 55,55,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,52,56,10,65,56,10, 57,48,10,52,56,10,65,56,10,57,48,10,48,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,52, 66,10,69,78,67,79,68,73,78,71,32,56,55,55,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,52,56,10,65,56,10,57,48,10,52,56,10,65, 56,10,57,48,10,52,56,10,65,56,10,57,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,52,67,10,69,78, 67,79,68,73,78,71,32,56,55,56,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,57,48,10,65,56,10,52,56,10,48,48,10,70,56, 10,48,48,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,52,68,10,69,78,67,79,68,73, 78,71,32,56,55,56,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,56,10,55,48,10,48,48,10,55,48,10, 56,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,52,69,10,69,78,67,79,68,73,78,71,32,56, 55,56,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,68,56,10,48,48,10,68,56,10,50,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,52, 70,10,69,78,67,79,68,73,78,71,32,56,55,56,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,68, 56,10,48,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,53,48,10,69,78, 67,79,68,73,78,71,32,56,55,56,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,48,48,10,70,56,10,48,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,53,49,10,69,78,67,79,68,73, 78,71,32,56,55,56,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,48,48,10,70,56,10,48,48,10,70,56,10, 48,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,53,50,10,69,78,67,79,68,73,78,71,32,56, 55,56,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,48,10, 48,48,10,70,56,10,48,48,10,70,56,10,48,48,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,53, 51,10,69,78,67,79,68,73,78,71,32,56,55,56,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,48,48,10,70, 56,10,48,48,10,70,56,10,48,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,53,52,10,69,78, 67,79,68,73,78,71,32,56,55,56,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,66,56,10,48,48, 10,66,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,53,53,10,69,78,67,79,68,73, 78,71,32,56,55,56,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,56,10,48,48,10,69,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,53,54,10,69,78,67,79,68,73,78,71,32,56, 55,57,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,53,48,10,70,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,53, 55,10,69,78,67,79,68,73,78,71,32,56,55,57,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,53,48,10,50,48,10,48,48,10,70, 56,10,48,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,53,56,10,69,78, 67,79,68,73,78,71,32,56,55,57,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,48,48,10,70,56,10,48,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,53,57,10,69,78,67,79,68,73, 78,71,32,56,55,57,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,50,48, 10,53,48,10,48,48,10,70,56,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,53,65,10,69,78,67,79,68,73,78,71,32,56, 55,57,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,56,10,53,48,10,50,48,10, 48,48,10,70,56,10,48,48,10,70,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,53, 66,10,69,78,67,79,68,73,78,71,32,56,55,57,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,65,56,10,55,48,10,70,56,10,55,48,10,65, 56,10,48,48,10,70,56,10,48,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,53,67,10,69,78, 67,79,68,73,78,71,32,56,55,57,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,53,48,10,53,48,10,56,56,10,70,56,10,48,48, 10,70,56,10,48,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,53,68,10,69,78,67,79,68,73, 78,71,32,56,55,57,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,67,10,70,56, 10,70,56,10,48,48,10,70,56,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,53,69,10,69,78,67,79,68,73,78,71,32,56, 55,57,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,68,48,10,65,56,10,65,56,10, 65,56,10,48,48,10,70,56,10,48,48,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,53, 70,10,69,78,67,79,68,73,78,71,32,56,55,57,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 53,48,10,49,48,10,50,48,10,48,48,10,50,48,10,70, 56,10,48,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,110,111,116,101,113,117,97,108,10,69, 78,67,79,68,73,78,71,32,56,56,48,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,70,56,10,50, 48,10,70,56,10,56,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,101,113,117,105,118,97,108,101,110,99,101,10,69, 78,67,79,68,73,78,71,32,56,56,48,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,48,48,10,70, 56,10,48,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,50,54,50,10,69,78,67,79,68, 73,78,71,32,56,56,48,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,49, 48,10,49,48,10,70,56,10,50,48,10,70,56,10,50,48, 10,70,56,10,52,48,10,52,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,50,54,51,10,69,78,67,79,68,73,78,71,32, 56,56,48,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,48,10,70,56,10,48,48,10,70,56,10,48,48,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,108,101,115,115,101, 113,117,97,108,10,69,78,67,79,68,73,78,71,32,56,56, 48,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,49,56,10,54,48,10,56, 48,10,54,48,10,49,56,10,48,48,10,70,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,103,114,101,97,116,101,114, 101,113,117,97,108,10,69,78,67,79,68,73,78,71,32,56, 56,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,67,48,10,51,48,10, 48,56,10,51,48,10,67,48,10,48,48,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,54, 54,10,69,78,67,79,68,73,78,71,32,56,56,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,56,10,54,48,10,56,48,10,54,48,10,49, 56,10,48,48,10,70,56,10,48,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,54,55,10,69,78, 67,79,68,73,78,71,32,56,56,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,67, 48,10,51,48,10,48,56,10,51,48,10,67,48,10,48,48, 10,70,56,10,48,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,54,56,10,69,78,67,79,68,73, 78,71,32,56,56,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,56,10,54,48, 10,56,48,10,54,48,10,49,56,10,50,48,10,70,56,10, 50,48,10,70,56,10,50,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,54,57,10,69,78,67,79,68,73,78,71,32,56, 56,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,67,48,10,51,48,10,48,56,10, 51,48,10,67,48,10,50,48,10,70,56,10,50,48,10,70, 56,10,50,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,54, 65,10,69,78,67,79,68,73,78,71,32,56,56,49,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,49,52,10,50,56,10,53,48,10,65, 48,10,53,48,10,50,56,10,49,52,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,54,66,10,69,78, 67,79,68,73,78,71,32,56,56,49,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,65,48,10,53,48,10,50,56,10,49,52,10,50,56, 10,53,48,10,65,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,54,67,10,69,78,67,79,68,73, 78,71,32,56,56,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,53,48,10,50,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,53,48,10, 50,48,10,53,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,54,68,10,69,78,67,79,68,73,78,71,32,56, 56,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 65,56,10,55,48,10,50,48,10,55,48,10,65,56,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,54, 69,10,69,78,67,79,68,73,78,71,32,56,56,49,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 50,48,10,50,56,10,51,48,10,50,48,10,54,48,10,65, 48,10,54,48,10,50,48,10,51,48,10,50,56,10,50,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,54,70,10,69,78, 67,79,68,73,78,71,32,56,56,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,65, 48,10,54,48,10,50,48,10,51,48,10,50,56,10,51,48, 10,50,48,10,54,48,10,65,48,10,50,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,55,48,10,69,78,67,79,68,73, 78,71,32,56,56,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,50,48,10,51,56, 10,54,48,10,65,48,10,54,48,10,51,56,10,50,48,10, 70,56,10,50,48,10,50,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,55,49,10,69,78,67,79,68,73,78,71,32,56, 56,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,50,48,10,50,48,10,69,48,10,51,48,10, 50,56,10,51,48,10,69,48,10,50,48,10,70,56,10,50, 48,10,50,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,55, 50,10,69,78,67,79,68,73,78,71,32,56,56,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,49,56,10,54,48,10,56,48,10,54,48,10,49, 56,10,48,48,10,52,56,10,65,56,10,57,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,55,51,10,69,78, 67,79,68,73,78,71,32,56,56,49,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,67, 48,10,51,48,10,48,56,10,51,48,10,67,48,10,48,48, 10,52,56,10,65,56,10,57,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,55,52,10,69,78,67,79,68,73, 78,71,32,56,56,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,50,48,10,51,56,10,54,48, 10,65,48,10,54,48,10,51,56,10,50,48,10,54,56,10, 65,56,10,66,48,10,50,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,55,53,10,69,78,67,79,68,73,78,71,32,56, 56,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,69,48,10,51,48,10,50,56,10, 51,48,10,69,48,10,50,48,10,54,56,10,65,56,10,66, 48,10,50,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,55, 54,10,69,78,67,79,68,73,78,71,32,56,56,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,56,10,54,48,10,56,48,10,54,48,10,49,56,10,67, 48,10,51,48,10,48,56,10,51,48,10,67,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,55,55,10,69,78, 67,79,68,73,78,71,32,56,56,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,67,48,10,51, 48,10,48,56,10,51,48,10,67,48,10,49,56,10,54,48, 10,56,48,10,54,48,10,49,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,55,56,10,69,78,67,79,68,73, 78,71,32,56,56,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,49,48,10,49,56,10,55,48,10,57,48, 10,54,48,10,51,56,10,69,48,10,51,48,10,52,56,10, 55,48,10,67,48,10,52,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,55,57,10,69,78,67,79,68,73,78,71,32,56, 56,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,49,48,10,68,48,10,51,48,10,49,56,10,51,48,10, 69,48,10,51,56,10,54,48,10,67,48,10,54,48,10,53, 56,10,52,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,55, 65,10,69,78,67,79,68,73,78,71,32,56,56,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,49,48,10,69, 48,10,49,48,10,48,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,55,66,10,69,78, 67,79,68,73,78,71,32,56,56,50,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,56,48,10,52,48,10,51,56,10,52,48, 10,56,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,55,67,10,69,78,67,79,68,73, 78,71,32,56,56,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,56,10,49,48,10,69,48,10,49,48,10,69,56,10, 49,48,10,48,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,55,68,10,69,78,67,79,68,73,78,71,32,56, 56,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,48,10, 52,48,10,51,56,10,52,48,10,66,56,10,52,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,55, 69,10,69,78,67,79,68,73,78,71,32,56,56,51,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,49,48,10,69,48,10,49,48,10,48, 56,10,48,48,10,52,56,10,65,56,10,57,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,55,70,10,69,78, 67,79,68,73,78,71,32,56,56,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 48,10,52,48,10,51,56,10,52,48,10,56,48,10,48,48, 10,52,56,10,65,56,10,57,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,56,48,10,69,78,67,79,68,73, 78,71,32,56,56,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,50,56,10,51,48,10,69,48,10,51,48,10,50,56,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,56,49,10,69,78,67,79,68,73,78,71,32,56, 56,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,65,48,10, 54,48,10,51,56,10,54,48,10,65,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,112,114,111,112,101,114, 115,117,98,115,101,116,10,69,78,67,79,68,73,78,71,32, 56,56,51,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,56,10,56,48,10,56,48,10,56,48,10,55,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,112,114,111,112,101, 114,115,117,112,101,114,115,101,116,10,69,78,67,79,68,73, 78,71,32,56,56,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,48,10,48,56,10,48,56,10,48,56,10, 70,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,110,111, 116,115,117,98,115,101,116,10,69,78,67,79,68,73,78,71, 32,56,56,51,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,50,48,10,50, 48,10,55,56,10,65,48,10,65,48,10,65,48,10,55,56, 10,50,48,10,50,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,56,53,10,69,78,67,79,68,73,78,71,32,56,56,51, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,70,48, 10,50,56,10,50,56,10,50,56,10,70,48,10,50,48,10, 50,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,114,101,102,108,101,120,115,117, 98,115,101,116,10,69,78,67,79,68,73,78,71,32,56,56, 51,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,55,56,10,56,48,10,56, 48,10,56,48,10,55,56,10,48,48,10,70,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,114,101,102,108,101,120,115, 117,112,101,114,115,101,116,10,69,78,67,79,68,73,78,71, 32,56,56,51,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,48,10,48, 56,10,48,56,10,48,56,10,70,48,10,48,48,10,70,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,56,56,10,69,78,67,79,68,73,78,71,32,56,56,52, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,50,48,10,50,48,10,55,56,10,65,48,10,65,48, 10,65,48,10,55,56,10,50,48,10,70,56,10,50,48,10, 50,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,56,57,10, 69,78,67,79,68,73,78,71,32,56,56,52,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,50,48, 10,50,48,10,70,48,10,50,56,10,50,56,10,50,56,10, 70,48,10,50,48,10,70,56,10,50,48,10,50,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,56,65,10,69,78,67,79, 68,73,78,71,32,56,56,52,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 55,56,10,56,48,10,56,48,10,56,48,10,55,56,10,49, 48,10,70,56,10,52,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,56,66,10,69,78,67,79,68,73,78,71, 32,56,56,52,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,48,10,48, 56,10,48,56,10,48,56,10,70,48,10,49,48,10,70,56, 10,52,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,56,67,10,69,78,67,79,68,73,78,71,32,56,56,52, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,56,56,10,65,56,10,69,56, 10,70,56,10,69,56,10,65,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,56,68,10, 69,78,67,79,68,73,78,71,32,56,56,52,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,65,56,10, 56,56,10,56,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,56,69,10,69,78,67,79, 68,73,78,71,32,56,56,52,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 56,56,10,65,56,10,65,56,10,70,56,10,65,56,10,65, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,56,70,10,69,78,67,79,68,73,78,71, 32,56,56,52,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,56,48,10,56,48,10,56,48,10,70,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,57,48,10,69,78,67,79,68,73,78,71,32,56,56,52, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,56,10,48,56,10,48,56,10,70,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,57,49,10, 69,78,67,79,68,73,78,71,32,56,56,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,56,48,10,56,48,10,56,48,10, 70,56,10,48,48,10,70,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,57,50,10,69,78,67,79, 68,73,78,71,32,56,56,53,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,56,10,48,56,10,48,56,10,70,56,10,48, 48,10,70,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,57,51,10,69,78,67,79,68,73,78,71, 32,56,56,53,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,57,52,10,69,78,67,79,68,73,78,71,32,56,56,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,99,105,114,99,108,101,112,108, 117,115,10,69,78,67,79,68,73,78,71,32,56,56,53,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,48,10,65,56,10, 70,56,10,65,56,10,55,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,50,57,54,10,69, 78,67,79,68,73,78,71,32,56,56,53,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,70,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,99,105,114,99,108,101,109,117,108,116,105,112,108, 121,10,69,78,67,79,68,73,78,71,32,56,56,53,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,68,56,10,65, 56,10,68,56,10,55,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,57,56,10,69,78, 67,79,68,73,78,71,32,56,56,53,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,57,56,10,65,56,10,67,56, 10,55,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,57,57,10,69,78,67,79,68,73, 78,71,32,56,56,53,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,48,10,56,56,10,65,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,57,65,10,69,78,67,79,68,73,78,71,32,56, 56,53,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,55,48,10,56,56,10, 65,56,10,68,56,10,65,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,57, 66,10,69,78,67,79,68,73,78,71,32,56,56,53,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,68,56,10,65, 56,10,68,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,57,67,10,69,78, 67,79,68,73,78,71,32,56,56,54,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,70,56,10,56,56,10,70,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,57,68,10,69,78,67,79,68,73, 78,71,32,56,56,54,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,70,56,10,56,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,57,69,10,69,78,67,79,68,73,78,71,32,56, 56,54,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 65,56,10,70,56,10,65,56,10,70,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,57, 70,10,69,78,67,79,68,73,78,71,32,56,56,54,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,56,56,10,70, 56,10,56,56,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,65,48,10,69,78, 67,79,68,73,78,71,32,56,56,54,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,68,56,10,65,56,10,68,56, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,50,65,49,10,69,78,67,79,68,73, 78,71,32,56,56,54,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,56,56,10,65,56,10,56,56,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,50,65,50,10,69,78,67,79,68,73,78,71,32,56, 56,54,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,70,56,10,56,48,10,56,48,10,56,48,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,50,65, 51,10,69,78,67,79,68,73,78,71,32,56,56,54,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,48,56,10,48,56,10,48,56,10,70, 56,10,48,56,10,48,56,10,48,56,10,48,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,50,65,52,10,69,78, 67,79,68,73,78,71,32,56,56,54,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,112,101,114,112,101,110,100,105,99,117,108,97,114,10, 69,78,67,79,68,73,78,71,32,56,56,54,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,65,54,10,69,78,67,79, 68,73,78,71,32,56,56,55,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,70,48,10,56,48,10,56, 48,10,56,48,10,56,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,65,55,10,69,78,67,79,68,73,78,71, 32,56,56,55,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,56,48,10,56, 48,10,70,48,10,56,48,10,70,48,10,56,48,10,56,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,65,56,10,69,78,67,79,68,73,78,71,32,56,56,55, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,70,56, 10,56,48,10,70,56,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,65,57,10, 69,78,67,79,68,73,78,71,32,56,56,55,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,65,48,10,65,48,10,65,48,10,65,48,10,66,56,10, 65,48,10,65,48,10,65,48,10,65,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,65,65,10,69,78,67,79, 68,73,78,71,32,56,56,55,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,65,56,10, 65,56,10,65,56,10,65,56,10,65,67,10,65,56,10,65, 56,10,65,56,10,65,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,65,66,10,69,78,67,79,68,73,78,71, 32,56,56,55,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,48,10,65,48,10,65, 48,10,66,56,10,65,48,10,66,56,10,65,48,10,65,48, 10,65,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,65,67,10,69,78,67,79,68,73,78,71,32,56,56,55, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,57,48,10,57,48, 10,70,56,10,65,48,10,65,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,65,68,10, 69,78,67,79,68,73,78,71,32,56,56,55,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,56,56,10,56,56,10,70,56,10,57,48,10, 70,56,10,65,48,10,65,48,10,56,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,65,69,10,69,78,67,79, 68,73,78,71,32,56,56,55,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,65,48,10, 65,48,10,65,56,10,65,56,10,66,67,10,66,48,10,66, 48,10,65,48,10,65,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,65,70,10,69,78,67,79,68,73,78,71, 32,56,56,55,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,48,10,65,52,10,65, 52,10,66,67,10,65,56,10,66,67,10,66,48,10,66,48, 10,65,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,66,48,10,69,78,67,79,68,73,78,71,32,56,56,56, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,49,48,10,48,56,10,49,48, 10,69,48,10,49,48,10,48,56,10,49,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,66,49,10, 69,78,67,79,68,73,78,71,32,56,56,56,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,52,48,10,56,48,10,52,48,10,51,56,10, 52,48,10,56,48,10,52,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,66,50,10,69,78,67,79, 68,73,78,71,32,56,56,56,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,49,56,10,54,56,10,56,56,10,54,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,66,51,10,69,78,67,79,68,73,78,71, 32,56,56,56,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,67, 48,10,66,48,10,56,56,10,66,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,66,52,10,69,78,67,79,68,73,78,71,32,56,56,56, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,49,56,10,54,56,10,56,56, 10,54,56,10,49,56,10,48,48,10,70,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,66,53,10, 69,78,67,79,68,73,78,71,32,56,56,56,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,67,48,10,66,48,10,56,56,10,66,48,10, 67,48,10,48,48,10,70,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,66,54,10,69,78,67,79, 68,73,78,71,32,56,56,56,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,48,10,66,56,10,53,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,66,55,10,69,78,67,79,68,73,78,71, 32,56,56,56,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,53,48,10,69,56,10,53,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,66,56,10,69,78,67,79,68,73,78,71,32,56,56,56, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,49,48, 10,69,56,10,49,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,66,57,10, 69,78,67,79,68,73,78,71,32,56,56,56,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,50,48,10,68,56,10, 50,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,66,65,10,69,78,67,79, 68,73,78,71,32,56,56,57,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,66,66,10,69,78,67,79,68,73,78,71, 32,56,56,57,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,53,48,10,53,48,10,50,48,10,50,48,10,48,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,66,67,10,69,78,67,79,68,73,78,71,32,56,56,57, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,48,10,50,48, 10,50,48,10,53,48,10,53,48,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,66,68,10, 69,78,67,79,68,73,78,71,32,56,56,57,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,48,48,10,56,56,10,56,56,10, 53,48,10,53,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,66,69,10,69,78,67,79, 68,73,78,71,32,56,56,57,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,48,10,56,48,10,56,48,10,67, 48,10,65,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,66,70,10,69,78,67,79,68,73,78,71, 32,56,56,57,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,56,10,49,56,10,50,56,10,50,56,10,52,56, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,67,48,10,69,78,67,79,68,73,78,71,32,56,56,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,51,48,10,51,48,10,51,48,10,51,48,10,52,56, 10,52,56,10,52,56,10,56,52,10,56,52,10,56,52,10, 56,52,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,67,49,10, 69,78,67,79,68,73,78,71,32,56,56,57,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,56,52, 10,56,52,10,56,52,10,56,52,10,52,56,10,52,56,10, 52,56,10,51,48,10,51,48,10,51,48,10,51,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,67,50,10,69,78,67,79, 68,73,78,71,32,56,56,57,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,48,10,52,56,10, 56,52,10,56,52,10,56,52,10,56,52,10,56,52,10,56, 52,10,56,52,10,56,52,10,56,52,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,67,51,10,69,78,67,79,68,73,78,71, 32,56,56,57,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,56,52,10,56,52,10,56,52,10,56, 52,10,56,52,10,56,52,10,56,52,10,56,52,10,56,52, 10,52,56,10,51,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,67,52,10,69,78,67,79,68,73,78,71,32,56,57,48, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,53,48, 10,56,56,10,53,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,100,111,116,109,97,116,104,10, 69,78,67,79,68,73,78,71,32,56,57,48,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,67,54,10,69,78,67,79, 68,73,78,71,32,56,57,48,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,70,56,10,55,48,10,55,48,10,56, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,67,55,10,69,78,67,79,68,73,78,71, 32,56,57,48,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,50,48,10,56, 56,10,53,48,10,70,56,10,53,48,10,56,56,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,67,56,10,69,78,67,79,68,73,78,71,32,56,57,48, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,68,56, 10,65,56,10,68,56,10,56,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,67,57,10, 69,78,67,79,68,73,78,71,32,56,57,48,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,56,10,68,48,10,65,48,10, 68,48,10,56,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,67,65,10,69,78,67,79, 68,73,78,71,32,56,57,48,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,56,56,10,53,56,10,50,56,10,53,56,10,56, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,67,66,10,69,78,67,79,68,73,78,71, 32,56,57,48,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,56, 48,10,52,48,10,50,48,10,53,48,10,56,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,67,67,10,69,78,67,79,68,73,78,71,32,56,57,48, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,56,10,49,48, 10,50,48,10,53,48,10,56,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,67,68,10, 69,78,67,79,68,73,78,71,32,56,57,48,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,57,48,10,65,56,10, 52,56,10,48,48,10,70,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,67,69,10,69,78,67,79, 68,73,78,71,32,56,57,49,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,56,56,10,53,48,10,53,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,67,70,10,69,78,67,79,68,73,78,71, 32,56,57,49,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,50,48,10,50,48,10,53,48,10,53,48, 10,56,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,68,48,10,69,78,67,79,68,73,78,71,32,56,57,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,56,10,52,48, 10,57,56,10,65,48,10,57,56,10,52,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,68,49,10, 69,78,67,79,68,73,78,71,32,56,57,49,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,48,10,49,48,10,67,56,10, 50,56,10,67,56,10,49,48,10,69,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,68,50,10,69,78,67,79, 68,73,78,71,32,56,57,49,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,56,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,65,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,68,51,10,69,78,67,79,68,73,78,71, 32,56,57,49,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,65, 56,10,65,56,10,65,56,10,65,56,10,65,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,68,52,10,69,78,67,79,68,73,78,71,32,56,57,49, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,55,48, 10,65,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,68,53,10, 69,78,67,79,68,73,78,71,32,56,57,49,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,53,48,10,53,48,10,53,48,10,70,56,10,53,48,10, 53,48,10,70,56,10,53,48,10,53,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,68,54,10,69,78,67,79, 68,73,78,71,32,56,57,49,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,56,10, 49,48,10,50,48,10,52,48,10,56,56,10,52,48,10,50, 48,10,49,48,10,48,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,68,55,10,69,78,67,79,68,73,78,71, 32,56,57,49,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,48,10,52,48,10,50, 48,10,49,48,10,56,56,10,49,48,10,50,48,10,52,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,68,56,10,69,78,67,79,68,73,78,71,32,56,57,50, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,52,10,50,56, 10,53,52,10,65,56,10,53,52,10,50,56,10,49,52,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,68,57,10, 69,78,67,79,68,73,78,71,32,56,57,50,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,65,48,10,53,48,10,65,56,10, 53,52,10,65,56,10,53,48,10,65,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,68,65,10,69,78,67,79, 68,73,78,71,32,56,57,50,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,49,56,10,54,48,10,56,48,10, 54,48,10,49,56,10,48,48,10,70,56,10,48,48,10,67, 48,10,51,48,10,48,56,10,51,48,10,67,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,68,66,10,69,78,67,79,68,73,78,71, 32,56,57,50,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,67,48,10,51,48,10,48,56,10,51,48,10,67, 48,10,48,48,10,70,56,10,48,48,10,49,56,10,54,48, 10,56,48,10,54,48,10,49,56,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,68,67,10,69,78,67,79,68,73,78,71,32,56,57,50, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,48,10,49,56, 10,54,48,10,56,48,10,54,48,10,49,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,68,68,10, 69,78,67,79,68,73,78,71,32,56,57,50,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,48,48,10,67,48,10,51,48,10, 48,56,10,51,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,68,69,10,69,78,67,79, 68,73,78,71,32,56,57,50,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,56,10,49,48,10,69,56,10,49,48,10,69,48,10,49, 48,10,48,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,68,70,10,69,78,67,79,68,73,78,71, 32,56,57,50,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,56,48,10,52, 48,10,66,56,10,52,48,10,51,56,10,52,48,10,56,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,69,48,10,69,78,67,79,68,73,78,71,32,56,57,50, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,56,10,51,48, 10,69,48,10,51,48,10,69,56,10,51,48,10,50,56,10, 50,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,69,49,10, 69,78,67,79,68,73,78,71,32,56,57,50,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,65,48,10,54,48,10,51,56,10, 54,48,10,66,56,10,54,48,10,65,48,10,50,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,69,50,10,69,78,67,79, 68,73,78,71,32,56,57,51,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,50,48,10,50,48,10, 70,56,10,65,48,10,65,48,10,65,48,10,70,56,10,50, 48,10,70,56,10,50,48,10,50,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,69,51,10,69,78,67,79,68,73,78,71, 32,56,57,51,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,50,48,10,50,48,10,70,56,10,50, 56,10,50,56,10,50,56,10,70,56,10,50,48,10,70,56, 10,50,48,10,50,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,69,52,10,69,78,67,79,68,73,78,71,32,56,57,51, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,56,48,10,56,48, 10,56,48,10,70,56,10,49,48,10,70,56,10,52,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,69,53,10, 69,78,67,79,68,73,78,71,32,56,57,51,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,48,56,10,48,56,10,48,56,10, 70,56,10,49,48,10,70,56,10,52,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,69,54,10,69,78,67,79, 68,73,78,71,32,56,57,51,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,56,10, 54,48,10,56,48,10,54,48,10,51,56,10,50,48,10,54, 56,10,65,56,10,66,48,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,69,55,10,69,78,67,79,68,73,78,71, 32,56,57,51,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,67,48,10,51,48,10,48, 56,10,51,48,10,69,48,10,50,48,10,54,56,10,65,56, 10,66,48,10,50,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,69,56,10,69,78,67,79,68,73,78,71,32,56,57,51, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,56,10,49,48,10,69,48,10,49,48, 10,50,56,10,50,48,10,54,56,10,65,56,10,66,48,10, 50,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,69,57,10, 69,78,67,79,68,73,78,71,32,56,57,51,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,52,48,10,51,56,10,52,48,10,65,48,10, 50,48,10,54,56,10,65,56,10,66,48,10,50,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,69,65,10,69,78,67,79, 68,73,78,71,32,56,57,51,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,51,56,10,54,56,10,65,56,10,54,56,10,51, 56,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,69,66,10,69,78,67,79,68,73,78,71, 32,56,57,51,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,50,48,10,69, 48,10,66,48,10,65,56,10,66,48,10,69,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,69,67,10,69,78,67,79,68,73,78,71,32,56,57,52, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,50,48,10,50,48,10,51,56,10,54,56,10,65,56, 10,54,56,10,51,56,10,50,48,10,70,56,10,50,48,10, 50,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,69,68,10, 69,78,67,79,68,73,78,71,32,56,57,52,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,50,48, 10,50,48,10,69,48,10,66,48,10,65,56,10,66,48,10, 69,48,10,50,48,10,70,56,10,50,48,10,50,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,69,69,10,69,78,67,79, 68,73,78,71,32,56,57,52,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,48,48,10,48,48,10,50,48,10,48,48,10,48, 48,10,50,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,69,70,10,69,78,67,79,68,73,78,71, 32,56,57,52,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,65,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,70,48,10,69,78,67,79,68,73,78,71,32,56,57,52, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,56,10,48,48, 10,50,48,10,48,48,10,56,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,70,49,10, 69,78,67,79,68,73,78,71,32,56,57,52,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,56,48,10,48,48,10,50,48,10, 48,48,10,48,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,70,50,10,69,78,67,79, 68,73,78,71,32,56,57,52,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,51,56,10,52,48,10,52,48,10,70,48,10,52, 48,10,52,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,70,51,10,69,78,67,79,68,73,78,71, 32,56,57,52,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 56,10,52,48,10,56,56,10,70,56,10,56,56,10,52,48, 10,51,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,70,52,10,69,78,67,79,68,73,78,71,32,56,57,52, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,56,10,52,48, 10,52,56,10,55,56,10,52,56,10,52,48,10,51,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,70,53,10, 69,78,67,79,68,73,78,71,32,56,57,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,51,48,10,48,48,10,51,56,10,52,48,10,56,48,10, 70,48,10,56,48,10,52,48,10,51,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,70,54,10,69,78,67,79, 68,73,78,71,32,56,57,53,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 48,48,10,51,56,10,52,48,10,56,48,10,70,48,10,56, 48,10,52,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,70,55,10,69,78,67,79,68,73,78,71, 32,56,57,53,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,55,56,10,48, 48,10,51,56,10,52,48,10,55,48,10,52,48,10,51,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,70,56,10,69,78,67,79,68,73,78,71,32,56,57,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,56,10,52,48, 10,56,48,10,70,48,10,56,48,10,52,48,10,51,56,10, 48,48,10,70,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,70,57,10, 69,78,67,79,68,73,78,71,32,56,57,53,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,51,56,10,52,48,10,70,48,10, 56,48,10,70,48,10,52,48,10,51,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,70,65,10,69,78,67,79, 68,73,78,71,32,56,57,53,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,48,10,49,48,10,49,48,10,55,56,10,49, 48,10,49,48,10,69,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,70,66,10,69,78,67,79,68,73,78,71, 32,56,57,53,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 48,10,49,48,10,56,56,10,70,56,10,56,56,10,49,48, 10,69,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 50,70,67,10,69,78,67,79,68,73,78,71,32,56,57,53, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,48,56, 10,52,56,10,55,56,10,52,56,10,48,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,50,70,68,10, 69,78,67,79,68,73,78,71,32,56,57,53,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,70,56,10,48,48,10,69,48,10,49,48,10,48,56,10, 55,56,10,48,56,10,49,48,10,69,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,50,70,69,10,69,78,67,79, 68,73,78,71,32,56,57,53,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 55,56,10,48,48,10,55,48,10,48,56,10,51,56,10,48, 56,10,55,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,50,70,70,10,69,78,67,79,68,73,78,71, 32,56,57,53,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,56,48,10,56,48,10,70,56,10,56,48,10,56,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 51,48,48,10,69,78,67,79,68,73,78,71,32,56,57,54, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,54,56,10,57,48,10,65,56,10,52,56,10,66,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,51,48,49,10, 69,78,67,79,68,73,78,71,32,56,57,54,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,51,48,10,65,56,10, 54,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,104,111,117,115,101,10,69,78,67,79,68,73, 78,71,32,56,57,54,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,53,48,10,53,48,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,51,48,51,10,69,78,67,79,68,73,78,71,32,56, 57,54,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,53,48,10,56,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,51,48, 52,10,69,78,67,79,68,73,78,71,32,56,57,54,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,56,56,10,53,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,51,48,53,10,69,78, 67,79,68,73,78,71,32,56,57,54,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,56,10,48,48, 10,50,48,10,53,48,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,51,48,54,10,69,78,67,79,68,73, 78,71,32,56,57,54,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,48,48,10,70,56,10,48,48,10,50,48,10, 53,48,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,51,48,55,10,69,78,67,79,68,73,78,71,32,56, 57,54,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,49,48,10,49,48,10,50,48,10, 50,48,10,49,48,10,49,48,10,50,48,10,50,48,10,49, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,51,48, 56,10,69,78,67,79,68,73,78,71,32,56,57,54,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 55,48,10,52,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,51,48,57,10,69,78, 67,79,68,73,78,71,32,56,57,54,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,55,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,51,48,65,10,69,78,67,79,68,73, 78,71,32,56,57,55,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,55,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,51,48,66,10,69,78,67,79,68,73,78,71,32,56, 57,55,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,55,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,51,48, 67,10,69,78,67,79,68,73,78,71,32,56,57,55,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 56,10,50,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,51,48,68,10,69,78, 67,79,68,73,78,71,32,56,57,55,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,51,48,69,10,69,78,67,79,68,73, 78,71,32,56,57,55,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,50,48,10,49,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,51,48,70,10,69,78,67,79,68,73,78,71,32,56, 57,55,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 50,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,114,101,118,108,111,103, 105,99,97,108,110,111,116,10,69,78,67,79,68,73,78,71, 32,56,57,55,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,56,48,10,56,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 51,49,49,10,69,78,67,79,68,73,78,71,32,56,57,55, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,55,48, 10,53,48,10,55,48,10,56,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,51,49,50,10, 69,78,67,79,68,73,78,71,32,56,57,55,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,51,49,51,10,69,78,67,79, 68,73,78,71,32,56,57,55,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,70,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,51,49,52,10,69,78,67,79,68,73,78,71, 32,56,57,56,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,53,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 51,49,53,10,69,78,67,79,68,73,78,71,32,56,57,56, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,53,48,10,56,56,10,65,56,10,53,48,10,65,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,51,49,54,10, 69,78,67,79,68,73,78,71,32,56,57,56,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,50,48,10,55,48,10,65,56,10,70,56,10, 65,56,10,55,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,51,49,55,10,69,78,67,79, 68,73,78,71,32,56,57,56,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 53,48,10,53,48,10,70,56,10,53,48,10,53,48,10,70, 56,10,53,48,10,53,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,51,49,56,10,69,78,67,79,68,73,78,71, 32,56,57,56,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,53, 48,10,65,56,10,55,48,10,50,48,10,55,48,10,65,56, 10,53,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 51,49,57,10,69,78,67,79,68,73,78,71,32,56,57,56, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,48,10,56,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,51,49,65,10, 69,78,67,79,68,73,78,71,32,56,57,56,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,53,48,10,55,48,10,65,56,10,66,56,10, 56,56,10,55,48,10,53,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,51,49,66,10,69,78,67,79, 68,73,78,71,32,56,57,56,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 70,56,10,56,56,10,55,48,10,50,48,10,50,48,10,53, 48,10,65,56,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,51,49,67,10,69,78,67,79,68,73,78,71, 32,56,57,56,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 48,10,56,48,10,56,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 51,49,68,10,69,78,67,79,68,73,78,71,32,56,57,56, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,56,10,48,56, 10,48,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,51,49,69,10, 69,78,67,79,68,73,78,71,32,56,57,57,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,48,10, 56,48,10,69,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,51,49,70,10,69,78,67,79, 68,73,78,71,32,56,57,57,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,48,56,10,51, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 105,110,116,101,103,114,97,108,116,112,10,69,78,67,79,68, 73,78,71,32,56,57,57,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,49,48,10,50,56,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,105, 110,116,101,103,114,97,108,98,116,10,69,78,67,79,68,73, 78,71,32,56,57,57,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,65,48,10,52,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,51,50,50,10,69,78,67,79,68,73,78,71,32,56, 57,57,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,56,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,51,50, 51,10,69,78,67,79,68,73,78,71,32,56,57,57,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,55, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,51,50,52,10,69,78, 67,79,68,73,78,71,32,56,57,57,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,50,48, 10,53,48,10,56,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,51,50,53,10,69,78,67,79,68,73, 78,71,32,56,57,57,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,56,10,67,48,10,50,48,10,49,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,51,50,54,10,69,78,67,79,68,73,78,71,32,56, 57,57,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,48,10, 68,56,10,65,52,10,68,56,10,70,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,51,50, 55,10,69,78,67,79,68,73,78,71,32,56,57,57,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,68,56,10,65, 56,10,68,56,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,51,50,56,10,69,78, 67,79,68,73,78,71,32,57,48,48,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,70,67,10,56, 52,10,65,67,10,56,52,10,65,67,10,56,52,10,65,67, 10,56,52,10,65,67,10,56,52,10,70,67,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,97,110,103,108,101,108,101,102,116,10,69,78,67,79, 68,73,78,71,32,57,48,48,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,56,10,49,48,10, 49,48,10,50,48,10,50,48,10,52,48,10,50,48,10,50, 48,10,49,48,10,49,48,10,48,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 97,110,103,108,101,114,105,103,104,116,10,69,78,67,79,68, 73,78,71,32,57,48,48,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,52,48,10,50,48,10,50, 48,10,49,48,10,49,48,10,48,56,10,49,48,10,49,48, 10,50,48,10,50,48,10,52,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,50,66,10,69,78,67,79,68,73,78,71,32, 57,48,48,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,51,67, 10,54,67,10,57,52,10,54,67,10,51,67,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 50,67,10,69,78,67,79,68,73,78,71,32,57,48,48,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,50,48,10,53,48,10,56,56,10, 56,56,10,56,56,10,53,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,50,68,10,69, 78,67,79,68,73,78,71,32,57,48,48,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,49,48,10,50,48,10,54,48,10,68,56,10,51, 48,10,50,48,10,52,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,50,69,10,69,78,67,79,68, 73,78,71,32,57,48,48,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,56, 56,10,66,67,10,65,56,10,55,48,10,52,48,10,67,48, 10,69,48,10,67,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,50,70,10,69,78,67,79,68,73,78,71,32, 57,48,48,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,48,48,10,70,56,10,48,48,10,55,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 51,48,10,69,78,67,79,68,73,78,71,32,57,48,48,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,52,56,10,70,67,10,52,56,10,52,56,10, 52,56,10,57,48,10,57,48,10,57,48,10,70,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,51,49,10,69, 78,67,79,68,73,78,71,32,57,48,48,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,52,48,10,52,48,10,65,56,10,70,67,10,65, 56,10,52,48,10,52,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,51,50,10,69,78,67,79,68, 73,78,71,32,57,48,49,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,52, 48,10,54,48,10,53,48,10,70,67,10,53,48,10,54,48, 10,52,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,51,51,10,69,78,67,79,68,73,78,71,32, 57,48,49,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,56,48,10,67,48,10,65,48,10,57,48,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 51,52,10,69,78,67,79,68,73,78,71,32,57,48,49,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,52,10,56,52,10,56,52,10,56,52,10,70,67,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,51,53,10,69, 78,67,79,68,73,78,71,32,57,48,49,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,56, 56,10,53,48,10,53,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,51,54,10,69,78,67,79,68, 73,78,71,32,57,48,49,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,51,55,10,69,78,67,79,68,73,78,71,32, 57,48,49,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,55,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,52,56,10, 52,56,10,55,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 51,56,10,69,78,67,79,68,73,78,71,32,57,48,49,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,56,56,10,56,56,10,70,56,10, 56,56,10,70,56,10,56,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,51,57,10,69, 78,67,79,68,73,78,71,32,57,48,49,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,70,56,10, 56,56,10,56,56,10,65,56,10,56,56,10,70,56,10,56, 56,10,65,56,10,56,56,10,56,56,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,51,65,10,69,78,67,79,68, 73,78,71,32,57,48,49,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,56,10,56,56,10,56, 56,10,65,56,10,68,56,10,56,56,10,68,56,10,65,56, 10,56,56,10,56,56,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,51,66,10,69,78,67,79,68,73,78,71,32, 57,48,49,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,56,56,10,56,56,10,56,56, 10,65,56,10,68,56,10,65,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 51,67,10,69,78,67,79,68,73,78,71,32,57,48,50,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,65,56,10,68,56,10,56,56,10, 56,56,10,56,56,10,68,56,10,65,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,51,68,10,69, 78,67,79,68,73,78,71,32,57,48,50,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,55,48,10,65,56,10,65,56,10,65, 56,10,55,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,51,69,10,69,78,67,79,68, 73,78,71,32,57,48,50,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,55, 48,10,56,56,10,65,56,10,68,56,10,65,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,51,70,10,69,78,67,79,68,73,78,71,32, 57,48,50,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,56,10,49,48, 10,49,48,10,70,56,10,52,48,10,52,48,10,56,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 52,48,10,69,78,67,79,68,73,78,71,32,57,48,50,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,56,48,10,52,48,10,52,48,10, 70,56,10,49,48,10,49,48,10,48,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,52,49,10,69, 78,67,79,68,73,78,71,32,57,48,50,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,70,56,10, 57,56,10,57,56,10,57,56,10,65,56,10,65,56,10,65, 56,10,67,56,10,67,56,10,67,56,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,52,50,10,69,78,67,79,68, 73,78,71,32,57,48,50,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,56,10,67,56,10,67, 56,10,67,56,10,65,56,10,65,56,10,65,56,10,57,56, 10,57,56,10,57,56,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,52,51,10,69,78,67,79,68,73,78,71,32, 57,48,50,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,56,56,10,56,56,10,57,56, 10,65,56,10,67,56,10,65,56,10,57,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 52,52,10,69,78,67,79,68,73,78,71,32,57,48,50,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,56,56,10,67,56,10,65,56,10, 57,56,10,65,56,10,67,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,52,53,10,69, 78,67,79,68,73,78,71,32,57,48,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 49,48,10,49,48,10,51,48,10,53,48,10,70,56,10,53, 48,10,51,48,10,49,48,10,49,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,52,54,10,69,78,67,79,68, 73,78,71,32,57,48,51,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,48,10,52, 48,10,54,48,10,53,48,10,70,56,10,53,48,10,54,48, 10,52,48,10,52,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,52,55,10,69,78,67,79,68,73,78,71,32, 57,48,51,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,56,56,10,56,56,10,65,56, 10,67,56,10,70,56,10,67,56,10,65,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 52,56,10,69,78,67,79,68,73,78,71,32,57,48,51,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,56,56,10,65,56,10,57,56,10, 70,56,10,57,56,10,65,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,52,57,10,69, 78,67,79,68,73,78,71,32,57,48,51,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,48,10,56,48,10,55,48,10,67,56,10,65,56,10,57, 56,10,55,48,10,48,56,10,48,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,52,65,10,69,78,67,79,68, 73,78,71,32,57,48,51,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,70,56,10,48,48,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,52,66,10,69,78,67,79,68,73,78,71,32, 57,48,51,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,55,48,10,55,48,10,65,56,10,70,56,10, 50,48,10,50,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 52,67,10,69,78,67,79,68,73,78,71,32,57,48,51,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,56,56,10,56,56,10,68,56,10, 68,56,10,65,56,10,65,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,52,68,10,69, 78,67,79,68,73,78,71,32,57,48,51,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,70,56,10, 56,56,10,56,56,10,65,56,10,65,56,10,68,56,10,68, 56,10,70,56,10,56,56,10,56,56,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,52,69,10,69,78,67,79,68, 73,78,71,32,57,48,51,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,55,48,10,65,56,10,65,56,10,55,48,10,50,48, 10,50,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,52,70,10,69,78,67,79,68,73,78,71,32, 57,48,51,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,55,48,10,65,56, 10,50,48,10,50,48,10,70,56,10,50,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 53,48,10,69,78,67,79,68,73,78,71,32,57,48,52,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,65,56,10,70,56,10,65,56,10,65,56,10, 65,56,10,65,56,10,65,56,10,65,56,10,65,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,53,49,10,69, 78,67,79,68,73,78,71,32,57,48,52,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,56,10,48,48,10,70,56,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,53,50,10,69,78,67,79,68, 73,78,71,32,57,48,52,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,70,56,10,65,56,10,55,48,10,55,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,53,51,10,69,78,67,79,68,73,78,71,32, 57,48,52,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,56,56,10,56,56,10,65,56, 10,65,56,10,68,56,10,68,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 53,52,10,69,78,67,79,68,73,78,71,32,57,48,52,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,56,56,10,70,56,10,68,56,10, 68,56,10,65,56,10,65,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,53,53,10,69, 78,67,79,68,73,78,71,32,57,48,52,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,56,10,50,48,10,50,48,10,55,48,10,65,56,10,65, 56,10,55,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,53,54,10,69,78,67,79,68, 73,78,71,32,57,48,52,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,70,56,10,50,48,10,50,48,10,65,56, 10,55,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,53,55,10,69,78,67,79,68,73,78,71,32, 57,48,52,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,65,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,70,56,10, 65,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 53,56,10,69,78,67,79,68,73,78,71,32,57,48,52,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,53,57,10,69, 78,67,79,68,73,78,71,32,57,48,52,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,53,48,10,53,48,10,53,48,10,56, 56,10,56,56,10,70,56,10,48,48,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,53,65,10,69,78,67,79,68, 73,78,71,32,57,48,53,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,53,48,10,56,56,10,53,48, 10,50,48,10,48,48,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,53,66,10,69,78,67,79,68,73,78,71,32, 57,48,53,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,53,48,10,50,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 53,67,10,69,78,67,79,68,73,78,71,32,57,48,53,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,48,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,53,68,10,69, 78,67,79,68,73,78,71,32,57,48,53,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,65,56,10,68, 56,10,65,56,10,56,56,10,56,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,53,69,10,69,78,67,79,68, 73,78,71,32,57,48,53,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,56,10,65,56,10,65, 56,10,65,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,53,70,10,69,78,67,79,68,73,78,71,32, 57,48,53,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,65,56,10,70,56,10,65,56,10,68,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 54,48,10,69,78,67,79,68,73,78,71,32,57,48,53,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,56,56,10,56,56,10,65,56,10, 56,56,10,56,56,10,65,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,54,49,10,69, 78,67,79,68,73,78,71,32,57,48,53,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,53,48,10, 53,48,10,48,48,10,70,56,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,54,50,10,69,78,67,79,68, 73,78,71,32,57,48,53,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,53,48,10,53,48,10,48, 48,10,70,56,10,56,56,10,56,56,10,53,48,10,53,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,54,51,10,69,78,67,79,68,73,78,71,32, 57,48,53,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,53,48,10,53,48,10,48,48,10,50,48, 10,50,48,10,70,56,10,55,48,10,55,48,10,56,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 54,52,10,69,78,67,79,68,73,78,71,32,57,48,54,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,53,48,10,53,48,10,48,48,10,48,48,10,50,48,10, 53,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,54,53,10,69, 78,67,79,68,73,78,71,32,57,48,54,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,53,48,10, 53,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,54,54,10,69,78,67,79,68, 73,78,71,32,57,48,54,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,65, 56,10,65,56,10,65,56,10,65,56,10,65,56,10,55,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,54,55,10,69,78,67,79,68,73,78,71,32, 57,48,54,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,49,48,10,49,48,10,55,56, 10,57,48,10,57,48,10,57,48,10,57,48,10,55,56,10, 49,48,10,49,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 54,56,10,69,78,67,79,68,73,78,71,32,57,48,54,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,53,48,10,53,48,10,48,48,10,48,48,10,48,48,10, 52,48,10,65,56,10,65,56,10,49,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,54,57,10,69, 78,67,79,68,73,78,71,32,57,48,54,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,53,48,10, 53,48,10,48,48,10,48,48,10,67,48,10,51,48,10,48, 56,10,51,48,10,67,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,54,65,10,69,78,67,79,68, 73,78,71,32,57,48,54,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,48,10,48,48, 10,51,48,10,50,48,10,52,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,54,66,10,69,78,67,79,68,73,78,71,32, 57,48,54,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,56,56,10,56,56, 10,53,48,10,53,56,10,65,56,10,66,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 54,67,10,69,78,67,79,68,73,78,71,32,57,48,54,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,53,48,10,56,56,10,69,56,10, 66,56,10,56,56,10,56,56,10,53,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,54,68,10,69, 78,67,79,68,73,78,71,32,57,48,54,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,54,56,10,65,56,10,66, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,54,69,10,69,78,67,79,68, 73,78,71,32,57,48,55,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,55,48,10,50,48,10,48,48,10,48,48,10,51,48, 10,50,48,10,52,48,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,54,70,10,69,78,67,79,68,73,78,71,32, 57,48,55,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,56,56,10,57,56,10,57,56, 10,70,56,10,65,56,10,70,56,10,67,56,10,67,56,10, 56,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 55,48,10,69,78,67,79,68,73,78,71,32,57,48,55,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,70,56,10,56,56,10,65,56,10,68,56,10,57,56,10, 65,56,10,65,56,10,56,56,10,65,56,10,56,56,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,55,49,10,69, 78,67,79,68,73,78,71,32,57,48,55,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,56,10,69,56,10,66,56,10,56,56,10,53,48,10,53, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,55,50,10,69,78,67,79,68, 73,78,71,32,57,48,55,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,53,48,10,53,48,10,56,56,10,69,56, 10,66,56,10,56,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,55,51,10,69,78,67,79,68,73,78,71,32, 57,48,55,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 49,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 55,52,10,69,78,67,79,68,73,78,71,32,57,48,55,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,70,48,10,56, 48,10,56,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,55,53,10,69, 78,67,79,68,73,78,71,32,57,48,55,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,53,48,10,56,56,10,65, 56,10,65,56,10,65,56,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,55,54,10,69,78,67,79,68, 73,78,71,32,57,48,55,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,54,56,10,57,48,10,57,48,10,57,48,10,57,48, 10,54,56,10,48,48,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,55,55,10,69,78,67,79,68,73,78,71,32, 57,48,55,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,55,48, 10,56,56,10,54,48,10,56,48,10,56,56,10,55,48,10, 48,48,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 55,56,10,69,78,67,79,68,73,78,71,32,57,48,56,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,49,48,10,48,48,10,70, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,55,57,10,69, 78,67,79,68,73,78,71,32,57,48,56,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,48,10,56,56,10,65,56,10,65, 56,10,65,56,10,53,48,10,48,48,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,55,65,10,69,78,67,79,68, 73,78,71,32,57,48,56,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,54,56,10,57,48,10,57,48,10,57,48, 10,57,48,10,54,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,55,66,10,69,78,67,79,68,73,78,71,32, 57,48,56,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,56,10,48,56,10,48,56, 10,51,56,10,49,67,10,57,48,10,53,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 55,67,10,69,78,67,79,68,73,78,71,32,57,48,56,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,54,48,10,54,48,10,52,48,10,67,48,10, 67,48,10,52,48,10,54,48,10,70,67,10,67,48,10,69, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,55,68,10,69, 78,67,79,68,73,78,71,32,57,48,56,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,68,56,10,55, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,55,69,10,69,78,67,79,68, 73,78,71,32,57,48,56,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,56,10,70,56,10,53,48, 10,68,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,55,70,10,69,78,67,79,68,73,78,71,32, 57,48,56,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,55,48, 10,70,56,10,70,56,10,70,56,10,55,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 56,48,10,69,78,67,79,68,73,78,71,32,57,48,56,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,55,48,10,48,56,10,55,56,10, 56,56,10,56,56,10,55,56,10,48,48,10,56,56,10,53, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,56,49,10,69, 78,67,79,68,73,78,71,32,57,48,56,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,54,48,10,49,48,10,55, 48,10,57,48,10,57,48,10,55,52,10,48,48,10,70,67, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,56,50,10,69,78,67,79,68, 73,78,71,32,57,48,57,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,56,10,50,52,10,54,67,10,66,52, 10,66,52,10,54,67,10,48,48,10,54,67,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,56,51,10,69,78,67,79,68,73,78,71,32, 57,48,57,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,57,52,10,51,48,10,68,52,10,53,48,10, 66,52,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 56,52,10,69,78,67,79,68,73,78,71,32,57,48,57,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 68,52,10,68,52,10,68,52,10,70,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,56,53,10,69, 78,67,79,68,73,78,71,32,57,48,57,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,70,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,70,56,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,56,54,10,69,78,67,79,68, 73,78,71,32,57,48,57,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,53,48,10,56,56,10,50,52,10,70,52,10,50,52, 10,56,56,10,53,48,10,50,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,56,55,10,69,78,67,79,68,73,78,71,32, 57,48,57,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,56, 10,49,67,10,50,56,10,52,48,10,57,67,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 56,56,10,69,78,67,79,68,73,78,71,32,57,48,57,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,65,56,10, 55,48,10,65,56,10,55,48,10,65,56,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,56,57,10,69, 78,67,79,68,73,78,71,32,57,48,57,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,56,10,56,52,10,56, 52,10,67,67,10,66,52,10,55,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,56,65,10,69,78,67,79,68, 73,78,71,32,57,48,57,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,56,10,56,52,10,70,67,10,67,67,10,66,52, 10,56,52,10,55,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,56,66,10,69,78,67,79,68,73,78,71,32, 57,48,57,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,69,56, 10,67,52,10,65,52,10,49,52,10,56,52,10,55,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 56,67,10,69,78,67,79,68,73,78,71,32,57,49,48,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,48,10,67,56,10, 48,48,10,53,48,10,65,56,10,53,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,56,68,10,69, 78,67,79,68,73,78,71,32,57,49,48,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,68,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,56,69,10,69,78,67,79,68, 73,78,71,32,57,49,48,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,56,10,53,48,10,53,48,10,53,48,10,53,48, 10,70,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,56,70,10,69,78,67,79,68,73,78,71,32, 57,49,48,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,50,48,10,53,48,10,56,56,10,53,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 57,48,10,69,78,67,79,68,73,78,71,32,57,49,48,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,53,48,10, 56,56,10,53,48,10,50,48,10,70,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,57,49,10,69, 78,67,79,68,73,78,71,32,57,49,48,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,50,48,10,53,48,10,70, 56,10,53,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,57,50,10,69,78,67,79,68, 73,78,71,32,57,49,48,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,53,48,10,70,56,10,53,48,10,50,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,57,51,10,69,78,67,79,68,73,78,71,32, 57,49,48,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,48,48,10,65,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 57,52,10,69,78,67,79,68,73,78,71,32,57,49,48,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,51,48,10,52,56,10,56,52,10, 56,52,10,56,52,10,52,56,10,51,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,57,53,10,69, 78,67,79,68,73,78,71,32,57,49,48,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,70,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,57,54,10,69,78,67,79,68, 73,78,71,32,57,49,49,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,56,10,55,48,10,55,48,10,54,48,10,54,48, 10,52,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,57,55,10,69,78,67,79,68,73,78,71,32, 57,49,49,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,52,56,10,50,56, 10,52,56,10,70,56,10,52,56,10,50,56,10,52,56,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 57,56,10,69,78,67,79,68,73,78,71,32,57,49,49,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,48,10,57,48,10,65,48,10,57,48,10, 70,56,10,57,48,10,65,48,10,57,48,10,70,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,57,57,10,69, 78,67,79,68,73,78,71,32,57,49,49,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,51,56,10,54,56,10,52,56,10,67,67,10,67, 67,10,67,67,10,70,67,10,70,67,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,57,65,10,69,78,67,79,68, 73,78,71,32,57,49,49,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,56,10,56,52,10,57,52,10,65,52,10,56,52, 10,55,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,57,66,10,69,78,67,79,68,73,78,71,32, 57,49,49,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,49,48,10,50,48,10,50,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 57,67,10,69,78,67,79,68,73,78,71,32,57,49,49,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,57,68,10,69, 78,67,79,68,73,78,71,32,57,49,49,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,52,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,50,48,10,50,48,10,49,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,57,69,10,69,78,67,79,68, 73,78,71,32,57,49,49,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,52,48,10,50,48,10,50, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,57,70,10,69,78,67,79,68,73,78,71,32, 57,49,49,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 65,48,10,69,78,67,79,68,73,78,71,32,57,49,50,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,50,48,10,50,48,10,52, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,65,49,10,69, 78,67,79,68,73,78,71,32,57,49,50,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,55,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,65,50,10,69,78,67,79,68, 73,78,71,32,57,49,50,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,65,51,10,69,78,67,79,68,73,78,71,32, 57,49,50,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,52,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 52,48,10,55,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 65,52,10,69,78,67,79,68,73,78,71,32,57,49,50,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,55,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,65,53,10,69, 78,67,79,68,73,78,71,32,57,49,50,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,65,54,10,69,78,67,79,68, 73,78,71,32,57,49,50,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,55,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,65,55,10,69,78,67,79,68,73,78,71,32, 57,49,50,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,49,56,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 65,56,10,69,78,67,79,68,73,78,71,32,57,49,50,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 67,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,65,57,10,69, 78,67,79,68,73,78,71,32,57,49,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,49,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,65,65,10,69,78,67,79,68, 73,78,71,32,57,49,51,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,65,66,10,69,78,67,79,68,73,78,71,32, 57,49,51,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,67,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 65,67,10,69,78,67,79,68,73,78,71,32,57,49,51,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 49,56,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,65,68,10,69, 78,67,79,68,73,78,71,32,57,49,51,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,67,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,65,69,10,69,78,67,79,68, 73,78,71,32,57,49,51,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,65,70,10,69,78,67,79,68,73,78,71,32, 57,49,51,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,67,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 66,48,10,69,78,67,79,68,73,78,71,32,57,49,51,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,49,56, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,67,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,66,49,10,69, 78,67,79,68,73,78,71,32,57,49,51,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,67,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,49,56, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,66,50,10,69,78,67,79,68, 73,78,71,32,57,49,51,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,67,10,56,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,49,48,10,49,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,66,51,10,69,78,67,79,68,73,78,71,32, 57,49,51,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,49,48,10,49,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 56,48,10,70,67,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 66,52,10,69,78,67,79,68,73,78,71,32,57,49,52,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,56,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,66,53,10,69, 78,67,79,68,73,78,71,32,57,49,52,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,56,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,66,54,10,69,78,67,79,68, 73,78,71,32,57,49,52,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,56, 56,10,70,56,10,48,48,10,48,48,10,48,48,10,70,56, 10,56,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,66,55,10,69,78,67,79,68,73,78,71,32, 57,49,52,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,65,48,10,65,48,10,54,48,10,54,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 66,56,10,69,78,67,79,68,73,78,71,32,57,49,52,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,56,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,66,57,10,69, 78,67,79,68,73,78,71,32,57,49,52,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,52,10,48,52,10, 48,52,10,48,52,10,48,52,10,48,52,10,48,52,10,48, 52,10,48,52,10,48,52,10,48,52,10,48,52,10,48,52, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,66,65,10,69,78,67,79,68, 73,78,71,32,57,49,52,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,70,67,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,66,66,10,69,78,67,79,68,73,78,71,32, 57,49,52,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,70,67,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 66,67,10,69,78,67,79,68,73,78,71,32,57,49,52,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,67,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,66,68,10,69, 78,67,79,68,73,78,71,32,57,49,52,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,67, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,66,69,10,69,78,67,79,68, 73,78,71,32,57,49,53,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,56, 48,10,56,48,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,66,70,10,69,78,67,79,68,73,78,71,32, 57,49,53,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 67,48,10,69,78,67,79,68,73,78,71,32,57,49,53,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,50,48,10,55,48,10,65,56,10, 65,56,10,65,56,10,55,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,67,49,10,69, 78,67,79,68,73,78,71,32,57,49,53,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,56,10,50,48,10,55,48,10,65,56,10,65,56,10,65, 56,10,55,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,67,50,10,69,78,67,79,68, 73,78,71,32,57,49,53,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,55,48,10,65,56,10,65,56,10,65,56,10,55,48, 10,50,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,67,51,10,69,78,67,79,68,73,78,71,32, 57,49,53,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,55,48,10,55,48,10,65,56,10,70,56,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 67,52,10,69,78,67,79,68,73,78,71,32,57,49,53,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,50,48,10,50,48,10,55,48,10, 55,48,10,65,56,10,70,56,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,67,53,10,69, 78,67,79,68,73,78,71,32,57,49,53,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,55,48,10,55,48,10,65, 56,10,70,56,10,50,48,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,67,54,10,69,78,67,79,68, 73,78,71,32,57,49,53,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,54,56,10,66,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,67,55,10,69,78,67,79,68,73,78,71,32, 57,49,53,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,50,48,10,50,48, 10,50,48,10,54,56,10,66,48,10,50,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 67,56,10,69,78,67,79,68,73,78,71,32,57,49,54,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 54,56,10,66,48,10,50,48,10,50,48,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,67,57,10,69, 78,67,79,68,73,78,71,32,57,49,54,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 70,56,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,67,65,10,69,78,67,79,68, 73,78,71,32,57,49,54,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,51,67,66,10,69,78,67,79,68,73,78,71,32, 57,49,54,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,48,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,51, 67,67,10,69,78,67,79,68,73,78,71,32,57,49,54,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,56,10,48,56,10,48,56,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,51,67,68,10,69, 78,67,79,68,73,78,71,32,57,49,54,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,65,56,10,65,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,51,67,69,10,69,78,67,79,68, 73,78,71,32,57,49,54,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,49,56,10,49, 56,10,49,56,10,49,56,10,53,56,10,70,56,10,70,48, 10,52,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,48,48,10,69,78,67,79,68,73,78,71,32, 57,50,49,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,57,48,10,68,48,10,66,48,10,57,48, 10,53,48,10,53,48,10,55,48,10,50,48,10,50,48,10, 50,48,10,51,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 48,49,10,69,78,67,79,68,73,78,71,32,57,50,49,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,54,48,10,56,48,10,52,48,10,50,48,10,69,48,10, 53,48,10,53,48,10,50,48,10,50,56,10,51,56,10,50, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,48,50,10,69, 78,67,79,68,73,78,71,32,57,50,49,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,54,48,10, 56,48,10,52,48,10,50,48,10,67,48,10,55,48,10,50, 48,10,50,48,10,50,56,10,49,48,10,50,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,48,51,10,69,78,67,79,68, 73,78,71,32,57,50,49,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,69,48,10,56,48,10,67, 48,10,56,48,10,69,48,10,55,48,10,50,48,10,50,48, 10,50,56,10,49,48,10,50,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,48,52,10,69,78,67,79,68,73,78,71,32, 57,50,50,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,69,48,10,56,48,10,67,48,10,56,48, 10,69,48,10,53,48,10,53,48,10,50,48,10,51,56,10, 49,48,10,49,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 48,53,10,69,78,67,79,68,73,78,71,32,57,50,50,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,69,48, 10,56,48,10,67,48,10,56,48,10,69,48,10,54,56,10, 53,56,10,52,56,10,49,48,10,50,56,10,50,56,10,51, 56,10,49,56,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,48,54,10,69, 78,67,79,68,73,78,71,32,57,50,50,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,48,10, 65,48,10,69,48,10,65,48,10,51,48,10,52,48,10,51, 48,10,48,48,10,50,56,10,51,48,10,50,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,48,55,10,69,78,67,79,68, 73,78,71,32,57,50,50,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,67,48,10,65,48,10,67,48,10,65, 48,10,70,48,10,52,48,10,54,48,10,52,48,10,55,48, 10,50,48,10,50,48,10,50,48,10,51,56,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,48,56,10,69,78,67,79,68,73,78,71,32, 57,50,50,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,67,48,10,65,48,10,67,48, 10,65,48,10,68,56,10,50,48,10,49,48,10,48,56,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 48,57,10,69,78,67,79,68,73,78,71,32,57,50,50,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,65,48,10,65,48,10,69,48,10,65,48,10, 65,48,10,51,56,10,49,48,10,49,48,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,48,65,10,69, 78,67,79,68,73,78,71,32,57,50,50,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,48,10,56,48,10,56,48,10,69,48,10,51,56,10,50, 48,10,51,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,48,66,10,69,78,67,79,68, 73,78,71,32,57,50,50,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,65,48,10,65, 48,10,65,48,10,52,48,10,52,48,10,51,56,10,49,48, 10,49,48,10,49,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,48,67,10,69,78,67,79,68,73,78,71,32, 57,50,50,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,69,48,10,56,48,10,67,48, 10,56,48,10,66,56,10,50,48,10,51,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 48,68,10,69,78,67,79,68,73,78,71,32,57,50,50,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,54,48,10,56,48,10,56,48,10,54,48,10, 51,48,10,50,56,10,51,48,10,50,56,10,50,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,48,69,10,69, 78,67,79,68,73,78,71,32,57,50,51,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 54,48,10,56,48,10,52,48,10,50,48,10,68,48,10,50, 56,10,50,56,10,50,56,10,49,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,48,70,10,69,78,67,79,68, 73,78,71,32,57,50,51,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,54,48,10,56, 48,10,52,48,10,50,48,10,70,56,10,49,48,10,49,48, 10,49,48,10,51,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,49,48,10,69,78,67,79,68,73,78,71,32, 57,50,51,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,67,48,10,65,48,10,65,48,10,67,48,10,52,48, 10,52,48,10,52,48,10,55,48,10,51,56,10,50,48,10, 51,48,10,50,48,10,51,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 49,49,10,69,78,67,79,68,73,78,71,32,57,50,51,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,67,48, 10,65,48,10,65,48,10,67,48,10,51,48,10,52,48,10, 52,48,10,51,48,10,48,48,10,49,48,10,51,48,10,49, 48,10,51,56,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,49,50,10,69, 78,67,79,68,73,78,71,32,57,50,51,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,67,48,10,65,48,10, 65,48,10,67,48,10,51,48,10,52,48,10,52,48,10,51, 48,10,48,48,10,51,48,10,48,56,10,49,48,10,51,56, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,49,51,10,69,78,67,79,68, 73,78,71,32,57,50,51,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,67,48,10,65,48,10,65,48,10,67, 48,10,51,48,10,52,48,10,52,48,10,51,48,10,49,48, 10,50,56,10,49,48,10,48,56,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,49,52,10,69,78,67,79,68,73,78,71,32, 57,50,51,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,67,48,10,65,48,10,65,48,10,67,48,10,51,48, 10,52,48,10,52,48,10,51,48,10,48,48,10,50,48,10, 51,48,10,51,56,10,49,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 49,53,10,69,78,67,79,68,73,78,71,32,57,50,51,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,57,48, 10,68,48,10,66,48,10,48,48,10,50,48,10,53,48,10, 55,48,10,53,48,10,48,48,10,50,56,10,51,48,10,51, 48,10,50,56,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,49,54,10,69, 78,67,79,68,73,78,71,32,57,50,51,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,54,48,10,56,48,10, 52,48,10,50,48,10,67,48,10,53,48,10,53,48,10,50, 48,10,50,48,10,52,56,10,54,56,10,53,56,10,52,56, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,49,55,10,69,78,67,79,68, 73,78,71,32,57,50,51,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,69,48,10,56,48,10,67,48,10,56, 48,10,69,48,10,55,48,10,50,48,10,50,48,10,51,48, 10,50,56,10,51,48,10,50,56,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,49,56,10,69,78,67,79,68,73,78,71,32, 57,50,52,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,55,48,10,56,48,10,56,48,10,55,48,10,50,48, 10,53,48,10,55,48,10,53,48,10,48,48,10,54,56,10, 53,56,10,52,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 49,57,10,69,78,67,79,68,73,78,71,32,57,50,52,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,69,48,10,56,48,10,67,48,10,56,48,10,69,48,10, 48,48,10,53,48,10,55,48,10,53,48,10,53,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,49,65,10,69, 78,67,79,68,73,78,71,32,57,50,52,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,54,48,10,56,48,10, 52,48,10,50,48,10,67,48,10,53,48,10,53,48,10,50, 48,10,51,48,10,50,56,10,51,48,10,50,56,10,51,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,49,66,10,69,78,67,79,68, 73,78,71,32,57,50,52,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,69,48,10,56,48,10,67,48,10,56, 48,10,70,48,10,52,48,10,50,48,10,49,48,10,55,56, 10,50,48,10,50,48,10,49,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,49,67,10,69,78,67,79,68,73,78,71,32, 57,50,52,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,69,48,10,56,48,10,67,48, 10,56,48,10,57,56,10,50,48,10,49,48,10,48,56,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 49,68,10,69,78,67,79,68,73,78,71,32,57,50,52,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,55,48,10,56,48,10,66,48,10,57,48,10,54,48,10, 49,56,10,50,48,10,49,48,10,48,56,10,51,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,49,69,10,69, 78,67,79,68,73,78,71,32,57,50,52,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 65,48,10,67,48,10,65,48,10,65,48,10,49,56,10,50, 48,10,49,48,10,48,56,10,51,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,49,70,10,69,78,67,79,68, 73,78,71,32,57,50,52,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,57,48,10,57,48,10,57, 48,10,57,48,10,54,48,10,49,56,10,50,48,10,49,48, 10,48,56,10,51,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,50,48,10,69,78,67,79,68,73,78,71,32, 57,50,52,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,54,48,10,56,48,10,52,48,10,50,48, 10,67,48,10,51,48,10,50,56,10,51,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 50,49,10,69,78,67,79,68,73,78,71,32,57,50,52,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,65,48,10,65,48,10,70,48,10,52,48,10, 54,48,10,52,48,10,55,48,10,50,48,10,50,48,10,51, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,50,50,10,69, 78,67,79,68,73,78,71,32,57,50,53,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 52,48,10,53,48,10,54,48,10,52,48,10,70,48,10,52, 56,10,52,56,10,52,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,50,51,10,69,78,67,79,68, 73,78,71,32,57,50,53,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,56,56,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,50,52,10,69,78,67,79,68,73,78,71,32, 57,50,53,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,57,48,10,68,48,10,66,48, 10,57,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 51,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 50,53,10,69,78,67,79,68,73,78,71,32,57,50,53,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,52,56,10,52,56,10,57,48,10,57,48,10, 50,48,10,52,56,10,52,56,10,57,48,10,57,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,50,54,10,69, 78,67,79,68,73,78,71,32,57,50,53,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,56,56,10,56,48,10,52,48,10,50, 48,10,50,48,10,48,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,52,48,10,69,78,67,79,68, 73,78,71,32,57,50,56,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,51,56,10,50, 56,10,50,56,10,50,56,10,50,48,10,65,48,10,65,48, 10,65,48,10,69,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,52,49,10,69,78,67,79,68,73,78,71,32, 57,50,56,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,56,10,48,56,10,48,56, 10,48,56,10,70,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 52,50,10,69,78,67,79,68,73,78,71,32,57,50,56,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,56,56,10,56,56,10,56,56,10,56,56,10, 70,56,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,52,51,10,69, 78,67,79,68,73,78,71,32,57,50,56,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,70,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,52,52,10,69,78,67,79,68, 73,78,71,32,57,50,56,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,65, 56,10,65,56,10,50,48,10,50,48,10,50,48,10,65,56, 10,65,56,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,52,53,10,69,78,67,79,68,73,78,71,32, 57,50,56,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,56,56,10,68,56,10,65,56, 10,68,56,10,56,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 52,54,10,69,78,67,79,68,73,78,71,32,57,50,56,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,49,56,10,49,56,10,68,56,10, 67,48,10,67,48,10,68,56,10,49,56,10,49,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,52,55,10,69, 78,67,79,68,73,78,71,32,57,50,56,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 49,56,10,49,56,10,49,56,10,50,48,10,50,48,10,50, 48,10,67,48,10,67,48,10,67,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,52,56,10,69,78,67,79,68, 73,78,71,32,57,50,56,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 67,10,65,67,10,65,67,10,65,67,10,65,48,10,65,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,52,57,10,69,78,67,79,68,73,78,71,32, 57,50,56,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,65,56, 10,65,56,10,65,56,10,65,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 52,65,10,69,78,67,79,68,73,78,71,32,57,50,57,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,57,48,10,57,48,10,57,48,10, 57,48,10,52,56,10,52,56,10,52,56,10,52,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,54,48,10,69, 78,67,79,68,73,78,71,32,57,51,49,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,65,56,10,69,56,10,65,56,10,65, 56,10,70,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,54,49,10,69,78,67,79,68, 73,78,71,32,57,51,49,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,56, 56,10,65,56,10,68,56,10,57,56,10,65,56,10,70,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,54,50,10,69,78,67,79,68,73,78,71,32, 57,51,49,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,56,56,10,65,56, 10,68,56,10,65,56,10,57,56,10,69,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 54,51,10,69,78,67,79,68,73,78,71,32,57,51,49,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,67,56,10,67,56,10, 69,56,10,70,56,10,65,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,54,52,10,69, 78,67,79,68,73,78,71,32,57,51,49,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,70,56,10,67,56,10,69,56,10,57, 56,10,69,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,54,53,10,69,78,67,79,68, 73,78,71,32,57,51,49,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,56, 56,10,66,56,10,67,56,10,69,56,10,68,56,10,65,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,54,54,10,69,78,67,79,68,73,78,71,32, 57,51,49,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,56,56,10,70,56, 10,57,56,10,65,56,10,65,56,10,65,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 54,55,10,69,78,67,79,68,73,78,71,32,57,51,49,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,65,56,10,68,56,10, 65,56,10,68,56,10,65,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,54,56,10,69, 78,67,79,68,73,78,71,32,57,51,50,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,65,56,10,68,56,10,66,56,10,57, 56,10,69,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,54,57,10,69,78,67,79,68, 73,78,71,32,57,51,50,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,56,10,56, 52,10,68,52,10,69,67,10,69,67,10,69,67,10,68,52, 10,56,52,10,55,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,54,65,10,69,78,67,79,68,73,78,71,32, 57,51,50,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,56,52,10,68,52, 10,68,52,10,68,52,10,68,52,10,68,52,10,56,52,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 54,66,10,69,78,67,79,68,73,78,71,32,57,51,50,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,56,10,56,52,10,68,52,10,67,67,10, 67,67,10,68,52,10,68,67,10,56,52,10,55,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,54,67,10,69, 78,67,79,68,73,78,71,32,57,51,50,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,56,10,56,52,10,68,52,10,67,67,10,68,52,10,67, 67,10,68,52,10,56,52,10,55,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,54,68,10,69,78,67,79,68, 73,78,71,32,57,51,50,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,56,10,56, 52,10,68,52,10,68,52,10,68,67,10,68,67,10,67,67, 10,56,52,10,55,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,54,69,10,69,78,67,79,68,73,78,71,32, 57,51,50,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,56,52,10,68,67, 10,68,52,10,68,67,10,67,67,10,68,67,10,56,52,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 54,70,10,69,78,67,79,68,73,78,71,32,57,51,50,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,56,10,56,52,10,68,52,10,68,52,10, 68,67,10,68,52,10,67,67,10,56,52,10,55,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,55,48,10,69, 78,67,79,68,73,78,71,32,57,51,50,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,56,10,56,52,10,68,67,10,67,67,10,68,52,10,68, 52,10,68,52,10,56,52,10,55,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,55,49,10,69,78,67,79,68, 73,78,71,32,57,51,50,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,56,10,56, 52,10,67,67,10,68,52,10,67,67,10,68,52,10,67,67, 10,56,52,10,55,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,55,50,10,69,78,67,79,68,73,78,71,32, 57,51,51,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,56,52,10,67,67, 10,68,52,10,67,67,10,67,52,10,68,67,10,56,52,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 55,51,10,69,78,67,79,68,73,78,71,32,57,51,51,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,56,10,56,52,10,70,67,10,66,52,10, 66,52,10,68,52,10,70,67,10,56,52,10,55,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,55,52,10,69, 78,67,79,68,73,78,71,32,57,51,51,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 53,48,10,56,56,10,65,56,10,69,56,10,65,56,10,65, 56,10,70,56,10,56,56,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,55,53,10,69,78,67,79,68, 73,78,71,32,57,51,51,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,53,48,10,56, 56,10,65,56,10,68,56,10,57,56,10,65,56,10,70,56, 10,56,56,10,53,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,55,54,10,69,78,67,79,68,73,78,71,32, 57,51,51,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,53,48,10,56,56,10,65,56, 10,68,56,10,65,56,10,57,56,10,69,56,10,56,56,10, 53,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 55,55,10,69,78,67,79,68,73,78,71,32,57,51,51,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,53,48,10,56,56,10,67,56,10,67,56,10, 69,56,10,70,56,10,65,56,10,56,56,10,53,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,55,56,10,69, 78,67,79,68,73,78,71,32,57,51,51,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 53,48,10,56,56,10,70,56,10,67,56,10,69,56,10,57, 56,10,69,56,10,56,56,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,55,57,10,69,78,67,79,68, 73,78,71,32,57,51,51,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,53,48,10,56, 56,10,66,56,10,67,56,10,69,56,10,68,56,10,65,56, 10,56,56,10,53,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,55,65,10,69,78,67,79,68,73,78,71,32, 57,51,51,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,53,48,10,56,56,10,70,56, 10,57,56,10,65,56,10,65,56,10,65,56,10,56,56,10, 53,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 55,66,10,69,78,67,79,68,73,78,71,32,57,51,51,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,53,48,10,56,56,10,65,56,10,68,56,10, 65,56,10,68,56,10,65,56,10,56,56,10,53,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,55,67,10,69, 78,67,79,68,73,78,71,32,57,51,52,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 53,48,10,56,56,10,65,56,10,68,56,10,66,56,10,57, 56,10,69,56,10,56,56,10,53,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,55,68,10,69,78,67,79,68, 73,78,71,32,57,51,52,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,56,10,56, 52,10,68,52,10,69,67,10,69,67,10,69,67,10,68,52, 10,56,52,10,52,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,55,69,10,69,78,67,79,68,73,78,71,32, 57,51,52,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,52,56,10,56,52,10,68,52, 10,68,52,10,68,52,10,68,52,10,68,52,10,56,52,10, 52,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 55,70,10,69,78,67,79,68,73,78,71,32,57,51,52,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,52,56,10,56,52,10,68,52,10,67,67,10, 67,67,10,68,52,10,68,67,10,56,52,10,52,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,56,48,10,69, 78,67,79,68,73,78,71,32,57,51,52,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 52,56,10,56,52,10,68,52,10,67,67,10,68,52,10,67, 67,10,68,52,10,56,52,10,52,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,56,49,10,69,78,67,79,68, 73,78,71,32,57,51,52,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,56,10,56, 52,10,68,52,10,68,52,10,68,67,10,68,67,10,67,67, 10,56,52,10,52,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,56,50,10,69,78,67,79,68,73,78,71,32, 57,51,52,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,52,56,10,56,52,10,68,67, 10,68,52,10,68,67,10,67,67,10,68,67,10,56,52,10, 52,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 56,51,10,69,78,67,79,68,73,78,71,32,57,51,52,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,52,56,10,56,52,10,68,52,10,68,52,10, 68,67,10,68,52,10,67,67,10,56,52,10,52,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,52,56,52,10,69, 78,67,79,68,73,78,71,32,57,51,52,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 52,56,10,56,52,10,68,67,10,67,67,10,68,52,10,68, 52,10,68,52,10,56,52,10,52,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,52,56,53,10,69,78,67,79,68, 73,78,71,32,57,51,52,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,56,10,56, 52,10,67,67,10,68,52,10,67,67,10,68,52,10,67,67, 10,56,52,10,52,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,52,56,54,10,69,78,67,79,68,73,78,71,32, 57,51,53,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,52,56,10,56,52,10,67,67, 10,68,52,10,67,67,10,67,52,10,68,67,10,56,52,10, 52,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,52, 69,65,10,69,78,67,79,68,73,78,71,32,57,52,53,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,65,56,10,68,56,10, 68,56,10,68,56,10,65,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,83,70,49,48,48,48,48,48,10, 69,78,67,79,68,73,78,71,32,57,52,55,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,67,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,48,49,10,69,78,67,79, 68,73,78,71,32,57,52,55,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,67,10,70,67,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 83,70,49,49,48,48,48,48,10,69,78,67,79,68,73,78, 71,32,57,52,55,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,48,51,10,69,78,67,79,68,73,78,71,32,57,52, 55,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 51,48,10,51,48,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,48,52, 10,69,78,67,79,68,73,78,71,32,57,52,55,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,65,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,48,53,10,69,78,67, 79,68,73,78,71,32,57,52,55,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,65,56,10,65,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,48,54,10,69,78,67,79,68,73,78, 71,32,57,52,55,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,50,48,10,50,48,10,48,48,10,48,48,10,50, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,48,55,10,69,78,67,79,68,73,78,71,32,57,52, 55,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,51,48,10,51,48,10,48,48,10,48,48,10,51, 48,10,51,48,10,48,48,10,48,48,10,51,48,10,51,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,48,56, 10,69,78,67,79,68,73,78,71,32,57,52,56,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,65,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,48,57,10,69,78,67, 79,68,73,78,71,32,57,52,56,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,65,56,10,65,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,48,65,10,69,78,67,79,68,73,78, 71,32,57,52,56,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,50,48,10,50,48,10,48,48,10,50,48,10, 50,48,10,48,48,10,50,48,10,50,48,10,48,48,10,50, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,48,66,10,69,78,67,79,68,73,78,71,32,57,52, 56,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 51,48,10,51,48,10,48,48,10,51,48,10,51,48,10,48, 48,10,51,48,10,51,48,10,48,48,10,51,48,10,51,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,83,70,48,49,48,48,48, 48,10,69,78,67,79,68,73,78,71,32,57,52,56,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 67,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,48,68,10,69,78, 67,79,68,73,78,71,32,57,52,56,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,67,10,51,67, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,48,69,10,69,78,67,79,68,73, 78,71,32,57,52,56,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,51,67,10,51,48,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,48,70,10,69,78,67,79,68,73,78,71,32,57, 52,56,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,51,67,10,51,67,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,83,70,48,51,48,48, 48,48,10,69,78,67,79,68,73,78,71,32,57,52,56,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,49,49,10,69, 78,67,79,68,73,78,71,32,57,52,56,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,48,10,69, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,49,50,10,69,78,67,79,68, 73,78,71,32,57,52,57,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,49,51,10,69,78,67,79,68,73,78,71,32, 57,52,57,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,48,10,70,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,51,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,83,70,48,50,48, 48,48,48,10,69,78,67,79,68,73,78,71,32,57,52,57, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,51,67,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,53,49,53,10, 69,78,67,79,68,73,78,71,32,57,52,57,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,51,67,10, 51,67,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,49,54,10,69,78,67,79, 68,73,78,71,32,57,52,57,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,67,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,53,49,55,10,69,78,67,79,68,73,78,71, 32,57,52,57,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,51,48,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,67,10,51,67,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,83,70,48,52, 48,48,48,48,10,69,78,67,79,68,73,78,71,32,57,52, 57,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,69,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,49,57, 10,69,78,67,79,68,73,78,71,32,57,52,57,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,69,48, 10,69,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,49,65,10,69,78,67, 79,68,73,78,71,32,57,52,57,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,70,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,49,66,10,69,78,67,79,68,73,78, 71,32,57,52,57,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,51,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,70,48,10,70,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,83,70,48, 56,48,48,48,48,10,69,78,67,79,68,73,78,71,32,57, 53,48,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,51,67,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,49, 68,10,69,78,67,79,68,73,78,71,32,57,53,48,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,51, 67,10,51,67,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,49,69,10,69,78, 67,79,68,73,78,71,32,57,53,48,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,51,67,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,49,70,10,69,78,67,79,68,73, 78,71,32,57,53,48,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,51,67,10,51,48,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,50,48,10,69,78,67,79,68,73,78,71,32,57, 53,48,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,67,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,50, 49,10,69,78,67,79,68,73,78,71,32,57,53,48,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,51,48,10,51, 67,10,51,67,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,50,50,10,69,78, 67,79,68,73,78,71,32,57,53,48,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,51,67,10,51,67, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,50,51,10,69,78,67,79,68,73, 78,71,32,57,53,48,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,67,10,51,67,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,83,70, 48,57,48,48,48,48,10,69,78,67,79,68,73,78,71,32, 57,53,48,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 50,53,10,69,78,67,79,68,73,78,71,32,57,53,48,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 69,48,10,69,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,50,54,10,69, 78,67,79,68,73,78,71,32,57,53,49,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,51,48,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,70,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,50,55,10,69,78,67,79,68, 73,78,71,32,57,53,49,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,70,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,50,56,10,69,78,67,79,68,73,78,71,32, 57,53,49,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,51,48,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,70,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,51,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 50,57,10,69,78,67,79,68,73,78,71,32,57,53,49,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,51,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 70,48,10,70,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,50,65,10,69, 78,67,79,68,73,78,71,32,57,53,49,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,70,48,10,70, 48,10,51,48,10,51,48,10,51,48,10,51,48,10,51,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,50,66,10,69,78,67,79,68, 73,78,71,32,57,53,49,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,70,48,10,70,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,83, 70,48,54,48,48,48,48,10,69,78,67,79,68,73,78,71, 32,57,53,49,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,67,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 53,50,68,10,69,78,67,79,68,73,78,71,32,57,53,49, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,67,10,69,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,53,50,69,10, 69,78,67,79,68,73,78,71,32,57,53,49,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,67,10, 51,67,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,50,70,10,69,78,67,79, 68,73,78,71,32,57,53,49,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,67,10,70,67,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,53,51,48,10,69,78,67,79,68,73,78,71, 32,57,53,50,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,67,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 53,51,49,10,69,78,67,79,68,73,78,71,32,57,53,50, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,67,10,70,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,53,51,50,10, 69,78,67,79,68,73,78,71,32,57,53,50,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,67,10, 51,67,10,51,48,10,51,48,10,51,48,10,51,48,10,51, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,51,51,10,69,78,67,79, 68,73,78,71,32,57,53,50,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,67,10,70,67,10,51, 48,10,51,48,10,51,48,10,51,48,10,51,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 83,70,48,55,48,48,48,48,10,69,78,67,79,68,73,78, 71,32,57,53,50,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,70,67,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,51,53,10,69,78,67,79,68,73,78,71,32,57,53, 50,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,70,67,10,69,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,51,54, 10,69,78,67,79,68,73,78,71,32,57,53,50,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,70,67, 10,51,67,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,51,55,10,69,78,67, 79,68,73,78,71,32,57,53,50,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,70,67,10,70,67,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,51,56,10,69,78,67,79,68,73,78, 71,32,57,53,50,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,51,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,70,67,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,51,57,10,69,78,67,79,68,73,78,71,32,57,53, 50,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 51,48,10,51,48,10,51,48,10,51,48,10,51,48,10,51, 48,10,70,67,10,70,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,51,65, 10,69,78,67,79,68,73,78,71,32,57,53,51,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,51,48,10,70,67, 10,51,67,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,51,66,10,69,78,67, 79,68,73,78,71,32,57,53,51,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,70,67,10,70,67,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,83,70,48,53,48,48,48,48,10,69,78,67,79,68,73, 78,71,32,57,53,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,70,67,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,51,68,10,69,78,67,79,68,73,78,71,32,57, 53,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,70,67,10,69,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,51, 69,10,69,78,67,79,68,73,78,71,32,57,53,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,70, 67,10,51,67,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,51,70,10,69,78, 67,79,68,73,78,71,32,57,53,51,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,70,67,10,70,67, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,52,48,10,69,78,67,79,68,73, 78,71,32,57,53,51,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,70,67,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,52,49,10,69,78,67,79,68,73,78,71,32,57, 53,51,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,70,67,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,52, 50,10,69,78,67,79,68,73,78,71,32,57,53,51,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,51,48,10,70, 67,10,51,48,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,52,51,10,69,78, 67,79,68,73,78,71,32,57,53,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,70,67,10,70,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,52,52,10,69,78,67,79,68,73, 78,71,32,57,53,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,70,67,10,51,67,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,52,53,10,69,78,67,79,68,73,78,71,32,57, 53,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,70,67,10,70,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,52, 54,10,69,78,67,79,68,73,78,71,32,57,53,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,70, 67,10,51,67,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,52,55,10,69,78, 67,79,68,73,78,71,32,57,53,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,70,67,10,70,67, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,52,56,10,69,78,67,79,68,73, 78,71,32,57,53,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,70,67,10,70,67,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,52,57,10,69,78,67,79,68,73,78,71,32,57, 53,52,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,70,67,10,70,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,52, 65,10,69,78,67,79,68,73,78,71,32,57,53,52,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,51,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,51,48,10,70, 67,10,51,67,10,51,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,52,66,10,69,78, 67,79,68,73,78,71,32,57,53,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,70,67,10,70,67, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,52,67,10,69,78,67,79,68,73, 78,71,32,57,53,52,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,52,68,10,69,78,67,79,68,73,78,71,32,57, 53,52,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,52, 69,10,69,78,67,79,68,73,78,71,32,57,53,53,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,52,70,10,69,78, 67,79,68,73,78,71,32,57,53,53,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,51,48,10,51,48,10,51, 48,10,51,48,10,48,48,10,48,48,10,48,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,83,70,52,51,48,48,48,48,10,69,78,67,79,68, 73,78,71,32,57,53,53,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,67,10,48,48,10,70,67,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,83, 70,50,52,48,48,48,48,10,69,78,67,79,68,73,78,71, 32,57,53,53,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,83,70,53,49, 48,48,48,48,10,69,78,67,79,68,73,78,71,32,57,53, 53,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 67,10,50,48,10,51,67,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,83,70,53,50,48,48,48, 48,10,69,78,67,79,68,73,78,71,32,57,53,53,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 67,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,83,70,51,57,48,48,48,48,10,69, 78,67,79,68,73,78,71,32,57,53,53,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,67,10,52,48,10,53, 67,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,83,70,50,50,48,48,48,48,10,69,78,67,79, 68,73,78,71,32,57,53,53,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,48,10,50,48,10,69,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 83,70,50,49,48,48,48,48,10,69,78,67,79,68,73,78, 71,32,57,53,53,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,83,70,50, 53,48,48,48,48,10,69,78,67,79,68,73,78,71,32,57, 53,53,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,48,10,49,48,10,68,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,83,70,53,48,48,48, 48,48,10,69,78,67,79,68,73,78,71,32,57,53,54,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,51,67,10, 50,48,10,51,67,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,83,70,52,57,48,48,48,48,10, 69,78,67,79,68,73,78,71,32,57,53,54,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,55,67,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,83,70,51,56,48,48,48,48,10,69,78,67, 79,68,73,78,71,32,57,53,54,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,53,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,67,10,52,48,10,55,67,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,83,70,50,56,48,48,48,48,10,69,78,67,79,68,73, 78,71,32,57,53,54,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,48,10,50,48,10,69,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,83,70, 50,55,48,48,48,48,10,69,78,67,79,68,73,78,71,32, 57,53,54,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,70,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,83,70,50,54,48, 48,48,48,10,69,78,67,79,68,73,78,71,32,57,53,54, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,68,48, 10,49,48,10,70,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,83,70,51,54,48,48,48,48, 10,69,78,67,79,68,73,78,71,32,57,53,54,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,51,67,10,50,48, 10,51,67,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,83,70,51,55,48,48,48,48,10,69,78, 67,79,68,73,78,71,32,57,53,54,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,67,10,53,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,53,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,83,70,52,50,48,48,48,48,10,69,78,67,79,68, 73,78,71,32,57,53,54,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,53,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,53,67,10,52,48,10,53,67,10,53,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,83, 70,49,57,48,48,48,48,10,69,78,67,79,68,73,78,71, 32,57,53,54,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,69,48,10,50,48,10,69,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,83,70,50,48, 48,48,48,48,10,69,78,67,79,68,73,78,71,32,57,53, 55,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 53,48,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,68,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,83,70,50,51,48,48,48, 48,10,69,78,67,79,68,73,78,71,32,57,53,55,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,53,48,10, 53,48,10,53,48,10,53,48,10,53,48,10,68,48,10,49, 48,10,68,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,83,70,52,55,48,48,48,48,10,69, 78,67,79,68,73,78,71,32,57,53,55,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,67,10,48,48,10,70, 67,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,83,70,52,56,48,48,48,48,10,69,78,67,79, 68,73,78,71,32,57,53,55,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,67,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,53,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 83,70,52,49,48,48,48,48,10,69,78,67,79,68,73,78, 71,32,57,53,55,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,67,10,48,48,10,68,67,10,53,48,10,53, 48,10,53,48,10,53,48,10,53,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,83,70,52, 53,48,48,48,48,10,69,78,67,79,68,73,78,71,32,57, 53,55,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 70,67,10,48,48,10,70,67,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,83,70,52,54,48,48, 48,48,10,69,78,67,79,68,73,78,71,32,57,53,55,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,53,48, 10,53,48,10,53,48,10,53,48,10,53,48,10,53,48,10, 70,67,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,83,70,52,48,48,48,48,48,10, 69,78,67,79,68,73,78,71,32,57,53,55,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,68,67,10,48,48,10, 70,67,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,83,70,53,52,48,48,48,48,10,69,78,67, 79,68,73,78,71,32,57,53,55,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,70,67,10,50,48,10,70,67,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,83,70,53,51,48,48,48,48,10,69,78,67,79,68,73, 78,71,32,57,53,55,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,53,48,10,53,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,70,67,10,53,48,10,53,48,10, 53,48,10,53,48,10,53,48,10,53,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,83,70, 52,52,48,48,48,48,10,69,78,67,79,68,73,78,71,32, 57,53,56,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,53,48,10,53,48,10,53,48,10,53,48,10,53,48, 10,68,67,10,48,48,10,68,67,10,53,48,10,53,48,10, 53,48,10,53,48,10,53,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 54,68,10,69,78,67,79,68,73,78,71,32,57,53,56,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,67,10,49,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,54,69,10,69, 78,67,79,68,73,78,71,32,57,53,56,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,48,10,52, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,54,70,10,69,78,67,79,68, 73,78,71,32,57,53,56,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,52,48,10,56,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,55,48,10,69,78,67,79,68,73,78,71,32, 57,53,56,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,49,48,10,48,67,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 55,49,10,69,78,67,79,68,73,78,71,32,57,53,56,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,52, 10,48,52,10,48,56,10,48,56,10,49,48,10,49,48,10, 50,48,10,50,48,10,50,48,10,52,48,10,52,48,10,56, 48,10,56,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,55,50,10,69, 78,67,79,68,73,78,71,32,57,53,56,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,56,48,10,56,48,10, 52,48,10,52,48,10,50,48,10,50,48,10,49,48,10,49, 48,10,49,48,10,48,56,10,48,56,10,48,52,10,48,52, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,55,51,10,69,78,67,79,68, 73,78,71,32,57,53,56,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,56,52,10,56,52,10,52,56,10,52, 56,10,51,48,10,51,48,10,51,48,10,51,48,10,51,48, 10,52,56,10,52,56,10,56,52,10,56,52,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,55,52,10,69,78,67,79,68,73,78,71,32, 57,53,56,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 55,53,10,69,78,67,79,68,73,78,71,32,57,53,56,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,55,54,10,69, 78,67,79,68,73,78,71,32,57,53,57,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,67,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,55,55,10,69,78,67,79,68, 73,78,71,32,57,53,57,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,55,56,10,69,78,67,79,68,73,78,71,32, 57,53,57,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,48,10,69,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 55,57,10,69,78,67,79,68,73,78,71,32,57,53,57,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,51,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,55,65,10,69, 78,67,79,68,73,78,71,32,57,53,57,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,67,10,51, 67,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,55,66,10,69,78,67,79,68, 73,78,71,32,57,53,57,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,55,67,10,69,78,67,79,68,73,78,71,32, 57,53,57,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,67,10,49,67,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 55,68,10,69,78,67,79,68,73,78,71,32,57,53,57,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 51,48,10,51,48,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,55,69,10,69, 78,67,79,68,73,78,71,32,57,53,57,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,67,10,69, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,55,70,10,69,78,67,79,68, 73,78,71,32,57,53,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,51,48,10,51,48,10,51,48,10,51, 48,10,51,48,10,51,48,10,51,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 112,98,108,111,99,107,10,69,78,67,79,68,73,78,71,32, 57,54,48,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,70,67,10,70,67,10,70,67,10,70,67,10,70,67, 10,70,67,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 56,49,10,69,78,67,79,68,73,78,71,32,57,54,48,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 67,10,70,67,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,56,50,10,69, 78,67,79,68,73,78,71,32,57,54,48,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,67,10,70,67,10,70,67, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,56,51,10,69,78,67,79,68, 73,78,71,32,57,54,48,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,67, 10,70,67,10,70,67,10,70,67,10,70,67,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,100, 110,98,108,111,99,107,10,69,78,67,79,68,73,78,71,32, 57,54,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,67,10,70,67,10,70,67,10,70,67,10, 70,67,10,70,67,10,70,67,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 56,53,10,69,78,67,79,68,73,78,71,32,57,54,48,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,67,10, 70,67,10,70,67,10,70,67,10,70,67,10,70,67,10,70, 67,10,70,67,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,56,54,10,69, 78,67,79,68,73,78,71,32,57,54,48,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,70,67,10,70,67,10,70,67,10,70,67,10,70, 67,10,70,67,10,70,67,10,70,67,10,70,67,10,70,67, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,56,55,10,69,78,67,79,68, 73,78,71,32,57,54,48,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,67,10,70, 67,10,70,67,10,70,67,10,70,67,10,70,67,10,70,67, 10,70,67,10,70,67,10,70,67,10,70,67,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,98, 108,111,99,107,10,69,78,67,79,68,73,78,71,32,57,54, 48,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 70,67,10,70,67,10,70,67,10,70,67,10,70,67,10,70, 67,10,70,67,10,70,67,10,70,67,10,70,67,10,70,67, 10,70,67,10,70,67,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,56,57, 10,69,78,67,79,68,73,78,71,32,57,54,48,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,70,56,10,70, 56,10,70,56,10,70,56,10,70,56,10,70,56,10,70,56, 10,70,56,10,70,56,10,70,56,10,70,56,10,70,56,10, 70,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,56,65,10,69,78,67, 79,68,73,78,71,32,57,54,49,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,70,48,10,70,48,10,70,48, 10,70,48,10,70,48,10,70,48,10,70,48,10,70,48,10, 70,48,10,70,48,10,70,48,10,70,48,10,70,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,56,66,10,69,78,67,79,68,73,78, 71,32,57,54,49,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,70,48,10,70,48,10,70,48,10,70,48,10, 70,48,10,70,48,10,70,48,10,70,48,10,70,48,10,70, 48,10,70,48,10,70,48,10,70,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,108,102,98, 108,111,99,107,10,69,78,67,79,68,73,78,71,32,57,54, 49,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 69,48,10,69,48,10,69,48,10,69,48,10,69,48,10,69, 48,10,69,48,10,69,48,10,69,48,10,69,48,10,69,48, 10,69,48,10,69,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,56,68, 10,69,78,67,79,68,73,78,71,32,57,54,49,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,67,48,10,67, 48,10,67,48,10,67,48,10,67,48,10,67,48,10,67,48, 10,67,48,10,67,48,10,67,48,10,67,48,10,67,48,10, 67,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,56,69,10,69,78,67, 79,68,73,78,71,32,57,54,49,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,67,48,10,67,48,10,67,48, 10,67,48,10,67,48,10,67,48,10,67,48,10,67,48,10, 67,48,10,67,48,10,67,48,10,67,48,10,67,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,56,70,10,69,78,67,79,68,73,78, 71,32,57,54,49,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,56,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,56,48,10,56,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,114,116,98, 108,111,99,107,10,69,78,67,79,68,73,78,71,32,57,54, 49,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 49,67,10,49,67,10,49,67,10,49,67,10,49,67,10,49, 67,10,49,67,10,49,67,10,49,67,10,49,67,10,49,67, 10,49,67,10,49,67,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,108,116,115,104,97,100,101, 10,69,78,67,79,68,73,78,71,32,57,54,49,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,65,56,10,48, 48,10,53,52,10,48,48,10,65,56,10,48,48,10,53,52, 10,48,48,10,65,56,10,48,48,10,53,52,10,48,48,10, 65,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,115,104,97,100,101,10,69,78,67,79,68, 73,78,71,32,57,54,49,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,65,56,10,53,52,10,65,56,10,53, 52,10,65,56,10,53,52,10,65,56,10,53,52,10,65,56, 10,53,52,10,65,56,10,53,52,10,65,56,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,100, 107,115,104,97,100,101,10,69,78,67,79,68,73,78,71,32, 57,54,49,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,53,52,10,70,67,10,65,56,10,70,67,10,53,52, 10,70,67,10,65,56,10,70,67,10,53,52,10,70,67,10, 65,56,10,70,67,10,53,52,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 57,52,10,69,78,67,79,68,73,78,71,32,57,54,50,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,70,67, 10,70,67,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,57,53,10,69, 78,67,79,68,73,78,71,32,57,54,50,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,52,10,48,52,10, 48,52,10,48,52,10,48,52,10,48,52,10,48,52,10,48, 52,10,48,52,10,48,52,10,48,52,10,48,52,10,48,52, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,57,54,10,69,78,67,79,68, 73,78,71,32,57,54,50,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,48,10,69,48,10,69,48, 10,69,48,10,69,48,10,69,48,10,69,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,57,55,10,69,78,67,79,68,73,78,71,32, 57,54,50,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,67,10,49,67,10,49,67,10,49,67,10, 49,67,10,49,67,10,49,67,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 57,56,10,69,78,67,79,68,73,78,71,32,57,54,50,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,69,48, 10,69,48,10,69,48,10,69,48,10,69,48,10,69,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,57,57,10,69, 78,67,79,68,73,78,71,32,57,54,50,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,69,48,10,69,48,10, 69,48,10,69,48,10,69,48,10,69,48,10,70,67,10,70, 67,10,70,67,10,70,67,10,70,67,10,70,67,10,70,67, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,57,65,10,69,78,67,79,68, 73,78,71,32,57,54,50,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,69,48,10,69,48,10,69,48,10,69, 48,10,69,48,10,69,48,10,49,67,10,49,67,10,49,67, 10,49,67,10,49,67,10,49,67,10,49,67,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,57,66,10,69,78,67,79,68,73,78,71,32, 57,54,50,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,70,67,10,70,67,10,70,67,10,70,67,10,70,67, 10,70,67,10,69,48,10,69,48,10,69,48,10,69,48,10, 69,48,10,69,48,10,69,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 57,67,10,69,78,67,79,68,73,78,71,32,57,54,50,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,70,67, 10,70,67,10,70,67,10,70,67,10,70,67,10,70,67,10, 49,67,10,49,67,10,49,67,10,49,67,10,49,67,10,49, 67,10,49,67,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,57,68,10,69, 78,67,79,68,73,78,71,32,57,54,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,49,67,10,49,67,10, 49,67,10,49,67,10,49,67,10,49,67,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,57,69,10,69,78,67,79,68, 73,78,71,32,57,54,51,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,49,67,10,49,67,10,49,67,10,49, 67,10,49,67,10,49,67,10,69,48,10,69,48,10,69,48, 10,69,48,10,69,48,10,69,48,10,69,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,57,70,10,69,78,67,79,68,73,78,71,32, 57,54,51,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,49,67,10,49,67,10,49,67,10,49,67,10,49,67, 10,49,67,10,70,67,10,70,67,10,70,67,10,70,67,10, 70,67,10,70,67,10,70,67,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,102,105,108,108,101, 100,98,111,120,10,69,78,67,79,68,73,78,71,32,57,54, 51,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,70,56,10,70,56,10,70,56,10,70,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,72,50,50,48,55,51,10, 69,78,67,79,68,73,78,71,32,57,54,51,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,56,56,10, 56,56,10,56,56,10,70,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,65,50,10,69,78,67,79, 68,73,78,71,32,57,54,51,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,48,10,56,56,10,56,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,53,65,51,10,69,78,67,79,68,73,78,71, 32,57,54,51,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,56,56,10,65,56,10,56,56,10,70,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 53,65,52,10,69,78,67,79,68,73,78,71,32,57,54,51, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,56,56,10,70,56,10,56,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,53,65,53,10, 69,78,67,79,68,73,78,71,32,57,54,51,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 65,56,10,65,56,10,65,56,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,65,54,10,69,78,67,79, 68,73,78,71,32,57,54,51,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,65,56,10,70, 56,10,65,56,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,53,65,55,10,69,78,67,79,68,73,78,71, 32,57,54,51,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,67,56,10,65,56,10,57,56, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 53,65,56,10,69,78,67,79,68,73,78,71,32,57,54,52, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,57,56,10,65,56,10,67,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,53,65,57,10, 69,78,67,79,68,73,78,71,32,57,54,52,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 68,56,10,65,56,10,68,56,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,72,49,56,53,52,51,10,69,78,67,79,68, 73,78,71,32,57,54,52,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,55,48,10,55,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,72, 49,56,53,53,49,10,69,78,67,79,68,73,78,71,32,57, 54,52,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,53,48,10,55,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,102,105,108,108,101,100, 114,101,99,116,10,69,78,67,79,68,73,78,71,32,57,54, 52,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,67,10,70, 67,10,70,67,10,70,67,10,70,67,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,65,68, 10,69,78,67,79,68,73,78,71,32,57,54,52,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,67,10,56,52,10,56,52, 10,56,52,10,70,67,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,65,69,10,69,78,67, 79,68,73,78,71,32,57,54,52,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,55,56,10,55,56, 10,55,56,10,55,56,10,55,56,10,55,56,10,55,56,10, 55,56,10,55,56,10,55,56,10,55,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,65,70,10,69,78,67,79,68,73,78, 71,32,57,54,52,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,56,10,52,56,10,52,56,10, 52,56,10,52,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,52,56,10,55,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,66,48,10,69,78,67,79,68,73,78,71,32,57,54, 52,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 67,10,55,56,10,70,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,66,49, 10,69,78,67,79,68,73,78,71,32,57,54,52,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,51,67,10,52,56, 10,70,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,116,114,105,97,103,117,112,10,69,78,67, 79,68,73,78,71,32,57,54,53,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,55,48,10,55,48,10,55,48,10, 70,56,10,70,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,66,51,10,69,78,67,79,68,73,78, 71,32,57,54,53,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,53,48,10,53,48,10,53,48,10,56,56,10,56, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,66,52,10,69,78,67,79,68,73,78,71,32,57,54, 53,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,50, 48,10,55,48,10,55,48,10,70,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,66,53, 10,69,78,67,79,68,73,78,71,32,57,54,53,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,53,48, 10,53,48,10,70,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,66,54,10,69,78,67, 79,68,73,78,71,32,57,54,53,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,56,48, 10,67,48,10,69,48,10,70,48,10,70,56,10,70,48,10, 69,48,10,67,48,10,56,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,66,55,10,69,78,67,79,68,73,78, 71,32,57,54,53,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,56,48,10,67,48,10, 65,48,10,57,48,10,56,56,10,57,48,10,65,48,10,67, 48,10,56,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,66,56,10,69,78,67,79,68,73,78,71,32,57,54, 53,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,52,48,10,54, 48,10,55,48,10,54,48,10,52,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,66,57, 10,69,78,67,79,68,73,78,71,32,57,54,53,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,52,48,10,54,48,10,53,48, 10,54,48,10,52,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,116,114,105,97,103,114,116,10,69,78,67, 79,68,73,78,71,32,57,54,53,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,67,48,10,70,48,10,70,67,10,70,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,66,66,10,69,78,67,79,68,73,78, 71,32,57,54,53,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 67,48,10,66,48,10,56,67,10,66,48,10,67,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,116,114,105, 97,103,100,110,10,69,78,67,79,68,73,78,71,32,57,54, 54,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,56,10,70,56,10,70,56,10,55, 48,10,55,48,10,55,48,10,50,48,10,50,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,66,68, 10,69,78,67,79,68,73,78,71,32,57,54,54,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,56,56,10,56,56,10,53,48,10,53,48, 10,53,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,66,69,10,69,78,67, 79,68,73,78,71,32,57,54,54,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,56,10,55,48,10,55,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,66,70,10,69,78,67,79,68,73,78, 71,32,57,54,54,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,53,48,10,53,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,67,48,10,69,78,67,79,68,73,78,71,32,57,54, 54,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,56,10,49,56,10,51,56,10,55, 56,10,70,56,10,55,56,10,51,56,10,49,56,10,48,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,67,49, 10,69,78,67,79,68,73,78,71,32,57,54,54,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,56,10,49,56,10,50,56,10,52,56,10,56,56, 10,52,56,10,50,56,10,49,56,10,48,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,67,50,10,69,78,67, 79,68,73,78,71,32,57,54,54,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,48,10,51,48,10,55,48,10,51,48,10, 49,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,67,51,10,69,78,67,79,68,73,78, 71,32,57,54,54,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 49,48,10,51,48,10,53,48,10,51,48,10,49,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,116,114,105, 97,103,108,102,10,69,78,67,79,68,73,78,71,32,57,54, 54,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,67,10,51, 67,10,70,67,10,51,67,10,48,67,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,67,53, 10,69,78,67,79,68,73,78,71,32,57,54,54,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,67,10,51,52,10,67,52, 10,51,52,10,48,67,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,53,67,54,10,69,78,67, 79,68,73,78,71,32,57,54,55,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,48,10,55,48,10,70,56,10,55,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,53,67,55,10,69,78,67,79,68,73,78, 71,32,57,54,55,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,53,48,10,56,56,10,53,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,53,67,56,10,69,78,67,79,68,73,78,71,32,57,54, 55,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,53, 48,10,65,56,10,53,48,10,50,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,53,67,57, 10,69,78,67,79,68,73,78,71,32,57,54,55,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,51,48,10,52,56,10,66,52, 10,66,52,10,52,56,10,51,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,108,111,122,101,110,103,101,10,69,78,67, 79,68,73,78,71,32,57,54,55,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,50,48, 10,50,48,10,53,48,10,53,48,10,56,56,10,53,48,10, 53,48,10,50,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,99,105,114,99,108,101,10,69,78,67,79,68,73,78,71, 32,57,54,55,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 48,10,52,56,10,56,52,10,56,52,10,52,56,10,51,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 53,67,67,10,69,78,67,79,68,73,78,71,32,57,54,55, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,48,56, 10,56,48,10,48,52,10,52,48,10,49,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,53,67,68,10, 69,78,67,79,68,73,78,71,32,57,54,55,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,55,48,10, 65,56,10,65,56,10,65,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,53,67,69,10,69,78,67,79, 68,73,78,71,32,57,54,55,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,56,56,10,65,56,10,68,56,10,65, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 72,49,56,53,51,51,10,69,78,67,79,68,73,78,71,32, 57,54,55,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,51,48, 10,55,56,10,70,67,10,70,67,10,55,56,10,51,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 68,48,10,69,78,67,79,68,73,78,71,32,57,54,56,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,51,48,10,54,56,10, 69,52,10,69,52,10,54,56,10,51,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,68,49,10,69, 78,67,79,68,73,78,71,32,57,54,56,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,51,48,10,53,56,10,57,67,10,57, 67,10,53,56,10,51,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,68,50,10,69,78,67,79,68, 73,78,71,32,57,54,56,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,51,48,10,52,56,10,56,52,10,70,67,10,55,56, 10,51,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,68,51,10,69,78,67,79,68,73,78,71,32, 57,54,56,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,51,48, 10,55,56,10,70,67,10,56,52,10,52,56,10,51,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 68,52,10,69,78,67,79,68,73,78,71,32,57,54,56,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,51,48,10,53,56,10, 57,67,10,56,52,10,52,56,10,51,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,68,53,10,69, 78,67,79,68,73,78,71,32,57,54,56,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,51,48,10,53,56,10,57,67,10,70, 67,10,55,56,10,51,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,68,54,10,69,78,67,79,68, 73,78,71,32,57,54,56,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,52,10,49,67,10,51, 67,10,51,67,10,55,67,10,55,67,10,51,67,10,51,67, 10,49,67,10,48,52,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,68,55,10,69,78,67,79,68,73,78,71,32, 57,54,56,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,56,48,10,69,48,10,70,48,10,70,48, 10,70,56,10,70,56,10,70,48,10,70,48,10,69,48,10, 56,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,105,110,118,98,117, 108,108,101,116,10,69,78,67,79,68,73,78,71,32,57,54, 56,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 70,67,10,70,67,10,70,67,10,70,67,10,70,67,10,67, 67,10,56,52,10,56,52,10,67,67,10,70,67,10,70,67, 10,70,67,10,70,67,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,105,110,118,99,105,114,99, 108,101,10,69,78,67,79,68,73,78,71,32,57,54,56,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,70,67, 10,70,67,10,70,67,10,70,67,10,67,67,10,66,52,10, 55,56,10,55,56,10,66,52,10,67,67,10,70,67,10,70, 67,10,70,67,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,68,65,10,69, 78,67,79,68,73,78,71,32,57,54,57,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,70,67,10,70,67,10, 70,67,10,70,67,10,67,67,10,66,52,10,55,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,68,66,10,69,78,67,79,68, 73,78,71,32,57,54,57,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,56,10,66,52, 10,67,67,10,70,67,10,70,67,10,70,67,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,68,67,10,69,78,67,79,68,73,78,71,32, 57,54,57,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,52,48,10,56,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 68,68,10,69,78,67,79,68,73,78,71,32,57,54,57,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,48,10,48,56,10, 48,52,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,68,69,10,69, 78,67,79,68,73,78,71,32,57,54,57,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 52,10,48,56,10,49,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,68,70,10,69,78,67,79,68, 73,78,71,32,57,54,57,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,48,10,52,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,69,48,10,69,78,67,79,68,73,78,71,32, 57,54,57,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,51,48, 10,52,56,10,56,52,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 69,49,10,69,78,67,79,68,73,78,71,32,57,54,57,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,56,52,10,52,56,10,51,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,53,69,50,10,69, 78,67,79,68,73,78,71,32,57,54,57,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,49,56,10,51, 56,10,55,56,10,70,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,53,69,51,10,69,78,67,79,68, 73,78,71,32,57,54,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,56,48,10,67,48,10,69,48,10,70,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,53,69,52,10,69,78,67,79,68,73,78,71,32, 57,55,48,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,70,48,10,69,48,10,67,48,10,56,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,53, 69,53,10,69,78,67,79,68,73,78,71,32,57,55,48,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 55,56,10,51,56,10,49,56,10,48,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,111,112,101,110,98,117,108,108,101, 116,10,69,78,67,79,68,73,78,71,32,57,55,48,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,69,55,10,69,78, 67,79,68,73,78,71,32,57,55,48,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,69,56,10,69,56, 10,69,56,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,69,56,10,69,78,67,79,68,73, 78,71,32,57,55,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,66,56,10,66,56,10,66,56,10, 70,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,69,57,10,69,78,67,79,68,73,78,71,32,57, 55,48,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,70,56,10,69,56,10,67,56,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,69, 65,10,69,78,67,79,68,73,78,71,32,57,55,48,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,56,10,57, 56,10,66,56,10,70,56,10,70,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,69,66,10,69,78, 67,79,68,73,78,71,32,57,55,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,65,56,10,65,56, 10,65,56,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,69,67,10,69,78,67,79,68,73, 78,71,32,57,55,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,50,48,10,53,48,10,53,48,10,55,48,10,65,56,10, 56,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,69,68,10,69,78,67,79,68,73,78,71,32,57, 55,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 55,48,10,55,48,10,55,48,10,69,56,10,69,56,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,69, 69,10,69,78,67,79,68,73,78,71,32,57,55,49,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,50,48,10,50,48,10,55,48,10,55, 48,10,55,48,10,66,56,10,66,56,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,69,70,10,69,78, 67,79,68,73,78,71,32,57,55,49,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,51,48,10,52,56,10,56,52,10,56,52, 10,56,52,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,70,48,10,69,78,67,79,68,73, 78,71,32,57,55,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,65,56,10,69,56,10,56,56,10, 70,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,70,49,10,69,78,67,79,68,73,78,71,32,57, 55,49,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,56,56,10,69,56,10,65,56,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,70, 50,10,69,78,67,79,68,73,78,71,32,57,55,49,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,56,10,56, 56,10,66,56,10,65,56,10,70,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,70,51,10,69,78, 67,79,68,73,78,71,32,57,55,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,65,56,10,66,56, 10,56,56,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,70,52,10,69,78,67,79,68,73, 78,71,32,57,55,49,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,65,56,10,69,56,10,56,56,10, 55,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,70,53,10,69,78,67,79,68,73,78,71,32,57, 55,49,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,69,56,10,65,56,10,55,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,70, 54,10,69,78,67,79,68,73,78,71,32,57,55,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,66,56,10,65,56,10,55,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,70,55,10,69,78, 67,79,68,73,78,71,32,57,55,49,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,65,56,10,66,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,70,56,10,69,78,67,79,68,73, 78,71,32,57,55,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,57,48,10,65,48,10,67,48,10, 56,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,70,57,10,69,78,67,79,68,73,78,71,32,57, 55,50,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,52,56,10,50,56,10,49,56,10,48,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,70, 65,10,69,78,67,79,68,73,78,71,32,57,55,50,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,48,10,67, 48,10,65,48,10,57,48,10,70,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,70,66,10,69,78, 67,79,68,73,78,71,32,57,55,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,56,10,52,56,10,52,56, 10,55,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,53,70,67,10,69,78,67,79,68,73, 78,71,32,57,55,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,55,56,10,55,56,10,55,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,53,70,68,10,69,78,67,79,68,73,78,71,32,57, 55,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,56,10,52,56,10,52,56,10,55,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,53,70, 69,10,69,78,67,79,68,73,78,71,32,57,55,50,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,56,10,55, 56,10,55,56,10,55,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,53,70,70,10,69,78, 67,79,68,73,78,71,32,57,55,50,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,56,10,49,56,10,50,56, 10,52,56,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,48,48,10,69,78,67,79,68,73, 78,71,32,57,55,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,56,56,10,50,48,10,55,48,10,50,48,10,56,56,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,48,49,10,69,78,67,79,68,73,78,71,32,57, 55,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 54,48,10,70,56,10,70,67,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,48, 50,10,69,78,67,79,68,73,78,71,32,57,55,51,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,55,48,10,70,56,10,70,56,10,50, 48,10,50,48,10,50,48,10,50,48,10,52,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,48,51,10,69,78, 67,79,68,73,78,71,32,57,55,51,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,65,48,10,50,48,10,55, 52,10,53,48,10,65,56,10,53,48,10,53,52,10,55,48, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,48,52,10,69,78,67,79,68,73, 78,71,32,57,55,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,56,10,52,56,10,53,48, 10,53,52,10,52,52,10,48,56,10,54,48,10,57,48,10, 57,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,48,53,10,69,78,67,79,68,73,78,71,32,57, 55,51,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 70,56,10,55,48,10,55,48,10,56,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,48, 54,10,69,78,67,79,68,73,78,71,32,57,55,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,50,48,10,70,56,10,53, 48,10,55,48,10,56,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,48,55,10,69,78, 67,79,68,73,78,71,32,57,55,51,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 56,10,49,48,10,50,48,10,52,48,10,56,48,10,52,48, 10,50,56,10,49,56,10,51,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,48,56,10,69,78,67,79,68,73, 78,71,32,57,55,51,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,56,10,56,56, 10,57,48,10,57,48,10,65,48,10,65,48,10,57,56,10, 57,56,10,66,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,48,57,10,69,78,67,79,68,73,78,71,32,57, 55,51,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 55,48,10,56,56,10,65,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,48, 65,10,69,78,67,79,68,73,78,71,32,57,55,51,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,53,48,10,53,48,10,65,56,10,53,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,48,66,10,69,78, 67,79,68,73,78,71,32,57,55,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,53,48,10,65,56,10,53,48,10,53,48, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,48,67,10,69,78,67,79,68,73, 78,71,32,57,55,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,56,10,55,48,10,57,48,10, 57,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,48,68,10,69,78,67,79,68,73,78,71,32,57, 55,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,51,48,10,52,56,10,52,56,10, 51,48,10,50,48,10,54,48,10,57,48,10,57,48,10,54, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,48, 69,10,69,78,67,79,68,73,78,71,32,57,55,52,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,70,56,10,65, 56,10,55,48,10,70,56,10,70,56,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,48,70,10,69,78, 67,79,68,73,78,71,32,57,55,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,65,56,10,65,56,10,55,48, 10,56,56,10,56,56,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,49,48,10,69,78,67,79,68,73, 78,71,32,57,55,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,67,10,56,52, 10,56,52,10,56,52,10,56,52,10,56,52,10,56,52,10, 56,52,10,70,67,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,49,49,10,69,78,67,79,68,73,78,71,32,57, 55,52,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,70,67,10,56,52,10,56,67,10, 56,67,10,57,52,10,57,52,10,68,52,10,65,52,10,70, 67,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,49, 50,10,69,78,67,79,68,73,78,71,32,57,55,52,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,67,10,67,67,10,67,67,10,66,52,10,66, 52,10,66,52,10,67,67,10,67,67,10,70,67,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,49,51,10,69,78, 67,79,68,73,78,71,32,57,55,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,56, 56,10,56,56,10,53,48,10,53,48,10,50,48,10,53,48, 10,53,48,10,56,56,10,56,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,49,54,10,69,78,67,79,68,73, 78,71,32,57,55,53,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,53,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,49,55,10,69,78,67,79,68,73,78,71,32,57, 55,53,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,55,48,10,70,56,10, 70,56,10,70,56,10,70,56,10,70,56,10,70,56,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,49, 57,10,69,78,67,79,68,73,78,71,32,57,55,53,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,56,10,50,52,10,55,52,10,70, 56,10,69,56,10,70,52,10,55,52,10,50,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,49,65,10,69,78, 67,79,68,73,78,71,32,57,55,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,67,10,55,67, 10,55,67,10,51,67,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,49,66,10,69,78,67,79,68,73, 78,71,32,57,55,53,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,67,10,70,56,10,70,56,10, 70,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,49,67,10,69,78,67,79,68,73,78,71,32,57, 55,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,67,10,52,67,10,52,67,10,51,67,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,49, 68,10,69,78,67,79,68,73,78,71,32,57,55,53,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,48,56,10,49,56,10,55,56,10,54, 56,10,52,56,10,52,56,10,55,56,10,55,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,49,69,10,69,78, 67,79,68,73,78,71,32,57,55,53,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,67,10,67,56, 10,67,56,10,70,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,49,70,10,69,78,67,79,68,73, 78,71,32,57,55,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,56,10,55,56, 10,52,56,10,52,56,10,54,56,10,55,56,10,49,56,10, 48,56,10,48,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,50,48,10,69,78,67,79,68,73,78,71,32,57, 55,54,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,65,56,10,70,56,10, 53,48,10,55,48,10,50,48,10,56,56,10,55,48,10,56, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,50, 49,10,69,78,67,79,68,73,78,71,32,57,55,54,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,48,10,48,56,10,48,56,10,49,48,10,50, 48,10,52,48,10,56,48,10,56,48,10,55,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,50,50,10,69,78, 67,79,68,73,78,71,32,57,55,54,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,68,56,10,68,56,10,65,56, 10,65,56,10,55,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,50,51,10,69,78,67,79,68,73, 78,71,32,57,55,54,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,53,48,10,65,56,10,53,48,10,53,48,10,50,48,10, 55,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,50,52,10,69,78,67,79,68,73,78,71,32,57, 55,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,53,48,10,70,56,10, 53,48,10,55,48,10,53,48,10,55,48,10,53,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,50, 53,10,69,78,67,79,68,73,78,71,32,57,55,54,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,53,48,10,53,48,10,50,48,10,70, 56,10,50,48,10,50,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,50,54,10,69,78, 67,79,68,73,78,71,32,57,55,54,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,55,48,10,50,48,10,70,56,10,50,48,10,54,48, 10,51,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,50,55,10,69,78,67,79,68,73, 78,71,32,57,55,54,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,51,48,10,50,56, 10,50,56,10,51,48,10,65,56,10,55,48,10,50,48,10, 55,48,10,65,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,50,56,10,69,78,67,79,68,73,78,71,32,57, 55,54,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,55,48,10,50,48,10, 70,56,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,50, 57,10,69,78,67,79,68,73,78,71,32,57,55,54,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,55,48,10,50,48,10,65,56,10,70, 56,10,65,56,10,50,48,10,55,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,50,65,10,69,78, 67,79,68,73,78,71,32,57,55,55,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 56,10,69,52,10,67,56,10,68,67,10,67,56,10,68,52, 10,67,48,10,69,52,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,50,66,10,69,78,67,79,68,73, 78,71,32,57,55,55,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,65,56,10,53,48,10,48,48,10,50,48, 10,65,56,10,65,56,10,65,56,10,65,56,10,65,56,10, 55,48,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,50,67,10,69,78,67,79,68,73,78,71,32,57, 55,55,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,55,48,10,65,56,10, 70,56,10,65,56,10,70,56,10,65,56,10,55,48,10,65, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,50, 68,10,69,78,67,79,68,73,78,71,32,57,55,55,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,50,56,10,54,56,10,67, 56,10,65,56,10,49,56,10,52,56,10,66,52,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,50,69,10,69,78, 67,79,68,73,78,71,32,57,55,55,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,65,56,10,65,56,10,65,56,10,65,56,10,70,56, 10,65,56,10,65,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,50,70,10,69,78,67,79,68,73, 78,71,32,57,55,55,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,56,10,56,52,10,69,67,10,65,52,10, 70,67,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,51,48,10,69,78,67,79,68,73,78,71,32,57, 55,55,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,70,56,10, 48,48,10,70,56,10,70,56,10,48,48,10,70,56,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,51, 49,10,69,78,67,79,68,73,78,71,32,57,55,55,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,68,56,10,68,56,10,48,48,10,70, 56,10,70,56,10,48,48,10,70,56,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,51,50,10,69,78, 67,79,68,73,78,71,32,57,55,55,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,70,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,70,56,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,51,51,10,69,78,67,79,68,73, 78,71,32,57,55,55,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,68,56,10,68,56,10,48,48,10, 70,56,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,51,52,10,69,78,67,79,68,73,78,71,32,57, 55,56,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,70,56,10, 48,48,10,70,56,10,70,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,51, 53,10,69,78,67,79,68,73,78,71,32,57,55,56,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,68,56,10,68,56,10,48,48,10,70, 56,10,70,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,51,54,10,69,78, 67,79,68,73,78,71,32,57,55,56,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,70,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,68,56,10,68,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,51,55,10,69,78,67,79,68,73, 78,71,32,57,55,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,68,56,10,68,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,54,51,56,10,69,78,67,79,68,73,78,71,32,57, 55,56,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 65,56,10,55,48,10,68,56,10,55,48,10,65,56,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,51, 57,10,69,78,67,79,68,73,78,71,32,57,55,56,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,56,10,56,52,10,67,67,10,56,52,10,66, 52,10,56,52,10,66,52,10,67,67,10,56,52,10,55,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,115,109,105,108,101,102,97,99,101,10, 69,78,67,79,68,73,78,71,32,57,55,56,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,56,10,56,52,10,67,67,10,56,52,10,66,52,10, 56,52,10,67,67,10,66,52,10,56,52,10,55,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,105,110,118,115,109,105,108,101,102,97,99,101, 10,69,78,67,79,68,73,78,71,32,57,55,56,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,56,10,70,67,10,66,52,10,70,67,10,67,67, 10,70,67,10,66,52,10,67,67,10,55,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,115,117,110,10,69,78,67,79,68,73,78, 71,32,57,55,56,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,48,10,50,48,10, 56,56,10,50,48,10,53,48,10,50,48,10,56,56,10,50, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,51,68,10,69,78,67,79,68,73,78,71,32,57,55, 56,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,48,10,67,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,50,56,10,67,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,51,69, 10,69,78,67,79,68,73,78,71,32,57,55,57,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,57,56,10,65,48,10,65,48,10,65,48, 10,65,48,10,65,48,10,57,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,51,70,10,69,78,67, 79,68,73,78,71,32,57,55,57,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,56,56, 10,55,48,10,56,56,10,56,56,10,56,56,10,55,48,10, 50,48,10,55,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,102,101,109,97,108,101,10,69,78,67,79,68,73,78,71, 32,57,55,57,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,55,48,10,56, 56,10,56,56,10,56,56,10,55,48,10,50,48,10,55,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 54,52,49,10,69,78,67,79,68,73,78,71,32,57,55,57, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,55,48,10,50,48, 10,55,48,10,56,56,10,56,56,10,56,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,109,97,108,101,10,69,78,67, 79,68,73,78,71,32,57,55,57,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,67,10,48,67,10,55,52,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,52,51,10,69,78,67,79,68,73,78, 71,32,57,55,57,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,56,10,52,56,10, 65,56,10,50,56,10,50,56,10,52,56,10,70,56,10,48, 56,10,48,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,52,52,10,69,78,67,79,68,73,78,71,32,57,55, 57,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,52,48,10,69,48,10,52,48,10,53, 48,10,54,56,10,52,56,10,52,56,10,53,48,10,53,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,52,53, 10,69,78,67,79,68,73,78,71,32,57,55,57,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,56,56,10,65,56,10,65,56,10,70,56,10,65,56, 10,65,56,10,65,56,10,50,48,10,53,48,10,50,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,52,54,10,69,78,67, 79,68,73,78,71,32,57,55,57,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,65,56, 10,70,67,10,65,56,10,65,56,10,65,56,10,55,48,10, 50,48,10,55,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,52,55,10,69,78,67,79,68,73,78, 71,32,57,55,57,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,48,10,56,56,10, 56,56,10,56,56,10,70,48,10,56,48,10,56,48,10,56, 48,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,52,56,10,69,78,67,79,68,73,78,71,32,57,56, 48,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,53,48,10,65,56,10,65,56,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,52,57, 10,69,78,67,79,68,73,78,71,32,57,56,48,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,56,56, 10,53,48,10,50,48,10,53,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,52,65,10,69,78,67, 79,68,73,78,71,32,57,56,48,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,56,10,53,48,10,53,48,10, 53,48,10,53,48,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,52,66,10,69,78,67,79,68,73,78, 71,32,57,56,48,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,51,48,10, 52,56,10,65,48,10,52,48,10,49,48,10,50,56,10,57, 48,10,54,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,52,67,10,69,78,67,79,68,73,78,71,32,57,56, 48,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,52,56,10,50,56,10,54,56,10,65,56,10,52,56, 10,48,52,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,52,68, 10,69,78,67,79,68,73,78,71,32,57,56,48,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,65,67,10,70,67,10,65,67,10,65,67,10,65,67, 10,65,67,10,65,56,10,65,56,10,65,56,10,49,56,10, 50,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,52,69,10,69,78,67, 79,68,73,78,71,32,57,56,48,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,55,48,10,56,56,10,53,48,10,53,48,10, 68,56,10,48,48,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,52,70,10,69,78,67,79,68,73,78, 71,32,57,56,48,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,65,56,10,70,56,10, 65,56,10,65,56,10,65,56,10,65,56,10,65,56,10,65, 56,10,65,56,10,48,67,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,53,48,10,69,78,67,79,68,73,78,71,32,57,56, 48,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,51, 56,10,49,56,10,65,56,10,52,48,10,65,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,53,49, 10,69,78,67,79,68,73,78,71,32,57,56,48,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,56,48,10,57,48,10,65,56,10,66,48, 10,67,56,10,56,56,10,48,56,10,51,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,53,50,10,69,78,67, 79,68,73,78,71,32,57,56,49,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,53,52,10,65,56,10,48,48,10, 48,48,10,53,52,10,65,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,53,51,10,69,78,67,79,68,73,78, 71,32,57,56,49,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,56,56,10,53,48,10, 53,48,10,53,48,10,70,56,10,53,48,10,53,48,10,53, 48,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,53,52,10,69,78,67,79,68,73,78,71,32,57,56, 49,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 50,48,10,55,48,10,55,48,10,65,56,10,70,56,10,56, 56,10,53,48,10,53,48,10,70,56,10,56,56,10,70,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,53,53, 10,69,78,67,79,68,73,78,71,32,57,56,49,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,65, 56,10,70,56,10,56,56,10,70,56,10,53,48,10,53,48, 10,56,56,10,70,56,10,56,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,53,54,10,69,78,67, 79,68,73,78,71,32,57,56,49,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,65,56,10,70,56,10,56,56,10,53,48,10,53,48,10, 53,48,10,56,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,53,55,10,69,78,67,79,68,73,78, 71,32,57,56,49,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,50,48,10,53,48,10,55,48,10, 68,56,10,56,56,10,53,48,10,53,48,10,55,48,10,56, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,53,56,10,69,78,67,79,68,73,78,71,32,57,56, 49,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,49,48,10,51,56,10,54,56,10,56, 56,10,69,56,10,50,56,10,51,56,10,52,56,10,55,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,53,57, 10,69,78,67,79,68,73,78,71,32,57,56,49,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,50,48,10,53,48,10,50,48,10,53,48, 10,53,48,10,55,48,10,56,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,53,65,10,69,78,67, 79,68,73,78,71,32,57,56,49,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,50,48,10,55,48,10,55,48, 10,65,56,10,70,56,10,70,56,10,55,48,10,55,48,10, 70,56,10,70,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,53,66,10,69,78,67,79,68,73,78, 71,32,57,56,49,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,65,56,10,70,56,10,70,56,10, 70,56,10,55,48,10,55,48,10,70,56,10,70,56,10,70, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,53,67,10,69,78,67,79,68,73,78,71,32,57,56, 50,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,65,56,10,70,56,10,70, 56,10,55,48,10,55,48,10,55,48,10,70,56,10,70,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,53,68, 10,69,78,67,79,68,73,78,71,32,57,56,50,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,50, 48,10,55,48,10,55,48,10,68,56,10,56,56,10,53,48, 10,53,48,10,55,48,10,70,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,53,69,10,69,78,67, 79,68,73,78,71,32,57,56,50,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,51,56,10,53,56,10,70,56,10,70,56,10,51,56,10, 51,56,10,55,56,10,55,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,53,70,10,69,78,67,79,68,73,78, 71,32,57,56,50,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,50,48,10, 55,48,10,50,48,10,55,48,10,55,48,10,55,48,10,70, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,115,112,97, 100,101,10,69,78,67,79,68,73,78,71,32,57,56,50,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,50,48,10,50,48,10,55,48,10, 55,48,10,70,56,10,70,56,10,50,48,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,54,54,49,10,69, 78,67,79,68,73,78,71,32,57,56,50,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,48,10,65,56,10,65,56,10,56, 56,10,53,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,54,54,50,10,69,78,67,79,68, 73,78,71,32,57,56,50,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,53,48,10,53,48,10,56,56,10,53,48, 10,53,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,99, 108,117,98,10,69,78,67,79,68,73,78,71,32,57,56,50, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,55,48,10,50,48,10,65,56, 10,70,56,10,70,56,10,65,56,10,50,48,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,54,54,52,10, 69,78,67,79,68,73,78,71,32,57,56,50,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,53,48,10,53,48,10, 56,56,10,70,56,10,50,48,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,104,101,97,114,116,10,69,78,67,79,68,73, 78,71,32,57,56,50,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,53,48,10,70,56,10,70,56,10,70,56,10,55,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,100,105, 97,109,111,110,100,10,69,78,67,79,68,73,78,71,32,57, 56,51,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 55,48,10,55,48,10,70,56,10,55,48,10,55,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,54,54, 55,10,69,78,67,79,68,73,78,71,32,57,56,51,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,53,48,10,50,48,10,55, 48,10,65,56,10,55,48,10,50,48,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,54,54,56,10,69,78, 67,79,68,73,78,71,32,57,56,51,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,57,48,10,52,56,10,57,48,10,52,56,10,48,48, 10,53,48,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,54,54,57,10,69,78,67,79,68,73, 78,71,32,57,56,51,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,55,48,10, 70,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,109,117, 115,105,99,97,108,110,111,116,101,10,69,78,67,79,68,73, 78,71,32,57,56,51,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,49,56, 10,49,52,10,49,48,10,49,48,10,49,48,10,55,48,10, 70,48,10,54,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,109,117, 115,105,99,97,108,110,111,116,101,100,98,108,10,69,78,67, 79,68,73,78,71,32,57,56,51,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,52,48, 10,54,48,10,53,48,10,52,56,10,52,56,10,67,56,10, 67,56,10,49,56,10,49,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,54,67,10,69,78,67,79,68,73,78, 71,32,57,56,51,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,52,48,10,54,48,10, 53,48,10,54,56,10,53,56,10,67,56,10,67,56,10,49, 56,10,49,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,54,68,10,69,78,67,79,68,73,78,71,32,57,56, 51,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,56,48,10,56,48,10,56,48,10,66, 48,10,67,56,10,56,56,10,56,56,10,57,48,10,69,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,54,69, 10,69,78,67,79,68,73,78,71,32,57,56,51,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,56,48,10,56,56,10,57,56,10,65,56,10,67,56, 10,57,56,10,65,56,10,67,56,10,56,56,10,48,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,54,70,10,69,78,67, 79,68,73,78,71,32,57,56,51,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,53,56,10,55,48,10,68,48,10,53,48,10,53,56,10, 55,48,10,68,48,10,52,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,55,48,10,69,78,67,79,68,73,78, 71,32,57,56,52,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,53,48,10,50,48,10, 65,56,10,55,48,10,65,56,10,50,48,10,50,48,10,50, 48,10,53,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,55,49,10,69,78,67,79,68,73,78,71,32,57,56, 52,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,50,48,10,53,48,10,50,48,10,65,56,10,68, 56,10,65,56,10,50,48,10,50,48,10,50,48,10,53,48, 10,50,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,55,50, 10,69,78,67,79,68,73,78,71,32,57,56,52,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,51,48,10,48,56,10,67,52,10,52,67, 10,56,48,10,57,52,10,65,56,10,49,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,55,51,10,69,78,67, 79,68,73,78,71,32,57,56,52,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,49,48,10,48,56, 10,67,52,10,67,67,10,65,67,10,65,48,10,65,52,10, 65,52,10,57,52,10,51,56,10,49,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,55,52,10,69,78,67,79,68,73,78, 71,32,57,56,52,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,48,10,48,56,10,67,52,10, 69,67,10,68,67,10,66,48,10,67,52,10,70,52,10,57, 52,10,51,56,10,49,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,55,53,10,69,78,67,79,68,73,78,71,32,57,56, 52,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,49,48,10,48,56,10,67,52,10,69,67,10,68, 67,10,57,48,10,66,52,10,68,52,10,66,52,10,51,56, 10,49,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,55,54, 10,69,78,67,79,68,73,78,71,32,57,56,52,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,49, 48,10,48,56,10,67,52,10,67,67,10,67,67,10,68,48, 10,70,67,10,57,52,10,57,52,10,51,56,10,49,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,55,55,10,69,78,67, 79,68,73,78,71,32,57,56,52,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,49,48,10,48,56, 10,67,52,10,67,67,10,70,67,10,67,48,10,69,52,10, 57,52,10,70,52,10,51,56,10,49,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,55,56,10,69,78,67,79,68,73,78, 71,32,57,56,52,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,48,10,48,56,10,67,52,10, 68,67,10,65,67,10,69,48,10,68,52,10,68,52,10,66, 52,10,51,56,10,49,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,55,57,10,69,78,67,79,68,73,78,71,32,57,56, 52,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,49,48,10,48,56,10,67,52,10,67,67,10,70, 67,10,57,48,10,65,52,10,65,52,10,66,52,10,51,56, 10,49,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,55,65, 10,69,78,67,79,68,73,78,71,32,57,56,53,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,49, 48,10,48,56,10,67,52,10,67,67,10,56,67,10,56,48, 10,56,52,10,56,52,10,57,52,10,51,56,10,49,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,55,66,10,69,78,67, 79,68,73,78,71,32,57,56,53,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,51,48,10,50,56,10,67,67,10,67,67,10,56,48,10, 57,52,10,66,56,10,49,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,55,67,10,69,78,67,79,68,73,78, 71,32,57,56,53,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,56,10,70,67,10,67,67,10, 68,52,10,51,48,10,51,48,10,55,67,10,54,56,10,52, 52,10,69,67,10,70,67,10,55,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,55,68,10,69,78,67,79,68,73,78,71,32,57,56, 53,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,55,56,10,56,52,10,51,48,10,50,56,10,67, 67,10,67,67,10,56,48,10,57,52,10,66,56,10,49,48, 10,56,52,10,55,56,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,56,48, 10,69,78,67,79,68,73,78,71,32,57,56,53,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,56,56,10,56,56,10,56,56,10,65,56, 10,56,56,10,56,56,10,56,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,56,49,10,69,78,67, 79,68,73,78,71,32,57,56,53,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,56, 10,56,56,10,67,56,10,56,56,10,56,56,10,56,56,10, 57,56,10,56,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,56,50,10,69,78,67,79,68,73,78, 71,32,57,56,53,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,56,56,10, 67,56,10,56,56,10,65,56,10,56,56,10,57,56,10,56, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,56,51,10,69,78,67,79,68,73,78,71,32,57,56, 53,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,56,10,56,56,10,68,56,10,56, 56,10,56,56,10,56,56,10,68,56,10,56,56,10,70,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,56,52, 10,69,78,67,79,68,73,78,71,32,57,56,54,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,56,56,10,68,56,10,56,56,10,65,56, 10,56,56,10,68,56,10,56,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,56,53,10,69,78,67, 79,68,73,78,71,32,57,56,54,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,56, 10,56,56,10,68,56,10,56,56,10,68,56,10,56,56,10, 68,56,10,56,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,54,56,54,10,69,78,67,79,68,73,78, 71,32,57,56,54,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,56,56,10,57,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,54,56,55,10,69,78,67,79,68,73,78,71,32,57,56, 54,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 48,10,56,56,10,68,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,54,56,56, 10,69,78,67,79,68,73,78,71,32,57,56,54,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,70,56, 10,69,56,10,70,56,10,55,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,54,56,57,10,69,78,67, 79,68,73,78,71,32,57,56,54,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,70,56,10,65,56,10, 70,56,10,55,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,48,49,10,69,78,67,79,68,73,78, 71,32,57,57,56,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,53,48,10,50,48,10,53,48,10,66, 67,10,52,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,48,50,10,69,78,67,79,68,73,78,71,32,57,57, 56,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,52,48,10,65, 52,10,54,56,10,49,48,10,54,56,10,65,52,10,52,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,48,51, 10,69,78,67,79,68,73,78,71,32,57,57,56,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,56,10,66,67,10,53,48,10,50,48,10,53,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,48,52,10,69,78,67, 79,68,73,78,71,32,57,57,56,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,52,48,10,65,67,10,55,56,10,49,48,10, 55,56,10,65,67,10,52,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,48,54,10,69,78,67,79,68,73,78, 71,32,57,57,57,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,56,10,56,52,10,66,52,10, 66,52,10,65,52,10,65,52,10,65,52,10,66,52,10,66, 52,10,52,52,10,55,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,48,56,10,69,78,67,79,68,73,78,71,32,57,57, 57,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,48,10,50,48,10,49,48,10,57, 48,10,70,67,10,57,48,10,49,48,10,50,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,49,51, 10,69,78,67,79,68,73,78,71,32,49,48,48,48,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,52,10,48,52,10,48,56,10,48,56,10,48, 56,10,57,48,10,53,48,10,50,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,49,52,10,69,78, 67,79,68,73,78,71,32,49,48,48,48,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,67,10,48,67,10,48,67,10,49,56,10,49,56,10,57, 56,10,68,56,10,55,48,10,51,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,49,53,10,69,78,67,79,68, 73,78,71,32,49,48,48,48,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,56,56,10,53,48,10,50, 48,10,53,48,10,56,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,49,54,10,69,78,67,79,68,73,78,71, 32,49,48,48,48,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,56,56,10,68,56,10,55,48,10,55,48,10,68, 56,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,49,55,10,69,78,67,79,68,73,78,71,32,49,48, 48,48,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,56,10, 57,48,10,53,48,10,50,48,10,53,48,10,52,56,10,56, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,49, 56,10,69,78,67,79,68,73,78,71,32,49,48,48,48,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,56,10,57,56,10,68,48,10, 55,48,10,55,48,10,53,56,10,67,56,10,56,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,49,57,10,69, 78,67,79,68,73,78,71,32,49,48,48,48,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,51,48,10,51,48,10,51,48,10,70,67,10, 70,67,10,51,48,10,51,48,10,51,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,49,65,10,69,78,67,79, 68,73,78,71,32,49,48,48,49,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,51,48,10,51,48,10,51,48,10,70,67,10,70,67,10, 51,48,10,51,48,10,51,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,49,66,10,69,78,67,79,68,73,78, 71,32,49,48,48,49,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,68,56,10,50,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,49,67,10,69,78,67,79,68,73,78,71,32,49, 48,48,49,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,51,48,10,51,48, 10,51,48,10,67,67,10,67,67,10,51,48,10,51,48,10, 51,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 49,68,10,69,78,67,79,68,73,78,71,32,49,48,48,49, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,50,48,10,50,48,10,70,56,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,49,69,10, 69,78,67,79,68,73,78,71,32,49,48,48,49,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,53,56,10,68,67,10,56,67,10,68,67, 10,53,67,10,53,56,10,53,56,10,55,56,10,51,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,49,70,10,69,78,67, 79,68,73,78,71,32,49,48,48,49,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,51, 48,10,51,48,10,70,67,10,70,67,10,51,48,10,51,48, 10,51,48,10,51,48,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,50,48,10,69,78,67,79,68,73, 78,71,32,49,48,48,49,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,50,48,10,65,56,10,70,56,10,65,56, 10,50,48,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,50,50,10,69,78,67,79,68,73,78,71,32, 49,48,48,49,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,51,48,10,51, 48,10,51,48,10,70,67,10,70,67,10,51,48,10,51,48, 10,51,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,50,51,10,69,78,67,79,68,73,78,71,32,49,48,48, 49,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,48,10,55,48,10,50,48,10,65, 56,10,70,56,10,65,56,10,50,48,10,55,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,50,52, 10,69,78,67,79,68,73,78,71,32,49,48,48,50,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,55,48,10,50,48,10,65,56,10,70, 56,10,65,56,10,50,48,10,55,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,50,53,10,69,78, 67,79,68,73,78,71,32,49,48,48,50,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,55,48,10,50,48,10,65,56,10,70,56,10,65, 56,10,50,48,10,55,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,50,54,10,69,78,67,79,68, 73,78,71,32,49,48,48,50,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,55,48,10,70,56,10,55,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,50,55,10,69,78,67,79,68,73,78,71, 32,49,48,48,50,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,53,48,10,56,56,10,53,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,50,57,10,69,78,67,79,68,73,78,71,32,49,48, 48,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 70,56,10,53,48,10,55,48,10,56,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,50, 65,10,69,78,67,79,68,73,78,71,32,49,48,48,50,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,68,56,10,68,56,10,48,48,10, 56,56,10,56,56,10,55,48,10,70,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,50,66,10,69, 78,67,79,68,73,78,71,32,49,48,48,50,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,70,56,10,53,48,10, 55,48,10,56,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,50,67,10,69,78,67,79, 68,73,78,71,32,49,48,48,50,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,50,48,10,50,48,10,70,56,10,55,48,10,55,48,10, 56,56,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,50,68,10,69,78,67,79,68,73,78, 71,32,49,48,48,50,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,50,48, 10,50,48,10,70,56,10,55,48,10,55,48,10,56,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,50,69,10,69,78,67,79,68,73,78,71,32,49, 48,48,51,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,50,48,10,50,48, 10,70,56,10,55,48,10,55,48,10,56,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 50,70,10,69,78,67,79,68,73,78,71,32,49,48,48,51, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,70,56, 10,55,48,10,55,48,10,56,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,51,48,10, 69,78,67,79,68,73,78,71,32,49,48,48,51,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,51,48,10,51,48,10,70,67,10,53,56, 10,55,56,10,67,67,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,51,49,10,69,78,67, 79,68,73,78,71,32,49,48,48,51,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,50,48,10,65,56,10,55,48,10,55,48,10,55,48, 10,65,56,10,50,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,51,50,10,69,78,67,79,68,73, 78,71,32,49,48,48,51,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,65,56,10,55,48,10,53,48,10,55,48,10,65,56, 10,50,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,51,51,10,69,78,67,79,68,73,78,71,32, 49,48,48,51,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,50,48,10,65, 56,10,55,48,10,70,56,10,55,48,10,65,56,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,51,52,10,69,78,67,79,68,73,78,71,32,49,48,48, 51,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,50,48,10,65,56,10,55, 48,10,70,56,10,55,48,10,65,56,10,50,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,51,53, 10,69,78,67,79,68,73,78,71,32,49,48,48,51,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,65,56,10,55,48,10,70, 56,10,55,48,10,65,56,10,50,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,51,54,10,69,78, 67,79,68,73,78,71,32,49,48,48,51,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,50,48,10,65,56,10,55,48,10,55,48,10,55, 48,10,65,56,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,51,55,10,69,78,67,79,68, 73,78,71,32,49,48,48,51,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 53,48,10,53,48,10,70,56,10,50,48,10,70,56,10,53, 48,10,53,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,51,56,10,69,78,67,79,68,73,78,71, 32,49,48,48,52,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,53,48,10, 55,48,10,70,56,10,55,48,10,70,56,10,55,48,10,53, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,51,66,10,69,78,67,79,68,73,78,71,32,49,48, 48,52,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,48,10,65,56,10, 65,56,10,55,48,10,65,56,10,65,56,10,50,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,51, 67,10,69,78,67,79,68,73,78,71,32,49,48,48,52,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,50,48,10,65,56,10,65,56,10, 53,48,10,65,56,10,65,56,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,51,68,10,69, 78,67,79,68,73,78,71,32,49,48,48,52,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,50,48,10,65,56,10,65,56,10,55,48,10, 65,56,10,65,56,10,50,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,51,69,10,69,78,67,79, 68,73,78,71,32,49,48,48,52,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,50,48,10,65,56,10,65,56,10,53,48,10,65,56,10, 65,56,10,50,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,51,70,10,69,78,67,79,68,73,78, 71,32,49,48,48,52,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,50,48,10,70,56,10,53,48,10,55,48,10,68,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,52,51,10,69,78,67,79,68,73,78,71,32,49, 48,48,53,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,50,48,10,65,56, 10,65,56,10,55,48,10,65,56,10,65,56,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 52,52,10,69,78,67,79,68,73,78,71,32,49,48,48,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,50,48,10,65,56,10,65,56, 10,55,48,10,65,56,10,65,56,10,50,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,52,53,10, 69,78,67,79,68,73,78,71,32,49,48,48,53,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,50,48,10,65,56,10,65,56,10,55,48, 10,65,56,10,65,56,10,50,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,52,54,10,69,78,67, 79,68,73,78,71,32,49,48,48,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,50,48,10,65,56,10,65,56,10,55,48,10,65,56, 10,65,56,10,50,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,52,55,10,69,78,67,79,68,73, 78,71,32,49,48,48,53,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,65,56,10,55,48,10,70,56,10,55,48,10,65,56, 10,50,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,52,56,10,69,78,67,79,68,73,78,71,32, 49,48,48,53,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,50,48,10,65, 56,10,55,48,10,70,56,10,55,48,10,65,56,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,52,57,10,69,78,67,79,68,73,78,71,32,49,48,48, 53,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,50,48,10,65,56,10,65, 56,10,55,48,10,65,56,10,65,56,10,50,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,52,65, 10,69,78,67,79,68,73,78,71,32,49,48,48,53,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,65,56,10,55,48,10,70, 56,10,55,48,10,65,56,10,50,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,52,66,10,69,78, 67,79,68,73,78,71,32,49,48,48,53,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,50,48,10,65,56,10,55,48,10,70,56,10,55, 48,10,65,56,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,52,68,10,69,78,67,79,68, 73,78,71,32,49,48,48,54,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,55,56,10,56,67,10,56,67,10,56, 67,10,56,67,10,55,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,52,70,10,69,78,67,79,68,73,78,71, 32,49,48,48,54,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,56,56,10,56,67,10,56,67,10,70, 67,10,51,67,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,53,48,10,69,78,67,79,68,73,78,71,32,49,48, 48,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 51,67,10,70,67,10,56,67,10,56,67,10,56,56,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,53, 49,10,69,78,67,79,68,73,78,71,32,49,48,48,54,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 56,67,10,56,67,10,56,67,10,70,67,10,55,67,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,53,50,10,69, 78,67,79,68,73,78,71,32,49,48,48,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,67,10,70,67,10, 56,67,10,56,67,10,56,67,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,53,54,10,69,78,67,79, 68,73,78,71,32,49,48,48,55,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,50,48, 10,55,48,10,50,48,10,53,48,10,70,56,10,53,48,10, 50,48,10,55,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,53,56,10,69,78,67,79,68,73,78, 71,32,49,48,48,55,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,53,57,10,69,78,67,79,68,73,78,71,32,49, 48,48,55,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,55,48,10,55,48, 10,55,48,10,55,48,10,55,48,10,55,48,10,55,48,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 53,65,10,69,78,67,79,68,73,78,71,32,49,48,48,55, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,56,10,70,56,10,70,56,10,70,56, 10,70,56,10,70,56,10,70,56,10,70,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,53,66,10, 69,78,67,79,68,73,78,71,32,49,48,48,55,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,51, 48,10,52,48,10,55,48,10,55,48,10,50,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,53,67,10,69,78,67, 79,68,73,78,71,32,49,48,48,55,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,50,48,10,55, 48,10,55,48,10,49,48,10,54,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,53,68,10,69,78,67,79,68,73, 78,71,32,49,48,48,55,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,54,67,10,57,48,10,70, 67,10,70,67,10,52,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,53,69,10,69,78,67,79,68,73,78,71,32, 49,48,48,55,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,52,56,10,70,67,10,70,67,10,50, 52,10,68,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,54,49,10,69,78,67,79,68,73,78,71,32,49,48,48, 56,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,56,10,55,67,10,69,56,10,69,56,10,55, 56,10,48,56,10,54,56,10,54,56,10,52,56,10,51,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,54,50, 10,69,78,67,79,68,73,78,71,32,49,48,48,56,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,48,10,55,48,10,55,48,10,50,48,10,50, 48,10,48,48,10,50,48,10,55,48,10,50,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,54,51,10,69,78, 67,79,68,73,78,71,32,49,48,48,56,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 53,48,10,70,56,10,70,56,10,55,48,10,50,48,10,48, 48,10,50,48,10,55,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,54,52,10,69,78,67,79,68, 73,78,71,32,49,48,48,56,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,53,48,10,70,56,10,70,56,10,70,56,10,55, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,54,53,10,69,78,67,79,68,73,78,71, 32,49,48,48,56,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 54,48,10,70,48,10,70,56,10,55,67,10,70,56,10,70, 48,10,54,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,54,54,10,69,78,67,79,68,73,78,71,32,49,48, 48,56,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,56,10,66,48,10,49,48,10, 68,56,10,70,56,10,70,48,10,54,48,10,54,56,10,51, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,54, 55,10,69,78,67,79,68,73,78,71,32,49,48,48,56,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,52,48,10,57,48,10,66,56,10, 55,67,10,53,67,10,66,67,10,66,56,10,53,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,55,54,10,69, 78,67,79,68,73,78,71,32,49,48,49,48,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,70,56,10,68,56,10,57,56,10,68,56,10, 68,56,10,56,56,10,70,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,55,55,10,69,78,67,79, 68,73,78,71,32,49,48,49,48,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,55,48, 10,70,56,10,68,56,10,65,56,10,69,56,10,68,56,10, 56,56,10,70,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,55,56,10,69,78,67,79,68,73,78, 71,32,49,48,49,48,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,70,56, 10,68,56,10,65,56,10,68,56,10,69,56,10,57,56,10, 70,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,55,57,10,69,78,67,79,68,73,78,71,32,49, 48,49,48,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,70,56,10,66,56, 10,66,56,10,57,56,10,56,56,10,68,56,10,70,56,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 55,65,10,69,78,67,79,68,73,78,71,32,49,48,49,48, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,70,56,10,56,56,10,66,56, 10,57,56,10,69,56,10,57,56,10,70,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,55,66,10, 69,78,67,79,68,73,78,71,32,49,48,49,48,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,70,56,10,67,56,10,66,56,10,57,56, 10,65,56,10,68,56,10,70,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,55,67,10,69,78,67, 79,68,73,78,71,32,49,48,49,48,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,70,56,10,56,56,10,69,56,10,68,56,10,68,56, 10,68,56,10,70,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,55,68,10,69,78,67,79,68,73, 78,71,32,49,48,49,48,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,70, 56,10,68,56,10,65,56,10,68,56,10,65,56,10,68,56, 10,70,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,55,69,10,69,78,67,79,68,73,78,71,32, 49,48,49,49,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,70,56,10,68, 56,10,65,56,10,67,56,10,69,56,10,57,56,10,70,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,55,70,10,69,78,67,79,68,73,78,71,32,49,48,49, 49,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,56,10,70,67,10,65,67,10,57, 52,10,57,52,10,57,52,10,65,67,10,70,67,10,55,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,56,48, 10,69,78,67,79,68,73,78,71,32,49,48,49,49,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,65,56,10,69,56,10,65, 56,10,65,56,10,65,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,56,49,10,69,78, 67,79,68,73,78,71,32,49,48,49,49,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,65,56,10,68,56,10,57,56,10,65, 56,10,70,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,56,50,10,69,78,67,79,68, 73,78,71,32,49,48,49,49,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,65,56,10,68,56,10,65,56,10,57,56,10,69, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,56,51,10,69,78,67,79,68,73,78,71, 32,49,48,49,49,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,48,10,56,56,10, 67,56,10,67,56,10,69,56,10,70,56,10,65,56,10,56, 56,10,55,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,56,52,10,69,78,67,79,68,73,78,71,32,49,48, 49,49,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,55,48,10,56,56,10,70,56,10, 67,56,10,69,56,10,57,56,10,69,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,56, 53,10,69,78,67,79,68,73,78,71,32,49,48,49,49,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,55,48,10,56,56,10,66,56,10,67,56,10, 69,56,10,68,56,10,65,56,10,56,56,10,55,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,56,54,10,69, 78,67,79,68,73,78,71,32,49,48,49,49,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,48,10,56,56,10,70,56,10,57,56,10,65,56,10, 65,56,10,65,56,10,56,56,10,55,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,56,55,10,69,78,67,79, 68,73,78,71,32,49,48,49,49,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,55,48, 10,56,56,10,65,56,10,68,56,10,65,56,10,68,56,10, 65,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,56,56,10,69,78,67,79,68,73,78, 71,32,49,48,49,50,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,65,56,10,68,56,10,66,56,10,57,56,10,69,56,10, 56,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,56,57,10,69,78,67,79,68,73,78,71,32,49, 48,49,50,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,56,52,10,68,52, 10,69,67,10,69,67,10,69,67,10,68,52,10,56,52,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 56,65,10,69,78,67,79,68,73,78,71,32,49,48,49,50, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,70,56,10,68,56,10,57,56, 10,68,56,10,68,56,10,68,56,10,70,56,10,55,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,56,66,10, 69,78,67,79,68,73,78,71,32,49,48,49,50,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,70,56,10,68,56,10,65,56,10,69,56, 10,68,56,10,56,56,10,70,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,56,67,10,69,78,67, 79,68,73,78,71,32,49,48,49,50,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,55, 48,10,70,56,10,68,56,10,65,56,10,68,56,10,69,56, 10,57,56,10,70,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,56,68,10,69,78,67,79,68,73, 78,71,32,49,48,49,50,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,70, 56,10,66,56,10,66,56,10,57,56,10,56,56,10,68,56, 10,70,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,56,69,10,69,78,67,79,68,73,78,71,32, 49,48,49,50,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,70,56,10,56, 56,10,66,56,10,57,56,10,69,56,10,57,56,10,70,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,56,70,10,69,78,67,79,68,73,78,71,32,49,48,49, 50,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,48,10,70,56,10,67,56,10,66, 56,10,57,56,10,65,56,10,68,56,10,70,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,57,48, 10,69,78,67,79,68,73,78,71,32,49,48,49,50,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,70,56,10,56,56,10,69,56,10,68, 56,10,68,56,10,68,56,10,70,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,57,49,10,69,78, 67,79,68,73,78,71,32,49,48,49,50,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,70,56,10,68,56,10,65,56,10,68,56,10,65, 56,10,68,56,10,70,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,57,50,10,69,78,67,79,68, 73,78,71,32,49,48,49,51,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 70,56,10,68,56,10,65,56,10,67,56,10,69,56,10,57, 56,10,70,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,57,51,10,69,78,67,79,68,73,78,71, 32,49,48,49,51,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,56,10,70,67,10, 65,67,10,57,52,10,57,52,10,57,52,10,65,67,10,70, 67,10,55,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,57,52,10,69,78,67,79,68,73,78,71,32,49,48, 49,51,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,51,48,10,49,56,10, 70,67,10,70,67,10,49,56,10,51,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,57, 56,10,69,78,67,79,68,73,78,71,32,49,48,49,51,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,56,48,10,52,48,10, 50,56,10,49,56,10,51,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,57,57,10,69, 78,67,79,68,73,78,71,32,49,48,49,51,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,48,10,51,48,10,70,56,10, 51,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,57,65,10,69,78,67,79, 68,73,78,71,32,49,48,49,51,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,51,56,10,49,56,10,50,56,10,52,48,10, 56,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,57,66,10,69,78,67,79,68,73,78, 71,32,49,48,49,51,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,52,48, 10,50,48,10,51,48,10,70,67,10,51,48,10,50,48,10, 52,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,57,67,10,69,78,67,79,68,73,78,71,32,49, 48,49,52,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,51,48,10,49,56, 10,70,67,10,70,67,10,49,56,10,51,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 57,68,10,69,78,67,79,68,73,78,71,32,49,48,49,52, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,48,10,49,56, 10,70,67,10,49,56,10,49,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,57,69,10, 69,78,67,79,68,73,78,71,32,49,48,49,52,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,49,48,10,49,56,10,70,67,10,70,67, 10,49,56,10,49,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,57,70,10,69,78,67, 79,68,73,78,71,32,49,48,49,52,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,49,48,10,49,56,10,66,67,10,66,67,10,49,56, 10,49,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,65,48,10,69,78,67,79,68,73, 78,71,32,49,48,49,52,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,51,48,10,66,56,10,66,67,10,66,56,10,51,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,65,49,10,69,78,67,79,68,73,78,71,32, 49,48,49,52,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,50,48,10,51, 48,10,70,56,10,70,67,10,70,56,10,51,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,65,52,10,69,78,67,79,68,73,78,71,32,49,48,49, 52,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,67,48,10,55, 48,10,51,67,10,55,48,10,67,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,65,53, 10,69,78,67,79,68,73,78,71,32,49,48,49,52,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,66,48,10,70,56,10,70, 67,10,55,56,10,51,48,10,50,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,65,54,10,69,78, 67,79,68,73,78,71,32,49,48,49,53,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,50,48,10,51,48,10,55,56,10,70,67,10,70, 56,10,66,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,65,55,10,69,78,67,79,68, 73,78,71,32,49,48,49,53,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,50,48,10,50,48,10,51,48,10, 70,48,10,70,56,10,70,56,10,70,67,10,70,56,10,70, 56,10,70,48,10,51,48,10,50,48,10,50,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,66,50,10,69,78,67,79,68,73,78,71, 32,49,48,49,54,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,56,10,70,67,10,68,67,10, 67,67,10,48,52,10,48,48,10,48,52,10,67,67,10,68, 67,10,70,56,10,55,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,66,52,10,69,78,67,79,68,73,78,71,32,49,48, 49,54,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 69,48,10,49,52,10,48,67,10,49,67,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,66, 53,10,69,78,67,79,68,73,78,71,32,49,48,49,54,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,57,48,10,67,56,10, 55,67,10,67,56,10,57,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,66,54,10,69, 78,67,79,68,73,78,71,32,49,48,49,54,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,49,67,10,48,67,10,49,52,10,69,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,66,55,10,69,78,67,79, 68,73,78,71,32,49,48,49,54,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,50,48,10,50,48,10,69,48,10,49,52,10,48,67,10, 49,67,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,66,56,10,69,78,67,79,68,73,78, 71,32,49,48,49,54,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,57,48,10,67,56,10,55,67,10,67,56,10,57,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,66,57,10,69,78,67,79,68,73,78,71,32,49, 48,49,54,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,49,67,10,48,67, 10,49,52,10,69,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 66,65,10,69,78,67,79,68,73,78,71,32,49,48,49,55, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,48,10,48,56, 10,70,67,10,48,56,10,49,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,66,66,10, 69,78,67,79,68,73,78,71,32,49,48,49,55,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,49,48,10,67,56,10,70,67, 10,67,56,10,49,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,66,67,10,69,78,67, 79,68,73,78,71,32,49,48,49,55,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,56,10,55,67,10,69,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,66,68,10,69,78,67,79,68,73, 78,71,32,49,48,49,55,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,68,48,10,68,56,10,55,67,10,68,56,10,68,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,66,69,10,69,78,67,79,68,73,78,71,32, 49,48,49,55,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,65,48,10,53,48,10,50, 56,10,70,52,10,48,52,10,70,52,10,50,56,10,53,48, 10,65,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,69,54,10,69,78,67,79,68,73,78,71,32,49,48,50, 49,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,70,56,10,65,48,10,65,48,10,65,48,10,65, 48,10,65,48,10,65,48,10,65,48,10,65,48,10,65,48, 10,70,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,55,69,55, 10,69,78,67,79,68,73,78,71,32,49,48,50,49,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 70,56,10,50,56,10,50,56,10,50,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,50,56,10,50,56,10,70,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,55,69,56,10,69,78, 67,79,68,73,78,71,32,49,48,50,49,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,56,10, 49,48,10,49,48,10,50,48,10,50,48,10,52,48,10,50, 48,10,50,48,10,49,48,10,49,48,10,48,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,55,69,57,10,69,78,67,79,68, 73,78,71,32,49,48,50,49,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,52,48,10,50,48,10, 50,48,10,49,48,10,49,48,10,48,56,10,49,48,10,49, 48,10,50,48,10,50,48,10,52,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,55,69,65,10,69,78,67,79,68,73,78,71, 32,49,48,50,49,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,52,10,50,56,10,50,56,10, 53,48,10,53,48,10,65,48,10,53,48,10,53,48,10,50, 56,10,50,56,10,49,52,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,55,69,66,10,69,78,67,79,68,73,78,71,32,49,48, 50,49,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,65,48,10,53,48,10,53,48,10,50,56,10, 50,56,10,49,52,10,50,56,10,50,56,10,53,48,10,53, 48,10,65,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,55,70, 53,10,69,78,67,79,68,73,78,71,32,49,48,50,50,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 52,48,10,70,67,10,52,48,10,50,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,55,70,54,10,69, 78,67,79,68,73,78,71,32,49,48,50,51,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,48,10,48,56,10, 70,67,10,48,56,10,49,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,55,70,55,10,69,78,67,79, 68,73,78,71,32,49,48,50,51,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,52,56,10,70,67,10, 52,56,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,55,70,56,10,69,78,67,79,68,73,78, 71,32,49,48,50,51,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,49,48,10,50,48,10,55,67,10,56,48,10,55,67,10, 50,48,10,49,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,55,70,57,10,69,78,67,79,68,73,78,71,32,49, 48,50,51,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,49,48,10,70,56,10,48,52,10,70,56,10,49,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,55, 70,65,10,69,78,67,79,68,73,78,71,32,49,48,50,51, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,52,56, 10,70,67,10,56,52,10,70,67,10,52,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,55,70,66,10, 69,78,67,79,68,73,78,71,32,49,48,50,51,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,52,10,52,52, 10,70,67,10,52,52,10,50,52,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,55,70,67,10,69,78,67, 79,68,73,78,71,32,49,48,50,51,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,57,48,10,56,56,10,70,67, 10,56,56,10,57,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,55,70,68,10,69,78,67,79,68,73, 78,71,32,49,48,50,51,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,52,10,50,52,10,55,67,10,56,52,10,55,67, 10,50,52,10,49,52,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,55,70,69,10,69,78,67,79,68,73,78,71,32, 49,48,50,51,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,65, 48,10,57,48,10,70,56,10,56,52,10,70,56,10,57,48, 10,65,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 55,70,70,10,69,78,67,79,68,73,78,71,32,49,48,50, 51,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 56,10,53,67,10,65,67,10,48,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,48,48, 10,69,78,67,79,68,73,78,71,32,49,48,50,52,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,48,49,10,69,78, 67,79,68,73,78,71,32,49,48,50,52,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,48,50,10,69,78,67,79,68, 73,78,71,32,49,48,50,52,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,48,51,10,69,78,67,79,68,73,78,71, 32,49,48,50,52,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,48,52,10,69,78,67,79,68,73,78,71,32,49,48, 50,52,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,67,48,10,67,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,48, 53,10,69,78,67,79,68,73,78,71,32,49,48,50,52,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,48,54,10,69, 78,67,79,68,73,78,71,32,49,48,50,52,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,48,55,10,69,78,67,79, 68,73,78,71,32,49,48,50,52,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,48,56,10,69,78,67,79,68,73,78, 71,32,49,48,50,52,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,48,57,10,69,78,67,79,68,73,78,71,32,49, 48,50,52,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 48,65,10,69,78,67,79,68,73,78,71,32,49,48,50,53, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,48,66,10, 69,78,67,79,68,73,78,71,32,49,48,50,53,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,48,67,10,69,78,67, 79,68,73,78,71,32,49,48,50,53,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,67,48, 10,67,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,48,68,10,69,78,67,79,68,73, 78,71,32,49,48,50,53,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,67,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,48,69,10,69,78,67,79,68,73,78,71,32, 49,48,50,53,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,67,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,48,70,10,69,78,67,79,68,73,78,71,32,49,48,50, 53,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,67,48,10,67,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,49,48, 10,69,78,67,79,68,73,78,71,32,49,48,50,53,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,49,49,10,69,78, 67,79,68,73,78,71,32,49,48,50,53,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,49,50,10,69,78,67,79,68, 73,78,71,32,49,48,50,53,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,49,51,10,69,78,67,79,68,73,78,71, 32,49,48,50,53,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,49,52,10,69,78,67,79,68,73,78,71,32,49,48, 50,54,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,67,48,10,67,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,49, 53,10,69,78,67,79,68,73,78,71,32,49,48,50,54,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,67,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,49,54,10,69, 78,67,79,68,73,78,71,32,49,48,50,54,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 67,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,49,55,10,69,78,67,79, 68,73,78,71,32,49,48,50,54,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,49,56,10,69,78,67,79,68,73,78, 71,32,49,48,50,54,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,49,57,10,69,78,67,79,68,73,78,71,32,49, 48,50,54,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 49,65,10,69,78,67,79,68,73,78,71,32,49,48,50,54, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,49,66,10, 69,78,67,79,68,73,78,71,32,49,48,50,54,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,49,67,10,69,78,67, 79,68,73,78,71,32,49,48,50,54,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,67,48, 10,67,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,49,68,10,69,78,67,79,68,73, 78,71,32,49,48,50,54,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,49,69,10,69,78,67,79,68,73,78,71,32, 49,48,50,55,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,49,70,10,69,78,67,79,68,73,78,71,32,49,48,50, 55,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,67,48,10,67,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,50,48, 10,69,78,67,79,68,73,78,71,32,49,48,50,55,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,56,10,49,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,50,49,10,69,78, 67,79,68,73,78,71,32,49,48,50,55,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 56,10,49,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,50,50,10,69,78,67,79,68, 73,78,71,32,49,48,50,55,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,50,51,10,69,78,67,79,68,73,78,71, 32,49,48,50,55,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,50,52,10,69,78,67,79,68,73,78,71,32,49,48, 50,55,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,68,56,10,68,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,50, 53,10,69,78,67,79,68,73,78,71,32,49,48,50,55,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,50,54,10,69, 78,67,79,68,73,78,71,32,49,48,50,55,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,50,55,10,69,78,67,79, 68,73,78,71,32,49,48,50,55,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,68,56,10, 68,56,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,50,56,10,69,78,67,79,68,73,78, 71,32,49,48,50,56,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,50,57,10,69,78,67,79,68,73,78,71,32,49, 48,50,56,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,49,56,10,49,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 50,65,10,69,78,67,79,68,73,78,71,32,49,48,50,56, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,49,56,10,49,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,50,66,10, 69,78,67,79,68,73,78,71,32,49,48,50,56,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,50,67,10,69,78,67, 79,68,73,78,71,32,49,48,50,56,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,50,68,10,69,78,67,79,68,73, 78,71,32,49,48,50,56,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,68,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,50,69,10,69,78,67,79,68,73,78,71,32, 49,48,50,56,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,50,70,10,69,78,67,79,68,73,78,71,32,49,48,50, 56,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,51,48, 10,69,78,67,79,68,73,78,71,32,49,48,50,56,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,51,49,10,69,78, 67,79,68,73,78,71,32,49,48,50,56,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,49, 56,10,49,56,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,51,50,10,69,78,67,79,68, 73,78,71,32,49,48,50,57,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,51,51,10,69,78,67,79,68,73,78,71, 32,49,48,50,57,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,49,56,10,49,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,51,52,10,69,78,67,79,68,73,78,71,32,49,48, 50,57,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,68,56,10,68,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,51, 53,10,69,78,67,79,68,73,78,71,32,49,48,50,57,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,51,54,10,69, 78,67,79,68,73,78,71,32,49,48,50,57,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,51,55,10,69,78,67,79, 68,73,78,71,32,49,48,50,57,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,68,56,10, 68,56,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,51,56,10,69,78,67,79,68,73,78, 71,32,49,48,50,57,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,49,56,10,49,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,51,57,10,69,78,67,79,68,73,78,71,32,49, 48,50,57,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,49,56,10,49,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 51,65,10,69,78,67,79,68,73,78,71,32,49,48,50,57, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,49,56,10,49,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,51,66,10, 69,78,67,79,68,73,78,71,32,49,48,50,57,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,51,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,48,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,68,56, 10,68,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,51,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,48,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,51,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,48,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,51,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 48,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,52,48, 10,69,78,67,79,68,73,78,71,32,49,48,51,48,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,67,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,52,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,48,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,67,48,10,67,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,52,50,10,69,78,67,79,68, 73,78,71,32,49,48,51,48,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,67,48,10,67,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,52,51,10,69,78,67,79,68,73,78,71, 32,49,48,51,48,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,67,48,10,67,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,52,52,10,69,78,67,79,68,73,78,71,32,49,48, 51,48,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,67,48,10,67,48,10,48,48,10,67, 48,10,67,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,52, 53,10,69,78,67,79,68,73,78,71,32,49,48,51,48,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,67,48,10,67, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,52,54,10,69, 78,67,79,68,73,78,71,32,49,48,51,49,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,67,48,10,67,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,52,55,10,69,78,67,79, 68,73,78,71,32,49,48,51,49,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,67,48,10, 67,48,10,48,48,10,67,48,10,67,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,52,56,10,69,78,67,79,68,73,78, 71,32,49,48,51,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,52,57,10,69,78,67,79,68,73,78,71,32,49, 48,51,49,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 52,65,10,69,78,67,79,68,73,78,71,32,49,48,51,49, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,67,48,10, 67,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,52,66,10, 69,78,67,79,68,73,78,71,32,49,48,51,49,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,67,48,10,67,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,52,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,49,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,67,48, 10,67,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,52,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,49,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,52,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,49,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,67,48,10,67,48,10,48,48, 10,67,48,10,67,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,52,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 49,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,67,48,10,67,48,10,48,48,10,67,48, 10,67,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,53,48, 10,69,78,67,79,68,73,78,71,32,49,48,51,50,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,67,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,53,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,50,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,67,48,10,67,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,53,50,10,69,78,67,79,68, 73,78,71,32,49,48,51,50,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,67,48,10,67,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,53,51,10,69,78,67,79,68,73,78,71, 32,49,48,51,50,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,67,48,10,67,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,53,52,10,69,78,67,79,68,73,78,71,32,49,48, 51,50,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,67,48,10,67,48,10,48,48,10,67, 48,10,67,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,53, 53,10,69,78,67,79,68,73,78,71,32,49,48,51,50,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,67,48,10,67,48,10,48,48,10,67,48,10,67, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,53,54,10,69, 78,67,79,68,73,78,71,32,49,48,51,50,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 67,48,10,67,48,10,48,48,10,67,48,10,67,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,53,55,10,69,78,67,79, 68,73,78,71,32,49,48,51,50,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,67,48,10, 67,48,10,48,48,10,67,48,10,67,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,53,56,10,69,78,67,79,68,73,78, 71,32,49,48,51,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,53,57,10,69,78,67,79,68,73,78,71,32,49, 48,51,50,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 53,65,10,69,78,67,79,68,73,78,71,32,49,48,51,51, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,67,48,10, 67,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,53,66,10, 69,78,67,79,68,73,78,71,32,49,48,51,51,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,67,48,10,67,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,53,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,51,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,67,48, 10,67,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,53,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,51,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,53,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,51,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,67,48,10,67,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,53,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 51,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,67,48,10,67,48,10,48,48,10,67,48, 10,67,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,54,48, 10,69,78,67,79,68,73,78,71,32,49,48,51,51,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,54,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,51,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 56,10,49,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,54,50,10,69,78,67,79,68, 73,78,71,32,49,48,51,51,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,49,56,10,49, 56,10,48,48,10,67,48,10,67,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,54,51,10,69,78,67,79,68,73,78,71, 32,49,48,51,51,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,67,48,10,67,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,54,52,10,69,78,67,79,68,73,78,71,32,49,48, 51,52,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,68,56,10,68,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,54, 53,10,69,78,67,79,68,73,78,71,32,49,48,51,52,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,54,54,10,69, 78,67,79,68,73,78,71,32,49,48,51,52,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,67,48,10,67,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,54,55,10,69,78,67,79, 68,73,78,71,32,49,48,51,52,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,68,56,10, 68,56,10,48,48,10,67,48,10,67,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,54,56,10,69,78,67,79,68,73,78, 71,32,49,48,51,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,67,48,10,67,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,54,57,10,69,78,67,79,68,73,78,71,32,49, 48,51,52,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,49,56,10,49,56,10,48,48,10, 67,48,10,67,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 54,65,10,69,78,67,79,68,73,78,71,32,49,48,51,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,49,56,10,49,56,10,48,48,10,67,48,10, 67,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,54,66,10, 69,78,67,79,68,73,78,71,32,49,48,51,52,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,49,56,10,49,56,10,48,48,10,67,48,10,67,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,54,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,52,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,67,48,10,67,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,54,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,52,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,68,56, 10,48,48,10,67,48,10,67,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,54,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,53,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,68,56,10,68,56,10,48,48, 10,67,48,10,67,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,54,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 53,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,68,56,10,68,56,10,48,48,10,67,48, 10,67,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,55,48, 10,69,78,67,79,68,73,78,71,32,49,48,51,53,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,55,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,53,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,49, 56,10,49,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,55,50,10,69,78,67,79,68, 73,78,71,32,49,48,51,53,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,49,56,10,49, 56,10,48,48,10,67,48,10,67,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,55,51,10,69,78,67,79,68,73,78,71, 32,49,48,51,53,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,49,56,10,49,56,10,48, 48,10,67,48,10,67,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,55,52,10,69,78,67,79,68,73,78,71,32,49,48, 51,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,68,56,10,68,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,55, 53,10,69,78,67,79,68,73,78,71,32,49,48,51,53,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,55,54,10,69, 78,67,79,68,73,78,71,32,49,48,51,53,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,67,48,10,67,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,55,55,10,69,78,67,79, 68,73,78,71,32,49,48,51,53,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,68,56,10, 68,56,10,48,48,10,67,48,10,67,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,55,56,10,69,78,67,79,68,73,78, 71,32,49,48,51,54,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,49,56,10,49,56,10, 48,48,10,67,48,10,67,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,55,57,10,69,78,67,79,68,73,78,71,32,49, 48,51,54,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,49,56,10,49,56,10,48,48,10, 67,48,10,67,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 55,65,10,69,78,67,79,68,73,78,71,32,49,48,51,54, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,49,56,10,49,56,10,48,48,10,67,48,10, 67,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,55,66,10, 69,78,67,79,68,73,78,71,32,49,48,51,54,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,67,48,10,67,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,55,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,54,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,68,56, 10,68,56,10,48,48,10,67,48,10,67,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,55,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,54,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,67,48,10,67,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,55,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,54,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,67,48,10,67,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,55,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 54,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,68,56,10,68,56,10,48,48,10,67,48, 10,67,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,56,48, 10,69,78,67,79,68,73,78,71,32,49,48,51,54,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,56,10,49,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,56,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,54,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,49,56,10,49,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,56,50,10,69,78,67,79,68, 73,78,71,32,49,48,51,55,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,49,56,10,49,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,56,51,10,69,78,67,79,68,73,78,71, 32,49,48,51,55,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,56,10,49,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,56,52,10,69,78,67,79,68,73,78,71,32,49,48, 51,55,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,67,48,10,67,48,10,48,48,10,49, 56,10,49,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,56, 53,10,69,78,67,79,68,73,78,71,32,49,48,51,55,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,49,56,10,49, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,56,54,10,69, 78,67,79,68,73,78,71,32,49,48,51,55,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,56,55,10,69,78,67,79, 68,73,78,71,32,49,48,51,55,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,56,56,10,69,78,67,79,68,73,78, 71,32,49,48,51,55,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,49,56,10,49,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,56,57,10,69,78,67,79,68,73,78,71,32,49, 48,51,55,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 49,56,10,49,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 56,65,10,69,78,67,79,68,73,78,71,32,49,48,51,55, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,56,66,10, 69,78,67,79,68,73,78,71,32,49,48,51,55,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,56,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,56,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,67,48, 10,67,48,10,48,48,10,49,56,10,49,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,56,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,56,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,67,48, 10,48,48,10,49,56,10,49,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,56,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,56,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,67,48,10,67,48,10,48,48, 10,49,56,10,49,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,56,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 56,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,67,48,10,67,48,10,48,48,10,49,56, 10,49,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,57,48, 10,69,78,67,79,68,73,78,71,32,49,48,51,56,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,49,56,10,49,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,57,49,10,69,78, 67,79,68,73,78,71,32,49,48,51,56,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,49,56,10,49,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,57,50,10,69,78,67,79,68, 73,78,71,32,49,48,51,56,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,49,56,10,49,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,57,51,10,69,78,67,79,68,73,78,71, 32,49,48,51,56,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,56,10,49,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,57,52,10,69,78,67,79,68,73,78,71,32,49,48, 51,56,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,67,48,10,67,48,10,48,48,10,49, 56,10,49,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,57, 53,10,69,78,67,79,68,73,78,71,32,49,48,51,56,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,67,48,10,67,48,10,48,48,10,49,56,10,49, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,57,54,10,69, 78,67,79,68,73,78,71,32,49,48,51,57,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 67,48,10,67,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,57,55,10,69,78,67,79, 68,73,78,71,32,49,48,51,57,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,57,56,10,69,78,67,79,68,73,78, 71,32,49,48,51,57,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,49,56,10,49,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,57,57,10,69,78,67,79,68,73,78,71,32,49, 48,51,57,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 49,56,10,49,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 57,65,10,69,78,67,79,68,73,78,71,32,49,48,51,57, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,57,66,10, 69,78,67,79,68,73,78,71,32,49,48,51,57,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,57,67,10,69,78,67, 79,68,73,78,71,32,49,48,51,57,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,67,48, 10,67,48,10,48,48,10,49,56,10,49,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,57,68,10,69,78,67,79,68,73, 78,71,32,49,48,51,57,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,49,56,10,49,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,57,69,10,69,78,67,79,68,73,78,71,32, 49,48,51,57,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,49,56,10,49,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,57,70,10,69,78,67,79,68,73,78,71,32,49,48,51, 57,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,67,48,10,67,48,10,48,48,10,49,56, 10,49,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,65,48, 10,69,78,67,79,68,73,78,71,32,49,48,52,48,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,56,10,49,56,10,48,48,10,49,56,10,49,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,65,49,10,69,78, 67,79,68,73,78,71,32,49,48,52,48,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 56,10,49,56,10,48,48,10,49,56,10,49,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,65,50,10,69,78,67,79,68, 73,78,71,32,49,48,52,48,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,65,51,10,69,78,67,79,68,73,78,71, 32,49,48,52,48,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,65,52,10,69,78,67,79,68,73,78,71,32,49,48, 52,48,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,68,56,10,68,56,10,48,48,10,49, 56,10,49,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,65, 53,10,69,78,67,79,68,73,78,71,32,49,48,52,48,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,49,56,10,49, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,65,54,10,69, 78,67,79,68,73,78,71,32,49,48,52,48,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,49,56,10,49,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,65,55,10,69,78,67,79, 68,73,78,71,32,49,48,52,48,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,68,56,10, 68,56,10,48,48,10,49,56,10,49,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,65,56,10,69,78,67,79,68,73,78, 71,32,49,48,52,48,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,49,56,10,49,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,65,57,10,69,78,67,79,68,73,78,71,32,49, 48,52,48,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,49,56,10,49,56,10,48,48,10, 49,56,10,49,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 65,65,10,69,78,67,79,68,73,78,71,32,49,48,52,49, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,49,56,10,49,56,10,48,48,10,49,56,10, 49,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,65,66,10, 69,78,67,79,68,73,78,71,32,49,48,52,49,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,49,56,10,49,56,10,48,48,10,49,56,10,49,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,65,67,10,69,78,67, 79,68,73,78,71,32,49,48,52,49,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,49,56,10,49,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,65,68,10,69,78,67,79,68,73, 78,71,32,49,48,52,49,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,68,56, 10,48,48,10,49,56,10,49,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,65,69,10,69,78,67,79,68,73,78,71,32, 49,48,52,49,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,68,56,10,68,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,65,70,10,69,78,67,79,68,73,78,71,32,49,48,52, 49,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,66,48, 10,69,78,67,79,68,73,78,71,32,49,48,52,49,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,49,56,10,49,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,66,49,10,69,78, 67,79,68,73,78,71,32,49,48,52,49,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,49, 56,10,49,56,10,48,48,10,49,56,10,49,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,66,50,10,69,78,67,79,68, 73,78,71,32,49,48,52,49,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,66,51,10,69,78,67,79,68,73,78,71, 32,49,48,52,49,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,49,56,10,49,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,66,52,10,69,78,67,79,68,73,78,71,32,49,48, 52,50,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,68,56,10,68,56,10,48,48,10,49, 56,10,49,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,66, 53,10,69,78,67,79,68,73,78,71,32,49,48,52,50,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,68,56,10,68,56,10,48,48,10,49,56,10,49, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,66,54,10,69, 78,67,79,68,73,78,71,32,49,48,52,50,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,49,56,10,49,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,66,55,10,69,78,67,79, 68,73,78,71,32,49,48,52,50,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,68,56,10, 68,56,10,48,48,10,49,56,10,49,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,66,56,10,69,78,67,79,68,73,78, 71,32,49,48,52,50,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,49,56,10,49,56,10, 48,48,10,49,56,10,49,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,66,57,10,69,78,67,79,68,73,78,71,32,49, 48,52,50,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,49,56,10,49,56,10,48,48,10, 49,56,10,49,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 66,65,10,69,78,67,79,68,73,78,71,32,49,48,52,50, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,49,56,10,49,56,10,48,48,10,49,56,10, 49,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,66,66,10, 69,78,67,79,68,73,78,71,32,49,48,52,50,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,49,56,10,49,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,66,67,10,69,78,67, 79,68,73,78,71,32,49,48,52,50,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,68,56, 10,68,56,10,48,48,10,49,56,10,49,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,66,68,10,69,78,67,79,68,73, 78,71,32,49,48,52,50,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,49,56,10,49,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,66,69,10,69,78,67,79,68,73,78,71,32, 49,48,52,51,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,66,70,10,69,78,67,79,68,73,78,71,32,49,48,52, 51,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,67,48, 10,69,78,67,79,68,73,78,71,32,49,48,52,51,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,68,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,67,49,10,69,78, 67,79,68,73,78,71,32,49,48,52,51,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,68,56,10,68,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,67,50,10,69,78,67,79,68, 73,78,71,32,49,48,52,51,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,68,56,10,68,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,67,51,10,69,78,67,79,68,73,78,71, 32,49,48,52,51,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,68,56,10,68,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,67,52,10,69,78,67,79,68,73,78,71,32,49,48, 52,51,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,67,48,10,67,48,10,48,48,10,68, 56,10,68,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,67, 53,10,69,78,67,79,68,73,78,71,32,49,48,52,51,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,68,56,10,68, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,67,54,10,69, 78,67,79,68,73,78,71,32,49,48,52,51,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,68,56,10,68,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,67,55,10,69,78,67,79, 68,73,78,71,32,49,48,52,51,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,67,48,10, 67,48,10,48,48,10,68,56,10,68,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,67,56,10,69,78,67,79,68,73,78, 71,32,49,48,52,52,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,67,57,10,69,78,67,79,68,73,78,71,32,49, 48,52,52,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 67,65,10,69,78,67,79,68,73,78,71,32,49,48,52,52, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,68,56,10, 68,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,67,66,10, 69,78,67,79,68,73,78,71,32,49,48,52,52,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,68,56,10,68,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,67,67,10,69,78,67, 79,68,73,78,71,32,49,48,52,52,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,67,48, 10,67,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,67,68,10,69,78,67,79,68,73, 78,71,32,49,48,52,52,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,67,69,10,69,78,67,79,68,73,78,71,32, 49,48,52,52,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,67,48,10,67,48,10,48,48, 10,68,56,10,68,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,67,70,10,69,78,67,79,68,73,78,71,32,49,48,52, 52,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,67,48,10,67,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,68,48, 10,69,78,67,79,68,73,78,71,32,49,48,52,52,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,68,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,68,49,10,69,78, 67,79,68,73,78,71,32,49,48,52,52,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,68,56,10,68,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,68,50,10,69,78,67,79,68, 73,78,71,32,49,48,52,53,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,68,56,10,68,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,68,51,10,69,78,67,79,68,73,78,71, 32,49,48,52,53,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,48,48,10,48,48,10,48, 48,10,68,56,10,68,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,68,52,10,69,78,67,79,68,73,78,71,32,49,48, 52,53,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,67,48,10,67,48,10,48,48,10,68, 56,10,68,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,68, 53,10,69,78,67,79,68,73,78,71,32,49,48,52,53,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,67,48,10,67,48,10,48,48,10,68,56,10,68, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,68,54,10,69, 78,67,79,68,73,78,71,32,49,48,52,53,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 67,48,10,67,48,10,48,48,10,68,56,10,68,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,68,55,10,69,78,67,79, 68,73,78,71,32,49,48,52,53,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,67,48,10, 67,48,10,48,48,10,68,56,10,68,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,68,56,10,69,78,67,79,68,73,78, 71,32,49,48,52,53,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,68,57,10,69,78,67,79,68,73,78,71,32,49, 48,52,53,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 68,65,10,69,78,67,79,68,73,78,71,32,49,48,52,53, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,48,48,10,48,48,10,48,48,10,68,56,10, 68,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,68,66,10, 69,78,67,79,68,73,78,71,32,49,48,52,53,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,68,56,10,68,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,68,67,10,69,78,67, 79,68,73,78,71,32,49,48,52,54,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,67,48, 10,67,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,68,68,10,69,78,67,79,68,73, 78,71,32,49,48,52,54,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,68,69,10,69,78,67,79,68,73,78,71,32, 49,48,52,54,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,68,56,10,68,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,68,70,10,69,78,67,79,68,73,78,71,32,49,48,52, 54,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,67,48,10,67,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,69,48, 10,69,78,67,79,68,73,78,71,32,49,48,52,54,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,69,49,10,69,78, 67,79,68,73,78,71,32,49,48,52,54,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 56,10,49,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,69,50,10,69,78,67,79,68, 73,78,71,32,49,48,52,54,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,67,48,10,67,48,10,48,48,10,49,56,10,49, 56,10,48,48,10,68,56,10,68,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,69,51,10,69,78,67,79,68,73,78,71, 32,49,48,52,54,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 67,48,10,67,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,68,56,10,68,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,69,52,10,69,78,67,79,68,73,78,71,32,49,48, 52,54,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,68,56,10,68,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,69, 53,10,69,78,67,79,68,73,78,71,32,49,48,52,54,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,69,54,10,69, 78,67,79,68,73,78,71,32,49,48,52,55,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,68,56,10,68,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,69,55,10,69,78,67,79, 68,73,78,71,32,49,48,52,55,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,67,48,10,67,48,10,48,48,10,68,56,10, 68,56,10,48,48,10,68,56,10,68,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,69,56,10,69,78,67,79,68,73,78, 71,32,49,48,52,55,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,68,56,10,68,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,69,57,10,69,78,67,79,68,73,78,71,32,49, 48,52,55,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,49,56,10,49,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 69,65,10,69,78,67,79,68,73,78,71,32,49,48,52,55, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,67,48,10,67,48, 10,48,48,10,49,56,10,49,56,10,48,48,10,68,56,10, 68,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,69,66,10, 69,78,67,79,68,73,78,71,32,49,48,52,55,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,67,48,10,67,48,10,48,48, 10,49,56,10,49,56,10,48,48,10,68,56,10,68,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,69,67,10,69,78,67, 79,68,73,78,71,32,49,48,52,55,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,68,56, 10,68,56,10,48,48,10,68,56,10,68,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,69,68,10,69,78,67,79,68,73, 78,71,32,49,48,52,55,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,68,56,10,68,56, 10,48,48,10,68,56,10,68,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,69,69,10,69,78,67,79,68,73,78,71,32, 49,48,52,55,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,67, 48,10,67,48,10,48,48,10,68,56,10,68,56,10,48,48, 10,68,56,10,68,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,69,70,10,69,78,67,79,68,73,78,71,32,49,48,52, 55,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,67,48,10,67, 48,10,48,48,10,68,56,10,68,56,10,48,48,10,68,56, 10,68,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,56,70,48, 10,69,78,67,79,68,73,78,71,32,49,48,52,56,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,56,10,49,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,56,70,49,10,69,78, 67,79,68,73,78,71,32,49,48,52,56,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,67,48,10, 67,48,10,48,48,10,49,56,10,49,56,10,48,48,10,49, 56,10,49,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,56,70,50,10,69,78,67,79,68, 73,78,71,32,49,48,52,56,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,68,56,10,68,56,10,48,48,10,49,56,10,49, 56,10,48,48,10,68,56,10,68,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,56,70,51,10,69,78,67,79,68,73,78,71, 32,49,48,52,56,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,67,48,10,67,48,10,48,48,10, 68,56,10,68,56,10,48,48,10,49,56,10,49,56,10,48, 48,10,68,56,10,68,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,56,70,52,10,69,78,67,79,68,73,78,71,32,49,48, 52,56,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,56,10, 49,56,10,48,48,10,68,56,10,68,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,56,70, 53,10,69,78,67,79,68,73,78,71,32,49,48,52,56,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,67,48,10,48,48,10,49,56,10,49,56,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,56,70,54,10,69, 78,67,79,68,73,78,71,32,49,48,52,56,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,68,56,10,68,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,68,56,10,68,56,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,56,70,55,10,69,78,67,79, 68,73,78,71,32,49,48,52,56,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,67,48,10,67,48, 10,48,48,10,68,56,10,68,56,10,48,48,10,68,56,10, 68,56,10,48,48,10,68,56,10,68,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,56,70,56,10,69,78,67,79,68,73,78, 71,32,49,48,52,56,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,49,56,10,49,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,49,56,10,49,56,10, 48,48,10,68,56,10,68,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,56,70,57,10,69,78,67,79,68,73,78,71,32,49, 48,52,56,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,68,56,10,68,56,10,48,48,10,49,56, 10,49,56,10,48,48,10,49,56,10,49,56,10,48,48,10, 68,56,10,68,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,56, 70,65,10,69,78,67,79,68,73,78,71,32,49,48,52,57, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,49,56,10,49,56,10,48,48,10,68,56,10, 68,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,56,70,66,10, 69,78,67,79,68,73,78,71,32,49,48,52,57,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,49,56,10,49,56,10,48,48,10,68,56,10,68,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,56,70,67,10,69,78,67, 79,68,73,78,71,32,49,48,52,57,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,56,10,49, 56,10,48,48,10,49,56,10,49,56,10,48,48,10,68,56, 10,68,56,10,48,48,10,68,56,10,68,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,56,70,68,10,69,78,67,79,68,73, 78,71,32,49,48,52,57,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,68,56,10,68,56,10,48, 48,10,49,56,10,49,56,10,48,48,10,68,56,10,68,56, 10,48,48,10,68,56,10,68,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,56,70,69,10,69,78,67,79,68,73,78,71,32, 49,48,52,57,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,49,56,10,49,56,10,48,48,10,68, 56,10,68,56,10,48,48,10,68,56,10,68,56,10,48,48, 10,68,56,10,68,56,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 56,70,70,10,69,78,67,79,68,73,78,71,32,49,48,52, 57,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,68,56,10,68,56,10,48,48,10,68,56,10,68, 56,10,48,48,10,68,56,10,68,56,10,48,48,10,68,56, 10,68,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,57,48,54, 10,69,78,67,79,68,73,78,71,32,49,48,53,48,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,49,52,10,50,52,10,55, 67,10,56,52,10,55,67,10,50,52,10,49,52,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,57,48,55,10,69,78, 67,79,68,73,78,71,32,49,48,53,48,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,65,48,10,57,48,10,70,56,10,56, 52,10,70,56,10,57,48,10,65,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,57,56,51,10,69,78,67,79,68, 73,78,71,32,49,48,54,50,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,51,56,10,53,48,10, 53,48,10,53,48,10,53,48,10,57,48,10,53,48,10,53, 48,10,53,48,10,53,48,10,51,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,57,56,52,10,69,78,67,79,68,73,78,71, 32,49,48,54,50,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,69,48,10,53,48,10,53,48,10, 53,48,10,53,48,10,52,56,10,53,48,10,53,48,10,53, 48,10,53,48,10,69,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,57,56,53,10,69,78,67,79,68,73,78,71,32,49,48, 54,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,56,10,49,48,10,51,48,10,51,48,10, 53,48,10,53,48,10,53,48,10,51,48,10,51,48,10,49, 48,10,48,56,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,57,56, 54,10,69,78,67,79,68,73,78,71,32,49,48,54,51,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,52,48,10,50,48,10,51,48,10,51,48,10,50,56,10, 50,56,10,50,56,10,51,48,10,51,48,10,50,48,10,52, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,57,56,55,10,69, 78,67,79,68,73,78,71,32,49,48,54,51,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,51,48,10,51,48,10,53,48,10,53,48,10,53,48,10, 53,48,10,53,48,10,51,48,10,51,48,10,49,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,57,56,56,10,69,78,67,79, 68,73,78,71,32,49,48,54,51,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,48,10,54,48, 10,54,48,10,53,48,10,53,48,10,53,48,10,53,48,10, 53,48,10,54,48,10,54,48,10,52,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,57,56,57,10,69,78,67,79,68,73,78, 71,32,49,48,54,51,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,56,10,49,56,10,49,56, 10,50,56,10,50,56,10,52,56,10,50,56,10,50,56,10, 49,56,10,49,56,10,48,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,57,56,65,10,69,78,67,79,68,73,78,71,32,49, 48,54,51,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,52,48,10,54,48,10,54,48,10,53,48, 10,53,48,10,52,56,10,53,48,10,53,48,10,54,48,10, 54,48,10,52,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,57, 56,66,10,69,78,67,79,68,73,78,71,32,49,48,54,51, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,55,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,52,48,10,55,48,10, 48,48,10,55,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,57,56,67,10, 69,78,67,79,68,73,78,71,32,49,48,54,51,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,55, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,49,48,10,49,48,10,55,48,10,48,48,10, 55,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,57,56,68,10,69,78,67, 79,68,73,78,71,32,49,48,54,51,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,55,48,10,54, 48,10,53,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,55,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,57,56,69,10,69,78,67,79,68,73, 78,71,32,49,48,54,51,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,55,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,53,48,10,51,48,10,55,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,57,56,70,10,69,78,67,79,68,73,78,71,32, 49,48,54,51,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,55,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,53,48, 10,54,48,10,55,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 57,57,48,10,69,78,67,79,68,73,78,71,32,49,48,54, 52,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,55,48,10,51,48,10,53,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,55,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,57,57,49, 10,69,78,67,79,68,73,78,71,32,49,48,54,52,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,56,10,49,48,10,49,48,10,50,48,10,50,48,10,52, 56,10,50,48,10,50,48,10,49,48,10,49,48,10,48,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,57,57,50,10,69,78, 67,79,68,73,78,71,32,49,48,54,52,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,48,10, 50,48,10,50,48,10,49,48,10,49,48,10,52,56,10,49, 48,10,49,48,10,50,48,10,50,48,10,52,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,57,57,51,10,69,78,67,79,68, 73,78,71,32,49,48,54,52,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 50,48,10,51,56,10,54,48,10,65,48,10,54,48,10,51, 56,10,50,48,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,57,57,52,10,69,78,67,79,68,73,78,71, 32,49,48,54,52,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,52,48,10,50,48,10, 69,48,10,51,48,10,50,56,10,51,48,10,69,48,10,50, 48,10,52,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 50,57,57,53,10,69,78,67,79,68,73,78,71,32,49,48, 54,52,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,56,10,53,48,10,68,48,10, 55,48,10,53,56,10,55,48,10,68,48,10,53,48,10,50, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,50,57,57, 54,10,69,78,67,79,68,73,78,71,32,49,48,54,52,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,65,48,10,53,48,10,53,56,10,55,48,10, 68,48,10,55,48,10,53,56,10,53,48,10,65,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,50,57,57,55,10,69, 78,67,79,68,73,78,71,32,49,48,54,52,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,50,48,10,54,48,10,54,48,10,54,48,10,54,48,10, 54,48,10,54,48,10,54,48,10,50,48,10,49,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,50,57,57,56,10,69,78,67,79, 68,73,78,71,32,49,48,54,52,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,48,10,50,48, 10,51,48,10,51,48,10,51,48,10,51,48,10,51,48,10, 51,48,10,51,48,10,50,48,10,52,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,50,57,70,67,10,69,78,67,79,68,73,78, 71,32,49,48,55,52,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,56,10,48,56,10,49,48, 10,49,48,10,50,48,10,52,48,10,50,48,10,49,48,10, 49,48,10,48,56,10,48,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,50,57,70,68,10,69,78,67,79,68,73,78,71,32,49, 48,55,52,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,52,48,10,52,48,10,50,48,10,50,48, 10,49,48,10,48,56,10,49,48,10,50,48,10,50,48,10, 52,48,10,52,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,50,65, 48,48,10,69,78,67,79,68,73,78,71,32,49,48,55,53, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,55,48,10,56,56,10,56,56,10,56,56,10,65,56, 10,65,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 55,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,50,65,48,49,10, 69,78,67,79,68,73,78,71,32,49,48,55,53,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,55, 48,10,65,56,10,65,56,10,65,56,10,65,56,10,70,56, 10,65,56,10,65,56,10,65,56,10,65,56,10,55,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,50,65,48,50,10,69,78,67, 79,68,73,78,71,32,49,48,55,53,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,55,48,10,56, 56,10,68,56,10,68,56,10,65,56,10,65,56,10,65,56, 10,68,56,10,68,56,10,56,56,10,55,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,50,65,48,51,10,69,78,67,79,68,73, 78,71,32,49,48,55,53,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,65,56, 10,65,56,10,56,56,10,55,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,50,65,48,52,10,69,78,67,79,68,73,78,71,32, 49,48,55,53,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,65,56,10,65,56,10,70,56,10,65,56, 10,65,56,10,55,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,50, 65,48,53,10,69,78,67,79,68,73,78,71,32,49,48,55, 53,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,70,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,50,65,48,54, 10,69,78,67,79,68,73,78,71,32,49,48,55,53,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,70,56, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,50,65,48,57,10,69,78, 67,79,68,73,78,71,32,49,48,55,54,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,56,56,10, 56,56,10,53,48,10,53,48,10,50,48,10,50,48,10,50, 48,10,53,48,10,53,48,10,56,56,10,56,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,50,65,49,68,10,69,78,67,79,68, 73,78,71,32,49,48,55,56,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 56,52,10,67,67,10,66,52,10,66,52,10,66,52,10,67, 67,10,56,52,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,50,65,51,70,10,69,78,67,79,68,73,78,71, 32,49,48,56,49,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,69,67,10,52,56,10, 52,56,10,52,56,10,52,56,10,52,56,10,52,56,10,52, 56,10,70,67,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,48,48,10,69,78,67,79,68,73,78,71,32,49,50, 50,56,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,48, 49,10,69,78,67,79,68,73,78,71,32,49,50,50,56,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,48,50,10,69, 78,67,79,68,73,78,71,32,49,50,50,57,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,53,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,48,51,10,69,78,67,79, 68,73,78,71,32,49,50,50,57,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,50,56,10,50,56,10,53,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,48,53,10,69,78,67,79,68,73,78, 71,32,49,50,50,57,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,55,56,10,52,56,10, 66,48,10,57,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,48,54,10,69,78,67,79,68,73,78,71,32,49, 50,50,57,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,56,10,53,48,10,65,48,10,66,48,10,67,48,10, 56,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 48,56,10,69,78,67,79,68,73,78,71,32,49,50,50,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,56,10,49,48,10,49,48,10,50,48,10,50,48, 10,52,48,10,50,48,10,50,48,10,49,48,10,49,48,10, 48,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,48,57,10, 69,78,67,79,68,73,78,71,32,49,50,50,57,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,52, 48,10,50,48,10,50,48,10,49,48,10,49,48,10,48,56, 10,49,48,10,49,48,10,50,48,10,50,48,10,52,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,48,65,10,69,78,67, 79,68,73,78,71,32,49,50,50,57,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,49,52,10,50, 56,10,50,56,10,53,48,10,53,48,10,65,48,10,53,48, 10,53,48,10,50,56,10,50,56,10,49,52,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,48,66,10,69,78,67,79,68,73, 78,71,32,49,50,50,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,65,48,10,53,48,10,53, 48,10,50,56,10,50,56,10,49,52,10,50,56,10,50,56, 10,53,48,10,53,48,10,65,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,48,67,10,69,78,67,79,68,73,78,71,32, 49,50,51,48,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,48,10,52,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,48,68,10,69,78,67,79,68,73,78,71,32,49,50,51, 48,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,48,69, 10,69,78,67,79,68,73,78,71,32,49,50,51,48,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 70,56,10,56,56,10,66,56,10,65,48,10,65,48,10,65, 48,10,65,48,10,65,48,10,65,48,10,69,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,48,70,10,69,78, 67,79,68,73,78,71,32,49,50,51,48,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 51,56,10,50,56,10,50,56,10,50,56,10,50,56,10,50, 56,10,50,56,10,69,56,10,56,56,10,70,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,49,48,10,69,78,67,79,68, 73,78,71,32,49,50,51,48,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,55,56,10,55,48,10, 55,48,10,54,48,10,54,48,10,54,48,10,54,48,10,54, 48,10,55,48,10,55,48,10,55,56,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,49,49,10,69,78,67,79,68,73,78,71, 32,49,50,51,48,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,56,10,51,56,10,51,56,10, 49,56,10,49,56,10,49,56,10,49,56,10,49,56,10,51, 56,10,51,56,10,55,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,49,50,10,69,78,67,79,68,73,78,71,32,49,50, 51,48,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,48,10,70,56,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,49, 51,10,69,78,67,79,68,73,78,71,32,49,50,51,48,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,70,56,10,48,48,10,70,56,10,70,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,49,52,10,69, 78,67,79,68,73,78,71,32,49,50,51,48,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,49,48, 10,50,48,10,52,48,10,52,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,50,48,10,49,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,49,53,10,69,78,67,79, 68,73,78,71,32,49,50,51,48,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,52,48,10,50,48, 10,49,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,50,48,10,52,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,49,54,10,69,78,67,79,68,73,78, 71,32,49,50,51,49,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,70,56,10,57,48,10,57,48, 10,65,48,10,65,48,10,65,48,10,65,48,10,65,48,10, 57,48,10,57,48,10,70,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,49,55,10,69,78,67,79,68,73,78,71,32,49, 50,51,49,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,70,56,10,52,56,10,52,56,10,50,56, 10,50,56,10,50,56,10,50,56,10,50,56,10,52,56,10, 52,56,10,70,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 49,56,10,69,78,67,79,68,73,78,71,32,49,50,51,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,56,10,49,48,10,51,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,51,48,10,49,48,10, 48,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,49,57,10, 69,78,67,79,68,73,78,71,32,49,50,51,49,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,52, 48,10,50,48,10,51,48,10,50,56,10,50,56,10,50,56, 10,50,56,10,50,56,10,51,48,10,50,48,10,52,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,49,65,10,69,78,67, 79,68,73,78,71,32,49,50,51,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,70,56,10,65, 48,10,65,48,10,65,48,10,65,48,10,65,48,10,65,48, 10,65,48,10,65,48,10,65,48,10,70,56,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,49,66,10,69,78,67,79,68,73, 78,71,32,49,50,51,49,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,70,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,50,56,10,50,56,10,50,56, 10,50,56,10,50,56,10,70,56,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,49,67,10,69,78,67,79,68,73,78,71,32, 49,50,51,49,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,57,56,10,54,52,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,49,68,10,69,78,67,79,68,73,78,71,32,49,50,51, 49,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,53,48,10,53,48,10,50,56,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,49,69, 10,69,78,67,79,68,73,78,71,32,49,50,51,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,50,56,10,50,56,10,53,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,49,70,10,69,78, 67,79,68,73,78,71,32,49,50,51,49,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,56,10,50,56,10,53,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,51,54,10,69,78,67,79,68, 73,78,71,32,49,50,51,52,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,55,48,10, 56,56,10,70,56,10,56,56,10,70,56,10,65,56,10,65, 56,10,56,56,10,55,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,51,70,10,69,78,67,79,68,73,78,71, 32,49,50,51,53,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,68,56,10, 68,56,10,65,56,10,65,56,10,65,56,10,68,56,10,68, 56,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,57,57,10,69,78,67,79,68,73,78,71,32,49,50, 52,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,56,10,48,52,10,48,56,10,48,52,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,57, 65,10,69,78,67,79,68,73,78,71,32,49,50,52,52,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,67,10,48,67,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,57,66,10,69, 78,67,79,68,73,78,71,32,49,50,52,52,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,52,48,10,50,48, 10,56,48,10,52,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,57,67,10,69,78,67,79, 68,73,78,71,32,49,50,52,52,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,52,48,10,65,48,10,52,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,65,49,10,69,78,67,79,68,73,78, 71,32,49,50,52,52,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,48,10,53,48,10,54,48,10, 52,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,65,50,10,69,78,67,79,68,73,78,71,32,49, 50,52,53,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,56,10,48,56,10,50,56, 10,50,56,10,51,48,10,50,48,10,50,48,10,52,48,10, 56,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 65,51,10,69,78,67,79,68,73,78,71,32,49,50,52,53, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,49,48,10,50,48,10,54,48,10,65,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,65,52,10, 69,78,67,79,68,73,78,71,32,49,50,52,53,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,56,10,49,48,10,50,48,10,54,48,10,65,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,65,53,10,69,78,67, 79,68,73,78,71,32,49,50,52,53,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,52,48,10,69,48, 10,65,48,10,50,48,10,52,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,65,54,10,69,78,67,79,68,73, 78,71,32,49,50,52,53,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,50,48,10,50,48,10,70, 56,10,56,56,10,56,56,10,48,56,10,48,56,10,49,48, 10,50,48,10,52,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,65,55,10,69,78,67,79,68,73,78,71,32, 49,50,52,53,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,50,48,10,50,48,10,50,48, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,65,56,10,69,78,67,79,68,73,78,71,32,49,50,52, 53,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,55,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,70,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,65,57, 10,69,78,67,79,68,73,78,71,32,49,50,52,53,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,50, 48,10,70,48,10,50,48,10,54,48,10,65,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,65,65,10,69,78, 67,79,68,73,78,71,32,49,50,52,53,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 49,48,10,49,48,10,70,56,10,49,48,10,51,48,10,53, 48,10,57,48,10,49,48,10,51,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,65,66,10,69,78,67,79,68, 73,78,71,32,49,50,52,53,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,70,56,10,50,56,10,50,56,10,50,56,10,52, 56,10,52,56,10,57,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,65,67,10,69,78,67,79,68,73,78,71, 32,49,50,52,54,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,56,10,48,52,10,50,56,10,50,52,10, 70,56,10,50,56,10,50,56,10,50,56,10,52,56,10,52, 56,10,57,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,65,68,10,69,78,67,79,68,73,78,71,32,49,50, 52,54,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,52,48,10,53,56,10, 69,48,10,50,48,10,51,56,10,68,48,10,49,48,10,49, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,65, 69,10,69,78,67,79,68,73,78,71,32,49,50,52,54,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,56, 10,48,52,10,52,56,10,52,52,10,53,56,10,69,48,10, 50,48,10,51,56,10,68,48,10,49,48,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,65,70,10,69, 78,67,79,68,73,78,71,32,49,50,52,54,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,56,10,52,56,10,52,56,10,56,56,10,48,56,10, 49,48,10,49,48,10,50,48,10,52,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,66,48,10,69,78,67,79, 68,73,78,71,32,49,50,52,54,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,56,10,48,52,10,55,56, 10,52,67,10,52,56,10,56,56,10,48,56,10,49,48,10, 49,48,10,50,48,10,52,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,66,49,10,69,78,67,79,68,73,78, 71,32,49,50,52,54,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,52,48,10,52,48, 10,55,56,10,57,48,10,49,48,10,49,48,10,50,48,10, 50,48,10,52,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,66,50,10,69,78,67,79,68,73,78,71,32,49, 50,52,54,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,56,10,48,52,10,52,56,10,52,52,10,55,56, 10,57,48,10,49,48,10,49,48,10,50,48,10,50,48,10, 52,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 66,51,10,69,78,67,79,68,73,78,71,32,49,50,52,54, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,48,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,48,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,66,52,10, 69,78,67,79,68,73,78,71,32,49,50,52,54,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,56,10,48, 52,10,48,56,10,70,67,10,48,56,10,48,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,66,53,10,69,78,67, 79,68,73,78,71,32,49,50,52,54,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,53, 48,10,53,48,10,70,56,10,53,48,10,53,48,10,49,48, 10,50,48,10,50,48,10,52,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,66,54,10,69,78,67,79,68,73, 78,71,32,49,50,52,55,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,56,10,48,52,10,53,56,10,53, 52,10,70,56,10,53,48,10,53,48,10,49,48,10,50,48, 10,50,48,10,52,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,66,55,10,69,78,67,79,68,73,78,71,32, 49,50,52,55,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,67,48,10,48, 56,10,67,56,10,48,56,10,48,56,10,49,48,10,50,48, 10,67,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,66,56,10,69,78,67,79,68,73,78,71,32,49,50,52, 55,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,56,10,48,52,10,48,56,10,67,52,10,48,56,10,67, 56,10,48,56,10,48,56,10,49,48,10,50,48,10,67,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,66,57, 10,69,78,67,79,68,73,78,71,32,49,50,52,55,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,48,56,10,48,56,10,49,48,10,49, 48,10,51,48,10,51,48,10,52,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,66,65,10,69,78, 67,79,68,73,78,71,32,49,50,52,55,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,56,10,48,52,10, 70,56,10,48,67,10,48,56,10,49,48,10,49,48,10,51, 48,10,51,48,10,52,56,10,56,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,66,66,10,69,78,67,79,68, 73,78,71,32,49,50,52,55,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,52,48,10, 52,48,10,55,56,10,67,56,10,53,48,10,52,48,10,52, 48,10,52,48,10,51,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,66,67,10,69,78,67,79,68,73,78,71, 32,49,50,52,55,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,56,10,48,52,10,52,56,10,52,52,10, 55,56,10,67,56,10,53,48,10,52,48,10,52,48,10,52, 48,10,51,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,66,68,10,69,78,67,79,68,73,78,71,32,49,50, 52,55,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,56,56,10,52,56,10, 52,56,10,49,48,10,49,48,10,50,48,10,50,48,10,52, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,66, 69,10,69,78,67,79,68,73,78,71,32,49,50,52,55,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,56, 10,48,52,10,48,56,10,56,67,10,52,56,10,52,56,10, 49,48,10,49,48,10,50,48,10,50,48,10,52,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,66,70,10,69, 78,67,79,68,73,78,71,32,49,50,52,55,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,55,56,10,52,56,10,52,56,10,54,56,10,57,56,10, 49,48,10,49,48,10,50,48,10,52,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,67,48,10,69,78,67,79, 68,73,78,71,32,49,50,52,56,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,56,10,48,52,10,55,56, 10,52,67,10,52,56,10,54,56,10,57,56,10,49,48,10, 49,48,10,50,48,10,52,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,67,49,10,69,78,67,79,68,73,78, 71,32,49,50,52,56,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,49,48,10,50,48, 10,54,48,10,50,48,10,70,56,10,50,48,10,50,48,10, 52,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,67,50,10,69,78,67,79,68,73,78,71,32,49, 50,52,56,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,56,10,48,52,10,49,56,10,50,52,10,54,48, 10,50,48,10,70,56,10,50,48,10,50,48,10,52,48,10, 56,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 67,51,10,69,78,67,79,68,73,78,71,32,49,50,52,56, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,65,56,10,65,56,10,48,56,10,49,48,10,69,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,67,52,10, 69,78,67,79,68,73,78,71,32,49,50,52,56,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,65,56,10,65,56,10,65,56,10,48,56, 10,48,56,10,49,48,10,50,48,10,67,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,67,53,10,69,78,67, 79,68,73,78,71,32,49,50,52,56,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,56,10,48,52,10,48, 56,10,65,67,10,65,56,10,65,56,10,48,56,10,48,56, 10,49,48,10,50,48,10,67,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,67,54,10,69,78,67,79,68,73, 78,71,32,49,50,52,56,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,55,48,10,48, 48,10,48,48,10,70,56,10,50,48,10,50,48,10,50,48, 10,52,48,10,52,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,67,55,10,69,78,67,79,68,73,78,71,32, 49,50,52,56,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,56,10,48,52,10,55,56,10,48,52,10,48, 48,10,70,56,10,50,48,10,50,48,10,50,48,10,52,48, 10,52,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,67,56,10,69,78,67,79,68,73,78,71,32,49,50,52, 56,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,56,48,10,56,48,10,56,48,10,67, 48,10,65,48,10,57,48,10,56,48,10,56,48,10,56,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,67,57, 10,69,78,67,79,68,73,78,71,32,49,50,52,56,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,48,10,56,56,10,57,48,10,56,56,10,67,48,10,65, 48,10,57,48,10,56,48,10,56,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,67,65,10,69,78, 67,79,68,73,78,71,32,49,50,52,57,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 50,48,10,50,48,10,70,56,10,50,48,10,50,48,10,50, 48,10,52,48,10,52,48,10,56,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,67,66,10,69,78,67,79,68, 73,78,71,32,49,50,52,57,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,67,67,10,69,78,67,79,68,73,78,71, 32,49,50,52,57,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,56,10,52,56,10,51,48,10,49,48,10,50,56,10,52, 48,10,56,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,67,68,10,69,78,67,79,68,73,78,71,32,49,50, 52,57,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,70,56,10, 49,48,10,50,48,10,55,48,10,65,56,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,67, 69,10,69,78,67,79,68,73,78,71,32,49,50,52,57,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,48,56,10,48,56,10,48,56,10, 49,48,10,49,48,10,50,48,10,52,48,10,56,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,67,70,10,69, 78,67,79,68,73,78,71,32,49,50,52,57,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,53,48,10,53,48,10,53,48,10,52,56,10, 52,56,10,56,56,10,56,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,68,48,10,69,78,67,79, 68,73,78,71,32,49,50,52,57,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,56,10,48,52,10,48,56, 10,53,52,10,53,48,10,53,48,10,52,56,10,52,56,10, 56,56,10,56,56,10,56,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,68,49,10,69,78,67,79,68,73,78, 71,32,49,50,52,57,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,67,10,48,67,10,53,48, 10,53,48,10,53,48,10,52,56,10,52,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,68,50,10,69,78,67,79,68,73,78,71,32,49, 50,52,57,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,56,48,10,56,48,10,70,56, 10,56,48,10,56,48,10,56,48,10,56,48,10,56,48,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 68,51,10,69,78,67,79,68,73,78,71,32,49,50,52,57, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 56,10,48,52,10,56,56,10,56,52,10,70,56,10,56,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,55,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,68,52,10, 69,78,67,79,68,73,78,71,32,49,50,53,48,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 67,10,56,67,10,56,48,10,70,56,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,55,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,68,53,10,69,78,67, 79,68,73,78,71,32,49,50,53,48,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,48,56,10,48,56,10,48,56,10,49,48, 10,49,48,10,50,48,10,67,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,68,54,10,69,78,67,79,68,73, 78,71,32,49,50,53,48,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,56,10,48,52,10,48,56,10,70, 67,10,48,56,10,48,56,10,48,56,10,49,48,10,49,48, 10,50,48,10,67,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,68,55,10,69,78,67,79,68,73,78,71,32, 49,50,53,48,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,67,10,48,67,10,48,48,10,70,56,10,48, 56,10,48,56,10,48,56,10,49,48,10,49,48,10,50,48, 10,67,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,68,56,10,69,78,67,79,68,73,78,71,32,49,50,53, 48,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,50,48,10,50,48,10,53, 48,10,53,48,10,57,48,10,48,56,10,48,56,10,48,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,68,57, 10,69,78,67,79,68,73,78,71,32,49,50,53,48,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,50,52,10,50,56,10,53,52,10,53, 48,10,57,48,10,48,56,10,48,56,10,48,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,68,65,10,69,78, 67,79,68,73,78,71,32,49,50,53,48,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,67,10,50,67,10,50,48,10,53,48,10,53,48,10,57, 48,10,48,56,10,48,56,10,48,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,68,66,10,69,78,67,79,68, 73,78,71,32,49,50,53,48,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 50,48,10,70,56,10,50,48,10,50,48,10,65,56,10,65, 56,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,68,67,10,69,78,67,79,68,73,78,71, 32,49,50,53,48,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,56,10,48,52,10,50,56,10,50,52,10, 70,56,10,50,48,10,50,48,10,65,56,10,65,56,10,50, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,68,68,10,69,78,67,79,68,73,78,71,32,49,50, 53,48,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,67,10,50,67,10,50,48,10,70,56,10, 50,48,10,50,48,10,65,56,10,65,56,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,68, 69,10,69,78,67,79,68,73,78,71,32,49,50,53,49,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,48,56,10,48,56,10,48,56,10, 49,48,10,53,48,10,54,48,10,50,48,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,68,70,10,69, 78,67,79,68,73,78,71,32,49,50,53,49,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,67,48,10,51,48,10,48,48,10,67,48,10,51,48,10, 48,48,10,56,48,10,54,48,10,49,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,69,48,10,69,78,67,79, 68,73,78,71,32,49,50,53,49,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,49,48,10,49,48,10,50,48,10,50,48,10,53,48,10, 52,56,10,57,56,10,69,52,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,69,49,10,69,78,67,79,68,73,78, 71,32,49,50,53,49,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,48,56, 10,48,56,10,50,56,10,49,48,10,49,48,10,50,56,10, 52,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,69,50,10,69,78,67,79,68,73,78,71,32,49, 50,53,49,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,48,10,52,48,10,52,48, 10,70,56,10,52,48,10,52,48,10,52,48,10,52,48,10, 51,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 69,51,10,69,78,67,79,68,73,78,71,32,49,50,53,49, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,52,48,10,55,56,10,67,56,10,50,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,69,52,10, 69,78,67,79,68,73,78,71,32,49,50,53,49,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,52,48,10,52,48,10,55,56,10,67,56,10,51,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,69,53,10,69,78,67, 79,68,73,78,71,32,49,50,53,49,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,54,48,10,50,48, 10,50,48,10,50,48,10,70,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,69,54,10,69,78,67,79,68,73, 78,71,32,49,50,53,49,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,55, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,49,48, 10,49,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,69,55,10,69,78,67,79,68,73,78,71,32, 49,50,53,49,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,48,10,49,48,10,70,48,10,49,48, 10,70,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,69,56,10,69,78,67,79,68,73,78,71,32,49,50,53, 50,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,70,56,10,48,56,10,48, 56,10,70,56,10,48,56,10,48,56,10,48,56,10,70,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,69,57, 10,69,78,67,79,68,73,78,71,32,49,50,53,50,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,70,56,10,48,48,10,70,56,10,48,56,10,48, 56,10,48,56,10,49,48,10,50,48,10,67,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,69,65,10,69,78, 67,79,68,73,78,71,32,49,50,53,50,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,56,10,49, 48,10,49,48,10,50,48,10,52,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,69,66,10,69,78,67,79,68, 73,78,71,32,49,50,53,50,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 53,48,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,57,56,10,57,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,69,67,10,69,78,67,79,68,73,78,71, 32,49,50,53,50,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,56,10,57, 48,10,69,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,69,68,10,69,78,67,79,68,73,78,71,32,49,50, 53,50,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,56,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,56,56,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,69, 69,10,69,78,67,79,68,73,78,71,32,49,50,53,50,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 56,56,10,48,56,10,48,56,10,49,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,48,69,70,10,69, 78,67,79,68,73,78,71,32,49,50,53,50,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,56,56,10,56,56,10,48,56,10, 48,56,10,48,56,10,49,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,48,70,48,10,69,78,67,79, 68,73,78,71,32,49,50,53,50,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,49,48,10,70,56,10,53,48,10,53,48,10,70,56,10, 49,48,10,49,48,10,49,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,48,70,49,10,69,78,67,79,68,73,78, 71,32,49,50,53,50,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,55,56, 10,48,56,10,51,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,70,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,48,70,50,10,69,78,67,79,68,73,78,71,32,49, 50,53,51,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,70,56,10,48,56, 10,70,56,10,48,56,10,48,56,10,49,48,10,50,48,10, 67,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,48, 70,51,10,69,78,67,79,68,73,78,71,32,49,50,53,51, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,56,48,10,52,48,10,48,56, 10,48,56,10,48,56,10,49,48,10,50,48,10,67,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,48,70,52,10, 69,78,67,79,68,73,78,71,32,49,50,53,51,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,56,10,50, 52,10,50,56,10,70,67,10,56,56,10,56,56,10,48,56, 10,48,56,10,49,48,10,50,48,10,52,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,48,70,53,10,69,78,67, 79,68,73,78,71,32,49,50,53,51,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,70,56,10,50,56, 10,52,56,10,52,56,10,57,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,48,70,54,10,69,78,67,79,68,73, 78,71,32,49,50,53,51,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,52,48,10,55,56,10,57,48,10,49,48, 10,50,48,10,52,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,48,70,55,10,69,78,67,79,68,73,78,71,32, 49,50,53,51,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,56,10,48,52,10,48,56,10,70,67,10,56, 56,10,56,56,10,48,56,10,48,56,10,48,56,10,49,48, 10,54,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 48,70,56,10,69,78,67,79,68,73,78,71,32,49,50,53, 51,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,56,10,48,52,10,49,56,10,49,52,10,70,56,10,53, 48,10,53,48,10,70,56,10,49,48,10,49,48,10,49,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,48,70,57, 10,69,78,67,79,68,73,78,71,32,49,50,53,51,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,56,10, 48,52,10,48,56,10,48,52,10,55,56,10,48,56,10,51, 48,10,50,48,10,50,48,10,50,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,48,70,65,10,69,78, 67,79,68,73,78,71,32,49,50,53,51,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,56,10,48,52,10, 48,56,10,70,67,10,48,56,10,70,56,10,48,56,10,48, 56,10,49,48,10,50,48,10,67,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,48,70,66,10,69,78,67,79,68, 73,78,71,32,49,50,53,51,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,55,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,48,70,67,10,69,78,67,79,68,73,78,71, 32,49,50,53,52,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,48,70,68,10,69,78,67,79,68,73,78,71,32,49,50, 53,52,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 52,48,10,50,48,10,49,48,10,49,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,48,70, 69,10,69,78,67,79,68,73,78,71,32,49,50,53,52,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,49,48,10,48,56,10,49,48,10,52,56,10, 50,48,10,49,48,10,49,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,49,48,53,10,69, 78,67,79,68,73,78,71,32,49,50,53,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,52,48,10,52,48,10,70,56,10,48,56,10, 48,56,10,48,56,10,50,56,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,49,48,54,10,69,78,67,79, 68,73,78,71,32,49,50,53,53,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,52,48,10,52,48,10,70,56,10,48,56,10,53,48,10, 53,48,10,50,48,10,68,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,49,48,55,10,69,78,67,79,68,73,78, 71,32,49,50,53,53,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,49,48,56,10,69,78,67,79,68,73,78,71,32,49, 50,53,53,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,56,48,10,56,48,10,56,48,10,56,48,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,49, 48,57,10,69,78,67,79,68,73,78,71,32,49,50,53,53, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,52,48,10,56,48,10,70,56, 10,50,56,10,50,56,10,50,56,10,52,56,10,57,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,49,48,65,10, 69,78,67,79,68,73,78,71,32,49,50,53,53,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,70,56, 10,50,48,10,50,48,10,52,56,10,70,56,10,48,56,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,49,48,66,10,69,78,67, 79,68,73,78,71,32,49,50,53,53,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,49,48,10,51,56,10,48,56, 10,48,56,10,50,56,10,49,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,49,48,67,10,69,78,67,79,68,73, 78,71,32,49,50,53,53,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,50,48,10,65,48,10,70,56,10,50,56,10,52,56, 10,52,56,10,57,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,49,48,68,10,69,78,67,79,68,73,78,71,32, 49,50,53,53,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,56,10,52,56,10,57,48,10,57,48,10,52,56, 10,52,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 49,48,69,10,69,78,67,79,68,73,78,71,32,49,50,53, 53,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,50,48,10,55,56,10,48,56,10,48,56,10,51,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,49,48,70, 10,69,78,67,79,68,73,78,71,32,49,50,53,53,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,56,10,52, 48,10,52,48,10,52,48,10,52,48,10,56,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,49,49,48,10,69,78, 67,79,68,73,78,71,32,49,50,53,54,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,56,10,52,56,10,53, 56,10,54,56,10,48,56,10,49,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,49,49,49,10,69,78,67,79,68, 73,78,71,32,49,50,53,54,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,49,48,10,49,48,10,50,48,10,50, 48,10,49,48,10,49,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,49,49,50,10,69,78,67,79,68,73,78,71, 32,49,50,53,54,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,50,48,10,49,48,10,49,48,10,49, 48,10,50,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,49,49,51,10,69,78,67,79,68,73,78,71,32,49,50, 53,54,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 65,56,10,65,56,10,65,56,10,70,56,10,50,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,49,49, 52,10,69,78,67,79,68,73,78,71,32,49,50,53,54,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,48,10,54,48,10, 48,56,10,55,48,10,65,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,49,49,53,10,69, 78,67,79,68,73,78,71,32,49,50,53,54,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,56,10,48,56,10, 55,56,10,52,48,10,52,48,10,52,48,10,56,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,49,49,54,10,69,78,67,79, 68,73,78,71,32,49,50,53,54,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,56,56,10,67,56,10,65,56,10, 65,56,10,56,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,49,49,55,10,69,78,67,79,68,73,78, 71,32,49,50,53,54,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,52,56,10,52,56,10,52,56,10,52,56,10, 52,56,10,53,56,10,52,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,49,49,56,10,69,78,67,79,68,73,78,71,32,49, 50,53,54,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,50,48,10,50,48, 10,70,56,10,52,48,10,55,56,10,48,56,10,49,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,49, 49,57,10,69,78,67,79,68,73,78,71,32,49,50,53,54, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,50,48,10,50,48,10,52,48,10,52,56,10,70,56,10, 48,56,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,49,49,65,10, 69,78,67,79,68,73,78,71,32,49,50,53,55,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,56,10,53,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,49,49,66,10,69,78,67, 79,68,73,78,71,32,49,50,53,55,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,50,48,10,54,48, 10,56,48,10,56,56,10,55,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,49,49,67,10,69,78,67,79,68,73, 78,71,32,49,50,53,55,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,50,48,10,70,56,10,50,48,10,54,48,10,56,48, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,49,49,68,10,69,78,67,79,68,73,78,71,32, 49,50,53,55,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,53, 48,10,70,56,10,53,48,10,53,48,10,53,48,10,52,48, 10,55,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 49,49,69,10,69,78,67,79,68,73,78,71,32,49,50,53, 55,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,70, 56,10,53,48,10,53,48,10,55,56,10,50,56,10,67,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,49,49,70, 10,69,78,67,79,68,73,78,71,32,49,50,53,55,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,50, 48,10,68,48,10,49,48,10,48,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,49,50,48,10,69,78, 67,79,68,73,78,71,32,49,50,53,55,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,52,56,10,70,48,10,50, 48,10,52,48,10,53,48,10,70,56,10,48,56,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,49,50,49,10,69,78,67,79,68, 73,78,71,32,49,50,53,55,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,56,10,53,48,10,53, 48,10,50,48,10,68,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,49,50,50,10,69,78,67,79,68,73,78,71, 32,49,50,53,55,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,53,48,10,53,48,10,70,56,10,48, 56,10,48,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,49,50,51,10,69,78,67,79,68,73,78,71,32,49,50, 53,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,56,48,10, 56,48,10,56,48,10,70,56,10,48,56,10,48,56,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,49,50, 52,10,69,78,67,79,68,73,78,71,32,49,50,53,56,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 70,56,10,50,48,10,53,48,10,53,48,10,57,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,49,50,53,10,69, 78,67,79,68,73,78,71,32,49,50,53,56,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,49,48,10,50,48,10, 50,48,10,52,48,10,52,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,49,50,54,10,69,78,67,79, 68,73,78,71,32,49,50,53,56,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,53,48,10,53,48,10,53,48,10, 53,48,10,53,48,10,53,56,10,56,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,49,50,55,10,69,78,67,79,68,73,78, 71,32,49,50,53,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,49,50,56,10,69,78,67,79,68,73,78,71,32,49, 50,53,56,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,67,56,10,50,56,10,49,48,10,51,48,10,52,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,49, 50,57,10,69,78,67,79,68,73,78,71,32,49,50,53,56, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,49,50,65,10, 69,78,67,79,68,73,78,71,32,49,50,53,56,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,50,48,10,50,48, 10,51,56,10,52,56,10,52,56,10,57,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,49,50,66,10,69,78,67, 79,68,73,78,71,32,49,50,53,56,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,53,48,10,53,48,10,53,48, 10,53,48,10,53,48,10,57,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,49,50,67,10,69,78,67,79,68,73, 78,71,32,49,50,53,56,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,49,48,10,55,56,10,52,48,10,52,48,10,52,48, 10,52,48,10,56,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,49,51,49,10,69,78,67,79,68,73,78,71,32, 49,50,53,57,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,56,10,48, 56,10,48,56,10,48,56,10,48,56,10,48,56,10,49,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 49,51,50,10,69,78,67,79,68,73,78,71,32,49,50,53, 57,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,70,56,10,50,56,10,50, 56,10,50,56,10,50,56,10,50,56,10,53,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,49,51,51, 10,69,78,67,79,68,73,78,71,32,49,50,53,57,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,67,56,10,52,56,10,53,48,10,53, 48,10,53,56,10,54,56,10,65,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,49,51,52,10,69,78, 67,79,68,73,78,71,32,49,50,53,57,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,49,51,53,10,69,78,67,79,68, 73,78,71,32,49,50,53,57,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 66,56,10,57,48,10,57,48,10,57,48,10,65,56,10,65, 56,10,69,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,49,51,54,10,69,78,67,79,68,73,78,71, 32,49,50,53,57,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,66,56,10, 56,48,10,66,56,10,56,48,10,66,56,10,65,56,10,68, 56,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,49,51,55,10,69,78,67,79,68,73,78,71,32,49,50, 53,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,70,56,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,70,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,49,51, 56,10,69,78,67,79,68,73,78,71,32,49,50,54,48,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,70,56,10,65,48,10,65,48,10, 65,48,10,65,48,10,65,48,10,70,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,49,51,57,10,69, 78,67,79,68,73,78,71,32,49,50,54,48,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,48,56,10,48,56,10,70,56,10, 56,48,10,56,48,10,70,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,49,51,65,10,69,78,67,79, 68,73,78,71,32,49,50,54,48,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,70,56,10,50,56,10,50,56,10,69,56,10,56,56,10, 65,56,10,67,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,49,51,66,10,69,78,67,79,68,73,78, 71,32,49,50,54,48,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,68,67, 10,53,52,10,53,52,10,68,52,10,57,52,10,66,52,10, 68,67,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,49,51,67,10,69,78,67,79,68,73,78,71,32,49, 50,54,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,68,52,10,53,52, 10,53,52,10,68,67,10,57,52,10,66,52,10,68,67,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,49, 51,68,10,69,78,67,79,68,73,78,71,32,49,50,54,48, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,69,52,10,50,52,10,50,56, 10,69,56,10,57,52,10,66,52,10,68,52,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,49,51,69,10, 69,78,67,79,68,73,78,71,32,49,50,54,48,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,68,56,10,53,48,10,53,48,10,68,56, 10,57,48,10,66,48,10,68,56,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,49,51,70,10,69,78,67, 79,68,73,78,71,32,49,50,54,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,68,67,10,52,48,10,53,52,10,68,52,10,57,52, 10,65,56,10,68,67,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,49,52,48,10,69,78,67,79,68,73, 78,71,32,49,50,54,48,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,69, 67,10,50,48,10,51,67,10,69,56,10,57,67,10,66,52, 10,68,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,49,52,49,10,69,78,67,79,68,73,78,71,32, 49,50,54,48,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,70,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 49,52,50,10,69,78,67,79,68,73,78,71,32,49,50,54, 49,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,70,56,10,56,56,10,56,56,10,70,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,49,52,51, 10,69,78,67,79,68,73,78,71,32,49,50,54,49,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,65,56,10,65,56,10,65,56,10,70, 56,10,65,56,10,65,56,10,70,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,49,52,52,10,69,78, 67,79,68,73,78,71,32,49,50,54,49,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,65,56,10,65,56,10,65,56,10,69,56,10,66, 52,10,66,52,10,68,52,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,49,52,53,10,69,78,67,79,68, 73,78,71,32,49,50,54,49,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 49,48,10,49,48,10,50,48,10,50,48,10,53,48,10,53, 48,10,56,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,49,52,54,10,69,78,67,79,68,73,78,71, 32,49,50,54,49,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,50,56,10, 50,56,10,53,48,10,53,48,10,53,56,10,65,56,10,65, 52,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,49,52,55,10,69,78,67,79,68,73,78,71,32,49,50, 54,49,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,51,48,10,52,56,10, 56,52,10,56,52,10,56,52,10,52,56,10,51,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,49,52, 56,10,69,78,67,79,68,73,78,71,32,49,50,54,49,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,70,56,10,48,56,10,49,48,10, 51,48,10,52,56,10,52,56,10,56,52,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,49,52,57,10,69, 78,67,79,68,73,78,71,32,49,50,54,49,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,53,48,10,53,48,10,53,48,10, 65,56,10,65,56,10,65,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,49,52,65,10,69,78,67,79, 68,73,78,71,32,49,50,54,49,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,55,48,10,48,48,10,70,56,10,50,48,10,50,48,10, 53,48,10,56,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,49,52,66,10,69,78,67,79,68,73,78, 71,32,49,50,54,49,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,56,10,48,56,10,70,56,10,48,56,10,48,56,10, 49,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,49,52,67,10,69,78,67,79,68,73,78,71,32,49, 50,54,50,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,70,56,10,56,48, 10,56,48,10,70,56,10,56,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,49, 52,68,10,69,78,67,79,68,73,78,71,32,49,50,54,50, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,70,56,10,53,48,10,53,48, 10,53,48,10,53,48,10,53,48,10,70,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,49,52,69,10, 69,78,67,79,68,73,78,71,32,49,50,54,50,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,48,48,10,70,56,10,48,48,10,55,48, 10,56,56,10,56,56,10,55,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,49,52,70,10,69,78,67, 79,68,73,78,71,32,49,50,54,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,50,48,10,51,56,10,50,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,49,53,48,10,69,78,67,79,68,73, 78,71,32,49,50,54,50,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,56,10,52, 56,10,52,56,10,55,56,10,52,56,10,52,56,10,52,56, 10,48,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,49,53,49,10,69,78,67,79,68,73,78,71,32, 49,50,54,50,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,50,48,10,51, 56,10,50,48,10,51,56,10,50,48,10,50,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 49,53,50,10,69,78,67,79,68,73,78,71,32,49,50,54, 50,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,56,10,52,56,10,55,56,10,52, 56,10,55,56,10,52,56,10,52,56,10,48,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,49,53,51, 10,69,78,67,79,68,73,78,71,32,49,50,54,50,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,48,56,10,48,56,10,51,56,10,48, 56,10,48,56,10,48,56,10,48,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,51,49,53,52,10,69,78, 67,79,68,73,78,71,32,49,50,54,50,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,56,10,50,56,10,50,56,10,69,56,10,50,56,10,50, 56,10,50,56,10,48,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,51,49,53,53,10,69,78,67,79,68, 73,78,71,32,49,50,54,50,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,56,10, 48,56,10,51,56,10,48,56,10,51,56,10,48,56,10,48, 56,10,48,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,51,49,53,54,10,69,78,67,79,68,73,78,71, 32,49,50,54,51,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,56,10,50,56,10, 69,56,10,50,56,10,69,56,10,50,56,10,50,56,10,48, 56,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 51,49,53,55,10,69,78,67,79,68,73,78,71,32,49,50, 54,51,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,50,48,10,70,56,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,51,49,53, 56,10,69,78,67,79,68,73,78,71,32,49,50,54,51,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,48,56,10,48,56,10,52,56,10, 52,67,10,53,56,10,69,56,10,48,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,51,49,53,57,10,69, 78,67,79,68,73,78,71,32,49,50,54,51,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,52,10,49,52,10,49,52,10,53,67,10,53,52,10, 55,52,10,68,52,10,48,52,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,51,49,53,65,10,69,78,67,79, 68,73,78,71,32,49,50,54,51,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,56, 10,48,56,10,52,56,10,52,56,10,53,56,10,69,56,10, 48,56,10,48,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,51,49,53,66,10,69,78,67,79,68,73,78, 71,32,49,50,54,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,53,48,10,53,48,10,53,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,51,49,53,67,10,69,78,67,79,68,73,78,71,32,49, 50,54,51,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,50,48,10,50,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,51,49, 53,68,10,69,78,67,79,68,73,78,71,32,49,50,54,51, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,56,10,48,56,10,48,56,10,49,56, 10,69,56,10,52,56,10,55,56,10,52,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,51,49,53,69,10, 69,78,67,79,68,73,78,71,32,49,50,54,51,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,52,10,49,52,10,49,52,10,49,52,10,70,52, 10,53,52,10,55,52,10,53,52,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,51,49,53,70,10,69,78,67, 79,68,73,78,71,32,49,50,54,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 56,10,48,56,10,48,56,10,49,56,10,69,56,10,52,56, 10,52,56,10,52,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,51,49,54,48,10,69,78,67,79,68,73, 78,71,32,49,50,54,52,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,53,48,10,53,48, 10,53,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,51,49,54,49,10,69,78,67,79,68,73,78,71,32, 49,50,54,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,51, 49,54,50,10,69,78,67,79,68,73,78,71,32,49,50,54, 52,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,49,56,10,69,56,10,48,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,51,49,54,51, 10,69,78,67,79,68,73,78,71,32,49,50,54,52,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,56,10,48,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,48,56,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,48,48,10,69,78, 67,79,68,73,78,71,32,53,55,51,52,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,66,48,10,67, 56,10,56,56,10,65,56,10,66,48,10,56,48,10,56,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,48,49,10,69,78,67,79,68, 73,78,71,32,53,55,51,52,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,66,48,10,67,56,10,56, 56,10,57,48,10,70,56,10,56,48,10,56,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,48,50,10,69,78,67,79,68,73,78,71, 32,53,55,51,52,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,54,56,10,57,56,10,56,56,10,57, 56,10,54,56,10,48,56,10,48,56,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,48,51,10,69,78,67,79,68,73,78,71,32,53,55, 51,52,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,56,10,56,56,10,56,56,10,56,56,10,55, 56,10,48,56,10,48,56,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,48, 52,10,69,78,67,79,68,73,78,71,32,53,55,51,52,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 68,48,10,65,56,10,65,56,10,65,56,10,68,48,10,56, 48,10,56,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,48,53,10,69, 78,67,79,68,73,78,71,32,53,55,51,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,68,48,10, 65,56,10,65,56,10,65,56,10,70,56,10,56,48,10,56, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,48,54,10,69,78,67,79, 68,73,78,71,32,53,55,51,53,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,53,56,10,65,56,10, 65,56,10,65,56,10,53,56,10,48,56,10,48,56,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,48,55,10,69,78,67,79,68,73,78, 71,32,53,55,51,53,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,56,10,65,56,10,65,56,10, 65,56,10,70,56,10,48,56,10,48,56,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,48,56,10,69,78,67,79,68,73,78,71,32,53, 55,51,53,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,56,48, 10,56,48,10,66,48,10,67,56,10,56,56,10,65,56,10, 66,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 48,57,10,69,78,67,79,68,73,78,71,32,53,55,51,53, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,48,10,56,48, 10,66,48,10,67,56,10,56,56,10,57,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,48,65,10, 69,78,67,79,68,73,78,71,32,53,55,51,53,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,56,10,48,56,10,51,56, 10,52,56,10,56,56,10,57,56,10,54,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,69,48,48,66,10,69,78,67, 79,68,73,78,71,32,53,55,51,53,53,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,48,56,10,55,56,10,56,56, 10,56,56,10,56,56,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,69,48,48,67,10,69,78,67,79,68,73, 78,71,32,53,55,51,53,54,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,56,48,10,56,48,10,68,48,10,65,56,10,65,56, 10,65,56,10,68,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,69,48,48,68,10,69,78,67,79,68,73,78,71,32, 53,55,51,53,55,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,56, 48,10,56,48,10,68,48,10,65,56,10,65,56,10,65,56, 10,70,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,69, 48,48,69,10,69,78,67,79,68,73,78,71,32,53,55,51, 53,56,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,56,10,48, 56,10,53,56,10,65,56,10,65,56,10,65,56,10,53,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,69,48,48,70, 10,69,78,67,79,68,73,78,71,32,53,55,51,53,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,56,10,48,56,10,70, 56,10,65,56,10,65,56,10,65,56,10,53,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,49,48,10,69,78, 67,79,68,73,78,71,32,53,55,51,54,48,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,68,48,10,65, 56,10,65,56,10,65,56,10,68,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,49,49,10,69,78,67,79,68, 73,78,71,32,53,55,51,54,49,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,68,48,10,65,56,10,65, 56,10,65,56,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,49,50,10,69,78,67,79,68,73,78,71, 32,53,55,51,54,50,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,53,56,10,65,56,10,65,56,10,65, 56,10,53,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,49,51,10,69,78,67,79,68,73,78,71,32,53,55, 51,54,51,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,56,10,65,56,10,65,56,10,65,56,10,53, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,49, 52,10,69,78,67,79,68,73,78,71,32,53,55,51,54,52, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 66,48,10,67,56,10,56,56,10,65,56,10,66,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,49,53,10,69, 78,67,79,68,73,78,71,32,53,55,51,54,53,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,66,48,10, 67,56,10,56,56,10,57,48,10,70,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,49,54,10,69,78,67,79, 68,73,78,71,32,53,55,51,54,54,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,55,56,10,56,56,10, 56,56,10,57,56,10,54,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,49,55,10,69,78,67,79,68,73,78, 71,32,53,55,51,54,55,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,56,10,56,56,10,56,56,10, 57,56,10,54,56,10,48,56,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,49,56,10,69,78,67,79,68,73,78,71,32,53, 55,51,54,56,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,48,10,53,48,10,53,48,10,50,48,10,50,48,10, 52,48,10,57,56,10,54,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 49,57,10,69,78,67,79,68,73,78,71,32,53,55,51,54, 57,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,48, 10,53,48,10,53,48,10,65,48,10,50,48,10,52,48,10, 57,56,10,54,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,49,65,10, 69,78,67,79,68,73,78,71,32,53,55,51,55,48,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,70,56,10,52,48, 10,56,48,10,56,48,10,56,48,10,52,56,10,51,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,69,48,49,66,10,69,78,67, 79,68,73,78,71,32,53,55,51,55,49,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,56,10,52,48,10,56,48, 10,54,48,10,49,48,10,48,56,10,56,56,10,55,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,69,48,49,67,10,69,78,67,79,68,73, 78,71,32,53,55,51,55,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,49, 48,10,50,48,10,52,48,10,56,48,10,56,48,10,57,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,69,48,49,68,10,69,78,67,79,68,73,78,71,32, 53,55,51,55,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,55,48,10,56,56,10,67,56,10,48,56,10,48,56, 10,49,48,10,50,48,10,52,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,69, 48,49,69,10,69,78,67,79,68,73,78,71,32,53,55,51, 55,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,48,10,52, 48,10,56,48,10,57,48,10,57,48,10,54,48,10,56,56, 10,56,56,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,69,48,49,70, 10,69,78,67,79,68,73,78,71,32,53,55,51,55,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 56,10,51,48,10,52,56,10,52,56,10,48,56,10,49,48, 10,54,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,50,48,10,69,78, 67,79,68,73,78,71,32,53,55,51,55,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,52,48,10,52,48,10,50,48,10,53, 48,10,53,48,10,56,56,10,56,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,50,49,10,69,78,67,79,68, 73,78,71,32,53,55,51,55,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,49,48,10,49,48,10,55,48,10,66,48,10,57, 48,10,57,48,10,55,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,50,50,10,69,78,67,79,68,73,78,71, 32,53,55,51,55,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,50,48,10,53, 48,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,50,51,10,69,78,67,79,68,73,78,71,32,53,55, 51,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,50, 52,10,69,78,67,79,68,73,78,71,32,53,55,51,56,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,50,53,10,69, 78,67,79,68,73,78,71,32,53,55,51,56,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,50,54,10,69,78,67,79, 68,73,78,71,32,53,55,51,56,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,50,55,10,69,78,67,79,68,73,78, 71,32,53,55,51,56,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,56,10,57,48,10,57,48,10, 66,48,10,52,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,50,56,10,69,78,67,79,68,73,78,71,32,53, 55,51,56,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,56,48, 10,56,48,10,70,48,10,56,56,10,56,56,10,65,56,10, 66,48,10,56,48,10,56,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 50,57,10,69,78,67,79,68,73,78,71,32,53,55,51,56, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,56,48,10,56,48, 10,70,48,10,56,56,10,56,56,10,57,48,10,70,56,10, 56,48,10,56,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,50,65,10, 69,78,67,79,68,73,78,71,32,53,55,51,56,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,56,10,48,56,10,55,56, 10,56,56,10,56,56,10,57,56,10,54,56,10,48,56,10, 48,56,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,69,48,50,66,10,69,78,67, 79,68,73,78,71,32,53,55,51,56,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,56,10,48,56,10,70,56,10,56,56, 10,56,56,10,56,56,10,55,56,10,48,56,10,48,56,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,69,48,51,48,10,69,78,67,79,68,73, 78,71,32,53,55,51,57,50,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,55,48,10,48,56,10,48,56, 10,52,56,10,51,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,69,48,51,49,10,69,78,67,79,68,73,78,71,32, 53,55,51,57,51,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,48,56,10,48,56,10,49,48, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,69, 48,51,50,10,69,78,67,79,68,73,78,71,32,53,55,51, 57,52,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,51,56,10,52,48,10,52,48,10,52,56,10,51,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,69,48,51,51, 10,69,78,67,79,68,73,78,71,32,53,55,51,57,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 56,10,50,48,10,52,48,10,52,56,10,51,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,51,52,10,69,78, 67,79,68,73,78,71,32,53,55,51,57,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,51,53,10,69,78,67,79,68, 73,78,71,32,53,55,51,57,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,51,54,10,69,78,67,79,68,73,78,71, 32,53,55,51,57,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,51,55,10,69,78,67,79,68,73,78,71,32,53,55, 51,57,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,51, 56,10,69,78,67,79,68,73,78,71,32,53,55,52,48,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,51,57,10,69, 78,67,79,68,73,78,71,32,53,55,52,48,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,51,65,10,69,78,67,79, 68,73,78,71,32,53,55,52,48,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,51,66,10,69,78,67,79,68,73,78, 71,32,53,55,52,48,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,51,67,10,69,78,67,79,68,73,78,71,32,53, 55,52,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 51,68,10,69,78,67,79,68,73,78,71,32,53,55,52,48, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,51,69,10, 69,78,67,79,68,73,78,71,32,53,55,52,48,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,69,48,51,70,10,69,78,67, 79,68,73,78,71,32,53,55,52,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,69,48,52,48,10,69,78,67,79,68,73, 78,71,32,53,55,52,48,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,50, 48,10,53,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,69,48,52,49,10,69,78,67,79,68,73,78,71,32, 53,55,52,48,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,53,48,10,50,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,69, 48,52,50,10,69,78,67,79,68,73,78,71,32,53,55,52, 49,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,53,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,69,48,52,51, 10,69,78,67,79,68,73,78,71,32,53,55,52,49,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,53,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,52,52,10,69,78, 67,79,68,73,78,71,32,53,55,52,49,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,52,53,10,69,78,67,79,68, 73,78,71,32,53,55,52,49,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,52,54,10,69,78,67,79,68,73,78,71, 32,53,55,52,49,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,48,10,49,48,10,50,48,10, 50,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,52,55,10,69,78,67,79,68,73,78,71,32,53,55, 52,49,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,52,56,10,57,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,52, 56,10,69,78,67,79,68,73,78,71,32,53,55,52,49,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,50,48,10,53,48,10,54,48,10,52,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,52,57,10,69, 78,67,79,68,73,78,71,32,53,55,52,49,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,55,48, 10,65,56,10,66,48,10,65,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,52,65,10,69,78,67,79, 68,73,78,71,32,53,55,52,49,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,50,48,10,53,48, 10,51,48,10,49,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,52,66,10,69,78,67,79,68,73,78, 71,32,53,55,52,49,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,55,48,10,65,56,10,54,56, 10,50,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,52,67,10,69,78,67,79,68,73,78,71,32,53, 55,52,50,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,55,56,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 52,68,10,69,78,67,79,68,73,78,71,32,53,55,52,50, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,55,56,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,52,69,10, 69,78,67,79,68,73,78,71,32,53,55,52,50,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,52, 48,10,50,48,10,49,48,10,48,56,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,69,48,52,70,10,69,78,67, 79,68,73,78,71,32,53,55,52,50,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,53,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,69,48,53,48,10,69,78,67,79,68,73, 78,71,32,53,55,52,50,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,69,48,53,49,10,69,78,67,79,68,73,78,71,32, 53,55,52,50,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,48,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,69, 48,53,50,10,69,78,67,79,68,73,78,71,32,53,55,52, 50,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,49, 48,10,50,48,10,50,48,10,49,48,10,49,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,69,48,53,51, 10,69,78,67,79,68,73,78,71,32,53,55,52,50,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,65,48,10,68,48,10,56,56,10,65,56,10,68, 48,10,56,56,10,56,56,10,65,56,10,66,48,10,56,48, 10,56,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,53,52,10,69,78, 67,79,68,73,78,71,32,53,55,52,50,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,52, 48,10,65,56,10,49,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,53,53,10,69,78,67,79,68, 73,78,71,32,53,55,52,50,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,52,48,10,70, 56,10,49,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,53,54,10,69,78,67,79,68,73,78,71, 32,53,55,52,51,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,50,48,10,50,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,53,55,10,69,78,67,79,68,73,78,71,32,53,55, 52,51,49,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,56,10,57,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,53, 56,10,69,78,67,79,68,73,78,71,32,53,55,52,51,50, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,54,48,10,53, 48,10,54,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,53,57,10,69, 78,67,79,68,73,78,71,32,53,55,52,51,51,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,53,65,10,69,78,67,79, 68,73,78,71,32,53,55,52,51,52,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 49,48,10,49,48,10,51,48,10,53,48,10,51,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,53,66,10,69,78,67,79,68,73,78, 71,32,53,55,52,51,53,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,53,67,10,69,78,67,79,68,73,78,71,32,53, 55,52,51,54,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 49,48,10,48,56,10,49,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 53,68,10,69,78,67,79,68,73,78,71,32,53,55,52,51, 55,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 52,48,10,54,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,53,69,10, 69,78,67,79,68,73,78,71,32,53,55,52,51,56,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,69,48,53,70,10,69,78,67, 79,68,73,78,71,32,53,55,52,51,57,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,69,48,54,48,10,69,78,67,79,68,73, 78,71,32,53,55,52,52,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,69,48,54,49,10,69,78,67,79,68,73,78,71,32, 53,55,52,52,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,69, 48,54,50,10,69,78,67,79,68,73,78,71,32,53,55,52, 52,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,53,48,10,53,48,10,53,48,10,50,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,69,48,54,51, 10,69,78,67,79,68,73,78,71,32,53,55,52,52,51,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 67,10,65,56,10,65,56,10,65,56,10,53,52,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,69,48,54,52,10,69,78, 67,79,68,73,78,71,32,53,55,52,52,52,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,52,48,10,52,56,10,51,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,69,48,54,53,10,69,78,67,79,68, 73,78,71,32,53,55,52,52,53,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,70,48,10,65, 48,10,65,48,10,66,56,10,57,48,10,54,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,69,48,54,54,10,69,78,67,79,68,73,78,71, 32,53,55,52,52,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,48,10,56,48,10,70,67,10,65,56,10,65,56,10,65, 56,10,57,67,10,57,48,10,55,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 69,48,54,55,10,69,78,67,79,68,73,78,71,32,53,55, 52,52,55,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,53,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,69,48,54, 56,10,69,78,67,79,68,73,78,71,32,53,55,52,52,56, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,50,48,10, 50,48,10,50,48,10,51,48,10,50,56,10,51,56,10,65, 48,10,52,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,69,48,54,57,10,69, 78,67,79,68,73,78,71,32,53,55,52,52,57,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,52,48,10,52,48,10,54,56,10, 53,52,10,53,52,10,53,52,10,55,67,10,56,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,69,48,54,65,10,69,78,67,79, 68,73,78,71,32,53,55,52,53,48,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,67,48,10,50,48,10,49,48,10,48,56,10, 52,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,69,48,54,66,10,69,78,67,79,68,73,78, 71,32,53,55,52,53,49,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,67,48,10,50,48,10,49,48,10,48,56,10,52,56,10, 56,56,10,55,48,10,48,56,10,55,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,69,48,54,67,10,69,78,67,79,68,73,78,71,32,53, 55,52,53,50,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,50,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,69,48, 54,68,10,69,78,67,79,68,73,78,71,32,53,55,52,53, 51,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,69,48,54,69,10, 69,78,67,79,68,73,78,71,32,53,55,52,53,52,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,50,48,10,53,48,10, 50,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,102,102,10,69,78,67,79,68,73,78,71, 32,54,52,50,53,54,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,50,56,10,53,52,10, 53,48,10,53,48,10,70,56,10,53,48,10,53,48,10,53, 48,10,53,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,102,105,10, 69,78,67,79,68,73,78,71,32,54,52,50,53,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,51,48,10,52,56,10,52,56,10,52,48,10,70,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,102,108,10,69,78,67,79,68,73,78,71, 32,54,52,50,53,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,51,56,10,52,56,10, 52,56,10,52,56,10,70,56,10,52,56,10,52,56,10,52, 56,10,52,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,102,102,105, 10,69,78,67,79,68,73,78,71,32,54,52,50,53,57,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,48,10,65,56,10,65,48,10,65,56,10,70, 56,10,65,56,10,65,56,10,65,56,10,65,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,102,102,108,10,69,78,67,79,68,73, 78,71,32,54,52,50,54,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,53,56,10,65, 56,10,65,56,10,65,56,10,70,56,10,65,56,10,65,56, 10,65,56,10,65,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,66,48,53,10,69,78,67,79,68,73,78,71,32, 54,52,50,54,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,51,48,10,53,48,10,53, 48,10,53,48,10,53,56,10,53,48,10,53,48,10,53,48, 10,52,56,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 66,48,54,10,69,78,67,79,68,73,78,71,32,54,52,50, 54,50,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,51,48,10,53,48,10,53,48,10,66, 56,10,57,48,10,53,48,10,51,48,10,51,48,10,67,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,66,49,51, 10,69,78,67,79,68,73,78,71,32,54,52,50,55,53,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,53,56,10,54,48,10,50,48,10,66,52,10,66, 52,10,66,52,10,66,52,10,66,52,10,54,67,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,66,49,52,10,69,78, 67,79,68,73,78,71,32,54,52,50,55,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 49,48,10,51,56,10,51,48,10,66,52,10,66,52,10,66, 52,10,66,52,10,66,67,10,55,52,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,66,49,53,10,69,78,67,79,68, 73,78,71,32,54,52,50,55,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,49,48,10, 51,48,10,51,48,10,66,56,10,66,52,10,66,52,10,66, 52,10,66,52,10,55,52,10,49,48,10,49,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,66,49,54,10,69,78,67,79,68,73,78,71, 32,54,52,50,55,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,54,48,10,54,48,10, 55,48,10,66,52,10,66,52,10,66,52,10,66,52,10,66, 52,10,54,67,10,50,48,10,51,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,66,49,55,10,69,78,67,79,68,73,78,71,32,54,52, 50,55,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,54,48,10,54,48,10, 70,52,10,70,52,10,70,52,10,70,52,10,70,52,10,54, 67,10,50,48,10,50,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,66,49, 68,10,69,78,67,79,68,73,78,71,32,54,52,50,56,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,51,48,10, 49,48,10,49,48,10,48,48,10,49,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,66,49,69,10,69, 78,67,79,68,73,78,71,32,54,52,50,56,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,56,56, 10,55,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,55,48,53,10,69,78, 67,79,68,73,78,71,32,54,52,50,56,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,68,56,10,52,56,10,52, 56,10,48,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,66,50,48,10,69,78,67,79,68, 73,78,71,32,54,52,50,56,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,57,56,10,52,56,10,52,56,10,50, 56,10,50,56,10,70,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,66,50,49,10,69,78,67,79,68,73,78,71, 32,54,52,50,56,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,57,48,10,52,56,10,54,56,10,57,48,10,56, 56,10,67,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,66,50,50,10,69,78,67,79,68,73,78,71,32,54,52, 50,57,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,66,50, 51,10,69,78,67,79,68,73,78,71,32,54,52,50,57,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,56,10,48,56,10,56,56,10,56,56,10,56,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,66,50,52,10,69, 78,67,79,68,73,78,71,32,54,52,50,57,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,48,56,10, 48,56,10,48,56,10,48,56,10,70,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,66,50,53,10,69,78,67,79, 68,73,78,71,32,54,52,50,57,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,56,48, 10,56,48,10,56,48,10,70,56,10,48,56,10,48,56,10, 48,56,10,49,48,10,54,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,66,50,54,10,69,78,67,79,68,73,78, 71,32,54,52,50,57,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,56,10,52,56,10,52,56,10,52,56,10, 52,56,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,66,50,55,10,69,78,67,79,68,73,78,71,32,54, 52,50,57,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,48,10,48,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,66, 50,56,10,69,78,67,79,68,73,78,71,32,54,52,50,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,52,56,10,52,56,10,52,56,10,52,56,10,67,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,66,50,57,10, 69,78,67,79,68,73,78,71,32,54,52,50,57,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,50,48,10,50,48,10,70,56,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,97,102,105,105,53,55,54,57,52,10,69, 78,67,79,68,73,78,71,32,54,52,50,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,49,48,10,48,48,10,65,56,10,65,56,10, 65,56,10,69,56,10,56,56,10,70,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,97,102,105,105,53,55,54,57,53,10,69,78, 67,79,68,73,78,71,32,54,52,50,57,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,56,48,10,48,48,10,65,56,10,65,56,10,65, 56,10,69,56,10,56,56,10,70,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,66,50,67,10,69,78,67,79,68, 73,78,71,32,54,52,51,48,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 49,48,10,48,48,10,65,56,10,65,56,10,66,56,10,69, 56,10,56,56,10,70,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,66,50,68,10,69,78,67,79,68,73,78,71, 32,54,52,51,48,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,56,48,10, 48,48,10,65,56,10,65,56,10,66,56,10,69,56,10,56, 56,10,70,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,66,50,69,10,69,78,67,79,68,73,78,71,32,54,52, 51,48,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,57,48,10, 52,56,10,54,56,10,57,48,10,56,56,10,67,56,10,48, 48,10,55,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,66,50, 70,10,69,78,67,79,68,73,78,71,32,54,52,51,48,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,57,48,10,52,56,10, 54,56,10,57,48,10,56,56,10,67,56,10,48,48,10,55, 48,10,50,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,66,51,48,10,69, 78,67,79,68,73,78,71,32,54,52,51,48,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,57,48,10,52,56,10, 54,56,10,57,48,10,56,56,10,67,56,10,48,48,10,50, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,66,51,49,10,69,78,67,79, 68,73,78,71,32,54,52,51,48,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,48,10,49,48,10,53,48,10, 49,48,10,49,48,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,66,51,50,10,69,78,67,79,68,73,78, 71,32,54,52,51,48,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,52,48,10,50,48,10,49,48,10,57,48,10, 50,56,10,52,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,66,51,51,10,69,78,67,79,68,73,78,71,32,54, 52,51,48,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,49,48,10,49,48,10,53,48,10,49,48,10, 49,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,66, 51,52,10,69,78,67,79,68,73,78,71,32,54,52,51,48, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,56,10,48,56,10,65,56,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,97,102,105,105,53,55,55,50, 51,10,69,78,67,79,68,73,78,71,32,54,52,51,48,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,51,48,10, 49,48,10,49,48,10,53,48,10,49,48,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,66,51,54,10,69, 78,67,79,68,73,78,71,32,54,52,51,49,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,70,56,10,50,48,10, 50,48,10,49,48,10,53,48,10,49,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,66,51,56,10,69,78,67,79, 68,73,78,71,32,54,52,51,49,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,57,56,10,56,56,10,65,56,10, 56,56,10,56,56,10,70,56,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,66,51,57,10,69,78,67,79,68,73,78, 71,32,54,52,51,49,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,51,48,10,49,48,10,53,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,66,51,65,10,69,78,67,79,68,73,78,71,32,54, 52,51,49,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,70,56,10,48,56,10,48,56,10,50,56,10,48,56,10, 48,56,10,48,56,10,48,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,66, 51,66,10,69,78,67,79,68,73,78,71,32,54,52,51,49, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,56,10,52,56,10,48,56,10,48,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,66,51,67,10, 69,78,67,79,68,73,78,71,32,54,52,51,49,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,56,48,10,56,48,10,56,48,10,70,56,10,48,56, 10,52,56,10,48,56,10,49,48,10,54,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,66,51,69,10,69,78,67, 79,68,73,78,71,32,54,52,51,49,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,66,48,10,52,56,10,56,56, 10,65,56,10,56,56,10,66,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,66,52,48,10,69,78,67,79,68,73, 78,71,32,54,52,51,50,48,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,49,56,10,48,56,10,50,56,10,48,56, 10,48,56,10,55,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,66,52,49,10,69,78,67,79,68,73,78,71,32, 54,52,51,50,49,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,70,56,10,56,56,10,65,56,10,56,56,10,57,48, 10,69,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 66,52,51,10,69,78,67,79,68,73,78,71,32,54,52,51, 50,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 56,10,56,56,10,56,56,10,50,56,10,48,56,10,48,56, 10,48,56,10,48,56,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,66,52,52, 10,69,78,67,79,68,73,78,71,32,54,52,51,50,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,55,56,10,56, 56,10,65,56,10,48,56,10,48,56,10,70,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,66,52,54,10,69,78, 67,79,68,73,78,71,32,54,52,51,50,54,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,57,48,10,52,56,10,50, 56,10,57,48,10,48,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,66,52,55,10,69,78,67,79,68, 73,78,71,32,54,52,51,50,55,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,56,10,65,56,10,56, 56,10,56,56,10,66,48,10,56,48,10,56,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,66,52,56,10,69,78,67,79,68,73,78,71, 32,54,52,51,50,56,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,48,10,48,56,10,50,56,10,48,56,10,48, 56,10,48,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,66,52,57,10,69,78,67,79,68,73,78,71,32,54,52, 51,50,57,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 65,56,10,65,56,10,66,56,10,69,56,10,56,56,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,66,52, 65,10,69,78,67,79,68,73,78,71,32,54,52,51,51,48, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 52,56,10,53,56,10,52,56,10,52,56,10,67,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,97,102,105,105,53,55,55,48,48, 10,69,78,67,79,68,73,78,71,32,54,52,51,51,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,50,48,10,48,48,10,51,48,10,49, 48,10,49,48,10,49,48,10,49,48,10,49,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,66,52,67,10,69,78, 67,79,68,73,78,71,32,54,52,51,51,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,55,48,10,48,48,10,70,48,10,49,48,10,49, 48,10,49,48,10,49,48,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,66,52,68,10,69,78,67,79,68, 73,78,71,32,54,52,51,51,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 55,48,10,48,48,10,70,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,70,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,66,52,69,10,69,78,67,79,68,73,78,71, 32,54,52,51,51,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,55,48,10, 48,48,10,55,56,10,56,56,10,56,56,10,48,56,10,48, 56,10,70,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,66,52,70,10,69,78,67,79,68,73,78,71,32,54,52, 51,51,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 57,48,10,52,56,10,54,56,10,57,48,10,56,56,10,67, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,69,50, 48,10,69,78,67,79,68,73,78,71,32,54,53,48,53,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,51,67,10,67,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,69,50,49,10,69, 78,67,79,68,73,78,71,32,54,53,48,53,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,69,48, 10,49,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,69,50,50,10,69,78,67,79, 68,73,78,71,32,54,53,48,53,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,51,67,10,52,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,69,50,51,10,69,78,67,79,68,73,78, 71,32,54,53,48,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,56,10,70,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,48,49,10,69,78,67,79,68,73,78,71,32,54, 53,50,56,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,48,48,10, 50,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 48,50,10,69,78,67,79,68,73,78,71,32,54,53,50,56, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,53,48,10,53,48,10,53,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,48,51,10, 69,78,67,79,68,73,78,71,32,54,53,50,56,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,53,48,10,53,48,10,70,56,10,53,48, 10,70,56,10,53,48,10,53,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,48,52,10,69,78,67, 79,68,73,78,71,32,54,53,50,56,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,55,56,10,65,48,10,65,48,10,55,48,10,50,56, 10,50,56,10,70,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,48,53,10,69,78,67,79,68,73, 78,71,32,54,53,50,56,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,56,10,65, 56,10,53,48,10,49,48,10,50,48,10,52,48,10,53,48, 10,65,56,10,57,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,48,54,10,69,78,67,79,68,73,78,71,32, 54,53,50,56,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,65,48,10,65, 48,10,52,48,10,65,48,10,57,56,10,57,48,10,54,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,48,55,10,69,78,67,79,68,73,78,71,32,54,53,50, 56,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,48,56, 10,69,78,67,79,68,73,78,71,32,54,53,50,56,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 49,48,10,50,48,10,50,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,52,48,10,50,48,10,50,48,10,49,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,48,57,10,69,78, 67,79,68,73,78,71,32,54,53,50,56,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,52,48,10, 50,48,10,50,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,50,48,10,50,48,10,52,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,48,65,10,69,78,67,79,68, 73,78,71,32,54,53,50,57,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 50,48,10,65,56,10,70,56,10,55,48,10,70,56,10,65, 56,10,50,48,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,48,66,10,69,78,67,79,68,73,78,71, 32,54,53,50,57,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,50,48,10,70,56,10,50,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,48,67,10,69,78,67,79,68,73,78,71,32,54,53, 50,57,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,51,48,10,50, 48,10,52,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,48, 68,10,69,78,67,79,68,73,78,71,32,54,53,50,57,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,48,69,10,69, 78,67,79,68,73,78,71,32,54,53,50,57,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,50,48,10,55,48,10,50,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,48,70,10,69,78,67,79, 68,73,78,71,32,54,53,50,57,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,56, 10,48,56,10,49,48,10,49,48,10,50,48,10,52,48,10, 52,48,10,56,48,10,56,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,49,48,10,69,78,67,79,68,73,78, 71,32,54,53,50,57,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,50,48,10,53,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 53,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,49,49,10,69,78,67,79,68,73,78,71,32,54, 53,50,57,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,54,48,10,65,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 70,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 49,50,10,69,78,67,79,68,73,78,71,32,54,53,50,57, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,55,48,10,56,56,10,56,56,10,48,56, 10,49,48,10,50,48,10,52,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,49,51,10, 69,78,67,79,68,73,78,71,32,54,53,50,57,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,70,56,10,48,56,10,49,48,10,50,48,10,55,48, 10,48,56,10,48,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,49,52,10,69,78,67, 79,68,73,78,71,32,54,53,51,48,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,49, 48,10,49,48,10,51,48,10,53,48,10,53,48,10,57,48, 10,70,56,10,49,48,10,49,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,49,53,10,69,78,67,79,68,73, 78,71,32,54,53,51,48,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,56, 48,10,56,48,10,66,48,10,67,56,10,48,56,10,48,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,49,54,10,69,78,67,79,68,73,78,71,32, 54,53,51,48,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,55,48,10,56,56,10,56, 48,10,56,48,10,70,48,10,56,56,10,56,56,10,56,56, 10,55,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,49,55,10,69,78,67,79,68,73,78,71,32,54,53,51, 48,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,70,56,10,48,56,10,49,48,10,49, 48,10,50,48,10,50,48,10,52,48,10,52,48,10,52,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,49,56, 10,69,78,67,79,68,73,78,71,32,54,53,51,48,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,55,48,10,56,56,10,56,56,10,56,56,10,55, 48,10,56,56,10,56,56,10,56,56,10,55,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,49,57,10,69,78, 67,79,68,73,78,71,32,54,53,51,48,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,56,56,10,56,56,10,56,56,10,55,56,10,48, 56,10,48,56,10,56,56,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,49,65,10,69,78,67,79,68, 73,78,71,32,54,53,51,48,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,55,48,10,50,48,10,48,48,10,48, 48,10,50,48,10,55,48,10,50,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,49,66,10,69,78,67,79,68,73,78,71, 32,54,53,51,48,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,55,48,10,50,48,10,48,48,10,48,48,10,51, 48,10,50,48,10,52,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,49,67,10,69,78,67,79,68,73,78,71,32,54,53, 51,48,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,49,48,10,50,48,10, 52,48,10,56,48,10,52,48,10,50,48,10,49,48,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,49, 68,10,69,78,67,79,68,73,78,71,32,54,53,51,48,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,70,56,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,49,69,10,69, 78,67,79,68,73,78,71,32,54,53,51,49,48,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,48,10,52,48,10,50,48,10,49,48,10,48,56,10, 49,48,10,50,48,10,52,48,10,56,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,49,70,10,69,78,67,79, 68,73,78,71,32,54,53,51,49,49,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,48,56,10,49,48,10,50,48,10, 50,48,10,48,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,50,48,10,69,78,67,79,68,73,78, 71,32,54,53,51,49,50,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,56,10,57,56,10,65,56,10,65,56,10,66,48,10, 56,48,10,55,56,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,50,49,10,69,78,67,79,68,73,78,71,32,54, 53,51,49,51,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,53,48,10,56,56, 10,56,56,10,56,56,10,70,56,10,56,56,10,56,56,10, 56,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 50,50,10,69,78,67,79,68,73,78,71,32,54,53,51,49, 52,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,48,10,52,56,10,52,56,10,52,56, 10,55,48,10,52,56,10,52,56,10,52,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,50,51,10, 69,78,67,79,68,73,78,71,32,54,53,51,49,53,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,50,52,10,69,78,67, 79,68,73,78,71,32,54,53,51,49,54,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 48,10,52,56,10,52,56,10,52,56,10,52,56,10,52,56, 10,52,56,10,52,56,10,70,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,50,53,10,69,78,67,79,68,73, 78,71,32,54,53,51,49,55,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,56, 48,10,56,48,10,56,48,10,70,48,10,56,48,10,56,48, 10,56,48,10,70,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,50,54,10,69,78,67,79,68,73,78,71,32, 54,53,51,49,56,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,70,56,10,56,48,10,56, 48,10,56,48,10,70,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,50,55,10,69,78,67,79,68,73,78,71,32,54,53,51, 49,57,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,55,48,10,56,56,10,56,48,10,56, 48,10,56,48,10,57,56,10,56,56,10,56,56,10,55,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,50,56, 10,69,78,67,79,68,73,78,71,32,54,53,51,50,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,56,56,10,56,56,10,70, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,50,57,10,69,78, 67,79,68,73,78,71,32,54,53,51,50,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 55,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,50,65,10,69,78,67,79,68, 73,78,71,32,54,53,51,50,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,51,56,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,49, 48,10,57,48,10,54,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,50,66,10,69,78,67,79,68,73,78,71, 32,54,53,51,50,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,56,56,10,56,56,10, 57,48,10,65,48,10,67,48,10,65,48,10,57,48,10,56, 56,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,50,67,10,69,78,67,79,68,73,78,71,32,54,53, 51,50,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,56,48,10,56,48,10,56,48,10,70, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,50, 68,10,69,78,67,79,68,73,78,71,32,54,53,51,50,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,56,56,10,56,56,10,68,56,10,65,56,10, 65,56,10,56,56,10,56,56,10,56,56,10,56,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,50,69,10,69, 78,67,79,68,73,78,71,32,54,53,51,50,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,56,56,10,67,56,10,67,56,10,65,56,10,65,56,10, 57,56,10,57,56,10,56,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,50,70,10,69,78,67,79, 68,73,78,71,32,54,53,51,50,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,55,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,51,48,10,69,78,67,79,68,73,78, 71,32,54,53,51,50,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,70,48,10,56,56, 10,56,56,10,56,56,10,70,48,10,56,48,10,56,48,10, 56,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,51,49,10,69,78,67,79,68,73,78,71,32,54, 53,51,50,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,48,10,56,56,10,56,56, 10,56,56,10,56,56,10,56,56,10,56,56,10,65,56,10, 55,48,10,48,56,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 51,50,10,69,78,67,79,68,73,78,71,32,54,53,51,51, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,70,48,10,56,56,10,56,56,10,56,56, 10,70,48,10,65,48,10,57,48,10,56,56,10,56,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,51,51,10, 69,78,67,79,68,73,78,71,32,54,53,51,51,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,55,48,10,56,56,10,56,48,10,56,48,10,55,48, 10,48,56,10,48,56,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,51,52,10,69,78,67, 79,68,73,78,71,32,54,53,51,51,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,51,53,10,69,78,67,79,68,73, 78,71,32,54,53,51,51,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,56,56,10,56, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,56,56, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,51,54,10,69,78,67,79,68,73,78,71,32, 54,53,51,51,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,53,48,10,53,48,10,53,48,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,51,55,10,69,78,67,79,68,73,78,71,32,54,53,51, 51,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,56,56,10,56,56,10,56,56,10,56, 56,10,65,56,10,65,56,10,65,56,10,68,56,10,56,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,51,56, 10,69,78,67,79,68,73,78,71,32,54,53,51,51,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,56,10,56,56,10,53,48,10,53,48,10,50, 48,10,53,48,10,53,48,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,51,57,10,69,78, 67,79,68,73,78,71,32,54,53,51,51,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,56,10,56,56,10,53,48,10,53,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,51,65,10,69,78,67,79,68, 73,78,71,32,54,53,51,51,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 48,56,10,49,48,10,49,48,10,50,48,10,52,48,10,52, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,51,66,10,69,78,67,79,68,73,78,71, 32,54,53,51,51,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,55,48,10,52,48,10,52,48,10, 52,48,10,52,48,10,52,48,10,52,48,10,52,48,10,52, 48,10,52,48,10,55,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,51,67,10,69,78,67,79,68,73,78,71,32,54,53, 51,52,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,56,48,10,56,48,10,52,48,10, 52,48,10,50,48,10,49,48,10,49,48,10,48,56,10,48, 56,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,51, 68,10,69,78,67,79,68,73,78,71,32,54,53,51,52,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,55,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 49,48,10,49,48,10,49,48,10,49,48,10,49,48,10,55, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,51,69,10,69, 78,67,79,68,73,78,71,32,54,53,51,52,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,53,48,10,56,56,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,51,70,10,69,78,67,79, 68,73,78,71,32,54,53,51,52,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,70,56,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,52,48,10,69,78,67,79,68,73,78, 71,32,54,53,51,52,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,50,48,10,49,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,52,49,10,69,78,67,79,68,73,78,71,32,54, 53,51,52,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,48,10,48,56,10,55,56,10,56,56,10,56,56,10, 55,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 52,50,10,69,78,67,79,68,73,78,71,32,54,53,51,52, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,70,48, 10,56,56,10,56,56,10,56,56,10,56,56,10,70,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,52,51,10, 69,78,67,79,68,73,78,71,32,54,53,51,52,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,56,48,10,56,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,52,52,10,69,78,67, 79,68,73,78,71,32,54,53,51,52,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 56,10,48,56,10,48,56,10,55,56,10,56,56,10,56,56, 10,56,56,10,56,56,10,55,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,52,53,10,69,78,67,79,68,73, 78,71,32,54,53,51,52,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,55,48,10,56,56,10,70,56,10,56,48, 10,56,56,10,55,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,52,54,10,69,78,67,79,68,73,78,71,32, 54,53,51,53,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,51,48,10,52,56,10,52, 48,10,52,48,10,70,48,10,52,48,10,52,48,10,52,48, 10,52,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,52,55,10,69,78,67,79,68,73,78,71,32,54,53,51, 53,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 48,10,56,56,10,56,56,10,56,56,10,55,56,10,48,56, 10,56,56,10,55,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,52,56, 10,69,78,67,79,68,73,78,71,32,54,53,51,53,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,66,48,10,67, 56,10,56,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,52,57,10,69,78, 67,79,68,73,78,71,32,54,53,51,53,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,50,48,10,48,48,10,54,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,55,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,52,65,10,69,78,67,79,68, 73,78,71,32,54,53,51,53,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 49,48,10,48,48,10,51,48,10,49,48,10,49,48,10,49, 48,10,49,48,10,57,48,10,57,48,10,54,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,52,66,10,69,78,67,79,68,73,78,71, 32,54,53,51,53,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,56,48,10,56,48,10, 56,48,10,57,48,10,65,48,10,67,48,10,65,48,10,57, 48,10,56,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,52,67,10,69,78,67,79,68,73,78,71,32,54,53, 51,53,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,54,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,55, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,52, 68,10,69,78,67,79,68,73,78,71,32,54,53,51,53,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,68,48,10, 65,56,10,65,56,10,65,56,10,65,56,10,56,56,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,52,69,10,69, 78,67,79,68,73,78,71,32,54,53,51,53,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,66,48,10,67,56,10, 56,56,10,56,56,10,56,56,10,56,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,52,70,10,69,78,67,79, 68,73,78,71,32,54,53,51,53,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,55,48,10,56,56,10,56,56,10, 56,56,10,56,56,10,55,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,53,48,10,69,78,67,79,68,73,78, 71,32,54,53,51,54,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,70,48,10,56,56,10,56,56,10,56,56,10, 70,48,10,56,48,10,56,48,10,56,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,53,49,10,69,78,67,79,68,73,78,71,32,54, 53,51,54,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,55,56,10,56,56,10,56,56,10,56,56,10,55,56,10, 48,56,10,48,56,10,48,56,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 53,50,10,69,78,67,79,68,73,78,71,32,54,53,51,54, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,66,48, 10,67,56,10,56,48,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,53,51,10, 69,78,67,79,68,73,78,71,32,54,53,51,54,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,55,48,10,56,56, 10,54,48,10,49,48,10,56,56,10,55,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,53,52,10,69,78,67, 79,68,73,78,71,32,54,53,51,54,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,52,48,10,52,48,10,70,48,10,52,48,10,52,48, 10,52,48,10,52,56,10,51,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,53,53,10,69,78,67,79,68,73, 78,71,32,54,53,51,54,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,56,56,10,56,56,10,56,56,10,56,56, 10,57,56,10,54,56,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,53,54,10,69,78,67,79,68,73,78,71,32, 54,53,51,54,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,56,56,10,56,56,10,56,56,10,53,48,10,53,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,53,55,10,69,78,67,79,68,73,78,71,32,54,53,51, 54,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,56, 56,10,56,56,10,65,56,10,65,56,10,65,56,10,53,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,53,56, 10,69,78,67,79,68,73,78,71,32,54,53,51,54,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,56,56,10,53, 48,10,50,48,10,50,48,10,53,48,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,53,57,10,69,78, 67,79,68,73,78,71,32,54,53,51,54,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,57,56,10,54,56,10,48,56,10,56,56,10,55,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,53,65,10,69,78,67,79,68, 73,78,71,32,54,53,51,55,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,70,56,10,49,48,10,50,48,10,52, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,53,66,10,69,78,67,79,68,73,78,71, 32,54,53,51,55,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,49,56,10,50,48,10,50,48,10, 50,48,10,50,48,10,67,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,49,56,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,53,67,10,69,78,67,79,68,73,78,71,32,54,53, 51,55,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,53, 68,10,69,78,67,79,68,73,78,71,32,54,53,51,55,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,67,48,10,50,48,10,50,48,10,50,48,10,50,48,10, 49,56,10,50,48,10,50,48,10,50,48,10,50,48,10,67, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,53,69,10,69, 78,67,79,68,73,78,71,32,54,53,51,55,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,56,10,65,56,10,57,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,54,49,10,69,78,67,79, 68,73,78,71,32,54,53,51,55,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 50,48,10,53,48,10,50,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,54,50,10,69,78,67,79,68,73,78, 71,32,54,53,51,55,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,52,48, 10,52,48,10,52,48,10,52,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,54,51,10,69,78,67,79,68,73,78,71,32,54, 53,51,55,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,49,48,10,49,48,10,49,48,10,49,48,10, 55,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 54,52,10,69,78,67,79,68,73,78,71,32,54,53,51,56, 48,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,52,48,10,50,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,54,53,10, 69,78,67,79,68,73,78,71,32,54,53,51,56,49,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,50,48,10,55,48, 10,50,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,54,54,10,69,78,67, 79,68,73,78,71,32,54,53,51,56,50,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,48,56,10,70,56,10,48,56,10,48,56, 10,49,48,10,50,48,10,67,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,54,55,10,69,78,67,79,68,73, 78,71,32,54,53,51,56,51,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,70,48,10,49,48,10,53,48, 10,52,48,10,56,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,54,56,10,69,78,67,79,68,73,78,71,32, 54,53,51,56,52,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,49,48,10,50,48,10,54,48,10,65,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,54,57,10,69,78,67,79,68,73,78,71,32,54,53,51, 56,53,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,52,48,10,69,48,10,65,48,10,50,48,10,52,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,54,65, 10,69,78,67,79,68,73,78,71,32,54,53,51,56,54,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,55, 48,10,50,48,10,50,48,10,50,48,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,54,66,10,69,78, 67,79,68,73,78,71,32,54,53,51,56,55,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,50,48,10,70, 48,10,50,48,10,54,48,10,65,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,54,67,10,69,78,67,79,68, 73,78,71,32,54,53,51,56,56,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,52,48,10,55,56,10,67, 56,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,54,68,10,69,78,67,79,68,73,78,71, 32,54,53,51,56,57,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,54,48,10,50,48,10,50,48,10,50, 48,10,70,56,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,54,69,10,69,78,67,79,68,73,78,71,32,54,53, 51,57,48,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,70,48,10,49,48,10,55,48,10,49,48,10,70, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,54, 70,10,69,78,67,79,68,73,78,71,32,54,53,51,57,49, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 65,56,10,65,56,10,48,56,10,49,48,10,69,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,55,48,10,69, 78,67,79,68,73,78,71,32,54,53,51,57,50,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,55,49,10,69,78,67,79, 68,73,78,71,32,54,53,51,57,51,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,70,56, 10,48,56,10,48,56,10,50,56,10,51,48,10,50,48,10, 50,48,10,52,48,10,56,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,55,50,10,69,78,67,79,68,73,78, 71,32,54,53,51,57,52,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,49,48, 10,50,48,10,54,48,10,65,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,55,51,10,69,78,67,79,68,73,78,71,32,54, 53,51,57,53,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,50,48,10,50,48,10,70,56,10,56,56, 10,56,56,10,48,56,10,48,56,10,49,48,10,50,48,10, 52,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 55,52,10,69,78,67,79,68,73,78,71,32,54,53,51,57, 54,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,55,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,50,48,10,50,48,10,70,56,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,55,53,10, 69,78,67,79,68,73,78,71,32,54,53,51,57,55,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,49, 48,10,49,48,10,70,56,10,49,48,10,49,48,10,51,48, 10,53,48,10,57,48,10,49,48,10,49,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,55,54,10,69,78,67, 79,68,73,78,71,32,54,53,51,57,56,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,50, 48,10,50,48,10,70,67,10,50,52,10,50,52,10,50,52, 10,52,52,10,52,52,10,57,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,55,55,10,69,78,67,79,68,73, 78,71,32,54,53,51,57,57,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,52,48,10,52, 48,10,53,56,10,69,48,10,50,48,10,51,56,10,68,48, 10,49,48,10,49,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,55,56,10,69,78,67,79,68,73,78,71,32, 54,53,52,48,48,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,52,48,10,55,56,10,52, 56,10,56,56,10,48,56,10,49,48,10,49,48,10,50,48, 10,52,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,55,57,10,69,78,67,79,68,73,78,71,32,54,53,52, 48,49,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,52,48,10,52,48,10,55,67,10,56, 56,10,48,56,10,48,56,10,49,48,10,49,48,10,50,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,55,65, 10,69,78,67,79,68,73,78,71,32,54,53,52,48,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,56,10,48,56,10,48, 56,10,48,56,10,48,56,10,48,56,10,70,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,55,66,10,69,78, 67,79,68,73,78,71,32,54,53,52,48,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 52,56,10,52,56,10,70,67,10,52,56,10,52,56,10,48, 56,10,49,48,10,49,48,10,50,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,55,67,10,69,78,67,79,68, 73,78,71,32,54,53,52,48,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 56,48,10,52,48,10,48,48,10,56,56,10,52,56,10,49, 48,10,50,48,10,67,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,55,68,10,69,78,67,79,68,73,78,71, 32,54,53,52,48,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,70,56,10,48,56,10, 48,56,10,48,56,10,49,48,10,49,48,10,51,48,10,52, 56,10,56,52,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,55,69,10,69,78,67,79,68,73,78,71,32,54,53, 52,48,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,52,48,10,52,48,10,55,67,10, 67,52,10,52,56,10,52,48,10,52,48,10,52,48,10,51, 67,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,55, 70,10,69,78,67,79,68,73,78,71,32,54,53,52,48,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,56,56,10,52,56,10,52,56,10, 49,48,10,49,48,10,50,48,10,50,48,10,52,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,56,48,10,69, 78,67,79,68,73,78,71,32,54,53,52,48,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,52,48,10,55,56,10,52,56,10,56,56,10,50,56,10, 49,48,10,49,48,10,50,48,10,52,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,56,49,10,69,78,67,79, 68,73,78,71,32,54,53,52,48,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,49,48, 10,50,48,10,54,48,10,50,48,10,70,56,10,50,48,10, 50,48,10,52,48,10,56,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,56,50,10,69,78,67,79,68,73,78, 71,32,54,53,52,49,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,65,48, 10,65,56,10,65,56,10,48,56,10,48,56,10,49,48,10, 50,48,10,67,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,56,51,10,69,78,67,79,68,73,78,71,32,54, 53,52,49,49,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,55,56,10,48,48,10,48,48, 10,70,67,10,49,48,10,49,48,10,50,48,10,50,48,10, 67,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 56,52,10,69,78,67,79,68,73,78,71,32,54,53,52,49, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,56,48,10,56,48,10,56,48,10,67,48, 10,65,48,10,57,48,10,56,48,10,56,48,10,56,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,56,53,10, 69,78,67,79,68,73,78,71,32,54,53,52,49,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,50,48,10,50,48,10,70,56,10,50,48,10,50,48, 10,50,48,10,52,48,10,52,48,10,56,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,56,54,10,69,78,67, 79,68,73,78,71,32,54,53,52,49,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,55,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,56,55,10,69,78,67,79,68,73, 78,71,32,54,53,52,49,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,70, 56,10,48,56,10,52,56,10,51,48,10,49,48,10,50,56, 10,52,48,10,56,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,56,56,10,69,78,67,79,68,73,78,71,32, 54,53,52,49,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,50,48,10,50,48,10,70, 56,10,48,56,10,49,48,10,51,48,10,54,56,10,65,52, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,56,57,10,69,78,67,79,68,73,78,71,32,54,53,52, 49,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,48,56,10,48,56,10,48, 56,10,49,48,10,49,48,10,50,48,10,52,48,10,56,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,56,65, 10,69,78,67,79,68,73,78,71,32,54,53,52,49,56,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,53,48,10,53,48,10,53,48,10,52, 56,10,52,56,10,56,56,10,56,56,10,56,56,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,56,66,10,69,78, 67,79,68,73,78,71,32,54,53,52,49,57,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 56,48,10,56,48,10,70,56,10,56,48,10,56,48,10,56, 48,10,56,48,10,56,48,10,55,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,56,67,10,69,78,67,79,68, 73,78,71,32,54,53,52,50,48,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 48,56,10,48,56,10,48,56,10,48,56,10,49,48,10,49, 48,10,50,48,10,67,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,56,68,10,69,78,67,79,68,73,78,71, 32,54,53,52,50,49,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,50,48,10, 50,48,10,53,48,10,53,48,10,56,56,10,56,56,10,48, 52,10,48,52,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,56,69,10,69,78,67,79,68,73,78,71,32,54,53, 52,50,50,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,70,56,10, 50,48,10,50,48,10,65,56,10,65,56,10,50,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,56, 70,10,69,78,67,79,68,73,78,71,32,54,53,52,50,51, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,70,56,10,48,56,10,48,56,10,49,48,10, 53,48,10,54,48,10,50,48,10,49,48,10,49,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,57,48,10,69, 78,67,79,68,73,78,71,32,54,53,52,50,52,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,67,48,10,51,48,10,48,48,10,67,48,10,51,48,10, 48,48,10,56,48,10,54,48,10,49,56,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,57,49,10,69,78,67,79, 68,73,78,71,32,54,53,52,50,53,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,49,48,10,49,48,10,50,48,10,50,48,10,53,48,10, 52,56,10,66,56,10,67,52,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,57,50,10,69,78,67,79,68,73,78, 71,32,54,53,52,50,54,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,48,56, 10,52,56,10,50,56,10,49,48,10,49,48,10,50,56,10, 52,48,10,56,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,57,51,10,69,78,67,79,68,73,78,71,32,54, 53,52,50,55,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,70,48,10,52,48,10,52,48, 10,70,56,10,52,48,10,52,48,10,52,48,10,52,48,10, 51,56,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 57,52,10,69,78,67,79,68,73,78,71,32,54,53,52,50, 56,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,52,48,10,52,48,10,53,67,10,69,52, 10,50,52,10,50,56,10,49,48,10,49,48,10,49,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,57,53,10, 69,78,67,79,68,73,78,71,32,54,53,52,50,57,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,55,56,10,48,56,10,48,56,10,48,56, 10,49,48,10,49,48,10,49,48,10,70,67,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,57,54,10,69,78,67, 79,68,73,78,71,32,54,53,52,51,48,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,48,56,10,48,56,10,70,56,10,48,56, 10,48,56,10,48,56,10,70,56,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,57,55,10,69,78,67,79,68,73, 78,71,32,54,53,52,51,49,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,70,56,10,48, 48,10,48,48,10,70,56,10,48,56,10,48,56,10,49,48, 10,50,48,10,67,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,57,56,10,69,78,67,79,68,73,78,71,32, 54,53,52,51,50,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,56,56,10,56, 56,10,56,56,10,48,56,10,49,48,10,49,48,10,50,48, 10,52,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,57,57,10,69,78,67,79,68,73,78,71,32,54,53,52, 51,51,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,53,48,10,53,48,10,53, 48,10,53,48,10,57,48,10,57,48,10,57,52,10,57,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,57,65, 10,69,78,67,79,68,73,78,71,32,54,53,52,51,52,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,56,48,10,56,48,10,56,48,10,56,48,10,56, 48,10,56,48,10,56,56,10,57,48,10,69,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,57,66,10,69,78, 67,79,68,73,78,71,32,54,53,52,51,53,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,70,56,10,56,56,10,56,56,10,56,56,10,56, 56,10,56,56,10,56,56,10,70,56,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,57,67,10,69,78,67,79,68, 73,78,71,32,54,53,52,51,54,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,70,56,10, 56,56,10,56,56,10,56,56,10,49,48,10,49,48,10,50, 48,10,50,48,10,52,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,57,68,10,69,78,67,79,68,73,78,71, 32,54,53,52,51,55,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 56,48,10,52,48,10,48,48,10,48,52,10,48,56,10,51, 48,10,67,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,57,69,10,69,78,67,79,68,73,78,71,32,54,53, 52,51,56,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,52,48,10,50,48,10,56,48,10,52,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,57, 70,10,69,78,67,79,68,73,78,71,32,54,53,52,51,57, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,52,48, 10,65,48,10,52,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,65,49,10,69, 78,67,79,68,73,78,71,32,54,53,52,52,49,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,56,10,49,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,65,50,10,69,78,67,79, 68,73,78,71,32,54,53,52,52,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,70,56,10,50,56,10,50,56,10,50,56,10,50,56,10, 50,56,10,53,48,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,65,51,10,69,78,67,79,68,73,78, 71,32,54,53,52,52,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,67,56, 10,52,56,10,53,48,10,53,48,10,53,56,10,54,56,10, 65,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,65,52,10,69,78,67,79,68,73,78,71,32,54, 53,52,52,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,56,48,10,56,48, 10,56,48,10,56,48,10,56,48,10,56,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 65,53,10,69,78,67,79,68,73,78,71,32,54,53,52,52, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,66,56,10,57,48,10,57,48, 10,57,48,10,65,56,10,65,56,10,69,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,65,54,10, 69,78,67,79,68,73,78,71,32,54,53,52,52,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,66,56,10,56,48,10,66,56,10,56,48, 10,66,56,10,65,56,10,68,56,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,65,55,10,69,78,67, 79,68,73,78,71,32,54,53,52,52,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,70,56,10,56,48,10,56,48,10,56,48,10,56,48, 10,56,48,10,70,56,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,65,56,10,69,78,67,79,68,73, 78,71,32,54,53,52,52,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,70, 56,10,65,48,10,65,48,10,65,48,10,65,48,10,65,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,65,57,10,69,78,67,79,68,73,78,71,32, 54,53,52,52,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,56,10,48, 56,10,48,56,10,70,56,10,56,48,10,56,48,10,70,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,65,65,10,69,78,67,79,68,73,78,71,32,54,53,52, 53,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,70,56,10,50,56,10,50, 56,10,69,56,10,56,56,10,65,56,10,67,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,65,66, 10,69,78,67,79,68,73,78,71,32,54,53,52,53,49,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,68,67,10,53,52,10,53,52,10,68, 52,10,57,52,10,66,52,10,68,67,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,65,67,10,69,78, 67,79,68,73,78,71,32,54,53,52,53,50,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,68,52,10,53,52,10,53,52,10,68,67,10,57, 52,10,66,52,10,68,67,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,65,68,10,69,78,67,79,68, 73,78,71,32,54,53,52,53,51,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 69,52,10,50,52,10,50,56,10,69,56,10,57,52,10,66, 52,10,68,52,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,65,69,10,69,78,67,79,68,73,78,71, 32,54,53,52,53,52,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,68,56,10, 53,48,10,53,48,10,68,56,10,57,48,10,66,48,10,68, 56,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,65,70,10,69,78,67,79,68,73,78,71,32,54,53, 52,53,53,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,48,10,68,67,10,52,48,10, 53,52,10,68,52,10,57,52,10,65,56,10,68,67,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,66, 48,10,69,78,67,79,68,73,78,71,32,54,53,52,53,54, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,69,67,10,50,48,10,51,67,10, 69,56,10,57,67,10,66,52,10,68,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,66,49,10,69, 78,67,79,68,73,78,71,32,54,53,52,53,55,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,70,56,10,56,56,10,56,56,10,56,56,10, 56,56,10,56,56,10,70,56,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,66,50,10,69,78,67,79, 68,73,78,71,32,54,53,52,53,56,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,48, 10,56,56,10,56,56,10,56,56,10,70,56,10,56,56,10, 56,56,10,70,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,66,51,10,69,78,67,79,68,73,78, 71,32,54,53,52,53,57,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,48,10,65,56, 10,65,56,10,65,56,10,70,56,10,65,56,10,65,56,10, 70,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,66,52,10,69,78,67,79,68,73,78,71,32,54, 53,52,54,48,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,48,10,65,56,10,65,56, 10,65,56,10,69,56,10,66,52,10,66,52,10,68,52,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 66,53,10,69,78,67,79,68,73,78,71,32,54,53,52,54, 49,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,48,10,49,48,10,49,48,10,50,48, 10,50,48,10,53,48,10,53,48,10,56,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,66,54,10, 69,78,67,79,68,73,78,71,32,54,53,52,54,50,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,50,56,10,50,56,10,53,48,10,53,48, 10,53,56,10,65,56,10,65,52,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,66,55,10,69,78,67, 79,68,73,78,71,32,54,53,52,54,51,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,51,48,10,52,56,10,56,52,10,56,52,10,56,52, 10,52,56,10,51,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,66,56,10,69,78,67,79,68,73, 78,71,32,54,53,52,54,52,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,48,10,70, 56,10,48,56,10,49,48,10,51,48,10,52,56,10,52,56, 10,56,52,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,66,57,10,69,78,67,79,68,73,78,71,32, 54,53,52,54,53,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,48,10,70,56,10,53, 48,10,53,48,10,53,48,10,65,56,10,65,56,10,65,56, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,66,65,10,69,78,67,79,68,73,78,71,32,54,53,52, 54,54,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,48,10,55,48,10,48,48,10,70, 56,10,50,48,10,50,48,10,53,48,10,56,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,66,66, 10,69,78,67,79,68,73,78,71,32,54,53,52,54,55,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,70,56,10,48,56,10,48,56,10,70, 56,10,48,56,10,48,56,10,49,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,66,67,10,69,78, 67,79,68,73,78,71,32,54,53,52,54,56,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,70,56,10,56,48,10,56,48,10,70,56,10,56, 48,10,56,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,66,68,10,69,78,67,79,68, 73,78,71,32,54,53,52,54,57,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,48,10, 70,56,10,53,48,10,53,48,10,53,48,10,53,48,10,53, 48,10,70,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,66,69,10,69,78,67,79,68,73,78,71, 32,54,53,52,55,48,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,55,48,10,48,48,10, 70,56,10,48,48,10,55,48,10,56,56,10,56,56,10,55, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,67,50,10,69,78,67,79,68,73,78,71,32,54,53, 52,55,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 51,56,10,50,48,10,50,48,10,50,48,10,50,48,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,67, 51,10,69,78,67,79,68,73,78,71,32,54,53,52,55,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,56,10,52,56,10,52,56,10,55,56,10, 52,56,10,52,56,10,52,56,10,48,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,67,52,10,69, 78,67,79,68,73,78,71,32,54,53,52,55,54,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,50,48,10,50,48,10,51,56,10,50,48,10,51,56,10, 50,48,10,50,48,10,50,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,67,53,10,69,78,67,79, 68,73,78,71,32,54,53,52,55,55,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,56, 10,52,56,10,55,56,10,52,56,10,55,56,10,52,56,10, 52,56,10,48,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,67,54,10,69,78,67,79,68,73,78, 71,32,54,53,52,55,56,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,48,56, 10,48,56,10,51,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,67,55,10,69,78,67,79,68,73,78,71,32,54, 53,52,55,57,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,48,56,10,50,56,10,50,56, 10,69,56,10,50,56,10,50,56,10,50,56,10,48,56,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 67,65,10,69,78,67,79,68,73,78,71,32,54,53,52,56, 50,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,48,56,10,48,56,10,51,56,10,48,56, 10,51,56,10,48,56,10,48,56,10,48,56,10,48,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,67,66,10, 69,78,67,79,68,73,78,71,32,54,53,52,56,51,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,56,10,50,56,10,69,56,10,50,56,10,69,56, 10,50,56,10,50,56,10,48,56,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,67,67,10,69,78,67, 79,68,73,78,71,32,54,53,52,56,52,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,48, 48,10,48,48,10,48,48,10,50,48,10,50,48,10,50,48, 10,70,56,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,67,68,10,69,78,67,79,68,73, 78,71,32,54,53,52,56,53,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,48,56,10,48, 56,10,48,56,10,52,56,10,52,67,10,53,56,10,69,56, 10,48,56,10,48,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,67,69,10,69,78,67,79,68,73,78,71,32, 54,53,52,56,54,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,48,52,10,49,52,10,49, 52,10,53,67,10,53,52,10,55,52,10,68,52,10,48,52, 10,48,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,67,70,10,69,78,67,79,68,73,78,71,32,54,53,52, 56,55,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,48,56,10,48,56,10,52,56,10,52, 56,10,53,56,10,69,56,10,48,56,10,48,56,10,48,48, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,68,50, 10,69,78,67,79,68,73,78,71,32,54,53,52,57,48,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,53,48,10,53, 48,10,53,48,10,70,56,10,48,48,10,48,48,10,48,48, 10,48,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,68,51,10,69,78, 67,79,68,73,78,71,32,54,53,52,57,49,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,48,48,10,70,56,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,68,52,10,69,78,67,79,68, 73,78,71,32,54,53,52,57,50,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,48,56,10, 48,56,10,48,56,10,49,56,10,69,56,10,52,56,10,55, 56,10,52,56,10,48,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,68,53,10,69,78,67,79,68,73,78,71, 32,54,53,52,57,51,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,52,10,49,52,10, 49,52,10,49,52,10,70,52,10,53,52,10,55,52,10,53, 52,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,68,54,10,69,78,67,79,68,73,78,71,32,54,53, 52,57,52,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,48,56,10,48,56,10,48,56,10, 49,56,10,69,56,10,52,56,10,52,56,10,52,56,10,48, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,68, 55,10,69,78,67,79,68,73,78,71,32,54,53,52,57,53, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 70,56,10,53,48,10,53,48,10,53,48,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,68,65,10,69, 78,67,79,68,73,78,71,32,54,53,52,57,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 48,48,10,48,48,10,48,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,68,66,10,69,78,67,79, 68,73,78,71,32,54,53,52,57,57,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,48,48,10,48,48,10,48,56, 10,48,56,10,48,56,10,48,56,10,48,56,10,49,56,10, 69,56,10,48,56,10,48,48,10,48,48,10,48,48,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,68,67,10,69,78,67,79,68,73,78, 71,32,54,53,53,48,48,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,48,56,10,48,56, 10,48,56,10,48,56,10,48,56,10,48,56,10,48,56,10, 48,56,10,48,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,83,84,65,82,84,67,72,65,82,32,117,110, 105,70,70,69,48,10,69,78,67,79,68,73,78,71,32,54, 53,53,48,52,10,83,87,73,68,84,72,32,52,56,48,32, 48,10,68,87,73,68,84,72,32,54,32,48,10,66,66,88, 32,54,32,49,51,32,48,32,45,50,10,66,73,84,77,65, 80,10,48,48,10,48,48,10,50,48,10,55,48,10,65,56, 10,65,48,10,65,48,10,65,56,10,55,48,10,50,48,10, 48,48,10,48,48,10,48,48,10,69,78,68,67,72,65,82, 10,83,84,65,82,84,67,72,65,82,32,117,110,105,70,70, 69,49,10,69,78,67,79,68,73,78,71,32,54,53,53,48, 53,10,83,87,73,68,84,72,32,52,56,48,32,48,10,68, 87,73,68,84,72,32,54,32,48,10,66,66,88,32,54,32, 49,51,32,48,32,45,50,10,66,73,84,77,65,80,10,48, 48,10,48,48,10,51,48,10,52,56,10,52,48,10,52,48, 10,69,48,10,52,48,10,52,48,10,52,56,10,66,48,10, 48,48,10,48,48,10,69,78,68,67,72,65,82,10,83,84, 65,82,84,67,72,65,82,32,117,110,105,70,70,69,50,10, 69,78,67,79,68,73,78,71,32,54,53,53,48,54,10,83, 87,73,68,84,72,32,52,56,48,32,48,10,68,87,73,68, 84,72,32,54,32,48,10,66,66,88,32,54,32,49,51,32, 48,32,45,50,10,66,73,84,77,65,80,10,48,48,10,48, 48,10,48,48,10,48,48,10,48,48,10,48,48,10,70,56, 10,48,56,10,48,56,10,48,48,10,48,48,10,48,48,10, 48,48,10,69,78,68,67,72,65,82,10,83,84,65,82,84, 67,72,65,82,32,117,110,105,70,70,69,51,10,69,78,67, 79,68,73,78,71,32,54,53,53,48,55,10,83,87,73,68, 84,72,32,52,56,48,32,48,10,68,87,73,68,84,72,32, 54,32,48,10,66,66,88,32,54,32,49,51,32,48,32,45, 50,10,66,73,84,77,65,80,10,48,48,10,48,48,10,70, 56,10,48,48,10,48,48,10,48,48,10,48,48,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,48,48,10, 69,78,68,67,72,65,82,10,83,84,65,82,84,67,72,65, 82,32,117,110,105,70,70,69,52,10,69,78,67,79,68,73, 78,71,32,54,53,53,48,56,10,83,87,73,68,84,72,32, 52,56,48,32,48,10,68,87,73,68,84,72,32,54,32,48, 10,66,66,88,32,54,32,49,51,32,48,32,45,50,10,66, 73,84,77,65,80,10,48,48,10,48,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,50,48,10,50,48, 10,50,48,10,50,48,10,48,48,10,48,48,10,69,78,68, 67,72,65,82,10,83,84,65,82,84,67,72,65,82,32,117, 110,105,70,70,69,53,10,69,78,67,79,68,73,78,71,32, 54,53,53,48,57,10,83,87,73,68,84,72,32,52,56,48, 32,48,10,68,87,73,68,84,72,32,54,32,48,10,66,66, 88,32,54,32,49,51,32,48,32,45,50,10,66,73,84,77, 65,80,10,48,48,10,48,48,10,56,56,10,56,56,10,53, 48,10,53,48,10,70,56,10,50,48,10,70,56,10,50,48, 10,50,48,10,48,48,10,48,48,10,69,78,68,67,72,65, 82,10,83,84,65,82,84,67,72,65,82,32,117,110,105,70, 70,69,54,10,69,78,67,79,68,73,78,71,32,54,53,53, 49,48,10,83,87,73,68,84,72,32,52,56,48,32,48,10, 68,87,73,68,84,72,32,54,32,48,10,66,66,88,32,54, 32,49,51,32,48,32,45,50,10,66,73,84,77,65,80,10, 48,48,10,48,48,10,56,56,10,56,56,10,70,56,10,56, 56,10,70,56,10,65,56,10,65,56,10,68,56,10,56,56, 10,48,48,10,48,48,10,69,78,68,67,72,65,82,10,83, 84,65,82,84,67,72,65,82,32,117,110,105,70,70,69,56, 10,69,78,67,79,68,73,78,71,32,54,53,53,49,50,10, 83,87,73,68,84,72,32,52,56,48,32,48,10,68,87,73, 68,84,72,32,54,32,48,10,66,66,88,32,54,32,49,51, 32,48,32,45,50,10,66,73,84,77,65,80,10,50,48,10, 50,48,10,50,48,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,50,48,10,50,48,10,50,48, 10,50,48,10,69,78,68,67,72,65,82,10,83,84,65,82, 84,67,72,65,82,32,117,110,105,70,70,69,57,10,69,78, 67,79,68,73,78,71,32,54,53,53,49,51,10,83,87,73, 68,84,72,32,52,56,48,32,48,10,68,87,73,68,84,72, 32,54,32,48,10,66,66,88,32,54,32,49,51,32,48,32, 45,50,10,66,73,84,77,65,80,10,48,48,10,48,48,10, 48,48,10,48,48,10,48,48,10,50,48,10,52,48,10,70, 56,10,52,48,10,50,48,10,48,48,10,48,48,10,48,48, 10,69,78,68,67,72,65,82,10,83,84,65,82,84,67,72, 65,82,32,117,110,105,70,70,69,65,10,69,78,67,79,68, 73,78,71,32,54,53,53,49,52,10,83,87,73,68,84,72, 32,52,56,48,32,48,10,68,87,73,68,84,72,32,54,32, 48,10,66,66,88,32,54,32,49,51,32,48,32,45,50,10, 66,73,84,77,65,80,10,48,48,10,48,48,10,50,48,10, 55,48,10,65,56,10,50,48,10,50,48,10,50,48,10,50, 48,10,50,48,10,50,48,10,48,48,10,48,48,10,69,78, 68,67,72,65,82,10,83,84,65,82,84,67,72,65,82,32, 117,110,105,70,70,69,66,10,69,78,67,79,68,73,78,71, 32,54,53,53,49,53,10,83,87,73,68,84,72,32,52,56, 48,32,48,10,68,87,73,68,84,72,32,54,32,48,10,66, 66,88,32,54,32,49,51,32,48,32,45,50,10,66,73,84, 77,65,80,10,48,48,10,48,48,10,48,48,10,48,48,10, 48,48,10,50,48,10,49,48,10,70,56,10,49,48,10,50, 48,10,48,48,10,48,48,10,48,48,10,69,78,68,67,72, 65,82,10,83,84,65,82,84,67,72,65,82,32,117,110,105, 70,70,69,67,10,69,78,67,79,68,73,78,71,32,54,53, 53,49,54,10,83,87,73,68,84,72,32,52,56,48,32,48, 10,68,87,73,68,84,72,32,54,32,48,10,66,66,88,32, 54,32,49,51,32,48,32,45,50,10,66,73,84,77,65,80, 10,48,48,10,48,48,10,50,48,10,50,48,10,50,48,10, 50,48,10,50,48,10,50,48,10,65,56,10,55,48,10,50, 48,10,48,48,10,48,48,10,69,78,68,67,72,65,82,10, 83,84,65,82,84,67,72,65,82,32,117,110,105,70,70,69, 68,10,69,78,67,79,68,73,78,71,32,54,53,53,49,55, 10,83,87,73,68,84,72,32,52,56,48,32,48,10,68,87, 73,68,84,72,32,54,32,48,10,66,66,88,32,54,32,49, 51,32,48,32,45,50,10,66,73,84,77,65,80,10,48,48, 10,48,48,10,48,48,10,48,48,10,48,48,10,70,56,10, 70,56,10,70,56,10,70,56,10,70,56,10,48,48,10,48, 48,10,48,48,10,69,78,68,67,72,65,82,10,83,84,65, 82,84,67,72,65,82,32,117,110,105,70,70,69,69,10,69, 78,67,79,68,73,78,71,32,54,53,53,49,56,10,83,87, 73,68,84,72,32,52,56,48,32,48,10,68,87,73,68,84, 72,32,54,32,48,10,66,66,88,32,54,32,49,51,32,48, 32,45,50,10,66,73,84,77,65,80,10,48,48,10,48,48, 10,48,48,10,48,48,10,51,48,10,52,56,10,56,52,10, 56,52,10,52,56,10,51,48,10,48,48,10,48,48,10,48, 48,10,69,78,68,67,72,65,82,10,83,84,65,82,84,67, 72,65,82,32,117,110,105,70,70,70,67,10,69,78,67,79, 68,73,78,71,32,54,53,53,51,50,10,83,87,73,68,84, 72,32,52,56,48,32,48,10,68,87,73,68,84,72,32,54, 32,48,10,66,66,88,32,54,32,49,51,32,48,32,45,50, 10,66,73,84,77,65,80,10,53,52,10,65,48,10,65,52, 10,65,48,10,55,52,10,50,56,10,66,52,10,50,56,10, 66,67,10,48,52,10,56,52,10,49,52,10,65,56,10,69, 78,68,67,72,65,82,10,83,84,65,82,84,67,72,65,82, 32,117,110,105,70,70,70,68,10,69,78,67,79,68,73,78, 71,32,54,53,53,51,51,10,83,87,73,68,84,72,32,52, 56,48,32,48,10,68,87,73,68,84,72,32,54,32,48,10, 66,66,88,32,54,32,49,51,32,48,32,45,50,10,66,73, 84,77,65,80,10,48,48,10,48,48,10,55,48,10,68,56, 10,65,56,10,69,56,10,68,56,10,68,56,10,70,56,10, 68,56,10,55,48,10,48,48,10,48,48,10,69,78,68,67, 72,65,82,10,69,78,68,70,79,78,84,10,}; size_t lxFNT6x13_bdf_size = 550764; therion/maketest.pl0000664000175000017500000000007410576400772013431 0ustar useruserif ((-s $ARGV[0]) > 0) { exit 0 } else { die "error" } therion/makeunixify.tcl0000664000175000017500000000337012447771112014314 0ustar useruserproc procdir {dir} { set dirs [glob -nocomplain -directory $dir -types d *] set files [glob -nocomplain -directory $dir -types f *] foreach d $dirs { exec chmod 775 $d procdir $d } puts "\n\n\nDIR: $dir" foreach f $files { puts $f exec chmod 664 $f dos2unix $f } } proc dos2unix {fnm} { set doit 0 if {[regexp {\.(c|cxx|h|tcl|svx|th|ini|thcfg|th2|thc|cof|xpm|txt|pl|mp|tex|TXT|sty|usr|enc|htm|xvi)$} $fnm]} { set doit 1 } elseif {[regexp {(Makefile|TODO\.\w|README|COPYING|CHANGES|thconfig|thconfig\..*)$} $fnm]} { set doit 1 } if {!$doit} return; set fmtime [file mtime $fnm] set fid [open $fnm r] fconfigure $fid -translation binary set fdt [read $fid] close $fid if {[regexp {\15} $fdt]} { puts " ...converted to UNIX format" regsub -all {\15} $fdt {} fdt set fid [open $fnm w] fconfigure $fid -translation binary puts -nonewline $fid $fdt close $fid file mtime $fnm $fmtime } } procdir . exec chmod 775 ./cclass.pl exec chmod 775 makeconvert.pl exec chmod 775 makeconvert2.pl exec chmod 775 thcsdata.tcl exec chmod 775 threpair-files exec chmod 775 thsymbolsetlist.pl exec chmod 775 geomag/igrf2c.py exec chmod 775 mpost/genmpost.pl exec chmod 775 samples/samples.tcl exec chmod 775 tex/gentex.pl exec chmod 775 texenc/afm2enc.pl exec chmod 775 texenc/mktexenc.pl exec chmod 775 texenc/unidata.pl exec chmod 775 thchencdata/generate.pl exec chmod 775 thlang/process.pl exec chmod 775 thlang/thlang_stats.pl exec chmod 775 xtherion/bac.tcl exec chmod 775 xtherion/dbg.tcl exec chmod 775 xtherion/bac.tcl exec chmod 775 xtherion/source.tcl exec chmod 775 xtherion/lang/process.pl exec chmod 775 ./abisso2th.py exec chmod 775 geomag/test/build.sh exec chmod 775 geomag/test/test.py therion/thpdfdbg.cxx0000664000175000017500000001051310737424264013565 0ustar useruser/** * @file thpdfdbg.cxx */ /* Copyright (C) 2003 Martin Budaj * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include "thpdfdbg.h" #include "thpdfdata.h" #ifndef NOTHERION #include "thexception.h" #endif using namespace std; string tex_Xname(string s) {return("THX"+s);} string tex_Wname(string s) {return("THW"+s);} // special = northarrow &c. string u2str(unsigned u) { unsigned i=u; char c; string s=""; while (i>0) { c = 'a' + ((i-1) % 26); s = c + s; i = (i-1) / 26; }; return (s); } string rgb2svg(double r, double g, double b) { char ch[8]; sprintf(ch,"#%02x%02x%02x",int(255*r) % 256, int(255*g) % 256, int(255*b) % 256); return (string) ch; } void print_hash(){ ofstream F("scraps.dat"); if(!F) therror(("Can't open file `scraps.dat'")); F << "[SCRAP]" << endl; for (list::iterator I = SCRAPLIST.begin(); I != SCRAPLIST.end(); I++) { F << "N " << I->name << endl; if (I->F != "") { F << "F " << I->F1 << " " << I->F2 << " " << I->F3 << " " << I->F4 << endl; } if (I->G != "") { F << "G " << I->G1 << " " << I->G2 << " " << I->G3 << " " << I->G4 << endl; } if (I->B != "") { F << "B " << I->B1 << " " << I->B2 << " " << I->B3 << " " << I->B4 << endl; } if (I->I != "") { F << "I " << I->I1 << " " << I->I2 << " " << I->I3 << " " << I->I4 << endl; } if (I->E != "") { F << "E " << I->E1 << " " << I->E2 << " " << I->E3 << " " << I->E4 << endl; } if (I->X != "") { F << "X " << I->X1 << " " << I->X2 << " " << I->X3 << " " << I->X4 << endl; } if (I->P != "") { F << "P " << I->P << " " << I->S1 << " " << I->S2 << endl; } F << "Y " << I->layer << endl; F << "V " << I->level << endl; if (I->sect != 0) { F << "Z 1" << endl; } } F << "[LAYER]" << endl; for (map::iterator I = LAYERHASH.begin(); I != LAYERHASH.end(); I++) { F << "R " << (*I).first << endl; if (!(((*I).second).U).empty()) { F << "U"; for (set::iterator J = (((*I).second).U).begin(); J != (((*I).second).U).end(); J++) { F << " " << *J; } F << endl; } if (!(((*I).second).D).empty()) { F << "D"; for (set::iterator J = (((*I).second).D).begin(); J != (((*I).second).D).end(); J++) { F << " " << *J; } F << endl; } if (((*I).second).N != "") { F << "N " << ((*I).second).N << endl; } if (((*I).second).T != "") { F << "T " << ((*I).second).T << endl; } if (I->second.Z != 0) { F << "Z 1" << endl; } } F << "[MAP]" << endl; if (!MAP_PREVIEW_UP.empty()) { F << "U"; for (set::iterator J = MAP_PREVIEW_UP.begin(); J != MAP_PREVIEW_UP.end(); J++) { F << " " << *J; } F << endl; } if (!MAP_PREVIEW_DOWN.empty()) { F << "D"; for (set::iterator J = MAP_PREVIEW_DOWN.begin(); J != MAP_PREVIEW_DOWN.end(); J++) { F << " " << *J; } F << endl; } F.close(); } void thpdfdbg() { print_hash(); } therion/thtmpdir.h0000664000175000017500000000450712071370220013252 0ustar useruser/** * @file thtmpdir.h * Temporary directory module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtmpdir_h #define thtmpdir_h #include "thbuffer.h" /** * Temporary directory module. * * Creates and remove temporary directory. */ class thtmpdir { public: bool exist; ///< ID whether temp directory exist. bool tried; ///< ID, if we've tried to create temp directory. bool delete_all; ///< ID whether to delete temporary directory. bool debug; ///< ID, whether debugging mode is on. thbuffer name, ///< Name of temp dir. file_name, ///< Name of temporary file. tmp_remove_script; /** * Creates temporary directory. */ void create(); /** * Removes temporaty directory. */ void remove(); /** * Standard constructor. */ thtmpdir(); /** * Standard destructor. */ ~thtmpdir(); /** * Retrieve temporary directory name. */ const char* get_dir_name(); /** * Form valid path from temporary directory name and given file name. */ const char* get_file_name(const char *fname); /** * Set deleting state. */ void set_delete(bool delete_id); /** * Retrieve deleting state. */ bool get_delete(); /** * Turn deleting temp directory on. */ void delete_on(); /** * Turn deleting temp directory off. */ void delete_off(); }; extern thtmpdir thtmp; #endif therion/thdatabase.h0000664000175000017500000001721111706260072013522 0ustar useruser/** * @file thdatabase.h * Database module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thdatabase_h #define thdatabase_h #include #include #include #include "thdataobject.h" #include "thmbuffer.h" #include "thbuffer.h" #include "thdb1d.h" #include "thdb2d.h" #include "thobjectname.h" #include "thobjectsrc.h" #include "thattr.h" #include /** * Input contexts. */ enum { THCTX_NONE = 1, ///< None THCTX_SURVEY = 2, ///< Survey context THCTX_SCRAP = 4, ///< Scrap context }; /** * Option positions. */ enum { THOP_INLINE = 1, ///< Whether option stands in separate line. THOP_CONFIGURE = 2, ///< Whether option is set via configure command. }; /** * Survey name class. */ class thsurveyname { public: const char * n; ///< Data. thsurveyname(): n("") {} ///< Standard constructor. /** * Default contructor. * * @param n Survey name. */ thsurveyname(const char * nn) : n(nn) {} /** * Comparison operator. */ friend bool operator < (const class thsurveyname & n1, const class thsurveyname & n2); }; /** * Revision class. */ class threvision { public: unsigned long id, ///< Object id. r; ///< Revision. thobjectsrc srcf; ///< File name. threvision(): id(0), r(0) {} ///< Standard constructor. /** * Default contructor. * * @param rid Revision object id. * @param rr Revision number. */ threvision(unsigned long rid, unsigned long rr) : id(rid), r(rr) {} /** * Default contructor. * * @param rid Revision object id. * @param rr Revision number. * @param rsrcf File name. */ threvision(unsigned long rid, unsigned long rr, thobjectsrc rsrcf) : id(rid), r(rr), srcf(rsrcf) {} /** * Comparison operator. */ friend bool operator < (const class threvision & r1, const class threvision & r2); }; typedef std::set < thsurveyname > thdb_dictionary_type; ///< Database dictionary. typedef std::set < threvision > thdb_revision_set_type; ///< Object revision set type. typedef std::map < thobjectid, class thdataobject * > thdb_object_map_type; ///< Object map typedef std::map < thsurveyname, class thsurvey * > thdb_survey_map_type; ///< Survey map typedef std::map < thsurveyname, class thdataobject * > thdb_grade_map_type; ///< Grade map typedef thdb_grade_map_type thdb_layout_map_type; ///< Layout map typedef std::list < class thdataobject * > thdb_object_list_type; ///< Object list /** * Main database class. * * Store all the data maintained by therion. */ class thdatabase { public: thmbuffer buff_strings; ///< String storage buffer. int ccontext; ///< Current context. class thsurvey * csurveyptr, ///< Pointer to the current survey. * fsurveyptr; ///< Pointer to the first survey. unsigned csurveylevel; ///< Current survey level. class thscrap * cscrapptr; ///< Current scrap. class th2ddataobject * lcscrapoptr; ///< Last object in given current scrap. class thdataobject * lcsobjectptr; ///< Last object in given current survey. thdb_dictionary_type dictionary; ///< Database dictionary. unsigned long objid, ///< Object identifier nscraps; ///< Total number of scraps. void reset_context(); ///< Reset database context. public: thbuffer buff_enc; ///< Encoding buffer. thbuffer buff_tmp; ///< Temporary buffer. thmbuffer mbuff_tmp, mbuff_tmp2; ///< Temporary mbuffer. thmbuffer buff_stations; ///< Stations storage buffer. thdb_revision_set_type revision_set; ///< Object revisions. thdb1d db1d; ///< Survey data part of database. thdb2d db2d; ///< 2D data part of database. thattr attr; ///< Object attributes. thobjectsrc csrc; ///< Current source position. thdb_object_map_type object_map; ///< Object search hash thdb_survey_map_type survey_map; ///< Survey search hash thdb_grade_map_type grade_map; ///< Grade search hash thdb_layout_map_type layout_map; ///< Layout search hash thdb_layout_map_type lookup_map; ///< Lookup search hash thdb_object_list_type object_list; ///< Object list /** * Standard constructor. */ thdatabase(); /** * Standard destructor. */ ~thdatabase(); /** * Clear the contents of the database. */ void clear(); /** * Create an data object linked to the database. */ class thdataobject * create(const char * oclass, thobjectsrc osrc); /** * Revise object in database. */ class thdataobject * revise(char * name, class thsurvey * fathersptr, thobjectsrc osrc); /** * Return pointer to current survey. */ class thsurvey * get_current_survey(); /** * Return pointer to current scrap. */ class thscrap * get_current_scrap(); /** * Insert data object into database. */ void check_context(class thdataobject * optr); /** * Insert data object into database. */ void insert(class thdataobject * optr); /** * Insert survey grade object into database. */ void insert_grade(class thgrade * optr); /** * Insert map layout object into database. */ void insert_layout(class thlayout * optr); /** * Insert lookup object into database. */ void insert_lookup(class thlookup * optr); /** * Retrieve survey grade from database. */ class thgrade * get_grade(char * gname); /** * Retrieve map layout from database. */ class thlayout * get_layout(const char * gname); /** * Retrieve lookup from database. */ class thlookup * get_lookup(const char * gname); /** * Store given string in the database. */ const char * strstore(const char * src, bool use_dic = false); /** * End objects insertion. */ void end_insert(); /** * Print database contents into file. */ void self_print(FILE * outf); /** * Insert a datastation into database. */ bool insert_datastation(thobjectname on, thsurvey * ps); /** * Get object from database. */ thdataobject * get_object(thobjectname on, thsurvey * ps); /** * Get survey from database. */ thsurvey * get_survey(const char * sn, thsurvey * ps); thsurvey * get_survey_noexc(const char * sn, thsurvey * ps); thsurvey * get_exact_survey_noexc(const char * sn, thsurvey * ps); /** * Get survey id from database. */ unsigned long get_survey_id(const char * sn, thsurvey * ps); /** * Print library from current database. */ void self_print_library(); /** * Process database references. */ void preprocess(); void insert_equate(int nargs, char ** args); }; /** * Database module. */ extern thdatabase thdb; #endif therion/thsurvey.cxx0000664000175000017500000001726510751741532013703 0ustar useruser/** * @file thsurvey.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thsurvey.h" #include "thexception.h" #include "thchenc.h" #include "thdate.h" #include "thtfangle.h" #include "thinfnan.h" #include "thdata.h" thsurvey::thsurvey() { this->full_name = ""; this->reverse_full_name = this->full_name; this->foptr = NULL; this->loptr = NULL; this->decdef = false; this->decuds = thnan; this->num1 = 0; this->level = 0; this->person_renames.clear(); this->entrance.clear(); this->data = NULL; this->privatens = true; this->surveyns = NULL; } thsurvey * thsurvey::get_nss() { if (this->surveyns == NULL) { this->surveyns = this; if (!this->privatens) { while ((!this->surveyns->privatens) && (this->surveyns->fsptr != NULL)) { this->surveyns = this->surveyns->fsptr; } } } return this->surveyns; } thsurvey::~thsurvey() { } int thsurvey::get_class_id() { return TT_SURVEY_CMD; } bool thsurvey::is(int class_id) { if (class_id == TT_SURVEY_CMD) return true; else return thdataobject::is(class_id); } int thsurvey::get_cmd_nargs() { return 1; } const char * thsurvey::get_cmd_end() { // insert endcommand if multiline command return NULL; } const char * thsurvey::get_cmd_name() { // insert endcommand if multiline command return "survey"; } thcmd_option_desc thsurvey::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_survey_opt); if (id == TT_SURVEY_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else switch (id) { case TT_SURVEY_PERSON_RENAME: return thcmd_option_desc(id,2); default: return thcmd_option_desc(id); } } enum { TT_SNS_EXPORT, TT_SNS_PRIVATE, TT_SNS_UNKNOWN, }; static const thstok thtt_sns[] = { {"off",TT_SNS_EXPORT}, {"on",TT_SNS_PRIVATE}, {NULL, TT_SNS_UNKNOWN}, }; void thsurvey::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { thperson tmpp1, tmpp2; if (cod.id == 1) cod.id = TT_DATAOBJECT_NAME; switch (cod.id) { case TT_SURVEY_NAMESPACE: switch (thmatch_token(*args, thtt_sns)) { case TT_SNS_PRIVATE: this->privatens = false; break; case TT_SNS_EXPORT: this->privatens = false; break; default: ththrow(("invalid -namespace switch -- %s", *args)) } break; case TT_SURVEY_DECLINATION: this->parse_declination(*args); break; case TT_SURVEY_PERSON_RENAME: thencode(&(this->db->buff_enc), args[0], argenc); tmpp1.parse(this->db, this->db->buff_enc.get_buffer()); thencode(&(this->db->buff_enc), args[1], argenc); tmpp2.parse(this->db, this->db->buff_enc.get_buffer()); this->person_renames[tmpp1] = tmpp2; break; case TT_SURVEY_ENTRANCE: thparse_objectname(this->entrance, & this->db->buff_stations, *args); break; case TT_DATAOBJECT_NAME: if (th_is_keyword(*args)) this->name = this->db->strstore(*args); else ththrow(("invalid keyword -- %s", *args)); break; default: thdataobject::set(cod, args, argenc, indataline); } } void thsurvey::self_delete() { delete this; } void thsurvey::self_print_properties(FILE * outf) { size_t nval, idx; thtfpwfxy * vals; thdataobject::self_print_properties(outf); fprintf(outf,"thsurvey:\n"); fprintf(outf,"\tfull name: \"%s\" (\"%s\")\n", this->full_name, this->reverse_full_name.get_buffer()); if (this->decdef) { fprintf(outf,"\tdeclination:\n"); nval = this->declin.get_size(); vals = this->declin.get_values(); for(idx = 0; idx < nval; idx++) { fprintf(outf,"\t\t%0.2f -> %8.5f deg\n",vals[idx].x,vals[idx].y); } } else fprintf(outf,"\tdeclination: none\n"); fprintf(outf,"\tlength: %g\n",this->stat.length); } int thsurvey::get_context() { return (THCTX_SURVEY | THCTX_NONE); } const char * thsurvey::get_full_name() { return this->full_name; } void thsurvey::parse_declination(char * str) { // splitne input string thtfangle du; thdate dd; double decl, //year, dumdt; double * all_data = NULL; double data2 [2]; int nid, idx, dateidx, typedt; thsplit_args(& this->db->mbuff_tmp, str); long nargs = this->db->mbuff_tmp.get_size(); char ** args = this->db->mbuff_tmp.get_buffer(); // ak 1 4 6 ... error if ((nargs == 1) || (((nargs % 2) == 0) && (nargs > 3))) ththrow(("invalid declination specification -- \"%s\"",str)) // ak 0 tak resetuje a nastavi na 0 if (nargs == 0) { this->decdef = false; return; } // ak nie, tak parsne jednotky nargs--; du.parse_units(args[nargs]); // ak 2 tak nastavi pausalne s rokom 0 if (nargs == 1) { thparse_double(nid, decl, args[0]); if (nid != TT_SV_NUMBER) ththrow(("invalid declination -- %s", args[0])) decl = du.transform(decl); data2[0] = 0.0; data2[1] = decl; this->decuds = decl; this->declin.set(1,data2); this->decdef = true; return; } all_data = new double [nargs]; nargs = nargs/2; dateidx = 0; for(idx = 0; idx < nargs; idx++) { // let's try if undated declination specification thparse_double(typedt, dumdt, args[2 * idx]); if (typedt == TT_SV_NAN) { thparse_double(nid, decl, args[2 * idx + 1]); if (nid != TT_SV_NUMBER) { delete [] all_data; ththrow(("invalid declination -- %s", args[2 * idx + 1])) } this->decuds = decl; } // if not, try dated declination specification else { try { dd.parse(args[2 * idx]); } catch (...) { delete [] all_data; threthrow(("invalid declination specification")) } all_data[2 * dateidx] = dd.get_start_year(); // parse declination thparse_double(nid, decl, args[2 * idx + 1]); if (nid != TT_SV_NUMBER) { delete [] all_data; ththrow(("invalid declination -- %s", args[2 * idx + 1])) } all_data[2 * dateidx + 1] = du.transform(decl); dateidx++; } } // set declination if (dateidx == 0) { data2[0] = 0.0; data2[1] = this->decuds; this->declin.set(1,data2); } else this->declin.set(dateidx,all_data); this->decdef = true; delete [] all_data; } void thsurvey::full_name_reverse() { size_t fnln = strlen(this->full_name), i1, i2, si; //, ei; const char * c1, *c3; char * c2; c1 = this->full_name; si = 0; bool has_dot = false; for(i1 = 0; i1 <= fnln; i1++, c1++) { if ((*c1 == '.') || ((i1 == fnln) && has_dot)) { has_dot = true; c3 = this->full_name + si; c2 = this->reverse_full_name.get_buffer() + fnln - i1; if (i1 < fnln) { c2--; *c2 = '.'; c2++; } for(i2 = si; i2 < i1; i2++, c2++, c3++) *c2 = *c3; si = i1 + 1; } } } therion/thlogfile.h0000664000175000017500000000474510625655142013414 0ustar useruser/** * @file thlogfile.h * Log file module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thlogfile_h #define thlogfile_h #include "thbuffer.h" #include #include /** * Log file module. * * Provides work with log file. */ class thlogfile { thbuffer file_name; ///< Name of log file. FILE* fileh; ///< File handler. bool is_open; ///< File is open ID. bool is_warned; ///< File couldn't be opened ID. bool is_logging; ///< Loggind ID. /** * Open log file for output. */ void open_file(); /** * Close log file. */ void close_file(); public: /** * Standard constructor. */ thlogfile(); /** * Standard destructor. */ ~thlogfile(); /** * Print formatted into log file. */ void vprintf(const char *format, va_list *args); /** * Print formatted into log file. */ void printf(const char * format, ...); /** * Set log file name. * * @param fname File name. */ void set_file_name(char *fname); /** * Retrieve log file name. */ const char* get_file_name(); /** * Set logging state. */ void set_logging(bool log_io); /** * Retrieve logging state. */ bool get_logging(); /** * Turn on logging. */ void logging_on(); /** * Turn off logging. */ void logging_off(); /** * Logging error. */ void log_error(); /** * Return log file handler. */ FILE * get_fileh(); }; /** * Log file module. */ extern thlogfile thlog; #endif therion/thdb2dxm.cxx0000664000175000017500000000236610625655142013523 0ustar useruser/** * @file thdb2dxm.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2dxm.h" #include "thdb2dmi.h" thdb2dxm::thdb2dxm() { this->prev_item = NULL; this->next_item = NULL; this->first_bm = NULL; this->last_bm = NULL; this->title = false; this->expand = false; this->map = NULL; this->selection_level = 0; this->output_number = 0; } therion/thendsurvey.h0000664000175000017500000000501310721450240013771 0ustar useruser/** * @file thendsurvey.h * Endsurvey module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thendsurvey_h #define thendsurvey_h #include "thdataobject.h" /** * endsurvey class. */ class thendsurvey : public thdataobject { public: /** * Standard constructor. */ thendsurvey(); /** * Standard destructor. */ ~thendsurvey(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Get context for object. */ virtual int get_context(); /** * Return class name. */ virtual const char * get_class_name() {return "thendsurvey";}; /** * Print object contents into file. */ virtual void self_print_properties(FILE * outf); }; #endif therion/tharea.h0000664000175000017500000001014110721450266012663 0ustar useruser/** * @file tharea.h * Area module. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef tharea_h #define tharea_h #include "th2ddataobject.h" #include "thdb2dab.h" /** * Area command options tokens. */ enum { TT_AREA_UNKNOWN = 3000, TT_AREA_TYPE = 3001, }; /** * Area command options parsing table. */ static const thstok thtt_area_opt[] = { {NULL, TT_AREA_UNKNOWN}, }; /** * Area type tokens. */ enum { TT_AREA_TYPE_UNKNOWN, TT_AREA_TYPE_U, TT_AREA_TYPE_WATER, TT_AREA_TYPE_SUMP, TT_AREA_TYPE_SAND, TT_AREA_TYPE_DEBRIS, TT_AREA_TYPE_BLOCKS, TT_AREA_TYPE_SNOW, TT_AREA_TYPE_ICE, TT_AREA_TYPE_CLAY, TT_AREA_TYPE_PEBBLES, TT_AREA_TYPE_BEDROCK, TT_AREA_TYPE_FLOWSTONE, TT_AREA_TYPE_MOONMILK, TT_AREA_TYPE_DIMENSIONS, }; /** * Area types parsing table. */ static const thstok thtt_area_types[] = { {"bedrock", TT_AREA_TYPE_BEDROCK}, {"blocks", TT_AREA_TYPE_BLOCKS}, {"clay", TT_AREA_TYPE_CLAY}, {"debris", TT_AREA_TYPE_DEBRIS}, {"dimensions", TT_AREA_TYPE_DIMENSIONS}, {"flowstone", TT_AREA_TYPE_FLOWSTONE}, {"ice", TT_AREA_TYPE_ICE}, {"moonmilk", TT_AREA_TYPE_MOONMILK}, {"pebbles", TT_AREA_TYPE_PEBBLES}, {"sand", TT_AREA_TYPE_SAND}, {"snow", TT_AREA_TYPE_SNOW}, {"sump", TT_AREA_TYPE_SUMP}, {"u",TT_AREA_TYPE_U}, {"water", TT_AREA_TYPE_WATER}, {NULL, TT_AREA_TYPE_UNKNOWN}, }; /** * Area class. */ class tharea : public th2ddataobject { public: friend class thdb2d; int type; ///< Area type. thdb2dab * first_line, ///< First border line. * last_line; ///< Last border line. class thline * m_outline_line; void insert_border_line(int npars, char ** pars); ///< Insert border line. public: /** * Standard constructor. */ tharea(); /** * Standard destructor. */ ~tharea(); /** * Return class identifier. */ virtual int get_class_id(); /** * Return class name. */ virtual const char * get_class_name() {return "tharea";}; /** * Return true, if son of given class. */ virtual bool is(int class_id); /** * Return number of command arguments. */ virtual int get_cmd_nargs(); /** * Return command name. */ virtual const char * get_cmd_name(); /** * Return command end option. */ virtual const char * get_cmd_end(); /** * Return option description. */ virtual thcmd_option_desc get_cmd_option_desc(const char * opts); /** * Set command option. * * @param cod Command option description. * @param args Option arguments arry. * @param argenc Arguments encoding. */ virtual void set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline); /** * Delete this object. * * @warn Always use this methos instead of delete function. */ virtual void self_delete(); /** * Print object properties. */ virtual void self_print_properties(FILE * outf); /** * Export to metapost file. */ virtual bool export_mp(class thexpmapmpxs * out); void parse_type(char * tstr); ///< Parse area type. void parse_subtype(char * ststr); ///< Parse area subtype. virtual void start_insert(); }; #endif therion/texenc/0000775000175000017500000000000012426431312012532 5ustar userusertherion/texenc/unidata.pl0000775000175000017500000000145410071010716014516 0ustar useruser#!/usr/bin/perl -w # Parsing and simplification of the Unicode database (character decomposition). # The file `UnicodeData.txt' is not distributed with Therion. # Download it from http://www.unicode.org or don't use this program at all. # The output is basechars.txt file. # # Copyright (C) 2003 Martin Budaj open(IN, "UnicodeData.txt") or die "Can't open UnicodeData.txt: $!"; open (OUT, ">basechars.txt") or die; while() { chomp; ($n1,$n,$n,$n,$n,$n6) = split /;/; last if (length($n1)>4); # Therion doesn't support # higher Unicode values if ($n6 && !(/<.+> /)) { $n6 =~ s/<\w+> //; # if (length($n6) > 4) {$n6 = substr($n6,0,4)} # we take only the base char. print OUT "$n1 $n6\n"; } } close(IN); close(OUT); therion/texenc/glyphlist.txt0000664000175000017500000022512507671076434015341 0ustar useruser# Name: Adobe Glyph List # Table version: 2.0 # Date: September 20, 2002 # # See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html # # Format: Semicolon-delimited fields: # (1) glyph name # (2) Unicode scalar value A;0041 AE;00C6 AEacute;01FC AEmacron;01E2 AEsmall;F7E6 Aacute;00C1 Aacutesmall;F7E1 Abreve;0102 Abreveacute;1EAE Abrevecyrillic;04D0 Abrevedotbelow;1EB6 Abrevegrave;1EB0 Abrevehookabove;1EB2 Abrevetilde;1EB4 Acaron;01CD Acircle;24B6 Acircumflex;00C2 Acircumflexacute;1EA4 Acircumflexdotbelow;1EAC Acircumflexgrave;1EA6 Acircumflexhookabove;1EA8 Acircumflexsmall;F7E2 Acircumflextilde;1EAA Acute;F6C9 Acutesmall;F7B4 Acyrillic;0410 Adblgrave;0200 Adieresis;00C4 Adieresiscyrillic;04D2 Adieresismacron;01DE Adieresissmall;F7E4 Adotbelow;1EA0 Adotmacron;01E0 Agrave;00C0 Agravesmall;F7E0 Ahookabove;1EA2 Aiecyrillic;04D4 Ainvertedbreve;0202 Alpha;0391 Alphatonos;0386 Amacron;0100 Amonospace;FF21 Aogonek;0104 Aring;00C5 Aringacute;01FA Aringbelow;1E00 Aringsmall;F7E5 Asmall;F761 Atilde;00C3 Atildesmall;F7E3 Aybarmenian;0531 B;0042 Bcircle;24B7 Bdotaccent;1E02 Bdotbelow;1E04 Becyrillic;0411 Benarmenian;0532 Beta;0392 Bhook;0181 Blinebelow;1E06 Bmonospace;FF22 Brevesmall;F6F4 Bsmall;F762 Btopbar;0182 C;0043 Caarmenian;053E Cacute;0106 Caron;F6CA Caronsmall;F6F5 Ccaron;010C Ccedilla;00C7 Ccedillaacute;1E08 Ccedillasmall;F7E7 Ccircle;24B8 Ccircumflex;0108 Cdot;010A Cdotaccent;010A Cedillasmall;F7B8 Chaarmenian;0549 Cheabkhasiancyrillic;04BC Checyrillic;0427 Chedescenderabkhasiancyrillic;04BE Chedescendercyrillic;04B6 Chedieresiscyrillic;04F4 Cheharmenian;0543 Chekhakassiancyrillic;04CB Cheverticalstrokecyrillic;04B8 Chi;03A7 Chook;0187 Circumflexsmall;F6F6 Cmonospace;FF23 Coarmenian;0551 Csmall;F763 D;0044 DZ;01F1 DZcaron;01C4 Daarmenian;0534 Dafrican;0189 Dcaron;010E Dcedilla;1E10 Dcircle;24B9 Dcircumflexbelow;1E12 Dcroat;0110 Ddotaccent;1E0A Ddotbelow;1E0C Decyrillic;0414 Deicoptic;03EE Delta;2206 Deltagreek;0394 Dhook;018A Dieresis;F6CB DieresisAcute;F6CC DieresisGrave;F6CD Dieresissmall;F7A8 Digammagreek;03DC Djecyrillic;0402 Dlinebelow;1E0E Dmonospace;FF24 Dotaccentsmall;F6F7 Dslash;0110 Dsmall;F764 Dtopbar;018B Dz;01F2 Dzcaron;01C5 Dzeabkhasiancyrillic;04E0 Dzecyrillic;0405 Dzhecyrillic;040F E;0045 Eacute;00C9 Eacutesmall;F7E9 Ebreve;0114 Ecaron;011A Ecedillabreve;1E1C Echarmenian;0535 Ecircle;24BA Ecircumflex;00CA Ecircumflexacute;1EBE Ecircumflexbelow;1E18 Ecircumflexdotbelow;1EC6 Ecircumflexgrave;1EC0 Ecircumflexhookabove;1EC2 Ecircumflexsmall;F7EA Ecircumflextilde;1EC4 Ecyrillic;0404 Edblgrave;0204 Edieresis;00CB Edieresissmall;F7EB Edot;0116 Edotaccent;0116 Edotbelow;1EB8 Efcyrillic;0424 Egrave;00C8 Egravesmall;F7E8 Eharmenian;0537 Ehookabove;1EBA Eightroman;2167 Einvertedbreve;0206 Eiotifiedcyrillic;0464 Elcyrillic;041B Elevenroman;216A Emacron;0112 Emacronacute;1E16 Emacrongrave;1E14 Emcyrillic;041C Emonospace;FF25 Encyrillic;041D Endescendercyrillic;04A2 Eng;014A Enghecyrillic;04A4 Enhookcyrillic;04C7 Eogonek;0118 Eopen;0190 Epsilon;0395 Epsilontonos;0388 Ercyrillic;0420 Ereversed;018E Ereversedcyrillic;042D Escyrillic;0421 Esdescendercyrillic;04AA Esh;01A9 Esmall;F765 Eta;0397 Etarmenian;0538 Etatonos;0389 Eth;00D0 Ethsmall;F7F0 Etilde;1EBC Etildebelow;1E1A Euro;20AC Ezh;01B7 Ezhcaron;01EE Ezhreversed;01B8 F;0046 Fcircle;24BB Fdotaccent;1E1E Feharmenian;0556 Feicoptic;03E4 Fhook;0191 Fitacyrillic;0472 Fiveroman;2164 Fmonospace;FF26 Fourroman;2163 Fsmall;F766 G;0047 GBsquare;3387 Gacute;01F4 Gamma;0393 Gammaafrican;0194 Gangiacoptic;03EA Gbreve;011E Gcaron;01E6 Gcedilla;0122 Gcircle;24BC Gcircumflex;011C Gcommaaccent;0122 Gdot;0120 Gdotaccent;0120 Gecyrillic;0413 Ghadarmenian;0542 Ghemiddlehookcyrillic;0494 Ghestrokecyrillic;0492 Gheupturncyrillic;0490 Ghook;0193 Gimarmenian;0533 Gjecyrillic;0403 Gmacron;1E20 Gmonospace;FF27 Grave;F6CE Gravesmall;F760 Gsmall;F767 Gsmallhook;029B Gstroke;01E4 H;0048 H18533;25CF H18543;25AA H18551;25AB H22073;25A1 HPsquare;33CB Haabkhasiancyrillic;04A8 Hadescendercyrillic;04B2 Hardsigncyrillic;042A Hbar;0126 Hbrevebelow;1E2A Hcedilla;1E28 Hcircle;24BD Hcircumflex;0124 Hdieresis;1E26 Hdotaccent;1E22 Hdotbelow;1E24 Hmonospace;FF28 Hoarmenian;0540 Horicoptic;03E8 Hsmall;F768 Hungarumlaut;F6CF Hungarumlautsmall;F6F8 Hzsquare;3390 I;0049 IAcyrillic;042F IJ;0132 IUcyrillic;042E Iacute;00CD Iacutesmall;F7ED Ibreve;012C Icaron;01CF Icircle;24BE Icircumflex;00CE Icircumflexsmall;F7EE Icyrillic;0406 Idblgrave;0208 Idieresis;00CF Idieresisacute;1E2E Idieresiscyrillic;04E4 Idieresissmall;F7EF Idot;0130 Idotaccent;0130 Idotbelow;1ECA Iebrevecyrillic;04D6 Iecyrillic;0415 Ifraktur;2111 Igrave;00CC Igravesmall;F7EC Ihookabove;1EC8 Iicyrillic;0418 Iinvertedbreve;020A Iishortcyrillic;0419 Imacron;012A Imacroncyrillic;04E2 Imonospace;FF29 Iniarmenian;053B Iocyrillic;0401 Iogonek;012E Iota;0399 Iotaafrican;0196 Iotadieresis;03AA Iotatonos;038A Ismall;F769 Istroke;0197 Itilde;0128 Itildebelow;1E2C Izhitsacyrillic;0474 Izhitsadblgravecyrillic;0476 J;004A Jaarmenian;0541 Jcircle;24BF Jcircumflex;0134 Jecyrillic;0408 Jheharmenian;054B Jmonospace;FF2A Jsmall;F76A K;004B KBsquare;3385 KKsquare;33CD Kabashkircyrillic;04A0 Kacute;1E30 Kacyrillic;041A Kadescendercyrillic;049A Kahookcyrillic;04C3 Kappa;039A Kastrokecyrillic;049E Kaverticalstrokecyrillic;049C Kcaron;01E8 Kcedilla;0136 Kcircle;24C0 Kcommaaccent;0136 Kdotbelow;1E32 Keharmenian;0554 Kenarmenian;053F Khacyrillic;0425 Kheicoptic;03E6 Khook;0198 Kjecyrillic;040C Klinebelow;1E34 Kmonospace;FF2B Koppacyrillic;0480 Koppagreek;03DE Ksicyrillic;046E Ksmall;F76B L;004C LJ;01C7 LL;F6BF Lacute;0139 Lambda;039B Lcaron;013D Lcedilla;013B Lcircle;24C1 Lcircumflexbelow;1E3C Lcommaaccent;013B Ldot;013F Ldotaccent;013F Ldotbelow;1E36 Ldotbelowmacron;1E38 Liwnarmenian;053C Lj;01C8 Ljecyrillic;0409 Llinebelow;1E3A Lmonospace;FF2C Lslash;0141 Lslashsmall;F6F9 Lsmall;F76C M;004D MBsquare;3386 Macron;F6D0 Macronsmall;F7AF Macute;1E3E Mcircle;24C2 Mdotaccent;1E40 Mdotbelow;1E42 Menarmenian;0544 Mmonospace;FF2D Msmall;F76D Mturned;019C Mu;039C N;004E NJ;01CA Nacute;0143 Ncaron;0147 Ncedilla;0145 Ncircle;24C3 Ncircumflexbelow;1E4A Ncommaaccent;0145 Ndotaccent;1E44 Ndotbelow;1E46 Nhookleft;019D Nineroman;2168 Nj;01CB Njecyrillic;040A Nlinebelow;1E48 Nmonospace;FF2E Nowarmenian;0546 Nsmall;F76E Ntilde;00D1 Ntildesmall;F7F1 Nu;039D O;004F OE;0152 OEsmall;F6FA Oacute;00D3 Oacutesmall;F7F3 Obarredcyrillic;04E8 Obarreddieresiscyrillic;04EA Obreve;014E Ocaron;01D1 Ocenteredtilde;019F Ocircle;24C4 Ocircumflex;00D4 Ocircumflexacute;1ED0 Ocircumflexdotbelow;1ED8 Ocircumflexgrave;1ED2 Ocircumflexhookabove;1ED4 Ocircumflexsmall;F7F4 Ocircumflextilde;1ED6 Ocyrillic;041E Odblacute;0150 Odblgrave;020C Odieresis;00D6 Odieresiscyrillic;04E6 Odieresissmall;F7F6 Odotbelow;1ECC Ogoneksmall;F6FB Ograve;00D2 Ogravesmall;F7F2 Oharmenian;0555 Ohm;2126 Ohookabove;1ECE Ohorn;01A0 Ohornacute;1EDA Ohorndotbelow;1EE2 Ohorngrave;1EDC Ohornhookabove;1EDE Ohorntilde;1EE0 Ohungarumlaut;0150 Oi;01A2 Oinvertedbreve;020E Omacron;014C Omacronacute;1E52 Omacrongrave;1E50 Omega;2126 Omegacyrillic;0460 Omegagreek;03A9 Omegaroundcyrillic;047A Omegatitlocyrillic;047C Omegatonos;038F Omicron;039F Omicrontonos;038C Omonospace;FF2F Oneroman;2160 Oogonek;01EA Oogonekmacron;01EC Oopen;0186 Oslash;00D8 Oslashacute;01FE Oslashsmall;F7F8 Osmall;F76F Ostrokeacute;01FE Otcyrillic;047E Otilde;00D5 Otildeacute;1E4C Otildedieresis;1E4E Otildesmall;F7F5 P;0050 Pacute;1E54 Pcircle;24C5 Pdotaccent;1E56 Pecyrillic;041F Peharmenian;054A Pemiddlehookcyrillic;04A6 Phi;03A6 Phook;01A4 Pi;03A0 Piwrarmenian;0553 Pmonospace;FF30 Psi;03A8 Psicyrillic;0470 Psmall;F770 Q;0051 Qcircle;24C6 Qmonospace;FF31 Qsmall;F771 R;0052 Raarmenian;054C Racute;0154 Rcaron;0158 Rcedilla;0156 Rcircle;24C7 Rcommaaccent;0156 Rdblgrave;0210 Rdotaccent;1E58 Rdotbelow;1E5A Rdotbelowmacron;1E5C Reharmenian;0550 Rfraktur;211C Rho;03A1 Ringsmall;F6FC Rinvertedbreve;0212 Rlinebelow;1E5E Rmonospace;FF32 Rsmall;F772 Rsmallinverted;0281 Rsmallinvertedsuperior;02B6 S;0053 SF010000;250C SF020000;2514 SF030000;2510 SF040000;2518 SF050000;253C SF060000;252C SF070000;2534 SF080000;251C SF090000;2524 SF100000;2500 SF110000;2502 SF190000;2561 SF200000;2562 SF210000;2556 SF220000;2555 SF230000;2563 SF240000;2551 SF250000;2557 SF260000;255D SF270000;255C SF280000;255B SF360000;255E SF370000;255F SF380000;255A SF390000;2554 SF400000;2569 SF410000;2566 SF420000;2560 SF430000;2550 SF440000;256C SF450000;2567 SF460000;2568 SF470000;2564 SF480000;2565 SF490000;2559 SF500000;2558 SF510000;2552 SF520000;2553 SF530000;256B SF540000;256A Sacute;015A Sacutedotaccent;1E64 Sampigreek;03E0 Scaron;0160 Scarondotaccent;1E66 Scaronsmall;F6FD Scedilla;015E Schwa;018F Schwacyrillic;04D8 Schwadieresiscyrillic;04DA Scircle;24C8 Scircumflex;015C Scommaaccent;0218 Sdotaccent;1E60 Sdotbelow;1E62 Sdotbelowdotaccent;1E68 Seharmenian;054D Sevenroman;2166 Shaarmenian;0547 Shacyrillic;0428 Shchacyrillic;0429 Sheicoptic;03E2 Shhacyrillic;04BA Shimacoptic;03EC Sigma;03A3 Sixroman;2165 Smonospace;FF33 Softsigncyrillic;042C Ssmall;F773 Stigmagreek;03DA T;0054 Tau;03A4 Tbar;0166 Tcaron;0164 Tcedilla;0162 Tcircle;24C9 Tcircumflexbelow;1E70 Tcommaaccent;0162 Tdotaccent;1E6A Tdotbelow;1E6C Tecyrillic;0422 Tedescendercyrillic;04AC Tenroman;2169 Tetsecyrillic;04B4 Theta;0398 Thook;01AC Thorn;00DE Thornsmall;F7FE Threeroman;2162 Tildesmall;F6FE Tiwnarmenian;054F Tlinebelow;1E6E Tmonospace;FF34 Toarmenian;0539 Tonefive;01BC Tonesix;0184 Tonetwo;01A7 Tretroflexhook;01AE Tsecyrillic;0426 Tshecyrillic;040B Tsmall;F774 Twelveroman;216B Tworoman;2161 U;0055 Uacute;00DA Uacutesmall;F7FA Ubreve;016C Ucaron;01D3 Ucircle;24CA Ucircumflex;00DB Ucircumflexbelow;1E76 Ucircumflexsmall;F7FB Ucyrillic;0423 Udblacute;0170 Udblgrave;0214 Udieresis;00DC Udieresisacute;01D7 Udieresisbelow;1E72 Udieresiscaron;01D9 Udieresiscyrillic;04F0 Udieresisgrave;01DB Udieresismacron;01D5 Udieresissmall;F7FC Udotbelow;1EE4 Ugrave;00D9 Ugravesmall;F7F9 Uhookabove;1EE6 Uhorn;01AF Uhornacute;1EE8 Uhorndotbelow;1EF0 Uhorngrave;1EEA Uhornhookabove;1EEC Uhorntilde;1EEE Uhungarumlaut;0170 Uhungarumlautcyrillic;04F2 Uinvertedbreve;0216 Ukcyrillic;0478 Umacron;016A Umacroncyrillic;04EE Umacrondieresis;1E7A Umonospace;FF35 Uogonek;0172 Upsilon;03A5 Upsilon1;03D2 Upsilonacutehooksymbolgreek;03D3 Upsilonafrican;01B1 Upsilondieresis;03AB Upsilondieresishooksymbolgreek;03D4 Upsilonhooksymbol;03D2 Upsilontonos;038E Uring;016E Ushortcyrillic;040E Usmall;F775 Ustraightcyrillic;04AE Ustraightstrokecyrillic;04B0 Utilde;0168 Utildeacute;1E78 Utildebelow;1E74 V;0056 Vcircle;24CB Vdotbelow;1E7E Vecyrillic;0412 Vewarmenian;054E Vhook;01B2 Vmonospace;FF36 Voarmenian;0548 Vsmall;F776 Vtilde;1E7C W;0057 Wacute;1E82 Wcircle;24CC Wcircumflex;0174 Wdieresis;1E84 Wdotaccent;1E86 Wdotbelow;1E88 Wgrave;1E80 Wmonospace;FF37 Wsmall;F777 X;0058 Xcircle;24CD Xdieresis;1E8C Xdotaccent;1E8A Xeharmenian;053D Xi;039E Xmonospace;FF38 Xsmall;F778 Y;0059 Yacute;00DD Yacutesmall;F7FD Yatcyrillic;0462 Ycircle;24CE Ycircumflex;0176 Ydieresis;0178 Ydieresissmall;F7FF Ydotaccent;1E8E Ydotbelow;1EF4 Yericyrillic;042B Yerudieresiscyrillic;04F8 Ygrave;1EF2 Yhook;01B3 Yhookabove;1EF6 Yiarmenian;0545 Yicyrillic;0407 Yiwnarmenian;0552 Ymonospace;FF39 Ysmall;F779 Ytilde;1EF8 Yusbigcyrillic;046A Yusbigiotifiedcyrillic;046C Yuslittlecyrillic;0466 Yuslittleiotifiedcyrillic;0468 Z;005A Zaarmenian;0536 Zacute;0179 Zcaron;017D Zcaronsmall;F6FF Zcircle;24CF Zcircumflex;1E90 Zdot;017B Zdotaccent;017B Zdotbelow;1E92 Zecyrillic;0417 Zedescendercyrillic;0498 Zedieresiscyrillic;04DE Zeta;0396 Zhearmenian;053A Zhebrevecyrillic;04C1 Zhecyrillic;0416 Zhedescendercyrillic;0496 Zhedieresiscyrillic;04DC Zlinebelow;1E94 Zmonospace;FF3A Zsmall;F77A Zstroke;01B5 a;0061 aabengali;0986 aacute;00E1 aadeva;0906 aagujarati;0A86 aagurmukhi;0A06 aamatragurmukhi;0A3E aarusquare;3303 aavowelsignbengali;09BE aavowelsigndeva;093E aavowelsigngujarati;0ABE abbreviationmarkarmenian;055F abbreviationsigndeva;0970 abengali;0985 abopomofo;311A abreve;0103 abreveacute;1EAF abrevecyrillic;04D1 abrevedotbelow;1EB7 abrevegrave;1EB1 abrevehookabove;1EB3 abrevetilde;1EB5 acaron;01CE acircle;24D0 acircumflex;00E2 acircumflexacute;1EA5 acircumflexdotbelow;1EAD acircumflexgrave;1EA7 acircumflexhookabove;1EA9 acircumflextilde;1EAB acute;00B4 acutebelowcmb;0317 acutecmb;0301 acutecomb;0301 acutedeva;0954 acutelowmod;02CF acutetonecmb;0341 acyrillic;0430 adblgrave;0201 addakgurmukhi;0A71 adeva;0905 adieresis;00E4 adieresiscyrillic;04D3 adieresismacron;01DF adotbelow;1EA1 adotmacron;01E1 ae;00E6 aeacute;01FD aekorean;3150 aemacron;01E3 afii00208;2015 afii08941;20A4 afii10017;0410 afii10018;0411 afii10019;0412 afii10020;0413 afii10021;0414 afii10022;0415 afii10023;0401 afii10024;0416 afii10025;0417 afii10026;0418 afii10027;0419 afii10028;041A afii10029;041B afii10030;041C afii10031;041D afii10032;041E afii10033;041F afii10034;0420 afii10035;0421 afii10036;0422 afii10037;0423 afii10038;0424 afii10039;0425 afii10040;0426 afii10041;0427 afii10042;0428 afii10043;0429 afii10044;042A afii10045;042B afii10046;042C afii10047;042D afii10048;042E afii10049;042F afii10050;0490 afii10051;0402 afii10052;0403 afii10053;0404 afii10054;0405 afii10055;0406 afii10056;0407 afii10057;0408 afii10058;0409 afii10059;040A afii10060;040B afii10061;040C afii10062;040E afii10063;F6C4 afii10064;F6C5 afii10065;0430 afii10066;0431 afii10067;0432 afii10068;0433 afii10069;0434 afii10070;0435 afii10071;0451 afii10072;0436 afii10073;0437 afii10074;0438 afii10075;0439 afii10076;043A afii10077;043B afii10078;043C afii10079;043D afii10080;043E afii10081;043F afii10082;0440 afii10083;0441 afii10084;0442 afii10085;0443 afii10086;0444 afii10087;0445 afii10088;0446 afii10089;0447 afii10090;0448 afii10091;0449 afii10092;044A afii10093;044B afii10094;044C afii10095;044D afii10096;044E afii10097;044F afii10098;0491 afii10099;0452 afii10100;0453 afii10101;0454 afii10102;0455 afii10103;0456 afii10104;0457 afii10105;0458 afii10106;0459 afii10107;045A afii10108;045B afii10109;045C afii10110;045E afii10145;040F afii10146;0462 afii10147;0472 afii10148;0474 afii10192;F6C6 afii10193;045F afii10194;0463 afii10195;0473 afii10196;0475 afii10831;F6C7 afii10832;F6C8 afii10846;04D9 afii299;200E afii300;200F afii301;200D afii57381;066A afii57388;060C afii57392;0660 afii57393;0661 afii57394;0662 afii57395;0663 afii57396;0664 afii57397;0665 afii57398;0666 afii57399;0667 afii57400;0668 afii57401;0669 afii57403;061B afii57407;061F afii57409;0621 afii57410;0622 afii57411;0623 afii57412;0624 afii57413;0625 afii57414;0626 afii57415;0627 afii57416;0628 afii57417;0629 afii57418;062A afii57419;062B afii57420;062C afii57421;062D afii57422;062E afii57423;062F afii57424;0630 afii57425;0631 afii57426;0632 afii57427;0633 afii57428;0634 afii57429;0635 afii57430;0636 afii57431;0637 afii57432;0638 afii57433;0639 afii57434;063A afii57440;0640 afii57441;0641 afii57442;0642 afii57443;0643 afii57444;0644 afii57445;0645 afii57446;0646 afii57448;0648 afii57449;0649 afii57450;064A afii57451;064B afii57452;064C afii57453;064D afii57454;064E afii57455;064F afii57456;0650 afii57457;0651 afii57458;0652 afii57470;0647 afii57505;06A4 afii57506;067E afii57507;0686 afii57508;0698 afii57509;06AF afii57511;0679 afii57512;0688 afii57513;0691 afii57514;06BA afii57519;06D2 afii57534;06D5 afii57636;20AA afii57645;05BE afii57658;05C3 afii57664;05D0 afii57665;05D1 afii57666;05D2 afii57667;05D3 afii57668;05D4 afii57669;05D5 afii57670;05D6 afii57671;05D7 afii57672;05D8 afii57673;05D9 afii57674;05DA afii57675;05DB afii57676;05DC afii57677;05DD afii57678;05DE afii57679;05DF afii57680;05E0 afii57681;05E1 afii57682;05E2 afii57683;05E3 afii57684;05E4 afii57685;05E5 afii57686;05E6 afii57687;05E7 afii57688;05E8 afii57689;05E9 afii57690;05EA afii57694;FB2A afii57695;FB2B afii57700;FB4B afii57705;FB1F afii57716;05F0 afii57717;05F1 afii57718;05F2 afii57723;FB35 afii57793;05B4 afii57794;05B5 afii57795;05B6 afii57796;05BB afii57797;05B8 afii57798;05B7 afii57799;05B0 afii57800;05B2 afii57801;05B1 afii57802;05B3 afii57803;05C2 afii57804;05C1 afii57806;05B9 afii57807;05BC afii57839;05BD afii57841;05BF afii57842;05C0 afii57929;02BC afii61248;2105 afii61289;2113 afii61352;2116 afii61573;202C afii61574;202D afii61575;202E afii61664;200C afii63167;066D afii64937;02BD agrave;00E0 agujarati;0A85 agurmukhi;0A05 ahiragana;3042 ahookabove;1EA3 aibengali;0990 aibopomofo;311E aideva;0910 aiecyrillic;04D5 aigujarati;0A90 aigurmukhi;0A10 aimatragurmukhi;0A48 ainarabic;0639 ainfinalarabic;FECA aininitialarabic;FECB ainmedialarabic;FECC ainvertedbreve;0203 aivowelsignbengali;09C8 aivowelsigndeva;0948 aivowelsigngujarati;0AC8 akatakana;30A2 akatakanahalfwidth;FF71 akorean;314F alef;05D0 alefarabic;0627 alefdageshhebrew;FB30 aleffinalarabic;FE8E alefhamzaabovearabic;0623 alefhamzaabovefinalarabic;FE84 alefhamzabelowarabic;0625 alefhamzabelowfinalarabic;FE88 alefhebrew;05D0 aleflamedhebrew;FB4F alefmaddaabovearabic;0622 alefmaddaabovefinalarabic;FE82 alefmaksuraarabic;0649 alefmaksurafinalarabic;FEF0 alefmaksurainitialarabic;FEF3 alefmaksuramedialarabic;FEF4 alefpatahhebrew;FB2E alefqamatshebrew;FB2F aleph;2135 allequal;224C alpha;03B1 alphatonos;03AC amacron;0101 amonospace;FF41 ampersand;0026 ampersandmonospace;FF06 ampersandsmall;F726 amsquare;33C2 anbopomofo;3122 angbopomofo;3124 angkhankhuthai;0E5A angle;2220 anglebracketleft;3008 anglebracketleftvertical;FE3F anglebracketright;3009 anglebracketrightvertical;FE40 angleleft;2329 angleright;232A angstrom;212B anoteleia;0387 anudattadeva;0952 anusvarabengali;0982 anusvaradeva;0902 anusvaragujarati;0A82 aogonek;0105 apaatosquare;3300 aparen;249C apostrophearmenian;055A apostrophemod;02BC apple;F8FF approaches;2250 approxequal;2248 approxequalorimage;2252 approximatelyequal;2245 araeaekorean;318E araeakorean;318D arc;2312 arighthalfring;1E9A aring;00E5 aringacute;01FB aringbelow;1E01 arrowboth;2194 arrowdashdown;21E3 arrowdashleft;21E0 arrowdashright;21E2 arrowdashup;21E1 arrowdblboth;21D4 arrowdbldown;21D3 arrowdblleft;21D0 arrowdblright;21D2 arrowdblup;21D1 arrowdown;2193 arrowdownleft;2199 arrowdownright;2198 arrowdownwhite;21E9 arrowheaddownmod;02C5 arrowheadleftmod;02C2 arrowheadrightmod;02C3 arrowheadupmod;02C4 arrowhorizex;F8E7 arrowleft;2190 arrowleftdbl;21D0 arrowleftdblstroke;21CD arrowleftoverright;21C6 arrowleftwhite;21E6 arrowright;2192 arrowrightdblstroke;21CF arrowrightheavy;279E arrowrightoverleft;21C4 arrowrightwhite;21E8 arrowtableft;21E4 arrowtabright;21E5 arrowup;2191 arrowupdn;2195 arrowupdnbse;21A8 arrowupdownbase;21A8 arrowupleft;2196 arrowupleftofdown;21C5 arrowupright;2197 arrowupwhite;21E7 arrowvertex;F8E6 asciicircum;005E asciicircummonospace;FF3E asciitilde;007E asciitildemonospace;FF5E ascript;0251 ascriptturned;0252 asmallhiragana;3041 asmallkatakana;30A1 asmallkatakanahalfwidth;FF67 asterisk;002A asteriskaltonearabic;066D asteriskarabic;066D asteriskmath;2217 asteriskmonospace;FF0A asterisksmall;FE61 asterism;2042 asuperior;F6E9 asymptoticallyequal;2243 at;0040 atilde;00E3 atmonospace;FF20 atsmall;FE6B aturned;0250 aubengali;0994 aubopomofo;3120 audeva;0914 augujarati;0A94 augurmukhi;0A14 aulengthmarkbengali;09D7 aumatragurmukhi;0A4C auvowelsignbengali;09CC auvowelsigndeva;094C auvowelsigngujarati;0ACC avagrahadeva;093D aybarmenian;0561 ayin;05E2 ayinaltonehebrew;FB20 ayinhebrew;05E2 b;0062 babengali;09AC backslash;005C backslashmonospace;FF3C badeva;092C bagujarati;0AAC bagurmukhi;0A2C bahiragana;3070 bahtthai;0E3F bakatakana;30D0 bar;007C barmonospace;FF5C bbopomofo;3105 bcircle;24D1 bdotaccent;1E03 bdotbelow;1E05 beamedsixteenthnotes;266C because;2235 becyrillic;0431 beharabic;0628 behfinalarabic;FE90 behinitialarabic;FE91 behiragana;3079 behmedialarabic;FE92 behmeeminitialarabic;FC9F behmeemisolatedarabic;FC08 behnoonfinalarabic;FC6D bekatakana;30D9 benarmenian;0562 bet;05D1 beta;03B2 betasymbolgreek;03D0 betdagesh;FB31 betdageshhebrew;FB31 bethebrew;05D1 betrafehebrew;FB4C bhabengali;09AD bhadeva;092D bhagujarati;0AAD bhagurmukhi;0A2D bhook;0253 bihiragana;3073 bikatakana;30D3 bilabialclick;0298 bindigurmukhi;0A02 birusquare;3331 blackcircle;25CF blackdiamond;25C6 blackdownpointingtriangle;25BC blackleftpointingpointer;25C4 blackleftpointingtriangle;25C0 blacklenticularbracketleft;3010 blacklenticularbracketleftvertical;FE3B blacklenticularbracketright;3011 blacklenticularbracketrightvertical;FE3C blacklowerlefttriangle;25E3 blacklowerrighttriangle;25E2 blackrectangle;25AC blackrightpointingpointer;25BA blackrightpointingtriangle;25B6 blacksmallsquare;25AA blacksmilingface;263B blacksquare;25A0 blackstar;2605 blackupperlefttriangle;25E4 blackupperrighttriangle;25E5 blackuppointingsmalltriangle;25B4 blackuppointingtriangle;25B2 blank;2423 blinebelow;1E07 block;2588 bmonospace;FF42 bobaimaithai;0E1A bohiragana;307C bokatakana;30DC bparen;249D bqsquare;33C3 braceex;F8F4 braceleft;007B braceleftbt;F8F3 braceleftmid;F8F2 braceleftmonospace;FF5B braceleftsmall;FE5B bracelefttp;F8F1 braceleftvertical;FE37 braceright;007D bracerightbt;F8FE bracerightmid;F8FD bracerightmonospace;FF5D bracerightsmall;FE5C bracerighttp;F8FC bracerightvertical;FE38 bracketleft;005B bracketleftbt;F8F0 bracketleftex;F8EF bracketleftmonospace;FF3B bracketlefttp;F8EE bracketright;005D bracketrightbt;F8FB bracketrightex;F8FA bracketrightmonospace;FF3D bracketrighttp;F8F9 breve;02D8 brevebelowcmb;032E brevecmb;0306 breveinvertedbelowcmb;032F breveinvertedcmb;0311 breveinverteddoublecmb;0361 bridgebelowcmb;032A bridgeinvertedbelowcmb;033A brokenbar;00A6 bstroke;0180 bsuperior;F6EA btopbar;0183 buhiragana;3076 bukatakana;30D6 bullet;2022 bulletinverse;25D8 bulletoperator;2219 bullseye;25CE c;0063 caarmenian;056E cabengali;099A cacute;0107 cadeva;091A cagujarati;0A9A cagurmukhi;0A1A calsquare;3388 candrabindubengali;0981 candrabinducmb;0310 candrabindudeva;0901 candrabindugujarati;0A81 capslock;21EA careof;2105 caron;02C7 caronbelowcmb;032C caroncmb;030C carriagereturn;21B5 cbopomofo;3118 ccaron;010D ccedilla;00E7 ccedillaacute;1E09 ccircle;24D2 ccircumflex;0109 ccurl;0255 cdot;010B cdotaccent;010B cdsquare;33C5 cedilla;00B8 cedillacmb;0327 cent;00A2 centigrade;2103 centinferior;F6DF centmonospace;FFE0 centoldstyle;F7A2 centsuperior;F6E0 chaarmenian;0579 chabengali;099B chadeva;091B chagujarati;0A9B chagurmukhi;0A1B chbopomofo;3114 cheabkhasiancyrillic;04BD checkmark;2713 checyrillic;0447 chedescenderabkhasiancyrillic;04BF chedescendercyrillic;04B7 chedieresiscyrillic;04F5 cheharmenian;0573 chekhakassiancyrillic;04CC cheverticalstrokecyrillic;04B9 chi;03C7 chieuchacirclekorean;3277 chieuchaparenkorean;3217 chieuchcirclekorean;3269 chieuchkorean;314A chieuchparenkorean;3209 chochangthai;0E0A chochanthai;0E08 chochingthai;0E09 chochoethai;0E0C chook;0188 cieucacirclekorean;3276 cieucaparenkorean;3216 cieuccirclekorean;3268 cieuckorean;3148 cieucparenkorean;3208 cieucuparenkorean;321C circle;25CB circlemultiply;2297 circleot;2299 circleplus;2295 circlepostalmark;3036 circlewithlefthalfblack;25D0 circlewithrighthalfblack;25D1 circumflex;02C6 circumflexbelowcmb;032D circumflexcmb;0302 clear;2327 clickalveolar;01C2 clickdental;01C0 clicklateral;01C1 clickretroflex;01C3 club;2663 clubsuitblack;2663 clubsuitwhite;2667 cmcubedsquare;33A4 cmonospace;FF43 cmsquaredsquare;33A0 coarmenian;0581 colon;003A colonmonetary;20A1 colonmonospace;FF1A colonsign;20A1 colonsmall;FE55 colontriangularhalfmod;02D1 colontriangularmod;02D0 comma;002C commaabovecmb;0313 commaaboverightcmb;0315 commaaccent;F6C3 commaarabic;060C commaarmenian;055D commainferior;F6E1 commamonospace;FF0C commareversedabovecmb;0314 commareversedmod;02BD commasmall;FE50 commasuperior;F6E2 commaturnedabovecmb;0312 commaturnedmod;02BB compass;263C congruent;2245 contourintegral;222E control;2303 controlACK;0006 controlBEL;0007 controlBS;0008 controlCAN;0018 controlCR;000D controlDC1;0011 controlDC2;0012 controlDC3;0013 controlDC4;0014 controlDEL;007F controlDLE;0010 controlEM;0019 controlENQ;0005 controlEOT;0004 controlESC;001B controlETB;0017 controlETX;0003 controlFF;000C controlFS;001C controlGS;001D controlHT;0009 controlLF;000A controlNAK;0015 controlRS;001E controlSI;000F controlSO;000E controlSOT;0002 controlSTX;0001 controlSUB;001A controlSYN;0016 controlUS;001F controlVT;000B copyright;00A9 copyrightsans;F8E9 copyrightserif;F6D9 cornerbracketleft;300C cornerbracketlefthalfwidth;FF62 cornerbracketleftvertical;FE41 cornerbracketright;300D cornerbracketrighthalfwidth;FF63 cornerbracketrightvertical;FE42 corporationsquare;337F cosquare;33C7 coverkgsquare;33C6 cparen;249E cruzeiro;20A2 cstretched;0297 curlyand;22CF curlyor;22CE currency;00A4 cyrBreve;F6D1 cyrFlex;F6D2 cyrbreve;F6D4 cyrflex;F6D5 d;0064 daarmenian;0564 dabengali;09A6 dadarabic;0636 dadeva;0926 dadfinalarabic;FEBE dadinitialarabic;FEBF dadmedialarabic;FEC0 dagesh;05BC dageshhebrew;05BC dagger;2020 daggerdbl;2021 dagujarati;0AA6 dagurmukhi;0A26 dahiragana;3060 dakatakana;30C0 dalarabic;062F dalet;05D3 daletdagesh;FB33 daletdageshhebrew;FB33 dalethatafpatah;05D3 05B2 dalethatafpatahhebrew;05D3 05B2 dalethatafsegol;05D3 05B1 dalethatafsegolhebrew;05D3 05B1 dalethebrew;05D3 dalethiriq;05D3 05B4 dalethiriqhebrew;05D3 05B4 daletholam;05D3 05B9 daletholamhebrew;05D3 05B9 daletpatah;05D3 05B7 daletpatahhebrew;05D3 05B7 daletqamats;05D3 05B8 daletqamatshebrew;05D3 05B8 daletqubuts;05D3 05BB daletqubutshebrew;05D3 05BB daletsegol;05D3 05B6 daletsegolhebrew;05D3 05B6 daletsheva;05D3 05B0 daletshevahebrew;05D3 05B0 dalettsere;05D3 05B5 dalettserehebrew;05D3 05B5 dalfinalarabic;FEAA dammaarabic;064F dammalowarabic;064F dammatanaltonearabic;064C dammatanarabic;064C danda;0964 dargahebrew;05A7 dargalefthebrew;05A7 dasiapneumatacyrilliccmb;0485 dblGrave;F6D3 dblanglebracketleft;300A dblanglebracketleftvertical;FE3D dblanglebracketright;300B dblanglebracketrightvertical;FE3E dblarchinvertedbelowcmb;032B dblarrowleft;21D4 dblarrowright;21D2 dbldanda;0965 dblgrave;F6D6 dblgravecmb;030F dblintegral;222C dbllowline;2017 dbllowlinecmb;0333 dbloverlinecmb;033F dblprimemod;02BA dblverticalbar;2016 dblverticallineabovecmb;030E dbopomofo;3109 dbsquare;33C8 dcaron;010F dcedilla;1E11 dcircle;24D3 dcircumflexbelow;1E13 dcroat;0111 ddabengali;09A1 ddadeva;0921 ddagujarati;0AA1 ddagurmukhi;0A21 ddalarabic;0688 ddalfinalarabic;FB89 dddhadeva;095C ddhabengali;09A2 ddhadeva;0922 ddhagujarati;0AA2 ddhagurmukhi;0A22 ddotaccent;1E0B ddotbelow;1E0D decimalseparatorarabic;066B decimalseparatorpersian;066B decyrillic;0434 degree;00B0 dehihebrew;05AD dehiragana;3067 deicoptic;03EF dekatakana;30C7 deleteleft;232B deleteright;2326 delta;03B4 deltaturned;018D denominatorminusonenumeratorbengali;09F8 dezh;02A4 dhabengali;09A7 dhadeva;0927 dhagujarati;0AA7 dhagurmukhi;0A27 dhook;0257 dialytikatonos;0385 dialytikatonoscmb;0344 diamond;2666 diamondsuitwhite;2662 dieresis;00A8 dieresisacute;F6D7 dieresisbelowcmb;0324 dieresiscmb;0308 dieresisgrave;F6D8 dieresistonos;0385 dihiragana;3062 dikatakana;30C2 dittomark;3003 divide;00F7 divides;2223 divisionslash;2215 djecyrillic;0452 dkshade;2593 dlinebelow;1E0F dlsquare;3397 dmacron;0111 dmonospace;FF44 dnblock;2584 dochadathai;0E0E dodekthai;0E14 dohiragana;3069 dokatakana;30C9 dollar;0024 dollarinferior;F6E3 dollarmonospace;FF04 dollaroldstyle;F724 dollarsmall;FE69 dollarsuperior;F6E4 dong;20AB dorusquare;3326 dotaccent;02D9 dotaccentcmb;0307 dotbelowcmb;0323 dotbelowcomb;0323 dotkatakana;30FB dotlessi;0131 dotlessj;F6BE dotlessjstrokehook;0284 dotmath;22C5 dottedcircle;25CC doubleyodpatah;FB1F doubleyodpatahhebrew;FB1F downtackbelowcmb;031E downtackmod;02D5 dparen;249F dsuperior;F6EB dtail;0256 dtopbar;018C duhiragana;3065 dukatakana;30C5 dz;01F3 dzaltone;02A3 dzcaron;01C6 dzcurl;02A5 dzeabkhasiancyrillic;04E1 dzecyrillic;0455 dzhecyrillic;045F e;0065 eacute;00E9 earth;2641 ebengali;098F ebopomofo;311C ebreve;0115 ecandradeva;090D ecandragujarati;0A8D ecandravowelsigndeva;0945 ecandravowelsigngujarati;0AC5 ecaron;011B ecedillabreve;1E1D echarmenian;0565 echyiwnarmenian;0587 ecircle;24D4 ecircumflex;00EA ecircumflexacute;1EBF ecircumflexbelow;1E19 ecircumflexdotbelow;1EC7 ecircumflexgrave;1EC1 ecircumflexhookabove;1EC3 ecircumflextilde;1EC5 ecyrillic;0454 edblgrave;0205 edeva;090F edieresis;00EB edot;0117 edotaccent;0117 edotbelow;1EB9 eegurmukhi;0A0F eematragurmukhi;0A47 efcyrillic;0444 egrave;00E8 egujarati;0A8F eharmenian;0567 ehbopomofo;311D ehiragana;3048 ehookabove;1EBB eibopomofo;311F eight;0038 eightarabic;0668 eightbengali;09EE eightcircle;2467 eightcircleinversesansserif;2791 eightdeva;096E eighteencircle;2471 eighteenparen;2485 eighteenperiod;2499 eightgujarati;0AEE eightgurmukhi;0A6E eighthackarabic;0668 eighthangzhou;3028 eighthnotebeamed;266B eightideographicparen;3227 eightinferior;2088 eightmonospace;FF18 eightoldstyle;F738 eightparen;247B eightperiod;248F eightpersian;06F8 eightroman;2177 eightsuperior;2078 eightthai;0E58 einvertedbreve;0207 eiotifiedcyrillic;0465 ekatakana;30A8 ekatakanahalfwidth;FF74 ekonkargurmukhi;0A74 ekorean;3154 elcyrillic;043B element;2208 elevencircle;246A elevenparen;247E elevenperiod;2492 elevenroman;217A ellipsis;2026 ellipsisvertical;22EE emacron;0113 emacronacute;1E17 emacrongrave;1E15 emcyrillic;043C emdash;2014 emdashvertical;FE31 emonospace;FF45 emphasismarkarmenian;055B emptyset;2205 enbopomofo;3123 encyrillic;043D endash;2013 endashvertical;FE32 endescendercyrillic;04A3 eng;014B engbopomofo;3125 enghecyrillic;04A5 enhookcyrillic;04C8 enspace;2002 eogonek;0119 eokorean;3153 eopen;025B eopenclosed;029A eopenreversed;025C eopenreversedclosed;025E eopenreversedhook;025D eparen;24A0 epsilon;03B5 epsilontonos;03AD equal;003D equalmonospace;FF1D equalsmall;FE66 equalsuperior;207C equivalence;2261 erbopomofo;3126 ercyrillic;0440 ereversed;0258 ereversedcyrillic;044D escyrillic;0441 esdescendercyrillic;04AB esh;0283 eshcurl;0286 eshortdeva;090E eshortvowelsigndeva;0946 eshreversedloop;01AA eshsquatreversed;0285 esmallhiragana;3047 esmallkatakana;30A7 esmallkatakanahalfwidth;FF6A estimated;212E esuperior;F6EC eta;03B7 etarmenian;0568 etatonos;03AE eth;00F0 etilde;1EBD etildebelow;1E1B etnahtafoukhhebrew;0591 etnahtafoukhlefthebrew;0591 etnahtahebrew;0591 etnahtalefthebrew;0591 eturned;01DD eukorean;3161 euro;20AC evowelsignbengali;09C7 evowelsigndeva;0947 evowelsigngujarati;0AC7 exclam;0021 exclamarmenian;055C exclamdbl;203C exclamdown;00A1 exclamdownsmall;F7A1 exclammonospace;FF01 exclamsmall;F721 existential;2203 ezh;0292 ezhcaron;01EF ezhcurl;0293 ezhreversed;01B9 ezhtail;01BA f;0066 fadeva;095E fagurmukhi;0A5E fahrenheit;2109 fathaarabic;064E fathalowarabic;064E fathatanarabic;064B fbopomofo;3108 fcircle;24D5 fdotaccent;1E1F feharabic;0641 feharmenian;0586 fehfinalarabic;FED2 fehinitialarabic;FED3 fehmedialarabic;FED4 feicoptic;03E5 female;2640 ff;FB00 ffi;FB03 ffl;FB04 fi;FB01 fifteencircle;246E fifteenparen;2482 fifteenperiod;2496 figuredash;2012 filledbox;25A0 filledrect;25AC finalkaf;05DA finalkafdagesh;FB3A finalkafdageshhebrew;FB3A finalkafhebrew;05DA finalkafqamats;05DA 05B8 finalkafqamatshebrew;05DA 05B8 finalkafsheva;05DA 05B0 finalkafshevahebrew;05DA 05B0 finalmem;05DD finalmemhebrew;05DD finalnun;05DF finalnunhebrew;05DF finalpe;05E3 finalpehebrew;05E3 finaltsadi;05E5 finaltsadihebrew;05E5 firsttonechinese;02C9 fisheye;25C9 fitacyrillic;0473 five;0035 fivearabic;0665 fivebengali;09EB fivecircle;2464 fivecircleinversesansserif;278E fivedeva;096B fiveeighths;215D fivegujarati;0AEB fivegurmukhi;0A6B fivehackarabic;0665 fivehangzhou;3025 fiveideographicparen;3224 fiveinferior;2085 fivemonospace;FF15 fiveoldstyle;F735 fiveparen;2478 fiveperiod;248C fivepersian;06F5 fiveroman;2174 fivesuperior;2075 fivethai;0E55 fl;FB02 florin;0192 fmonospace;FF46 fmsquare;3399 fofanthai;0E1F fofathai;0E1D fongmanthai;0E4F forall;2200 four;0034 fourarabic;0664 fourbengali;09EA fourcircle;2463 fourcircleinversesansserif;278D fourdeva;096A fourgujarati;0AEA fourgurmukhi;0A6A fourhackarabic;0664 fourhangzhou;3024 fourideographicparen;3223 fourinferior;2084 fourmonospace;FF14 fournumeratorbengali;09F7 fouroldstyle;F734 fourparen;2477 fourperiod;248B fourpersian;06F4 fourroman;2173 foursuperior;2074 fourteencircle;246D fourteenparen;2481 fourteenperiod;2495 fourthai;0E54 fourthtonechinese;02CB fparen;24A1 fraction;2044 franc;20A3 g;0067 gabengali;0997 gacute;01F5 gadeva;0917 gafarabic;06AF gaffinalarabic;FB93 gafinitialarabic;FB94 gafmedialarabic;FB95 gagujarati;0A97 gagurmukhi;0A17 gahiragana;304C gakatakana;30AC gamma;03B3 gammalatinsmall;0263 gammasuperior;02E0 gangiacoptic;03EB gbopomofo;310D gbreve;011F gcaron;01E7 gcedilla;0123 gcircle;24D6 gcircumflex;011D gcommaaccent;0123 gdot;0121 gdotaccent;0121 gecyrillic;0433 gehiragana;3052 gekatakana;30B2 geometricallyequal;2251 gereshaccenthebrew;059C gereshhebrew;05F3 gereshmuqdamhebrew;059D germandbls;00DF gershayimaccenthebrew;059E gershayimhebrew;05F4 getamark;3013 ghabengali;0998 ghadarmenian;0572 ghadeva;0918 ghagujarati;0A98 ghagurmukhi;0A18 ghainarabic;063A ghainfinalarabic;FECE ghaininitialarabic;FECF ghainmedialarabic;FED0 ghemiddlehookcyrillic;0495 ghestrokecyrillic;0493 gheupturncyrillic;0491 ghhadeva;095A ghhagurmukhi;0A5A ghook;0260 ghzsquare;3393 gihiragana;304E gikatakana;30AE gimarmenian;0563 gimel;05D2 gimeldagesh;FB32 gimeldageshhebrew;FB32 gimelhebrew;05D2 gjecyrillic;0453 glottalinvertedstroke;01BE glottalstop;0294 glottalstopinverted;0296 glottalstopmod;02C0 glottalstopreversed;0295 glottalstopreversedmod;02C1 glottalstopreversedsuperior;02E4 glottalstopstroke;02A1 glottalstopstrokereversed;02A2 gmacron;1E21 gmonospace;FF47 gohiragana;3054 gokatakana;30B4 gparen;24A2 gpasquare;33AC gradient;2207 grave;0060 gravebelowcmb;0316 gravecmb;0300 gravecomb;0300 gravedeva;0953 gravelowmod;02CE gravemonospace;FF40 gravetonecmb;0340 greater;003E greaterequal;2265 greaterequalorless;22DB greatermonospace;FF1E greaterorequivalent;2273 greaterorless;2277 greateroverequal;2267 greatersmall;FE65 gscript;0261 gstroke;01E5 guhiragana;3050 guillemotleft;00AB guillemotright;00BB guilsinglleft;2039 guilsinglright;203A gukatakana;30B0 guramusquare;3318 gysquare;33C9 h;0068 haabkhasiancyrillic;04A9 haaltonearabic;06C1 habengali;09B9 hadescendercyrillic;04B3 hadeva;0939 hagujarati;0AB9 hagurmukhi;0A39 haharabic;062D hahfinalarabic;FEA2 hahinitialarabic;FEA3 hahiragana;306F hahmedialarabic;FEA4 haitusquare;332A hakatakana;30CF hakatakanahalfwidth;FF8A halantgurmukhi;0A4D hamzaarabic;0621 hamzadammaarabic;0621 064F hamzadammatanarabic;0621 064C hamzafathaarabic;0621 064E hamzafathatanarabic;0621 064B hamzalowarabic;0621 hamzalowkasraarabic;0621 0650 hamzalowkasratanarabic;0621 064D hamzasukunarabic;0621 0652 hangulfiller;3164 hardsigncyrillic;044A harpoonleftbarbup;21BC harpoonrightbarbup;21C0 hasquare;33CA hatafpatah;05B2 hatafpatah16;05B2 hatafpatah23;05B2 hatafpatah2f;05B2 hatafpatahhebrew;05B2 hatafpatahnarrowhebrew;05B2 hatafpatahquarterhebrew;05B2 hatafpatahwidehebrew;05B2 hatafqamats;05B3 hatafqamats1b;05B3 hatafqamats28;05B3 hatafqamats34;05B3 hatafqamatshebrew;05B3 hatafqamatsnarrowhebrew;05B3 hatafqamatsquarterhebrew;05B3 hatafqamatswidehebrew;05B3 hatafsegol;05B1 hatafsegol17;05B1 hatafsegol24;05B1 hatafsegol30;05B1 hatafsegolhebrew;05B1 hatafsegolnarrowhebrew;05B1 hatafsegolquarterhebrew;05B1 hatafsegolwidehebrew;05B1 hbar;0127 hbopomofo;310F hbrevebelow;1E2B hcedilla;1E29 hcircle;24D7 hcircumflex;0125 hdieresis;1E27 hdotaccent;1E23 hdotbelow;1E25 he;05D4 heart;2665 heartsuitblack;2665 heartsuitwhite;2661 hedagesh;FB34 hedageshhebrew;FB34 hehaltonearabic;06C1 heharabic;0647 hehebrew;05D4 hehfinalaltonearabic;FBA7 hehfinalalttwoarabic;FEEA hehfinalarabic;FEEA hehhamzaabovefinalarabic;FBA5 hehhamzaaboveisolatedarabic;FBA4 hehinitialaltonearabic;FBA8 hehinitialarabic;FEEB hehiragana;3078 hehmedialaltonearabic;FBA9 hehmedialarabic;FEEC heiseierasquare;337B hekatakana;30D8 hekatakanahalfwidth;FF8D hekutaarusquare;3336 henghook;0267 herutusquare;3339 het;05D7 hethebrew;05D7 hhook;0266 hhooksuperior;02B1 hieuhacirclekorean;327B hieuhaparenkorean;321B hieuhcirclekorean;326D hieuhkorean;314E hieuhparenkorean;320D hihiragana;3072 hikatakana;30D2 hikatakanahalfwidth;FF8B hiriq;05B4 hiriq14;05B4 hiriq21;05B4 hiriq2d;05B4 hiriqhebrew;05B4 hiriqnarrowhebrew;05B4 hiriqquarterhebrew;05B4 hiriqwidehebrew;05B4 hlinebelow;1E96 hmonospace;FF48 hoarmenian;0570 hohipthai;0E2B hohiragana;307B hokatakana;30DB hokatakanahalfwidth;FF8E holam;05B9 holam19;05B9 holam26;05B9 holam32;05B9 holamhebrew;05B9 holamnarrowhebrew;05B9 holamquarterhebrew;05B9 holamwidehebrew;05B9 honokhukthai;0E2E hookabovecomb;0309 hookcmb;0309 hookpalatalizedbelowcmb;0321 hookretroflexbelowcmb;0322 hoonsquare;3342 horicoptic;03E9 horizontalbar;2015 horncmb;031B hotsprings;2668 house;2302 hparen;24A3 hsuperior;02B0 hturned;0265 huhiragana;3075 huiitosquare;3333 hukatakana;30D5 hukatakanahalfwidth;FF8C hungarumlaut;02DD hungarumlautcmb;030B hv;0195 hyphen;002D hypheninferior;F6E5 hyphenmonospace;FF0D hyphensmall;FE63 hyphensuperior;F6E6 hyphentwo;2010 i;0069 iacute;00ED iacyrillic;044F ibengali;0987 ibopomofo;3127 ibreve;012D icaron;01D0 icircle;24D8 icircumflex;00EE icyrillic;0456 idblgrave;0209 ideographearthcircle;328F ideographfirecircle;328B ideographicallianceparen;323F ideographiccallparen;323A ideographiccentrecircle;32A5 ideographicclose;3006 ideographiccomma;3001 ideographiccommaleft;FF64 ideographiccongratulationparen;3237 ideographiccorrectcircle;32A3 ideographicearthparen;322F ideographicenterpriseparen;323D ideographicexcellentcircle;329D ideographicfestivalparen;3240 ideographicfinancialcircle;3296 ideographicfinancialparen;3236 ideographicfireparen;322B ideographichaveparen;3232 ideographichighcircle;32A4 ideographiciterationmark;3005 ideographiclaborcircle;3298 ideographiclaborparen;3238 ideographicleftcircle;32A7 ideographiclowcircle;32A6 ideographicmedicinecircle;32A9 ideographicmetalparen;322E ideographicmoonparen;322A ideographicnameparen;3234 ideographicperiod;3002 ideographicprintcircle;329E ideographicreachparen;3243 ideographicrepresentparen;3239 ideographicresourceparen;323E ideographicrightcircle;32A8 ideographicsecretcircle;3299 ideographicselfparen;3242 ideographicsocietyparen;3233 ideographicspace;3000 ideographicspecialparen;3235 ideographicstockparen;3231 ideographicstudyparen;323B ideographicsunparen;3230 ideographicsuperviseparen;323C ideographicwaterparen;322C ideographicwoodparen;322D ideographiczero;3007 ideographmetalcircle;328E ideographmooncircle;328A ideographnamecircle;3294 ideographsuncircle;3290 ideographwatercircle;328C ideographwoodcircle;328D ideva;0907 idieresis;00EF idieresisacute;1E2F idieresiscyrillic;04E5 idotbelow;1ECB iebrevecyrillic;04D7 iecyrillic;0435 ieungacirclekorean;3275 ieungaparenkorean;3215 ieungcirclekorean;3267 ieungkorean;3147 ieungparenkorean;3207 igrave;00EC igujarati;0A87 igurmukhi;0A07 ihiragana;3044 ihookabove;1EC9 iibengali;0988 iicyrillic;0438 iideva;0908 iigujarati;0A88 iigurmukhi;0A08 iimatragurmukhi;0A40 iinvertedbreve;020B iishortcyrillic;0439 iivowelsignbengali;09C0 iivowelsigndeva;0940 iivowelsigngujarati;0AC0 ij;0133 ikatakana;30A4 ikatakanahalfwidth;FF72 ikorean;3163 ilde;02DC iluyhebrew;05AC imacron;012B imacroncyrillic;04E3 imageorapproximatelyequal;2253 imatragurmukhi;0A3F imonospace;FF49 increment;2206 infinity;221E iniarmenian;056B integral;222B integralbottom;2321 integralbt;2321 integralex;F8F5 integraltop;2320 integraltp;2320 intersection;2229 intisquare;3305 invbullet;25D8 invcircle;25D9 invsmileface;263B iocyrillic;0451 iogonek;012F iota;03B9 iotadieresis;03CA iotadieresistonos;0390 iotalatin;0269 iotatonos;03AF iparen;24A4 irigurmukhi;0A72 ismallhiragana;3043 ismallkatakana;30A3 ismallkatakanahalfwidth;FF68 issharbengali;09FA istroke;0268 isuperior;F6ED iterationhiragana;309D iterationkatakana;30FD itilde;0129 itildebelow;1E2D iubopomofo;3129 iucyrillic;044E ivowelsignbengali;09BF ivowelsigndeva;093F ivowelsigngujarati;0ABF izhitsacyrillic;0475 izhitsadblgravecyrillic;0477 j;006A jaarmenian;0571 jabengali;099C jadeva;091C jagujarati;0A9C jagurmukhi;0A1C jbopomofo;3110 jcaron;01F0 jcircle;24D9 jcircumflex;0135 jcrossedtail;029D jdotlessstroke;025F jecyrillic;0458 jeemarabic;062C jeemfinalarabic;FE9E jeeminitialarabic;FE9F jeemmedialarabic;FEA0 jeharabic;0698 jehfinalarabic;FB8B jhabengali;099D jhadeva;091D jhagujarati;0A9D jhagurmukhi;0A1D jheharmenian;057B jis;3004 jmonospace;FF4A jparen;24A5 jsuperior;02B2 k;006B kabashkircyrillic;04A1 kabengali;0995 kacute;1E31 kacyrillic;043A kadescendercyrillic;049B kadeva;0915 kaf;05DB kafarabic;0643 kafdagesh;FB3B kafdageshhebrew;FB3B kaffinalarabic;FEDA kafhebrew;05DB kafinitialarabic;FEDB kafmedialarabic;FEDC kafrafehebrew;FB4D kagujarati;0A95 kagurmukhi;0A15 kahiragana;304B kahookcyrillic;04C4 kakatakana;30AB kakatakanahalfwidth;FF76 kappa;03BA kappasymbolgreek;03F0 kapyeounmieumkorean;3171 kapyeounphieuphkorean;3184 kapyeounpieupkorean;3178 kapyeounssangpieupkorean;3179 karoriisquare;330D kashidaautoarabic;0640 kashidaautonosidebearingarabic;0640 kasmallkatakana;30F5 kasquare;3384 kasraarabic;0650 kasratanarabic;064D kastrokecyrillic;049F katahiraprolongmarkhalfwidth;FF70 kaverticalstrokecyrillic;049D kbopomofo;310E kcalsquare;3389 kcaron;01E9 kcedilla;0137 kcircle;24DA kcommaaccent;0137 kdotbelow;1E33 keharmenian;0584 kehiragana;3051 kekatakana;30B1 kekatakanahalfwidth;FF79 kenarmenian;056F kesmallkatakana;30F6 kgreenlandic;0138 khabengali;0996 khacyrillic;0445 khadeva;0916 khagujarati;0A96 khagurmukhi;0A16 khaharabic;062E khahfinalarabic;FEA6 khahinitialarabic;FEA7 khahmedialarabic;FEA8 kheicoptic;03E7 khhadeva;0959 khhagurmukhi;0A59 khieukhacirclekorean;3278 khieukhaparenkorean;3218 khieukhcirclekorean;326A khieukhkorean;314B khieukhparenkorean;320A khokhaithai;0E02 khokhonthai;0E05 khokhuatthai;0E03 khokhwaithai;0E04 khomutthai;0E5B khook;0199 khorakhangthai;0E06 khzsquare;3391 kihiragana;304D kikatakana;30AD kikatakanahalfwidth;FF77 kiroguramusquare;3315 kiromeetorusquare;3316 kirosquare;3314 kiyeokacirclekorean;326E kiyeokaparenkorean;320E kiyeokcirclekorean;3260 kiyeokkorean;3131 kiyeokparenkorean;3200 kiyeoksioskorean;3133 kjecyrillic;045C klinebelow;1E35 klsquare;3398 kmcubedsquare;33A6 kmonospace;FF4B kmsquaredsquare;33A2 kohiragana;3053 kohmsquare;33C0 kokaithai;0E01 kokatakana;30B3 kokatakanahalfwidth;FF7A kooposquare;331E koppacyrillic;0481 koreanstandardsymbol;327F koroniscmb;0343 kparen;24A6 kpasquare;33AA ksicyrillic;046F ktsquare;33CF kturned;029E kuhiragana;304F kukatakana;30AF kukatakanahalfwidth;FF78 kvsquare;33B8 kwsquare;33BE l;006C labengali;09B2 lacute;013A ladeva;0932 lagujarati;0AB2 lagurmukhi;0A32 lakkhangyaothai;0E45 lamaleffinalarabic;FEFC lamalefhamzaabovefinalarabic;FEF8 lamalefhamzaaboveisolatedarabic;FEF7 lamalefhamzabelowfinalarabic;FEFA lamalefhamzabelowisolatedarabic;FEF9 lamalefisolatedarabic;FEFB lamalefmaddaabovefinalarabic;FEF6 lamalefmaddaaboveisolatedarabic;FEF5 lamarabic;0644 lambda;03BB lambdastroke;019B lamed;05DC lameddagesh;FB3C lameddageshhebrew;FB3C lamedhebrew;05DC lamedholam;05DC 05B9 lamedholamdagesh;05DC 05B9 05BC lamedholamdageshhebrew;05DC 05B9 05BC lamedholamhebrew;05DC 05B9 lamfinalarabic;FEDE lamhahinitialarabic;FCCA laminitialarabic;FEDF lamjeeminitialarabic;FCC9 lamkhahinitialarabic;FCCB lamlamhehisolatedarabic;FDF2 lammedialarabic;FEE0 lammeemhahinitialarabic;FD88 lammeeminitialarabic;FCCC lammeemjeeminitialarabic;FEDF FEE4 FEA0 lammeemkhahinitialarabic;FEDF FEE4 FEA8 largecircle;25EF lbar;019A lbelt;026C lbopomofo;310C lcaron;013E lcedilla;013C lcircle;24DB lcircumflexbelow;1E3D lcommaaccent;013C ldot;0140 ldotaccent;0140 ldotbelow;1E37 ldotbelowmacron;1E39 leftangleabovecmb;031A lefttackbelowcmb;0318 less;003C lessequal;2264 lessequalorgreater;22DA lessmonospace;FF1C lessorequivalent;2272 lessorgreater;2276 lessoverequal;2266 lesssmall;FE64 lezh;026E lfblock;258C lhookretroflex;026D lira;20A4 liwnarmenian;056C lj;01C9 ljecyrillic;0459 ll;F6C0 lladeva;0933 llagujarati;0AB3 llinebelow;1E3B llladeva;0934 llvocalicbengali;09E1 llvocalicdeva;0961 llvocalicvowelsignbengali;09E3 llvocalicvowelsigndeva;0963 lmiddletilde;026B lmonospace;FF4C lmsquare;33D0 lochulathai;0E2C logicaland;2227 logicalnot;00AC logicalnotreversed;2310 logicalor;2228 lolingthai;0E25 longs;017F lowlinecenterline;FE4E lowlinecmb;0332 lowlinedashed;FE4D lozenge;25CA lparen;24A7 lslash;0142 lsquare;2113 lsuperior;F6EE ltshade;2591 luthai;0E26 lvocalicbengali;098C lvocalicdeva;090C lvocalicvowelsignbengali;09E2 lvocalicvowelsigndeva;0962 lxsquare;33D3 m;006D mabengali;09AE macron;00AF macronbelowcmb;0331 macroncmb;0304 macronlowmod;02CD macronmonospace;FFE3 macute;1E3F madeva;092E magujarati;0AAE magurmukhi;0A2E mahapakhhebrew;05A4 mahapakhlefthebrew;05A4 mahiragana;307E maichattawalowleftthai;F895 maichattawalowrightthai;F894 maichattawathai;0E4B maichattawaupperleftthai;F893 maieklowleftthai;F88C maieklowrightthai;F88B maiekthai;0E48 maiekupperleftthai;F88A maihanakatleftthai;F884 maihanakatthai;0E31 maitaikhuleftthai;F889 maitaikhuthai;0E47 maitholowleftthai;F88F maitholowrightthai;F88E maithothai;0E49 maithoupperleftthai;F88D maitrilowleftthai;F892 maitrilowrightthai;F891 maitrithai;0E4A maitriupperleftthai;F890 maiyamokthai;0E46 makatakana;30DE makatakanahalfwidth;FF8F male;2642 mansyonsquare;3347 maqafhebrew;05BE mars;2642 masoracirclehebrew;05AF masquare;3383 mbopomofo;3107 mbsquare;33D4 mcircle;24DC mcubedsquare;33A5 mdotaccent;1E41 mdotbelow;1E43 meemarabic;0645 meemfinalarabic;FEE2 meeminitialarabic;FEE3 meemmedialarabic;FEE4 meemmeeminitialarabic;FCD1 meemmeemisolatedarabic;FC48 meetorusquare;334D mehiragana;3081 meizierasquare;337E mekatakana;30E1 mekatakanahalfwidth;FF92 mem;05DE memdagesh;FB3E memdageshhebrew;FB3E memhebrew;05DE menarmenian;0574 merkhahebrew;05A5 merkhakefulahebrew;05A6 merkhakefulalefthebrew;05A6 merkhalefthebrew;05A5 mhook;0271 mhzsquare;3392 middledotkatakanahalfwidth;FF65 middot;00B7 mieumacirclekorean;3272 mieumaparenkorean;3212 mieumcirclekorean;3264 mieumkorean;3141 mieumpansioskorean;3170 mieumparenkorean;3204 mieumpieupkorean;316E mieumsioskorean;316F mihiragana;307F mikatakana;30DF mikatakanahalfwidth;FF90 minus;2212 minusbelowcmb;0320 minuscircle;2296 minusmod;02D7 minusplus;2213 minute;2032 miribaarusquare;334A mirisquare;3349 mlonglegturned;0270 mlsquare;3396 mmcubedsquare;33A3 mmonospace;FF4D mmsquaredsquare;339F mohiragana;3082 mohmsquare;33C1 mokatakana;30E2 mokatakanahalfwidth;FF93 molsquare;33D6 momathai;0E21 moverssquare;33A7 moverssquaredsquare;33A8 mparen;24A8 mpasquare;33AB mssquare;33B3 msuperior;F6EF mturned;026F mu;00B5 mu1;00B5 muasquare;3382 muchgreater;226B muchless;226A mufsquare;338C mugreek;03BC mugsquare;338D muhiragana;3080 mukatakana;30E0 mukatakanahalfwidth;FF91 mulsquare;3395 multiply;00D7 mumsquare;339B munahhebrew;05A3 munahlefthebrew;05A3 musicalnote;266A musicalnotedbl;266B musicflatsign;266D musicsharpsign;266F mussquare;33B2 muvsquare;33B6 muwsquare;33BC mvmegasquare;33B9 mvsquare;33B7 mwmegasquare;33BF mwsquare;33BD n;006E nabengali;09A8 nabla;2207 nacute;0144 nadeva;0928 nagujarati;0AA8 nagurmukhi;0A28 nahiragana;306A nakatakana;30CA nakatakanahalfwidth;FF85 napostrophe;0149 nasquare;3381 nbopomofo;310B nbspace;00A0 ncaron;0148 ncedilla;0146 ncircle;24DD ncircumflexbelow;1E4B ncommaaccent;0146 ndotaccent;1E45 ndotbelow;1E47 nehiragana;306D nekatakana;30CD nekatakanahalfwidth;FF88 newsheqelsign;20AA nfsquare;338B ngabengali;0999 ngadeva;0919 ngagujarati;0A99 ngagurmukhi;0A19 ngonguthai;0E07 nhiragana;3093 nhookleft;0272 nhookretroflex;0273 nieunacirclekorean;326F nieunaparenkorean;320F nieuncieuckorean;3135 nieuncirclekorean;3261 nieunhieuhkorean;3136 nieunkorean;3134 nieunpansioskorean;3168 nieunparenkorean;3201 nieunsioskorean;3167 nieuntikeutkorean;3166 nihiragana;306B nikatakana;30CB nikatakanahalfwidth;FF86 nikhahitleftthai;F899 nikhahitthai;0E4D nine;0039 ninearabic;0669 ninebengali;09EF ninecircle;2468 ninecircleinversesansserif;2792 ninedeva;096F ninegujarati;0AEF ninegurmukhi;0A6F ninehackarabic;0669 ninehangzhou;3029 nineideographicparen;3228 nineinferior;2089 ninemonospace;FF19 nineoldstyle;F739 nineparen;247C nineperiod;2490 ninepersian;06F9 nineroman;2178 ninesuperior;2079 nineteencircle;2472 nineteenparen;2486 nineteenperiod;249A ninethai;0E59 nj;01CC njecyrillic;045A nkatakana;30F3 nkatakanahalfwidth;FF9D nlegrightlong;019E nlinebelow;1E49 nmonospace;FF4E nmsquare;339A nnabengali;09A3 nnadeva;0923 nnagujarati;0AA3 nnagurmukhi;0A23 nnnadeva;0929 nohiragana;306E nokatakana;30CE nokatakanahalfwidth;FF89 nonbreakingspace;00A0 nonenthai;0E13 nonuthai;0E19 noonarabic;0646 noonfinalarabic;FEE6 noonghunnaarabic;06BA noonghunnafinalarabic;FB9F noonhehinitialarabic;FEE7 FEEC nooninitialarabic;FEE7 noonjeeminitialarabic;FCD2 noonjeemisolatedarabic;FC4B noonmedialarabic;FEE8 noonmeeminitialarabic;FCD5 noonmeemisolatedarabic;FC4E noonnoonfinalarabic;FC8D notcontains;220C notelement;2209 notelementof;2209 notequal;2260 notgreater;226F notgreaternorequal;2271 notgreaternorless;2279 notidentical;2262 notless;226E notlessnorequal;2270 notparallel;2226 notprecedes;2280 notsubset;2284 notsucceeds;2281 notsuperset;2285 nowarmenian;0576 nparen;24A9 nssquare;33B1 nsuperior;207F ntilde;00F1 nu;03BD nuhiragana;306C nukatakana;30CC nukatakanahalfwidth;FF87 nuktabengali;09BC nuktadeva;093C nuktagujarati;0ABC nuktagurmukhi;0A3C numbersign;0023 numbersignmonospace;FF03 numbersignsmall;FE5F numeralsigngreek;0374 numeralsignlowergreek;0375 numero;2116 nun;05E0 nundagesh;FB40 nundageshhebrew;FB40 nunhebrew;05E0 nvsquare;33B5 nwsquare;33BB nyabengali;099E nyadeva;091E nyagujarati;0A9E nyagurmukhi;0A1E o;006F oacute;00F3 oangthai;0E2D obarred;0275 obarredcyrillic;04E9 obarreddieresiscyrillic;04EB obengali;0993 obopomofo;311B obreve;014F ocandradeva;0911 ocandragujarati;0A91 ocandravowelsigndeva;0949 ocandravowelsigngujarati;0AC9 ocaron;01D2 ocircle;24DE ocircumflex;00F4 ocircumflexacute;1ED1 ocircumflexdotbelow;1ED9 ocircumflexgrave;1ED3 ocircumflexhookabove;1ED5 ocircumflextilde;1ED7 ocyrillic;043E odblacute;0151 odblgrave;020D odeva;0913 odieresis;00F6 odieresiscyrillic;04E7 odotbelow;1ECD oe;0153 oekorean;315A ogonek;02DB ogonekcmb;0328 ograve;00F2 ogujarati;0A93 oharmenian;0585 ohiragana;304A ohookabove;1ECF ohorn;01A1 ohornacute;1EDB ohorndotbelow;1EE3 ohorngrave;1EDD ohornhookabove;1EDF ohorntilde;1EE1 ohungarumlaut;0151 oi;01A3 oinvertedbreve;020F okatakana;30AA okatakanahalfwidth;FF75 okorean;3157 olehebrew;05AB omacron;014D omacronacute;1E53 omacrongrave;1E51 omdeva;0950 omega;03C9 omega1;03D6 omegacyrillic;0461 omegalatinclosed;0277 omegaroundcyrillic;047B omegatitlocyrillic;047D omegatonos;03CE omgujarati;0AD0 omicron;03BF omicrontonos;03CC omonospace;FF4F one;0031 onearabic;0661 onebengali;09E7 onecircle;2460 onecircleinversesansserif;278A onedeva;0967 onedotenleader;2024 oneeighth;215B onefitted;F6DC onegujarati;0AE7 onegurmukhi;0A67 onehackarabic;0661 onehalf;00BD onehangzhou;3021 oneideographicparen;3220 oneinferior;2081 onemonospace;FF11 onenumeratorbengali;09F4 oneoldstyle;F731 oneparen;2474 oneperiod;2488 onepersian;06F1 onequarter;00BC oneroman;2170 onesuperior;00B9 onethai;0E51 onethird;2153 oogonek;01EB oogonekmacron;01ED oogurmukhi;0A13 oomatragurmukhi;0A4B oopen;0254 oparen;24AA openbullet;25E6 option;2325 ordfeminine;00AA ordmasculine;00BA orthogonal;221F oshortdeva;0912 oshortvowelsigndeva;094A oslash;00F8 oslashacute;01FF osmallhiragana;3049 osmallkatakana;30A9 osmallkatakanahalfwidth;FF6B ostrokeacute;01FF osuperior;F6F0 otcyrillic;047F otilde;00F5 otildeacute;1E4D otildedieresis;1E4F oubopomofo;3121 overline;203E overlinecenterline;FE4A overlinecmb;0305 overlinedashed;FE49 overlinedblwavy;FE4C overlinewavy;FE4B overscore;00AF ovowelsignbengali;09CB ovowelsigndeva;094B ovowelsigngujarati;0ACB p;0070 paampssquare;3380 paasentosquare;332B pabengali;09AA pacute;1E55 padeva;092A pagedown;21DF pageup;21DE pagujarati;0AAA pagurmukhi;0A2A pahiragana;3071 paiyannoithai;0E2F pakatakana;30D1 palatalizationcyrilliccmb;0484 palochkacyrillic;04C0 pansioskorean;317F paragraph;00B6 parallel;2225 parenleft;0028 parenleftaltonearabic;FD3E parenleftbt;F8ED parenleftex;F8EC parenleftinferior;208D parenleftmonospace;FF08 parenleftsmall;FE59 parenleftsuperior;207D parenlefttp;F8EB parenleftvertical;FE35 parenright;0029 parenrightaltonearabic;FD3F parenrightbt;F8F8 parenrightex;F8F7 parenrightinferior;208E parenrightmonospace;FF09 parenrightsmall;FE5A parenrightsuperior;207E parenrighttp;F8F6 parenrightvertical;FE36 partialdiff;2202 paseqhebrew;05C0 pashtahebrew;0599 pasquare;33A9 patah;05B7 patah11;05B7 patah1d;05B7 patah2a;05B7 patahhebrew;05B7 patahnarrowhebrew;05B7 patahquarterhebrew;05B7 patahwidehebrew;05B7 pazerhebrew;05A1 pbopomofo;3106 pcircle;24DF pdotaccent;1E57 pe;05E4 pecyrillic;043F pedagesh;FB44 pedageshhebrew;FB44 peezisquare;333B pefinaldageshhebrew;FB43 peharabic;067E peharmenian;057A pehebrew;05E4 pehfinalarabic;FB57 pehinitialarabic;FB58 pehiragana;307A pehmedialarabic;FB59 pekatakana;30DA pemiddlehookcyrillic;04A7 perafehebrew;FB4E percent;0025 percentarabic;066A percentmonospace;FF05 percentsmall;FE6A period;002E periodarmenian;0589 periodcentered;00B7 periodhalfwidth;FF61 periodinferior;F6E7 periodmonospace;FF0E periodsmall;FE52 periodsuperior;F6E8 perispomenigreekcmb;0342 perpendicular;22A5 perthousand;2030 peseta;20A7 pfsquare;338A phabengali;09AB phadeva;092B phagujarati;0AAB phagurmukhi;0A2B phi;03C6 phi1;03D5 phieuphacirclekorean;327A phieuphaparenkorean;321A phieuphcirclekorean;326C phieuphkorean;314D phieuphparenkorean;320C philatin;0278 phinthuthai;0E3A phisymbolgreek;03D5 phook;01A5 phophanthai;0E1E phophungthai;0E1C phosamphaothai;0E20 pi;03C0 pieupacirclekorean;3273 pieupaparenkorean;3213 pieupcieuckorean;3176 pieupcirclekorean;3265 pieupkiyeokkorean;3172 pieupkorean;3142 pieupparenkorean;3205 pieupsioskiyeokkorean;3174 pieupsioskorean;3144 pieupsiostikeutkorean;3175 pieupthieuthkorean;3177 pieuptikeutkorean;3173 pihiragana;3074 pikatakana;30D4 pisymbolgreek;03D6 piwrarmenian;0583 plus;002B plusbelowcmb;031F pluscircle;2295 plusminus;00B1 plusmod;02D6 plusmonospace;FF0B plussmall;FE62 plussuperior;207A pmonospace;FF50 pmsquare;33D8 pohiragana;307D pointingindexdownwhite;261F pointingindexleftwhite;261C pointingindexrightwhite;261E pointingindexupwhite;261D pokatakana;30DD poplathai;0E1B postalmark;3012 postalmarkface;3020 pparen;24AB precedes;227A prescription;211E primemod;02B9 primereversed;2035 product;220F projective;2305 prolongedkana;30FC propellor;2318 propersubset;2282 propersuperset;2283 proportion;2237 proportional;221D psi;03C8 psicyrillic;0471 psilipneumatacyrilliccmb;0486 pssquare;33B0 puhiragana;3077 pukatakana;30D7 pvsquare;33B4 pwsquare;33BA q;0071 qadeva;0958 qadmahebrew;05A8 qafarabic;0642 qaffinalarabic;FED6 qafinitialarabic;FED7 qafmedialarabic;FED8 qamats;05B8 qamats10;05B8 qamats1a;05B8 qamats1c;05B8 qamats27;05B8 qamats29;05B8 qamats33;05B8 qamatsde;05B8 qamatshebrew;05B8 qamatsnarrowhebrew;05B8 qamatsqatanhebrew;05B8 qamatsqatannarrowhebrew;05B8 qamatsqatanquarterhebrew;05B8 qamatsqatanwidehebrew;05B8 qamatsquarterhebrew;05B8 qamatswidehebrew;05B8 qarneyparahebrew;059F qbopomofo;3111 qcircle;24E0 qhook;02A0 qmonospace;FF51 qof;05E7 qofdagesh;FB47 qofdageshhebrew;FB47 qofhatafpatah;05E7 05B2 qofhatafpatahhebrew;05E7 05B2 qofhatafsegol;05E7 05B1 qofhatafsegolhebrew;05E7 05B1 qofhebrew;05E7 qofhiriq;05E7 05B4 qofhiriqhebrew;05E7 05B4 qofholam;05E7 05B9 qofholamhebrew;05E7 05B9 qofpatah;05E7 05B7 qofpatahhebrew;05E7 05B7 qofqamats;05E7 05B8 qofqamatshebrew;05E7 05B8 qofqubuts;05E7 05BB qofqubutshebrew;05E7 05BB qofsegol;05E7 05B6 qofsegolhebrew;05E7 05B6 qofsheva;05E7 05B0 qofshevahebrew;05E7 05B0 qoftsere;05E7 05B5 qoftserehebrew;05E7 05B5 qparen;24AC quarternote;2669 qubuts;05BB qubuts18;05BB qubuts25;05BB qubuts31;05BB qubutshebrew;05BB qubutsnarrowhebrew;05BB qubutsquarterhebrew;05BB qubutswidehebrew;05BB question;003F questionarabic;061F questionarmenian;055E questiondown;00BF questiondownsmall;F7BF questiongreek;037E questionmonospace;FF1F questionsmall;F73F quotedbl;0022 quotedblbase;201E quotedblleft;201C quotedblmonospace;FF02 quotedblprime;301E quotedblprimereversed;301D quotedblright;201D quoteleft;2018 quoteleftreversed;201B quotereversed;201B quoteright;2019 quoterightn;0149 quotesinglbase;201A quotesingle;0027 quotesinglemonospace;FF07 r;0072 raarmenian;057C rabengali;09B0 racute;0155 radeva;0930 radical;221A radicalex;F8E5 radoverssquare;33AE radoverssquaredsquare;33AF radsquare;33AD rafe;05BF rafehebrew;05BF ragujarati;0AB0 ragurmukhi;0A30 rahiragana;3089 rakatakana;30E9 rakatakanahalfwidth;FF97 ralowerdiagonalbengali;09F1 ramiddlediagonalbengali;09F0 ramshorn;0264 ratio;2236 rbopomofo;3116 rcaron;0159 rcedilla;0157 rcircle;24E1 rcommaaccent;0157 rdblgrave;0211 rdotaccent;1E59 rdotbelow;1E5B rdotbelowmacron;1E5D referencemark;203B reflexsubset;2286 reflexsuperset;2287 registered;00AE registersans;F8E8 registerserif;F6DA reharabic;0631 reharmenian;0580 rehfinalarabic;FEAE rehiragana;308C rehyehaleflamarabic;0631 FEF3 FE8E 0644 rekatakana;30EC rekatakanahalfwidth;FF9A resh;05E8 reshdageshhebrew;FB48 reshhatafpatah;05E8 05B2 reshhatafpatahhebrew;05E8 05B2 reshhatafsegol;05E8 05B1 reshhatafsegolhebrew;05E8 05B1 reshhebrew;05E8 reshhiriq;05E8 05B4 reshhiriqhebrew;05E8 05B4 reshholam;05E8 05B9 reshholamhebrew;05E8 05B9 reshpatah;05E8 05B7 reshpatahhebrew;05E8 05B7 reshqamats;05E8 05B8 reshqamatshebrew;05E8 05B8 reshqubuts;05E8 05BB reshqubutshebrew;05E8 05BB reshsegol;05E8 05B6 reshsegolhebrew;05E8 05B6 reshsheva;05E8 05B0 reshshevahebrew;05E8 05B0 reshtsere;05E8 05B5 reshtserehebrew;05E8 05B5 reversedtilde;223D reviahebrew;0597 reviamugrashhebrew;0597 revlogicalnot;2310 rfishhook;027E rfishhookreversed;027F rhabengali;09DD rhadeva;095D rho;03C1 rhook;027D rhookturned;027B rhookturnedsuperior;02B5 rhosymbolgreek;03F1 rhotichookmod;02DE rieulacirclekorean;3271 rieulaparenkorean;3211 rieulcirclekorean;3263 rieulhieuhkorean;3140 rieulkiyeokkorean;313A rieulkiyeoksioskorean;3169 rieulkorean;3139 rieulmieumkorean;313B rieulpansioskorean;316C rieulparenkorean;3203 rieulphieuphkorean;313F rieulpieupkorean;313C rieulpieupsioskorean;316B rieulsioskorean;313D rieulthieuthkorean;313E rieultikeutkorean;316A rieulyeorinhieuhkorean;316D rightangle;221F righttackbelowcmb;0319 righttriangle;22BF rihiragana;308A rikatakana;30EA rikatakanahalfwidth;FF98 ring;02DA ringbelowcmb;0325 ringcmb;030A ringhalfleft;02BF ringhalfleftarmenian;0559 ringhalfleftbelowcmb;031C ringhalfleftcentered;02D3 ringhalfright;02BE ringhalfrightbelowcmb;0339 ringhalfrightcentered;02D2 rinvertedbreve;0213 rittorusquare;3351 rlinebelow;1E5F rlongleg;027C rlonglegturned;027A rmonospace;FF52 rohiragana;308D rokatakana;30ED rokatakanahalfwidth;FF9B roruathai;0E23 rparen;24AD rrabengali;09DC rradeva;0931 rragurmukhi;0A5C rreharabic;0691 rrehfinalarabic;FB8D rrvocalicbengali;09E0 rrvocalicdeva;0960 rrvocalicgujarati;0AE0 rrvocalicvowelsignbengali;09C4 rrvocalicvowelsigndeva;0944 rrvocalicvowelsigngujarati;0AC4 rsuperior;F6F1 rtblock;2590 rturned;0279 rturnedsuperior;02B4 ruhiragana;308B rukatakana;30EB rukatakanahalfwidth;FF99 rupeemarkbengali;09F2 rupeesignbengali;09F3 rupiah;F6DD ruthai;0E24 rvocalicbengali;098B rvocalicdeva;090B rvocalicgujarati;0A8B rvocalicvowelsignbengali;09C3 rvocalicvowelsigndeva;0943 rvocalicvowelsigngujarati;0AC3 s;0073 sabengali;09B8 sacute;015B sacutedotaccent;1E65 sadarabic;0635 sadeva;0938 sadfinalarabic;FEBA sadinitialarabic;FEBB sadmedialarabic;FEBC sagujarati;0AB8 sagurmukhi;0A38 sahiragana;3055 sakatakana;30B5 sakatakanahalfwidth;FF7B sallallahoualayhewasallamarabic;FDFA samekh;05E1 samekhdagesh;FB41 samekhdageshhebrew;FB41 samekhhebrew;05E1 saraaathai;0E32 saraaethai;0E41 saraaimaimalaithai;0E44 saraaimaimuanthai;0E43 saraamthai;0E33 saraathai;0E30 saraethai;0E40 saraiileftthai;F886 saraiithai;0E35 saraileftthai;F885 saraithai;0E34 saraothai;0E42 saraueeleftthai;F888 saraueethai;0E37 saraueleftthai;F887 sarauethai;0E36 sarauthai;0E38 sarauuthai;0E39 sbopomofo;3119 scaron;0161 scarondotaccent;1E67 scedilla;015F schwa;0259 schwacyrillic;04D9 schwadieresiscyrillic;04DB schwahook;025A scircle;24E2 scircumflex;015D scommaaccent;0219 sdotaccent;1E61 sdotbelow;1E63 sdotbelowdotaccent;1E69 seagullbelowcmb;033C second;2033 secondtonechinese;02CA section;00A7 seenarabic;0633 seenfinalarabic;FEB2 seeninitialarabic;FEB3 seenmedialarabic;FEB4 segol;05B6 segol13;05B6 segol1f;05B6 segol2c;05B6 segolhebrew;05B6 segolnarrowhebrew;05B6 segolquarterhebrew;05B6 segoltahebrew;0592 segolwidehebrew;05B6 seharmenian;057D sehiragana;305B sekatakana;30BB sekatakanahalfwidth;FF7E semicolon;003B semicolonarabic;061B semicolonmonospace;FF1B semicolonsmall;FE54 semivoicedmarkkana;309C semivoicedmarkkanahalfwidth;FF9F sentisquare;3322 sentosquare;3323 seven;0037 sevenarabic;0667 sevenbengali;09ED sevencircle;2466 sevencircleinversesansserif;2790 sevendeva;096D seveneighths;215E sevengujarati;0AED sevengurmukhi;0A6D sevenhackarabic;0667 sevenhangzhou;3027 sevenideographicparen;3226 seveninferior;2087 sevenmonospace;FF17 sevenoldstyle;F737 sevenparen;247A sevenperiod;248E sevenpersian;06F7 sevenroman;2176 sevensuperior;2077 seventeencircle;2470 seventeenparen;2484 seventeenperiod;2498 seventhai;0E57 sfthyphen;00AD shaarmenian;0577 shabengali;09B6 shacyrillic;0448 shaddaarabic;0651 shaddadammaarabic;FC61 shaddadammatanarabic;FC5E shaddafathaarabic;FC60 shaddafathatanarabic;0651 064B shaddakasraarabic;FC62 shaddakasratanarabic;FC5F shade;2592 shadedark;2593 shadelight;2591 shademedium;2592 shadeva;0936 shagujarati;0AB6 shagurmukhi;0A36 shalshelethebrew;0593 shbopomofo;3115 shchacyrillic;0449 sheenarabic;0634 sheenfinalarabic;FEB6 sheeninitialarabic;FEB7 sheenmedialarabic;FEB8 sheicoptic;03E3 sheqel;20AA sheqelhebrew;20AA sheva;05B0 sheva115;05B0 sheva15;05B0 sheva22;05B0 sheva2e;05B0 shevahebrew;05B0 shevanarrowhebrew;05B0 shevaquarterhebrew;05B0 shevawidehebrew;05B0 shhacyrillic;04BB shimacoptic;03ED shin;05E9 shindagesh;FB49 shindageshhebrew;FB49 shindageshshindot;FB2C shindageshshindothebrew;FB2C shindageshsindot;FB2D shindageshsindothebrew;FB2D shindothebrew;05C1 shinhebrew;05E9 shinshindot;FB2A shinshindothebrew;FB2A shinsindot;FB2B shinsindothebrew;FB2B shook;0282 sigma;03C3 sigma1;03C2 sigmafinal;03C2 sigmalunatesymbolgreek;03F2 sihiragana;3057 sikatakana;30B7 sikatakanahalfwidth;FF7C siluqhebrew;05BD siluqlefthebrew;05BD similar;223C sindothebrew;05C2 siosacirclekorean;3274 siosaparenkorean;3214 sioscieuckorean;317E sioscirclekorean;3266 sioskiyeokkorean;317A sioskorean;3145 siosnieunkorean;317B siosparenkorean;3206 siospieupkorean;317D siostikeutkorean;317C six;0036 sixarabic;0666 sixbengali;09EC sixcircle;2465 sixcircleinversesansserif;278F sixdeva;096C sixgujarati;0AEC sixgurmukhi;0A6C sixhackarabic;0666 sixhangzhou;3026 sixideographicparen;3225 sixinferior;2086 sixmonospace;FF16 sixoldstyle;F736 sixparen;2479 sixperiod;248D sixpersian;06F6 sixroman;2175 sixsuperior;2076 sixteencircle;246F sixteencurrencydenominatorbengali;09F9 sixteenparen;2483 sixteenperiod;2497 sixthai;0E56 slash;002F slashmonospace;FF0F slong;017F slongdotaccent;1E9B smileface;263A smonospace;FF53 sofpasuqhebrew;05C3 softhyphen;00AD softsigncyrillic;044C sohiragana;305D sokatakana;30BD sokatakanahalfwidth;FF7F soliduslongoverlaycmb;0338 solidusshortoverlaycmb;0337 sorusithai;0E29 sosalathai;0E28 sosothai;0E0B sosuathai;0E2A space;0020 spacehackarabic;0020 spade;2660 spadesuitblack;2660 spadesuitwhite;2664 sparen;24AE squarebelowcmb;033B squarecc;33C4 squarecm;339D squarediagonalcrosshatchfill;25A9 squarehorizontalfill;25A4 squarekg;338F squarekm;339E squarekmcapital;33CE squareln;33D1 squarelog;33D2 squaremg;338E squaremil;33D5 squaremm;339C squaremsquared;33A1 squareorthogonalcrosshatchfill;25A6 squareupperlefttolowerrightfill;25A7 squareupperrighttolowerleftfill;25A8 squareverticalfill;25A5 squarewhitewithsmallblack;25A3 srsquare;33DB ssabengali;09B7 ssadeva;0937 ssagujarati;0AB7 ssangcieuckorean;3149 ssanghieuhkorean;3185 ssangieungkorean;3180 ssangkiyeokkorean;3132 ssangnieunkorean;3165 ssangpieupkorean;3143 ssangsioskorean;3146 ssangtikeutkorean;3138 ssuperior;F6F2 sterling;00A3 sterlingmonospace;FFE1 strokelongoverlaycmb;0336 strokeshortoverlaycmb;0335 subset;2282 subsetnotequal;228A subsetorequal;2286 succeeds;227B suchthat;220B suhiragana;3059 sukatakana;30B9 sukatakanahalfwidth;FF7D sukunarabic;0652 summation;2211 sun;263C superset;2283 supersetnotequal;228B supersetorequal;2287 svsquare;33DC syouwaerasquare;337C t;0074 tabengali;09A4 tackdown;22A4 tackleft;22A3 tadeva;0924 tagujarati;0AA4 tagurmukhi;0A24 taharabic;0637 tahfinalarabic;FEC2 tahinitialarabic;FEC3 tahiragana;305F tahmedialarabic;FEC4 taisyouerasquare;337D takatakana;30BF takatakanahalfwidth;FF80 tatweelarabic;0640 tau;03C4 tav;05EA tavdages;FB4A tavdagesh;FB4A tavdageshhebrew;FB4A tavhebrew;05EA tbar;0167 tbopomofo;310A tcaron;0165 tccurl;02A8 tcedilla;0163 tcheharabic;0686 tchehfinalarabic;FB7B tchehinitialarabic;FB7C tchehmedialarabic;FB7D tchehmeeminitialarabic;FB7C FEE4 tcircle;24E3 tcircumflexbelow;1E71 tcommaaccent;0163 tdieresis;1E97 tdotaccent;1E6B tdotbelow;1E6D tecyrillic;0442 tedescendercyrillic;04AD teharabic;062A tehfinalarabic;FE96 tehhahinitialarabic;FCA2 tehhahisolatedarabic;FC0C tehinitialarabic;FE97 tehiragana;3066 tehjeeminitialarabic;FCA1 tehjeemisolatedarabic;FC0B tehmarbutaarabic;0629 tehmarbutafinalarabic;FE94 tehmedialarabic;FE98 tehmeeminitialarabic;FCA4 tehmeemisolatedarabic;FC0E tehnoonfinalarabic;FC73 tekatakana;30C6 tekatakanahalfwidth;FF83 telephone;2121 telephoneblack;260E telishagedolahebrew;05A0 telishaqetanahebrew;05A9 tencircle;2469 tenideographicparen;3229 tenparen;247D tenperiod;2491 tenroman;2179 tesh;02A7 tet;05D8 tetdagesh;FB38 tetdageshhebrew;FB38 tethebrew;05D8 tetsecyrillic;04B5 tevirhebrew;059B tevirlefthebrew;059B thabengali;09A5 thadeva;0925 thagujarati;0AA5 thagurmukhi;0A25 thalarabic;0630 thalfinalarabic;FEAC thanthakhatlowleftthai;F898 thanthakhatlowrightthai;F897 thanthakhatthai;0E4C thanthakhatupperleftthai;F896 theharabic;062B thehfinalarabic;FE9A thehinitialarabic;FE9B thehmedialarabic;FE9C thereexists;2203 therefore;2234 theta;03B8 theta1;03D1 thetasymbolgreek;03D1 thieuthacirclekorean;3279 thieuthaparenkorean;3219 thieuthcirclekorean;326B thieuthkorean;314C thieuthparenkorean;320B thirteencircle;246C thirteenparen;2480 thirteenperiod;2494 thonangmonthothai;0E11 thook;01AD thophuthaothai;0E12 thorn;00FE thothahanthai;0E17 thothanthai;0E10 thothongthai;0E18 thothungthai;0E16 thousandcyrillic;0482 thousandsseparatorarabic;066C thousandsseparatorpersian;066C three;0033 threearabic;0663 threebengali;09E9 threecircle;2462 threecircleinversesansserif;278C threedeva;0969 threeeighths;215C threegujarati;0AE9 threegurmukhi;0A69 threehackarabic;0663 threehangzhou;3023 threeideographicparen;3222 threeinferior;2083 threemonospace;FF13 threenumeratorbengali;09F6 threeoldstyle;F733 threeparen;2476 threeperiod;248A threepersian;06F3 threequarters;00BE threequartersemdash;F6DE threeroman;2172 threesuperior;00B3 threethai;0E53 thzsquare;3394 tihiragana;3061 tikatakana;30C1 tikatakanahalfwidth;FF81 tikeutacirclekorean;3270 tikeutaparenkorean;3210 tikeutcirclekorean;3262 tikeutkorean;3137 tikeutparenkorean;3202 tilde;02DC tildebelowcmb;0330 tildecmb;0303 tildecomb;0303 tildedoublecmb;0360 tildeoperator;223C tildeoverlaycmb;0334 tildeverticalcmb;033E timescircle;2297 tipehahebrew;0596 tipehalefthebrew;0596 tippigurmukhi;0A70 titlocyrilliccmb;0483 tiwnarmenian;057F tlinebelow;1E6F tmonospace;FF54 toarmenian;0569 tohiragana;3068 tokatakana;30C8 tokatakanahalfwidth;FF84 tonebarextrahighmod;02E5 tonebarextralowmod;02E9 tonebarhighmod;02E6 tonebarlowmod;02E8 tonebarmidmod;02E7 tonefive;01BD tonesix;0185 tonetwo;01A8 tonos;0384 tonsquare;3327 topatakthai;0E0F tortoiseshellbracketleft;3014 tortoiseshellbracketleftsmall;FE5D tortoiseshellbracketleftvertical;FE39 tortoiseshellbracketright;3015 tortoiseshellbracketrightsmall;FE5E tortoiseshellbracketrightvertical;FE3A totaothai;0E15 tpalatalhook;01AB tparen;24AF trademark;2122 trademarksans;F8EA trademarkserif;F6DB tretroflexhook;0288 triagdn;25BC triaglf;25C4 triagrt;25BA triagup;25B2 ts;02A6 tsadi;05E6 tsadidagesh;FB46 tsadidageshhebrew;FB46 tsadihebrew;05E6 tsecyrillic;0446 tsere;05B5 tsere12;05B5 tsere1e;05B5 tsere2b;05B5 tserehebrew;05B5 tserenarrowhebrew;05B5 tserequarterhebrew;05B5 tserewidehebrew;05B5 tshecyrillic;045B tsuperior;F6F3 ttabengali;099F ttadeva;091F ttagujarati;0A9F ttagurmukhi;0A1F tteharabic;0679 ttehfinalarabic;FB67 ttehinitialarabic;FB68 ttehmedialarabic;FB69 tthabengali;09A0 tthadeva;0920 tthagujarati;0AA0 tthagurmukhi;0A20 tturned;0287 tuhiragana;3064 tukatakana;30C4 tukatakanahalfwidth;FF82 tusmallhiragana;3063 tusmallkatakana;30C3 tusmallkatakanahalfwidth;FF6F twelvecircle;246B twelveparen;247F twelveperiod;2493 twelveroman;217B twentycircle;2473 twentyhangzhou;5344 twentyparen;2487 twentyperiod;249B two;0032 twoarabic;0662 twobengali;09E8 twocircle;2461 twocircleinversesansserif;278B twodeva;0968 twodotenleader;2025 twodotleader;2025 twodotleadervertical;FE30 twogujarati;0AE8 twogurmukhi;0A68 twohackarabic;0662 twohangzhou;3022 twoideographicparen;3221 twoinferior;2082 twomonospace;FF12 twonumeratorbengali;09F5 twooldstyle;F732 twoparen;2475 twoperiod;2489 twopersian;06F2 tworoman;2171 twostroke;01BB twosuperior;00B2 twothai;0E52 twothirds;2154 u;0075 uacute;00FA ubar;0289 ubengali;0989 ubopomofo;3128 ubreve;016D ucaron;01D4 ucircle;24E4 ucircumflex;00FB ucircumflexbelow;1E77 ucyrillic;0443 udattadeva;0951 udblacute;0171 udblgrave;0215 udeva;0909 udieresis;00FC udieresisacute;01D8 udieresisbelow;1E73 udieresiscaron;01DA udieresiscyrillic;04F1 udieresisgrave;01DC udieresismacron;01D6 udotbelow;1EE5 ugrave;00F9 ugujarati;0A89 ugurmukhi;0A09 uhiragana;3046 uhookabove;1EE7 uhorn;01B0 uhornacute;1EE9 uhorndotbelow;1EF1 uhorngrave;1EEB uhornhookabove;1EED uhorntilde;1EEF uhungarumlaut;0171 uhungarumlautcyrillic;04F3 uinvertedbreve;0217 ukatakana;30A6 ukatakanahalfwidth;FF73 ukcyrillic;0479 ukorean;315C umacron;016B umacroncyrillic;04EF umacrondieresis;1E7B umatragurmukhi;0A41 umonospace;FF55 underscore;005F underscoredbl;2017 underscoremonospace;FF3F underscorevertical;FE33 underscorewavy;FE4F union;222A universal;2200 uogonek;0173 uparen;24B0 upblock;2580 upperdothebrew;05C4 upsilon;03C5 upsilondieresis;03CB upsilondieresistonos;03B0 upsilonlatin;028A upsilontonos;03CD uptackbelowcmb;031D uptackmod;02D4 uragurmukhi;0A73 uring;016F ushortcyrillic;045E usmallhiragana;3045 usmallkatakana;30A5 usmallkatakanahalfwidth;FF69 ustraightcyrillic;04AF ustraightstrokecyrillic;04B1 utilde;0169 utildeacute;1E79 utildebelow;1E75 uubengali;098A uudeva;090A uugujarati;0A8A uugurmukhi;0A0A uumatragurmukhi;0A42 uuvowelsignbengali;09C2 uuvowelsigndeva;0942 uuvowelsigngujarati;0AC2 uvowelsignbengali;09C1 uvowelsigndeva;0941 uvowelsigngujarati;0AC1 v;0076 vadeva;0935 vagujarati;0AB5 vagurmukhi;0A35 vakatakana;30F7 vav;05D5 vavdagesh;FB35 vavdagesh65;FB35 vavdageshhebrew;FB35 vavhebrew;05D5 vavholam;FB4B vavholamhebrew;FB4B vavvavhebrew;05F0 vavyodhebrew;05F1 vcircle;24E5 vdotbelow;1E7F vecyrillic;0432 veharabic;06A4 vehfinalarabic;FB6B vehinitialarabic;FB6C vehmedialarabic;FB6D vekatakana;30F9 venus;2640 verticalbar;007C verticallineabovecmb;030D verticallinebelowcmb;0329 verticallinelowmod;02CC verticallinemod;02C8 vewarmenian;057E vhook;028B vikatakana;30F8 viramabengali;09CD viramadeva;094D viramagujarati;0ACD visargabengali;0983 visargadeva;0903 visargagujarati;0A83 vmonospace;FF56 voarmenian;0578 voicediterationhiragana;309E voicediterationkatakana;30FE voicedmarkkana;309B voicedmarkkanahalfwidth;FF9E vokatakana;30FA vparen;24B1 vtilde;1E7D vturned;028C vuhiragana;3094 vukatakana;30F4 w;0077 wacute;1E83 waekorean;3159 wahiragana;308F wakatakana;30EF wakatakanahalfwidth;FF9C wakorean;3158 wasmallhiragana;308E wasmallkatakana;30EE wattosquare;3357 wavedash;301C wavyunderscorevertical;FE34 wawarabic;0648 wawfinalarabic;FEEE wawhamzaabovearabic;0624 wawhamzaabovefinalarabic;FE86 wbsquare;33DD wcircle;24E6 wcircumflex;0175 wdieresis;1E85 wdotaccent;1E87 wdotbelow;1E89 wehiragana;3091 weierstrass;2118 wekatakana;30F1 wekorean;315E weokorean;315D wgrave;1E81 whitebullet;25E6 whitecircle;25CB whitecircleinverse;25D9 whitecornerbracketleft;300E whitecornerbracketleftvertical;FE43 whitecornerbracketright;300F whitecornerbracketrightvertical;FE44 whitediamond;25C7 whitediamondcontainingblacksmalldiamond;25C8 whitedownpointingsmalltriangle;25BF whitedownpointingtriangle;25BD whiteleftpointingsmalltriangle;25C3 whiteleftpointingtriangle;25C1 whitelenticularbracketleft;3016 whitelenticularbracketright;3017 whiterightpointingsmalltriangle;25B9 whiterightpointingtriangle;25B7 whitesmallsquare;25AB whitesmilingface;263A whitesquare;25A1 whitestar;2606 whitetelephone;260F whitetortoiseshellbracketleft;3018 whitetortoiseshellbracketright;3019 whiteuppointingsmalltriangle;25B5 whiteuppointingtriangle;25B3 wihiragana;3090 wikatakana;30F0 wikorean;315F wmonospace;FF57 wohiragana;3092 wokatakana;30F2 wokatakanahalfwidth;FF66 won;20A9 wonmonospace;FFE6 wowaenthai;0E27 wparen;24B2 wring;1E98 wsuperior;02B7 wturned;028D wynn;01BF x;0078 xabovecmb;033D xbopomofo;3112 xcircle;24E7 xdieresis;1E8D xdotaccent;1E8B xeharmenian;056D xi;03BE xmonospace;FF58 xparen;24B3 xsuperior;02E3 y;0079 yaadosquare;334E yabengali;09AF yacute;00FD yadeva;092F yaekorean;3152 yagujarati;0AAF yagurmukhi;0A2F yahiragana;3084 yakatakana;30E4 yakatakanahalfwidth;FF94 yakorean;3151 yamakkanthai;0E4E yasmallhiragana;3083 yasmallkatakana;30E3 yasmallkatakanahalfwidth;FF6C yatcyrillic;0463 ycircle;24E8 ycircumflex;0177 ydieresis;00FF ydotaccent;1E8F ydotbelow;1EF5 yeharabic;064A yehbarreearabic;06D2 yehbarreefinalarabic;FBAF yehfinalarabic;FEF2 yehhamzaabovearabic;0626 yehhamzaabovefinalarabic;FE8A yehhamzaaboveinitialarabic;FE8B yehhamzaabovemedialarabic;FE8C yehinitialarabic;FEF3 yehmedialarabic;FEF4 yehmeeminitialarabic;FCDD yehmeemisolatedarabic;FC58 yehnoonfinalarabic;FC94 yehthreedotsbelowarabic;06D1 yekorean;3156 yen;00A5 yenmonospace;FFE5 yeokorean;3155 yeorinhieuhkorean;3186 yerahbenyomohebrew;05AA yerahbenyomolefthebrew;05AA yericyrillic;044B yerudieresiscyrillic;04F9 yesieungkorean;3181 yesieungpansioskorean;3183 yesieungsioskorean;3182 yetivhebrew;059A ygrave;1EF3 yhook;01B4 yhookabove;1EF7 yiarmenian;0575 yicyrillic;0457 yikorean;3162 yinyang;262F yiwnarmenian;0582 ymonospace;FF59 yod;05D9 yoddagesh;FB39 yoddageshhebrew;FB39 yodhebrew;05D9 yodyodhebrew;05F2 yodyodpatahhebrew;FB1F yohiragana;3088 yoikorean;3189 yokatakana;30E8 yokatakanahalfwidth;FF96 yokorean;315B yosmallhiragana;3087 yosmallkatakana;30E7 yosmallkatakanahalfwidth;FF6E yotgreek;03F3 yoyaekorean;3188 yoyakorean;3187 yoyakthai;0E22 yoyingthai;0E0D yparen;24B4 ypogegrammeni;037A ypogegrammenigreekcmb;0345 yr;01A6 yring;1E99 ysuperior;02B8 ytilde;1EF9 yturned;028E yuhiragana;3086 yuikorean;318C yukatakana;30E6 yukatakanahalfwidth;FF95 yukorean;3160 yusbigcyrillic;046B yusbigiotifiedcyrillic;046D yuslittlecyrillic;0467 yuslittleiotifiedcyrillic;0469 yusmallhiragana;3085 yusmallkatakana;30E5 yusmallkatakanahalfwidth;FF6D yuyekorean;318B yuyeokorean;318A yyabengali;09DF yyadeva;095F z;007A zaarmenian;0566 zacute;017A zadeva;095B zagurmukhi;0A5B zaharabic;0638 zahfinalarabic;FEC6 zahinitialarabic;FEC7 zahiragana;3056 zahmedialarabic;FEC8 zainarabic;0632 zainfinalarabic;FEB0 zakatakana;30B6 zaqefgadolhebrew;0595 zaqefqatanhebrew;0594 zarqahebrew;0598 zayin;05D6 zayindagesh;FB36 zayindageshhebrew;FB36 zayinhebrew;05D6 zbopomofo;3117 zcaron;017E zcircle;24E9 zcircumflex;1E91 zcurl;0291 zdot;017C zdotaccent;017C zdotbelow;1E93 zecyrillic;0437 zedescendercyrillic;0499 zedieresiscyrillic;04DF zehiragana;305C zekatakana;30BC zero;0030 zeroarabic;0660 zerobengali;09E6 zerodeva;0966 zerogujarati;0AE6 zerogurmukhi;0A66 zerohackarabic;0660 zeroinferior;2080 zeromonospace;FF10 zerooldstyle;F730 zeropersian;06F0 zerosuperior;2070 zerothai;0E50 zerowidthjoiner;FEFF zerowidthnonjoiner;200C zerowidthspace;200B zeta;03B6 zhbopomofo;3113 zhearmenian;056A zhebrevecyrillic;04C2 zhecyrillic;0436 zhedescendercyrillic;0497 zhedieresiscyrillic;04DD zihiragana;3058 zikatakana;30B8 zinorhebrew;05AE zlinebelow;1E95 zmonospace;FF5A zohiragana;305E zokatakana;30BE zparen;24B5 zretroflexhook;0290 zstroke;01B6 zuhiragana;305A zukatakana;30BA #--end therion/texenc/afm2enc.pl0000775000175000017500000000123507674103574014425 0ustar useruser#!/usr/bin/perl -w if (scalar @ARGV != 1) {die "Run with .afm file as an argument!";} $infile = $ARGV[0]; if ($infile =~ /\.afm$/) { $infile = $`; } else { die "Is the file $infile really an AFM file?"; } open(IN, "$infile.afm") or die "Can't open file $infile.afm: $!"; while() { chomp; if (/C\s+(\d+)\s*;.*;\s*N\s+(\w+)\s*;/) { if ($1>=0) { $CHAR[$1] = $2; } } } close(IN); open(OUT, ">$infile.enc") or die "Can't write file $infile.enc: $!"; print OUT "/$infile [\n"; for ($i=0; $i<256; $i++) { if (defined $CHAR[$i]) { print OUT "/$CHAR[$i]\n"; } else { print OUT "/.notdef\n"; } } print OUT "] def\n"; close(OUT); therion/texenc/encodings/0000775000175000017500000000000012426432013014502 5ustar userusertherion/texenc/encodings/cmcyr.enc0000664000175000017500000000464210716043364016323 0ustar useruser/cmcyr [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /afii10071 /.notdef /afii10023 /.notdef /afii10096 /afii10065 /afii10066 /afii10088 /afii10069 /afii10070 /afii10086 /afii10068 /afii10087 /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080 /afii10081 /afii10097 /afii10082 /afii10083 /afii10084 /afii10085 /afii10072 /afii10067 /afii10094 /afii10093 /afii10073 /afii10090 /afii10095 /afii10091 /afii10089 /afii10092 /afii10048 /afii10017 /afii10018 /afii10040 /afii10021 /afii10022 /afii10038 /afii10020 /afii10039 /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032 /afii10033 /afii10049 /afii10034 /afii10035 /afii10036 /afii10037 /afii10024 /afii10019 /afii10046 /afii10045 /afii10025 /afii10042 /afii10047 /afii10043 /afii10041 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /afii61352 /.notdef /.notdef /.notdef /guillemotleft /guillemotright /.notdef /.notdef /afii10044 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def therion/texenc/encodings/xl2.enc0000664000175000017500000000772710071305510015706 0ustar useruser/XL2encoding [ %%%%% '000 = "00 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon %%%%% '010 = "08 /Phi /Psi /Omega /ff /fi /fl /ffi /ffl %%%%% '020 = "10 /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring %%%%% '030 = "18 /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash %%%%% '040 = "20 /.notdef /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright %%%%% '050 = "28 /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash %%%%% '060 = "30 /zero /one /two /three /four /five /six /seven %%%%% '070 = "38 /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question %%%%% '100 = "40 /at /A /B /C /D /E /F /G %%%%% '110 = "48 /H /I /J /K /L /M /N /O %%%%% '120 = "50 /P /Q /R /S /T /U /V /W %%%%% '130 = "58 /X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent %%%%% '140 = "60 /quoteleft /a /b /c /d /e /f /g %%%%% '150 = "68 /h /i /j /k /l /m /n /o %%%%% '160 = "70 /p /q /r /s /t /u /v /w %%%%% '170 = "78 /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis %%%%% '200 = "80 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '210 = "88 /.notdef /.notdef /.notdef /.notdef /.notdef /perthousand /.notdef /.notdef %%%%% '220 = "90 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '230 = "98 /Agrave /.notdef /.notdef /.notdef /hyphen /ogonek /guillemotleft /guillemotright %%%%% '240 = "A0 /.notdef /.notdef /.notdef /.notdef /.notdef /Lcaron /.notdef /.notdef %%%%% '250 = "A8 /.notdef /Scaron /.notdef /Tcaron /.notdef /.notdef /Zcaron /.notdef %%%%% '260 = "B0 /.notdef /.notdef /.notdef /.notdef /.notdef /lcaron /.notdef /.notdef %%%%% '270 = "B8 /agrave /scaron /.notdef /tcaron /.notdef /.notdef /zcaron /.notdef %%%%% '300 = "C0 /Racute /Aacute /.notdef /.notdef /Adieresis /Lacute /.notdef /.notdef %%%%% '310 = "C8 /Ccaron /Eacute /.notdef /.notdef /Ecaron /Iacute /.notdef /Dcaron %%%%% '320 = "D0 /.notdef /.notdef /Ncaron /Oacute /Ocircumflex /.notdef /Odieresis /.notdef %%%%% '330 = "D8 /Rcaron /Uring /Uacute /.notdef /Udieresis /Yacute /.notdef /.notdef %%%%% '340 = "E0 /racute /aacute /.notdef /.notdef /adieresis /lacute /.notdef /.notdef %%%%% '350 = "E8 /ccaron /eacute /.notdef /.notdef /ecaron /iacute /.notdef /dcaron %%%%% '360 = "F0 /.notdef /.notdef /ncaron /oacute /ocircumflex /.notdef /odieresis /.notdef %%%%% '370 = "F8 /rcaron /uring /uacute /.notdef /udieresis /yacute /quotedblbase /quotedblleft ] def % LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ; % LIGKERN quoteleft quoteleft =: quotedblleft ; % LIGKERN quoteright quoteright =: quotedblright ; % LIGKERN exclamdown exclamdown =: guillemotleft ; % frenchdblquotes % LIGKERN questiondown questiondown =: guillemotright ; % csquoteleft % LIGKERN comma comma =: quotedblbase ; % LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ; % LIGKERN one {} * ; * {} one ; two {} * ; * {} two ; % LIGKERN three {} * ; * {} three ; four {} * ; * {} four ; % LIGKERN five {} * ; * {} five ; six {} * ; * {} six ; % LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ; % LIGKERN nine {} * ; * {} nine ; % LIGKERN question {} quoteleft ; exclam {} quoteleft ; therion/texenc/encodings/raw.enc0000664000175000017500000000635307673600742016007 0ustar useruser/TeXraw [ %%%%% '000 = "00 /Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon %%%%% '010 = "08 /Phi /Psi /Omega /ff /fi /fl /ffi /ffl %%%%% '020 = "10 /dotlessi /dotlessj /grave /acute /caron /breve /macron /ring %%%%% '030 = "18 /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash %%%%% '040 = "20 /.notdef /exclam /quotedblright /numbersign /dollar /percent /ampersand /quoteright %%%%% '050 = "28 /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash %%%%% '060 = "30 /zero /one /two /three /four /five /six /seven %%%%% '070 = "38 /eight /nine /colon /semicolon /exclamdown /equal /questiondown /question %%%%% '100 = "40 /at /A /B /C /D /E /F /G %%%%% '110 = "48 /H /I /J /K /L /M /N /O %%%%% '120 = "50 /P /Q /R /S /T /U /V /W %%%%% '130 = "58 /X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent %%%%% '140 = "60 /quoteleft /a /b /c /d /e /f /g %%%%% '150 = "68 /h /i /j /k /l /m /n /o %%%%% '160 = "70 /p /q /r /s /t /u /v /w %%%%% '170 = "78 /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis %%%%% '200 = "80 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '210 = "88 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '220 = "90 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '230 = "98 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '240 = "A0 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '250 = "A8 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '260 = "B0 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '270 = "B8 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '300 = "C0 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '310 = "C8 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '320 = "D0 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '330 = "D8 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '340 = "E0 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '350 = "E8 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '360 = "F0 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef %%%%% '370 = "F8 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef ] def therion/texenc/glyphlist.usr0000664000175000017500000000047407673674000015324 0ustar useruser# Define custom PostScriptGlyphName to Unicode mappings here (i.e. for glyph # names which are neither included in AGL nor in the form /uniXXXX or /uXXXX). # # This file also overrides the AGL mappings so it's possible to change it here. # # Syntax: ; Omega;03A9 therion/texenc/mktexenc.pl0000775000175000017500000000654610071012340014711 0ustar useruser#!/usr/bin/perl -w # This script generates C++ files and headers containing encoding vectors # with Unicode values # # Copyright (C) 2003 Martin Budaj sub find_unicode_value { my $str = shift; my $ch; $str = substr ($str,1); # leading slash is removed $str =~ s/\..*//; # Adobe step 1 $str =~ s/_//; # a little bit odd handling of ligatures -- cf. Adobe step 2 # simplified Adobe step 3 follows if (exists $AGL{$str}) {$ch = $AGL{$str};} elsif ($str =~ /^uni([0-9a-fA-F]{4})/) {$ch = $1;} # simplified again elsif ($str =~ /^u([0-9a-fA-F]{4,6})$/) {$ch = $1;} else {$ch = "0000";} $USED_CHARS{$ch} = 1; return $ch; } # we read Adobe Glyph List first open(IN, "glyphlist.txt") or die "Can't open AGL: $!"; while() { next if /^#/; chomp; next if /^$/; ($n,$u) = split /;/; if (length($u) > 4) {$u = substr($u,0,4)} # we consider only base character $AGL{$n} = $u; } close(IN); # read User's Glyph List open(IN, "glyphlist.usr") or die "Can't open UGL: $!"; while() { next if /^#/; chomp; next if /^$/; ($n,$u) = split /;/; if (length($u) > 4) {$u = substr($u,0,4)} # this shouldn't be used $AGL{$n} = $u; } close(IN); # we read the preprocessed Unicode database open(IN, "basechars.txt") or die "Can't open basechars.txt: $!"; while() { chomp; ($n,$u,$a) = split / /; $UNI{$n}{"base"} = $u; $UNI{$n}{"acc"} = ($a ? $a : "0000"); } close(IN); # read and parse all files with .enc extension in the directory `encodings' @files = glob("encodings/*.enc"); foreach $f (@files) { open (IN, "$f") or die "This can't happen!"; $i = 0; $f =~ /encodings\/(\w+)\./; $enc = $1; $ENCODINGS{$enc} = 1; while() { next if /^%/; s/%.*$//; s/^\s+//; s/\s+$//; @toks = split /\s+/; foreach $tok (@toks) { if ($i>1 && $i<258) { ${$enc}[$i-2] = find_unicode_value($tok); } $i++; } } if ($i != 260) {die "Can't parse file $f!"}; close(IN); } # find relevant base characters (base character is in some encoding(s)) foreach $composite (keys %UNI) { $ch = $composite; # if (!exists $USED_CHARS{$ch}) { # we don't need decompose characters # # already present in one of the fonts TRY: while(exists $UNI{$ch}{"base"}) { $ch = $UNI{$ch}{"base"}; if (exists $USED_CHARS{$ch}) { $UNI2{$composite}{"base"} = $ch; $UNI2{$composite}{"acc"} = $UNI{$composite}{"acc"}; last TRY; } } # } } # finally write C++ files $maxenc = keys %ENCODINGS; $maxbase = keys %UNI2; $banner = "// This file is generated automatically; don't modify it\n\n"; open(OUT, ">../thtexenc.cxx") or die; print OUT $banner; print OUT "static const int max_enc = $maxenc;\n"; print OUT "static const int max_base = $maxbase;\n\n"; print OUT "static const char* encodings[$maxenc] = {\n"; foreach $enc (sort keys %ENCODINGS) { print OUT " \"$enc\",\n"; } print OUT "};\n\n"; print OUT "static const int texenc[256][$maxenc] = {\n"; for ($i=0; $i < 256; $i++) { @tmp = (); foreach $enc (sort keys %ENCODINGS) { push(@tmp,"0x${$enc}[$i]"); } print OUT " {", join(", ",@tmp), "},\n"; } print OUT "};\n\n"; print OUT "static const int unibase[$maxbase][3] = {\n"; foreach $ch (sort keys %UNI2) { print OUT " {0x$ch, 0x$UNI2{$ch}{base}, 0x$UNI2{$ch}{acc}},\n"; } print OUT "};\n"; close OUT; therion/texenc/basechars.txt0000664000175000017500000004433710071010724015233 0ustar useruser00C0 0041 0300 00C1 0041 0301 00C2 0041 0302 00C3 0041 0303 00C4 0041 0308 00C5 0041 030A 00C7 0043 0327 00C8 0045 0300 00C9 0045 0301 00CA 0045 0302 00CB 0045 0308 00CC 0049 0300 00CD 0049 0301 00CE 0049 0302 00CF 0049 0308 00D1 004E 0303 00D2 004F 0300 00D3 004F 0301 00D4 004F 0302 00D5 004F 0303 00D6 004F 0308 00D9 0055 0300 00DA 0055 0301 00DB 0055 0302 00DC 0055 0308 00DD 0059 0301 00E0 0061 0300 00E1 0061 0301 00E2 0061 0302 00E3 0061 0303 00E4 0061 0308 00E5 0061 030A 00E7 0063 0327 00E8 0065 0300 00E9 0065 0301 00EA 0065 0302 00EB 0065 0308 00EC 0069 0300 00ED 0069 0301 00EE 0069 0302 00EF 0069 0308 00F1 006E 0303 00F2 006F 0300 00F3 006F 0301 00F4 006F 0302 00F5 006F 0303 00F6 006F 0308 00F9 0075 0300 00FA 0075 0301 00FB 0075 0302 00FC 0075 0308 00FD 0079 0301 00FF 0079 0308 0100 0041 0304 0101 0061 0304 0102 0041 0306 0103 0061 0306 0104 0041 0328 0105 0061 0328 0106 0043 0301 0107 0063 0301 0108 0043 0302 0109 0063 0302 010A 0043 0307 010B 0063 0307 010C 0043 030C 010D 0063 030C 010E 0044 030C 010F 0064 030C 0112 0045 0304 0113 0065 0304 0114 0045 0306 0115 0065 0306 0116 0045 0307 0117 0065 0307 0118 0045 0328 0119 0065 0328 011A 0045 030C 011B 0065 030C 011C 0047 0302 011D 0067 0302 011E 0047 0306 011F 0067 0306 0120 0047 0307 0121 0067 0307 0122 0047 0327 0123 0067 0327 0124 0048 0302 0125 0068 0302 0128 0049 0303 0129 0069 0303 012A 0049 0304 012B 0069 0304 012C 0049 0306 012D 0069 0306 012E 0049 0328 012F 0069 0328 0130 0049 0307 0134 004A 0302 0135 006A 0302 0136 004B 0327 0137 006B 0327 0139 004C 0301 013A 006C 0301 013B 004C 0327 013C 006C 0327 013D 004C 030C 013E 006C 030C 0143 004E 0301 0144 006E 0301 0145 004E 0327 0146 006E 0327 0147 004E 030C 0148 006E 030C 014C 004F 0304 014D 006F 0304 014E 004F 0306 014F 006F 0306 0150 004F 030B 0151 006F 030B 0154 0052 0301 0155 0072 0301 0156 0052 0327 0157 0072 0327 0158 0052 030C 0159 0072 030C 015A 0053 0301 015B 0073 0301 015C 0053 0302 015D 0073 0302 015E 0053 0327 015F 0073 0327 0160 0053 030C 0161 0073 030C 0162 0054 0327 0163 0074 0327 0164 0054 030C 0165 0074 030C 0168 0055 0303 0169 0075 0303 016A 0055 0304 016B 0075 0304 016C 0055 0306 016D 0075 0306 016E 0055 030A 016F 0075 030A 0170 0055 030B 0171 0075 030B 0172 0055 0328 0173 0075 0328 0174 0057 0302 0175 0077 0302 0176 0059 0302 0177 0079 0302 0178 0059 0308 0179 005A 0301 017A 007A 0301 017B 005A 0307 017C 007A 0307 017D 005A 030C 017E 007A 030C 01A0 004F 031B 01A1 006F 031B 01AF 0055 031B 01B0 0075 031B 01CD 0041 030C 01CE 0061 030C 01CF 0049 030C 01D0 0069 030C 01D1 004F 030C 01D2 006F 030C 01D3 0055 030C 01D4 0075 030C 01D5 00DC 0304 01D6 00FC 0304 01D7 00DC 0301 01D8 00FC 0301 01D9 00DC 030C 01DA 00FC 030C 01DB 00DC 0300 01DC 00FC 0300 01DE 00C4 0304 01DF 00E4 0304 01E0 0226 0304 01E1 0227 0304 01E2 00C6 0304 01E3 00E6 0304 01E6 0047 030C 01E7 0067 030C 01E8 004B 030C 01E9 006B 030C 01EA 004F 0328 01EB 006F 0328 01EC 01EA 0304 01ED 01EB 0304 01EE 01B7 030C 01EF 0292 030C 01F0 006A 030C 01F4 0047 0301 01F5 0067 0301 01F8 004E 0300 01F9 006E 0300 01FA 00C5 0301 01FB 00E5 0301 01FC 00C6 0301 01FD 00E6 0301 01FE 00D8 0301 01FF 00F8 0301 0200 0041 030F 0201 0061 030F 0202 0041 0311 0203 0061 0311 0204 0045 030F 0205 0065 030F 0206 0045 0311 0207 0065 0311 0208 0049 030F 0209 0069 030F 020A 0049 0311 020B 0069 0311 020C 004F 030F 020D 006F 030F 020E 004F 0311 020F 006F 0311 0210 0052 030F 0211 0072 030F 0212 0052 0311 0213 0072 0311 0214 0055 030F 0215 0075 030F 0216 0055 0311 0217 0075 0311 0218 0053 0326 0219 0073 0326 021A 0054 0326 021B 0074 0326 021E 0048 030C 021F 0068 030C 0226 0041 0307 0227 0061 0307 0228 0045 0327 0229 0065 0327 022A 00D6 0304 022B 00F6 0304 022C 00D5 0304 022D 00F5 0304 022E 004F 0307 022F 006F 0307 0230 022E 0304 0231 022F 0304 0232 0059 0304 0233 0079 0304 0340 0300 0341 0301 0343 0313 0344 0308 0301 0374 02B9 037E 003B 0385 00A8 0301 0386 0391 0301 0387 00B7 0388 0395 0301 0389 0397 0301 038A 0399 0301 038C 039F 0301 038E 03A5 0301 038F 03A9 0301 0390 03CA 0301 03AA 0399 0308 03AB 03A5 0308 03AC 03B1 0301 03AD 03B5 0301 03AE 03B7 0301 03AF 03B9 0301 03B0 03CB 0301 03CA 03B9 0308 03CB 03C5 0308 03CC 03BF 0301 03CD 03C5 0301 03CE 03C9 0301 03D3 03D2 0301 03D4 03D2 0308 0400 0415 0300 0401 0415 0308 0403 0413 0301 0407 0406 0308 040C 041A 0301 040D 0418 0300 040E 0423 0306 0419 0418 0306 0439 0438 0306 0450 0435 0300 0451 0435 0308 0453 0433 0301 0457 0456 0308 045C 043A 0301 045D 0438 0300 045E 0443 0306 0476 0474 030F 0477 0475 030F 04C1 0416 0306 04C2 0436 0306 04D0 0410 0306 04D1 0430 0306 04D2 0410 0308 04D3 0430 0308 04D6 0415 0306 04D7 0435 0306 04DA 04D8 0308 04DB 04D9 0308 04DC 0416 0308 04DD 0436 0308 04DE 0417 0308 04DF 0437 0308 04E2 0418 0304 04E3 0438 0304 04E4 0418 0308 04E5 0438 0308 04E6 041E 0308 04E7 043E 0308 04EA 04E8 0308 04EB 04E9 0308 04EC 042D 0308 04ED 044D 0308 04EE 0423 0304 04EF 0443 0304 04F0 0423 0308 04F1 0443 0308 04F2 0423 030B 04F3 0443 030B 04F4 0427 0308 04F5 0447 0308 04F8 042B 0308 04F9 044B 0308 0622 0627 0653 0623 0627 0654 0624 0648 0654 0625 0627 0655 0626 064A 0654 06C0 06D5 0654 06C2 06C1 0654 06D3 06D2 0654 0929 0928 093C 0931 0930 093C 0934 0933 093C 0958 0915 093C 0959 0916 093C 095A 0917 093C 095B 091C 093C 095C 0921 093C 095D 0922 093C 095E 092B 093C 095F 092F 093C 09CB 09C7 09BE 09CC 09C7 09D7 09DC 09A1 09BC 09DD 09A2 09BC 09DF 09AF 09BC 0A33 0A32 0A3C 0A36 0A38 0A3C 0A59 0A16 0A3C 0A5A 0A17 0A3C 0A5B 0A1C 0A3C 0A5E 0A2B 0A3C 0B48 0B47 0B56 0B4B 0B47 0B3E 0B4C 0B47 0B57 0B5C 0B21 0B3C 0B5D 0B22 0B3C 0B94 0B92 0BD7 0BCA 0BC6 0BBE 0BCB 0BC7 0BBE 0BCC 0BC6 0BD7 0C48 0C46 0C56 0CC0 0CBF 0CD5 0CC7 0CC6 0CD5 0CC8 0CC6 0CD6 0CCA 0CC6 0CC2 0CCB 0CCA 0CD5 0D4A 0D46 0D3E 0D4B 0D47 0D3E 0D4C 0D46 0D57 0DDA 0DD9 0DCA 0DDC 0DD9 0DCF 0DDD 0DDC 0DCA 0DDE 0DD9 0DDF 0F43 0F42 0FB7 0F4D 0F4C 0FB7 0F52 0F51 0FB7 0F57 0F56 0FB7 0F5C 0F5B 0FB7 0F69 0F40 0FB5 0F73 0F71 0F72 0F75 0F71 0F74 0F76 0FB2 0F80 0F78 0FB3 0F80 0F81 0F71 0F80 0F93 0F92 0FB7 0F9D 0F9C 0FB7 0FA2 0FA1 0FB7 0FA7 0FA6 0FB7 0FAC 0FAB 0FB7 0FB9 0F90 0FB5 1026 1025 102E 1E00 0041 0325 1E01 0061 0325 1E02 0042 0307 1E03 0062 0307 1E04 0042 0323 1E05 0062 0323 1E06 0042 0331 1E07 0062 0331 1E08 00C7 0301 1E09 00E7 0301 1E0A 0044 0307 1E0B 0064 0307 1E0C 0044 0323 1E0D 0064 0323 1E0E 0044 0331 1E0F 0064 0331 1E10 0044 0327 1E11 0064 0327 1E12 0044 032D 1E13 0064 032D 1E14 0112 0300 1E15 0113 0300 1E16 0112 0301 1E17 0113 0301 1E18 0045 032D 1E19 0065 032D 1E1A 0045 0330 1E1B 0065 0330 1E1C 0228 0306 1E1D 0229 0306 1E1E 0046 0307 1E1F 0066 0307 1E20 0047 0304 1E21 0067 0304 1E22 0048 0307 1E23 0068 0307 1E24 0048 0323 1E25 0068 0323 1E26 0048 0308 1E27 0068 0308 1E28 0048 0327 1E29 0068 0327 1E2A 0048 032E 1E2B 0068 032E 1E2C 0049 0330 1E2D 0069 0330 1E2E 00CF 0301 1E2F 00EF 0301 1E30 004B 0301 1E31 006B 0301 1E32 004B 0323 1E33 006B 0323 1E34 004B 0331 1E35 006B 0331 1E36 004C 0323 1E37 006C 0323 1E38 1E36 0304 1E39 1E37 0304 1E3A 004C 0331 1E3B 006C 0331 1E3C 004C 032D 1E3D 006C 032D 1E3E 004D 0301 1E3F 006D 0301 1E40 004D 0307 1E41 006D 0307 1E42 004D 0323 1E43 006D 0323 1E44 004E 0307 1E45 006E 0307 1E46 004E 0323 1E47 006E 0323 1E48 004E 0331 1E49 006E 0331 1E4A 004E 032D 1E4B 006E 032D 1E4C 00D5 0301 1E4D 00F5 0301 1E4E 00D5 0308 1E4F 00F5 0308 1E50 014C 0300 1E51 014D 0300 1E52 014C 0301 1E53 014D 0301 1E54 0050 0301 1E55 0070 0301 1E56 0050 0307 1E57 0070 0307 1E58 0052 0307 1E59 0072 0307 1E5A 0052 0323 1E5B 0072 0323 1E5C 1E5A 0304 1E5D 1E5B 0304 1E5E 0052 0331 1E5F 0072 0331 1E60 0053 0307 1E61 0073 0307 1E62 0053 0323 1E63 0073 0323 1E64 015A 0307 1E65 015B 0307 1E66 0160 0307 1E67 0161 0307 1E68 1E62 0307 1E69 1E63 0307 1E6A 0054 0307 1E6B 0074 0307 1E6C 0054 0323 1E6D 0074 0323 1E6E 0054 0331 1E6F 0074 0331 1E70 0054 032D 1E71 0074 032D 1E72 0055 0324 1E73 0075 0324 1E74 0055 0330 1E75 0075 0330 1E76 0055 032D 1E77 0075 032D 1E78 0168 0301 1E79 0169 0301 1E7A 016A 0308 1E7B 016B 0308 1E7C 0056 0303 1E7D 0076 0303 1E7E 0056 0323 1E7F 0076 0323 1E80 0057 0300 1E81 0077 0300 1E82 0057 0301 1E83 0077 0301 1E84 0057 0308 1E85 0077 0308 1E86 0057 0307 1E87 0077 0307 1E88 0057 0323 1E89 0077 0323 1E8A 0058 0307 1E8B 0078 0307 1E8C 0058 0308 1E8D 0078 0308 1E8E 0059 0307 1E8F 0079 0307 1E90 005A 0302 1E91 007A 0302 1E92 005A 0323 1E93 007A 0323 1E94 005A 0331 1E95 007A 0331 1E96 0068 0331 1E97 0074 0308 1E98 0077 030A 1E99 0079 030A 1E9B 017F 0307 1EA0 0041 0323 1EA1 0061 0323 1EA2 0041 0309 1EA3 0061 0309 1EA4 00C2 0301 1EA5 00E2 0301 1EA6 00C2 0300 1EA7 00E2 0300 1EA8 00C2 0309 1EA9 00E2 0309 1EAA 00C2 0303 1EAB 00E2 0303 1EAC 1EA0 0302 1EAD 1EA1 0302 1EAE 0102 0301 1EAF 0103 0301 1EB0 0102 0300 1EB1 0103 0300 1EB2 0102 0309 1EB3 0103 0309 1EB4 0102 0303 1EB5 0103 0303 1EB6 1EA0 0306 1EB7 1EA1 0306 1EB8 0045 0323 1EB9 0065 0323 1EBA 0045 0309 1EBB 0065 0309 1EBC 0045 0303 1EBD 0065 0303 1EBE 00CA 0301 1EBF 00EA 0301 1EC0 00CA 0300 1EC1 00EA 0300 1EC2 00CA 0309 1EC3 00EA 0309 1EC4 00CA 0303 1EC5 00EA 0303 1EC6 1EB8 0302 1EC7 1EB9 0302 1EC8 0049 0309 1EC9 0069 0309 1ECA 0049 0323 1ECB 0069 0323 1ECC 004F 0323 1ECD 006F 0323 1ECE 004F 0309 1ECF 006F 0309 1ED0 00D4 0301 1ED1 00F4 0301 1ED2 00D4 0300 1ED3 00F4 0300 1ED4 00D4 0309 1ED5 00F4 0309 1ED6 00D4 0303 1ED7 00F4 0303 1ED8 1ECC 0302 1ED9 1ECD 0302 1EDA 01A0 0301 1EDB 01A1 0301 1EDC 01A0 0300 1EDD 01A1 0300 1EDE 01A0 0309 1EDF 01A1 0309 1EE0 01A0 0303 1EE1 01A1 0303 1EE2 01A0 0323 1EE3 01A1 0323 1EE4 0055 0323 1EE5 0075 0323 1EE6 0055 0309 1EE7 0075 0309 1EE8 01AF 0301 1EE9 01B0 0301 1EEA 01AF 0300 1EEB 01B0 0300 1EEC 01AF 0309 1EED 01B0 0309 1EEE 01AF 0303 1EEF 01B0 0303 1EF0 01AF 0323 1EF1 01B0 0323 1EF2 0059 0300 1EF3 0079 0300 1EF4 0059 0323 1EF5 0079 0323 1EF6 0059 0309 1EF7 0079 0309 1EF8 0059 0303 1EF9 0079 0303 1F00 03B1 0313 1F01 03B1 0314 1F02 1F00 0300 1F03 1F01 0300 1F04 1F00 0301 1F05 1F01 0301 1F06 1F00 0342 1F07 1F01 0342 1F08 0391 0313 1F09 0391 0314 1F0A 1F08 0300 1F0B 1F09 0300 1F0C 1F08 0301 1F0D 1F09 0301 1F0E 1F08 0342 1F0F 1F09 0342 1F10 03B5 0313 1F11 03B5 0314 1F12 1F10 0300 1F13 1F11 0300 1F14 1F10 0301 1F15 1F11 0301 1F18 0395 0313 1F19 0395 0314 1F1A 1F18 0300 1F1B 1F19 0300 1F1C 1F18 0301 1F1D 1F19 0301 1F20 03B7 0313 1F21 03B7 0314 1F22 1F20 0300 1F23 1F21 0300 1F24 1F20 0301 1F25 1F21 0301 1F26 1F20 0342 1F27 1F21 0342 1F28 0397 0313 1F29 0397 0314 1F2A 1F28 0300 1F2B 1F29 0300 1F2C 1F28 0301 1F2D 1F29 0301 1F2E 1F28 0342 1F2F 1F29 0342 1F30 03B9 0313 1F31 03B9 0314 1F32 1F30 0300 1F33 1F31 0300 1F34 1F30 0301 1F35 1F31 0301 1F36 1F30 0342 1F37 1F31 0342 1F38 0399 0313 1F39 0399 0314 1F3A 1F38 0300 1F3B 1F39 0300 1F3C 1F38 0301 1F3D 1F39 0301 1F3E 1F38 0342 1F3F 1F39 0342 1F40 03BF 0313 1F41 03BF 0314 1F42 1F40 0300 1F43 1F41 0300 1F44 1F40 0301 1F45 1F41 0301 1F48 039F 0313 1F49 039F 0314 1F4A 1F48 0300 1F4B 1F49 0300 1F4C 1F48 0301 1F4D 1F49 0301 1F50 03C5 0313 1F51 03C5 0314 1F52 1F50 0300 1F53 1F51 0300 1F54 1F50 0301 1F55 1F51 0301 1F56 1F50 0342 1F57 1F51 0342 1F59 03A5 0314 1F5B 1F59 0300 1F5D 1F59 0301 1F5F 1F59 0342 1F60 03C9 0313 1F61 03C9 0314 1F62 1F60 0300 1F63 1F61 0300 1F64 1F60 0301 1F65 1F61 0301 1F66 1F60 0342 1F67 1F61 0342 1F68 03A9 0313 1F69 03A9 0314 1F6A 1F68 0300 1F6B 1F69 0300 1F6C 1F68 0301 1F6D 1F69 0301 1F6E 1F68 0342 1F6F 1F69 0342 1F70 03B1 0300 1F71 03AC 1F72 03B5 0300 1F73 03AD 1F74 03B7 0300 1F75 03AE 1F76 03B9 0300 1F77 03AF 1F78 03BF 0300 1F79 03CC 1F7A 03C5 0300 1F7B 03CD 1F7C 03C9 0300 1F7D 03CE 1F80 1F00 0345 1F81 1F01 0345 1F82 1F02 0345 1F83 1F03 0345 1F84 1F04 0345 1F85 1F05 0345 1F86 1F06 0345 1F87 1F07 0345 1F88 1F08 0345 1F89 1F09 0345 1F8A 1F0A 0345 1F8B 1F0B 0345 1F8C 1F0C 0345 1F8D 1F0D 0345 1F8E 1F0E 0345 1F8F 1F0F 0345 1F90 1F20 0345 1F91 1F21 0345 1F92 1F22 0345 1F93 1F23 0345 1F94 1F24 0345 1F95 1F25 0345 1F96 1F26 0345 1F97 1F27 0345 1F98 1F28 0345 1F99 1F29 0345 1F9A 1F2A 0345 1F9B 1F2B 0345 1F9C 1F2C 0345 1F9D 1F2D 0345 1F9E 1F2E 0345 1F9F 1F2F 0345 1FA0 1F60 0345 1FA1 1F61 0345 1FA2 1F62 0345 1FA3 1F63 0345 1FA4 1F64 0345 1FA5 1F65 0345 1FA6 1F66 0345 1FA7 1F67 0345 1FA8 1F68 0345 1FA9 1F69 0345 1FAA 1F6A 0345 1FAB 1F6B 0345 1FAC 1F6C 0345 1FAD 1F6D 0345 1FAE 1F6E 0345 1FAF 1F6F 0345 1FB0 03B1 0306 1FB1 03B1 0304 1FB2 1F70 0345 1FB3 03B1 0345 1FB4 03AC 0345 1FB6 03B1 0342 1FB7 1FB6 0345 1FB8 0391 0306 1FB9 0391 0304 1FBA 0391 0300 1FBB 0386 1FBC 0391 0345 1FBE 03B9 1FC1 00A8 0342 1FC2 1F74 0345 1FC3 03B7 0345 1FC4 03AE 0345 1FC6 03B7 0342 1FC7 1FC6 0345 1FC8 0395 0300 1FC9 0388 1FCA 0397 0300 1FCB 0389 1FCC 0397 0345 1FCD 1FBF 0300 1FCE 1FBF 0301 1FCF 1FBF 0342 1FD0 03B9 0306 1FD1 03B9 0304 1FD2 03CA 0300 1FD3 0390 1FD6 03B9 0342 1FD7 03CA 0342 1FD8 0399 0306 1FD9 0399 0304 1FDA 0399 0300 1FDB 038A 1FDD 1FFE 0300 1FDE 1FFE 0301 1FDF 1FFE 0342 1FE0 03C5 0306 1FE1 03C5 0304 1FE2 03CB 0300 1FE3 03B0 1FE4 03C1 0313 1FE5 03C1 0314 1FE6 03C5 0342 1FE7 03CB 0342 1FE8 03A5 0306 1FE9 03A5 0304 1FEA 03A5 0300 1FEB 038E 1FEC 03A1 0314 1FED 00A8 0300 1FEE 0385 1FEF 0060 1FF2 1F7C 0345 1FF3 03C9 0345 1FF4 03CE 0345 1FF6 03C9 0342 1FF7 1FF6 0345 1FF8 039F 0300 1FF9 038C 1FFA 03A9 0300 1FFB 038F 1FFC 03A9 0345 1FFD 00B4 2000 2002 2001 2003 2126 03A9 212A 004B 212B 00C5 219A 2190 0338 219B 2192 0338 21AE 2194 0338 21CD 21D0 0338 21CE 21D4 0338 21CF 21D2 0338 2204 2203 0338 2209 2208 0338 220C 220B 0338 2224 2223 0338 2226 2225 0338 2241 223C 0338 2244 2243 0338 2247 2245 0338 2249 2248 0338 2260 003D 0338 2262 2261 0338 226D 224D 0338 226E 003C 0338 226F 003E 0338 2270 2264 0338 2271 2265 0338 2274 2272 0338 2275 2273 0338 2278 2276 0338 2279 2277 0338 2280 227A 0338 2281 227B 0338 2284 2282 0338 2285 2283 0338 2288 2286 0338 2289 2287 0338 22AC 22A2 0338 22AD 22A8 0338 22AE 22A9 0338 22AF 22AB 0338 22E0 227C 0338 22E1 227D 0338 22E2 2291 0338 22E3 2292 0338 22EA 22B2 0338 22EB 22B3 0338 22EC 22B4 0338 22ED 22B5 0338 2329 3008 232A 3009 2ADC 2ADD 0338 304C 304B 3099 304E 304D 3099 3050 304F 3099 3052 3051 3099 3054 3053 3099 3056 3055 3099 3058 3057 3099 305A 3059 3099 305C 305B 3099 305E 305D 3099 3060 305F 3099 3062 3061 3099 3065 3064 3099 3067 3066 3099 3069 3068 3099 3070 306F 3099 3071 306F 309A 3073 3072 3099 3074 3072 309A 3076 3075 3099 3077 3075 309A 3079 3078 3099 307A 3078 309A 307C 307B 3099 307D 307B 309A 3094 3046 3099 309E 309D 3099 30AC 30AB 3099 30AE 30AD 3099 30B0 30AF 3099 30B2 30B1 3099 30B4 30B3 3099 30B6 30B5 3099 30B8 30B7 3099 30BA 30B9 3099 30BC 30BB 3099 30BE 30BD 3099 30C0 30BF 3099 30C2 30C1 3099 30C5 30C4 3099 30C7 30C6 3099 30C9 30C8 3099 30D0 30CF 3099 30D1 30CF 309A 30D3 30D2 3099 30D4 30D2 309A 30D6 30D5 3099 30D7 30D5 309A 30D9 30D8 3099 30DA 30D8 309A 30DC 30DB 3099 30DD 30DB 309A 30F4 30A6 3099 30F7 30EF 3099 30F8 30F0 3099 30F9 30F1 3099 30FA 30F2 3099 30FE 30FD 3099 F900 8C48 F901 66F4 F902 8ECA F903 8CC8 F904 6ED1 F905 4E32 F906 53E5 F907 9F9C F908 9F9C F909 5951 F90A 91D1 F90B 5587 F90C 5948 F90D 61F6 F90E 7669 F90F 7F85 F910 863F F911 87BA F912 88F8 F913 908F F914 6A02 F915 6D1B F916 70D9 F917 73DE F918 843D F919 916A F91A 99F1 F91B 4E82 F91C 5375 F91D 6B04 F91E 721B F91F 862D F920 9E1E F921 5D50 F922 6FEB F923 85CD F924 8964 F925 62C9 F926 81D8 F927 881F F928 5ECA F929 6717 F92A 6D6A F92B 72FC F92C 90CE F92D 4F86 F92E 51B7 F92F 52DE F930 64C4 F931 6AD3 F932 7210 F933 76E7 F934 8001 F935 8606 F936 865C F937 8DEF F938 9732 F939 9B6F F93A 9DFA F93B 788C F93C 797F F93D 7DA0 F93E 83C9 F93F 9304 F940 9E7F F941 8AD6 F942 58DF F943 5F04 F944 7C60 F945 807E F946 7262 F947 78CA F948 8CC2 F949 96F7 F94A 58D8 F94B 5C62 F94C 6A13 F94D 6DDA F94E 6F0F F94F 7D2F F950 7E37 F951 964B F952 52D2 F953 808B F954 51DC F955 51CC F956 7A1C F957 7DBE F958 83F1 F959 9675 F95A 8B80 F95B 62CF F95C 6A02 F95D 8AFE F95E 4E39 F95F 5BE7 F960 6012 F961 7387 F962 7570 F963 5317 F964 78FB F965 4FBF F966 5FA9 F967 4E0D F968 6CCC F969 6578 F96A 7D22 F96B 53C3 F96C 585E F96D 7701 F96E 8449 F96F 8AAA F970 6BBA F971 8FB0 F972 6C88 F973 62FE F974 82E5 F975 63A0 F976 7565 F977 4EAE F978 5169 F979 51C9 F97A 6881 F97B 7CE7 F97C 826F F97D 8AD2 F97E 91CF F97F 52F5 F980 5442 F981 5973 F982 5EEC F983 65C5 F984 6FFE F985 792A F986 95AD F987 9A6A F988 9E97 F989 9ECE F98A 529B F98B 66C6 F98C 6B77 F98D 8F62 F98E 5E74 F98F 6190 F990 6200 F991 649A F992 6F23 F993 7149 F994 7489 F995 79CA F996 7DF4 F997 806F F998 8F26 F999 84EE F99A 9023 F99B 934A F99C 5217 F99D 52A3 F99E 54BD F99F 70C8 F9A0 88C2 F9A1 8AAA F9A2 5EC9 F9A3 5FF5 F9A4 637B F9A5 6BAE F9A6 7C3E F9A7 7375 F9A8 4EE4 F9A9 56F9 F9AA 5BE7 F9AB 5DBA F9AC 601C F9AD 73B2 F9AE 7469 F9AF 7F9A F9B0 8046 F9B1 9234 F9B2 96F6 F9B3 9748 F9B4 9818 F9B5 4F8B F9B6 79AE F9B7 91B4 F9B8 96B8 F9B9 60E1 F9BA 4E86 F9BB 50DA F9BC 5BEE F9BD 5C3F F9BE 6599 F9BF 6A02 F9C0 71CE F9C1 7642 F9C2 84FC F9C3 907C F9C4 9F8D F9C5 6688 F9C6 962E F9C7 5289 F9C8 677B F9C9 67F3 F9CA 6D41 F9CB 6E9C F9CC 7409 F9CD 7559 F9CE 786B F9CF 7D10 F9D0 985E F9D1 516D F9D2 622E F9D3 9678 F9D4 502B F9D5 5D19 F9D6 6DEA F9D7 8F2A F9D8 5F8B F9D9 6144 F9DA 6817 F9DB 7387 F9DC 9686 F9DD 5229 F9DE 540F F9DF 5C65 F9E0 6613 F9E1 674E F9E2 68A8 F9E3 6CE5 F9E4 7406 F9E5 75E2 F9E6 7F79 F9E7 88CF F9E8 88E1 F9E9 91CC F9EA 96E2 F9EB 533F F9EC 6EBA F9ED 541D F9EE 71D0 F9EF 7498 F9F0 85FA F9F1 96A3 F9F2 9C57 F9F3 9E9F F9F4 6797 F9F5 6DCB F9F6 81E8 F9F7 7ACB F9F8 7B20 F9F9 7C92 F9FA 72C0 F9FB 7099 F9FC 8B58 F9FD 4EC0 F9FE 8336 F9FF 523A FA00 5207 FA01 5EA6 FA02 62D3 FA03 7CD6 FA04 5B85 FA05 6D1E FA06 66B4 FA07 8F3B FA08 884C FA09 964D FA0A 898B FA0B 5ED3 FA0C 5140 FA0D 55C0 FA10 585A FA12 6674 FA15 51DE FA16 732A FA17 76CA FA18 793C FA19 795E FA1A 7965 FA1B 798F FA1C 9756 FA1D 7CBE FA1E 7FBD FA20 8612 FA22 8AF8 FA25 9038 FA26 90FD FA2A 98EF FA2B 98FC FA2C 9928 FA2D 9DB4 FA30 4FAE FA31 50E7 FA32 514D FA33 52C9 FA34 52E4 FA35 5351 FA36 559D FA37 5606 FA38 5668 FA39 5840 FA3A 58A8 FA3B 5C64 FA3C 5C6E FA3D 6094 FA3E 6168 FA3F 618E FA40 61F2 FA41 654F FA42 65E2 FA43 6691 FA44 6885 FA45 6D77 FA46 6E1A FA47 6F22 FA48 716E FA49 722B FA4A 7422 FA4B 7891 FA4C 793E FA4D 7949 FA4E 7948 FA4F 7950 FA50 7956 FA51 795D FA52 798D FA53 798E FA54 7A40 FA55 7A81 FA56 7BC0 FA57 7DF4 FA58 7E09 FA59 7E41 FA5A 7F72 FA5B 8005 FA5C 81ED FA5D 8279 FA5E 8279 FA5F 8457 FA60 8910 FA61 8996 FA62 8B01 FA63 8B39 FA64 8CD3 FA65 8D08 FA66 8FB6 FA67 9038 FA68 96E3 FA69 97FF FA6A 983B FB1D 05D9 05B4 FB1F 05F2 05B7 FB2A 05E9 05C1 FB2B 05E9 05C2 FB2C FB49 05C1 FB2D FB49 05C2 FB2E 05D0 05B7 FB2F 05D0 05B8 FB30 05D0 05BC FB31 05D1 05BC FB32 05D2 05BC FB33 05D3 05BC FB34 05D4 05BC FB35 05D5 05BC FB36 05D6 05BC FB38 05D8 05BC FB39 05D9 05BC FB3A 05DA 05BC FB3B 05DB 05BC FB3C 05DC 05BC FB3E 05DE 05BC FB40 05E0 05BC FB41 05E1 05BC FB43 05E3 05BC FB44 05E4 05BC FB46 05E6 05BC FB47 05E7 05BC FB48 05E8 05BC FB49 05E9 05BC FB4A 05EA 05BC FB4B 05D5 05B9 FB4C 05D1 05BF FB4D 05DB 05BF FB4E 05E4 05BF therion/thgrade.cxx0000664000175000017500000001437010722035302013407 0ustar useruser/** * @file thgrade.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thgrade.h" #include "thexception.h" #include "thchenc.h" #include "thdata.h" #include "thparse.h" thgrade::thgrade() { this->data.reset_data_sd(); this->update_sd_from_data(true); } thgrade::~thgrade() { } int thgrade::get_class_id() { return TT_GRADE_CMD; } bool thgrade::is(int class_id) { if (class_id == TT_GRADE_CMD) return true; else return thdataobject::is(class_id); } int thgrade::get_cmd_nargs() { return 1; } const char * thgrade::get_cmd_end() { return "endgrade"; } const char * thgrade::get_cmd_name() { // insert command name here return "grade"; } thcmd_option_desc thgrade::get_cmd_option_desc(const char * opts) { // no options allowed // int id = thmatch_token(opts, thtt_grade_opt); // if (id == TT_GRADE_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); // else // return thcmd_option_desc(id); } void thgrade::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { switch (cod.id) { case 0: thsplit_args(& this->db->mbuff_tmp, *args); this->set_sd(this->db->mbuff_tmp.get_size(), this->db->mbuff_tmp.get_buffer()); break; case 1: cod.id = TT_DATAOBJECT_NAME; default: thdataobject::set(cod, args, argenc, indataline); } } void thgrade::self_delete() { delete this; } void thgrade::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thgrade:\n"); fprintf(outf,"\tlength sd: %f metres\n",thinn(this->dls_length)); fprintf(outf,"\tbrearing sd: %f degrees\n",thinn(this->dls_bearing)); fprintf(outf,"\tgradient sd: %f degrees\n",thinn(this->dls_gradient)); fprintf(outf,"\tcounter sd: %f metres\n",thinn(this->dls_counter)); fprintf(outf,"\tdepth sd: %f metres\n",thinn(this->dls_depth)); fprintf(outf,"\tdx sd: %f metres\n",thinn(this->dls_dx)); fprintf(outf,"\tdy sd: %f metres\n",thinn(this->dls_dy)); fprintf(outf,"\tdz sd: %f metres\n",thinn(this->dls_dz)); fprintf(outf,"\tx sd: %f metres\n",thinn(this->dls_x)); fprintf(outf,"\ty sd: %f metres\n",thinn(this->dls_y)); fprintf(outf,"\tz sd: %f metres\n",thinn(this->dls_z)); } void thgrade::set_sd(int nargs, char ** args) { this->data.set_data_sd(nargs, args); } int thgrade::get_context() { return (THCTX_SURVEY | THCTX_NONE | THCTX_SCRAP); } void thgrade::update_sd_from_data(bool alsonan) { if (alsonan) { this->dls_length = this->data.dls_length; this->dls_gradient = this->data.dls_gradient; this->dls_bearing = this->data.dls_bearing; this->dls_counter = this->data.dls_counter; this->dls_depth = this->data.dls_depth; this->dls_dx = this->data.dls_dx; this->dls_dy = this->data.dls_dy; this->dls_dz = this->data.dls_dz; this->dls_x = this->data.dls_x; this->dls_y = this->data.dls_y; this->dls_z = this->data.dls_z; } else { thupdate_double(this->dls_length, this->data.dls_length); thupdate_double(this->dls_gradient, this->data.dls_gradient); thupdate_double(this->dls_bearing, this->data.dls_bearing); thupdate_double(this->dls_counter, this->data.dls_counter); thupdate_double(this->dls_depth, this->data.dls_depth); thupdate_double(this->dls_dx, this->data.dls_dx); thupdate_double(this->dls_dy, this->data.dls_dy); thupdate_double(this->dls_dz, this->data.dls_dz); thupdate_double(this->dls_x, this->data.dls_x); thupdate_double(this->dls_y, this->data.dls_y); thupdate_double(this->dls_z, this->data.dls_z); } } void thgrade::update_data_sd(thdata * dp) { thupdate_double(dp->dls_length, this->dls_length); thupdate_double(dp->dls_gradient, this->dls_gradient); thupdate_double(dp->dls_bearing, this->dls_bearing); thupdate_double(dp->dls_counter, this->dls_counter); thupdate_double(dp->dls_depth, this->dls_depth); thupdate_double(dp->dls_dx, this->dls_dx); thupdate_double(dp->dls_dy, this->dls_dy); thupdate_double(dp->dls_dz, this->dls_dz); thupdate_double(dp->dls_x, this->dls_x); thupdate_double(dp->dls_y, this->dls_y); thupdate_double(dp->dls_z, this->dls_z); } void thgrade::start_insert() { this->update_sd_from_data(); } void thgrade::self_print_library() { thprintf("\toname = \"%s\";\n", this->get_name()); thprintf("\tpgrade->set(thcmd_option_desc(TT_DATAOBJECT_NAME,1),oname,0,0);\n"); thdecode_c(&(this->db->buff_enc), this->get_title()); thprintf("\toname = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tpgrade->set(thcmd_option_desc(TT_DATAOBJECT_TITLE,1),oname,TT_UTF_8,0);\n"); thprintf("\tpgrade->dls_length = "); thprintinfnan(this->dls_length); thprintf(";\n\tpgrade->dls_bearing = "); thprintinfnan(this->dls_bearing); thprintf(";\n\tpgrade->dls_gradient = "); thprintinfnan(this->dls_gradient); thprintf(";\n\tpgrade->dls_counter = "); thprintinfnan(this->dls_counter); thprintf(";\n\tpgrade->dls_depth = "); thprintinfnan(this->dls_depth); thprintf(";\n\tpgrade->dls_dx = "); thprintinfnan(this->dls_dx); thprintf(";\n\tpgrade->dls_dy = "); thprintinfnan(this->dls_dy); thprintf(";\n\tpgrade->dls_dz = "); thprintinfnan(this->dls_dz); thprintf(";\n\tpgrade->dls_x = "); thprintinfnan(this->dls_x); thprintf(";\n\tpgrade->dls_y = "); thprintinfnan(this->dls_y); thprintf(";\n\tpgrade->dls_z = "); thprintinfnan(this->dls_z); thprintf(";\n"); } thdata thgrade::data; therion/thsymbolsetlist.h0000664000175000017500000004267212047251762014711 0ustar useruser/** * thsymbolsetlist.h * * THIS FILE IS GENERATED AUTOMATICALLY, DO NOT MODIFY IT !!! */ #ifndef thsymbolsetlist_h #define thsymbolsetlist_h #define thsymbolset_size 206 enum { SYMA_ = 0, SYMA_BEDROCK = 1, SYMA_BLOCKS = 2, SYMA_CLAY = 3, SYMA_DEBRIS = 4, SYMA_DIMENSIONS = 5, SYMA_FLOWSTONE = 6, SYMA_ICE = 7, SYMA_MOONMILK = 8, SYMA_PEBBLES = 9, SYMA_SAND = 10, SYMA_SNOW = 11, SYMA_SUMP = 12, SYMA_U = 13, SYMA_WATER = 14, SYMA_ZZZ = 15, SYML_ = 16, SYML_ARROW = 17, SYML_BORDER_INVISIBLE = 18, SYML_BORDER_PRESUMED = 19, SYML_BORDER_TEMPORARY = 20, SYML_BORDER_VISIBLE = 21, SYML_CEILINGMEANDER = 22, SYML_CEILINGSTEP = 23, SYML_CHIMNEY = 24, SYML_CONTOUR = 25, SYML_FIXEDLADDER = 26, SYML_FLOORMEANDER = 27, SYML_FLOORSTEP = 28, SYML_FLOWSTONE = 29, SYML_GRADIENT = 30, SYML_HANDRAIL = 31, SYML_LABEL = 32, SYML_MAPCONNECTION = 33, SYML_MOONMILK = 34, SYML_OVERHANG = 35, SYML_PIT = 36, SYML_ROCKBORDER = 37, SYML_ROCKEDGE = 38, SYML_ROPE = 39, SYML_ROPELADDER = 40, SYML_SECTION = 41, SYML_SLOPE = 42, SYML_STEPS = 43, SYML_SURVEY_CAVE = 44, SYML_SURVEY_SURFACE = 45, SYML_U = 46, SYML_UNDEFINED = 47, SYML_VIAFERRATA = 48, SYML_WALL_BEDROCK = 49, SYML_WALL_BLOCKS = 50, SYML_WALL_CLAY = 51, SYML_WALL_DEBRIS = 52, SYML_WALL_FLOWSTONE = 53, SYML_WALL_ICE = 54, SYML_WALL_INVISIBLE = 55, SYML_WALL_MOONMILK = 56, SYML_WALL_OVERLYING = 57, SYML_WALL_PEBBLES = 58, SYML_WALL_PIT = 59, SYML_WALL_PRESUMED = 60, SYML_WALL_SAND = 61, SYML_WALL_UNDERLYING = 62, SYML_WALL_UNSURVEYED = 63, SYML_WATERFLOW_CONJECTURAL = 64, SYML_WATERFLOW_INTERMITTENT = 65, SYML_WATERFLOW_PERMANENT = 66, SYML_ZZZ = 67, SYMP_ = 68, SYMP_AIRDRAUGHT = 69, SYMP_AIRDRAUGHT_SUMMER = 70, SYMP_AIRDRAUGHT_WINTER = 71, SYMP_ALTITUDE = 72, SYMP_ANASTOMOSIS = 73, SYMP_ANCHOR = 74, SYMP_ARAGONITE = 75, SYMP_ARCHEOMATERIAL = 76, SYMP_BEDROCK = 77, SYMP_BLOCKS = 78, SYMP_BREAKDOWNCHOKE = 79, SYMP_BRIDGE = 80, SYMP_CAMP = 81, SYMP_CAVEPEARL = 82, SYMP_CAVESTATION = 83, SYMP_CLAY = 84, SYMP_CLAYCHOKE = 85, SYMP_CLAYTREE = 86, SYMP_CONTINUATION = 87, SYMP_CRYSTAL = 88, SYMP_CURTAIN = 89, SYMP_DATE = 90, SYMP_DEBRIS = 91, SYMP_DIG = 92, SYMP_DISK = 93, SYMP_ENTRANCE = 94, SYMP_FIXEDLADDER = 95, SYMP_FLAG_AIRDRAUGHT = 96, SYMP_FLAG_ARCH = 97, SYMP_FLAG_CONTINUATION = 98, SYMP_FLAG_DIG = 99, SYMP_FLAG_DOLINE = 100, SYMP_FLAG_ENTRANCE = 101, SYMP_FLAG_OVERHANG = 102, SYMP_FLAG_SINK = 103, SYMP_FLAG_SPRING = 104, SYMP_FLOWSTONE = 105, SYMP_FLOWSTONECHOKE = 106, SYMP_FLUTE = 107, SYMP_GRADIENT = 108, SYMP_GUANO = 109, SYMP_GYPSUM = 110, SYMP_GYPSUMFLOWER = 111, SYMP_HANDRAIL = 112, SYMP_HEIGHT_NEGATIVE = 113, SYMP_HEIGHT_POSITIVE = 114, SYMP_HEIGHT_UNSIGNED = 115, SYMP_HELICTITE = 116, SYMP_ICE = 117, SYMP_ICEPILLAR = 118, SYMP_ICESTALACTITE = 119, SYMP_ICESTALAGMITE = 120, SYMP_KARREN = 121, SYMP_LABEL = 122, SYMP_LOWEND = 123, SYMP_MAPCONNECTION = 124, SYMP_MOONMILK = 125, SYMP_NARROWEND = 126, SYMP_NOEQUIPMENT = 127, SYMP_PALEOMATERIAL = 128, SYMP_PASSAGEHEIGHT_BOTH = 129, SYMP_PASSAGEHEIGHT_NEGATIVE = 130, SYMP_PASSAGEHEIGHT_POSITIVE = 131, SYMP_PASSAGEHEIGHT_UNSIGNED = 132, SYMP_PEBBLES = 133, SYMP_PILLAR = 134, SYMP_PILLARS = 135, SYMP_POPCORN = 136, SYMP_RAFT = 137, SYMP_RAFTCONE = 138, SYMP_REMARK = 139, SYMP_RIMSTONEDAM = 140, SYMP_RIMSTONEPOOL = 141, SYMP_ROOT = 142, SYMP_ROPE = 143, SYMP_ROPELADDER = 144, SYMP_SAND = 145, SYMP_SCALLOP = 146, SYMP_SECTION = 147, SYMP_SECTIONARROW = 148, SYMP_SINK = 149, SYMP_SNOW = 150, SYMP_SODASTRAW = 151, SYMP_SPRING = 152, SYMP_STALACTITE = 153, SYMP_STALACTITES = 154, SYMP_STALAGMITE = 155, SYMP_STALAGMITES = 156, SYMP_STATION = 157, SYMP_STATION_FIXED = 158, SYMP_STATION_NATURAL = 159, SYMP_STATION_PAINTED = 160, SYMP_STATION_TEMPORARY = 161, SYMP_STATIONNAME = 162, SYMP_STEPS = 163, SYMP_SURFACESTATION = 164, SYMP_TRAVERSE = 165, SYMP_U = 166, SYMP_UNDEFINED = 167, SYMP_VEGETABLEDEBRIS = 168, SYMP_VIAFERRATA = 169, SYMP_WALLALTITUDE = 170, SYMP_WALLCALCITE = 171, SYMP_WATER = 172, SYMP_WATERFLOW_INTERMITTENT = 173, SYMP_WATERFLOW_PALEO = 174, SYMP_WATERFLOW_PERMANENT = 175, SYMP_ZZZ = 176, SYMS_ = 177, SYMS_HGRID = 178, SYMS_NORTHARROW = 179, SYMS_SCALEBAR = 180, SYMS_VGRID = 181, SYMS_ZZZ = 182, SYMX_ = 183, SYMX_ALL = 184, SYMX_CAVECENTERLINE = 185, SYMX_CENTERLINE = 186, SYMX_EQUIPMENT = 187, SYMX_ICE = 188, SYMX_LINE_BORDER = 189, SYMX_LINE_SURVEY = 190, SYMX_LINE_WALL = 191, SYMX_LINE_WATERFLOW = 192, SYMX_PASSAGEFILLS = 193, SYMX_POINT_AIRDRAUGHT = 194, SYMX_POINT_FLAG = 195, SYMX_POINT_HEIGHT = 196, SYMX_POINT_PASSAGEHEIGHT = 197, SYMX_POINT_STATION = 198, SYMX_POINT_WATERFLOW = 199, SYMX_SECTIONS = 200, SYMX_SEDIMENTS = 201, SYMX_SPELEOTHEMS = 202, SYMX_SURFACECENTERLINE = 203, SYMX_TEXT = 204, SYMX_WATER = 205, }; typedef const char * thsymbolset__char_ptr; static const thsymbolset__char_ptr thsymbolset__mp [] = { "a_", "a_bedrock", "a_blocks", "a_clay", "a_debris", "a_dimensions", "a_flowstone", "a_ice", "a_moonmilk", "a_pebbles", "a_sand", "a_snow", "a_sump", "a_u", "a_water", "a_zzz", "l_", "l_arrow", "l_border_invisible", "l_border_presumed", "l_border_temporary", "l_border_visible", "l_ceilingmeander", "l_ceilingstep", "l_chimney", "l_contour", "l_fixedladder", "l_floormeander", "l_floorstep", "l_flowstone", "l_gradient", "l_handrail", "l_label", "l_mapconnection", "l_moonmilk", "l_overhang", "l_pit", "l_rockborder", "l_rockedge", "l_rope", "l_ropeladder", "l_section", "l_slope", "l_steps", "l_survey_cave", "l_survey_surface", "l_u", "l_undefined", "l_viaferrata", "l_wall_bedrock", "l_wall_blocks", "l_wall_clay", "l_wall_debris", "l_wall_flowstone", "l_wall_ice", "l_wall_invisible", "l_wall_moonmilk", "l_wall_overlying", "l_wall_pebbles", "l_wall_pit", "l_wall_presumed", "l_wall_sand", "l_wall_underlying", "l_wall_unsurveyed", "l_waterflow_conjectural", "l_waterflow_intermittent", "l_waterflow_permanent", "l_zzz", "p_", "p_airdraught", "p_airdraught_summer", "p_airdraught_winter", "p_altitude", "p_anastomosis", "p_anchor", "p_aragonite", "p_archeomaterial", "p_bedrock", "p_blocks", "p_breakdownchoke", "p_bridge", "p_camp", "p_cavepearl", "p_cavestation", "p_clay", "p_claychoke", "p_claytree", "p_continuation", "p_crystal", "p_curtain", "p_date", "p_debris", "p_dig", "p_disk", "p_entrance", "p_fixedladder", "p_flag_airdraught", "p_flag_arch", "p_flag_continuation", "p_flag_dig", "p_flag_doline", "p_flag_entrance", "p_flag_overhang", "p_flag_sink", "p_flag_spring", "p_flowstone", "p_flowstonechoke", "p_flute", "p_gradient", "p_guano", "p_gypsum", "p_gypsumflower", "p_handrail", "p_height_negative", "p_height_positive", "p_height_unsigned", "p_helictite", "p_ice", "p_icepillar", "p_icestalactite", "p_icestalagmite", "p_karren", "p_label", "p_lowend", "p_mapconnection", "p_moonmilk", "p_narrowend", "p_noequipment", "p_paleomaterial", "p_passageheight_both", "p_passageheight_negative", "p_passageheight_positive", "p_passageheight_unsigned", "p_pebbles", "p_pillar", "p_pillars", "p_popcorn", "p_raft", "p_raftcone", "p_remark", "p_rimstonedam", "p_rimstonepool", "p_root", "p_rope", "p_ropeladder", "p_sand", "p_scallop", "p_section", "p_sectionarrow", "p_sink", "p_snow", "p_sodastraw", "p_spring", "p_stalactite", "p_stalactites", "p_stalagmite", "p_stalagmites", "p_station", "p_station_fixed", "p_station_natural", "p_station_painted", "p_station_temporary", "p_stationname", "p_steps", "p_surfacestation", "p_traverse", "p_u", "p_undefined", "p_vegetabledebris", "p_viaferrata", "p_wallaltitude", "p_wallcalcite", "p_water", "p_waterflow_intermittent", "p_waterflow_paleo", "p_waterflow_permanent", "p_zzz", "s_", "s_hgrid", "s_northarrow", "s_scalebar", "s_vgrid", "s_zzz", "x_", "x_all", "x_cavecenterline", "x_centerline", "x_equipment", "x_ice", "x_line_border", "x_line_survey", "x_line_wall", "x_line_waterflow", "x_passagefills", "x_point_airdraught", "x_point_flag", "x_point_height", "x_point_passageheight", "x_point_station", "x_point_waterflow", "x_sections", "x_sediments", "x_speleothems", "x_surfacecenterline", "x_text", "x_water", }; static const bool thsymbolset__assign [] = { false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, true, true, true, false, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, true, true, true, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, false, false, false, true, true, true, true, true, true, false, true, false, true, true, true, true, false, false, false, false, true, true, true, true, true, true, false, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, true, true, false, true, true, false, true, true, true, true, true, false, false, true, true, true, true, false, false, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, }; static const bool thsymbolset__hidden [] = { true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, }; static const thsymbolset__char_ptr thsymbolset__src [] = { "SYMA_", "SYMA_BEDROCK", "SYMA_BLOCKS", "SYMA_CLAY", "SYMA_DEBRIS", "SYMA_DIMENSIONS", "SYMA_FLOWSTONE", "SYMA_ICE", "SYMA_MOONMILK", "SYMA_PEBBLES", "SYMA_SAND", "SYMA_SNOW", "SYMA_SUMP", "SYMA_U", "SYMA_WATER", "SYMA_ZZZ", "SYML_", "SYML_ARROW", "SYML_BORDER_INVISIBLE", "SYML_BORDER_PRESUMED", "SYML_BORDER_TEMPORARY", "SYML_BORDER_VISIBLE", "SYML_CEILINGMEANDER", "SYML_CEILINGSTEP", "SYML_CHIMNEY", "SYML_CONTOUR", "SYML_FIXEDLADDER", "SYML_FLOORMEANDER", "SYML_FLOORSTEP", "SYML_FLOWSTONE", "SYML_GRADIENT", "SYML_HANDRAIL", "SYML_LABEL", "SYML_MAPCONNECTION", "SYML_MOONMILK", "SYML_OVERHANG", "SYML_PIT", "SYML_ROCKBORDER", "SYML_ROCKEDGE", "SYML_ROPE", "SYML_ROPELADDER", "SYML_SECTION", "SYML_SLOPE", "SYML_STEPS", "SYML_SURVEY_CAVE", "SYML_SURVEY_SURFACE", "SYML_U", "SYML_UNDEFINED", "SYML_VIAFERRATA", "SYML_WALL_BEDROCK", "SYML_WALL_BLOCKS", "SYML_WALL_CLAY", "SYML_WALL_DEBRIS", "SYML_WALL_FLOWSTONE", "SYML_WALL_ICE", "SYML_WALL_INVISIBLE", "SYML_WALL_MOONMILK", "SYML_WALL_OVERLYING", "SYML_WALL_PEBBLES", "SYML_WALL_PIT", "SYML_WALL_PRESUMED", "SYML_WALL_SAND", "SYML_WALL_UNDERLYING", "SYML_WALL_UNSURVEYED", "SYML_WATERFLOW_CONJECTURAL", "SYML_WATERFLOW_INTERMITTENT", "SYML_WATERFLOW_PERMANENT", "SYML_ZZZ", "SYMP_", "SYMP_AIRDRAUGHT", "SYMP_AIRDRAUGHT_SUMMER", "SYMP_AIRDRAUGHT_WINTER", "SYMP_ALTITUDE", "SYMP_ANASTOMOSIS", "SYMP_ANCHOR", "SYMP_ARAGONITE", "SYMP_ARCHEOMATERIAL", "SYMP_BEDROCK", "SYMP_BLOCKS", "SYMP_BREAKDOWNCHOKE", "SYMP_BRIDGE", "SYMP_CAMP", "SYMP_CAVEPEARL", "SYMP_CAVESTATION", "SYMP_CLAY", "SYMP_CLAYCHOKE", "SYMP_CLAYTREE", "SYMP_CONTINUATION", "SYMP_CRYSTAL", "SYMP_CURTAIN", "SYMP_DATE", "SYMP_DEBRIS", "SYMP_DIG", "SYMP_DISK", "SYMP_ENTRANCE", "SYMP_FIXEDLADDER", "SYMP_FLAG_AIRDRAUGHT", "SYMP_FLAG_ARCH", "SYMP_FLAG_CONTINUATION", "SYMP_FLAG_DIG", "SYMP_FLAG_DOLINE", "SYMP_FLAG_ENTRANCE", "SYMP_FLAG_OVERHANG", "SYMP_FLAG_SINK", "SYMP_FLAG_SPRING", "SYMP_FLOWSTONE", "SYMP_FLOWSTONECHOKE", "SYMP_FLUTE", "SYMP_GRADIENT", "SYMP_GUANO", "SYMP_GYPSUM", "SYMP_GYPSUMFLOWER", "SYMP_HANDRAIL", "SYMP_HEIGHT_NEGATIVE", "SYMP_HEIGHT_POSITIVE", "SYMP_HEIGHT_UNSIGNED", "SYMP_HELICTITE", "SYMP_ICE", "SYMP_ICEPILLAR", "SYMP_ICESTALACTITE", "SYMP_ICESTALAGMITE", "SYMP_KARREN", "SYMP_LABEL", "SYMP_LOWEND", "SYMP_MAPCONNECTION", "SYMP_MOONMILK", "SYMP_NARROWEND", "SYMP_NOEQUIPMENT", "SYMP_PALEOMATERIAL", "SYMP_PASSAGEHEIGHT_BOTH", "SYMP_PASSAGEHEIGHT_NEGATIVE", "SYMP_PASSAGEHEIGHT_POSITIVE", "SYMP_PASSAGEHEIGHT_UNSIGNED", "SYMP_PEBBLES", "SYMP_PILLAR", "SYMP_PILLARS", "SYMP_POPCORN", "SYMP_RAFT", "SYMP_RAFTCONE", "SYMP_REMARK", "SYMP_RIMSTONEDAM", "SYMP_RIMSTONEPOOL", "SYMP_ROOT", "SYMP_ROPE", "SYMP_ROPELADDER", "SYMP_SAND", "SYMP_SCALLOP", "SYMP_SECTION", "SYMP_SECTIONARROW", "SYMP_SINK", "SYMP_SNOW", "SYMP_SODASTRAW", "SYMP_SPRING", "SYMP_STALACTITE", "SYMP_STALACTITES", "SYMP_STALAGMITE", "SYMP_STALAGMITES", "SYMP_STATION", "SYMP_STATION_FIXED", "SYMP_STATION_NATURAL", "SYMP_STATION_PAINTED", "SYMP_STATION_TEMPORARY", "SYMP_STATIONNAME", "SYMP_STEPS", "SYMP_SURFACESTATION", "SYMP_TRAVERSE", "SYMP_U", "SYMP_UNDEFINED", "SYMP_VEGETABLEDEBRIS", "SYMP_VIAFERRATA", "SYMP_WALLALTITUDE", "SYMP_WALLCALCITE", "SYMP_WATER", "SYMP_WATERFLOW_INTERMITTENT", "SYMP_WATERFLOW_PALEO", "SYMP_WATERFLOW_PERMANENT", "SYMP_ZZZ", "SYMS_", "SYMS_HGRID", "SYMS_NORTHARROW", "SYMS_SCALEBAR", "SYMS_VGRID", "SYMS_ZZZ", "SYMX_", "SYMX_ALL", "SYMX_CAVECENTERLINE", "SYMX_CENTERLINE", "SYMX_EQUIPMENT", "SYMX_ICE", "SYMX_LINE_BORDER", "SYMX_LINE_SURVEY", "SYMX_LINE_WALL", "SYMX_LINE_WATERFLOW", "SYMX_PASSAGEFILLS", "SYMX_POINT_AIRDRAUGHT", "SYMX_POINT_FLAG", "SYMX_POINT_HEIGHT", "SYMX_POINT_PASSAGEHEIGHT", "SYMX_POINT_STATION", "SYMX_POINT_WATERFLOW", "SYMX_SECTIONS", "SYMX_SEDIMENTS", "SYMX_SPELEOTHEMS", "SYMX_SURFACECENTERLINE", "SYMX_TEXT", "SYMX_WATER", }; static const char thsymbolset__fontchar [] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 0, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 0, 46, 47, 48, 49, 50, 51, 0, 52, 53, 54, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 58, 59, 60, 61, 62, 63, 0, 0, 0, 0, 64, 65, 66, 67, 68, 69, 0, 70, 0, 71, 72, 73, 74, 0, 0, 0, 0, 75, 76, 0, 77, 78, 79, 0, 80, 81, 82, 83, 84, 85, 86, 0, 0, 87, 88, 89, 90, 91, 0, 92, 0, 93, 94, 95, 96, 97, 0, 98, 0, 99, 0, 0, 100, 0, 0, 101, 102, 103, 104, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; #endif therion/thlayout.cxx0000664000175000017500000020040312341131013013627 0ustar useruser/** * @file thlayout.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thlayout.h" #include "thexception.h" #include "thchenc.h" #include "thdata.h" #include "thparse.h" #include "thinfnan.h" #include "thpdfdata.h" #include "thsymbolset.h" #include "thtflength.h" #include "thlang.h" #include "thcsdata.h" #include "thconfig.h" #include #ifdef THMSVC #include #define getcwd _getcwd #endif enum { TTLDBG_JOINS = 1, TTLDBG_STATIONS = 2, TTLDBG_SCRAPNAMES = 4, TTLDBG_STATIONNAMES = 8, }; thlayout::thlayout() { this->ccode = TT_LAYOUT_CODE_UNKNOWN; this->m_pconfig = NULL; this->def_scale = 0; this->scale = 0.005; this->def_base_scale = 0; this->base_scale = 0.005; this->def_rotate = 0; this->rotate = 0.0; this->def_origin = 0; this->ox = thnan; this->oy = thnan; this->oz = thnan; this->def_size = 0; this->hsize = 0.18; this->vsize = 0.222; this->def_page_setup = 0; this->paphs = 0.21; this->papvs = 0.297; this->paghs = 0.20; this->pagvs = 0.287; this->marls = 0.005; this->marts = 0.005; this->def_overlap = 0; this->overlap = 0.01; this->def_grid_origin = 0; this->gox = thnan; this->goy = thnan; this->goz = thnan; this->def_grid_size = 0; this->gxs = thnan; this->gys = thnan; this->gzs = thnan; this->def_origin_label = 0; this->olx = "0"; this->oly = "0"; this->def_nav_factor = 0; this->navf = 30.0; this->def_nav_size = 0; this->navsx = 2; this->navsy = 2; this->def_own_pages = 0; this->ownp = 0; this->def_title_pages = 0; this->titlep = false; this->def_doc_title = 0; this->doc_title = ""; this->def_doc_comment = 0; this->doc_comment = ""; this->def_doc_author = 0; this->doc_author = ""; this->def_doc_keywords = 0; this->doc_keywords = ""; this->def_doc_subject = 0; this->doc_subject = ""; this->def_excl_pages = 0; this->excl_pages = false; this->excl_list = NULL; this->def_opacity = 0; this->opacity = 0.75; this->def_map_header_bg = 0; this->map_header_bg = false; this->def_grid_coords = 0; this->grid_coords = TT_LAYOUT_GRIDCOORDS_OFF; this->def_surface = 0; this->surface = TT_LAYOUT_SURFACE_OFF; this->def_surface_opacity = 0; this->surface_opacity = 0.75; this->def_north = 0; this->north = TT_LAYOUT_NORTH_TRUE; this->def_transparency = 0; this->transparency = true; this->def_sketches = 0; this->sketches = false; this->def_legend = 0; this->legend = TT_LAYOUT_LEGEND_OFF; this->def_legend_width = 0; this->legend_width = 0.14; this->def_legend_columns = 0; this->legend_columns = 2; this->def_color_legend = 0; this->color_legend = TT_TRUE; this->def_scale_bar = 0; this->scale_bar = -1.0; this->def_map_header = 0; this->map_header = TT_LAYOUT_MAP_HEADER_NE; this->map_header_x = 100.0; this->map_header_y = 0.0; this->def_debug = 0; this->debug = 0; this->def_survey_level = 0; this->survey_level = 0; this->def_max_explos = 0; this->max_explos = -1; this->def_max_topos = 0; this->max_topos = -1; this->def_max_cartos = 0; this->max_cartos = -1; this->def_max_copys = 0; this->max_copys = -1; this->def_explo_lens = 0; this->explo_lens = TT_LAYOUT_LENSTAT_HIDE; this->def_topo_lens = 0; this->topo_lens = TT_LAYOUT_LENSTAT_HIDE; this->def_lang = 0; this->lang = thcfg.get_lang(); this->def_units = 0; this->units = thdeflocale; this->def_layers = 0; this->layers = true; this->def_grid = 0; this->grid = TT_LAYOUT_GRID_OFF; this->def_page_grid = 0; this->page_grid = false; this->def_page_numbers = 0; this->pgsnum = true; this->def_color_labels = 0; this->color_labels = false; this->def_tex_lines = 0; this->first_line = NULL; this->last_line = NULL; this->lock = false; this->first_copy_src = NULL; this->last_copy_src = NULL; this->color_preview_below.R = 0.5; this->color_preview_below.G = 0.5; this->color_preview_below.B = 0.5; this->color_preview_above.R = 0; this->color_preview_above.G = 0; this->color_preview_above.B = 0; this->color_crit = TT_LAYOUT_CCRIT_UNKNOWN; this->color_mode = TT_LAYOUT_CMODE_AUTO; this->color_table = TT_LAYOUT_CTABLE_HSV; } thlayout::~thlayout() { } int thlayout::get_class_id() { return TT_LAYOUT_CMD; } bool thlayout::is(int class_id) { if (class_id == TT_LAYOUT_CMD) return true; else return thdataobject::is(class_id); } int thlayout::get_cmd_nargs() { return 1; } const char * thlayout::get_cmd_end() { return "endlayout"; } const char * thlayout::get_cmd_name() { // insert command name here return "layout"; } thcmd_option_desc thlayout::get_default_cod(int id) { switch (id) { case TT_LAYOUT_ENDCODE: return thcmd_option_desc(id,0); case TT_LAYOUT_NAV_SIZE: case TT_LAYOUT_OVERLAP: case TT_LAYOUT_SCALE: case TT_LAYOUT_SCALE_BAR: case TT_LAYOUT_BASE_SCALE: case TT_LAYOUT_EXCLUDE_PAGES: case TT_LAYOUT_ORIGIN_LABEL: case TT_LAYOUT_SYMBOL_HIDE: case TT_LAYOUT_SYMBOL_SHOW: case TT_LAYOUT_MAP_ITEM: case TT_LAYOUT_COLOR: case TT_LAYOUT_LEGEND_WIDTH: return thcmd_option_desc(id,2); case TT_LAYOUT_SYMBOL_ASSIGN: case TT_LAYOUT_SIZE: case TT_LAYOUT_MAP_HEADER: case TT_LAYOUT_SYMBOL_COLOR: return thcmd_option_desc(id,3); case TT_LAYOUT_ORIGIN: case TT_LAYOUT_MAP_IMAGE: case TT_LAYOUT_GRID_SIZE: case TT_LAYOUT_GRID_ORIGIN: return thcmd_option_desc(id,4); case TT_LAYOUT_PAGE_SETUP: return thcmd_option_desc(id,7); default: return thcmd_option_desc(id); } } thcmd_option_desc thlayout::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_layout_opt); if (id == TT_LAYOUT_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else return this->get_default_cod(id); } void thlayout_parse_scale(double * scale,char ** args) { double dv; int sv; thparse_double(sv,dv,args[0]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",args[0])) if (dv <= 0.0) ththrow(("positive number expected -- %s",args[0])) *scale = dv; thparse_double(sv,dv,args[1]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",args[1])) if (dv <= 0.0) ththrow(("positive number expected -- %s",args[1])) *scale /= dv; if ((*scale > 1.000001e-1) || (*scale < 9.99999e-6)) ththrow(("scale out of range -- %s %s",args[0], args[1])) } void thlayout_parse_rotate(double & rotate, char * rotstr) { thsplit_words(&(thdb.mbuff_tmp), rotstr); int nargs = thdb.mbuff_tmp.get_size(), sv; char ** args = thdb.mbuff_tmp.get_buffer(); thtfangle atf; switch (nargs) { case 2: atf.parse_units(args[1]); case 1: thparse_double(sv, rotate, args[0]); if (sv != TT_SV_NUMBER) ththrow(("invalid rotate specification -- %s", rotstr)) rotate = atf.transform(rotate); break; default: ththrow(("invalid rotate specification -- %s", rotstr)) } } enum { TTL_MAPITEM_CARTO, TTL_MAPITEM_COPYRIGHT, TTL_MAPITEM_EXPLO, TTL_MAPITEM_TOPO, TTL_MAPITEM_EXPLO_LENS, TTL_MAPITEM_TOPO_LENS, TTL_MAPITEM_SORT, TTL_MAPITEM_UNKNOWN, }; static const thstok thlayout__mapitems[] = { {"carto", TTL_MAPITEM_CARTO}, {"copyright", TTL_MAPITEM_COPYRIGHT}, {"explo", TTL_MAPITEM_EXPLO}, {"explo-length", TTL_MAPITEM_EXPLO_LENS}, {"topo", TTL_MAPITEM_TOPO}, {"topo-length", TTL_MAPITEM_TOPO_LENS}, {NULL, TTL_MAPITEM_UNKNOWN}, }; void thlayout::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { double dum; thlayout_copy_src dumm; int sv, sv2, dum_int; //bool parsed; thlayout_copy_src * lcp; thcmd_option_desc defcod = this->get_default_cod(cod.id); switch (cod.id) { case TT_DATAOBJECT_AUTHOR: case TT_DATAOBJECT_COPYRIGHT: defcod.nargs = 2; default: if (cod.nargs > defcod.nargs) ththrow(("too many arguments -- %s", args[defcod.nargs])) } switch (cod.id) { case 0: case TT_LAYOUT_SYMBOL_DEFAULTS: case TT_LAYOUT_SYMBOL_ASSIGN: case TT_LAYOUT_SYMBOL_HIDE: case TT_LAYOUT_SYMBOL_SHOW: case TT_LAYOUT_SYMBOL_COLOR: if (this->def_tex_lines < 2) { this->first_line = this->db->db2d.insert_layoutln(); this->last_line = this->first_line; this->def_tex_lines = 2; } else { this->last_line->next_line = this->db->db2d.insert_layoutln(); this->last_line = this->last_line->next_line; } switch(cod.id) { case 0: if (this->ccode == TT_LAYOUT_CODE_UNKNOWN) { ththrow(("unknown option -- %s", *args)); } thencode(&(this->db->buff_enc), *args, argenc); this->last_line->line = this->db->strstore(this->db->buff_enc.get_buffer()); this->last_line->code = this->ccode; break; case TT_LAYOUT_SYMBOL_DEFAULTS: if (args != NULL) { if (!th_is_keyword(*args)) ththrow(("invalid keyword -- %s", args[0])) thencode(&(this->db->buff_enc), *args, argenc); this->last_line->line = this->db->strstore(this->db->buff_enc.get_buffer()); } this->last_line->code = TT_LAYOUT_CODE_SYMBOL_DEFAULTS; break; case TT_LAYOUT_SYMBOL_ASSIGN: this->last_line->smid = thsymbolset__get_id(args[0],args[1]); if (this->last_line->smid == -1) ththrow(("unknown symbol specification -- %s %s", args[0], args[1])) if (!thsymbolset__assign[this->last_line->smid]) ththrow(("symbol can not be assigned -- %s %s", args[0], args[1])) if (!th_is_keyword(args[2])) ththrow(("invalid keyword -- %s", args[2])) thencode(&(this->db->buff_enc), args[2], argenc); this->last_line->line = this->db->strstore(this->db->buff_enc.get_buffer()); this->last_line->code = TT_LAYOUT_CODE_SYMBOL_ASSIGN; break; // case TT_LAYOUT_MAP_ITEM: // this->last_line->smid = thmatch_token(args[0],thtt_layout_mapitem); // if (this->last_line->smid == SYMS_ZZZ) // ththrow(("unknown map-item specification -- %s", args[0])) // if (!th_is_keyword(args[1])) // ththrow(("invalid keyword -- %s", args[1])) // thencode(&(this->db->buff_enc), args[1], argenc); // this->last_line->line = this->db->strstore(this->db->buff_enc.get_buffer()); // this->last_line->code = TT_LAYOUT_CODE_MAP_ITEM; // break; case TT_LAYOUT_SYMBOL_HIDE: this->last_line->smid = thsymbolset__get_id(args[0],args[1]); if (this->last_line->smid == -1) ththrow(("unknown symbol specification -- %s %s", args[0], args[1])) this->last_line->code = TT_LAYOUT_CODE_SYMBOL_HIDE; break; case TT_LAYOUT_SYMBOL_SHOW: this->last_line->smid = thsymbolset__get_id(args[0],args[1]); if (this->last_line->smid == -1) ththrow(("unknown symbol specification -- %s %s", args[0], args[1])) this->last_line->code = TT_LAYOUT_CODE_SYMBOL_SHOW; break; case TT_LAYOUT_SYMBOL_COLOR: this->last_line->smid = thsymbolset__get_id(args[0],args[1]); if (this->last_line->smid == -1) ththrow(("unknown symbol specification -- %s %s", args[0], args[1])) this->last_line->sclr.parse(args[2]); this->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR; break; } break; case TT_LAYOUT_SURVEY_LEVEL: thparse_double(sv,dum,args[0]); switch (sv) { case TT_SV_NUMBER: dum_int = int(dum); if ((double(dum_int) != dum) || (dum_int < 0)) ththrow(("not an integer -- %s", args[1])) break; case TT_SV_ALL: dum_int = -1; break; case TT_SV_OFF: dum_int = 0; break; default: ththrow(("invalid number or switch -- %s", args[1])) } this->survey_level = dum_int; this->def_survey_level = 2; break; case TT_LAYOUT_MAP_ITEM: sv2 = thmatch_token(args[0],thlayout__mapitems); switch (sv2) { case TTL_MAPITEM_EXPLO_LENS: sv = thmatch_token(args[1],thtt_layout_lenstat); if (sv == TT_LAYOUT_LENSTAT_UNKNOWN) ththrow(("invalid map-item explo-length switch -- %s",args[1])) this->explo_lens = sv; this->def_explo_lens = 2; break; case TTL_MAPITEM_TOPO_LENS: sv = thmatch_token(args[1],thtt_layout_lenstat); if (sv == TT_LAYOUT_LENSTAT_UNKNOWN) ththrow(("invalid map-item topo-length switch -- %s",args[1])) this->topo_lens = sv; this->def_topo_lens = 2; break; case TTL_MAPITEM_EXPLO: case TTL_MAPITEM_TOPO: case TTL_MAPITEM_CARTO: case TTL_MAPITEM_COPYRIGHT: thparse_double(sv,dum,args[1]); switch (sv) { case TT_SV_NUMBER: dum_int = int(dum); if ((double(dum_int) != dum) || (dum_int < 0)) ththrow(("not a non-negative integer -- %s", args[1])) break; case TT_SV_ALL: dum_int = -1; break; case TT_SV_OFF: dum_int = 0; break; default: ththrow(("invalid number or switch -- %s", args[1])) } switch (sv2) { case TTL_MAPITEM_EXPLO: this->max_explos = dum_int; this->def_max_explos = 2; break; case TTL_MAPITEM_TOPO: this->max_topos = dum_int; this->def_max_topos = 2; break; case TTL_MAPITEM_CARTO: this->max_cartos = dum_int; this->def_max_cartos = 2; break; case TTL_MAPITEM_COPYRIGHT: this->max_copys = dum_int; this->def_max_copys = 2; break; } break; default: ththrow(("unknown statistics -- %s", args[0])) } break; case TT_LAYOUT_SCALE: thlayout_parse_scale(&(this->scale),args); this->def_scale = 2; break; case TT_LAYOUT_ROTATE: thlayout_parse_rotate(this->rotate,args[0]); this->def_rotate = 2; break; case TT_LAYOUT_BASE_SCALE: thlayout_parse_scale(&(this->base_scale),args); this->def_base_scale = 2; break; case TT_LAYOUT_OVERLAP: this->parse_len(this->overlap, dum, dum, 1, args, 0); this->def_overlap = 2; break; case TT_LAYOUT_LEGEND_WIDTH: this->parse_len(this->legend_width, dum, dum, 1, args, 0); this->def_legend_width = 2; break; case TT_LAYOUT_LEGEND_COLUMNS: thparse_double(sv,dum,args[0]); switch (sv) { case TT_SV_NUMBER: dum_int = int(dum); if ((double(dum_int) != dum) || (dum_int < 0)) ththrow(("not a non-negative integer -- %s", args[0])) break; default: ththrow(("invalid number -- %s", args[0])) } this->legend_columns = (unsigned) dum_int; this->def_legend_columns = 2; break; case TT_LAYOUT_SIZE: this->parse_len(this->hsize, this->vsize, dum, 2, args, 1); this->def_size = 2; break; case TT_LAYOUT_PAGE_SETUP: this->parse_len6(this->paphs, this->papvs, this->paghs, this->pagvs, this->marls, this->marts, 6, args, 1); this->def_page_setup = 2; break; case TT_LAYOUT_ORIGIN: //this->parse_len(this->ox, this->oy, this->oz, 3, args, -1); this->convert_cs(args[0], args[1], this->ox, this->oy); if (this->cs == TTCS_LOCAL) { this->parse_len(this->ox, this->oy, this->oz, 3, args, -1); } else { this->parse_len(this->oz, dum, dum, 1, &(args[2]), -1); } this->def_origin = 2; break; case TT_LAYOUT_GRID_SIZE: this->parse_len(this->gxs, this->gys, this->gzs, 3, args, 1); this->def_grid_size = 2; break; case TT_LAYOUT_COLOR: sv = thmatch_token(args[0],thtt_layout_color); switch (sv) { case TT_LAYOUT_COLOR_LABELS: sv2 = thmatch_token(args[1], thtt_bool); if (sv2 == TT_UNKNOWN_BOOL) ththrow(("invalid color labels switch (on|off expected) -- %s",args[1])) else { this->color_labels = (sv2 == TT_TRUE); this->def_color_labels = 2; } break; case TT_LAYOUT_COLOR_MAP_FG: this->color_crit = thmatch_token(args[1], thtt_layout_ccrit); if (this->color_crit == TT_LAYOUT_CCRIT_UNKNOWN) this->color_map_fg.parse(args[1]); else this->color_map_fg.defined = 2; break; case TT_LAYOUT_COLOR_MAP_BG: this->color_map_bg.parse(args[1], true); break; case TT_LAYOUT_COLOR_PREVIEW_BELOW: this->color_preview_below.parse(args[1]); break; case TT_LAYOUT_COLOR_PREVIEW_ABOVE: this->color_preview_above.parse(args[1]); break; default: ththrow(("unknown color -- %s",args[0])) } break; case TT_LAYOUT_GRID_ORIGIN: this->convert_cs(args[0], args[1], this->gox, this->goy); if (this->cs == TTCS_LOCAL) { this->parse_len(this->gox, this->goy, this->goz, 3, args, -1); } else { this->parse_len(this->goz, dum, dum, 1, &(args[2]), -1); } this->def_grid_origin = 2; break; case TT_LAYOUT_TRANSPARENCY: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid transparency switch -- %s",args[0])) this->transparency = (sv == TT_TRUE); this->def_transparency = 2; break; case TT_LAYOUT_SKETCHES: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid sketches switch -- %s",args[0])) this->sketches = (sv == TT_TRUE); this->def_sketches = 2; break; case TT_LAYOUT_LEGEND: sv = thmatch_token(args[0],thtt_layout_legend); if (sv == TT_LAYOUT_LEGEND_UNKNOWN) ththrow(("invalid legend switch -- %s",args[0])) this->legend = sv; this->def_legend = 2; break; case TT_LAYOUT_COLOR_LEGEND: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid color-legend switch -- %s",args[0])) this->color_legend = sv; this->def_color_legend = 2; break; case TT_LAYOUT_SCALE_BAR: this->parse_len(this->scale_bar, dum, dum, 1, args, 1); this->def_scale_bar = 2; break; case TT_LAYOUT_MAP_HEADER: thparse_double(sv,this->map_header_x,args[0]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",args[0])) if ((this->map_header_x < -100.0) || (this->map_header_x > 200.0)) ththrow(("number between 0.0 - 100.0 expected -- %s",args[0])) thparse_double(sv,this->map_header_y,args[1]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",args[1])) if ((this->map_header_y < -100.0) || (this->map_header_y > 200.0)) ththrow(("number between 0.0 - 100.0 expected -- %s",args[1])) sv = thmatch_token(args[2],thtt_layout_map_header); if (sv == TT_LAYOUT_MAP_HEADER_UNKNOWN) ththrow(("invalid map-header switch -- %s",args[2])) this->map_header = sv; this->def_map_header = 2; break; case TT_LAYOUT_MAP_IMAGE: { thlayout_map_image tmpi; tmpi.parse(args, (this->m_pconfig == NULL) ? "" : this->m_pconfig->cfg_file.get_cif_path()); this->map_image_list.push_back(tmpi); } break; case TT_LAYOUT_DEBUG: sv = thmatch_token(args[0],thtt_layout_debug); if (sv == TT_LAYOUT_DEBUG_UNKNOWN) ththrow(("invalid debug switch -- %s",args[0])) switch (sv) { case TT_LAYOUT_DEBUG_ALL: this->debug = TTLDBG_JOINS | TTLDBG_STATIONS | TTLDBG_SCRAPNAMES | TTLDBG_STATIONNAMES; break; case TT_LAYOUT_DEBUG_OFF: this->debug = 0; break; case TT_LAYOUT_DEBUG_STATIONS: this->debug |= TTLDBG_STATIONS; break; case TT_LAYOUT_DEBUG_JOINS: this->debug |= TTLDBG_JOINS; break; case TT_LAYOUT_DEBUG_SCRAPNAMES: this->debug |= TTLDBG_SCRAPNAMES; break; case TT_LAYOUT_DEBUG_STATIONNAMES: this->debug |= TTLDBG_STATIONNAMES; break; } this->def_debug = 2; break; case TT_LAYOUT_LANG: sv = thlang_parse(args[0]); if (sv == THLANG_UNKNOWN) ththrow(("language not supported -- %s",args[0])) this->lang = sv; this->def_lang = 2; break; case TT_LAYOUT_UNITS: this->units.parse_units(args[0]); this->def_units = 2; break; case TT_LAYOUT_LAYERS: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid layers switch -- %s",args[0])) this->layers = (sv == TT_TRUE); this->def_layers = 2; break; case TT_LAYOUT_MAP_HEADER_BG: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid map-header-bg switch -- %s",args[0])) this->map_header_bg = (sv == TT_TRUE); this->def_map_header_bg = 2; break; case TT_LAYOUT_OPACITY: thparse_double(sv,dum,args[0]); if ((sv != TT_SV_NUMBER) || (dum < 0.0) || (dum > 100.0)) ththrow(("invalid opacity value -- %s", args[0])) this->opacity = dum / 100.0; this->def_opacity = 2; break; case TT_LAYOUT_SURFACE_OPACITY: thparse_double(sv,dum,args[0]); if ((sv != TT_SV_NUMBER) || (dum < 0.0) || (dum > 100.0)) ththrow(("invalid opacity value -- %s", args[0])) this->surface_opacity = dum / 100.0; this->def_surface_opacity = 2; break; case TT_LAYOUT_SURFACE: sv = thmatch_token(args[0],thtt_layout_surface); if (sv == TT_LAYOUT_SURFACE_UNKNOWN) ththrow(("invalid surface switch -- %s",args[0])) this->surface = sv; this->def_surface = 2; break; case TT_LAYOUT_GRID_COORDS: sv = thmatch_token(args[0],thtt_layout_gridcoords); if (sv == TT_LAYOUT_GRIDCOORDS_UNKNOWN) ththrow(("invalid grid-coords switch -- %s",args[0])) this->grid_coords = sv; this->def_grid_coords = 2; break; case TT_LAYOUT_NORTH: sv = thmatch_token(args[0],thtt_layout_north); if (sv == TT_LAYOUT_NORTH_UNKNOWN) ththrow(("invalid north switch -- %s",args[0])) this->north = sv; this->def_north = 2; break; case TT_LAYOUT_GRID: sv = thmatch_token(args[0],thtt_layout_grid); if (sv == TT_LAYOUT_GRID_UNKNOWN) ththrow(("invalid grid switch -- %s",args[0])) this->grid = (char) sv; this->def_grid = 2; break; case TT_LAYOUT_ENDCODE: this->ccode = TT_LAYOUT_CODE_UNKNOWN; break; case TT_LAYOUT_CODE: sv = thmatch_token(args[0],thtt_layout_code); if (sv == TT_LAYOUT_CODE_UNKNOWN) ththrow(("invalid code switch -- %s",args[0])) this->ccode = (char) sv; break; case TT_LAYOUT_PAGE_GRID: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid page-grid switch -- %s",args[0])) this->page_grid = (sv == TT_TRUE); this->def_page_grid = 2; break; case TT_LAYOUT_EXCLUDE_PAGES: sv = thmatch_token(args[0],thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid pages exclusion switch -- %s",args[0])) this->excl_pages = (sv == TT_TRUE); if (strlen(args[1]) > 0) this->excl_list = this->db->strstore(args[1]); else if (this->excl_pages) ththrow(("invalid pages exclusion list -- %s",args[1])); this->def_excl_pages = 2; break; case TT_LAYOUT_PAGE_NUMBERS: sv = thmatch_token(*args,thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid page numbers switch -- %s",*args)) this->pgsnum = (sv == TT_TRUE); this->def_page_numbers = 2; break; case TT_LAYOUT_TITLE_PAGES: sv = thmatch_token(*args,thtt_bool); if (sv == TT_UNKNOWN_BOOL) ththrow(("invalid title-pages switch -- %s",*args)) this->titlep = (sv == TT_TRUE); this->def_title_pages = 2; break; case TT_LAYOUT_DOC_TITLE: if (strlen(args[0]) > 0) { thencode(&(this->db->buff_enc), args[0], argenc); this->doc_title = this->db->strstore(this->db->buff_enc.get_buffer()); } else this->doc_title = ""; this->def_doc_title = 2; break; case TT_LAYOUT_DOC_COMMENT: if (strlen(args[0]) > 0) { thencode(&(this->db->buff_enc), args[0], argenc); this->doc_comment = this->db->strstore(this->db->buff_enc.get_buffer()); } else this->doc_comment = ""; this->def_doc_comment = 2; break; case TT_LAYOUT_DOC_AUTHOR: if (strlen(args[0]) > 0) { thencode(&(this->db->buff_enc), args[0], argenc); this->doc_author = this->db->strstore(this->db->buff_enc.get_buffer()); } else this->doc_author = ""; this->def_doc_author = 2; break; case TT_LAYOUT_DOC_SUBJECT: if (strlen(args[0]) > 0) { thencode(&(this->db->buff_enc), args[0], argenc); this->doc_subject = this->db->strstore(this->db->buff_enc.get_buffer()); } else this->doc_subject = ""; this->def_doc_subject = 2; break; case TT_LAYOUT_DOC_KEYWORDS: if (strlen(args[0]) > 0) { thencode(&(this->db->buff_enc), args[0], argenc); this->doc_keywords = this->db->strstore(this->db->buff_enc.get_buffer()); } else this->doc_keywords = ""; this->def_doc_keywords = 2; break; case TT_LAYOUT_ORIGIN_LABEL: if (strlen(args[0]) > 0) { //thencode(&(this->db->buff_enc), args[0], argenc); this->olx = this->db->strstore(args[0]); } else ththrow(("invalid label -- %s",args[0])); if (strlen(args[1]) > 0) { //thencode(&(this->db->buff_enc), args[1], argenc); this->oly = this->db->strstore(args[1]); } else ththrow(("invalid label -- %s",args[1])); this->def_origin_label = 2; break; case TT_LAYOUT_NAV_SIZE: thparse_double(sv,dum,args[0]); if ((sv != TT_SV_NUMBER) || (dum <= 0)) ththrow(("invalid navigator size -- %s", *args)) if (double(int(dum)) != dum) ththrow(("invalid navigator size -- %s", *args)) this->navsx = unsigned(dum); thparse_double(sv,dum,args[1]); if ((sv != TT_SV_NUMBER) || (dum <= 0)) ththrow(("invalid navigator size -- %s", *args)) if (double(int(dum)) != dum) ththrow(("invalid navigator size -- %s", *args)) this->navsy = unsigned(dum); this->def_nav_size = 2; break; case TT_LAYOUT_COPY: if (th_is_extkeyword(*args)) { lcp = & ( * thlayout_copy_src_list.insert(thlayout_copy_src_list.end(),dumm)); if (this->first_copy_src == NULL) { this->first_copy_src = lcp; this->last_copy_src = lcp; } else { this->last_copy_src->next_src = lcp; this->last_copy_src = lcp; } lcp->srcn = this->db->strstore(*args); } else ththrow(("invalid keyword -- %s", *args)); break; case TT_LAYOUT_NAV_FACTOR: thparse_double(sv,this->navf,*args); if (sv != TT_SV_NUMBER) ththrow(("invalid factor -- %s", *args)) if (this->navf <= 0.0) ththrow(("negative factor not allowed -- %s", *args)) this->def_nav_factor = 2; break; case TT_LAYOUT_OWN_PAGES: thparse_double(sv,dum,*args); if ((sv != TT_SV_NUMBER) || (dum <= 0)) ththrow(("invalid number of own pages -- %s", *args)) if (double(int(dum)) != dum) ththrow(("invalid number of own pages -- %s", *args)) this->ownp = unsigned(dum); this->def_own_pages = 2; break; case 1: cod.id = TT_DATAOBJECT_NAME; default: thdataobject::set(cod, args, argenc, indataline); break; } } void thlayout::self_delete() { delete this; } void thlayout::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thlayout:\n"); fprintf(outf,"\tscale: %f\n",this->scale); fprintf(outf,"\trotate: %f\n",this->rotate); } int thlayout::get_context() { return (THCTX_SURVEY | THCTX_NONE | THCTX_SCRAP); } void thlayout::self_print_library() { thprintf("\toname = \"%s\";\n", this->get_name()); thprintf("\tplayout->set(thcmd_option_desc(TT_DATAOBJECT_NAME,1),oname,TT_UTF_8,0);\n"); // decode title thdecode_c(&(this->db->buff_enc), this->get_title()); thprintf("\toname = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->set(thcmd_option_desc(TT_DATAOBJECT_TITLE,1),oname,TT_UTF_8,0);\n"); thprintf("\tplayout->def_scale = %d;\n", this->def_scale); thprintf("\tplayout->scale = %lg;\n",this->scale); thprintf("\tplayout->def_base_scale = %d;\n", this->def_base_scale); thprintf("\tplayout->base_scale = %lg;\n",this->base_scale); thprintf("\tplayout->def_rotate = %d;\n", this->def_rotate); thprintf("\tplayout->rotate = %lg;\n",this->rotate); thprintf("\tplayout->def_page_setup = %d;\n", this->def_page_setup); thprintf("\tplayout->hsize = %lg;\n",this->hsize); thprintf("\tplayout->vsize = %lg;\n",this->vsize); thprintf("\tplayout->paphs = %lg;\n",this->paphs); thprintf("\tplayout->papvs = %lg;\n",this->papvs); thprintf("\tplayout->paghs = %lg;\n",this->paghs); thprintf("\tplayout->pagvs = %lg;\n",this->pagvs); thprintf("\tplayout->marts = %lg;\n",this->marts); thprintf("\tplayout->marls = %lg;\n",this->marls); thprintf("\tplayout->color_map_bg.defined = %d;\n", this->color_map_bg.defined); thprintf("\tplayout->color_map_bg.R = %lg;\n",this->color_map_bg.R); thprintf("\tplayout->color_map_bg.G = %lg;\n",this->color_map_bg.G); thprintf("\tplayout->color_map_bg.B = %lg;\n",this->color_map_bg.B); thprintf("\tplayout->color_map_bg.A = %lg;\n",this->color_map_bg.A); thprintf("\tplayout->color_map_fg.defined = %d;\n", this->color_map_fg.defined); thprintf("\tplayout->color_crit = %d;\n", this->color_crit); thprintf("\tplayout->color_map_fg.R = %lg;\n",this->color_map_fg.R); thprintf("\tplayout->color_map_fg.G = %lg;\n",this->color_map_fg.G); thprintf("\tplayout->color_map_fg.B = %lg;\n",this->color_map_fg.B); thprintf("\tplayout->color_map_fg.A = %lg;\n",this->color_map_fg.A); thprintf("\tplayout->color_preview_below.defined = %d;\n", this->color_preview_below.defined); thprintf("\tplayout->color_preview_below.R = %lg;\n",this->color_preview_below.R); thprintf("\tplayout->color_preview_below.G = %lg;\n",this->color_preview_below.G); thprintf("\tplayout->color_preview_below.B = %lg;\n",this->color_preview_below.B); thprintf("\tplayout->color_preview_below.A = %lg;\n",this->color_preview_below.A); thprintf("\tplayout->color_preview_above.defined = %d;\n", this->color_preview_above.defined); thprintf("\tplayout->color_preview_above.R = %lg;\n",this->color_preview_above.R); thprintf("\tplayout->color_preview_above.G = %lg;\n",this->color_preview_above.G); thprintf("\tplayout->color_preview_above.B = %lg;\n",this->color_preview_above.B); thprintf("\tplayout->color_preview_above.A = %lg;\n",this->color_preview_above.A); thprintf("\tplayout->def_overlap = %d;\n", this->def_overlap); thprintf("\tplayout->overlap = %lg;\n",this->overlap); thprintf("\tplayout->def_scale_bar = %d;\n", this->def_scale_bar); thprintf("\tplayout->scale_bar = %lg;\n",this->scale_bar); thprintf("\tplayout->def_transparency = %d;\n", this->def_transparency); thprintf("\tplayout->transparency = %s;\n",(this->transparency ? "true" : "false")); thprintf("\tplayout->def_sketches = %d;\n", this->def_sketches); thprintf("\tplayout->sketches = %s;\n",(this->sketches ? "true" : "false")); thprintf("\tplayout->def_legend = %d;\n", this->def_legend); thprintf("\tplayout->legend = %s;\n",( this->legend == TT_LAYOUT_LEGEND_OFF ? "TT_LAYOUT_LEGEND_OFF" : ( this->legend == TT_LAYOUT_LEGEND_ON ? "TT_LAYOUT_LEGEND_ON" : "TT_LAYOUT_LEGEND_ALL" ))); thprintf("\tplayout->def_survey_level = %d;\n", this->def_survey_level); thprintf("\tplayout->survey_level = %d;\n", this->survey_level); thprintf("\tplayout->def_color_legend = %d;\n", this->def_color_legend); thprintf("\tplayout->legend = %d;\n", this->color_legend); thprintf("\tplayout->def_legend_width = %d;\n", this->def_legend_width); thprintf("\tplayout->legend_width = %lg;\n",this->legend_width); thprintf("\tplayout->def_legend_columns = %d;\n", this->def_legend_columns); thprintf("\tplayout->legend_columns = %d;\n",this->legend_columns); thprintf("\tplayout->def_map_header = %d;\n", this->def_map_header); thprintf("\tplayout->map_header = %d;\n",this->map_header); thprintf("\tplayout->map_header_x = %lg;\n",this->map_header_x); thprintf("\tplayout->map_header_y = %lg;\n",this->map_header_y); thprintf("\tplayout->def_debug = %d;\n", this->def_debug); thprintf("\tplayout->debug = %d;\n",this->debug); thprintf("\tplayout->def_max_explos = %d;\n", this->def_max_explos); thprintf("\tplayout->max_explos = %d;\n",this->max_explos); thprintf("\tplayout->def_max_topos = %d;\n", this->def_max_topos); thprintf("\tplayout->max_topos = %d;\n",this->max_topos); thprintf("\tplayout->def_max_cartos = %d;\n", this->def_max_cartos); thprintf("\tplayout->max_cartos = %d;\n",this->max_cartos); thprintf("\tplayout->def_max_copys = %d;\n", this->def_max_copys); thprintf("\tplayout->max_copys = %d;\n",this->max_copys); thprintf("\tplayout->def_explo_lens = %d;\n",this->def_explo_lens); thprintf("\tplayout->explo_lens = %d;\n",this->explo_lens); thprintf("\tplayout->def_topo_lens = %d;\n",this->def_topo_lens); thprintf("\tplayout->topo_lens = %d;\n",this->topo_lens); thprintf("\tplayout->def_lang = %d;\n", this->def_lang); thprintf("\tplayout->lang = %s;\n",thlang_getcxxid(this->lang)); thprintf("\tplayout->def_units = %d;\n", this->def_units); thprintf("\tplayout->units.units = %d;\n",this->units.units); thprintf("\tplayout->def_layers = %d;\n", this->def_layers); thprintf("\tplayout->layers = %s;\n",(this->layers ? "true" : "false")); thprintf("\tplayout->def_map_header_bg = %d;\n", this->def_map_header_bg); thprintf("\tplayout->map_header_bg = %s;\n",(this->map_header_bg ? "true" : "false")); thprintf("\tplayout->def_opacity = %d;\n", this->def_opacity); thprintf("\tplayout->opacity = %lg;\n",this->opacity); thprintf("\tplayout->def_surface_opacity = %d;\n", this->def_surface_opacity); thprintf("\tplayout->surface_opacity = %lg;\n", this->surface_opacity); thprintf("\tplayout->def_surface= %d;\n", this->def_surface); thprintf("\tplayout->surface = %d;\n", this->surface); thprintf("\tplayout->def_color_labels= %d;\n", this->def_color_labels); thprintf("\tplayout->color_labels = %s;\n", (this->color_labels ? "true" : "false")); thprintf("\tplayout->def_grid_coords = %d;\n", this->def_grid_coords); thprintf("\tplayout->grid_coords = %d;\n", this->grid_coords); thprintf("\tplayout->def_north= %d;\n", this->def_north); thprintf("\tplayout->north = %d;\n", this->north); thprintf("\tplayout->def_grid = %d;\n", this->def_grid); thprintf("\tplayout->grid = %d;\n",this->grid); thprintf("\tplayout->def_page_grid = %d;\n", this->def_page_grid); thprintf("\tplayout->page_grid = %s;\n",(this->page_grid ? "true" : "false")); thprintf("\tplayout->def_origin = %d;\n", this->def_origin); if (!thisnan(this->ox)) thprintf("\tplayout->ox = %lg;\n",this->ox); if (!thisnan(this->oy)) thprintf("\tplayout->oy = %lg;\n",this->oy); if (!thisnan(this->oz)) thprintf("\tplayout->oz = %lg;\n",this->oz); thprintf("\tplayout->def_origin_label = %d;\n", this->def_origin_label); thdecode_c(&(this->db->buff_enc), this->olx); thprintf("\tplayout->olx = \"%s\";\n", this->db->buff_enc.get_buffer()); thdecode_c(&(this->db->buff_enc), this->oly); thprintf("\tplayout->oly = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->def_doc_title = %d;\n", this->def_doc_title); thdecode_c(&(this->db->buff_enc), this->doc_title); thprintf("\tplayout->doc_title = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->def_doc_comment = %d;\n", this->def_doc_comment); thdecode_c(&(this->db->buff_enc), this->doc_comment); thprintf("\tplayout->doc_comment = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->def_doc_author = %d;\n", this->def_doc_author); thdecode_c(&(this->db->buff_enc), this->doc_author); thprintf("\tplayout->doc_author = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->def_doc_subject = %d;\n", this->def_doc_author); thdecode_c(&(this->db->buff_enc), this->doc_subject); thprintf("\tplayout->doc_subject = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->def_doc_keywords = %d;\n", this->def_doc_keywords); thdecode_c(&(this->db->buff_enc), this->doc_keywords); thprintf("\tplayout->doc_keywords = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->def_excl_pages = %d;\n", this->def_excl_pages); thprintf("\tplayout->excl_pages = %s;\n",(this->excl_pages ? "true" : "false")); if (this->excl_list == NULL) { thprintf("\tplayout->excl_list = NULL;\n"); } else { thdecode_c(&(this->db->buff_enc), this->excl_list); thprintf("\tplayout->excl_list = \"%s\";\n", this->db->buff_enc.get_buffer()); } thprintf("\tplayout->def_grid_size = %d;\n", this->def_grid_size); if (!thisnan(this->gxs)) { thprintf("\tplayout->gxs = %lg;\n",this->gxs); thprintf("\tplayout->gys = %lg;\n",this->gys); thprintf("\tplayout->gzs = %lg;\n",this->gzs); } thprintf("\tplayout->def_grid_origin = %d;\n", this->def_grid_origin); if (!thisnan(this->gox)) thprintf("\tplayout->gox = %lg;\n",this->gox); if (!thisnan(this->goy)) thprintf("\tplayout->goy = %lg;\n",this->goy); if (!thisnan(this->goz)) thprintf("\tplayout->goz = %lg;\n",this->goz); thprintf("\tplayout->def_nav_factor = %d;\n", this->def_nav_factor); thprintf("\tplayout->navf = %lg;\n",this->navf); thprintf("\tplayout->def_nav_size = %d;\n", this->def_nav_size); thprintf("\tplayout->navsx = %d;\n",this->navsx); thprintf("\tplayout->navsy = %d;\n",this->navsy); thprintf("\tplayout->def_own_pages = %d;\n", this->def_own_pages); thprintf("\tplayout->ownp = %d;\n",this->ownp); thprintf("\tplayout->def_title_pages = %d;\n", this->def_title_pages); thprintf("\tplayout->titlep = %s;\n",(this->titlep ? "true" : "false")); thprintf("\tplayout->def_page_numbers = %d;\n", this->def_page_numbers); thprintf("\tplayout->pgsnum = %s;\n",(this->pgsnum ? "true" : "false")); thlayoutln * ln = this->first_line; char last_code = TT_LAYOUT_CODE_UNKNOWN; while(ln != NULL) { switch (ln->code) { case TT_LAYOUT_CODE_METAPOST: case TT_LAYOUT_CODE_TEX_MAP: case TT_LAYOUT_CODE_TEX_ATLAS: thdecode_c(&(this->db->buff_enc), ln->line); if (ln->code != last_code) { thprintf("\tplayout->ccode = "); switch (ln->code) { case TT_LAYOUT_CODE_METAPOST: thprintf("TT_LAYOUT_CODE_METAPOST"); break; case TT_LAYOUT_CODE_TEX_MAP: thprintf("TT_LAYOUT_CODE_TEX_MAP"); break; default: thprintf("TT_LAYOUT_CODE_TEX_ATLAS"); break; } thprintf(";\n"); } thprintf("\toname = \"%s\";\n", this->db->buff_enc.get_buffer()); thprintf("\tplayout->set(thcmd_option_desc(0,1),oname,TT_UTF_8,0);\n"); break; case TT_LAYOUT_CODE_SYMBOL_ASSIGN: case TT_LAYOUT_CODE_MAP_ITEM: case TT_LAYOUT_CODE_SYMBOL_DEFAULTS: case TT_LAYOUT_CODE_SYMBOL_HIDE: case TT_LAYOUT_CODE_SYMBOL_SHOW: case TT_LAYOUT_CODE_SYMBOL_COLOR: if (ln->line != NULL) { thdecode_c(&(this->db->buff_enc), ln->line); thprintf("\toname = \"%s\";\n", this->db->buff_enc.get_buffer()); } if (ln->code != TT_LAYOUT_CODE_SYMBOL_DEFAULTS) thprintf("\tplayout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,0),NULL,TT_UTF_8,0);\n"); else thprintf("\tplayout->set(thcmd_option_desc(TT_LAYOUT_SYMBOL_DEFAULTS,1),oname,TT_UTF_8,0);\n"); if (ln->code != TT_LAYOUT_CODE_SYMBOL_DEFAULTS) { switch (ln->code) { case TT_LAYOUT_CODE_SYMBOL_HIDE: thprintf("\tplayout->last_line->code = TT_LAYOUT_CODE_SYMBOL_HIDE;\n"); thprintf("\tplayout->last_line->smid = %s;\n", thsymbolset__src[ln->smid]); break; case TT_LAYOUT_CODE_SYMBOL_SHOW: thprintf("\tplayout->last_line->code = TT_LAYOUT_CODE_SYMBOL_SHOW;\n"); thprintf("\tplayout->last_line->smid = %s;\n", thsymbolset__src[ln->smid]); break; case TT_LAYOUT_CODE_MAP_ITEM: thprintf("\tplayout->last_line->code = TT_LAYOUT_CODE_MAP_ITEM;\n"); thprintf("\tplayout->last_line->smid = %s;\n", thsymbolset__src[ln->smid]); break; case TT_LAYOUT_CODE_SYMBOL_ASSIGN: thprintf("\tplayout->last_line->code = TT_LAYOUT_CODE_SYMBOL_ASSIGN;\n"); thprintf("\tplayout->last_line->smid = %s;\n", thsymbolset__src[ln->smid]); break; case TT_LAYOUT_CODE_SYMBOL_COLOR: thprintf("\tplayout->last_line->code = TT_LAYOUT_CODE_SYMBOL_COLOR;\n"); thprintf("\tplayout->last_line->smid = %s;\n", thsymbolset__src[ln->smid]); thprintf("\tplayout->last_line->sclr = thlayout_color(%.6f,%.6f,%.6f);\n", ln->sclr.R, ln->sclr.G, ln->sclr.B); break; } } break; } ln = ln->next_line; } thprintf("\tplayout->def_tex_lines = %d;\n", this->def_tex_lines); } void check_num(double num, int nonneg) { if (nonneg == 0) { if (num < 0) { ththrow(("not a non-negative number -- %g", num)); } } else if (nonneg > 0) { if (num <= 0) { ththrow(("not a positive number -- %g", num)); } } } void thlayout::parse_len(double & d1, double & d2, double & d3, int nargs, char ** args, int nonneg) { int sv; thtflength lentf; lentf.parse_units(args[nargs]); switch (nargs) { case 3: thparse_double(sv,d3,args[2]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[2])); d3 = lentf.transform(d3); check_num(d3,nonneg); case 2: thparse_double(sv,d2,args[1]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[1])); d2 = lentf.transform(d2); check_num(d2,nonneg); case 1: thparse_double(sv,d1,args[0]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[0])); d1 = lentf.transform(d1); check_num(d1,nonneg); } } void thlayout::parse_len6(double & d1, double & d2, double & d3, double & d4, double & d5, double & d6, int nargs, char ** args, int nonneg) { int sv; thtflength lentf; lentf.parse_units(args[nargs]); switch (nargs) { case 6: thparse_double(sv,d6,args[5]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[5])); d6 = lentf.transform(d6); check_num(d6,nonneg); case 5: thparse_double(sv,d5,args[4]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[4])); d5 = lentf.transform(d5); check_num(d5,nonneg); case 4: thparse_double(sv,d4,args[3]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[3])); d4 = lentf.transform(d4); check_num(d4,nonneg); case 3: thparse_double(sv,d3,args[2]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[2])); d3 = lentf.transform(d3); check_num(d3,nonneg); case 2: thparse_double(sv,d2,args[1]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[1])); d2 = lentf.transform(d2); check_num(d2,nonneg); case 1: thparse_double(sv,d1,args[0]); if ((sv != TT_SV_NUMBER)) ththrow(("invalid number -- %s", args[0])); d1 = lentf.transform(d1); check_num(d1,nonneg); } } #define THM2PT 2834.64566929 void thlayout::export_config(FILE * o, thdb2dprj * prj, double x_scale, double x_origin_shx, double x_origin_shy) { double pgox, pgoy; double ghs, gvs; fprintf(o,"Configuration file\n"); fprintf(o,"hsize: %.2fmm\nvsize: %.2fmm\n",this->hsize * 1000.0,this->vsize * 1000.0); fprintf(o,"Overlap: %.2fmm\n",this->overlap * 1000.0); //fprintf(o,"Hoffset: %.2fmm\nVoffset: %.2fmm\n",this->hsize * 500.0,this->vsize * 500.0); switch (prj->type) { case TT_2DPROJ_EXTEND: case TT_2DPROJ_ELEV: pgox = (this->gox - prj->shift_x) * x_scale + x_origin_shx; pgoy = (this->goz - prj->shift_z) * x_scale + x_origin_shy; ghs = this->gxs; gvs = this->gzs; break; default: pgox = (this->gox - prj->shift_x) * x_scale + x_origin_shx; pgoy = (this->goy - prj->shift_y) * x_scale + x_origin_shy; ghs = this->gxs; gvs = this->gys; break; } fprintf(o,"HGrid: %.2fmm\nVGrid: %.2fmm\n",ghs * this->scale * 1000.0, gvs * this->scale * 1000.0); pgox = pgox - (THM2PT * ghs * (double)(long)(pgox / ghs / THM2PT)); pgoy = pgoy - (THM2PT * gvs * (double)(long)(pgoy / gvs / THM2PT)); fprintf(o,"HGridOffset: %.2fmm\nVGridOffset: %.2fmm\n",pgox / THM2PT * 1000.0,pgoy / THM2PT * 1000.0); fprintf(o,"Background: 0\n"); fprintf(o,"StartX: %s\nStartY: %s\nStartZ: 0\n", this->olx, this->oly); fprintf(o,"NavRight: %d\nNavUp: %d\n", this->navsx, this->navsy); fprintf(o,"NavFactor: %.2f\n", this->navf); fprintf(o,"OwnPages: %d\n", this->ownp); fprintf(o,"TitlePages: %d\n", (this->titlep ? 1 : 0)); fprintf(o,"PageNumbering: %d\n", (this->pgsnum ? 1 : 0)); fprintf(o,"Transparency: %d\n", (this->transparency ? 1 : 0)); fprintf(o,"ExclPages: %d\n", (this->excl_pages ? 1 : 0)); if (this->excl_pages) { fprintf(o,"ExclList: %s\n", this->excl_list); } fprintf(o,"MapGrid: %d\n", (this->page_grid ? 1 : 0)); } void thlayout_print_header_align(FILE * o, int a) { switch (a) { case TT_LAYOUT_MAP_HEADER_CENTER: fprintf(o,"C"); break; case TT_LAYOUT_MAP_HEADER_N: fprintf(o,"N"); break; case TT_LAYOUT_MAP_HEADER_NE: fprintf(o,"NE"); break; case TT_LAYOUT_MAP_HEADER_E: fprintf(o,"E"); break; case TT_LAYOUT_MAP_HEADER_W: fprintf(o,"W"); break; case TT_LAYOUT_MAP_HEADER_S: fprintf(o,"S"); break; case TT_LAYOUT_MAP_HEADER_SW: fprintf(o,"SW"); break; case TT_LAYOUT_MAP_HEADER_SE: fprintf(o,"SE"); break; default: fprintf(o,"NW"); } } void thlayout::export_pdftex(FILE * o, thdb2dprj * prj, char mode) { fprintf(o,"\\opacity{%.2f}\n",this->opacity); fprintf(o,"\\def\\scale{%lu}\n",(unsigned long)(1.0 / this->scale + 0.5)); fprintf(o,"\\pagesetup{%.4fcm}{%.4fcm}{%.4fcm}{%.4fcm}{%.4fcm}{%.4fcm}\n", this->paphs*100.0, this->papvs*100.0, this->paghs*100.0, this->pagvs*100.0, this->marls*100.0, this->marts*100.0); fprintf(o,"\\def\\maplayout{"); thlayout_map_image_list::iterator mit; size_t nami = 0; for(mit = this->map_image_list.begin(); mit != this->map_image_list.end(); mit++) { if (mit->defined() && (mit->m_align != TT_LAYOUT_MAP_HEADER_OFF)) nami++; } thbuffer pict_path, pn; size_t pl; char * pp; long i; pict_path.guarantee(1024); getcwd(pict_path.get_buffer(),1024); pp = pict_path.get_buffer(); pl = strlen(pp); if ((pl > 0) && ((pp[pl-1] == '/') || (pp[pl-1] == '\\'))) { pp[pl-1] = 0; } if (this->map_header != TT_LAYOUT_MAP_HEADER_OFF) { fprintf(o,"\\legendbox{%.0f}{%.0f}{", this->map_header_x, this->map_header_y); thlayout_print_header_align(o, this->map_header); fprintf(o,"}"); fprintf(o,"{\\the\\legendcontent}"); } if (nami > 0) { for(mit = this->map_image_list.begin(); mit != this->map_image_list.end(); mit++) { if (mit->defined() && (mit->m_align != TT_LAYOUT_MAP_HEADER_OFF)) { pn = pict_path; pn += "/"; pn += mit->m_fn; pp = pn.get_buffer(); for(i = (long)strlen(pp); i >= 0; i--) { if (pp[i] == '\\') pp[i] = '/'; } fprintf(o,"\\legendbox{%.0f}{%.0f}{", mit->m_x, mit->m_y); thlayout_print_header_align(o, mit->m_align); fprintf(o,"}{\\loadpicture{%s}}",pp); } } } fprintf(o,"}\n"); bool anyline = false; bool anylegend = false; if (this->first_line != NULL) { thlayoutln * ln = this->first_line; while(ln != NULL) { if (ln->code == mode) { // ak najde \\formattedlegend v \\insertmaps tak anyline bude // true if ((!anyline) && (strstr(ln->line, "\\insertmaps") != NULL)) anyline = true; if ((!anylegend) && (strstr(ln->line, "\\formattedlegend") != NULL)) anylegend = true; thdecode_utf2tex(&(this->db->buff_enc), ln->line); fprintf(o, "%s\n", this->db->buff_enc.get_buffer()); } ln = ln->next_line; } } if (!anyline) { fprintf(o,"\\insertmaps\n"); if (mode == TT_LAYOUT_CODE_TEX_ATLAS) { if ((!anylegend) && (this->legend != TT_LAYOUT_LEGEND_OFF)) { fprintf(o,"\\formattedlegend\n"); } } } } void thlayout::export_mpost(FILE * o) { bool anyline = false; if (this->first_line != NULL) { thlayoutln * ln = this->first_line; while(ln != NULL) { if (ln->code == TT_LAYOUT_CODE_METAPOST) { anyline = true; thdecode(&(this->db->buff_enc), TT_ISO8859_2, ln->line); fprintf(o, "%s\n", this->db->buff_enc.get_buffer()); } ln = ln->next_line; } } if (!anyline) { } } void thlayout::export_mpost_symbols(FILE * o, thsymbolset * symset) { thlayoutln * ln = this->first_line; while(ln != NULL) { switch (ln->code) { case TT_LAYOUT_CODE_SYMBOL_DEFAULTS: symset->export_symbol_defaults(o,ln->line); break; case TT_LAYOUT_CODE_SYMBOL_ASSIGN: symset->export_symbol_assign(o,ln->smid,ln->line); break; case TT_LAYOUT_CODE_SYMBOL_HIDE: symset->export_symbol_hide(o,ln->smid); break; case TT_LAYOUT_CODE_SYMBOL_SHOW: symset->export_symbol_show(o,ln->smid); break; case TT_LAYOUT_CODE_SYMBOL_COLOR: symset->export_symbol_color(o,ln->smid,&(ln->sclr)); break; case TT_LAYOUT_CODE_MAP_ITEM: symset->export_symbol_assign(o,ln->smid,ln->line); break; } ln = ln->next_line; } } void thlayout::process_copy() { thlayout_copy_src * csp; thlayout * srcl; // ak je locknuty -> tak warning a koniec if (this->lock) { this->throw_source(); threwarning2(("recursive layout copying")) return; } this->lock = true; this->last_copy_src = this->first_copy_src; while (this->first_copy_src != NULL) { csp = this->first_copy_src; // najdeme si layout podla mena csp->srcptr = this->db->get_layout(csp->srcn); if (csp->srcptr == NULL) { this->throw_source(); threwarning2(("source layout not found -- %s", csp->srcn)) } else { srcl = csp->srcptr; // ak ma este nevyriesene zavislosti if (srcl->first_copy_src != NULL) srcl->process_copy(); // teraz skopirujme co nemame a on ma #define begcopy(whatx) if ((this->whatx < 2) && (srcl->whatx > 0)) { \ this->whatx = 1; #define endcopy } begcopy(def_scale) this->scale = srcl->scale; endcopy begcopy(def_rotate) this->rotate = srcl->rotate; endcopy begcopy(def_base_scale) this->base_scale = srcl->base_scale; endcopy begcopy(def_origin) this->ox = srcl->ox; this->oy = srcl->oy; this->oz = srcl->oz; endcopy begcopy(def_size) this->hsize = srcl->hsize; this->vsize = srcl->vsize; endcopy begcopy(def_page_setup) this->paphs = srcl->paphs; this->papvs = srcl->papvs; this->paghs = srcl->paghs; this->pagvs = srcl->pagvs; this->marls = srcl->marls; this->marts = srcl->marts; endcopy begcopy(def_overlap) this->overlap = srcl->overlap; endcopy begcopy(def_scale_bar) this->scale_bar = srcl->scale_bar; endcopy begcopy(def_grid_origin) this->gox = srcl->gox; this->goy = srcl->goy; this->goz = srcl->goz; endcopy begcopy(def_excl_pages) this->excl_pages = srcl->excl_pages; this->excl_list = srcl->excl_list; endcopy begcopy(color_map_fg.defined) this->color_crit = srcl->color_crit; this->color_map_fg.R = srcl->color_map_fg.R; this->color_map_fg.G = srcl->color_map_fg.G; this->color_map_fg.B = srcl->color_map_fg.B; this->color_map_fg.A = srcl->color_map_fg.A; endcopy begcopy(color_preview_below.defined) this->color_preview_below.R = srcl->color_preview_below.R; this->color_preview_below.G = srcl->color_preview_below.G; this->color_preview_below.B = srcl->color_preview_below.B; this->color_preview_below.A = srcl->color_preview_below.A; endcopy begcopy(color_preview_above.defined) this->color_preview_above.R = srcl->color_preview_above.R; this->color_preview_above.G = srcl->color_preview_above.G; this->color_preview_above.B = srcl->color_preview_above.B; this->color_preview_above.A = srcl->color_preview_above.A; endcopy begcopy(color_map_bg.defined) this->color_map_bg.R = srcl->color_map_bg.R; this->color_map_bg.G = srcl->color_map_bg.G; this->color_map_bg.B = srcl->color_map_bg.B; this->color_map_bg.A = srcl->color_map_bg.A; endcopy begcopy(def_doc_title) this->doc_title = srcl->doc_title; endcopy if ((this->def_doc_comment > 0) && (strlen(this->doc_comment) > 0) && (srcl->def_doc_comment > 0)) { std::string tmpstr(this->doc_comment); tmpstr += "
"; tmpstr += srcl->doc_comment; this->doc_comment = this->db->strstore(tmpstr.c_str()); } else { begcopy(def_doc_comment) this->doc_comment = srcl->doc_comment; endcopy } begcopy(def_doc_author) this->doc_author = srcl->doc_author; endcopy begcopy(def_doc_subject) this->doc_subject = srcl->doc_subject; endcopy begcopy(def_doc_keywords) this->doc_keywords = srcl->doc_keywords; endcopy begcopy(def_grid_size) this->gxs = srcl->gxs; this->gys = srcl->gys; this->gzs = srcl->gzs; endcopy begcopy(def_origin_label) this->olx = srcl->olx; this->oly = srcl->oly; endcopy begcopy(def_nav_factor) this->navf = srcl->navf; endcopy begcopy(def_nav_size) this->navsx = srcl->navsx; this->navsy = srcl->navsy; endcopy begcopy(def_own_pages) this->ownp = srcl->ownp; endcopy begcopy(def_title_pages) this->titlep = srcl->titlep; endcopy begcopy(def_opacity) this->opacity = srcl->opacity; endcopy begcopy(def_surface) this->surface = srcl->surface; endcopy begcopy(def_color_labels) this->color_labels = srcl->color_labels; endcopy begcopy(def_grid_coords) this->grid_coords = srcl->grid_coords; endcopy begcopy(def_north) this->north = srcl->north; endcopy begcopy(def_surface_opacity) this->surface_opacity = srcl->surface_opacity; endcopy begcopy(def_transparency) this->transparency = srcl->transparency; endcopy begcopy(def_sketches) this->sketches = srcl->sketches; endcopy begcopy(def_legend) this->legend = srcl->legend; endcopy begcopy(def_survey_level) this->survey_level = srcl->survey_level; endcopy begcopy(def_color_legend) this->color_legend = srcl->color_legend; endcopy begcopy(def_legend_width) this->legend_width = srcl->legend_width; endcopy begcopy(def_legend_columns) this->legend_columns = srcl->legend_columns; endcopy begcopy(def_map_header) this->map_header = srcl->map_header; this->map_header_x = srcl->map_header_x; this->map_header_y = srcl->map_header_y; endcopy begcopy(def_debug) this->debug = srcl->debug; endcopy begcopy(def_max_explos) this->max_explos = srcl->max_explos; endcopy begcopy(def_max_topos) this->max_topos = srcl->max_topos; endcopy begcopy(def_max_cartos) this->max_cartos = srcl->max_cartos; endcopy begcopy(def_max_copys) this->max_copys = srcl->max_copys; endcopy begcopy(def_explo_lens) this->explo_lens = srcl->explo_lens; endcopy begcopy(def_topo_lens) this->topo_lens = srcl->topo_lens; endcopy begcopy(def_lang) this->lang = srcl->lang; endcopy begcopy(def_units) this->units = srcl->units; endcopy begcopy(def_layers) this->layers = srcl->layers; endcopy begcopy(def_map_header_bg) this->map_header_bg = srcl->map_header_bg; endcopy begcopy(def_grid) this->grid = srcl->grid; endcopy begcopy(def_page_grid) this->page_grid = srcl->page_grid; endcopy begcopy(def_page_numbers) this->pgsnum = srcl->pgsnum; endcopy if (srcl->first_line != NULL) { // musime ich nakopirovat pred nase thlayoutln * cl, * nl, * newfl = NULL, * newll = NULL; cl = srcl->first_line; while (cl != NULL) { nl = this->db->db2d.insert_layoutln(); *nl = *cl; if (newll == NULL) { newfl = nl; newll = nl; newll->next_line = NULL; } else { newll->next_line = nl; newll = nl; } cl = cl->next_line; } if (this->last_line == NULL) { this->last_line = newll; newll->next_line = NULL; } else { newll->next_line = this->first_line; } this->first_line = newfl; } // copy map images thlayout_map_image_list::iterator mit, mits; mits = this->map_image_list.begin(); for (mit = srcl->map_image_list.begin(); mit != srcl->map_image_list.end(); mit++) { this->map_image_list.insert(mits, *mit); } } // pokracujeme v cykle this->first_copy_src = this->first_copy_src->next_src; } this->lock = false; } void thlayout::set_thpdf_layout(thdb2dprj * prj, double x_scale, double x_origin_shx, double x_origin_shy) { //string excl_list,labelx,labely; //bool excl_pages,background,title_pages,page_numbering, // transparency,map_grid; //float hsize,vsize,overlap, // hgrid,vgrid,hgridoffset,vgridoffset, //nav_factor; //int nav_right,nav_up,own_pages; LAYOUT.excl_list = (this->excl_list != NULL ? this->excl_list : ""); LAYOUT.labelx = this->olx; LAYOUT.labely = this->oly; LAYOUT.excl_pages = this->excl_pages; LAYOUT.title_pages = this->titlep; LAYOUT.page_numbering = this->pgsnum; LAYOUT.transparency = this->transparency; LAYOUT.OCG = this->layers; LAYOUT.map_header_bg = this->map_header_bg; LAYOUT.transparent_map_bg = (this->color_map_bg.A < 1.0); //TODO LAYOUT.map_grid = this->page_grid; LAYOUT.hsize = this->hsize * THM2PT; LAYOUT.vsize = this->vsize * THM2PT; LAYOUT.legend_width = this->legend_width * THM2PT; LAYOUT.legend_columns = (int) this->legend_columns; LAYOUT.overlap = this->overlap * THM2PT; switch (this->grid_coords) { case TT_LAYOUT_GRIDCOORDS_OFF: LAYOUT.grid_coord_freq = 0; break; case TT_LAYOUT_GRIDCOORDS_ALL: LAYOUT.grid_coord_freq = 2; break; default: LAYOUT.grid_coord_freq = 1; break; } switch (this->surface) { case TT_LAYOUT_SURFACE_OFF: LAYOUT.surface = 0; break; case TT_LAYOUT_SURFACE_TOP: LAYOUT.surface = 2; break; default: LAYOUT.surface = 1; break; } // TODO: sketches into layer if (this->sketches) { LAYOUT.surface = 1; } LAYOUT.surface_opacity = this->surface_opacity; LAYOUT.nav_factor = this->navf; LAYOUT.nav_right = this->navsx; LAYOUT.nav_up = this->navsy; LAYOUT.own_pages = this->ownp; if (strlen(this->doc_title) > 0) LAYOUT.doc_title = this->doc_title; if (strlen(this->doc_comment) > 0) LAYOUT.doc_comment = this->doc_comment; if (strlen(this->doc_author) > 0) LAYOUT.doc_author = this->doc_author; if (strlen(this->doc_subject) > 0) LAYOUT.doc_subject = this->doc_subject; if (strlen(this->doc_keywords) > 0) LAYOUT.doc_keywords = this->doc_keywords; LAYOUT.opacity = this->opacity; LAYOUT.colored_text = this->color_labels; LAYOUT.background_r = this->color_map_bg.R; LAYOUT.background_g = this->color_map_bg.G; LAYOUT.background_b = this->color_map_bg.B; LAYOUT.foreground_r = this->color_map_fg.R; LAYOUT.foreground_g = this->color_map_fg.G; LAYOUT.foreground_b = this->color_map_fg.B; LAYOUT.preview_above_r = this->color_preview_above.R; LAYOUT.preview_above_g = this->color_preview_above.G; LAYOUT.preview_above_b = this->color_preview_above.B; LAYOUT.preview_below_r = this->color_preview_below.R; LAYOUT.preview_below_g = this->color_preview_below.G; LAYOUT.preview_below_b = this->color_preview_below.B; LAYOUT.lang = this->lang; LAYOUT.langstr = thlang_getid(this->lang); } bool thlayout::is_debug_stations() { return ((this->debug & TTLDBG_STATIONS) != 0); } bool thlayout::is_debug_joins() { return ((this->debug & TTLDBG_JOINS) != 0); } bool thlayout::is_debug_scrapnames() { return ((this->debug & TTLDBG_SCRAPNAMES) != 0); } bool thlayout::is_debug_stationnames() { return ((this->debug & TTLDBG_STATIONNAMES) != 0); } std::list thlayout_copy_src_list; bool thlayout_map_image::defined() { return (strlen(this->m_fn) > 0); } void thlayout_map_image::parse(char ** args, const char * cpath) { int sv; thparse_double(sv,this->m_x,args[0]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",args[0])) if ((this->m_x < -100.0) || (this->m_x > 200.0)) ththrow(("number between -100.0 - 200.0 expected -- %s",args[0])) thparse_double(sv,this->m_y,args[1]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s",args[1])) if ((this->m_y < -100.0) || (this->m_y > 200.0)) ththrow(("number between -100.0 - 200.0 expected -- %s",args[1])) sv = thmatch_token(args[2],thtt_layout_map_header); if (sv == TT_LAYOUT_MAP_HEADER_UNKNOWN) ththrow(("invalid map-image align switch -- %s",args[2])) this->m_align = sv; if (strlen(args[3]) == 0) ththrow(("empty image file name not allowed")) std::string fpath; fpath = cpath; if (thpath_is_absolute(args[3])) fpath = args[3]; else fpath += args[3]; this->m_fn = thdb.strstore(fpath.c_str()); } therion/thimport.cxx0000664000175000017500000004507412267532700013656 0ustar useruser/** * @file thimport.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thimport.h" #include "thexception.h" #include "thchenc.h" #include "thdata.h" #include "thsurvey.h" #include "thendsurvey.h" #include "extern/img.h" #include #include #include #include #ifndef THMSVC #include #else #include #define getcwd _getcwd #define strcasecmp _stricmp #endif struct thsst { std::string name, fullname; thsurvey * survey; }; thimport::thimport() { this->format = 0; this->fname = NULL; this->surveys = TT_IMPORT_SURVEYS_CREATE; this->filter = NULL; this->calib_x = 0.0; this->calib_y = 0.0; this->calib_z = 0.0; } thimport::~thimport() { } int thimport::get_class_id() { return TT_IMPORT_CMD; } int thimport::get_context() { return (THCTX_SURVEY | THCTX_NONE); } bool thimport::is(int class_id) { if (class_id == TT_IMPORT_CMD) return true; else return thdataobject::is(class_id); } int thimport::get_cmd_nargs() { // replace by real number of arguments return 1; } const char * thimport::get_cmd_end() { // insert endcommand if multiline command return NULL; } const char * thimport::get_cmd_name() { // insert command name here return "import"; } thcmd_option_desc thimport::get_cmd_option_desc(const char * opts) { int id = thmatch_token(opts, thtt_import_opt); if (id == TT_IMPORT_UNKNOWN) return thdataobject::get_cmd_option_desc(opts); else return thcmd_option_desc(id); } void thimport::set(thcmd_option_desc cod, char ** args, int argenc, unsigned long indataline) { switch (cod.id) { // replace this by real properties setting case 1: this->set_file_name(*args); break; case TT_IMPORT_FORMAT: this->format = thmatch_token(args[0], thtt_import_fmts); if (this->format == TT_IMPORT_FMT_UNKNOWN) ththrow(("unknown import format -- %s", args[0])) break; case TT_IMPORT_CALIB: this->parse_calib(args[0], argenc); break; case TT_IMPORT_SURVEYS: this->surveys = thmatch_token(args[0], thtt_import_surveys); if (this->surveys == TT_IMPORT_SURVEYS_UNKNOWN) ththrow(("unknown survey structure policy -- %s", args[0])) break; case TT_IMPORT_FILTER: if (strlen(args[0]) > 0) this->filter = this->db->strstore(args[0]); else this->filter = NULL; break; // if not found, try to set fathers properties default: thdataobject::set(cod, args, argenc, indataline); } } void thimport::self_delete() { delete this; } void thimport::self_print_properties(FILE * outf) { thdataobject::self_print_properties(outf); fprintf(outf,"thimport:\n"); // insert intended print of object properties here } void thimport::set_file_name(char * fnm) { thbuffer impf_path; impf_path.guarantee(1024); getcwd(impf_path.get_buffer(),1024); this->mysrc = this->db->csrc; long i; if (strlen(fnm) == 0) ththrow(("file not specified")) impf_path += "/"; impf_path += thdb.csrc.name; char * pp = impf_path.get_buffer(); for(i = (long)strlen(pp); i >= 0; i--) { if ((pp[i] == '/') || (pp[i] == '\\')) { break; } else pp[i] = 0; } if (strlen(pp) == 0) impf_path = "/"; impf_path += fnm; pp = impf_path.get_buffer(); for(i = (long)strlen(pp); i >= 0; i--) { if (pp[i] == '\\') pp[i] = '/'; } this->fname = this->db->strstore(pp); FILE * tmp; tmp = fopen(this->fname,"r"); if (tmp == NULL) ththrow(("unable to open file for import -- %s", this->fname)) else fclose(tmp); // let's determine input type #define check_ext(str) (strlen(this->fname) > strlen(str)) && \ (strcasecmp(&(this->fname[strlen(this->fname) - strlen(str)]), str) == 0) if (check_ext(".3d")) this->format = TT_IMPORT_FMT_3D; else if (check_ext(".plt")) this->format = TT_IMPORT_FMT_PLT; else if (check_ext(".xyz")) this->format = TT_IMPORT_FMT_XYZ; } void thimport::import_file() { thobjectsrc tmpsrc; thsurvey * tmpsv; thdataobject * tmpobj; tmpsv = this->db->csurveyptr; tmpobj = this->db->lcsobjectptr; this->db->csurveyptr = this->fsptr; if (this->fsptr == NULL) { this->db->lcsobjectptr = this; while (this->db->lcsobjectptr->nsptr != NULL) this->db->lcsobjectptr = this->db->lcsobjectptr->nsptr; } else this->db->lcsobjectptr = this->db->csurveyptr->loptr; tmpsrc = this->db->csrc; this->db->csrc = this->mysrc; this->db->csrc.context = this; switch (this->format) { case TT_IMPORT_FMT_3D: case TT_IMPORT_FMT_PLT: case TT_IMPORT_FMT_XYZ: this->import_file_img(); break; default: ththrow(("unknown file format -- %s", this->fname)) } this->db->lcsobjectptr = tmpobj; this->db->csurveyptr = tmpsv; this->db->csrc = tmpsrc; } const char * thimport::station_name(const char * sn, const char separator, struct thsst * sst) { sst->survey = NULL; sst->name = sn; if (separator == 0) return sn; static thbuffer bx, prevsurvey; static thmbuffer psurv, csurv; static long active_survey; static thsurvey * prevpsurvey; thdataobject * prevobjptr; long i, l; bx = sn; char * buff = bx.get_buffer(), * rv; switch (this->format) { case TT_IMPORT_FMT_3D: { // splitne current na podstringy thsplit_strings(&csurv, sn, separator); char ** pbf = psurv.get_buffer(), ** cbf = csurv.get_buffer(); long nps = psurv.get_size(), ncs = csurv.get_size(); if (nps == 0) { prevpsurvey = NULL; } if (nps == 0) active_survey = 0; if ((ncs == 1) || (this->surveys == TT_IMPORT_SURVEYS_IGNORE)) return sn; // skusi porovnat s existujucim bool is_ident = true; if (nps != ncs) is_ident = false; for(i = 0; is_ident && (i < (ncs - 1)); i++) { is_ident = is_ident && (strcmp(pbf[i], cbf[i]) == 0); } if (!is_ident) { prevpsurvey = NULL; thsplit_strings(&psurv, sn, separator); prevsurvey = ""; int prevctx; thsurvey * csurvey = this->fsptr, * nsurvey, * prevcsptr = this->db->csurveyptr; // thendsurvey * nendsurvey; for (active_survey = 0; active_survey < (ncs - 1); active_survey++) { nsurvey = NULL; nsurvey = this->db->get_survey_noexc(cbf[active_survey], csurvey); // if nsurvey not found, try if there is no other object // with this name if ((nsurvey == NULL) && (this->surveys == TT_IMPORT_SURVEYS_CREATE) && (this->db->object_map.find(thobjectid(cbf[active_survey],(csurvey == NULL) ? 0 : csurvey->id)) == this->db->object_map.end())) { // if not, create this survey prevcsptr = this->db->csurveyptr; prevctx = this->db->ccontext; prevobjptr = this->db->csurveyptr = csurvey; if (csurvey == NULL) { this->db->lcsobjectptr = this; while (this->db->lcsobjectptr->nsptr != NULL) this->db->lcsobjectptr = this->db->lcsobjectptr->nsptr; } else this->db->lcsobjectptr = this->db->csurveyptr->loptr; this->db->ccontext = THCTX_SURVEY; nsurvey = (thsurvey*) this->db->create("survey", this->mysrc); // TODO - nastavit mu meno cez set nsurvey->name = this->db->strstore(cbf[active_survey]); this->db->insert(nsurvey); this->db->csrc.context = this; this->db->csurveylevel--; // nendsurvey = (thendsurvey*) this->db->create("endsurvey", this->mysrc); // this->db->insert(nendsurvey); this->db->csurveyptr = prevcsptr; if (prevcsptr == NULL) { this->db->lcsobjectptr = this; while (this->db->lcsobjectptr->nsptr != NULL) this->db->lcsobjectptr = this->db->lcsobjectptr->nsptr; } else this->db->lcsobjectptr = this->db->csurveyptr->loptr; this->db->ccontext = prevctx; nsurvey = this->db->get_survey_noexc(cbf[active_survey], csurvey); } if (nsurvey != NULL) { if (strlen(prevsurvey.get_buffer()) == 0) { prevsurvey = cbf[active_survey]; } else { bx = prevsurvey.get_buffer(); prevsurvey = cbf[active_survey]; prevsurvey += "."; prevsurvey += bx.get_buffer(); } csurvey = nsurvey; prevpsurvey = csurvey; } else break; } // } // poskladame meno bodu bx = ""; for(i = active_survey; i < ncs; i++) { if (i > active_survey) bx += "."; bx += cbf[i]; } sst->survey = prevpsurvey; sst->name = bx.get_buffer(); if (strlen(prevsurvey.get_buffer()) > 0) { bx += "@"; bx += prevsurvey; } return bx.get_buffer(); } break; default: l = (long)strlen(bx); rv = buff; for(i = 0; i < l; i++) { if ((buff[i] == separator) && ((i + 1) < l)) { rv = &(buff[i+1]); } } sst->name = rv; return rv; break; } } struct thimg_shot { double fx, fy, fz, tx, ty, tz; long flags; }; struct thimg_stpos { double x, y, z; }; bool operator < (const thimg_stpos & p1, const thimg_stpos & p2) { if (p1.x < p2.x) return true; if (p1.x > p2.x) return false; if (p1.y < p2.y) return true; if (p1.y > p2.y) return false; if (p1.z < p2.z) return true; return false; } typedef std::map str2strmap; typedef std::map pos2strmap; typedef std::list thimgshotlist; void thimport::import_file_img() { // potrebujeme: // funkciu ktora premeni ass.sss.1 na 1@sds.sds, ale // iba ak survey existuje // hash: ass.ass.1 -> 1@sds.sds // hash: x,y,z -> 1@sds.sds // list: xyz->xyz + flags thimg_stpos tmppos; thimg_shot tmpshot; str2strmap svxs2ths; thsst tmpsst; thdata * tmpdata; thsurvey * tmpsurvey; pos2strmap svxpos2ths; pos2strmap::iterator p2si; thimgshotlist shotlist; thimgshotlist::iterator sli; unsigned long notimpst = 0, notimpsh = 0; // postup - prebehneme subor, vytvorime zoznam shotov, // popridavame fixne body spolu s atributmi ak existuju a vytvarame // oba heshe // nakoniec pridame shots // thprintf("\n\n"); img_point imgpt; img_errcode imgerr; int result; char * args [4], * stnm, a0[32], a1[32], a2[32], a3[32]; args[0] = a0; args[1] = a1; args[2] = a2; args[3] = a3; size_t filterl = 0; if (this->filter != NULL) filterl = strlen(this->filter); thbuffer n1, n2; thbuffer xb, yb, zb; xb.guarantee(128); yb.guarantee(128); zb.guarantee(128); std::string orig_name, new_name; img* pimg = img_open(this->fname); if (pimg == NULL) { imgerr = img_error(); ththrow(("unable to open file %s, error code: %u", this->fname, imgerr)) } do { result = img_read_item(pimg, &imgpt); switch (result) { case img_MOVE: tmpshot.fx = imgpt.x; tmpshot.fy = imgpt.y; tmpshot.fz = imgpt.z; break; case img_LINE: tmpshot.tx = imgpt.x; tmpshot.ty = imgpt.y; tmpshot.tz = imgpt.z; tmpshot.flags = pimg->flags; shotlist.insert(shotlist.end(), tmpshot); tmpshot.fx = tmpshot.tx; tmpshot.fy = tmpshot.ty; tmpshot.fz = tmpshot.tz; break; case img_LABEL: // vlozime fix station stnm = pimg->label; if ((filterl > 0) && (strncmp(stnm, this->filter, filterl) == 0)) { stnm = &stnm[filterl]; while ((*stnm != 0) && (*stnm == pimg->separator)) { stnm++; } } orig_name = stnm; if (strlen(stnm) < 1) break; if (svxs2ths.find(orig_name) == svxs2ths.end()) { sprintf(xb.get_buffer(), "%.16g", imgpt.x + this->calib_x); sprintf(yb.get_buffer(), "%.16g", imgpt.y + this->calib_y); sprintf(zb.get_buffer(), "%.16g", imgpt.z + this->calib_z); tmpsurvey = this->db->csurveyptr; new_name = this->station_name(stnm, pimg->separator, &tmpsst); // thprintf("%s -> %s\n", pimg->label, new_name.c_str()); tmpdata = NULL; if (tmpsst.survey != NULL) { n1 = tmpsst.name.c_str(); n2 = tmpsst.name.c_str(); tmpdata = tmpsst.survey->data; this->db->csurveyptr = tmpsst.survey; } else { n1 = new_name.c_str(); n2 = new_name.c_str(); if (this->fsptr != NULL) tmpdata = this->fsptr->data; else { notimpst++; // do not import station break; } } tmppos.x = imgpt.x; tmppos.y = imgpt.y; tmppos.z = imgpt.z; tmpsst.fullname = new_name; svxpos2ths[tmppos] = tmpsst; svxs2ths[orig_name] = new_name; args[1] = xb.get_buffer(); args[2] = yb.get_buffer(); args[3] = zb.get_buffer(); args[0] = n1.get_buffer(); tmpdata->cs = this->cs; tmpdata->set_data_fix(4, args); // ak bude entrance, vlozi aj station if ((pimg->flags & img_SFLAG_ENTRANCE) != 0) { args[0] = n2.get_buffer(); args[1] = strcpy(a1, ""); args[2] = strcpy(a2, "entrance"); tmpdata->set_data_station(3, args, TT_UTF_8); } if ((pimg->flags & img_SFLAG_FIXED) == 0) { args[0] = n2.get_buffer(); args[1] = strcpy(a1, ""); args[2] = strcpy(a2, "not"); args[3] = strcpy(a3, "fixed"); tmpdata->set_data_station(4, args, TT_UTF_8); } this->db->csurveyptr = tmpsurvey; } break; case img_BAD: img_close(pimg); ththrow(("invalid file format")) break; } } while (result != img_STOP); img_close(pimg); if (notimpst > 0) { thwarning(("unable to import %d stations outside survey", notimpst)); } thsurvey * s1survey, * s2survey; long s1slevel, s2slevel, maxlevel, i, j; thsst s1s, s2s; // nakoniec povklada shoty for(sli = shotlist.begin(); sli != shotlist.end(); sli++) { tmppos.x = sli->fx; tmppos.y = sli->fy; tmppos.z = sli->fz; p2si = svxpos2ths.find(tmppos); if (p2si == svxpos2ths.end()) continue; s1s = p2si->second; tmppos.x = sli->tx; tmppos.y = sli->ty; tmppos.z = sli->tz; p2si = svxpos2ths.find(tmppos); if (p2si == svxpos2ths.end()) continue; s2s = p2si->second; tmpsurvey = this->db->csurveyptr; tmpdata = NULL; // find survey levels s1slevel = 0; s1survey = s1s.survey; while (s1survey != NULL) { s1survey = s1survey->fsptr; s1slevel++; } s2slevel = 0; s2survey = s2s.survey; while (s2survey != NULL) { s2survey = s2survey->fsptr; s2slevel++; } maxlevel = s1slevel; if (s2slevel < maxlevel) maxlevel = s2slevel; // try from max to min level for (i = maxlevel; i > 0; i--) { // find survey at i s1survey = s1s.survey; n1 = s1s.name.c_str(); for (j = s1slevel; j > i; j--) { if (j == s1slevel) n1 += "@"; else n1 += "."; n1 += s1survey->name; s1survey = s1survey->fsptr; } s2survey = s2s.survey; n2 = s2s.name.c_str(); for (j = s2slevel; j > i; j--) { if (j == s2slevel) n2 += "@"; else n2 += "."; n2 += s2survey->name; s2survey = s2survey->fsptr; } if (s1survey->id == s2survey->id) { this->db->csurveyptr = s1survey; tmpdata = s1survey->data; break; } } if (tmpdata == NULL) { if (this->fsptr != NULL) tmpdata = this->fsptr->data; else { notimpsh++; // do not import continue; } // tmpdata = this->data; n1 = s1s.fullname.c_str(); n2 = s2s.fullname.c_str(); } // thprintf("%s - %s = %s - %s in %s\n", s1s.fullname.c_str(), s2s.fullname.c_str(), n1.get_buffer(), n2.get_buffer(), tmpdata->fsptr->full_name); args[0] = strcpy(a0, "nosurvey"); args[1] = strcpy(a1, "from"); args[2] = strcpy(a2, "to"); tmpdata->set_data_data(3,args); args[0] = n1.get_buffer(); args[1] = n2.get_buffer(); tmpdata->d_flags = TT_LEGFLAG_NONE; if ((sli->flags & img_FLAG_SURFACE) != 0) { tmpdata->d_flags |= TT_LEGFLAG_SURFACE; } if ((sli->flags & img_FLAG_DUPLICATE) != 0) { tmpdata->d_flags |= TT_LEGFLAG_DUPLICATE; } tmpdata->insert_data_leg(2, args); this->db->csurveyptr = tmpsurvey; } if (notimpsh > 0) { thwarning(("unable to import %d shots outside survey", notimpsh)); } } void thimport::parse_calib(char * spec, int enc) { thmbuffer * mb; char ** args; mb = &this->db->mbuff_tmp; thsplit_args(mb, spec); args = mb->get_buffer(); double v[6]; int sv, i; if (mb->get_size() != 6) ththrow(("invalid import calibration -- \"%s\"", spec)); for(i = 0; i < 6; i++) { thparse_double(sv, v[i], args[i]); if (sv != TT_SV_NUMBER) ththrow(("invalid number -- %s", args[i])) } this->calib_x = v[3] - v[0]; this->calib_y = v[4] - v[1]; this->calib_z = v[5] - v[2]; } therion/thscrapen.h0000664000175000017500000000257511575360736013434 0ustar useruser/** * @file thscrapen.h * Scrap end class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thscrapen_h #define thscrapen_h #include #include /** * Scrap end class. */ class thscrapen { public: thscrapen * next_end; class thline * l1; class thdb2dlp * lp1; class thline * l2; class thdb2dlp * lp2; double cxt, cyt; bool active; thscrapen(); ///< Default constructor }; typedef std::list thscrapen_list; ///< Points list. #endif therion/thdb2dxs.cxx0000664000175000017500000000312310625655142013521 0ustar useruser/** * @file thdb2dxs.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include "thdb2dxs.h" #include "thdb2dmi.h" thdb2dxs::thdb2dxs() { this->prev_item = NULL; this->next_item = NULL; this->bm = NULL; this->fmap = NULL; this->mode = TT_MAPITEM_UNKNOWN; this->m_target = this; this->previewed = false; this->preview_output_number = 0; } bool operator < (const thdb2dxs_target_item & i1, const thdb2dxs_target_item & i2) { if (i1.m_proj_id < i2.m_proj_id) return true; if (i1.m_proj_id > i2.m_proj_id) return false; if (i1.m_map_id < i2.m_map_id) return true; if (i1.m_map_id > i2.m_map_id) return false; if (i1.m_shift < i2.m_shift) return true; return false; } therion/mpost/0000775000175000017500000000000012426431274012415 5ustar userusertherion/mpost/thSpecial.mp0000664000175000017500000000537710564525424014705 0ustar useruser%% therion source code %% %% This file defines macros for special symbols %% %% $Date: $ %% $RCSfile: $ %% $Revision: $ %% %% Copyright (C) 2004 Martin Budaj %% %% -------------------------------------------------------------------- %% This program is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2 of the License, or %% any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %% -------------------------------------------------------------------- def s_northarrow_SKBB_old (expr rot) = T:=identity; picture tmp_pic; tmp_pic = image ( begingroup interim defaultscale:=3; label(if (lang="sk") or (lang="cz"): "S" else: "N" fi, origin); endgroup; drawarrow (0,-1cm)--(0,1cm); ); draw tmp_pic rotatedaround(origin, -rot); enddef; def s_northarrow_SKBB (expr rot) = T:=identity scaled 0.7 rotated -rot; thdraw (-.5cm,-1cm)--(0,1.5cm)--(.5cm,-1cm)--(0,-.5cm)--cycle; thfill (-.5cm,-1cm)--(0,1.5cm)--(0,-.5cm)--cycle; enddef; def s_scalebar_SKBB (expr l, units, txt) = begingroup interim warningcheck:=0; tmpl:=l / Scale * cm * units / 2; endgroup; pickup PenC; draw (-tmpl,0)--(tmpl,0); draw (-tmpl,0)--(-tmpl,2bp); draw (tmpl,0)--(tmpl,2bp); begingroup interim labeloffset:=2bp; label.top(thTEX(decimal (l) & "\thinspace" & txt),origin); endgroup enddef; def s_scalebar_SM (expr l, units, txt) = begingroup interim warningcheck:=0; tmpl:=l / Scale * cm * units / 2; endgroup; pickup PenC; draw (-tmpl,0)--(tmpl,0); draw (-tmpl,0)--(-tmpl,2bp); draw (tmpl,0)--(tmpl,2bp); draw (0,0)--(0,2bp); begingroup interim labeloffset:=3.5bp; label.top(thTEX(decimal (0)),(-tmpl,0)); label.top(thTEX(decimal (l/2)),origin); label.top(thTEX(decimal (l) & "\thinspace" & txt),(tmpl,0)); endgroup enddef; def s_hgrid_SM (expr xpos, ypos, xsize, ysize) = pickup PenD; draw ( if xpos < 0: 0 else: -5mm fi, 0 ) -- ( if xpos > 0: 0 else: 5mm fi, 0 ); draw ( 0, if ypos < 0: 0 else: -5mm fi ) -- ( 0, if ypos > 0: 0 else: 5mm fi ); enddef; def s_vgrid_SM (expr xpos, ypos, xsize, ysize) = pickup PenD; draw ( if xpos < 0: 0 else: -xsize/2 fi, 0 ) -- ( if xpos > 0: 0 else: xsize/2 fi, 0 ) dashed evenly; enddef; therion/mpost/thArea.mp0000664000175000017500000002144412064677016014170 0ustar useruser%% therion source code %% %% This file defines tiling patterns %% %% $Date: 2003/07/01 09:06:44 $ %% $RCSfile: thPatterns.mp,v $ %% $Revision: 1.6 $ %% %% Copyright (C) 2000-2004 Martin Budaj %% %% -------------------------------------------------------------------- %% This program is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2 of the License, or %% any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %% -------------------------------------------------------------------- if unknown a_water_UIS: else: endinput fi; % patterns beginpattern(pattern_water_UIS); draw origin--10up withpen pensquare scaled (0.02u); patternxstep(.18u); patterntransform(identity rotated 45); endpattern; beginpattern(pattern_sump_UIS); draw origin--(0,.25u) withpen pensquare scaled (0.02u); draw origin--(.25u,0) withpen pensquare scaled (0.02u); patterntransform(identity rotated 45); endpattern; beginpattern(pattern_sand_UIS); pickup PenC; draw (0.2u,.3u); draw (0.35u,.7u); draw (0.6u,.5u); draw (0.8u,.1u); endpattern; beginpattern(pattern_debris_SKBB); pickup PenC; p:=(-.15u,0)--(.15u,0); draw p rotated -40 shifted (.2u,.3u); draw p rotated 70 shifted (.9u,1.5u); draw p rotated 20 shifted (1.5u,.8u); % draw p rotated 95 shifted (.9u,.8u); endpattern; beginpattern(pattern_moonmilk_SKBB); pickup PenC; p:=(-.5u,0){down} .. {up}(-.1666u,0){down}.. {up}(.1666u,0){down} .. {up}(.5u,0); draw p; draw p shifted (0.5u,0.3u); patternxstep(1.0u); patternystep(0.6u); endpattern; beginpattern(pattern_flowstone_ASF); pickup PenC; p:=(-.35u,0){dir -60} .. {dir 60}(0.35u,0); draw p; draw p shifted (0.35u,0.4u); patternxstep(u); patternystep(0.8u); endpattern; beginpattern(pattern_empty); patternbbox(0,0,10,10); patternstep(10,10); endpattern; % symbols def a_water_UIS (expr Path) = T:=identity; thclean Path; thfill Path withpattern pattern_water_UIS; enddef; def a_sump_UIS (expr Path) = T:=identity; thclean Path; thfill Path withpattern pattern_sump_UIS; enddef; def a_flowstone_ASF (expr Path) = T:=identity; thclean Path; thfill Path withpattern pattern_flowstone_ASF; enddef; def a_moonmilk_SKBB (expr Path) = T:=identity; thclean Path; thfill Path withpattern pattern_moonmilk_SKBB; enddef; def a_sand_UIS (expr p) = T:=identity; % thclean p; pickup PenC; path q; q = bbox p; picture tmp_pic; tmp_pic := image( for i = xpart llcorner q step 1u until xpart urcorner q: for j = ypart llcorner q step 1u until ypart urcorner q: draw origin shifted ((i,j) randomized 0.7u) withpen PenC; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_debris_UIS (expr Path) = T:=identity; % thclean Path; thfill Path withpattern pattern_debris_SKBB; enddef; def a_bedrock_SKBB (expr Path) = T:=identity; thclean Path; enddef; % used to export centerline LRUD envelope for maps created from surveys def a_dimensions_SKBB (expr Path) = T:=identity; thclean Path; enddef; def a_debris_SKBB (expr p) = T:=identity; % thclean p; pickup PenC; path q; q = bbox p; picture tmp_pic; tmp_pic := image( for i = xpart llcorner q step 1u until xpart urcorner q: for j = ypart llcorner q step 1u until ypart urcorner q: draw ((-.2u,0)--(.2u,0)) rotated uniformdeviate(360) shifted ((i,j) randomized 0.6u) withpen PenC; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_clay_SKBB (expr p) = T:=identity; pickup PenC; path q, qq; q = bbox p; picture tmp_pic; tmp_pic := image( for i = xpart llcorner q step 1.5u until xpart urcorner q: for j = ypart llcorner q step 1.5u until ypart urcorner q: qq := ((-.25u,0){up}..origin{down}..{up}(0.25u,0)) randomized (u/15) shifted ((i,j) randomized 1.3u); if xpart (p intersectiontimes qq) < 0: thdraw qq; fi; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_ice_SKBB (expr p) = T:=identity; pickup PenC; path q; q = bbox p; picture tmp_pic, tmp_ice; pair z; tmp_ice := image ( draw (-.2u,0)--(.2u,0); draw (0,-.2u)--(0,.2u); ); tmp_pic := image( for i = xpart llcorner q step 1.5u until xpart urcorner q: for j = ypart llcorner q step 1.5u until ypart urcorner q: z := ((i,j) randomized 1.3u); if xpart (p intersectiontimes ((bbox tmp_ice) shifted z)) < 0: draw tmp_ice shifted z; fi; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_snow_SKBB (expr P) = T:=identity; pickup PenC; path q; q = bbox P; picture tmp_pic, tmp_sn; pair z; tmp_sn := image( pickup PenC; p := origin--(0,.2*u); draw p; draw p rotated (60); draw p rotated (120); draw p rotated (180); draw p rotated (240); draw p rotated (300); p := ((0,.3u)--(0,0.2u)--(0.1u,0.2u)) rotatedaround ((0,0.2u),45); draw p; draw p rotated (60); draw p rotated (120); draw p rotated (180); draw p rotated (240); draw p rotated (300); ); tmp_pic := image( for i = xpart llcorner q step 1.5u until xpart urcorner q: for j = ypart llcorner q step 1.5u until ypart urcorner q: z:=((i,j) randomized 1.3u); if xpart (P intersectiontimes ((bbox tmp_sn) shifted z)) < 0: draw tmp_sn shifted z; fi; endfor; endfor; ); clip tmp_pic to P; drawoptions(); draw tmp_pic; enddef; def a_blocks_SKBB (expr p) = T:=identity; pickup PenC; path q, qq; q = bbox p; picture tmp_pic; uu := max(u, (xpart urcorner q - xpart llcorner q)/100, (ypart urcorner q - ypart llcorner q)/100); tmp_pic := image( for i = xpart llcorner q step 2uu until xpart urcorner q: for j = ypart llcorner q step 2uu until ypart urcorner q: qq := punked (((-.5uu,-.5uu)--(.5uu,-.5uu)--(.5uu,.5uu)--(-.5uu,.5uu)--cycle) randomized (uu/2)) rotated uniformdeviate(360) shifted ((i,j) randomized 1.6uu); if xpart (p intersectiontimes qq) < 0: thclean qq; thdraw qq; fi; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_blocks_SKBB_ (expr p,o,s_beg,s_end,d_beg,d_end) = T:=identity; orient = 90-o; pickup PenC; path q[], qq; q1 = bbox p; draw q1; draw p; q2 = llcorner q1 .. lrcorner q1 .. urcorner q1 .. ulcorner q1 .. cycle; draw q2; pair zz[]; radius := .5*length(llcorner q1 - urcorner q1); zz1 := .5[llcorner q1,urcorner q1]; zz2 := zz1 - dir(orient)*radius; zz3 = zz1 rotatedaround (zz2,90); draw zz1 withpen pencircle scaled 2mm; draw zz2 withpen pencircle scaled 2mm; draw zz3 withpen pencircle scaled 2mm; picture tmp_pic; tmp_pic := image( j := 0; forever: i := 0; forever: qq := punked (((-.5,-.5)--(.5,-.5)--(.5,.5)--(-.5,.5)--cycle) scaled (0.7(5u-(j/(2*radius))[u*s_beg,u*s_end])) randomized (u/2)) rotated uniformdeviate(360) shifted (((zz3 + (i,j)) rotatedaround (zz3,-o)) randomized 1.6u); draw ((zz3 + (i,j)) rotatedaround (zz3,-o)) withpen pencircle scaled 1mm withcolor red; if xpart (p intersectiontimes qq) < 0: thclean qq; thdraw qq; fi; i := i + (j/(2*radius))[u*d_beg,u*d_end]; exitif i > 2*radius; endfor; j := j + (j/(2*radius))[u*d_beg,u*d_end]; exitif j > 2*radius; endfor; ); % clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_pebbles_SKBB (expr p) = T:=identity; pickup PenC; path q, qq; q = bbox p; picture tmp_pic; tmp_pic := image( for i = xpart llcorner q step 1.5u until xpart urcorner q: for j = ypart llcorner q step 1.5u until ypart urcorner q: qq := (superellipse((.2u,0),(0,.1u),(-.2u,0),(0,.-.1u),.75)) % randomized (u/25) rotated uniformdeviate(360) shifted ((i,j) randomized 0.8u); if xpart (p intersectiontimes qq) < 0: thdraw qq; fi; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_water_SKBB (expr Path) = T:=identity; thfill Path; enddef; let a_sump_SKBB = a_water_SKBB; def a_u (expr p) = T:=identity; thfill p withcolor red; enddef; therion/mpost/thPoint.mp0000664000175000017500000006372412054203652014406 0ustar useruser%% therion source code %% %% This file defines macros for point map symbols %% %% $Date: 2003/07/01 09:06:44 $ %% $RCSfile: thPoint.mp,v $ %% $Revision: 1.8 $ %% %% Copyright (C) 2000-2004 Martin Budaj %% %% -------------------------------------------------------------------- %% This program is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2 of the License, or %% any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %% -------------------------------------------------------------------- pair U; def p_stalactite_UIS(expr pos,theta,sc,al) = U:=(.15u, .4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,-.4u) -- (0,.15u) -- (-.15u,.4u); thdraw (0,.15u) -- (.15u,.4u); enddef; def p_stalagmite_UIS(expr pos,theta,sc,al) = U:=(.15u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,.4u) -- (0,-.15u) -- (-.15u,-.4u); thdraw (0,-.15u) -- (.15u,-.4u); enddef; def p_pillar_UIS(expr pos,theta,sc,al) = U:=(.15u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,.15u)--(0,-.15u); thdraw (-.15u,-.4u)--(0,-.15u)--(.15u,-.4u); thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u); enddef; def p_curtain_UIS(expr pos,theta,sc,al) = U:=(.15u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u); thdraw (0,.15u)--(0,0){dir 180}..(-.12u,-.11u)..{dir 0}(0,-.22u)--(0,-.4u); enddef; def p_helictite_UIS(expr pos,theta,sc,al) = U:=(.2u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,.4u)--(0,-.4u); p := (-.2u,.4u)---(-.2u,.1u){down}..{dir -10}(-.1u,0.02u)---origin; thdraw p; thdraw p reflectedabout (origin,(0,u)) reflectedabout (origin,(u,0)); enddef; def p_sodastraw_UIS(expr pos,theta,sc,al) = U:=(.5u,.25u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,.2u)--(.5u,.2u); pickup PenD; thdraw (-.4u,.2u)--(-.4u,0); thdraw (-.12u,.2u)--(-.12u,-.25u); thdraw (.02u,.2u)--(.02u,-.1u); thdraw (.23u,.2u)--(.23u,-.19u); thdraw (.35u,.2u)--(.35u,-.15u); enddef; def p_crystal_UIS (expr pos,theta,sc,al)= U:=(.35u,.35u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := ((-.35*u,0)--(.35*u,0)); thdraw p; thdraw p rotated (60); thdraw p rotated (120); enddef; def p_flowstone_UIS (expr pos,theta,sc,al)= U:=(.45u,.1u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := ((-.15*u,0)--(.15*u,0)); thdraw p shifted (.3u,-.1u); thdraw p shifted (-.3u,-.1u); thdraw p shifted (0,.1u); enddef; def p_moonmilk_UIS (expr pos,theta,sc,al)= U:=(.5u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,-.2u){up}..{dir -60}(-.18u,-.105u){dir 80}.. {dir-80}(.18u,-.105u){dir 60}..{down}(.5u,-.2u); enddef; def p_wallcalcite_UIS (expr pos,theta,sc,al)= U:=(.2u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.2u,-.2u)--(0,.1u)--(.2u,-.2u); enddef; def p_popcorn_UIS (expr pos,theta,sc,al)= U:=(.5u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,-.2u)--(.5u,-.2u); pickup PenD; thdraw (-.3u,-.2u)--(-.3u,.1u); thdraw (0,-.2u)--(0,.1u); thdraw (.3u,-.2u)--(.3u,.1u); thfill fullcircle scaled .2u shifted (-.3u,.1u); thfill fullcircle scaled .2u shifted (0,.1u); thfill fullcircle scaled .2u shifted (.3u,.1u); enddef; def p_disk_UIS (expr pos,theta,sc,al)= U:=(.2u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.2u,-.3u)--origin--(.2u,-.3u); p:=fullcircle scaled .3u shifted (0,.15u); thclean p; thdraw p; enddef; def p_gypsum_NSS (expr pos,theta,sc,al)= U:=(.25u,.25u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.25u,0)--(.25u,0); thdraw (0,-.25u)--(0,.25u); enddef; def p_aragonite_NSS (expr pos,theta,sc,al)= U:=(.3u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,-.4u)--(0,.3u); thdraw (0,-.1u){dir 40}..{dir 5}(.3u,.08u); thdraw (0,-.1u){dir 140}..{dir 175}(-.3u,.08u); thdraw (0,.2u){dir 30}..{dir 5}(.25u,.3u); thdraw (0,.2u){dir 150}..{dir 175}(-.25u,.3u); enddef; def p_cavepearl_SKBB (expr pos,theta,sc,al)= U:=(.25u,.25u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:=fullcircle scaled .25u shifted (0,.16u); thdraw p; thdraw p rotated 120; thdraw p rotated 240; enddef; def p_gypsumflower_NSS (expr pos,theta,sc,al)= U:=(.4u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; % thdraw (.2u,0){left}..(0,.2u)..(.25u,.35u)..(.5u,0).. % (.1u,-.3u)..{dir 125}(-.5u,.2u); thdraw (.18u,0){left}..(0,.15u)..(.2u,.3u)..(.4u,0).. (.15u,-.28u)..{dir 120}(-.4u,.15u); enddef; def p_rimstonepool_ASF (expr pos,theta,sc,al)= U:=(.4u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := (-.4u,.2u){dir -70}..{dir 70}(.4u,.2u); thfill buildcycle(p,((.5u,.1u)--(-.5u,.1u))); thdraw p; enddef; def p_rimstonedam_ASF (expr pos,theta,sc,al)= U:=(.4u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.4u,.2u){dir -70}..{dir 70}(.4u,.2u); enddef; def p_anastomosis_UIS (expr pos,theta,sc,al)= U:=(.4u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:=(-.4u,-.2u)--(-.3u,-.3u)--(0,.3u)--(.1u,.2u); thdraw p; thdraw p shifted (.3u,0); enddef; def p_karren_UIS (expr pos,theta,sc,al)= U:=(.5u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,-.3u){dir -85}..{dir 85}(-.32u,-.3u)..(-.28u,.3u){dir 85}.. {dir -85}(-.12u,.3u)..(-.08u,-.3u){dir-85}..{dir 85}(.08u,-.3u).. {dir85}(.12u,.3u)..(.28u,.3u){dir -85}..(.32u,-.3u){dir -85}.. {dir 85}(.5u,-.3u); enddef; def p_scallop_UIS (expr pos,theta,sc,al)= U:=(.2u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,-.4u){dir 125}..{dir 105}(-.2u,.1u){up}.. {down}(.2u,.1u){dir -105}...{dir -125}(0,-.4u); enddef; def p_flute_UIS (expr pos,theta,sc,al)= U:=(.5u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,.2u)--(.5u,.2u); thdraw (-.3u,.2u){dir -70}..{dir 70}(.3u,.2u); enddef; def p_raft_NSS (expr pos,theta,sc,al)= U:=(.5u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,.2u){dir -80}..(-.3u,-.2u)..origin..(.3u,.2u).. {dir -80}(.5u,-.2u); enddef; def p_raftcone_NSS (expr pos,theta,sc,al)= U:=(.3u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,-.4u)--(0,.4u)--(.3u,-.4u); enddef; def p_spring_SKBB (expr pos,theta,sc,al)= U:=(.3u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,.2u){down}..(0,-.2u)..{up}(.3u,.2u); enddef; def p_sink_SKBB (expr pos,theta,sc,al)= U:=(.3u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,-.2u){up}..(0,.2u)..{down}(.3u,-.2u); enddef; def p_narrowend_UIS (expr pos,theta,sc,al)= U:=(.1u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.1u,-.4u)--(-.1u,.4u); thdraw (.1u,-.4u)--(.1u,.4u); enddef; def p_lowend_UIS (expr pos,theta,sc,al)= U:=(.4u,.1u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.4u,-.1u)--(.4u,-.1u); thdraw (-.4u,.1u)--(.4u,.1u); enddef; def p_lowend_NSS (expr pos,theta,sc,al)= U:=(.4u,0); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.4u,0)--(.4u,0); enddef; def p_flowstonechoke_NSS (expr pos,theta,sc,al)= U:=(.4u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:=(-.4u,-.4u){right}..{dir120}(-.2u,-.2u){dir -20}..{up}(0,0); thdraw p; thdraw p shifted (0,.2u); thdraw p reflectedabout (origin,down); thdraw p reflectedabout (origin,down) shifted (0,.2u); enddef; def p_breakdownchoke_NSS (expr pos,theta,sc,al)= U:=(.5u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,-.1u)--(-.15u,.05u)--(-.48u,.2u)--cycle; thdraw (-.2u,-.2u)--(.15u,-.18u)--(-.08u,.14u)--cycle; thdraw (.1u,0)--(.4u,-.1u)--(.5u,.2u)--(.1u,.2u)--cycle; enddef; def p_bedrock_ASF (expr pos,theta,sc,al)= U:=(.5u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,0)--(.5u,0); thdraw (-.3u,0)--(-.3u,.2u); thdraw (.3u,0)--(.3u,-.2u); enddef; def p_sand_UIS (expr pos,theta,sc,al)= U:=(.2u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenB; thdraw (0,.2u); thdraw (0,.2u) rotated 120; thdraw (0,.2u) rotated 240; enddef; def p_clay_SKBB (expr pos,theta,sc,al) = U:=(.3u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,0){up}..origin{down}..{up}(0.3u,0); enddef; def p_pebbles_UIS (expr pos,theta,sc,al)= U:=(.45u,.35u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:=superellipse((.2u,0),(0,.1u),(-.2u,0),(0,.-.1u),.75); thdraw p rotated 20 shifted (0,.25u); thdraw p rotated -37 shifted (.25u,-.25u); thdraw p rotated -62 shifted (-.25u,-.25u); enddef; def p_debris_UIS (expr pos,theta,sc,al)= U:=(.4u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,-.4u)--(0,-.22u)--(-.4u,-.1u)--cycle; thdraw (.2u,-.4u)--(.4u,-.1u)--(.1u,-.1u)--cycle; thdraw (-.1u,0)--(.2u,.3u)--(-.2u,.3u)--cycle; enddef; def p_blocks_UIS (expr pos,theta,sc,al)= U:=(.5u,.5u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.5u,-.5u)--(.3u,-.4u)--(-.17u,.2u)--cycle; thdraw (.25u,-.25u)--(.5u,-.15u)--(.3u,.5u)--(-.1u,.5u)--cycle; thdraw (-.27u,0)--(-.1u,.3u)--(-.5u,.35u)--cycle; pickup PenD; thdraw (-.5u,-.5u)--(-.1u,-.2u)--(-.17u,.2u); thdraw (-.1u,-.2u)--(.3u,-.4u); thdraw (.25u,-.25u)--(.3u,0)--(.2u,.2u)--(-.1u,.5u); thdraw (.3u,.5u)--(.2u,.2u); thdraw (.5u,-.15u)--(.3u,0); enddef; def p_water_UIS (expr pos,theta,sc,al)= U:=(.425u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenD; p:=fullcircle xscaled (.85u) yscaled (.6u); thfill p withpattern pattern_water_UIS; thdraw p; enddef; def p_ice_UIS (expr pos,theta,sc,al)= U:=(.4u,.35u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := (0,.05u)--(0,.35u); thdraw p; thdraw p shifted (-.25u,-.3u); thdraw p shifted (.25u,-.3u); p := (-0.15u,.2u)--(0.15u,.2u); thdraw p; thdraw p shifted (-.25u,-.3u); thdraw p shifted (.25u,-.3u); enddef; def p_snow_SKBB (expr pos,theta,sc,al)= U:=(.35u,.35u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := origin--(0,.25*u); q := ((0,.35u)--(0,0.25u)--(0.1u,0.25u)) rotatedaround ((0,0.25u),45); thdraw p; thdraw p rotated (60); thdraw p rotated (120); thdraw p rotated (180); thdraw p rotated (240); thdraw p rotated (300); thdraw q; thdraw q rotated (60); thdraw q rotated (120); thdraw q rotated (180); thdraw q rotated (240); thdraw q rotated (300); enddef; def p_archeomaterial_UIS (expr pos,theta,sc,al)= U:=(.4u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := fullcircle scaled .8u; thdraw (-.5u,-.5u)--origin cutbefore p; thdraw (-.5u,.5u)--origin cutbefore p; thdraw origin--(.4u,0); thdraw p; enddef; def p_paleomaterial_UIS (expr pos,theta,sc,al)= U:=(.4u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; thfill (-.4u,-.2u)..(-.2u,-.08u)---(-.1u,.05u)---(0,.2u)..(-.03u,.4u).. (.2u,.3u)..(.35u,.25u)..(.2u,.2u)---origin---(-.1u,-.17u).. (-.08u,-.25u){dir -120}..(-.3u,-.23u) ..cycle; enddef; def p_guano_UIS (expr pos,theta,sc,al)= U:=(.4u,.35u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.4u,.2u){dir 40}..{down}(0,-.35u){up}..{dir-40}(.4u,.2u); enddef; def p_vegetabledebris_ASF (expr pos,theta,sc,al)= U:=(.38u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,-.3u)--(0,.3u); thdraw (0,-.3u)--(.3u,.3u); thdraw (-.25u,.13u)--(.38u,.13u); thdraw (-.38u,-.13u)--(.25u,-.13u); enddef; def p_root_ASF (expr pos,theta,sc,al)= U:=(.1u,.5u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.1u,-.5u)--(-.1u,.5u); p:=(-.1u,-.3u)--(.1u,-.5u); thdraw p; thdraw p shifted (0,.2u); thdraw p shifted (0,.4u); enddef; def p_entrance_UIS (expr pos,theta,sc,al)= U:=(.2u,.5u); T:=identity aligned al rotated theta scaled sc shifted pos; thfill (-.2u,-.5u)--(0,.5u)--(.2u,-.5u)--cycle; enddef; def p_waterflow_paleo_UIS (expr pos,theta,sc,al)= U:=(.2u,u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,-u)--(0,u); thdraw halfcircle scaled .4u shifted (0,-.4u); p:=(-.15u,.6u)--(0,u)--(.15u,.6u)--cycle; thfill p; thdraw p; enddef; def p_gradient_UIS (expr pos,theta,sc,al)= U:=(.15u,u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,-u)--(0,u); p:=(-.15u,.6u)--(0,u)--(.15u,.6u)--cycle; thfill p; thdraw p; enddef; def p_gradient_BCRA (expr pos,theta,sc,al)= U:=(.25u,0.7u); T:=identity aligned al rotated theta scaled sc shifted pos; thfill (-.25u,-0.7u)--(0,.7u)--(.25u,-.7u)--cycle; enddef; % by Philip Schuchardt def p_gradient_NSS (expr pos,theta,sc,al) = U:=(.7u, .6u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u, -.5u) -- (-.7u, -.2u); thdraw (-.2u, -.4u) -- (-.4u, .3u); thdraw (0u, -.3u) -- (0u, .6u); thdraw (.3u, -.5u) -- (.7u, -.2u); thdraw (.2u, -.4u) -- (.4u, .3u); enddef; def p_waterflow_permanent_UIS (expr pos,theta,sc,al)= U:=(.15u,.5u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:=(0,.5u){down}..(.12u,.3u)..(-.15u,.15u)..(.13u,0).. (-.08u,-.2u)..{down}(0,-.5u); p:=p rotated 180; thdraw p; thdrawoptions(); oldahlength:=ahlength; ahlength:=2.5pt*optical_zoom; thdraw arrowhead p; thfill arrowhead p; ahlength:=oldahlength; enddef; def p_waterflow_intermittent_UIS (expr pos,theta,sc,al)= thdrawoptions(dashed evenly scaled (.5 * optical_zoom)); p_waterflow_permanent_UIS (pos,theta,sc,al); thdrawoptions(); enddef; def p_airdraught_UIS (expr pos,theta,sc,al)= U:=(.2u,u); T:=identity aligned al rotated theta scaled 1 shifted pos; pickup PenC; thdraw (0,u)--(0,-0.8u); p:=(-.2u,.65u){dir 20}..{dir 90}(0,u); thdraw p; thdraw p reflectedabout (origin,(0,u)); for i:=1 upto round(3+2*mlog(sc)/mlog 2): thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u); endfor; enddef; def p_airdraught_winter_UIS (expr pos,theta,sc,al)= U:=(.2u,u); T:=identity aligned al rotated theta scaled 1 shifted pos; pickup PenC; thdraw (0,u)--(0,-0.8u); p:=(-.2u,.65u){dir 20}..{dir 90}(0,u); thdraw p; thdraw p reflectedabout (origin,(0,u)); for i:=1 upto round(3+2*mlog(sc)/mlog 2): thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u); endfor; thclean fullcircle scaled 0.6u shifted (0,0.05u); thdraw (-0.1732u,-0.05u) -- (0.1732u,0.15u); thdraw (0.1732u,-0.05u) -- (-0.1732u,0.15u); thdraw (0,-0.15u) -- (0,0.25u); enddef; def p_airdraught_summer_UIS (expr pos,theta,sc,al)= U:=(.2u,u); T:=identity aligned al rotated theta scaled 1 shifted pos; pickup PenC; thdraw (0,u)--(0,-0.8u); p:=(-.2u,.65u){dir 20}..{dir 90}(0,u); thdraw p; thdraw p reflectedabout (origin,(0,u)); for i:=1 upto round(3+2*mlog(sc)/mlog 2): thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u); endfor; thclean fullcircle scaled 0.6u shifted (0,0.05u); thdraw (-0.1732u,-0.05u) -- (0.1732u,0.15u); thdraw (0.1732u,-0.05u) -- (-0.1732u,0.15u); thdraw (0,-0.15u) -- (0,0.25u); thclean fullcircle scaled 0.3u shifted (0,0.05u); thdraw fullcircle scaled 0.2u shifted (0,0.05u); enddef; def p_station_fixed_ASF (expr pos)= T:=identity shifted pos; pickup PenD; pair z; z:=(0,.2u); thclean z -- (z rotated 120) -- (z rotated 240) -- cycle; thdraw z -- (z rotated 120) -- (z rotated 240) -- cycle; thdraw origin; enddef; def p_station_painted_SKBB (expr pos)= T:=identity shifted pos; pickup PenC; thclean fullcircle scaled 0.25u; thdraw fullcircle scaled 0.25u; enddef; def p_station_natural_ASF (expr pos)= T:=identity shifted pos; pickup PenD; thclean fullcircle scaled .3u; thdraw fullcircle scaled .3u; thdraw origin; enddef; def p_station_temporary_ASF (expr pos)= T:=identity shifted pos; pickup PenD; p:=(-.2u,0)--(.2u,0); thdraw p; thdraw p rotated 90; thclean fullcircle scaled .16u; pickup PenC; thdraw origin; enddef; let p_station_temporary_SKBB = p_station_painted_SKBB; def p_steps_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (-.3u,.3u)--(-.3u,.1u)--(-.1u,.1u)--(-.1u,-.1u)-- (.1u,-.1u)--(.1u,-.3u)--(.3u,-.3u); enddef; def p_fixedladder_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (-.15u,-.4u)--(-.15u,.4u); thdraw (.15u,-.4u)--(.15u,.4u); thdraw (-.15u,0)--(.15u,0); thdraw (-.15u,.2u)--(.15u,.2u); thdraw (-.15u,-.2u)--(.15u,-.2u); enddef; def p_ropeladder_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (.1u,-.4u)..(.2u,-.2u)..(.1u,.2u)..(.2u,.4u); thdraw (-.2u,-.4u)..(-.1u,-.2u)..(-.2u,.2u)..(-.1u,.4u); thdraw (-.2u,.2u)--(.1u,.2u); thdraw (-.15u,0)--(.15u,0); thdraw (-.1u,-.2u)--(.2u,-.2u); enddef; def p_bridge_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (-.3u,.2u)--(-.2u,.1u)--(.2u,.1u)--(.3u,.2u); thdraw (-.3u,-.2u)--(-.2u,-.1u)--(.2u,-.1u)--(.3u,-.2u); enddef; def p_noequipment_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; thfill (0,-.1u)--(-.05u,.3u)--(.05u,.3u)--cycle; thdraw (0,-.2u) withpen PenX; enddef; def p_anchor_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; thdraw fullcircle scaled .2u shifted (0.2u,0) withpen PenC; begingroup; interim linecap:=butt; thdraw (-.3u,0)--(.1u,0) withpen PenA; endgroup; thdraw (.1u,-.4u)--(.1u,.4u) withpen PenD; enddef; def p_traverse_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (-.25u,.05u)..(0,-.08u)..(.25u,.05u); pickup pencircle scaled .18u; thdraw (-.25u,.05u); thdraw (.25u,.05u); enddef; def p_rope_SKBB (expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (-.2u,.2u)..origin..(.1u,.1u)--(.1u,-.4u); pickup pencircle scaled .18u; thdraw (-.2u,.2u); thdraw (.1u,.1u); enddef; def p_camp_SKBB (expr pos,r,s,al) = U:=(.4u, .5u); T:=identity aligned al shifted pos; pickup PenC; thdraw (-.4u,-.4u)--(0,.5u)--(.4u,-.4u)--cycle; pickup PenD; thdraw (0,-.4u)--(0,.5u); enddef; def p_dig_UIS (expr pos,r,s,al) = U:=(.4u, .5u); T:=identity aligned al shifted pos; thfill ((-.075u,-.5u){down} .. {up}(0.075u, -.5u) -- (0.075u, .15u) -- (0.3u, 0.15u) -- (0.3u, 0.5u) -- (-.3u, .5u) -- (-.3u, .15u) -- (-.075u, .15u) -- cycle) rotated 45; enddef; def p_continuation_UIS(expr pos,theta,sc,al) = U:=(.15u,.3u); T:=identity aligned al shifted pos; pickup PenC; thdraw (-.1u,.2u){up}..{down}(.1u,.2u)..{down}(0,-.05u); pickup PenX; thdraw (0,-.2u); enddef; def p_station_SKBB(expr pos,mark,txt)(text flags) = T:=identity shifted pos; if mark=4: p_station_fixed(pos) elseif mark=3: p_station_natural(pos) elseif mark=2: p_station_painted(pos) elseif mark=1: p_station_temporary(pos) fi; path path_cave; path_cave = (-.3u,-.25u) -- (-.2u,-.25u){dir 135} .. (0, .25u) .. {dir 225}(.2u,-.25u) -- (.3u,-.25u); for i=flags: pickup PenX; if i="entrance": % thfill fullcircle scaled 1 cm withtransparentcolor tr_blue; thdraw path_cave; % p_label.urt(txt,pos+(0.4u,0),0,0); if not numeric txt: p_smartlabel(txt,pos); fi; elseif i="sink": thdraw path_cave cutbefore ((-u,0)--(u,0)) cutafter ((-u,0)--(u,0)); pickup PenA; thdraw (0,-.45u) -- (0,.05u) withcolor blue; thdraw (-.15u,-.02u) -- (0,.05u) -- (.15u,-.02u) withcolor blue; elseif i="spring": thdraw path_cave cutbefore ((-u,0)--(u,0)) cutafter ((-u,0)--(u,0)); pickup PenA; thdraw (0,-.45u) -- (0,.05u) withcolor blue; thdraw (-.15u,-.38u) -- (0,-.45u) -- (.15u,-.38u) withcolor blue; elseif i="doline": thdraw (-.5u,.05u){down}..(0,-0.6u)..{up}(.5u,.05u); elseif i="dig": thdraw (-.5u,.25u) -- (-.35u,.25u)--(-.23u,-.25u)--(.23u,-.25u)--(.35u,.25u)--(.5u,.25u); elseif substring(0,11) of i = "air-draught": pickup PenB; thdraw ((0,.11u){dir-120} ..{dir-70}(0,0) .. {dir-120}(0,-.11u)); thdraw ((0,.11u){dir-120} ..{dir-70}(0,0) .. {dir-120}(0,-.11u)) shifted (.11u,0); thdraw ((0,.11u){dir-120} ..{dir-70}(0,0) .. {dir-120}(0,-.11u)) shifted (-.11u,0); elseif i="continuation": if picture(txt): picture ATTR__text; ATTR__text := txt; fi; begingroup; save T; transform T; p_continuation(pos+(0,.25u),0,1,(0,1)); endgroup; if picture(txt): save ATTR__text; fi; elseif i="arch": thdraw (-.5u,-.25u)--(-.5u,.25u)--(.5u,.25u)--(.5u,-.25u)..(0,.2u)..cycle; thfill (-.5u,-.25u)--(-.5u,.25u)--(.5u,.25u)--(.5u,-.25u)..(0,.2u)..cycle; elseif i="overhang": thdraw (.2u,-.25u)--(-.2u,-.25u){up}..{right}(.2u,.25u); fi; endfor; % thdraw (0,0) withpen PenX withcolor red; enddef; def p_debug (expr col, pen, pos)= T:=identity shifted pos; thdraw origin withpen pencircle scaled if pen=0: 2pt else: 4pt fi withcolor if col=-2: (1,.85,0) elseif col=-1: black elseif col=0: red else: blue fi; enddef; def p_u(expr pos,theta,sc,al) = T:=identity shifted pos; thdraw origin withpen pencircle scaled 4pt withcolor red; enddef; def p_handrail_SKBB(expr pos,theta,sc,al) = tmph := 1 / Scale * 72 / 2.54; % 1 m height U:=(.1u, tmph); pickup PenC; T:=identity aligned al rotated theta scaled sc shifted pos; thdraw (0,0) -- (0,tmph); thdraw (0,tmph) withpen pencircle scaled .25u; enddef; def p_viaferrata_SKBB(expr pos,r,s,al) = U:=(.4u, .4u); T:=identity aligned al shifted pos; thdraw unitsquare scaled .8u shifted (-0.4u,-.4u) withpen PenD; pickup PenC; thdraw (-.15u,.15u)--(-.15u,.1u)--(.15u,.1u)--(.15u,.15u); thdraw (-.15u,-.05u)--(-.15u,-.1u)--(.15u,-.1u)--(.15u,-.05u); enddef; def p_stalagmites_UIS(expr pos,theta,sc,al) = U:=(.3u, .2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; for i=-1 upto 1: T:=identity aligned al rotated theta scaled (sc * 0.7) shifted (pos + (i * .3u, 0)); thdraw (0,.4u) -- (0,-.15u) -- (-.15u,-.4u); thdraw (0,-.15u) -- (.15u,-.4u); endfor; enddef; def p_stalactites_UIS(expr pos,theta,sc,al) = U:=(.3u, .2u); pickup PenC; for i=-1 upto 1: T:=identity aligned al rotated theta scaled (sc * 0.7) shifted (pos + (i * .3u, 0)); thdraw (0,-.4u) -- (0,.15u) -- (-.15u,.4u); thdraw (0,.15u) -- (.15u,.4u); endfor; enddef; def p_gradient_SKBB (expr pos,theta,sc,al)= U:=(.3u,.6u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,-.6u)--(-.3u,.6u); thdraw (0,-.6u)--(0,-0.2u); thdraw (.3u,-.6u)--(.3u,.6u); enddef; def p_pillars_UIS(expr pos,theta,sc,al) = U:=(.3u, .2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; for i=-1 upto 1: T:=identity aligned al rotated theta scaled (sc * 0.7) shifted (pos + (i * .3u, 0)); thdraw (0,.15u)--(0,-.15u); thdraw (-.15u,-.4u)--(0,-.15u)--(.15u,-.4u); thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u); endfor; enddef; therion/mpost/thTrans.mp0000664000175000017500000001223212047251644014376 0ustar useruser% default translations let p_station_fixed = p_station_fixed_ASF; let p_station_painted = p_station_painted_SKBB; let p_station_natural = p_station_natural_ASF; let p_station_temporary = p_station_temporary_ASF; let p_waterflow_paleo = p_waterflow_paleo_UIS; let p_waterflow_permanent = p_waterflow_permanent_UIS; let p_waterflow_intermittent = p_waterflow_intermittent_UIS; let p_stalactite = p_stalactite_UIS; let p_stalagmite = p_stalagmite_UIS; let p_pillar = p_pillar_UIS; let p_icestalactite = p_icestalactite_AUT; let p_icestalagmite = p_icestalagmite_AUT; let p_icepillar = p_icepillar_AUT; let p_curtain = p_curtain_UIS; let p_helictite = p_helictite_UIS; let p_sodastraw = p_sodastraw_UIS; let p_crystal = p_crystal_UIS; let p_flowstone = p_flowstone_UIS; let p_moonmilk = p_moonmilk_UIS; let p_wallcalcite = p_wallcalcite_UIS; let p_popcorn = p_popcorn_UIS; let p_disk = p_disk_UIS; let p_gypsum = p_gypsum_NSS; let p_aragonite = p_aragonite_NSS; let p_cavepearl = p_cavepearl_SKBB; let p_gypsumflower = p_gypsumflower_NSS; let p_rimstonepool = p_rimstonepool_ASF; let p_rimstonedam = p_rimstonedam_ASF; let p_anastomosis = p_anastomosis_UIS; let p_karren = p_karren_UIS; let p_scallop = p_scallop_UIS; let p_flute = p_flute_UIS; let p_raft = p_raft_NSS; let p_raftcone = p_raftcone_NSS; let p_spring = p_spring_SKBB; let p_sink = p_sink_SKBB; let p_narrowend = p_narrowend_UIS; let p_lowend = p_lowend_UIS; let p_flowstonechoke = p_flowstonechoke_NSS; let p_breakdownchoke = p_breakdownchoke_NSS; let p_claychoke = p_claychoke_AUT; let p_claytree = p_claytree_AUT; let p_bedrock = p_bedrock_ASF; let p_clay = p_clay_SKBB; let p_sand = p_sand_UIS; let p_pebbles = p_pebbles_UIS; let p_debris = p_debris_UIS; let p_blocks = p_blocks_UIS; let p_water = p_water_UIS; let p_ice = p_ice_UIS; let p_snow = p_snow_SKBB; let p_archeomaterial = p_archeomaterial_UIS; let p_paleomaterial = p_paleomaterial_UIS; let p_guano = p_guano_UIS; let p_vegetabledebris = p_vegetabledebris_ASF; let p_root = p_root_ASF; let p_entrance = p_entrance_UIS; let p_gradient = p_gradient_UIS; let p_rope = p_rope_SKBB; let p_fixedladder = p_fixedladder_SKBB; let p_ropeladder = p_ropeladder_SKBB; let p_steps = p_steps_SKBB; let p_bridge = p_bridge_SKBB; let p_traverse = p_traverse_SKBB; let p_anchor = p_anchor_SKBB; let p_camp = p_camp_SKBB; let p_dig = p_dig_UIS; let p_noequipment = p_noequipment_SKBB; let p_sectionarrow = p_sectionarrow_SKBB; let p_continuation = p_continuation_UIS; let p_airdraught = p_airdraught_UIS; let p_airdraught_winter = p_airdraught_winter_UIS; let p_airdraught_summer = p_airdraught_summer_UIS; let p_station = p_station_SKBB; let p_handrail = p_handrail_SKBB; let p_viaferrata = p_viaferrata_SKBB; let p_stalactites = p_stalactites_UIS; let p_stalagmites = p_stalagmites_UIS; let p_pillars = p_pillars_UIS; let l_wall_bedrock = l_wall_bedrock_UIS; let l_wall_sand = l_wall_sand_SKBB; let l_wall_clay = l_wall_clay_SKBB; let l_wall_pebbles = l_wall_pebbles_SKBB; let l_wall_debris = l_wall_debris_SKBB; let l_wall_blocks = l_wall_blocks_SKBB; let l_wall_ice = l_wall_ice_SKBB; let l_wall_underlying = l_wall_underlying_UIS; let l_wall_unsurveyed = l_wall_unsurveyed_SKBB; let l_wall_presumed = l_wall_presumed_UIS; %let l_wall_invisible = l_wall_invisible; let l_wall_pit = l_wall_pit_AUT; let l_wall_overlying = l_wall_overlying_AUT; let l_wall_flowstone = l_wall_flowstone_AUT; let l_wall_moonmilk = l_wall_moonmilk_AUT; let l_waterflow_permanent = l_waterflow_permanent_UIS; let l_waterflow_intermittent = l_waterflow_intermittent_SKBB; let l_waterflow_conjectural = l_waterflow_conjectural_SKBB; let l_border_visible = l_border_visible_SKBB; let l_border_temporary = l_border_temporary_SKBB; let l_border_presumed = l_border_presumed_SKBB; %let l_border_invisible = l_border_invisible; let l_floorstep = l_floorstep_UIS; let l_pit = l_pit_UIS; let l_ceilingstep = l_ceilingstep_SKBB; let l_chimney = l_chimney_UIS; let l_overhang = l_overhang_SKBB; let l_slope = l_slope_SKBB; let l_ceilingmeander = l_ceilingmeander_SKBB; let l_floormeander = l_floormeander_SKBB; let l_contour = l_contour_SKBB; let l_rockborder = l_rockborder_UIS; let l_rockedge = l_rockedge_UIS; let l_flowstone = l_flowstone_UIS; let l_moonmilk = l_moonmilk_UIS; let l_section = l_section_SKBB; let l_survey_cave = l_survey_cave_SKBB; let l_survey_surface = l_survey_surface_SKBB; let l_arrow = l_arrow_SKBB; let l_gradient = l_gradient_UIS; let l_mapconnection = l_mapconnection_SKBB; let l_handrail = l_handrail_SKBB; let l_steps = l_steps_SKBB; let l_fixedladder = l_fixedladder_SKBB; let l_ropeladder = l_ropeladder_SKBB; let l_rope = l_rope_SKBB; let l_viaferrata = l_viaferrata_SKBB; let a_water = a_water_UIS; let a_sump = a_sump_UIS; let a_sand = a_sand_UIS; let a_debris = a_debris_SKBB; let a_blocks = a_blocks_SKBB; let a_snow = a_snow_SKBB; let a_ice = a_ice_SKBB; let a_pebbles = a_pebbles_SKBB; let a_clay = a_clay_SKBB; let a_bedrock = a_bedrock_SKBB; let a_flowstone = a_flowstone_ASF; let a_moonmilk = a_moonmilk_SKBB; let a_dimensions = a_dimensions_SKBB; let s_northarrow = s_northarrow_SKBB; let s_scalebar = s_scalebar_SKBB; let s_hgrid = s_hgrid_SM; let s_vgrid = s_vgrid_SM; therion/mpost/Makefile0000664000175000017500000000002707762550030014053 0ustar useruserall: perl genmpost.pl therion/mpost/thLine.mp0000664000175000017500000006762612054203266014212 0ustar useruser%% therion source code %% %% This file defines macros for line symbols %% %% $Date: 2003/07/01 09:06:44 $ %% $RCSfile: thLine.mp,v $ %% $Revision: 1.4 $ %% %% Copyright (C) 2000 Martin Budaj %% %% -------------------------------------------------------------------- %% This program is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2 of the License, or %% any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %% -------------------------------------------------------------------- % some definitions % adjust step according to the length of the path; return at least two steps vardef adjust_step (expr len, s) = if s <= len/2: len / (floor(len / s)) else: len/2 fi enddef; def mark_(expr p,t,l) = thdraw (point t of p) -- ((point t of p) + l * unitvector(thdir(p,t) rotated 90)); enddef; vardef thdir (expr p,t) = % 1 * epsilon caused problems in scales < 1:1000 % n * epsilon is enough for scale 1:(n*1000) if arclength(p)=0: hide(thwarning("unable to determine direction on zero-length path")) (0,1) else: % ((direction t-100*epsilon of p) + (direction t+100*epsilon of p)) / 2 postcontrol (t+1000*epsilon) of p - precontrol (t-1000*epsilon) of p % direction t of p fi enddef; % walls: def l_wall_bedrock_UIS (expr P) = T:=identity; pickup PenA; thdraw P; enddef; def l_wall_sand_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.1u); pickup PenB; forever: t := arctime cas of P; thdraw ((point t of P) + (uniformdeviate 1) * .4u * unitvector(thdir(P,t) rotated -90)); cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; pickup PenA; thdraw P; enddef; def l_wall_pebbles_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .35u); pickup PenC; q:=superellipse((.2u,0),(0,.1u),(-.2u,0),(0,.-.1u),.75); forever: t := arctime (cas + mojkrok/2) of P; thdraw q randomized (u/20) rotated (angle(thdir(P,t)) + (normaldeviate*40)) shifted point t of P; cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; def l_wall_clay_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .5u); pickup PenC; q := (-0.15u,0){up}..{down}origin..{up}(0.15u,0); forever: t := arctime (cas + mojkrok/2) of P; thdraw q shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; pickup PenA; thdraw P; enddef; def l_wall_debris_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .4u); pickup PenC; % q := ((-.1u,-.15u)--(.2,.03u)--(-.2u,.15u)--cycle) scaled 1.5; q := ((-.2u,-.1u)--(.2u,-.1u)--(0,.2u)--cycle) scaled 1.1; forever: t := arctime (cas + mojkrok/2) of P; thdraw q randomized (u/10) rotated uniformdeviate (360) shifted point t of P; cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; def l_wall_blocks_SKBB (expr P) = % pickup PenD; % draw P withcolor red; T:=identity; cas := 0; dlzka := arclength P; if dlzka > 0: mojkrok:=adjust_step(dlzka, 1.5u); pickup PenA; forever: t1 := arctime (cas + mojkrok*1/10) of P; t2 := arctime (cas + mojkrok*9/10) of P; q := ((point t1 of P) + .4u * unitvector(thdir(P,t1) rotated -90)) -- (subpath (t1,t2) of P) -- ((point t2 of P) + .4u * unitvector(thdir(P,t2) rotated -90)); thdraw q randomized (u/6); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; fi; enddef; def l_wall_ice_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .5u); pickup PenC; p := (-.1u,0)--(.1u,0); q := (0,-.1u)--(0,.1u); forever: t := arctime (cas + mojkrok/2) of P; thdraw p shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); thdraw q shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; pickup PenA; thdraw P; enddef; def l_wall_underlying_UIS (expr P) = T:=identity; pickup PenA; thdraw P dashed evenly scaled optical_zoom; enddef; def l_wall_unsurveyed_SKBB (expr P) = T:=identity; pickup PenC; thdraw P; enddef; def l_wall_presumed_UIS (expr P) = T:=identity; pickup PenA; thdraw P dashed evenly scaled (2*optical_zoom); enddef; % other line symbols def l_pit_UIS (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.25u); pickup PenD; forever: t := arctime cas of P; mark_ (P,t,0.2u); cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; pickup PenC; thdraw P; enddef; let l_floorstep_UIS = l_pit_UIS; def l_overhang_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.3u); pickup PenC; t1:=0; forever: t := arctime (cas + mojkrok/2) of P; t2 := arctime (cas + mojkrok) of P; thfill (subpath (t1,t2) of P) -- ((point t of P) + .3u * unitvector(thdir(P,t) rotated 90)) -- cycle; cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors t1:=t2; endfor; thdraw P; enddef; def l_chimney_UIS (expr P) = T:=identity; pickup PenC; thdraw P dashed evenly scaled optical_zoom; enddef; def l_ceilingstep_SKBB (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.8u); pickup PenC; forever: t1 := arctime (cas + mojkrok*1/5) of P; t := arctime (cas + mojkrok/2) of P; t2 := arctime (cas + mojkrok*4/5) of P; thdraw (subpath (t1,t2) of P); mark_ (P,t,0.2u); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; def l_ceilingmeander_SKBB (expr P) = pair Pp; pair Pd; pair Pv; T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.8u); pickup PenC; forever: t := arctime (cas + mojkrok/2) of P; Pp := (point t of P); Pd := unitvector(thdir(P,t)); Pv := Pd rotated 90; thdraw (Pp + 0.1u * Pv) -- (Pp + 0.2u * Pv); thdraw (Pp + 0.2u * Pv + 0.2u * Pd) -- (Pp + 0.2u * Pv - 0.2u * Pd); thdraw (Pp - 0.1u * Pv) -- (Pp - 0.2u * Pv); thdraw (Pp - 0.2u * Pv + 0.2u * Pd) -- (Pp - 0.2u * Pv - 0.2u * Pd); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; %Bruce Mutton 2012.06.16 uses general code for l_ceilingmeander_SKBB defined in therion source code by Martin Budaj 5.3.9 % but ticks on outside (rock) side of lines def l_ceilingmeander_UIS (expr P) = pair Pp; pair Pd; pair Pv; T:=identity; cas := 0; % cursor to step along path dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.8u); % symbol length nudged to be multiple of path length pickup PenC; forever: t := arctime (cas + mojkrok/2) of P; Pp := (point t of P); Pd := unitvector(thdir(P,t)); Pv := Pd rotated 90; thdraw (Pp + 0.2u * Pv) -- (Pp + 0.3u * Pv); % add 0.1u to each moves ticks outside thdraw (Pp + 0.2u * Pv + 0.2u * Pd) -- (Pp + 0.2u * Pv - 0.2u * Pd); thdraw (Pp - 0.2u * Pv) -- (Pp - 0.3u * Pv); % subtract 0.1u to each moves ticks outside thdraw (Pp - 0.2u * Pv + 0.2u * Pd) -- (Pp - 0.2u * Pv - 0.2u * Pd); cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; let l_ceilingmeander_NZSS = l_ceilingmeander_UIS; %Bruce Mutton 2012.06.16 uses general code for l_ceilingstep_SKBB defined in therion source code by Martin Budaj 5.3.9 % but ticks on righthand (rock) side of line def l_ceilingstep_UIS (expr P) = T:=identity; cas := 0; % cursor to step along path dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.8u); % symbol length nudged to be multiple of path length pickup PenC; forever: t1 := arctime (cas + mojkrok*1/5) of P; t := arctime (cas + mojkrok/2) of P; t2 := arctime (cas + mojkrok*4/5) of P; thdraw (subpath (t1,t2) of P); mark_ (P,t,-0.2u); % change sign to -0.2u cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; let l_ceilingstep_NZSS = l_ceilingstep_UIS; %Bruce Mutton 2012.06.10 uses general code for l_pit_UIS defined in therion source code by Martin Budaj 5.3.9 % dots on righthand (rock) side of line spaced 0.2u, 0.2u same as floor-step ticks def l_chimney_NZSS (expr P) = T:=identity; cas := 0; % cursor to step along path dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.25u); % symbol length nudged to be multiple of path length q:= (0.20u,-0.20u) -- (0.21u,-0.21u); % dot pickup PenC; %2nd thinnest pen forever: t := arctime cas of P; thdraw q rotated angle(thdir(P,t)) shifted (point t of P ); % draw dots cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; pickup PenB; %2nd thickest pen thdraw P; %continuous line enddef; %Bruce Mutton 2010.06.20 uses general code and adjust_step defined in therion source code by Martin Budaj %for Therion 5.3.8 def l_wall_presumed_NZSS (expr P) = T:=identity; cas := 0; % cursor to step along path dlzka := arclength P; mojkrok:=adjust_step(dlzka, 1.5u); % symbol length nudged to be multiple of path length q := (-0.2u,-0.4u)--(0,0)--(0.2u,-0.4u); % define v shape forever: t1 := arctime (cas + mojkrok*1/5) of P; t := arctime (cas + mojkrok/2) of P; t2 := arctime (cas + mojkrok*4/5) of P; pickup PenA; % thick thdraw (subpath (t1,t2) of P); % dash pickup PenC; % thin thdraw q rotated angle(thdir(P,t)) shifted (point t of P ); % v shape cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; def l_floormeander_SKBB (expr P) = pair Pp; pair Pd; pair Pv; pair PPp; pair PPd; pair PPv; T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.25u); pickup PenC; forever: t := arctime cas of P; Pp := (point t of P); Pd := unitvector(thdir(P,t)); Pv := Pd rotated 90; thdraw (Pp + 0.1u * Pv) -- (Pp + 0.2u * Pv); thdraw (Pp - 0.1u * Pv) -- (Pp - 0.2u * Pv); if cas > 0: thdraw (PPp + 0.2u * PPv) -- (Pp + 0.2u * Pv); thdraw (PPp - 0.2u * PPv) -- (Pp - 0.2u * Pv); fi; PPp := Pp; PPd := Pd; PPv := Pv; cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; enddef; boolean alw_perpendicular; def l_slope_SKBB (expr P,S)(text Q) = %show Q; T:=identity; numeric dirs[]; numeric lengths[]; for i=Q: dirs[redpart i]:=greenpart i; lengths[redpart i]:=bluepart i; endfor; li:=length(P); % last alw_perpendicular:=true; for i=0 upto li: if unknown dirs[i]: dirs[i]:=-1; else: if dirs[i]>-1: dirs[i]:=((90-dirs[i]) - angle(thdir(P,i))) mod 360; alw_perpendicular:=false; fi; fi; if unknown lengths[i]: lengths[i]:=-1; fi; endfor; %for i=0 upto li: show dirs[i]; endfor; ni:=0; % next pi:=0; % previous for i=0 upto li: d:=dirs[i]; if d=-1: if (i=0) or (i=li): dirs[i] := angle(thdir(P,i) rotated 90) mod 360; pi:=i; else: if ni<=i: for j=i upto li: ni:=j; exitif dirs[j]>-1; endfor; fi; w:=arclength(subpath(pi,i) of P) / arclength(subpath(pi,ni) of P); dirs[i]:=w[dirs[pi],dirs[ni]]; % if (dirs[i]-angle(thdir(P,i))) mod 360>180: % dirs[i]:=w[dirs[ni],dirs[pi]]; % message("*******"); % fi; fi; else: pi:=i; fi; endfor; %for i=0 upto li: show dirs[i]; endfor; ni:=0; % next pi:=0; % previous for i=0 upto li: l:=lengths[i]; if l=-1: if (i=0) or (i=li): lengths[i] := 1cm; % should never happen! thwarning("slope width at the end point not specified"); pi:=i; else: if ni<=i: for j=i+1 upto li: ni:=j; exitif lengths[j]>-1; endfor; fi; w:=arclength(subpath(pi,i) of P) / arclength(subpath(pi,ni) of P); lengths[i]:=w[lengths[pi],lengths[ni]]; pi:=i; fi; else: pi:=i; fi; endfor; % for i=0 upto li: show lengths[i]; endfor; T:=identity; boolean par; offset:=0; dlzka := (arclength P); if dlzka>3u: offset := 0.3u; elseif dlzka>u: offset := 0.1u; fi; dlzka:=dlzka-2offset; cas := offset; mojkrok:=adjust_step(dlzka,1.4u) / 2; pickup PenD; par := false; forever: t := arctime cas of P; if t mod 1>0: % not a key point w := (arclength(subpath(floor t,t) of P) / arclength(subpath(floor t,ceiling t) of P)); if alw_perpendicular: a := 90; else: a := w[dirs[floor t],dirs[ceiling t]]; fi; l := w[lengths[floor t],lengths[ceiling t]]; else: if alw_perpendicular: a := 90; else: a:= dirs[t]; fi; l:=lengths[t]; fi; a := a + angle(thdir(P,t)); thdraw (point t of P) -- ((point t of P) + if par: 0.333 * fi l * unitvector(dir(a))); cas := cas + mojkrok; par := not par; exitif cas > dlzka + offset + 0.1mm; % for rounding errors endfor; if S = 1: pickup PenC; draw P fi; %pickup pencircle scaled 3pt; %for i=0 upto li: draw point i of P; endfor; enddef; def l_slope_BCRA (expr P,S)(text Q) = %show Q; T:=identity; numeric dirs[]; numeric lengths[]; for i=Q: dirs[redpart i]:=greenpart i; lengths[redpart i]:=bluepart i; endfor; li:=length(P); % last alw_perpendicular:=true; for i=0 upto li: if unknown dirs[i]: dirs[i]:=-1; else: if dirs[i]>-1: dirs[i]:=((90-dirs[i]) - angle(thdir(P,i))) mod 360; alw_perpendicular:=false; fi; fi; if unknown lengths[i]: lengths[i]:=-1; fi; endfor; %for i=0 upto li: show dirs[i]; endfor; ni:=0; % next pi:=0; % previous for i=0 upto li: d:=dirs[i]; if d=-1: if (i=0) or (i=li): dirs[i] := angle(thdir(P,i) rotated 90) mod 360; pi:=i; else: if ni<=i: for j=i upto li: ni:=j; exitif dirs[j]>-1; endfor; fi; w:=arclength(subpath(pi,i) of P) / arclength(subpath(pi,ni) of P); dirs[i]:=w[dirs[pi],dirs[ni]]; % if (dirs[i]-angle(thdir(P,i))) mod 360>180: % dirs[i]:=w[dirs[ni],dirs[pi]]; % message("*******"); % fi; fi; else: pi:=i; fi; endfor; %for i=0 upto li: show dirs[i]; endfor; ni:=0; % next pi:=0; % previous for i=0 upto li: l:=lengths[i]; if l=-1: if (i=0) or (i=li): lengths[i] := 1cm; % should never happen! thwarning("slope width at the end point not specified"); pi:=i; else: if ni<=i: for j=i+1 upto li: ni:=j; exitif lengths[j]>-1; endfor; fi; w:=arclength(subpath(pi,i) of P) / arclength(subpath(pi,ni) of P); lengths[i]:=w[lengths[pi],lengths[ni]]; pi:=i; fi; else: pi:=i; fi; endfor; % for i=0 upto li: show lengths[i]; endfor; T:=identity; boolean par; offset:=0; dlzka := (arclength P); if dlzka>3u: offset := 0.3u; elseif dlzka>u: offset := 0.1u; fi; dlzka:=dlzka-2offset; cas := offset; mojkrok:=adjust_step(dlzka,1.4u) / 2; pickup PenD; par := false; forever: t := arctime cas of P; if t mod 1>0: % not a key point w := (arclength(subpath(floor t,t) of P) / arclength(subpath(floor t,ceiling t) of P)); if alw_perpendicular: a := 90; else: a := w[dirs[floor t],dirs[ceiling t]]; fi; l := w[lengths[floor t],lengths[ceiling t]]; else: if alw_perpendicular: a := 90; else: a:= dirs[t]; fi; l:=lengths[t]; fi; a := a + angle(thdir(P,t)); if par: thfill (point t of P) + mojkrok/2.5 * unitvector(dir(a+90))-- ((point t of P) + l * unitvector(dir(a))) -- (point t of P) + mojkrok/2.5 * unitvector(dir(a-90)) -- cycle; fi; cas := cas + mojkrok; par := not par; exitif cas > dlzka + offset + 0.1mm; % for rounding errors endfor; enddef; def l_contour_UIS(expr P)(text txt) = T:=identity; pickup PenD; thdraw P; for pnt=txt: if pnt=-2: mark_(P,arctime(arclength(P)/2) of P, 0.2u); elseif pnt>=0: mark_(P,pnt,0.2*u); fi; exitif pnt<0; endfor; enddef; def l_contour_SKBB(expr P)(text txt) = T:=identity; pickup PenD; thdraw P; for pnt=txt: if (pnt=-2) or (pnt=-1): mark_(P,arctime(arclength(P)/2) of P, 0.2u); elseif pnt>=0: mark_(P,pnt,0.2*u); fi; exitif pnt<0; endfor; enddef; def l_rockborder_UIS (expr P) = T:=identity; pickup PenC; if cycle P: thclean P fi; thdraw P; enddef; def l_rockedge_UIS (expr P) = T:=identity; pickup PenD; thdraw P; enddef; def l_border_visible_SKBB (expr Path) = T:=identity; pickup PenC; draw Path; enddef; def l_border_temporary_SKBB (expr Path) = T:=identity; pickup PenC; draw Path dashed evenly scaled optical_zoom; enddef; def l_flowstone_UIS (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .7u); if (cycle P) and (dlzka < 3.5u): % make at least 5 curls on a cyclic path mojkrok := dlzka/5; fi; pickup PenC; t1:=0; forever: t2 := arctime (cas + mojkrok) of P; thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 60)} .. {dir (angle(thdir(P,t2)) - 60)}(point t2 of P); cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors t1:=t2; endfor; enddef; def l_moonmilk_UIS (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .3u); pickup PenC; t1:=0; forever: t2 := arctime (cas + mojkrok) of P; thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 80)} .. {dir (angle(thdir(P,t2)) - 80)}(point t2 of P); cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors t1:=t2; endfor; enddef; def l_survey_surface_SKBB (expr P) = T:=identity; thdrawoptions(dashed withdots scaled (0.2 * optical_zoom) withpen PenC); thdraw P; thdrawoptions(); enddef; def l_survey_cave_SKBB (expr P) = T:=identity; pickup PenC; if ATTR__scrap_centerline: thdraw P; else: PolygonLine:=.8u; pair zz[]; for t = 0 upto length P - 1: zz1 := point t of P; zz2 := point t+1 of P; if length (zz2-zz1) > 2*PolygonLine: thdraw zz1 -- zz1 + PolygonLine * unitvector(zz2 - zz1); thdraw zz2 -- zz2 + PolygonLine * unitvector(zz1 - zz2); else: thdraw zz1 -- zz2; fi; endfor; fi; enddef; def l_survey_cave_UIS (expr P) = T:=identity; pair zz[]; pickup PenC; for t = 0 upto length P - 1: zz1 := point t of P; zz2 := point t+1 of P; draw zz1 -- zz2; endfor; enddef; def l_waterflow_permanent_UIS (expr Path) = path ppp; T:=identity; cas := 0; dlzka := arclength Path; mojkrok:=adjust_step(dlzka, 0.5u); pickup PenD; vardef azim = 50 + 15*normaldeviate enddef; az1 := azim; sgn := 1; ppp := point 0 of Path; forever: t1 := arctime cas of Path; t2 := arctime (cas+mojkrok) of Path; if cas+1.1*mojkrok > dlzka: az2 := 0; else: az2 := azim; fi; d1 := angle(thdir(Path,t1)) + sgn * az1; d2 := angle(thdir(Path,t2)) - sgn * az2; ppp := ppp & (point t1 of Path){dir d1} .. {dir d2}(point t2 of Path); az1 := az2; sgn := -1 * sgn; cas := cas + mojkrok; exitif cas > dlzka + mojkrok/3; % for rounding errors endfor; % drawarrow ppp; thdraw ppp; thdrawoptions(); oldahlength:=ahlength; ahlength:=ahlength*optical_zoom; thdraw arrowhead ppp; thfill arrowhead ppp; ahlength:=oldahlength; enddef; def l_waterflow_intermittent_SKBB (expr Path) = thdrawoptions(dashed evenly scaled optical_zoom); l_waterflow_permanent_UIS (Path); thdrawoptions(); enddef; def l_waterflow_conjectural_SKBB (expr Path) = thdrawoptions(dashed withdots scaled (0.5 * optical_zoom) withpen PenB); l_waterflow_permanent_UIS (Path); thdrawoptions(); enddef; def l_invisible (expr P) = enddef; def l_undefined (expr P) = T:=identity; pickup PenC; thdraw P withcolor red; thwarning("undefined line symbol used"); enddef; % Q = 0 -- no arrows % 1 -- end % 2 -- begin % 3 -- both def l_arrow_SKBB (expr P, Q) = T:=identity; pickup PenC; thdraw P; p := (-.1u,-.25u)--(0,0)--(.1u,-.25u); if odd Q: draw p rotated (angle(thdir(P,0))+90) shifted (point 0 of P); fi; if Q>1: draw p rotated (angle(thdir(P,length P))-90) shifted (point infinity of P); fi; enddef; def l_mapconnection_SKBB (expr P) = thdrawoptions(dashed withdots scaled (0.5 * optical_zoom) withpen PenB); l_arrow_SKBB(P,3); thdrawoptions(); enddef; def l_section_SKBB (expr P)(text txt) = T:=identity; path Q; Q = punked P; pickup PenC; for t = 0 upto length P - 1: pair zz[]; zz1 := point t of P; zz2 := point t+1 of P; zz3 := postcontrol t of P; zz4 := precontrol t+1 of P; if (length(zz3-1/3[zz1,zz2]) > 0.1pt) or (length(zz4-2/3[zz1,zz2]) > 0.1pt): zz5 = whatever[zz1,zz2]; (zz3-zz5) = whatever * (zz1-zz2) rotated 90; draw zz1--zz5; zz6 = whatever[zz1,zz2]; (zz4-zz6) = whatever * (zz1-zz2) rotated 90; draw zz2--zz6; else: draw zz1--zz2; fi; endfor; for pnt=txt: if pnt=-1: else: T:=identity rotated angle(thdir(Q,pnt)) shifted (point pnt of Q); pickup PenC; thdraw (0,0)--(0,.8u); thdraw (-.1u,.55u)--(0,.8u)--(.1u,.55u); fi; exitif pnt=-1; endfor; enddef; let l_border_invisible = l_invisible; let l_wall_invisible = l_invisible; def l_debug (expr col, pen, P) = T:=identity; pickup if pen=0: PenD else: PenB fi; thdraw P withcolor if col=-2: (1,.85,0) elseif col=-1: black elseif col=0: red else: blue fi; enddef; def l_u (expr P) = T:=identity; pickup PenA; thdraw P withcolor red; enddef; def l_gradient_UIS (expr P) = T:=identity; pickup PenC; thdraw P; p:=(-.15u,-.4u)--(0,0)--(.15u,-.4u)--cycle; thfill (p rotated (angle(thdir(P,length P))-90) shifted (point infinity of P)); thdraw (p rotated (angle(thdir(P,length P))-90) shifted (point infinity of P)); enddef; def l_gradient_BCRA (expr P) = T:=identity; pickup PenC; for t = 0 upto length P - 1: pair zz[]; zz1 := point t of P; zz2 := point t+1 of P; zz3 := unitvector(zz2 - zz1); thfill zz1 + u/3 * zz3 + .25u * (zz3 rotated 90) -- zz2 - u/3 * zz3 -- zz1 + u/3 * zz3 + .25u * (zz3 rotated -90) -- cycle; endfor; enddef; def l_rope_SKBB (expr P,exact) = T:=identity; pickup PenC; if exact: draw P; else: d:=0.5u; for i:=0 upto (length P - 2): x1 := xpart point i of P; y1 := ypart point i of P; x2 := xpart point i+1 of P; y2 := ypart point i+1 of P; dx1:=x1; dy1:=y1; x1:=0; y1:=0; x2:=x2-dx1; y2:=y2-dy1; if y2 > y1: y3 := y1 - d; x3 := x1 + (x2-x1)*sqrt(d)/(sqrt(d)+sqrt(y2-y1+d)); else: y3 := y2 - d; x3 := x1 + (x2-x1)*sqrt(y1-y2+d)/(sqrt(d)+sqrt(y1-y2+d)); fi; numeric a,b,c; a*x1/10*x1 + b/10*x1 + c/10 = y1/10; a*x2/10*x2 + b/10*x2 + c/10 = y2/10; a*x3/10*x3 + b/10*x3 + c/10 = y3/10; draw (x1+dx1,y1+dy1) for t = x1 step (x2-x1)/20 until x2+10*epsilon: -- (t+dx1,a*t*t+b*t+c+dy1) endfor; endfor; pair x; x = point (length P)-1 of P + whatewer * down; x = point (length P) of P + whatever * right; draw point (length P)-1 of P -- x; % thdraw point length P of P withpen pencircle scaled 0.3u withcolor red; fi; for i:=0 upto length P if not exact: -1 fi: thdraw point i of P withpen pencircle scaled 0.3u; endfor; enddef; def l_border_presumed_SKBB (expr Path) = T:=identity; pickup PenC; draw Path dashed evenly scaled (0.25 * optical_zoom); enddef; def l_steps_SKBB (expr P) = if known ATTR_c: c := scantokens ATTR_c; else: c := 2; fi; if ATTR__elevation: if (c < 2): thwarning("Invalid stairs definition (c<2)"); pickup PenA; draw P withcolor red; else: path PP; if (ypart point 0 of P) < (ypart point length P of P): PP := P; else: PP := reverse P; fi; path p; for j:=0 upto ((length PP) - 1): p := (point j of PP) -- (point (j + 1) of PP); c := ceiling(abs((ypart point 0 of p) - (ypart point length p of p)) / (0.2 / Scale * 72 / 2.54)); % 20 cm height if (c < 2): c:=2 fi; pair cp; cp = point length p of p - point 0 of p; dx := (xpart cp) / c; dy := (ypart cp) / c; cp := point 0 of p; for i:= 0 upto c - 1: l_border_visible(cp -- cp + (0,dy) -- cp + (dx,dy)); cp := cp + (dx, dy); endfor; %draw P; endfor; fi; else: if known ATTR_l: l := scantokens ATTR_l; else: l := (length(P)-2)/2; fi; if ((length(P) < 4) or (c < 2)) or ((odd length P) and (not known ATTR_l)): thwarning("Invalid stairs definition" if c<2: &" (c<2)" fi); pickup PenA; draw P withcolor red; else: path p, q; p = subpath (1, 1+l) of P; q = reverse subpath (l+2, length(P)) of P; lp := arclength(p); lq := arclength(q); for i=1 upto c: l_border_visible(point(arctime ((i-1)/(c-1)*lp) of p) of p -- point(arctime ((i-1)/(c-1)*lq) of q) of q); endfor; l_border_visible(p); l_border_visible(q); drawoptions(withcolor 0.3*white); %p_label(decimal c, point 0.5 of P, 0, 6); drawoptions(); fi; fi; enddef; def l_handrail_SKBB (expr P) = if ATTR__elevation: T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 1u); pickup PenD; pair tmppoint; tmph := 1 / Scale * 72 / 2.54; % 1 m height tmppoint:=(point 0 of P) +(0,tmph); forever: t := arctime cas of P; draw point t of P -- (point t of P)+(0,tmph) withpen PenD; if cas > 0: draw tmppoint -- (point t of P)+(0,tmph) withpen PenC; tmppoint := (point t of P)+(0,tmph); fi; cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; else: T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, u); pickup PenD; forever: t := arctime cas of P; thdraw point t of P withpen pencircle scaled .25u; cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; pickup PenC; thdraw P; fi; enddef; def l_fixedladder_SKBB (expr P) = pickup PenD; draw P withcolor red; enddef; def l_ropeladder_SKBB (expr P) = pickup PenD; draw P withcolor red; enddef; def l_viaferrata_SKBB (expr P) = pickup PenD; draw P withcolor red; enddef; therion/mpost/therion.mp0000664000175000017500000006747312340611132014430 0ustar useruser%% therion source code %% %% therion.mp %% %% This file defines low-level MetaPost macros and variables required %% for generation of map symbols %% %% $Date: 2003/07/01 09:06:44 $ %% $RCSfile: therion.mp,v $ %% $Revision: 1.3 $ %% %% Copyright (C) 2000-2003 Martin Budaj %% %% Some macros are adapted from MPATTERN package of P. Bolek %% %% Some macros are used from MetaFun package of H. Hagen %% %% -------------------------------------------------------------------- %% This program is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2 of the License, or %% any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %% -------------------------------------------------------------------- % This file defines low level macros used for map signatures in Therion. % Before loading this file set `Scale' variable to numeric value % representing denominator of the scale ratio. Internal variable % `prologues' is set to 1 by this file. This module loads also % symbol libraries. tracingstats:=1; prologues:=0; if known Background: background:=Background fi; %TrueScale:=Scale; % @VARIABLE % symbol_scale -- % % internal numeric; in map symbol definitions used for scaling % in T transformation; recommended % values are 1 or 2. %newinternal symbol_scale; %symbol_scale := 1; % @VARIABLE % fill_only -- % % boolean, used in thdraw and % thpattfill commands. When set to false, it has % no effect, when it is true, it supresses all drawing % commands with exception of thpermanentfill, so that only filled % areas are drawn boolean fill_only, horiz_labels, transparency; fill_only := false; horiz_labels:=true; transparency:=false; string ATTR__id, ATTR__survey, ATTR__scrap, NorthDir; boolean ATTR__scrap_centerline; picture ATTR__text; numeric ATTR__height; boolean ATTR__elevation; ATTR__scrap_centerline := false; ATTR__height:=0; ATTR__elevation:=false; boolean ATTR__shotflag_splay; ATTR__shotflag_splay:=false; boolean ATTR__shotflag_duplicate; ATTR__shotflag_duplicate:=false; boolean ATTR__shotflag_approx; ATTR__shotflag_approx:=false; boolean ATTR__stationflag_splay; ATTR__stationflag_splay:=false; color label_fill_color, label_fill_color_tmp; label_fill_color := (1.0, 1.0, 1.0); def push_label_fill_color(expr r,g,b) = label_fill_color_tmp := label_fill_color; label_fill_color := (r,g,b); enddef; def pop_label_fill_color = label_fill_color := label_fill_color_tmp; enddef; def process_filledlabel(expr cent, rot) = begingroup; interim bboxmargin:=2.0bp; q:=((bbox lab) smoothed 2) rotatedaround (cent, rot); fill q withcolor label_fill_color; draw lab rotatedaround (cent, rot); write_circ_bbox(q); % without corners smoothing it was enough to use % write_bbox(q); endgroup; enddef; numeric area_border_errors; area_border_errors = 0; % @VARIABLE % last_write -- % % numeric; charcode of last figure which contained % write_bbox macro; this value is used by % close_file macro. Initially set to -1. numeric last_write; last_write = -1; % @VARIABLE % strut_string -- % % string containing combination of the "highest" and "lowest" character % in used font; it's used by free_text macro. %string strut_string; %strut_string = "(È"; % @VARIABLE % file_name -- % % string, name of file, where write_bbox macro writes % text clipping path % @VARIABLE % s ch -- % % string, temporary string/char variables string s, ch, file_name, bg_name, clip_name, lang, diff_pos, diff_neg, current_scrap, current_src; % @VARIABLE % u v w -- % % internal numeric variables used as basic length units for drawing; % they are set by initialize macro. %
  • u -- normal unit decreasing with increasing scale %
  • v -- like u, but can increase drammaticaly % when some limit is encountered (to get effects like logarithmic % scale) %
  • w -- nearly constant at all scales %
% @VARIABLE % legend_scale -- % % numeric, length of the longer side of signatures' legend box newinternal legend_scale, u,v,w; % @VARIABLE % lab Lab -- % % picture, in which are saved typeset labels picture lab, Lab; % @VARIABLE % T -- % % transformation, defines transformation function for transforming % every argument of thfill % macros transform T; % @VARIABLE % p,q -- % % path, for saving temporary paths path p,q; % @MACRO % initialize -- % % initializes basic length units (u,v,w) and pens used % in map symbols according to scale. Five circular pens are defined: %
  • PenA -- thick; for outlines %
  • PenB, PenC -- thinner; for pits, symbols etc. %
  • PenD -- thinnest; for fine details %
  • PenX -- extra thick; not recommended for use %
def fonts_setup (expr t,s,m,l,h) = write "\def\updown#1#2{\vbox{" & "\offinterlineskip" & "\setbox100=\hbox{#1}" & "\setbox101=\hbox{#2}" & "\ifnum\wd100>\wd101\hsize=\wd100\else\hsize=\wd101\fi" & "\centerline{\box100}\vskip4pt" & "\centerline{\box101}}}" & "\def\thlabel{\thnormalsize}" & "\def\thremark{\thsmallsize\si}" & "\def\thcomment{\thsmallsize}" & "\def\thentrance{\thsmallsize}" & "\def\thaltitude{\thsmallsize}" & "\def\thstationname{\thsmallsize}" & "\def\thdate{\thsmallsize}" & "\def\thheight{\thsmallsize}" & "\def\thheightpos{+\ignorespaces}" & "\def\thheightneg{-\ignorespaces}" & "\def\thframed{\thsmallsize}" & "\def\thwallaltitude{\thtinysize}" to "mptexpre.tex"; write "\def\thtinysize{\size[" & decimal max(optical_zoom*t,0) & "]}" & "\def\thsmallsize{\size[" & decimal max(optical_zoom*s,0) & "]}" & "\def\thnormalsize{\size[" & decimal max(optical_zoom*m,0) & "]}" & "\def\thlargesize{\size[" & decimal max(optical_zoom*l,0) & "]}" & "\def\thhugesize{\size[" & decimal max(optical_zoom*h,0) & "]}" to "mptexpre.tex"; write EOF to "mptexpre.tex"; enddef; def initialize (expr sc) = if unknown BaseScale: BaseScale = sc; fi; optical_zoom := BaseScale/sc; if BaseScale <= 1: % 1:100 u:=14bp; v:=14bp; w:=12bp; fonts_setup(8,10,12,16,24); elseif BaseScale <= 2: % 1:200 u:=12bp; v:=12bp; w:=12bp; fonts_setup(7,8,10,14,20); elseif BaseScale <= 5: % 1:500 u:=10bp; v:=10bp; w:=12bp; fonts_setup(6,7,8,10,14); else: u:=7bp; v:=14bp; w:=10bp; fonts_setup(5,6,7,8,10); fi; u := optical_zoom * u; v := optical_zoom * v; w := optical_zoom * w; defaultscale := 0.8 * optical_zoom; def PenA = pencircle scaled (u/10) enddef; def PenB = pencircle scaled (0.7*u/10) enddef; def PenC = pencircle scaled (0.5*u/10) enddef; def PenD = pencircle scaled (0.35*u/10) enddef; def PenX = pencircle scaled (1.2*u/10) enddef; legend_scale := 3.14*u; enddef; % macro is expanded, we have to know all dimensions and pens before reading % mpattern macros initialize(Scale); vardef thTEX primary s = write "verbatimtex \input th_enc.tex etex" to "mptextmp.mp"; write "btex \mainfont "&s&" etex" to "mptextmp.mp"; write EOF to "mptextmp.mp"; scantokens "input mptextmp" enddef; % @MACRO % inscale -- % % zooms objects to scale specified in legend_scale variable (used in legend % typesetting) def inscale = xscaled legend_scale yscaled (0.618*legend_scale) enddef; % @MACRO % draw_legend_box -- % % draws a legend bounding box and resets drawoptions() options def draw_legend_box = clip currentpicture to unitsquare inscale; drawoptions(); pickup PenB; draw unitsquare inscale; enddef; def clean_legend_box = unfill unitsquare inscale; enddef; def legend_point (expr name) = % if substring (2,9) of name = "station": % scantokens(name)((0.5,0.5) inscale); % else: scantokens(name)((0.5,0.5) inscale,0,1,(0,0)); % fi; draw_legend_box; enddef; def legend_line (expr name) = scantokens(name)((((-0.3,.5)..(.3,.7)..(.5,.3)..{dir 80}(1.3,.9)) inscale) randomized 3mm); draw_legend_box; enddef; % legend_label % legend_area % legend_random % @MACRO % roundone -- % % rounds numeric value to one decimal point vardef roundone(expr n) = % round(10*n)/10 n enddef; % @MACRO % process_label -- % % draws a label saved in lab picture variable and calls % write_bbox macro. def process_label (expr cent, rot) = begingroup; interim bboxmargin:=0.8bp; q:=((bbox lab) smoothed 2) rotatedaround (cent, rot); draw lab rotatedaround (cent, rot); write_circ_bbox(q); % without corners smoothing it was enough to use % write_bbox(q); endgroup; enddef; % @MACRO % process_uplabel -- % % draws a label into semicircular box and writes clipping path to a file def process_uplabel = begingroup; interim bboxmargin := 0.8 bp; q:=bbox lab; endgroup; alef:=.8-.02*(xpart lrcorner q - xpart llcorner q); % show alef; q:=alef[llcorner q,ulcorner q]{up} .. {down}alef[lrcorner q, urcorner q] -- lrcorner q -- llcorner q -- cycle; draw lab; draw q; q:=reverse q; write_circ_bbox(q); enddef; % @MACRO % process_downlabel -- % % draws a label into down oriented semicircular box and writes % clipping path to a file def process_downlabel = begingroup; interim bboxmargin := 0.8 bp; q:=bbox lab; endgroup; alef:=1-(.8-.02*(xpart lrcorner q - xpart llcorner q)); q:=alef[llcorner q,ulcorner q]{down} .. {up}alef[lrcorner q, urcorner q] -- urcorner q -- ulcorner q -- cycle; draw lab; draw q; write_circ_bbox(q); enddef; % @MACRO % process_updownlabel -- % % draws a label splitted into down and up oriented semicircular boxes and % writes clipping path to a file def process_updownlabel = begingroup; interim bboxmargin := 0.8 bp; p:=bbox lab; endgroup; leftside:=xpart llcorner p; rightside:=xpart lrcorner p; draw (xpart llcorner p,.5[ypart llcorner p,ypart ulcorner p]) -- (xpart lrcorner p,.5[ypart llcorner p,ypart ulcorner p]); alef:=1.05-.02*(xpart lrcorner p - xpart llcorner p); % alef:=.8-.02*(rightside-leftside); p:=alef[(leftside, ypart llcorner p),(leftside, ypart ulcorner p)]{up} .. {down}alef[(rightside, ypart lrcorner p), (rightside, ypart urcorner p)] -- alef[(rightside, ypart urcorner p), (rightside, ypart lrcorner p)]{down} .. {up}alef[(leftside, ypart ulcorner p),(leftside, ypart llcorner p)] -- cycle; % p:=alef[llcorner p,ulcorner p]{up} .. {down}alef[lrcorner p, urcorner p] -- % aleff[llcorner p,ulcorner p]{down} .. % {up}aleff[lrcorner p, urcorner p] -- cycle; draw lab; draw p; p:=reverse p; write_circ_bbox(p); enddef; def process_updownlabel_OLD = p:=bbox lab; q:=bbox Lab; leftside:=min(xpart llcorner p, xpart ulcorner q); rightside:=max(xpart lrcorner p, xpart urcorner q); draw .5[(leftside, ypart llcorner p),(leftside, ypart ulcorner q)] -- .5[(rightside,ypart lrcorner p),(rightside,ypart urcorner q)]; alef:=.8-.02*(rightside-leftside); q:=alef[(leftside, ypart llcorner p),(leftside, ypart ulcorner p)]{up} .. {down}alef[(rightside, ypart lrcorner p), (rightside, ypart urcorner p)] -- alef[(rightside, ypart urcorner q), (rightside, ypart lrcorner q)]{down} .. {up}alef[(leftside, ypart ulcorner q),(leftside, ypart llcorner q)] -- cycle; draw lab; draw Lab; draw q; q:=reverse q; write_circ_bbox(q); enddef; % @MACRO % process_boxedlabel -- % % draws a label into circular box and writes % clipping path to a file def process_boxedlabel = q:=bbox lab; draw lab; draw q; write_bbox(q); enddef; % @MACRO % process_circledlabel -- % % draws a label into circular box and writes % clipping path to a file def process_circledlabel = begingroup; interim bboxmargin := 0.4 bp; q:=bbox lab; endgroup; q:=point 0 of q .. point 1 of q .. point 2 of q .. point 3 of q .. cycle; draw lab; draw q; write_circ_bbox(q); enddef; % @MACRO % write_bbox -- % % Arguments: % path variable -- rectangular bounding box of a label; % assumptions: path is cyclic, counterclockwise oriented, with four points, % composed from linear segments; % see general write_circ_bbox macro % Results: % one file per figure which uses labels with a clipping path in pseudo-pdf % format def write_bbox (expr q) = file_name := jobname & "." & decimal(charcode) & "bbox"; for i:=4 downto 0: s := decimal(roundone(xpart point i of q)) & " " & decimal(roundone(ypart point i of q)) & if i=4: " m " else: " l" fi; write s to file_name; endfor; last_write := charcode; enddef; % @MACRO % write_circ_bbox -- % % Arguments: % path variable, only assumption is that path is cyclic % and counterclockwise oriented. % Results: % one file per figure which uses labels with a clipping path in pseudo-pdf % format def write_circ_bbox expr q = file_name := jobname & "." & decimal(charcode) & "bbox"; tmp:=length q; s := decimal(roundone(xpart point tmp of q)) & " " & decimal(roundone(ypart point tmp of q)) & " m"; write s to file_name; for i:=tmp downto 1: s := decimal(roundone(xpart precontrol i of q)) & " " & decimal(roundone(ypart precontrol i of q)) & " " & decimal(roundone(xpart postcontrol i-1 of q)) & " " & decimal(roundone(ypart postcontrol i-1 of q)) & " " & decimal(roundone(xpart point i-1 of q)) & " " & decimal(roundone(ypart point i-1 of q)) & " c"; write s to file_name; endfor; last_write := charcode; enddef; % @MACRO % close_file -- % % closes file with a clipping path; it's invoked by endchar macro def close_file = if last_write=charcode: write EOF to jobname & "." & decimal(charcode) & "bbox"; fi; enddef; % endchar should run close_file macro extra_endfig := "close_file;"; % @MACRO % thdraw -- % % like plain MetaPost's draw, but draws a path transformed % (rotated, scaled, shifted) to scrap's coordinates according T variable. % (If fill_only=false) def thdrawoptions(text t) = def _thop_ = t enddef enddef; thdrawoptions(); def thdraw expr p = if not fill_only: addto currentpicture if picture p: also (p transformed T) else: doublepath (p transformed T) withpen currentpen fi _thop_ _op_ else: addto currentpicture also nullpicture fi enddef; % @MACRO % thfill -- % % fills a path transformed % (rotated, scaled, shifted) to scrap's coordinates according T variable. % Filled areas are clipped (like most % other lines and points) with a clipping path around text labels. def thfill expr c = addto currentpicture contour (c transformed T) _thop_ _op_ enddef; def thfilldraw expr c = if not fill_only: addto currentpicture contour (c transformed T) withpen currentpen _thop_ _op_ else: addto currentpicture contour (c transformed T) _thop_ _op_ fi enddef; def thunfill expr c = thfill c withcolor background enddef; def thundraw expr p = thdraw p withcolor background enddef; def thunfilldraw expr c = thfilldraw c withcolor background enddef; def thclean expr c = if transparency: thfill c withtransparentcolor tr_bg else: thunfill c fi; enddef; def thPatternFill (expr Path, Pattern) = T:=identity; thclean Path; thfill Path withpattern Pattern; enddef; %def thLegendPatternFill (expr Path, Pattern) = % T:=identity; % thfill Path withpattern Pattern; %enddef; % for drawarrow: def _finarr text t = thdraw _apth t; thfilldraw arrowhead _apth t enddef; % @MACRO % thpermanentfill -- % % Fills specified area with a solid color; this area is not affected by % text clipping path %def thpermanentfill expr c = % addto currentpicture contour (c transformed T) _thop_ _op_ %enddef; let thpermanentfill = thfill; primarydef p aligned al= p shifted (xpart al * xpart U, ypart al * ypart U) enddef; % macros for drawing scraps in upper and lower levels; filled lower scraps % require special treatment (MetaPost doesn't support non-continuous paths). % We can't use one file for both, while PDF XObject has to be explicitely % filled or stroked. Second macro writes also pseudo-pdf code of a clipping % path for given scrap boolean drawnext; drawnext:=true; def draw_upscrap (expr isout)(text t) = path q; for i=t: if (numeric i): if (i=1): drawnext:=true; else: drawnext:=false; fi; else: if drawnext: draw i withpen PenD; fi; if not known q: q:=i; else: q:=q -- i; fi; fi; endfor; if not cycle q: q:=q -- cycle; fi; if turningnumber q = 0: thwarning("scrap outline intersects itself"); fi; if isout=1: if turningnumber q > 0: q := reverse q; fi; else: if turningnumber q < 0: q := reverse q; fi; fi; addto bgfill contour q; enddef; % following macro writes noncontinuous PostScript path directly to EPS file % (filled background and clipping path) picture bgfill; bgfill:=nullpicture; def draw_downscrap = bg_name := jobname & "." & decimal(charcode) & "bg"; clip_name := jobname & "." & decimal(charcode) & "clip"; write "%!PS" to bg_name; write "%%BoundingBox: " & decimal floor xpart llcorner bgfill & " " & decimal floor ypart llcorner bgfill & " " & decimal ceiling xpart urcorner bgfill & " " & decimal ceiling ypart urcorner bgfill to bg_name; write "%%Page: 1 1" to bg_name; write "newpath" to bg_name; for qq within bgfill: q := pathpart qq; tmp:=length q; s := decimal(roundone(xpart point tmp of q)) & " " & decimal(roundone(ypart point tmp of q)) & " m"; write s & "oveto" to bg_name; write s to clip_name; for i:=tmp downto 1: s := decimal(roundone(xpart precontrol i of q)) & " " & decimal(roundone(ypart precontrol i of q)) & " " & decimal(roundone(xpart postcontrol i-1 of q)) & " " & decimal(roundone(ypart postcontrol i-1 of q)) & " " & decimal(roundone(xpart point i-1 of q)) & " " & decimal(roundone(ypart point i-1 of q)) & " c"; write s & "urveto" to bg_name; write s to clip_name; endfor; endfor; write "closepath fill" to bg_name; write "showpage" to bg_name; write "%%EOF" to bg_name; write EOF to bg_name; write EOF to clip_name; bgfill:=nullpicture; enddef; vardef buildcycle(text ll) = save ta_, tb_, k_, i_, pp_; path pp_[]; k_=0; for q=ll: pp_[incr k_]=q; endfor i_=k_; for i=1 upto k_: (ta_[i], length pp_[i_]-tb_[i_]) = pp_[i] intersectiontimes reverse pp_[i_]; if ta_[i]<0: message("[Error: area borders "& area_border[i] &" and "& area_border[i_] &" don't intersect in scrap " & current_scrap & " (file " & current_src & ")]"); area_border_errors := area_border_errors + 1; fi i_ := i; endfor for i=1 upto k_: subpath (ta_[i],tb_[i]) of pp_[i] .. endfor cycle enddef; vardef unitvector primary z = if (z<>(0,0)): z/abs z else: hide(thwarning("strange path")) (0,epsilon) fi enddef; def thwarning (expr m) = message("[Warning: " & m & " in scrap " & current_scrap & "]"); enddef; def check_area_borders = if area_border_errors > 0: fi; enddef; %%%%%%%%%%%% Map symbols management %%%%%%%%%%%%%%%%%%% def mapsymbol (expr name, set, warning) = string s, stype, lname, ID; stype = substring (0,1) of name; lname = name & "_" & set; ID := "ID_" & lname; if (known scantokens ID): if stype = "a": s = "def " & name & " = scantokens(" & ditto & lname & ditto & ") enddef;"; else: s = "let " & name & " = " & lname & ";"; fi; scantokens s; elseif warning: message("[Warning: undefined symbol `" & lname & "']"); fi; enddef; %def hidesymbol (expr name) = % string s, stype; % stype = substring (0,1) of name; % if stype = "a": % s = "def " & name & " = scantokens(" & ditto & "a_empty" & ditto & ") enddef;"; % else: % s = "vardef " & name & "@# (text t) = enddef;"; % fi; % scantokens s; % write name to "missed.dat"; %enddef; def initsymbol (expr name) = s := "ID_" & name & " = 1"; scantokens s; enddef; %%% % comment out groups in order to use 'save ATTR_*' appropriately def beginfig(expr c) = % begingroup charcode:=c; clearxy; clearit; clearpen; pickup defaultpen; drawoptions(); scantokens extra_beginfig; save smartll, smartur; pair smartll[], smartur[]; smart_count := 0; enddef; def endfig = scantokens extra_endfig; shipit; % endgroup enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % P. Bolek's MPATTERN package adapted and simplified for Therion % (with the same user interface except of patterncolor) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% string Pname_, PXYsteps_; string Pmatrix_; numeric Pnum_; Pnum_=0; def PmakeBB_= PBBox_ := "[" & decimal Plft_ & " " & decimal Plow_ & " " & decimal Prt_ & " " & decimal Pup_ & "]"; enddef; def Psteps_= PXYsteps_ := decimal if unknown PXStep_: (Prt_-Plft_) else: PXStep_ fi & ":" & decimal if unknown PYStep_: (Pup_-Plow_) else: PYStep_ fi; enddef; vardef Pfindbounds_= Plow_ = ypart (llcorner currentpicture); Plft_ = xpart (llcorner currentpicture); Pup_ = ypart (urcorner currentpicture); Prt_ = xpart (urcorner currentpicture); PmakeBB_; enddef; def PmakePattern_(expr name)= write decimal (Pnum_*epsilon) & ":" & jobname & "." & decimal charcode & ":" & PBBox_ & ":" & PXYsteps_ & ":" & Pmatrix_ to "patterns.dat" enddef; % User interface macros vardef patternbbox(expr a)(text b)= save Pi_, Pz_; numeric Pi_, Pz_[]; if pair a: Plft_:=min(xpart(a),xpart(b)); Plow_:=min(ypart(a),ypart(b)); Prt_:=max(xpart(a),xpart(b)); Pup_:=max(ypart(a),ypart(b)); else: Pi_=1; for t=b: Pz_[Pi_]=t; Pi_:=Pi_+1; endfor; Plft_:=min(a,Pz_2); Plow_:=min(Pz_1,Pz_3); Prt_:=max(a,Pz_2); Pup_:=max(Pz_1,Pz_3); fi; PmakeBB_; enddef; def beginpattern(suffix name)= numeric PXStep_, PYStep_; numeric Plow_, Plft_, Pup_, Prt_; string PBBox_; Pmatrix_:="[1 0 0 1 0 0]"; Pname_:=str name; Pnum_:=Pnum_+1; beginfig(Pnum_+4000); enddef; def endpattern= if unknown PBBox_: Pfindbounds_; fi; endfig; Psteps_; PmakePattern_(Pname_); scantokens(Pname_ & "=Pnum_;"); enddef; picture pattpict; color patterncolor_; patterncolor_ := black; primarydef p withpattern s= if known s: hide(pattpict := image(draw (0,0)--(10,10)); for i within pattpict: patterncolor_ := (redpart i, greenpart i, bluepart i); endfor;) p withcolor (epsilon, 10*epsilon, s*epsilon) if known mpversion: if scantokens(mpversion)>=1.000: withprescript(decimal redpart patterncolor_ & " " & decimal greenpart patterncolor_ & " " & decimal bluepart patterncolor_ & " THsetpatterncolor") fi; fi; else: p withcolor (1,0,0); message("Warning: undefined pattern ignored"); fi; enddef; def patterntransform expr t= Pmatrix_ := "[" & decimal xxpart t & " " & decimal yxpart t & " " & decimal xypart t & " " & decimal yypart t & " " & decimal xpart t & " " & decimal ypart t & "]"; enddef; def patternxstep expr t= PXStep_ = t; enddef; def patternystep expr t= PYStep_ = t; enddef; def patternstep text t= if pair t: PXStep_ = xpart t; PYStep_ = ypart t; else: (PXStep_,PYStep_)=t; fi; enddef; def patterncolor expr t= message("Warning: patterncolor not supported in Therion"); enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % end of pattern macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % transparent rgb colors numeric RGBnum; RGBnum=0; string RGBname; def def_transparent_rgb (suffix name)(expr r, g, b) = RGBnum := RGBnum+1; RGBname := str name; write decimal (RGBnum*epsilon) & ":" & decimal r & " " & decimal g & " " & decimal b to "rgbcolors.dat"; scantokens(RGBname & ":=RGBnum;"); enddef; primarydef p withtransparentcolor s= p withcolor (epsilon, 12*epsilon, s*epsilon); enddef; def_transparent_rgb(tr_white, 1, 1, 1); def_transparent_rgb(tr_blue, 0, 0, 1); def_transparent_rgb(tr_black, 0, 0, 0); def_transparent_rgb(tr_bg, redpart background, greenpart background, bluepart background); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % some useful macros from H. Hagen's MetaFun package %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vardef paired (expr d) = if pair d : d else : (d,d) fi enddef ; primarydef p randomshifted s = begingroup ; save ss ; pair ss ; ss := paired(s) ; p shifted (-.5xpart ss + uniformdeviate xpart ss, -.5ypart ss + uniformdeviate ypart ss) endgroup enddef ; primarydef p randomized s = (if path p : for i=0 upto length(p)-1 : ((point i of p) randomshifted s) .. controls ((postcontrol i of p) randomshifted s) and ((precontrol (i+1) of p) randomshifted s) .. endfor if cycle p : cycle else : ((point length(p) of p) randomshifted s) fi elseif pair p : p randomshifted s elseif color p : if color s : (uniformdeviate redpart s * redpart p, uniformdeviate greenpart s * greenpart p, uniformdeviate bluepart s * bluepart p) elseif pair s : ((xpart s + uniformdeviate (ypart s - xpart s)) * p) else : (uniformdeviate s * p) fi else : p + uniformdeviate s fi) enddef ; primarydef p llmoved d = ((llcorner p) shifted (-xpart paired(d),-ypart paired(d))) enddef ; primarydef p lrmoved d = ((lrcorner p) shifted (+xpart paired(d),-ypart paired(d))) enddef ; primarydef p urmoved d = ((urcorner p) shifted (+xpart paired(d),+ypart paired(d))) enddef ; primarydef p ulmoved d = ((ulcorner p) shifted (-xpart paired(d),+ypart paired(d))) enddef ; primarydef p smoothed d = (p llmoved (-xpart paired(d),0) -- p lrmoved (-xpart paired(d),0) {right} .. p lrmoved (0,-ypart paired(d)) -- p urmoved (0,-ypart paired(d)) {up} .. p urmoved (-xpart paired(d),0) -- p ulmoved (-xpart paired(d),0) {left} .. p ulmoved (0,-ypart paired(d)) -- p llmoved (0,-ypart paired(d)) {down} .. cycle) enddef ; vardef punked primary p = (point 0 of p for i=1 upto length(p)-1 : -- point i of p endfor if cycle p : -- cycle else : -- point length(p) of p fi) enddef ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % end of MetaFun macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % we input map symbol definitions input thPoint; input thLine; input thArea; input thText; input thSpecial; input uAUT; input thTrans; nonstopmode; therion/mpost/genmpost.pl0000775000175000017500000001060310415014516014601 0ustar useruser#!/usr/bin/perl -w sub encodecxx { $str = shift; $str =~ s/\x0D//g; $str =~ s/\x0C//g; $str =~ s/\x0A//g; $str =~ s/\\/\\\\/g; $str =~ s/\n/\\n/g; $str =~ s/\t/\\t/g; $str =~ s/\"/\\"/g; return $str; } sub init_symbol { my $s = shift; # if ($s =~ /def\s+((p|l|a)_([a-z]+_){1,2}[A-Z]+)/) { if ($s =~ /(def|let)\s+(p|l|a|s)_([a-z_]+)_([A-Z]+)\W/) { $SYMBOLS{$2}{$3}{$4} = 1; } # elsif ($s =~ /beginpattern\(a_([a-z]+)_([A-Z]+)\)/) { # $SYMBOLS{"a"}{$1}{$2} = 1; # } } sub process_symbols { my ($s1, $s2, $s3, %ss); open(OUT, ">../SYMBOLS.txt"); $thmpost_library .= "\n"; foreach $s1 (reverse sort keys %SYMBOLS) { print OUT "\n\n[", ($s1 eq "p") ? "Point" : (($s1 eq "l") ? "Line" : (($s1 eq "s") ? "Special" : "Area")), " symbols]\n"; foreach $s2 (sort keys %{$SYMBOLS{$s1}}) { print OUT "\n$s2: "; foreach $s3 (sort keys %{$SYMBOLS{$s1}{$s2}}) { print OUT "$s3 "; $thmpost_library .= "\"initsymbol(\\\"$s1\_$s2\_$s3\\\");\\n\"\n"; $ss{$s3} = 1; } } } close(OUT); my $i = 0; my $ssl; foreach $s3 (sort keys %ss) { $ssl .= "\"$s3\",\n"; $ss{$s3} = $i; $i++; } open(OUT, ">../thsymbolsets.h"); print OUT "#ifndef thsymbolsets_h\n#define thsymbolsets_h\n\n"; print OUT "#include \"thsymbolsetlist.h\"\n\n"; print OUT "#include \n"; print OUT "#include \n\n"; print OUT "\n#define thsymsets_size $i\n\n"; print OUT "extern int thsymsets_symbols [thsymbolset_size][thsymsets_size];\n\n"; print OUT "extern int thsymsets_figure [thsymbolset_size][thsymsets_size+1];\n\n"; print OUT "extern int thsymsets_order[thsymbolset_size];\n\n"; print OUT "extern int thsymsets_count[thsymsets_size];\n\n"; print OUT "extern std::map thsymsets_comment;\n\n"; print OUT "\nstatic const thsymbolset__char_ptr thsymsets [] = {\n$ssl};\n\nvoid thsymsets_symbols_init();\n\n"; print OUT "#endif\n\n"; close(OUT); open(OUT, ">../thsymbolsets.cxx"); print OUT "#include \"thsymbolsets.h\"\n\n"; print OUT "int thsymsets_symbols [thsymbolset_size][thsymsets_size];\n\n"; print OUT "int thsymsets_figure [thsymbolset_size][thsymsets_size+1];\n\n"; print OUT "int thsymsets_order[thsymbolset_size];\n\n"; print OUT "int thsymsets_count[thsymsets_size];\n\n"; print OUT "std::map thsymsets_comment;\n\n"; print OUT "\n\n\nvoid thsymsets_symbols_init() {\n"; print OUT "\tsize_t i, j;\n\tfor(i = 0; i <= thsymbolset_size; i++)\n"; print OUT "\t\tfor(j = 0; j < thsymsets_size; j++) \n\t\t\tthsymsets_symbols[i][j] = 0;\n\t\t\n\t\n"; foreach $s1 (reverse sort keys %SYMBOLS) { if (($s1 eq "p") || ($s1 eq "a") || ($s1 eq "l")) { foreach $s2 (sort keys %{$SYMBOLS{$s1}}) { foreach $s3 (sort keys %{$SYMBOLS{$s1}{$s2}}) { print OUT "\tthsymsets_symbols[SYM" . uc($s1) . "_" . uc($s2) . "][$ss{$s3}] = 1;\n"; } } } } print OUT "}\n"; close(OUT); } print "reading therion.mp\n"; $thmpost_library = ""; open(INPT,"therion.mp"); while ($ln = ) { init_symbol($ln); if ($ln =~ /^\s*input\s+(\S+)\s*\;/) { if (open(INPT2,"$1.mp") || open(INPT2,"$1")) { print "reading $1\n"; $fname = $1; $thmpost_library .= "\n\"\\n\\n\\n%%%%% INPUT $fname %%%%%\\n\\n\\n\""; while($ln2 = ) { init_symbol($ln2); if ($ln2 !~ /\s*endinput\s*\;\s*$/) { $thmpost_library .= "\n\"" . encodecxx($ln2) . "\\n\""; } } close(INPT2); $thmpost_library .= "\n\"\\n\\n\\n%%%%% ENDINPUT $fname %%%%%\\n\\n\\n\""; } else { $thmpost_library .= "\n\"" . encodecxx($ln) . "\\n\""; } } else { $thmpost_library .= "\n\"" . encodecxx($ln) . "\\n\""; } } close(INPT); process_symbols(); open(OUTPT,">../thmpost.h"); print OUTPT <../thmpost.cxx"); print OUTPT <pathl: txtzoom := pathl / strl; thwarning("text scaled down to fit the path"); else: txtzoom := 1; fi; zoom := pathl / strl; for p within pic: if textual p: ss := textpart p; dx1 := xpart p; dy1 := ypart p; dx2 := dx1; if xxpart p / yypart p <> 1: message("Error: distorted text!") fi; txtscale := txtzoom * xxpart p; l := length(ss); ptime := 0; for i=0 upto (l - 1): ch := substring(i,i+1) of ss; pict := ch infont fontpart p scaled txtscale; charwidth := xpart (lrcorner pict - llcorner pict) / txtzoom; dy2 := ypart lrcorner pict / txtzoom; ptime := (dx2 - dx0 + 0.5*charwidth) * zoom; t := arctime ptime of (path); pos := point t of path + (dy1+dy2)*txtzoom*unitvector((direction t of path) rotated 90); begingroup % interim labeloffset:=0bp; lab:=thelabel.top(pict,pos); process_label(pos,angle direction t of path); endgroup; dx2 := dx2 + charwidth; endfor; else: message("Strange component of line label!"); fi; endfor; % draw path; enddef; vardef p_label@#(expr txt,pos,rot,mode) = if (mode=1) or (mode=7): interim labeloffset:=(u/8) fi; lab:=thelabel@#(txt, pos); if mode>1: pickup PenD fi; if mode=1: pickup pencircle scaled (u/6); drawdot(pos); process_label(pos,0); elseif mode=2: process_uplabel; elseif mode=3: process_downlabel; elseif mode=4: process_updownlabel; elseif mode=5: process_circledlabel; elseif mode=6: process_boxedlabel; elseif mode=7: process_label(pos,rot); % station name elseif mode=8: process_filledlabel(pos, rot); else: process_label(pos,rot); fi; enddef; % at beginfig: save smartll[], smartur[]; pair smartll[], smartur[]; smart_count=0; numeric smart_count, smart_D; boolean smart_quit, smart_inner_quit; def p_smartlabel (expr txt, pos) = begingroup; interim bboxmargin:=0.2pt; lab:=thelabel.rt(txt,pos+(0.4u,0)); q:=bbox lab; smart_D := 0; forever: smart_quit := true; smart_inner_quit := false; for i=1 upto smart_count: if smart_overlap(((point 0 of q) shifted (0,smart_D)), ((point 2 of q) shifted (0,smart_D)), smartll[i], smartur[i]) = 1: smart_quit := false; smart_D := smart_D - 3pt; smart_inner_quit := true; fi; exitif smart_inner_quit; endfor; exitif smart_quit; endfor; smart_U := 0; forever: smart_quit := true; smart_inner_quit := false; for i=1 upto smart_count: if smart_overlap(((point 0 of q) shifted (0,smart_U)), ((point 2 of q) shifted (0,smart_U)), smartll[i], smartur[i]) = 1: smart_quit := false; smart_U := smart_U + 3pt; smart_inner_quit := true; fi; exitif smart_inner_quit; endfor; exitif smart_quit; endfor; if (smart_U < -smart_D): smart_D := smart_U; fi; draw lab shifted (0,smart_D); if (abs(smart_D)>3pt): pickup PenB; draw pos{left}..{right}(pos shifted (.4u, smart_D)) dashed withdots scaled 0.2; pickup PenA; drawdot pos; fi; smart_count := smart_count + 1; smartll[smart_count] := point 0 of (q shifted (0,smart_D)); smartur[smart_count] := point 2 of (q shifted (0,smart_D)); endgroup; enddef; def smart_overlap (expr llA, urA, llB, urB) = if ((xpart llA < xpart urB) and (xpart urA > xpart llB)) and ((ypart llA < ypart urB) and (ypart urA > ypart llB)): 1 else: 0 fi enddef; def p_wallaltitude (expr pprev,pos,pnext,txt) = rot:=angle(unitvector(pnext-pos)+unitvector(pos-pprev)) - 90; pickup PenD; pair zz; % zz:=(pos + 3*unitvector(dir rot)); zz:=(pos + (u/4)*unitvector(dir rot)); draw (pos)--zz; begingroup % interim labeloffset:=2pt; interim labeloffset:=(u/12); if horiz_labels: rot:=rot mod 360; if rot<=22.5: lab:=thelabel.rt(txt, zz); elseif rot<=67.5: lab:=thelabel.urt(txt, zz); elseif rot<=112.5: lab:=thelabel.top(txt, zz); elseif rot<=157.5: lab:=thelabel.ulft(txt, zz); elseif rot<=202.5: lab:=thelabel.lft(txt, zz); elseif rot<=247.5: lab:=thelabel.llft(txt, zz); elseif rot<=292.5: lab:=thelabel.bot(txt, zz); elseif rot<=337.5: lab:=thelabel.lrt(txt, zz); else: lab:=thelabel.rt(txt, zz); fi; else: if (abs rot>90) and (abs rot <=270): rot:=rot-180; lab:=thelabel.lft(txt, pos); else: lab:=thelabel.rt(txt, pos); fi; fi; process_label(pos, if horiz_labels: 0 else: rot fi); endgroup; enddef; therion/mpost/uAUT.mp0000664000175000017500000007015412064677632013610 0ustar useruser% Austrian Symbol Set, author Georg Pacher % color (for Austrian symbol-set) color col_water_bg; col_water_bg :=(226/255,244/255,253/255); %%%%%%%%%%%%%%%%%%%%%%% %% areas % returns true if pair point lies within path q. % outside_point is any pair outside of path q (needed for reference). vardef pointinside(expr pt,q,outside_point)= T:=identity; path test; test:= outside_point--pt; %thdraw test; boolean isinside; isinside:=false; numintersections:=recgetnumintersections(test,q,0); if (numintersections <0): isinside:=true; elseif odd(numintersections): isinside:=true; else: isinside:=false; fi; isinside enddef; % get number of intersection between paths p (length 1!) and q % recnum is needed for limitation of recursions. % If the number of allowed recursions is reached, a negativ number of intersections is returned vardef recgetnumintersections(expr p,q,recnum)= pair inter; save preinter; save postinter; save numintersections; path preinter, postinter; inter:=p intersectiontimes q; %show recnum; if recnum >25: numintersections:=-100; else: if xpart(inter)>0 : %show (xpart inter); % split p into two paths and call yourself again preinter:=subpath (0,xpart(inter)-2eps) of p; postinter:=subpath (xpart(inter)+2eps,1) of p; numintersections:= recgetnumintersections(preinter,q,recnum+1) + recgetnumintersections(postinter,q,recnum+1) + 1; else: numintersections:=0; fi; fi; numintersections enddef; beginpattern(pattern_water_AUT); draw origin--10up withpen pensquare scaled (0.02u); patternxstep(.18u); patterntransform(identity rotated 90); endpattern; beginpattern(pattern_sump_AUT); draw origin--(0,.25u) withpen pensquare scaled (0.02u); draw origin--(.25u,0) withpen pensquare scaled (0.02u); endpattern; beginpattern(pattern_sand_AUT); pickup PenC; p:= origin -- (0.01u,0.01u); for i=0.0u step 0.2u until 2.4u: for j=0.0u step 0.2u until 2.4u: draw p rotated uniformdeviate(360) shifted ((i,j) randomized 0.09u); endfor; endfor; if BaseScale<=2.5: my_step:=2.4u; else: my_step:=2.6u; fi; patternstep(my_step,my_step); endpattern; beginpattern(pattern_pebbles_AUT); pickup PenC; path qq; for i=0.0u step 0.3u until 5.1u: for j=0.0u step 0.3u until 5.1u: qq := (superellipse((.1u,0),(0,.05u),(-.1u,0),(0,.-.05u),.75)) randomized (u/45) scaled (uniformdeviate(0.4)+.55) rotated uniformdeviate(360) shifted ((i,j) randomized 0.15u); draw qq; endfor; endfor; patternstep(5.1u,5.1u); endpattern; beginpattern(pattern_ice_AUT); pickup PenC; p:=(-.15u,.0u) -- (0.15u,.0u); draw p; draw p shifted (0.25u,.0u) rotated (90); draw p shifted (0.45u,0.25u); draw p shifted (0.0u,0.45u) rotated (90); patternxstep(.9u); patternystep(0.5u); endpattern; def a_water_AUT (expr Path) = T:=identity; thclean Path; pickup PenC; thfill Path withcolor col_water_bg; thfill Path withpattern pattern_water_AUT; thdraw Path; enddef; def a_sump_AUT (expr Path) = T:=identity; thclean Path; pickup PenC; thfill Path withcolor col_water_bg; thfill Path withpattern pattern_sump_AUT; thdraw Path; enddef; def a_sand_AUT (expr Path) = T:=identity; % thclean Path; thfill Path withpattern pattern_sand_AUT ; enddef; let a_clay_AUT = a_sand_AUT; def a_pebbles_AUT (expr p) = T:=identity; thfill p withpattern pattern_pebbles_AUT; enddef; def a_debris_AUT (expr p) = T:=identity; symbol_distance:=1.0; scale_factor:= 0.3; pickup PenC; path q, qq; q = bbox p; pair outside; outside:= ulcorner q + up; picture tmp_pic; uu := max(u, (xpart urcorner q - xpart llcorner q)/100, (ypart urcorner q - ypart llcorner q)/100); tmp_pic := image( for i = xpart llcorner q step symbol_distance*uu until xpart urcorner q: for j = ypart llcorner q step symbol_distance*uu until ypart urcorner q: qq := punked (((-.5uu,-.5uu)--(.5uu,-.5uu)--(1.05uu,0.01uu)--(.5uu,.5uu)--(-.5uu,.5uu)--cycle) randomized (uu/2)) scaled (uniformdeviate(0.4)+scale_factor ) rotated uniformdeviate(360) shifted ((i,j) randomized 0.5uu); if xpart (p intersectiontimes qq) < 0: if pointinside((i,j),p,outside): thclean qq; thdraw qq; fi; else: qq:= qq scaled (uniformdeviate(.2)+.5 ) if xpart (p intersectiontimes qq) < 0: if pointinside((i,j),p,outside): thclean qq; thdraw qq; fi; fi; fi; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; def a_ice_AUT (expr p) = T:=identity; thclean p; thfill p withpattern pattern_ice_AUT; pickup PenC; thdraw p; enddef; def a_snow_AUT (expr P) = T:=identity; pickup PenC; path q; q = bbox P; picture tmp_pic, tmp_sn; pair z; tmp_sn := image( pickup PenC; p := origin--(0,.2*u); draw p; draw p rotated (60); draw p rotated (120); draw p rotated (180); draw p rotated (240); draw p rotated (300); p := ((0,.3u)--(0,0.2u)--(0.1u,0.2u)) rotatedaround ((0,0.2u),45); draw p; draw p rotated (60); draw p rotated (120); draw p rotated (180); draw p rotated (240); draw p rotated (300); ); tmp_pic := image( for i = xpart llcorner q step 1.0u until xpart urcorner q: for j = ypart llcorner q step 1.0u until ypart urcorner q: z:=((i,j) randomized 0.5u); if xpart (P intersectiontimes ((bbox tmp_sn) shifted z)) < 0: draw tmp_sn shifted z; fi; endfor; endfor; ); clip tmp_pic to P; draw tmp_pic; thdraw P; enddef; def a_blocks_AUT (expr p) = T:=identity; symbol_distance:=1.6; scale_factor:= 0.8; pickup PenC; path q, qq; q = bbox p; pair outside; outside:= ulcorner q + up; picture tmp_pic; uu := max(u, (xpart urcorner q - xpart llcorner q)/100, (ypart urcorner q - ypart llcorner q)/100); tmp_pic := image( for i = xpart llcorner q step symbol_distance*uu until xpart urcorner q: for j = ypart llcorner q step symbol_distance*uu until ypart urcorner q: qq := punked (((-.5uu,-.5uu)--(.5uu,-.5uu)--(1.05uu,0.01uu)--(.5uu,.5uu)--(-.5uu,.5uu)--cycle) randomized (uu/2)) scaled (uniformdeviate(0.7)+scale_factor ) rotated uniformdeviate(360) shifted ((i,j) randomized 0.75uu); if xpart (p intersectiontimes qq) < 0: if pointinside((i,j),p,outside): thclean qq; thdraw qq; fi; else: qq:= qq scaled (uniformdeviate(.2)+.5 ) if xpart (p intersectiontimes qq) < 0: if pointinside((i,j),p,outside): thclean qq; thdraw qq; fi; fi; fi; endfor; endfor; ); clip tmp_pic to p; drawoptions(); draw tmp_pic; enddef; %% lines def l_wall_pit_AUT (expr P) = T:=identity; % draw outer path pickup PenA; thdraw P; laenge:= arclength P; pair inner[],innerdir[], inter; pair test; samplingdistance:=max(0.15u,laenge/1500); path testcircle; % testcircle, used to test, whether the path makes a 'v'-like bend, % where normal sampling and offsetting gives poor results for the parallel line % size of testcircle= size PenA/2 + 2* (distance between outer and inner line) % + PenC (inner line) testcircle := halfcircle scaled (.5*u/10+2*.125u+.5*u/10) shifted (0,.5*u/10); cur:=samplingdistance/2; count:=0; forever: t:= arctime cur of P; inter:=P intersectiontimes (testcircle rotated (angle thdir(P,t)) shifted (point t of P)); %thdraw testcircle rotated (angle thdir(P,t)) shifted (point t of P) withpen (pencircle scaled 0.01u) ; if (xpart inter) >=0: % we are at a 'sharp bend', so set next point to intersectionpoint cur:=cur+samplingdistance; t := max( xpart inter, arctime cur of P); %thdraw point t of P withcolor 0.7*green; forever: t:= arctime cur of P; inter:=P intersectiontimes (testcircle rotated (angle thdir(P,t)) shifted (point t of P)); exitif (xpart inter <0); cur := cur + samplingdistance; exitif (cur >=laenge); endfor; if (cur =laenge); endfor; if count>2: % draw inner path pickup PenC; path innerpath; innerpath = for i=0 upto count-2: inner[i]{(innerdir[i])} .. endfor if cycle P: cycle; else: inner[count-1]; fi; thdraw innerpath; % draw the triangles path draw_triangle; pair l_triangle; laenge:= arclength innerpath; symsize:= adjust_step(laenge,0.5u); triangle_width:=symsize/2; cur:=(symsize/2); t := arctime (cur) of innerpath; t1:= arctime (cur-triangle_width/2) of innerpath; t2:= arctime (cur+triangle_width/2) of innerpath; l_triangle := (point t of innerpath); if ATTR__height >= 10: thfill else: thdraw fi (subpath (t1,t2) of innerpath) -- ((point t of innerpath) + symsize/2 * unitvector(thdir(innerpath,t) rotated 90)) -- cycle; for cur=(symsize/2) step symsize until laenge: t := arctime (cur) of innerpath; test := (point t of innerpath); my_dist := length(test-l_triangle); if (abs(my_dist-symsize) < 0.05u) or (my_dist>symsize): t1:= arctime (cur-triangle_width/2) of innerpath; t2:= arctime (cur+triangle_width/2) of innerpath; draw_triangle:=(subpath (t1,t2) of innerpath) -- ((point t of innerpath) + symsize/2 * unitvector(thdir(innerpath,t) rotated 90)) -- cycle; if xpart (draw_triangle intersectiontimes P) < 0: if ATTR__height >= 10: thfill draw_triangle; else: thclean draw_triangle; thdraw draw_triangle; fi; l_triangle:= test; fi; fi; endfor; fi; enddef; def l_wall_sand_AUT (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, 0.1u); pickup PenC; forever: t := arctime cas of P; thdraw (((0.01u,0.01u)--origin) rotated uniformdeviate(360) shifted ((point t of P) + (uniformdeviate 1) * .4u * unitvector(thdir(P,t) rotated -90))); cas := cas + mojkrok; exitif cas > dlzka + (mojkrok / 3); % for rounding errors endfor; pickup PenC; thdraw P; enddef; def l_wall_pebbles_AUT (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .18u); pickup PenC; q:=superellipse((.1u,0),(0,.05u),(-.1u,0),(0,.-.05u),.75); forever: t := arctime (cas + mojkrok/2) of P; thdraw q randomized (u/45) rotated (angle(thdir(P,t)) + (normaldeviate*40)) shifted point t of P; cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; enddef; let l_wall_clay_AUT = l_wall_sand_AUT; def l_wall_debris_AUT (expr P) = T:=identity; pickup PenC; laenge := arclength P; path block; path old_block; cur := 0; t:= arctime cur of P; % draw first block old_block := (((-.0u,-.0u)--(.25u,-.15u)--(.45u,0.01u)--(.2u,.25u)--(.05u,.15u)--cycle)); block_width := (xpart urcorner old_block - xpart ulcorner old_block); old_block:=old_block rotated angle(thdir(P,0)) shifted point t of P; thclean old_block; thdraw old_block; cur := cur + 0.9*block_width; t:= arctime cur of P; % proceed with path forever: % generate random block block := punked (((-.25u,-.25u)--(0.25.u,-.25u)--(0.50u,0.01u)--(0.25u,.25u)--(-.25u,.25u)--cycle) randomized (u/4)) scaled (uniformdeviate(0.3)+.4) rotated uniformdeviate(360); % check width of block block_width := (xpart urcorner block - xpart ulcorner block); exitif cur > (laenge- 2.5*block_width/2); % find next position where the block fits in without intersecting the previous one forever: exitif xpart ( (block rotated angle(-direction t of P) shifted point t of P) intersectiontimes old_block) < 0; cur:=cur+0.01u; t:= arctime cur of P; exitif cur > (laenge- 2.5*block_width/2); endfor; exitif cur > (laenge- 2.5*block_width/2); old_block:= block rotated angle(-direction t of P) shifted point t of P; thclean old_block; thdraw old_block; cur := cur + block_width/2; t:= arctime cur of P; endfor; t:= arctime laenge-eps of P; % generate last block block := (((-.0u,-.0u)--(.25u,-.15u)--(.45u,0.01u)--(.2u,.25u)--(.1u,.15u)--cycle)); block_width := (xpart urcorner block - xpart ulcorner block); % scale last block to fit in the remaining gap scale_factor:=1.5*(laenge-cur)/block_width; forever: exitif scale_factor < 0; % bruces stab at preventing endless loop at large scales exitif xpart ( (block rotated angle(-direction t of P) scaled scale_factor shifted (point t of P)) intersectiontimes old_block) < 0; scale_factor:=scale_factor-0.01; endfor; if scale_factor > 0: thclean block rotated angle(-direction t of P) scaled scale_factor shifted (point t of P); thdraw block rotated angle(-direction t of P) scaled scale_factor shifted (point t of P); fi; enddef; def l_wall_blocks_AUT (expr P) = T:=identity; pickup PenC; laenge := arclength P; path block; path old_block; cur := 0; t:= arctime cur of P; % draw first block old_block := ( (.7u,-.35u)--(.85u,0.01u)--(.4u,.5u)--(.1u,.3u)--(-.0u,-.0u) ); block_width := (xpart urcorner old_block - xpart ulcorner old_block); old_block:=old_block rotated angle( thdir(P,0) ) shifted point t of P; thclean (old_block--cycle); thdraw old_block; cur := cur + block_width/2; t:= arctime cur of P; forever: % generate random block block := punked ( ( (.8u,-.35u)--(.85u,0.01u)--(.6u,.4u)--(.1u,.1u)--(-.0u,-.3u) ) randomized (0.3u) ) scaled (uniformdeviate(0.3)+.65) rotated (uniformdeviate(45)-15); % check width of block block_width := (xpart urcorner block - xpart ulcorner block); exitif cur > (laenge- 3.5*block_width/2); % find next position where the block fits in without intersecting the previous one forever: exitif xpart ( ((block--cycle) rotated angle(direction t of P) shifted point t of P) intersectiontimes old_block) < 0; cur:=cur+0.01u; t:= arctime cur of P; exitif cur > (laenge- 3.5*block_width/2); endfor; exitif cur > (laenge- 3.5*block_width/2); old_block:= block rotated angle(direction t of P) shifted point t of P; thclean (old_block--cycle); thdraw old_block; cur := cur + block_width/2; t:= arctime cur of P; endfor; % generate last block t:= arctime laenge-eps of P; block := (( (-.15u,-.35u)--(.0u,.0u)--(-.45u,.5u)--(-.75u,.3u)--(-.85u,-.0u)) ); block_width := (xpart urcorner block - xpart ulcorner block); % scale last block to fit in the remaining gap scale_factor:=(laenge-cur)/block_width; forever: exitif scale_factor < 0; exitif xpart ( ( (block) rotated angle (direction t of P) scaled scale_factor shifted (point t of P) ) intersectiontimes old_block) < 0; scale_factor:=scale_factor-0.001; endfor; if scale_factor > 0: thclean (block--cycle) rotated angle (direction t of P) scaled scale_factor shifted (point t of P); thdraw (block) rotated angle (direction t of P) scaled scale_factor shifted (point t of P); fi; enddef; def l_wall_ice_AUT (expr P) = T:=identity; cas := 0; dlzka := arclength P; mojkrok:=adjust_step(dlzka, .6u); pickup PenC; p := (-.15u,0)--(.15u,0); q := p rotated 90 shifted (.25u,.0u); picture symbol,test_symbol; symbol:= image ( thdraw p; thdraw q; ); path bound,old_bound,test_bound; begingroup; interim bboxmargin:=0; bound := bbox (symbol); endgroup; t := arctime (cas + mojkrok/2) of P; thdraw symbol rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); old_bound:=bound rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); forever: t := arctime (cas + mojkrok/2) of P; test_bound:= bound rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); if xpart ((old_bound) intersectiontimes (test_bound))<0: if xpart (P intersectiontimes (test_bound))<0: thdraw symbol rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); old_bound:=bound rotated angle(thdir(P,t)) shifted (point t of P + .25u * unitvector(thdir(P,t) rotated -90)); fi; fi; cas := cas + mojkrok; exitif cas > dlzka - (2*mojkrok/3); % for rounding errors endfor; thdraw P; enddef; def l_wall_underlying_AUT (expr P) = T:=identity; pickup PenA; laenge:= arclength P; t1 := arctime (0.5u) of P; t2 := arctime (laenge-.5u) of P; thdraw (subpath (t1,t2) of P) dashed evenly scaled optical_zoom; enddef; def l_wall_overlying_AUT (expr P) = T:=identity; laenge:= arclength P; t1 := arctime (0.25u) of P; t2 := arctime (laenge-.25u) of P; t3 :=arctime (laenge) of P; pickup pensquare scaled (3.5*u/10); thdraw (subpath (t1,t2) of P) withcolor background; pickup PenA; thdraw subpath(0,t1) of P; thdraw subpath(t2,t3) of P; thdraw (subpath (t1,t2) of P) dashed dashpattern(on 2bp off 2bp on .5bp off 2bp on 2bp) scaled optical_zoom; enddef; def l_wall_moonmilk_AUT (expr P) = T:=identity; laenge:= arclength P; symsize:=adjust_step(laenge,0.8u); circle_width:=symsize/2; cur:=(symsize-circle_width)/2; pickup PenC; forever: t1 := arctime (cur) of P; t2 := arctime (cur + circle_width) of P; thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 90)} .. {dir (angle(thdir(P,t2)) - 90)}(point t2 of P); cur := cur + symsize; exitif cur > laenge + (symsize / 3); % for rounding errors endfor; pickup PenA; thdraw P; enddef; def l_wall_flowstone_AUT (expr P) = T:=identity; laenge:= arclength P; symsize:=adjust_step(laenge,0.8u); circle_width:=symsize/2; cur:=(symsize-circle_width)/2; pickup PenC; forever: t1 := arctime (cur) of P; t2 := arctime (cur + circle_width) of P; thdraw (point t1 of P){dir (angle(thdir(P,t1)) + 90)} .. {dir (angle(thdir(P,t2)) - 90)}(point t2 of P); thfill (point t1 of P){dir (angle(thdir(P,t1)) + 90)} .. {dir (angle(thdir(P,t2)) - 90)}(point t2 of P) -- (point t1 of P)--cycle; cur := cur + symsize; exitif cur > laenge + (symsize / 3); % for rounding errors endfor; pickup PenA; thdraw P; enddef; def l_pit_AUT (expr P) = T:=identity; laenge:= arclength P; symsize:=adjust_step(laenge,0.5u); triangle_width:=symsize/2; cur:=(symsize-triangle_width)/2; pickup PenC; forever: t1 := arctime (cur) of P; t := arctime (cur + triangle_width/2) of P; t2 := arctime (cur + triangle_width) of P; if ATTR__height >= 10: thfill (subpath (t1,t2) of P) -- ((point t of P) + symsize/2 * unitvector(thdir(P,t) rotated 90)) -- cycle; else: thclean (subpath (t1,t2) of P) -- ((point t of P) + symsize/2 * unitvector(thdir(P,t) rotated 90)) -- cycle; thdraw (point t2 of P) --((point t of P) + symsize/2 * unitvector(thdir(P,t) rotated 90)) -- (point t1 of P); fi; cur := cur + symsize; exitif cur > laenge - (1*symsize/3); % for rounding errors t1:=arctime (cur) of P; endfor; thdraw P; enddef; let l_overhang_AUT = l_pit_AUT; let l_floorstep_AUT = l_floorstep_UIS; let l_contour_AUT =l_contour_SKBB; def l_flowstone_AUT (expr P) = T:=identity; pickup PenC; thdraw P dashed evenly scaled optical_zoom; enddef; def l_survey_cave_AUT (expr P) = T:=identity; pair zz[]; pickup PenD; thdraw P; enddef; %% points def p_stalactite_AUT(expr pos,theta,sc,al) = pickup PenC; if ATTR__elevation: U:=(.15u, .4u); T:=identity aligned al rotated theta scaled sc shifted pos; thdraw (0,-.4u) -- (0,.15u) -- (-.15u,.4u); thdraw (0,.15u) -- (.15u,.4u); else: U:=(.175u, .175u); T:=identity aligned al rotated theta scaled sc shifted pos; thclean fullcircle scaled 0.35u; thdraw fullcircle scaled 0.35u; fi; enddef; let p_icestalactite_AUT = p_stalactite_AUT; def p_stalagmite_AUT(expr pos,theta,sc,al) = pickup PenC; if ATTR__elevation: U:=(.15u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; thdraw (0,.4u) -- (0,-.15u) -- (-.15u,-.4u); thdraw (0,-.15u) -- (.15u,-.4u); else: U:=(.15u,.15u); T:=identity aligned al rotated theta scaled sc shifted pos; thfill fullcircle scaled 0.3u; fi; enddef; let p_icestalagmite_AUT = p_stalagmite_AUT; def p_pillar_AUT(expr pos,theta,sc,al) = pickup PenC; if ATTR__elevation: U:=(.15u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; thdraw (0,.15u)--(0,-.15u); thdraw (-.15u,-.4u)--(0,-.15u)--(.15u,-.4u); thdraw (-.15u,.4u)--(0,.15u)--(.15u,.4u); else: U:=(.225u,.225u); T:=identity aligned al rotated theta scaled sc shifted pos; thclean fullcircle scaled 0.45u; thdraw fullcircle scaled 0.45u; thfill fullcircle scaled 0.3u; fi; enddef; let p_icepillar_AUT = p_pillar_AUT; def p_crystal_AUT (expr pos,theta,sc,al)= U:=(.35u,.35u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p := ((-.35*u,0)--(.35*u,0)); thdraw p; thdraw p rotated (45); thdraw p rotated (90); thdraw p rotated (135); thdrawoptions(); enddef; def p_spring_AUT (expr pos,theta,sc,al)= U:=(.3u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,.1u)..(0,-.1u)..(.3u,.1u); enddef; def p_sink_AUT (expr pos,theta,sc,al)= U:=(.3u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (-.3u,-.1u)..(0,.1u)..(.3u,-.1u); enddef; def p_breakdownchoke_AUT (expr pos,theta,sc,al)= U:=(.4u,.4u); T:=identity rotated -theta aligned al rotated theta scaled sc shifted pos; pickup PenC; thclean (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle; thdraw (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle; thdraw (-.21u,.305u)--(.0u,-.305u)--(.21u,.305u); enddef; def p_sand_AUT (expr pos,theta,sc,al)= U:=(.2u,.2u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:= origin -- (0.01u,0.01u); for i=-0.1u step 0.2u until .15u: for j=-0.1u step 0.2u until .15u: thdraw p rotated uniformdeviate(360) shifted ((i,j) randomized 0.09u); endfor; endfor; thdrawoptions(); enddef; let p_clay_AUT = p_sand_AUT; def p_pebbles_AUT (expr pos,theta,sc,al)= U:=(.4u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; path qq; for i=-0.15u step 0.3u until .2u: for j=-0.15u step 0.3u until .2u: qq := (superellipse((.1u,0),(0,.05u),(-.1u,0),(0,.-.05u),.75)) randomized (u/45) scaled (uniformdeviate(0.4)+.55) rotated uniformdeviate(360) shifted ((i,j) randomized 0.15u); thdraw qq; endfor; endfor; enddef; def p_debris_AUT (expr pos,theta,sc,al)= U:=(.5u,.5u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; path block,q; block := ((-.15u,-.15u)--(.15u,-.15u)--(.3u,0.01u)--(.15u,.15u)--(-.15u,.15u)--cycle) ; q:= (punked (block randomized (0.15u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.3)+0.3) shifted (0.0u,0.15u); thclean q; thdraw q; q:= (punked (block randomized (0.15u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.5)+0.7) shifted (-0.15u,-0.15u); thclean q; thdraw q; q:= (punked (block randomized (0.15u))) rotated uniformdeviate(360) shifted (0.15u,-0.15u); thclean q; thdraw q; enddef; def p_blocks_AUT (expr pos,theta,sc,al)= U:=(u,u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; path block,q; block := ((-.25u,-.25u)--(.25u,-.25u)--(.5u,0.01u)--(.25u,.25u)--(-.25u,.25u)--cycle) ; q:= (punked (block randomized (0.3u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.3)+0.3) shifted (0.0u,0.25u); thclean q; thdraw q; q:= (punked (block randomized (0.3u))) rotated uniformdeviate(360) scaled (uniformdeviate(0.5)+0.7) shifted (-0.25u,-0.25u); thclean q; thdraw q; q:= (punked (block randomized (0.3u))) rotated uniformdeviate(360) shifted (0.25u,-0.25u); thclean q; thdraw q; enddef; def p_water_AUT (expr pos,theta,sc,al)= U:=(.425u,.3u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenD; p:=fullcircle xscaled (.85u) yscaled (.6u); thfill p withcolor col_water_bg; thfill p withpattern pattern_water_AUT; thdraw p; enddef; def p_ice_AUT (expr pos,theta,sc,al)= U:=(.6u,.4u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:=(-.15u,.0u) -- (0.15u,.0u); thdraw p rotated 90; thdraw p shifted (0.45u,.0u); thdraw p shifted (-0.45u,.0u); thdraw p rotated 90 shifted (-0.45u,0.25u); thdraw p shifted (0u,0.25u); thdraw p rotated 90 shifted (0.45u,.25u); enddef; def p_entrance_AUT (expr pos,theta,sc,al)= U:=(.3u,.75u); T:=identity aligned al rotated theta scaled sc shifted pos; path slice; for i= -0.5 step 0.01 until 0.5: slice:= (-.3u*(0.5-i),1.5*i*u)--(0,.75u)--(.3u*(0.5-i),1.5i*u)--cycle; thfill slice withcolor (min(0.95,0.5-1.75i),min(0.95,.5-1.75i),min(0.95,.5-1.75i)); endfor; thdraw ((-.3u,-0.75u)--(0,.75u)--(.3u,-0.75u)--cycle); enddef; def p_gradient_AUT (expr pos,theta,sc,al)= U:=(.15u,u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; thdraw (0,-0.5u)--(0,0.5u); p:=(-.15u,.3u)--(0,0.7u)--(.15u,.3u)--cycle; thfill p; thdraw p; enddef; def p_airdraught_AUT (expr pos,theta,sc,al)= U:=(.2u,u); T:=identity aligned al rotated theta scaled 1 shifted pos; pickup PenC; thdraw (0,.5u)--(0,-0.8u); p:=(-.2u,.2u)--(0,.55u)--(.2u,.2u)--cycle; thfill p; for i:=1 upto round(3+2*mlog(sc)/mlog 2): thdraw (0,-(1-0.2i)*u)--(.2u,-(1-0.2(i-1))*u); thdraw (0,-(1-0.2i)*u)--(-.2u,-(1-0.2(i-1))*u); endfor; enddef; def p_station_temporary_AUT (expr pos)= T:=identity shifted pos; pickup PenD; thclean fullcircle scaled 0.15u; thdraw fullcircle scaled 0.15u; enddef; let p_station_painted_AUT = p_station_temporary_AUT ; let p_station_fixed_AUT = p_station_temporary_AUT ; def p_claychoke_AUT (expr pos,theta,sc,al)= U:=(.4u,.4u); T:=identity rotated -theta aligned al rotated theta scaled sc shifted pos; pickup PenC; thclean (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle; thdraw (-.4u,-.4u)--(.4u,-.4u)--(.4u,.4u)--(-.4u,.4u)--cycle; thdraw (-.15u,.3u)--(-.15u,-.25u)--(.15u,-.25u); enddef; def p_claytree_AUT (expr pos,theta,sc,al)= U:=(.55u,.6u); T:=identity aligned al rotated theta scaled sc shifted pos; pickup PenC; p:= (-.15u,.15u)--(.0u,.6u)--(.15u,.15u); thdraw p ; thdraw p shifted (-.4u,-.3u); thdraw p shifted (.4u,-.2u) ; enddef; therion/thinit.h0000664000175000017500000000562711211745324012730 0ustar useruser/** * @file thinit.h * Initialization class. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thinit_h #define thinit_h #include #include "thbuffer.h" #include "thmbuffer.h" #include "thinput.h" /** * Therion system dependend properties initializer. */ enum { THINIT_ENCODING_DEFAULT, THINIT_ENCODING_SQL, }; enum { THINIT_LOOPC_UNKNOWN = 0, THINIT_LOOPC_THERION, THINIT_LOOPC_SURVEX, }; class thinit { public: int encoding_default, encoding_sql; ///< Default encoding. thbuffer path_cavern, ///< Survex executable full path. path_pdftex, path_mpost, ///< PDF tex and metapost path opt_mpost, path_otftotfm, path_convert, path_identify, ///< Path to ImageMagick convert and identify executables. tmp_path, tmp_remove_script; //path_3dtopos, std::string font_src[5], font_dst[5]; bool tex_env, fonts_ok; int lang, loopc; thmbuffer cmb; ///< Command parsing mbuffer. thinput ini_file; ///< Initialization file. /** * Standard constructor. */ thinit(); /** * Destructor. */ ~thinit(); /** * Load initialization file. */ void load(); /** * Copy fonts to temporary folder. */ void copy_fonts(); /** * Return cavern executable path. */ char * get_path_cavern(); /** * Return ImageMagick convert executable path. */ char * get_path_convert(); /** * Return ImageMagick identify executable path. */ char * get_path_identify(); /** * Return metapost options. */ char * get_opt_mpost(); /** * Return metapost executable path. */ char * get_path_mpost(); char * get_path_otftotfm(); /** * Return pdftex executable path. */ char * get_path_pdftex(); int get_lang(); void check_font_path(const char * fname, int index); int get_encoding(int type = THINIT_ENCODING_DEFAULT); }; /** * Print initialization file. */ void thprint_init_file(); /** * Initialization module. */ extern thinit thini; #endif therion/makeconfig.pl0000664000175000017500000000146610576400772013725 0ustar useruser# read make file open(MF,"Makefile"); @mflines = ; close(MF); # backup makefile open(MFB,">Makefile~"); print MFB @mflines; close(MFB); open(MF,">Makefile"); $insidecfg = 0; $insideprm = 0; $config = $ARGV[0]; $param = $ARGV[1]; foreach $ln (@mflines) { if ($ln =~ /^\s*\#\s*$config\s+CONFIG\s*$/) { $insidecfg = 1; } if ($ln =~ /^\s*\#\s*$config\s+ENDCONFIG\s*$/) { $insidecfg = 0; } if ($insidecfg && ($ln =~ /^\s*\#\s*$config\s+$param\s*$/)) { $insideprm = 1; } elsif ($insidecfg && ($ln =~ /^\s*\#\s*$config\s+\S+\s*$/)) { $insideprm = 0; } if ($ln =~ /\S/) { if ($insidecfg) { if ($insideprm) { $ln =~ s/^\s*\#\#//; } else { if ($ln =~ /^\s*[^\#]/) { $ln = "##$ln"; } } } } print MF $ln; } close(MF); therion/thwarppt.cxx0000664000175000017500000006046510720741562013662 0ustar useruser/** @file thwarppt.cxx * * @author marco corvi * @date nov 2006 - mar 2007 * * @brief warping plaquette algorithm transform implementation */ /* Copyright (C) 2006-2007 marco corvi * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include #include #include #include "thwarppt.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif typedef unsigned int warpp_t; const warpp_t ngbh_mask = ((warpp_t)(0x7))<<(8*sizeof(warpp_t)-3); const warpp_t indx_mask = ~ngbh_mask; therion::warp::plaquette_algo::plaquette_algo( ) : m_initialized( false ) , m_bound3( BOUND_TRIANGLE ) , m_bound4( BOUND_PLAQUETTE ) { } therion::warp::plaquette_algo::plaquette_algo( double bound3, double bound4 ) : m_initialized( false ) , m_bound3( bound3 ) , m_bound4( bound4 ) { } therion::warp::plaquette_algo::~plaquette_algo( ) { reset(); } void therion::warp::plaquette_algo::reset( ) { for (size_t i=0; im_name == from ) { p1 = mPairs[i]; if (p2) break; } if ( mPairs[i]->m_name == to ) { p2 = mPairs[i]; if (p1) break; } } if ( p1 == NULL || p2 == NULL ) throw; mLines.push_back( new therion::warp::line( t, p1, p2 ) ); } #ifdef DEBUG void therion::warp::plaquette_algo::print() { printf("Plaquette algo: P.nr %d L.nr %d\n", mPairs.size(), mLines.size() ); printf(" X origin %.2f %.2f units %.4f\n", mX0.m_x, mX0.m_y, mXUnit ); printf(" U origin %.2f %.2f units %.4f\n", mU0.m_x, mU0.m_y, mUUnit ); printf(" UC origin %.2f %.2f units %.2f\n", mUC.m_x, mUC.m_y, mUCUnit); for ( size_t i=0; im_name.c_str(), mPairs[i]->m_type, mPairs[i]->u.m_x, mPairs[i]->u.m_y, mPairs[i]->x.m_x, mPairs[i]->x.m_y ); } for ( size_t i=0; im_p1->m_name.c_str(), mLines[i]->m_p2->m_name.c_str(), mLines[i]->m_type ); } for ( size_t i=0; iprint(); } #endif bool therion::warp::plaquette_algo::initialize( warp_proj proj ) { if ( mPairs.size() < 2 ) return false; if ( ! m_initialized ) { // thprintf("plaquette_algo::initialize() \n"); size_t sz = mPairs.size(); // bounding box thvec2 xmin( mPairs[0]->x ); thvec2 xmax( xmin ); thvec2 umin( mPairs[0]->u ); thvec2 umax( umin ); for ( size_t k=1; kx ); xmax.maximize( mPairs[k]->x ); umin.minimize( mPairs[k]->u ); umax.maximize( mPairs[k]->u ); } mX0 = (xmin + xmax) / 2.0; mU0 = (umin + umax) / 2.0; // units mXUnit = (xmax - xmin).length() / 2.0; mUUnit = (umax - umin).length() / 2.0; // scaled coordinates (relative to the centers) for ( size_t k=0; kz = ( mPairs[k]->x - mX0 ) / mXUnit; mPairs[k]->w = ( mPairs[k]->u - mU0 ) / mUUnit; } mUC = mU0; mUCUnit = mUUnit; update_lines(); make_plaquettes( proj ); make_neighbors( ); /* print topology for (unsigned int k=0; knr(), mPlaquettes[k]->left_ngbh()->nr(), mPlaquettes[k]->right_ngbh()->nr() ); } */ m_initialized = true; } return m_initialized; } therion::warp::point_pair * therion::warp::plaquette_algo::insert_zoom_point( morph_type t, std::string & name, const thvec2 src, std::string & from, double size ) { size_t k; size_t sz = mPairs.size(); for (k=0; km_name == from ) break; } if ( k == sz ) { thprintf("warning insert_zoom_point() from point \"%s\" not found\n", from.c_str() ); return NULL; } double x0 = mPairs[k]->x.m_x; double y0 = mPairs[k]->x.m_y; thprintf("insert_zoom_point() %s (%.2f %.2f) from %s (%.2f %.2f) distance %.2f\n", name.c_str(), src.m_x, src.m_y, from.c_str(), x0, y0, size ); double x1 = src.m_x - x0; double y1 = src.m_y - y0; double dd = sqrt( x1*x1 + y1*y1 ); x1 /= dd; y1 /= dd; double a1=7.0, a2=7.0; point_pair * p1 = NULL; // to the left point_pair * p2 = NULL; // to the right size_t sl = mLines.size(); double x2, y2; double sa, ca, a; for (size_t h=0; hm_type != THMORPH_STATION ) continue; point_pair * p; if ( mLines[h]->m_p1 == mPairs[k] ) { p = mLines[h]->m_p2; } else if ( mLines[h]->m_p2 == mPairs[k] ) { p = mLines[h]->m_p1; } else { continue; } x2 = p->x.m_x - x0; y2 = p->x.m_y - x0; dd = sqrt(x2*x2 + y2*y2); x2 /= dd; y2 /= dd; sa = x2*y1 - y2*x1; ca = x1*x2 + y1*y2; a = atan2( sa, ca ); if ( a < 0.0 ) a += 2*M_PI; if ( a < a1 ) { a1=a; p1=p; } a = 2*M_PI - a; if ( a < a2 ) { a2=a; p2=p; } } if ( p1 == NULL || p2 == NULL || p1 == p2 ) return NULL; x0 = mPairs[k]->u.m_x; y0 = mPairs[k]->u.m_y; x1 = p1->u.m_x - x0; y1 = p1->u.m_y - y0; dd = sqrt( x1*x1 + y1*y1 ); x1 /= dd; y1 /= dd; x2 = p2->u.m_x - x0; y2 = p2->u.m_y - y0; double d2 = sqrt( x2*x2 + y2*y2 ); x2 /= d2; y2 /= d2; if ( dd < d2 ) d2 = dd; if ( size < d2 / 10 ) return NULL; ca = x1*x2 + y1*y2; sa = sqrt( 1 - ca ); ca = sqrt( 1 + ca ); x0 += ( x2*ca + y2*sa) * size; y0 += (-x2*sa + y2*ca) * size; thprintf("left %s (%.2f %.2f) right %s (%.2f %.2f) ==> %.2f %.2f\n", p1->m_name.c_str(), p1->u.m_x, p1->u.m_y, p2->m_name.c_str(), p2->u.m_x, p2->u.m_y, x0, y0 ); point_pair * pair = new point_pair( t, name, src.m_x, src.m_y, x0, y0 ); mPairs.push_back( pair ); mLines.push_back( new therion::warp::line( t, mPairs[k], pair ) ); return pair; } therion::warp::line * therion::warp::plaquette_algo::add_extra_line( point_pair * p1, size_t index, thvec2 & x3, thvec2 & u3 ) { std::ostringstream ost; ost << p1->m_name << "_E_" << index; std::string name = ost.str(); // thprintf("Extra line() point %s %6.2f %6.2f %6.2f %6.2f \n", // name.c_str(), x3.m_x, x3.m_y, u3.m_x, u3.m_y ); point_pair * p3 = insert_point( THMORPH_EXTRA, name, x3, u3 ); p3->update( mX0, mXUnit, mU0, mUUnit ); therion::warp::line * l3 = new therion::warp::line( THMORPH_EXTRA, p1, p3 ); l3->update(); mLines.push_back( l3 ); return l3; } // ======================================================================== bool therion::warp::plaquette_algo::forward( const thvec2 & src, thvec2 & dst, const thvec2 & origin, double unit ) { thvec2 z = ( src - mX0) / mXUnit; size_t szp = mPlaquettes.size(); double dmin = -1.0; size_t imin = (size_t)(-1); for ( size_t i=0; iis_inside_from( z ) ) { double d = mPlaquettes[i]->distance_from( z ); if ( thisnan( d ) ) continue; if ( imin == (size_t)(-1) || d < dmin ) { dmin = d; imin = i; } } } if ( imin == (size_t)(-1) ) return false; thvec2 w; mPlaquettes[imin]->forward( z, w ); if ( w.is_nan() ) return false; dst = ( origin + w * unit ); return true; } bool therion::warp::plaquette_algo::backward( const thvec2 & dst, thvec2 & src, const thvec2 & origin, double unit ) { thvec2 w = (dst - origin) / unit; size_t szp = mPlaquettes.size(); double dmin = -1.0; size_t imin = (size_t)(-1); for ( size_t i=0; iis_inside_to( w ) ) { double d = mPlaquettes[i]->distance_to( w ); if ( thisnan( d ) ) continue; if ( imin == (size_t)(-1) || d < dmin ) { dmin = d; imin = i; } } } if ( imin == (size_t)(-1) ) return false; thvec2 z; mPlaquettes[imin]->backward( w, z ); if ( z.is_nan( ) ) return false; src = mX0 + z * mXUnit; return true; } void therion::warp::plaquette_algo::update_lines() { for (size_t i=0; iupdate(); } } void therion::warp::plaquette_algo::make_neighbors( ) { // thprintf("plaquette_algo::make_neighbors() plaquettes %d \n", mPlaquettes.size() ); for (size_t k=0; kcompute_slopes(); } } void therion::warp::plaquette_algo::find_neighbors( therion::warp::basic_pair * me ) { switch ( me->type() ) { case THWARP_TRIANGLE: case THWARP_PLAQUETTE: for (int k=0; kngbh_nr(); ++k) me->m_ngbh[k] = find_plaquette( me->m_pair[k+1], me->m_pair[k] ); break; default: thprintf("plaquette_algo::make_neighbors() wrong pair warp-type %d\n", me->type() ); } } therion::warp::basic_pair * therion::warp::plaquette_algo::find_plaquette( point_pair * p1, point_pair * p2 ) { // thprintf("find_plaquette() %s %s \n", p1->m_name.c_str(), p2->m_name.c_str() ); for (size_t k=0; kngbh_nr(); if ( i2 >= 1 && i2 < 4 ) { for (int i=0; im_pair[i] == p1 && mPlaquettes[k]->m_pair[i+1] == p2 ) { // thprintf("found %d\n", mPlaquettes[k]->nr() ); return mPlaquettes[k]; } } } } return NULL; } void therion::warp::plaquette_algo::make_plaquettes( warp_proj proj ) { for (size_t k=0; korder_lines( this, mXUnit/mUUnit, proj ); } // print(); szp = mPairs.size(); for (size_t i=0; im_used = false; } for ( ; ; ) { therion::warp::point_pair * node1 = NULL; therion::warp::line * line = NULL; for (size_t i=0; ilegs() == 1 && ! mPairs[i]->m_used ) { node1 = mPairs[i]; line = node1->first_leg(); for ( ++i; isize() == 1 ) { therion::warp::line * ln = mPairs[i]->next_line(NULL); if ( ln && ln->m_type == THMORPH_STATION ) ln->m_type = THMORPH_EXTRA; } } break; // not really necessary } */ if ( mPairs[i]->size() == 1 && ! mPairs[i]->m_used ) { node1 = mPairs[i]; line = node1->next_line(NULL); line->m_type = THMORPH_STATION; // make the line into a station line break; } } if ( node1 == NULL ) { // thprintf("Error: cannot find a 1-leg node\n"); return; } therion::warp::point_pair * node2 = line->other_end( node1 ); therion::warp::point_pair * node10 = node1; // save starting nodes therion::warp::point_pair * node20 = node2; // thprintf("make_plaquettes()"); // thprintf(" node1 %s node2 %s\n", node1->m_name.c_str(), node2->m_name.c_str() ); do { therion::warp::point_pair * A = node1; therion::warp::point_pair * B = node2; if ( line->m_type == THMORPH_STATION ) { size_t iA = A->size(); size_t iB = B->size(); if ( iA == 1 ) // mark the node as used A->m_used = true; if ( iB == 1 ) B->m_used = true; // thprintf(" A %s (%d) B %s (%d) line type S\n", A->m_name.c_str(), iA, B->m_name.c_str(), iB ); if ( iA == 1 && iB == 1 ) { thprintf("ERROR: segments are no longer supported\n"); } else if ( iA == 1 ) { // / // A ======= B ... // | // C // // do not do anything: B will do it therion::warp::line * line2 = B->next_line( line ); therion::warp::point_pair * C = line2->other_end( B ); if ( line2->m_type != THMORPH_STATION ) add_triangle( A, B, C, proj ); node1 = B; node2 = C; line = line2; } else if ( iB == 1 ) { // // | // ... A ======= B // / // D therion::warp::line * line1 = A->prev_line( line ); therion::warp::point_pair * D = line1->other_end( A ); add_triangle( D, A, B, proj ); node1 = B; node2 = A; // line = line; } else { // ... A ========= B ... // | | // D C // therion::warp::line * line1 = A->prev_line( line ); therion::warp::point_pair * D = line1->other_end( A ); therion::warp::line * line2 = B->next_line( line ); therion::warp::point_pair * C = line2->other_end( B ); add_quadrilater( A, B, C, D, proj ); node1 = B; node2 = C; line = line2; } } else { // line->m_type != THMORPH_STATION size_t iA = A->size(); size_t iB = B->size(); if ( iA == 1 ) // mark the node as used A->m_used = true; if ( iB == 1 ) B->m_used = true; // thprintf(" A %s B %s line type non-S\n", A->m_name.c_str(), B->m_name.c_str() ); // ? // | // A ======== B // therion::warp::line * line2 = A->next_line( line ); if ( line2->m_type == THMORPH_STATION ) { // node_2 // | // A ======== B // line = line2; node2 = line->other_end( A ); // insertion is handled at the next iteration } else { // D // | // A ======== B // therion::warp::point_pair * D = line2->other_end( A ); add_triangle( B, A, D, proj ); node2 = D; line = line2; } } } while ( node1 != node10 ); // back to start while ( node2 != node20 ) { therion::warp::line * line2 = node1->next_line( line ); therion::warp::point_pair * C = line2->other_end( node1 ); add_triangle( node2, node1, C, proj ); node2 = C; line = line2; } } // end big for ( ; ; ) } void therion::warp::plaquette_algo::add_triangle( point_pair * A, point_pair * B, point_pair * C, warp_proj proj ) { // N.B. bad triangles are only warned; // they are used anyways. if ( ((C->x - B->x) ^ (A->x - B->x)) >= 0.0 ) { thprintf("WARNING: bad triangle (%s %s %s) X-orientation\n", C->m_name.c_str(), B->m_name.c_str(), A->m_name.c_str() ); } else if ( ((C->u - B->u) ^ (A->u - B->u)) >= 0.0 ) { thprintf("WARNING: bad triangle (%s %s %s) U-orientation\n", C->m_name.c_str(), B->m_name.c_str(), A->m_name.c_str() ); } // else { therion::warp::triangle_pair * tri = new therion::warp::triangle_pair( B, C, A, this->m_bound3 ); tri->set_projection( proj ); mPlaquettes.push_back( tri ); // } } void therion::warp::plaquette_algo::add_quadrilater( point_pair * A, point_pair * B, point_pair * C, point_pair * D, warp_proj proj ) { // thprintf(" ADD Plaquette: %s %s %s %s\n", // A->m_name.c_str(), B->m_name.c_str(), C->m_name.c_str(), D->m_name.c_str() ); // check orientation if ( ((B->x - A->x) ^ (D->x - A->x)) >= 0.0 ) { thprintf("WARNING: bad plaquette (%s %s %s) X-orientation\n", B->m_name.c_str(), A->m_name.c_str(), D->m_name.c_str() ); } else if ( ((C->x - B->x) ^ (A->x - B->x)) >= 0.0 ) { thprintf( "WARNING: bad plaquette (%s %s %s) X-orientation\n", C->m_name.c_str(), B->m_name.c_str(), A->m_name.c_str() ); } else if ( ((B->u - A->u) ^ (D->u - A->u)) >= 0.0 ) { thprintf("WARNING: bad plaquette (%s %s %s) U-orientation\n", B->m_name.c_str(), A->m_name.c_str(), D->m_name.c_str() ); } else if ( ((C->u - B->u) ^ (A->u - B->u)) >= 0.0 ) { thprintf("WARNING: bad plaquette (%s %s %s) U-orientation\n", C->m_name.c_str(), B->m_name.c_str(), A->m_name.c_str() ); } else { therion::warp::plaquette_pair * plaq = new therion::warp::plaquette_pair( A, B, C, D, this->m_bound4 ); plaq->set_projection( proj ); mPlaquettes.push_back( plaq ); } } bool therion::warp::plaquette_algo::map_backward_plaquette( size_t k, const thvec2 & w, thvec2 & z ) { if ( mPlaquettes[k]->is_inside_to( w ) ) { mPlaquettes[k]->backward( w, z ); return true; } return false; } bool therion::warp::plaquette_algo::map_image( const unsigned char * src, unsigned int ws, unsigned int hs, unsigned char * dst, unsigned int wd, unsigned int hd, thvec2 const & origin, double unit, int depth, warp_proj proj ) { if ( ! initialize( proj ) ) return false; mUC = origin; mUCUnit = unit; double res[4]; assert( depth <= 4 ); // max 4 components unsigned int wsd = ws * depth; thvec2 z; // print(); // thprintf("X origin %6.2f %6.2f units %6.2f\n", mX0.m_x, mX0.m_y, mXUnit); // thprintf("U origin %6.2f %6.2f units %6.2f\n", mU0.m_x, mU0.m_y, mUUnit); // thprintf("UC origin %6.2f %6.2f units %6.2f\n", mUC.m_x, mUC.m_y, mUCUnit); // new way warpp_t * pi = (warpp_t *)malloc( wd * hd * sizeof(warpp_t) ); if ( pi != NULL ) { memset( pi, 0xff, wd*hd*sizeof(warpp_t) ); double * pf = (double *)malloc( wd * hd * sizeof(double) ); if ( pf == NULL ) thprintf("warning: failed to allocate temporary distance image\n"); for (size_t k=0; kbounding_box_to( t1, t2 ); t1 = mUC + mUCUnit * t1; t2 = mUC + mUCUnit * t2; t1.maximize( thvec2(0,0) ); t2.minimize( thvec2(wd, hd) ); int i1 = (int)t1.m_x; int i2 = (int)t2.m_x; int j2 = (int)t2.m_y; for (int j=(int)t1.m_y; jis_inside_to( w ) ) { // ++cnt; if ( ( piwd[i] & ngbh_mask ) == ngbh_mask ) { piwd[i] = (warpp_t)k; if ( pf ) pfwd[i] = -1.0; // delay distance computation // pfwd[i] = mPlaquettes[k]->distance2_to( w ); } else { double d1 = mPlaquettes[k]->distance2_to( w ); if ( pf ) { // delayed distance computation if ( pfwd[i] < 0.0 ) pfwd[i] = mPlaquettes[piwd[i]]->distance2_to( w ); double d0 = pfwd[i]; if ( d1 < d0 ) { piwd[i] = (warpp_t)k; pfwd[i] = d1; } } else { double d0 = mPlaquettes[piwd[i]]->distance2_to( w ); if ( d1 < d0 ) { piwd[i] = (warpp_t)k; } } } } u.m_x += 1.0; } } // thprintf("plaquette %2d: points %d\n", k, cnt ); } warpp_t * pij = pi; // not sure if it's better to random-access or scan-through // if the output image is dense a scan-through should be better // if it is "sparse" random-access should be better // in the following i opt for scan-through on the destination image // but random-access of the (i,j) vector // // unsigned int wdd = wd * depth; unsigned char * dst1 = dst; for (unsigned int j=0; j= 0 && ix2 < (int)ws ) { int iy1 = (int)x.m_y; int iy2 = iy1 + 1; if ( iy1 >= 0 && iy2 < (int)hs ) { // bilinear interpolation: does not cost much more than nearest-pixel double dx = x.m_x - ix1; double dy = x.m_y - iy1; double dx1dy1 = (1-dx) * (1-dy); double dx1dy0 = (1-dx) * dy; double dx0dy1 = dx * (1-dy); double dx0dy0 = dx * dy; // unsigned char * dst1 = dst + (j * wdd + i * depth); const unsigned char * src00 = src + iy1*wsd + ix1 * depth; const unsigned char * src01 = src00 + wsd; const unsigned char * src10 = src00 + depth; const unsigned char * src11 = src01 + depth; for (int c=0; c= 255 ) ? 255 : res[c]); } } } } dst1 += depth; } } if ( pf ) free( pf ); free( pi ); } else { // old way (used if pi malloc failed ... thprintf("warning: failed to allocate temporary index image\n"); for (size_t k=0; kbounding_box_to( t1, t2 ); t1 = mUC + mUCUnit * t1; t2 = mUC + mUCUnit * t2; t1.maximize( thvec2(0,0) ); t2.minimize( thvec2(wd, hd) ); int i2 = (int)t2.m_x; int j2 = (int)t2.m_y; for (int j=(int)t1.m_y; j= 0 && ix2 < (int)ws && iy1 >= 0 && iy2 < (int)hs ) { double dx = x.m_x - ix1; // bilinear interpolation double dy = x.m_y - iy1; unsigned char * dst1 = dst + depth * (j * wd + i); const unsigned char * src00 = src + depth * ( iy1*ws + ix1 ); const unsigned char * src01 = src00 + depth * ws; const unsigned char * src10 = src00 + depth; const unsigned char * src11 = src01 + depth; for (int k=0; k= 255 ) ? 255 : res); } } } } } } } return true; } therion/thsymbolsets.h0000664000175000017500000000110112340611142014142 0ustar useruser#ifndef thsymbolsets_h #define thsymbolsets_h #include "thsymbolsetlist.h" #include #include #define thsymsets_size 8 extern int thsymsets_symbols [thsymbolset_size][thsymsets_size]; extern int thsymsets_figure [thsymbolset_size][thsymsets_size+1]; extern int thsymsets_order[thsymbolset_size]; extern int thsymsets_count[thsymsets_size]; extern std::map thsymsets_comment; static const thsymbolset__char_ptr thsymsets [] = { "ASF", "AUT", "BCRA", "NSS", "NZSS", "SKBB", "SM", "UIS", }; void thsymsets_symbols_init(); #endif therion/thpic.h0000664000175000017500000000325712046704242012536 0ustar useruser/** * @file thpic.h * Picture manipulation structure. */ /* Copyright (C) 2006 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thpic_h #define thpic_h struct thpic { const char * fname, * texfname, * rgbafn; char * rgba; long width, height; double x, y, ///< Coordinates of upper left corner scale; ///< Image scale. thpic(); bool exists(); void init(const char * fname, const char * incfnm); const char * convert(const char * type, const char * ext, const char * optfmt, ...); void rgba_load(); void rgba_free(); void rgba_init(long width, long height); void rgba_save(const char * type, const char * ext, int colors = -1); char * rgba_get_pixel(long x, long y); char * rgba_interpolate_pixel(double x, double y); void rgba_set_pixel(long x, long y, char * data); }; #endif therion/thobjectsrc.cxx0000664000175000017500000000207610625655142014317 0ustar useruser/** * @file thobjectsrc.cxx */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #include #include "thobjectsrc.h" bool thobjectsrc::is_valid() { return (strlen(this->name) > 0); } therion/thtfpwf.h0000664000175000017500000000377110625655142013117 0ustar useruser/** * @file thtfpwf.h * Piece wise function. */ /* Copyright (C) 2000 Stacho Mudrak * * $Date: $ * $RCSfile: $ * $Revision: $ * * -------------------------------------------------------------------- * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * -------------------------------------------------------------------- */ #ifndef thtfpwf_h #define thtfpwf_h #include #include /** * Piecewise function element. */ struct thtfpwfxy { double x, y; }; /** * Piecewise function class. * * If two elements are defined, makes makes (x - b) * a transformation. */ class thtfpwf { double a, ///< Multiplier. b; ///< Addition. size_t valn; thtfpwfxy * valp; void clear(); ///< Clear the value array. public: /** * Standard constructor. */ thtfpwf() : a(1.0), b(0.0), valn(0), valp(NULL) {} /** * Standard destructor. */ virtual ~thtfpwf(); /** * Parse function. */ virtual void parse(int nfact, char ** sfact); /** * Make units transformation on number. */ double evaluate(double value); /** * Set function values. */ void set(size_t nv, double * pv); /** * Return function values. */ thtfpwfxy * get_values(); /** * Return number of function values. */ size_t get_size(); }; #endif therion/thbook/0000775000175000017500000000000012450020322012522 5ustar userusertherion/thbook/ch03.tex0000664000175000017500000006463212446072754014041 0ustar useruser\eject \vbox{\hsize=93.2mm\baselineskip=12pt \rightline{\eightit We both step and do not step in the same rivers.} \pic{herakl.pdf} \vskip1pt \eightrm \rightline{---Heraclitus of Ephesus, {\eightmit 6}th/{\eightmit 5}th century BC} } \chapter Processing data. Besides data files, which contain survey data, Therion uses a configuration file, which contains instructions on how the data should be presented. \subchapter Configuration file. The configuration filename can be given as an argument to therion. By default Therion searches for file named |thconfig| in the current working directory. It is read like any other therion file (i.e.~one command per line; empty lines or lines starting with `|#|' are ignored; lines ended with a backslash continue on the next line.) A list of currently supported commands follow. \subsubchapter `system'. Allows to execute system commands during therion compilation.\[E.g. to open or refresh external PDF viewer.] Normally Therion waits until the subprocess is finished. If you want to continue compilation without break, use | &| syntax on Linux and |start | syntax on Windows. \subsubchapter `encoding'. Works like the |encoding| command in data files---specifies character sets. \subsubchapter `language'. \syntax \list * |language | \endlist \endsyntax \NEW{5.3}Sets the output language for translatable texts. \subsubchapter `cs'. \syntax \list * |cs | \endlist \endsyntax \NEW{5.3}Outside of |layout| command specifies the coordinate system for output. It is not possible to specify more coordinate systems for different outputs (the last occurence of |cs| is used for all output files). If no |cs| is defined in the configuration file, the first |cs| therion encounters in the data files is used as an output |cs|. Inside the |layout| specifies coordinate system for subsequent location data (|origin|, |grid-origin|). \subsubchapter `sketch-warp'. \syntax \list * |sketch-warp | \endlist \endsyntax Specifies which scrap warping (morphing) algorithm to use. Possible algorithms are |line|---the default; |plaquette|---invented by Marco Corvi. \subsubchapter `input'. Works like |input| command in data files---includes other files. \subsubchapter `source'. \description Specifies which source (data) files Therion should read. You can specify several files here; one per line. You can also specify them using the |-s| command line option (see below). It is also possible to type (some small snippets of) code directly in configuration file using the multi-line syntax. \enddescription \syntax \hfill\break|source |\hfill\break or\hfill\break |source|\hfill\break {\qquad\it\dots therion commands\dots}\hfill\break |endsource| \endsyntax \arguments * || \endarguments \subsubchapter `select'. \description selects objects (surveys and maps) for export. By default, all survey objects are selected. If there is no map selected, all scraps belonging to selected surveys are selected by default for map export. If there are no scraps or maps in the data, centreline from all surveys is exported in the map. When exporting maps in different projections, you need to select them for each projection separately. \enddescription \syntax |select [OPTIONS]| \endsyntax \arguments * || = any survey or map, identified by its ID. \endarguments \options * |recursive | = valid only when a survey is selected. If set on (by default) all subsurveys of the given survey are recursively selected/unselected. * |map-level | = valid only when a map is selected. Determines the level at which map expansion for atlas export is stopped. By default 0 is used; if `basic' is specified, expansion is done up to the basic maps. {\it Note:} Map previews are displayed only as specified in maps in the current |map-level|. * |chapter-level | = valid only when a map is selected. Determines the level at which chapter expansion for atlas export is stopped. By default 0 is used, if `|-|' or `|.|' is specified, no chapter is exported for this map. If |title-pages| option in |layout| is on, each chapter starts with a title page. \endoptions \subsubchapter `unselect'. \description Unselects objects from export. \enddescription \syntax |unselect [OPTIONS]| \endsyntax \arguments The same as the |select| command. \endarguments \options The same as the |select| command. \endoptions \subsubchapter `text'. \description Specifies translation of any default therion text in output. \enddescription \syntax |text | \endsyntax \arguments * || = standard ISO language identifier (e.g. |en| or |en_UK|) * || = therion text to translate. For list of therion texts and available translations, see |thlang/texts.txt| file. \endarguments \subsubchapter `layout'. \description Specifies layout for 2D maps. Settings which apply to atlas mode are marked `A'; map mode `M'. \enddescription \syntax |layout [OPTIONS] copy cs north scale base-scale units rotate symbol-set symbol-assign \ symbol-hide symbol-show symbol-colour size overlap page-setup page-numbers exclude-pages title-pages nav-factor nav-size transparency opacity surface surface-opacity sketches layers grid grid-origin grid-size grid-coords origin origin-label own-pages page-grid legend legend-columns legend-width map-comment map-header map-header-bg map-image statistics scale-bar survey-level language colour/color debug doc-author doc-keywords doc-subject doc-title code endcode endlayout| \endsyntax \arguments || = layout identifier (to be used in the |export| command) \endarguments \comopt * |copy | = set properties here that are not modified based on the given source layout. {\it map presentation-related:}\Nobreak * |scale | = set scale of output map or map atlas (M, A; default: |1 200|) * |base-scale | = if set, Therion will optically scale the map by a (|scale/base-scale|) factor. This has the same effect as if the map printed in |base-scale| would be photo-reduced to the |scale|. (M, A) * |rotate | = rotates the map (M, A; default: |0|) * |units | = set output units (M, A; default: |metric|) * |symbol-set | = use |symbol-set| for all map symbols, if available. Be aware, that symbol set name is case sensitive. (M, A) Therion uses following predefined symbol sets:\par UIS (International Union of Speleology)\par ASF (Australian Speleological Federation)\par AUT (Austrian Speleological Association)\par CCNP (Carlsbad Caverns National Park)\NEW{5.4}\par NZSS (New Zealand Symbol Set)\NEW{5.4}\par SKBB (Speleoklub Bansk\'a Bystrica) * {\rightskip 0cm minus 4pt |symbol-assign | = display a particular symbol in the given symbol-set. This option overrides |symbol-set| option.\par} If the symbol has a subtype, || argument may have one of the following forms: |type:subtype| or simply |type|, which assigns new symbol set to all subtypes of a given symbol. Following symbols may not be used with this option: point {\it section} (which isn't rendered at all) and all point and line labels ({\it label}, {\it remark}, {\it altitude}, {\it height}, {\it passage-height}, {\it station-name}, {\it date}). See the chapter {\it Changing layout/Customizing text labels} for details how to change labels' appearance. (M, A) Group may be one of the following: all, centerline, sections, \NEW{5.3}water, speleothems, passage-fills, \NEW{5.4}ice, sediments, equipment. There are two special symbols: north-arrow, scale-bar. * |symbol-hide | = don't display particular symbol or group of symbols. You may use |group cave-centerline|, |group surface-centerline|, |point cave-station|, |point surface-station| and \NEW{5.4}|group text| in |symbol-hide| and |symbol-show| commands. Use |flag:| as a || to hide stations with particular flags (e.g. |symbol-hide point flag:entrance|). May be combined with |symbol-show|.(M, A) * |symbol-show | = display particular symbol or group of symbols. May be combined with |symbol-hide|. (M, A) * \NEW{5.3}|symbol-colo[u]r | = change colour of particular symbol or group of symbols.\[Note: colour change currently applies to pattern fills only if (1) output format is PDF and (2)~\MP\ version is at least 1.000] (M, A) {\it page layout related:}\Nobreak * |size | = set map size in the atlas mode. If not specified, it will be calculated from |page-setup| and |overlap|. In map mode applies iff |page-grid| is |on| (M, A; default: |18 22.2 cm|) * |overlap | = set overlap size in paper units in the atlas mode or map margin in the map mode (M, A; default: |1 cm|) * |page-setup | = set page dimensions in this order: paper-width, paper-height, page-width, page-height, left-margin and top-margin. If not specified, it will be computed from |size| and |overlap| (A; default: |21 29.7 20 28.7 0.5 0.5 cm|) * |page-numbers | = turn on/off page numbering (A; default: |true|) * |exclude-pages | = exclude specified pages from cave atlas. The list may contain page numbers separated by a comma or dash (for intervals) e.g.~|2,4-7,9,23| means, that pages 2, 4, 5, 6, 7, 9 and 23 should be omitted. Only the map pages should be counted. (Set |own-pages 0| and |title-pages off| to get the correct page numbers to be excluded.) Changes of |own-pages| or |title-pages| options don't affect page excluding. (A) * |title-pages | = turn on/off title pages before each atlas chapter (A; default: |off|) * |nav-factor | = set atlas navigator zoom factor (A; default: |30|) * |nav-size | = set number of atlas pages in both directions of navigator (A; default: |2 2|) * |transparency | = set transparency for the passages (underlying passages are also visible) (M, A; default: |on|) * |opacity | = set opacity value (used if |transparency| is |on|). Value range is 0--100. (M, A; default: |70|) * |surface-opacity | = set the surface bitmap opacity (used if |transparency| is |on|). Value range is 0--100. (M, A; default: |70|) * |surface | = set the position of the surface bitmap above/below the map. (M, A; default: |off|) * |sketches | = turn on/off displaying of morphed sketch bitmaps. (M, A; default: |off|) * |layers | = enable/disable PDF~1.5 layers (M, A; default: |on|) * |grid | = enable/disable grid (optionally coordinates' values may be also displayed) (M, A; default: |off|) * |cs | = coordinate system for |origin| and |grid-origin| * |north | = specify default orientation of the map. By default, true (astronomical) north is used. It is ignored when used with local coordinate system. * |grid-origin | = set coordinates of grid origin (M, A) * |grid-size | = set grid size in real units (M, A; default is equal to scalebar size) * |grid-coords | = specify where to label grid with coordinates. (M, A; default: |off|) * |origin | = set origin of atlas pages (M, A) * |origin-label | = set label for atlas page which has the lower left corner at the given origin coordinates. May be either a number or a character. (M, A; default: |0 0|) * |own-pages | = set number of own pages added before the first page of automatically generated pages in atlas mode (currently required for correct page numbering) (A; default: |0|) * |page-grid | = show pages key plan (M; default: |off|) {\it map legend related:}\Nobreak * |map-header | = print map header at location specified by | |. Predefined map header contains some basic information about cave: name, scale, north arrow, list of surveyors etc. It is fully customizable (see the chapter {\it Changing layout} for details). || is easting (left-right on page). || is northing (up/down page). Ranges for || and || are -100--200. Lower-left corner of the map is |0 0|, upper-right corner is |100 100|. The header is aligned with the specified corner or side to this anchor point. (M; default: |0 100 nw|) * |map-header-bg | = when on, background of map header is filled with background color (e.g.~to hide map grid). (M; default: off) * |map-image | = include image specified by || into map at location specified by | |. For coordinates and alignment details, see |map-header| specification. * |legend-width | = legend width (M, A; default: |14 cm|) * |legend | = display list of used map symbols in the map header. If set to |all|, all symbols from the current symbol set are displayed. (M, A; default: |off|) * |colo[u]r-legend | = turn on/off legend of map-fg colours when map-fg is set to altitude, scrap or map (M, A) * |legend-columns | = adjusts the number of legend columns (M, A; default: |2|) * |map-comment | = optional comment displayed at the map header (M) * |statistics | or * |statistics | = display some basic statistics; if set to off, team members are sorted \NEW{5.4}alphabetically; otherwise according to their contribution to exploration and surveying (M, A; default: |off|) * |scale-bar | = set the length of the scale-bar (M, A) * |language | = set output language. Available languages are listed on the copyright page. See the {\it Appendix} if you want to add or customize translations. (M, A) * |colo[u]r | = customize colour for special map items (map-fg, map-bg, preview-above, preview-below, label). Colour range is 0--100 for grayscale, [0--100 0--100 0--100] triplet for RGB colours. For |map-fg|, you can use |altitude|, |scrap| or |map| as colours. In this case the map is coloured according to altitude, scraps or maps. For |map-bg|, you can use |transparent| to omit page background completely. For labels, you can switch colour |on/off|. If |on|, labels are coloured using the colour of associated scrap. * |debug | = draw scrap in different stages of transformation in different colours to see how Therion distorts map data. See the description of |scrap| command for details. The points with distance changed most during transformation are displayed orange. If |scrap-names| is specified, scrap names are shown for each scrap, |station-names| displays name of each survey station. * |survey-level | = |N| is the number of survey levels displayed next to the station name (M, A; default: |0|). {\it PDF related:}\Nobreak * |doc-author | = set document author (M, A) * |doc-keywords | = set document keywords (M, A) * |doc-subject | = set document subject (M, A) * |doc-title | = set document title (M, A) {\it customization:}\Nobreak * |code | = Add/redefine \TeX\ and \MP\ macros here. This allows user to configure various things (like user defined symbols, map and atlas layout at one place \&c.) See the chapter {\it Changing layout} for details. * |endcode| = should end the TeX\ and \MP\ sections \endcomopt \midinsert % \ifx\pdfoutput\undefined\else % \pdfximage {pic/page.pdf}% % \fi % \vbox to 482bp{\centerline{\hbox to 400bp{% % \ifx\pdfoutput\undefined % \epsfbox{mp/page.1}% % \else % \rlap{\pdfrefximage\pdflastximage}% % \convertMPtoPDF{mp/page.1}{1}{1} % \fi % \hss}}\vss % } \vbox to 482bp{\centerline{\hbox to 400bp{% \rlap{\pic{page.pdf}}% \MPpic{page.1} \hss}}\vss } \endinsert \subsubchapter `setup3d'. \syntax \list * |setup3d | \endlist \endsyntax \NEW{5.3}Temporary hack to set sampling distance in meters when generating piecewise linear 3d model from passage walls made of B\'ezier curves. \subsubchapter `sketch-colors'. \syntax \list * |sketch-colors | \endlist \endsyntax \NEW{5.4} This option can be used to reduce size of sketch bitmap images in maps. \subsubchapter `export'. \description Exports selected surveys or maps. \enddescription \syntax \list * |export [OPTIONS]| \endlist \endsyntax \arguments * || = The following export types are supported: |model| = 3D model of the cave |map| = one page 2D map |atlas| = 2D atlas in more pages |cave-list| = summary table of caves |survey-list| = summary table of surveys |continuation-list| = list of possible continuations |database| = SQL database with centreline \endarguments \penalty0 \options {\it common:}\Nobreak * |encoding/enc | = set output encoding * |output/o | = set output file name. If no file name is given the prefix ``|cave.|'' is used with an extension corresponding to output format. If the output filename is given and no output format is specified, the format is determined from the filename extension. {\it model:}\Nobreak * |format/fmt | = set model output format. Currently the following output formats are supported: |loch| (native format; default), |compass| (plt file), |survex| (3d file), |dxf|, |esri| (3d shapefiles), |vrml|, |3dmf| and |kml| (Google Earth). * |enable | and * |disable | = \hfil\break selects which features to export, if the format supports it. Surface is currently exported in |therion| format only. * |wall-source | = set source data for passage wall modeling. {\it map/atlas:}\Nobreak * |format/fmt | = set map format. Currently |pdf|, |svg|, |xhtml|\[SVG embedded in XHTML file which contains also legend], |survex|, |dxf|, |esri|\[ESRI shapefiles. Multiple files are written to a directory with the specified filename.], |kml| (Google Earth), |xvi|\[Xtherion vector image. XVI images may be used in xtherion to draw in-scale maps. Scale (100\,DPI image resolution is assumed) and grid-size from layout are used in export.] and \NEW{5.3}|bbox|\[Text file containing geographic coordinates of lower-left and upper-right corners of the map area.] for map; |pdf| for atlas are supported. * |projection | = unique identifier that specifies the map projection type. (See the |scrap| command for details.) If there is no map defined, all scraps in the given projection are exported. If there are no scraps with the specified projection then Therion will display centreline from selected surveys. * |layout | = use predefined map or atlas layout. * |layout-xxx| = where |xxx| stands for other layout options. Using this you can change some layout properties directly within the export command. * |encoding/enc | = set output encoding {\it common for lists:}\Nobreak * |format/fmt | = set continuation output format. Currently the following output formats are supported: |html| (default), |txt|, \NEW{5.4}|kml|\[For cave-list and continuation-list.] and |dbf|. {\it continuation-list:}\Nobreak * |attributes <(on)/off>| = set whether to export user defined attributes in continuation list table. * \NEW{5.3}|filter <(on)/off>| = set whether continuations without comment/text should be filtered out. {\it cave-list:}\Nobreak * |location | = set whether to export coordinates of cave entrances in the table. * \NEW{5.3}|surveys (on)/off| = exports raw list of caves when set |off|. Otherwise survey structure with aggregated ststistics is also displayed. {\it database:}\Nobreak * |format/fmt | = currently only |sql| * |encoding/enc | = set output encoding \endoptions {\it File formats summary:} \nobreak\medskip \bgroup \leavevmode\kern1em\vbox{\advance\hsize-1em\halign{#\hfil\quad&#\hfil\cr {\it export type}&{\it available formats}\cr\noalign{\smallskip\hrule\smallskip} model & loch, dxf, esri, compass, survex, vrml, 3dmf, kml\cr map & pdf, svg, xhtml, dxf, esri, survex, xvi, kml, \NEW{5.3}bbox\cr atlas & pdf\cr database & sql\cr lists & html, txt, kml, dbf\cr}}\egroup \subchapter Running Therion. Now, after mastering data and configuration files, we're ready to run Therion. Usually this is done from the command line in the data directory by typing |therion| The full syntax is |therion [-q] [-L] [-l ] [-s ] [-p ] [-d] [-x] [--use-extern-libs] []| or |therion [-h/--help] [-v/--version] [--print-encodings] [--print-tex-encodings] [--print-init-file] [--print-environment] [--print-symbols]| \penalty-200 \arguments || Therion takes only one optional argument: the name of a configuration file. If no name is specified |thconfig| in the current directory is used. If there is no |thconfig| file (e.g.~current directory is not a data directory), Therion exits with an error message. \endarguments \options * |-d| = Turn on debugging mode. The current implementation creates a temporary directory named |thTMPDIR| (in your system temporary directory) and does not delete any temporary files. %* |-g| = % Using this option you can generate a new configuration file. % If |cfg-file| is not specified therion will use the |thconfig| % file. If the destination file exists, it'll be overwritten. % Generate a new configuration file. This will be the given % || if specified, or |thconfig| in the current directory if not. % If the file already exists, it will be overwritten. % * |-h, --help| = Display short help. %* |-i| = % Ignore comments when writing |-g| or |-u| configuration file. % * |-L| = Do not create a log-file. Normally therion writes all the messages into a therion.log file in the current directory. * |-l | = Change the name of the log file. * |-p | = This option is used to set the search path (or list of colon-separated paths) which therion uses to find its source files (if it doesn't find them in the working directory). * |-q| = Run therion in quiet mode. It will print only warning and error messages to STDERR. * |--print-encodings| = Print a list of all supported input encodings. * |--print-tex-encodings| = Print a list of all supported encodings for PDF output. * |--print-init-file| = Print a default initialization file. For more details see the {\it Initialization} section in the {\it Appendix}. * |--print-environment| = Print environment settings for therion. * |--print-symbols| = Print a list of all therion supported map symbols in |symbols.xhtml| file. * |-s | = Set the name of the source file. %* |-u| = % Upgrade the configuration file. % * |--use-extern-libs| = Don't copy \TeX\ and \MP\ macros to working directory. \TeX\ and \MP\ should search for them on their own. Use with caution. * |-v, --version| = Display version information. * |-x| = Generate file `.xtherion.dat' with additional information for XTherion. \endoptions \subsubchapter XTherion---compiler. XTherion makes it easier to run Therion especially on systems without a command line prompt. Compiler window is the default window of XTherion. To run Therion it's enough to open a configuration file and press `F9' or `Compile' button. XTherion displays messages from Therion in the lower part of the screen. Each error message is highlighted and is hyperlinked to the source file where the error occurred. After a first run there are activated additional menus {\it Survey structure} and {\it Map structure}. User may comfortably select a survey or map for export by double clicking on some of the items in the tree. Simple click in the {\it Survey structure} tree displays some basic information about the survey in the {\it Survey info} menu. \endinput therion/thbook/mp/0000775000175000017500000000000012426431274013155 5ustar userusertherion/thbook/mp/page.10000664000175000017500000001205607627670126014167 0ustar useruser%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: -1 -1 398 483 %%Creator: MetaPost %%CreationDate: 2002.07.27:1312 %%Pages: 1 %%DocumentFonts: cmssdc10 /cmssdc10 /cmssdc10 def /fshow {exch findfont exch scalefont setfont show}bind def %%EndProlog %%Page: 1 1 0 0 1 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinejoin 10 setmiterlimit newpath 0 0 moveto 397 0 lineto 397 482 lineto 0 482 lineto closepath stroke [3 3 ] 0 setdash 1 setlinecap newpath 26 36 moveto 369 36 lineto 369 454 lineto 26 454 lineto closepath stroke [] 0 setdash newpath 26 46 moveto 369 46 lineto stroke newpath 361.60675 42.93755 moveto 369 46 lineto 361.60675 49.06245 lineto closepath gsave fill grestore stroke newpath 33.39325 49.06245 moveto 26 46 lineto 33.39325 42.93755 lineto closepath gsave fill grestore stroke 244.01044 52.99252 moveto (page-width) cmssdc10 11.95514 fshow 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 188 36 moveto 188 454 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 191.06085 446.61064 moveto 188 454 lineto 184.93915 446.61064 lineto closepath gsave fill grestore stroke newpath 184.93915 43.38936 moveto 188 36 lineto 191.06085 43.38936 lineto closepath gsave fill grestore stroke gsave [0 1 -1 0 181.00748 222.33757 ] concat 0 0 moveto (page-height) cmssdc10 11.95514 fshow grestore newpath 56 160 moveto 339 160 lineto stroke newpath 331.60744 156.93782 moveto 339 160 lineto 331.60744 163.06218 lineto closepath gsave fill grestore stroke newpath 63.39256 163.06218 moveto 56 160 lineto 63.39256 156.93782 lineto closepath gsave fill grestore stroke 72.71364 167.65671 moveto (size \(width\)) cmssdc10 11.95514 fshow 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 158 142 moveto 158 424 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 161.06123 416.60971 moveto 158 424 lineto 154.93877 416.60971 lineto closepath gsave fill grestore stroke newpath 154.93877 149.39029 moveto 158 142 lineto 161.06123 149.39029 lineto closepath gsave fill grestore stroke gsave [0 1 -1 0 150.34329 221.04077 ] concat 0 0 moveto (size \(height\)) cmssdc10 11.95514 fshow grestore 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 222 425 moveto 222 453 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 225.0616 445.60883 moveto 222 453 lineto 218.9384 445.60883 lineto closepath gsave fill grestore stroke newpath 218.9384 432.39117 moveto 222 425 lineto 225.0616 432.39117 lineto closepath gsave fill grestore stroke 227 435.84517 moveto (overlap) cmssdc10 11.95514 fshow newpath 0 385 moveto 26 385 lineto stroke newpath 18.609 381.93848 moveto 26 385 lineto 18.609 388.06152 lineto closepath gsave fill grestore stroke newpath 7.391 388.06152 moveto 0 385 lineto 7.391 381.93848 lineto closepath gsave fill grestore stroke gsave [0 1 -1 0 16.15483 390 ] concat 0 0 moveto (left-margin) cmssdc10 11.95514 fshow grestore 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 105 454 moveto 105 482 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 108.0616 474.60883 moveto 105 482 lineto 101.9384 474.60883 lineto closepath gsave fill grestore stroke newpath 101.9384 461.39117 moveto 105 454 lineto 108.0616 461.39117 lineto closepath gsave fill grestore stroke 110 464.84517 moveto (top-margin) cmssdc10 11.95514 fshow newpath 0 20 moveto 397 20 lineto stroke newpath 389.60692 16.9376 moveto 397 20 lineto 389.60692 23.0624 lineto closepath gsave fill grestore stroke newpath 7.39308 23.0624 moveto 0 20 lineto 7.39308 16.9376 lineto closepath gsave fill grestore stroke 192.09267 6.69781 moveto (paper-width) cmssdc10 11.95514 fshow 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 387 0 moveto 387 482 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 390.06227 474.60722 moveto 387 482 lineto 383.93773 474.60722 lineto closepath gsave fill grestore stroke newpath 383.93773 7.39278 moveto 387 0 lineto 390.06227 7.39278 lineto closepath gsave fill grestore stroke gsave [0 1 -1 0 380.00748 220.4198 ] concat 0 0 moveto (paper-height) cmssdc10 11.95514 fshow grestore newpath 42 184 moveto 127 184 lineto stroke newpath 119.60912 180.93852 moveto 127 184 lineto 119.60912 187.06148 lineto closepath gsave fill grestore stroke newpath 49.39088 187.06148 moveto 42 184 lineto 49.39088 180.93852 lineto closepath gsave fill grestore stroke 45.81305 191.65671 moveto (grid-size \(width\)) cmssdc10 11.95514 fshow 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 333 212 moveto 333 297 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 336.06148 289.60912 moveto 333 297 lineto 329.93852 289.60912 lineto closepath gsave fill grestore stroke newpath 329.93852 219.39088 moveto 333 212 lineto 336.06148 219.39088 lineto closepath gsave fill grestore stroke gsave [0 1 -1 0 325.34329 215.14018 ] concat 0 0 moveto (grid-size \(height\)) cmssdc10 11.95514 fshow grestore showpage %%EOF therion/thbook/mp/page.mp0000664000175000017500000000232307644400442014426 0ustar useruserprologues:=2; beginfig(1); defaultfont:="cmssdc10"; defaultscale:=1.2; ahlength:=8; labeloffset:=5bp; verbatimtex \font\tenrm=cmr10 \font\tenit=cmti10 \tenrm etex; drawoptions(withcolor blue); draw(0,0)--(397,0)--(397,482)--(0,482)--cycle; draw(26,36)--(369,36)--(369,454)--(26,454)--cycle dashed evenly; drawdblarrow(26,46)--(369,46); label.top("page-width",(270,46)); drawdblarrow(188,36)--(188,454); label.top("page-height",(188,250)) rotatedaround((188,250),90); drawdblarrow(56,160)--(339,160); label.top("size (width)",(100,160)); drawdblarrow(158,142)--(158,424); label.top("size (height)",(158,250)) rotatedaround((158,250),90); drawdblarrow(222,425)--(222,453); label.rt("overlap",(222,439)); drawdblarrow(0,385)--(26,385); label.rt("left-margin",(13,385)) rotatedaround((13,385),90); drawdblarrow(105,454)--(105,482); label.rt("top-margin",(105,468)); drawdblarrow(0,20)--(397,20); label.bot("paper-width",(220,20)); drawdblarrow(387,0)--(387,482); label.top("paper-height",(387,250)) rotatedaround((387,250),90); drawdblarrow(42,184)--(127,184); label.top("grid-size (width)",(84,184)); drawdblarrow(333,212)--(333,297); label.top("grid-size (height)",(333,255)) rotatedaround((333,255),90); endfig; end; therion/thbook/mp/schema.mp0000664000175000017500000000460010734746656014770 0ustar useruserprologues:=2; beginfig(1); verbatimtex \font\tenrm=cmr10 \font\tenit=cmti10 \tenrm etex; label(btex Therion etex,(15,0)); label.rt(btex {\it therion.mp} etex, (80,35)); %label(btex thPdf etex, (80,-55)); %label(btex theps2pdf etex, (140,-55)); label(btex {\it therion.tex} etex, (180,-95)); label(btex XTherion etex, (5,57)); label.lft(btex Loch etex, (0,-110)); drawoptions(withcolor blue); label.rt(btex \& other viewers etex, (0,-110)); %label(btex etex, (,)); drawoptions(withcolor red); label(btex MetaPost etex, (80,0)); label.rt(btex {\it Plain base} etex, (60,50)); label(btex makempx etex, (150,15)); label(btex mpto etex, (210,15)); label(btex \TeX etex, (210,-15)); label(btex dvitomp etex, (150,-15)); label(btex {\it Plain format} etex, (210,-40)); label(btex pdfTeX etex, (105,-85)); label(btex {\it Plain format} etex, (180,-75)); %label(btex etex, (,)); drawoptions(withcolor blue); %label(btex cavern etex, (-50,0)); %label(btex 3dtopos etex, (-50,-15)); drawoptions(withcolor (85/255,175/255,43/255)); label(btex {\it input data} etex, (15,30)); label(btex {\it PDF maps} etex, (110,-111)); %label(btex {\it 3D model} etex, (-15,-60)); label(btex {\it info \& log files} etex, (-25,-60)); label(btex {\it maps, models, DB} etex, (15,-85)); label(btex {\it scanned sketches} etex, (-50,80)); %label(btex etex, (,)); drawoptions(); drawarrow((15,22)--(15,7)); %drawarrow((-40,-70)--(-10,50)); drawarrow((-20,-50)--(-10,50)); %drawarrow((-6,2)--(-32,2)); %drawarrow((-6,3)--(-32,13)); %drawarrow((-50,10)--(-50,-8)); %drawarrow((-27,-13)--(-6,-3)); %drawarrow((-32,-2)--(-6,-2)); drawarrow((37,2)--(54,2)); drawarrow((54,-2)--(37,-2)); drawarrow((72,43)--(80,7)); drawarrow((101,28)--(85,7)); drawarrow((104,3)--(125,13)); drawarrow((174,15)--(194,15)); drawarrow((210,10)--(210,-8)); drawarrow((194,-15)--(171,-15)); drawarrow((125,-13)--(104,-3)); drawarrow((210,-34)--(210,-22)); %drawarrow((80,-6)--(80,-47)); %drawarrow((96,-55)--(114,-55)); %drawarrow((15,-6)--(64,-48)); %drawarrow((81,-61)--(99,-77)); drawarrow((15,-6)--(99,-77)); %drawarrow((134,-61)--(106,-77)); drawarrow((148,-75)--(125,-81)); drawarrow((154,-94)--(125,-87)); drawarrow((105,-90)--(105,-102)); drawarrow((15,-90)--(15,-102)); drawarrow((15,-6)--(-2,-50)); drawarrow((15,-6)--(15,-77)); %drawarrow((15,-6)--(32,-90)); drawarrow((15,51)--(15,37)); drawarrow((15,37)--(15,51)); drawarrow((-10,74)--(10,63)); endfig; end; therion/thbook/mp/xsect.mp0000664000175000017500000000130111221126132014616 0ustar useruserprologues:=1; beginfig(1); path p; pair a,b,c,d,x,y; a = (0,0); b = (100,10); c = (10,10); d = (60,20); x = whatever[a,b]; (c-x) = whatever * ((b-a)rotated 90); y = whatever[a,b]; (d-y) = whatever * ((b-a)rotated 90); p = a .. controls c and d .. b; draw p withcolor 0.5*white; draw a--c dashed evenly withcolor 0.5*white; draw d--b dashed evenly withcolor 0.5*white; pickup pencircle scaled 0.4 mm; draw c--x dashed withdots scaled 0.5 withcolor 0.5*white; draw d--y dashed withdots scaled 0.5 withcolor 0.5*white; pickup pencircle scaled 0.35 mm; draw a--x withcolor blue; draw y--b withcolor blue; pickup pencircle scaled 0.75 mm; draw c withcolor red; draw d withcolor red; endfig; end.therion/thbook/mp/schema.10000664000175000017500000001633510734746656014524 0ustar useruser%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: -87 -116 238 84 %%HiResBoundingBox: -86.02576 -115.3725 237.75685 83.45924 %%Creator: MetaPost 0.901 %%CreationDate: 2007.12.27:2207 %%Pages: 1 %%DocumentFonts: CMR10 CMTI10 %%BeginProlog /cmr10 /CMR10 def /cmti10 /CMTI10 def /fshow {exch findfont exch scalefont setfont show}bind def %%EndProlog %%Page: 1 1 -2.17175 -3.45926 moveto (Therion) cmr10 9.96265 fshow 83 32.50934 moveto (therion.mp) cmti10 9.96265 fshow 156.74844 -98.45926 moveto (therion.tex) cmti10 9.96265 fshow -15.90776 53.54074 moveto (XTherion) cmr10 9.96265 fshow -24.1707 -113.45926 moveto (Lo) cmr10 9.96265 fshow -12.686 -113.45926 moveto (c) cmr10 9.96265 fshow -8.5349 -113.45926 moveto (h) cmr10 9.96265 fshow 0 0 1 setrgbcolor 3 -113.45926 moveto (&) cmr10 9.96265 fshow 14.0696 -113.45926 moveto (other) cmr10 9.96265 fshow 40.1109 -113.45926 moveto (view) cmr10 9.96265 fshow 59.4827 -113.45926 moveto (ers) cmr10 9.96265 fshow 1 0 0 setrgbcolor 59.1476 -3.4039 moveto (MetaP) cmr10 9.96265 fshow 88.067 -3.4039 moveto (ost) cmr10 9.96265 fshow 63 46.54074 moveto (Plain) cmti10 9.96265 fshow 89.6167 46.54074 moveto (b) cmti10 9.96265 fshow 93.6903 46.54074 moveto (ase) cmti10 9.96265 fshow 129.24445 12.50934 moveto (mak) cmr10 9.96265 fshow 147.50934 12.50934 moveto (emp) cmr10 9.96265 fshow 165.49745 12.50934 moveto (x) cmr10 9.96265 fshow 198.65364 12.9047 moveto (mpto) cmr10 9.96265 fshow 200.72934 -17.33154 moveto (T) cmr10 9.96265 fshow 206.26384 -19.47624 moveto (E) cmr10 9.96265 fshow 211.79865 -17.33154 moveto (X) cmr10 9.96265 fshow 131.87344 -17.49066 moveto (dvitomp) cmr10 9.96265 fshow 182.24315 -42.49066 moveto (Plain) cmti10 9.96265 fshow 208.85985 -42.49066 moveto (format) cmti10 9.96265 fshow 88.6723 -87.49066 moveto (p) cmr10 9.96265 fshow 94.4839 -87.49066 moveto (dfT) cmr10 9.96265 fshow 109.4279 -87.49066 moveto (eX) cmr10 9.96265 fshow 152.24315 -77.49066 moveto (Plain) cmti10 9.96265 fshow 178.85985 -77.49066 moveto (format) cmti10 9.96265 fshow 0.33333 0.68628 0.16862 setrgbcolor -7.27745 27.50934 moveto (input) cmti10 9.96265 fshow 18.69165 27.50934 moveto (data) cmti10 9.96265 fshow 86.6239 -113.4353 moveto (PDF) cmti10 9.96265 fshow 110.9713 -113.4353 moveto (maps) cmti10 9.96265 fshow -56.8249 -62.49066 moveto (info) cmti10 9.96265 fshow -36.457 -62.49066 moveto (&) cmti10 9.96265 fshow -25.25461 -62.49066 moveto (lo) cmti10 9.96265 fshow -18.12581 -62.49066 moveto (g) cmti10 9.96265 fshow -9.9787 -62.49066 moveto (\014les) cmti10 9.96265 fshow -24.60126 -87.49066 moveto (maps,) cmti10 9.96265 fshow 4.42305 -87.49066 moveto (mo) cmti10 9.96265 fshow 17.15305 -87.49066 moveto (dels,) cmti10 9.96265 fshow 40.06694 -87.49066 moveto (DB) cmti10 9.96265 fshow -86.02576 76.54074 moveto (sc) cmti10 9.96265 fshow -77.87856 76.54074 moveto (anne) cmti10 9.96265 fshow -57.51065 76.54074 moveto (d) cmti10 9.96265 fshow -48.85435 76.54074 moveto (sketches) cmti10 9.96265 fshow 0 setgray 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit newpath 15 22 moveto 15 7 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 13.46927 10.69543 moveto 15 7 lineto 16.53073 10.69543 lineto closepath gsave fill grestore stroke newpath -20 -50 moveto -10 50 lineto stroke newpath -8.84474 46.17119 moveto -10 50 lineto -11.89055 46.47575 lineto closepath gsave fill grestore stroke newpath 37 2 moveto 54 2 lineto stroke newpath 50.30457 0.46927 moveto 54 2 lineto 50.30457 3.53073 lineto closepath gsave fill grestore stroke newpath 54 -2 moveto 37 -2 lineto stroke newpath 40.69543 -0.46927 moveto 37 -2 lineto 40.69543 -3.53073 lineto closepath gsave fill grestore stroke newpath 72 43 moveto 80 7 lineto stroke newpath 77.70413 10.27524 moveto 80 7 lineto 80.6926 10.93936 lineto closepath gsave fill grestore stroke newpath 101 28 moveto 85 7 lineto stroke newpath 86.02199 10.86707 moveto 85 7 lineto 88.4571 9.01172 lineto closepath gsave fill grestore stroke newpath 104 3 moveto 125 13 lineto stroke newpath 122.32173 10.02922 moveto 125 13 lineto 121.00551 12.79323 lineto closepath gsave fill grestore stroke newpath 174 15 moveto 194 15 lineto stroke newpath 190.30457 13.46927 moveto 194 15 lineto 190.30457 16.53073 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 210 10 moveto 210 -8 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 208.4692 -4.3044 moveto 210 -8 lineto 211.5308 -4.3044 lineto closepath gsave fill grestore stroke newpath 194 -15 moveto 171 -15 lineto stroke newpath 174.69565 -13.46918 moveto 171 -15 lineto 174.69565 -16.53082 lineto closepath gsave fill grestore stroke newpath 125 -13 moveto 104 -3 lineto stroke newpath 107.99449 -3.20677 moveto 104 -3 lineto 106.67827 -5.97078 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 210 -34 moveto 210 -22 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 211.53073 -25.69543 moveto 210 -22 lineto 208.46927 -25.69543 lineto closepath gsave fill grestore stroke newpath 15 -6 moveto 99 -77 lineto stroke newpath 95.19014 -75.78372 moveto 99 -77 lineto 97.16612 -73.44595 lineto closepath gsave fill grestore stroke newpath 148 -75 moveto 125 -81 lineto stroke newpath 128.18959 -78.58588 moveto 125 -81 lineto 128.96242 -81.5484 lineto closepath gsave fill grestore stroke newpath 154 -94 moveto 125 -87 lineto stroke newpath 128.95146 -86.3791 moveto 125 -87 lineto 128.23311 -89.35512 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 105 -90 moveto 105 -102 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 103.46927 -98.30457 moveto 105 -102 lineto 106.53073 -98.30457 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 15 -90 moveto 15 -102 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 13.46927 -98.30457 moveto 15 -102 lineto 16.53073 -98.30457 lineto closepath gsave fill grestore stroke newpath 15 -6 moveto -2 -50 lineto stroke newpath -2.09602 -46.00146 moveto -2 -50 lineto 0.75954 -47.10477 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 15 -6 moveto 15 -77 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 13.46931 -73.30469 moveto 15 -77 lineto 16.53069 -73.30469 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 15 51 moveto 15 37 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 13.46921 40.69557 moveto 15 37 lineto 16.53079 40.69557 lineto closepath gsave fill grestore stroke 0.5 0 dtransform exch truncate exch idtransform pop setlinewidth newpath 15 37 moveto 15 51 lineto stroke 0 0.5 dtransform truncate idtransform setlinewidth pop newpath 16.53079 47.30443 moveto 15 51 lineto 13.46921 47.30443 lineto closepath gsave fill grestore stroke newpath -10 74 moveto 10 63 lineto stroke newpath 6.02412 63.43968 moveto 10 63 lineto 7.49959 66.1223 lineto closepath gsave fill grestore stroke showpage %%EOF therion/thbook/mp/xsect.10000664000175000017500000000215111221126134014350 0ustar useruser%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: -1 -1 101 22 %%HiResBoundingBox: -0.49608 -0.49608 100.49608 21.06299 %%Creator: MetaPost 0.993 %%CreationDate: 2009.06.26:1209 %%Pages: 1 %%BeginProlog %%EndProlog %%Page: 1 1 0.5 0.5 0.5 setrgbcolor 0 0.5 dtransform truncate idtransform setlinewidth pop [] 0 setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit newpath 0 0 moveto 10 10 60 20 100 10 curveto stroke [3 3 ] 0 setdash newpath 0 0 moveto 10 10 lineto stroke newpath 60 20 moveto 100 10 lineto stroke 1.13383 0 dtransform exch truncate exch idtransform pop setlinewidth [0 2.5 ] 1.25 setdash newpath 10 10 moveto 10.8912 1.08919 lineto stroke 0 1.13383 dtransform truncate idtransform setlinewidth pop newpath 60 20 moveto 61.3866 6.13904 lineto stroke 0 0 1 setrgbcolor 0 0.99214 dtransform truncate idtransform setlinewidth pop [] 0 setdash newpath 0 0 moveto 10.8912 1.08919 lineto stroke newpath 61.3866 6.13904 moveto 100 10 lineto stroke 1 0 0 setrgbcolor 0 2.12598 dtransform truncate idtransform setlinewidth pop newpath 10 10 moveto 0 0 rlineto stroke newpath 60 20 moveto 0 0 rlineto stroke showpage %%EOF therion/thbook/ch05.tex0000664000175000017500000005204312446517404014030 0ustar useruser\eject \vbox{\pic[93.2mm]{thom.jpg}} \vskip-3cm %-2.35cm {\tenitbx\baselineskip15pt\leftskip2mm\rightskip6.8cm\parindent4.6cm Jesus said, `Let him who seeks continue seeking until he finds. When he finds, he will become troubled. When he becomes troubled, he will be astonished, and he will rule over the all.' \hfill\eightrm ---Gospel according to Thomas, {\eightmit 2}nd century\par } \chapter Changing layout of PDF maps. This chapter is extremely useful if you're not satisfied with the predefined layout of map symbols and maps provided, and want to adapt them to your needs. However, you need to know how to write plain \TeX\ and \MP\ macros to do this. \subchapter Page layout in the atlas mode. The |layout| command allows basic page setup in the atlas mode. This is done through its options such as |page-setup| or |overlap|. But there are no options which would specify the position of map, navigator and other elements inside the area defined by |page-width| and |page-height| dimensions; e.g., why is the navigator below the map and not on its right or left side? There are many possible arrangements for a page. Rather than offer even more options for the |layout| command, Therion uses the \TeX\ language to describe other page layouts. %(See the section `layout' where to put \TeX\ commands.) This approach has the advantage that the user has direct access to the advanced typesetting engine without making the language of Therion overcomplex. Therion uses pdf\TeX\ with the {\it plain} format for typesetting. So you should be familiar with the plain \TeX\ if you wish to define new layouts. The ultimate reference for plain \TeX\ is \list Knuth, D. E.: {\it The \TeX book}, Reading, Massachusetts, Addison-Wesley $^1$1984 %[...] \endlist For pdf\TeX's extensions there is a short manual \list Th\`anh, H. T.---Rahtz, S.---Hagen, H.: {\it The pdf\TeX\ user manual}, available at \hfil\break \www{http://www.pdftex.org} \endlist The \TeX\ macros are used inside of |code tex-atlas| part of the |layout| command (see the chapter {\it Processing data} for details). The basic one predefined by Therion is the |\dopage| macro. The idea is simple: for each page Therion defines \TeX\ variables (count, token, and box registers) which contain the page elements (map, navigator, page name etc.). At the end of each page macro |\dopage| is invoked. This defines the position of each element on the page. By redefining this macro you'll get desired page layout. Without this redefinition you'll get the standard layout. Here is the list of variables defined for each page: \list {\it Boxes:} * |\mapbox| = The box containing the map. Its width (height) is set according to the |size| and |overlap| options of the |layout| command to |size_width + 2*overlap| or |size_height + 2*overlap|, respectively * |\navbox| = The box containing the navigator, with dimensions |size_width * (2*nav_size_x+1) / nav_factor| or |size_height * (2*nav_size_y+1) / nav_factor|, respectively Both |\mapbox| and |\navbox| also contain hyperlinks. {\it Count registers:} * |\pointerE|, |\pointerW|, |\pointerN|, |\pointerS| contain the page number of the neighbouring pages in the E, W, N and S directions. If there is no such a page its page number is set to 0. * |\pagenum| current page number {\it Token registers:} * |\pointerU|, |\pointerD| contain information about pages above and below the current page. It consists of one or more concatenated records. Each record has a special format {\tt|page-name|\char124|page-number|\char124|destination|\char124\char124} If there are no such pages, the value is set to |notdef|. See the description of the |\processpointeritem| macro below for how to extract and use this information. * |\pagename| = name of the current map according to options of the |map| command. * |\pagelabel| = the page label as specified by |origin| and |origin-label| options of the |layout| command. \endlist The following variables are set at the beginning of the document: \list * |\hsize|, |\vsize| = \TeX\ page dimensions, set according to |page-width| and |page-height| parameters of the |page-setup| option of the |layout| command. They determine our playground when defining page layout using the |\dopage| macro. * |\ifpagenumbering| = This conditional is set true or false according to the |page-numbers| option of the |layout| command. \endlist There are also some predefined macros which help with the processing of |\pointer*| variables: \list * |\showpointer| with one of the |\pointerE|, |\pointerW|, |\pointerN| or |\pointerS| as an argument displays the value of the argument. If the value is 0 it doesn't display anything. This is useful because the zero value (no neighbouring page) shouldn't be displayed. * |\showpointerlist| with one of the |\pointerU| or |\pointerD| as an argument presents the content of this argument. (Which contains |\pointerU| or |\pointerD|, see above.) For each record it calls the macro |\processpointeritem|, which is responsible for data formatting. Macro |\showpointerlist| should be used without redefinition in the place where you want to display the content of its argument; for custom data formatting redefine |\processpointeritem| macro. * |\processpointeritem| has three arguments (page-name, page-number, destination) and visualizes these data. The arguments are delimited as follows {\tt|\def\processpointeritem#1|\char124|#2|\char124|#3\endarg{...}|} An example definition may be {\tt|\def\processpointeritem#1|\char124|#2|\char124}|#3\endarg{% \hbox{\pdfstartlink attr {/Border [0 0 0]}% goto name {#3} #2 (#1)\pdfendlink}% }| (note how to use the {\it destination} argument), or much simpler (if we don't need hyperlink features): {\tt|\def\processpointeritem#1|\char124|#2|\char124}|#3\endarg{% \hbox{#2 (#1)}% }| \endlist For font management there are macros \list * |\size[#1]| for size changes, * |\color[#1 #2 #3]| for colour changes (RGB values in the range 0--100), and * |\rm|, |\it|, |\bf|, |\ss|, |\si| for type face switching. \endlist %If you use own texts in \TeX\ macros (like a label for the scale bar), these %font switches work only in restricted manner: it's supposed that all characters %are present in the first encoding specified in the initialization file. See below for a list of predefined texts which may be used in the atlas. There is also a |\framed| macro which takes a box as an argument and displays the box framed. The frame style can be customized by redefining the |\linestyle| macro which defaults to |1 J 1 j 1.5 w|. Now we're ready to define the |\dopage| macro. You may choose which of the predefined elements to use. A very simple example would be |layout my_layout scale 1 200 page-setup 29.7 21 27.7 19 1 1 cm size 26.7 18 cm overlap 0.5 cm code tex-atlas \def\dopage{\box\mapbox} \insertmaps endlayout| which defines the landscape A4 layout without the navigator nor any texts. There is only a map on the page. Note the |\insertmaps| macro. Map pages are inserted at its position. This is not done automatically because you may wish to insert some other pages before the first map page. More advanced is the default definition of the |\dopage| macro: |\def\dopage{% \vbox{\centerline{\framed{\mapbox}} \bigskip \line{% \vbox to \ht\navbox{ \hbox{\size[20]\the\pagelabel \ifpagenumbering\space(\the\pagenum)\fi \space\size[16]\the\pagename} \ifpagenumbering \medskip \hbox{\qquad\qquad \vtop{% \hbox to 0pt{\hss\showpointer\pointerN\hss} \hbox to 0pt{\llap{\showpointer\pointerW\hskip0.7em}% \raise1pt\hbox to 0pt{\hss$\updownarrow$\hss}% \raise1pt\hbox to 0pt{\hss$\leftrightarrow$\hss}% \rlap{\hskip0.7em\showpointer\pointerE}} \hbox to 0pt{\hss\showpointer\pointerS\hss} }\qquad\qquad \vtop{ \def\arr{$\uparrow$} \showpointerlist\pointerU \def\arr{$\downarrow$} \showpointerlist\pointerD } } \fi \vss \scalebar }\hss \box\navbox } } }| Using other plain \TeX\ macros or \TeX\ primitives it's possible to add other features, e.g.~a different layout for odd and even pages; headers and footers; or adding a logo to each page. In addition to map pages contains atlas additional items: title page, basic facts about the cave, legend with used map symbols etc. Therion automatically generates list of used map symbols and lists of persons who have discovered, surveyed and drawn selected part of the cave. Following token registers may be used (according to user's requirements before or after the |\insertmaps| macro): \list * |\explotitle|, |\topotitle|, |\cartotitle| = translated titles * |\exploteam|, |\topoteam|, |\cartoteam| = participating members (according to |team|, |explo-team| options for |centreline| and |author| option of scraps) * |\explodate|, |\topodate|, |\cartodate| = corresponding dates * |\comment| = is set according to |map-comment| option of the |layout| command * |\copyrights| = is set according to copyright options for surveys and other objects * |\cavename| = name of the exported map; set according to |-title| option of exported map * |\cavelength|, |\cavedepth| = approximate length and depth of displayed map * |\cavelengthtitle|, |\cavedepthtitle| = translated labels * \NEW{5.4}|\cavemaxz|, |\caveminz| = altitude max/min value * \NEW{5.4}|\thversion| = current therion version * \NEW{5.4}|\currentdate| = current date * \NEW{5.4}|\outcscode|, |\outcsname| = output coordinat system code and name * \NEW{5.4}|\northdir| = `true' or `grid' * \NEW{5.4}|\magdecl| = magnetic declination in degrees * \NEW{5.4}|\gridconv| = grid meridian convergence in degrees \endlist There is a macro |\atlastitlepages| which combines most of the token registers mentioned above to get simple preformatted atlas introductory pages. For legend displaying there are \list * |\iflegend| = conditional; true iff |legend| option of the |layout| command was set to |on| or |all| values * |\legendtitle| = token register containing translated legend title * |\insertlegend| = macro for inserting legend symbols pictures with translated descriptions in the specified number of columns (according to |legend-columns| layout option) * |\formattedlegend| = combines all three above commands to get preformatted legend with header and symbols typeset in two\[Default; adjust the |legend-columns| layout option to get them more or less] columns if |legend| option is set |on| \endlist North arrow and scale bar may be displayed using \list * |\ifnortharrow| = conditional; true if map projection is plan and symbol north-arrow is not hidden in |layout| * |\ifscalebar| = conditional; true if scalebar is not hidden * |\northarrow| = PDF form with the north arrow * |\scalebar| = PDF form with the scale bar \endlist There is a general-purpose macro for typesetting in multiple columns\[Not to be used with map legend, where multiple columns are to be adjusted by |legend-columns| layout option]: \list * |\begmulti |, |\endmulti| = text between these macros is typeset in || columns \endlist Example how to create atlas with lists of surveyors etc.\ followed by map pages and with legend at the end: |code tex-atlas \atlastitlepages \insertmaps \formattedlegend| \subchapter Page layout in the map mode. In the map mode it's possible to use a lot of predefined variables which are described in the previous chapter: {\rightskip0cm plus 5cm |\cavename|, |\comment|, |\copyrights|, |\explotitle|, |\topotitle|, |\cartotitle|, |\exploteam|, |\topoteam|, |\cartoteam|, |\explodate|, |\topodate|, |\cartodate|, |\cavelength|, |\cavedepth|, |\cavelengthtitle|, |\cavedepthtitle|, |\cavemaxz|, |\caveminz|, |\thversion|, |\currentdate|, |\outcscode|, |\outcsname|, |\northdir|, |\magdecl|, |\gridconv|, |\ifnortharrow|, |\ifscalebar|, |\northarrow|, |\scalebar|, |\iflegend|, |\legendtitle|, |\insertlegend|, |\begmulti |, |\endmulti|, |\formattedlegend|, |\legendcolumns|. \par} In order to place them somewhere on the map page, you have to define |\maplayout| macro in the |code tex-map| section of the |layout| command. It should contain one or more |\legendbox| invocations. The |\legendbox| macro has four parameters: coordinates ranging 0--100, alignment specification (N, E, S, W, NE, SE, SW, NW or C) and the content to be displayed. A simple example is |\def\maplayout{ \legendbox{0}{100}{NW}{\northarrow} }| which displays north arrow in the upper-left corner of the map sheet. For user's convenience, there is |\legendcontent| token register. It contains preformatted cave name, north arrow, scale bar, explo/topo/carto teams, comment, copyrights and legend. (The |\legendcontent| is also used in the default map layout definition: |\def\maplayout{\legendbox{0}{100}{NW}{\the\legendcontent}}|). Width of the above text may be adjusted by |\legendwidth| dimen register (its default value is set by |legend-width| layout option). The color and size of texts in the preformatted legend can be easily changed using |\legendtextcolor|, |\legendtextsize|, |\legendtextsectionsize| and |\legendtextheadersize| token registers, e.g. for large blue text: |code tex-map \legendwidth=20cm \legendtextcolor={\color[0 0 100]} \legendtextsize={\size[20]} \legendtextheadersize={\size[60]}| It is possible to display the whole map framed by setting the |\framethickness| dimen register to positive value, e.g. |0.5mm|. \subchapter Customizing text labels. There is a preliminary interface to changing font sizes for labels via the \MP\ macro |fonts_setup(,,,,);| which may be used inside of the |code metapost| section of the |layout| command. || applies to point label, || applies to remark and all other point labels. Each of them may apply to line label according to its |-size| option. Example: |code metapost fonts_setup(6,8,10,14,20); % default values depend on scale; for 1:200 they are 7,8,10,12,14| \subchapter New map symbols. Therion's layout command makes it easy to switch among various predefined map symbol sets. If there is no such symbol or symbol set you want, it's possible to design new map symbols. However, this requires knowledge of the \MP\ language, which is used for map visualization. It's described in \list Hobby, J. D.: {\it A User's Manual for MetaPost}, available at \hfil\break \www{http://cm.bell-labs.com/cm/cs/cstr/162.ps.gz} \endlist User may also benefit from comprehensive reference to the {\manfnt METAFONT} language, which is quite similar to \MP: \list Knuth, D. E.: {\it The METAFONTbook}, Reading, Massachusetts, Addison-Wesley $^1$1986 \endlist New symbols may be defined in the |code metapost| section of the |layout| command. This makes it easy to add new symbols at the run-time. It is also possible to add symbols permanently by compiling them into Therion executable (see the {\it Appendix} for instructions how to do this). Each symbol has to have a unique name, which consists of following items: \list * one of the letters `p', `l', `a', `s' for point, line, area or special symbols, respectively; * underscore character; * symbol type as listed in the chapter {\it Data format\/} with all dashes removed; * if the symbol has a subtype, add underscore character and subtype; * underscore character; * symbol set identifier in uppercase \endlist Example: standard name for a point `water-flow' symbol with a `permanent' subtype in the `MY' set is |p_waterflow_permanent_MY|. Standard name for user-defined symbol types should not include symbol set identifier, e.g.~|p_u_bat|. Each new symbol has to be registered by a macro call |initsymbol("");| unless it's compiled into Therion executable. There are four predefined pens {\it PenA} (thickest) \dots\ {\it PenD} (thinnest), which should be used for all drawings. For drawing and filling use |thdraw| and |thfill| commands instead of \MP's |draw| and |fill|. \NEW{5.4}The following variables are also available: \list * boolean |ATTR__shotflag_splay|, |ATTR__shotflag_duplicate|,\hfil\break |ATTR__shotflag_approx| = set for line survey * boolean |ATTR__stationflag_splay| = set true for endstations of splay shots * boolean |ATTR__scrap_centerline| = set true for scraps created from centreline * boolean |ATTR__elevation| = true for (extended) elevation, false for plan projection * numeric |ATTR__height| = height of a pit or wall:pit * string |ATTR__id| = contains current object ID * string |ATTR__survey| = contains current survey name * string |ATTR__scrap| = contains current scrap name * picture |ATTR__text| = contains typeset text e.g.\ for point continuation * string |NorthDir| = `true' or `grid' * numeric |MagDecl| = magnetic declination in degrees * numeric |GridConv| = grid meridian convergence in degrees \endlist \subsubchapter Point symbols. Point symbols are defined as macros using |def ... enddef;| commands. Majority of point symbol definitions has four arguments: position (pair), rotation (numeric), scale (numeric) and alignment (pair). Exceptions are {\it section} which has no visual representation; all {\it labels}, which require special treatment as described in the previous chapter, and {\it station} which takes only one argument: position (pair). All point symbols are drawn in local coordinates with the length unit {\it u}. Recommended ranges are $\left<-0.5u,0.5u\right>$ in both axes. The symbol should be centered at the coordinates' origin. For the final map, all drawings are transformed as specified in the {\it T\/} transformation variable, so it's necessary to set this variable before drawing. This is usually done in two steps (assume that four arguments are {\it P}, {\it R}, {\it S}, {\it A}): \list * set the {\it U} pair variable to $\left({width\over2},{height\over2}\right)$ of the symbol for correct alignment. The alignment argument {\it A} is a pair representing ratios $\left(shift_x\over U_x\right)$ and $\left(shift_y\over U_y\right)$. (Hence |aligned A| means |shifted (xpart A * xpart U, ypart A * ypart U)|.) * set the {\it T} transformation variable {\catcode`\=12|T:=identity aligned A rotated R scaled S shifted P;|} \endlist For drawing and filling use |thdraw| and |thfill| commands instead of \MP's |draw| and |fill|. These take automatically care of {\it T} transformation. An example definition may be |def p_entrance_UIS (expr P,R,S,A)= U:=(.2u,.5u); T:=identity aligned A rotated R scaled S shifted P; thfill (-.2u,-.5u)--(0,.5u)--(.2u,-.5u)--cycle; enddef; initsymbol("p_entrance_UIS");| \subsubchapter Line symbols. Line symbols differ from point symbols in respect that there is no local coordinate system. Each line symbol gets the {\it path} in absolute coordinates as the first argument. Therefore it's necessary to set {\it T} variable to |identity| before drawing. Following symbols take additional arguments: \list * arrow = numeric: 0 is no arrows, 1 arrow at the end, 2 begin, 3 both ends * contour = text: list of points which get the tick or one of $-1$, $-2$ or $-3$ to mark undefined tick, tick in the middle or no tick, respectively * section = text: list of points which get the orientation arrow or $-1$ to indicate no arrows * slope = numeric: 0 no border, 1 border; text: list of (point,direction,length) triplets \endlist Usage example: |def l_wall_bedrock_UIS (expr P) = T:=identity; pickup PenA; thdraw P; enddef; initsymbol("l_wall_bedrock_UIS");| \subsubchapter Area symbols. Areas are similar to lines: they take only one argument -- {\it path} in absolute coordinates. You may fill them in three ways: \list * fill an uniform or randomised grid in a temporary picture (having dimensions |bbox path|) with some point symbols; clip it according to |path| and add to the |currentpicture| * fill |path| with a solid colour * fill |path| with a predefined pattern using a |withpattern| keyword. \endlist Patterns are defined using the same user interface (without the |patterncolor| macro) as described in the article \list Bolek, P.: ``\MP\ and patterns,'' {\it TUGboat}, 3, XIX (1998), pp.~276--283, available online at \www{http://www.tug.org/TUGboat/Articles/tb19-3/tb60bolek.pdf} \endlist You may use standard \MP\ |draw| and similar macros without setting of {\it T} variable in pattern definitions. Example on how to define and use patterns: |beginpattern(pattern_water_UIS); draw origin--10up withpen pensquare scaled (0.02u); patternxstep(.18u); patterntransform(identity rotated 45); endpattern; def a_water_UIS (expr p) = T:=identity; thclean p; thfill p withpattern pattern_water_UIS; enddef; initsymbol("a_water_UIS");| \subsubchapter Special symbols. There are currently two special symbols: scale bar and north arrow. Both are experimental and subject to change. \endinput therion/thbook/thbook.tex0000664000175000017500000002161312446517637014566 0ustar useruser% The Therion Book % Copyright (C) 2003, 2004 Martin Budaj, Stacho Mudrak % Thanks to Wookey for corrections \ifx\pdfoutput\undefined \input epsf \gdef\outline#1{} \def\pdfstartlink#1 #2 #3 #4 #5 #6 #7\pdfendlink{#7} \let\red\relax \let\blue\relax \let\grey\relax \let\black\relax \let\green\relax \let\POPcolor\relax \else \ifnum\pdftexversion<110 \message{Warning: PdfTeX too ancient to process samples} \else\ifnum\pdftexversion<130 \pdfoptionpdfminorversion 5 \else \pdfminorversion 5 \fi\fi \ifnum\pdftexversion>139 \openin0=glyphtounicode.tex \ifeof0\message{No glyph to unicode mapping found!}\else\closein0\input glyphtounicode.tex\pdfgentounicode=1\fi \fi \input etc/supp-mis \input etc/supp-pdf \openin0=version.tex \read 0 to \thversion \closein0 \pdfinfo{/Title (The Therion Book \thversion) /Author (Martin Budaj, Stacho Mudrák) /Subject (Therion documentation) /Keywords (caves, surveying, cartography, computers) /Creator (TeX) } \pdfcatalog{/ViewerPreferences << /DisplayDocTitle true >> } \gdef\outline#1{\pdfoutline goto page \the\pageno {/XYZ} {#1}} \ifnum\pdftexversion<140 \let\red\relax \let\blue\relax \let\grey\relax \let\black\relax \let\green\relax \let\POPcolor\relax \else \chardef\Color=\pdfcolorstackinit page direct{0 g} \def\red{\pdfcolorstack\Color push{0 0.89 0.94 0.28 k}} \def\blue{\pdfcolorstack\Color push{1 1 0 0 k}} \def\grey{\pdfcolorstack\Color push{0 0 0 0.50 k}} \def\green{\pdfcolorstack\Color push{0.91 0 0.88 0.12 k}} \def\black{\pdfcolorstack\Color push{0 0 0 1 k}} \def\POPcolor{\pdfcolorstack\Color pop} \fi \fi \catcode`@=11 \input etc/optarg \input etc/verbatim %\input etc/path.sty \font\rm=cmr12 \font\it=cmti12 \font\mit=cmmi10 at 12pt \font\bf=cmbx12 \font\tt=cmtt12 \font\tenrm=cmr10 \font\sy=cmsy10 at 12pt \font\eightrm=cmr8 \font\eightit=cmti8 \font\eightmit=cmmi8 \font\tenitbx=cmbxti10 \textfont0=\rm \textfont1=\mit \textfont2=\sy \font\manfnt=logo10 at 12pt \font\chap=cmssdc10 at 16pt \font\subchap=cmssdc10 at 12pt \def\MP{{\manfnt META}\-{\manfnt POST}} \footline={\hss\black\tenrm\folio\POPcolor\hss} \def\cvak{\ifdim\dimen0<6pt \dimen0=9pt \else \dimen0=3pt\fi} \def\bodky{\leaders\hbox to12pt{\kern\dimen0.\hss}\hfil} \def\chapter#1.{\outline{#1} \skiplines2\centerline{\chap #1} \nobreak \write1{\string\cvak\string\penalty-50 \string\Line{\string\pdfstartlink\space attr {/Border [0 0 0]} goto page \folio\space {/Fit} \string\bf\space #1\string\bodky\ \folio\string\pdfendlink}}% \skiplines1} \def\subchapter#1.{%\global\advance\kapnum by1\pictnum=1\relax \penalty-100\skiplines2\centerline{\subchap #1}\nobreak \write1{\string\cvak\string\Line{\string\quad\string\pdfstartlink\space attr {/Border [0 0 0]} goto page \folio\space {/Fit} #1\string\bodky\ \folio\string\pdfendlink}}\nobreak %\skiplines1\nobreak } \def\subsubchapter#1.{%\global\advance\kapnum by1\pictnum=1\relax \penalty-100\skiplines2\leftline{\subchap #1}\nobreak \write1{\string\cvak\string\Line{\string\qquad\string\pdfstartlink\space attr {/Border [0 0 0]} goto page \folio\space {/Fit} #1\string\bodky\ \folio\string\pdfendlink}}\nobreak } \def\skiplines#1{\par\hbox{}\nobreak\vskip-\baselineskip \vskip#1\baselineskip} \let\,\thinspace \def\Nobreak{\let\brnobr\nobreak\nobreak} \def\eq{=} {\catcode`\*=13\catcode`\=13 \gdef\itemize{% \par\nobreak\advance\leftskip1em%\parskip0pt \let\brnobr\nobreak \catcode`\*13\def*{\par\brnobr\leavevmode\let\brnobr\relax \llap{$\bullet$ }\ignorespaces} \catcode`\=13\def={\ifmmode\eq\else\unskip\ $\triangleright$ \ignorespaces\fi} } } \catcode`\|=13 \def|{\ifvmode\penalty-100\medskip\fi\blue\verbatim|} \def\setupverbatim % see D.E.K., p. 381 {\parskip=0pt % \tt % \spaceskip=0pt \xspaceskip=0pt % just in case... \catcode`\^^I=\active % % \catcode`\<=\active \catcode`\>=\active % % \catcode`\,=\active \catcode`\'=\active % \catcode`\`=\active % \catcode`\*=12 \catcode`\"=12 \catcode`\'=12 \def\par{\leavevmode\endgraf}% this causes that empty lines aren't % skipped \obeylines \uncatcodespecials \obeyspaces % }% \def\doverbatim#1{\def\next##1#1{##1\endgroup\POPcolor}\next}% \def\MPpic#1{%\par\penalty-200 % \midinsert \ifx\pdfoutput\undefined %\centerline{ \epsfbox{mp/#1}%} \else %\centerline{ \convertMPtoPDF{mp/#1}{1}{1}%}% \fi % \endinsert } \def\pic{\@getoptionalarg\@pic} \def\@pic#1{% \ifx\pdfoutput\undefined[[PICTURE SKIPPED IN DVI OUTPUT]]\else \pdfximage\ifx\@optionalarg\empty \else width\@optionalarg \fi{pic/#1}\pdfrefximage\pdflastximage \fi } \def\fitpic#1{ \ifx\pdfoutput\undefined[[PICTURE SKIPPED IN DVI OUTPUT]]\else \medskip \setbox0=\hbox{\pdfximage{#1}\pdfrefximage\pdflastximage} \centerline{\pdfximage \ifdim\wd0>\ht0 width \else height \fi 10cm{#1}\pdfrefximage\pdflastximage} \medskip \fi } \def\mapsymbol#1{% \ifx\pdfoutput\undefined \hbox{\epsfbox{sym/symlib.#1}}% \else \convertMPtoPDF{sym/symlib.#1}{1}{1}% \fi } %\def\future#1{% %[This chapter will be finished hopefully in the near future. Please read a %chapter {\it Syntax summary (#1)} in the {\it Appendix}.]} \def\list{\penalty50\bgroup\itemize} \def\endlist{\par\egroup\penalty-50} \def\syntax{\par{\it Syntax:} } \def\endsyntax{} \def\context{\par{\it Context:} } \def\endcontext{} \def\description{\par{\it Description:} } \def\enddescription{} \def\arguments{\penalty-40\par{\it Arguments:}\bgroup\nobreak\itemize} \def\endarguments{\par\egroup} \def\options{\penalty-40\par{\it Options:}\bgroup\nobreak\itemize} \def\endoptions{\par\egroup} \def\comopt{\penalty-40\par{\it Command-like options:}\bgroup\nobreak\itemize} \def\endcomopt{\par\egroup} \def\example{\penalty-40\par{\it Example:} } \def\endexample{} \def\notes{\par{\it Special notes:} } \def\endnotes{} \def\www{\@getoptionalarg\@www} \def\@www#1{\ifx\pdfoutput\undefined \ifx\@optionalarg\empty{\tt#1}\else\@optionalarg\fi \else \pdfstartlink attr {/Border [0 0 0]} user{% /Subtype /Link /A << /Type /Action /S /URI /URI (#1) >>}% \green\ifx\@optionalarg\empty{\tt#1}\else\@optionalarg\fi\POPcolor \pdfendlink \fi} \def\NEW#1{\ifdim#1pt>5.2pt% \leavevmode\vadjust{% \vbox to 0pt{% \vss \line{% \ifodd\pageno\hfil\fi \raise2.3pt\ifodd\pageno\expandafter\rlap\else\expandafter\llap\fi {\ifodd\pageno\quad\fi\grey\tenit #1\POPcolor\ifodd\pageno\else\quad\fi}% \ifodd\pageno\else\hfil\fi }% }% }\fi\ignorespaces }% \newcount\footnum \footnum 0 \long\def\[#1]{\unskip\global\advance\footnum by 1\footnote{$^{\the\footnum}$}{#1}} \def\tenpoint{\def\rm{\fam0\tenrm}% \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\sevenrm \textfont1=\tenit %\scriptfont1=\sevenit \scriptscriptfont1=\sevenit \def\it{\fam\itfam\tenit}% \textfont\itfam=\tenit \def\bf{\fam\bffam\tenbf}% \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf \scriptscriptfont\bffam=\sevenbf \def\tt{\fam\ttfam\tentt}% \normalbaselineskip=12pt \setbox\strutbox=\hbox{\vrule height9.5pt depth4.5pt width0pt}% \normalbaselines\rm} % new tenpoint def \def\tenpoint{\def\rm{\fam0\tenrm}% switch to 10-point type \textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm \textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei \textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy \textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex \textfont\itfam=\tenit \def\it{\fam\itfam\tenit}% \textfont\slfam=\tensl \def\sl{\fam\slfam\tensl}% \textfont\ttfam=\tentt \def\tt{\fam\ttfam\tentt}% \textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf \scriptscriptfont\bffam=\fivebf \def\bf{\fam\bffam\tenbf}% \normalbaselineskip=12pt \font\manfnt=logo10 \setbox\strutbox=\hbox{\vrule height9.5pt depth4.5pt width0pt}% \normalbaselines\rm} \catcode`@=11 \def\vfootnote#1{\insert\footins\bgroup\tenpoint \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip=18pt \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \indent\black\llap{#1\thinspace}\ignorespaces \footstrut\futurelet\next\fo@t} \count\footins=1000 % footnote magnification factor (1 to 1) \def\@foot{\POPcolor\strut\egroup} \catcode`@=12 % at signs are no longer letters \parskip=\medskipamount \parindent=0pt \baselineskip=16pt \raggedbottom \widowpenalty10000 \clubpenalty10000 \hsize=159.2mm \vsize=239.2mm \pdfpagewidth=210mm \pdfpageheight=297mm \language0 \rm \input ch00 \input ch01 \input ch02 \input ch03 \input ch04 \input ch05 \input ch06 \input ch07 \end therion/thbook/ch06.tex0000664000175000017500000004177212447620273014040 0ustar useruser\eject \vbox{\hsize=93.2mm\baselineskip=12pt\leftskip3.5mm\parskip0pt \eightit \leavevmode\llap{1. }When a distinguished but elderly scientist states that something is possible, he is almost certainly right. When he states that something is impossible, he is very probably wrong. \leavevmode\llap{2. }The only way of discovering the limits of the possible is to venture a little way past them into the impossible. \leavevmode\llap{3. }Any sufficiently advanced technology is indistinguishable from magic. \vskip 6pt \rightline{\eightrm ---Arthur C. Clarke, {\eightmit 1973}} } \chapter Appendix. \subchapter Compilation. If you want to compile Therion from source code and run it, you need (first three are required only during compilation): \list * GNU C/C++ compiler * GNU make * Perl * Tcl/Tk 8.4.3 and newer (\www{http://www.tcl.tk}) with {\it BWidget} widget set \hfil\break (\www{http://sourceforge.net/projects/tcllib}) and optionally {\it tkImg} extension \hfil\break (\www{http://sourceforge.net/projects/tkimg}). % {\it Tom} OpenGL extension (improved version is included in Therion source % distribution) % and * \TeX\ distribution with at least \TeX\ with Plain format, recent pdf\TeX, and \MP\ (\www{http://www.tug.org}). * LCDF Typetools package (\www{http://www.lcdf.org/type/}) * ImageMagick distribution with {\it convert} and {\it identify} utilities, if you want to use warping of survey sketches. * {\it ghostscript} if you want to create calibrated images from georeferenced PDF maps. \endlist To compile Loch, you need \list * freetype 2 and newer; freetype-config must work * wxWidgets 2.6 and newer; wx-config must work * VTK 5.0 and newer * libjpeg, libpng, zlib \endlist All programs (with the exception of BWidget and tkImg package) are usually included in Linux, Unix or MacOS\,X distributions. For Windows consider using MinGW and MSYS (\www{http://www.mingw.org}). It's a distribution of GNU utilities with GNU make and GCC. (BTW, why not to use precompiled Windows version?) \subsubchapter Quick start. \list * unpack the source distribution |therion-5.*.tar.gz| * |cd therion| * |make config-macosx| or |make config-win32|, if you use MacOS~X or Windows, respectively * |make| * |sudo make install| \endlist %Installing Tom: % %\list %* if you use Windows, download a Tcl/Tk source distribution, |make| and % |make install| it under MSYS %* |cd therion/thtom/linux| or |cd therion/thtom/win| %* |make| %* copy |Tom0.2| directory (which should contain |pkgIndex.tcl| and one of % |libtom.so| or |libtom.dll|) % to the |lib| subdirectory of your % Tcl/Tk distribution. %\endlist \subsubchapter Hacker's guide. {\it Make parameters} Therion's {\it makefile} may take some optional parameters. \list * |config-linux|, |config-macosx|, |config-win32| = configure Therion for a specific platform. Linux is a default. * |config-release|, |config-oxygen|, |config-ozone| = set optimization level for C++ compiler (none, |-O2| and |-O3|) * |config-debug| = useful before debugging the program * |install| = install Therion * |clean| = delete all temporary files \endlist {\it Adding new translations} Therion supports translation of map labels. Suppose you want to add a new language |xx|. \list * run `|perl process.pl export xx|' in the `thlang' Therion source subdirectory. This creates a file |texts_xx.txt|. This file is UTF-8 encoded. * edit the |texts_xx.txt| file. Add your translations at lines beginning with `|xx:|'. * run |make update| * compile Therion \endlist {\it Adding new encodings} Although UTF-8 Unicode encoding covers all characters which Therion is able to process, it may be inconvenient to use it. In that case it's possible to add support for any 8-bit encoding for text input files. Copy a translation file to the |thchencdata| directory; add its name to `ifiles' hash in the beginning of the Perl script |generate.pl|; run it and recompile Therion. The translation file should contain two hexadecimal values of a character (first one in the 8-bit encoding, second one in Unicode) in each line. Possible comments follow the `|#|' character. {\it Adding new \TeX\ encodings} It's easy to add new encodings for 2D map output.% \[\NEW{5.3}This section applies to old-style font selection using |tex-fonts| command in the initialization file and is obsolete when using |pdf-fonts| command.] Copy an appropriate encoding mapping file with an |*.enc| extension to the |texenc/encodings|, run the Perl script |mktexenc.pl| located in the |texenc| directory and compile Therion. Therion uses the same encoding files as |afm2tfm| program from the \TeX\ distribution, which has the same format as an encoding vector in a PostScript font. You may find more details in the chapter {\it 6.3.1.5 Encoding file format} in the documentation to Dvips program. {\it Generating new \TeX\ and \MP\ headers} Therion uses \TeX\ and \MP\ for 2D map visualization and typesetting. Predefined macros are compiled into the Therion executable and are copied to the working directory just before running \MP\ and \TeX\ (unless the |--use-extern-libs| option is used). Layout command makes it possible to modify some macros in the configuration file at the run-time. However, it's possible to make permanent changes to the macro files. After modifying the files in the |mpost| and |tex| directories it's necessary to run Perl scripts |genmpost.pl| and |gentex.pl|, which generate C++ header files, and compile Therion executable again. \subchapter Environment variables. Therion reads following environment variables: \list * |THERION| = [not required] search path for (x)therion.ini file(s) * |HOME| (|HOMEDRIVE| + |HOMEPATH| on WinXP) = [not required, but usually present on your system] search path for (x)therion.ini file(s) * |TEMP|, |TMP| = system temporary directory, where Therion stores temporary files (in a directory named |th$PID$|, where |$PID$| is a process ID), unless |tmp-path| is specified in the initialization file. \endlist Consult the documentation of your OS how to set them. \subchapter Initialization files. Therion's and XTherion's system dependent settings are specified in the file therion.ini or xtherion.ini, respectively. They are searched for in the following directories: \list * on UNIX: |.|, |$THERION|, |$HOME/.therion|, |/etc|, |/usr/etc|, |/usr/local/etc| * on Windows: |.|, |$THERION|, |$HOME\.therion|, ||, |C:\WINDOWS|, |C:\WINNT|, |C:\Program Files\Therion| \endlist \subsubchapter Therion. If no file is found Therion uses its default settings. If you want to list them, use |--print-init-file| option. The initialization file is read like any other therion file. (Empty lines or lines starting with `|#|' are ignored; lines ending with a backslash continue on next line.) Currently supported initialization commands follow. \list * |loop-closure | By default, survex is used if present, otherwise therion. * |encoding-default | Set the default output encoding (currently unused). * |encoding-sql | Set the default output encoding for SQL export. * |language | Default output language. See the copyright page for the list of available languages. * |units | Set default units. * |mpost-path | Set the full path to a \MP\ executable if Therion can't find it (``|mpost|'' is the default). * |mpost-options | Set \MP\ options. * |pdftex-path | Set the full path to a pdf\TeX\ executable if Therion can't find it (``|pdfetex|'' is the default). * |identify-path | Set the full path to ImageMagick's identify executable if Therion can't find it (``|identify|'' is the default). * |convert-path | Set the full path to ImageMagick's convert executable if Therion can't find it (``|convert|'' is the default). * |source-path | Path to data and configuration files. Used mostly for system-wide grades and layout definitions. * |tmp-path | Path where temporary directory should be created. * |tmp-remove | System command to delete files from the temporary directory. * |tex-env | [Works on Windows only.] When set to |off| (default), Therion temporarily clears all environment variables related to \TeX. Useful if there is other \TeX distribution installed on your system which had set-up any environment variables, which could confuse \TeX\ and \MP\ programs supplied in Therion for Windows distribution. Set to |on| if you use other \TeX\ distribution for maps processing. * |text | Using this option you can change any default therion text translation in output. For list of therion texts and available translations, see |thlang/texts.txt| file. * |cs-def |\NEW{5.4} %[other options] Define a new coordinate system || using Proj4 syntax. * |pdf-fonts |\NEW{5.3} Set-up fonts to be used in PDF maps. The command has to be followed by paths specifying where regular, italic, bold, sans-serif and sans-serif oblique fonts are located in your system. TrueType and OpenType fonts are supported. Therion requires LCDF Typetools to be installed on your system to use this command. Example: |pdf-fonts "/usr/share/fonts/Serif.ttf" \ "/usr/share/fonts/Serif-Italic.ttf" \ "/usr/share/fonts/Serif-Bold.ttf" \ "/usr/share/fonts/Sans.ttf" \ "/usr/share/fonts/Sans-Oblique.ttf"| * |otf2pfb |\NEW{5.3} When set to |on| (default), OpenType fonts used in |pdf-fonts| are converted to PFB fonts, if they are PostScript-based. Some information is lost in the PFB format, but there is advantage that pdf\TeX\ can embed subset of PFB fonts (in contrast with OpenType fonts which must be fully embedded). * |tex-fonts | Original and more complicated way to set-up fonts for PDF maps. You need to explicitly specify encoding (maximum 256 characters from the font that will be used). The list of currently supported encodings gives the |--print-tex-encodings| command line option. The same encoding must be used while generating \TeX\ metrics (|*.tfm| files) for those fonts (e.g.~with the afm2tfm program) and this encoding must be explicitly given also in the pdf\TeX's map file. The only exception is the base set of Computer Modern fonts, which use `raw' encoding. This encoding doesn't need to be specified in the pdf\TeX's map file. Encoding has to be followed by five font specifications for regular, italic, bold, sans-serif and sans-serif oblique styles. Default setting is |tex-fonts raw cmr10 cmti10 cmbx10 cmss10 cmssi10| Example how to use other fonts (e.g.~TrueType Palatino in xl2 (an encoding derived from ISO8859-2) encoding). Run: |ttf2afm -e xl2.enc -o palatino.afm palatino.ttf| |afm2tfm palatino.afm -u -v vpalatino -T xl2.enc| |vptovf vpalatino.vpl vpalatino.vf vpalatino.tfm| You get files |vpalatino.vf|, |vpalatino.tfm| and |palatino.tfm|. Add the line |palatino % causes the text to be set verbatim using \tt font; % 2. if the text uses up all the alphabet, \doubleverbatim macro % can be used instead; this is similar to the previous one but % a pair of characters is now used as a delimiter; % 3. in case of emergency \tripleverbatim macro may be of help... % %--------------------------------------------- \def\uncatcodespecials % see D.E.K., pp. 344 and 380 {\def\do##1{\catcode`##1=12}\dospecials}% %--------------------------------------------- %\def\la{<} \def\ra{>} \def\co{,} \def\ap{'} {\catcode`\^^I=\active \gdef^^I{\ \ \ \ }% TAB character is replaced by % 4 spaces; it is better than % nothing, but it does not mimic % true tabbing satisfactorily---maybe % some nice day... % \catcode`\<=\active\gdef<{\relax\la}% these four lines inhibits % \catcode`\>=\active\gdef>{\relax\ra}% ligatures ,, '' << >> of % \catcode`\,=\active\gdef,{\relax\co}% the font P1TT... % \catcode`\'=\active\gdef'{\relax\ap}% now with PL fonts it's obsolete \catcode`\`=\active\gdef`{\relax\lq}}% this line inhibits Spanish % ligatures ?` and !` of \tt font \def\setupverbatim % see D.E.K., p. 381 {\tt % \spaceskip=0pt \xspaceskip=0pt % just in case... \catcode`\^^I=\active % % \catcode`\<=\active \catcode`\>=\active % % \catcode`\,=\active \catcode`\'=\active % \catcode`\`=\active % \def\par{\leavevmode\endgraf}% this causes that empty lines aren't % skipped \obeylines \uncatcodespecials \obeyspaces % }% {\obeyspaces \global\let =\ }% this causes that leading blanks aren't % skipped cf. also def's of \space, \endgraf, \lq, % \obeyspaces, and \obeylines, % D.E.K., pp. 351-352 %--------------------------------------------- % see D.E.K., p. 382 \def\doverbatim#1{\def\next##1#1{##1\endgroup}\next}% \def\verbatim{\begingroup\setupverbatim\doverbatim}% %---------- \def\dodoubleverbatim#1#2{\def\next##1#1#2{##1\endgroup}\next}% \def\doubleverbatim{\begingroup\setupverbatim\dodoubleverbatim}% %---------- \def\dotripleverbatim#1#2#3{\def\next##1#1#2#3{##1\endgroup}\next}% \def\tripleverbatim{\begingroup\setupverbatim\dotripleverbatim}% %--------------------------------------------- \endinput therion/thbook/etc/supp-mis.tex0000664000175000017500000005004610515566304015620 0ustar useruser%D \module %D [ file=supp-mis, %D version=2004.10.26, % 1997.01.04, %D title=\CONTEXT\ Support Macros, %D subtitle=Missing (For Generic Use), %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA / Hans Hagen \& Ton Otten}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. %D I will clean up this module (a la supp-pdf.tex preamble). %D Some support modules are more or less independant. This %D module, which is not part of plain \CONTEXT, provides the %D missing macros and declarations of registers. \ifx \undefined \writestatus \else \expandafter \endinput \fi %D Because \LATEX\ has no safe package loading mechanism, we %D need to take care of possible interference. \def\StartLatexHack % replace this by the one in supp-pdf {\edef\StopLatexHack {\catcode\string`\noexpand/=\the\catcode\string`/ \catcode\string`\noexpand-=\the\catcode\string`- \catcode\string`\noexpand:=\the\catcode\string`: \catcode\string`\noexpand;=\the\catcode\string`; \catcode\string`\noexpand"=\the\catcode\string`" \catcode\string`\noexpand<=\the\catcode\string`< \catcode\string`\noexpand>=\the\catcode\string`> \catcode\string`\noexpand`=\the\catcode\string``}% \catcode\string`/=12 \catcode\string`-=12 \catcode\string`:=12 \catcode\string`;=12 \catcode\string`"=12 \catcode\string`<=12 \catcode\string`>=12 \catcode\string``=12 } %D This hack is needed especially for \LATEX\ users who use %D the Babel package. The Germans have active \type {"}'s, the %D Poles have \type {/}, while the French have \type {:} and %D \type {;} defines as command (thanks to Daniel Flipo for %D pointing that out and testing). Potentially active \type %D {?}'s and \type {!}'s are less dangerous since they are %D handled by the \type {\protect} and \type {\unprotect} %D macros. \StartLatexHack %D \macros %D {ifnocontextobject} %D %D First we take care of redundant defining. The next set of %D macros are a bit complicated by the fact that Plain %D \TEX\ defines the \type{\new}||macros as being outer. %D Furthermore nested \type{\if}'s can get us into %D trouble. \def\definecontextobject {\iftrue} \def\gobblecontextobject {\setbox0\hbox \bgroup \long\def\gobblecontextobject##1\fi{\egroup}% \expandafter\gobblecontextobject\string} \long\def\ifnocontextobject#1\do {\ifx#1\undefined \expandafter\definecontextobject \else %\writestatus{system}{beware of conflicting \string#1}% \expandafter\gobblecontextobject \fi} %D \macros %D {beginETEX,beginTEX} %D %D Outside \CONTEXT\ we will not be \ETEX||aware. \long\def\beginETEX #1\endETEX {} \long\def\beginOMEGA#1\endOMEGA{} \let\beginTEX\relax \let\endTEX\relax %D \macros %D {writestatus} %D %D We start each module with a message. Normally the output is %D formatted, but here we keep things simple. \ifnocontextobject \writestatus \do \def\writestatus#1#2% {\immediate\write16{#1 : #2}} \fi %D Let's see if it works. \writestatus{loading}{Context Support Macros / Miscellaneous (2004.10.26)} %D \macros %D {protect,unprotect} %D %D Next we present a poor mans alternative for \type{\protect} %D and \type{\unprotect}, two commands that enable us to use %D the characters \type{@}, \type{!} and \type{?} in macro %D names. \ifnocontextobject \protect \do \let\protect\relax \fi \newcount\protectiondepth \ifnocontextobject \unprotect \do \def\unprotect {\advance\protectiondepth 1 \ifnum\protectiondepth=1 \let\normalprotect=\protect \def\protect {\ifnum\protectiondepth>0 \advance\protectiondepth -1 \ifnum\protectiondepth=0 \doprotect \let\protect=\normalprotect \fi \fi} \edef\doprotect {\catcode`\noexpand @=\the\catcode`@\relax \catcode`\noexpand !=\the\catcode`!\relax \catcode`\noexpand ?=\the\catcode`?\relax} \catcode`@=11 \catcode`!=11 \catcode`?=11 \fi} \fi %D We start using this one it at once. \unprotect %D \macros %D {scratch...,if...,next...} %D %D We need some scratch registers. Users are free to use them, %D but can never be sure of their value once another macro is %D called. We only allocate things when they are yet %D undefined. This way we can't mess up other macro packages, %D but of course previous definitions can mess up our modules. \ifnocontextobject \donetrue \do \newif\ifdone \fi % no time now, will do a better test later (based on dimendef) \def\!!stringa{plain} \ifx\!!stringa\fmtname \donetrue \else \def\!!stringa{eplain} \ifx\!!stringa\fmtname \donetrue \else \def\!!stringa{babel-plain} \ifx\!!stringa\fmtname \donetrue \else \donefalse \fi \fi \fi \ifdone % plain defines some 15 dimens, so we need to define a few % dummies in order to get out of the scratch area \newdimen\scratchdimen % 16 \newdimen\scratchdimen % 17 \newdimen\scratchdimen % 18 \newdimen\scratchdimen % 19 \newdimen\scratchdimen % 20 \newdimen\scratchdimen % 21 \fi \def\stripnewabove#1% {\ifnum10<9#1 #1\else\expandafter\stripnewabove\fi}% \def\newabove\csname#1\endcsname#2% \dimen \name {\csname#1\endcsname#2% \ifnum\expandafter\stripnewabove\meaning#2>20\else \newabove\csname#1\endcsname#2% \fi} \ifnocontextobject \scratchcounter \do \newabove \csname newcount\endcsname \scratchcounter \fi \ifnocontextobject \scratchtoks \do \newabove \csname newtoks\endcsname \scratchtoks \fi \ifnocontextobject \scratchdimen \do \newabove \csname newdimen\endcsname \scratchdimen \fi \ifnocontextobject \scratchskip \do \newabove \csname newskip\endcsname \scratchskip \fi \ifnocontextobject \scratchmuskip \do \newabove \csname newmuskip\endcsname \scratchmuskip \fi \ifnocontextobject \scratchbox \do \csname newbox\endcsname \scratchbox \fi \ifnocontextobject \scratchread \do \csname newread\endcsname \scratchread \fi \ifnocontextobject \scratchwrite \do \csname newwrite\endcsname \scratchwrite \fi %D Watch out, in the past we ran into troubles with \type {\onepoint} %D (and others) mening something different in \LATEX\ then here. In %D such situations clashes are bound to happen. For this reason the %D assignments are no inside the test. We try to catch those situations %D but we cannot keep ahead of the future. \ifnocontextobject \zeropoint \do \newdimen \zeropoint \zeropoint = 0pt \fi % else problems with dimen12 \ifnocontextobject \onepoint \do \newdimen \onepoint \onepoint = 1pt \fi \ifnocontextobject \onebasepoint \do \newdimen \onebasepoint \onebasepoint = 1bp \fi \ifnocontextobject \zerocount \do \chardef \zerocount = 0 \fi \ifnocontextobject \plusone \do \chardef \plusone = 1 \fi \ifnocontextobject \minusone \do \newcount \minusone \minusone = -1 \fi \ifnocontextobject \thousandpoint \do \newdimen \thousandpoint \thousandpoint = 1000pt \fi \ifnocontextobject \onerealpoint \do \newdimen \onerealpoint \onerealpoint = 1pt \fi % latex has a funny \onepoint \ifnocontextobject \emptytoks \do \newtoks \emptytoks \fi \ifnocontextobject \nextbox \do \newbox \nextbox \fi \ifnocontextobject \nextdepth \do \newdimen \nextdepth \fi \ifnocontextobject \CONTEXTtrue \do \newif\ifCONTEXT \fi \ifnocontextobject \eightbitcharacterstrue \do \newif\ifeightbitcharacters \fi \ifnocontextobject \MPdrawingdonetrue \do \newif\ifMPdrawingdone \fi \ifnocontextobject \ifzeropt \do \let\ifzeropt\ifcase \fi %D \macros %D {@@...} %D %D We use symbolic name for \CATCODES. They can only be used %D when we are in unprotected state. \ifnocontextobject \@@escape \do \chardef\@@escape = 0 \fi \ifnocontextobject \@@begingroup \do \chardef\@@begingroup = 1 \fi \ifnocontextobject \@@endgroup \do \chardef\@@endgroup = 2 \fi \ifnocontextobject \@@endofline \do \chardef\@@endofline = 5 \fi \ifnocontextobject \@@ignore \do \chardef\@@ignore = 9 \fi \ifnocontextobject \@@space \do \chardef\@@space = 10 \fi \ifnocontextobject \@@letter \do \chardef\@@letter = 11 \fi \ifnocontextobject \@@other \do \chardef\@@other = 12 \fi \ifnocontextobject \@@active \do \chardef\@@active = 13 \fi \ifnocontextobject \@@comment \do \chardef\@@comment = 14 \fi \def\s!sp{sp} \def\s!pt{pt} \def\s!bp{bp} %D \macros %D {@EA,expanded,expandoneargafter,expandtwoargsafter} %D %D Also needed: \let\@EA=\expandafter \let\@@expanded\empty \def\expanded#1% {\long\xdef\@@expanded{\noexpand#1}\@@expanded} \def\expandoneargafter#1#2% {\@EA#1\@EA{#2}} \def\expandtwoargsafter#1#2#3% {\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA{#3}} \def\@EAEAEA{\@EA\@EA\@EA} %D \macros %D {everyline,EveryLine,EveryPar} %D %D In \CONTEXT\ we use \type{\everypar} for special purposes %D and provide \type{\EveryPar} as an alternative. The same %D goes for \type{\everyline} and \type{\EveryLine}. \ifnocontextobject \everyline \do \newtoks\everyline \fi \ifnocontextobject \EveryPar \do \let\EveryPar =\everypar \fi \ifnocontextobject \EveryLine \do \let\EveryLine=\everyline \fi %D \macros %D {globallet} \def\globallet{\global\let} %D \macros %D {!!...} %D %D We reserve ourselves some scratch strings (i.e. macros) %D and some more counters. \ifnocontextobject \!!stringa \do \def\!!stringa {} \fi \ifnocontextobject \!!stringb \do \def\!!stringb {} \fi \ifnocontextobject \!!stringc \do \def\!!stringc {} \fi \ifnocontextobject \!!stringd \do \def\!!stringd {} \fi \ifnocontextobject \!!counta \do \newcount\!!counta {} \fi \ifnocontextobject \!!countb \do \newcount\!!countb {} \fi %D \macros %D {!!...} %D %D The next set of definitions speed up processing a bit. %D Furthermore it saves memory. \ifnocontextobject \!!zeropoint \do \def\!!zeropoint {0pt} \fi \ifnocontextobject \!!zerocount \do \def\!!zerocount {0} \fi \ifnocontextobject \!!tenthousand \do \def\!!tenthousand {10000} \fi \ifnocontextobject \!!width \do \def\!!width {width} \fi \ifnocontextobject \!!height \do \def\!!height {height} \fi \ifnocontextobject \!!depth \do \def\!!depth {depth} \fi \ifnocontextobject \!!plus \do \def\!!plus {plus} \fi \ifnocontextobject \!!minus \do \def\!!minus {minus} \fi \ifnocontextobject \!!to \do \def\!!to {to} \fi %D \macros %D {smashbox} %D %D The system modules offer a range of smashing macros, of %D which we only copied \type{\smashbox}. \ifnocontextobject \smashbox \do \def\smashbox#1% {\wd#1\zeropoint \ht#1\zeropoint \dp#1\zeropoint} \fi %D \macros %D {dowithnextbox} %D %D Also without further comment, we introduce a macro that %D gets the next box and does something usefull with it. %D Because the \type{\afterassignment} is executed inside the %D box, we have to use a \type{\aftergroup} too. \ifnocontextobject \dowithnextbox \do \def\dowithnextbox#1% {\def\dodowithnextbox{#1}% \afterassignment\dododowithnextbox \setbox\nextbox} \def\dododowithnextbox% {\aftergroup\dodowithnextbox} \fi %D \macros %D {setvalue,setevalue,setxvalue,,setgvalue, %D getvalue, %D letvalue,letgvalue} %D %D The next two macros expand their argument to %D \type{\argument}. The first one is used to define macro's %D the second one executes them. \ifnocontextobject \setvalue \do \def\setvalue #1{\expandafter\def\csname#1\endcsname} \def\setevalue#1{\expandafter\edef\csname#1\endcsname} \def\setgvalue#1{\expandafter\gdef\csname#1\endcsname} \def\setxvalue#1{\expandafter\xdef\csname#1\endcsname} \def\getvalue #1{\csname#1\endcsname} \def\letvalue #1{\expandafter\let\csname#1\endcsname} \def\letgvalue#1{\global\expandafter\let\csname#1\endcsname} \fi %D \macros %D {unexpanded} %D %D The next command can be used as prefixed for commands that %D need protection during tests and writing to files. This %D is a very \CONTEXT\ specific one. \ifnocontextobject \unexpanded \do \let\unexpanded\relax \fi %D \macros %D {convertargument} %D %D The original one offers a bit more, like global assignment, the %D the next implementation is however a bit more byte saving. \ifnocontextobject \convertargument \do \def\doconvertargument#1>{} \long\def\convertargument#1\to#2% {\long\def\convertedargument{#1}% \edef#2{\expandafter\doconvertargument\meaning\convertedargument}} \fi %D \macros %D {forgetall} %D %D Sometimes we have to disable interference of whatever kind %D of skips and mechanisms. The next macro resets some. \ifnocontextobject \forgetall \do \def\forgetall {\parskip\zeropoint \leftskip\zeropoint \parindent\zeropoint \everypar{}} \fi %D \macros %D {withoutpt, %D ScaledPointsToBigPoints,ScaledPointsToWholeBigPoints} %D %D \TEX\ lacks some real datastructure. We can however use %D \DIMENSIONS. This kind of trickery is needed when we want %D \TEX\ to communicate with the outside world (by means of %D \type{\specials}). \ifnocontextobject \withoutpt \do {\catcode`\.=\@@other \catcode`\p=\@@other \catcode`\t=\@@other \gdef\WITHOUTPT#1pt{#1}} \def\withoutpt#1% {\expandafter\WITHOUTPT#1} \def\ScaledPointsToBigPoints#1#2% {\scratchdimen=#1sp\relax \scratchdimen=.996264\scratchdimen \edef#2{\withoutpt{\the\scratchdimen}}} \def\ScaledPointsToWholeBigPoints#1#2% {\scratchdimen=#1sp \scratchdimen=.996264\scratchdimen \scratchcounter=\scratchdimen \advance\scratchcounter by 32768 \divide\scratchcounter by 65536 \edef#2{\the\scratchcounter}} \fi %D \macros %D {doprocessfile} %D %D This macro takes three arguments: the file number, the %D filename and a macro that handles the content of a read %D line. \newif\iffileprocessed \ifnocontextobject \doprocessfile \do \def\doprocessfile#1#2#3% {\openin#1=#2\relax \ifeof#1% \fileprocessedfalse \closein#1\relax \else \fileprocessedtrue \gdef\dofinishfile% {\closein#1\relax \global\let\doprocessline\relax}% \gdef\doprocessline% {\ifeof#1% \dofinishfile \else \global\read#1 to \fileline #3\relax \expandafter\doprocessline \fi}% \expandafter\doprocessline \fi} \fi %D \macros %D {uncatcodespecials} %D %D This one is taken from the \TEX\ book. The \CONTEXT\ %D alternative is a bit different, but we hope this one works %D here. \ifx\dospecials\undefined \def\dospecials {\do\ \do\\\do\{\do\}\do\$% \do\#\do\^\do\_\do\&\do\%% \do\~\do\^^A\do\^^K} \fi \ifnocontextobject \uncatcodespecials \do \def\uncatcodespecials {\def\do##1{\catcode`##1=12 }\dospecials \catcode`\ =\@@space \catcode`\^^L=\@@ignore \catcode`\^^M=\@@endofline \catcode`\^^?=\@@ignore} \fi \ifnocontextobject \setnaturalcatcodes \do \def\setnaturalcatcodes {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other \catcode`\*=\@@other \catcode`\/=\@@other \catcode`\-=\@@other \catcode`+=\@@other \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other \catcode`\:=\@@other \catcode`\;=\@@other \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other \catcode`\(=\@@other \catcode`\)=\@@other \catcode`\{=\@@other \catcode`\}=\@@other \catcode`\\=\@@other \catcode`\%=\@@other } \fi %D \macros %D {doglobal} %D %D Some \CONTEXT\ low level macros can have a \type{\doglobal} %D prefix. Let's just forget about that here: \ifnocontextobject \doglobal \do \let\doglobal\relax \fi %D The next obscure one is needed in the generic verbatim %D environment. When we end up with more of these, it's time %D to load the module \type{syst-gen}. \ifnocontextobject \doifincsnameelse \do \def\dodoifincsnameelse#1#2% {\def\dododoifincsnameelse##1#1##2##3\war% {\csname\if##2@iffalse\else iftrue\fi\endcsname}% \expandafter\dododoifincsnameelse#2#1@@\war} \long\def\doifincsnameelse#1#2#3#4% {\edef\@@instring{#1}% \expandafter\dodoifincsnameelse\expandafter{\@@instring}{#2}% #3% \else #4% \fi} \fi %D \macros %D {dostepwiserecurse, dorecurse, doloop, exitloop} %D %D The next loop macro is a real weak one, and does not offer %D the full \CONTEXT\ functionality, let alone nesting, but %D for simple purposes, its behaviour is acceptable. \newcount\recursecounter \def\dostepwiserecurse#1#2#3#4% very weak and rubishly version {\ifnum#2<#1\relax\else\dodostepwiserecurse{#1}{#2}{#3}{#4}\fi} \def\dodostepwiserecurse#1#2#3#4% very weak and rubishly version {\recursecounter=#1\relax \loop \edef\recurselevel{\the\recursecounter}% #4\relax \ifnum\recursecounter<#2\relax \advance\recursecounter by #3\relax \repeat} \def\dorecurse#1% {\dostepwiserecurse{1}{#1}{1}} \def\doloop {\dostepwiserecurse{1}{\maxdimen}{1}} \def\exitloop {\recursecounter=\maxdimen} %D \macros %D {ifundefined,doifdefined,doifundefined, %D doifdefinedelse,doifundefinedelse} %D %D These alteratives are not robust but suitable for simple %D usage. The official ones are a bit faster. \ifnocontextobject \doifdefined \do \def\ifundefined#1% {\expandafter\ifx\csname#1\endcsname\relax} \def\doifdefinedelse#1#2#3% {\expandafter\ifx\csname#1\endcsname\relax#3\else#2\fi} \def\doifundefinedelse#1#2#3% {\expandafter\ifx\csname#1\endcsname\relax#2\else#3\fi} \def\doifdefined#1#2% {\expandafter\ifx\csname#1\endcsname\relax\else#2\fi} \def\doifundefined#1#2% {\expandafter\ifx\csname#1\endcsname\relax#2\fi} \fi %D \macros %D {doifinstringelse} %D %D It seems like we end up with more and more macros here. %D Sigh. \ifnocontextobject \doifinstringelse \do \def\p!doifinstringelse#1#2% {\def\pp!doifinstringelse##1#1##2##3\war% {\csname if\if##2@fals\else tru\fi e\endcsname}% \expanded{\pp!doifinstringelse#2#1@@\noexpand\war}} \long\def\doifinstringelse#1#2#3#4% {\edef\@@@instring{#1}% \@EA\p!doifinstringelse\@EA{\@@@instring}{#2}#3\else#4\fi} \fi %D \macros %D {twodigitrounding} %D %D We don't support rounding outside \CONTEXT. Sorry. \def\twodigitrounding#1{#1} %D \macros %D {lineheight} %D %D In \CONTEXT\ we have \type{\lineheight}, which in many %D cases matches \type {\baselineskip}. \ifnocontextobject \lineheight \do \def\lineheight{\baselineskip} \fi %D \macros %D {dohandletokens} %D %D The following macro is the simplified version, but good %D enough for day to day hacks. %D %D \starttyping %D \dohandletokens some text\with\somemacro %D \stoptyping \ifnocontextobject \dohandletokens \do \def\dodohandletokens {\ifx\next\end \else \docommand{\next}% \expandafter\dohandletokens \fi} \def\dohandletokens {\afterassignment\dodohandletokens\let\next= } \long\def\handletokens#1\with#2% {\let\docommand=#2% \dohandletokens#1\end} \fi %D Very reduced: \long\def\appendtoks#1\to#2% {\scratchtoks{#1}\expanded{#2{\the#2\the\scratchtoks}}} %D Well, also handy. \def\doiffileelse#1#2#3% {\immediate\openin\scratchread=#1\relax \ifeof\scratchread \def\next{#3}% \else \def\next{#2}% \fi \immediate\closein\scratchread \next} %D New. \let\donothing\empty %D Also new: \def\letempty #1{\let#1\empty} \def\globalletempty#1{\global\let#1\empty} \def\letvalueempty #1{\expandafter\let\csname#1\endcsname\empty} \def\letgvalueempty#1{\global\expandafter\let\csname#1\endcsname\empty} %D Sigh \def\settrue #1{\chardef#1\zerocount} \def\setfalse#1{\chardef#1\plusone} \let\newconditional = \setfalse \let\ifconditional = \ifcase %D That's it. Please forget this junk and take a look at how %D it should be done. \StopLatexHack \protect \endinput therion/thbook/etc/supp-pdf.tex0000664000175000017500000022122410710375044015573 0ustar useruser%D \module %D [ file=supp-pdf, %D version=2006.09.02, % 2004.12.16, %D title=\CONTEXT\ Support Macros, %D subtitle=\METAPOST\ to \PDF\ conversion, %D author=Hans Hagen \& others (see text), %D date=\currentdate, %D copyright=\PRAGMA] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \ifx\writestatus\undefined \immediate\write16{[Loading MPS to PDF converter (version 2006.09.02).]} \else \writestatus{loading}{Context Support Macros / PDF} \fi %D This module is not optimized because it is used outside %D \CONTEXT\ and we cannot forsee what interference will take %D place. We no longer load supp-mis. I got too tired of %D keeping track of interferences with non \CONTEXT\ usage so %D I moved the necessary code in here and use a derived version %D in \CONTEXT. When I have the time I will clean up some of the %D code that is of no use for non||\CONTEXT\ users. \ifx\contextversion\undefined \chardef\mptopdfstoredatcode\catcode`\@ \catcode\string`@=11 \def\unprotect {\let\@@mpstopdf@@unprotect \unprotect \let\@@mpstopdf@@protect \protect \edef\protect {\noexpand \let \noexpand \protect \noexpand \@@mpstopdf@@protect \noexpand \let \noexpand \unprotect \noexpand \@@mpstopdf@@unprotect % context specific \catcode\string`\noexpand @=\the\catcode\string`@ \catcode\string`\noexpand !=\the\catcode\string`! \catcode\string`\noexpand ?=\the\catcode\string`? % latex specific \catcode\string`\noexpand /=\the\catcode\string`/ \catcode\string`\noexpand -=\the\catcode\string`- \catcode\string`\noexpand :=\the\catcode\string`: \catcode\string`\noexpand ;=\the\catcode\string`; \catcode\string`\noexpand "=\the\catcode\string`" \catcode\string`\noexpand <=\the\catcode\string`< \catcode\string`\noexpand >=\the\catcode\string`> \catcode\string`\noexpand `=\the\catcode\string``} \catcode\string`@=11 \catcode\string`!=11 \catcode\string`?=11 \catcode\string`/=12 \catcode\string`-=12 \catcode\string`:=12 \catcode\string`;=12 \catcode\string`>=12 \catcode\string`<=12 \catcode\string`"=12 \catcode\string``=12 } \def\defineMPtoPDFfallbacks {% shortcuts \chardef\@@escape 0 \chardef\@@begingroup 1 \chardef\@@endgroup 2 \chardef\@@endofline 5 \chardef\@@ignore 9 \chardef\@@space 10 \chardef\@@letter 11 \chardef\@@other 12 \chardef\@@active 13 \chardef\@@comment 14 % placeholders \ifx\withoutpt \undefined \let\withoutpt \@@mptopdf@@withoutpt \fi \ifx\twodigitrounding \undefined \let\twodigitrounding \@@mptopdf@@twodigitrounding \fi \ifx\forgetall \undefined \let\forgetall \@@mptopdf@@forgetall \fi \ifx\uncatcodespecials \undefined \let\uncatcodespecials \@@mptopdf@@uncatcodespecials \fi \ifx\setnaturalcatcodes\undefined \let\setnaturalcatcodes\@@mptopdf@@setnaturalcatcodes \fi \ifx\dospecials \undefined \let\dospecials \@@mptopdf@@dospecials \fi} \def\@@mptopdf@@forgetall {\parskip0pt\leftskip0pt\parindent0pt\everypar{}} \def\@@mptopdf@@twodigitrounding#1% {#1}% \def\@@mptopdf@@uncatcodespecials {\def\do##1{\catcode`##1=\@@other}\dospecials \catcode`\ =\@@space \catcode`\^^L=\@@ignore \catcode`\^^M=\@@endofline \catcode`\^^?=\@@ignore} \def\@@mptopdf@@setnaturalcatcodes {\catcode`\!=\@@other \catcode`\?=\@@other \catcode`\@=\@@other \catcode`\#=\@@other \catcode`\&=\@@other \catcode`\|=\@@other \catcode`\$=\@@other \catcode`\^=\@@other \catcode`\_=\@@other \catcode`\*=\@@other \catcode`\/=\@@other \catcode`\-=\@@other \catcode`+=\@@other \catcode`\==\@@other \catcode`\<=\@@other \catcode`\>=\@@other \catcode`\"=\@@other \catcode`\'=\@@other \catcode`\`=\@@other \catcode`\:=\@@other \catcode`\;=\@@other \catcode`\,=\@@other \catcode`\.=\@@other \catcode`\~=\@@other \catcode`\(=\@@other \catcode`\)=\@@other \catcode`\{=\@@other \catcode`\}=\@@other \catcode`\\=\@@other \catcode`\%=\@@other} \def\@@mptopdf@@dospecials {\do\ \do\\\do\{\do\}\do\$% \do\#\do\^\do\_\do\&\do\%% \do\~\do\^^A\do\^^K} { \catcode`\.=12 \catcode`\p=12 \catcode`\t=12 \gdef\@@MPTOPDF@@WITHOUTPT#1pt{#1} } \def\@@mptopdf@@withoutpt#1% {\expandafter\@@MPTOPDF@@WITHOUTPT#1} % \def\@@mptopdf@@newabove#1#2% \dimen \name % {#1#2% % \ifnum\expandafter\gobblesixarguments\meaning#2>20\else % \expandafter\@@mptopdf@@newabove\expandafter#1\expandafter#2% % \fi} \def\@@mptopdf@@stripnewabove#1% {\ifnum10<9#1 #1\else\expandafter\@@mptopdf@@stripnewabove\fi}% \def\@@mptopdf@@newabove\csname#1\endcsname#2% \dimen \name {\csname#1\endcsname#2% \ifnum\expandafter\@@mptopdf@@stripnewabove\meaning#2>20\else \@@mptopdf@@newabove\csname#1\endcsname#2% \fi} \@@mptopdf@@newabove \csname newcount\endcsname \scratchcounter \@@mptopdf@@newabove \csname newdimen\endcsname \scratchdimen \csname newbox\endcsname \scratchbox \expandafter \newif \csname ifdone\endcsname \catcode`\@=\mptopdfstoredatcode \else \let\defineMPtoPDFfallbacks\relax \fi %D These macros are written as generic as possible. Some %D general support macro's are loaded from a small module %D especially made for non \CONTEXT\ use. In this module I %D use a matrix transformation macro written by Tanmoy %D Bhattacharya. Thanks to extensive testing by Sebastian %D Ratz I was able to complete this module within reasonable %D time. This module has support for \METAPOST\ extensions %D built in. %D %D Daniel H. Luecking came up with a better (more precise) %D transformation method. You can recognize his comment by %D his initials. (We keep the old code around because it's a %D nice illustration on how a module like this evolves.) %D Beware, we cannot use \type{\zeropoint} here since it may be %D defined in the range \type{\dimen0} - 20 which we happen to use %D as scratch registers; inside context we may consider %D using dedicated registers. %D This module handles some \PDF\ conversion and insertions %D topics. By default, the macros use the \PDFTEX\ primitive %D \type{\pdfliteral} when available. Since \PDFTEX\ is now the %D default engine for \TEX\ distributions, we need a more complex %D test. \unprotect \ifx\PDFcode\undefined \ifx\pdfliteral\undefined \def\PDFcode#1{\special{PDF: #1}} \else\ifx\pdfoutput\undefined \def\PDFcode#1{\special{PDF: #1}} \else\ifcase\pdfoutput \def\PDFcode#1{\special{PDF: #1}} \else % pdftex as well as in pdf mode \let\PDFcode\pdfliteral \fi\fi\fi \else % we probably use context \fi %D First we define a handy constant: \bgroup \defineMPtoPDFfallbacks \catcode`\%=\@@other \xdef\letterpercent{\string%} \egroup %D \macros %D {pdfimage,pdfimages,pdfclippedimage} %D %D Starting with pdftex version 14, images are included more %D natural to the form embedding. This enables alternative %D images to be embedded. %D %D \starttyping %D \pdfimage {file} %D \pdfimages {high res file} {low res file} %D \stoptyping %D %D The first one replaces the pre||version||14 original, %D while the latter provides alternative images. %D %D The next macro is dedicated to Maarten Gelderman, who %D needed to paste prepared \PDF\ pages into conference %D proceedings. %D %D \starttyping %D \pdfclippedimage {file} {l} {r} {t} {b} %D \stoptyping \ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13 \def\pdfimage#1#% {\dopdfimage{#1}} \def\dopdfimage#1#2% {\immediate\pdfximage#1{#2}% \pdfrefximage\pdflastximage} \def\pdfimages#1#% {\dopdfimages{#1}} \def\dopdfimages#1#2#3% {\immediate\pdfximage#1{#2}% \immediate\pdfobj{[ << /Image \the\pdflastximage\space0 R /DefaultForPrinting true >> ]}% \immediate\pdfximage#1 attr {/Alternates \the\pdflastobj\space0 R}{#3}% \pdfrefximage\pdflastximage} \def\pdfclippedimage#1#% specs {file}{left}{right}{top}{bottom} {\dopdfclippedimage{#1}} \def\dopdfclippedimage#1#2#3#4#5#6% {\bgroup \pdfximage#1{#2}% \setbox\scratchbox\hbox {\pdfrefximage\pdflastximage}% \hsize\wd\scratchbox \advance\hsize -#3 \advance\hsize -#4 \vsize\ht\scratchbox \advance\vsize -#5 \advance\vsize -#6 \setbox\scratchbox\vbox to \vsize {\vskip-#5\hbox to \hsize{\hskip-#3\box\scratchbox\hss}}% \pdfxform\scratchbox \pdfrefxform\pdflastxform \egroup} \fi \fi %D If you want to save a few hash entries, you may prefer the %D less readable alternatives, like: %D %D \starttyping %D \def\pdfimage#1#% This one is less readable but needs no additional %D {\bgroup % hash entry for the second stage macro. %D \def\pdfimage##1% %D {\immediate\pdfximage##1{#2}% %D \pdfrefximage\pdflastximage\egroup}} %D \stoptyping %D For old times sake we provide a few aliases. These will be %D removed some day. \ifx\pdftexversion\undefined \else \ifnum\pdftexversion>13 \let\pdfform =\pdfxform \let\pdflastform=\pdflastxform \let\pdfrefform =\pdfrefxform \fi \fi %D The main conversion macro wraps the \PDF\ codes in a box %D that is output as an object. The graphics are embedded %D in~\type{q} and~\type{Q} and are scaled and positioned using %D one transform call (\type{cm}). This saves some additional %D scaling. %D \macros %D {convertMPtoPDF} %D %D The next set of macros implements \METAPOST\ to \PDF\ %D conversion. Because we want to test as fast as possible, we %D first define the \POSTSCRIPT\ operators that \METAPOST\ %D uses. We don't define irrelevant ones, because these are %D skipped anyway. %D The converter can be made a bit faster by replacing the %D two test macros (the ones with the many \type {\if's}) by %D a call to named branch macros (something \typ {\getvalue %D {xPSmoveto}}. For everyday documents with relatively %D small graphics the gain in speed can be neglected. \def \PScurveto {curveto} \def \PSlineto {lineto} \def \PSmoveto {moveto} \def \PSshowpage {showpage} \def \PSnewpath {newpath} \def \PSfshow {fshow} \def \PSclosepath {closepath} \def \PSfill {fill} \def \PSstroke {stroke} \def \PSclip {clip} \def \PSrlineto {rlineto} \def \PSsetlinejoin {setlinejoin} \def \PSsetlinecap {setlinecap} \def \PSsetmiterlimit {setmiterlimit} \def \PSsetgray {setgray} \def \PSsetrgbcolor {setrgbcolor} \def \PSsetcmykcolor {setcmykcolor} \def \PSsetdash {setdash} \def \PSgsave {gsave} \def \PSgrestore {grestore} \def \PStranslate {translate} \def \PSscale {scale} \def \PSconcat {concat} \def \PSdtransform {dtransform} \def \PSsetlinewidth {setlinewidth} \def \PSpop {pop} \def \PSnfont {nfont} % was needed for TUG98 proceedings \def \PSspecial {special} % extensions to MetaPost %D A previous version set \type {%} to ignore, which %D simplified the following definitions. At the start of %D conversion the percent character was made active again. %D Because the whole graphic is one paragraph (there are no %D empty lines) this does not give the desired effect. This %D went unnoticed untill Scott Pakin sent me a test file %D percent characters in a string. So, from now on we have %D to prefix the following strings with percentages. %D Some day I'll figure out a better solution (line by line reading %D using \ETEX). \edef \PSBoundingBox {\letterpercent\letterpercent BoundingBox:} \edef \PSHiResBoundingBox {\letterpercent\letterpercent HiResBoundingBox:} \edef \PSExactBoundingBox {\letterpercent\letterpercent ExactBoundingBox:} \edef \PSMetaPostSpecial {\letterpercent\letterpercent MetaPostSpecial:} \edef \PSMetaPostSpecials {\letterpercent\letterpercent MetaPostSpecials:} \edef \PSPage {\letterpercent\letterpercent Page:} \edef \PSBeginProlog {\letterpercent\letterpercent BeginProlog} \edef \PSEndProlog {\letterpercent\letterpercent EndProlog} \edef \PSEof {\letterpercent\letterpercent EOF} %D By the way, the \type {setcmykcolor} operator is not %D output by \METAPOST\ but can result from converting the %D \cap{RGB} color specifications, as implemented in %D \type{supp-mps}. %D In \POSTSCRIPT\ arguments precede the operators. Due to the %D fact that in some translations we need access to those %D arguments, and also because sometimes we have to skip them, %D we stack them up. The stack is one||dimensional for non path %D operators and two||dimensional for operators inside a path. %D This is because we have to save the whole path for %D (optional) postprocessing. Values are pushed onto the stack %D by: %D %D \starttyping %D \setMPargument {value} %D \stoptyping %D %D They can be retrieved by the short named macros: %D %D \starttyping %D \gMPa {number} %D \gMPs {number} %D \stoptyping %D %D When scanning a path specification, we also save the %D operator, using %D %D \starttyping %D \setMPkeyword {n} %D \stoptyping %D %D The path drawing operators are coded for speed: \type{clip}, %D \type{stroke}, \type{fill} and \type{fillstroke} become %D 1, 2, 3 and~4. %D %D When processing the path this code can be retrieved %D using %D %D \starttyping %D \getMPkeyword % {n} %D \stoptyping %D %D When setting an argument, the exact position on the stack %D depends on the current value of the \COUNTERS\ %D \type{\nofMPsegments} and \type{\nofMParguments}. \newcount\nofMPsegments \newcount\nofMParguments %D These variables hold the coordinates. The argument part of %D the stack is reset by: %D %D \starttyping %D \resetMPstack %D \stoptyping %D %D We use the prefix \type{@@MP} to keep the stack from %D conflicting with existing macros. To speed up things a bit %D more, we use the constant \type{\@@MP}. \def\@@MP{@@MP} \def\setMPargument% #1% {\advance\nofMParguments 1 \expandafter\def \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname} % {#1} \def\letMPargument {\advance\nofMParguments 1 \expandafter\let \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname} \def\setMPsequence#1 % {\advance\nofMParguments 1 \expandafter\def \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname{#1}% \handleMPsequence} \def\gMPa#1% {\csname\@@MP0\number#1\endcsname} \def\gMPs#1% {\csname\@@MP\the\nofMPsegments\number#1\endcsname} \def\dogMPa#1% {\expandafter\expandafter\expandafter\do\csname\@@MP0\number#1\endcsname} \def\setMPkeyword#1 % {\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}% \advance\nofMPsegments 1 \nofMParguments0} \def\getMPkeyword% #1% {\csname\@@MP\the\nofMPsegments0\endcsname} % {\csname\@@MP#10\endcsname} \def\docleanupMPargument#1% we need this because args can have [ or ] pre/appended {\expandafter\edef\csname\@@MP\the\nofMPsegments\number#1\endcsname {\csname\@@MP\the\nofMPsegments\number#1\endcsname}} %D When we reset the stack, we can assume that all further %D comment is to be ignored and handled in strings. %D By redefining the reset macro after the first call, we %D save some run time. Only use this macro after all %D comments are processed and use the simple alternative %D when dealing with comments. \def\doresetMPstack {\nofMParguments0\relax} \def\resetMPstack {\let\handleMPgraphic\handleMPendgraphic \let\resetMPstack\doresetMPstack \resetMPstack} %D The arguments are saved with the preceding command %D \type{\do}. By default this command expands to nothing, but %D when we deal with strings it's used to strip off the %D \type{(} and \type{)}. %D %D Strings are kind of tricky, because characters can be %D passed verbatim \type{(hello)}, by octal number %D \type{(\005)} or as command \type{(\()}. We therefore %D cannot simply ignore \type{(} and \type{)}, the way we do %D with \type{[} and \type{]}. Another complication is that %D strings may contain characters that normally have a %D special meaning in \TEX, like \type{$} and \type{{}}. %D %D A previous solution made \type{\} an active character and %D let it look ahead for a number or characters. We had to %D abandon this scheme because of the need for verbatim %D support. The next solution involved some \CATCODE\ %D trickery but works well. \def\octalMPcharacter#1#2#3% {\char'#1#2#3\relax} %D curly braces and squarly brackets are stored in the argument stack %D as part of strings, for instance in: %D %D \starttyping %D /fshow {exch findfont exch scalefont setfont show}bind def %D [3 3 ] 0 setdash %D \stoptyping %D %D but we need to keep them in situation like %D %D \starttyping %D ([bla bla] bla bla) ec-lmr10 9.96265 fshow %D ({bla bla} bla bla) ec-lmr10 9.96265 fshow %D \stoptyping %D %D So, when we store the snippets, we keep the special tokens, and %D when needed we either ignore or obey them \bgroup \defineMPtoPDFfallbacks \catcode`\|=\@@comment \catcode`\%=\@@active \catcode`\[=\@@active \catcode`\]=\@@active \catcode`\{=\@@active \catcode`\}=\@@active \catcode`B=\@@begingroup \catcode`E=\@@endgroup \gdef\keepMPspecials| B\let%\letterpercent| \def[B\noexpand[E| \def]B\noexpand]E| \def{B\noexpand{E| \def}B\noexpand}EE \gdef\ignoreMPspecials| B\let%\letterpercent| \def[BE| \def]BE| \def{BE| \def}BEE \gdef\obeyMPspecials| B\def%B\char 37\relax E| \def[B\char 91\relax E| \def]B\char 93\relax E| \def{B\char123\relax E| \def}B\char125\relax EE \gdef\setMPspecials| B\setnaturalcatcodes \catcode`\\=\@@escape \catcode`\%=\@@active \catcode`\[=\@@active \catcode`\]=\@@active \catcode`\{=\@@active \catcode`\}=\@@active \lccode`\-=0 | latex sets this to `\- \lccode`\%=`\% | otherwise it's seen as a number \def\(B\char40\relax E| \def\)B\char41\relax E| \def\\B\char92\relax E| \def\0B\octalMPcharacter0E| \def\1B\octalMPcharacter1E| \def\2B\octalMPcharacter2E| \def\3B\octalMPcharacter3E| \def\4B\octalMPcharacter4E| \def\5B\octalMPcharacter5E| \def\6B\octalMPcharacter6E| \def\7B\octalMPcharacter7E| \def\8B\octalMPcharacter8E| \def\9B\octalMPcharacter9EE \egroup %D We use the comment symbol as a sort of trigger. Beware! %D The whole graphic is seen as on eparagraph, which means %D that we cannot change the catcodes in between. \bgroup \defineMPtoPDFfallbacks \catcode`\%=\@@active \gdef\startMPscanning{\let%=\startMPconversion} \egroup %D In earlier versions we used the sequence %D %D \starttyping %D \expandafter\handleMPsequence\input filename\relax %D \stoptyping %D %D Persistent problems in \LATEX\ however forced us to use a %D different scheme. Every \POSTSCRIPT\ file starts with a %D \type{%}, so we temporary make this an active character %D that starts the scanning and redefines itself. (The problem %D originates in the redefinition by \LATEX\ of the %D \type{\input} primitive.) \def\startMPconversion {\keepMPspecials \handleMPsequence} %D Here comes the main loop. Most arguments are numbers. This %D means that they can be recognized by their \type{\lccode}. %D This method saves a lot of processing time. We could %D speed up the conversion by handling the \type{path} %D seperately. \def\dohandleMPsequence#1% {\ifdone \ifcase\lccode`#1\relax \expandafter\expandafter\expandafter\dohandleMPsequenceA \else \expandafter\expandafter\expandafter\dohandleMPsequenceB \fi \else \expandafter\dohandleMPsequenceC \fi#1} \let\dohandleMPsequenceA\setMPsequence \def\installMPSkeywordN#1#2% {\expandafter\def\csname\@@MP:N:#1\endcsname{#2}} \def\installMPSshortcutN#1#2% todo: \let {\expandafter\let\csname\@@MP:N:#1\expandafter\endcsname\csname\@@MP:N:#2\endcsname} \def\dohandleMPsequenceB#1 % {\edef\somestring{#1}% \ifcsname\@@MP:N:\somestring\endcsname \csname\@@MP:N:\somestring\expandafter\endcsname \else \expandafter\handleMPgraphic \fi \handleMPsequence} \ifx\eTeXversion\undefined \def\dohandleMPsequenceB#1 % {\edef\somestring{#1}% \expandafter\ifx\csname\@@MP:N:\somestring\endcsname\relax \expandafter\handleMPgraphic \else \csname\@@MP:N:\somestring\expandafter\endcsname \fi \handleMPsequence} \fi \installMPSkeywordN \PSmoveto {\edef\lastMPmoveX{\gMPa1}% \edef\lastMPmoveY{\gMPa2}% \resetMPstack} \installMPSkeywordN \PSnewpath {\let\handleMPsequence\handleMPpath} \installMPSkeywordN \PSgsave {\PDFcode{q}% \resetMPstack} \installMPSkeywordN \PSgrestore {\PDFcode{Q}% \resetMPstack} \installMPSkeywordN \PSdtransform % == setlinewidth {\let\handleMPsequence\handleMPdtransform} % after that we will encounter more tokens until setlinewidth+pop % or pop+setlinewidth which we catch next; we explicitly need to % reset the stack since [] n setdash may follow; a more clever % approach would be to read on till the condition is met, but it's % the only pop / setlinewidth we will encounter so ... \installMPSkeywordN \PSsetlinewidth {% already handled in dtransform \resetMPstack} \installMPSkeywordN \PSpop {% already handled in dtransform \resetMPstack} \installMPSkeywordN \PSconcat {\cleanupMPconcat \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}% \resetMPstack} \installMPSkeywordN \PSsetrgbcolor {\handleMPrgbcolor \resetMPstack} \installMPSkeywordN \PSsetcmykcolor {\handleMPcmykcolor \resetMPstack} \installMPSkeywordN \PSsetgray {\handleMPgraycolor \resetMPstack} \installMPSkeywordN \PStranslate {\PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}% \resetMPstack} \installMPSkeywordN \PSsetdash {\handleMPsetdash \resetMPstack} \installMPSkeywordN \PSsetlinejoin {\PDFcode{\gMPa1 j}% \resetMPstack} \installMPSkeywordN \PSsetmiterlimit {\PDFcode{\gMPa1 M}% \resetMPstack} \installMPSkeywordN \PSfshow {%\PDFcode{n}% removed ! \handleMPfshow \resetMPstack} \installMPSkeywordN \PSsetlinecap {\PDFcode{\gMPa1 J}% \resetMPstack} \installMPSkeywordN \PSrlineto {\flushMPmoveto \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}% \resetMPmoveto \resetMPstack} \installMPSkeywordN \PSscale {\PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}% \resetMPstack} \installMPSkeywordN \PSspecial {\handleMPspecialcommand \resetMPstack} \installMPSshortcutN {n} \PSnewpath \installMPSshortcutN {p} \PSclosepath \installMPSshortcutN {l} \PSlineto \installMPSshortcutN {r} \PSrlineto \installMPSshortcutN {m} \PSmoveto \installMPSshortcutN {c} \PScurveto \installMPSshortcutN {C} \PSsetcmykcolor \installMPSshortcutN {G} \PSsetgray \installMPSshortcutN {R} \PSsetrgbcolor \installMPSshortcutN {lj} \PSsetlinejoin \installMPSshortcutN {ml} \PSsetmiterlimit \installMPSshortcutN {lc} \PSsetlinecap \installMPSshortcutN {sd} \PSsetdash \installMPSshortcutN {S} \PSstroke \installMPSshortcutN {F} \PSfill \installMPSshortcutN {W} \PSclip \installMPSshortcutN {q} \PSgsave \installMPSshortcutN {Q} \PSgrestore \installMPSshortcutN {s} \PSscale \installMPSshortcutN {t} \PSconcat \installMPSshortcutN {P} \PSshowpage \installMPSkeywordN {hlw} {\PDFcode{\gMPa1 w}\resetMPstack} \installMPSkeywordN {vlw} {\PDFcode{\gMPa1 w}\resetMPstack} \installMPSkeywordN {rd} {\PDFcode{[] 0 d}\resetMPstack} \def\dohandleMPsequenceC#1 % {\edef\somestring{#1}% \handleMPgraphic % {#1}% \handleMPsequence} %D Since colors are not sensitive to transformations, they %D are sometimes used for signaling. Therefore, we handle them %D separately. The next macro can be redefined if needed. \def\handleMPrgbcolor {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 rg \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 RG}} \def\handleMPcmykcolor {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 k \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 K}} \def\handleMPgraycolor {\PDFcode{\!MPgMPa1 g \!MPgMPa1 G}} \def\handleMPspotcolor {\PDFcode{0 g 0 G}} %D Beginning and ending the graphics is taken care of by the %D macro \type{\handleMPgraphic}, which is redefined when %D the first graphics operator is met. \def\handleMPendgraphic % #1% {\ifx\somestring\PSshowpage \let\handleMPsequence\finishMPgraphic \else\ifx\somestring\PSEof \let\handleMPsequence\finishMPgraphic \else \letMPargument\somestring % {#1}% \fi\fi} \def\handleMPbegingraphic % #1% {\ifx\somestring\PSBoundingBox \def\handleMPsequence{\handleMPboundingbox1}% \else\ifx\somestring\PSHiResBoundingBox \def\handleMPsequence{\handleMPboundingbox2}% \else\ifx\somestring\PSExactBoundingBox \def\handleMPsequence{\handleMPboundingbox3}% \else\ifx\somestring\PSshowpage \let\handleMPsequence\finishMPgraphic \else\ifx\somestring\PSEof \let\handleMPsequence\finishMPgraphic \else\ifx\somestring\PSPage \let\handleMPsequence\handleMPpage \else\ifx\somestring\PSMetaPostSpecials \let\handleMPsequence\handleMPspecialscomment \else\ifx\somestring\PSMetaPostSpecial \let\handleMPsequence\handleMPspecialcomment \else\ifx\somestring\PSBeginProlog \let\handleMPsequence\handleMPprolog \else \letMPargument\somestring % {#1}% \fi\fi\fi\fi\fi\fi\fi\fi\fi} \let\handleMPgraphic=\handleMPbegingraphic %D New: we can best filter the prolog because nowdays it can contain %D quite some code. % hm, catcode mess, so we need to tweak %'s catcode here % \long\expandafter\def\expandafter\handleMPprolog\expandafter#\expandafter1\PSEndProlog% % but today i'm not in the mood for ugly stuff \long\def\handleMPprolog#1EndProlog % {\doresetMPstack \let\handleMPsequence\dohandleMPsequence \handleMPsequence} %D We check for three kind of bounding boxes: the normal one %D and two high precision ones: %D %D \starttyping %D BoundingBox: llx lly ucx ucy %D HiResBoundingBox: llx lly ucx ucy %D ExactBoundingBox: llx lly ucx ucy %D \stoptyping %D %D The original as well as the recalculated dimensions are %D saved for later use. \newif\ifskipemptyMPgraphic \skipemptyMPgraphicfalse \chardef\currentMPboundingbox=0 \def\handleMPboundingbox#1#2 #3 #4 #5 {\ifnum#1>\currentMPboundingbox \xdef\MPllx{#2}\xdef\MPlly{#3}% \xdef\MPurx{#4}\xdef\MPury{#5}% \dimen0=#2pt \dimen0=-\MPxscale\dimen0 \dimen2=#3pt \dimen2=-\MPyscale\dimen2 \xdef\MPxoffset{\withoutpt\the\dimen0}% \xdef\MPyoffset{\withoutpt\the\dimen2}% \dimen0=#2bp \dimen0=-\dimen0 \dimen2=#3bp \dimen2=-\dimen2 \advance\dimen0 #4bp \dimen0=\MPxscale\dimen0 \xdef\MPwidth{\the\dimen0}% \advance\dimen2 #5bp \xdef\MPyshift{\the\dimen2}% unscaled \dimen2=\MPyscale\dimen2 \xdef\MPheight{\the\dimen2}% \chardef\currentMPboundingbox#1\relax \fi \doresetMPstack \let\handleMPsequence\dohandleMPsequence \let\next\handleMPsequence \ifskipemptyMPgraphic \ifdim\MPheight=0pt\relax\ifdim\MPwidth=0pt\relax \def\next{\endinput\finishMPgraphic}% \fi\fi \fi \next} %D Unless defined otherwise, we simply ignore specialcomments. \def\handleMPspecialcomment {\doresetMPstack \let\handleMPsequence\dohandleMPsequence \handleMPsequence} \let\handleMPspecialscomment\handleMPspecialcomment %D We use the \type{page} comment as a signal that %D stackbuilding can be started. \def\handleMPpage #1 #2 {\doresetMPstack \donetrue \let\handleMPsequence\dohandleMPsequence \handleMPsequence} %D The same applies to the special extensions. \def\handleMPspecialcommand {\doresetMPstack \let\handleMPsequence\dohandleMPsequence \handleMPsequence} %D \METAPOST\ draws its dots by moving to a location and %D invoking \type{0 0 rlineto}. This operator is not %D available in \PDF. Our solution is straightforward: we draw %D a line from $(current\_x, current\_y)$ to itself. This %D means that the arguments of the preceding \type{moveto} have %D to be saved. \def\lastMPmoveX{0} \def\lastMPmoveY{0} %D These saved coordinates are also used when we handle the %D texts. Text handling proved to be a bit of a nuisance, but %D finally I saw the light. It proved that we also had to %D take care of \type{(split arguments)}. % \def\setMPfshowfont#1#2% % {\font\temp=#1\space at #2\relax\temp} % \startMPcode % draw btex Ga toch effe f\kern0ptietsen?{}` etex ; % \stopMPcode \newtoks \everyMPshowfont \def\setMPfshowfont#1#2% {\font\temp=#1\space at #2\relax\temp \the\everyMPshowfont} \let\MPfshowcommand\empty %D The next hackery handles characters one by one. We only support this %D for the latest greatest \METAPOST\ binaries, the ones that escape %D problematic chars. \def\doflushMPtext#1% {\edef\!!stringa{#1}% \@EA\dodoflushMPtext\!!stringa\relax} \def\dodoflushMPtext {\afterassignment\dododoflushMPtext\let\nexttoken=} \def\dododoflushMPtext {\ifx\nexttoken\relax % done \else\ifx\nexttoken\char \@EA\@EA\@EA\dodododoflushMPtext \else {\nexttoken}% \@EA\@EA\@EA\dodoflushMPtext \fi\fi} \def\dodododoflushMPtext {\afterassignment\dododododoflushMPtext\scratchcounter} \def\dododododoflushMPtext {{\char\scratchcounter}\let\next\dodoflushMPtext} \def\dohandleMPfshow {\bgroup \setbox\scratchbox\hbox {\obeyMPspecials \let\ \relax % mp breaks long lines and appends a \ \edef\size{\gMPa\nofMParguments}% \ifx\size\PSnfont % round font size (to pt) \advance\nofMParguments -1 \expandafter\scratchdimen\gMPa\nofMParguments pt\relax \ifdim\scratchdimen<1pt \def\size{1pt}% \else \advance\scratchdimen .5pt \def\size##1.##2\relax{\def\size{##1pt}}% \expandafter\size\the\scratchdimen\relax \fi \else \edef\size{\size bp}% \fi \advance\nofMParguments -1 %\font\temp=\gMPa\nofMParguments\space at \size \let\temp\relax % to be sure \setMPfshowfont{\gMPa\nofMParguments}\size \advance\nofMParguments -1 \temp \MPfshowcommand {\ifnum\nofMParguments=1 \def\do(##1){##1}% \doflushMPtext{\dogMPa1}% only latest mp gets this treatment \else % we need to catch ( a ) (a a a) (\123 \123 \123) etc \scratchcounter1 \def\dodo##1% Andreas Fieger's bug: (\304...) {\edef\!!stringa{##1\empty\empty}% and another one: ( 11) -> \ifx 11 \ifx\!!stringa\MPspacechar\MPspacechar\else\expandafter##1\fi}% \def\do(##1{\dodo{##1}}% \dogMPa\scratchcounter\MPspacechar \let\do\relax \loop \advance\scratchcounter 1 \ifnum\scratchcounter<\nofMParguments\relax \gMPa\scratchcounter\MPspacechar \repeat \def\do##1){\dodo{##1}}% \dogMPa\scratchcounter \fi \unskip}}% \setbox\scratchbox\hbox {\hskip\lastMPmoveX bp\raise\lastMPmoveY bp\box\scratchbox}% \ht\scratchbox0pt% \dp\scratchbox0pt% \wd\scratchbox0pt% \box\scratchbox \egroup} \let\handleMPfshow\dohandleMPfshow % so we can overload this one later %D You could consider the following definition to be the most %D natural one. % \def\MPspacechar{\space} % normal case \def\MPspacechar{\char32\relax} % old solution does not work with math %D However, the following implementation is more robust, since %D some fonts have funny visible spaces in the space slot. This %D gives a mismatch between the space that \METAPOST\ took into %D account and the \quote {natural} space. This only happens in %D labels, since \type {btex}||\type {etex} thingies don't have %D spaces. This phenomena showed up when preparing the %D \METAFUN\ manual, where Palatino fonts are used. We can %D safely assume that \METAPOST\ considers \type {\char32} to %D be the space. \def\MPspacechar{\setbox\scratchbox\hbox{\char32}\kern\wd\scratchbox} %D Well, this does not work with math fonts, so: \def\MPspacechar{\char32\relax} %D Most operators are just converted and keep their %D arguments. Dashes however need a bit different treatment, %D otherwise \PDF\ viewers complain loudly. Another %D complication is that one argument comes after the \type{]}. %D When reading the data, we simply ignore the array boundary %D characters. We save ourselves some redundant newlines and %D at the same time keep the output readable by packing the %D literals. \def\handleMPsetdash {\bgroup \ignoreMPspecials \def\somestring{[}% \scratchcounter1 \loop \ifnum\scratchcounter<\nofMParguments \edef\somestring{\somestring\space\gMPa\scratchcounter}% \advance\scratchcounter 1 \repeat \edef\somestring{\somestring]\gMPa\scratchcounter\space d}% \PDFcode{\somestring}% \egroup} %D The \type{setlinewidth} commands looks a bit complicated. There are %D two alternatives, that result in a similar look in both %D $x$- and $y$-dorection. As John Hobby says: %D %D \startnarrower \switchtobodyfont[ss] %D \starttyping %D x 0 dtransform exch truncate exch idtransform pop setlinewidth %D 0 y dtransform truncate idtransform setlinewidth pop %D \stoptyping %D %D These are just fancy versions of \type{x setlinewidth} and %D \type{y setlinewidth}. The \type{x 0 ...} form is used if %D the path is {\em primarily vertical}. It rounds the width %D so that vertical lines come out an integer number of pixels %D wide in device space. The \type{0 y ...} form does the same %D for paths that are {\em primarily horizontal}. The reason %D why I did this is Knuth insists on getting exactly the %D widths \TEX\ intends for the horizontal and vertical rules %D in \type{btex...etex} output. (Note that PostScript scan %D conversion rules cause a horizontal or vertical line of %D integer width $n$ in device space to come out $n+1$ pixels %D wide, regardless of the phase relative to the pixel grid.) %D \stopnarrower %D %D The common operator in these sequences is \type{dtransform}, %D so we can use this one to trigger setting the linewidth. \def\handleMPdtransform {\ifdim\gMPa1 pt>0pt \PDFcode{\gMPa1 w}% \def\next##1 ##2 ##3 ##4 ##5 ##6 {\handleMPsequence}% \else \PDFcode{\gMPa2 w}% \def\next##1 ##2 ##3 ##4 {\handleMPsequence}% \fi \let\handleMPsequence\dohandleMPsequence \resetMPstack \next} %D The most complicated command is \type{concat}. \METAPOST\ %D applies this operator to \type{stroke}. At that moment the %D points set by \type{curveto} and \type{moveto}, are already %D fixed. In \PDF\ however the \type{cm} operator affects the %D points as well as the pen (stroke). Like more \PDF\ %D operators, \type{cm} is defined in a bit ambiguous way. %D The only save route for non||circular penshapes, is saving %D the path, recalculating the points and applying the %D transformation matrix in such a way that we can be sure %D that its behavior is well defined. This comes down to %D inverting the path and applying \type{cm} to that path as %D well as the pen. This all means that we have to save the %D path. %D In \METAPOST\ there are three ways to handle a path $p$: %D %D \starttyping %D draw p; fill p; filldraw p; %D \stoptyping %D %D The last case outputs a \type{gsave fill grestore} before %D \type{stroke}. Handling the path outside the main loops %D saves about 40\% run time.\footnote{We can save some more by %D following the \METAPOST\ output routine, but for the moment %D we keep things simple.} Switching between the main loop and %D the path loop is done by means of the recursely called %D macro \type{\handleMPsequence}. \def\handleMPpath {\chardef\finiMPpath0 \let\closeMPpath\relax \let\flushMPpath\flushnormalMPpath \resetMPstack \nofMPsegments1 \let\handleMPsequence\dohandleMPpath \dohandleMPpath} %D Most paths are drawn with simple round pens. Therefore we've %D split up the routine in two. \def\flushnormalMPsegment {\ifcase\getMPkeyword\relax \PDFcode{\!MPgMPs1 \!MPgMPs2 l}% \or \PDFcode{\!MPgMPs1 \!MPgMPs2 \!MPgMPs3 \!MPgMPs4 \!MPgMPs5 \!MPgMPs6 c}% \or \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l}% \or \edef\lastMPmoveX{\gMPs1}% evt \!MP here \edef\lastMPmoveY{\gMPs2}% \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space m}% \fi} \def\flushconcatMPsegment {\ifcase\getMPkeyword\relax \doMPconcat{\gMPs1}\a{\gMPs2}\b% \PDFcode{\!MP\a\space\!MP\b\space l}% \or \doMPconcat{\gMPs1}\a{\gMPs2}\b% \doMPconcat{\gMPs3}\c{\gMPs4}\d% \doMPconcat{\gMPs5}\e{\gMPs6}\f% \PDFcode{\!MP\a\space\!MP\b\space \!MP\c\space\!MP\d\space \!MP\e\space\!MP\f\space c}% \or \bgroup \noMPtranslate \doMPconcat\lastMPmoveX\a\lastMPmoveY\b% \PDFcode{\!MP\a\space\!MP\b\space l S}% \egroup \or \edef\lastMPmoveX{\gMPs1}% \edef\lastMPmoveY{\gMPs2}% \doMPconcat\lastMPmoveX\a\lastMPmoveY\b% \PDFcode{\!MP\a\space\!MP\b\space m}% \fi} % \def\flushnormalMPpath % {\scratchcounter\nofMPsegments % \nofMPsegments 1 % \loop % \flushnormalMPsegment % \advance\nofMPsegments 1 % \ifnum\nofMPsegments<\scratchcounter % \repeat} % % \def\flushconcatMPpath % {\scratchcounter\nofMPsegments % \nofMPsegments 1 % \loop % \flushconcatMPsegment % \advance\nofMPsegments 1 % \ifnum\nofMPsegments<\scratchcounter % \repeat} % % an alternative is presented below: (no \def assignment) \def\doflushsomeMPpath {\dodoflushsomeMPpath \advance\nofMPsegments 1 \ifnum\nofMPsegments<\scratchcounter \expandafter\doflushsomeMPpath \fi} \def\flushsomeMPpath {\scratchcounter\nofMPsegments \nofMPsegments 1 \doflushsomeMPpath} \def\flushnormalMPpath{\let\dodoflushsomeMPpath\flushnormalMPsegment\flushsomeMPpath} %OLD \def\flushconcatMPpath{\let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath} %NEW pre-calculate 1/D so it needn't be repeated for each control point. \def\flushconcatMPpath {\MPreciprocaldeterminant \let\dodoflushsomeMPpath\flushconcatMPsegment\flushsomeMPpath} %D The transformation of the coordinates is handled by one of %D the macros Tanmoy posted to the \PDFTEX\ mailing list. %D I rewrote and optimized the original macro to suit the other %D macros in this module. %D %D \starttyping %D \doMPconcat {x position} \xresult {y position} \yresult %D \stoptyping %D %D By setting the auxiliary \DIMENSIONS\ \type{\dimen0} upto %D \type{\dimen10} only once per path, we save over 20\% run %D time. Some more speed was gained by removing some parameter %D passing. These macros can be optimized a bit more by using %D more constants. There is however not much need for further %D optimization because penshapes usually are round and %D therefore need no transformation. Nevertheless we move the %D factor to the outer level and use a bit different \type{pt} %D removal macro. Although the values represent base points, %D we converted them to pure points, simply because those can %D be converted back. %OLD \mathchardef\MPconcatfactor=256 % beware don't remove spaces before it %OLD \def\doMPreducedimen#1 %OLD {\count0\MPconcatfactor %OLD \advance\dimen#1 \ifdim\dimen#1>0pt .5\else -.5\fi\count0 %OLD \divide\dimen#1 \count0\relax} %OLD % too inaccurate (see old pragma logo) %OLD %OLD \def\doMPreducedimen#1 %OLD {\count0=\MPconcatfactor %OLD \divide\dimen#1 \count0\relax} %OLD \def\doMPreducedimen#1 %OLD {\advance\dimen#1 \ifdim\dimen#1>0pt .5\else -.5\fi\MPconcatfactor %OLD \divide\dimen#1 \MPconcatfactor} %D The transformation code is rewritten by Daniel H. Luecking who %D describes his patch as follows: %D %D We would like to divide 1 by $X$, but all divisions are integer so %D for accuracy we want to convert to large integers and make sure the %D integer quotient has as many significant digits as possible. Thus we %D need to replace $1/X$ with $M/N$ where $N$ is as large as possible %D and $M/N$ is as large as possible. Also for simplicity $M$ should be %D a power of 2. So we make $M = 2^{30}$ \footnote{$2^{31} - 1$ is the %D largest legal integer. Using it (and simply ignoring the inaccuracy %D caused by $-1$) turns out to be at least as accurate in all cases, %D and more accurate in some.} (largest legal power of 2) and adjust %D $X$ downward (if necessary) to the the range $1-2^{16}$. This gives %D at least 15 significant binary digits, (almost as accurate as %D \METAPOST\ for numbers near 1) or almost 5 significant figures %D (decimal). \newcount\MPscratchCnt \newdimen\MPscratchDim % will be assigned global \def\MPadjustdimen % sets \MPscratchDim and \MPscratchCnt {\MPscratchCnt0 \doMPadjustdimen} \def\doMPadjustdimen {\ifdim\MPscratchDim>1pt \divide\MPscratchDim 2 \advance\MPscratchCnt 1 \expandafter\doMPadjustdimen \fi} %OLD \def\doMPexpanddimen#1 %OLD {\multiply\dimen#1 \MPconcatfactor\relax} %D DHL: When viewed as an integer, $1 \hbox{pt}=2^{16}$ so $2^{32}/X$ %D is the right way to do $(1 \hbox{pt})/(X \hbox{pt})$ and get the %D answer in points. But we are limited to $2^{30}/X$. However, we %D actually do $[ 2^{30} / (X/2^K) ]*2^{2-K}$ where $K$ is the number %D of halvings it takes to bring $X$ below $1 \hbox{pt}$. If $K$ is 0 %D or 1 we readjust by multiplying by 4 or 2, otherwise by halving %D $(K-2)$ times \type {\MPscratchCnt} holds the value of $K$ from %D \type {\MPadjustdimen}. \def\MPreadjustdimen % acts on \MPscratchDim and MPscratchCnt {\ifcase\MPscratchCnt \multiply\scratchdimen 4 \or \multiply\scratchdimen 2 \else \expandafter\doMPreadjustdimen \fi} \def\doMPreadjustdimen {\ifnum\MPscratchCnt>2 \divide\scratchdimen 2 \advance\MPscratchCnt -1 \expandafter\doMPreadjustdimen \fi} \def\MPreciprocaldeterminant {\scratchdimen\withoutpt\the\dimen0 \dimen6 % s_x*s_y \advance\scratchdimen - \withoutpt\the\dimen2 \dimen4 % s_x*s_y - r_x*r_y \ifdim\scratchdimen<0pt % we need a positive dimension \scratchdimen-\scratchdimen % for \MPadjustdimen (?) \doMPreciprocal \scratchdimen-\scratchdimen \else \doMPreciprocal \fi \edef\MPreciprocal{\withoutpt\the\scratchdimen}} \newcount\MPnumerator \MPnumerator = 1073741824 % 2^{30} % todo: dimexpr \def\doMPreciprocal % replace \scratchdimen with its reciprocal {\ifdim\scratchdimen=1pt \else \MPadjustdimen \scratchcounter\MPnumerator \divide\scratchcounter\scratchdimen \scratchdimen1\scratchcounter % 1 needed ! \MPreadjustdimen \fi} %OLD \def\presetMPconcat %OLD {\dimen 0=\gMPs1pt \doMPreducedimen 0 % r_x %OLD \dimen 2=\gMPs2pt \doMPreducedimen 2 % s_x %OLD \dimen 4=\gMPs3pt \doMPreducedimen 4 % s_y %OLD \dimen 6=\gMPs4pt \doMPreducedimen 6 % r_y %OLD \dimen 8=\gMPs5pt \doMPreducedimen 8 % t_x %OLD \dimen10=\gMPs6pt \doMPreducedimen10 } % t_y %OLD %OLD \def\presetMPscale %OLD {\dimen 0=\gMPs1pt \doMPreducedimen 0 %OLD \dimen 2=0pt %OLD \dimen 4=0pt %OLD \dimen 6=\gMPs2pt \doMPreducedimen 6 %OLD \dimen 8=0pt %OLD \dimen10=0pt} \def\cleanupMPconcat {\ignoreMPspecials \docleanupMPargument1% \docleanupMPargument6% \keepMPspecials} \def\presetMPconcat {\dimen 0=\gMPs1pt % s_x \dimen 2=\gMPs2pt % r_x \dimen 4=\gMPs3pt % r_y \dimen 6=\gMPs4pt % s_y \dimen 8=\gMPs5pt % t_x \dimen10=\gMPs6pt} % t_y \def\presetMPscale {\dimen 0=\gMPs1pt \dimen 2=0pt \dimen 4=0pt \dimen 6=\gMPs2pt \dimen 8=0pt \dimen10=0pt} \def\noMPtranslate % use this one grouped {\dimen 8=0pt % t_x \dimen10=0pt} % t_y %D \starttyping %D \def\doMPconcat#1#2#3#4% %D {\dimen12=#1 pt \doMPreducedimen12 % p_x %D \dimen14=#3 pt \doMPreducedimen14 % p_y %D % %D \dimen16 \dimen 0 %D \multiply \dimen16 \dimen 6 %D \dimen20 \dimen 2 %D \multiply \dimen20 \dimen 4 %D \advance \dimen16 -\dimen20 %D % %D \dimen18 \dimen12 %D \multiply \dimen18 \dimen 6 %D \dimen20 \dimen14 %D \multiply \dimen20 \dimen 4 %D \advance \dimen18 -\dimen20 %D \dimen20 \dimen 4 %D \multiply \dimen20 \dimen10 %D \advance \dimen18 \dimen20 %D \dimen20 \dimen 6 %D \multiply \dimen20 \dimen 8 %D \advance \dimen18 -\dimen20 %D % %D \multiply \dimen12 -\dimen 2 %D \multiply \dimen14 \dimen 0 %D \advance \dimen12 \dimen14 %D \dimen20 \dimen 2 %D \multiply \dimen20 \dimen 8 %D \advance \dimen12 \dimen20 %D \dimen20 \dimen 0 %D \multiply \dimen20 \dimen10 %D \advance \dimen12 -\dimen20 %D % %D \doMPreducedimen16 %D \divide \dimen18 \dimen16 \doMPexpanddimen18 %D \divide \dimen12 \dimen16 \doMPexpanddimen12 %D % %D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime %D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime %D \stoptyping %D The following optimization resulted from some tests by %D and email exchanges with Sanjoy Mahajan. %D %D \starttyping %D \def\doMPconcat#1#2#3#4% %D {\dimen12=#1 pt \doMPreducedimen12 % p_x %D \dimen14=#3 pt \doMPreducedimen14 % p_y %D % %D \dimen16 \dimen 0 %D \multiply \dimen16 \dimen 6 %D \dimen20 \dimen 2 %D \multiply \dimen20 \dimen 4 %D \advance \dimen16 -\dimen20 %D % %D \dimen18 \dimen12 %D \multiply \dimen18 \dimen 6 %D \dimen20 \dimen14 %D \multiply \dimen20 \dimen 4 %D \advance \dimen18 -\dimen20 %D \dimen20 \dimen 4 %D \multiply \dimen20 \dimen10 %D \advance \dimen18 \dimen20 %D \dimen20 \dimen 6 %D \multiply \dimen20 \dimen 8 %D \advance \dimen18 -\dimen20 %D % %D \multiply \dimen12 -\dimen 2 %D \multiply \dimen14 \dimen 0 %D \advance \dimen12 \dimen14 %D \dimen20 \dimen 2 %D \multiply \dimen20 \dimen 8 %D \advance \dimen12 \dimen20 %D \dimen20 \dimen 0 %D \multiply \dimen20 \dimen10 %D \advance \dimen12 -\dimen20 %D % %D %\ifdim\dimen16>1pt % oeps, can be < 1pt too %D \ifdim\dimen16=1pt \else %D \ifdim\dimen16>\MPconcatfactor pt %D \doMPreducedimen16 %D \divide \dimen18 \dimen16 \doMPexpanddimen18 %D \divide \dimen12 \dimen16 \doMPexpanddimen12 %D \else %D \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18 %D \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12 %D \fi %D \fi %D % %D \edef#2{\withoutpt\the\dimen18}% % p_x^\prime %D \edef#4{\withoutpt\the\dimen12}} % p_y^\prime %D \stoptyping %D %D But, this one is still too inaccurate, so we now have: % \def\doMPconcat#1#2#3#4% % {\dimen12=#1pt % p_x % \dimen14=#3pt % p_y % % % % we should test for >-1024 too, but for the moment take the gamble % \chardef\MPfactor1\ifdim\dimen12<1024pt \ifdim\dimen14<1024pt 6\fi\fi % % % \multiply\dimen12 \MPfactor % \multiply\dimen14 \MPfactor % % % \doMPreducedimen12 % \doMPreducedimen14 % % % \dimen16 \dimen 0 % \multiply \dimen16 \dimen 6 % \dimen20 \dimen 2 % \multiply \dimen20 \dimen 4 % \advance \dimen16 -\dimen20 % % % \dimen18 \dimen12 % \multiply \dimen18 \dimen 6 % \dimen20 \dimen14 % \multiply \dimen20 \dimen 4 % \advance \dimen18 -\dimen20 % \dimen20 \dimen 4 % \multiply \dimen20 \dimen10 % \advance \dimen18 \dimen20 % \dimen20 \dimen 6 % \multiply \dimen20 \dimen 8 % \advance \dimen18 -\dimen20 % % % \multiply \dimen12 -\dimen 2 % \multiply \dimen14 \dimen 0 % \advance \dimen12 \dimen14 % \dimen20 \dimen 2 % \multiply \dimen20 \dimen 8 % \advance \dimen12 \dimen20 % \dimen20 \dimen 0 % \multiply \dimen20 \dimen10 % \advance \dimen12 -\dimen20 % % % \ifdim\dimen16=1pt \else % \ifdim\dimen16>\MPconcatfactor pt % \doMPreducedimen16 % \divide \dimen18 \dimen16 \doMPexpanddimen18 % \divide \dimen12 \dimen16 \doMPexpanddimen12 % \else % \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18 % \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12 % \fi % \fi % % % \divide\dimen18 \MPfactor % \divide\dimen12 \MPfactor % % % \edef#2{\withoutpt\the\dimen18}% % p_x^\prime % \edef#4{\withoutpt\the\dimen12}} % p_y^\prime %D We cannot use \type {\beginETEX} here since in plain we %D get \type {\outer} problems, sigh. %OLD \beginTEX %OLD %OLD \def\MPcriteriumA {512pt} % scale %OLD \def\MPcriteriumB {2pt} % scale %OLD %OLD \endTEX %OLD %OLD \ifx\MPcriteriumA\undefined %OLD %OLD \newdimen\MPcriteriumA \MPcriteriumA=512pt %OLD \newdimen\MPcriteriumB \MPcriteriumB= 2pt %OLD %OLD \fi %OLD \def\doMPconcat#1#2#3#4% %OLD {\dimen12=#1pt % p_x %OLD \dimen14=#3pt % p_y %OLD % %OLD \chardef\MPfactor0 %OLD \ifdim\dimen4<\MPcriteriumB\ifdim\dimen4>-\MPcriteriumB %OLD \ifdim\dimen6<\MPcriteriumB\ifdim\dimen6>-\MPcriteriumB %OLD \ifdim\dimen8<\MPcriteriumB\ifdim\dimen8>-\MPcriteriumB %OLD \ifdim\dimen10<\MPcriteriumB\ifdim\dimen10>-\MPcriteriumB %OLD \chardef\MPfactor1 %OLD \fi\fi %OLD \fi\fi %OLD \fi\fi %OLD \fi\fi %OLD \ifcase\MPfactor % spurious 0 removed %OLD \chardef\MPfactor1 %OLD \ifdim\dimen12<\MPcriteriumA\ifdim\dimen12>-\MPcriteriumA %OLD \ifdim\dimen14<\MPcriteriumA\ifdim\dimen14>-\MPcriteriumA %OLD \chardef\MPfactor16 %OLD \fi\fi %OLD \fi\fi %OLD \fi %OLD % %OLD \multiply\dimen12 \MPfactor %OLD \multiply\dimen14 \MPfactor %OLD % %OLD \doMPreducedimen12 %OLD \doMPreducedimen14 %OLD % %OLD \dimen16 \dimen 0 %OLD \multiply \dimen16 \dimen 6 %OLD \dimen20 \dimen 2 %OLD \multiply \dimen20 \dimen 4 %OLD \advance \dimen16 -\dimen20 %OLD % %OLD \dimen18 \dimen12 %OLD \multiply \dimen18 \dimen 6 %OLD \dimen20 \dimen14 %OLD \multiply \dimen20 \dimen 4 %OLD \advance \dimen18 -\dimen20 %OLD \dimen20 \dimen 4 %OLD \multiply \dimen20 \dimen10 %OLD \advance \dimen18 \dimen20 %OLD \dimen20 \dimen 6 %OLD \multiply \dimen20 \dimen 8 %OLD \advance \dimen18 -\dimen20 %OLD % %OLD \multiply \dimen12 -\dimen 2 %OLD \multiply \dimen14 \dimen 0 %OLD \advance \dimen12 \dimen14 %OLD \dimen20 \dimen 2 %OLD \multiply \dimen20 \dimen 8 %OLD \advance \dimen12 \dimen20 %OLD \dimen20 \dimen 0 %OLD \multiply \dimen20 \dimen10 %OLD \advance \dimen12 -\dimen20 %OLD % %OLD \ifdim\dimen16=1pt \else %OLD \ifdim\dimen16>\MPconcatfactor 1pt \relax %OLD \doMPreducedimen16 %OLD \divide \dimen18 \dimen16 \doMPexpanddimen18 %OLD \divide \dimen12 \dimen16 \doMPexpanddimen12 %OLD \else %OLD \divide \dimen18 \dimen16 \doMPexpanddimen18 \doMPexpanddimen18 %OLD \divide \dimen12 \dimen16 \doMPexpanddimen12 \doMPexpanddimen12 %OLD \fi %OLD \fi %OLD % %OLD \divide\dimen18 \MPfactor %OLD \divide\dimen12 \MPfactor %OLD % %OLD \edef#2{\withoutpt\the\dimen18}% % p_x^\prime %OLD \edef#4{\withoutpt\the\dimen12}} % p_y^\prime %D DHL: Ideally, $r_x$, $r_y$, $s_x$, $s_y$ should be in macros, not %D dimensions (they are scalar quantities after all, not lengths). I %D suppose the authors decided to do calculations with integer %D arithmetic instead of using real factors because it's faster. %D However, the actual macros test slower, possibly because I've %D omitted three nested loops. In my test files, my approach is more %D accurate. It is also far simpler and overflow does not seem to be a %D significant concern. The scale factors written by Metapost are (?) %D always $<=1$ (it scales coordinates internally) and coordinates are %D always likely to be less than \type {\maxdimen}. %D %D If this should ever cause problems, the scale factors can be reduced. % \def\doMPconcat#1#2#3#4% % {\dimen12=#1pt % p_x % #1pt % \dimen14=#3pt % p_y % #3pt % \advance\dimen12 -\dimen8 % p_x - t_x % \advance\dimen14 -\dimen10 % p_y - t_y % \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x) % \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y) % \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y) % \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x) % % \MPscratchDim contains precomputed 1/D: % \dimen18=\withoutpt\the\MPscratchDim \dimen18 % \dimen14=\withoutpt\the\MPscratchDim \dimen14 % \edef#2{\withoutpt\the\dimen18}% % p_x^\prime % \edef#4{\withoutpt\the\dimen14}} % p_y^\prime \def\doMPconcat#1#2#3#4% {\dimen12=#1pt % p_x % #1pt \dimen14=#3pt % p_y % #3pt \advance\dimen12 -\dimen8 % p_x - t_x \advance\dimen14 -\dimen10 % p_y - t_y \dimen18=\withoutpt\the\dimen6 \dimen12 % s_y(p_x - t_x) \advance\dimen18 -\withoutpt\the\dimen4 \dimen14 % - r_y(p_y-t_y) \dimen14=\withoutpt\the\dimen0 \dimen14 % s_x(p_y-t_y) \advance\dimen14 -\withoutpt\the\dimen2 \dimen12 % - r_x(p_x-t_x) % \MPreciprocal contains precomputed 1/D: \dimen18=\MPreciprocal\dimen18 \dimen14=\MPreciprocal\dimen14 \edef#2{\withoutpt\the\dimen18}% % p_x^\prime \edef#4{\withoutpt\the\dimen14}} % p_y^\prime % faster but not that often used % % \def\doMPconcat#1#2#3#4% % {\dimen12\dimexpr#1\points-\dimen 8\relax % p_x-t_x % \dimen14\dimexpr#3\points-\dimen10\relax % p_y-t_y % \dimen18\dimexpr\withoutpt\the\dimen6\dimen12-\withoutpt\the\dimen4\dimen14\relax % s_y(p_x-t_x)-r_y(p_y-t_y) % \dimen14\dimexpr\withoutpt\the\dimen0\dimen14-\withoutpt\the\dimen2\dimen12\relax % s_x(p_y-t_y)-r_x(p_x-t_x) % \edef#2{\withoutpt\the\dimexpr\MPreciprocal\dimen18\relax}% % p_x^\prime % \edef#4{\withoutpt\the\dimexpr\MPreciprocal\dimen14\relax}} % p_y^\prime %D One reason for Daniel to write this patch was that at small sizes %D the accuracy was less than optimal. Here is a test that demonstrates %D that his alternative is pretty good: %D %D \startlinecorrection %D \startMPcode %D for i = 5cm,1cm,5mm,1mm,.5mm,.1mm,.01mm : %D draw fullcircle scaled i withpen pencircle xscaled (i/10) yscaled (i/20) rotated 45 ; %D endfor ; %D \stopMPcode %D \stoplinecorrection %D The following explanation of the conversion process was %D posted to the \PDFTEX\ mailing list by Tanmoy. The original %D macro was part of a set of macro's that included sinus and %D cosinus calculations as well as scaling and translating. The %D \METAPOST\ to \PDF\ conversion however only needs %D transformation. %M \start \switchtobodyfont [ss] %D Given a point $(U_x, U_y)$ in user coordinates, the business %D of \POSTSCRIPT\ is to convert it to device space. Let us say %D that the device space coordinates are $(D_x, D_y)$. Then, in %D \POSTSCRIPT\ $(D_x, D_y)$ can be written in terms of %D $(U_x, U_y)$ in matrix notation, either as %D %D \placeformula %D \startformula %D \pmatrix{D_x&D_y&1\cr} = \pmatrix{U_x&U_y&1\cr} %D \pmatrix{s_x&r_x&0\cr %D r_y&s_y&0\cr %D t_x&t_y&1\cr} %D \stopformula %D %D or %D %D \placeformula %D \startformula %D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x&r_y&t_x\cr %D r_x&s_y&t_y\cr %D 0 &0 &1 \cr} %D \pmatrix{U_x\cr %D U_y\cr %D 1 \cr} %D \stopformula %D %D both of which is a shorthand for the same set of equations: %D %D \placeformula %D \startformula %D D_x = s_x U_x + r_y U_y + t_x %D \stopformula %D %D \placeformula %D \startformula %D D_y = r_x U_x + s_y U_y + t_y %D \stopformula %D %D which define what is called an `affine transformation'. %D %D \POSTSCRIPT\ represents the `transformation matrix' as a %D six element matrix instead of a $3\times 3$ array because %D three of the elements are always~0, 0 and~1. Thus the above %D transformation is written in postscript as $[s_x\, r_x\, %D r_y\, s_y\, t_x\, t_y]$. However, when doing any %D calculations, it is useful to go back to the original %D matrix notation (whichever: I will use the second) and %D continue from there. %D %D As an example, if the current transformation matrix is %D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ and you say \typ{[a b %D c d e f] concat}, this means: %D %D \startnarrower %D Take the user space coordinates and transform them to an %D intermediate set of coordinates using array $[a\, b\, c\, d\, %D e\, f]$ as the transformation matrix. %D %D Take the intermediate set of coordinates and change them to %D device coordinates using array $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$ %D as the transformation matrix. %D \stopnarrower %D %D Well, what is the net effect? In matrix notation, it is %D %D \placeformula %D \startformula %D \pmatrix{I_x\cr I_y\cr 1\cr} = \pmatrix{a&c&e\cr %D b&d&f\cr %D 0&0&1\cr} %D \pmatrix{U_x\cr %D U_y\cr %D 1 \cr} %D \stopformula %D %D \placeformula %D \startformula %D \pmatrix{D_y\cr D_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr %D r_x&s_y&t_y\cr %D 0 &0 &1 \cr} %D \pmatrix{I_x\cr %D I_y\cr %D 1 \cr} %D \stopformula %D %D where $(I_x, I_y)$ is the intermediate coordinate. %D %D Now, the beauty of the matrix notation is that when there is %D a chain of such matrix equations, one can always compose %D them into one matrix equation using the standard matrix %D composition law. The composite matrix from two matrices can %D be derived very easily: the element in the $i$\high{th} %D horizontal row and $j$\high{th} vertical column is %D calculated by`multiplying' the $i$\high{th} row of the first %D matrix and the $j$\high{th} column of the second matrix (and %D summing over the elements). Thus, in the above: %D %D \placeformula %D \startformula %D \pmatrix{D_x\cr D_y\cr 1} = \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr %D r_x^\prime&s_y^\prime&t_y^\prime\cr %D 0 &0 &0 \cr} %D \pmatrix{U_x\cr %D U_y\cr %D 1 \cr} %D \stopformula %D %D with %D %D \placeformula %D \startformula %D \eqalign %D {s_x^\prime & = s_x a + r_y b \cr %D r_x^\prime & = r_x a + s_y b \cr %D r_y^\prime & = s_x c + r_y d \cr %D s_y^\prime & = r_x c + s_y d \cr %D t_x^\prime & = s_x e + r_y f + t_x \cr %D t_y^\prime & = r_x e + s_y f + t_y \cr} %D \stopformula %D In fact, the same rule is true not only when one is going %D from user coordinates to device coordinates, but whenever %D one is composing two `transformations' together %D (transformations are `associative'). Note that the formula %D is not symmetric: you have to keep track of which %D transformation existed before (i.e.\ the equivalent of %D $[s_x\, r_x\, r_y\, s_y\, t_x\, t_y]$) and which was %D specified later (i.e.\ the equivalent of $[a\, b\, c\, d\, %D e\, f]$). Note also that the language can be rather %D confusing: the one specified later `acts earlier', %D converting the user space coordinates to intermediate %D coordinates, which are then acted upon by the pre||existing %D transformation. The important point is that order of %D transformation matrices cannot be flipped (transformations %D are not `commutative'). %D %D Now what does it mean to move a transformation matrix %D before a drawing? What it means is that given a point %D $(P_x, P_y)$ we need a different set of coordinates %D $(P_x^\prime, P_y^\prime)$ such that if the transformation %D acts on $(P_x^\prime, P_y^\prime)$, they produce $(P_x, %D P_y)$. That is we need to solve the set of equations: %D %D \placeformula %D \startformula %D \pmatrix{P_x\cr P_y\cr 1\cr} = \pmatrix{s_x&r_y&t_x\cr %D r_x&s_y&t_y\cr %D 0 &0 &1 \cr} %D \pmatrix{P_x^\prime\cr %D P_y^\prime\cr %D 1 \cr} %D \stopformula %D %D Again matrix notation comes in handy (i.e. someone has %D already solved the problem for us): we need the inverse %D transformation matrix. The inverse transformation matrix can %D be calculated very easily: %D %D \placeformula %D \startformula %D \pmatrix{P_x^\prime\cr P_y^\prime\cr 1\cr} = %D \pmatrix{s_x^\prime&r_y^\prime&t_x^\prime\cr %D r_x^\prime&s_y^\prime&t_y^\prime\cr %D 0 &0 &1 \cr} %D \pmatrix{P_x\cr %D P_y\cr %D 1 \cr} %D \stopformula %D %D where, the inverse transformation matrix is given by %D %D \placeformula %D \startformula %D \eqalign %D {D & = s_x s_y - r_x r_y \cr %D s_x^\prime & = s_y / D \cr %D s_y^\prime & = s_x / D \cr %D r_x^\prime & = - r_x / D \cr %D r_y^\prime & = - r_y / D \cr %D t_x^\prime & = ( - s_y t_x + r_y t_y ) / D \cr %D t_y^\prime & = ( r_x t_x - s_x t_y ) / D \cr} %D \stopformula %D %D And you can see that when expanded out, this does %D give the formulas: %D %D \placeformula %D \startformula %D P_x^\prime = { { s_y(p_x-t_x) + r_y(t_y-p_y) } \over %D { s_x s_y-r_x r_y } } %D \stopformula %D %D \placeformula %D \startformula %D P_y^\prime = { { s_x(p_y-t_y) + r_x(t_x-p_x) } \over %D { s_x*s_y-r_x*r_y } } %D \stopformula %D %D The code works by representing a real number by converting %D it to a dimension to be put into a \DIMENSION\ register: 2.3 would %D be represented as 2.3pt for example. In this scheme, %D multiplying two numbers involves multiplying the \DIMENSION\ %D registers and dividing by 65536. Accuracy demands that the %D division be done as late as possible, but overflow %D considerations need early division. %D %D Division involves dividing the two \DIMENSION\ registers and %D multiplying the result by 65536. Again, accuracy would %D demand that the numerator be multiplied (and|/|or the %D denominator divided) early: but that can lead to overflow %D which needs to be avoided. %D %D If nothing is known about the numbers to start with (in %D concat), I have chosen to divide the 65536 as a 256 in each %D operand. However, in the series calculating the sine and %D cosine, I know that the terms are small (because I never %D have an angle greater than 45 degrees), so I chose to %D apportion the factor in a different way. %M \stop %D The path is output using the values saved on the stack. If %D needed, all coordinates are recalculated. \def\finishMPpath {\PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\fi}} \def\processMPpath {\checkMPpath \ifcase\nofMPsegments\else \flushMPpath \closeMPpath \finishMPpath \fi \let\handleMPsequence\dohandleMPsequence \resetMPstack \nofMPsegments0 \handleMPsequence} %D The following \METAPOST\ code is quite valid but, when %D processed and converted to \PDF, will make a file %D unprintable on a Hewlett Packard printer (from Acrobat %D $v<=5$). Who is to blame, the driver of the OS layer in %D between, is hard to determine, so we add an additional %D check. %D %D \starttyping %D clip currentpicture to origin -- cycle ; %D setbounds currentpicture to fullsquare scaled 5cm ; %D \stoptyping \def\checkMPpath {\ifcase\finiMPpath \ifnum\nofMPsegments<3 % n is one ahead \message{omitting zero clip path}% \nofMPsegments0 \fi \fi} %D In \PDF\ the \type{cm} operator must precede the path %D specification. We therefore can output the \type{cm} at %D the moment we encounter it. \def\handleMPpathconcat {\presetMPconcat \PDFcode{\gMPs1 \gMPs2 \gMPs3 \gMPs4 \gMPs5 \gMPs6 cm}% \resetMPstack} \def\handleMPpathscale {\presetMPscale \PDFcode{\gMPs1 0 0 \gMPs2 0 0 cm}% \resetMPstack} %D This macro interprets the path and saves it as compact as %D possible. \def\dohandleMPpath#1% {\ifcase\lccode`#1\relax \expandafter\dohandleMPpathA \else \expandafter\dohandleMPpathB \fi#1} %\def\dohandleMPpathA#1 % % {\setMPargument{#1}% % \handleMPsequence} \let\dohandleMPpathA\setMPsequence % \def\dohandleMPpathB#1 % % {\def\somestring{#1}% % \ifx\somestring\PSlineto % \setMPkeyword0 % \else\ifx\somestring\PScurveto % \setMPkeyword1 % \else\ifx\somestring\PSrlineto % \setMPkeyword2 % \else\ifx\somestring\PSmoveto % \setMPkeyword3 % \else\ifx\somestring\PSclip % % \chardef\finiMPpath0 % already % \let\handleMPsequence\processMPpath % \else\ifx\somestring\PSgsave % \chardef\finiMPpath3 % \else\ifx\somestring\PSgrestore % \else\ifx\somestring\PSfill % \ifcase\finiMPpath % \chardef\finiMPpath2 % \let\handleMPsequence\processMPpath % \fi % \else\ifx\somestring\PSstroke % \ifcase\finiMPpath % \chardef\finiMPpath1 % \fi % \let\handleMPsequence\processMPpath % \else\ifx\somestring\PSclosepath % \def\closeMPpath{\PDFcode{h}}% % \else\ifx\somestring\PSconcat % \cleanupMPconcat % \let\flushMPpath\flushconcatMPpath % \handleMPpathconcat % \else\ifx\somestring\PSscale % \let\flushMPpath\flushconcatMPpath % \handleMPpathscale % \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi % \handleMPsequence} \def\installMPSkeywordP#1#2% {\expandafter\def\csname\@@MP:P:#1\endcsname{#2}} \def\installMPSshortcutP#1#2% todo: \let {\expandafter\let\csname\@@MP:P:#1\expandafter\endcsname\csname\@@MP:P:#2\endcsname} \def\dohandleMPpathB#1 % {\def\somestring{#1}% \ifcsname\@@MP:P:\somestring\endcsname \csname\@@MP:P:\somestring\expandafter\endcsname \fi \handleMPsequence} \ifx\eTeXversion\undefined \def\dohandleMPpathB#1 % {\def\somestring{#1}% \csname\@@MP:P:\somestring\endcsname \handleMPsequence} \fi \installMPSkeywordP \PSlineto {\setMPkeyword0 } \installMPSkeywordP \PScurveto {\setMPkeyword1 } \installMPSkeywordP \PSrlineto {\setMPkeyword2 } \installMPSkeywordP \PSmoveto {\edef\lastMPmoveX{\gMPs1}% \edef\lastMPmoveY{\gMPs2}% \resetMPstack \setMPkeyword3 } \installMPSkeywordP \PSclip {% \chardef\finiMPpath\zerocount % already \let\handleMPsequence\processMPpath} \installMPSkeywordP \PSgsave {\chardef\finiMPpath3 } \installMPSkeywordP \PSgrestore {} \installMPSkeywordP \PSfill {\ifcase\finiMPpath \chardef\finiMPpath2 \let\handleMPsequence\processMPpath \fi} \installMPSkeywordP \PSstroke {\ifcase\finiMPpath \chardef\finiMPpath1 \fi \let\handleMPsequence\processMPpath} \installMPSkeywordP \PSclosepath {\def\closeMPpath{\PDFcode{h}}} \installMPSkeywordP \PSconcat {\cleanupMPconcat \let\flushMPpath\flushconcatMPpath \handleMPpathconcat} \installMPSkeywordP \PSscale {\let\flushMPpath\flushconcatMPpath \handleMPpathscale} \installMPSshortcutP {l} \PSlineto \installMPSshortcutP {r} \PSrlineto \installMPSshortcutP {m} \PSmoveto \installMPSshortcutP {c} \PScurveto \installMPSshortcutP {q} \PSgsave \installMPSshortcutP {Q} \PSgrestore \installMPSshortcutP {S} \PSstroke \installMPSshortcutP {F} \PSfill \installMPSshortcutP {B} \PSgsave \installMPSshortcutP {W} \PSclip \installMPSshortcutP {p} \PSclosepath \installMPSshortcutP {s} \PSscale \installMPSshortcutP {t} \PSconcat %D The main conversion command is: %D %D \starttyping %D \convertMPtoPDF {filename} {x scale} {y scale} %D \stoptyping %D %D The dimensions are derived from the bounding box. So we %D only have to say: %D %D \starttyping %D \convertMPtoPDF{mp-pra-1.eps}{1}{1} %D \convertMPtoPDF{mp-pra-1.eps}{.5}{.5} %D \stoptyping %D \macros %D {makeMPintoPDFobject,lastPDFMPobject} %D %D For experts there are a few more options. When attributes %D are to be added, the code must be embedded in an object %D accompanied with the appropriate directives. One can %D influence this process with \type {\makeMPintoPDFobject}. %D %D This option defaults to~0, because \CONTEXT\ takes care %D of objects at another level, which saves some bytes. %D %D \starttabulate[|l|l|p|] %D \NC 0 \NC never \NC don't use an object \NC\NR %D \NC 1 \NC always \NC always use an object \NC\NR %D \NC 2 \NC optional \NC use object when needed \NC\NR %D \stoptabulate %D %D The last object number used is avaliable in the macro %D \type {\lastPDFMPobject}. \ifx\makeMPintoPDFobject\undefined \chardef\makeMPintoPDFobject=0 \fi \def\lastPDFMPobject{0} %D The additional code needed can be made available in the %D (global) macro \type {\currentPDFresources}. \let\currentPDFresources\empty \newtoks\everyMPtoPDFconversion \def\convertMPtoPDF % #1#2#3% {\bgroup \defineMPtoPDFfallbacks \ifx\pdfdecimaldigits\undefined\else \pdfdecimaldigits=5 \fi % new \setbox\scratchbox\vbox\bgroup \xdef\MPheight{0pt}% \xdef\MPwidth {0pt}% \forgetall \offinterlineskip \startMPresources \doprocessMPtoPDFfile} % %D The next one is kind of private and probably will become obsolete): \def\processMPtoPDFfile % file xscale yscale {\bgroup \let\finishMPgraphic\egroup \doprocessMPtoPDFfile} \let\setMPextensions\relax \def\doprocessMPtoPDFfile#1#2#3% file xscale yscale {\setMPspecials \setMPextensions \the\everyMPtoPDFconversion \catcode`\^^M=\@@endofline \startMPscanning \let\do\empty \xdef\MPxscale{#2}% \xdef\MPyscale{#3}% \xdef\MPxoffset{0}% \xdef\MPyoffset{0}% \xdef\MPyshift{0pt}% \donefalse \let\handleMPsequence\dohandleMPsequence \message{[MP to PDF]}% was: [MP to PDF #1] but there is a (#1) anyway \input#1\relax} \def\PDFMPformoffset {\ifx\objectoffset\undefined0pt\else\objectoffset\fi} \chardef\blackoutMPgraphic0 % in ConTeXt 1 \def\finishMPgraphic {\stopMPresources \egroup \setbox\scratchbox\vbox {\forgetall \hbox {\PDFcode{q \MPxscale\space 0 0 \MPyscale\space \MPxoffset\space \MPyoffset\space cm}% \ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi \lower\MPyshift\box\scratchbox % unscaled shift \PDFcode{Q}}}% \ht\scratchbox\MPheight \wd\scratchbox\MPwidth \dp\scratchbox0pt\relax \dopackageMPgraphic\scratchbox \egroup \endinput} %D Alternative for \PDFTEX. We cannot come up with something more contexy %D because this module is also used in \LATEX. \def\dopackageMPgraphic#1% #1 = boxregister {%\ifx\pdfxform\undefined % \chardef\makeMPintoPDFobject0 % no pdftex at all %\else\ifx\pdftexversion\undefined % \chardef\makeMPintoPDFobject0 % no pdftex at all %\else\ifnum\pdftexversion<14 % \chardef\makeMPintoPDFobject0 % no resource support %\else % % keep the default value %\fi\fi\fi \ifcase\makeMPintoPDFobject\or\or\ifx\currentPDFresources\empty\else % an existing value of 2 signals object support (set elsewhere) \chardef\makeMPintoPDFobject1 \fi\fi \ifcase\makeMPintoPDFobject \box#1% \or \scratchdimen\PDFMPformoffset\relax \ifdim\scratchdimen>0pt % compensate for error \setbox#1\vbox spread 2\scratchdimen {\forgetall\vss\hbox spread 2\scratchdimen{\hss\box#1\hss}\vss}% \fi \setMPPDFobject{\currentPDFresources}{#1}% \ifdim\scratchdimen>0pt % compensate for error \vbox to \MPheight {\forgetall\vss\hbox to \MPwidth{\hss\getMPPDFobject\hss}\vss}% \else \getMPPDFobject \fi \global\let\currentPDFresources\empty \else \box#1% \fi} \def\setMPPDFobject#1#2% resources boxnumber {\ifx\pdfxform\undefined \def\getMPPDFobject{\box#2}% \else\ifx\pdftexversion\undefined \def\getMPPDFobject{\box#2}% \else\ifnum\pdftexversion<14 \def\getMPPDFobject{\box#2}% \else \ifx\everyPDFxform\undefined\else\the\everyPDFxform\fi \immediate\pdfxform resources{#1}#2% \edef\getMPPDFobject{\noexpand\pdfrefxform\the\pdflastxform}% \fi\fi\fi} \let\getMPPDFobject\relax %D \macros %D {deleteMPgraphic, %D startMPresources, %D stopMPresources} %D %D Here are a few hooks for \CONTEXT\ specific things. \ifx\deleteMPgraphic\undefined \def\deleteMPgraphic#1{} \fi \ifx\startMPresources\undefined \let\startMPresources\relax \let\stopMPresources\relax \fi %D \macros %D {twodigitMPoutput} %D %D We can limit the precision to two digits after the comma %D by saying: %D %D \starttyping %D \twodigitMPoutput %D \stoptyping %D %D This option only works in \CONTEXT\ combined with \ETEX. \def\twodigitMPoutput {\let\!MP \twodigitrounding \def\!MPgMPs##1{\twodigitrounding{\gMPs##1}}% \def\!MPgMPa##1{\twodigitrounding{\gMPa##1}}} \let\!MP \empty \let\!MPgMPa\gMPa \let\!MPgMPs\gMPs %D This kind of conversion is possible because \METAPOST\ %D does all the calculations. Converting other \POSTSCRIPT\ %D files would drive both me and \TEX\ crazy. \protect \endinput therion/thbook/etc/TXSruled.tex0000664000175000017500000004511607270377466015574 0ustar useruser%% file: TXSruled.tex - Ruled Tables - TeXsis version 2.18 %% @(#) $Id: TXSruled.tex,v 18.0 1999/07/09 17:24:29 myers Exp $ %======================================================================* % % These macros will typeset tables with vertical and % horizontal rules. The syntax is similar to Ray Cowan's TABLES.TEX, % but the macros have been completely rewritten. Vertical and horizontal % rules are drawn by macros using vertical spacing controlled by struts. % Usage: % \ruledtable % ... % ... % ... \endruledtable % where is an element of the table (every row must have exactly % the same number of items, although some may be blank), is any % one of % & for no vertical rule % | [or \vb] for vertical rule % \| [or \Vb] for thick vertical rule % \dbl for double vertical rule % and is any one of % \nr for no horizontal rule % \cr for horizontal rule % \CR [or \crthick] for thick horizontal rule % The last must be omitted in favour of the \endruledtable % % For horizontal rules across only some columns use % ... \nr % \crule | \cskip & \Crule ... \crpart % where \crpart is a special \cr for the partial rule line and % \cskip no rule for column % \crule horizontal rule for column % \Crule thick horizontal rule for column % The number of columns must be identical to the other rows. % % To change the appearance of the table, modify \TableItem. % Several modifications are built in: % \LeftJustifyTables left justify each column % \RightJustifyTables right justify each item % \NoJustifyTables center each item (default) % \tablespace horizontal spacing around each item % (default is \quad) % \TightTables use \ horizontal spacing % \LooseTables use \quad horizontal spacing (default) % % Use \bigitem to expand the vertical strut for high or deep items. % % These macros have been reorganized and substantially revised from % version 2.13. The following functional changes have been made: % (1) The @ signs have been removed from the names of the macros % used to save the Plain \cr, \span, and & so that they can be used to % modify the preamble. See above. % (2) Macros for partial horizontal rules have been added. % (3) \tabskip glue has been added so that \tablewidth works % correctly -- the table stretches uniformly over all columns. % (4) \linecount has been moved to the \cr macros. It produces a % warning if the number of columns is different from that in the % previous row. % (5) Trailing spaces in the table items are added to the output. % A macro \NoTrailingSpaces inserts an \unskip after each item to remove % them. But this also removes trailing skips unless they are followed by % an empty \hbox or something similar. This is done automatically for % an \hfill (frequently used to left justify an item). % The default is \TrailingSpaces, but you may wish to insert % \NoTrailingSpaces in your TXSsite.tex file. % (6) \para uses \normalbaselines rather than specific pt values % for the interline spacing and the final strut. % % (C) copyright 1990, 1991 by Eric Myers and Frank E. Paige %======================================================================* % Counters and such: \catcode`@=11 % @ is a letter here \catcode`\|=12 % make sure | is not active \catcode`\&=4 % and that & is alignment tab \newcount\ncols \ncols=\z@ % number of columns in table \newcount\nrows \nrows=\z@ % number of rows in table \newcount\curcol \curcol=\z@ % current column counter \let\currow=\nrows % current row counter \newdimen\thinsize \thinsize=0.6pt % thin rule width \newdimen\thicksize \thicksize=1.5pt % thick rule width \newdimen\tablewidth \tablewidth=-\maxdimen % start ``turned off'' \newdimen\parasize \parasize=4in % paragraph size in tables \newif\iftableinfo \tableinfotrue % report rows and columns? Yes \newif\ifcentertables \centertablestrue % center tables? Yes \def\centeredtables{\centertablestrue}% \def\noncenteredtables{\centertablesfalse}% \def\nocenteredtables{\centertablesfalse}% % synonym ! \let\plaincr=\cr % save real \cr \let\plainspan=\span % save real \span \let\plaintab=& % save real alignment tab & \def\ampersand{\char`\&}% % to print `&' in text \let\lparen=( % save left paren \let\NX=\noexpand % shorthand for \noexpand is \NX %---------------------------------------* % Main macros: % \ruledtable \endruledtable turns on the ruled % table definitions and makes the table with \halign. It handles all % the control stuff; the real work is done by \@RuledTable. \def\ruledtable{\relax % make ruled table \@BeginRuledTable % initialize table \@RuledTable}% % now process table body % \@BeginRuledTable does all the work of setting things up before % we read in the body of the table \def\@BeginRuledTable{% % initialize table \ncols=0\nrows=0 % reset row and column count \begingroup % keep the following local \offinterlineskip % so vrules touch \def~{\phantom{0}}% % ~ is phantom digit \def\span{\plainspan\omit\relax\colcount\plainspan}% \span USER columns \let\cr=\crrule % \cr gives a \tablerule \let\CR=\crthick % \CR gives a \thickrule \let\nr=\crnorule % \nr give no rule \let\|=\Vb % thick vrule between columns \def\hfill{\hskip0pt plus1fill\hbox{}}% % so it is not removed % % support old \tablestrut in place of \tstrut if it exists % \ifx\tablestrut\undefined\relax % if not defined, no problem \else\let\tstrut=\tablestrut\fi % use \tablestrut % \catcode`\|=13 \catcode`\&=13\relax % make | and & active \TableActive % | and & get active \def`s \curcol=1 % reset column count % % define \Halign to do an \halign with or without a width % \ifdim\tablewidth>-\maxdimen\relax % \edef\@Halign{\NX\halign to \NX\tablewidth\NX\bgroup\TablePreamble}% \tabskip=0pt plus 1fil % let things stretch \else % \edef\@Halign{\NX\halign\NX\bgroup\TablePreamble}% \tabskip=0pt % no stretch between columns \fi % % % center text if needed % \ifcentertables % should table be centered? \ifhmode\vskip 0pt\fi % yes: force vertical mode \line\bgroup\hss % center across page \else\hbox\bgroup % else: just put in \hbox \fi}% % end of \@BeginRuledTable % \@RuledTable builds the table with \@Halign and getting the % table body text as its argument. \long\def\@RuledTable#1\endruledtable{% % ruled table alignment \vrule width\thicksize % thick rule on side \vbox{\@Halign % then do \halign \thickrule % thick rule on top #1\killspace % body of table \tstrut % vertical strut for last line \linecount % count this line \plaincr\thickrule % \cr, thick rule on bottom \egroup}% % end of \halign and \vbox \vrule width\thicksize % thick rule on side, end \hbox \ifcentertables\hss\fi\egroup % finish table centering \endgroup % end group from \ruledtable \global\tablewidth=-\maxdimen % and reset width \iftableinfo % report rows and columns \immediate\write16{[Nrows=\the\nrows, Ncols=\the\ncols]}% \fi}% % end of \@RuledTable %---------------------------------------* % Preamble and item macros: % \TablePreamble is the preamble for the \halign in \ruledtable. % To change how each item is processed change \TableItem. % To make a more complicated table you can change \TablePreamble, % but if you do so use the following substitutions in a standard \halign % preamble: % for & use \plaintab % for \cr use \plaincr % for # use ## % for ## use #### \def\TablePreamble{% % \ruledtable preamble \TableItem{####}% % the first item \plaintab\plaintab % && means repeat this \TableItem{####}% % the subsequent items \plaincr}% % end of preamble % \TableItem contains glue or spacing around the item \def\@TableItem#1{% % centers item in ruled table \hfil\tablespace % left glue #1\killspace% % item \tablespace\hfil % right glue }% \def\@tableright#1{% % right justifies item in ruled table \hfil\tablespace\relax % left glue #1\killspace% % item \tablespace\relax}% % right glue \def\@tableleft#1{% % left justifies item in ruled table \tablespace\relax % left glue #1\killspace% % item \tablespace\hfil}% % right glue \let\TableItem=\@TableItem % default is centered \def\RightJustifyTables{\let\TableItem=\@tableright}% % to right justify \def\LeftJustifyTables{\let\TableItem=\@tableleft}% % to left justify \def\NoJustifyTables{\let\TableItem=\@TableItem}% % to center % \TightTables makes the spacing of a table as tight as possible. % \LooseTables, the default, gives more pleasing spacing. \def\LooseTables{\let\tablespace=\quad}% % table spacing is \quad \def\TightTables{\let\tablespace=\space}% % table spacing is space \LooseTables % default is \quad % \TrailingSpaces, the default, allows trailing spaces and glue % to change the appearance of a table. \NoTrailingSpaces removes all % trailing spaces and glue before inserting the table glue. \def\TrailingSpaces{\let\killspace=\relax} % do not kill trailing space \def\NoTrailingSpaces{\let\killspace=\unskip} % kill trailing space \TrailingSpaces % default %---------------------------------------* % Table Height and Width: % % Normally tables are set to their natural width. If \tablewidth % has been set then we set the table to that width instead, % but only for the next table. Then \tablewidth is turned off % \setRuledStrut sets up the vertical strut \tstrut with % the appropriate dimensions to hold up one line of a ruled table. \def\setRuledStrut{% sets interlines spacing for ruled tables \dimen@=\baselineskip % \dimen@ = extra space \advance\dimen@ by-\normalbaselineskip % between lines \ifdim\dimen@<.5ex \dimen@=.5ex\fi % minimum space \setbox0=\hbox{\lparen}% % get character size \dimen1=\dimen@ \advance\dimen1 by \ht0 %% space above line \dimen2=\dimen@ \advance\dimen2 by \dp0 %% space below line \def\tstrut{\vrule height\dimen1 depth\dimen2 width\z@}% }% \def\tstrut{\vrule height 3.1ex depth 1.2ex width 0pt}% default % \tstrut does not produce the correct spacing if the entry in % the table is too high. The following constructs a strut higher than its % argument and then prints the argument. The minimum space value should % be the same as in \setRuledStrut. \def\bigitem#1{% % larger table entry \dimen@=\baselineskip % \dimen@ = extra space \advance\dimen@ by-\normalbaselineskip % between lines \ifdim\dimen@<.5ex \dimen@=.5ex\fi % minimum space \setbox0=\hbox{#1}% % get argument size \dimen1=\dimen@ \advance\dimen1 by \ht0 % space above line \dimen2=\dimen@ \advance\dimen2 by \dp0 % space below line \vrule height\dimen1 depth\dimen2 width\z@ % make strut to size \copy0}% % print argument % \vctr{stuff} centers the stuff vertically, so that it can % appear between two ROWS. \def\vctr#1{\hfil\vbox to 0pt{\vss\hbox{#1}\vss}\hfil}% %---------------------------------------* % Vertical rules: % \tab, \vb and \Vb are used in a table to separate columns with no % rule, a thin rule, or a thick rule, respectively. \nextcolumn{} skips % to the next column and puts the between columns. Use this to build % your own separators. \def\nextcolumn#1{% % move to next col. \plaintab\omit#1\relax\colcount % tab, insert #1, count \plaintab}% % tab to next user col. \def\tab{% % no rule between columns \nextcolumn{\relax}}% % count column \let\novb=\tab % synonym for \tab \def\vb{% % thin rule between columns \nextcolumn{\vrule width\thinsize}}% % count and rule \def\Vb{% % THICK rule between columns \nextcolumn{\vrule width\thicksize}}% % count and thick rule \def\dbl{% % double rule between columns \nextcolumn{\vrule width\thinsize % count and rule \hskip 2\thinsize \vrule width\thinsize}}% % and skip and rule % \TableActive makes | the same as \vb and & the same as \tab so % these single characters can be used between columns. Here we have to % make & and | active so we get the active version of the characters, % hence the temporary change of \catcode. {\catcode`\|=13 \let|0 \catcode`\&=13 \let&0 \gdef\TableActive{\let|=\vb \let&=\tab}% }% end \catcode`s %---------------------------------------* % Horizontal rules: % These replacements for \cr put a wide \vrule at the end of the % line and maybe put a rule under the line, then begin the next line % with the wide \vrule from the preamble. \def\crrule{\killspace % \cr plus rule \tstrut % strut for spacing \linecount % count this line \plaincr\tablerule % \cr, regular rule below line }% \def\crthick{\killspace % \cr plus thick rule \tstrut % strut for vertical spacing \linecount % count this line \plaincr\thickrule % \cr, rule, begin next line }% \def\crnorule{\killspace % \cr plus no rule \tstrut % strut for spacing \linecount % count this line \plaincr % \cr, norule, begin next line }% \def\crpart{\killspace % end partial rule line \linecount % count this line \plaincr} % and end it % These rules go across the table. \def\tablerule{\noalign{\hrule height\thinsize depth 0pt}}% \def\thickrule{\noalign{\hrule height\thicksize depth 0pt}}% % Rules for individual columns. You must use \cskip in columns % with no rules to \omit the \TablePreamble. \def\cskip{\omit\relax}% \def\crule{\omit\leaders\hrule height\thinsize depth0pt\hfill}% \def\Crule{\omit\leaders\hrule height\thicksize depth0pt\hfill}% %---------------------------------------* % Counting macros: % These macros count rows and columns of the table. After the % first line has been processed \the\ncols is the total number of % columns in the table, which may be useful. During processing, % \the\curcol is the number of the current column, while \the\currow is % the number of the current row. \def\linecount{% % count and check row \global\advance\nrows by1% % advance row counter \ifnum\ncols>0% % if \ncols set \ifnum\curcol=\ncols\relax\else % if new \ncols different \immediate\write16% % then write message {\NX\ruledtable warning: Ncols=\the\curcol\space for Nrow=\the\nrows}% \fi\fi % end of tests \global\ncols=\curcol % save columns in \ncols \global\curcol=1} % reset counter \def\colcount{\relax % \global\advance\curcol by 1\relax}% % advance column counter %---------------------------------------* % TEXT TABLES. % To put text in a table use \para{}, with \parasize set % to the desired width of the text. \long\def\para#1{% % make a paragraph for tables \vtop{\hsize=\parasize % width - set before \para called \normalbaselines % set normal baseline skips \noindent #1\relax % insert text \vrule width 0pt depth 1.1ex}% % hold depth of box }% %---------------------------------------* % TABLES.TEX % For compatability with Cowan's TABLES.TEX we also allow the % syntax \begintable ... \endtable, which do the same thing. % \def\begintable{\relax % make ruled table \@BeginRuledTable % initialize table \@begintable}% % now process table body \long\def\@begintable#1\endtable{% % ruled table alignment \@RuledTable#1\endruledtable}% % same as \ruledtable %>>> EOF TXSruled.tex <<< therion/thbook/etc/contents.tex0000664000175000017500000002504512450020322015662 0ustar useruser\cvak\penalty-50 \Line{\pdfstartlink attr {/Border [0 0 0]} goto page 5 {/Fit} \bf Introduction\bodky\ 5\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 5 {/Fit} Why Therion?\bodky\ 5\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 6 {/Fit} Features\bodky\ 6\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 7 {/Fit} Software requirements\bodky\ 7\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 7 {/Fit} Installation\bodky\ 7\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 8 {/Fit} Setting-up environment\bodky\ 8\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 8 {/Fit} How does it work?\bodky\ 8\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 9 {/Fit} First run\bodky\ 9\pdfendlink} \cvak\penalty-50 \Line{\pdfstartlink attr {/Border [0 0 0]} goto page 10 {/Fit} \bf Creating data files\bodky\ 10\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 10 {/Fit} Basics\bodky\ 10\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 11 {/Fit} Data types\bodky\ 11\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 12 {/Fit} Coordinate systems\bodky\ 12\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 12 {/Fit} Magnetic declination\bodky\ 12\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 13 {/Fit} Data format\bodky\ 13\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 13 {/Fit} `encoding'\bodky\ 13\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 13 {/Fit} `input'\bodky\ 13\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 14 {/Fit} `survey'\bodky\ 14\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 15 {/Fit} `centreline'\bodky\ 15\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 19 {/Fit} `scrap'\bodky\ 19\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 21 {/Fit} `point'\bodky\ 21\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 24 {/Fit} `line'\bodky\ 24\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 27 {/Fit} `area'\bodky\ 27\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 28 {/Fit} `join'\bodky\ 28\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 28 {/Fit} `equate'\bodky\ 28\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 29 {/Fit} `map'\bodky\ 29\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 30 {/Fit} `surface'\bodky\ 30\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 31 {/Fit} `import'\bodky\ 31\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 31 {/Fit} `grade'\bodky\ 31\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 31 {/Fit} `revise'\bodky\ 31\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 32 {/Fit} Custom attributes\bodky\ 32\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 32 {/Fit} XTherion\bodky\ 32\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 33 {/Fit} XTherion---text editor\bodky\ 33\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 33 {/Fit} XTherion---map editor\bodky\ 33\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 36 {/Fit} Additional tools\bodky\ 36\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 37 {/Fit} Keyboard and mouse shortcuts in the Map editor\bodky\ 37\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 39 {/Fit} Thinking in Therion\bodky\ 39\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 39 {/Fit} How to enter centreline?\bodky\ 39\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 40 {/Fit} How to draw maps?\bodky\ 40\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 41 {/Fit} How to create models?\bodky\ 41\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 41 {/Fit} Therion in depth\bodky\ 41\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 41 {/Fit} How the map is put together\bodky\ 41\pdfendlink} \cvak\penalty-50 \Line{\pdfstartlink attr {/Border [0 0 0]} goto page 44 {/Fit} \bf Processing data\bodky\ 44\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 44 {/Fit} Configuration file\bodky\ 44\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 44 {/Fit} `system'\bodky\ 44\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 44 {/Fit} `encoding'\bodky\ 44\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 44 {/Fit} `language'\bodky\ 44\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 44 {/Fit} `cs'\bodky\ 44\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 45 {/Fit} `sketch-warp'\bodky\ 45\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 45 {/Fit} `input'\bodky\ 45\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 45 {/Fit} `source'\bodky\ 45\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 46 {/Fit} `select'\bodky\ 46\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 46 {/Fit} `unselect'\bodky\ 46\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 47 {/Fit} `text'\bodky\ 47\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 47 {/Fit} `layout'\bodky\ 47\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 53 {/Fit} `setup3d'\bodky\ 53\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 54 {/Fit} `sketch-colors'\bodky\ 54\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 54 {/Fit} `export'\bodky\ 54\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 56 {/Fit} Running Therion\bodky\ 56\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 57 {/Fit} XTherion---compiler\bodky\ 57\pdfendlink} \cvak\penalty-50 \Line{\pdfstartlink attr {/Border [0 0 0]} goto page 58 {/Fit} \bf What we get?\bodky\ 58\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 58 {/Fit} Information files\bodky\ 58\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 58 {/Fit} Log file\bodky\ 58\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 58 {/Fit} XTherion\bodky\ 58\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 58 {/Fit} SQL export\bodky\ 58\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 60 {/Fit} Lists---caves, surveys, continuations\bodky\ 60\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 60 {/Fit} 2D maps\bodky\ 60\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 60 {/Fit} Maps for printing\bodky\ 60\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 61 {/Fit} Maps for GIS\bodky\ 61\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 61 {/Fit} Special-purpose maps\bodky\ 61\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 61 {/Fit} 3D models\bodky\ 61\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 61 {/Fit} Loch\bodky\ 61\pdfendlink} \cvak\penalty-50 \Line{\pdfstartlink attr {/Border [0 0 0]} goto page 62 {/Fit} \bf Changing layout of PDF maps\bodky\ 62\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 62 {/Fit} Page layout in the atlas mode\bodky\ 62\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 67 {/Fit} Page layout in the map mode\bodky\ 67\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 68 {/Fit} Customizing text labels\bodky\ 68\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 69 {/Fit} New map symbols\bodky\ 69\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 70 {/Fit} Point symbols\bodky\ 70\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 71 {/Fit} Line symbols\bodky\ 71\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 71 {/Fit} Area symbols\bodky\ 71\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 72 {/Fit} Special symbols\bodky\ 72\pdfendlink} \cvak\penalty-50 \Line{\pdfstartlink attr {/Border [0 0 0]} goto page 73 {/Fit} \bf Appendix\bodky\ 73\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 73 {/Fit} Compilation\bodky\ 73\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 74 {/Fit} Quick start\bodky\ 74\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 74 {/Fit} Hacker's guide\bodky\ 74\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 75 {/Fit} Environment variables\bodky\ 75\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 76 {/Fit} Initialization files\bodky\ 76\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 76 {/Fit} Therion\bodky\ 76\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 78 {/Fit} XTherion\bodky\ 78\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 79 {/Fit} Limitations\bodky\ 79\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 79 {/Fit} Example data\bodky\ 79\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 80 {/Fit} History\bodky\ 80\pdfendlink} \cvak\Line{\quad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} Future\bodky\ 82\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} General\bodky\ 82\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} 2D maps\bodky\ 82\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} 3D models\bodky\ 82\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} XTherion\bodky\ 82\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} Loch\bodky\ 82\pdfendlink} \cvak\Line{\qquad\pdfstartlink attr {/Border [0 0 0]} goto page 82 {/Fit} Labyrinth\bodky\ 82\pdfendlink} therion/thbook/pic/0000775000175000017500000000000012447624714013322 5ustar userusertherion/thbook/pic/page.pdf0000664000175000017500000006035607644566372014753 0ustar useruser%PDF-1.4 4 0 obj << /Length 44 /Filter /FlateDecode >> stream xÚ+ä2¶4Ó³4µ0U0B C=KC #0'9—Kß3×PÁ%Ÿ+ ­Œnendstream endobj 3 0 obj << /Type /Page /Contents 4 0 R /Resources 2 0 R /MediaBox [0 0 396.96 481.92] /Parent 5 0 R >> endobj 1 0 obj << /Type /XObject /Subtype /Image /Width 827 /Height 1004 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 23829 /Filter /FlateDecode >> stream xÚíÉqå:®éSm‘ÞÈ€»RD/ÒŽ2 計·Ld€оBµ¨E-øÄ$1$@ÉÿïAuÏÈCæÇê‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ÚK]]@‚€=â$QÅWÒk.ýÇÐJ7ÃÑá´wru¥œîë=ƒ>>?‘ïeˆÉftö¨:;ä:@çs 6ŸŸ_0m cC‡nÎ×l`Õ@Ç]a“”ŸS":®þ(›kE½{ðEÑq¹–‹]uǦä6‡°ðÅÐÙí€/ŠN%÷¾aÊ ttèÖèD†kàè(Ñ¡4·stâj(¦5:Í€,ݨP 6 t"Б$·st>AÐÙ :©è"è|!Z:û¡#)í8AçäýÐIr;×@ç áÐÙ”.Ðk ƒp èì‹NÂ\¨!Ø/ЉG'Áí\/¦ÎÞèÄÁÐù@ÐÙx·st>Ñ€töG‡cÇEËGç ½k@çtêØ.ÐòщlûD 褡cq;מê;5ôŒÆT·; cq;rµ«>;à÷  SËÅÐÙí€/Ndhé7ÌÏK Ý:nòAáèD¯äa “ŒNœÛ)蕯-èĸ’Ñù@¼tF'ÂíŒNÊjŸ0^ ³ ˆ©Ö墓²8;Ø€ÎFtô+|”‹NÊâì°] ³½Û)§ƒ"ÐÙŒŽÚí‹Î;œÐ9õ±”ŠÎœÐ9s \ ïþº”ÓÁþ:·Bg:˜+Nu»–ÓÁT·[¡£\á£Ì«ž²ß.Æt°eBGw4e¢óŽ1 s::·S$:p:@çLtT‡S":_(LSÑQ¹SÐùüôn’ûŽÂ4Ð9ÍñÎçÇ´Åôj@§Dt4ë‹Î× ‹5=_¨ÓÑQ,£{ :ŸŽìº¡èœŽÂí„Η? 3èA¸tJ@'ìvŽ@çSåHúÐ áÐ)ðTë½ÑùúŒÀ>?®BÐ NµÞÏ”è áÐ) ÛÙ (w³I×€Îè„ÜÎ>è|}¾&st¨@tBngts7×î‚NCÎyèÛÕ»E¾'Sôº]ÕˆsÊ~/{ÀN3 ¼íTt èÚ*.` ¬ð‘+`;2»9 .-KÏ=ÝM•åØŠEÇŸ‚eAçónvHt¤qCjHrwt¼ÏfAçý,e¦&>È ¸¡í苎¯h~it²Õ¥×ÔÌÓÝæFÙÅòb¸ û§Oç Ø®LŽÌhÐe32–…fo?w Ø…ÑùÈÂÍ&Ó—Aßn‡Žçù뢓œÉì·9ŒEGÏu?÷CÇ=ùàºèl ×Fs§ŽBšÏ>÷CÇ=çí²èlÑÌœrY¸´7§™ÿy`ðvCtœnçªè|ä‡rÚ¶ gxVwx˜ó¹!:Î.Ð,è|]kD‡÷±j1îN&>Or>wDÇ5ù O#ΕœüWAhvŠê1й,:.·sMt>¶˜÷Nàt'Yµˆ‡ÐsKtnçšèlt9ûY1­Ïñä|@Ï-Ñqô:\Ôp­s9´ç• Ûýé9ôÜ þ)q¬é^:Õë>áZgÀ;”¼Ì“Hö+aÐS@Í [SéÐßáyN¢èKPyÑù¹ÓÙÑåÈìkÈ_ (¡b-@'"`sm`åù9êóðyíär,_Dî»ÑÍ·»¢c½ :IN§Ms蘫A¾/é¹å`é]ѱµã\$§#‡¶–Q`í»¡bÍ@ç*èXÜÎõÐùL%‡ú³ð °s_×s[t,ã¢×C'•¬ö|(öc³EÜ€ŽÎ†äÚè|n#g†Ï®ìˆÊ^n·ÝµÛɃÎWÉ舵´ÖÅLûµfjس:%¢ÃfH°õëDœ‡’ã5rÏóãŠ1nc S:²0œe;Žo\¹Dt>2’3Ån»d>¤Eªn”ôÜlk*ži‹—^ ÏrH6í@’ïã» <·Ú†—»y󮃼:±ã¡¢ ݇eÌöíù&ðÜkÍ¿Äx-]„3CJÈ8?=zv†ŠÁÅá¹:d^ƒù¸èÍÑ¡¨¾µüô(c¶öeûÎÂ:Ztx•ÓŒÿIóø­+5m<Ÿe¢#ѦØÚ/ŸÃÎÐ.Ä@çÕ÷’ü§™·|ªhW^‘zíx蔂ÎX¿ñvNGüšÃv>´Wbkã ÎŒRÒÁñ'kï}Üo[/ýÊ)cª× Øâ׿p½èPèhjl²ßXülêÓ.ì¬#;ñ4æô¿´ŸgÚú6î¾ÿ2ÐQ• $…ÎÕx:ÝñB|Ó˜ò¨Ó±ðêÚ ÖˆTº¦ªé/ÐQ C 6ÐÔ´ùbè„Ýïœ$§¼}QÕu|ÈvÑâ´¤½­s>\:Ëi:¯¯Ë¨ÜŽì_ÏMMyRC¶!FðY« Óæ!:1 PäÏcòÍmFççëkÕNÖéôý¯ßš~öÿ­-²Ñ—aµé£^;¶A6q]â©ñ·žÐ xÌ×™%‹Î«âè!¡~! @ ÑÎæþÏ×êGÕ#ôúúãÇ79?šr~F…l|L-×t<úI—é!›“á0Ú¿:ý07ûªr@g@G"£”æWöG,ÌK€(  óªG×ÒÒÒÎýþGƒP;rØð{R¹@w•쯲/)×[+Wµ‰N[dDÀ¦CG½Úäâ2ÝŠ¶”¯ >ý\ëê;’û¡­Ž»IC'é!›ƒþzG5jߎ…I½(:’p·]_ @ª$(#:í?úÌçõ;Óé8סC‡Þ)ᔓÊFìlëñíèß`Îø%ªŽ ·ã²´o€¸ŠJ‚2¢Ó:™תuA¯:§#OLæ”ñ4]ÈÆªëõ}™º½‚ÆÅ[º!Ѧ·à„öËNus}½ˆÛм™ W ÷‘ ®.0Cg±HNŒÝ¿ÔÆÑf"ª›šóŠ-®›è ó€ùœ…A.ÛÃæºŒ®Ãú>»M…-tŠYÃ}fC§ûÛÔæ:KtJ ×Rƒ6••8œ“”= á²è¸ÜާÔòmjÊKaK‚ ”~g@f°}x/ÀáE%õ4¶P0¦sN\ôZ9×íœv»q_ ¸Éõ.(#:&øÎë³øæs:gÝ‘£ÙÑqÇoéG|…* “·Û!ç1sJ™ÈÃýx}}ÝÎÐ40x˜¡›`øªHuÖùNxTgÜ•µmÔT¦ï¹ð|h·³i¢­÷Ø{ÖŒŽZrzø W]€NœyûÑ V:>“ ^àðÂèĺvA6ÙæØ\Ðv‚bû¦éÔÉ”‘쨢-—Û¡ÓììÎèĺnæV›ûýööVíOœ3KOqìèîVžûÐÉŽNévÚ.FÎat¿;ýÊCÐÏŸqkÐéEÛ¸“¨Üñd; t²£Ãqn§kÎáv~Ïd'H_IpoRTq-Ûá íÖèDºî(Èpûm“ Æ ½¦¢óYTqmƒÅ°£t;Îë-@';:+F†þ@ëÙæª›f]탎Ÿ B 6ží©ìÑÚ™¶Ôo×€«±2×à)mô±˜êf~—V$>·Ó CRg˜Úñ;¬† B¯³‰Ö1;»M䜕HOMŒßQ™/íT( cCÇs7eh¶Ä ]çèæLáÏoµ\N¨K†ÚŠ‚÷u‘ÐØ®®ïnH›ëºÁ¹§Xý­ªvœ« ®¾„¡³"@ë;Ý÷#íAÓæ€çïïh½¹¼Í9šØ üuÔÙeÇGYÄyTí\¬PputÜn‡lèôëAÐñè˜^èÍЪ07 ‹²o=ó–"“!)Š¥Ûq^q “O!Ú†·#;›ýw½½y(ú1 } AR¥l#2Ú› ˆÐWãv<…:ùÑqŽZïj]ȳy-Ãß¹õËÏ}4s'1WhŒåö ãôì„ÝŽ0¹#6:ùѱ¹¦U³]ëa~×m÷×ÉR(ø½›~y¹$2€G»x }È8åÒÝÒö©±;:¼^¬ƒúÅÙ÷éî3JEÇIÐ6Ï1”õLš@}Zšßw­Û 6 1î|Slc›¬Þ\½îêlÚù}”Út(WÀ%ÝÙ¡œñ›Ú« —ŠØn€Nwõ¦*m{gµÝ¦;tx»ÛùûûPýËšžtç)>êµh4–v©ˆí[SѰ ît?%ǸNsóÖõfFçwösعŸ<Á›6dÓt\ªíèȪŠÔ4‰¸Ð©ºE«·Üu&ç÷ß=Îc‹O†tC6Ê»•{ÂÐYÍy㪪]èp—m9úG£“äv$œHzn§['|S²tvAg1ÕZœÃ¤u–dçÏïBÝο¿ÿþ‹ ê®Ga=ŠJA»®¤fm[‡9™ìÜcÞ™Ûq®wÔ/OõÆÛïß%¸†“F é›í¹Ú¶|¦²R°1Ù:» 3º®¸F¾ëÒ½tèhÖ"ÁÛ/½ÛùçbÅúò˜}ešÈMézl«;—rNûëxÑÝN»y¯ 5ó6,´’7Ó©ÞvñRâ/¨2··ÒÁ)>߅׆dSÝüèLÙŽgÖ°£Q›'Ï<øó»xýúþ…ÿú޽˜ºBª}êVÇ­o6(ztF·ã[Ø•ûP­­c§&; §mBø#]xLóg2<Ê}tÒÑ)±NptdHa<ΤwÝý§ÝÆ.AγM«Îk›o$içÃqƒ¨ÝЩÎnètnÇ¿˜xÍ:3ÑÙ×ó §ÉäGÂ$…Fº4‰€NQ茻WŽ.‚ñ®úbσ ÷;–ßñw4Ë•ÒÿãßñŽñ;~?”»å¶ÄiŽse<ì~Gÿ/çÙþmûŽy(:ªu·ˆòwļ£Š~Ç”l—Îp'åÆTÈRŒh_ÑŽat=Äì*_®è¿ãÏ4'`5I Pt>þoÕÿ,‡,½Îú‡ö¾›—g·öŸ+#bs¿£7%×ÙÍÏöó›ÿ¨lj•¿#æ+ï¬üŽâ¶vΛυö-ÃíðE›=G;Üëä9]™í-¾åº7‡„ÝÛ'SS&v}NDuš¦Ô>:×ñ¯ÖÑOíŸÝ"À¿ßSõ?º3ܪ£ÙÙÒ* D‡"Èá6„»:ÎÕ¤w³(¡Æý€?¿/‡Nµa¶BìªA{££®NkÙÓînçNèØ.·9³kqéb†™/çr:t6ÌVˆìTÕZ=ìQioc…pÿ‘ ;¡³r;<ÓVèhû¿?¿¯‰ÎŸ ç9²ÝBq2Uã:² )ÇÙ=b»:3·cT,n¦]Å@ùÛÿþ¾¤^ªmóKãØÉƒŽ»ETgoÆŒ::èŒng¨ °+BkŸÕýö‹‚Ó ól™_²)Æ;ç›7¢3Û|ig ½:­ÛÖ}‘ÐuјÆeÁÙŽŽ~Åeæ¸QÐ^U±!О\…itªƒÓ ókS²׿FGSIpÏ$UÅ_³²ÚÞÉÎíÐñ,ô‹Îàì4_§Cçmãb:1ssÂèl©M+Ñ™¹¦~(óutèxãÐ9Æã(g‰žƒŽÍ:\a ݯ©Ð™¤¥ ³D3øáE…=  ×Õ²¡£Y‰C‹Ž¨.×§«Ðáå&»ŽŠ>®’àBçß Ài›Ø¶¢ì_º­ ‡4³ðV›`X«E@g»!°QÈ4Áùóû* …sºù® ÓXV Œ-ï€ÎÎèü½ 89БŒèl‰×jÝ +›¤Ùf[Ì:!tþþ¾‘šÄÖ“ Å ‘7Rä:–îj™¶õªr«ÎôÌ¿?¿ï¦?Å £Èؽ‹ƒèÐq¾¤ï/! “©Âf¢ó÷~àl^è="× äÓ ”‰]N§k§ª¶¡Ó«sn˜ðTt末¿¿o©ãÐYMÌç•Ó |šË%´‹ôh¦®Ó!Êj´ØšHíª{’³5ÕÙ€Î| «6Óñš;’¾½ŠÃ–J¦r¦;@§) ¼Ý?‡YÇ ™í²n‰ñöiS•¼VûttºÑÏ»¢óïÿ¶p)´Òh÷žt¯#Ñ® ›Y›Ú€Î[õò«ºr¶ó«EfÐËö.‚ Ngú˜ïóoq0!rxØ79KÀ–qÅ‚g¡cÜŸ`©¹Q¿²mDæeBæû¿~µ.ô_Žó±Ž4S¼¥4ò-GÀS4— :Cšº!öߣŽÖ½ímp:=?J{}) ™ª‰ÓÚ†µFã± ›oLFÖ :2Os<ïmrú­ŒèTG‡Ú}2Ûèð¡ü]– ã{3â¶_:·óë¥:>¶†6eŽLóÛ¿aù—u«yÈÙú¹Ù ­Íþ‹Ý5tÃS©½…®z–­<}atÆbIð¬ök ,FoÞz?ÓÿyQ ó6r'ë²ÕÊxÜÔp@&\’Úêtxrš«6›~æ(b\],–­<}å\g8ã•ßVƉ8 t^b½Ç˜Š¯!y«lÊT2Ó"ãŠv®xÂ5K8f.ÐK<´O>Šr¡“Ír/‰NwÞÛ‰ÔÞ ÝÇb.n³@'δ½Ta½eò8sdˆ9n]—í!›~©vß+-ϵ-5¤ö”{º5Ò<î.Üüo»ï®«4Ÿ2ýf¸‹ï -®¦ö¶$khªYÉìÿ%Zþ¶M_#ˆ$§-šY‹jËC®º y)¢ lP˵iÕe6î¶•ªë dGiÀŽŽY`SWµ&›Þ±kǨ2o™å¹ñƪ­x d6ªfõf/;myÍøxeƒšî «G£Óžÿªê·[^ŒeB3`ûõ–Ð@0”·vì<˜vòlbG;¤Ã~rØõÉöÝ—~G–‹¯ç Å2Š^jÿPwk×½[ÞᬋÛÌs—¤,¾¥gç%ÖÇšô†¡Í-!›2\ó§äÀÃãWo©ª8¢,že²Ýkæ:2lßÕÑrsÿ.»L¯ÌB·ß‡ ³m¢¥ßYI¹šoI@gÚï«c,Þ4»¨{Óövæq;×D‡ºb´"C‡³Fç×Y ŸZt6¶¡¥‡lšp-ŽÓé —ÉAçÌôç|iìM›Åp–"Ûe+líawz·3\ ßjj:¿š$ü­Pt~å›m“²…ßÇ.ÌM†‘ºU!N´½¢´!z&: 6Ò´7Ñèv:çþ×»]Í[5Õ™_^Êh•^ðpˆ2œ(ª8e™ÿÀN»Ò@`õfrïXÀµ†¾¼6·7ÖûúU¶…%‡Û¹f…­Ρ¦8ÝÚš"u©y]ɰ5õµ2ÐYpˆ9Èi²ý„k$áeCËž“gîUìtðD£c³J¶W·›ï5Ñé m<ß\§Î)¢!G)«u¿â_¶3ü5Qìàq[ª5ÛûXªZÎîdÝOÝ b{ÈvÑ€º»‰´ý\ýûš’ñEÐù“‰œ¤[«ß¸I±Ñ†¿¿@eÕ´vPJtÔ½*-HèÔl÷EU»¼@:…Î ý>¬?ÙÎTÊ5òÝ‹•ÛyŠïÚÕZv/åÜC6´™«§‡Co m/¿^"¼Nõšÿ*tRhUý«ÏD‡½.#ìr%qmYIp :úÞÎí!ÛU‡Dû|õßß±ó·6×i leÆk¿3ož}ÜÖ$¤Úš¶[›PµÞÎC‰é{;7³sÕFiëlßþæWçvtƒ&Æ‚"Éù›ÆæDU%ÍŒ~)ðñ¬¶.JÏÿ•?—6²sÑöϦÆÖîPÐ Ðh10&”étþIvtâvtšRrôè¬k 19ŒþK6¥;×D‡ª—?Æ4š—XtŠ\íóOŒm©/RSÆ'åÎn§Cªª²$þú³RcÏÃÜÆÎE+loó.ojtºÞÍãµõ.èðQ0˯°‰ýR!ëó 7·ˆÞÎm[$^_‹IÈztÞš¯ý‰Œh¢Sá ˆëiÑ´µ)¶V×tp¶Ë/¬_¨7·ËÜÄÎ%Ñy©Ö‹i¶n]Nµ@ºò"qD‘Ìé‡EÊUTÆÌ–ãŒ0·˜)[عlçtªC®S\eúÞF£´J™+ÿ^œh$¢œ¤«M[ú#Ì-Ê4%}KøK¢“hù:¥9õN謜7Ùà*1»×N R‡£kÓŠZO j&[:;ÏBç­ÄÊô¿¨ˆ&ö*é×i@ 5]QèX^šÿ9›^g›’:¾ó,tÚ·–åtþD&›ÐñæûNS ò[©F‡˜u*ïf¥ ?9:‘›¡˜¯óë¥B-ÉéÌÏîsºñ|Û·ôÇ(ýßœ¬ÅÔ¦-éA§µZÍ‹«b‚à´Ù;7C'8Kô­¬òÚŸy“L¶Ç\VèKã¶‘Ù’×æ^î¬ Öt7†f‰Øâ::Ý °¼œ˜jºa•M!` – ª’ þeºCÀ¿6-}ºázFرJ0qäúŠõ;¹²W‹íètGÖ¡hìl ã§]Žà¥¤Ùÿêœè,L¼]Ü]¸³4~ÍþݼøÄ…¢ü¶f]@Ü‚Îèplþ4òЀŽWM‹u¯•¬ýK®Þ:nÙ ËîÖ㞯a “ÃY:´é[8ÂdT¯ûª¡Ëù;´è,âåR1nèØy©Þ ×þløˆàI[å’Êš={G9߯3|+ÐaË÷Îí1nMv £+N¬Õf»f6r–suؽΓ  ‰¨ïï¾Ú´ñÖ—™èY[Yç¿L¢N%Ðñä9=:/Åk>«Ø”ÿhsõÊNx¦Bÿ:Í!ûjÓFÝz€:ìâYVn'ªÿ@€Ž#Ïyù]R‰àOÀy?tH…éC1õK½Ó¬6‹.Ú‹vlî‚)®:±R´IâC¶f—êrfUû—î0J®; ãŒØŒÇ%*‡é¶°ãñL;'¯ûé~¯ãù­”ý2Ðq’¾TÅÌ5¯µ¨»nC‡¬¹%PlÙYT¿"ãžÊœjÛßi¾*b(б·º¼ô¥é—·ªÜ,g/×CJ”ñJ2GM¶À§}?Àt¾ßºì) =û@Ç’ç¼uäü.ýÖ™\ÏÊ~\½8\M$¾R¡éÝ÷OÓî»á’ÑiÀ©VU6RŸ% 3‹Õ†5<^ÚñœóÑù’·– Úå¸E7Io¹‰-ø³ÿÏ¡ðÓÉèX4}KtÊy¾5:c¬Ö¯fP] œ<Õên)¶>èúhÖÔÕ¸Ò'‡ß[…&þð–€MÖ75; tV³ º ÁËl–èeÀÉázšFYôm:_I›–ˆ .è–h—¥¤ô\Gl-:v’–ç¾':ÃòÒ/m Á¯ß§£³e{ÃM®‡Ç¥¹[Ÿ#þ3»m=ÌÐ"BAíî_ÐyY¿ŠÔƒNÑ·Œ›Nuû5Ì¥~1:NCÇSUS¶D¦»žˆ¾8UxÃÕv(” UbOˆ”%0 ›4ô¯Jd%òžè¼8Ùù5Žã¼t ŸærÔç óÇëpÔ·:EµzhžwOG­#«ð9²Áï„æ÷Èr¾gl Ìr‚H5A"¡<}ÕŤ^œóAókÎ)èüù›ï‡›Õê ªÜâ`Œ–TŽÚÀNÈhœñÕsU‹w¼W¿¨×é–bûe¯E÷+F­"»£Ñùû7÷ow‚BK‰‡œ;Áð±)P^tº[M¨”£þes·—jºþæ÷¯7ÛÎ!G¢óçï¿]~½”%S²'9vD1ɺ¶çà 4Åô•Ëo‹mƲڋ}˃Ðù“ßÛì.ÉFN€òï—h™×SbÛb±Ñ…‚‹WØú-D»òó¯æOëpì5¸ÝÑùûw'_s%rzvR Ãj » B#:b»8:ýœÞõ|Ço/ž=ÞvBço«úʪ¶ïç¬%1ÔQ ß›eRof;øc-úÚè Spº¶vƒ—·Ð8éFF.N‰+Ñ‘ÜHI…‚&ïgkán¶·ðĦS—Fçר)P½õšápÞz™[м ¾ýz@aè|Œ»éÇuÆ‘)£¦(Ñá­¯¸:ßä ›¸WÓf¼¿Œ-«ÂòStG³s¢dGÑQÐþ‘i̪ilÛšì„Ñ‹5é £ÓÓ…j}eàW 36†æÔü«¡]Èñ” DµÍu?¸Ó·ý8Ên‘Ç£°¬‡ ÓÕ¥_ÚñÑ——Y\ÖêÇk¯÷^¯Õûë(BOð5û%:!"†ÓΗqñÏ6ƒÓ8­§ 3¬ µ"¦úæâç»Mßè¬rR”yȱXñ>äx–Õu4Ä M¦ÃßïCÜ–U:tøîè4 l]qí×ËÂϼ{dAgÆÐBr_rö ×üî,8õàû°do+O«zøè å2Óåø© ¢óþñùÕžãEÛñÝ¢¯£‹Ê@¡À\)N(Îú=æJ@§õ:Íbol¡ZÏÕmÊÝ”Ì9!:™ÆøpMô#Îu:ÉL®Ò\’±¶\éVÔ¹?:}®ÓscÒR½Æ£³æfkƒ™¾_yÛ¯95¡J×bv v…l¡fÎirÍë<Ö#ÐS¯—Ñ ãåFÍÑöŸÉ¦Ù¢k…kCp](p/²˜\ÐÐåIÊu~ÄpcCGÍÍʪI1RÄaUyD‰ˆÉ^ÕµW ¬¡KuΈM];{ :¯ï±Z ³àF∵§ (Ñçñ»çRþB˲’mNYax:?âÁ™£ÓÕÓ"J¦*ŒòdqQÙ%ã÷®RØCB¡À½Câñ²zE©Û£©-ѱjÙ7^Wl²Ç7Å ¶{‘ÂQeóžlçV©C;Êút^ß· ó&\ZÈ«ö?vìHÍñ%¶Ô¡íÛ€Žweà–èøbËý‡xÅPUUB‰-±‡÷Y=÷Yè¬3œ'¢sãîŒÚËxþ5 x#iÀgËÀmÅ`îyã´Þ¶¬•IÛN!mÓÏÐìºÞû8_p “ÕáL« ØwÒNwÊÐŽÇUIŸÒp t–úìŽèëp<•N²¼³³âfÌA%Çî @g* Žm/:ÊævRf-,uMªIÒxÑýÑùøšŽèììpìkÊ[SJ2×”~ÕñÊN%zšW9©úpst>¾Ìc:G;œÚY)H)pß°:Æk<öiØ.¾O›Ð9¬4`q;œá„{ªè¡Ñã5Ô8þ)ÛðºÑ™=õ¹:æòÐ9w¾NÒ…W•n'¡PЮI»¾mU)¼=d/Q7:ÆüOåU?ËÍÙ¶Î¥à†YÜN [l¡`ÈjBë¿!`ó4x"`;”§ ½D ÚHµ“ýúÞ¯ˆXcº@`ßËÆ Ýë“çY3Ð ¡óñ¦ëž…6çHë@+Ò„z/•ÖJÙ§&ݯD8€Îî×¶y‚jX 4­´:>t<à‹»´¤Y;ùãµ{¡ãèœ,K;NT5’W%õ€ Ðq¢èœ,K;NL¡`zíy¶wOt‚à³#2B®–#y: p€N ÙNz b¼—ªš0nŽ  S‚ÛáT·cBVFÄvt”àÄ¡“° !”`4êBÁì…U nçòè¨Á‰CÇÕ>åu;ÚBÁüu¼û²¥÷G'œH¯cŸ´åv;ÊŒžI ۥщ'ŒŽeM‚¹ïìv”…‚…µ•±]HpÂ蜳<&ÜŽê}´ü:‰èØÁñþœ˜Z7é‘‹=ÿ'f·C¡©>Öj‚~hg·ÊéEÑqyÉuÊt®—MÉFò–v#ýНE íЙŒú¿¯ÄcŽ0®¡.Ÿ,O5Wž7ì QC;—D'ù˜a¹§‹ìYŠ˜ë<…N Í8@:6ÞóÙü¸ºàœÛà^(:ÐánÇý¦Õ9§9ØŠ Ð:O’ÎrÌȾHÚéC;@*öŽü°Ý è¸_g-\Ÿ±è„+(§Ð:—-äµÎÚ:ÐÑ’|nG€Ðy˜Ûár>èÛ ʌ؀t¥kXPÄt SÜNŽBÁ¹ÛÍÐñ¶®—ˆÎ=ö×9©P 2ÂÝzào†N¶©n¥ßºNt 4bª6 ÊŠØ€tÒU̱ڌt   ά±è”jC¶¡:@çiC Ð:+œ±èÊ…‚#6 #ºzÄt Dl@è<¯Pp^Ät óÜã¼€йŽäâЮ±ÖÇt Dl@è b:‰è`¾Îþ®"ßgÑæëèÐÁ,ÑÝ]çÄ0SÄF0¶v1ÖIN,H–OAÀv:bÛn—ÀÏ)ʱ´‚î³Ðû6ÕÃn°åçVtÒžBGhÆÉ¨™÷9_/b;©ô1èŒàXðƒÐsɈM€Î^èPŒ)˜»\ÕëéÛ9 Ï@g "䙯]”Ï•"¶sŒñ èÈÞ¨ö°¬Ü{ðAåFl@gtx@A9$:dE€۳ѡu7à¹^Ätr£ÓkRG¡3ƒœçÛ)å難ӒCã1'ÅyPùÐɎ̬?¶ý“ íx=¯™ìÜ™›~tçtíÌû̈M4]ºgôâ\å/˜éÉþá~Çê.j“ˆwÔÑßñðw¬­~þ‚©wÊ÷ s<âwT‰ßQ:³±ÿï§ÆùƒÏ~ʲ[`5£Ãx@¬Q›ïqßa„“»}GÖwP•ù;Ö)þü6¯³þŽÅ‡ÑÛkþsµòsÊï(4`g´V§Nuã]ƒ¶ëeRrèÍöíuŠï›ë¬Eâ,QA™zWeÉSNÙ¹-:´³’'X*m{º1‡) šXÿó|{¼+:lyYúÚ`çø+:ͱý§íC€NtÄ–ŸlXÖCÀήoõ:'ÌÙ¹):d;¼-+â€ã#¶Â“{¢CV;ß´˜ØÙõ’JtèlFGìåämë°Ý”£æøÐ[¢Cö;ÐÆ% ÁÎŽÉN•Ã.€ÎVtØaâ[Wÿ;%Gl‡_›;¢ãýß¼p.Ø)8b;¼yú†èëж¯9-Õy»¾ÞÃ΃NÞtçÑ»ºåu®lìê¦ ØDlG$;ßWÚuòCXºÒ]ЩNB‡ÎîÉŽ4~ÿ…á9’¡SŸ"¶ÝïD-9ß±Ø÷¿Âð¸ÒMБ³ÐÁ¨hnt*+9ßÏÈ@†„Ø £GGUéÚŒŠî›ìH~¹?ÍÁ½Á›FutøtPžÞõêÊpze|œýyía!ôMЩNCÉήÉÎtc2N3‡Ö/ª8tÂ?gŸIOÛbkLuó:qšþkfo¾m)!tqSÝ EGŽ¿êÛÊÓ×+1Èî—×JN[b3ŽÂ=ú¹¼ t4èÔWCò8q“œ±N`Âc-¶uAîŽ.Wß$;Ye„[4;±¼ºìx GGŠC‡ÏB§:û$;4ÈÄ6œg«DŽLuÈáÄeyZmg:1èЙè ÙÙɯȱ ÓZa¯³ÝÁë$;bó&s‡Ó„vL©!ÈièЙÝF`ñ™ïDm2=_¤Žgõ6jŸË©/ è N°:U{s&šÓÃÓinNw g t ót¶þ„ÛfOž';FMÚæt€N :ÊL stxr(ÝôÐÖù´§yÖ¿F©†NÜÉÚ Ì;Ø!Ù1= ¡ÏAÅ5è\”ØrŸNZ¹”füF¨É€Ø¼gñåÐa tvNvf>¥(åj^Í´; t DGÜN%ät Ÿ¯S,:‡î¯3»%¦b'³kÙÿ.1¸¥W!^žöZNaûë†ÎÔÈtÂT·m÷9Luóxñ¹[Y‘äÙÝï«~tN½ê¨NïãÅe1ë Ò8AÀtž^'XÌÑáùà¹72g tž©©FfžØÅIvs tž+£ìc\ëe Ã΋!@è<ƒY®2uöÅ:yI`ð» 3%8¼X"ŠÝ¦ t.ƒÆD÷;Ÿã]‰g·'ç?®¡è¢ÑÝN`yœã# tŠF§ë4îvu›ä¼àNÙ:@§lt¤²‰O×€Ð)Kˆ&ì:ÝRü†ˆ@莎 :pË–´k.@苎ê v°:@'#Ð:E¢C+¢8Ç:»¡sÎ| è`¾ŽÎy°æDY·-nkªBÑ9e–è–a8̵’³:Ÿš¯µïVUØ,Ql)ßéà¬Ò2©Ž›й9T óXQbøKG÷¯ r€Ðyl¸FG‡k@耠s:ØÃúìpí rnƒŽœˆš 2žÉËst°æô£ÃµsÈ:@§¬p-ÍϰE “åŠÓµvŒK¢ƒ*Á‰áÚiä sépí’ö6 ³U± :HuNr:§—gn‚Ÿ†R“Î`t®R ouÉtT'rtêìr=w ó€NR`têœçtèdDçðýu¶^ÁÇﯓv‡ýuèôWàè©n›#î§Ou“ÝWÁÁT·:š:Á' lgäŠg®HpKtèt0Íí„€·%çüÓ~t4u‚üè 4} lÉ¡èdDGG¥éãÞ2¢µ;¡£¨ÔäGñÚá'°r€âµÃO`9äÜÅUÈŽâµ£O`AäÜút¯}© nÛ[¡ÃÇ¢ƒxíèÈ%õ©ß>B¼vl¼&UIgüVèTÇ¢ƒ©:Ûщ2?*ÊÍßúhtñÚ±©Ž”u¯º:|$:˜oáRîß-!|,:‚xíà*AaÍ¡¼yÑA‘ààT§´‚æÐ©C µyÑÉãtž<_'Ä ˜¯£@§ñrÔIÌtž½A âÁÑ44÷,%¢C˜t°;:ÎCÛŽ†tbÐiÿÁ:RoÉu0_gt¯<ÐÙëàåt@Ðy :¶+×J@‡°5ÕèØ Ô\%þd׊@‡ÎŽè‰è:dKE‡v,(âwT‰ßq•€ÍdG°I…`í%¬qSÒ èÝs‘1 ×d9ÓFàñè µ²àVT¡&]ì¥,i1¶G Óá@ÜmYA¾X¬[•‚¬¡tFgX%¢ù5U/8ÈrŽC'6..(Ù¹ï|[#uË…®ŽÕ<_'5Ù¡øÆèx&]Ò´8‘XŽ]¨:#Éyî,ÑþZFþþød³D·l‹4†V%øÄjGŠ’’B®ÑƒÐ12¶qƒ²Úêå$;ÏB§Êˆ w>.3 ‡s|ôgµ"æ¼¥ “Ñó4ô4{-B¤vÖÅ´=˜·´t² 3Á3‰À͉èp¤MX?3Hk> NaÉû¯/óÐèax›Ð!KJŸ£ÐÊMv¨ ¾E€Ð:+B†UJyè@gÊÂA¨ø\Ê’R@*«NÀš Êè SÅ¢SHÄt ²êT•k{@*¸N °«2"6 •U'P´¨•±=eª[©è<{ª›¥N Š3e|˜ê¦CG®æu¤¾š$;:W%ˆØè `{@@HE3€T:¬2«"úØ€t::‹N3€tvÝÁ¼žB\¶ù¨Lt"¬@€Ðy::Ýufþö:ÝßèüBÐ ©´&ŕδä|·t BЉÓùnè@ç£#¦]éÞu¾Û:PIu5:ç» †Žòêžîv€t>:“ûR_ݳ·Þ:ÐÉZtÕ¨íŠOv;@* N0Ëa´ï;9ÛyÎþ:e¢óìýulè°Ú$EuÅþ::t0ÕmÿÌd+*&êSB#ÄT7lw®pJ²sr¥è@…¡CU” Ð:@'2ÙQ†l@èܪ“’e¥è›jaKkËrWÉN Ù€T:dÙ7DÊ«¨4tÖÉ»ñ8/d:PièȱV):P èˆ_Õí,·t Óµœi`ÙñXÛY¦t âб¬uë[ô$·t òбU¨4[:ÐЩ«âÜÐJ@‡Â¯áÂŒè@ç«Rm嶇MÕÏÁ|,â$tRÝæëèÐÁ,ѽµË¤KåzŸIFY¢Ø°yëÓg,St ‹ ãid;e¯* ]Ò @:_ºÝÜ…:@çqR.—ë1¹"6 ]*ªè@—A'ÐÈt€Ðqº)Ç tt|õi t€NR¡àð¥q€T:¤|!“ì¨i­I|mž@è„BÁá t +¡ã©O t¼¯ ³:˜ê¶F.:îB£SÝtèÈÕ¼Ž\ÎAȹè¸ëÓ®:lØ|nçèæi ] g}úèæi ] w}úà~ ] g#;( t 2Бˆ‘ì¨EuѸ ';@º:Ͱ(ÙÌïØ™¢@º :•ÕüŽ5J ] Æá8Ð9¶Æt k¡SUnt]è@×B‡=èÈ‘nè@Ëu<Û¡n§?báoè er£#Ùš/bãGÒnZt ³ÐéÙq>u:cì…ö×Éd3r1#ßg»šÈ…ZvÄetÀõ bÃ÷|ÿ¾&:˜ê¶¿(–v¦rÕ;P&BÙp>Ø "¶Ú×êyTÈÆÕº$1¹=@:÷ÒíRSes|pˆ ŠŽßðG\9ÓA/=@*6d“8P÷Ñt RÑ©«ýÙ¡ šôÐ.ÎþéŽT3œè© z€T,:û³Ó4üèvÓâÕ€ÐÊE§§vd§m3Õ±#¦ >@*E.²Ñ)j4Ûìu# ŒÎ®e¶®c!òˆÅìx:P±èìXfë Ó G<6ë¨\td/v¤·ýÄ#flPÙèìÅÎø±˜% ÝØ“( Ý]Ø™ÊØšê\a¾ÎŽètìT¹É¡úŽè`–èÞÚm–(Õ{±“ï‹9ÔŠ€ *#`Ûçâde§ý0ªT:½Ir¹ìÐŒ U&Èb[AÙaز\Kè@%¡“;åéÛ_ÔÇáìm?‡L÷t B6iÿJÖ¥¾ß’õ˜±ÛåÌ™:P!e‚f>XN§Ó™;ëËw¼p+‹OZR=˜¡˜‹°èx¯C“íÉæQžÞƒÈ`Ûº÷ø¸^Ñ7c3 §‘²t ì¹Î°´ÙfçÓj¢5ïXUΊñ3û-µIYÉ:Ðe‚~&̦Œ§ã†>Íÿú@•ÁjqãƒÝÞ¦Zr€´:ý¬ÿtrÌ@mzÐc¬lp&L¶ÇaoÓÃͧ«É:Ð>è4vž®‰#¶rÙµØ-&ÒŒ³:]Ö6=Aí¶ÀRèLt&vúûÄn•®îRãq^,¾^;zz5Gu,h'tšKL-’bIÖʦ·2ö,ðYšñdT¯ÐvCGªvÛ'Iú qøßÖU)x±Ý”èЉÊ΀”÷¢Ê2eI¼ÆìÈiBF3Û_ª¢°ycªÛÉ6Ã3ò}NâÒšÒGvVfÙp¨¡`ÎM³Ð  17q#eKA¡èÈÕ¼ŽÔW“NM©÷ª¬ì3Wsauj¬ò:ærìܾ=h"`ƒöDGR‡E›Ój&n–ûhСa/^æÞSRÐ_hOtš{¸{îŒÏ):ç ž›¾ÞÀÞ-u»Ö!Â=nc< 1Ðr&P–îÊÊÙÉ—쌅=7õкV…ÒÔîÝ‘r‹èPtØö˜$}–8ÌF¬uÇ—H`ê¦,=ìð&M÷7Õ@::ÑÀ8Ø8æf$#ˆ·“%h4ͪ:ÐÙ×4µÈh(Pq£!·;\³,e‹â‚è¸"¶6í3«Ú)nçfè„êVó¥å(˜]ë~?ûÑa©‡Æ±‹C'vª›ÄöºÂÚ2³æ?–cáeKèúE˼òŒôltDëØICÇwLtÄPP°ˆ}Ž×‰»9S<9¤®Xâ1^îeËf{£sBå±e:²7:áØRŽ×¦§Vß#6V,“X"С³(O[Njåúè,ï « µÂ P¦Ž˜î×;ŒÚØê;Bètû)Q!t¦ïè«Ø}«;Í?ÏýË…(:ßv-ï`û0¬ï;Ú›ÿú;–äôïài¢æ¢¦&¼Hvšw˜g}ÑvµúaÊsU:+¬1¯ò‹þ×;¦oZG(×YÖšô£3ý7µ¦ö hÖÍè®@´è¸~ ^½ôÎsvWï§D|‡ô-!Ÿ3n£ÎËò¥~7jÏïXœ›à/¯ÏÕ×&HØ8G…-6`ÓÆu‹Ïó%ê¤HßvÕ"¯” My«ÏÇëywÙ8Q,˜XÇöZ<(×I™a­B'4®‰ŽdFÇÁ8æª bdG· ý¬(8¬·²øÖMxˆ-P? ¨i¢!tØp:’×ëðôÉ^tØ‚›çe‡\5¡´z„ë7èW¬ëD©Ž%²Rðxt(>#õù% Ó—$ÔÖ©dÂxîˆFœDpÜ@ÛÐá˜IÝQ!ÛãѩҾI*£9Ð9‹Ž1]‡2 #}ìÔ×§wv9UâÄ 6Z³Ö ÅçŸÃöÌqF-@ggtÚM7Ù£*ÿÀî¸Dg@Çœ®³÷UKžQ×ç9ÖU϶¡{ø@çtTkÀŠ1ؘ;'ì_ã—9œcŸá–WO ;_5Js*Ö…„+ýV9¼ ¨ 褣Ó>)õ$Ǭ)G©“¸%ó:¿ò¢²=âÃã¶Jž…*íµâþܳäí¿èØÎ+p Ç­¹Ùát6F!Û³Ð)â0@Ž=Ï¡ çn¿Äúí’èxæÈÅйÍþ:²œ*[fÁ/vC uÈv3tŽÛÕ-:wÙÕm 9x§èORUm¾êê_r3t°Õç]I#G‚›{nB'É´ù®èÐ)0ÑI&'¸1®ÞÔ²¥òÇ Lå16N''”òE Ã™LŒ€Ð9¢t hßçØ‘ 9ËnÇt ÉÒ¼Ó~áOµš»È;ARc¤ Ù€tR¢#ý¢ì¤¸pìãèÐrý= Fš 5ÐÎ$GÕfcG§©-Ñ™ Û«-@'ŒÒ)ж‰ÓÂ5‰x—}`§ád5c^T%†qËʵ}Š¢B t 3fýýÍk #´\áS“#‰õ¥@Úz9ª$rÄ»ýÂu4.ž àJºnÛ Øt ã>ÏQwظÖûÅU2:õêgÝ)Ð6&:œJÎ÷?D ¨£zFG;žºv¡êk6âp’¨b(¯†Í£ßE9®\3AnñÁ¶/ÓTäK7Ã3Û?!èÒ:t èîè@AAAAAAAAAAAAAAAAAAAAA×Ô;DÜÿ$Rì¾K’¶ :T’°æô ä€[ ³v 67‘ôØçûç÷H[oAæßôNRv,ãäMç Û¡ÓÞHg}¼¿•ˆŽtû…©Ñ¯ïLt ”²¹&tKth‰Î79ïg¢Ãö¸‘†GD‡ŽTÞÝ"'Ø«.lŸtƬ‰ÍǾÞ}–‡u[TºyX  ‡'§ãG‡ d:£%´}}~Nä¼×Å¡3n8ìÜyxŽŸœÚxÖ‹N»rµx'ìè4÷Ôæ¿ÿûèùìþ~[2“ÁÔÉ‘¤ÌÑ!?9ìÌtxþ¾j…ÁíÎÀš¿¯ï†>: * ÓÔPÌÐ ã¶ÿEÝíûuµ%ùQøð:a.£²À‹§½*í¡›Ëðü)£‡yÐéöŽïÐùÙzt¾ DÇ$Áaö&:!rœæ¿¨»µ -_ë˶lè“-ÐáÝÆ¨´èœûæA§ ì¿Ïß×kÇËGW"(™©;‚-9îxmñÆÆé¬.°Óc] ÙÏn€NWïå¯÷×þ‘÷º@tfù†ÃeLèÉ©+ÇÅ]PѶü:v]ñkl;P= `ë*¸ÕÏ÷WËi. ^Û¤09®˜KÖÅ4YD¢SŒfèÐŽC»Zt®\&è²×w.6ïÕ«º3»Ñ¡*xe\~£ZÕ؆€ë .…Ξ7üG ÓZÑëGièÍ"Ð!Eï*»ý–Å»Ü]­óè4–ö³8tFQ,:4{_:v§³F€€Ðé¶ë¦Ê³ÑáYâ¯F§m× &;äüÛ®pÅ{î2Á#IÝádÊ]Oks´<‹4Ûÿšþ³ù§ÐðÒîcW˜•KQ¢ï›Ð‘Ù§ûŽÃü”ù!­¯É±`~:Tžÿ¶¢ÑùXÜá¹,tdþ/-:½Ã …lö¨V–ÏYÐ-öûØf­>MãÂpú…–nv²öwã‡Í»a§o^ϥхo^tÒzŽcþs\í·² xøñ=?M¨ªcšÒ7£Óß´'äçµ)”QaÎv:T‡&ê8>`ÑG¦«Ñ±5Ãè|/O~‡ûð`6Óww`™¡Ä·`ÓqJod6û­mói2´Ž,ßë;óc‡4#§óWÃsS©S|Ï׋sÌ„Ž­è|uc }™ ¬ ›LÅš2u%:4¾O"Ñ¡ÕäÉŽÍ åå“Ëñe81FŒ–>2_¸Î#xùC–ïõ‡yY–gœ9OšáGÏyzá9PÓ¿YÖp>ößë÷ÿp |}µ|Z)îp-Õè]Ä¡#óiöY¹6ž½pz}µzI½ mª™S™ÚÏd8Cä°ìÙì ë{ÇáËñ'‡Jâ{~úkFå{ÏnjAû»~¾åuVU3=:d‚@QèÌã5îb«Vý?3¢SÒÒÝè°iþ2ké3?‹–‡&³ÙÞ÷zŽÃ‡ÍN»ô/¡¥o[:uÝ{ÿ«š¹:¯ïŸŸ_å¢#æý(Ü9 Ù*{o6;!s®6Ùö®M^§OrÖ¿9:ËC  #²¬§yÐ9Ò¦r óÕ¸š×ot>ëRsÊ–dª³ZÖƒ¼+€PàÝ>P"» ,èPÀdytç:¼L5ÚQÓõOfK®Ã ¹ÎêÌÓ±Êeú·¸ž_ä:r%túÕßèüŸõuç¡Cdñ†ýŠf–¨?d³¸tª­èÈòv»4Y÷à!Õz£JÆã3¶øÒ×­ß«BguH68iø6þËùüê×^œU]:æ˜Ûä8d6j :îÍ‚Ep¶‹ÂNtxÎÅ6—j˜îèŽñ*™•WVïU¢³8$ U‹Z…ŒÚöçWã:ãàQ±è| à|‡jUiè´hÈhμ¤ˆ”+âxC¶Ê2ú…N†ÎøÈo²4½ÒŽÎp–„ÌŠ·5kÆòk³›`ö^:«CZç‰F×›þÈùü²a§¦B‹Ó_] Û£>?»å£ú“WR®Óuv=[4{4f6//]£ÃÐéÕu(שº%:²l._ l-Îgûµäx¯6×™Òòеå¥{u=ox²æ©*t\g(Gÿ7éÔe¢cT†Åv}¤Ö¢ã ÙÖu‚8t8ÓÚC¶oßàDg<¢ $Û/u½7¢ÂfÒòDÏz9xË9žŸõNÇ£3¬wóþúnŒàpßXX…­k|_‚à_s:ÎÅ#úyòUêt“®ƒS7v!Šãу¬?,aÅ{H¡ã þ>j‡ht¦eÖ^ßßW„”†Îþç/½ š¾ê4Ö>,âÒG¢óa¢ó t8½ š¾6й0:ŸŸóVϧ¢³aösºÃ:×@§ -»Ç¾>ºLçãkñ:z*:ɾcƒ¿:×@§½ÂÞÇâÀPCéªôPt’dž*й:ÆnmŸÓRÒ:fìÑIßÕ-ÙþKYèræ¶Ú=Öæ8Ë×Í éD'm&<öá}:ÔO¦~MŸž*íOD'‰s}tÂkkW÷áYò­a@غŒ¢Ó9Oð:ý2MšÃFtÆ•åöùH¯Ÿ|È+óCÇ¢Ó/GÑéÕ\§‡…è@@g4¨Vè¬l½mŒ¬ü26:б.á²(ÌÐYì# t Ç¢Ó­9Ú¦½BS’CÓ"=2GG€tZØ,´3ß?-ûÅ èÔ@:mê¡—u#á@:3*8ˆN×¹ÈýZ‘@:|è,ª@z.:lmÈr¡cndÒ¬˜ t Ç¢cŸ ² Øhô:ãƒÍÒR_@zj®ÃöVÆ%:õÏo5“à>ôLt¨r,#¶¬°ÍÑ×ú€×žˆNß²f] léudÌujcù\ ³¿JŸ úœ ¬ÓÆô㚘t†\§¢ÏÏwC@'A1ÆÖœN1çCÅYê|äÁz©WG·üŠa!ûWs%B‡ÍŃ5èTÝ9âêçûûýÑ‘ÊX <»i¬'¥ÙÊ‹#‘E›!Ç]îjöa¬‚uþ*ª¸Õí'‚è)è|_¡yK´êÞôcÎÇ=6j;øÚÞ®þû¢#í’èÔírCYƒ¤¤ufoÒ9/wLá bû}†Ÿ‚N5›–ãØèÝÕFý:Ó·œ`-Æ–L{Ü èôÔÈp¿ší§;Ûp#:¬s¼ÓëþÓ½ :UAg5Çv:Ökpsò>L§óuÏn‚É܆ ˜xGtxføWe·Êí^§Þ‚Žï ò0tȇ/ÿ¡gÔ>êú–è4¶ÒÇkTíavtªÁÛ™ÙÎìßÕøö&“çñ(Û2‚LU€æô0ôðK½Ü û16P¶èhØÀ›èUŒOî¿ÞØà)›‘n)°Á^d– ~MèÔ·EgÚÛª«,f¾©ºÐi¿IÌ„„ç›ÒÛIîݽƚŒ/§ª¿hÜ¿‰š'i¾§Nÿ+§-»¤?Ž{3¡Á^xúäáëÅØö¦ªž„N{ߨ¬{ät âp iVÛ1ȹ-:)ѸÁàÎ63L[VØèLû ·/žyïÜ¥tS‡U{ÅÍ«,}éT:F¨ÓûÏäÉýtßFƒ{¾~xù£Ð¡¡r/õÚü=ó­_ßÍLçã¾èL¶LíþŠ»z™¶QŸjm~t¦ãc£¢Á}€Ù@bì¶Ö‘3Pņי¸¨ßÊ•ù™ÆWðˆ_5ý÷´\Åc¼ó:3=ê7´ÜµÂFUWŠé!23:õ®„ÎCŒ&}`цul\Xžô„e£á3…¯h­àÌ`äqÙÑñ,&µB磾o®3¢sD…­›¿.íŽË ›©hí&Tºˆ¬×hÞ‹°D§_Ûu §"’‘@M…‡éåOËuhŽTaý˜Ðùøüª€ŽƒÎð”ˆN㶦¸j<ÿÜ!­³õšK¯c>Ó„Ž2slÒ÷Œ^§^ÙCÊstXÎÏOk°wtd*®‡Ž)E£c@ðmàæžîCôFëN‚%:S³@[œ¯V1a5#[æ`?Ó©Þ_×äÜrH´¯åJŸKKî•Ö—8÷ÕÕøÅ#Å*tÚæÂ±"ØnÜÆâ´4 ‡ 9sš†U:tºv-a6ñØÜÇS™€‹ŽŠœÿ>ÿk&¸}~Ýc„×™áe‚áÛd1ö2¿Ÿ;Ñé†XƾީN*fx%Æ®H6tºãà1lÇLÏן‡á0h4#~Öè Ò 3bâD§K€îÐ9=”OcíÙÂAjûhþm²úâÁ>UŸi9FËcÁ)æ[ÖQåzU (”§¢£"GÆ­yè|õe7Ì× ±CLZ[+¨ÇÅ}]Ÿ²uÐU¸F&ÓÞ¢stºî¶ÏO £Ê¥Ô¯-øšØÉ”<·Ó™Í=à“Ï98:Ý*^N8f‹¸^E¸߯õÙ¯®Z숒õ¹j3¿k½uHû@ßD°Fgó:y9+ãžîÞ•î1“D×^g9qWºÒR÷g6?¡agÎçççN³ß5¶Ììqý0tLW<„Í»Lß¼ÎÓœìÿ‘Þ×ë7.ãÄ·ÛTØ (ˆŽ¬V‹èª?<•û±e™åDͳDÿÛ “~ÍJïƒNTN=&`[nô¾ØÏæË 86ýñúc\§à~›¿Óc–I‚"ЩØZ#C6¶VY*~—Y/õ뼑úF^'jüå˜#:4­`Ü7è´¹?ÛÈq¡Ó¾õý½ïÀúgó_ë¾¶› ÃëQÿ| $^:’1MåzVþbÖA(–.ï”`Ç…ÎbÀ3Œuë°5ÑÙÇçÇ÷ߟŸ#:õåÐc9Í&[{˜¥Žìøæ4ãZ›÷pÎx ÖG4U»¦1êÞx¶©¸n…—SÞ¬ñ*R=:b¬u³¾²¶óÙ,%1­þÙÔ¤ëú¿ï?óiA‡§ÐUº• %`âf;_ÊJœŽÏ%c©Ñ¾ß¹="Z„ÑÓu«t—MØÜ/Lé*TèNÚùhFs>[ľ.‰Žq¸Ýo]Í:q?cwqòWòÒ™ s`F[îùqÌ'›Ö!X>§œ9£;|Â0ÃYÞFû[–9öf­Ërý¿ï u ç¾|]c°~¶Pædâd‹cr¢³üêélW¬>`\‚`2rŽr¬\|ÙÎÊëÌÐbÃÝô âÙ6sNÿ}¹âö‹œšls‚¤ÛbK¥iX f7tZ^deá<[C绺Ç*§é™±JcÝ/~¸Z›5×!#Ú§E:Ø7âØÑi³Ï¡3Ú›[ªFÅGs#ý¶ÛôUÜ=è4›ìÑúèlŽ©®ŒÍLJœä÷°cInZ¥±ÇpµbDø÷¬2ÁŸ~ßjd ×~tZ}vºú,ÑÑÓ°Q otºÁÝþï¼Í¼¿mçñ©‹zÐY4æ’'¦›Í)5ç|ú¬ŒÇkò-‚t<^GÚ¿T§ ãyìJ茷u1+l\ÍÐ!’•5÷›)7:l.a8 ÖèôÁJ=V̼^V{YÑ´¶O«[»A:6tx¼Óv—1“«£ã(aõE’!`³å×¼Á´e‚9ö—LU¸nå6_S- ¨ý?ºÆxAÑjD cCÇøWë©‹Î<À1;xúÿ³Tg±oTZºãGg\r†j:õ¸œ…*b#:¼FDz"Ðqz&^³—ÿltÌâ4×§ ³Ëw¡3.“V…: ÿ´DDZ"ÐY¢C›÷oŸ‰»òÓr¡ÃF¶ê‚Y¡³ð \…J~ÆâÑË:A:«2 Á° ~:ýßæ²Númè K6ÖÒБ¶§Ö4é[rfMr} `ÚÜ¥+ŽÇ UÐл>Ÿ~__é?Ƶâø+!î»?Øiþò(t„Ö|b+¡°i¨©-l«Fœ±n^©×ÛU³¹õ8Mo£éÇ }¬f÷ã:R»A¬Ÿ³4a :Âk¶˜?÷·¶gä:lÜù)¶Pó-„LïMë›ïdvNs÷é‹%úÌýݱÓl„Fœ:ëÆN6ÿÙwä<‘ïÒvŸ:…n§fLkA¼¶ö:;ë.§j¯Îá´‰Û{t”‰oÏ:8uH°·ns®v2ÄåBvpçTaiBèÚ#~t'K˜$ Ý(b¸í—AAAAA÷’LÃÖµ !²‰«qi´¦Ù«¶CNý<0zQ0¬AJ§Ó¢SSÐ0ã ‚T™N‡ þóV Hévšé—dL/:¤ó;ÆÊ˜@‚ÔäP·’ Р8rúŒè@PTªÓ• ªimv AaѺ8-8+áuúU°’©Tu‹JŸö`‡&RÖ ¦k¤ª*ôá@:f3w‡D¢AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt¾þ?j5Û2endstream endobj 2 0 obj << /XObject << /Im1 1 0 R >> /ProcSet [ /PDF /ImageB ] >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [3 0 R] >> endobj 6 0 obj << /Type /Catalog /Pages 5 0 R /PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) >> endobj 7 0 obj << /Producer (pdfTeX-1.10b) /Creator (TeX) /CreationDate (D:20030408123800) >> endobj xref 0 8 0000000000 65535 f 0000000241 00000 n 0000024247 00000 n 0000000131 00000 n 0000000009 00000 n 0000024320 00000 n 0000024377 00000 n 0000024483 00000 n trailer << /Size 8 /Root 6 0 R /Info 7 0 R >> startxref 24577 %%EOF therion/thbook/pic/ageom.pdf0000664000175000017500000001122211026006152015061 0ustar useruser%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 110 /Filter /FlateDecode >> stream xÚ3T0BC 6׳00QHÎå*T0гPHç2„KéÂåœB¸ôÝL ,õ,ÍŒÌBÒ@jô,-Ì…hÄôTßÔ’ Œ’übM]S ߌ”ÔL(ÈÈ,ñ׌ ñâr A2bÐô@.Ï"! endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 184.272 8.8] /Parent 5 0 R >> endobj 1 0 obj << /Font << /F51 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 6 0 obj [946.3 905.6 1022.2 680.6 794.4 566.7 0 794.4 0 0 0 794.4 931.1 0 0 0 0 0 0 0 946.3 601.9 0 946.3 718.5 566.7 642.6 905.6 298.2 0 566.7 946.3 946.3 905.6 794.4 905.6 0 490.7 566.7 794.4] endobj 7 0 obj << /Length1 1508 /Length2 2017 /Length3 0 /Length 2904 /Filter /FlateDecode >> stream xÚ­T{‡ØÛ BA¸˜X˜Kss`A±‘ߦþ,Ê'A&­ &ü±`â—tk°üЗLÐO½C¨P6Ð÷qŒÀ·'¸D°lªpÿŸä2‘!|¤€ƒ ( …9\ÑäÞ†|Y€xÂ<¡ù¾G17)$`RA S|TØ;üW“ó¾‰ûžâ MÖ€sƒ8býÞ½FÄäÁ,;„Ãû¬(,t„C!6±¸FìÓ…°!”#C „å `B"¿óypaV  …€òÁ!ì#,F8€L1Le†aˆ²ñ#S( œd»…NN> àH‚Ä¢HÙ¯ÅÈ/לå¦È6|F+È€àöYʘÌÏH^+ý$ô4ÎWÐ ¸_A À_ l‰‚¯ Ì+ü š‚h~Ó8KŒ¢²›œœR™*Ÿ°?,“‚B!æé#‹P-ηÆ˜tÔšV˜o|7!Ö7Ãâ)ü…ŸZ5;=¸"ù7£šk“»ešó4…˜,ýEH ¥ý ¼²†æ^©Ntzñ…+]¬ÔÞ¨àêú‰:‰qÚ)§ºÂþpz½0ëÝf‡ ÷ÁœºÃÞ]/¶oPÂêeÍQÝðâ‘‘åÜ÷Q}œx;\­”êo—ÒˆQûR¦¯-+¾?²t­÷ôâÞ!Íœ?7<ª´ŸAÙY³#*x³ »9ê´¦Œüž›­DÑ+L¯ˆõ”hãòѡǒ½å{x¥œÁþŸÜýÔOšd’Ø£ŠÊiÒÃD¥¥µžKïÖ½Üç•ìÛéÎú Ærûøœ€â?¸¶ð™tgjdá-[Í_ì ËI¹Íµ.´UF÷/ÛýÑR´©w¬:û†Aä‡eÍt¹6ö¦¿8¬©›Á9éwîϾ§=®½§…uÆÊ˜‰GGöÍ¿<¯UÿÀêÚ{,‰óz^;sQÇ“kÞ÷GÖY„åv¥V‡ÄÇÞÍj~Qw9²¸ù…š¯Ö߇3ãöß·Ø]°cl[8ÞëÊtÛå‹ÎFˆËÖ»QÕëïšû7¤õÞÏÞë–´Ä54DO7Búµí¾xOåÌtÖ1ãE¹ EbíÌÁ‰¦žóÖb»ð˼Â×5À]Q'߃A³ýƒƒ ¯šnÙÒÓݳ$íÞ! ×rÙøåsSPÛÓ=¶Íi§Ž…‡vwº>‰×)æx^Û:=f¾ºÓI¥sZj;à”Áðm<÷“ÍoiÈIÇ¿‰äÝzœ€ãÕúzýQ‹ã­K\´²&Šû?ôŠ|‹˜ú¤>ìJÁLøtò•mÍ.ç½ Ñ©'lDy¦•©t¶vbj¼fƒóh)§©ÚÔæ\¶jJ)bUäQíöΕ¿fÁ!ü©êßK?‡ÝLMrXåÖcD ÜÔË_ÆN(°)MóHYHîØ©V;÷Ñã Ç7æNQ:s÷VV Cúø5÷§ÁŠt,õCÂm݉¥›”ý^¥¯UÞ4fh‘fsq$£•S›­†°¹GÃ#æ¼tóÍK.[8g5ÝÿØxìånã£7©líÈJ&EO«Q­ðÐ=ùôÉzõÊzÍ# ¤1\“4j7¶ü×-^±­mñ^É2§„Þq7ëE¡ìôÀóO˺‚¿wׯ¤!·iv¾´k¯­Ü3b€ëÙåBMôqº¹'%7ÿ?nÁ†BhÉ…¤ð­½CY~k î¨WÿÎ[èÄ‹"‹³Û·f¼ÊªC-›MÀg¯~k’sê­Ø¦÷ÁÖô,µÍ’ ¶--ÄÒg‹ }pÈ­²Â¥‡Ÿ62ðÿ‰‡à‚€±ÊDu@ÛG‹ÇñÔšÝé”ê?¤ø4+)ótÞ2µ *ÊÁyy•]qáA^kßÔª{;s2í‡$³Ò*ø«dZÙKd¹íÍúÄìc÷sƒ¥êl£¾pðRyIaMË°ÚÆÚ€Ý ©TÑ`Ì¥•ùdÌ:﻾J¸uF-µ®Ý¨P¢n'ʉ¸íõÖéiãàóeVÖâBõ¤">Ýap gô8Í]€ç3^$=Ð[çyÀ˶;9|Xïø®©HÖhÅv±\ë³]‚{ƒ.CῳÚ(³Æ5—v×[`žÏßz¤¶9´¿Ú“vcŸF#õà^3µ ã–Ëֈ޳çfÞ¹ºÔv—ݳàøÒùåÏ.e9½°ù»F¥8Q¹*îΟäKWíIw–?î‰Ü–±d‹í¸]:±»Áwí5¿ë’ªeGóxyØ´&IDÿÈrâ¬à™9ƒ[WåÇ'çt7úþѶÂer~{½êFZÉ‘,Å6Ã’tø´ÞÃðécoûùUR»ÎÍJº7=%ô>þ ]Ö&íùN«á¾7˜r©¾½…[Ÿt¥Ûà¹⑸ے¹K¥…]]:;þ¹|°J«¶ó¾Å¢.šËø•·›¤9f úmj“ñ:tÆéÌkÚ…}¸à 7E®Ÿûˆ§™ªÈøL‹Ð\ûMq¥ZÔIn¿´wnlòܼ)¯¶¬c×*RRϧ]§¬(í·T^§ó«ÈÊÌ2÷»zlÁ,÷¶”Ìä¢0Íš€èßS%©©E%ÃWo_qN“d«æœÅLÉŒát6N_š©·/Ò¢µøDOxYt·Vrž½)#–ö—vN¼Y?\_i/é=¥K§2¶7Í:Ÿ¡¥ãŠšªnáë{MOhÇÖul­[+UåVçÙ>P¬j™è]6­(å%vÓø³JÍ÷ïzo'=¶S>Qãzj¶á^Š´êÝhOtOËX³õ˱Åô%îtËßn•‰¯µW$úynT‹_~oXQÓ·Ë—\Yúv—Nëá=q«Œv ]TøzcÏø5w´­§oÎÑ(w[™±¾ôÂõ½PôýJ-/ÃFcÓ'κÖîüÈO˜eDåëû&æw˜>Œ+&T`+Þog¶Ôd×ÛwX„tÞ~¼,ÍÃû‚´Ó'Ô´8gXÅ5¾ÑmQx7ý¼Ùë_™˜¢WƉ…/Í4k³¼oKÇ"TG«© þ¹©WßÛH$þ áéÙ endstream endobj 8 0 obj << /Type /FontDescriptor /FontName /CSKDJE+Archaic-Greek-4th-Century-BC /Flags 4 /FontBBox [42 -76 966 759] /Ascent 683 /CapHeight 0 /Descent 0 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/M/O/R/a/d/e/g/h/i/o/s/t) /FontFile 7 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CSKDJE+Archaic-Greek-4th-Century-BC /FontDescriptor 8 0 R /FirstChar 77 /LastChar 116 /Widths 6 0 R >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [2 0 R] >> endobj 9 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 10 0 obj << /Producer (pdfTeX-1.40.7) /Creator (TeX) /CreationDate (D:20080617161137+02'00') /ModDate (D:20080617161137+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592-1.40.7-2.2 (Web2C 7.5.6) kpathsea version 3.5.6dev) >> endobj xref 0 11 0000000000 65535 f 0000000312 00000 n 0000000204 00000 n 0000000015 00000 n 0000003856 00000 n 0000004016 00000 n 0000000380 00000 n 0000000582 00000 n 0000003604 00000 n 0000004073 00000 n 0000004122 00000 n trailer << /Size 11 /Root 9 0 R /Info 10 0 R /ID [ ] >> startxref 4379 %%EOF therion/thbook/pic/src/0000775000175000017500000000000012426432100014070 5ustar userusertherion/thbook/pic/src/euclid.tex0000664000175000017500000000554211026001632016062 0ustar useruser\pdfoutput1 \directlua0{ callback.register('define_font', function(name, size) fonttype = nil filename = kpse.find_file(name,"opentype fonts") if (filename) then fonttype = 'opentype' else filename = kpse.find_file(name, "truetype fonts") end if filename and not fonttype then fonttype = 'truetype' end if fonttype then if (size < 0) then size = (- 655.36) * size end ttffont = fontforge.to_table(fontforge.open(filename)) if ttffont then f = { } f.name = ttffont.fontname f.fullname = ttffont.names[1].names.fullname f.parameters = { } f.designsize = size f.size = size direction = 0 f.parameters.slant = 0 f.parameters.space = size * 0.25 f.parameters.space_stretch = 0.3 * size f.parameters.space_shrink = 0.1 * size f.parameters.x_height = 0.4 * size f.parameters.quad = 1.0 * size f.parameters.extra_space = 0 f.characters = { } mag = size / ttffont.units_per_em names_of_char = { } for char, glyph in pairs(ttffont.map.map) do names_of_char[ttffont.glyphs[glyph].name] = ttffont.map.backmap[glyph] end names_of_glyph = { } for char, glyph in pairs(ttffont.map.map) do names_of_glyph[ttffont.glyphs[glyph].name] = glyph end for char, glyph in pairs(ttffont.map.map) do glyph_table = ttffont.glyphs[glyph] f.characters[char] = { index = glyph, width = glyph_table.width * mag, name = glyph_table.name, } if glyph_table.kerns then local kerns = { } for _, kern in pairs(glyph_table.kerns) do kerns[names_of_char[kern.char]] = kern.off * mag end f.characters[char].kerns = kerns end end f.filename = filename f.type = 'real' f.format = fonttype f.embedding = "subset" f.cidinfo = { registry = "Adobe", ordering = "Identity", supplement = 0, version = 1 } end else f = font.read_tfm(name, size) end return f end ) } \nopagenumbers \font\myfont={GFSPorson.otf} at 11.65 pt \baselineskip=16pt \myfont %\spaceskip=0.5em \setbox1=\vbox{\hsize=93.2mm\parindent=0cm\leftskip=0cm plus 1 fill\pdfliteral{q 0.8 g} \strut Μὴ εἶναι βασιλικὴν ἀτÏαπὸν á¼Ï€á½¶ γεωμετÏίαν.\pdfliteral{Q}%,\break %εἶμέν τε καὶ οá½Îº εἶμεν.\strut \par } \nopagenumbers \hsize=\wd1 \vsize=\ht1 \advance\vsize by \dp1 \pdfpageheight=\vsize \advance \pdfpageheight by 2pt \pdfpagewidth=\hsize % \advance \pdfpagewidth by 2pt \pdfhorigin=0pt \pdfvorigin=1pt %\parskip=0cm \topskip=0cm \box1 \end therion/thbook/pic/src/givbc10.pfb0000664000175000017500000006367510335172200016034 0ustar useruser%!PS-AdobeFont-1.0: Archaic-Greek-4th-Century-BC 001.001 %%Title: Archaic-Greek-4th-Century-BC %%CreationDate: Fri Nov 11 17:41:21 2005 %%Creator: peter %%DocumentSuppliedResources: font Archaic-Greek-4th-Century-BC % Generated from MetaFont bitmap by mftrace 1.1.5, http://www.cs.uu.nl/~ % Generated by FontForge 20040519 (http://fontforge.sf.net/) %%EndComments FontDirectory/Archaic-Greek-4th-Century-BC known{/Archaic-Greek-4th-Century-BC findfont dup/UniqueID known{dup /UniqueID get 4253192 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /Archaic-Greek-4th-Century-BC def /FontBBox {42 -76 966 759 }readonly def /UniqueID 4253192 def /PaintType 0 def /FontInfo 9 dict dup begin /version (001.001) readonly def /Notice (Generated from MetaFont bitmap by mftrace 1.1.5, http://www.cs.uu.nl/~hanwen/mftrace/ Copyright 2005 Peter R. Wilson) readonly def /FullName (Archaic Greek 4th Century BC) readonly def /FamilyName (Archaic) readonly def /Weight (Regular) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 { 1 index exch /.notdef put} for dup 0/grave put dup 1/acute put dup 2/circumflex put dup 3/tilde put dup 4/dieresis put dup 5/hungarumlaut put dup 6/ring put dup 7/caron put dup 8/breve put dup 9/macron put dup 10/dotaccent put dup 11/cedilla put dup 12/ogonek put dup 13/quotesinglbase put dup 14/guilsinglleft put dup 15/guilsinglright put dup 16/quotedblleft put dup 17/quotedblright put dup 18/quotedblbase put dup 19/guillemotleft put dup 20/guillemotright put dup 21/endash put dup 22/emdash put dup 23/cwm put dup 24/perthousand put dup 25/dotlessi put dup 26/dotlessj put dup 27/ff put dup 28/fi put dup 29/fl put dup 30/ffi put dup 31/ffl put dup 32/space put dup 33/exclam put dup 34/quotedbl put dup 35/numbersign put dup 36/dollar put dup 37/percent put dup 38/ampersand put dup 39/quoteright put dup 40/parenleft put dup 41/parenright put dup 42/asterisk put dup 43/plus put dup 44/comma put dup 45/hyphen put dup 46/period put dup 47/slash put dup 48/zero put dup 49/one put dup 50/two put dup 51/three put dup 52/four put dup 53/five put dup 54/six put dup 55/seven put dup 56/eight put dup 57/nine put dup 58/colon put dup 59/semicolon put dup 60/less put dup 61/equal put dup 62/greater put dup 63/question put dup 64/at put dup 65/A put dup 66/B put dup 67/C put dup 68/D put dup 69/E put dup 70/F put dup 71/G put dup 72/H put dup 73/I put dup 74/J put dup 75/K put dup 76/L put dup 77/M put dup 78/N put dup 79/O put dup 80/P put dup 81/Q put dup 82/R put dup 83/S put dup 84/T put dup 85/U put dup 86/V put dup 87/W put dup 88/X put dup 89/Y put dup 90/Z put dup 91/bracketleft put dup 92/backslash put dup 93/bracketright put dup 94/asciicircum put dup 95/underscore put dup 96/quoteleft put dup 97/a put dup 98/b put dup 99/c put dup 100/d put dup 101/e put dup 102/f put dup 103/g put dup 104/h put dup 105/i put dup 106/j put dup 107/k put dup 108/l put dup 109/m put dup 110/n put dup 111/o put dup 112/p put dup 113/q put dup 114/r put dup 115/s put dup 116/t put dup 117/u put dup 118/v put dup 119/w put dup 120/x put dup 121/y put dup 122/z put dup 123/braceleft put dup 124/bar put dup 125/braceright put dup 126/asciitilde put dup 127/sfthyphen put dup 128/Abreve put dup 129/Aogonek put dup 130/Cacute put dup 131/Ccaron put dup 132/Dcaron put dup 133/Ecaron put dup 134/Eogonek put dup 135/Gbreve put dup 136/Lacute put dup 137/Lcaron put dup 138/Lslash put dup 139/Nacute put dup 140/Ncaron put dup 141/Eng put dup 142/Ohungarumlaut put dup 143/Racute put dup 144/Rcaron put dup 145/Sacute put dup 146/Scaron put dup 147/Scedilla put dup 148/Tcaron put dup 149/Tcedilla put dup 150/Uhungarumlaut put dup 151/Uring put dup 152/Ydieresis put dup 153/Zacute put dup 154/Zcaron put dup 155/Zdotaccent put dup 156/IJ put dup 157/Idotaccent put dup 158/dcroat put dup 159/section put dup 160/abreve put dup 161/aogonek put dup 162/cacute put dup 163/ccaron put dup 164/dcaron put dup 165/ecaron put dup 166/eogonek put dup 167/gbreve put dup 168/lacute put dup 169/lcaron put dup 170/lslash put dup 171/nacute put dup 172/ncaron put dup 173/eng put dup 174/ohungarumlaut put dup 175/racute put dup 176/rcaron put dup 177/sacute put dup 178/scaron put dup 179/scedilla put dup 180/tcaron put dup 181/tcedilla put dup 182/uhungarumlaut put dup 183/uring put dup 184/ydieresis put dup 185/zacute put dup 186/zcaron put dup 187/zdotaccent put dup 188/ij put dup 189/exclamdown put dup 190/questiondown put dup 191/sterling put dup 192/Agrave put dup 193/Aacute put dup 194/Acircumflex put dup 195/Atilde put dup 196/Adieresis put dup 197/Aring put dup 198/AE put dup 199/Ccedilla put dup 200/Egrave put dup 201/Eacute put dup 202/Ecircumflex put dup 203/Edieresis put dup 204/Igrave put dup 205/Iacute put dup 206/Icircumflex put dup 207/Idieresis put dup 208/Eth put dup 209/Ntilde put dup 210/Ograve put dup 211/Oacute put dup 212/Ocircumflex put dup 213/Otilde put dup 214/Odieresis put dup 215/OE put dup 216/Oslash put dup 217/Ugrave put dup 218/Uacute put dup 219/Ucircumflex put dup 220/Udieresis put dup 221/Yacute put dup 222/Thorn put dup 223/SS put dup 224/agrave put dup 225/aacute put dup 226/acircumflex put dup 227/atilde put dup 228/adieresis put dup 229/aring put dup 230/ae put dup 231/ccedilla put dup 232/egrave put dup 233/eacute put dup 234/ecircumflex put dup 235/edieresis put dup 236/igrave put dup 237/iacute put dup 238/icircumflex put dup 239/idieresis put dup 240/eth put dup 241/ntilde put dup 242/ograve put dup 243/oacute put dup 244/ocircumflex put dup 245/otilde put dup 246/odieresis put dup 247/oe put dup 248/oslash put dup 249/ugrave put dup 250/uacute put dup 251/ucircumflex put dup 252/udieresis put dup 253/yacute put dup 254/thorn put dup 255/germandbls put readonly def currentdict end currentfile eexec 69D900414434C93D12731064FD536C430F0D1610CD3375452676CD606A5BB242C10907A5 BD9376F92A21AD5B1848A71C72C2B1F2E98FC6DBFB2E6C7D58F554DD1E867BFC4B07A940 35A628F3E0AE48FD1AAE1CD99EA9BD6A0C2A5CFB81777D13FF195E956F8556495B0E331D FAB4B85E7ED17E24A88BDD49ED1E6A99E1EA53BD56DB08D1B932C6F8710F4F02883A3843 9BBB0802FAB586D7AFD17C75C2C867DC8595E7F5D98F9A3C5A1E366B3823919841929CC4 4F5FE6D2A0393FDEBD1D14EFB6FAE1FA9D15B5C57B3B3E241B704A53DD0F8C6D322CD157 5ACD46D2BC4FCB9F5767A3DEC3738AD5E62E41314AC10D654919CDE28C1C03CC15FD110D 8EAEAC82C3CAE2CB946CD9D24E0BA015EC99A411C6711D64178DECF64FF7D66D5D7F3AAA 19D86A13DD3CEDDEA460639003B9B40CC9E69F2ED47E84E985CBC3C7669385B5F403E3F3 C5F589DC3FB7864CDAF638852C011E7899B114AFF1D2DD5F1931409EA9C09749DBEE1ECC 2BA86C9C9B66D266D47F259D341297B6E4E3E224E02F5577CF17D2D5F0072685CB2BAAC8 94D1754D6D2D507DC26C17643F463464EB2B226D1523D4E576BDF5372D9B14B45077B988 F66098032A0B1176B2FE829A59D43A70FCF7F25185C725ADD21A5B956186C7657625872D B929D586FE7BD444981ADB0B742C31921E1CDE167A9DCA9D09A4055B32820FAFD1680A70 987B3EF80A8D30DAAB2A6FD15508C8D6B7F75FC557389C56F9350BF09AED331D7CB632B5 F6093876515AF766271CE5C8A9744E8AA9BD6D1ED8C25973E649B614CAE2A4364C449BCC 45867C959CB04DDD31144F31EB75A9A869937B3075CA5ECA19978F35BF5F9541EF6B9B02 C9EFBA2B76AA31CEEA688F1735377498DA0F48E8E6AE7A544A92A75E3F8D27E5ADB18CE4 1C681D6BC1BA7F9B915FFD60CB5A9BDF2CD1495FF9E1306FECBA7DE6439142AD7978857D B561F1E551DDC37E506F747330AF774E3A29CC330E2F78C01E73DDE375E5554C2D8A2AB6 4A1C1CCEFF2855A3098772A247723E3A750D2EE3BD3E835F88BC1D353245B07E73798770 69C5D19EE2C1BD6A0E937B37E66A72958752298A0E9E0676E80F0D3143927E3A99EECD5C 8A5BC1850FEF4084ECDA1CCE03CA41563202A0CCD302F86120E587F7F3E42A63CEB33E58 58816A4AC93A37B3D68C455BE6EF471BB8E00B8F95A399DFD8A7D38888C8440EEC6FD339 BA62F29BD7B94BB1E9FC6C6E51A2590286BA0F1A80739BEA5B2F9501A9A0170B0481A3EB 0B15E694E6BC1CB5811503D24E596625110D0ECB443E4825766B94A171104C188962B108 8ADB0EC7D0B94B3154F9A87EC1A8ED8AF2F6C3A469AA1D95E7074C3BEB706C0F1DB2D3B5 3C617ABD9B7F14BCA6AB7207B85F0EF0A861B1310080CDBBCDA6CC2F410B963D612507A1 5BCF02D9BFCB0C0D15DBD56ED2BF1952E2CAC3E6DF2E537B72565BD9206F7BA7380B69B7 DE8C69ED2691026B7288D06370BBDD7630F008ACE07935CFBE9417C56BD90E3BB604213F CFFFE11CED2DF52AC9CE2746BC38AC299809079B459A65B17F7AE8B229259E122ED79791 2C59B65C5C73FFDD1AB703F3F5FC0A7E63D03343BE598E5DD46C3EDFBB72C07517E204F3 A4DD894267BF42183A185DA9A951BC7BDBBC5D20B8D90F48DAC188F5BA924917494F34AE 9F607109B524FFD60DD381F65C9B141E1F291AA140E5D2EF4102BEB66A5D637051661625 4B3C86D6732779608465D12DA1724E589E8F7CEA0480658864F533BAA95B3DE0E93D2A50 6460625EEE66AE8BDD420238EF702BEB7C173E8A83FD724224772D78E74C2523420D45EF D586A16BE2A58DACA51689AF0C114CEE122596A59542DDF371C38136B96E21B717823245 9936642C2CCB8E9A55E775124BB5386169454732E08D910F204C63ED1E10F5DE08BF8F1D 4A50F921E6EC4B11D9D5151B1E191F9D12C012095C3253A7CDCAF76C9DF5B25D943D6E19 A053F6EFC93634B608E0F91C810CE18E7771D7B5928A4AB4316D660905253BC1BB07DFB7 D4AE22C01DFC70AFDE3E4FF09C81081791D172BB6A470301381AF169CC734124CA2DB7BB 65C27E030A9F3997467142085711E4C5669453C714EE719531DDF2C69A30BDFF52E6D7A7 E3BCD88EB7945A7D1606185BD18EE0B2B3D73611A08699F89E970AF7DA331B6EA81CDC0D 3E90A6C267BA909DE6F64A553BAECD1442AB421D47F06A7C31B1E3CF7476D1A32DA23E62 0B10BCD3D64C0A87072DC8FF617937EA72E87CC346A7AB14924877467C7D1D4F3FADDAAC 89BE2269C7B19E12C5383890D2FC02526AFC8EE68863894D30A532ECD85580EA0B05FC59 A142E5B8810BFD81A022227008A82CA87D5616ACAB23790543B8D61C64DC4394E27DD3FF 36D11ED804D66F0D3A09F05953A35B9803331B2A20E2A0AB868B61EF3E06FF2661E1F328 5BC88C6EF9542309E6FD674FD9BAACC89CB5BE569EEBBAE4210C6DFBD2075FD08CE096B9 1D24C8BDCF5799183395F6F2709E10E882450D9B746FCD3E94679EDCDEA725A08059DF2D D54DB9AF479E1A20252F38C4D91E5A882B07AF693A99469000601E8A6E14B69CBFA97D01 7E38336C3B1D65DC3586CB33A8712D5E578C3B726AC3E52EA0D0E977339058E532740A2E 733776F11D27C9CFDAD13A2B07F95AEF5366A2DB3E8C9E40365B433E144F9E35D6BDE6E7 ACC0C8EB35EDAE20BFFF8639BA09EAE7A2BEDE0D197800D64E9ED8674788BB576799B4D9 9438B6B5ADE0EE8DFBD4A30E73DBB923B0982B9B3342BDB2380D4BBCCD166B6236704BD0 3B40713EC3FDCF513F85A3E95F79BCA4CF0C58C7B585775DA0B2D768846E0BC035EF2C32 04C1CFCAA87320DF8527A01D231A94C0985251F2BAFC24929CAAC366897EEAC89FBDDEFB DE214309922190858E8E0D81226C1FA4ED81A80E913554C1C091980872D1BF46559B4B8F AA5F2D2DBE2B9BF4593E6459E5BCC7BA54AF8E017814D6A1F64BF45F5766BD297F034B4C 25D6D1026FD481C6C608B14116F6741481EAF2FB3481B6F5E90AB8FD0A6241C7AB9E9EDF 9CD7406C771401667204EBABD9F481FB2B64870D46B28C7EECE6497D01A1E209B69CD015 BE1B5A473CCD4057E61542E43EE6A7CB34FB0158187DD4E9B063EE1D8B4E8F9AC8A4490D FEC73711F236AC7CE1DA9E798C01DC68CEEF6688D96F96A593E330BD0BF6DA38BA3892D6 4E06A21C0F035CF3AB24DAAE632D5FA0BAD8B0346B1CA080E9B39BA4B52B8E5A2D4D9F1F A1DD2D5B14BC511108A95BABA9B83A12D75112B168564D654CE62958817354C9361E9509 4F3BCCFEF33D714247CBAC3294B9757930945E96650186636B91A3ABAA7E5EE73471AF6C 3C467174E03758F1CFF44CD8FCC760A8C42667DFA2357BC6B7C231B3944EC2E834E0B97D A9539B3D82D5DDEB55F161D97D8DBB255A4D6BCC74467A827F5A31DA012A20EEAC58ECBA C99193596832586B43CA63104100E9437AB6FC2B33D8950B758B31C706026D419427C6B1 4278100CC4B141CB295D60AD72F5BECDC0A93F6A1AC0EB272C10ABB095A54E33B3493B00 EA2988E777C935A22ECF972EF6B60A4038961A7ABC510EE5249A14C33033FCB703DBC18B BC571792F66190819E207AFDE1665410806503E687CFD0CE086AFFD3A7E76D48A25B59A0 789762F2A9F5559692D2F2DB9A6A83E0B0B6CAA676A8C5FAFEA444920C2B91FAD0D29350 939C261EEB54CBC6D3211E3414E2631E948FFD39F6B21296750A3AD223A72889747395BE 0461A7B7AEDDA8E5990F53BC0E32CD47783E12681DAEB130AB703B458B7929454BE6D54E 709C411B2D252EE51DE3D0B762217585F45BE2070798DCF57B57E9431C2E5E430BD0F198 AB58CEB2A0A4079BFBA696C905303EE7642196553EFFEEADCE357C3C92992F407EB62936 28B05A2BF865CBCA577538F74FCF0DEF8A7E1B43BFA075B12579B06988A3F5E2747FF334 2729CD43FD721ADC9E94E111F9BA470184F7933471CA14F1434363188A7428FC9C56AA64 6F5305D76CCA7FA127F45B9C3E5885585183BF783B2726A6CEB1BF92F9D71F1CD5C8D09B F2B0E380A254A9B74CD94B793319B7813A50854268C74C637AA398CAEC09F20E5B9F32F0 10311CA3AD43BAF952D938EB4C310F7C7A5A23FF7F203F8FECE1BAEFAEBAA1392912B063 C1B9C9751B3E1513DE87052712558B2330DFFFF5F2A36D176012B722EE0AA3D7170E1354 6DC80016DFE230BD981287AE4ECAD36053206AB5B070BE5F8A819B3E2B0CCD43302C3809 329A5F2499F5E8E6E954DC76745F8F31FF1D845AE9C381AD466D9960BAB886AB1D6E01B3 5C3AF67EE26A54C40290FD3B33EE8F9D96F049EAE8891B672C6E69D59A6B8C11FAE2BA1B 84E7A486119E2C98A77376CDEE3F0D77F2B6C8A5022A75F16697313845F06E292E9559E1 DB0242DC953B7D08E724FD8B7FE3686B74B9B69919ECF721FBC251E2474ADC752965B14A C3DBD3CB04E0D90FAFB649B83C4819B3F30901AE588ACC5AA55409B4C398C99AE8E18054 43B5EA52E9171C4D9F74562681210686F6145D9124E89557BD89A3DD0A1C82CEBC27674C 5621F6BF37BE35995F50C86D2B177406E3AA95F4B0FE2BA0C9994AD4BD3578784E8B8A7F D82D9A7114BE248C13653C684492C844E6A9B3703FA6F40F301826FB0444E5B707FF085A BC42714578907ACA7808DC50007D2053E73CE5C644E4A733418D7723D0E554B97AFABA57 617343EA6D62F6DB88D27F3B7FA6B5FF0674F0776BB8CC0BF8954E7C30AA9943677B66FF 59718350317149B60856434D541FBCF512D523BCE231D5B4B0181A76A79820DBDE328544 A069831389E7A9E60AC70B59D32D6EFE683DBD4E8C4612DC0C45DF7520E5532E5A31DC64 66016BD62971865A5263004522087B284BD87B566DB94F0B85EA8FB8432CEDA39608D86E 983C9DB64C3615E4F3D6A23CEB51984D083E17C5D4F06AF58BA1DD7DEF2CF3470CAB52B9 216C3AA7FEF9E1435AAD7AD13736F29CA672BCE594C766B0C531BAAA2F0AF96DB361FC9B 07AEEFA2F233E96AA2214FB9CFB5505DBE55B4DF971C2FB0A419CFCF6E62B25C5CAAFACF A247B7EF3EA982C6DC5688FBE4FFF5F8A3B8AA8885A5C75628786C005194A04A345EC8A4 21D63E7806468E226FAAE9D661644479EA4F4CE33A39DC4F7AF3800E7B2087A121318B1D 2B795FCB7097AAAE4FA2FC1FBD75585C430C912CD58871E3E5C3C91FD14B316DDA733285 0AFE9A16482457CFE4F8CD6FBC37AE254F4D8A94FCEA85A0ACE916C533D47A8331AEFB98 72F5D1046937A161569C3378BDCAD76CEEA9947D2C9C8406B0A9A811CF79BD3003DEA4C4 52A9EE20843DB3CC8C2AAF78DE86D2A7684898E68AE2A39F3969CDFDBAF0B76CD66D0B5D 6E38981589DF735F0A40523E8CD85F1290438DB99A4B1B4468327B74995B17CCC058E6EB ECDFFA413339EA37B3D0848764D1EC0F355AB0F9486A419B429E38CEA9D54E58718639A0 EBE664C2FDFEF2FA9D33924424003DA7D8FE68B773612B09191A1976390B43063689AA33 DD23DD83F6A0B631FE5580AAC10394B46AFABDF1C093DDABFC9E9F8CC8E249989E987583 C87ABB5D9A563D219060815E4F5B8CF4008B1F434E3F58B2137AE0E11D37C29EF7839BDE 618514BD30302BACAF6B15671EE55FA965EC348224E718687C7A10816866CD049CB63CA8 85C415CA079B3209A4C22D909E6473E73F476CEB0CEA915745821D2582E06704B2C1931A 0B307EADB89DBFCEF8B4E7BC21BC7F64433617F760DA6B778FC908AED7F89F55489D9637 531F05753FD16625B95BBD907002A65579915CBF0B2D0A8D8B377716C83006DDACEBA6E0 B20C7A6EB035C28850FC47711B3A68A3D24C157CEEEB8C3E918A9FF6BA82A9AF86166FB5 C303C550FAC00BE9C322925F447201995FBE50B6839614A8D588D61F6C3A0D8F77B41890 35DD70BF99DF516962E1E19A164C111C79B51E8F03E2C24CB1F8EBB484FE290B2F93F2DC 4E2910BA919EC92AE708497A718B6EA11439F2DF02EF718474D6BAE1EE45D69C05CA5894 AC755FBE2C52010B1877F4E1379B4C53CA3D5E485CB3E5606414BC435E9FD00CB286AE29 9E0AE31587E66C481D4C9BD4AAAB58B9DF604EF4D0183393C76EB6A59B12B5AA03655FB3 D944CC1B4F527E498075D26502FF5D97E8BCD4D1EE2913DF935C11C892BD613B2522BAB3 8F9AC20231D02F7C5DDBD69D5835F92D8D4982504233D4B8EFD11E128F00299EE56CC792 101CD4FB6BFA62E0D3DA445716E018799D1F7E13BC3FE47B5074B244B1B7A085232EFE47 AA271DDEC56673F9152A39D37CF94E575995274C8E691950EDDB14A28462DB98D50CBFE6 259CEB35E1204F6A8013976DE3BEAFF56168023C9AA888B1A57B3EEB9C01AEF2AF325652 F19FF0BE966D1953FC8A1EB6908BF87DE192725ADFB2024433001C9019F8942A07268CEA 49E495A837917EEC789346D8B8FBB3C320EAD3E784005FB811B301091BB44D072BB27D76 EC8919B8A48D907B1D98417739CA065CF148C95E369F4630722EF6314ED9FF64C0840867 DB71606FB1368E18F922D43950EC2CD858B2CC39DF6D8B01C710B97E0149050BE7BBA755 9AFBF0AF4548E9CB773A8CA5570DF6403C354CBAF8552409BEC0A6EF5241D58E8CDA7753 77ABB2EF972DDAAA10AA3B0635B202EDAC7D82EBC2BB7E89634355410928E4C1F76DBA0C E476992118FE58FB664D60C3F7B44C80D1C939ACD47AB4B3E69221A0707615BB0FF6DE7C 2A1AE7F659FA832FBF0737E59B4AFA3FD1E2A2D8F68236E92DBFD781F108201DEC14D06A DF94927340EB9F4C58935D798DBDD352193D9F653553B8BA97CECB6EE5FF736B3E9C7377 9D3265381DCA2353F8C4892D81655F47E8A93DC75B8AF3A6E22A42E1A70D4F581F3D936D 4544CA56D1082F8FF0378E1249EB29922E01D6C93BCEC4B9040E3B09B21B38060E0557B6 990C9E963885D96334D5E4E0920C33DC1FDEB24F57D97FA720B62D32DCFE858FCFCEB001 0541636EB2E93961421BF50E499842C8232773654AA5D622390D946BF49EA1F7CE742CA6 B2B1D7E28C0BE95DDE97DA099031E2BD98CD805E925CFCE79B34CEDF1B4C3E7789FBB167 38B48F34306D1E3D846B059FF3F244109D4521A36DB61FFC28AA71DD69477C96A1756AAE 90EE632CFD7FFC0D93389B4AA8110BA21BEDAE8ECCCDEE05458F7F3CB5A9C1C8076D0CE3 C0B51B1DCC8AFEEFFFCC2259B5A42A84F483EF89CFD78D89506C2BA7BCC576763ED2BF80 2C19BDE0378FE1EDEE156DF30FD7891F199391E59916E840B4B0BC6C855F47CD38F05C68 313931BA2C7AA8645DA7CD3988E5C0591B4C872CCA402EFC8195F121C22D440263CF0FEA 7BA7A0E4A4DA31D973136BDC37789254F45898DC83DF324031313E43C4B92813E699D890 23288EEB87A56BB4E75BA20E23D07DBC4C9D5A5D52D17798DCA362B091DC5EF2E6B9019F B06BD33485E63B8E49FADB1C9A06F80CA99A6A646CDB60F7CF7748C01C91AB4A532DDA54 56A70D5F93E4E96F588F0E92833FF16C2158BEE38CCA5D5CB183A10FB7CE4354D5634D6B 61E9ADE08315529ECCAF2FC745B5B457F05744E5018C50D83A38C6D573EA7B8B7B143C2C 0138D4FFD53E41CD6026EEF832F07CE7415FBE2CD6F982B7D84CB6B51345E587CA5DF396 0E9352BC4B7FA03ABBE1F7910E5B804C6C87CCA1388A09F039060B475600B35FCE23345D 737C57340ECAD08B54E2371F75C1EC1DCBAC80321B5CF5A236EAA92416D4D39A74E547A9 F9880E5EEAFF73120597CC2653C55D9BE02CAC31BB90EF07CF40908BE5771A4E4BC4A9D4 E4CBDDB4901A5280BD88A210B64E8857998B8283CF4C41DDE9591B2F1F5222446A753303 FBC89FFFFE08FA4B2B7B7744A43E33A51A885C2DDAD6177093AE0AEB4A46331C8A6A93F9 4EF054456CFBAA3300EE3EAA12F65DA1ABE973E8FB747FD47B7CA90B34686CFEC96775C1 0C130EEEC7552A6B2936A9F83C5FA53519FFE4A5889260EBE5176F25FB125705549B5487 527D316B6C53FEE3F2558F2DDA415F982DDD21164343317850A89C93973058CA15BC9CBD 19F793D30330EC735AB0630261BD5009B1F4597FE3977CF195FE5C74B8A67A4F3CCAA8B8 FE92943D60B2249EE0C07B6B4873F1F5FEEC3497107E8CFAD21B1523E7488545A8354255 1319E5E913A1B589AB8D7AD361F2FEFA770D98762175AABFA1ACBB2FCA4AF2C646F3BF45 3F07778228939DB099C2772DC8CFEDBC6B52F2DBB92C3B7AF032F13D983B9CB3684EFBEF B8A6EF141D5D224EBB5C05E2235814772CBAB9F4B7BB2623A1BF2CD471F634957A522355 1DBD50F40A153E57B26E4B3DD826D087E5E66B0FF0AE3CC6BD6A090514B734A1EB9C56EC E28A27143E91A83C94937CF383BFECBCD6C11259DB342B16910D863887A2536523858153 227187EB2B5B9C0B269E6982D1F6A4DB25A13418B7C834993A23DA0601E997577270F003 13EB2FE959850D9F44A1D55C619B0ACDBF784C9E13BA55A916A4DCCD9FD4212767723762 7A9BCC6E7BA9467918ED7E23D94D5CB0FB9A8A8C5EA1647CC223E5E941F3815282333618 47D85AF4D7577EFB9DE2AC6A2F9EAEC2CE224C518FEDBC49C6AF31094AC1B0EAFA88D34A E6A0693F75679E07A3BB63F1207756939F7D55AF2FD5982041F4A2DF11F7B2C749092207 F6E37733473079FA4E3957DE52AA74E4783EC46482B5AB5DB82094BFFAB948C4D0D4DC79 409D4E15C89CA25A4027232C7F621AA6E3F12CB8198198DD0B66C9BC455345AB12053FC8 D70446FCC1692D5A2FF8BE2615A5800E9BFEB0A061F814438F88600D24E5AAAB1C1E6CB0 E2F6DD9DB5C78E3380A8874FF5C67EC3765D988E84B383F17D8488A7745C2CE56A9FFDC2 BCE7773C8884AE0CDB30E4E68767AAC2A95F70FB3430A526F5F70C362039FDA7F39C6EE2 4B5044504365C63521090081B582284F746EC2A024223A00189D36339862CF8E4133FBB7 F3AF18F4B7E435E6F8C009F68538DD5E8CE0A2A85CDD8B04602A9E81527A58C77AD20945 4CD39D1830199AD67B07C28ACB388F2831271D874DF4E370E7EC79B21502696A8A43C834 7322AA6873612B09190EEEA0FD3ECEEC43E23CDA2B154C5ADB375D7683A2DA8179B46E6B 7AB0E94A9964B72229C8B06BFF4CBE83F508DB21977FF11917FFB9A7736007374C530DB3 26E2AE68552F6A622378AD057075C77795784ED3C2C898D7078C494BE0A4826510229021 874694FE86F401F5C94D4E0A2787E7A51C19C5EFDBCBCADBF578081B79FF6EA9E75226AA 00AB68AE72213FC8085AC401BA28ACD6E0722F0674910AAA4806909C1B499A7A498FDB0E EB0B2F5B30398B714D8FFD1BDD234FADB6B5A6CE911220DCD7DBCEBB33B7DA2A44A4BDB8 20820CEA2FCFB8800DF0E71A191B31C5333AAAB58FB16CB8A8E0BBE21012183C61A718DF 5F72AA1E28ADD619A3D06B4B91FA4F876CD2BFEEF88B6EC5942005A1A6DB50AA60AB80FA 772741DB0C46A6EB4E7CE0384CD4C31A23D1F673AED3BCF33FD6A3A4EBF9203B835ABC26 5DA6962556CD86AE5DF59067FFD3947A1B05C233BD42E5D82825E33DBA87C17760C18F0A 60387913F1D419A046A59331FC1064986DB2C686EAA489457A471F7E01978562A925E3BA E14BA65C5D879D5BE4B8C9875C12209022A312CD7AEBCDC94FB07B7EA6FE09BCBE3D8023 C25A79B4E443E7D8263926C528E414022932CC609BC7BA4E6E24F042DA1BF03899A26DFD F51E8BB3E1474E7CE633AC1CDCC1EADF54E506A0DB7B73548DC2448651B9351B295B17CF 257EA5E29D066F907DED5BAF2F322638C02944B37B7DD9B715865992E6236A24AB4943AE CD35CC83D1DCDEDB2060E11014974A6F8C89A7D919E1E26F3BFE7835DD974822C9F9A8B5 7FE44F12C78713A32D6FF99C8A6BF4910151B81282B4CEAF34FA1AD7DA22C8DBD3D9675E FE9006C6A1A8C1BEF004C990CE9EE33928D15550A514724D1E8A6A1962617FC59563FCF3 0A4CC22E0ACD6DED469C6AF14B0EB8C957412E1941EE43E964DA85ADF9F0E5A63F8DA577 145277AFDB89106449124F8818BFEE8A9D5C99FFD674D35EE0BFECEA26C4BDE924B11C2C E2D5BDFFE4F4CC7922AB97BF7EDB669CE523EC0B563CCDA9467289E456E1F7BB4A75D9CD 5357D7665D1EF67D7DF3EAFC1559B4CFB216165AEF1ADC241B50B857736531C575D8013B 609F946992F2640534CFD3D9EDF39743CEA0955DE84B01EA558AAA2185B5D73231F7C201 B4DA9510410879E4FB2E1E519FE7F48CB363F40AE69562D7B7DA06B7C0AE466A891629DC 5CAA3529AD9700ECDEA9E03EEF7A682798958F89ABF28D40695E5C3D3CC174E834FD0308 8CDBDFD40FAC983084A7B71C97853A9E8BD7BBDAA2DA65F6DC7548E2C13F8672028DC0EF 04659853F38612EDBAC8EDB4BE1A5635AA93D77EEF55606B126D5B7CFFBA48A1D4C5B7F7 E62E8BB325843B7A48A4178B9FF5B40C65DA2CACD40DA82647138BE656C89B68E851C137 5F9A40922A6DE9FB254EB18472927A597A5270974C0182F8137BFE7C87E012EF012705B6 BD71BF7EDA3C607AAEC83A1122C8ED167E5826E098DD01304205F4BB58000806BB1ECA48 B97FE6C6F27C379103AD50AF09F0928D9716AF15D32718C42863BA651C803704363C4A97 233DD1EE3D8875A84A6B5DDB0DC2CA8DB9777382D350B4AF1168F700A1ED4C1CC52E4271 699235B3690E6BAAC5631FD29AE841C9FB178A5FA12FA3AB0E264A9477676E33AF39AD63 D0DA0276ED37F81899362DE47E0015DBE96AD295145148AEC66A722B71B88D494BA64C64 DDC85EFF367E4B232329A142CE0AA6B53351569FBB463BFB252F0317510ECEFB50280F4E 2D910E84C585BB85B2D246748871D064227613665EADA6365C9099AFCDD7E60D132AF802 53454A8F91BCF429DFB258CE211085ED02313E33639DBBB2D247D51616AB69F3F6029388 EB45CB2999D68991458D683BDE350AFE01564183F232808805A27465087AD73CD3385C22 87046562A9BE7B0B6661038C910F9866522E89FDF5245E892E08B0357126DDF945597AE6 A4FC522786D9482DDB7CA99230A5053F9C5273E3B5A8262874BADE9F6BD79B95C9DFA635 E223F80EF7DF19F4A46B06CB725F1E7CBC4A794911DE7034E1851B3C76ECC3971913F7E0 8B9018509B28595BD037E421FC851AC6DEA95AFD4B7C4AD08754C7BA362C41DCE6D16BA2 B619686E47D76F6A43C48592B10722A682D5C982AD6B4AA50C15CE5F6938DDC820031038 162F3C367D8D3905D3E09C03D9A6A38B0D9F6B86942A8226662A17691FBA884E7834F5C8 389F8E886DE0D67A43E8BC5062ACAACC6DDA6809846DB97F5F8263B4188065CA795C1202 7855EEC1914EDCFDE53FE5D04567C7511F42D7654DFC2A608FC0C15357F75521B50B8CA1 AD5CAD854950A43B0BFAAA41CAE13F620A756CA265446297B630BD11380555E11DF1AB45 76C00F561C67A07B6B5BD7C2F712284CEF39986F049FB93794A9CA5FABA90FA363DD7FC7 2BC399F64E0658F7482D71223891546688F6B89534A7590177BE269DFABEFB3FB11F200D 2B82621D555026C4C2CF0507401F525F7835848F9B4EF618B647C37184E4EBD8088F306C FC788DA120BD16EC991686F498610B7E9905E4459A6A1500F43DA2D65133586D0D952D2C 556C13FBA180C9E6004B65913AD3C85B3643E27DA450B840080C8E95A1409187C8263C4F 662EFCBC99162682F9CE71EF176C5B935D710F0582F134043EB4703D93A0B35D9A3FB9C0 2081CEB7F043DF2EABFBBFB9436452E32E95B0EEDE0168EBD6D1EE9C96AD38BAFE713028 E78041638310A44A4F7860ABD68DBF2CF6A8A812403E8C9FCB4ADB874E28F0871E899021 C7C19E52A4B632488CBB47F5161679E3C92DF02D0CF518700325BCB7B3F52148EC956F5D C8EB0D2A61A4E365E0EBA68BC09F6AAF6C3E6CD73E376FF34031F65D2138F2D6E688A1A1 F5ED0E80A7845C8B88DB88994B7DB49E33DDD26956C5C1E7D9CCC30AEAA3F65A65AEA433 E8C0212E6BC24B89E3EF8B0F2349B042A2935BED5CADBFC03539337506A8D3E7D45E52A1 B684C87AB6365D9C94C69FA9281451C3FFD755894D3D7670D27D1E1E844F8ADEB352ACC9 388A0FAF79079E36D69844AC9E83F30ADB7D1322DA3FF847360EE5FD4554AACBC56BE480 B20CE2B856CBEFD6FB0C74B082BF6C239D736CB86180130633EC688D578369004BD2AC5E F41EDA5E8107CD0A3D563149242CEF8F2DA479E437C4CBB5FA173C03F03C38B7DDD3E748 402220BD4EECDDF9AA1A0E217B8077A66E28435DA1472284CE59AE7940535E1BEC2DC08C 4A64BFC693E5CD5E9451BE09BC19EC9646935376DA943D239994D68BCF48A4495F2AE947 181F6B4AD03CBAF438782C6DEAD1B93D566A68C7E3F4CB848C80E8EE2CDBA8293C93F833 A4B1E480318409683CA3AE381DF783D2F05B5C3D15E40A8C8B9455219AD3C1A63CB5C3B5 89D0FA047D48010794E0B69AA6F60B4F5A123CD3632C46CF972870AE17A5462857969134 4E2577065EBC12149B0ECEB4E7AAC5008EE018528CF1C474F0948B128CCD91DF811C9C0E C8913D54F89C149B9BBCCD8102F6FF28ABB539F0BA382A0F6D32FFEF3260CBA3D0E20A97 9D4D2DD96FD5A421E9F9317BD404C897778E7002AE0ACDEC9D6F323894DA927024B704DA B133D15247172CA0ED941F5EBEFD2AC543D68BBD0DC8DA1A4D4F4D4A7642D1ADB4F78773 29277ED54385A07532A95317804059507E34E5C20D218072A6DAE9BD2452856BB29F6F3D 9460384EB46B7DB63ADCCEB3133DB7965F0AC9BEF3D187B4B83527BC80F68DB57F950BA8 6330EBBD232F6109A4BEE40F678AE100118477E07B02FABA7B99F34BB70B9F144B675CE5 844E002C75AB2DF91C911F2B5AF0F58DE01A504F1C3F885D3117FF1559BA20D57239418A 64F415AB8FCA25E5A3883F12B198599FED31D4BBAA11101DCE2B3B5C801F130E0DDA5A25 0F6437BF42A42824FC9C74A8FC89E5448E7A377AE9C12BE96572D6B8F518B9051AC6FB38 6DC9433B990B24D2A24F61C4062181812BEA83A7130D840295AC11AFDAD8FB8EC902AC35 02C1A665FEDB9BE601FFF1FF8DF2A0AA94E1A4E3945E5405EB1C15CFD9D795E71A2E7C44 D3B1A33E37D8A40085DD1CE19FFC3EE3CDCACB4FACDBE2D183A200FB4544CB89181C6F57 B4AF5E01554BA0AF1D1A7AE1883D5C693C40CB6849011BE65CC07CD37CBF034256ABBB54 80B065C9315F3985322DAFBC8B61D01D7B3218D9EC093B0AEB3A8EB15E5E1F3D6071E606 E89E01F9501B50CBAA9E865CE4DB6CAFF6AF5034B39BCFA55E90ED83774807494E08EA82 8298907FEF38F0E4EF63082B3A2AB807E1CC063F9D5C86A50920F6F4BF5484D89A45B020 D0C26217D9B961D109C15F428695BDA8F4B15C18DAF246890C7D7585BC8303D3548FB955 52C59C3DE59288ACE770D64365157427C257377118CBA072D7C9776B55EE3AAF1F0243E0 5BFA7E6DB42CB2A0737570414287B17F819992E1CFCBFF6BD974C1CDD5AC1DAB0BA6A3B9 5B21AC4EE56485FB68D63738EECDF9CF5CB0CAF14C3C9FCB540600E56891C210A58411B5 B61B5F03CDD456FA5E267B0049E522274B27AC699B118091D6D1EF2A1EF7479AB75D48B8 B49AC2F1A7EB626C165296BB1253C8378BE7C2E7A68E7B43661556A5514FBB8B1544691E 4BF0DEF1F0EE7C95C7C5C290A245E3C0476A3B92629F84E9261CE30B68E08722DCC3A776 01FFEDE3DBA60F46B369D2FB2B0C5A95677D22255EFB940CF136078D6F02EBCFBA2AB519 5668F96CBC2D4726A2F23E2DD63602C3C181DCB528DAD586FA76EFC01E8F1F0C5C3CB4E2 B5D07587604747E816CF69E523398D208C535828BD6A71455A79D9 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}iftherion/thbook/pic/src/givbc10.tfm0000664000175000017500000000065410225107654016050 0ustar useruserkBzIyW ASCII caps and minisculesGIVBCê                   Å:Ú  ¡0 H †B Ø. ㎠ ¶ }(åÒ$ [ îîUVª«ÇãŽÇtherion/thbook/pic/src/herakl.tex0000664000175000017500000000557011026001724016066 0ustar useruser\pdfoutput1 \directlua0{ callback.register('define_font', function(name, size) fonttype = nil filename = kpse.find_file(name,"opentype fonts") if (filename) then fonttype = 'opentype' else filename = kpse.find_file(name, "truetype fonts") end if filename and not fonttype then fonttype = 'truetype' end if fonttype then if (size < 0) then size = (- 655.36) * size end ttffont = fontforge.to_table(fontforge.open(filename)) if ttffont then f = { } f.name = ttffont.fontname f.fullname = ttffont.names[1].names.fullname f.parameters = { } f.designsize = size f.size = size direction = 0 f.parameters.slant = 0 f.parameters.space = size * 0.25 f.parameters.space_stretch = 0.3 * size f.parameters.space_shrink = 0.1 * size f.parameters.x_height = 0.4 * size f.parameters.quad = 1.0 * size f.parameters.extra_space = 0 f.characters = { } mag = size / ttffont.units_per_em names_of_char = { } for char, glyph in pairs(ttffont.map.map) do names_of_char[ttffont.glyphs[glyph].name] = ttffont.map.backmap[glyph] end names_of_glyph = { } for char, glyph in pairs(ttffont.map.map) do names_of_glyph[ttffont.glyphs[glyph].name] = glyph end for char, glyph in pairs(ttffont.map.map) do glyph_table = ttffont.glyphs[glyph] f.characters[char] = { index = glyph, width = glyph_table.width * mag, name = glyph_table.name, } if glyph_table.kerns then local kerns = { } for _, kern in pairs(glyph_table.kerns) do kerns[names_of_char[kern.char]] = kern.off * mag end f.characters[char].kerns = kerns end end f.filename = filename f.type = 'real' f.format = fonttype f.embedding = "subset" f.cidinfo = { registry = "Adobe", ordering = "Identity", supplement = 0, version = 1 } end else f = font.read_tfm(name, size) end return f end ) } \nopagenumbers \font\myfont={GFSPorson.otf} at 11.65 pt \baselineskip=16pt \myfont %\spaceskip=0.5em \setbox1=\vbox{\hsize=93.2mm\parindent=0cm\leftskip=0cm plus 1 fill\pdfliteral{q 0.8 g} \strut Ποταμοῖς τοῖς αá½Ï„οῖς á¼Î¼Î²Î±Î¯Î½Î¿Î¼Î­Î½ τε καὶ οá½Îº á¼Î¼Î²Î±Î¯Î½Î¿Î¼ÎµÎ½.%,\break %εἶμέν τε καὶ οá½Îº εἶμεν.\strut \pdfliteral{Q}\par } \nopagenumbers \hsize=\wd1 \vsize=\ht1 \advance\vsize by \dp1 \pdfpageheight=\vsize \advance \pdfpageheight by 2pt \pdfpagewidth=\hsize % \advance \pdfpagewidth by 2pt \pdfhorigin=0pt \pdfvorigin=1pt %\parskip=0cm \topskip=0cm \box1 \end therion/thbook/pic/src/GFSPorson.otf0000664000175000017500000007263010500340104016423 0ustar useruserOTTO € CFF '‘A dd)GPOSØèÄuDTOS/2†`^ñ`cmapÂ[˜ªheadåÝЇ¬6hheaŒEä$hmtxOY%Wo´maxpmPname•­)p&postþµ. D ¶—ÿ_<õèÁ'FœÁ'FœÿÜÿœ]çþÿ*ÜÿÜþüœmPmR¼ŠŒ¼ŠÝ2úÀ Hpyrs@ "çþÿ*íô´ &< <FM < i‰:š Ô è è <F x x Œ 8š "Ò @ô "Ò t4 (¨ 0Ð 0ÐCopyright (c) Greek Font Society, 1995. All rights reserved.GFS PorsonRegular1.000;pyrs;GFSPorson-RegularOTF 1.000;PS 001.000;Core 1.0.29GFSPorson-RegularGFS Porson Regular is a trademark of George Matthiopoulos.George Matthiopouloswww.greekfontsociety.orgCopyright (c) Greek Font Society, 1995. All rights reserved.GFS PorsonRegular1.000;pyrs;GFSPorson-RegularGFSPorson-RegularOTF 1.000;PS 001.000;Core 1.0.29GFS Porson Regular is a trademark of George Matthiopoulos.George Matthiopouloswww.greekfontsociety.orgÞÞ Ü*  D!"#%&'(.)FGêá,01-3+/$2Ìn@.&'?R[]_~§«³µ¹¼ŠŒ¡¹¾ÎÚàEMWY[]}ƒ‡”—Ÿ§¯´ÄÓÛïôþ    & 0!&"ÿÿ '(R[]_{§«²µ¹»†ŒŽ£º¿Úà HPY[]_€„ˆ•˜ ¨°¶ÆÖÝòö    & 0!&"ÿÿÿáÿáòÿÆÿÅÿÄÿªÿ‚ÿÿ„‘ÿ{ýyý:ýkýhàðàüáàïáàçáàßá àÐàà àßÅÞÛTV\‚¬ÆðúDNV’˜´ÎØú  05a ÍÎãâÏÙÐäÑÒåÓÔæÕçÖècØý×éêÿþ ÚóòñÛðÜíÝÞGùîúìßûïüà   '.I68>DKQY_ei(/O079?ELRZ`)18S@FMT[afn*2PJ9:AGNU\bgj+3:;BHOV]c,4QR;< k-5dK<`!CJPX^hlmf=egl>h?i=j@kAtsuv}|~Œ‹Š‰ˆ"‡•–—X¼ÅS[ZÆ¿ÀÁ#˜Y™T½\_ÇŽLB$š›œU]bÈ’‘MCN%“žŸW ÉÊË&”¹Vº»¾Ì^-3$+/þ².GFSPorson-Regular3øùPùQùRøûâ ¹ gûœù¯B× ü-¯XÅ8$+29@GNU\cjqx†”›¢©°·¾ÅÌÓÚáèïöý  '.5<CJQX_fmt{‚‰—ž¥¬³ºÁÈÏÖÝäëòù#*18?FMT[bipw~…Œ“𡍝¶½ÄËÒÙàçîõü &-4;BIPW^elszˆ–¤«²¹ÀÇÎÕÜãêñøÿ $'+024;>AHLQX[_fmrw~ƒˆŽ’—𡦩®µ¸¼ÁÆÊÏÕÜÞàãèëîñ  ,4=IU_i}Ž©µ¼ÈÐÙåìóú$+29@GNU\cjqx†”›¢©°·¾ÅÌÓÚáèïöý  '.5<BIPRY`gnu|ƒŠ‘˜Ÿ¦­´»ÂÉÐ×Þåìóú ")07>ELS¡«uni1F05uni1F15uni1F35uni1F45uni1F55uni1F79uni1F08uni1F18uni1F28uni1F38uni1F48uni1F68uni1F09uni1F19uni1F29uni1F39uni1F49uni1F59uni1F69uni1F0Auni1F1Auni1F2Auni1F3Auni1F4Auni1F6Auni1F0Buni1F1Buni1F25uni1F2Buni1F3Buni1F4Buni1F5Buni1F6Buni1F0Cuni1F1Cuni1F2Cuni1F3Cuni1F4Cuni1F6Cuni1F0Duni1F1Duni1F2Duni1F3Duni1F4Duni1F5Duni1F0Euni1F2Euni1F3Euni1F6Duni1F0Funi1F3Funi1F5Funi1F6Euni1F6Funi1F2Funi1F80uni1F81uni1F82uni1F83uni1F85uni1F84uni1F86uni1F87uni1F90uni1F91uni1F92uni1F93uni1F94uni1F96uni1F95uni1F97uni1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FB7uni1FB4uni1FB3uni1FB2uni1FB1uni1FB0uni1FC7uni1FD0uni1FD1uni1FD7uni1FE1uni1FE0uni1FE7uni1FF7uni1FB8uni1FB9uni1FBAuni1FC8uni1FCAuni1FD8uni1FD9uni1FDAuni1FE8uni1FE9uni1FEAuni1FECuni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FF8uni1FFAuni1FFBuni1FBCuni1FCCuni1FFCuni1FC2uni1FC3uni1FC4uni1FF2uni1FF3uni1FF4uni1FBDuni1FC1uni1FCFuni1FDFuni1FEDuni1FEEuni1FEFuni1FFDAlphaBetaEpsilonEtaIotaKappaMuNuOmicronRhoChiUpsilonZetaalphaepsilonetaiotaomicronupsilonomegaDeltauni0394GammaThetaLambdaXiPiSigmaPsiuni03A9Omegatauthetauni03C2chizetadeltagammabetakappalambdauni03BCnuxirhosigmaphipsiPhiUpsilondieresisIotadieresisalphatonosAlphatonosEpsilontonosEtatonosIotatonosOmicrontonosUpsilontonosOmegatonosomegatonosupsilondieresistonosiotadieresistonosupsilondieresisiotadieresisupsilontonosuni1FE5epsilontonosetatonosiotatonosomicrontonosuni1F02uni1F22uni1F42uni1F23uni1F43uni1F06uni1F26uni1F36uni1F56uni1F66uni1F07uni1F27uni1F37uni1F57uni1F67uni1FB6uni1FC6uni1FD6uni1FE6uni1FF6uni1F00uni1F10uni1F20uni1F30uni1F40uni1F50uni1F60uni1F01uni1F11uni1F13uni1F21uni1F31uni1F41uni1F51uni1F61uni1F04uni1F14uni1F24uni1F34uni1F44uni1F54uni1F64uni1F71uni1F75uni1F77uni1F7Buni1F7Duni1FD3uni1FE3_0052huni03DAuni00B5piuni03E0uni1F03uni1F33uni1F63uni1FD2uni1FE2uni1FE4uni1F12uni1F32uni1F52uni1F53uni1FBEuni1FCBuni1FDBuni1FF9uni1FEBuni1FBBuni1FC9uni1FC0uni1FBFuni1FCDuni1FDDuni1FFEuni1FCEuni1F65anoteleiauni1FDETauuni1F62uni1F72uni1F70uni1F73uni1F76uni1F78uni1F7Auni1F7Cuni1F74Copyright (c) Greek Font Society, 1995. All rights reserved.GFS Porson RegularGFS Porson†¢4»áKÑÿE„úa…‰™¢&ãëñŠ'05;AJQYa¸¼öü &-48AEKQW\dhuy~ƒ‰Ž’®²¶ºÄÈÍÒøü     ! ' , 1 5 9 = X ] a s w { € ‡ Œ ” ˜ ­ ¶ º ¿ Ã Ç Ê Î Ò Ö è í ù ý     # 0 8 > C H L P W [ a f q |P†g\f`u¢¸Œurwzx‚€to…jZŒd™m§jª{¸Æ–Œ—Œ—‘Ä¢º³°°²¸¾˜™Šˆ˜À¥^‰<¢÷Û-ûÅnŠžt¦¦ Ÿ´›Œ‹ŽŠû*x£‰¢† ²w¢l‘Œ……‹„lpstqoza‚S‡t‰vx9©aƈ¶‰¬Ÿ¢¶ž¬—¿Ð øP÷ˆTz9tûtû|A‚d{qŠe¤ô¯÷+º÷[’¦£ ½x¤fN\JûkfûJŒVt‹™´¡Þ¨÷Œ’Œwž‡›‚š›“}mŒtvz^y”²”§”œš¨¡™¨Š¨ ~pš˜t‘nŠj®Òµ³º–Ž˜˜—DzdFz‰y‡x ûQt82û rt’™vnž}¦°¤’°˜¾™¾’¯¡¡„—~ŽŒ†‡‹‡v|€v€uŠÁ«¦º¾¤rY‚Љ€†pb~T‚f‡r|b©p´¨¦•ž£š—™Ÿ–¨›±’¶ˆ»Š—‡„¤„¤ˆŠ–©Š–š¤­œpV}Šyˆu rws~pm|š©“Œ”Ž”àÏy7t†€˜’“Ž’• «lû¬Œ©Å¤˜˜¥÷ªûœŠûªq˜~¥Åkû«Œ¬Æ¤—˜¥øË¤~‚ P©÷ªŒmPz ~qŒû“÷œ÷“¥˜sPŠ©ƒQq~~rüÏxœz  |j‚€zxJû%x^‹¥ŒŠ‰÷÷¡ ‹¤€˜û-J¦pZeld‚…q”i˜z›x¨xš†—›y—p˜±˜˜™‰¢‡µ’­qN 63 Ÿ•gŸ–4 z< ‡E `Z €{tP ~` ¾¹¯¿˜„’‘‚Ž‚€‡€ƒ¥‚‰ Ã÷­Ñ—™“’–š¢”. C ~— ™¤¤¿¸fXƒf~mxtptp~lsw”œ|x ƒª³Ž¸Ÿë²÷'£¤‹Š¥Œ…wd€|V\‚cY…gvl—|£­¤¥¾› Q‚†€ˆ}Š|Љ‡‰€††€Žzu B†ƒ} ›xu€¢¦”Œ•Ž•‘¡ œ€tù' ÷‡xû‡ü¤Œ¦ÉR÷«÷÷!ª~špŒL©øœûzp|Ðt½nªr¥i›`^Œ>ŒûÇØ˜¦š¡”­Œ¹¦ûÖpç`Äg>ûÈ™Œ‹¢ŠŠ¥œ‹“È·—¢¨²ª§Çœå øG÷aˆNtXbb`_UwLYcmªj­{·ÂËžÀ°µ¸³Â¡Ñ÷Î@û„7…Œ—Œ˜˜¯…©€¤ª|ušm^Œgwpasf~_ŠXˆ$©Vʈ±ˆ«¤° ª™µ“¿ ûº§É¥LŠøÃ©~šqM©÷»mMp}“ŒüÈU  - ˆ‚„€Q ”œœ˜¡| _ uP p øc÷iˆErR\``dZzTŽOb£u¸Qû¶Šr‹ŠYŒäø+ª÷*ÑÖ÷ŠŸ|lª­jš[ˆK6˜Œ–Œ––±‚©z }x”s¨¼eеž°˜ £”Ÿš l™—“; ŠS «lû¬©Æ¤˜˜¥÷ªûœŠûªq˜~¤Ækû«Œ¬Æ¤—˜¥øË¤~‚ P©ƒQz ~qŒû“÷œ÷“¥‚ QŠ©ƒPr~~rüÏxœz ýùq; ‹‡ŠˆžŠ+t9^G=XEd46E±ÖUYÑrÞìå¤Ü¾ÔÚÂϲÛçÓe@¾ºH¡8‰(ûêƒÓzºÕqZ°DDYe?pzZ‚D0.“Dš[9¦¾bÖÓ¼µà¥šº’Ñæü–÷Ĉ‚„€Q ”œœ˜¡o ˜˜V ww‡ŠS ù! |zuw _S£ s2§e \Š•V’ ±K f D…›‘ •‡–— }²…Œ}‹‚Š ~­E Œxr”z– ûûMò ø¤ŒT|_kjpogy`„d„Qˆ>ŒŒû r˜~¥Éoû»§Ê¥˜˜¦øÇ§}™pP©÷À÷"ÓQû Ž2Šê‡]º2*ŠŠûÄÚîÊÉð‡ Y ˜ v„|x‚ƒ†€ˆ|Š|‰‰ˆŠ”Ÿ}²…Œ~X Љˆ‹ˆ} œxvœ€¢§”Œ”•‘¢ ‹’‘i ] Ø š}š~ŠŠ ˜a š–o b¢I] ­Ñ–™‘ . Ž––‘x ÷•ª÷Z± v„|y ¦L œ›¯¢À¢‹ k ¢ —œ’Œ S™— Œªœ€ ‡‹Ž s”w| ^ £ tJ¨»?¨Y ‚Z Sct ù. ’ ¸‡ {i ™¦ C }n ŠˆXy˜n’”•’•˜¿¸gXw  {v ‡‹† ~ ˜˜’œk šv ”ªŒ ’”ˆ ‹{0÷;„˜†—ˆ• ‡¢¢¤•”ˆ„”’††„‘|“g–R …Š 𬓠M—~­E Œ • ‡ƒ’ š…Ÿ ˆ€> ˆ€‚J w†Š‡Š ‘”–  v‡ ¢Œ ’’ ÷ r…w|yuw}u„››••’Ž–– ýì¨ Œ~‹ _ t’w™z¡›…Ÿ¢Š ° ˜ž øC š¢m ½ûzY ¡us û ÷ªm •†€ vy‚x|xuvsvy€†–  vø¦Þ­¸ z– ‡‚„  ž †ŒŒ Œ“ š–‡ –™ †h Œ…Œ…†mzpitzu…  v Œ‡•Œ”hT –Ž” ~p €††zŽu z }p b¢I p Ї‡‹G¤ ®¢À ø1†àøVÞÁª­¸ ¦~™pL¨ s €€ €{ ISc ÷ö ‚’ }™L ª m p™}¦ — bv ¶  µ¤ €u› 6"`XŠŠ <>@\fhow‰–ž¤©‡ÿ‡4mI“ö­²ŠÄý9ï DRfzäˆ4w)Ë Ý ~ ¨ ù  - K É ß ô  ! ˜ £  Y H o Ì ø©8K ®Ë%.DZnƒœª¸ÅÔâîü *=I\kzˆ©¼ÍÛìý(8KZiwŒ›®¿ÐÞó#.?L[jx†”§½Öï+;Oiƒœ³ÄÛì!>[u‘¦½ÍÝæ÷ *;M_n|ŠŸ°ÁÏÞíþ0BSaw–³Ðí ":Rj‚œ´Îæþ,B\tަ¾ÎÜêø$0AVf}…•³»ÉÐÖciovo±·½[a¡¨­±¹¾ÄÈÊÌ2÷ M !K!M!O!«""¹#q$Z%%€&_&ë'p'r'Ï(ò(ö)s*"++£+®+¹+Í+Þ+ä+ê,,,B,à,ò-8-E-u-¨-¾-û..).6.N.‹.¯.ÿ/R/™/ê0,0‚00Õ0à1(1}1ˆ11¥1µ1ì1÷22<2k2 2é33*3Y3d3›3ß4!4C4a4l4u4›4¶55B55Š5Ÿ5³6G6T6j6|6‰6Ï7j7è7ê8‘8ä9#9b99«::<:]:j:u:€:‰::½:Ã:ç:ø:þ;;;;*;4;C;š;¼;É<)<ƒ<='=S=“>>†>±>ºûÆûÆûñ÷UùUƒB|/~BAB}ÔÕ~Ô|ëƒÔ½ ‘–œž˜œ”Ÿ œ‚y—–{‘xu‡üÓ[ ûC÷óù6|†iV„h„g„g{„¯…¯„®” ¡Ÿ ¢ wtûR{†hV„f…g„g{„¯„¯„®” ¢Ÿ  ¡xw<ø—ø<û sû-÷[ûiûs[®÷sû)fûs\¯÷sû»÷ £÷-û»÷ ¯÷nºhûn÷,­÷n¹jûn÷û<[û*qû-÷,<øq÷>Tw^bifl\zR‡1håUW›«X€ƒ{ˆw|÷R›œ#ÇWðŠ÷®J¶a¬v¡d´x¼Ã¼ž³±¨®¦¶™¾ŒÏ®GŠ·|«o˜““šŽ šû={~ÚNÁ;ûœÌf¸l¥r·`¡[Uû÷”÷Šqs€uttu€srn—o£r–¢w°o÷/û¯«}§p¢qžqpžûÒŽ¼ÁÐ÷¢1 ÷hùŸô:eXcKTR«ÌNJ>AkBS_™¦ji¨zµÂ¾¢¼¸º°°¸«Â¥t̽¬¹š²¨«¬¨±›¸³¬€u¦¨t™ld@UOû_»1ºA¸Rž¤Ÿª °¦º˜¬Ÿ®q›V‰ª÷™lTŒXj]HhRgRhRNÄÀl¼µ«œ¬¢ûÍøn£ƒ¡|ž {w•sUpgDf™\§S¬›§Ÿ £¦¨˜ªªjüp\ÄWÞP÷aqlsxtpl}gc6ÈU฼¢º¾ü4÷Bøño~mpjrlpvp€¡’žšž¢Ÿ£• –†‚ƒx‡ƒop¢¦¤šw’tqûo÷ò;}{ûO÷-÷,÷Sè¦àÁÙ¼ÒÎÇâ»–yû9IûûQ#˜7¤K©>ÀI×Tûo÷Û÷ß1p7U=XBGQ7_‚›÷àÌ÷÷OòàrÌmÞVÌ?»˜ÜgÏJÁ.¾2¥10û[ø øEvyyw}u˜¦nwwvžŒ‘u–j”nu}tyutsz¡£™ “¨”¨¡ŒšŠŠvydgpnv~~t{š¢Ÿ œ´š¨”©•©”1¦b™v  ž›¢—Ÿ~p¨°hŸy‰Š˜‡¡‚ªƒ¨‡¡™£œ¡¢¢œus}‡v‚n‚l†uŠ~ŽŸ°­¦¨ ˜— žzvvwzb}1p©‚©¨‚´| zx€øÃ÷|ûzû|H÷|ûzÎ÷z÷yÎûy÷zûï÷WŽn}lolsppvm|„•ʳ«²²š„“}ƒyƒƒrv¤£¨¢¢¨¢Ÿ‚xœ›y“vtû ø÷|û¶Î÷¶ûø÷N»goohfpœ œ ohûÊ÷Åù]ûœýÎU÷œùÎDø‰÷ò>x?eB2\P_C;M¶à`hÎzÙãáœØ®Ðâ¶É·ÚâÊa7´©Lš;+)ÖƒÍ|Ääsd¸VVd^1t|RƒIAD“JœN2¤±^¾¼°¸å¤Ê”ÍÎDøEû»ªÈ¦˜™§Œø°DD]÷8÷7µý ¡ ÉDøw÷NgûNüм“·œ³ž¹¹ÅÒÒéèºÛά~¨r¢ so•kƒƒ‹Š„t†v€yy{|€z†yŽ‚„ŽšÊ´³ÍœŸŸžÀ¶{k®°iœ^ŠT‰IeFBBRYSYRY~~~}„~Š~÷yŠº§©Æ’Døm÷=ˆOs^\lodY}NCV¡¸h}œ„œœ—•””’’”Ž–—•‡„’†–wšjœf¥w®Šä†¾Î‡ëˆÆw¹eªi¨`™WŠ©Í» ©²¡¨–®ŠµÃdºLpq…q~t{}€zІ‚†Ž‡†˜¦¡¡«¨œ§“§Œ÷ ‘ÉY“ Ž^ybddggewc‡Àˆ¹u±b²b\ŠTDøûÂŒªÉ¦™™¦ŠÍx8‹Œû'¢î÷T÷Y÷ý¶üòT$ŠIu ¦ÊûU÷7÷òûWûòDø„ùY…„„}‚x‚v…ˆ†;‡W‰tŒd\R‚û)šŽ™ŽšŽŽžž”•‹Š•Ɇ¾r²]±^ŸUŒKAxMdZ_UNp<ŠCU¡¸h~œ„œœ˜•”“‘’”Ž––”ˆ„“†–wšjgœ®sª¿²¤½¤ ´•¾‰ÆŠ¶}°q«o®g^nn‰p†z‡{‡z‡™÷Ʀ•ð~óŠö—Œ‰’˜–Dø‡÷nŠHsS]`b`YvP>R§Ãek»{ËÚ™‹™Œ™Π̲̲̽¾Ç±Ä¯ÈŸÊŽqUˆWpXYddh[nQrZ~iŒw‘’˜››˜ž•𥧒¨Ç»zh¯³džQˆ@,“÷aÆ7‘il{nhtp~tŠxŠ|Š}|N•X a_ ¦u¬·¯Ÿ²§¥²˜»ÆDø‘ù1NûVû\ûk_‚uuht}¢¢Œ»¯åÑ÷§¼§»¦»³Ó¦Ãš´ûŠv|t‚ˆ‰ˆq¤÷C¥‰u÷æDø‡÷_ŒHsV[dh`SyHNŠZ›e«b®w»ÊŒ´›°ªª¨¨®´’fšl£r«o®}°²Ä ¸´­°«»›ÅŒ¿Œ·~®o²mžcŠX‰@^^2{¸{²qªh°b]ŒY$÷ú؈\·Bkmvpnu|plel¯sމ®{ÌlÏ®¬·‰À¤ü!»v°`¦džcŸdž?fdSŠ>Šf™j§o§o¬}±Š²Š­•ª¢¯¦°¸D»øŒÎ£Ã¹·´¶½ŸÆØÄoS±«[›K<~‹}Š|‡HuJdJdJZXOeRgNwLˆ¥ÁŽ¿¦¾½²²®»¨Å¤¼˜­Š †…‡…‡„}{{~x|qo„nO[œ®gd²xÅÖêƒûµPß…­‰ª›¨®¢¦˜¢ŒžŒšŒ™šȾwµ¸up¡j_gwcppd~[Pûó÷Oø& hn¨®¯¨¦®¯§pgûögnohgoœ §¯®¨ohûâ÷Qø&hnngho¨®¯§¦®¯¨pgžüf~fpgfnjxf£º˜´ºº”‰’‡‚‚‚†‚gn§¯²­¥³¤ž€t™–x‘uq€øÄû#ü§øÂø§øIütûòøtûò€øÃ÷Öü£Ïø£û¢ü£Îø£€øÉ÷Šü¨üÍøt÷òüt÷òÍø¨üûø7øÀ^{`jdlimilij^zWŠP{‰ÇЍ‰·–´ ²ŸªŸ©Ÿ© ®–®®Æh°Rtw†€zx~‚ztx›}|soxrnp£ª·Ÿ­³¤ ­³•º½´t¬°pf[ûü go§¯®¨§®¯§ohû’÷Ìûûqùë÷qlû"ý¯÷"û’÷–ûûp¨÷!ù¯û!ª÷p<øžûüž½øžü÷5ˆ §˜©¦¬¤ª¦ ¦–”…“’¨¥tn(÷ùû?tTŠd˜u¨z¢‚®»›Œ¤¬Ž­Œ¤šÜo¼SšÚ§¸×›‰¤ˆ®ˆ®Š¥œ¼•° £¥©¸šÌŠN|mZ6|ŒrŽiŽiŒr{8m[P|Æ{©W4|Šs‰j‰kŠt|6©\Æ€ü÷Hù]Î(ø÷¡S|oZ:{ŒriŽjŒr|[‚hztvnd~TŒtÆ–©ºàšŠ¢‰«ЬУš⨿ƛPšn¼ÞšŒ¤­Ž­Œ¤šàm¼NšÌŒ¸|¥mŸs•fZzŠqˆhˆhŠr{@§]Â|hø¸÷Ô÷ï* ÷S– ù„+üÒø* ÷ƒ– ù¿$üîøâ* D– ø„.ûïøå* ÷Yn ù…+ ü„÷›* ÷…m ù­! ý÷R* ã ù($ 8ø.)÷Hùy+üËøM)÷ƒù¿$üòù!)Iø‰.ûøù$)÷[n øX÷Wù‡+ üŠ÷Ú)÷†÷w÷÷÷WùÄ*ý3Ê)  ù±! ý ÷‘)÷ˆP‘Þ­¸ùÄ$ M÷r& ÷ä†ú+ü¶÷‘& ø-†úi$üëøe& ð†ù0.ûîøh& øn ø®Þ­¸ú4+ ü†÷& ™úY! ýÌ& ÷•PÞR¸ùÑ$ K÷p&÷óuR¸ú$+üº÷&'‡ ÷c¸!©ø]%ø:uR¸úv$üíøc&÷uR¸ù:.ûíøf&øn ø¬ÞR¸ú?+ ü†÷&ø=÷wøKÞR¸ú{*ý.û&ø=… R¸úe! ýÊ&÷wPÞU¸ù³$ Mø)'÷ð† ú!+üÓøH'ø† úZ$üíù'߆ ù.ûîù'÷÷n øªÞU¸ú#+ ü†÷Õ'ø"¤ úJ! ý÷Œ'÷pPÞ¢¸ù¬$ Eø?%÷Þu¢¸ú+üÐø^%øu¢¸úW$üùù2%Úu¢¸^ûøù5%÷ón ø¬Þ¢¸ú+ ü‘÷ë%ø÷wøKÞ¢¸ú[*ý9Û%÷b ù»$ ?÷Ú( ø– úU$üîøÍ( Ú– ^ûïøÐ( ø… ¢¸úC! ý!÷¢%÷‚b ù¾$ =÷Ù% Ú€ªùª^ûîøÏ% ø÷wú[*ý/u% øm úB! ý÷=( øm úC! ý÷<% ø– úU$üíøÌ% LÈ ÷F¯øŽvz" ÷Xù°* Lw ÷—¯÷(÷WÞvz" ÷5ùï)L„ ÷Н÷~Þ÷vzúz¸" ÷aù3& L{ ÷“¯÷|Þ÷ vzú¸" ÷jù1&L{ ÷“¯÷|Þzúà¸" ÷²ú%L{ ÷“¯÷zÞzúޏ" ÷¼ùê'L{ ÷“¯z" ÷Tù›( L{ ÷“¯z" ÷Zùš% € ÷5v!û¦üA#÷Yù°* &øP÷Wû)Ù÷2v!û¦üA#÷rùï)€ eÞ÷v÷%¸!û¦üA#÷¡ù3& € cÞ÷ vÙ¸!û¦üA#÷Äù1&€ aÞ÷ ¸!û¦üA#÷Ïùê'€ !û¦üA#÷{ù›( € cÞ÷c¸!û¦üA#÷Êú%€ !û¦üA#÷©ùš% £ùlv÷·Ã û´ü#÷.ù°* — _vøV÷Wßv÷·Ã û´ü#÷"ùï)£ø©Þ÷v÷¬¸ià û´ü#÷Qù3& £ø§Þ÷ v÷y¸œÃ û´ü#÷„ù1&£ø¥Þ÷‹¸ŠÃ û´ü#÷wùê'— _vøªÞ÷·Ã¸ û´ü#÷„ú%£÷·Ã û´ü#÷Jù›( — _v÷·Ã û´ü#÷fùš% L{ ÷“¯z" ÷aùB=L{ ÷“¯z" ÷bùÜ/L÷˜¯z" L{ ÷“¯z" ÷!ù0- L÷˜¯zø*ø€÷Ôü/ L÷˜¯z) äø7€ !û¦üA#÷¬ùB=ûæûa¤÷Êù7PüŠO ûæûa¤÷©ø€÷`üO ûæûa¤÷÷ (÷ø&: '¢÷þø€÷¥û‚= '¢ø5ù7ûô= '¢ø)÷¢"…÷: £÷·Ã û´ü#÷XùB=âb ø€ùñ7÷;ýñ# âb ø_ù|€øBý|# ÷b ù@$ <÷o- ÷S– ù„+üº÷Ž- ÷œ– ùØ$üïøb- ûo– ÷öùñ7…ýñ-ûo– ÷Òù|€÷˜ý|-E– ø….ûØøe- è÷wø©ùñ7÷û„' è÷wøyù|€ø0û' ÷ž÷wùÜ*ý/û- ÷2ùaFüw÷1)×b ÑÑù$ ÷#ü_#û`ù°* ä÷•ª÷0÷Wû-±ÏÑù)$ ÷#ü_#ûqùï)÷P‘Þ­¸÷ÃÑùÉ$ ÷#ü_#û`ù3& ÷’PÞR¸øBÑùÎ$ ÷#ü_#ûZù1&÷PÞU¸÷ßÑù½$ ÷#ü_#ûeùê'÷pPÞ¢¸÷ŒÑù¬$ ÷#ü_#ûcú%÷b ÷{Ñù»$ ÷#ü_#ûiù›( ÷‚b ÷·Ñù¾$ ÷#ü_#ûkùš% ÷‡– ø ÑùÃ$û_ûl#ü!ù°* ÷÷ýÑùÌ$û_ûl#ü.ùï)ø.†ùÑúj$û_ûl#üù3& ø:uR¸ù„Ñúv$û_ûl#üù1&ø † ùLÑú\$û_ûl#üùê'øu¢¸øïÑúU$û_ûl#ü&ú%ø– ù ÑúU$û_ûl#üù›( ø– ùÑúV$û_ûl#üùš% ÷ˆm øÑù°! û{üü#ü.ù°*   øÑù±! û{üü#ü3ùï)™ù\ÑúY! û{üü#ü*ù3& ø;… R¸ù‰Ñúc! û{üü#ü)ù1&ø¤ ù_ÑúE! û{üü#ü'ùê'ø… ¢¸ùÑúD! û{üü#ü5ú%øm øÿÑúC! û{üü#ü+ù›( øm ù ÑúC! û{üü#ü*ùš% ÷un ù¡+ üˆ÷- ÷m ùÅ! ýÉ- ÷œm ùÄ! ý÷~/âb ù'$ ÷#ü_#å– ù*$û_ûl#èm ;û{üü#€ !û¦üA#÷kù0- € !û¦üA#€ !û¦üA#÷ŸùÜ/£÷·Ã û´ü#¿ù0- — ÷·Ã û´ü#— _v÷·Ã û´ü#÷WùÜ/ü>÷4ù* û“÷àøž: ûqøøì( û©÷Ìøë% ûm÷Xøl…‚j”`™W{÷c ûa÷µù06 üG÷Gø- ‹¬‹Š&÷Òù-/âù'$ ¨øÝ÷UŒNtZ^gld\{TûØŒ§› øÇš÷挺³~q«°pždŒYŽ7KJ#x¹…´x®k³fŸ`ŒYû÷õ¬ƒ¨z¢§vm™c û®猰Œ«š¥ª£©—¯´˜ûùо}¶n¬«oi›c1ûä÷µ¬Ÿ²¢žª•­Š°œøÖ+åù*$ûo÷ð.÷&ùTŠû¹ŒªÆŠ¨”œžLôû÷U6Eû{U lûºŒªÅ¦™aøÅ¨~™qKŒ¦÷»ŒpLp}}nû²¼¸»·¼·ìç»ÂœŒš„”|‚Ž}‹yЧ÷{pt}ŠŠ‡sW_;<ABff‰÷qûêc¤¢}Â÷°ùâù5Mp}|nŒüÀn˜}¥Êmû»©› ø²ûyüîwûløîü±¡ ÈŒŒlû‹Œ©ÊŒ¥˜—¤øÄ©šsHŒª÷ŠÒ‹–Œ÷Lü¡÷]ø¡e‹ŠÔíÀ÷6ù{ù6M•ýiü<øüü®U oû‹§ÊRøÇ§~™pMЍ÷ ŠÊ‹•ŒøüºŠøtš÷‹½øò+ ‘øÉF÷ù8û½§ÂŸ ž¢’‰’‡’û÷p!ûTzlƒw‚t¥¾oû„§ǵŸ³¢Œ¤¶¼á¼â¤µŠû1÷£„˜€—}–™z{’}r¨÷¼nTtyxv„„„÷ûSà÷µÖœ˜‚“zŽ‚xŒnЍ÷nRe|lxû$ûƒ÷8ûÁ”|–}™€~›š„š¤èù/*¤ø×ùTü-ý/ÃËŒÄÇŽ¸˜¨£°ª ¿ŽÕ«ƒûü˜Œø0ù2ûŠ?‚czHndL€,r÷‹Lø„ì ûv, &!ûæ÷÷ O û,ø)÷¢= î M M ~ø½øZq}Û{¾x h²fŸcŒûŠüé¢Èoûº§É¦™aøÈ¦}™pM¨ø“½øò+ T÷ûo¸¦}˜p-p}~Ÿ n÷¨_p™~§è§™˜¦·çù'û§ÎŸžŸ¤Š‘Š‘R÷L2÷©4û©ŠŠwLdûˆ„І‡p«~ÌoûƒЍ—¼­«Ê ÷Tøà©×ûˆµû”r§<§;¦;v’§wŸ®»øÏøºo¨¦}™pûño}}pno÷-ø|Hûmû†n·¦}˜pûjp}“_o÷‡§Š_¢÷j¦™a·÷ûÀûMü¢÷M¨ŒSu ¤ø¦™˜¦ŒŒÄ÷)ù[‰û»§É¦˜˜¦÷-÷³Š÷Ñ‹¿ûkCû|s‹Šjû¹û¾¡ Éoûº§É¦˜™§ŒøÉ¦}˜pL©ù,mM•üÈ¡ Êñù!÷sûüÍŒ÷ ÷þû‡÷éø¥•û_m÷xMÃ!ûH÷Qû™ûûÏ÷ЉÔº“œ¡¤žœ¸•Ó÷_ù©ùEs~‚…Šo‰}sŠ^B‰ZˆrƒVybopjiWzE‚‚‹Œ‚~Œûju ¦Êoû»§› ÷i>‰Qšd¬l¦v³‚Á‡¦‰½ŠÔ¸}£o…Œ‚‰~†z¤–¬¤‘œ Ÿ„~«s›PŒ,ŒH“]œp¢f¸xÌŠŠ­÷´¦~™pM¨÷»nL•ŒûÖ͸ž°¢œ¦”ºŠÎŠÀŽ´”¦¼˜´§³𣅀«9 9 ûøeø{Mû:ˆ€€Pz"ˆj†b„Z„v}€„ˆ†‚ŠoxŸ¨œ“¡˜¨”¢•¡•¢˜®À Ò÷jŠBvS`cfcVxHûI×÷Σ·¶¶´»Â‡$éU؈ÇȈªªÊ§£† ­{ªo¦c¤hšjlw ˆ†ˆ~Ÿw£r§l¬q¢u˜ fn–xvvo¥b¾Vªn«nªn±c¥mšw®Y\`8¯€®t®wª{š~ŒVŽcsoVtaYRB´Q÷­ž±¤¡®—»ŽÈ*ø÷?V<`Rhh_€ZvVNtqlpv—¤§˜±¥¼¢¶¡«  Ž«ƒ¿yÓ¶|±x¬v¯xxŠnˆuw~f~Š’‹‘’Ò£°¼ƺ@®û1›B“_|Öç»åžä“¯ŸŒŽž’—”œ¢—vdkGL,LøšøÃŒXx`dfhfbz^¢ˆ¦{«m¶b \Uxˆw†v|Xlg\u{jdƒ`~ŒŒ‚`’c£f¶`ûWu*ŠŒˆz‹h‰•¶ ã¢ìÛ˜ÈÚø¦÷ÆÌç°Œ­ƒ«z½p¥^ŒL?…Œ‘‹‘‘²~¨qž™xt’okoxftyo}h‚a€^oû]ûn¤[»d³ˆªˆ§‘¥˜®ž£ª™¶’ Ž¡¡ÏfÇP£‚xw†xj{—¢ŒŸŒš•¨¥ „~œ¸š«¡Ÿ¦œ£–¬´"øf“€|r…gfr”~hºlÉqØ…m‚Z€rû ~P‰lŠs‹yŒ¢ï¨÷®÷7±Š¥Š™Œ‡|}Or"¤“‘•©˜§›¤žš—ž¢¡¦™šš›“Ÿ¢œwtlozk‚Ž€~}}}~}yy|~…—b£W®Nd¡¥w¨’’Œ’%øwŽ~ƒz‡tŒbkªuÈlànèoñyp~wƒ~q_v`{b~hz]tPl~{{wˆˆ‹Œˆ|ƒ•ž•–˜™°¦¼²È³ÊºÊÀÌ„°~³vµx±w©w¢zy™v•™‹’б±vb±ÀR³>§*›T›S›S¢Bž[šrštŸ€¦Œ4ø"÷¡v\d[TZch]jVjvuu€x®øN¦÷$Yû昑´¨Ð¾¸¯¨³™¸Ž–•–’ДЖ‰˜Š”Šˆ®˜ªŒ¦Œ˜~nr‚lzeûC÷ÎøêLvgd‚RЂЂ‚[˜i¥x”Œš‘¢–¨˜œ“Œ˜˜Ž— ˜ƒ{‘Œ‡‹‡†wzzx‡‡rd‰Vsˆw…{SgoVD‚ŒŒ’UµiÖ~ ˆœ€šzœz“vtgyohx{niƒd‹ŒŒ€€’~”…–˜Ž‹Œœ‘–“›‘’Šˆ“¢…¨„¯ƒŸ‰›–””’“•Š£u™bŽdŽh–mZ§r¶ÆòÂØ÷¿p’wœ|¦~¢…¢¢”й¾ÞªІ…Š„bx™§ŒŒ®¦¡À’žfwzvtz–ƒŸ’“ŒŽ”‘œ•¦ š ’žŒš›yx~„€}„~„f†Pˆ#1@øšø4‰Q…|zˆxpŠon¸^ YˆSˆMsX_b^bTwH\Œdškªf®x¹ÆÌ Áµ¶¶¶Á¡Î³Š¿ŠÊж­”¦û4ûjŒ˜‹–•æk¸KVfwbt|o€_†P{ ‚‚4©`ÈŠ犽ǒ÷ “øÛ÷`û‚û=ûEŠy>fû+kº÷yPYœ¬a`­u¶¿“Œ”Œ”–Ú¹ÄÚ°¾¢½–½Š›Ü›Þ›àœŽ•“”‚xˆ‹cTû€»Œ¹}¶nÄf¤V†H6…—Œ——³€¬u¥¦ri™^Bûó÷ ÐÅ÷  ûK÷CWŒ_|gldkt^ƒR‰€Š€€^™h¨r¤u«€³Š¶÷‡¡÷ ‚•øÚ÷ßr€wŠ|•Œ|t–l–l‘sxv…t€suZdhSu|dbƒ`ƒŒŒ†ŠzCiû"tŠ€‹Œ·÷m0L«Ëj‚‡žŸŸ”œ‘—› ¥ªŸ¢–ŸŒœŠ„…‹†v|‘—„•ˆ–Œ–Žž§›¨ˆ´†n‡Vˆp‚izc|fƒnt„ŒƒŒƒh¡r²~…œˆ ŒŠµ÷sÞøS›Ž•“šŸ•xˆ‹‰Šˆû"ý'¢ãÀ²Ùž‘£Ž®¹Œº¬Ÿ¶– ¡¬‘ŠŠ‘¢†—~ux†€€†ïù$÷õd û÷ð.™ùd Lø„ì ÷øAˆ>; ‹S âù'$ Cø‡‚„€‚€2 ÷ù³5 ÷úú09ºø÷û»§› ŠøÃ©~šqM©÷ºmMz “üÈ¢Éü-ù ˆ‚2 ÷œù¾:÷Ûú[*ý—¹ˆ‚„€Q ”œœ˜¡o ˜˜V ww‡ŠS ÷·ùé~û$=ûûc`÷¤š’˜Œš™Œ™¢û.û|÷0ÝÁ´ç÷Ê}ÂnºÂj^¦QL[qXjn^}REŒH“W›fŸ]®d¾kû0û÷.¤{{ †ˆuš€©÷·û!¹Dï÷-Û©ÎÇÀľѥ݊ÝÏsZÂÅW¨GŒ8ý'÷}rjf¢œwsˆî 'øpqœk  žf ˆø)÷¢"ø‡„€‚€û û kf žwww ‰ˆÝ!rutssv¢¤¤  ££û«rutrst¢¤£¢¡£¤ûæ÷÷ (Ìø¸6 ø)÷¢"£÷çruusrw¡¤¤ŸŸ¤£¡vsûzrvurru¡¤¤¡Ÿ¤¤ vsûæ÷÷ (÷ø}ruursv¡¤¤ Ÿ£¤¡vsûzrvurru¡¤¤¡Ÿ¤¤ vsø)÷¢"—ørk”œ›®¢À¢| #1»øZQ‚‡€ˆ}Š|‰‰‡Š” B‡Šˆ‰‹ˆ} ›xu€¢¦”Œ•Ž•‘¡}šL ©‹ûv, ±ùrj~ ™—’; ‹S &!{ø8rj~ ˜˜’›Tœw¢ ˆûæ÷÷ (éøµ/û,ñø`s ZŒŠ”œœ¯¢À¡? Lø„ì ÷÷šqN 5óƒAŸ–™ š—o–CûMóy˜œK‡Xz—nt“•—¿¹gX&!ƒ÷ ˜žƒ s…w{zuw}t„€œš••’bû,ó÷¾z{ Œ‰`¾6ô7 ž•šF }­EÃEs…wG t„€›š••’Ž ‘˜ŠœKˆ‡ŠŽy˜n’”–’•˜¾¹fX&!£÷Ž’ ‰`¾6ôƒ• ”ÃûûX÷%ry~h‡‡ŒŒ‡~Œ}z~Šz‘~–€†•„šztP ` ¾¹¯¿—•†“‘‚Ž€û,÷÷¼qN 63 ž•šF 4 z< ‡~Ž~z|Š`‡•„›€d™z¡›…Ÿ¢¾¸°¿˜„’‘‚Ž‚€Lø„ì ñøo¸{b¢H]^spا¼?¨Y@A x|t„›š–•’•> ˆXy˜¤’’”–’•˜¤¢ƒ{žŸz•vŽ &!Wžo¸{b¢HS[A@H |t„€›š–•’––™›š}œ—’t’•˜¥¢ƒ{žŸz•vŽ ûæ÷÷ (Ðøto¹{b¢HD spا¼²Ðµ@ @A x}t„›š••’•> ˆ‡ŠŽy˜¥’’”–’•˜¤¢ƒ{žŸz•uŽ ø)÷¢"|÷Þ( î ûø/o¸{b¢HS[@@s…w<|t„››–•’•›š~œ—’t’•˜¥¡ƒ{žŸz•vŽ Lø„ì ôø% &!†÷÷o¹{N]sJ¨»±Ð¶xf¨œt”w{0p0 }–€0¢¦• žœ ¡“¦˜Š•†’€’‚Ž‚€ûÑ÷÷ (åøvo¹{b¢HTct]sJ§¼²Ðµ@ /prz< ‡~Ž~z|Š`0£¥• žœ›¢“¦˜Š•†’€‘‚Ž‚€ø)÷¢"‡÷Ý% î 6ø0% Lø„ì ÷÷«_R£ t2§e &!÷Ÿo¸{–R[ûæ÷÷ (Ñøl€ºg¢PŠT‰gtz_m‘¢”Ÿ–œ³¦°ŸºÀŒ±w¤dš„ xø)÷¢"z÷…=î '÷Ø_S£ spا¼?§e Lø„ì ïø%p††‹Œ‡•Œ”Œh¢—˜¢Ž’’j Ÿš ·³h_–ûv, žùŒr zu…p††Œ‘Ž’’i…~D†› š ¸²h_–&!:øŒr zu…pkˆ”Œ”Œ”ª¢—˜¢Ž’‘j  ž‘™”¢·³i_–ûæ÷÷ (¾ø˜…Œ……nzphszu…qk‡”Œ””ª6„ŽŒxq”z–†›‘‰š”¢·´i_”û,øIr yu…qkˆ”Œ”Œ”ª¡—˜¢’‘j  ž‘™”¢·´i_”ø)÷¢"K÷ó* î ûøRq…†‹‘’’i„Ž~D†›Ÿž‘š•¢·²h_–Lø„ì ÑøUHûv, ¥ù-v„|xƒ†€ˆ|Š| uŸB†ƒ} ›xv€¢¦”Œ••‘¡ “ ûv, ´øspN 6óƒ• ”š¢š–‡ƒ’—4 z< ‡E `_ u’w™y¢p¢Š °¿—„“‘‚Ž‚€&!NøGQ‚‚†€ˆ}Š|Љ‡‰” }²…pŠˆ‰‹ˆot“œxu€¢¦”Œ•Ž•‘¡—ž™œU©‹ûæ÷÷ (¶øÈv„|xƒ†€ˆ}Š{ u }²…a û,Èøvv„{x‚ƒ†€ˆ}Š{ t }²†a ø)÷¢"Xø2)î û*ø‚HLø„ì ÷bøQ‡€‚¥ƒ‰ Ã÷­Ñ–™‘ . ––x ûv, Æù.‡€‚6"`XqÃ÷O&!°øF‡€ƒ6"`XpÃ÷­Ñ—™“’–š¢”}wû<7s…w~3–œ˜}n ~hz—¤¢™¢¤¿¹fXûæ÷÷ (éøÆ‡€ƒ¥‚‰ Ã÷­Ñ—™“’–š¢”. C ~n ~hz—¤ ™¤¤¿¸fXû,÷"øy‡€‚6"`XŽŠŠƒ‰ Â÷­Ñ—˜‘ }wû=8y™œ˜}— š££¿¹eZø)÷¢"Àø-'î Høƒ‡€‚¥ƒ‰ Ã÷OLø„ì ÷øAˆ>; ‹S &øP÷ˆw4HûÛS‰ˆŠŒ‡„‚Š~e“³ß÷ê›Ô’§£Ÿ½x¤fN\JûkfûJŒ€‹‚uyš³¡Ý¨÷Œ’Œw´t¬onuu`zy¦½æVCç¸À®ËDzdFz‰y‡x{ø8rj—ŸÖ÷<“š˜“šTœww…‹‡Š‰ûæ÷÷ (éøµ/ø)÷¢"—ørk”œ›®¢À¢| î 'øpqœk  žf ˆûæ÷÷ (Ìø¸6 ø)÷¢"ø‡„€‚€û û kf žwww ‰ˆÝ!rutssv¢¤¤  ££û«rutrst¢¤£¢¡£¤Ïùù,ŽZzjey~o\…JSŒrx‹~2I€uaPlmP6$¶LávÚ†Ú…Ú…à‚¶a@^vj`uzjb‚Y_u›¬«¡›¸—œˆ† …¡œˆ–š—‘˜•”–™šŸ{›k–”tsrû3™§[H³jÛ÷ ë¤Ò¾¸´°È¢Ý”¬Ö÷ º¶˜¤³•ø½ø‹Vuh]znV…>p6P„}hTup_H;±[Ö|÷f|Ö°eIDFgû€Ž‘‚€’†•–¦¢˜¸˜žˆ†¤†¤Ÿˆ˜§£Ÿ§¨e›@$’E–gš@¬eÍì÷¹Òæ­ž½å”÷¹´—¤¯4‹øáø{JŒ‚e‹Hˆ~†U„*ŒhŠZ‡Nu†|€s†‡‹Œ†v€«‹Œ’‘ –³›Æ•°˜½œÊû/Œ†ySx,†i„aZ„u}…ˆ†‚‰px ¨Ž–’›– œª•¡—®Û¡Ç’²LhЉ„~ˆ|ƒz~z~ƒŠ‚k‰‘ª™¦¢£¦¤§™ª¢Ü‹Œ÷Œ÷΋†ôøív‰JX»÷zíiÞû–ûiy ÷œ÷k}«o´a½û¢ûnyŸ÷ ÷mÝ9û´û@‰›ޤ¥Œ¦÷>÷Rûêäû¶û†û>Lø„ì ÷ ÷›qN 63 ž•šF 4 z< ‡E `Z €d™z¡~›…Ÿ¢Š °¿˜„’‘‚Ž‚€ûæ÷÷ (éø pN 6óƒ• ”š¢š–‡ƒ’—4 y~ht Œ‡E Š{‘i |¿—„“‘‚Ž‚€î T÷ÈqN 63 ž•‚ûW÷&0 }–€|¾˜„’’‚Ž‚€û¼÷÷ (m÷ô‚‡j—P“kw÷c ø)÷¢"û÷S†Ž{Ž?÷C„˜ˆ—Š• ˆ¡ž£––‡„”‘†…„|f‘P’Pcx÷ërvtsrw¢¤¤Ÿ ¤£ usû˜rutrsu¢¤£¡¡£¤ 1±ø1r yu…qkˆ”Œ•Œh6‘…~8 ‘™•¢·´h_”ûv, ´øx —Ÿƒ r…wG t„€›š••’bûæ÷÷ (Ùø& ø)÷¢"y÷v& ø)÷¢"ˆ÷t&üí÷˜ûM#÷Ïú9ºø÷û»§› ŠøÃ©~šqM©÷ºmMz “üÈ¢Éü-ù ˆ‚2 ÷Šù¬:÷Ûú[*ý—¹ˆ‚„€Q ”œœ˜¡o ˜˜V ww‡ŠS ñù6$ Cø‡‚„€‚€2 ÷¤ùÇ5 û½÷¾ø“=ü>÷4ù* ûø¦Þî¸øø„& û¤‡ —¸ø&ø‚&üR ÷öù@)û¤ø¢Þî¸ø^ù;'/ Qø|j‚€{xJû%w^‹¥Œ‹‰÷÷¡ ‹¤€˜ûJ¦pZeld‚…q”j™zšw¨xš†—›y—p˜²—˜ž™ˆ¢‡µ’­û–÷æ÷í÷÷vø&¯o¦ghnohh¨n®¯§§¯û¤‡ ±¸÷ÅùQ%ƒ‹§ù«÷–åøÅøy‡÷nŒŠüŠŒˆûo¥šÞ𝣤«®¸‘ÂûÂûÀo{~rMo÷¼û½‹÷¼§Mr{˜§÷À÷ĉ¹„«h£ršgš8/ !÷Êw·J÷%{Ÿ•i•}y€}‹r›xu÷ûŠŒ¦‰ŒûO÷ ²‚e«Zppxiµ„¢™Ž˜y~ep}y€—zš¨ž›Ÿ˜œ”¬…¥I Iøq- ‹¬‹ŠKø„ì‹~ŒŠh}sqqoy¢§Œé÷Æ:uûŒ°ŠÝ>œû£û 6~û|û*ÜMîŠÒ« º¶XŠ¢z´°¯ºÆû*xˆg:vekQ\ˆwŒEŽkÍ÷  ÷ѲÉÔ~…ûŠ~¼÷™o¾e÷ sµ‡‘…„efe–p•|‘…÷ û)‹«‹‹I °ù–§m±dx„ˆ……ˆ†saaûoXŠŒ¬Š‹÷÷ ‘’•™•ûç÷÷ ’ tBb„wŽg’Žº¢îõ¤ªèˆˆDˆŠŒ‹Qûk‡C3†»m´γËÍ™Cø - ‹¬‹ŠûøG÷a’÷GÖûŒû&A!û‡ˆû×Kê„÷‚åõ‘÷7…|/b198‚âÎæ»ôë‰ÝŠ“û ƒT]÷¹n¿f÷ rµˆ‘…„Ždžge–p•|‘„÷ û(ŠŠ¬ŒŠø)÷¢Ä’ØQl†xqŒŒjŸcg‘û^KvzhoExhºn±«Æ¥÷"ïžBy?u:‹¢Œ‹›³¶‚À€Nû€$*€àt±ȹŸ»´ÀÈž÷®û÷rn¿f÷ rµˆ…‘„Ždžge–o‚•|‘„÷ û)ЬŒŠ/ ûˆ÷Æo¾e÷ r´ˆ‘…„efe–p•|‘…÷ û)‹«ŒŠ&!H÷- ‚”ø(Œ÷¾˜ûx‹ #eÿ ª Ñ ª’ øJøí¯…¾RZÀÄö7ªîõ‚å¨³Šž¢©0qv{¾ÆÍÐÙÜáìòøü fjpt¼ÁÄËÐÔ×Ýãéïõùý "'KOwž¡¥ª¯³½ÁÉÐÔØÜàíòöúþ    " & ) - 2 ? D H L T X a j o ƒ ‡ ‹ “ — š ¬ ² ¼ À Æ Ï Ó × Û ß ì ô ù þ     # ' 2ù3÷OŠW{^leah^vTfo‘˜woœvª|¹ ‡‡ŠG¥’t’•˜¥¢ƒ{žŸz•uŽ ø„ì  PVdKk‡”Œ•h6‘„8 š•¢¿Œ¸fNž‰+t9^G=XFd36F±ÖTYÑrÞìå¥Ü¾ÔÚÂβÜæÓe@¿¹H¡8Š(ûêƒÓzºÕqZ°CDZe?pzZ‚D0.“Dš[9¦½bÖÔ¼µà¥šº’Ñæ ÷í™x€u„qˆŠ€s‹fZ`œ®ff®yµ¾’‹“Œ’’Ǥ»¶°¿Èà›î…g_Œ^‚^x\wc\ˆ`÷P„YûRŒf’l˜tb¡²wñ«’™¥Ž~}Ž~ o¾e÷ sµ‡‘†„Ždžfe–p–|„÷ û( |xû=7s…w3 îù3÷OŒåiÐS»€”{‘‹‹‚z‹‹”„”²Rzû‡v^ƒp+A3„Ƨ†™ºÞµ¾u¡lXSk†…^ŽgŒpI~Xg`Ug²Õ‘—÷)Þ²­‘Ž‹‹ƒž‹‹}‡ˆŠûg7)…û +†ÅLÝÅΖï¹&©Ã~É÷ ŒËðì ry< ˆE Š{ ù»÷–MyPgSLbXkP2_ºêƢºÀÀº¿¥Åª¦€t  t–pkû$øUü&ýeXøù!y_`‚`wz|”l~QvRbSN^YmS8a»ëƢ¸¿ÀºÀ¦Ä¦¦x¥x¦¨‚«ο£¼°÷<üZ¸m´_bekKimS|X]Z¡s¶¹³¨Ä­ª¾›½¼ü*÷Ùˆ›…§†~’w–•z†fgkKjnR|Y`W¡q¶º³©Æ®¨¾š¾½ û û uŒ€‹ŒŠ”œ›¯¢À¢? ó7 CûXh ÷‡yû‡ü¤Œ¦È¦™aŠ÷«÷Œè‹ºŠŒª~šqŒL©øœûzp|Ðt½nªr¥i›`^Œ>ŒûÇØ˜¦š¡”­Œ¹¦ûÖpç`Äg>ûÈ™Œ‹¢ŠŠ¥œ‹“È·—¢¨±ª§Çåýø6ˆ‚2 ›ûû!tŒy š–’›Tyvw ‰‡Ýûrutrsv¢¤¤  £¤û¬rutsru¢¤£¡¡¤£‚A @‰ è;ruursv¡¤¤ Ÿ£¤¡vsûzrvurru¡¤¤¡Ÿ¤¤ vs÷qÙ’ ¹zb¢HD tJ¨¼²Ð´@ ›Tœxw† ~h†‡‹Œ "›š}g ¾8xe5 @s…w~|zu û û  ––\ ]] ~Ž}z| R – <} s…w~< ûv÷홊ƒ³Œo|V‚dei™v³v±Œ¤§÷RŠ’½ûPŽ·´¹¹Ÿ¸ž¶•¹‰‘¯^[†_O}![zûû~ç2󻻇¥¶ €B еx ›U ™øÏŽûû‰ûHŠŒŒŠã÷÷Cøp¦ŒÞûÞûÝûûÍŒpÛ÷5TT÷5pÜŠŒOû7Oû5Oû4÷yŠ÷‹ŒŠ`¾ (’wšz¡ J k ¢M c¡—˜¢ u ¦É “›Tœ ‡•„š€ ‹‚І Žz W goœ §¯®¨oh ™Šœ˜ o B uŒ€‹ W { p£ o‚} ›xv€¢¦”Œ•Ž•¡}™œ—œ’œŒª“ P àrvtrrw¢¤¤Ÿ ¤¤ usûžrttsru¢¤£¡¡¤£¢ustywttyŸ¢¢¢¢wvû„twwvtwŸ¢¢Ÿ¢ ŸwvYxs œp Š ÷&r }–€ i…Ž~@ ’˜ œ›˜¢o †àøßª p ¿l ~ˆ ¨ …Œ……nzpis ˆ‚„ ‡‡‹ p˜} „ ‡Š‡ \ }n hy—¤ š¤¤¾¹fX‹ŒŠ”S p~ Š‚‹ ¿8ps“ •l Љˆ‰€††€zŽ &ø~Ù ›ž ˜r —™ ¡E t’w †àøTÞê  vø¢ÞU¸ ø¤Þ ø–avvbrv–¡{}ž„¢¦ ‹z ¾¹ ¾l ¤–Ž –– rzŠƒ‹Œ‰`¾5󂕇– øP÷W “’–𢕠p œ€tÀ†­š¢ Až  v îŒÅ § Ÿ÷=÷Eû=÷G›¡ ž‘™•¢ ÉR §¯®§ goog ²›² p^ ÷‰†àø÷W§ª o˜}¦ w†‹‡Š ct^ †àøRÞŪU¸ ''ü;ªJ  .g@--¹~7~"’N þ;àeõ;#ÿó{RD-D8z50ú; ;NN N!Þ;[[[& ÑösÑGö‘6 K½3x& \ 8xrrfÜ@ÿ÷ 0Ö\  *­Õ)¶Õ)¯HJ± H KNM©ò¾ÍöZ¸õ ÿÈØ<µã­¼ç5£à¨¸âDÞ¨àG¨âßàÞ********ô ô ô ô ô ô ô ô ¼!¼!¼!¼!¼!¼!¼!¼!******ô  - ¶¶¶¼!°°Éa~5~5¶"¶"c÷¥²RWF5DGLUóÿåÞÞßMNöâáàà:ba°³"¶5ô ô ô ¼!¼!¼!¯Z |[D €ÿÜŒÿþ¦ô•°v5j³"~5ë#u+û&‹,_.Ç=¶"r**wô -Õ)¶¼!g g L(‹,µ‰@î.¿<$¶5¶5Öà+{#Èøÿüðó *¶"ª1ñÿð ac!½-i"n&*°ÿòUÿí¿+ˆ!a |¼!¶ÿþ¶¶ñÿðwô -Õ)*ô Õ)ô Õ)*ô ÿú¶¼!*ô ¶¼!*ô ¶¼!*wô -Õ)¶¼!*wwô -Õ)¶¼!*wô  Õ)¶¼!*ô -¶¼!ÿþ¶c*YÂÿþ*ÿñ¼!1ÿܶîÿðwÿì¶¶”ˆ!O ¿i0ÿÿ¯]AIE›ÑI™¼!WbIQ/¼!w*wÕ(¶¼!ô  ,latnÿÿkern G)ÿ¥ctherion/thbook/pic/src/ageom.tex0000664000175000017500000000061411026006144015703 0ustar useruser\pdfmapline{+givbc10 givbc10 …å|y[庅Í&[ÙÄIòÊ1SŽÙÚ™/VG‰aÁLÆ/ïo€Fƒ¿†fs¬šÔDš¾t‡súrïéËo¿ÿÙ•GÓó-×9©I®VL§ï,gxR½í~þ¤W?ýðÛÀb¿†ÿ†UÂ3?úí¤úã_Žžžž${ê³Àõ$ÛšH¾yô?fÛì(ltT=ýP©¼ì`À}7ÿ–gÝM³â°‘yR½cý†ž;qÕY«y»¾k»^å‘Ù'Õ÷ñ§z4ïæ(ÑÏŽ¾ÇlhÞy&ûg{×rø1 ž®Ç¦·ÚíhìúVØ$˜Ž×šlé'úù¢Í¼•6r†§ÏÔ³Kš±ìkÓ…n5Œ˜7´œu;áÜØ³‰ ’N) 'C3tCn¨ ò<'ÙÍÝ•kÎ.לW®9Ëï]/𘬛¼s]ÛdÎÌjàML~;~ŸÙá-¶kX9Fqo›rý÷Ìö÷ÀìëÚ²"wèYƒÝÀM´ØÒË“5z?M׬÷© Þ-ߺ³ÍMWo9AaÝO‹é~õ¯³÷òôœwì·­ËÃ@75S˾< 'ÖÀôSn³d›-==Ì›¥Íúj»}'föÕÊb›°ÙÔôæÝÿ±\¦+ó?ðœq^Ì‚{÷·ÙæÃ»ýÒª|ªœÛÌ÷«K—#t8¬ÁIõFNÎÍêhžBÚ[›œ±»¸ƒ´Z}u¬ëL±­ë»»Õž½ð™3´ÍYïªdh5-üqL‰j5B¥ºÆgÏ´ÍQ¯ïzκ3PÄpâîc¾XÒ3Wè1%‡­Ó>ÛÕ%-iŒs`+žQÂ/úvÛù³ù}£o”Å„˜žéF·ë6C¹M„ø™N ¬vžËúkv­¬™¦h2{¦ï÷|á¦ÜÐofAHÂL=/Q{*éYñ*oHóN˜'÷ÿ¼ÅVØ}ˆÏ^ÿ­ç‚6U™¯ÿÐÕ¦êåÚ¿åáPæ´poÙvº…ä“m6 ù3;Ç vìÞ½»N`Ñw•{6²ìéIuä:®?f}³Zñƒiä„Ëü¬‹swâY¦Çgÿ™Üx®@× ¹„±kOG®7~°ú\WQÈEô#'*úoú%ø,ÄäÂúâÏpeÚf`õYÎ?÷•è]ɜ޲š/Èzd!Õ"ÅÜi©vdI—“µ˜•g6y/‰šÖ-·®(s/ïOaCÚ구>bNFö¢ñúÓxj,rÅY½¾ØÜñ¿míJúÜk¦ÂÞš^aöÂéžì4X˜¥u‡_œ­Øç³l+˜n2g:“Ñì>S^F²›ÙðŒ±gcú"”öü¾»ùþà6·1Rn¾žušínð|ŸìðiŸ}i–†œGæEœ@óö‘óù¶Õê>€àßîu·è:‡L¹Òeœÿ(%=‡Ð3Eežû÷“©øY™/Mòf I]h šh‹4Õ$Y«…_ˆÍAóhŸ$´!0çl”s>Ÿá;ÍÖu»‰¼3òÎÈ;#3òÎÈ;#3òÎÈ;#ïŒ ‚0¯)~9SI#ï ø>ÿ:€NiйùzÓ»8ë–Ÿ L`ØyûØiþõµð<xZÍöe÷ª4àD!À9ˆXÁç³óf€ ]Ü~m]Ÿ‡^[Ù|  ~ ˜3`Þ ò©òÃþ`Ö嘤ƒ4·tP‘hM)T$¢iµ†¤“º$«ZÍ8µƒ®<ôâkÏ2¢ -T©¾G cg‹ÄñÌ£p=kƒ&nÉòšíå1²ã§Ì…M×s'A²ìZ¡0ˆõF)ÂLY’õ¤zÒhp*éæ=æyîSuŸ‰äì»g›Îp÷ˆ´üFRgW‹ë Ò¦ˆæíZÜ -M5?}×qBòŠÖŒ5‡íùHå!$æ¹¾+pãòa•åÑ„¶xû¹d~.IžKäõši+W”_l®ä]1¨!TlNõ…Ø\Ñ%=Z.ÄjÍùdz—Ö\j$øL)>W¤zR—DŠŸÇAaèΡ;‡îºsèΡ;‡îºsèΡ;‡î\`ݦfçÛMúY„ô‘ã€ÏrÃ4 !+v˜e4Ô"›„myÛŒòL¢ƒ›¼Cz—ÑÍH.Žà&‚›n"¸‰à&‚›n"¸‰à&‚›n"¸‰È "3nB€‚›¥7µ¼ÁM•Š}M-YÈ6UCRã0§ØÐ&ÿ€ö‰l6$%)D×F6ÕŠϼ,Ä6ÛDl±MÄ6ÛDl±MÄ6ÛDlƒ‘ADoÚr€œ(ŸðÍNžÀðð‚žÐôð¢žàƒ]äï`¹–{³¡ØšÇT]=¦Æ¬ê±,¶ê1M){L©Ç©¼³‘h€ãØ8Žã¯pãxž}ãêJåc¹ã{³z=wmMpeUj„´>¯ òÌì‚ëÙ¯ jCUÒ÷i²»°}ÄïTÙžM×s'A轊rqÊ]BÀŽ9Øq+ÃÑr®ñ6޾†£i GÁp`¸wÅpjÅô¼¼¦R±ÅT²,þ£’ZÂÛ+r iŸâ? II¢N{ëo¯¸ºéâÕ¨„z@¨„z@¨„z@¨„z@¨„z@¢_]9ÞØYÝdGxoä@q´á4òF8£’ãbs7¡…yîF;Viœ¹!†ØÌÍÚ 6„AeI-  =¨×V\î'$¸J8©yNºˆ7c컈P9ï"¢Õ„. sÑj”ú×f뇿þHä’ÒâO;Lä|ÇwªbùUÂ%-:X¬D-VT{g«ËÛ£él,ç%ãÙï6›šÞé‡Ù/á¿¡ÇF§þŠý·—úUtherion/thbook/pic/thbook.jpg0000664000175000017500000022451007677107474015326 0ustar useruserÿØÿàJFIFddÿá.ExifMM*bj(1r2†‡iœÈddAdobe Photoshop 7.02003:06:27 15:38:49 ÿÿ ; ‘(&HHÿíPhotoshop 3.08BIM%8BIMídd8BIM&?€8BIM x8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM8BIM@@8BIM8BIMC‘;thbook4;‘nullboundsObjcRct1Top longLeftlongBtomlong‘Rghtlong;slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong‘Rghtlong;urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIM  moptdÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿöööÿïïïÿæææÿÜÜÜÿÓÓÓÿËËËÿÄÄÄÿ»»»ÿ³³³ÿ§§§ÿ™™™ÿxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠTargetSettings zonedDitherObjc ZonedInfo emphasizeTextboolemphasizeVectorsbool channelIDlongÿÿÿÿfloorlong numColorslongClrTObjc ColorTableisExactboolClrsVlLsObjc NativeQuadGrn longÿBl longÿRd longÿObjc NativeQuadGrn longþBl longþRd longþObjc NativeQuadGrn longúBl longúRd longúObjc NativeQuadGrn longöBl longöRd longöObjc NativeQuadGrn longïBl longïRd longïObjc NativeQuadGrn longæBl longæRd longæObjc NativeQuadGrn longÜBl longÜRd longÜObjc NativeQuadGrn longÓBl longÓRd longÓObjc NativeQuadGrn longËBl longËRd longËObjc NativeQuadGrn longÄBl longÄRd longÄObjc NativeQuadGrn long»Bl long»Rd long»Objc NativeQuadGrn long³Bl long³Rd long³Objc NativeQuadGrn long§Bl long§Rd long§Objc NativeQuadGrn long™Bl long™Rd long™Objc NativeQuadGrn longxBl longxRd longxObjc NativeQuadGrn longBl longRd long autoReducebooltransparencyDitherAmountlongdtransparencyDitherAlgorithmenumDitherAlgorithmNone noMatteColorboolreductionAlgorithmenumReductionAlgorithmPercrolloverMasterPaletteboolcolorTableControlObjcColorTableControl shiftEntriesVlLs lockedColorsVlLswebShiftPercentlongditherAlgorithmenumDitherAlgorithmDfsnTrnsbool fileFormatenum FileFormatPNG8 interlacedboolMttCObjc NativeQuadGrn longÿBl longÿRd longÿ ditherPercentlongdzonedHistogramWeightObjc ZonedInfo emphasizeTextboolemphasizeVectorsbool channelIDlongÿÿÿÿfloorlong8BIM¡-msetnullVersionlong8BIMÿÿÿáHhttp://ns.adobe.com/xap/1.0/ adobe:docid:photoshop:18994efd-a8a3-11d7-8fd6-a0722fca415f ÿîAdobed€ÿÛ„##""     ÿÀ‘;"ÿÝ4ÿÄ !1AQ"2aqBRbr3‘‚’²#CSc¡¢ÂÒsƒ“£³ÃÓ±âðã$4ÁÑDTd%òót„ÄÔäÿÚ ?ýÄD@DDD@DNmÝ÷¶ݬo]4OŸrÏvÒ »ª e÷í§Ö¬ÂÖÞËn2ÕÓ.+ÞWéSSy󳺵æ/¼ Qw{g4[ªO*‰° â1™>×lâmO¸Äþiq²ïdú,iñ\N?ÿp³æî|ýIk{û,Ú.VËù®4þt¨€AÄDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÐýÄD@DDD@NEêüE‰ú;`/Â3®rÄ+–ÿ*˜Üt=»ãÈ:_Ô~ŸÌyÑ8¯ÞÜ-ö´Ôhm.A¶×.}›À핹nÝÅÓqCDI@Ás©©‰˜ÉÆvw,õm.TÝVÿÙ%wÁX&å —àN(}[“®C¢:•pN`ÀA äbqµí¹Õ´j§,ztþDÚÆîÝâPÕ.ŽÕ¶Á o97{‹…‹Þ`I>b.\O<÷»Sné¸×-9è|Ô·Ò/™=ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆÿÑýÄD@DDD@N=ïEݽÿ1ô·ªý3²a½·Þmn/Tx×®ñ3ÛÜï,[9A>9¤ ^F{NªJ±I†¾Lã´›»€õ2[+Oœ§y¨£k}z5ýd;wq»sRÔÙ™²íÜùϬyׯÚÝñÕÒã²ãY´@â]ÍÝ» {¼Tà—‡dþ×Ì ‚*1C¢º•pN`Î"·¶XÛ­Ý·ÍíþÏÐݶ®ÛºíJxË@DDD@DDD@­Û‹jÛ\l”TÎvŠí®n®€o¸. Œ>i\Ówó×ím|“ó—=Uì¯Ç›nP½†EÕAOWT ^°­µ¸º@fZ’*Ê:eö—;͵·Ì•ñŽ–›N?ÃúmܵõW}ÎÔȈ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆÿÒýÄD@DDD@A9D@äü; -hçiÙ.¯Òs“mӻܧUÇÂS®%/\6í5À5iÄ—ù’à‚*1(ˆ€ˆˆˆ€ˆˆwv×-9¿´Àœ^×’þ¯™rm·ÜÛ¾§N ¸2Ò™´æÜmu°»h÷w×&àÞ…Ø19¶û®ñ«£»¾¹©ãéÚ0·E¶4ïíµû÷¯+•ű¤Ò¨¾Òjv—@r·.j¨îêäôÑujÕûÉ}‚iÚ[®l5…×:`r¶Þí_MǦžŽ¯/¯þÜÏn¦Æñí’[½@õ8KÐóºr]Ã`œ™]GŒuÀ눈ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆÿÓýÄD@DDD@DDKtˆ^õuÏ0¹zë¡§yu-©¥GÍ|î¯åήïv. m‰EC.Z½+ž|“Jc—͵b€Ùl­àÁ×ÈÓêJRú‹V®Ð[IecVé~Ú²Ì6–>ðš®1‡JªÑO•Ó×­÷–#MM¤ƒÚZjú5ôæmssuX[¶i¨vù¼›št{IÓnÅ«}„ xŸ+ãöåÑSª3$Ð@­«‚í°ã æ`ŽÚKÌ6˜£°ì»³/ªLÞ"+Ã\ÜaÙUÓ©‹v¾$·ÝþÖçÆ‘cªåçæúG‰¯Ë›ÀÇîÿksãJ*”Ü¢fY˜1¨Í'LÁ:·w˜ª¾þ»'q¶Kê+ÒëØqÚS1³¹{n,n¨ȹäÜÿ¹;%.Ù·y \Sñ8VíÝ› wλ½Å} Ó¸EF ä`""rþ"ÔÚ2ŒÜ…Î©Åø‚›†Å‘å½O‰DÅT(È {Òk9Ÿee™ˆE—H7W\ªþ·…élñnž¸s’î;ûäªäxÏD ŠiM] jÄÄuL’×wø‚Š“ÒÌ*Kt“¥®¡?ÿÔýÄD@DDD@JÝ}üÕ'ÞÓ›ñMßÿ02±aþåh§´]ò‰êÓñm÷ËK…Å{mÈ«ζ®“kb–Ôr~Ihàµû¨ÚYm[$Õ†’íM ¥¯BLöýõ‹}ѲXÔT®ž£«Ëd‘œýéÆ%l/>Ûþ¯êLÙ#ÕŸ¾º8šÝjú)o¢ÜÒøî¾h½W|?Ukô嬓h÷Aõl0¿å·ßÜoge…©l~Î.)»lÙ-.?ºš\º–ÀÕ™ì¨Å˜ú 3îî^Æ÷Jp´?¾ÿIû?gûHo{ºî¾UÂt§î­ÙîûïéKìm¥»OpWK± œô¯B3Ri¹%lèLå-¯ƒWOæ$É[;7¦SH÷»µ;1ÿެsz¹øg¼›Î+[½jn«Eì/²]wf½Å×ö·M<Û}ãõ]­ËÖ­ûG à'žÚ­Þ] qêµt€¶Ó¥åíØ³o@ ÌæßºæUÔ«TàAœ%n쎤­Í¯Í­þÏìç|@­»©uÛ:”ñÓŽæÚå—7¶˜‹Ú=—õ|Çší÷Vï‚MÅí[l`o97xn6Ì{!ȯ…‡DëœûÛFæÝ©ƒ'ZŸIz tD⵸Ý] URŒšêKz¾l²^Ý·wÒƒ¼‡kÏkãÀ뜇ć‚Ïú´ Û²…Oœ$ êšÛûs=£»ïo—2€¦™`}(ñÿÕýÄD@DDD@NoÄ?ôîø‡ú¬éœ¿ˆ6Ž8µG2L”ì/ˆIœm¸ºnwV¨ª‡K9ΰ5h[JÉüH]Îá)ß `T;5°~²Û@ì•»qm[k’ŠÉVVPÊj§DÁþ{p{;=Oá¡·ð=¯ðà_om‘ ?´¸u?Œù»Â†²ÄàTR3R¾RÍ•³(Ì™ƒ ›•#VH¥|·ÿ¿æ@½‹AT;u\`59Ïý‰5™ØrÖ†®Òô·¬½ 4$IÀ IÎ~sv“dTúïÙþWõ$î:îYµÀ¶¶õmõW»¨&ٸݫ¤¹ñd¿Â‹}{«ÂØÁðû[¿ÛK–­Úêdcˆ 1·éÛûéË ­šh² ÁF4ø½VçDÀ©ÛH+dâÊ<´µögÝnW±x7 ê>]®î;ÍÒö­Ñ¿F÷w6VVPÊj§D«Ý·o¶Á|f{¶=¢½¿YM>:ê·4KÖ®v[ÄA”ïÙ½¶o t/ó:ÿ—3}©½ít-sеoãÜÿ¨œÛ!¤]J’á SSJ$逘n6–ïà”º½›‹œÞ q Õí¿Níj¼/ ªþñ|‰Ö—-ÜZ£SÄc-žr]Øí1}%9›uú ? ?ø€y¬Ãò΋.ά[ƒ2¶‰ŽÁQ,†©­´“ʺf›E+·PE$ƒŸQg´äÛc»Ý7 ªüQ:ç&ËÜ7;¬=èqÿÖýÄD@DNk›ëÚ·nyˆ50H§<뻽Ù:B $Ѝn·j¶í¯ÒKÛØ›Švíqó)Z ø)K›û è·[×8*cùò©býë«{sET5KC>ãN«víÛ]6Ô(ä$³*©f (Ä“”W±rÝþöØÖ„êdKj#O´o£û)“¶âê-¶µr´:ÏM¼/ÙN¼\»†Ý*>µúSà}%Ù›ÛkOjëÜfmzX“¥4°¢ì@º¶ÚÕÅXVŠ2ÔǢͿFÞØCW¼õb£6cÛoÙÎVܽ˖µ€.½LOØeúÎîÔêµwh•¥Õ.Ç©‹ L`]l³°¹|†aŠ ì'ù.}¤ÚT\¶r`|DK@Ä|Þä&ð¨õ×·ñíÈÝQm ï0_ƒÚ½ü©m“oRöíkã_'á¤ÎÛ ÛƒqMRÚ…Sé?Î\üÎîF ¼•Gä =ÈsÚ¸KŸ‡Õò#vOrPgt„ éoåÉ7‘OwlŽ0Ò¾Oí.v-ÀÚd×ÅJÚSu†tì¯í.Ê÷7.c}°ú´4_†þÒìÙUTP €À@ã;{ÉÔ Pš½›d Çê_·ý>òtX]¾vTc™§U~ÓWÎMfW,’Ý壢ç5ýËX™Û¼”a¢àÍËO¬·4ŽßéhÓiŽØP\ðÜõ›@DDÎû„_h-œÆ¬kOGRM$2« 0r8ÀÃmmNÚÐuÓ^#&oœÕùò6 £\¶àwªEX jFö_ÙΙÏæîÛ½ÃÙ¿ªþ;Ø“ðìvå¼çcùg\ó¶ö÷X[¶(:Õ˜+VùÛIí­Àôb"" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""ÿ×ý_}¾\ÒÓú­§ú’Fër;{fñ£ö’Ñ •ZüX²gpµ¶¶–ê•Ò¦½kó‹ä'‘.n7À³jÓÚfí\q@«èN„Û­›Ýž“CFã«Ïi´ÂõÛ‰qUir 3:¼Î•òàsX{÷YM¤5Ö]ÓÚ#}7ðä[¹º6®\,Ç»B!q»åèÒ‰Ñju×uæÛ÷Ûõ%^íä~éG…ˆý³ ºï'n7G\ RÊýÐ/·[ŠtcVU®÷}ç´ùéÓµÐÖõ„TÄŽ‘¡í¯JöæzÊvWÆ@_¼ØÅÍCKeÌŸ3Go\æÜ›÷­– ¥W²‡Ú3šVuú$Nó\«ŸÂµb¬ÇjZµõa[ðæZYt¶ÄŒiCƒ+éùÍ>lôT(É@Ü‚ˆÝ¥Æ+<ó¶±gÚÛ,ðºRþßO‘öÓ¶Õ«H+lP0ÌŠ@¶Üçi>(”ûžØdšxàJü†›ÎK÷ïÚ½J ¶T²–¾ÒÞµ¡ÚÛòY×àíúM4³e,¦„ʤãLòT³êf‹ÃRGæõîçðg§µbl…lY F>è€ÜmÅõ[!SPW4ʭŵÓnâPd P-ÖtD 5oì[b¿) ûõa¾ Vý$›Ä é«+¨ð£~‚´‘»Û}bÓòæÐ@"„Tr02uµx¡Qвž¥>ƒH[¬Œ-ÞÌà·e½oª» ´Ú¶v—ÞClì²ê sšŸšíUÏÚ?Êi´¥›+e4)$Tš“ST‹·M²¶ï^*§Æe¤L>ò>ªçÅ1ß\OvדЀª­+×q’ñ1WܱÆÚ¢ñ«U¿1%žý”4{Ч‘ @ÒRê«ÚesEaBO ð\ÐcTjWâJ¦ÝY5žlKQ 6÷­¨»Ós"+ÚÓå¬åArÖåMÅ=åÆef£+uZÓæw=ÜíKJœŽ$®¤!gŸe‹î> Qœ$×fÒúÔN" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ÿÐýK¶Êµû˸߭3¶*á…Û— €K¸¬ï, ­¨ø"h€P@äûø>ÎÍ×ð… üé×ÝßBƒo¤™˜ì¾™ß<æÛþ'tuÞT‚ÿµd§áŒ Zñ$æB€ßÄmo=Éÿ`ûF{ž³uØí+Kîõ|¹Ñ*¶­/ex€¯bÍÊëEjó³HÂÛ[›z¾ÐÕ|« аû9Ó¶»jí•kCJå§-'ÌšÎ">ï½aor |Êøp;gñ훖츨®²©:}´_µyØ" ÔŒÅö–á¸ËW"„ÔŒ> @ò÷ rÂ+iÐqM õ|Þ®ŸCÛOCgfí°åÍCTWQhë¹åÍWk¶\­¯ŒŠŸÎšÀDNbÇrÅ‘epw¹ú«MýK:ba·v¬\5{y=>Žçù&ð€*MÌ™ÆÛÒí£j†ëqs…±ðàvUÌ™Å÷Ä©·´¶o’HÁc­µ]i#d×­Û›§‚›càεUE  *Œ€À@äû¶êö;‹ºWêíôâMc´AAiO¬5|¹Ñ9ðý¹:­ÖÓùÈtȦþÎDnS‘èÔ‘‘wÖž¨ÄÙ»Là¦3–Ý«ìê-± ­ªâ•¥¤CÏï>ÊzW-[ººn(aá‘bÂXMIZÔkOE`i?ÿÑýÄD@DDD@DDD@N?ÄÒ»RôÛ`ØøôÎÉKöûË/oÎRŽ=Ñ©[ÔVBÛQZ×émùèÿÊsn¢þÒÓWMÄWò•—¢U7CnVÍó¥É%݉¡¯eízü˜Ñ!YYC)ªœA`snØ€ªÄ­–4¸ã0<ϳKŸ[:UT*€ Ê’HEAÀƒ9qÚa‰Ûp9›_ö?¥MŶ \·ímâ¾òìþòijâݶroúÓ,"£g1ÿǽ«èo¯BçŸûïê@鈔ºínÙeCq†J30/9| w{eï®q§a}{³.íï²ýêàUrBØC§Ö\YÝnÚ[P¨¡Tp9FÎåÓ«vúø‹k…±úó­UQB¨ £ 0b" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ÿÒýÄD@DDD@DDD@DD=§ÍÞ¿·à­­}WÒ«nöÁ…Të ÈÝüÍû[¯'ÙÜõ[²ÒÛÜopy7@÷¦t¹±j­nmNc6µÿjvÛ¸—:Êr"Zq¾Íí±»´níŽ-lû7ø>DÈ Cˆ3–ÖõKwWÇswÍl›öw'TS]® Wnsmz¿aý)ÐÊ—m•=HãßZs0}±Ô€µƒÚAšzv~Ïì [nì+fá­Ë||ôú;³y†Ý×.\áæ¯ÑÚ›ÀóöV-.æýWç-½TòGìÏBq·Í~ äßB§ÖN©ÙÿÓýÄD@DDD@DDD@DD ]¶·mµ¶É…'š÷KmÕÏmfâ«8‡ž¬ÆæÖÅË«u–®¹gT ¢".Ùµyt\PÃý=YËÝn¶ÞÄ÷ևѷl²¹;bwvo ”¸3¶Ý-7˜ÞÚÙ¾>qq0Á‡Ã˜S{¶Ëÿ&Ð÷.ò@í‰È7qFÛÜÓq;VŸ ú.¿Üš¦å_6ë@ÈÙŠôü4ûH~ §¹WµeƒíΤ`êr`÷a”2•lA#ÀgÚõÛZv½ÙgF+¨à½ßÖkèDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD -ëmu¬ƒóˆ*‡#/<îòÕÄ®µÆ +ðVtýûiõ«ÿÔýÄD@DDD@DDD@DDD@DDD@DD=ý½¸´nºÒàÁp}^GfTÛ¹on/]&åûiSˆW[þdÐ{û¤²”"Úëj’OE¾ÌÐí÷L: ¦±`|æfHQɨ, ô̶—®_F¸Ø!cÝú‚pÜGû¥€.1¹p h Þײ³Ô¶‹nÚÛ\”=Ȉˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆJªß‰\ ù±žû4ë˜lè6–Ž@ &Þ»Õn‰oƒ0ÔÍé*tô@¹¶{õºJ°÷UíÊnvÂðSq˜2OÞ-ŠÔ]Q˜Kü!æ¨êêMTâ 6»†¹[wF›öûkÏítNmÖØÜ"í£¦úv[Îû+’ÛmÊÞHÑup{g0`oû«6Y«Ê Y¾ ²Äå8›uvû{1€Á¯ÊþÏÏ,î7GVâ¶ìð²-ûvªŠŠU KvN³Wº{W!YXUH#*KŸ7ø…·òo)Cë/ZÎÉË¿BÖ5¯nÑ¿t[qrÚºäÀîÀ´D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DJ½ËiÛ`¾2 DçmöÑsº¾æ?&SþKkÀ³x•¿V\NOù <á<CQÚ³uG2˜@ë‰Éÿ#·‡52ë¿Ú6W@ñôü¸!]UX0ðÉ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆœ×·¶­¶…­Û¼1? gß~!õ çSWªý¬ÿ×ýÄD@DDD@DDD@DDD@DDD@He ¥NL>ì˜çYs÷&²Ø=£Ý¸ôuŠjÆ›ŒèáÕTWèÊõôJîí5·;”]JF›öÇ”žÀšZºB+7’”K‹Bôó.¤ »“¸ PÀ×¥~ÝÛzZmc; vCš{¡çód¸þÎÙS–· =ö’Û} -z«™nÞ¿‡ª_¼ÖÙPCÔjc¥E¿2äÀZûØïJ÷.=Õ&¬<îÍ¿š™Ü½q˜Ú¸‹|«ál¯AÕnï—o»ÐÓE½¹mÁ²Z¬4ömv“¯Wmýœ ø¼ %áÁÐ~©=ïâ+ ¾³×äN¸Æmoî`÷–ØãÝŠŸrkgifÉÔg9»u7Æš]º¶‚—ÁI¡'+9ŽíœiK°qM#¥’¿Zÿ7ØØHÌî_DW9÷tÔT¸œîü}Ÿxï??BƒÀZ\NNóñªOÿ¥¶¯"E>4¹å¶Íì\k†ÐÝ!55öƒô.NŸ½n—Úm›Æ„<È V®«y¥1¦Üí®¦»*¢™ŠTúSyɳW7/^d6ÖéTàzGm—Óp!ÙQK1¢¨©3vûFÍK”ø*Ú%÷÷uºJ±ˆR®Òšƒn-ÜQT(ÃXulÖî ‹P(A£)ÍHòZCZ´ý´Vñ€e,Ïrâö'ž‘¡®M r·áÛCˆM'RDøûsüc:âV6éfº Yê%²•½µ[¯¬Ü¸†”ém"o1³·îI=å˕Žڄ‹Ö¯»µxÚRšCΜ»Æè^d£Z²2¸©Þ-µ¸ªÄƒzë6°éÖ¾ðKב×Å¥¥ï\¾(lÛAϨ, ®Þ¤÷b§5DTT„ m_¸í¥ìµ³Ìâ¿o1½º³d€äÔä&Ñ8þõ¸¹…»SιÐ>,}Òýïý›Ä¯ÕÛé_÷w¶Q´%nÜà‰‰™÷;½Ç¶næÙú4íÚ]V¬Z²4ÛP£ÁŸÆ—›¬®›j™â~Ò"ÿÐýÄD@DDD@DDD@DDD@DDD@DDäÓix·xÅÏ!¸?ÙN¹ÈÛg¿¸×~†ÒT[·kô— u‚¨ÄL-;«©ç…qýù±{k×¶%íùVN?À—²Ë~—-³Qºu¡ª|Ïb]$‰ÌÅI¦'30û¶u»p×Ò§ÉY¢ÚQo»«09’Ķ?iÛyRà0SÄ^iýyŸÝ,B ñ³~¼ºÛìéÑ2ššš¦ž×©_sµ,êÄy#¨üDÕ4Gº€ `©ø¯%QQ(ä$ÀLÞý”m,à6tã3Ý‹šâ3†®«›'•ñ'œ.³ÞïVãV¢3¦ì;éÑÞ[ïç>ÎìP­Ê‚iqAàp¯Á—KV“°Š¾ äÙ,Öë‹ dûÁó[¥þ$íçßµq7º&—T—Ph_Kuª?Ѿ‹“¤£n6ì—NºÑNj>‹_§-uÜ´ëš1¯ªÃKÍ`slnµË_Ú[:Ƴ¦q7þ>ø6V÷"‡Áq{?vÀDDD@DDD@DDD@DDD@DDD@DDDÂöòÍ£¦ºî­¯S@Þcsy¶·]W£€5?fÆçsŽà÷Vþ©'ö×'E½¶ÞßbÚŠq¦?|½w µ’Þ›ô'ûãîw®ãººX}Zt§ë¼ìˆ·fÕ¥ÓmB¼HwTRÎt¨Ì˜ï ÷ Ôi¨±>EµÔŸ99Û¶…:Ö©‹7zïq¢mbå»×EÇaÞ÷VëŠ/•ûׄ(qÜ2’×/ Em=šjýŸÎ´èMÅ‹†‰qXòVp±ÛÞwîûnj ©+äwPnþxi`-°æ;¶×X”NÚZqó[›…x¹Q/÷ÿQ{ãÿ¶\2äÿ´s{‡ÆæHü7f>޾2ß­§ZyÃß’9c9¿ãöT=óúÓ ûEÛ[7öÄÛdê+RU€íjVÔÛ[ ŘO¤ß­mmAîÅ$‘ò¦¨áÑ\dÀîÉ‰ÚØ&¥q>úÒÖìZ´IABp8“òÚi#¶°I%8‘Ž“ë[ìMbd"""bÛ«+ª¥¨˜1 Ć«h¬C.!…GˆÉ€ˆˆˆ€ˆˆ •û練ÀŒU‡iO£5ˆ›{×çݷܨü./ù'\åßÚ-g¼\.YëSâí΋N.[[ƒ&ûð-3»t©ƒUÆÄ€}%ɇÞëŸe²øÞÇÿÔÍ…»áÛ°ë§WÀêÓûÙNóqõ^æ¤ìý_jÿÑýÄD@DDD@DDD@DDD@DDD@DDD@N;Û[Âé¹¶~ìÜÂèáûTûIÙ96ÏuoÝÛÜ~ó@XŠ5a¶]åÛBò_íéa©iYÝvεb”[¬ºEÊT&Í¥³im.J)^p9õþ"¸vîxUŠü¹ÝöæÐ:í¢•+¬§©=†çkný¶GxGKÓ|ž¨)ª‚x‰3ƒcÞX¸Û[¦¦ÐÖ¾Åð97÷ÖÝ „ÐÝ:j3Óô“ŽùW¶ÚYIji¶•b”Òè»oW‘í'¬UZ•Ó*ÉÁ°Û0 ~á"å*F“‰êï>²wʽÄAW`£™4™ØÝÙ¾î–ÍJfxI m+rê[¹Ò  ñÀËwg¾°Ê;c©¤½™mµîúÂÜâEraÛ“ný«„ª5HĉÍoÿxÖ²·­9kÕ`vÄDD@DDD@DDD@DDD@DDDÊþæÍÖØœ”bÇàÀÖa{yfÑÓ]wVש¦4ÞnsÿÆ´xjßâ6Öl›\Nlqcð sèÞn;m÷{gÉ\nYü‰ÑcmfÀ¥µ¡âÇ>³Íb" ""snoX£X¸J–\èh+ÙmS¦c{n.º¶¦JN”ù sÛ»nÙï.1½t®¢è*ŠƒÉ·;QàqPTW0}–îÀVÝzFLÿ gD _b–n8ÍT‘î †ÚÅ®ìD,ƒ¬7¦ú–u äsžzÜû‘6îamA6ôŒn×Éoµµ½ÛímZ7U{»¿FS¤ëòzVwZ×Ý'yÛÒ5zÔꜶ,\¹pnw#¯èíð¶?Ë; "" ‘Pp""·ºÚTYõŒÂGOQ¥×ñ ½ir¶›Š¸"uÈeV`ðã4ÜíÜÑn)<ª+5˜¾Ójý«Kî |™—ü}µÆÍÇ´xj¯Äxq8ôþ!k&KëɆ†üÞˆûþý‹OkÃMIñÒdLíî,]ön­à‹4K×E«mp‚Bæs†ãX7^ã–ÒvÛ‘¤³/ÒõûN‰è2†R­ˆaB(šDÿÒýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DD}ÎÞåÇ·rÓ‹w-רŠàÓ6·¿E$_WW©tü™Ù*ë­+M@Š S¼?r[ázÞW›“¢>í»¸>wpV¹­°Ÿ¼›µ®îݲ*-WƳXv;¶Mæ ¶ã7WçMv—¶¬M­ºÐ ´¦¡òçK"=5¨jb*+97#ºÜؾ0SóOâogùð;'âý·Õlê¶ÖØp©(u¯RNÉÉ~ÊͲÕ)vªËä–Q®Î¿æ@ªn-Y Zæ+ªàÒK³ö<¹¦öÓ=ií-iîv–hvöå½N¥Éõ´Í`RÍÕ½in.L+þÙyÅ·ùÍͱì?ÎZ÷}¥¹ÛH’hdÎ{ûË6NžÝյŦCorunŽ‹y‹ ¬ðswpÅ6ƒ¤`×Û²?eõ“[;vIs[—Nw›ªª¨U(È 0’îíÑœhA £©Ë IݧtÓ}Ã\[.Öûj*+ŽS‰n=Æk©m.\T4¼µÓçwz.y³è!b °ÒÄbµ­>™Í´»vö§$X:t–>_•:`&o¸°¡î*¶t$ k—ݶ¸Ù(©™míé´Zèîw+áò?v6Ù`|FBÜFfU5)ƒr©ògóº ÉnÒ†P¹@(½¦t¬öí¥´ƒï“ç4 DDD@†eU,Æ€bIœVTî¯}åÅ-&Tñûv“|Õï»)"Òcy‡æØ @0" """ """ ""6[[«b¼ÇIüÉÙ^Oc¸uäŽ?:vDJþ"žM»¾"Pþt}çv½½±ñ«q“ïwÿügü‘÷áìíM8UÔ~lëˆîüý y!ÿ$nØN£:¢" Nc¸ÝZ°¬\öPbÍ9ÆÞþèêÝóÿYà]·ö˰­}†zHýä‚7ׯ–l‡2»ŸLëDDP¨¨È 03±b݄ЃÆx±óžiÿÓýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÃyo¼Û\^4¨ñ¯\ÞsÝÞZ¶æÞ–w ƒU+M½ÎöÂ\ó”WÇåJnÃwaÔÖÙ\™¡ë_áÊ~¬»`¬4OIÌuuÍw*¦Óµ¥VÒÄV˜@Ö%-*„   }F‚•'ʗ˾¶ÆÚÞ·í,cÂ>‘'E»‹rÚÜ^Ë ‰ÏwFîl/{xæ<•ý³Kí,5‹"Û6£RpÈWÈHÄDD@DDD@D£ÞµlUÜ/ŒÒsŸÄ,“KA¯7$R:\©ÀN=ˆ]ì"Ø^nu7ÄX滋xò'J Zæþʶ‹u½sÍA«ó¦,Û»×RÝÃ÷t¸ ¿OžþDîKví6Ô(ä'6átÝ·qP :Öç”ÚþgOgÓajÖÒßÍ%]{NÍçÜ„·nã¹pݸ;@ª=Ki/|ékN{*Ô> A­«|v™ÚKˆâª~l0'­l®š Ø‹¨®-h’Õ_w¯égJ²º†SUaP|sH»­Ð¥»zˆn9uÜn½rû`E„¨¡8Ó•N¸À @2" D@äÜ]¶o¥—`¨¿8õ4ÕOcoãüä_ÞZ§wmÑ™³$‚Š<ëŸâs4±e*U$ê'3S„…îQMÁ¦‚뀊˜iï;ËŸÛžŠ×H®tÆ’HEAÌL›.-1ù¶öL ÿÙ¼D@N}ÝófØ+váÓlxOêN‚@9 Ŷq}·mØK#ÁåÝøp7ÚíÅ‹A3c‹·œÇµ6ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ‰K·­ÙB÷*ˆœw7oqÍ þUÃØOו¦ãxq­·,®\ “²Ý«v%µ £€Žßh–xǼ¼{W?æNˆˆˆ€ˆˆˆ€ˆˆÿÔýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDP{ñ96Ý;½Êp%\|!Õ:n®«N£©ñ‰Ì:<®Z¯º¦uÀ¥ E¤P…'-ç¿zûm­éTïå~ªvÎ;ß7¾³s…ÀmŸ–:,Xµa4[æxŸ^iH¤Ð@Dç¹¾ÚÛ4.¹/QüɘÝî.û ¹§pèd†eQV!G2i9;õÏi|[m±ýÇ–_ÃöÀÕÁºÜÜ–€Ä6ªhY䀷ɕûÖåý–Ù¼wIÖ¨ˆ(Šr’`riüEókvä ñ£îWÚî.?zæÎ¸Íoa´LE°O6êùs¤¢Š(9”ºŽë¥\ÛÇ4ôu@¥ýÂÚ¢®áÊÚö½h°ÌT jJT95©¯fZÝ«vTè®,Ç}wiM¶±µµ¤ ¯#Ôð7œ{¡®åµl`Æ« ÷·~o±:ÛV“¢…¸€œ»Tï¹*·JÈ{GýåÈLªÊU…TàA™ wíàŽx®¡ûÔíͧ½ÎéÜZqjÊ1]@UØŽÖ˜¸UhÛ«ªb-Œ‘ç}%Ù_¾½Ïý{-ppvèOŒòö¶6ê`n?žçQ$€*p%Íó¸î/[ têªTõç\áÚk¸on–š®Z®ZS±ñç]«‚âW1ÈŽÚ@¼‡ P„:[Ï1–®w‹R4°Á×Ía/0º ·ï×J\QÅ~³×µ75`%]âlŒ´…ea©MAâ eeØfé­ÅÄ7ž¿YþI´Îí®ñE—STnFM«…רiu4aáô`sïŠ.Ý;wΟ}+N¤EDTQEQAîNDùÏÄ.7 (zÏ×; """ """ """ """ "%Zíµí:¯ŒÑ9ñ Dé°­}ù(éþ$©Ûîwî»·õHsý­Ø¹½û­²÷×xÓ°¿´¹&Öϯ½Ü·{w‡˜Ÿ³IÑnÕ»K¦Ú…^BZ" """ """ ""ÿÕýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@äÜtïvÏçjCïtιÁ¿½h5’kKŠH>\±»~ï³]!Z«uº¯ìÛçn@ÖÞà réÌéfভۜ÷žîåtÚBÆÝÀÉs²„/gÚKív–À=ç[†bœÛç-Ù°8û¿Ä.vî­¡É£ñ®I‡Y&·YïM>,눷fÕ±KhÄ)+~ë[)¥A H%Ž0׿¼Öy÷nÜg{7oQºmbOnÝÍK­?‰«myï)f@©^‚ uú}Ko¢m8»ÝÁÜw*@¡š{6©«V½_º°sMÅR:^ 7¤<ˆˆˆ$) T€™mî=Ëbã@Ð:KÝÐêt6¹7‘«×ž}þûo­,«›ŒÕ¶Â¬¢Ù:Ý; ¢¦ÊJœˆ¡÷ft³·MDéUI' /BN¿¾{–,° ÛS€b{ri¾º.¥Öí]mD¢1×óz _w¹µi‘(ZÛ‚Á‘Ž Iít·\êÙ²¶ÖÑ\´îŽ–œööövL Š ‡´æþöoµ6WjŒéQ¨ó0:''á¿ú¢½­M«ÖÕ7]ņ:UÔ“®s —Cß²sG,=WêXs‹tí~çÝ-WÍæ§™ëÜ›î÷oaŸÊÉG626–;›]GUÇê¸ÜØÀÙQB(¢¨ óW«ôwp> žOñfò·n!FÉ„ DÎÖR¯íé×ýäÒ`Ÿ1s»8Zsó~‹všÇø¦©q_U0*H`s.[[ˆQ²âÂvî*øÈrÔ`<î2gÍþÝÁ[z®0È"“Œ‹{ÍÍñ[0v§W©ºUî[¶*ìs&“—¸ÞÜö—ÂVÇ÷®]6e:™MÆóœê0(wÚε¶¼|îÊÞ4 ¥ÛÄ6íõˆ´¸ õ¾²v  " (@D㹺{®lí:˜`÷|„ýw6m›vÂ3›„fÍ™xˆ€ˆˆ “îm¥å²õRâªÇ²O™¯ÏšÊ^³nò¸*?(>rÀ¼N½whE½Ï]¬’ðáè_ÊÁ€e5" """ "'6ãuݰµhw—Û$=;°'u¸6À·hj¿s^_hòvÛqa N«ÇóšFÛlm“vé×}ûMËìíΈˆ€ˆˆˆÏ~õÛwUT«á©‰^gJ¿nqwì÷Zë6Ρ¥]°k}¾ï»îü‰Ù¾)Ü÷m@n Ÿ'Ë{¿»œ—¹SvÚPÚ–£¥”vìß×ö¶`wìÙû³nãj{g<êw©òçLàØ%ê÷¦¢Û W©tèú4Õ;à""" &wo% +RÍÙA‹1ôeû3Vw¦=‹~¿žÿe-jÂÛ%‰/q»Ns>¡n76´QüÇéo÷Íe^Ý»‹¥Ô0äf=ÅÛ~ÂæVýKð_Ú¤ˆœÿyÑ…ô6½.Õ¿â¯÷&Ýí¯=rÕ˜ìùð?ÿÐýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DHrB’3–Õ¦ÒcuWÐÓÚ¼Þ¤ÒÕƒQ¼ aÆ’Š —:Ø “ÈÌÙMTbWzoZ~¨ß ©?=&Ó;êZËÚ«ë/Z~|º0tW0{°&e¸ÁVàÎÙ }^ÅßåÉk…n¢˃OXu|‰£ÊTâ¡÷`%Ï6ÈàO1Ùi]±=ÐS‹[%Áéù/ô”½æ7¨ýþH¾…í½±Ô‡Ò^¤–¶âåµq“ ËLí£#¸§CJ|-íR_æï-Ï%èãúŸÚ›AŠQÈÄ Â¥«djÒ‚¦¤ök<í·{½^jÙ´hiô­ä÷“{ î÷ÏÐY¡¹é¿ÕËm@MÖæØZ«=!Õ©ª©Ðµ `¹Lï±·iÙW ,Ä刧6”ºší:yÊG¾ g²];KCÑãuÍç6ÁõímóQ¤ŽEz%·—û›$¯´n”Ù r\r÷w—$QfÙôÜõiøsÑEŠƒ%ryúÞÕ›w4¸ × M]¼žˆ©¢‡ˆË{qtÞ66êàvnÂVsî—ynØ-~®ìQTSéöæû~îám¥Ç«M2¾ßLíí‡óõ Hü:Ñ\¹ràâ MSgµNÍ¥÷F¯—7ˆƒœgo¹·ußlÈá«#ƒÚôtyó² rwŸˆ.v‘ü*Ú©{¾;{gÑ!ç\@äÿ‘²;krÙäÊFg[ûÞÍmm¹ä÷?RÜi- KcJŽÑ@`C ƒ˜3ŒìîZ%¶¢¹Ûn«gõ'd@ãûåÛxn,2ótëI¢ï¶•ÕÓòçD£Y´ý¤Vñ€`;û:uw‹§E&/¿Ú'Ò<—«äK}ËiZ÷K_Õ-ZNÂ*ø€9 ï78[_»Û>[véè[›ØÛZ°AV=§8³zÓh€ˆˆˆ€ˆˆˆ…ý¥»Î®åAACLãî–h3óÔÌß)æñ*ª2LDD@Nbnn‘I·i V#¶äy+õVçLÀ|Þè&ø¨õÓõíN¨‰mB £ %¢ ""e÷m¿Õ®uÈg5ˆÿÑýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@HnÉñ2· ¼P)o#˜é/hÖØ÷¤¨¢¢ô¹^IŽß¤=¿«bªß;oåͦZXn5ÒëFñ©ù¿—7#æõŒíãàöÿ—6Q‘‚9 ÉE|3U+¸l:nkÃRô|‰£(e*Ù0¡÷dÄrÂ&7·V,ûGù£ø‹2ûë·³ÛÜaÀ‘¦¿\NO¿¢‘ß[¹h)‡OÆYÔŽŽ¡†S‘9v=­À=®ù«âòcmռܷ"«N8 KÕÚî~ñô7h·}ú;±x÷•Ü®6nÑ.ez—_¿³uÒ⃉Ð}¬‘a½¸ÝÛÓlµt¯¥­½¤çM«^ê„æ¢ÌjJõ³Û¹kO Ók›ÅbËM7Yú–½âéhrv—Zú)}µÞ¦ÓŽ–úÅý¤Ín½û£q °S¦Íªñí]¼ïêNÍÅÕ²,¨TT) ¾Bve¶öÍ»*§=Më7[À…{;›l3ÍYOiL¥«úÛ»SrÙÓ€$¸ú+>zLïY6H»h„îÖƒ2×I>Êïý{IÐŽ·m›‰ÒäP’:”!ýH›»šE½õœiU`pªŸ?öw'FÊÏu`TÕß­Ï6n©Ï·÷.Xb^Ù«)"š‰éÜ~|Ófím›ipõ[ÆÙó­ù?dD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@LwJM­kÛ´C¯Áí/÷6ˆ¬C.!…GˆÉ˜mº5Ø?Dz}Fë·þ9¼D@DDÿÒýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@J^=æ@—œŸˆáa[‚º“⬹K€Ð0Íq™ ÅÍ"ë îN:©QçÜIÑÁ€ÈÄÎßKà1)¤D@$š™3ˆÞ¿ºb»sÝÙ5â1?°¸¾Yˆ@jÊ<¯E¦ŠªªE`¥›8ªÕø»bÇáMâ Pâbq¶Ñ­\v½5?9lö~ƒÎÈ ªÊU…AÀƒ(ö-½±j”AJ(Ë%¦‘ÏÛÜÜ—¸ [:ZɃȹjâýdê]À$«#-À ÐFtú·öO1Ý«Y¸»´òznå'û¹R×w-KFŠ­Q|aÒ{VÑ~’çòàJ“¹½@Ŭ!Ôj)×äíÿu;emÛKH–5¦ÀÊñ­šžÑÀz·'5¤¹÷†LÒFž±Ùøòm³]¾¯§HJƒŽ ÏÙw¶ßV‰;`rnÃ.›ŠÝIì­Ú>ZùývänÞ´››ÒßRzKåÚl RÐð9Òrm˜[ºÖjY¬ŽE:þžÒÿRE‹Ë~ÒÜ\Žc‘ò–i8_ÿqÞý{ǬyõŸw@DDD@Dç¼ÍqÆÞÙ¥q¸ÃÉO7ö—¤²ów)…T|[½ì âa£t½›ªþZ~}¦þÜw›•íY áF&ïux˜¦åŲ¬ŽEB²‘—¥Ø›@DDD@DDD@DDD@DDD@DDD@DDD@DDÿ¸]•-T:KUF4ÕåM•³Ä“”òíîû¦bÊu;UúZš m7Q}Hܼ鹶íi—P(@ÒÅ€ùÞ•¶ßG:­_³wÙ°$f2aë#L;ÛW·6{¶¤9$f¢Š^gn]¶v›@#¦Ø>±'ÊïW®DN5]ݽ Y`K+ù ú…—MêPªmW&8¡õn¬˜€Á…TÔˆˆÿÓýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@N}òêÚ]–¿®tJÝ]VG#ß0Ù°6´€ ¾£iþ9k_4æÁìö­z¾]¯ÝNsíÍ6¶w ôk¥ü)]/ü-=ä꾤 ¸˜½¾¥§9?yn;²mÞÛÝ«CS“ög\ãß0m½¶\C:÷L쀈ˆˆ€ˆˆˆ€ˆˆ8ƒ˜œ¼Ø±76§LZ×ý©ß)nõ««ªÛÕ™rÿj¶¬ñ\qý›ÍýœËs·Û++î/9¢2à ôü‰›nw)otVÀ^\½.ñ`vYQÚŠ:P &²©@P‚¤`D˜ ŠÒ¸œ§›y˜5ZŒI°V›Èthìö.iþ¬éÝ$[kz½‘ô½eùËZ&W6·ÒÊÛ¶ÝਥhëíÝéÐ¥7;~¡ÒÂŒ§É#¶¿rÙܽ»–nuµŒWÝ¿ûsM píJµ¶wUèr—®vžàŠ‚@œÃm»aWÜ炤KmwõY¼@¿lÐ8}bÀÒÍ¢¶j¬ ËMr•«+Ô‹Z‹51)Ú:S«µ(¶·ª¶Šuª«T¯‘Ó)i÷ ÝÓm_ç hÅx'nd¥ë«i5I4U³Ê,̶íðU[C‹1Öv‰ýÉk{uFÖÄܹ籯ÄOgnX´Ë[—1ºý£ÁG“e=I´ÍïØ·Û¸«ã"g÷í§Ö¬ ZÛ¨¸Ê<ѦŸœ’¦ÓðºãâŠM½Å‹¸[ucÈf2îÜ<*Éîãÿ(yñ“üÓX{tv¬Ÿߨð7v1” ÐêqøSi е§”j|f]XUHaÌÉ™¶ÞË”æ:OÇI^á—ÙÝaàn±üÏœþd ¢c]Òæ«px†ø­?™yQí­øXtÿ5Û´HVV”‚Db$ÀÎåЄ(ݲQËÎo2Uw° ¥5`¦¡”Ÿ3]¿.W£½¼T•™·O'OÚk˜ÅÒSp)¤­§ºÑ­W®tD@DDD@DDD@DD ;—¹sUêhSÑlvkwÏéÅšÅö¦Uĺ¿¹7¨ªI…O„ö`dûd/Þ¡6îqeò‡›q|¹´D©¶•SNÈ!G_FZ r ž‚Ûg캭ÌûÍý8WN®Áʾ·þÆ¡ñÿÔýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDOÿõ´ù¬ÃòÍ-‹–koA{c°A õl®Ëìæ{p¼®·åLÁT±ÉA'Üæ­nîmíô–XÜ:°éíY_â<ôç&Á ¶Û‡ö—Σà_£Iצ⠂Ù=l À EÛVî¡K‹©O8¬‹‰º;Pýí•Z¸`šö-k¦õ°®u›íø<©Ï°Fîçíß:Ï‹èÖl­±}iSµcÖ¹÷gëÐN÷T؃c¬ž=Uö“R8ƒ˜œnl˜½°_jMY3k~¿³×nÈBX’÷nsõWêÒi+nâ\@èu+dd³*)f!TfN1Ût‹‰Á.5¾{û’–MË…œŠÛ­WGnïøåE¦½uÝK%›€k®枟›òí¦‰Ø(Sþu/³ÙDeq€c‚;Ó[uÛí˜Z, çŘæOè}œëcE'¬Áí‹ö0{Ð¥ý}$ æ7¶¶/ãqjÃ&0øS™^âÞkaË¥¿fǽ>jíÅí˯ßnÔáÁRQ{8k_kªîZMqqN`Õ‡¨Ò¶ÝÚ¬Ý7P%[J†ó¥ìmB5nkºµw¾tªkôÓègd?ÿrsôvWã·êHm™ÒZýë—iä¯Hþ¹Û9~ôõ7t×lCµ‡jþŸ¨»;u·µ$ðÖ÷ÞHöª •[¥p·Q§H=¯g;A )¨8‚&žžîîZWÕš—›§BÈ»«Š:ôšVTnÉÙ¥Ú€÷+À0í¿æM.ï6ÊóŠHk$l’›;jÙÄzÝP6°úì£Ö¥”|4—€€ P@"" """Uî%°YØ(ãÀ–9“ñ £š ”<5¿.t‚#(¹i.SUA^ËF_U¤%…VÖK; ‹ÓÔšDÎá¾î•H㨕ù(óH†­ç™oã7ø£Vìgm‰Ïø¦ñ!rÿ•kÇ¥ù}ÜÄgmýÀúlÓX—ÞlŽÑ)ë¿)eÖí·ì¸oZQ¬Ù~Ò)<È/» ì3'‰>%Íi7 Ù¸Àëúv´ÿNÑ1ïn¯nÑ>!¿5»»’FâÉ:Kio5CüÈÄDD@DDD@ÿÕýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD=±Ó¸Ý)ÆŒ­‡¤²Çunâ„Òà^S§:‰¼Ö¿ºª…ûÀ¹1Ó‹Wm!Õh%Špé‡UÎå_MÈþÄí‚Õ¢Q‡…LêžvÖã Ù,ºrºÔV½Kåy>Ñ>rz02½}l”Ô .6\Ÿ:C^#r–iƒ©jø m!ÛJ–¥t‚iⓔ绾Û[:uk~Gó`Jîì÷)uØ"Üʳyçmö·®mZÅÑÝÚ&¶þ³=}so¸:¯ÝoªE•{Dàmůùl¬:w}&ºZº¦Ãðí¥jÈ\óbLÝ-Z·ØE_ý¶á·-¢üÍò¬ïÈ/mg¤€8nZ}£›ÖkG¶¹}­™Ð‚Åý7ÁÖ<šä¿ë&Ó†ê6ÑÎâÈ­–?=lpûkp;¢erõ(Ê좾‹1røE¿œ»æŽµo¢Û¢èî-ž¦4~鿵/yn¶›Vºö®y«æZ_>M„,Üõ¸Ê£§Bzæ¤Ó” "[³l*ÑQe~õ¶úÔøÂrÛ¶»ÛzíZÊ6“É4íÝ_uÛ}R|Qê²Qo)jö…7T»]´¢¬ê£™ LÛe´lí/¸)òd.Ãf¦¢Òû¸ü¨zí»ÖšÝ›É¨úC/)zdÛÜ"…·q{“J(=ƒû+½‰-³Ú°¡´¾àÓò'mºY¬3%ª•[d¡éÚnéûàn]v—t©ù–™>«ÓOÚýOð£KîÈkƒæ£»Œ¤y[ñ}åÚ ¹sC|ÕÕåªböß8ß9ý©ë´TÔÓ‰‰Ûé’´. €n½?ahþ!nÚÚèCêÃFu­À×(AJ{¡¥àq›ÛëXÝ´·‰´MGîÞtY¿jòk¶ÕyZi8ZɸNçkówA"‡³t)ÓÖ°;¢a·Ý%î’4]^ݳ˜›3ª.§!Tq&‚Ī\K‹ªÛ^c•ýÝ«'F/påmqhÏ6õ»k¼-¹MvîÐ#œý[MüFçP dpSWo…0ÜÙüFò}%9[Ì‘Øož¾æí²ßwK"ûŠà¤þD¶Çmr¶²(ƪ‚¥SÕ×0O¾-ë—,Ú:nSP¹E:”iòhw;› éW»cMi^ƒöš vÄDD@DDD@DDD@HeV`äq“1ûµ±Šlúƒø~Ê)¹LŠÝC|eÕnm1û¯µVµá"«ü[zÒj¬¬*¤0µf;¦¹~áÚZ kqÛ ùžœÖÍ´µWc[¯Ûziªy‰0Úßµßî.3…Öô<iÜ‹¡sÒ¯ŠLÉ7[{ŽÈŽ—:~´Ñ]C©ª¶ À˜ˆ€ˆˆˆ€ˆˆˆ€ˆˆ‰Ìû¦K®ÝB ZµUóþsL˜žRß¾ÁƧ Äw' Rç±ïzZz6.–UÏhŠ7¬:óài(q1·Q¢mG³üù¸Óºó“—dÿ·ü¹´@ÿ×ýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@L÷…‹Fã@¥iá:f“Ï´{Ͷì±®å|:4@î6í»-¡™{,xVasy¶³Ð¦A¨þlç±gw¸´‹y«* i·§Ö4íµbÍ‘KhÃÇã@âT¿rÎÖŠÙ¸ÛkÁ€ít,Õv€5û¤ ¤RvDdØmPêÑ­¼çêùS¤ " """ …˜Ð I‰ÔfV+Rt -_ZPZÜtÞ¨8Ñ”5>#[¼Líýâ¿; ŽkP~+M """ """ '6çlnvÑÑ};-ç}ÉÓ<ÖÜ Ãmn-δâ¥Tô¦_v³ß÷ú~r”¬Ö’39ÄÊææÝ¶Ñ‹Ü9[^¦ÿd `€E¨äg>ÍÓÖÝÊy©‹Ÿ^ï‘û¿âE‚mÜm»šÓªÛÙ<ßÝ@¹ÛX?F óIøÉw°îž&Õýnök1Ó¹\_ÀÃIøöÿÇó¯´´Às_œ™óŸË›DU³°ºÚ•Q˜f(?:ÜÚîÞÍå q(ËÁ&å›W;j #áË€2ñ€ˆ™^¼ÖÝP»=iˆ^Ï­X˜÷EkaðäQ¿¹ymÜŸ‘ªîسxuS*ÊéÛí­— ¶Õs KÛ¼— PV•"¾¼¦êÇe­Ö„â„u,NþæûU»_5gËcÛeô-Í­µ÷¶‚jÒ.9 ²û}Þ¦îo €hWÃWxž„ÜÞ@«…®×¸;È3í ¢(¬¶”°R¸¾ºÊìÇu± h~®•«v$oܸ·¶Zê¼EO :®N‹Û{w­wMP˜Ržy´n(Köß¼Ø:Ò”òߥÛèçxÚØWÕf_Ó; ÞbjRØÑkV9õ\Ó: eܸìÝqã£ÎX¦ädÈþ0Sä÷“X{u{vo•ÝÜ“÷›#´JLùsX ʪA dÌŽÞÁ5Ðæ½'ã[Ó#¹uì]aàj8üïœþd ¢c]Êæ«pz'Aø­?›yUöŠÖé™aÓüD×nÑ!jF 9ƒY0—/[¶Ê¬hÎh£‰yǽí£šVvÊ–û:?~ó²¢r]Ú§Þ;çºU˜…AÓóSZ¼9Ù¬ª(Ó¤‚kè·Û|ýáOOd.…~ñt‚Å–¸V½¯›êîä¶ÊÓûR÷)f4üÍ£(ˆ€ˆˆÿÐýÄD@DDHÖº´Tj"ºk$ÀD¨5Ä@DDD@DDD@DDD@DDD@DHv ¬Ô'H&ƒ< LJYº—­‹ˆj­/ åç³`ÝJUH¨n"²»›×-­§ZΪêy7¥¦gzòÙMl ZãAZJ\Þí­àÎ y«Ô2e÷­Ëû-³S›Ÿ›·/²²î­9¹¶l.(ÇOÚ$³o»Ã£h†óyÙ"úï;7íܺ×"Ü!‚©¨ËBŠ(r8×d×:·W Óæ¦Øø+:mYµitÛP â@—ˆˆ€ˆˆ W} M*|Ñœ´¥ËaÇÙ $bBª¯d\M1“1;‘ZwwÀ06‰Îo³RˆéB3 5ýškynúõ}ƒ{¥?Éh”¶÷ºÓ»¦X†¯Ä—€ˆˆ •Ëêݨ/pŠ„^^s?a&³ö™©rÞS²xåZAàT[Ü]ö¯Ý¯™o?Þ_ÿÚÝ«vÅ-¨QÆ’-][¨pàAÍXv‘¤\{ªF‹zÇ §ó i8Õ^æÜ\S[ÖÝÊàg^ëá§ÍÍ~òA£Ú¸¾æ±ü–¹)nõ« ÝÜj³dÔêgnÖ˜Ú¸·m‡\ ù²ó‰/ÙMΔpRþ4ónßþ¤í€ˆˆˆ€œÛÆÐ-Ü¡:A^“ów5|yÓ)zßyiÓÎ þðä¶.q:T~}ÉVÜ÷D—VÒOQÀ‹])Ós»–[»#U“ª˜Ñ—?9÷—®-–­’¡˜j5^¯C¡™þsÙÀßfCZ7* ]%Ú„W°ŸÜÝÝu;‰Âyãe¸ºÝíÇ[•¡Cðî͆Çn½w5]+nP0v]ÖánÛZ²UÜWVÎÛM¶ÛK}–Õ[ƒSMB_Î]s'¸·ÔM«$ „dÅWç¾ÑɳEÔ¶YÕZ ¥ÐZ`Mëmgt—ÖÛÜ@¥hµvVøm7µ¼±u´UüÆZCï“mŠ£i'§?Cç5ËÞ±kqlw‹Bq'ShœKÿ!k£JßQÙrtµ>ÒIÞ^µŽâÉUâêu…õôÀ쉚î,2k[ŠWDçmö¶ÑµCyø¶V×Ö¹²'ÝwqÜ_#зп·!ö[kjY®:ÇYÛ†›½° ¤î,ñVöª=>tÙÜY¾µ¶Õ½¶žË‹mÜÑTTÎ}‚·ÔäÜ#ÖÆm~#`0QÞpÍpHF–’»]îá4^:-kÖµÅÇk¥túÓÓÐXx£¬roÈ`s~\ÚpÌ\£²‚q4Y×8vwmÛ{ö‚žô4ˆˆÿÑýÄD@Dä·~ý»âÆà®½ÝÅÈÓÈh½ºv~ãl5Ýò›È·ëÀ§â&Úº-ûf¨8°òíËn/;þ÷QY \Ž :_ó&–6víñyxçq³ødèÏ›owh¶ÖÝ«‹E ŠÎšƒ”Åö›gíZSá¥æÌáö†6YìŸE>+@Ùï…¾–B–gáä¨ò¥lßk·n Z%³§Uso+¦E©·q®Ü¸nÜ#Hb)Eóg=«{ô{ºxåªÄŸéÀô$;Fs’‚O¹9{ßĵe^œU©ýI–çsz凶6÷ØPj™¥7H÷-  ©­ÿNo8_k¸×jå–P--*4¿f_¼üAs²áVÓòàuÎvݪ\º¬:l¨fo[ÉÓ)÷­ÐímZ¼4°iŠÛ¹qs]¶µní°¬M+©ON˜ößZ+Ð@ñ–œcg}Erà 4žç~¹n½dä@Úõþêå¥+U¸têó[Èøó;Ÿ¿»féÅN¤9U³ñ&7v»Û º$0!qN›»[ˆ7SSJâ>L ‹™bû­²`×TU1ønÈ}åoÖš¦×n›j=Áƒm¹Ó°¹Ý·ÎZ$’EAÔÚ¿>uÛßmYÅR@$‘ ()CbÉÄÛR|B-ø†Í~¾LÇop\Þ³ÙÕÝ2Öæ Bëì®S¹Q² x…$Àólîmrý¢¬ß8J*‚Ø·Þ·Oì¶Ì<7OÍ‘ˆíwÈ;›€( ÷h0ÃÎw7¬[¾š. KZÒ´ËÕšD íØ³kÙ _üi¤DD& r5ñDD@Jܸ–»šþ}iŠØùÎöáÖþOAöi;]û’[æÜŒ­zjÚUºûrýÖäŠôð„¥ªo(oZÝ—üÚãÈ ¨ ڈ͎ø²b """ """ ""2«R¢´591žè6_¿LPûe¾½gý9½m¾µ>0šÊ‹vÁ¨P0 Îïj>•}ñ*»­µ ¸)SáÌë’íÔÜ!µi Ý^WeTù-Þ¼ê@Á9«5ÄɈˆ€ˆˆˆ€œŸˆ{;m˜[¨Hç:çöò]vµW»©j¨Z-àwTê¥:i]^6gws·¶t\uRx,¡mNÀ.%ë×9¶6•í5ûН1lEzkÐ6K7Z¢[e<@Yë{šå»*Ås*y~|‹›Kàî˜Ø¼Õ*S#§Î·Ø•7ïX7‹®Ùý\±úä€k6®;%ª]¶5hÕªÒÓéGÒh›ÛºÛ‹•bÛ4]& ¿ŸÕõS¦Ú؇v»¦Êc¶Û[[Vî"€ÚjG=]™K—͵ÄU«ALÉ=•Ó4´¬¨5бŽß&s^·nõÑníTfä֫Õðf—mV›mÎ#+w:”ŸA®h¹üÈÜÙí1¸m-@'–^ŠÊì-ÅpU@Rzº´ÊÞ»{î÷K­§R‚Š‡ë–±{p+X­(–S‡¥ó:ç0e¹º:«óx[ÀéÕMW_Wc\é )^„ÆÆ ux‡¯¸ÁZÓžöÎÅÓ¬‚õŠt´èœûwr€MWÃRרêûhÛ]æVo ©Ã¼ZVžšvåûíúö¶êÜʸ.u¯daL2å9÷ZØ¥¥¡ I`Mú-P3Û¤÷k„ˆ¡“÷Ó`›c^lÁDê^ȘeÊ‚)fÀ($û<·wͽËé M*€”Özû»ŒÓѹe•¨+Ùe:Hø³“myQ »1/WuÐÇK7¦©æM¾ý¶æßÿR+kpïr—5¸(yŠôãÝ(<4fý$•Û° êǭݘ {5Ñú¢¥}Ü[`\#Pâ2Ó6û¸\m1¶y SøOý¹Ãñ#á³_y§\ {Ëöý¢ku¿Ò²ÝÃïeíÝ·pt04Ìq²KÊ\³ná«¡“– `^&ù¾Ù=Ÿ?·wùQ÷«\›Å¤ö¾§ö°?ÿÒýÄâüD6ÕIïõhcÎô$å˸mmôÛ¥%öûRŽo^nòûfÜy– /í^úÚÕsC¦,Tq¦–ÑæMlØ·a4[O}9¤@DJ^ ¦Ž›”é>$ Í9ëö[¥þ,؈€‰Þ¬yÿɹúE÷M k£vX“2mÕ„smŸK TñœÃ~Ì×=ÝJâz×Éîô¬Óx§U³lé¼ç»oiü/k<ãKJçB½<¤,Öõ}­›ßĵv±fç{inRš…Hä|¥—œ›ºûÕ¥4µi5õ²ê_´p!Ü"9(©÷'(Î>ñÕq©D¥mÛ¯bßÕ÷Ÿ´›î½—Q‰¥@ðŽ©†–ºu ­»Œª½žïN¤dýÜ Üµ`0 »‡²ÖÆ#Ò}GûY¥—fRC¥©•G”¾¼Æõ›ŽáÀ¡ ×Ù•nó\ÒÁÔn\—nŸQÝë´D@DD œ„óö»{[”{÷7zä­s :ªtï¦Öë ô‘ïôKíÓ»±m<Õò@çû‰Oayíx+­~#ɳwp›·¾Uõ.¥p)‘ì´ëœ{îƒgqõNõ_¡àvDDD@DDD@DDD@DDD@DDD@ÊýÆ@.ìW/;ÉõeUwµê{`x÷$_`·ìÁAn£–ªhEüùѪûU§©ÿvA·¹¯¶à×›Ä Áúr$wˆÕ®Ò’(håëM;›—ÚÜpÊ1¹O-«ÐŸ±IÑ“¸ß7krÀ¨?JAÙß$ܱ#*‘“îÛÁÙÝøQLÇpûÕ´Éu£`n[ÍWé>i½ èÄ -Ýf²ÙÁ9à†Ÿ¯ü9nÿƒ[u>®¯ékœ·ÓîÎoíÙEq¹dzIö“¢ÆîÅôÔ=¡¶¯ÓXÒäjªôµhÝ~Zýgy,ZýÌ{¥9»SU>ÎÒëþd×¼Nq­9Àæþ$|qøÓ®yÖ·~÷~ó¶‘…´Ï=¿Ï{Û}j¤ ¢QoÙnÍÅ>"%Á(ˆÿÓýuÕ»h¦‹¬K°P­¥‡§ä÷çTàY¯ å‚ô›tê´O´¹§·:íî,ÜÁæäߺài·.-»mq²QSîKJº%Å(ãRœÁ樚ÈZLå›Af}-ó¿ü}Òcµµspì¡ÀÈ£cZU®öW潤õ†ßn¹[QðDÒ”Ê" ""roï­»BÛw§I¦z~’uÈdF¡` 2¨äß*öÛK)-ÙD©d ît¥Äö¿k:v;voÜ$\ ‚¤hÄž¶¹õ“ºC6•-BiÀb`LL~óhvªž²•ýu½e».§ÄD Áç3bÁÎÚŸ‚$}ÚÈ삾«2ü–šÄ {›ƒ±u¾|r®û›b§CŠÅQÑö³¢ pݳ¼»x1 ¨¢” q¯oç;½r—¶®€ Z´¢\<åösш%½ÀP¡‘*ÿ½%»«Çµxü«ò–äÖ c÷p{W¾?¥ÝË%‹hÚ€:¹’[å´Ò ""dlQ‹Úcm›«9­Íb&þn^*£@>¿—6!ݶ»¶¸‹Ú#sªg·ÞØtUf p 27I ðçTÎå‹71¸ŠÞ1øÐ/­)]Bž9ɽÜm‡´nÌ(zޝ#³3û¶ÑêmmûÁçWJü m×6´,Z`¦È²Çj ó{å¶Ü¹±oX£éçI¤DD@DD+Û«ÖÐá4 ¨Å”²7JèíÎE[¥{ªå€[º‰ #¾·«¯é'Nì¥ÛÂÙµ4Q‰gqП»ö³’æ»WRÞ’Ñtš¦ºþbã|ßoØ}\^ÍÎòÒ\ó€'ÇåKÌ6–îÛµ¦á©,Hð:´Íà""" """ ""2«¬*Ï¢îßÙÖ埫òÓö-åþÊtÄ >÷`1(}5+òÖj—m¾(á¼Di›íì?jÚšñ ¬ '>õmî` *#1Ö’~égÒÍÔùrËcooE_ ~< ƒ(a“}ù3'ÜíÓ¸ ò¨™Ävµ¢±sè‚`uDäûë·copò$iùP_ñ4[Ihsv×ý(r•EX€<8NOºîÜüîàæÛ>YÚƒVSpórZŸ´Lîêõ|‰O¿£{;W.xBáùÓ¡,ÚNÂ*ø€ð9>ó»nÆØÍ˜/æÆ¿Ä[+vÓÂÄ·Èq’Ÿ‰ÚÐñ1§ñ/>×¼Ó® rSñ!ÆË|aîüga[ÄôùS® r}òêöö×ã¦ò;qÚÖž53® s.ÿfÙ]ÇQò¢ææÃ¡[wÑIÀµFÊÑéÍÚݶí(>0 ¡ÛmÎvümöëmVÛ®€((DÐ:˜{ó²ÚSi}êJÿÇìþ¨~_ÖÓPr19?ãv|ƒÀ†l?:?ãíp¹q|N`uÎ[ö/]r5z@:B°úí?9s\©ÙÞ_g¹¸=j< ˆ®Wm¿¬¤NþåbŽ€S,Tõuê‹Û+w_¼Û¸.½þñÎmõxm°?Ën¸ˆY—UìžN¤@¨;û8]¨ `t5=$ͽ¼4[·Ü/cV§¢‹:íÞ³sÙº·ˆËÀÆÞÖÝ»IlVˆuÄ·¥,ÖUƒ{lûš:—4ˆ\Ú[~ò Và 42²·©™IÓE Juyß7¦uD ,Û¼¥ŽÕ_Ù´Þg{qfÈ­Æ Èq?sÊmé]/JW!Ï»ó ÿÔýÅI¦'3)rÍ«¢—7„çñ¥â ½Û—CZ>˜éþ*üÔ âW¼BT]uÒF# hÚ´4ÕL+•g6ÚíÎñí9f§R3 $ƒÓs£×S7‰Pâ¡ÅX‚èo›ÒÐ:æ;‹]âS€é׿üäÚ sín9VµpƒrÑ£kPz­¼èœa{ÒQUÁ@«ŸÖÛwYÖĪ’b8 Tüh*Öí·iCxÀ3.úÿ Ýeýi ÷‹“¤ šGAc¦•n¾›p$í-ŠUB¨¡jµ'NŸg-÷p;7~¯ëw’Ýñ[cá7øæ««H×M\i” ´n³p7—ôíèþœÑ Âx<4šÎT–ˆ ÊŠYÌɈ‹öWÓÂ%áÉ÷a‘´ øÅe ‹;kñD "`v– ‚*€A ÓSÓæK}ÖÏ"ýÿéï|O÷Gß¿ý=ï‰þé×9>ùpå¶»î€#ïÆìí¨8p?6uÄM_‰6ImLöÄÕõ\>“:â)´Ú§fÒû¢¿*l€Pr(EG(ˆ÷6;[˜›a[Î^“ù“?º_Oc¸`’à8‘“Wâ)šÛ¹â%OçÇÞ7ßþ/óuÄNû~r°«ë8?"Gq¾¹ío kÄZÿçd@ç³³ÛÚ:‚ê=ºšg÷!ZW§¾ï> 5hþ<ìˆÿÕýn¯Ämæ‰xz'Aüù+íl\O 5/æÍMÖ¸t[ m¹º°›„V)zêk‚?-šWñ £} SÉ_•5]ŇìÜSâ"Y­£v”7ŒVdÛ-£gi}ÁO“pAÈÖ')ü7d~Þ-úÒ?ã¬yÏñŒ¸œŸñö<çøÆ?ã¬yÏñŒ ½•z¨UW¯y‰ZáÓ§LÍíþ¢ŽS«òžX~²G_oÖ—]žÕr´¾è¯ËEÝl-(è£:._›3·zÕÝÚ²1:CV¤Ó§»õçX³hdŠ=Á3¹³ÚÜVׯ“ù7‰Å÷mÍœv÷u/ÕÜÄ| ’˾ Ú7(l73ŠVìÞ ]’¬Xàý'õ'Z²·dƒâ5”tµ}*4°"¨2m¢åÂÓE ÑÕÕå[Ó¯ȶw(QRëduëëZ>¥ÏæBî¯*†¹oR±ÒÙÄšéö7=Xq2MÍ—m!¨þct·Äy¬D@DDD@DDJܹnÚ–¸ÁTq3“ï[ÆT¢}sà?wn]˶í.«Œy™Ë÷Ë·°ÚÚ,>±úSýòÖö6Ãw—‰¿sÎl‡©nu@ãû¦âç·¾Ôó-ô.Ÿ‡í+`žmVùs¦ PY´¹"ñA(lÙ9¢ŸpKÄ [iµlí'¼É™ŸÃ¶gèÀñ?JuD6ü6É×pS.ªü¸;È)kpÊ£ @iÙ9;¿ÄW+¨þ²éþœwŸˆ.vQü*Ú©:â'ß//omp:hñÿ#·°öÏÊFuÄ {´l®¯ºiòæ«rÛvXò ʵ‹ Ú¶§ÆÉ¿Ù¶v‡¸Hù-¦''ü}¡Ø{‰ËK˜ûáØÜÜ…hÐ:âr}ßz2ÝaáE»o{£O(ÖH™Ís}·C¤7xü£ù²¿ñöØÖó½ãÉ›§â,è·fÕ¡Khxm[ûý•dæÝW>$½½…mo[·8³õ~l鈈€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆÿÖýÄD@DDD@DDD@DD†Ua¥€`s& r6ÂØ:¬3XoDôü+m#ÿÜmpKëü7ÿ숟 í¬Ü·á¦¥øÉ,»Ý›Ð÷‹†#WMï'L£Y´ý´Vñ€`dö,Þ¶ÊmlœÍìþíehT¹´Ì€/B«jêóä·áÛCЦ†ó”•2¿uÜ'±Ü58-Àóà[¹Üj^p)V$+utô¯D…Â-Öå ¬”4‘Þ~!oµi.ŽhÚOŹ'ïá}­›–ü%j?6S{@{ÌK#FKV^÷µ$èK•ÒÀ/Gh}¯Nâ[<‹ÐøU¿VIüKf ;Ïx7êÀ†À.RåJЧHê4’-nuo±j”_Gü‚6­Ü¸| ‡çHÕ¿»’®Ýy±Öÿ`C+[Uk×Ý޲JŠ7OJéIK;Õëj¶½sõ—ë&Öö6ƒkºMëžsâ> ¹Õ•6)«¼¾ÆýÎmÙ¥©Õ?ÿ×ýÄD@DDD@DDD@DDD@DDD@DDD@bµ€€pˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆÿÐýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÑýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÒýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÓýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÔýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÕýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿÖýÄD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDÿ×ýÄ@Ê """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""ÿÐýÀÊ e+1+X¬ H•¬V«•¬V«•¬V«”¬šÀµb²µ“X‰Zɬ ‰“?ÿÑýÀÊ e+1"²+Õ‘YZÈÕõ‘Y]Rº ^²++«Ã#W†ë"²º¼25x`^±YM^ÕÕŠÊjŠó0/^Q+¨sP/X¬¦¯ jzÅe5IÕõ“YJɬ ÖMe+&°-Y2µ“X+&" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ÿÒýÄD@DDD@DVE`LVV² jÈ&T™Àµb²•ŠÀµdVV±_ ¬VT™jȬ­dÕŠÊÖ+Õ‘Y‘X)¦@>ðãõÿIÖ´¬È’H©ÿé$i8pá@}é áîJ¨Ç1œ‡¹Á°÷"µ÷¥úI¯ú@½`œå+þ‘\ +&²•“X¬šÊW95zɬ¥dÖë&V±X‰ZÉ1zÒ°V`²åòcJšg@`^&}ïV S–C/…*÷ÙP¾Š€hqû¸D˼¹«N‘ZTcþÈï.i A‰3Äè¬LõÜÔV‹€3ÆVÝÛmHëÒ§ˆÕæÀÚ&FíÀHÐ 3¡ÿlžñ° [*H™ ÂU 1#*z²Ýí¾&ž>Ÿ•ñ”äAñDD@DDD@DDD@DDD@DDD@DDD@DDÿÓýÄJÖ5@µb²š¤jzȬ¦¨ÕÚ¤VT™ZÀ¹2 ”,b¹À±2 ðȬ‚s$ÒA&˜•$Š€|P$\5¡–©ç3¥0ð‰jÀšø`Ÿ ­Ö 5ðȯ‡ŒŠÈ¯‡Œ WÃÒ˜Êj2¦ ƒSN04 kŽ„‘ÀuÖ8ƒÄͲ<8À°ÈJTp×Ü2Ë€™Ej±5”0,sÄRA¢šãà½BšN$(­I$À²åžx™ á™ÊEp㔊áÇ(Õá25p&”ÎW‰Î„I¯(Ë‰Ê Àç"¾<¤¨9À½sÄɯŽR¹ç&¹çõÏ95ñÊW<ä×<àiY5™×<å¥dÖR²kõ“YJɬ I•¬šÀ´JÖL ˆˆˆ€ˆˆˆ€ˆˆ‰Rã†>, Z+Læzœ¥BáPF0-™À±¸ TcNR½ã›ØP 5O‡O“-¦º‡’ßý%]]¶é$7‰‡ëÀ©.WQlâ1 ˆ 5cP>4Ó<s3-ÀP-Ôtk«áÔ½_¼Ï~ÝÚè dj·…i×£LÝ®%J ·}Ø Ã/:dC3+*‹Nʺ»4¸-ÜÑû·–ÕqìØ»¤³«u)çÚx:1V®*÷æWЛ.–Ʀ&¾íuÍO€qçЏ ²@êãÄÌî²Û´ÍJ„êÂ¥–7‹î‰K¯bå¶·Þ(Ô)Zˆ=çµÞkœ(`Tu/æIk¡lh{ ®á(Å.%Æ{¶õº…8½^t±î_lm¥Å«Šê$bO[;ÀèT:HnÓvˆø²ÔÄà Õ¬ ãIlð@ÂʶõÃ[±Ç–­?!%èYê2•÷e…\Š©àp? K`¦œ--Š®0Ô1ÖÚ¡Aʈ g†®¦~Ü窋vŠ0 -³»çBÃÊýóÍì µvúháx{N­p. ੈbÙÔS†¯&H½TÑsaˆó¤mÃ=”{§S0®T¦¯'¦\§IæjL [ˆØ‰àp?¥¦7 ¨Um-(|çëoÌ[qBˆ¤¥Ž] <­:}HÄÈ\zË]9‘ŸÄiavÙ j¶@àOÁhˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆÿÔýˆqA#_†f5@¾¸×3ÕðÀ¾¸Õ)\}ȯ†õÕ+\=È®$´YÅeIÄÀ±i¤œœ Õ!,ÆQ\â°Ʊ«Çœ¥hÔàOå’Xsã” jÿY‡3(ÌÔ¨ç”+iˆjâ N£^#Ü€Ö ™ã)¨œ1PO»uÐç_$WMdô¨Î˜Àoõ€Ô§Nt5á$;S*r•’µ¨Äá$ÔkÙáιUŒ• ?#už¬Ž"jYÀ3Qj+ZNvm, I?õªmtüß§9:yŸrN±L*M 1©Â\r‘Z¯ M|yH.¦5"WWN­$%MXÖ¤aâ­k‰¯Š Ï<¥kãÊKdsÊêñÉÕã‘ïåómYç&¾9BsÎMN9À¹9ç-«Ç3'<嫞p4Õã“«Ç)_s΀øäÖgY5¥dÖR²kÕ“Y@dƒõ“YJËÑ"²`"" %I8pŒ rº‰%@¡ÏÓ˜ü²µVâ0>#LyÖC R¡Ž^œýé[€í)¨™rÌ4$Ÿ1Ú· 2j· àƒ_$É u3ÑuT5 v¥UÃ[ ¶ËzØ @À騥k„£’MäM><§wu±wÓàAúo$X´ JênmÔ>îlä§Y䀷ȕ/qÁÍT笅Ýš¨ ÿ¡$šxø×-ßWE±C@€×à·D¥„¸Ûd{÷Y@£¥<÷Ó®S¬ÚJ\ ßC¨’H {û¿¤–mvïU²4Ü (uiìk_…u³a×V¦¸9ëcúR~ë·úµðWkNf¥‡kOf§Ò–-L'” wVT ÛZøg!ÖÒ!¸ê®4Kª*ÇSs”Ü!{L«‹`@ç¤ëBÊÊëÝã -z‡Kö´J[{=Ú/u©J®•«hw;Z4HqqµÝÐBÐ3"jï<¯NMÒïݰV@¬q\n*Ó§£í`kÝm™CJ+À¨ #î–hNŠ¿&l¦ 1IÄ–&=¯P1û¸¸§–¢ßÔ×'»¾2»_(?Óî¦Âa~­rݬt±%©…BŽÇÇhÝï-[rÖí²Kiªðt´…$Y)u.)qFlnf4ôõ]•« ¡U‹Z5SSvµýšMÍËÝ鶀Р-†ºý^ŸVÚ»gHE¸Œ(hâtM¼&U­£Žµ 㘵•_ḃÑ:”Wìîk°(1QRøáÇÒ’M‰ÿIˆ‹|èçØÓ·!ï£+[zÚfuŠf<ÿgÒôinñ!Z¸š ]2â$ËJî7ÉÕ¥é^:Ïkæ›®YÖòªÜ /v®ž½!´¥ÝÇgêåÛ¹[/ukq©¤1­Xù(¯ûO«jºBK1Á4Óõ&èKô‘Ÿ›ñäY¶Qf.ÀbO?*IS¥‚âXâyWý/œß´t¥±ÕÅuÂ|It¾†ro$ü(ÄDD@DDD@DDD@DDÿÕýJŸ VTF2ká€ý$ÖWÝŠøL ®>äWý$qÌåéÊ«þ’kþ’žéÊMp8œ MsN&Añ™âsbsÎEsxâeY€­Ibs‚Àq37fá_vB¸ÕF$1ʰ.jÕáŽTŠqÏç‰ÎdÄ«SBq«E*s”ƒQRÄâc<ÉÎ+ÀW8–$š×9ëÙ®yÅ+™9ÂøÎp U:•P1$-p>8,y#òÎuSp²UT×L†ºÄΦ²‚忏tbœ ^åuŠÔÓ*͆g‹mi©±cYknHå+«,L„,@ÕU¾ì ¶¦Z-k²m \q,F&cqßHÍ:kmõ Ô `_PcZe  V REA8”Š…Z’iHà‚¸Œ|RãÝÊfªk©«¨xKÓÇ” '<ò“\yJ9åy@ÐñÏ('<å}ü ñΓžrÜó™9Ës믍ϵsÎfÙå‡à^¾9 øó™óÎO<ó¥ÖMÖf95ñçZɬÈ{¹ËWÇàɬÌrkJË2®"Xƒ, È:À¬Š“”¦xrM}ø ˆaîà ŽÉÌøä8ÔüB°¦œÆ5¡2?Öf‚‹V<øF’Ý£_ÊÁê<„Š\lΑÈgñä€X e"µËßRm[lGi³¥|÷”UYÕTê-Jð«vZK‚¬M #­ MD¦=Ý×8(LJ°ð5ÀÒÁ5Ô`åAoGªm9ØíÑËÕZé©=^t² Û¯ìí§Êc£õÞõÄéÄœù &s÷wp/p%0?´»®OÝíÕ_×%¿7±+µ¶õÖ*+E&¡uvô[˜m÷ ·ï"¡eÑ¥qÒ|ís±RÚ• !IÅZ~&iP.Û÷ô˜"õʵdŠs*£óuÉsÁs%‰ù6梀a€ŸŠ@n©J§»©¿JNמŸÿ–\Ҁʌ[À¿”Àç¼w=Íδ +Té<¼Ÿœ—¶»Š&C5n_´“¹Ãmv˜t7úMW!ÊuÝý™øÃõà¾ä}ø/þD›TS€•¦²+P£!Ï×™Ü?Õ8H¾.†•{»W9(FDê¶E{_9Ñ:rŒóË”cÝ=ËVí5À¡ |×§õ’æËwæí«J®¤u¥¹™µa÷ ¨¢Q‡”u\nÏîåþì|—tcá-Ýp6©l°^|ýY# :yÌò“̺=ÛmýÄ‘÷€ ï•­Ž?Å·­ tgâ˜\Ü*–]‘(.6]^O§5—R°aÀŒg+[¼“ON¦¸Z½¼{Ûv´ÀËsd=Ûvlµnil¯cªt\4é¼âPÖÉÏÍjý9†¥Ûm©w|þqÆ„Fôî\¹:l+iVÖÌÄ?kT -Ü·pt5i˜ò¾·\¾r;¶­5 ® 0‚Ë2¥å8üò®:ruþÝè%¡¤®:X’ÇÊbÒåqÉQ€‘nõ»•Òz†jpaë$¥âìËiN’õ,Ã5EíéôßTи8!Ëý“Eº¥ŠbVs¥Îíà« m6Á$±ì£÷lßk,–ê¸ãráÔÄŠô´úˆ12 ÊÄbê3>Pÿ$ÑYXSPr"ÄDD@DDD@DDÿÖý09c$¥+–rTøà[‡¹#„€pÇ¿—(|yI÷ò”&\hF2Äøòåká9Kpã”ξ<£¼ “H'<åYÕI©9JFµ$x̓Rša‡Ë~ó]hiIzR+^s¸Zšç‡ rM`@—æH¤®„åîœà°ÉñJj&µ©ôGé@Ò¸šTãœæ|2µ­k\ò–ÕNyÀªáUbjä—÷ó™\90­Tãâ“®¢¸çZøó”-LI®Rº‹eP+œ… sÎÀÈšÔJ¦ª’ØU°¤jñç2VãZP8×Ê©?8£Œ&šj|')‘©º W#„Ö¹``dÀ褜 ðVhF ENœi+ª‹\E+3ûÂ[ ‰04$µHkûdZ%œ°¨ZPxi"ˆô$F4’X&€án<¦uÔ@ÇJŠŸ†¸t‚ ÌZ¨\A©06¯) ãÇ)ž¯e¼ ” œŽyH® žR¥Ž86R 48 jNyåçžR…³Á²Nx6P.slò“Ï<¥+ž ”’N8R˜às–®ỷÁ°1«< AÏ95Ï<æa«\ Tãεñç$Ÿs*ørkà9ÀÖ¾<ä×ǜΧ‘Î*yàhúÅfar9ÉÀs 8‰pf!±äÔž5ÕË)`p§2#C,€ÀÕIãïÉÕ1×AX˜ŒÀü°5$W “$0'¨ðáÂ’ Ó!+S§òhÀS¤&XÌS9•I45 ŠMBâÆµÿ®Ì ö³Ë”U&€Lõ\c€Ò)™Å "†©›Î8ÀžñÛ°¸sn‘úò¯hº‘uÉd:WõåËS†<ZÔçþ)·Û!iƒç/Kk›Ös©Ñ}Ò˜8Ö<~Îïöæ¿ëÄàIp‚À œ&776“jÞhê?5J-ë­ˆ²Äð,B-?©ü¸-‹eÁZqîÎæÖç6d?Mò›Š'ˆ?»¹Éø·K+uî3”u<_'»X§Þ•{¶Ó´ÀxÈœço`ù&ã9‹|mm4Mµ”Ä[Zñ4 nvĒוE?ß-÷Í·ÖrX )N8K“sºÛ¶Þà *@¾m€ö‹^U”Þ7þ=ÀM1ðMÕ@ÄâNdÀ¢Þ°Æ¦âÀPÖË X )%M»gŠ|`Lþëµ,Gtµ4þrÀé,“œ¿vJé´Î§¨>34=»Öm½Å¼HPXëUl‡¡Ý@¾Ôjtâ]Ø=ÏöçEg½Z²‰Ý«€M¥½.›Ÿäš}éÚ#Ûð²Ô×x:)ÎVº@QÔ|?¥)ÞÚ»ÒŒ¯\j rêšÿ“#µ´Nªiså'AüÉͼ¹¸±`…pæçBÔQêÞ’tNúò÷çüÿâ*™¦ØjoÚ7bÐÚî–ÅâÈ☾²ý"]ös¤UFK·3úZa¨à­^$â&cnmûÑè¤ýtýÜ ©JžÓI¯¿9þðÊ@¼;±çvþ÷Èýìè¥F ñK–QñaÔ2aƒ/ªóžâ° º½ò-puëß´ýßð¥¯25· -ZPì<ò{¢cjóîPQ±ÌéÒ[®ÞÞßKüõ»p6M7n£¥ ‹u ;Oæ@qx½z-t©„¿Òv|„…µo+-ÝÝ@+Çøöþ’Y.*6‹Š-»q—õ^¬•q™1ÒÌêtDöM<ù­Ke€çú²h»¨4î—>sy:½kwuU(ÄWIÎ^dà³ä;Ïàý¤ì”[´©Èþ´ """ """ ÿ×ý%*(kŒ¨P(' ÏKŽÀᜠEÒ‚h˔ܞRšˆ&µ—3Êx r”e t“Z{’õÇŽR»” i'´IÃ!„¿ c”ŠøòŠøò€'<ò•5$Ö¹e$û¹J3b@©4ʰÌJ3æqãgª¦I¥ +)‰­qÎZ€V• Ï9VlóáàŒsÌHcãÎP5kžrp®5Ì@©&¸V•ÄJ©ÒÚ q5YriÏ9ÐHª×P56Çœ€|yÌ–âМdŠœêr€,I W9šojª¸Ʋît©"¸Vgf‰mN=XŸ 06Õó c@+$Ý Xò 5]ë­)Ùš&ªÒ>M së¸ý€eá‹Ö‘-UW'ž0£ç´ÐÖ¥¥·ËŽÀÑji‰Ë„º€(hrÎ`ò8-dÕËtWÏ„ j€ÆŠ+îË® g”ÆÑªã]X×Ç4\†y@·¿”W9H÷R*k‘ìÀ¹÷rÙò|G) ‘ÀöyÀ½sÏ(üžxÄ ŸÎA8qÎAçC˜O€ç΂¾ä׎r™p9óŒIÈçÎLjç'3”#œ‘ß8®#œW*xey`s<`°04S•kµA#Ï÷e—!ZÐ@¸Äƒ‚Z¸  5¦HÌa@rtæ}Üp™ê­>9 dN&’ÌQB1˦šT ’39Ê)Ë–¥0l¼p5Ÿ‚Ç£É( ' ©œ¡º2EÔ|l¼|LÍïÛS§6óW©¾*Ìû·j÷Œh|•4ÚKª¢ *…áí{¦è^ì[8–:›K|ÛüÚ’\ÙHvk‡M~êÞ‰vⲑD"‡ÃY]³Vд-ã^ˆ%´¶(Šx$ÔÔòÂW:á„1È Çœ»ðnlï*ŠÑjO«×.÷í ‡pƒ•zÁíÊ=ô{lˆŽá)ö½Ü ¶¬omÀí*“ã¤ÚµËßž_á×o¢*Û •©m9Uça;ºT÷h>ŠF58aÀñ¬€KvpwêNr›§WG ™ü{’ÝÕð(oþjÀØQ´¹N_üΑŽSÏÜÚ½÷w&ña†WšÎ€+ßááAú:`tå*ž´éZö¼ïRa£xst#‘R+ëé¹-«v¹¥¶ñ1_–¤a»:¬èHÊŸºÿ2Gtvì8õJ¸ùZæ7wv û!‰@¥œ‡2Ú{OÚÀô0•ÅòÁyñ2¨VèÕPËÀQð´Í+H¶ÞÓ[t+““ð.$¯u}}•ÒG›pjþjé»7]D‡–pÌÇÜ9ßtÖPµûeŠê^´ýtþÃðÄ/e¯1¯±w¡ÇÐI_Ä‹]î¶µ£_l@òm¯UÉØÛk8 N–ÃåÀÛ9 <»›}¡ß â:nì®ÿ.Y7nUWªFÔxÐ55Ö¾‡pEM“݃äÃ|¢ýÜØ)&­ŸÀKŸ¼µ¨}á·^ÉlW÷W¦%n =àÅ›ª´:Ø“Þ[ïf×€½pX8 £]ñ}¯ÞN»cÙÖâ}Y=cöOþHKnVã\ï2+@g5dU’JE–¶ëU¥Fb”*|ÖIrh0<„sÞYª‚nZ§ nÛÝOæMÑ•Ô2š©È‰`8ñ˜=²®Îqdò_üoö°6vTRÎh£LÁ]n3tD +ŠtÿŽUœÝ(Bê6Í^Ñé`ßGÚó%¼/qÝû°¾ÑÆ4§Wqk_Õý-Ϭ°¹Ý¸·Râ•cæJo9¬š"†é»{¨“™ÿ¹£èåÁÐÚPƒ´<ßRÑ‚*1#?ÿÐý"ðÄÇ,L€rÎX³€ Lœ yH®YåÇŽRŒåÄg”‚pã”9J±é4$aœÒsÊr¤·v*F# mm®°ë¨œ%¨4®RPÕkÙs9åL†ãœŽrœsʨֵLrOäž| @ãŸ5©ÎA žbò<àC ãJŠÈ$žÍsÎÇœDŸ8ª…¸F=Y~œÐ óíJ¸%jµÔ GŽB>¡\q0,ÄSZVemJܨ IQæÆ­w©Ž”?,Mn¨Ç¦¤Ÿ$-ÖcS@€žu–K?ˆî°ÕZ¤Ó.™ÒÛýšàn­|¿"Q$‘C˜Ç”à?Šl®½Dr ÆAü[j{!Éç¤ÀêÞ,Å™@ &ê¼[ÞMÏÄvÌ” sV¤%™x+#Αø¾Ï‰eñ©è¬( F§œã_Äö{P+Ìú3DÝíØ·uO„°ÒZ˜V9 …µÕ»¸[ «à«jºÿÚ› P*¸×3Îcµ« õ—×À¿0¿ÒvÚíØ×@ ÍzãÛÓ#î÷—w›Åpwƒãt]þdÜ J’Y†“–g„ MýżÖ¿ ³_iô¿õ%í^²íƒÖç=,?týsUP¢‚r~$öÓhîʲJ-ºSD ¶§ïëûœÖßÍZ÷=«ÏFžüáÚí/íì"Û|iWG]G·¥×çi÷ºQn©³\5ž«göw¿Ë ·Å¿ õ¥n—7ÎyÀÑ”ýÅ—-' ÏRÙåïÀç®âÎwè8Š ƒÖ^Åé'skº7ë9òµž”µ£È›Îhno›¨t-¾”¸´«?Ò?Ú[·ì¿‰¢Ê]=«Œu\nŒÔ-<$æf y­Q/€£!pv×ú—å” ®Y ÚÐè¸<±òn}d­»¬Eî—=Ÿ5¿fÿÚ›$#r”t[Ë¥…Pþ_VÉ$Ñ}ÓÊs=×£º–íÖ®ÃQ¸ÃÉ_BX3íð¸uYásŠ~ßüßÄ”»h[Pá‰@Àª¶(šUÝ)×wD ºÊêpÜ( A`OÑÜû9[h¥ˆ¼|:ŠW¡ÏÖÚNÃÿ×y)hªè%•U´0UÓçþÏ®j§ï*UÁW¶pucõ–]àZվ𛷗¬àý²¿ä›2W ”ö©ÆRÝÆ Ý]ÂàÈŽË>ßøæ¹ø a«En ,Œø~ñ&à‚ƒ‘˜.ÅîámBg—ÒÜþݹ!™*ì4£ÏôàmÿÑýrÎH9g*T.5ΪiŽ$³ÊAl³Ê4È©Ã8 åžP[Ç”šâ3Ê»” WÇ”åÅXšì ÓÃYÔkáÊs]¶$Pû´­¶:hÀÕE%«ž)~ hr¡>>Ì׉Ï(Nx¤1­p9Kž9å(ÙP*M+ƒH$ã–ü…&£§xǹùeiŠÐsãA•XxàWµ¤ûò«@§ NrÀ“L8se&ƒ§‡9`MOr‚”d1ÆEKP(áp.´# <å]`E4Ðu+âÉTÁ89˜¸4àaJ7‹Î€¤-M1bjeº¸ŽRTâ "‹O 51¨Qã5‚ †R¸0Çs•·vÔ”´¦óJ._ ä¯u½¼OxâÊÓ²˜·ñ mop–¬é¼ÁY:“O•§Ó™ÿȇ¨ÛÙ{ƹŒã´ªlööoÑ—^¥¨gê:—·òçm*W”P߉Þ&Š–ŸlÀü>ë ^Ü\naN;MAÀ äç\0å6Ïoo}e4j·p0:‰=CªziµÛ'fÊpNOÄ:o{̺ñ4î¡nТù¿¯EŠV€ÇК¨àJà a.1á‡(î=šP`n&? gU1“—pinßíåMÀ-‹ +‚þ¼ ½«WëEÎdŒ«~²lì¨ñ ?"nH¯NxËR¹ûÐ<럆m­Ûk–Ùì説x ^TZÚoìÚSkr)@J\\=M×:÷‡æ4q¸ÊŸõþdØ)&­î/‡ï?ˆ öß¼N&ÑÄüëšYüObÍB{§4¨q§/Ì¥´ŠÐŸÄÊܱjè¥ÔWˆ¬ †*¤9gŸ¹"þþÕ£°;Ûœ«ô+"ïáö¬wouöäHRáÕìšrl®î­jÝݰo-óRëÚz}„n…óÁyq2X¨Sªx×)†ß{¶Üšp[ŠâMñÕB8V¼ sýئ;vî½Õlþëèÿs$nB»…î› s¶ß³»þI»0rŽ#5ê–² ·í¦Ê`÷2ôSé/¿ý{Iº"Û@Š(ª(â±fý¡ß[/•–=›EnÕߣþœêµy.Ôb{HØ2ü ð3™’îÜVÇU¿ªµ?ëææºš¤`OôånY¸’b®3SèÀ¸š¶|) (uP³d¥«¥ªŽ)u;C‡íSìÞC\vb–€éíÜnÈ>béíÀ•&Ù ÄQ²§“èþÎk8žå÷´½Í°^õC9ì(=çø¦ö5[˹¸ê+¬ñ´D@ÿÒ÷m’Ily—B*iYDQdÛ$×<Ì Žå(Ï Bk„¸ à À¡Ê•ðË{ùJ÷`’ Ha”Íu—†VŒxG¦>Is\ëïtMO ò˜ÕE¢¤Ðã@O†k.® '¦£À|ٰƧ@€*8Љš,mµjI®b§Ž)VãžROòç*Þ\àAçgœ‚3Ïß‚8`TæÔ¯ ›³’BƒÇ k„®ªW0 (¥(xaX÷gÊ$ÔŒ2Ú@ÈåÊá‘Ìq‘§ÇŸ8çÎdPB ÆlTr9ó” 9ö¹ÀÀX s^$W‰ÈÍèp 4¬¾€E9åYš0B ór(Íp$à36±ÔYFfºªAz ¨q$fD5±‘eÀv©ñ Z…êÏ)¨H ´ç!hH4" Ð+t§Ãm™C¦•S^£ˆÀöyÎv´[IQˆÄTüh²Àµ(iL8FA˲{<䎳Î`õs¡Af¿›4ÒP)ìጠŸìó“Lð9s”¦xœš zM)ΈÄàrç$Œð9s” ©ÀåÎI¯IËœ aÒØ¹Ê\u¶zÁ ²\0g9±ªÓP5[1« K@ë¦-¦dÛ¤æ8Ê**.HcÄàxqzæ(sa°Ðã3eϘã$Ð`AÌq·¸sçDzsç2Ã<á™TU…yÀÐSQåaŒ·,8ó™!FQ\yËèñçiŠáÇœ°aÄñ™ÐUpãÎXQÓÄñutóã 0sã* aÓ™2ipçÆ@Q‡O>2(5/O>0-AÓ†×aP„äI” *:,ª¨3Ë€ «SLI2ô¥9ÌÔ( ‰ˈ551ÇTuåä™ JŒ)2.¨Ci®¥4NéîÜV~T ÷ÍBнã(ÃͧœòßwkWÚ¢…4Y.dP4Œ@ó|© ¥+A” *%±EP €—&„áÌç@¼"¨•g¢à30…`½éÛ!¨9}'òæäŠ)Î×ê-Ú¨ó›¥É3³jã!Wr;³§JôåÙëöˆWTL*GéJýêÙ4Ek‡†iñßBJ‹6P–Æ®,q#á´ÝT™Â¤š˜þùöÎÍkF’«Cä¢N¥ûÕÄ2(` IÇÖxÜ/ybê(Tv‘ø{ÙÚ4àÅèskqOjI¨À)^XÚq‡}p·!¤j]‰5k™ÈK… 3’îÝ‚Ú&ë’n(Ìa“Ñ:»›£+ïî„?Ú™ÞÊȧÒ/éN¥òÀË»Ý)wU|ä­IÕ¼SJ[¸y Iþi}LZˆ8·/Vhª/vÜ»ßÙ,µT—:H|îú~ÙÔ»½¹4-¥¹=Pÿ7D¢unÜýZ*û¬ZãÿntV`äq š‚13Y%± Å¿ÓÖœ£j…‰´M¡Í _Ìö7?‡.wht•¼¼Í¿Ç]Vàaø™névèkwrÁ+èý$îD[h¶Ð` â˵}/þ$×níl¯wl5;gÚõû=sÖÂ.ãa¶¿Ôë¦ç ‹ÒÓ—Wâ;Lþ]¡=¢ÿ’z'¬ÑIHãèË€ Ê6×u·Ümµ_ÊVÁÇÀ‹¿?xYÎÝï…»Vlzçîæ;ýµ‡^ô—ê·N–g=‰•«÷ö7»]V˜“÷„Çúø Ö’éÁ×+ƒŸ ûRÊâꆶնraåz²ÔR(¦šN4øÚ``—ZËhÜPj=7‡eÿiõ7?—õs¦¼«à« ©ÀƒÆsõíy¾Ü{¯kü¶?™nPœ7Sﯥzm[¯Îñfó-ýÖýl»\mÓwv,ipq¯ÐÚoêN¥UE ¢Š¢€ €›„7st»˜#³p}e¿ñýÞ¼½ùÛKyt¶ÅX`ÊÞzLÒùFî¯.y-’Ür}§Ö[ÑœŽ¥¾´§AÆâæAò¯Xû_­$š…>L¾x U  †ªqq–Ï)Î-µ«¶\õ/˜Çéìßé&Å…J)àþl ï ÓÞ)öñV9zisìÞq-Û[‹/rÞ …€*Çæµ¶wËî§Cw;»A/ÕX·Zuý_Ú[y{¶ûª]´¸¦å±å óSë-Û•„-q´Ý.•¸I®®òÇwìz>ÏÙΆBÃB *1ׯ¾„ºdi Š­2¤— GV_ë-¸py®’Ó\|í" Že}/2_¿µçοçÀÿÓ÷ýùT¨$cœ¹ÀV†“$z½8ŠÒã!œÊ+e“\°0&¸Œò2+ãÊQš”489Ë_ª±ªƒ€_×Ðxg”À…ï °®µ¨¯Åi¨-¤UH4ÇáP¦„P‘mŠ¥XtžGêÚEÖ¶ÎP×P‡‘=–’‡U¢®§ˆ"duRåC ν¡äjЄÁÔ¸lŽ.s#sç”cUÇÜ’ítƒD¦Ôþ¬ 7ïÌî;­À¡I ™å'ç:µ/½ÿñImTj)¯ `C ³Tã-LÍcŒç ÉRAáÞ ñóåÕËj!M+@kÊâ9Ž2|åMhzNcŒ“_4çÎò9ó”©Àö¹Ë5qé9ó”Ǥ×W8NUÏœS,|äT$çÏýÒk—KgÏýÐ'!€5©ã3Ä)ÒkZ7JT«gÎ-ë*5!­MqJ€Ê¤ŠK_“,°4aÏd¦C¤ñã ÚV`ÆÞ8ãX¶À#I¤™š©-¦•OæH{w@R€‘CU&¿@j(`˜SrPP0¦LÊÚ’F8á#Û:qÄñõfˆU¢pçŒÎÚÅø×€íJ_ª2ܶ½t8só¦®(¡ŠvEk^–Ã3—)A_'Î¥ ¦Ø** ֵξT» ì󜄛 Ùé"ºk6k„ô„¯EkXsL4Õ™püéÑ ë«cލ K2Õ©JW²³\qè9s 3- ¨ÊKº-C`iÄÊÜ]u22 $ zM2&£Lª:¢Èù‘= Ö¼æwª0Ð+Nü™••*-°4¢[¡‹ eÆP½kDc”Žíñ"Ð I©“¢áÕPF##HÚÍhº“S( \âz©ZÓ©¶1ªW›Vg§EÒ¡h„ ñ¨Uíšž¤¨æ²·@ ¹ƒ«˜Êjú¨z*+•fbÛ5ÒEj`jªÕ¤j&„Í=Î<å(Øôñçù£>p,sq–:xž3*šŽž<寣Nž'Œ ˆéâxÉQ‚áÄñ”]Xtqü6æÒþÑ݉ª“×·=“û)Ñ´ÝÚÜÖ·hàÊgJ‚+SSÃÀ'&óf—˜\´{½Êön/÷¾ÎY`>äæº÷û›f›Å¥óÿnÿC9­ïojû½ÔÓ½8)>Ì®IßjÒÚ]#©Ž,Ç6cå¼ {“µê° Zòífmgí~³ëgB:ÜPêu)Ê’À{ó–âµ—7, UÆí¡Çí­ý·õàt³ã9 “ÙïR—Mb¥|†ò^ß§-k»p.©×¨`þ ¥xY¼Ú«Â—W2¸¿[kûŸW7§9K–‘ô–í)ª·g%íÁz„=:h©ùÆ«[»·û'ÿù5Ün UP€ËMUö½Ÿ™ü_£™[³}Ñ.†é­AnÞÝîy{gþ$ÚÕ’·r]­­ÎZXö_ë.Ín¢ÝCm²"CÚN¦ C¦¹Àµ²›€Rƒ,ãËœ…UU¢­9ÉqÀåÎHϤåÎA¬2Ì3Àä8ʰÄôž`P­K &˜q“ @ZJ Å:›ÃŒ’3Àðã¤`p9Ž2yàsç*Ã<cŒµ3Àæ8À‚3ÀçÎP.'Úç/Lr9ó•¡©4=®pxœšx|➟9:q×8^Fp%F¬jfÀeÒs´äÛ¶5e§xÄ‚~DÛ¼T3TÑkl0ž2€£iSZáY’L;ÊHɬ¾…ª+‰0 šÚ¨ 8Š×”„6 ¨b8âÇãé™w)¨!8eÀŒ5tN‹I¡TR  b`^Ù)R’Úk¤ÐTsžÉ­Æ Ö ×8m”8$ TÐ@JN¢´Ä“]MèúŠ \ ¥{¿›$°8P I  ¤{ƒ( Bår”v «… Hèb´aUý9:úˆUÔáÙQ­3ƒ«M@¨/…7Eô)QÊ{¶5Ö@jà>7nXÛURV„… ã_&XæÂ‚¢•ƒ¤†\(C ½Kl¨Q4èݰ¡µùÒi¢ŒkBDÁ´‡£©ëVJù?5,û‹u Q› jù05+­n&‘‡Œu¤Íˆ7êt­Ömkl“R÷Mó¶}?âJ‡¼Ki´X¹§æ§y9w=ïÞl;2©ÔSRŒ¡ö=[޼4Õ Wþ´Îa·lkuŽ#"«òRKmÖ‡­Î9ëhkh¤Z,isU´¥:|ûúþÎu¢ª¨U.Ï=öè/Y›o-¼Öô¦ÂÅOE˃Nªü½P:õc@*ßõÚ™=¶ï#¥®×QˆU^îÊy}çx’Ååì_9ùJ­ú6æWèÞ²(KáTìmõ°:6ŠÊ*J"6’Œ@›¼Õ:€÷ç0Ü2{[Nžó‹ü®¿åËÛ¿nñ¥§ èz¾$ ]¾¶°¡$ MO%~±çÛfâýË®;ænží¨ÈƒÔšß—go•]4%ÛGЧí$ílÜVm `•v7yqßK\¦­Õ¬À¾ƒˆ¢ÜÙ]þTÒÅëwÒÚ˜ F—_EíÍpcrÊ^ ‘¤ŽÍÁÒÿ»x¹uQY«@¢¬Ü¦ÚÛ×n{K¸sUú+?ú“•šà¸-ܭݽ’ ºŒuví¥ûkÛî½­ÎëìçzºÜPÈAC‘`Ví«wF–¦!† §Î¶óq­7U°zoR”#ÿÈ_ïû/ÙΣQJPyJâøþt Ô[÷[„¥Û‚Ê€£UÇ4Eâí0¸NÈkN«Óºò”Ÿÿÿõÿ‡/¶^óÿ!ˆgq…2Eú”þ÷Ú@ÎæÂÝëd]5¼ÇQº0*ÞOsövå6Û«¶®ýÓy…Ï£»äÝåž œœû²ní”qAš(7ŸRõ!A¥xø¼ÉeP €I©®3‡i¹¹nçÜ÷~Ô›¹Âêÿ’wgâÎÊÖn–Á6œüêÿȳýé­û‚ݦ5¡¥15'»Nצò·¯­º¢ãwI*œé9»¶Üš¨A4ÒªÁ»í·wåÿ×ÒÛ²0ÜÛk7†›©AqGí[»i¿¥.–”w»u±bzu4¯g¢^Ý»v—J |üf–Ï<¹@­»‹u¡éoÕ—Êr¹k†éÂÅÃóžƒýwï~–oFz—:gQêÎCÚö–ÅG7SÛµê\þ¤ÖË-ËA… ¶BŸšÞœÓŒæöñÂÕãñnÿÿGõi£?Çp¬´¿lUíæ¾}¿¤·ýËq~åÀËjÙ Î .Ù*®]>]镇ÕxtÞ·L]©§¼¯bÆ…Mp6köû¡tšZ4¡µ{&}óÿøÏ—£ØøÞ×ì&$ ¿÷ecÚï-£wmÕÞÛ¹òÿy#¼¹M]íÊj­z2¯qßiÓìµÿöß¾ÿÕ÷Tja†ã=™¦B´>ü„P3Y4­•Î@óx󀣞'ŒÔWMqJ¤.gZÓÄñ’tôóã!W‡ÆX GO>0)¤UzF5ã9Þã+…TZ‹14©õgM1^žs>ìkצµZS AÁVŠ 0Ãõ¥VÊ›aJÖ¢§âͪQŠÐµM+—£.ƒÀe`©0¨5®oT²ÛUu WRš’yMY5(¦‰ÌF#X!ÐÀ¯gZÀßJRγC1!hBŠ©9ü/íM µ­«•òŽªzRéh*‘LtÔ“™0,¨p_':ÊÝ ÷ [¢…Z±Ìú²WY]J‚špÇZY-èR( RÜɘÛ*±, ’¾Q­%ÚÕ°îÆSB3Àey” ÚÒ„j <%m›#²8Ín/CàO9KKK#Ù.T ]9SŒ«Z¶Yªƒ€Î\Ž×HáÆA¶„ ͱ¨[* Œ}é¡Pdf8ÊÜ_((ªž¤šP*8À w!G ÷VhTy£9†èº 6íë`€E«­pPè\@Æ´P 4Í:‰4VRzHå3ùÇ JÔW–ª| nê(]H8Q‡êÀÒí¥b¤­\ÇéJwh€»L+‰9VK+á[uÇΩ˜ß6ÚÞ•PYŽžT©ÓÕK*½Í°ÁqΦj‚Р  TÊ"\P*¨ØœèàÐ*j šŒ UPTW¨Tø¾L–n¥ €±$ å$%Ö¡éLN3¹­ šY #FËÑ ¬·¼U F“:µÍ¬©*¤€A©ZçO'\À év^ñ@Ô©N¬O—:rTª­xÖ½˜Ø*Ä)ï5WÜìN£ )ÀÖÚå ŠÊ”fÒI¦©ÑµGQV¤W¥›ãÀé¶F Ù5üÙBœ–„IJ‹Ø?£!q\ FŠ)΀úRM)L‘RL¨ÀPéÁpŽ!r¥*¥@\4çO&GH$ %(PÓ¯m: ‚= éÂeF}K@':ùÐ7¸ëRN(1âdì…Tbsø)+l- !uŒç5lŽ Â7l‚ŒÆŽVŽX}Ÿbt :IBá 5eÂgd`Êióf€x;Iù6íÀ‡»9ÿl+€>mÕ°5¶\'6òå§ÛÝ@ÊXŒÇ.¯&`Ä“…0—jr¢qÙÝiN†bBä0¯ÂÓ47nM–ÌPUiýH¹Õ~ÎZ·»Ó:Å*N»wpÕAUÇôæâûWªËçÃIù7 uŒ|S% îÝŽÚ÷\µÆùå~ùe{Aòeaú26onã\¹©Y™Éà¿2¿ÓÖlð^\ýh¹fÍÌn 4Èñø/Û–¬ÎýÑbÃÞo ‡ÉXz[¹wñ6›Rm¼%†¶í®¾ßõ'¡÷°˜nÙ<õ[>­åþçw1ü:Ù³µRØÝ¼MÆçVk‹bOkÄöxÖœ—úî6º†'µliwÜwŽñæ§nmã¶nìýYÆÑøCû©›Ë¹vÆÂ–ížÃéíßµs§¼ëöI¦Ëk,U4Û­Tä\žÝÍ·,”cvÁÐç4ò.M>³íf£¡B\Žf§á´°Zœ[ŸêÀÂÅŸJ¸)qq6˜ÔŠùknmrâ[Bîh«™™^.Ôkå¼u©­úSšÃµë©÷ŒÆÈ¦•ºGÿsëý‡ï`tZ¶×¿¼(ßF‡èÔùßosþÜ‹¨Ö\Þ²+«ÚZóþÒ×ÛÿVtƃÿOZBÐ5 «Ò§Å–ÝnªÜ@œò}}^dÒŠ 4ųðÒsº=–7­UëíSÎûdûtþtÝYJ‡ ŠƒàŽëh››z\éeÅf†gww "Ûuzàn1j<‹šæõûH»}î€@+¬!‹ÉÒºu.­¹{iPo²v”n”4^­«é`PmÍÐêX‹CÛ§lÛio"Þ¹ÔÊ hlA3-®é76µ¦&Sš0ò^n sØgW6.šºŠ£¤O?ö©ô³fp\Øä•á!ÆÌ@É­Ý5©ZTV’ÆØ+¤ªÐLršS‚æ$à^Ô [M ¥BÐ79r%ÎE3ÁsƒÈ­p N Úç9·7ªõ×è+J`;R—­k Fš«WÁ [®òæ*jW…|™Öº…0\ÌÄmÁ`X©’M@À`¹˜-q‰T´b56WN‚¬@v­+œ±C«RRN â³7»¡•\-I4>M Yág¢-TÑjpl$–¸´¨LE õ:Q.PT5cN$ƒæÉ´ÅC(qÊRɺ*Ýv×®‰éXRŠŠà8þtù¶Î—(•'ÂGbtZ M9`@fïTt凊Kó”…öÉÙÈ˱˳” bG“–r¦ã µ2–-€I%}é ŠT/¿èж–j`I& bÍ]5Ò%C×-9c,«¤(\LmJÚºhhôhÚ…{5å"áHU­@"™ÌÀ¨e¸A+AA‘ô½8˜µ4»qÓÃáv%H½ÞÔ•NðPéÇìö¦µ0@ÂEÞÃJ­|ajKQȦ,Iš2,Šj ËPúªV”4ÇõfƒiHÿ‡Wª’¤ú¦v3e–$N ª‚w«@·+‡&%YJ€F•ËÇîi¹¶I$ÿ t'¡5÷à*_v:†–V­uñ#UÃW¦b¿¡ÝN°”›nÕnÙâùÜOÚý}¿æMn¹d›$Ã¥ù 5ÏÅ<ëªÚÝvõîG·Phùv¶ßmõÿå t¸{´Q¢š{Í*Ý;£Ú^Ü:}§ó'YC~Ê­ÕÒHóVû?2äZ.麊(¸/4ùÉösxÖî=³Ü\#YöwW¥ÿê'Fy{ò—m-ä(㧇0|—_2PÞkA-µn\4AB{¾ñà^õëv[åÈfd_·ÞÙe^ÑCZQ¾åÎtn¥l)LZ¥,ÚîA]e“ÈSä/ÕÀYÛ¥ 8°®4ô»´fù¤šg–\æÙ’é±p’ ZÓ(yvŸí,ÿNlX8•á^?¹c¹´¹ºtßQÀù7çx%ú•º”?ㆶ.©[ƒ¡… óõçÅÛouöMtuYcå[ówÑA€œÏó7ûÁ…«Ä+ø³jïï=ðçA c@1Çô§-ÛÝú5»K­q°OÝ}%ÿÝÿKº[RÎB¨âpû‹øYÕ¾7uØÙÿ,Ëkd3¸&åûFY«»nßcçwVÞͽ¶à¥+Þ H絇·µýéÛŸŠc¸¶Ïn«íë·ë/“ûÏg.—‘í­Á“ŠÇÕ.¨ÈÊý’(|Fa¶gd6œãhénl>Šçï-ÍÂ’jÞàà'=ÒRâ^^pwoQ•}ƒ²þÓæÿ{«9¬ БR1 0?ÿ×ýt™§»*l®3Je„ d¶èA©ñVM2ÂHa °Z® 2Ã„Š Œ9ÅpGéJÓ‡9…›€¹BšJ¨©3v LF”Ó«É #Ý0(.Ue3T¸†‹Õ¨OêÍ´¢tá§‘µÓP(Ô©¡ê÷•ÊS½uB¥z釆nª® €´×R·@ {Å ηJж.ãÏï'HemZ@4ã”Á¶å@cBTÄ­®ï»£t¾u8cXÜ!C± ­j¤hs™nUdUj ÊOuSR ƒÄµ`âq€Æ_¼J§ˆÇI(1¢¨ÄK¥pˆUjЈã XPv‡ m z…%;¡S¤i5(@ÎIÚç1Õ¦ºÔ^× ¦‘J€3.GIéž> ‘óh(%Ê‚)¤bi*–¨†•!•*+R+YÚ`h¸W3%Ù\Ì>Îj(@¢ñ–® ÆAN h£9EUHp¢‚xÊÛÉjài$BŒª¨:p\o7Ê@Œ#$(ÃÊ@QUÁr€!EÄJ½°AÈUq§p£ (Ó…h½˜C£¤-tñ–ó* P`½™%G%ÊÓ—³ @…ÄPH ®KÙ”½@Ì@‹·Uª.™¥E žnñU®eˆÒ+ÃÕÂbW¤Ó³Õ‚ä"˜¶ ÂdmÝéu9`@?«'S!mj¤aÔ8|1ÁsÀP่ Çá 2\Ä4ÇÌA SíK*p\ć ­BЄ\º°ÀæÔœejåˆQå/AO'µ­L;=¨¨ìæa”aÙíIWÉÎg3 Rƒ³™’@¥zs3Yî0&Š•$…qÔYTU´Ð25%]´€*@ÿ$²Û´ 1U¨$ãŽS+ÊîR„šôù06²"SEiœ£[ÔᆒH¥  ÃÕ]t. ªÙWÝó’n… •#êtëEƒv¾<é¶Ài9LFA‰SZ€¾ khšAAC‘rÀ\LFþŒ›B ©÷­2 ­Æ=zIÏåËjº((§ XçC*-K GŒ“#S°¢ÑFœÛõ$YÕEg R¸±ÎkQLÇfT¸1´Óˆ§û¤Û½¯Pj"R³S%h ŒWÈImà)§M oU hÁª1c›J] ëa@|+þÉ0= ù<>TÙØ© E,üû  ®8­($\»mA.Ê£˜ºÞì«*&UÌŠÂË-›)RÄ;slL íîZŒ–SX1éò&šw—Õu-ƒÁEOçIkoTP‡pÊ£©eîÜeS¤Tœ¿Ûl!ÝܵrëÚÓ«É?ñÛRA Ò¼X̘WueÚƒP*FT#ªw¡n09NÃiß„ÓÓ¤“‰Î¶ý)¯üfÛÉgLx1ý)p§ïC«‡†Ü鮜+©‰Ãsky.[K{–8–úÀÑå~|ß¼üNÝ Ëi}AòN–øK5·Vݱ$ ºç[|‰×Z@ów?Š!Û½°­jû !\iít³kžŽÖÒÚÛÛ¶¤P1å4ḫ»üDZpÖÝjãwòeÛcrÃWctÛ9÷MÕlþ¤H°ÏÕ¸ÜPû+&¬85Ï!?sýIÉÿ!q+oqoºÜ·J1öXôë[žbOF͵µmQ1œOjãzð+rÀ-Þ[=Ýß8dÞëI¯–~êðÑtd¾K¬²þ_öæà{ó›vCa@kÍŠý?ûKØÑüÈ ÷Y›¸´hǶãÈSæý½Ï£þ,ÖÕ¥EUн•åúï0Û»·swrJÞúÒ|ÿ2üë'€Î=ÛmmÍë"¬}¥¿¬rý¼Ñ.[{bè=­yzÓL±3žÖá.0]K€”l(ôö>D½¸a­QIÒµg®¡Ðëoég=°nhKlÊZŒêjá>q/®¾Ý›ßÌ`3F6ÝFVŸ«dn‰tPˆ-¦Jä öì4¸ÔYÃb”êõ>®jp¡"¦´Ã„羦Ó}ájh)t)<ÿ^ÄØ0*X£Ž´ n-‹‚€‘pcoÑaÙ¹wïS[ap¬¾cÚÍU@𓙜Wï¥Î¤ë.ÝEà~‚íÆìZú®¸Õžfü÷ºníª÷öçV¥ì=¥¦yÕÜ\»ŽáºOÑ'g÷·;w¿¥6E°aÙX–nm¥ëßk[y[Sû?Cí§b­18ŸÈ=YçmGÜ÷ϵ>ÊÿÎYõ¾’ÔôëËßÍ|÷WRøÈô\õXüÕÏÝÝþ¤éß”eKŠöÎ -k–¦Å­’—Õò¿xŸ9vz Uäõç=•6·/hÓKŽñ=Óó迼þ¬é  ˜n°U¾¹Ù:©Ø¾¿Ã½'HÄâenÚ[¶ÚÛd•—¦JÔ¶ €ó¿RV/²5{EªÜä¬/ªc÷ÅΖ¾Ï‘Ùû×kØý—µúI¢…µ¸t8[ººÅrÔ¿7ó;©Ï§g«N¦ÏGoè´÷Þwþ¤ÿÐý,8ɦXHÇÎpÀ@¨`8À`$Ðá€ã*+†S‡"˜ŒšŒF-‚€*D µj@­=éšêg—û¦”*¹ ‰2t.·ª‚0"¦©Z>)¥­9å.+\‡gœ ÷d@ ÆWº$uˆ®rÝLiA@1ÆYƒhi\àdöXHiA‘ÄLûEƒ ­2În*Ë]#.pÈH5UʹÀäÑCT&ÝxWc©ô‚›/×Þ0ée{† QðUÄ;Ä9€+Læ¤g€Îex;º-[)} ¾o†°F&ƒ„¨§ƒ r1(«`¹ˆ§€beti$ª5Å?R^‡8!«’ç(  j’X ⇒ç"„ÓΠÀ`;FM2Ás2¨  ™–¡Ã³™Zb½ž0X, Gg3'IÃã)Jiá+l1*HP(DЇgŒ… @:xÀ€2ìÈÁr2Ô==™ŽÎFA‚å&9/f8`¹EŸ'(£ —³&™ör ìåK”1ò{2·@:GNu÷ƒ4µœ—)W©u9îR6êÕHl)Ò9Ôr=œ¥/«”é H¡ ‘KôĦ^Ÿ+ÊVáUi9B·q«¨Ã€ $†8b`j‚‹C§ c,ø–bQuTŽžͨƒÙÌ@±ãÙÌJvš¤­ZCêÈi©2q¯“Ó<»Qïg jÇÎOW5í@i—jN^nr§V¯jO]3\àsh‰,Ü("Ò¾#ÔENgÓ”Þ+hVKV”UbÙmB„R«ZzÉ}jSª€A¬Ì LT®ƒ‰å,½d­I4'€˜²Û.NtÖ0ù05q¥v«RiÊJÛA‰ æ Jüê€1õ„z¤Ђ(D²¢¡ƒ YÐŒ¥õ¹eBUé•Sq™AjS…0øÓDÔ·TÕhˉ¦TøPr‹ršȩ̂´(|™bêX®¡Pµ30n5Ëg ©t”[h—„†lq¨¢õ@¾ÜÛÒáU©À͸ Gfr+UÖB­9’kê,ŽüT*­@ $ŠSWÂÑJÜ'P(šàIŠi™÷b ÕpÊ+j¤J…åzûZéJ5Æ N_ ¦ˆ©¤=ÖÆ:xkôêþÎfæÙ|Å4œBñ’˜xMøŠÐ6¼ÊI}JYE}Ï)$Y{d3›\å¨J¶@SD(nì÷`)Z '?;W¡uÔ«QaF5•»~ÍEH`F¯Å– æ½ãPr\¾?nf€«²¡Ë €2=i››ËóNºŽ‡$Ÿ¯:û¥Ô-±6§ Žñƒmž¦…hEG#:Væµ ¨iÀ×õ`PÜ¿÷œuhËW¤¾„Ô]ºµÕh“PIR¬~U¹]ù=8Ñ ;Sj•Grq“â2±¹´ ÇrP»š ([^ÓÙù±¯[KMwPePI#¦[Q§n•9€OºÞqﭥ˖¬[P­}º™pè^Û2¬ŸÃûƒtûKì]Ï*öz*ÊIœ‹÷‹ Öפ¸£ÔöW— uw$Y¶zN7¸Oªo1ïN’Ònõ]º¡­¿M°x'Ö~Ò÷øæ=Þçðþ«5¿µò­žÝ¿ÙODQG &wn„MM]9*ŽÓ±ì¢ÀÏïÖîZVÛõ³à«ÇW¥û?¥›mì JI:®9­Çóê$óÛg¸°~ùbñÆí‘Øe?EoÓþ¤îÛnmî­÷ˆh2e=¥o1àiqê”aU9ÿ²s›—íƒcµsèß ºù}¿›ûÍ´ÿ$ÞõûV-›—X*úÒ³…Ss¾auÉÛØSªÒhÍä^¹£¾¾Ùêt&]•®Ÿ#ÿ¸·sé=—³–vÝÕÍuRõaåùw-ù÷ÒÉÛ0£«·Tüí<¢{7}K“lóË” {ÆKúô]ÆÛz^^ßû–¦àRg~Ú\¶U97aØt˜-òÖ[½qjà­³Ï];iëû[P77¿tuqZõ|YΗSjçnÕ#µeTjb§µgOÙ?òæ%¶TèEFË·¬.½Ww ×r䨨S`^²´»…Á\YÕܸÝ8Ÿ7úw»g¹·æ)ùÆý¥ï£ý×ñf½Å‘i­ m ”ºmnÒ£ž1Ú`˜OÒhmÝÝ 9ê¶t¹âÞeÏÞÛ›’¨µ8(œ÷ ·¹[´¢\¥¶ñö¬\þ'ÌÎ…Z I>8_‰Úw°/[9`÷ŠxÐ{IÓfê]´—ÔÑYkžÍ€1ƸSœó¿ÕëÛ7ú&×lzÕù= _À¿”ÌOÍn”ŒðÒ}tê·ñíNtIź¿mí•´{˨C(A®Œ½}N½;3ñCi uSM1®Tœ¢îæê+&›Hâ«ôŽAô:-$ºíã|›ÍÕGî½”}¾åM¾èjºm”A«PÉî\ö^Ïí'Gþ[ù¶øú¿«"‚Öè[É€}¿ûOü©ÓN'8²* × ]6˜1Öu =›ß5ì{·Br÷¹¥”¡ÇX"ž<ÏüµcÝ÷û]wÿ¹ÿÑý¸3Ã"ž,àpÀ@{‚T °O r  TáCA‘˜ÛcZ•ž3|*¹q™ÐQ‡å*ÕÓŠŒ*(YAÌ (A¬¨jUSÇh”ÌUNœ;8M^r™] "„V˜@”2 b%èiÃ)B¤€Ô€Ëôe•ƒ( 4®YJ]Ô¨B]©Q–I¦=œ d‹‹P ÒVá"”QHfÔÄ%2<ÓJ¨ i§|Ùd=é±ãÙá2jwÇ,¬ÔÒ§Âc–bR ­;B\œñ^6“–bέ]“F¤\$eAeJÒºHĉ!H¨8@МtÖ²iˆìç( «é52âž ààöŒ·.Îr«OhË=àe™–åÙã S§ÌɨÃ㠸ʦC.2┯ @#Œ aÓ—•\²2Õb8ÈTb¹ó”pá”²Ó FR¤Š FPšF]™>*vd)F#)e#˜Êó+‡1”’EsH¨æ2€lŽ#(çˆÊ 8Œ °Ç” ±¥qAò±$±â2H# â8IfN#1!˜bj8Lo– )FÄ2ÂÃZ£SÅ,iŽ#1!•ê* RÌE#1£Ž#9jŽc9—¡œjpÎ1˜ŒZ %HVãCHb 1¨ <áœsM4ü5 Xâ=%™ÛgºPÅu6KSæNÞ“J•4'„€FC3¶Y‚ꥱ•2ÏÊ’È‚€R…‰§ ¶¡AÔ32„НPÌÀ– g*T5*@"¸ñ—¨Ã¨fd†u< d®V€â´ ÎH úu«HþäÑXQz‡TŽž¡Æk×j„a^\ƒ@H8r’¬ ÄêÂK8 a—(7à}@S@Ofª-„U=!F¬¸ËÚTí’*Ã*MAC.P2¸à¨ª<ª|™ ıÐB…ÓI6‚IÄŽ8ÍÅ5_'” \k˜’؃F %‡Ã”–9õpåŠK^š<Ò14—z`„-(E*}(-JšðÄS9#N kN%[P&¸J2"Ý 5 $Ž}¤š -ÆU ³bj‘„­áq”• À0®uZtÀ­ÍNmø©¥<©m¦ƒ¶F S.]2Mµ¸µkŒÕ¡éù­±¥ÕÕ\£‘–0:Uܶ#_õymÓRÊöÈQðФÃM³yÇtJÐPsxm²¶Áé%‹$Œ~»@î@H²,åÚüöòöäâ¨{«~ç´i§»·°Î·KW¤+ š·OMÅÑ/³dÛYK7A¶G”{ ÇíWû;n\í›’ä9Ÿ%fK¶éïŠîXê.¹ÔýÚZ·+«¾¿†)dáÉ®y߸þ¯ìçPÒ€»±,x®àÛÃuÒÃ#°ÿ³û±þÖÒ;?xQ²·oêÔÿ~çÒL‚}èëºuôHpÿû›ŸiõW4´ïiÅ›ÇV¯gtù_cwí¿­¦•ÄûÓÊß²ì· ¹°Gys –~±~¶tî7­Þ}ßh½îã‰ò-úWZ_k²[$ݸ{ÝÃöî7È·æ$}¥½éÞnX\'vdz·ÿvzUž`ÿÀÝèú»ƒ‡+wîOO >é09÷ÊFá^ßiG•oË·ð=¥¹£^¶¶ÅÂÃI¸Re÷“t•Û.º`n-¯ÂúoÝc·Û%«æÝßœjk´Od}jZµØ·Ý¼ CÞ¼kit¯Ö¸4ýÅŽÛþÒì£Y]½ä¾Irݱ=^ÊïÙuüÜí¯)W¶®ŒˆaCîÀŽæÞ¾ð¨ÕÏý²ÌÔÀbNBa·¸ïoAö–ÉK‡Â¾_ïç%Úí›8;Çqcð`eeM»ïhšW眘üý¯âÿVuË9·,ÛÜ&"Ù‘õoÑwü²Íº°‡H:ßÍA­¾ˆ½h]´Èsaä|†øò¶o–•©ÖGPóXt\Õðå;ÍÕÜ¥óŸ­¿…o£ù³îZ¼Æíiqjh§WEï™O›íÀßï6Uˆ nÜâk?™Ñnpoún¬î‚÷!tÄÑͰ×-§ùgªªª4  £ œÿˆYïvwPf¥ñ¯\ }ÑÌפz‚šmM°^‹` p1ÚÞ;µ·jQ¨ø{/¦t Í´;ËG;l@õç­|¹Ó^9Îzw‚˜ ¨E}+gWÈ»7¨M8V¼ a»m­Þ6˜9>³»ü§›$ÑqÌÔµ|®< TŸHv¹IãÚò‚}/+”šú\y@€iå ùHÕážÀåÕÇ”­rêâx@á¨gÊCÏWÂH>—R Åz¼®P$º†g„—PãÂH9uq<"¹uq< U[Ô8ð—SÙêçÂUN«Ÿ prêçÂTüêPðn2ÅØ%z@Ç>d¶¢4žª0’£HQ^¸@)8upå,;#«‡(^ðå%N =Þ¤ñÏÉåððåÇ?'” WD·†´¯dáâ=R–I]Åô2ß›0mDé SÁÿ]sœ›‹»¨K­(|¬ ÐRõÌx/éÉ\w,k‚(ë_Û™¯}Þܦ’zk˜ó¤[ºÉÞÜt:KbËC‚ïÐó EïžÞÛ³šYùÇõ¾Št߸J÷vè^áÒ**=7ýÜæØâíæaªãjaÄ(ìj6¶7ΰ¶<Û÷`Ëí”wH;VË´ÿYü¹(ãxCýt9î8ó×êí2ÃjH²¦—Î?PŸÞþÁM²ýáHM4 ¹ Š<ÚýTÊ…“@1$Ï>å럈gmÓ`œ¾G/'o*‰wñ»•·´¯M±Ú¹O®žš*"…PW 2ͱ·nÀm¾7Ün)ì_yå—9É»¸¡•’­~Þ+mqfCíRï™m䪾á˯¦Ë ‹hsëovßövàWvmn->Ù½cÅ{6ÛÉ{—¿êäÃbt…7,Yì žN‡ÓôºþÖz mB… ØÉqn?ñ·¸[Ü|ÝÏ[è^¢Q@(BsîƒhPuY:Ç„koáÚçïLnn¬[:KUüÅêoáÛª²• §¤Šƒà‘Rù`¼øŸVpm›rÁ¬¢[Fƒ¼8„oœ³ó6ýµ?vÕíî5ÏDt'ðírM~ÍÑêïWN¦Öž„úË_ÒÌÂá+®Ùº5°àæ»zŸúsMÅ¥·c]µ Ü‘pìûOåNƒ¢ªç;'ÖÎ,Y»nŒ[Q§C’ ý£'—ûÈÙŠØT ]FJt~|èœ[Ü&Þâò]an(æ}ßéÛÓ€€œ÷únÙ»ÃWvÞ+Ÿç%©¹k‘˜oU‡¥uU’üêÿNå”V§,åEnV …PáªEº8[§@âšHoád¥»ûbt›.@ãEnÄô êVYòÊp§Íþ.â˜_¶á'Dïf§„œ„ 7gJÛ»õn¤ø›æú³jí`<ß×™n-±pX©Óà4éÓ4´úí#ùʾ _)϶Áï[>K–Áp-ï–Ò︱oÚ\U>p·â{;{—pú•‘GH'©KþƒÀôÉ *e5?›á÷?^păÛ±vëŽ*=Yo¾ïü&øÃ(ÿÓý¯ƒ9ø3—>ær§ÜÎqÃ)8ø$ûÙÇ, SŒ¸ÈmT¥eø®\da†"ví•â/‘\1K×,DªðÄe¸áˆÊWŒFRå€$RQZ¤pÃŒ1”Ž®c.RÅ€¥X °¥u R:¹Œ¹IÇ:Œ¹C= ‚ÿ2.\ÒµÖ‚‚ª§”ãˆ÷¥ÙVµˆå4 ÄrG­rÈI5Ǩ{ÒìsÄ{ÐHÇ3\z‡šzɨ¨Â´›ž#„ U«ñ –Æ„gÊEXÖ¤gÊjxãÄLÝ´ƒF‡œ3å'8gÊC1ÓQ‰¯)šÜ¸08Xšp ¯œ3<$ŠáÔ3å ÀŠÖG K–#8ŽC3ÂH­PÏ”šåRCc˜Ï”­PÌð”ZÐu<&€åŽDð•S–P+Õçqå#¯WRIl9ò™)m`j&„Ö¢¸áÕÄð\:¨+‰Ç %QÜÒ ®~ZÐu<$ŠáÔxð• @¤šœ‘i®1ê9T0,ŠÆâ±c€!E2Ô8u¹K'i1¡î¿Bf߉l-l ãJ±?sXüJØ{‹jÕË¡ßPÒ¹ ÚýäP°•Ää&Í—óµ!>1ß/ôg+Ûò«–©7u] :Yõ\Ñ¢çï%7Gpwˆè¶•­µª¡¯×êÆ‹‹§­"Š –8œÉœðýË ]Þ9B GáBjåîø]‰ù0-·Þí­mÕ.]PÉU¡8ô¶²âÛ!‚³\oEI‘´ÙíVíõî”è~’Fª+-»ž\ìP2¶¯0)ñ xÛë¾ïo~Õ‡ µ@£^±Ð“¬7âïÙµnÑ9³6³ù’,Ùq‡wu g£Ÿ‹œ7\?9» 9[_Òè™í¿ ·rÐ7®\r¤®TQ¡šÜõ²œ»j“yA¢‹ŒkÇ«MÞŸ5ü7b§JY x–«SãË›6¬î,hP ëS@$wŸÚ`(0Ÿrq²ÜÕüàöÿNEx “€€”ïÃÏÜóàÿÔý%G1œTsÉ9gÆE|<`EG1œTaˆŠøxÈS ŠŒGb$×8®XÀŠŒ1åˆÊ[–2ËÉB¹ƒ†S4liS€ÌÍ›ƒ–<9JyC0j”\EÄÒ¦_Pd Êh0 ¯PO‡„ hhªH‘,à=*Ùc.MIá#Væ9@ UãÀKV•êø$“‰Ç„#V4­ C0¡êü‘¨cÕù$±Àã'ž?’Iõ~Iűâ8K“ž<¸LÞî—¦&¤pjâz¿$«Çj8Kêõdq•f£V& ;\yKTsãÊŒç i‘©­`TZ×RàãŸP¹V§>Rk†(¨aÕÇ”TsãÊMrÇŒñå 8ãSÂQX1âxM+–RNYœà{¹À­@âså1ZWk6jR¦´¬ÎÚ¨•ÄÀ9`´RkSJŒ"ÛPq©ðK\Õ§¤EM „¯I ‚x@°m"¸á^ÖÈ jk\%]‚¥jxÍ-⫉*Fµí` ÔŽÔ²ö×<Œ ŠgÆ—k.P§,òå,£žP£žPåÚË”€z¸öeÇ òPÏ(çž\¤×ž\¤óÏ(çžP'žyG<ò“ïå'žy@Ž'<„±9甎-žRÇŽy@¥ÀHm5ÄPÔp’AK- ± T1ÄËž9ʺœF!Np2.ŸvïjtñdZ°Él0'Pê*{%ˆ˜«©i—ñ)é›é}É$Õ,òòŸÖE¸÷IPq»xðô-ͬ¨EÓ¶\ êºÙçy÷d]KvÝh“†’h€ŽÍÆÛ‹_I6ßëõ< ^[v©yßUÔ5³#é-Ú·êNzã™¶H>[ô/ùg"îöËQj˹9¹þñâÍýë[T··ª¯MY´×OD±jíßitéâ |ok-bÕ»;§DP¨qΪ{»½˜ø³Õ«CŒÍö{£v×}ºc¬²Õ@Jt÷žOŸÝ@õ‰M397›¯qq Ô Té…u¤üùŸüNÓ;¬÷}v'äÍmþ´SQe@àÔ~¸ŸÅö„‰ ¨U$×ÍXˆÝaó;K¤p-Ð'FÈ*ímÐAL<Dè¥s÷ xŠÿˆÈ>‹ijíä UΡ¥:5|Üìû¿âmí7KlrEýy†Ñø®Ý¼äe÷º§xRØ·¸¿­̹øk=§k›‹·(¤Ššiõs[†l;µ~ëQ`¬IÌjíB¤sž;[$ù‹ù &ÚÂv-ª€e„Þ\ÖÕ¾)¸“v`3÷ç¡;Õ-ÆÛPr£[ýh;k7»)𰯯mZ7€}ÒèR@õz¦äÌïŠÙ¹^*ßéã¨ÀÉ$S˜Ù*,ÛlÙ‘|g ¢ Q§2Ïn‡uv¸+*59ûK}_Ã%Ô.ªôÒµðLô€3´0øOúÓ¢8?Ø\'R>2ÎÁpBkÔ3÷'7â„}ÆðâW/ufÛa[œâJ-<@¾,Ý@…ÌedÓq¸>ú/êN‚}ùÏhSw{¨¨°7=¡Lp›zÌ»]FÕŽU“¥š˜ [”åß-6—âØc𓳠«°ÄÈf>¼ïÅ8ÿÕý-pÎG»ÆN<øò‘>< =Þ03Æ<øòŒyþHÄcÎË8ÔcÏ„Š:¿$,`d1Œpêü’pêü±™Ç„f¸áÕù&zz©­ •qŽNU4 R_H'jt'™Ë” ßWHÄ‚1F¡á¦‰pœråðœ¹@¡ ÞPÔŠTRŒ]‰l0¦ÍhjzŽ\¢‡£—(ãRIÏÉ£—)z½Üqü“7ãŽB=GÞ”e'P©á ©£‘Î\¨ÆœÁÊM)P áÂ9âxp ’Nt¬’1®9òŠxN|¤û§>P* Ƽò’ PfqÄ@œšg8©äN8I\i˜Ç*I¦XœâžZÀeŽ9Ê©¥3ÌËS‰œÌ9gF'Œ21LF&yb`š‰Š`124ÌÀ•­yIñÊ@À “”œ@&”FyG¿”R”ÄÖ«eX×(áÇ) fr8fra\r‘N9I"ƒ6Ê8œ[(LNpàѳ¥ æq2#‰€\k,xçÂf+Õ‰ÀËšqjÀ9æ ñÏ98âØ$¯…³!²ã˜kÌÒ²Jø[1$¯…³xs‘ïç$©æs‘§ÂÙÀƒ—Œ¦´¥iªYÕ©E,¸Mµ­` Üd ×гk@pñÍ4zÙ˜ÒNšfÈ2όǻ5­9¢€H^ü  ùÅÏ#"™gÆu¯kq¯~¯ ò2Ê0å(,øñ’«€Ï.p.Yå&˜ñÊT.YûòBãÇ.p-ïå-LóÊWO.rižysjxò“Ï<¥ñåÎX/(Ï<¤óÎE19å&™çÇŽrOåHÏ94Ï?~ ݵŸYEA5Ïó¥ZrEË·y¬tÎÒ ƒœ§t©n G™å›[*JÕ™€‰3Qm“²–ë^¬µ´K}6jÄšTšªJ^lÓ¼V~wËÖt¯þN®Êu°üÉ]»n¶•CW()¾ÎU ¦RÖo5$WU> Þ¹}ºnVÒ‘¥µuj§«ç;]p6 ºãmÃ?â™Þ¹¸ï,ƒik® Ϧç¡/ßÝËa™R~ƒÌÛqg¿µ¨”Ó©›¼1§vžÓö7º­MŠžcÍ“ßn> üu›+«öo5–ÀõÁ´»xX°Ì*Ô!—Î9æçqz´û»×•Sü’6dýÖØ^"¤òÕ×:@ËÝ0<ÅËŸòVkNkéé©ÃèôÜÿyo¨¹ï/ù'5î¯Å¬ä[f÷õ$ô`sÏ;7~/û¦MÖµµî$NÆs¤éÈVýYžÍBímAI÷D ÂŒM»¤óÐÓ&Ý'ÞÐé¹…¶ÐÕÅ­z3·<½ùÿÝQÊÓ~VOÕëŒIrn-ª iÒ”ý²ßÑrpo¦á%™XƒM]=]ßyrÂ÷Zæ†À¹w¼ tÔ´X¨dý9.‚ÖÖààÏ,õ< vû­²Y¶ õiPj—«5ûî×ëåšXY¶2¢¨ü“L pÞÛïz»Á§»¥|:¦§}¶Én¥y“€½ãi4ØÇÆÏØ!T „?}lvW‚ÝVv^b¦mµÜØkKÞ !°Ã _Äé÷ Æœ3÷VofÕ±bÝUpE­@åÂý¬_Œ':ÞC»»¥Ö…j¨¦w¦Ýͧú5 ΂¦cnѹ¼ µ¢„iÉÚJµ¡“ s5Î}û©Ù݃€ãáY¯Ý¶çè’ž¨œûí¶Ýv®ËiáˆP3eÚ ð1­yñ¤çûžÙ±U_Ë}ËiõKï@ÿÖý7»ÆEÖ+ãÏ”WÇŸ(ããðñ€|yÈÇœqÅrÆ+ˆÏŒrÏÞ€åŒÆH9gïJƒ–p$±2„ЊžÕË9SBEk‘áG xErÄå3Ë”(8g”{§(3Ê=ü AÌ甓îåÊ8œòå#ž\ àq9H'-áÇ94ñç'‡÷óŽyÉîrg<äðãœ>îr8ñÎ1ðç!k=Üä®\s1ã¬)>Ì ÷àpÏŒ žri–4åœS2ü°2 àQFYå,@Ï(’2§žRË<¥…j3Ê)–(ÃŽRHå$å‘Ê@­( aÇ)Ä甚øR ÄàrR¹œa—œ¿<R­ZP*@©Ï„±àd5jp2MqÀÀƒÇ>SŽyˆrÈÐ×T –3ñç<Ž|à©4#ˆ03ÐK ©¦8ƒ4,¿$d09ž0 éü3…­y@S†ß’£,\à ò’+QžP×94Ä`rçÜ29s“Ï”Š\9ɧƒ‡8 WÊ\qñJrMyp'3â–¦yÊÐÔáܵ3ÃòÀ’08Aá#‡åŠg„ ç!Ô° TI÷?,ž'(6Á6Á+å§é$• U“®Ùò þ›þ¼»¯„W1"–Ñ»ÊÐ581=˜ÝÚÚ¾-²ŒZŒÝ’£Ë’h|Û öù7Kü›ª=À¬ìC)©iO>ÚúMË–‰Öº­×\×ö¶ÿÇ–¿°wtÉÅñ&Ö©výË€Õ `Œkô·~\­æ´Ö ²­Õ=…Áµ1éE˜ÃM” bóY¹ÆHÍû(­µÛ6&ÚƒÌtŸŽšg6âÑKÖî\QJ(-«Qo›Om¯Î”;õŸý«=ê.×÷-Kýóo»¹jÝ·¨Õ­ÁÀôvC}¬ –ÞîÒF¶ê¢€0)—¤çôä÷×ÇnÃSšÿ+º¹:)ÏÞÌTÀò­îlŸÅ.]vîÖݰƒXÓ‰ëò§¤®·qV<µœ_…¯x··,=µÂ@ôW¥'[í¶Í‹[ZóñÒtÚ6·Hà„4¬ÑJ*pP¼'çmAnÝ·qÞ8uk]#ç_Ûkú¹±´Êâ\®A”©øÖÛûp:ITà'2ówpœ¢-çŽyEF¦Ï!´59Ò9ç/Ï9Ž| M3Ï„žyçŽyˆ÷ó€<ó“Org<廜 iË<äÓÇœžXãÜ9À­(9`0âf„TqÎR€{挆qË>2ÈcY<°<`C9V™É<Ð ˆÎ@áœ•Ä $/€À¨Ìg”šeÊHŒ8Iƒàfr¤ ²á' åa—F¢™áÂN¸sŠbpáÎMqÀå!†<¹Ë8pç*ԡÇ8ã¹q’xà}ùG)"iyàxqŠgÏœLúÉ4ÇË­â9‰4ÏŸ9W¥=Ñ&¢¤S8Jð9ó’xùƸó’$áÇœ<>r)–µÎI<àŒ°ò¹ÀSÁÇœ–>rp¦\yÈ4Ã8<O,8ž0ðfxÀ¦fxÀ•8¸sã&˜Œ?,€T2šŒÏ$ŠŠPçÆ–øÉQ––Ë *2Ç82Ç8‡p)‡¨Ë.p,ƒ„µ0Ë„¨§ä“…8eΩàá'†\$ x2ç$S² bpá-Lðá+…xe-Ï, Ï 4Ï ˜ÉÃLðŠbp‘†2pÆ©3(ªýázµò¾¼’F9@­Å%CKƒ.Dy·%í\PF—^Òžì”J#iàÇúç¾%ôâ®Àð:¼­V²Zù{}MTfŽÿ[q&éz¦øÑpà ì7ì®ÕÉ6ͤ¸Ö—¤ž ¹ÝMYUÔ©”æ"ë8Ïo»×zêöÏÍ‘ÒB/J¿OÖ{H¼—PýÞÃWd'©Êî¯7Ö{+}äéµy. ºJàÊE=îÝ÷ûsMµîùGÑ]ÌÛL7_ˆºmî[½i­niRqLz[»¹=O5ÀÞ~"µgj*ÕÄ5Æò ulŵÛ[KL*Pj+åN€'þgV½»6Ýù¡éøVæ}÷âVïn- î'KÓÔÔľðîSÜ pù_»·üÉЫLs'3<ý†÷júªá.ÜbÅ[¤ù¶—«·óSÑÏ,¹À«¸Df9($û“-ª¶@ݦ›Öœ—#wµ²>™‚ŸWÚ^þRMª[Á|î~¤[[{ÉxVãh0%µj¯‘q.J>Ù~õm-»©Ug'V¯²OmÞ}cÎð Ïg¯qzåp[_€5ÜþeØ ;µìÜKžºéüûMý¸ï¯ÛܳP1,Œú½ÌèÀBsnَ݂ᮈ§‰.{¯Ò†Ûwml j£±fR®{ÞßcË–®Yaón¹A2ꪊ *Šà7ÛØ¸jöÔøiÕñ rnþsñ¥¡äj¸}=)<›Vÿ¾QÚÚØEPA­ u7¶ï'fÙ7U—€uÒOõþ8‰ìä3iŽÈSl‡‹ÕÉæ\÷“-Å펽ÀÖ…4¢­Ð;©tÜÙ¶ŠŽÐPR0ûOg«<½ùÏsÕ•óC·Èµýɢ߲â¨êÃÀA˜¨ï7w TEZsÔZïøàtT¶ €âß©Úòÿ¯:[<SÊÿÐý7ã‘ÿÖ|† }wˆñÉåãŸ!ˆ[ò„ Äù$@úÙ•à'É¢Ö‘˜Ÿ&ˆYå+äÏ”Dª×Á–‘âŸ)ˆWüJyGÜŸ+ˆT96såqêgŠAÌø„ùl@ú¯ ->S>­ÏÜ’8øçÊ"Õ†gÇ9ò˜õOþ²úÏ•Dª½Ù—óôÿ*_ˆŸ-ˆS|¶ }Hp“>Y>¥§ËbÓÎr ùŒ@úQÊXñ>g>˜s•3æ±èíÆTÏD¢H3ç‘è'#9óèô.Fsç‘èMÂPÏÀDß¼gàâîxògá¢í¸MS9øHô uÿâ|ò } ¤OžÄ¢p“Ê|ê }$K‰ó8ôÁ/>a>¡|¾ }FXO–Dª‰iòˆõk¾Ìû“M°OV|– }zÿnÇíú4ïL„ø”@û=¿ýϪŸèóŸû»oPÏD¸™æþÿÝ~Ù§È"Ûî{6ñL÷ú—fß&|R };ñžÕ¯T¤õÿ ÿÓIñ¨öm×¶³â¹ògXÊ|: }Á²œv3·û[ßëz|n }º÷cÝë2Ýåkö©þ³âÑî —»&|: }{ií÷¶ÓŸˆiÞû†Ÿ.Ü蟈QüOÿdxç¥øvw¼kòV|r }Àæ$χDÿÙtherion/thbook/pic/agrippa.jpg0000664000175000017500000026445412446626344015466 0ustar useruserÿØÿàJFIF¥¥ÿÛC  !"$"$ÿÛCÿÂÿÄÿÄÿÚ õ?Q$‚ è# Ó (*@r Øà¢ ª( Š" C!„­<* "' (ƒ¢‚®(‡&š‚àGáFÆQÒ) xÓŽ9TlÑ‘8!Ñã„$Ї!Áœ £aœÀÀèb<6p*G (‡„4(b8ÙÁÙÁ„­„p †‚èŠ CG)Ç Ãa 6¢€2:8`‚qÀ4®ˆ (¢„*¶)À 68$éf¤‚ ©†5' :(œ¨qÁˆ @„6‚/ˆ p@ŠpØ! p`*¨B‚(‚†¢28 F$œ B€¼)À!œp¢† ØÈðBÄBô!áEáA‘¡¢X ˆ: €_.x·%„pˆ‡>4 b€!†¢è Š‚(¡‚(‚ #¢Ä:kÃQÓ€ãŒÑhZ KŽi^T‚mx|àQB8d!È8Ø¢Š(ÙÖÉ;#¥:Å8Ž(Cr¼pØgN Ž‚p@/ tmRàÍg ŒÂŽ…ت`u<DÀÒ„:0 ¥ˆ=Hà„‘JÚ£6‚ ,!Ib¡€88W‘ $PÌ©biBAѳ0\–' €Ž„š4gp¤B€Ñ¾xo S4jGÃ8GxŽ(¡!œ¦†XÔ†4S–Ñ(Q„Qšp”¸$D#ÌOX GÁ1ëj\O=M”PB$`|PÀ^8 ÑEFD”Q‡„9^¡E„ØàÀ̆29@pàC#  „y©¥4†l´'GH‚‘‰¡ èÀj¤ Ž+#ƒUǞǢ ’FQãlÌ % œH|htdàÏ<4P„OYØÒ ’|†Lh1°Èãà¢2?U¤ñ$0ÐŽ1£ÎÏG81±ÐDP ¢Üã&Ý chðØ<˜"† j‚(¢Ž/$5 Y(ANHä!™PêTƒ8pàD+>=DÆ›!¨¡(ëHDŠã@L1†üÌ¥¡ ¯Ï?.bybUÔó>è ›ª"z ž+r)çæŒË—F€Ì“† !ž&ÃÐʲ˜¿. yVnJcDy±² ¦ÈÇÊcz`OL1£%ù'EhŒ«,Šò¼SÐ !,ˆhJCbaM™ˆ_GpJóRQRz BW“&”†™³|` ù„7¦P±)De Õy‘´J2ÈÕÃGŸãÎ1XzÁ冨`Ò”å1­ ¥6F5oL±®¬10¹Šâ¢J°C~:6>JŽ„œ)À¤"ÀŽ( œ A(‘ÀÄ8áU@VŽu8àEEÍMx%é‹ưEäž!£Z’5U‹%F¡)Ìɦj¬Ú˜‚ؤ˜4ÀV8ÝD¢°¯4$ÈÈHä㈂šA¢ˆº+GÆ„&Äò ³$Ä- e!,Q¢¬”@©äJÔÖ8g-¤a‹SDUš¨F®$ÃbÐà´•µ/Î Ž áAth1@lt㎠*Æš(±<äÕ—'Š(у6ãêbb p‡pÀè¢ pŠ‚ A! 2<4:#BŠ À•fdÛ„ ”¨ "¢($aÐŽÕ€Çl FÇŽ9xqd! B8QƒƒlÐNp!ˆɗ%ñ=H…B0ðêp‹^Kt‘Ð @BàNSª´°‚td1¸P‡(@0ë,ÖŒƒá±Á@ 0@!8Ä8@Îj¼ôÑÆŒ@…8!1& œ>Ä1I' Ÿ. „¼(‚'¨p Ž6(Øâ( ˆ>@*„"F"ˆ¶ˆ¡ˆ"*qÈ¢$qXaù€_J“•l0UrÎ Ë«&°YêAÒ0£¢œ6WÐÖc`ŽœF$Š(+JgÈȆ<ˆoBE`Ä#²oFCPÃ#†E8SŽ ƒ@j)<åES’¤„^ކ!ÃBƒ$³ƒ„ /G”X`ËŽ¤àÇ!82¤¬$’Ë <¸ôÀAáFDJ’åx!‘NQ±BŒK!“F×€ 2 –üQ²´´$ (£$Å1°D¡á‘FÍÏI<Øô³>hÑN81Œ×i(ì! eÚ€(tœ!ÀŠ!„7&HÙ£bŽ 4(§ʲ`ÍÑ£4ØñÂ Žˆ!4E”§ …\>2•%À†t6u¡(Ü8 ͵eЂ‚<!&Lš]Ž !jC"geid(QŸ"VŒâHÈà@…H8bhøÔ)ÃÕç†Ø~Q‘F4!št؃côb8€pàÄaÐeá«ÍI8á²bÇŠ6>¤46fB½SËOM3¡0‡ ˜TÚÃU½ˆÄ2°ÝlzùÙ¶3æ¼Ê(§—d È")Š()˜<äöâ1æËéÇœ› zIçièçžš¢ŒŠjW!RQæÕéÇ™¦¨ÌÉ‘DŒÑ¶Ç•žž`M!Xk2=,óãÒÏ.=,Ï×TgŒµz`Ï@ŒY¬)à …mù4é“7¦4Ö””ƒC ±¹<üוõZl 9°2Qª(‰¦…<èÞž~z!çæœ†[3dH/êÔó²ÖI¦dô¥óƒPg¬D¹ÃdcãP”¤ã@yɧ(M±ˆ7†Ü™q’ìÍ›#m yª2FèÆ–FŒÅ[«3ÆŠ)B/Sz ž*ÍaOL bf΋ա5†Jµæ65à™@TšSz ÁÕ±2+ Q–«r´ÖòèÎæŒÆ¢€°¨ñ"2¥â­Qʼn‹Ã>K!Ö°pó3`\Ä#*lÆ,Ê—¡1ášA]TFˆ™/›c —Ey<ŒkA$‚K!ˆH aÒP#¢•^¢’ìÈÒ<­KPD!–„âHÙš@,D „ÆFÕÀ p„8ã…8 FÎ\ ²,Cä„Q9:tj Q1N Ž8(¢ˆ(‚€ 68 Ђ•é=tÆ–å°‚‚A‚("„6(¡Š! ãCŠ€† ‚œ!Ç § ) Àpà#‚ žbzyÀ8 ˆ$8b ²ð@À%p¤áÀäB!$/¨¢J€à £N<ðÐk±%G.gPQŠ(+Ç‚("B ©œ(°à4‚"8!ÑÔB"ù9»4Ч ¨£r%p⨇"4>`p§ÇABAQ3…81£I5ò€£è”ÐŽ8 Çb àÈüD¢S‚:’ €P€ „á˜*!œÁÆî­F…%¤`E0¥Ñ| rˆø'O ‚)FG—ˆÁ £€¯(–)¤/‰*È”!‘ÌÑäZ0…P„EKq`D“MøÈG´&|ß …BÇ ÂŒE),´®dpˆ†\¿-D ¨PA à 4ƒƒ`ˆ:6(Ø¡Š ‚pØ„µlP‘¡Ò9åG©,‘D CŽCŽCtdtàE+ 2Ì2ÐRš6ÀØcƒBª€6dR9¼U0’‹$@ÎD#œqÁ€ ÀžˆaÍf86±UXsÒ‡Ä0ESlq8Ix)Èa* ˆp¤#:¶åú)vT8jG©)DP"¨ó´õ `„›8QkŒ)èY’Ñ‘ËZ§C!L„t]áN1Æ´Ïš‘À3=’rAÁ å1µ)ÆË0Ã"Æ€AN0RJð#C¡^z*ÊA¤!ÐãÀœpŒ„:G)KƒmE8C(kÌù¢dáÁ¡Ã„9PS0X$âJðg ŽWE l ÆBÆHÖ™sTLphèf¼ŒõâhØg¨ ¢ 4Å:uU8p^®`»/‚8N‘ÚlyZAHÇž”Ú"+Ä%PÊâè€:¸£k3@–ã÷L“ bÐŽNˆÄ²Ñ(*`³†6S ãjM\P±ò”šU\Z‘Lñ®Z‚Q¦Mqlˆ:TÓ iŒáhF!®˜tÍ ±ãÍA!KNš!ÊÎKc4L/)*9¿Œá¤) !–' š/87ãÅaj`ÏC<ØÕ’ÇJÂ쨮4% ©YF²/аËÃ2M!—†dž@-’ ØÆ4ÖªÒ8X™âü¦4Æ|»ŒÑ«"Ó/^šYŠ`œà ˆyॣ‘µ†<Øa³) !èu–7Ò°a £€¤/Zò ¼L‰jÏG!™Ô¨5aÅaÕhW“Ò=7fPš™“vU®|Útz1ƒ=(ó3ÑÏ1­áˆ6QŠ=\ª2D¢ø©4FßLù^\瘚ƒ(z)Œ4Æ8ôn°K³4h’ð¦!IeI£4—’yÙ¬3ÅÔ Zlë\š³ÍÍH#†t’]f ¡çÚ­Lh@Å™¸*jüÀFìÄžŠ`Mу7,´4Fô#z'ˆ:fMi—4Q 0kxV’ÈfÄ3*hLQ»1¦3ƈÂG§}[ƒnƒ2EÙF_˜Àžy[¨ÎEÑ燩é4ã€xlp E<ØœH#—æL^eM9Œ4&˜pó³nžyZSS5˜¸L¸Ù£)Ë4¾ˆyñz‘ÍBùÑèÆ Õ$“C=xòÓÓ '˜Šyù¾1ŒÏ›²Š=À‚yÁègœŽyìz)åç¨Wžž‚a9hA2ÆÔóÓÐÂ* ñ£. ´1æˆÆž’yé®(ÍQç«r[̲zI\T‚YÍçFìóóZQ𒄤7ea^lO4/ ħ¢žfzA›&Uñ’‰d@‹" µ3u®1»1ÈÆ›ÃÏÍY7ArzI碙Bi”g͉›.H£f”ˬã.lÉŸ›ÂIŽ4&ôsj’ ³1Ç¡˜cjeˆæÄË–…¥2æÀÀ„aMQŸ­1æç«Ã‡Š‡ ™—@Ëã(q 3ÄŽcN0e‘ƒy5Êše¨žTcfäΚHóÃDfÏU3ëž4D"%Œ£50¼2Ëè¦Ù˜3ÑLI7Æ }ó£LdëÑ 5žyéÙyYêEi5‹˜=ò„ÜCÎjpù¯-=Á›0K¥4±çæ¨aj‹ ÒŒåRˆ^ÅR8n1,JE֕Ŷ¥A¤2Q,Ù‘#Î@25f]•&|בÊ2ПcDò«lPIV&_/GLQ°2 Ëó M5Æôƒ$H'"QlPS,¶‚€š“ H[TÉ®°pÇšã>]ÔÛ2ü¦-«.Y¨)ɦ˜ÄqdV4U›ŠÊ†Rž›”ÁB Ãá3E‘ †ŠÀ‹‚°²$žrz1AfˆŽ9-Ÿ#­9±3Ç‹k3ìL!ÊãXÒ 0l¥,ᨲ8®[²aVO#£„%’G"Tðˆäˆ¬,EAõ`–BGIÑ ÃÅa4„I#T¡"¼Bz²Ñ A¤ 8tHØ8ÀñÐØà¢Ð (Øà£gC& ôxh3©±`QàE0|#ŽpE#Ž $ ®p€œÁR ƒPœc` upw(ƒƒ”ØB„ù‚„bŠ0b¹ á±E€¹|("Œ† ãÊ¢ 4>(ÙÀ+‡6pB!¨p¡P ' ÃbŽˆ¸êø!€CApÊ´8 èC`*BŒ ª(=MÂRÁ Jp5Ç'* ŠÄaÔpQAl!Nà‚à8%láäldxS•DC…êè@ÄS‡A@‡DA81 1 A†àC—„ª».ArUÎË.hôÒ@ÉÇ%i`'pAœ ‡J)Â`I¢Œk‚ ´°‚‹' @¢$®pbœ‚‰pCt¢œPÑ®8l1¦ÇÃVAE:3fš!8Áà†Á8pAÑ‘D„aÍj¨f4ˆB 7´U•6©`8  J… NkÇGNㆃDŽ @P B8胊8A€< pp¡¢YÂ(*pÀ@€QĈ±8ÀWF¯.³Ò† ðåR0íœpŠC £Cf0`Ö–#bˆq #—"œ84@R ÅI´ 8áËxhX(Ê!±ÛÈT£R8´gHèCaœpƒ±8C§A!™ó[%°¢ŒŽÓ¡(ŠGGÆ!O=7Ôèf<Ù €œž. "Š686!•5cCê)Ò%it QrµªD#™ƒDÂ*™SNW':2¨ÀøØŽ„0p!Šp pƒA€I1 áá¡€B^TA± ®ˆ‘0’H#„¤6 yÝ›á’Q0Y[ë|Uˆ8(TEôElѨñÑ f!’ˆqŸ6PPøÊ½L‘ɤPéúd~D ÌPš ÔÆ™RIDŒY‚ q–-ÙH4^ÃDÂ9(¬"–u,ªWŽ$%PôK0Æê”2¼šW£ƒ$² lB%•ç:4O+L‘èäqÕ2€„_£ƒqqkI[Â:06!<‚H)ˆæ…iÊóDp€‘ˬ¹* t¨-LùvO lDàN [Ná±ðG8S…| ކ"€à¨"‚0!†”- :ô!øÆ 9pðÃÖîÌáZ]—ð–åÆÎ$™â3‚fÊæµæ|µ"”CF¬†YˆPÆ Ò”fØóchT# L5XÓit¥&µé‘ ŠM%•£eÙ˜5«“5f*âI»Z s„ðÉÅaxfG×BgB,Èã㈥¥2CÑ·'˜ú†XŒJ%Õ™É!£(¶„¢Í#˜ÁC- éè†Û`nÌY¬3¨”fpØÄµ&•ãI$£[Âð¦)“VgÉDM ˜5† ÚãTT—…aX[D- YéÇœp ²hè¢(‘É+Ð*í‘„x`pptàBIX±EWŽ@ƒDB<ÌÓ™sncMÈñZbÏF>7çÖ°ˆiO)=^·4D'ÊÃ\ÍDR.¸dÌc(m?.ÉæXÖ>=8óCÒL èfÑ”¼À–¥áT¶U,#P™Ð†JÃla ÁjdY¥1W6fÆ*ÖÕ˜CnR†‘s%Ñ8®³*’äÍ“Š“@\ˆf…™^gÏH)ÖÚ&ؙմ2G£¦,ÔLA¨3fˆË“ÌÏM<Àôƒ oŠó M.KeóÓTW–(„U =¤3èéz[™‚À¶0æÐóãÒ rR"´­4eI8"FoÏ;7‡žŒHàTNN"«ÂJ)ÇŽp@‡D80…nRÁHCTãŽCÏKºÌ›ÈÛqó-YÃÒäó£ÑLíÌqèg›ƒm)ZM¦5ItgŠ2ÔR¨Özm ±áã$z(g—ž®y‘éG™a ©‹7f |2²Ý5“ËÔSC°)±™.ÊÃ@f–¦#É“=D‡^lk‹C6)0`°V rô­8¶)‘K"8髪Òp'YÁ ‚>4  CCÇŠ­Ò‚6:)váÐ)Ä$•£D¸1(DˆÔBØA:@(¢‡E"0ØCƒ`pØèÈá♵´H㢠Œ c ðáÃ`œ £ã„ªBœ4(§(ØJðƒc„!ÑóˆÈàŽ€ˆ­8<7ㆂtëŸ l ˆDÁÁ’X‚ ŸÿÄ2!1A"2#$%B 345&06CÿÚ>7ö³‘_Õ¿.”QÖ¶¶¶¼•Ûdòwrèȹh.ÜŠw÷4ºŠôÐodSXˆìZ¼/)Å`£Ì#ÌöäC÷ð|]ÐD£Ýgƾ CŸöòœ´‡tOc­ u© d¢úlÙG{'¶ö´¼ò'–Ó¶™à{¦ƒ­P]C}[ExBM¸·a£Hó)ɾyüPjø@m]ƒGtQîÑÙëIÞv»òùóÉé¿àH 瓼ø_Šw/ŽÈöN(­i=Å4»A'À;GÞÜ‚§ÃzN:GN&§øhZ× ´nND {' Šð‰ßøxåå1£E|í6»"{ƒ·'.¤ ê@£¤<íB%î=ú+}Öûü”Ñ@£á§—Ëû¯ ºS|ð!v[Nm‰äÔ|òü6‡Ýk–ÐåÝ5;²sÇKdbì´Ÿ$µè~!;²iüƒ–ÂÚß.¤¶ð<5m[_>Óµ©&†V«ÞÇݯ(”Sü4á|Å¿Š=‚'‘ëMëäîBéV®E]E”‚gï´ùz‘*²‰Xš>М˜I_,ññ´Jj(òù(VÑîš— ¯„{-¢€]וå oÂ.ÿéú—mÜ´Ú̇5ëLÃØ§/êÔT‹}‚ÖC.Ú²cl18÷yÒmÊÆEóÛDö–ÐGÊaðòšÝ¯à>tÞÅ8¢t¼ 4[î<»Èó¾Ä ›¢ƒ‚ü—@ZO×P.®Í;ròœïµ› žDöêAÅm9ðÃÜù³#âÙ» “fI£¾ZÔõßFõÛï°rq<¾QriV2•ë¥ám[¿sq½®qgíè4í!Ý8胵Բ”ýÄX®¿ªxNwpƒ‡+—V7?'*‹!n wo슻mµ"©pZ®¼!¤NÐüSJ%]³`3,…ÁíÆÕ鄱µ¶œDf|‚ƒ¶‚?–Zõ˜_Yï| “Ù„§¹o©‚we^ëßc˜]÷rQ|'îà‡ª³žåÄ5—¨WÈ^ Õ¹Iq»-þí+Àåå|AHtâš¾F¶ï!´îÍ‚ôϽ®ëç+fz›Ëá#kh;ï~ÂÑrÍëί4n20žÚMì› ‹Íßg‚WÆÐ[G»Z6¼!çŠú\jäôÚíÉWVV^ɽھ4»£ÙV¯Ž½òÜ›ö¢V×Wvòøåµ¥ÒJèE¤!äŽí+HÝ -.Ž”;7zåÒ:ÓÀÔdu#h„ÓwÓÒPhZA;ÏÂhOòW×˃œML·;&¡¥a¬<Ì #¤Õ,09ÍDõ&¼<öSà é¬käDœeܦµ!à4©v"Ä4}SàפwöS7­7ˆÀôàߢWä4§†9™L‰ºn»-HêE5yVdÞs4ØÍ[hÜÈX7bõx¦oÓÀïØî{'–5z‘Ë=véq€ÈÀ¶‹¶´šè“úAÔò¶ÉØôßL»¹%íNphcÚå¾üQ 0MhÇü±Û\M¿qúä’ }¦( %;H"Sˆj.ê ÂøíË©Ž=lØ[ ® Î9Dö:ê!GÔòZXÂ×)é¢ô~¸ÐsžÃÉÞ@Útlq²y|um'ñÂwÊ/ŸÙ7¸A|±¥Å:öøÞ–Ò.V k5?†~/:C¸>OâH m1ŸÇ•¢›çÇ#´=öGº=–Zì'r´þ –AìN™ uì›”'ÇÍîke²nYmšl›˜ìlÓEn*7½æNñ¨£¡4¦ß¯ZÌ‘6JXyeú¥ØžöÒ±k깯gÃ’¾Ix“«ÚÀû7*â žYl¬ÊÞ2Šp ­ä)c ¹l˜¬¥¯)­Ã÷%œwÜþ¡‹×¶2VD‚*3Îry(o½˜;“:Ú~„xƒ?Ô2uîz<9<²>õ–Ö‡ÚY¶®¸éqö}ÌWî2«=<˜±Î½¦®,?£Cþ\Ó¬Àø}*r>,­ë¹&5ïqÉ$qVžÝŠX÷Jʦk7•ºW¢f+)0ƒóñÈ J‘@Ÿð=n{C¹#\·Ù<¶‡&èr×øxæã®M=ùã—Áß#ã[YÊÞÖÔ·ôÌ=rÚMi‰gtpáF¨Offpe8†¹txœ„SµéHÿCq®ö¼3Ó¼ÛG³Â %mÆ·¦ö­± 'ÿ“Ýcø‰¿²áØý:F?V”QûzSN‹jFGΛüLóºQtÕÌWmм:÷zÙO•lzo¥ß‰Æ¤«£_"Ϊ|/ä®*©Úñ3Gº¨ÂÚÜLÀ'®5Xu•öQªÑ2dä1SáÖuWÊÑlñÅmÖa±ß‹ Hý”Œ„?ˆçg´Ä7öOÓébþê9ð;× 9AüÖYÎmLD˜>ŸÝj=Tá¦êiÙÕ OÄçMÆÅ{þ^ûľ“EûÔð¹ñG^­wâQ¸pÃøüö¾ŸÿÎâ!üƒ;+ìý»aûæ NîARõÅcöØm;Ä,iÇáw'U³É>. ƒ"daۼРîñ쳬Ý÷v‹‡GVNC¦a¿S17xxf.—q þ;†£kqý–GG9'x°Cùs½P`µš’Œªµ`¬ „Œêâ%ŽævjÄÑœj»öÕ᡹úéàûüóÏÔ Ñͱ’Òá½û{6ó½-è Úð¸œu*@²§}ÓF?O ÖýIÍëCè帽Up±†QÌî*œ6?f"ô>žZ/õ5 r´¼- ‰ZEP×Q|š4µ³Ø#哤öÞ¹çç}÷¥¢»£ÉÅ9½Kã–Ðæ|ß.äñ>­:.–ÃØÐÀOn!ƒÖ¥Ã×@Ìh ßs•ŠÌ2»3Y´¦¢þª­Ùâ.Îo¢ú×Ý ‹ndb8ø«ìf1ûÇßÑÎ Å=©ðÜÍu.' ÕÀçq7çŽ#Ùh¬œFJ8‹þÆiò4ÝÉûþ'®õ†»°[’8ªðÜéÉÈk棵 ±³!êÞâw~µ-ù)Ê\+#K´W¿#}Ÿ<:Ý~ðñ8ÓëýÕ¦>Ë'¨Å:¹¸­Vy±¶eÍĦ§# Åe™Óº‡ÔÅ<{AkÔÉq뽸©£0q@‹”ô`“®û¡k!‹%8~g%úøüEöÓ1e¡ž[Î «Ã_ôX{bƒ‡ÞÖÝâr:qö`ö™Ê\1 f'-È^žWØËW#îl÷‰ì4ž³•8†x½¶ X>!•¿P©,rGqÿÏ=íbfk2­Ó•œœä‚VL¸¨ý¸|¤1T½9ȦÕôñø«¾ÆÃ²µ@šV ¸iz2‘[˜ŠJÙ™šïnFØŸ%0ý UÈë]vN¼¬áç¨ä"«ÃRñ¦šü5f!Ni,žgýM©ˆœVÉV» •+ä£~Län<ö!D†¦ÊÓ™ìbÑ—sšÈêJÖæÙ¢36Ê|6ö6[r¶ü= 3ñ%g8ã2p¾+ö£1a«ûj·L”rÌÉ×|5,‹ $ñ%˜ýÅ -µ~vûèêVÄÌ"Ê=Á‚‹c)Å2×ÃÐÈÇëWÆÚ4,‹PhDëy3+aŠ,´39»sµÛ¸'² 0WöM[æð‚øGkå¼ö®CñÚêMNîÙo|µÏH'vç®[A=JÁ,xÜ[ë_[N p·…ýh±’î¼ …ZÇÛ÷ñ⬾FF˜=ìGºk5Ÿ%H¾£QÿY³¡”ŠÁÌQ’êÄÖ’¬\TÒÏŒ§n3”«ï!«‡¶ÙrX× øªw+²|eËRãª[¯;<½†ŠÌµ°Âèñ^çF$Ž|#ÄÑb¦zŠ6ÇR„WØÌ5¨Qmfd1͸±¸ãVL¥9í:¾xC-a§žle jCk<óV‰ÐVµ‰³aÔkÉZ °Uš:øÑ4ðE1³jå*ö|MV=­n½n¦Ö_Å>k8Ì{ª¾ö!“Ùv6¸†Ž:ŽÎ°: C©4wž&ËÃÓ´(íbéÊú4ᨲ4nZ¸¸«>Õ숱£–í(­pðE-ª0Xm|]h~”6Õ\ezϱ‰«3ªVŠ»÷¦U능zÆju§,©IøZÒ:¶:(c“ >Ç®´xZísÎ £ o uz ‹Û«]ÔYZÑ÷6Þ2¤Ï­‚di{Æ}«Uv¢’&JÆcéÄrÌþoúɇ«$¬«qTÄA¬VE|eJï³­aõñµ«¹ìl¬ö(£²l}I¤mh£RÖ†U:¬d<[®Û1³Y³U³Ç"¼RÙ®Éâf«]é(Cjh±Õ¢u¨#±ú•橲b*½ÕèÁ #m¹J+qŃ® Ç]-|gUέZ¼&|mYdŽ ÏÀ³Ô‹С‘¶ö1¶¤£ey²úö[["!¡n¸± ÈñnÝnè¯ S‡2ˆCÂÒÐ^ù¿Ç2ykŸe®û×6­§®Åbˆ^9ŠÑäPÐ[û“‘ìš6´-¢6š r”Å¥›·í`ê2E™U­ve¹vy_  ¡Ørêû‚{—ä<dA«àrÒ‹µ¤Æô­ aÄOgO'_ÐnœŽ€'h•Ôk`¢QCÂí®!— `º›E½Éä;/.¥´ß+àyä<8;­/“åÍÚoãàèòhG²b³BÕËU+¶¬Aq[õ&$ƒ+ᲃO"¼›Ä¿;¯+kÏ!á'òwe½£Ëg¾6/¦ŽAi¼òû-„Àor›ËåÝ—pšŠÒøþ¹?sèCˆ•ÒBÀÆõr?ˆæãØxåñÎNè4ŽGÂ>:¹G˜_/Aw(ò5Í+Ï'rÒ]¥µ¾ÇDvM_/M·ÞNÁ§k]™ø¬½vÚŠ¤*βV•:Vo>Ü‚ym¾ýrŠou3šÀÙ#x'±)œŠÚê^V–×u¾A=­ÓiVc›¢žš» ;!Ù[äíë%JݹéS·j)Èwé;wS@[çÝèo“\0;ü¹ðÎÉÜÇ•­"Åþº9 OÅÇr%ò{&÷ yÈ ”¸{Åe…€¦ò:O·YŠPÊv7òÁßz6sbuyýxÏ-¡åè SNÑ_ Â%·µáu-”ÖÑ+h· Óßçi§‘+}ä»V5¸§äQðãØwžù‚ˆG³[È~(¼ì’˜œWR»4†,…çÞÒú5¯Ü’ót·ß|‹E7ÇWÜâ‚k‘=ü¬óUøÜŒW%oHN=šQä<§›¾{ÒY"¬2_ÈÊÌ>Aò¿û|üxO·K°[^WFœu¡áyY7Xlx›Öf¾tR²FY•â—êE(¯²ÒÚù@÷->àí+–zⵜƒ+cíChx'¸ì¼­£µÔ‚ ÓEaÛß²»”H'ÅóØrä®®‘¸#OuÙv^Vùv*Kõ£žÆ^´j»‹â;ßÆÓœ¼ PÞVÊÚø%k¹]×~[[í.V(¬ý£ºî‰[äóß26 çv"'E‹ j/—,‚8©_ŠÓšôŠpÚð‚Úð‚zo!ȹߑwÛ´[ö°ž?üž)g¼(Ùwêí=Šð»i4",‹%N×¾fÊwˆ×ÎÓ»rÒ( .ü»tI'¼Ë†´5õÛdž¤ZîW”t™Ý93—g'øa®_Š“[‡¿ï²ÏZ,¥Èçìsr¹YÛ+oÎj·1q³Âã#2½9$¹r²†A,npV¬2´1Í’ºëSd*,7¯%;W.A{róä/AdMÓWÞ\¸ú9 Q^ý­ÊL.Ë6NÀ¥•²Û¶¬ÜÇ•³¨ÝÔÛ¯’6TÉÛ“!vi!†ŽJWܽ“´Ó„ɾÙ=ÑÐmÌœ¥Ù …Ùkpþýœ…¦ß¶O¶ÃØ™÷/:Æ2ý¹oLöÆÃråã¹0·Ÿ±f»}ý™*bß9¯hIõ)·èÙžà·<¾•h!³r,KmÅ`ùâ÷˜tÉnŸVÀÉk“>´gjåçzö$ÉBã4¢¦?!-‹Öå1UgÔ¥¯‰}¢ŸÕÑjŘï=™,«~ÝkR»uè]—ÝBûη<¬‚Í™ ¥¨l@öÍv͘Y÷lÕ’[Ô¦‚V½«’Ç•XÌ£Ý6DÈjbçdò2ºøœ„–äÈËb(±yÚ9K³VfwØ…®»n!šœŠ(x4Žü¥•·'“}©£ÅBØ1´=¬ð}•Ÿƒrã.1Åñ~ý¬xÞrxD°`b?UÉJ`¯‡ƒÞœÝ'S“M±Á™ºçÚ»zõð…öqΊH²/ÄI,XßR •‰ dŸ{Æ×áv޼”î3ewGr 1rãg+Ï©FÇ{é¾â»¢},”ójc Žøµ‰…ñâíÍ^ä‘2E‰hn]ÍWYÑkÄ \8ìAV‹+¶®3¢÷Ä ÍVϰ ðÇDÐü]v2ŸDÓWî¬}ù=*øˆñØ‚'Uá¾ÓgãÝ\,a´³ñôÞ­þ¾#­–¤Q²"ª xŒ5I§vR¥«Øoñü;Y³¹•áÜIëãöb“Yg‰˜¨´²¶v&¶þ>(ド"`Xê츎6ŠØMû©£?\°Ý×ÄÆÇä&¬ÇÃY Ìl8þ‚¾"±µ-ÊVìE!”±!§-,AÑ`Ó“ÍhPáÁÓP Ç…inc=?K+€ Í@Ùjðü¦J|LÀg¦ÞŠÜEDí“Ñ£ˆê±·HZtP¶@\BòëL­fþ\[}<}ØÃó@}¹±ü³XZ㨬tM›a‘­°i¶ØÇç˜Þ–gÃJõÉÞ,tÍÌ7?ä¬BÉ"À3¢ðjâ&8¨APñ±ÀöÇÛÿܳÕíø`uXs@f&ºçJK«PôkVŶ9¸˜o`öE¿n[ÿcEd‡óVá÷kÜ–„µd°Žù׆_q"¥¸â*þû6 x¼A®æ‹zc·¯-•‰Ï©‹È˜×1˧îÍ·§3úó±0*ƒu±Íë͹¿vjg>óYúYŠm–· Ld§ÅLý<7|~z6:Ž1Äb¸{õ-¼mf¢t9 útñüÎF?Ùp«wÖ~}½Tpl ÇÙÉׄÒȾ{% /“ß‘ò¼.ËK‰7ì1¾üë¦_µ˜7ˆòaqS?W i5Ûâ)4‰pvuÚ Âìf¢2Pá§kÄ2‹«­À°>ß¡‰ŒdmØÿè‚•àq}îÜ­’•æþÃ…µ×iåœDÃöñ}xî/ØýH´YÄ:,£z±|,þº¿7˜[œ ÇæÙ¥t“Ärâß§ðÈÕ6ѱc:&dõÑÄú5Náâ“Òq{u."oì8qÿÇñQÆpý†÷ÿäáS¹³îÖ3£Cˆ$ÝèT|LßÕ¡#e©Äª2±:,GÌÇSšF4[Ûªð¦Âí¾#.uÊ„šÑÙ’Ýœ™m{@‡·‰Ú[f§üüK¿WÕíx›µ<Ž=:Bx‚Éž¾E߆*Meó½ñü?D9z”¸rh˜,@ìzxnùw¬V†g2îŠ25UÿêÂ;¯+Å–ψ·ðdÜÆRáØKkñ1>âý·5¿€²È¬Ëb(È{Dq؆CÄñH&Ç^ŽjÙ˺¶;þ‡ÙœŠXÌwäÞb䢽li÷5¿I¹¾ M;>Q²ßç½<ëÉ¢ïõÑóS§‡í#ì¼7+½'ˆ´c2PÉvÌ^LJ]ÕC îœÛÆë`'dVî\®ÈxnAëq4Ol•²•]^µÈ¬?‰OöÉPhœÝŸbûÛÿÐOf8f*òÓá‚ïaÙq ÈÄY-jïu,¤OcãÊnîRâøvÛÇÏK{‹AÊËn8ìñ8D\?Ôh,ÿÙ”­~«¢˜Ö4$·ë%qOŠî2ìva¿3[‡«: üTg…¹ jd&m¨ã€ °=øÜ¤SE32¹º;G‹xúÆWµ•½9Sá’uÄhÇaºdÆ3\ÉH">9väWÈ_Øø–6KRŒµgfnØ™,KbŒõíA›{b賓³bhªÃîr‘ÛlÕ)Kèd¬Û`©†°cÉä¯2¤5ÙRìS©Ëw˜çÇ܉%h—Ñ«îa9§KažÄ.ÍXc.P³Žœä®Þ‡¬šö¸†£žqù~†Ù²ìƒh×öñO/§ ù›-èda­™µë_¡,W)Ë ¬uÖæÇ¥Ž®ëäd|0c›n;ìñ˜§cß㦿$™»²Hp×,F¿ÿÍÊrpÝš<³K_!»q¾¯µÊUÈZ±…ÚÜìw, Va3ÕeÌMȬW«’¸ÊöaÈg…ÉÖÝC\Í5üu™%‰þéiãl6”ìFÙb~6åyhãlK&j[˜†]«(ëÖ]¶ìÜžİ¶…KY:7^ÜI¹Ó’†ý›8ñaµ2ä¬ÚÅû¶·=ÛÀÇb(­>FC%KþúÜ÷=ž¥È¬_|þ vän’Vd«Ë[¬Á{ Öè0ò2XP£r+W™9‚¶:ãmÛ«îjCC# ŠÇ±­Ž½Ò@ËÍ…{e‡.ÜÍCg~wQŠHj\ÇÛ–LtO޵¼DRË[Èßj^½Š’c¬6H߃…ÒçàmZ¸Ç—ÅsRÄÕ¬Tò\wƒ,o¹†êpªcÇÃ…|rNÉ_è“uÀ×2 x‹ËEŠ ñ>h›†“d£²êø¼dÐXºÙÝ\U¨-´}· eˆŸ“Ôú#}®/êɆsìCa”bàŽ¾3ø&ž&KÑ)^´P2î&IäÇc_ZI˜çDì4ÆZ0:(laý[¨{˜…f«BÚŒ´Ã$ÂB[¦Ú£!B !¸RÅNœ0¦ÛÂ5ÓUÄôºÔHêâ^Ö_îœÌ\’¡lQüçG^Q˜ê©­kFFgc0i©ŠFÉÛ.#¢X±¬@¸¨OV 1ñÃKû_ÇÅr80Ό֭u3\`­‰³î%ƒª¼XYã–J§ŒÇÙ‚\µ)íœuêKµàùG—„W¦à‡‘Ëñs˜Ç}è"¯i xh Xc”{ZÁ2ÃrŒlèl1…“0 ÍÀ‡²Æ>õq½$¯|L{#­ EÍ#¬ÒøÃÛôÊɱˆÛ$È بVd¿iRT­¸ãcV´sN² kYì .Š&BÖëÛ×½!vZoQrÚ×w64ÞO (è€Lh¿%®ÚG¸D&öZû¾_ç¢2[ âm XãÕOûNññóóò€A¼‚ð;øä=%ï-§!­)i«—Z:^Êx=Ö‘ðŽM´vPZî²2É^ ÐÛ»h‘àqGüØsû”“]+åk‘ð€Žü´™äø)Ë}šÐ(¢ÂØr=–û¹Ü”@GÃNÿÀÿ›{»4•‹ý*4OÜv› »ri\Q.Ûƒ;Ç;Ê?Šò»„4œ:Øì‰ÒßQÒÒ×nüþ?$wEy_.îø¸vvôr¥yZ:\K×êÐÈC-{WØæa¨¾7Ží×ߤV“[Ø ´d9|ë—n_ˆ](éi®ÛZZ@-hö+cMÒv:æÒÒÒ×#ÊW¶¼¨®¾,Øex䱑²1Wl6Û^vÑ%5÷õ/(»K{'¸iÑž_J>¼…ø±ðÞe·miPå<­†8%lÌøet®À¸¡ä¯‡ß(bVÄ:„ñe={uΡÎzÐË:®<¢‡+ævÅ['kÝ·»oŸìVùŸ%£z |´Ž‘û‹Ò›¢S_:îí)æex]•{†:ã-E­&ýÉÇKN+ú­-}Þî¾;Aµ~¬v!÷y`:COR)»GÇ–évÖÓÎûžè«cª§·V+’YñÔvOdÔwyÒñþ÷(þ-ì Á7{~õ+Û Tú²ÌQÈÌÜXg\8š.­!!y@_Á)çí`ìÕóø§·}˜œ¬µÇ6îÅ‹¶ô ùéå¢PM×R+á5;âö «± Ÿ¢mcažVé£'^dé^‡‹Îe¬£Z.¶6dXœörøî@í8 ‘¥´tF~Nšx¡ÑA¾J|/‹Q6vW€Cuð"6]çD÷±(zb‘+çâq–¿jü@ÐT —dÓ÷/—)õèÑ 9‘!#ÏÊ(ð)ÒDÔ,Å£n±Q9…Hö C’0àA+kKBlŒ+}ÈÚâS $®êF¿ê¦ïV¥ù%”øÈå[]Ô%3UâïV¶ý ëz…õØÊ,—–ÀüÑlŒyršÔQ§æ+¦L€:s<þ=ùi#\bÌû¨¤ÇEjÜy t•}›òT¥Ž³#‡½ì›·Ñɺí)1òHúë½zJ+[Zë&aôLv1ëéóudrÆweWŠKy).UÈV‡&’Wñ ’á]#èf}ÝW`%|´-[sç~>ñ²2Å;œ%šÅËqvØÎ÷ÁdìûJÐãÝr+µlÑváµfï·Ž–=Öb¯ˆ|6ó7 XiãM¨iâ[Ùhƒs6:½1 ¨‡íðôç Å‡Ç²Ð£J:Œ‚‹¦µ’­írá|ðbé7(ÐŽœ–£é;&M¨E\Äñ ëcâs²PG]®¯•8ªò§×öÙFþKžÖ¾:'Ù–M³%“¯ «ð×O§=X¦n%¬vB8XÇ’£ÆÇîsñÆÈðû4;ž¯ííÓÆ6h2u=¥–IûjGê9)ñµ¦å›´:éáëÏ,wqóWX+ϲ¸¦&pÃöWgå䂽¶´t3)F¯ ö§Å Ó1uc}|ý(Ø0{ö ØYÏ×:GNF!õÌÌ,v?‡ac£ÊRÕ8u¤RÌXt¹8ã gÓ£‡çt´X>Ù¼þVÉ­SßV®F›-AÃÒ?3eîšµ8aŽuâ”Kï3Gº¾ÎÞ:c56µÛ⸚Æa*Dkqhý®«e«š§¥ÂÌ>ÜãýK¼IM«§–€G’¯N&W»\C˜gväYÓ™ž&I¾¦FNˆ"¢Ù®ÛÊ×µf:PÊÚÕzYŸøÊ f#oÛÅ#ª¦º¡žgìðzø¢-MF ÚüOÖ%Ÿ´â8Ç´ÀoØ;±âñÄÜTQÉOˆ&,4*ÏZ t'³R:[Wd0ˆXÇñHýwzy¸Ç½¢(ø’!¬t,8Š Źϣ‘Ù¦·¥™:á¹iú8[-©cÓŒ¸§q£in?ˆKë‚èsï!ñuzYf<æafJå»Ç&aÖ ŠJØï"Ö¦ø>;-m.NåÅQô»‡G쳇§Ãa¢¾E£Úp¢âˆÿSÀ)qQÔXæe—«5[8|ƒm:Hîwë禯ˆ%œT¼?ôaÄÎéÇðèh£oþnoéqZÄ7§Åš˜†úx¬7þ»|ñEvFðç}†?Ñ7ú0'ù?ž#që¡§U·–· ý·³oÞf Þ…›y~N?õ7k0íf‡Œëÿ’?èá÷~ë,?cÂÝÁj)%Ë9ÿSíуpú·ÅžÙåîÏëìÆõ–·¥ÙÖ³íÊfÛçŠv½¦‚ÈhRá¤ýtâ5õCù«Z'Î2vÇ…Çô…Ä"Í}{~'kzÀÞ;†dè¶ŻҎœo tú2†ú8†ô帛þ ^›G/J;qâlK^ë´²  4eÄŸòâèq h§‚;¢ÀVDôf£î/îæ{Qá±Õ^ïü\:k™ý­y„‘fƒN?†[Xþ=]Yþ"‡®¯L×ÕT£þváô3ñ½‡J9=®]ºrâvõSÁÄbÇ®+ïK¯¦ñÝ.?ÇäûRá‚Ó^KÅö¸•¯Xí{\áþR"}> ûo×ߥ’#ë+öç2`š|/+CæÔ5_Nâ&,»õšî‰»TÃiqš©„?°â“÷QïO‰ûÖÄ;®—ÁÃîꢸ˜c‡ÿÏâ#¿VQ4^¤]ygûlÔ36Fõ7|PoŽÿ‹ˆ?õ!g¸°Ñ?¶âhâÿáÉô³3º›”K‘ßHËcY+pä{¼#ßµÆ8šœJ>ìoü¼E¿RŸx²¯Öi’4³%?òÙ}ž Ìf]-«‚” Ìäÿ/ Ê‘ý â Œ6¡áÇ´Õâ í8nHÛVFŠœ0àÃÅ!ØÜ…c_ˆfË¿Œ¥‘¯=Lx.ÍÉ#!޵¸'\Aà»S8Áºó£aøÉhÛe¶gk:Å<5æÔr0Ü,âæq[t1=—ÙdÑâ»Ôº$£‘§z)ãÌÉçú²£nLe‰óQÉfW¾ÇÜõ3b¶+#í›c1Y±píw´ñ7z”ó¾œX‹’ÜZÖ»ÿ޹•ÙutÕ »{rÒCì¤ÙOÔØ ¡fK½šÝ¤V‘Ù=  ¼-m4&„еߺ+h£äxäíÉÁþ>9€_%7™CÿÒvšÕðþÍkH„vGº h¡ÌëLóò“ÜÄxÞ‰=NC–““Ší'°;DÀt­öiÒï´îã]‡Ú¶ŽôE!ËzV«6Њ»!hGex[åá¾Ý=º[ß–¿ËÊpMEc—ˈMðP_lï—„WÂ\6fürØåñòÿð)¨ œ6šÔtîÁ½ÛðÔåð‚(xøç®¤ÿµ4ó윇ø98'85M•©†FÌÒååvAH]¦æYnXhTÈW5Ú}%òHÓ¥k&B«ÙXä\rìC]°‹×Wf¶uµÕËã}‚qVfŽ&Cj ÆÑ=‡åãûQ+{.:@­ÿ•‹•«ª¶#°Ç&-m=7·2WÀ)Åo—R=Ö‘w&¸oÁ³ôä‡#qÓ‡hí|ëKau ï¸9y_:íÙ3²ð‚â(êeE«çº °wÇ=íßc²iNì·¥Ým4ò'?s{¾õ–ÀÛ™<‹2wا±Ë'šºÁÝ–Ü]Š$¦è­§ UÌd–/e#v:i&®<§99o¤rìåvÜt6òpÊecW`‡d(òÖ—t ß}’P[_ GÉ[ïòP<œPw}­§`I[C±'I®,ü¼9Ç`85p ÎjÚˆ÷A=Gø”ÖÑ;C°Ú.ïs)«m–†×ZwQM»ïD8§µ³G›¬Êרv¯~ã*:)=V&m´¶J7ÎÑwb{8öë—%nÖMãàô+‚wd×t¢î÷ì{x1–½Üc²C©·ßc‘:@¬…çÖ“2ÏZ‡ QCzðœåñ´þ铊jðÑøï¹=ºûõiq+‡‡í jÌK4PbæšH6v}¢·Û}¾ +ûxGÀßRhû²¯s*póÑó^¬žõŸÙi}ºÐ'Zät\ï!5<é´ítcF³ÿÆŒY~š>ôÞè¹»êî½´vOî2ÑÚr¬è|4-§mO>œx{êì‘FôƯ . Çð»ik¯Ûc=~鎷iþœXW‰å1°¦9ž™µjœÇ"ÞÌ {C@¹ý Âþªè±PId÷`ì¶Ažî(½VŸ¸rð4¼ ŽîîMoy€ðB^‡e´Ä›! ôiÛ ÚÒ!­¸HoHÝ`BùùÒð9o|øY« ªÍ®šJcDiyM ºÒweÄ?÷ÔÿEÚqYP²2<-h“µö„Á=û¥xa:Þ–Uþž?…ß·‚ “ö‡‡‘¦Ü´Ÿfdã¬Î]H¹?j:Þ”vbtÏòæ5âæ>#¥áà½Xú™¢\æíºs^ZÁ Œs»-†Fþ°ä;í¥­"´š<7ÿ <³¤t‘ê!4%m>F12ÄR!z·Xps‘š1Êí¦VŒÊÇDÇÍ„÷f-²¼XiÙ,Í Uiã——­$‡6õ¶Õ…·«ÊÈK\ÓÜZ½S ªó)mÀà ñÊ‚›%Mޝb Ô³½¶t¥{È-Á,¥ÍÈÓêcºÚœWróF±v=|ŽRÔV~©+«ýbÜv+ŸRàŒ¤ÒÎÌ¥˜ggê3ˆüŒ?m{y+L½ÈŠKòÏ$÷ruÖ;"-¢;’³þ¬qpý©l ¥«pI„³-•œ½+Ÿü‡E7½ÕóÒIèpÖ»eµ!}»þ–ëî355˜FåÉã”_¨p·}ÜY‹–ë¬<ÒÍNõáUMg#éÖöqòM0µ;rV6ÜðÝɾÃkÖ÷3YÆV» ¹ìÅ™Ìu,L²@&·‘‰ØÛ·´²LGÝG5ZZŽÁ—{ Ÿï2®Æzo·°zx»Úå!–&ðé|‘Z³+¥š¾IЦJa6]½TpòØeWä2ßBqn<딫]{­]›$Oˆ³3«»¬ Ø®†pý·=ùwLdÈÑöÕp“>Z\D-z‘c'–'–Ч\¿ êrš÷ø‚ÌŠqËNõ[†[ÓK.û~J«W÷¾–r c–žË(½´.\LÏÚð×ú³ub’¿ ÒÌYs§eÁ—b8õFoqZVÌsV1Ö$XëÓE>B»'­Ã0‘6rm=øúÒÃR3 k^Ò­ âG´td¸†.™iRuŠyZ~ÊÅG*eàlw¤`uHØï~Ì\ŸD•rÆ5ϵXÓÈÆONzZ— ëäí{jpSuÈ.E~£p¹[f`ÃgöK]¢¦~Ã&àì«ñ•¦­ÅžcM>p1[›ÛAB[`ÅFfâXÀ‚µ1jµZ­‚¦68†ZäLš vIvͦ‡ékä³q‰)pëœèò•¢}LÛGˆ£é‹RgÄUÀ¯Š§îjg(Â+à]Õ™ŸÍË_á ÍçZ}¦=”¬W¥LS`û‰Þù=5k¹îXîàìëîw‚{||¡Ù­ÓËÂr ¨w%ƒ“–ŽþZÕðÿ ˆòâ¯O¯ÿ°zôãŽ:ÜM[f€ý¤ÌcÛGGq®ÐØx‹ÿF¸³ Ög/öc¸i¿´–ÉwO.Sº@\Iÿ±W:±áqû)cCñÍÑíÙÍBßaÂÍûlӎʶ"Н 3¾Q­4xO^”¬d±`[ü§´š˜Qül,mü½ŠOœR¨Úd[¬Ò¾ÀÌ㘠0f5Û?}÷´dU¸\hK|x­Ã’â`=,SC1ÜKþŒ@Ö7;IñXÂÞd©Þx—^ÃÑôüö›G¦ãñÊ®!‹Ò±gîÅpÿü™™5n“ӹĿ롯oœ§,rá/ú©ßrÈ7U8y¿s£=8HKòn1±e§ŒÖÂ1¾Ó‰¿ ]êñéeJ°¬©U‡=Óìp£v>º˜Ôæ’(Ýœ³¸°¬þ;‰F¡ÅެsYˉ>ê<6ÑísN ÆðÛkoô³šnn0üw ´û(úúiÎÍÇÑqÕ.û_“©î«Ðµ= Ó›ÄÇLǵ®ªæ¸•Íj¢C©ñH8í{LàÖCËΜó>Ño¶pôgÇïã²ÎéÇð«6x¯~žXßB^—³ÞŒ¦oÿ/…ˆúvx·éX };;3ņ¹%Y»›íáûn&ßF ¶J-%ˉµìqzözÒ§¯­»ýX'©vÖ=¾¦W.:±ü4A«“pŽ–ƒKІ£Äçñ1ýŽMËé¸î×°ééâ*_ÿ •­‘¶`›rú°¥³´QðÓÈÔgç­"VûJN†úO`ôá¤Ðµ´Ò¥MNò'h­v·3χðâ¨À>wâw~î«¿oÅ=^çàiË † ]‡ß“,#fR4·ˆ]ü¤ÜYwo+r1-.´+¹¯alñ‹YÇ–ÄÊöa™q(þ;†eo¶ÏÈ=Ÿ ÿÁÅgrã;Tí¬Ø" ³3qл! [ŽáW·Wõí8vÔpËjÔ1ÖáúÅ‘ñ.›C wŠÇ¿Ùå½Õ`ÆÊÉ"È‘õˆõ¬ÉhË·^Ž&FÇ—ŽX¤vyãêMu>™³añÅŽ—!ÅâoÂÚYû‚q†˜M<{9­úÖ—UáëñÇ\ŽX8g¤Öœ~^PLÜÖ­Ïq¾ßó3ÒÉX†*Ü=+ˆ§„¬<Í}:Wà•¥­vc½ޮ:ÄðJo>СPVŽåžœ¦rÄ­€±­Ä¿Ž:Ô¦z¹š¦7/èC[ û3q†z<=dzy‹,†¯ÛkEÉú2ù«ðËÚ‰Õ¸¤ŸO“€T|ÝWÉWšLóL”p×ÝQe¬Ëb— Ùg1æÃje_±iù&Ó‡ÛÃvoo›Šõw&²KÙl”ì¯[k¢×ÔÌ7ò’²ÝÊìôáÌÕ÷Uëd-SéíÙ—ˆì2gâ¥Râ[ {0ï§ž›®ó-5ô+X?R’f¶ ¹²¶hsÓz—¨Ê%­›’6Qá¹ã‰ù¢íJ3Ë|٘ߋáYË1šX QAÏûN—®L¡‚[/mÌü3Ïg²áûM…¹zžê½³cÕ,Œ¶¦â[ǃ¶= SŠðÔ’Q’;1UŠirÇ“ttë¶óÓôÒáû ‚<ӳ᮱sÜY—÷š™ù,NÜÏ5óÓ¹•øtî¶LÏZ®BY›#ÜÌöJÓë^³gê1E†ð]È®•µ¿¹©é?²êjo‡xÞ‘LÖ›­ô÷¶“´˜Q!ÇXØ!x#[øåå9ËC•ÿNÝ–ÛŠ«n³mã/Ï=HÊy<~BÔ˜zÓ׊xýXF.ô\ÃÚjÄÔ·]–1&›^åvØÆÝš|lsG_#‰dª,UýP§Hî×6!± ø«²°Z©À’þ0ŠH¯Àìö=ö›Kî1°±™¸ìLÜuL•yrØù-G*Ã…t»'7e{- ØêOð×À_.ñÓ 7½í°Âhì@A¬ ¥t·«åÅ7™ñàd¯(!Ù/µi l„|ío¿m­w)ºéß-!Ýde5«µ–rV£oK5Ìy:åð‰MôépÌš¸ þ½“¿¾†¶µØrü>JjÒé[ì|7“š4{Ÿ€È£Õ·Üï ½ÎSµؾ ÖÀç¤WaÈyùE»Aº+à'm’>8ñOõ†“¼„ ð‚rß`޶<¹;Ã;óìdêäAOaá½Ñò¾A$ŽÈøEmi_ ÿ‹ÚÞ衤Ott´¾5¢Qül=‚ Cƒ21=|0‡žNCºÑÒòœ»¢€ZæO=ú‡'ù´¼†ùu'à¦#àsø×rtxg#Èø’‚µÙ±¾¤ôÚ$.È”SGn•¡È§iá±ÆÐ4-÷ÖÉCH÷Dw!|fíÎÑušòQ–i¢'°å¾E7e|§&ø<ü!åµÛü ìnÚÚÚìWmï¾ÂÚtß—ž[ìϵdé]±%|UèÍf:8»¦øêîêØ[^Q@w%“áéÝ›½†òêì" ÂDí…Ôßn•áu7¨÷ ç­£¥´(tšà¶4ÔãÏaok{_$÷'¶Ð[EÚ ;M7ÂòµÈxòæ¿”…²0µ‚«^*íñËz[”Ñ;1|í°‰@ y‚ $æ‚Aä q@÷$ïÂì¾\V×ÎÐM=‰M+au-„܉ÒÖÓJ'³Q_'‘ZEiäyÒn×Éi7nsÖ×”Ž s¶¢SO~N%5‰¥Ûkº$òsC–šò{­è7g%ÅŽAm?²nÈ_;N+eo“{‹ôRgKW?àr’oIµœùcµeÐ=ÎØþ§°{Gi»Ew@ ãÔSOÜ$ÛŠêM;$òëMvÐ;$é9û>JìIy:äO"PDößw¦¹è¸Öާ~,%l餭¢yÂÉ/tgi½ÇYõz{“Ûºos½/ ·E§¸ì¤˜FšzÚ?] Å3“Êi+«¹Z:‹PÞÁå!Úh_%5ï-;(¹d&A0%§—~¢6·Ò£Q{ôqàtu©6ÈØÿ³Ê`<&wD&øv]öy3Ç„tÕ®îNxc ”J'™±2´Þá­(¯[ìåÿİ ÿÚ? ÉŠö¡ÿÄpP@ 0`€ÿÚ?섈踎8ˆˆôÏÏÃ:—sÅ3é³ýæÏA„qÄjÌyÏÓw>qòÏq$Fû"6“3´ˆŽ8ü¹ܳ³sô‘‰ã¨,ìÿÄ:!1"AQa 02q#B@Rbr3‘¡$P‚±4ðCScÿÚ?ô‡_/}±³ ˆO¡>L•®ÈÛ?šì ¨¼ñåʇ´!Liùxü–r y2±ÿjáYüž=LmŸ&} ú啦É”ÆÌíÎÌ~bT’Áfåî]|¹;5Ù>¿Õ{Z¬Þ)òÈSéaq~"ˆB›ZæÕAVåÙW·O&'Y4õ5WA+w»ô¥ØVó¾Éä·aüJ©ü®¾HQçÏ–Ðsù79­’2ƒê7]€Ól¦Ãxg>‹iY¯4 kä tÊÞ ¨Û¢ÓËÅG¶:!Nçïå*H¹ÝôÀkP¥â@Ï5>Kˆ•xn6Ç”_©ÐmZn`î{Lƒ´Ô'–ñ^ —öB ­`Úl¹5Ïí¸ó‹ ;ùB}CÉ;ÄUâ%Ø•~ì\4OÞOv-3–á™AËp)HêëùBå¹4ð²výJkÜ2|ùM`¦L èò¸G$ïŸMœ?r¤¥­¹i…P;0UÞôgÍ>®<—sÛëáAè›U›6 ÞòšÆˆ<öëæ¹Ú®Û#d½£ ŠÂá=tYòj»ížIÑÑ=ß>PtÊ©:3rglj Æoš6·|xF‰Æ¡µq’z!Cß”/Ë“)ò£dJ…ÄðÕ7 =§¶À[+¶ÈZáEÂV¡LÊ—œ ðq³‚^ÙY0°ðv[9%2ÝQ—-Bðçºhý¡q†»dØ.YòdÚµXpÛ®Ì8¢öì‰Ê›•Ò#ªÃÁبR"åsœʺáò¸H+Œ„:#OšÃÚ¥[xò}H•Ù{†ÌØï…Såk·%kæ¤Þêˆý«8EVPz앪Ævj±éFÜ©ü‰Ÿ$yq³]±´y%9®þ“©iÂÕ:¯ÛOcžîJÿkX¯¨$,Ö3Üt[ÞbS]Sܾ‹x“hÕ•<£(Òð ·šãk\©Rc›°eC’ƒÀ°³…Ìà)µXfq jŽ%!¢S®g†œ¯¡u€{•ÕŒž[7~†­N‹xöÃO%P¹^Uôa¬ä‡â!µo¯ ¿Úvþ•UÞ"\öèÔm£íTÎô jêfJ} ¾¬áY§Nhðä˜÷Ž(B› 57sO=UµÓj¥Kü…~)Þ"¶Ê.t`¶“¾«y¯Áø²a¼Ê%¾ÀâÞ8ÞWþ•îæ©¯ÁøqÄíODÚ»ëÇ4ÇHCêºØê©ºµWFú.ЭÕ9ÆeqKðÞÑÝS'ÅÞIÈ•uÊu¤Ôqê·Î¬~sH( )&>xoEŠš%UÅä¦R¡÷s[æ×vødÊ"³ËX1*?óQ‡TòS]¾{>ëò˜÷:K—‡oîBÝmMðÅÐ _Gܬªågfáœ&û(qL|ê›áh-ñ.ñRAÑ4âV ª?’eWÜNršÖeîÀ êõÞÒs„(ï\Zâ…;ŒÂ®$7nˆ+vçH?v⪬^âåsO0›GÃÿj³+ªtw®vTÒÔ+©9WT¬çG$(³5 üKüE¯‰‰VŽ?-|úyÛpûS<,ð´ 9FÂæŽ QðõŒB¼˜oTêÍn.ÁOðîÉè›VŽ è©¹ú”BC†ŸáEànýk:-Û0©ç2©gMž¨tÖNTåST“MÊ@·UQЬ$LÀ)•[˜AŽx¸rOsÈn«¦ÕͪöÔ2–Z©Î2™ižŸ'’¨9¢#)Lƒ£U<ªpy*J˜¤+rÞÞSHÜéÆQ¦ÿl¡c.=ñÔÁ&`-Õb/î±ÍQÓ-3hÊ}:¯à ¬¢[U:mp.7 ”ÝIÄG$c™LuQ0Ô×´ËD'îó+uX…/ Špsƒ]j©Ä¼!²iv®Â£*›w€aT— · áÇ$許îà*¥OcÌh©ÖЄI¼(’U&°Ý ´ÃÅÝd‹§Ú›MŽtTáà–¼Ú„è‹çŠqy ¥±ò·OË•Ì;)¦R«ˆæ… -;·”ï :'Ò­¤¦Šd¼žIÎq°‘¢.v…`á~(7 \àÑQ†‘±Â¦3ª"œ»áTv‰îЪ˲Vè8:-ÑxºtW‡ˆŽVð~•PÖḔZÃ0®kxJà êúl’®år’àvy§:Þ-%HUvHN’$§^ëq…ZN¦S|S‘ ´ê85Á:'¹ÝTû–ú8IWÝý)Î0p8©F` ùÄ*·ð‚Q|ðõGÅ}£ ¡®Ìè©ç)Ì[ª£…oPø‡6Ö /vŠÉ„>žV6g×gnž¤F×4óF«ý»`Œ"ú&Õõ"½ÝÄBý/n‹ü¤.®ê¥Ú…vø¸tQOÚƒ©ÔµY~cTKëžËwR­Èæ9 Ç:\¯ˆV—©¬ßí]Eîm ¡‚6}Få\Ñ¢‚®³*Õy®‹RéäƒÚm[§gº¹²UÜÓ]hZ»*sr´h‹œ2WBk‹ˆW1q’ƒ™2ä¯/%4>m êh«…ÅÊøQIº+O5.iqRÆÁSP/¤ ¢ú’INe2D«ÃÉz C…tÉPÕøë_ :l¢7`¯¦Ð6K†W?²šÂb:!À…cÚ¶«eKX%RÒ0£º¾éŒ x &Uµ=ªúc*úŠúC*×(!Zßj¾Ø*Úm… ZÉPl´’vd+ˆT…aS™P¦¦TÓ¥ *-ã%¸p•vBá" Ry+i¢×+žÀWa\àVåº+÷…êÏpè…ƒ¼è¯\Hå²HÊœ«@Â4Üa9:h©Ý¯ä1ùü©óÏ¡ Ñ‚S5%Q£NaÃûyú£dm6‹]˜Û¯ŸY¤ªt¾î˶Üy$…ŒlÊ…`M“¶Tùg˯“_I£Îï¢Ù²’¦|°|ìˆ?›Ñcò±Dj…J®ù@§ýžŸ’ŸJß¹#’úõwmè¸ÅÕOšeH*O(òq9aà¬zÆî!ÑoI³êcU6†Âh}ahäy ¨åå…?”ú~ä A¢ú¤YÓfV<Ö‡B5â2¾­Máòꀢ›Áòt n(<ŸV}-} +Ѝ é¼°¡gò´š-¹é´j:Üè­aâ…¹¿Cë‘i#ª,sH<–= ù «Îz4)BÜø€Cý9w“ |9ˆ[º•sˆ+šàD§T9èóØÞˆ6¨òÝ´Ô[óVÐy,¼Ú±åŸ%¯p•#Í>YòIV2¤»ÐÊÝU6«iŠkȶ|Ñën­ÊÒ|ûÚOµ¡;xpK›îW }þ¦þ$\çhR›IÆŠ^ËLíŽE0RÍS·ÍfêÝ™òGä%7·j­ž?•¬í54Vµ°VV|¸ô yÊþ“‡tUÇü[3é¹± F9,ù#Ð%nǵ‹Ú2ß¹cÉŸN¦9*:£MÉÔÉ%2“Se;cd#)Kágf}P¸ ÙÓeƒ]‘²ÎØ;1³YDB5†vèBÆÌ¬… ú¯ÂàaÇT9mÓnÌmÓf»nÛ<–õÍÊ·Ë”ãÕ4ÔmÖ«Y€°Dì€|š¬*vPÙ 0µ”»¦ÏE…¡óo9¬lÂÊÔ"gi>HQ#d쀊*<†EôÚ=kœp ÔGtù_QÀ(Þ)¦éØ}ŽìUÏ0é™;8ÞùX¨?ÚݵÒB™Â³x'åJÝß•C²\àíp˜UÍeª¶GtlvËŠ $Ê{¢T1æP…Æð?µmÊZe[’œy¸+'à&Uk; ÖÐ |/i½6±çrZAè·n’îZö¹“Ô+†ˆRg\ʶ“ ÝÙÕ¥jm’瞊*Ò„9ìã|žÉìݸO5QÝWÊÞ¢˜N¬Ýãªú,sÝð·uÙb­÷vQV‘dö[êbVö¦ smÑ}LaRç!Zù/äƒ*R-½¹ vÖÿ´eÇá}Z`†é·v_Rž% ‘ª»+s™øN©¬(« oeu:f;„CÀ¨ˆ2y¢7weo ôV4—ÔèƒëR›ªÆ=Öt3¢úT]gX[·r4ÙLžèŠt˲œúôäŽKwdç@®ð”ᣪ ñmÁMpö•cE¢TQ¦\øVTæ iê… åWV‡hTiÁØj?¢.¥SwMKÝ ó[×Ô÷-Þ÷®yR{†«|ýaø~_‡ñ.»)ÄtD™€bò‹a¨Qñ èRáB—ˆjªº“g²Ü»„tWÓmÅVmý!6k9+j66K´[¯ Jø[ºÔ-•p•¸"ÜòDŒAŽq!Ó¸5U]t-ãð ðµõAÔðÉÕ4PiqæS·ÍÊú§ŠåÁîTè=ñÅÉ9äè·»ò žÊî¹¼¶x”>£C‰ÊæÕûVçÄ{¶~ÃArÐZz ö2^:‚!=ÌÕoE[{#ø†¢îV8óW±ÖÉ~¾{«›¬*©+„6p®zú@4r[¿Ü+Ú±íM°ÛP5ŸsPzÜxow5{jŒrF‡ˆî©Û¡”Ûµ Ï`ÈD9±¾“C‡5±ÚËšQýVvG–›nq…øzF*%Çš¨y'1Ï6·’-Ý[ÝðJo4Ìì«òˆwDþÅ:©O¯^Lè¦ç5¥yz‹±9@¶£·‰í{‰w%¸q:©©R\…=Ó ÕœC:£*Sª¥áHqÕAmÇ›©IæÂƒ”·wsQUü°›O’uSˆ õüDœà"iM7øZ¤œÂ’%=¿éC›rk@†ÈM6„e_\È*…œÓüEc¼è©9 5ÊÝ×&ÓÌ&º •N¡?ººÐ ¦§Uèâ+q]ŸôÃ`*ªèæ5L¡SŒäÛX25L¬Îr5H ñ‡?)„44ˆ±ÙáNÖ¯¦ÛÕRµo\ér¥g¸ôLÕ7¦XÀn©¥£ˆóTÉèÕ\ žT(„ày„Z[0SØæŽÊ­1¸ê½²œæâ>%ÏÈ+vú­ œ"ÃÄCQnE¢Û¦ª§ ”ç`™N‘ÉT2™áÚxœSyaŸsU®Õª‰Ñ2Ø›U:½V÷£«¼ÏEy!Mœ¶S§09¦`Z‡ÈT›ÙA=:&±ÜÂv‚P,:eg¢-êã„шA£K Ÿü {'YN•@ìëÿ´æ9£Úª·¦ÆQaËð©ã<Ê{€Ñ3å4žÈ§“¬/é>§uKôÅÅÓ}½ÖýÏ.r(iVùnÊIÔû-ÓòÝp ”e\?Jñ:ÎÊuéóB°Ã­F»¸žîhNBwü*ÉíaÊo†¯ÿ*æh‚ù)¨UŒÊdôU8•#’o‡iùMÂ.Ž&óD´ åJ:'2UjŽ2éA ÔÇ4.µ:щULý©ï<ÕOâªQ囜(oA–`¨HZ+´•)粨×êJè©Ï2™(êSçª*¿s„ö4e6¹½U/G.œ¦Òçjñ}§+Š˜?+ Ë#šÂÇTûPƒª•[W8ü)G¨)ÀõFUÝÂoñT¾Ï8[³î1ÕîÛh%jpœÓú‘F… ©6±”ΰ©4¦cíTóÍ2QU@ΨRq‡þXUe;¬¦55±¢n#Sðê™n`eQ¢Üºr·lþТ…ÎoûU?Šª×uS*pyh©Æ!ª¥:P°è°€ä ˜n…ÿr5ZYp棺øT`Ž p<)ÍuÁ®+j¥áéëQhä‡v!A{rœé«ý¦Ñ©‚ôkˆ‘Ì!~»÷!õ@ìSmIº¨˜'ºFJ‘ÍÁ"ÏäžÒDywÜš…7HÐðÔ³'%nGDëæÒUÍ#ýªl§›uG³SóVµDª²ñíUQîšÐ{+ ®ŸL±Ë{HHžJËÕÆ¨ø¯•)91õ)ØÆ®3Â%“l£W0]Íu·-çP® ä­äMËñ«»'+xÁyêJ„çÓö;(S¢Þ$ }Vôir_¢!¾Ë‘o'#ÞIÔÛM>“µ(xšCˆenüHˆ[Š,poRƒ¯4\…@ J;&0ÔûrZ,%‹ØëþñÕ‡ ºiqwE½4žÈËMŽ? ÌŠcš>0ÀçÒÝ8‚u]ÈO,¥}ÈxŠÈÐÆØ#ªsIÆÓ„VÀ—3„h­ñ †e6Í5mVZÔi‘„jP»´"ßç p­cKiõ+tÖp#J«!£I[ÍÙàCyL±QoTKĹ ò[Ç8Ô©Ý»šs¼>ZP«âIxz4Élj¡´æš~îh¸xwCPmj6†…SrۃΥSªès‚úí\Tð4\mãLa[]ºk[‹*ˆE}1•øÞhJ\é”*¹¿*ßÐVö£a”ZÆJŠ£‰o(¾×&ºµSŽ…6Ÿ„þå1äû¥;ðùqB«Äu[³ª†U†¢ÖŸ¨y•¿ ó[º½2®ðÕþÐ>*µÿÚ²šã³ ´Üx¡\ç±Á5§Ü .a!È:«Üèî>;*\tÖ¼L„^æü&nòzª?½Ž¯¯Tº9J¾™µ£E¸ªùsµ+üæÎˆ:‰Ž¨øf¼’y”Ê›ÜU”Ýkº­éñrƒü€Rá3Õ?$+):×-îðJk(»1”*8ˆç <<]Ý2¹‰ž%”Xõ4Ÿ(±õ žª0?Ü·»ãrÝTq% ©Ì‹¹oWý-Ûò³%YI±Ýf¹·¢Õá舦â Þ»Äq"×¾â·Òe1„‘jµõ vßj,•%ï.ê¸\OÊâú¯þCá D»©NiУR…KIAÕª‘ÝSu‹~* æ:MezÅÀ ÖìcNˆÐ(ˆVÒ6 ñZšÒn<ÕJnWQªæ¦¾µG=Í]!TÍF…ôØÎ,ˆt|¬d÷O Ô¢÷p­×íW2¨hìžÒç9êëøPc C>TÏC_48¿À $+›Iе…h ÕhnAYfо´B£^Y9\Ê®- Ôjë ɸ)…c‡ Å0‹9B‹B±«Š˜*Æ…½ ãPBÀ\,jˆ+, À0¤Ò Ö2%A/ñ`|•Ä~?Ò Ú¢$./Ÿ&“;:ì0г šgñòk³!L•…’³³_'U;"mÕ`©S²#Ï£f6êµÙ…; é¶â›R»KZØÄÁçŸ6u ®Üú1ùúp˜zÒ±åÎÖ±SóOý†™Žªl¼64iq’ñp³åÏä%G’<™Ù£Õ/©¢¢é ñw¡šçɧ£°vJÓŸB l€$«,l 2…”-oYØ}<úØ\•Çllˆõ¹yîðÀ*>‰¢»cÑúl(5øÙ••+U€ÕÂq³>Yü͵+é°²»zå áÕnÛäÏ–|ÓGûA¤ãÕ{åìå]N˜•Ÿ,캡þ— õW ·ÒNeow›@XÉNn6É0„òI\.ò&˜0JW)¿¤ú¶;U#Eø:Í^*9ÙMÛݯ$w4í ðþ$Š>£êt¾‘±½kÜmQå½Ú+˜§š“èà•…s”±2j’ MîúÄ´¦w <¤ÑB“Ý©@þhÔs°¯g†{›Õ0îŠ}lá›6Œ&„}\ª¥ÃíU#T éåÏ­ ðý©Ïx– k˜Öµx–OÑcd›ó öiÍZÞn”TKJe*X#N®pN“¬ê­ —s(Ò¤m’‹«÷&ÓJkzO>H×ñMs›Ò3Bƒƒ'8N®æq€ž[ª%ìÂ{*6A8RÖÁEoœK¾BØ †T-'‹)»úŽx#BiÇÚƒº6SÍYÝ·tE¸'‚ˆûšªZÑ+yN³Œ-Ý]G4*5ºóMøC–¦¹ @QÎ¥8õ)„Ê®:ÊiLî‰@7®PiÊE³¢v´'^$÷¶˜iìŽy¦PѲc@ ìÝö˜DwDwEÃÝ B¥n2î©×#DÿíBgƒ¦íuA»¶•¾k!ȇeVÚ-M­G )®æ»ªu@â&%6«ÛsŠÞ:¬¼NˆÃ#¢vy§V¬ëÇ ©ºr`×…3 ÓL;º¦)avM \m¸ZŸMíO{@âG$Ú{–°¸ ÊÙÂt)Œ”Ψ]Ñ3ù&ž©¦>ÎiŽL©ÎS@ÿJèÊ£‘MªÆå2£Ø øMðÔñwE,h.:§xŠ€G·™Êm04W•Iüç*ŸKe4¦†ˆLx÷Ãna ¬dTœU¼¥öLs´0ˆoéO§SÜ\…V©@ˆ™TÇeA5Qhê‡ÂnuBP` îU?µTþÕUʉê©ÑRTcKQñªÇ{†ÉNÌ5¾ÔæÔ ôÿünN¯Ž3³å4´eTç-U’¦5L~äÐÕX¿U„ÚìÁMy÷Ù(¼eÎ%‚ˆï±·{U8ҨƢUZCF¦3íL<£ct  ldõ_Ò¦ô¼Hÿ¬¥YOÜ&Ôäá úUÔ&¡ò‡òGá=Åwî@¦…ý&¢§iä²!Už‰ñ¢? ßÉŸ„£ïSUòÆÝÑ0öT¥pþ„æ¿S±‡™_ U3Í8k…P7HLùTÝÙ\Ïr¦’‚ªj1Ԧܩۢ4UÝÕÉ“ú•b:'GUPvGù&ÕŒJ•Tôê#Uü©“iÈ–¨ÿj£‡´+ß¡AÃ(‰NÆ —b€ç*œë±½œ©…ý…ÿ’ÂwÊÜxvK†ª›Ë¡¼Â¤GDßéDµ™ý/éT·BªÈÒ>à®y QùØÇt„Õ3å0Έ äÏ•JˆMìU9èŠ! ØÎ©Tv5ì"4AÒà…ghšæ‘‘+©ÿ%LþÄÈÓ Ÿ Œ*g²ˆæ©tèUÜ¡2ŸD艥‡êûT#ªo SU4ß„Òí0¤*iÑÑ:‘1”âÑtŸNQqö„ÝB dôVÈý(¶î"tOÁ¤…R›ŽJ§Ù5¯|@Tƒ µ ŒûZˆ®[=ÑÇÙ^ó€¦ùCÅ3B¾­7¸`ÑU}Šæ(„|5s Û³t…[ù*oLmWZBki;š;-ôp’¤<7å3ÃÑâÎWáú5=¯˜”YI®¼««`©•-É s]ÑŠ.¹ä'ר ¸¡âi Ïsaœñ4†ˆ2£x‚Ë`&Õ„)Óa. Žxªgª•päíÞI í{d§¼UU…Ï.Âgˆu+ZEÝMærvìz¢ó€e*N.M«XAJ€$?Dj`žˆÔrß:mø[ñ†'VÖjv\à·o¦H<²Æ-Ði7s ÔÜ”`j‹ì'=ºœý'Ô}78;¢.Í©´wNl T îMÂo†}=p±Òâ<;d+]IûÏ„+W´hžGÂs*hQe\âŸ^¨ârÜS¦îèBÒÖtE¯¤êˆxÝ€ÞÉÔE7[£IÀw[¡Dí̶áÛDü¯Ã¾‘kFÍãd =ƒºi!Õb–_¨OeJv»¥Nðäi¾œ4£&Õp·zÅ#†DÚlÃB&“.rüFꪊì‰[ïÄ:+G†·©Wœ½Ú­í1Äí¡_\›–öŸ¹n÷eÈ;Å@hÑÁ¶]¢Üxœ=ZÎ&-ÕVZB4JBÜ>”5TÛ$§2­8iN¬)ËzæéÔ[P`À[ÍÏ´¦¹ìƒ ®mPÇ ~æñrQUÔ›ÅÝ9¾'ÜQ†œ¦þ&§ Š!~*Ì  ¨!¿wV7U»eBÆÊi»xéʲ£c¢—{²¤'ƒ…»®Àê›xQmM–1œQªÞœ8h­e|tWÔuÎ+÷+iÔáEï2õ`láëF˜+z÷ÝT÷8p4Aµ[¦cið Ú­È+yLL«*V,j†øû–=éÞpW{œ¥nÚÎ[Qˆ}.«*6TÓ¤`!N­+@æ·´Ûr ¨Ki®ÝÝMfÇ%w† Êï†"(·à¦{ùúv|#º*÷Ì«šÜ¨|­ã%C°W.ùLÝCP¢M´‚{¯¦Äi*tÚù¾£dBº]S¸˜´ñ°›`§ØßµTlsV<).qM.7Üz"*6TŠpŒõSÉMJyê®e?öbJ ¶Il)¶T5C†û ­c`+\$)Ý m«ê2W+xöIBœ!…¿éZû¡*!ªýØ•E´™\ú`«i Bš”䯧L½¨Û¦ÂØ?Ò‚ üMÿJËxz/ñ€¬n Ë*‡T†vI`X²^Ð¥a`BÊ?D+Z "wC:¨¦ÛU§E!‚~6Aî‚ÅìÐ¥! c¢#ý.‹Aþ”Û•¢˜r%B›Dül+ º…”,©Ù]6p­2´W¼ÃQ®ÆClÓ;'n’ŽŠÞ[eNÎë>Œ.Þ\y2|½ök³ N«]³¶èÎÉçéͪۧ«,lÏ’Ýê·Þ È;þAßÉ#U>\ÿÝñ²?!¯žvÇ©cýªÊ@¤zSèçò2+XÛ>Iüž|™p`êTo$öAí8ô¢ˆáW1ºê…ÚóòdáY¼’¥§É´Õ0¾™Ïä~£•ÔÌ$V6’‹(°½É¬}$¢¾L¬y#Ì꟥nì·ª¶d#é˽ eü‚ÿ ­M©S]¦ÊF:§—Žj6NÜ­ÕÞõ/§„ÇT YÛ“É^]QÔ`µÈž#éO§‡/-Û … ÙÙ[ÉêÚZe}=¸Yò[PHLm1ÂS>n: ñÏÉYò\S©StSnªêÿhSs¥ÃÌjBŸ<Œhd´­äò”÷^Ž}Ty.¤ÖlC;cÊû5[çûUÝ>»ªÈ<¼’|ƒÍª´åUÚcT]YÇvµ³°ìÆÉ †Âßwœ¿²¨çý«¡ÊÖ v)Ǻ~ïßnß‚ m/èJ§Ý+²¡¸A(VmSgE%JèµN{´„ïu$¡(V/p쇔z“çÎÜ,¬©óJÀÛ(Ç©*çSziŸ›U DlÓÉ—yÆ»G0ªÊ€´ò{³°² ÂŠmS²JÊÂ’¬æ₪AªªÂÊ‚ììÕj¥Æ;¯|ì‡\.• ]6gf<œg Xp¸°*ÕKžÊ%¯k£¢·zÙRÓ²/R2…Wü àuµY\%g$¡ÉCª„w{#x'fñè:ð%K;¡ê¦ƒîøQR«Z{¯¦ðå*×ÖoûWSppØrµÙ5hF*·«ž`+wÌŸ•#ÚtÙÇQ¡CÙP÷„+´«EFŸ…+5º)» r×U®¨'¢†<¢£À=âvT“ðª¨" ÎÚ—ö®}HRÔu‡jX檟QЬªÙ_QÁ´«ÚáoUº¦àJš®„솴sV#ª–SÙ÷Bx<”=À,ÓªââB±v¼=P©x…~Vñœ_ vì„)ä±ç…¶6O4a^íaníµ¼œšÚ¯teËw[ µ:¢Nn|'(Rñ,‰SÙSLa2Ÿ)W8ò’‹< 5+!}ÁNÁQ˜NDmö§9ü‘¦&Zp¤5ÇúM5}ЭÙU!QÑ‘…¾ #¼Ô+©û™H\Vñȃï®o*£th¿±·Þ¨ãÂíõœ … Ž“*h§ núŽC~û‚k B£ürœ(Ó.•{Û‡T*5Ä&Ý&å½mRnM.2J4j<†&;ýÚåBeaÉ^s”ïÊÎÉÑT{ÌÉNðžäsW òy…¹ñ ÿ ÚTÉS]°ÔP7º%Ô-Éyh”ÃB¡9M÷BqDàjz‡~œ‘ðõ5L¡Jx¹¡]µÜ^Î2S\÷}.‰¯ß¸.'ÜQ«V¾éˆRm[ÛÕoµ(9ø=Š}At§=7ÃÓÅÜЫN«‹Æ²š÷Ÿ•sÞ\ÇhjJÝ뱎îª9ª•›!À*Ÿ©SðÔ®«weÝJ¾—±É®_EÁ¥¿p:¯Âxœ÷OÖc Õ ¥HûªááÆB›ŒÂÞ ]„kø¶½ãXMw‡¤ö±2¨žD¦Ø>SOUOº§k@Âcâ%Sod[1)Îi’U6ŽßûXý*š¦j§òœZ`Œ'8êUŽl Ý%Êv98ªŽ#²qî©Z •HÀÑJs¹ª¦4A¯jx1lh«;º©=@œÓ§±žÑª=S$é8jÝ ðÈÑnƒ¥ê€LGø¬wÙCº}¤åª©æœ™O§ÝSîU#)ª‰ê‡ˆ¥§e»yÈXCå4u(Žë¹U‹Š•F«q%]Ô)Ó(Ü%>Ÿ$ÎîL<í_‰¤·u=ÁgUR5„÷iÄ\ÕWš‡TX=»)žêœsj¤Þè Ð…"“e8›ÕT ÌèSMBÖôVò+ÿ%KõLvÛ= 'L§·ª¼jJ¹Ç…A¤'ÇÛ•*y­t)–rÿÅ<8¢Ò!Ü“|=i «†B¥'šæôCSê©ráLùTÏe@ò”}¨ƒú‘ OêZª)-U•EN4 QiE[¢¨WpSþP…¼o¿²ü=S…*¢wtÈTÏ@­bkN²©GE3…Tï„öÌIÙYñ„øNîSÜz)U3ÕR¿¸LîDÔf5Ec‘Naæ…F{IMwoDù$l“ù þÉŠž4LtrL“„ÈèPæy}[-7h›íLLôªc¡N“èVÆP-zšykuRã ‚ r1¬¢Ò`Ês$ ©K¹lz¬©Òf Ž©î}KdêªU^žÇ›Aæˆm@IÒ«Q¥UÑ•e99Ö²Tû µ¥J¼ƒ•odXO4àH˜F±¦±¯˜@ó>•h0îkþŸIä›ðªãíEÍdµYB‹¤à’¢eÇ2¬«†N”P§#ü@è·tpëÑ 7qJ§)»Ü·¿l+Ä¢ÖuF›™9Rh9­êá<Ê©&ÿÊ|M7a~2ÖuM¦9¾å*ýèø[Ø;¶èžÓ¯%mAîÑ>•M'SÜ ŒòLXÊ†Ž ·&›Š{wlV录09Ó$ÞÁS4åÁ§+xÎ'­ë›™[óÑ~ 5ÑwDjr9 Àì˜{*ΉÑ9vªÐVê­#hVQ¦MBâ*{É:“].è·o9%nô.FÛÍTg‰$€íPuÃe…dä«*btWó¦úfµ…¡ê©Ð#‹á]ªüFìÁ(ÿíчVíï´+yõNhä(™ž‰í ›‚ݸÍ F›Môí´-È `Ê&™i"‘3Íg…Ù÷+G†#÷ ïÝ”Ð\§N‘™M`Ï£>„²³å‰ÎË}c»ÕZ÷£Mïáä®}IA®Ë‚/¨yá[YÓÑ9‘’ܾ$¦Ôq½ç¢¨ê®ÉÕuFÊvö¬ôFµÚ•»®nWQÁVº¼SPÁ'™F˜:¦ðV~àŒT† )Üç ÚŠI¯¤x‚k È4vÊÝÒÈ*ËZ™k¸Ç4wõnÄ)mH§:'€>ÄñPL/lü®éqUà”Cß,ä®rúµxB4Y¤aKÞ5[ x£T^j –꩹J¥’­eÁ皺¥g¸£I®&z§>b×*+Ösû ÊbW“zkÀìd”Kç(=R·U?ڹ￲© @S|•mAý©eSj½ —'S:+™X…¼®óQE1¢/¨$¸Ê,§‰EÛâ$«‡ÙQÁ<ˆØñ”i–­å#•e@¯ã’²Þq¤¢˜€¯¨É*XÈ(ŽªöÒ`ø\c+vÚx[ƶ¢£e_»nöJ›èaä¦ïWŠ9F“š-B£¤Ó®†ì/})rÿ*Ñl‹ê @Ϥ×ôØÁ·ØÙB0{™%CJµv_â”Z 'w$åYÉCiµpã²Í<¨hÂÑ¢ºÅ Âú­•ÀÁ+(¹Ì™R¥Í˜RƆõ_ãÊ–2 …Ò¿Æßëa¹‚Q€®¨À⥭ ¯hí„ãÙ;ûBÝœBW!C²¥£+#f@R .0 u¢%æIP ÷3ˆæVZ \-O¶9òä,zP¹)ì»Ï>¾›nÙ§’‹S_Pp„ÓlFÍ<õíDuÙ’‘䕦ØôB¥JÏäb‘‚…Zõ‹Èä¡còG›Y¬úäuç’sä(Aócdú1å×óÑù›\%CDz¯¢)—2:+™EÄÇEuvX;¯©ôêptX¯jµï¸í…¶V¾LúZçÍéÊÂÇ“O6Tzvðµqe[OÉ>Yô°²´R<Ú.¾yóãÉŸÉåcÍ’®ÕÇ“!a£ò·«ùzÎWé)¡ÂB‘ëJ•h!åÓÉP§ÑÆË–5F|®¥ƒ§d«<ú¢M‚îjBŸK+ |ñæƒå![æˆQ¶JÂ䕲µôî(¼+ˆSèÿÿÄ'!1AQaq‘±¡ÁÑáð ñÿÚ?!ljÿGjŒŠŽµƒfõ‹áôBEGoá)Ö?‘œèQgDiÅŒ WŸ>Fk¦´EÐ~5)ó Þ&Ê'°÷)¤ ºzÖá±kEðœ½*7¤Íü¾Ž-½ «XÏD³ì=üþ ý ñ¢rÕ‚ðÈÍ~Õ-Æ$îUŒûK¡8!C5'ïr‚Gàd„Á}ˆ›ô6‘VF>ŽôGѰڂ ‚z´•¬dÐQ88AÈÒt1‰¨kƒðz/‘¿Lt6~ I:y&R Ìa›BnŽ™S ßÙgÑÜ\%GHç¡ëQÖ˜*Ö îà*‡ÉS C†”ü´f þÒiÔ~ L4t-H6®?Iàá  Ã™4såômÓl`(Zü;D¥â87Ò4Á¢ ÖôS#²?øuBˆÔOìTÆäö‹RhÛñtM ;ø$,ÞÎ…ã¡ðð†óð†â(q‡ÈþÑ—‚I‚ºÇ¨è÷Ñ dô4OLB7Ž”Ta^çà¸y–ÃÂ~ ŒÎ1 £&‰ÀÁNü˜7i‡ôvïBtÇñ~_§Øƒ‡@™zWJ Ñ…KßÁ_ÉTÑ:ñQÂ’ Ý/t¤Cˆhóª3ô§( {•øbLŸÙ3áàòYG¤5ïOgÏôbÕdªI¢ù†©ô}™Àé¥>T7c([ÄgYeણ“Ö,Q u 墨Ì"Ÿ…ä11 áPƒôÞ Òü £`(·…’v¢ojÛ_$– ´•*D=Z;ÄÿccÆIŠ‹¨Ù¶ãj&Ô†ñ¡¿Tˆz7è42¸‘¿bh=~&Î’•F•Y/Àª!k5ErCjFÇ趬ѯA6q¨}‘ 4Ó€‰ªEðM5Á%[£Ö:t–dð"M 5"!i__…³Œ9ˆk‘ò'‘r´Â Ì8ïMÆü< T/“yéÞÖtNò´àÕ,Kz…Ì3ÂÜ2$\ÏÊ(mé(þfŠQ\ ]§g±±ó‡6Ä*1èo,Í `ø@ý£© tžù;ÂßÀ è» °õIi Ð´*Ý%£/DÌhT>g¨¯dÙk£bB®eàÕâ !µgr¡hÒ]šÂ.5[¸m`sÑN‘Ö êŸD4u ’£çQ6ð`ð5(b|!€8ªßæV]Õ3®.áÄŠ¶Ž6ú8†™ÜL–“Á¸¿$¸&ˆ{†a=Z80­âbXŸâÈЬ…±œ€ˆ)ÏÃ#Ruý“7ŒñJlQÂ: Ò$g ø?WJ[@¸9}G8h€›HŠ1­Zs78 þŸ¯Hèž‹ôxÑ•™©•Š|ŽÒhÍÖ—‡µ¡¯“•ÒŠ:¤áoôÅ\É@ÛM¦„‡Ë ¬oÑÓCQ½††(/ÏL!ªKìv³YýJãý„åSü PV;ò]ŒÊé#ƒÑ¨Í) =ˆ'Ò¢À*KX|¾M4‘!»ð’jÃàðÏ>G¨ÇXe°àd¾‡X|×Ô.&“£ö¡ßOEú;`l²Ï`Óv££…ôa[´ŠÛáÁú äUƒúBE&BÔN/Æ5öŠpN‰Ø°Âiü¸S³ºáôÃ0t^¦_Kâ\¶¸X íz3JßEÑ‹¢ÚÏšäçH´W¨²Jž©Ø–ž)ƒ•˜®—дÑMþÄo£ÐíeǨvýGÐ:T§…¤·ÎøPÓPPóG‰ç‘EÿA‡àFµ C4Í A·È1‘œIEM•¦è´4Ø,Ëøø1Ÿ _ðNÆ,Ä”ÿGvÚš&†ø&aƘ¨¿a~*üEµw¢x UžŽ|F«&EðB?Ñh— ù ODtv Ϲb«S4AmQòʯûÏ£Ûåᕞ`Ìâ”ûŽ nõ}ƒŽûýœ„ýéDå97Þ¡~‹ôˆ:ú” Z|±óþY¥˜$/°„'¡cSáàbôD[Ø1/šNQ$ý|#úR0TkçñÈLšÿb HÓô\ÿPn:{i ²oÁY“ÑMVò”Æö¿ôéž‘4uT9ßHôÁ£áaG¶çÈáÛ/à€¿ážA/µ¤¹[Áû'ôÏÔž¡ø,qjü jeœ¥¼¡;Áý–òzj¦ƒý2~b¬n }&iÁ“ðASÙéZ‰áŒ5¨#0‡ãÿ?êH‹S#×¥/‘_ŠTΩ;Ð,¿L³lõéà&ž û'úKe„£a •&Á$ÌH€­¢¸ÑD>ˆÓpl‡³Ø9þ…Êztlƒºù”´+t»ò94úpeÔ4oÓYÀ••áqàò Ñ÷-$kHq‚„Vv-›Ô¨¶ªÍ M΋6ÇsüÒwWak´Ô%½ÂM¶Åì=%hõB¡'ÀDEqh7ÿ¹õÇä+>Çj¾8&/Yò1+Qó2Ý>–Býbe²—ò¢ à#è “—÷ ¾×¦!>G·㈮šZž °å_"ÂHz,)Åù¿z4¿<½Ûo’ŠÝ—†Lã°–‰Z9BaðkõsöQø ˜td±N¾±$Y×HŽÇÕG³¡Nß5ž¦ b¸‘è¦+f…š³=ì–'«ø?–µ’,>èТaÄŸ·ú7ši-Ô×Èñ¦~Âpù!b_b [{!V¥؉ñ©ºÿ¹hT»aæäiEÑŒAö¼'¿–'¢H[}b~œŒë-…aºFv´w£á=jþGNQ×ÈöÎê=ø"êJÊ!ßf®*¥½‰ÇìQËò¨#o£Y'ô"èéE íÁ=¢aNé¢hrÙvk«†íZaHµ‚(ƒ¥IÅÁ_UÙ3ÍØƒ Nèë{i£W>d·Ê0gËà·y%ÿAû8º‰8ÃÚ:¶_|“{‹i̾i¾—šòö¢ºhIêhËX7l>$Ïè@Ftãn BîêL{ îÛÚ€ýXÖ™*Ø €—¥Qä†G¹féˆPøÑu6¼ƒd‹ÈTæc: öp_(Ìõ\úØÄFCŸÄj쯈лLæ>²0ˆÑ"ØÌXc®1¥oFe¯ô8Þëðôômg¦áò>0ûG«ƒ^|WÈÝrÁ,…÷Û\?ÞŠ4:q`« {® hA*¡'¥lNÄkÒÚßãÀ-dÒh¸&Fú, ô›'u3ÊpÚQ=!u å2¡P’Œ-À‰GÕ(3±iu?ôl¢ñéü4ÈëCéÂ"cú,)Eðclt.Q> Ëç sàçñšúy'âHE8ШK“ú&§êçŒH>~Á ×JÅ$‚Òu3ú§q0J3¡ù»|xF£%¢çzÈFø£¾pZß/F‹^g”m蘊u±V¯B½Zÿéýâ"º{ %"º+ð°ÅûcÖtþŽŽç~p]IŒ ´^\ü~»ÈN:ì8þºLmˆnÿè§¹)à‰ ZÅîôSuî2[ñ”þ™ìK8<ñRÇáthFE.þ HŒwÿ ’LFytüz ½Sú)|17tëQ>eDhj~©U¤ègڃݾ3þK*4{øJ5• = ›¢|ˆX)ë#ZkÁ[ðO«5—1Â^þ­Ñ’q:x7ðʸ-?šuyGÁ‹„iø,(\§àäk£Vhfe6:pš9Â&>mm£—ÑhK^$ s®º<¢•G¸·Âôri3êYaÎX Ò3 ð¹ã¡¹-=>úbª¡ÅmvÿfÁ•NðJNyÿ]t‚‚}´êQ£Í¤Jñ® !7¦«8hA×¼®"½(goôÄn>^~‰7/ü×ú3Yl¡âá7àïIƒc% ÿ`Ç€BÇBÏúÓÒˆ“¸¸9ÊUºÈœœú%Œ~NÊ0]–´-zø‹ò%ÿD&•ñà¯XƒŸþÁÝÃÆýÒw¡óä( 7qd*³_þ …*…YÐ HáˆvI€Ã˜ia¸%ô§[m^hÅ||Ä Tý&ÓáÃÓH Ï´Q;½ýK hm¸†ÙHd®O7!Ú:Q;ëc_³Ðñ_áVÛ«dl® eò%‚.(½5òJ&têo?ÑQQü—'ºÂG'b]$Œ¤7#,œd‘†•¶Š²p6%oE„…h¦ÂWŒ(ôÀîÖ‘-M$zNŸ¿n‹šº¯Óµeƒ‚Y‘1Ч]|F¯UÃ]õן†¶¿Úp7èéxÅ¡S#Fz1F«‡ŸŽ&wF¨WNEDÛ'Ùµ¢â¿†Ñ££ÓÁSqt÷ti ñÿ!'¡œ†ã„¥­¦cø#†¬+Ò•tyÃÀa-[<#àm¹ñ¢ÎˆõByeRÓÒ½Hnž¡1BÍ XåV”ª8£½tûQ¦’Ø„OO¬ÏSªzˆ”Ó®#KÝó(ú[oVÃ4‹ÆFŠÃÄÚÄ-¿†`ØÓµ†ô4Ðn×XS:MÁù2Žú#þO&5øO]=ŸiIf§ØzæôÇ Ž;õ"õ]4*¼úê.?½$’¬5³\|b'c;«£gû,èÿÈɳt:oàñφ9.þ¶AÍ·YS.mc)o ŸÚÙ@xň¾ÁoÂCz“å“u#ÚŠ“âŒÊx=”œâüMKT%UÕÆ¼<|)Ñò"¨¢R_S¼Mî …lq&ûø /‘E¥hž“BúÕ’ú(y!¶WäoLÝ=bI÷äSS†Ó–2œùò)>›­|üº-¬*þ ,!Ï‘<ùé) ~Ç7Àµz"Ù6Vã_‚ A$O_ãå1±¼çùè.7Í9 èµ^CÆû%×ñÿÃHh”ö”¾au¹ô ò —‰Ú—}º,…þMÁ\Ãù2Q!*i>ÄÔ³!‘Šjþ cVsó¥¸%à€Ž’twà„/æ)J4dÔQ§þ‰Jƒ¼ßÍ%dýµ`ÃØ-ªÈ!ƒpJÅ4$R'ŒIÃi·^•­|%£BáX˜˜!0г§ÐjèŸk¦6a …e®Ø]¡1|$!¿À¶#*p}© 7¢Ôp=Lt„H‰å=ˆYZ+jú#›§‚_±"Mß¡W Ëm¶Û¿cäÕ Aê¾û×§Ê¿ôfÈZª1ÅŽ¡&”ÀÄ6ÓMú5cŽ›¨+ð›ö štEŒ½ ž|t"ƒIß“Á¥mBþô޽&ó> šcÝàÛsÁ•¦8L\Ó Zg$CGÍ|¿ÑEò?@Z[\'àdÉÑ4Ué_¨ý´hÑVù£„7UÃŽƒöL/‚ñò%”×ÀŸ ô7 áŽæÄxÀ7i°\‚éðßDXçòôT™‰Õø ÙŸøv8…"ú:¬ÏÿaÅèIüŸ¹"TBÅòWŒu>‡»ð:ú_EƒŠA X‰È×u--Gvz'– /ÐꊈU᳂ô>?BÓ©º<çDòiþtFþ¢5‚E£UBIôC 8‹ñK…h“JÒÐ1 àŸG—‚Þ´:ƒy•·é¡¡Sê="èStzÅà„:¡k_‡ÂÔp¢4ˆRù¡¥;¥ômàá5®”/ØÈŠ&2à¼1…ˆÓƒPRMCQ5J†CF%£N¦: P‰"XÆL:,Úl5ÏáLŒº~M Ý?“ŠÑÙ’iÁq÷†êõON3Nü…èU¬C·P˜iKI”¥¢–ÿ¤ô•~ªƒÝ t¯Ä$¿gþ¦5ðe¤4$“àXÓõAf‘áÖŽ~Ý'3ÑAXŸ?D¢‡ØS)Ÿ_h°Úƒ„x\6Qˆ×ÙŒÌ))’ßA~"»È5F‹pC鼉5¥·FoðÐÍ(5B2µ£…4=Á»céQFŒ,$‘ipH”d’’§R!Öž!’›a Z:¡ðv‰z‹£[ÆÈe†ƒ ¦C[ƒ Á»ç#fXÒ세ìó ‘%#ø"D)—:"WEèZ^è3£Œ:ú%øWÁ£Vº6àK ,60Ÿá]üR¼Ç^¤‘¢$pÁGñž‰ÁÐÄèÆ1œCT|ÑoLùäÙpp­ülý=¡„>k¥q¤>Ç0š· :|5Dmž†˜æ3—ñi/ˆƒ|OýcÖG>…Aĉ0h5xQ;Ô=¶à´m‹³)úT+ÓS/Ü$|ŒjúzD]0&á^h½0‰P·‘çGü=.£&®”~k8Ë‚uÂ¥U>‘ß·NFþœ(ˆ…òTâ‰u™$Aš–}‹¬q7“ ·ò=q1¡oPí¡² ü¬Âtùhcs)˜/Ès|ïÔm9Ò6„C‰ð·œò9(¾¡ †ÓðKÑŽ¯Á?¦>¾ç[ä¥HâiŽ+ò Ój5 Pn‰T#ÁdçÈœŒî!²¨­x/–lÁ´%¡ÏHµ¢®‰>ö5Êx8Àõ‹ ê$-í"½ 'D{øÒ4Ø*a øz»r¥òzؾˆQyf…Yp¼9GéÑzD’Ÿ‰•=ƒ~iA“îvQèù1ØjdTéEY¸x!-?L4º£ÈÈßчMðÙð!ýˆøÇZ‡p?ûý˜£Qy–2¨ru—ª‹ƒJùBQ®’ëðrÂkQïãòehßÁ‰ž3©ë,Åœ?p}úð- ëÿÑv]8ÏÛðA'ÿÁ[ì>Ô+¦Ï•PU3-,0üXè¾%Ó­´e7HM¼¨ê~=~WFÓã[{¦H¯‚$:F·ü>®h©ŽÒÂ6Æã= §‰-#¸.Ÿš i ªùfVÇ´˜_ü›ùUF½Ž¡„í¾‹(_Åô[§´RD«IÒ\ða¤tOP}<>½fTs¬Jh|‰èûb'(ðéá—ò]A ±Éâb¼ žô~ iÆ"}‰NÖ˜ÓuiI¢~ƾ˜â³Ep‘tàþžžÚDú+‹·ÑàüÃâ·ðEcÚ8Âí'þžM£½ù8iðmÔÈá.Aii]²ÅÜM‰(ÚupŽb2YFEÁ­V~N/ÀÑİu£UÕ“¢W†'lñúKƒiT&p{Áà¿Pi}8W%.ÄQ¦!q’\Ù4Ze]¯è•;úøá캓ϱÔi¡–ºšhÿØ©ËC~¨ÖGÑBª?š:x•èßè}BUÉáý¼N1zð¼<4&9²¶‹„5“ð i±K(Ê ÷SÂQ]j§]GËT·þ#i”àþÓj¤…¢4z–Rÿô [GGÔºy°›˜RôÉ‹ÌßðKÆ…ë[ZF¿ÓèÑ^ Bö/O„ü¢¬e@c®›qý™ƒûcxÈ,Ìý‰Íáõ!Tµqƒ:1A?–‘t¬Ä8Ît='©¤Å艾Y›[à ÞKGQñh³TUljFÞ± c©Éˆ ÕôÇë×¾³KK´ºÑàqfÈ»5ðd+Žð¾8.õŒql^ŒžXýä:0Ð ;›rˆ^ÀhËDsÀ¡J½d4:ô¼Eî~®ªBÒ«—/£•#Ö:ÈwÖkû ¨´ß öÅC’ŸA7‰V9j@ï„¡èR†‘“¾å;…Gƒ3[ûáªÇDN“I@ßàUb÷M9>½uD3é a¼OöÇ«" (”l¼×QûШ às´{ oùˆ*ô§|/Xêmª>œL[ ã&á§Û´XSü˼§<“Xஜú‡ª†àÈ!IŠfŸ{àÿØ á[. 70®†Ù{ÔØ”¸y×U‚ÏÙ¬ QƒÂ*å3É®#ÿ5 ˆè5ß4’!'kˆnàXî¥Ä3mYˆý‹|˜•ò¢{.>e0Ñyè_J~ƒoT!*ðoA“4t°ÄQÐ!ÈÚ|6ÿÐÄJ= ¹"4Äqa ͉¨=I‚é´=±™£§‚_d—D+gú„¾‰ëÊÁ ë"¬òªMá"É»þJ«<ƒ¨‰êKØxW |6t>m1ºPÖÈ|ÉÐÖ/Ôõ‹  xŸÖÈwî‚ Ð£¬ G¢Î]¥$&”2,,¾ Õްp¦wÑ®ò þËèm4HóvÿÓP ‚âÇŸ0¢¨6@˜•¿ÂtŽ4¥“‚ÐhÃú!OeáòTq‚¦ùè'ƒMI~Æ Ö”ÅÈ!lkS…¡5ý…±ðX&ÈÏ¿_øþòe­Ÿ"“šö-s'ÿj¨M‰&#¢`18;l1*Þ"Ч¬3ŽMÿ ŠI‘? ùzYd-é$ˆ™“£e¥èytôX§Ñq……fA:LBË¢J±”^f´ž3HcM Rƒ_±[ãÜ\þ)ãÁI*¥ˆØÃ£ˆ^s®?¢²I¢“Õí c6â[ÿÍLÓú&ò~Å (x‹ø!5KÄ*ôΊÂIº©ù'ø.¬¹ôú!6‚åg—Ì":û6ö¤RcÒyKý<˜o ñEDdû n¬xÕDùSäÒÀq¿ùú‘‚‘˜3YDÈÌփՓŃt.›ü”þTÿ ¡„E¨#åí•ÚhãÁmã]èŠ-åˆÒï¢Rá£ôÄç’4mOgL„ãöØvŸU†š¨´çU±7¤&“(4Jÿúfëâ!- ø"|}‰I~…ʸvˆ4ëC 9_‚Bu÷äz„MMª#ô'{"aB¢€Ÿ HQ?—ÿNƒñã •|ÙöEž$$’ H½‹¡wІu+DøÄI¿a×ù øÍ¢…ÿìYçªcTuTzaAQ)¨‚ôvÞËÿ®1‡2ÍöAz2‹a#al1Ÿ*ßôÆÉø,Ňo’{!ÑÆœT.¢ÝƒŸ¼òW-Dvá²xœRy.ØËö"cÀŸ£>`=ÿE\úì8×ýŽ2 ¡yÊnˆ|S_±T5:Uz4/”ô;7ò&| ³‘Ï…t”Òù>!W¢H°}ID0¯¨KÈϪòAm‰°ÆxðŽoÂU~Ö_ªëoè’JáÄ{_ü ë®*VÖ½•?ý/é,ìÙ,}’ Æ¿ûq,š}ê|Úäý?š2^V¦néÀ¯YPÈõàj#äÑiUãÿDƒF Ç ö‰[¸|sC­Sa'ÿ³²Gü‡ñ†2AüRð’²|Ø„m±õ&Ðá ¸Á¥m¾ˆYÑ÷SäL³ HºK~”­MéËÖkÿê"“†ü…²b1ºVx:¶RT`‰Ã+˜S‰¤[RJ7`BÍš…³È/”u…Ú}Ž×ÿG‰¼Ê˜ÕÚÚûlFZí Τ[ª ý¼¸©B†.—fpÈ<ÖŽ37¢Ã¹ò &MÆy±Š³øƒ8“W¥à Úú2«:9"MŠ•n4‡ ƒÌ[yþ˜L'x-¤Ñ3X× ý…W£®+ñâû ž ö,kä‡X“ ,ø§ ÍÁ Ä CÖ-HèxÏMµÉ~ ‚cÁ3#+èBGPdŸ¦×úà¦7ÑR¶Ó¢h*ý–¢êhâZ¾÷ìûUR’ÀÆ¢‘h±6ž˜ ùf&%4ÔôCwrøýȪåméÔ+¬BŦó[h^§#L¦™ö4­Ö&Srø„®EIЉ·³q¡°ó~0íBõWEѬ7¹xc™“JתÈáþ„È)Ô°@ÛïìÄ@$µô S˜”ªÌ­š±xfQfxШܱq@rÁVÒwÄA ÿˆ8§ôØmb¢ïÊ.úZ9©é r¯ ·µCÛ£c§î^u=h‡jHød" \G¯ It¬û-*>D$¯Ñ2´<¡§´g¤ê:4M>j]=I¬šk²á%Ó6‰Ôd~U‹Dµ‹C;Ú9öÒc%òº!•¥U'G& 4ŒÃýP5 ȼ)ÈŸètË´¸(Ï*„˜ŠPDf[ßú$£ø™½·G$ØÆÊn„‘©¦>¢#Zah˜St·q²„_ Ó™_·ìF@½‘KÛþˆ­O‘z”thYôû"ë}aÆâTcÉ?¥OÿÃT|ñØV ä7Ì1á Ò‰ôŠ:ÊM¦ùÞ=ÆÁ~bÛ¿ôýÀÌOH5v=’O§_µéë_¦.Óô-×G¬[ea`(6´tXôbÊ5º:ʸZè?K¥~Ü\YñË!AtoÔð>ðþ…'eZ}õ¡ŒnãÑU¯0×-ðE1ÊÊßàä‰;~ä1›#äB‡ëvÖzÍ–úWãѦ $,²/¹t¢g¬ÍÛ}Š?ÖŠÿ(ÍùŽÄ[Aá®Þl¡œñ‚ë¯äcµnžtê™&‘}Á¢JÕí]Wˆ8×MñÓ%¨éŠ$ØÔS}\>4fŠK!åò¹èž–¨99ñgð‚†¦î°¶sÖ–™Û:ý(`ù‰é[à™q3í"ÍÉIŸÑt±½? 5>ÈÎÅàf±7ø|(Æ$¥üÃ5bÔÆHm[U¥A3SéÝ=:ÿ7G¡ l¢i›hM²’-¬Ê«)ø3ÿÀRÑ"pqÁEðÄSKäÐjÇ[’BÈpi’Á­Ø«ô÷ -ü ÁÒ:ÿª £µ£n?ÃÑÇàT´ 0á¤z)°n*ЗǦ¢ =œ7Ñ(ê:Å‘ŒC©ÕF¨Òm°Þ¿ dR45oÝ#[E/)D\À¸D‘D—„¾ñÂ7ÑŠˆøà%‚E–œàÔ3Ä/À¯áëM -ÐàÃúl$q¬8´Œ\ « %- O. ÚŠš4%!×-çá‰|k¤i‡‚¡¡9gm=‡Agè<æÇÀhFëö"Tú2þÀékýb#äU!à“èˆE# ±ÈÕš/ÀdÖ ˆJ=TÙ.àšƒ~Šx_Âꋷцθ9"'‘Ö$Ùˆ&v̉ ((©YÌâôD4éýM?„°¦Æ^U&Ȧ>GÏ xó…F“†u*È–ÿ‡ù0§~Ì¢dWllcDëø _zðþb¦+KN lÓE?Àƒä­¾ø(^86Ü6`šÒ!¼I7á{1+уŒAú°î‘¶÷öy<0Ó £Í4 Ú¢Ô6Ü~o#â‹|R£¾‰ÆQðHWz6ù(ÿ`zÌN˜BŠŠFzˆÿe]øddÆrQ~ iCøŠþ8»zT)Ž[´2$‹ÃCtNáPá@oèëC˜Òï„5)õ:h¾Y†ããñ‰Ý›MÉ$;Ÿ f-4¡Å¡ûø3ô!ŒžE¡?#nŒ´|dNг))^þ ˆ„º(?¢mŒ‡é¯Àé¤1Ü8 ¡G5øN;ÀÐW|:¢Gc‚g±S~å¡e6Cì;”nþƒ¾ý‹åÝz2F PåÏÄÔlJ‚“ÃR”¥øˆƒ³ÁL#NbU÷þ›­¢ÒL‚¤8g£å!:52BmAŒBOÁ¤ÅH¿gÈl ¼ÿ€yoÿ±„†àÕ1êÆåEQÞ¢°¹ÄM>“°ÈzQ‹Ü(±›¿D§ÀÞÁ&Ž£E †:R:ˆ–ÓÐlÏ’F5›€ÚL$; ð74‡¿à!zÏáZQÁ6†Øeôz¯à‰0ôT²dš>Kìl95¥iÿ§ÌA0V|1Áu¥I^ƒ8NŒl‹Mý¥aÌø8vSað¡«]{ù½J_àŸnš´c<~’¨}К×OŒ£×æ‚ Å"GÖˆÿFJt…=Á¹Aº,ÑÜ<¨ƒ+cШßSª"úgÒ}š%·äJ^â$;´‡K£r¿Ù©±á'ˆÖBAOzÊĤßH`Ö°–ˆ‡£|ÀVÌÍuÑÚ@ÃÃñ ¬MXÓ¢\sŽFŽÑ´¸mþ/N[¸dkG°ÆÁ#‚E ?€µ†Ô±ƒ1«ÿC•·u1ALø üÃî¥á o¢äúÿÁ÷V3“CV‡œ-_“¨4˜cDL¬O AØÑë‚®5Zoi½g©zPk[¢O£#(ˆªÁº‰ˆHla“hºt˜RPçpsýuŒ&\J!ŽÂ(Ö-ÃôRŸ–æQÕ"·¨hŸÈy?þŒ•8±}rÖË¢?gYÑL+£?ÞŽ¶ýúdO3ý‰;/¡£!?°µBçË8ÜÇÈg§èÅEWÈX.^Æ$´‰†1÷Âß'~ ¶§Ê[Ó¿„ŠålUñ®“ã^2.—ðD|Š˜9wWɧ×ÈÔ¸0‰~ý vüÿäy…5‘«Mö¦3õâß’)ðuµÃêp[ü!³ëå!§q”£ù…„Í¡?ê?ù…Äd4eEÕô4sKÖð`§àâ¢Aï/˜Þ³p™k\M’±ãD~øÖ$ ]9ƒÇý,EnÄHup''…g¸4 øNˆæ­c†Q‹¥÷eΙ5'á pd7¥ä“¯™7äð!Õ&@!”¶­™Š‡ÈÏ$A3®¿¦;Y×ìZßÜ7J—Lƒc„¨L‹Ò¨BÕˆ.þ±ÅIèwkÆ4*A»,BÕOÇm>èµçt¦A…9Q‡ý¢Oä ¹V¯Æñwžã™†1m^šÃFhŠ•Yú24øÐQ6|£+X{BÏÄ1hÉLƒ÷HpÙ)ã;«†Öʶ«ð îmàJPú„…Sÿ§t,l#ý~´ªjI½à’«Ü%âØþlµÏäÛäwó1Ús K :®Ö¡,rëEçë"£íâ:…»r£@Óù;ÆAeý˜—¦ì+¯ÉçQ¥Ç’p[%D´ ý‹ôÑÏ$ÞMè'ˆèK¶ ukE¦Ñ˜F±]0Eõ!¹ôøÆI§hóU¢E¿šÎ™Jyø/‹¤ßÂÿ¹àüKq4œ5´|ûJ&mÚ$a;%®el¾Ìà`7NhÓì6¿0{aÓ$ïïiñ×·Œä»F>¤4)th…©úHPc‰:ôDÍzAŸKd,bÝB¬Rõþ@„Èk­˜‰Cõ Ž#ïiZÁ7É«…?“CŒ£î/š$¡Z3Ã.Æ4ý”M®oâ3CÀ5p6G|z4X /œ6Ž ê´RשQžŸ„jǰ¨^ôé¥/A‡©ŠB– ÑHøjÇ‹$|ôÒ±ÿAïô[M…‰4ˆûb`ö¾ÁâÈ1ù²°që@ê'0Wùž‚Á™Ķаž†[X¿c,âDÄtÿþ½å„P÷Äg´ã(51|œ¦ÓúBðiú@A: m<º´BHL¢T<¨_¡d'£æ‚ÂÐÄB#èsý”íœÀLV&`ßý ŒQ—úË13eÀº—Ø„[ÓÂ}ádоAÌë©õȵݵ”ûÞ ©Z`_pJK§^19 žy(hð•,]V} HšõÍ?¾˜•>‰1¿¡OØ?qW4„Ö#"P*["Ný¤b”| RĨaó§µA…4ã/ ú¿õì +Ð52•é"þÓ]&äE2ÊÖþ2%6$üðÜNsÁ*v öè‡"è_ìqabôoèBn5½Ä/10-œ…ÈY,LZŠ[‡ð5 ª6€×B²—¬ÃvGFÖ00ŸÈ·½jO[­QaÜdRΉ W~Dá#Á6úý×WMài? \½qÁmèpSÛú»?Ú”öm¿™¹¸$c ;tóÌÛ£{À²—õð&Žü£³ø‹ñe›úx#ðñZ¯ú 5+˜>†3F)_zNãÒÖÄ„™â‰2€&aë WþÇ»­˜æy Á)MúÇŠá˜TM©ìØ…ÿ¤aâÑËÝ#òÍýX™Æ8C[•Ôý´òŒBä=¿§PŽS±©]¤3ëƒ ŸÂä·/aþDu@½–—À²<”FÛú’ÉÑ kE‡ØŠ À‘ñÒø15)Ј#ûÁ©këÐ%%ùÿØ}Gá¾@cØ ²(må-~Ù°GaxÖÓø/>ƒý>mz‚_ªÿèÔf)vˆ—RÄkAúÿ¿† «Âb%xÿGr.¹S ¦†Ñ­¨1³Ìÿ¤sñ½¯ÿ¡j|!Ò÷Óá0íðp}Oÿh&š+K•¡§4:aü•UðÇé?áðûkQ|c‚Š$ÅÈõч–B²•õBkSb†«tàjWL#úí _Г£P–äülLçÉ-£~D’ YŒƒR0B´Ò_"Ùù,ÝGü,ám¥¨Ñ®_ ”†T“5õ–ŽÏî0ŸOýÕ݇X½2tzÑO'WÈÇø"cL-'WÿÄGÊT·ÃÿêJ[ÇUß%6àoýiƒÖ_aàͦyÚÆÞ”rwoO¥454­õÎG×Qî${QD„c”q²’¦šz!Q>%ò#Jþ†ø×Vø3ï›ÿJ‰ƒœ¥Ál¿õø•Pø`ª¿a‰ö!šômÆ-"ÉèÊUòüЄße›¢—ý&.³çá$~ò yÆ ˜´ {¿qÖ-³K¢Úþßåg¥¿ÿñ­0œ ’ýÿôz¹Œñ“`š6øÖÉkÀ»V”¶:wj¤×Ðï-RYŸìøº ø_ø;Omò(zlLŸü”úÅôÆRúD’ÙòQ’Ôê1#âŸ!ütáõÒ~>•÷¥ÿ¸7¾ÁžM§¢ñÃÿ‚(|‚*’q¤Ç›Y˜X÷ä<Mÿúú*%œkå6‡ÁÔÑ(Ž~SZf6.œ„¹RÖÓ"•j1›MZÔ)'è– ¾í2ùðÂkè”÷SŸÃ¡:2>­é´û!Cù¦ é-"efW朧NÏ‚M­nÿ†÷š¿Bƒç¯ôšì>­Q[Y#£}-POb›Cì|™pr«®" W|_²2Lú(Z²œ§øÕºáSŸµKô6ììwV”+vlÐk°}pÁ>¤b/lrM4ö©hþhÌÁ¬šX03bÖQú¸!ágØ´Xðz%,=šŒœ×Zôÿ$žbØÍ aDŸ¨SºW…˜ÿ¤8`ò°i¤¿~ ¯®¢‚ý0¹ðå c;͵ 2ùd5PâBbÝUl;$M‘{ÊUˆO×P¶â%KšS/‡`åúµ4z5 yƒ.M’áî‘þÞÌZ˜Òúž½…­½Â¬p0|“Meu¬Çš¬¥ÿ+Â<•FÑÔ»` ”uO’Eûp3ÈHÔê©Â}ˆycHÚ£yÃë +àššwæ} ÌÒÆìðhYc¾(u­ óçbº .!™±eQwüœlí›þŨoÏ0ûÙÏ™ðœ. ôD/·AžFk?IDpnÉ"Ã×FüàÃæá":^y‰X‹\ðT5z"œÁh4œú è¡lW^‹ž‘å¿D×$ØéÕ8'J‘ARƒ&°½D&å`À” òCƒmúÅ<Ö˜´©mœ!hyAX´]f©peƒçóñR1®ÕTvÑ䣧W<5ˆ"âÐk†xÈßš?²iJD©)„ñÓ£'J%ûÚ#¤f| åþzŠãç( Ã0dl Õý*¨` ÇÁáGÕú t–ôüoÁ¥¹p|Ç9…!ÚŒZ…‚1®ŒêÑ’Zà7ì߯ÇY˱‰•¯´\¢ÏÅ·Ž¡1Œ‚”Ól.1IìýbkÄð¢bbü/ƒ—='¢"ˆ8{¢’WÎVE~¡W]hÕ½;yŒßF•ŽŠk3ø˜§¿ÃÉŠ§ï:d†Ì{F"ê;Dp4›k©š™ùHQJ¯Y$ÑLp¼9|ºüC1@PÊEćùdwÎ’"²}¤ ðFc: jKø ùð ÝÛI⸊À‹ÂªýO¬¹aú4ú˜”Ræ¡¶>—ƒTë„!YŽÄ% Ý~@Ñœ_¡?öEO±¸Ø£á̯ÑŒ¨Øx¢øÂ|ÿTJÒÔðº4b„bàÞ¿öåÓàFÓG즂Öo…f£,¾B‰ÿy¯p6ªpàÊ„ ýÝ£FPi“ýK‘ ißÃôÿ„x® reò‰”³ë’“ ‰/|•¥_ÐÎ !&¢ûQp â’ðFáýñøød4i„¸*eZQ,N 1¡è 2°:à„¿¼Y¨5MH™/±ÓJ*B¦¸ßÚ,R®k¥´°&DÖ\|_ÊLqŠß¬Kž˜ú0®Ózc\Z:Q§í…㇓¨W® σS5cAKÂj\-&ÌÒÄ)ÿÿ°çØMâ¡&ÓWK›z0ÏÓ RS* µ”®à»ö5œãøSU«ÑÕqCŒx"ýŽð´åHÁú(ª‰|BgÀ—„J2 ][3­|ôš‰¦*#GTHTš5C‚g dŒÊ”T¬˜Fß*|„Y3 ë…NöÞU¬Fœ šGØM^Šèk¯®*YŸþH6í®š4˜¡)ëiKà£qÁ¸pú3VÒ0^„.8l‚£Ñ ƒ*Cxt|ÓäHcD'øq g¿†pH©8§ÿëeC³™2-’¡*7'ƒFé~ ΉüŒ¼…0)Ãö…ñƒ‚.†fŠ ÓO=(M8A:&?”%ßÃx0Þ ÍTYK§G‰V ³ïááCpSb7FÐÚ|ÃlD4z|Óüú$ª YB_ˆm™ò? ç?«œ&ߘ$XÉPž³Ž® ä…þǃV1(·‰®Ï0Ô3)– ,.Á—‡PqºW °EÃ~½ ²á BÚ:$&© 4eIQÿ.PÊà—gxo¯½cOF‰™®Ð’eà•Fõ ´Ì ¡³=ï?EH5ƒìLÃDÐ.ÅÎ| *_”UôüuZ'á”ô¢‚²6‘ˆtK’º% ˆðOé„âbJ kz" ±Š3ˆÎp…ûA_±2ÏÁºYb+éŽ.“ b8ØžF‹^ŽÖB!aTiÒÒ•~ÐRwú6lb7ÿÂ"Q¥*bg˜†M ѧÁÁF:O!ÚðPç' ÑPé X1«£ýÁÒ AŒuÖ„{+'ôkû,Á}cÎ›Š—É¶Ñ°ÐàèiåŒL»WO á´¡Qd(˜é³¬µê³^’à¶6D5~»_E¶éù„rø&œ_H^%ƒLùL^8lÁß‚õàíKáˆ+¢uc?Á+m±:ý‰~ £z 辋Ey1|1£ºAðÛèñO’œäÇ6ßЍ™·ûɽL*º22£:ømð7ÙÆäôukI] Êí:KDV„9ä¦c¤qÇ85­K§x¢ù?ÈýM|‰ÚìHÀ`š¡òH¯”½LoGÑàð{{âöw—ƒõƒŸ/‘tÌ@dhƒŸ)p„†¥~æZ¤K x;ÔøeR}DMøÇÃJl«ë·‰‹¢ Ò›Þ #„ï…¥óðŒ¦äôÒôîÃCåT‘Py®™Xfš»ôǤdšOæˆ!ò¿MB~ˆ'ÁÑxØÓXX'î7¦§¼BcŬaÈÈú@ô|Bsæ/FF)Ï[ÑÆÁñD3ôÆÀrHð\”Ž·-?µNª¢GBþ†êTÆíóÇÓô6GeÔ­gaò^~!…°˜à@âQš¦5¹Ñ)…‚tk‘ $èë=#õ2aòÉ€ôôt1?¢—}3•D§P­82„àÕ¤<¨LX‰pÀØÈ3¡´I¬!ßF4cX]ÙËÚkärM`çžôjñ^‰"ÝD'ƒ<¢»3 š¡{fOÒÿ¥«®4ŠÊ*’xŽoÙˆwXŠèÚ¬^×£3¢èÜø…“ÉQ¤Lmh8.…Ó£ˆÏuf(ÑC÷²õ?¡bÔRi}_X/Fö¸-¢z½07âb+£h'à&‹ôýLÿ¬|—Äÿó²„Ù¥n] bÔ4àHTëà}•’Pfi^¡ð¸q£ôæl<Ç„nnÕY#—Ã9/aTÖµƒF¹,U–ƒ1®”K‚de XkM¸/Ô‘lyo§ÕœG“t¤&Œg¿è, #£ïÞ ©]A(Æ>‚ZÃz®Œ—fû_ ãZP´[³b :Írø&¶¥e>'Db2=Œªí°=¨/Y÷“ƒ=ú^ìbÊÐÿ"F7Iý‹_AÛL—¥t ™äA áïè•åçð.5šÔ·Ð+-6”'¾*bµ±Se[M øé$v™XÁ5ö ·¡Wg¼à>š½Ez²ß‘~Â[Ò¦ŽVuìq=¤†=ªA&>í‹0æÿÁýtŸþŒ§°[~Ë< ­ÇqO˜?!˜ŰÈRùóŽý˜OÃs?>õBe,7=Ä4öÍÓÔ±£nÜD4JÄwHY¶Ì^²|ø/kK!¸6Ž òfÈv¬–Qõ°{‡¸gø8´^| ‹Áµ4˜ôÏÿˆôáPŒ&ä…mÅŽÕŽ‚×N‘±XHk(¿Pv_Âbi|ág˜v^ %Öžžf}l½|1+ý"]4…ùU)úœ?ùV¤t„Öňa—Bv‹S¤×ÂaÃoð>‚ã“IàHÇTþ[Ÿ'3Mˆ…¹±©‚ñvQÕ¦îu¨ƒµ>ÅÿK ñ‡µ|î4ð™ìñ´Œ$Ûf‰ð™n cÑÐa¡h®1ºú\>."o£à•H×F£ _ró¢¥ñöÚ,¦vb5µÇÉ—‰_’ÛíLá*2`MÆ"æH“•Ç ä¢¥‹P÷Vô¿£„ôy]½ã7zþŽðñÁa™Tþ•ƒ-¢S~x-÷PxmvØAzÊ3ðúÂŒ* ÅXP°ÓõºËºBÓ(ZõE+ÿ€‹ž´9ÏäÞÞ°†éÚ…­þ!0ïú> дÊ?ò²m°¡£%Dø ÏÛìŠÓ}9üqþÃïic5Rð[Yóƒ´à°qúb,,BèoÖôÖœ ½¿"œ¦/+ðFàÓÓ>=ÏDžÑ+ÿñ‡'­Æ‘m ¡Ý ¾…ö¢i&ã¾.n ®Ÿ8zÑÅ$Ìpº=VÓ]ƒSà9ˆ2Ѳd±=Hk¤ÒôÙÔx÷D__"jt;°‚g4#ä*ë·º6„),*×Ô‰SÄF¡_ƒUvÓpŒÎ0È-xª†Uá¾¾ {¨üœ{Ñs·+b‹é=C«W±oÉ[·:[”ÐÁð[ ¶@‘›T¨Óà­å¶Uô’ÓSØ*f=Ȉi%©8)ЀºÛ4%êî5ð"²YZQ„"‹î|×QÞË,Ñ´ˆ´¦­.0O)Ï$Üèõš‚9)CmaÆ Æ#Ñ”Åd•̰§B)£¥¸MoG´»ÓFÙ¬ì"ÇqAߣ(DGà7#„ÏAL4¤Eð†ðK _'PVÐóð9Â| VÅ{­‰F1«á†ÛÁOÀÊZ²¬“p.áb^Šgú;öAO’¢.·Ÿôú².U<:ÙÿF½8LIV»o‡PÊÆ2Ü|øÆ %ÅÖ*²Üfåb z¿v: èºÆUþ¾‡AÉ*z׈–ˆt#ãFסa±ï#»!ˆß³•rŽ*µèÞà¬WUÔ´hv1 ³þò“¦ÿdÅý BÚ§½þII|©®ž1ƒp'cx4ÿÒ‡ÑÄdÂÓØRH¢|`ŒËÃ^éð5Ës‚ÁhÒ Úù$E1õWü3y𘕶yÐÆ:öÍéý:_€i” +BN/¡[=†`¾ÂrQÀHznˆ- ò (õX…7¡ìá±GVŠ:ôw r–&þ®ø@Ì;àd·ãPo#Æ×?àˆ‹vY³\CA‰WðF«Kkÿ ´ø*Å«ÀýAUÿ¢YàôÚÇ"UþgòPŒN+¢ª©Pç¹ðEkîF׺bâ)²zAŒ@VˆzÉVï¦;_Ч#Üé¿Ôõ>ÂÐ(!pyøJpe­Ò jp>ᝑ QhÇb—ú¶êTÊK& €œb?ÍŒø`X5cÞë¿V»V”ŠÅ"…a· "Ý%É\!)x…׿c7QDé”ÎIèÉý!q°I~äÃV†vR—À¸¯øãáí &࢒ܴJó×ò?ÂYJÕ&rú…ÑŠ¡ÒÔ’ý˜|zD´«GÆ÷‹ªFÞ¡ŠPÒgØìÀ,Ïú9ùšðG¦FÑsš+ô%Ø‚4éypÒ4¨áÅ¢¬£èÇÒŽI'G¨?±ü$ÀÈatx2!RTk€–ÞÑ5GèŠ3hp.œ:ý Lôj‰àP¬ý RÔœnVQ7%‘:ˆž~Äœúˆ6à‘Ap ¼[Ã|…HœYÑ¢’qþéÁ®wÃP®¤ |Б5¸_®à1µü/ÑíQo±§ô`ž¨o’dxšù7m{L2“Ï1ÛÏÁÕšý;\Ó%œ|ˆ/H*O½'·PE9ÐËHj“0]!¢7¢½~2Q[iz?@#¿Á¼ÔÈyT`õôɲ/Š9ÓØ—;$ N’Q‹Ë¸;ƒkŸEñéBƸØUÁ^4ˆv½Œ*¼>Á ,¨d¨ðý TVÈTnÊËð&§@1¥·Ö\;ð3ˆà×ôÕã-"/¡ãH†ôô¼ò0±ôc [ð(ºMÐôY/‡i?Á1E34np.d½Drò…+¢\C¨Û@›Uÿá¤J‚Nî¤C1ð3+¦ó1BÛbÏÊÚJÝwðž’Z{ôpœbULú>±VÃú%ÙNSƒšþÄMgй(xLŸŒdn·¹øøM´g膫ÈOÄoDwŽdW+èˆD¯åøò!+àÀpW ŒBìßXAN¥jN•Ñn 4ˆ7°ÛX¤=PI‚ù&’×E¦³àVõ=9)³öˆì–š}¨[$¨‚›9+¡*Ótg4WŸìE¹ê ,AWÐHÚcˆ³GðS‡ð€q*ý†1𷍀¦ŠtÿBâ¿àÈ6|dEÊÅx#JEQÅ,üJN$2ûQzA‹ x=FĹ9Ñ–ÿ‘pgéU„­Ò­Mý/ÿ™ˆ#Y%#ØÒ)ÇMؘ›ÙtA‚<=èÒBsÁ#\xhŠè™ëZ*¶ƒŠéÖ;°ºA°$¼|8†Ÿ56×! \Ï£ÐI3”’¢¦ü[!ÃôL]­ZŒ£ùáèš®ÅÑ$ $Ÿ²b$uò[$ÉÁ¥kÑÚP{‰#fBOXº'äŠ5nš^™ô)b’ƒ¿0øäjá¦Kø$;¢)ð:Ú]…KÖFQ˜®¯¶;Ã¥¢ÚH&¤?Z&CÇÁ»‚Hx!uú8+ê:máÑ»\6Æ%S-S×PËtTÃRuN¡þEoÙ4é2ŒØ›VÝQìÄ"½0ŸG§ÁæUµøp¼t!‡©²ü%åŒ) Bœ< ÿƒäBfľ¸yFî‹ä·'ÿ&ÒRˆ“‘x—…7øvët «†‡mø}Ó"ÆÜ!é Mc!ßFI!ÿ±,ÿF#ði"Ö<¨VìlƒzÆšÓe¢„ˆ{4áΑ/¦`úcfá°ïLôuü—iñ_%Å%áÖ19Q&ìGÐ|àöÑbhM•޽cütOÑ€ó!Óô*ªšhïItP¹ø9²í"¶ÕgáT0‚Q(tÄõ åÁîF§,Êôø‡ŠŸØhÖpgÂ$0½÷pµJ>ꎑ¥Á]CÛ$b‚~©o…§Ò:ƒ@Ú.ŒÁÑ# }‚)º)NÀÐóÔb6o£Ö> àÊÊ1£G?Âà8£Ö* ·¤žðÐÄéÄ*ãÃk½¦3ü;j,xICä:kFUÄŠ4cFïàgtùtD]X¦NõC¼ÚÃw¦Zè܇Ó#kFÁ’¢êÅúˆ:Û °é?mcVGÁ Àµ ðSú5àóð_ „𽞡 &xºÿÚ ¤Ú]¼Ûl&RI4’i4Úm Ðm¦Ói¤Ãi«3m6ÛA÷›M„Êm´Ûm$›I4Ói¤ÒM6˜i¶M6ÛI4ÓI$“m&ÒI&›m¤“i$ÓI4’M†ÛM%›É¶ŠIô“m$“I¦“ ÛI6“l6Ûû$’M$ i4Øh¤Òi&ÒI4ÓM4“i´šI¶’e¤Óm$›i4’I4ÛM$ÓM´ÚI¶“m$ÓI&˜I¶Òí÷Ü·M4¬²Ð I i6Úý¥¤‰a!µöhìÚMKi$ÞÝ´“i¦ÒM¤šM6’ 2[,¤Ù ¶~’I4Úi´Ûl,€I“I´Ú¶àYö’i/Þi$šI6÷ý>Úi¤ÒͶÛIfÂm4ÓM&›mï›M&šM&ÒM¶’i6ÓE®Úm4ÓI&ÚI}ƒM6›M6ši¦‹m¦šM´™m¶ÛmÑië­´‰nÀšM´ÚOÿšé4’M,›m´Þh&Ói6Ói&’ݦšI6’I¶Òi¤›m´Sé¶Óm¤Ói¦—Ú&Úm¤’m$Òh¶ºi4›i4Øi´Cm€š@”ÒI†i4“m4Óý­öÛ4’Ùí‚mµóÝ&¾I½³m¶ÓM&›m´“M6ÛÒC$’Ø@i;e?˜%&ÒM4šDKS{ö™Z@†’e¶Ú`$YI4QH¶M´ÛI&ÓM$»E$ŸI¶ÛN&“M=òi¦“ý´šI´ÒI¤Óm6’O}¶é&“I6›¦ÓI´m¦ÚI²Ÿiµ’M6“É&ÙI$ŠŠE´ÒE°e6Úm´’I¦“k$ZM4ÒM&ûM>Óß%²É-“M¶’m6“M&šI6¶Ù6Òi&ÒIªsi$ZA¤’i´“ ö’y4Óm<Øi  m0h²M ÚËI6ÓI¦ÚI´—å&Öø€šß&›¿›i$’ÿîÚ€m$Óm&ÚMÒû$’M6ܵ¶  $”ö 6÷í¶Úl´ÚM6ÉI$×ø‚ÿ$›M4Ûm¶Ûm¶M´Úi4Êm6šm'Ûí¶úM¶Úm4Ûm¶“m¦ÛM>›m6ÚI¤›I&Ûa ÙI4Ó-¶ši4›I¶ÐI4‹m¶Òl:ÓIÿÚi óI¦“I¤’m´ÒA6›i6Ûh´Ûi$“I´Ók$“M¤›M´Óm¶ÓM¦›é¶ši6’M¶ÓI4 „›m0ÓM6šI¤’MÚl¤šiI ·ŸM& m6’m´ÓM´’m4[i€H-¢²È@I4¶i¤¶ÀJm¶“i“l©/Òiµúù4÷ÿ$“[dÕ@ÿ~Ò íÚrÒlšm6‚m¦Øh4“iÿ›M¦úi¦ÛM6›I¶šA´ÒI&“loþÍ›m¦ÛM¤Zi¦šI¤›VØ’ù´ÛM-“kÿûM'öi|~ ?·É¢ÞM5·i&ÚI¤Úl&’IŠm¶×í¤šO¶›I¤“m¤Ói¶SM4’m´Ïû~Ñm´’m4Òa4šM¤ÛHl7©ÿºI¦›Ý&·Û´Û{võ¢–ÿmÓ ö›[tÚm¶ÛICM² %5ÿåÒi¯›i&’M´;dÛbÀA'~AI¤”ÒI¦ÛM4i}ˆ)$ðCàÒm¦šmö²I¤ÛI§³N¬È©¦Úi«ÿy5ÿH‚Z`ÛM4›)Ú]¶ÛI¶›I$’I6Ûe¨žM¤Òi¦ÓM¤ËE(ÒI¶ÛM´“i6Ûi¶›m´ÍäºI4ŸI4ÚI¤’m&£i¾–m·š¤ÒI$’I´’i¶šm2YM%Ó ¤’I¶“M¦’i4 ¦“I¶Ûi6“l7‰6ÒI&ši6Òi¦’m¤Óm¦ÓI6Óm¦Ói&Òi¶’H´“i6Ú :Òm¦›m6ÛM&Ù '$–ÙBI¦$»M{äšdi¶úI$ 2Nh“i&“i4Úm&™¤’IK3m¶“m6“]¶šë$šI&ƒ`À‘dm´ÛI² o¬›i&ƒQ j$ÛI¦’i&ÛA¬×M´› ÏšM4–ý´šm$ši´Òm¶ÓM&šm¦šm4‹e&Òm$Ói¤ÛM6šI&Úh¤Z-‹a&“i´ÓI6Òí¦›l¥Z †ªi´ÚodÒL6SÉäÛI ÕO¤ši&Ûm¤›I4“m4›i$ÚI¦ÛI&ÛL¤Ri¶ÒI4Ói¤Ûm4ÓI6‚a Ùl¤[i&šI´Ûi>Óihœ—E$Ûû° °A ’–k6“DÏÃM®“I&Ûm$ÓI$šm @i$ÚM¦í­¤˜y4ÓÙmÛÛ4’m¶Òi¶ÚMM0e¾ÚM6ÚIô¶m´šM´Úo$šI¾Úm&ÒL&S ½ÒM¤š$ÓM´ÒM$ÛI´šm4š ÒI¤Úi¶Ûi¦’MtÛ]¼ÛI¤ÒI$ÚI6Òe6Ûm¶[¤›i¶ž~Úi´Úm­òI¤Ûí”›m´‹e°“û¤Ûm¶ÒM¿úI¦›i$ÓI$“i°Ñm¦“M¶›M6×ù¶—k4šÍ&Òi¤“m4“I4[I´ÚA-»I¦’iÚM¶Òi$šM´Úi¹³h4Ùÿ´Ó,IJM"ÛH¤Xí¤’I²‚_dÛoíÛ)¤üµ&˜ ¥¶oí·û¶’e6MM6ÒM4Ûm4 H°šH7÷ÿv›I4ßë|Óm¤šI¤šm6šM6Úi¤úm°”K&Ò)¦ƒE>’i´Ûl¶Ûí¦²]²Úk$Ri$Úiv’I¤×M6RÉD›m6Òm´™L$Û $ÃY&Òi4Òi¶¿É¦ÚI¶ši¦ÒM´“m´Ûm´› ÎûI0šH¤“Í4Úm´ÒM4’M&š-´ÚE¤›O<Úi|Òé$ÓA´ØI$Òm4’M6Âi0ÓLµÚi6’M¶’I¦›I6›ý¼ú4’‰&šm¤ÚM%ÚÛ6“í4Â_&“]´“l¶ÚËö“{fÚh¤›ù$“m6Óm$ÚI¤R)ÿ«M4“I¶ÒM6m´šM¶›m¶Òm&Ûm¤“i¶¾û]¢I,’m$šI´Òé$³I¼—Ø$÷m&’M´“i¼–i7ÓmtËi¾Òi$šm6“M¦Úe¢×Ê$m¶“m$ÚA$ÛM&Òi¤’M6“M´ÙI´Ók¼ú6’í¤Ú¤›m¼’o¶›É4ê[üÛi¶™!¶Úíæš}´ßL¤é$›m¤›m6Ûi´-lëm¦’M&Úi6ZM$ƒm°Sm$ÛI$›I¤›i5ÛÍö‚q<“I ›I6’m¤Ûm¤’nîm¤“MMêI&ØI¶mæÓm¦Òm¶ÚI´ÛM´’a2ÐH¤“M4“M6Òm$ÚI–ô¤’I&Òj4M¤›m¶›m4Óí¦Û 4“m¤“M´›M4¢E&Óm6ÙO$ÛM›A¦Ûm¤Òm$ÛM$ÚI´ÒI¦Z Êm¤ÓM´Ûm4Ûm4Ñi•;I¶ÓM¦«@“iµÓéôÐ ¼Óm$›i¤’i´ÒI$ÓN³SI´ÚMŸ²M¶™)´ZIæ“M¤ÒI´ÚM$ši6“E²ÙH4›m¶ÓI¤“m´Ûm„˜T¤’m&’X¤Úm¦’m"œh¶M6ÒM&»õ4Ñm¤Óm´ÚI¶Ói¶Òm´š FóE°ÓK&šI¢ÓI$“I´Úm$“i6ÓM¶ÛI¤˜i$ÛI+-°‹k´“M$‚i¤Úm5÷ †ŠM4›M¤ÒK·I„ÚI$Òi&’i¶Úi¦ÓI¢ÕK´R-ÿšI¶šM¤Úi$ÒI$Úm¤ÚM4ÚM¶Ûi¶Úi¶Ûœ Ó)–’m¤ÒI¦Ûi$Úo`@ÿ4Ói´Óm†»q$˜I´ÛI&ÚE6Ói¦“I4Û-ݲa¢Ú]¤ÓMZI6šm$“m¶ÓM&“m¦ÛM4šm¶“I&›M²Øi¬ÚM´Òm¦šm§[‰Ö®ÿv’i6Ói¤›‰–›y<“M¤þm&žÍ6ši4’M6Òm6šm´™M´“¶“m&ÈI¶Ñm¤’i&“M¤À$ÛI$ÂïšY¶šI4’IÿÄ0 @P`p1ÿÚ?Þ»K/zæ¶=K/É\ŸÌ®ÒËó_’¹?™YšiJR”¥/:^…)JR”¥)K¥ê¾e)J\B„!B„' R”¥!Bva1B…)]×ì¾7Ta>©w_¦¹Íï„!BŸ³JR”¥)JR”¼! ”>P„èB„ÕB„&)J=ë/BÃð—EüÛÞ»oL'—øÃÞ»š/¦E/‹J_„!<ªRð¥)JR—œaB„Å)JR”¼)KÐ{ãk/+Kï=‹ñµ—•¥÷ž¨LÝ´¥ñ)JB….!B„éÂ¥.ØBžD&)q ©é¥)N¥Ôô¬¿‰~=)|—•±÷ž•—ð KðÖYJ/eål}ºRè„Å/8Bw!5R”¥)N¸„Å/^¥/8Bs£le/–„Ú÷Ò—…)v¬¿e÷V_’ò¼eÒ~;ñ–_ueü’é>Ü!8"¸„ÕJRD&ê\B„ÕJR”¼)xÒ÷)KªÎ¥ãKÆ—m)z+/+/®÷¬¶Rü ËóV^V_‚ò²ò²úïzË)EðoÌyYyY~ÕÚúEã.ø'éÒ—zËÞÑ/eü2Øý6ÊQnY~ÂËøe±úo+§¥y‹É^äýfˆN’ËÒ¹?y+“ë¾K“ø¥—¥r~2òW'×|—'è?1|zËî¿Yeï¥/mt©Kí¬¾ëõ–^çŠ^Úè²”O°¼5—Ýzg9䬽l˜]µÑÌ­+“ó^Wˆø"~E)v¶²÷2KJäüÅ—•ä,¾ƒÊ꼯%wW'æ,¼¯òcè>’ËËþ‚þu'䬾K/ï^Z!Ô\Ÿ’²ù,¿˜Y~/‚ü•—Éeï¿ûË-‚Ëí,¿¤}§±w¿ÿÄ 0@P!`1pÿÚ?Ùå{ E%)ÂW ~})Æ!1JR—F„¸)JR—­JR”¥.—†ŠRù„!Bt)JR—³KÙ{/ bËô! bËô!RñR—yE)JR”£áE(üe¥/-)JR÷ix©x–_ZóRðRñÒñR”¥.”¥)JRñÒøë,¥å¥Ä!9YqqJR‹´ö[=–S**)KÕ[=—˜‡…øw»Oe³Ëe)JQ¼)z+g²óÆ/þÚ{-žºÂ]@ò¶~’ÅøvB ,„ôú/"„çY}W•ù9Ñ] ÀÑ-üDˆN…)zÓòË ¹Ö^V_˜¿™|ô¥ê¯Ë/pò²ú~“ÊáE(ÿ|„R´ð‡é<®*_Å¿*—FÊQ=)KÌó}'•ú+†Ê^ËÊÑ Û\/+ˆ_½y„ º_ÿÄ&!1AQaq‘¡±ÁÑáðñÿÚ?¡Žfƒ”}G˜JB­›&Ķ1UΦA y¢Ž%Æ4#Ë‚þ£j ®ÈÑaáOgPhY2Z_‰™ý»‡X¯rÌG….‚ÐK¸d5j® ‰Ô°®>¢>¦Q„X*ùƒ†½'›:#·›ª€H\Ó ² …ä­Ž‰hÔéØé`°VÌHeH&l;È{»„(æ ²¥‚yb± šZ"¥LÆ<÷5}ÇP¡à‚¡”!æ$ƒJåqJp va¹Ñ/èC)Õ é)Њª\Þä½¥*%Ø“Ÿ•î0­nPatÜy1—ìxæƒI·-x†k?"Xú-ܸ9àÖâJœ¥‡c®c³A«Ì#ºº™E“oÌPk»oœÁ›…WVP:îZ†°ñ ÖÔÇ8ˆ‰ÔÃQ¾a7 ÖR&Øsÿd£BaµJxŠÞ’-ñŒzŤ•¥µYñ€ƒ¼@êjé†4á —ïÙGRõŒ‹±N´=Kši(±ËuÖE Vš©‹cRø'Q²ó©²¢â°¼65З8’ÃÔÂr€­—;âk XÜ8ê)«j]Réo"94A‡–#ñšW™²å͸ _&ˆuÙY„öó\3ùMVìŽWp"¬”UšÀúBk°Dœ‘áTK*‚a° ‚dÄŠRCÛw¬…*Zó/„²tRÉÛΚÖ(ÛÌ£¹/Á’Š !hìBd¨t‚‚›ÕÚ€ñD­Ÿ)7„à8@'.ã ”\™EËרN”¨—Ï3BЇIG0»Fp­‚ß®%¼AìÔݢ℆%8Ɔ§ˆ`ó¨ ¹g€]²ÐÞ†ñJ¨q/Ì!ÓÄà2¡e…䔆´ó7{ó««‹9GksÄè9 8×RôEûŒMw,øœbùWñ±ž64r ¹†J Qá<ÃØ ¤!×™Q¥óêv•9Ô±é ]RÌ›wú`]²ú ·’e§a.9A¿š: Œ¥ Œ©šBùžÕ ¼ Lç 2QR´Xz¶dÈ•rµSQ”š‘£jGbäWQ8O^å‹mòÅfÜq(Bw‹ ÉÌFÊ¢ì2×le|°ºmY¥Ø8ƒBÎøŽ[9bŠŒXe¶u„©^ïˆ0À܈9Ê¡| Ì‹£Ì51¿­Ó€¬ŽÂ®–›/u³u_0T^0k ¸-гAIà¸4"ø8– ¥Ë…ªú”Kî!Ó#afBÖ€sRì/>¥4⥌—bà ޣEKó(7™ž^£R–Æ•,[0 .¼ìmYlÁ§²á{PÃYÇU爼;¨U¢ý1‰)ÝU«ˆº©*×Ù@þ¢§ÝÊÜmscTÞãteÁÛŠZâ$˜„:ؾVCâZlÁ›@Vç%ÐVqJ&Ü:DÙŽâS}ÅòÚ£™¨ÅW¯ˆÄBxâ5É´1~çs¨ŽÏ(¨X¾³Þ x”è¡(µ5ZDê3â]X:ÄVYߘB"/á„fô™TV°0å4­­óø\k$k‹gñ±ß÷ÈkQ„\¸²šGµLì§¹vÈ–Xª™¢•C(>É…&¹&þ‰cm" b¶^×=C-^"ç„[è¾`ÐU4»ˆ·Ã•h¡¯Ó]'bĤo´²/®Ïê$ì€l.6=2¢´=No ÇŒ%­¶!eˆqâØ^?ð–NPߌ^}×f¿ÌBh<²¶9œ@ð ™‚»Vú…²×’ñxx3nlz)ãðò°¤/DpäeAëéG.’Å2¿æ[ÈìÉ‚kÃjë\?µ@yÒMÊüìuÁâO NLü[ЪŒ‚àÔkL!›€±D LƒP5P¦æ «ž5ÄU4ö•/i— {‰EcËeØ©¦u,=©eMWpÒˆÐ=Ób¯&-‚l²T¼ÕrÌ1"ÉpèµÆû™':•p°ü]eãh%åÌK™M`…³’‡ÃÄYëj ½pÿ1ß½rµy‰Ùc¯ÈF9—ž§$ \ÂiG)2”¨ŠE«†P<1ïñƒË5tB "ÞaÁ/©jPe Qß'2‹áÙ{–)ÔQüǬõ’ÏÓ.J­+Í&¿§0œ19K£û‰x>#¬@#«Ä=s¥àÄö¤bwn@w‹–; ê›>S“Ò9•‰¼Ê/d@ê^XŽ´¿dV·s;9—F¡*p<îh%›dTp†€F-ÆÃSŠ,ªÃ–:FL·/þ ­0[aéò€«t†Þª CÓgP€ÂŽJä/a þ»‰é(ÁÈw*‚[œˆÀ¸x¨*£k»üÁÊs3åÂiˆ½\ßeO˜@8ˆÐó5%¢GݳݟÜ!á©ðE\x»v Ô¥\ÁåBó:%ÓO¨ œce^õ)V¸2¡ðçPX%ãh™ dM=ÊNm¤êUÔTñSb /\£^(µ1ÚK°ýLaúÅJp)~j j(;JU±gýØV ª¿¨¼Ê]ÉWÇÔ p¢¸cÏoˆ8üAz]Ž×¨¼Êö©H!a*¼Í@"¶[¬"J>RËùÈ›T¯ˆŽWuèì|cÛ3-·ÅÇÄp-øx…s#O1<×¢—-횣ßã]|ƇtáLâ,áŠáž¡;ªM|Ì!a.1#½Â—=j²/hQ»ä ›NÓâ£ï¡lÞeJðØ TÞÙ²ºãÔxËldL(ר„\…l<­T±³L0[{ #ÂãbcO,ÚPüB`Ê8œgîX#<Ëd¡N;"á!0T‡0o9 ÚgCÃÆ:ÁR¿îU›Ò²ºRº•Ad}&oÍA:ºW^HĦŽe®±/\` ã@Ž-{qŠ¥J>‡p"4XóMBKâî;:M,¼•7——šŸ€ê º/u²µ*"!cüÇ(=çúžL Ôl¶‹:ê¸Ý—æ(þå©¢…¨ÉÓžvìóPç%ÂJŸÉ„Y±ˆ=1¤Û´ä×á6¢å°Vü0MDUyx”P,UæXÈÔë\žù§Ì9#ð™àXŸƒýE¶ ƒ’Sðø"´¦ä¦úŒ>eüDäçóz%ò0ÓÅÊ€u`QñCóÞ´äÇ(KÏ”¯JC1ñ>Mê!¦Ô«ä*kT}TO+÷× èApßúDP Ò=æèŒÏõ(ͯ¯— gj6¹—(„(â'zõ E7k¡¯“@Ñ<"ñÇ0oÒªøêŒï*i³¬š;þ â)oûœdÔ‡K7Î(Ôuá*²zę̈‹a |;±|FÚ`wš¶UXÝK5P;µÔQz¸f‚îXñaÊv!!ˆ¹p†µ]Áw©¨‡è€î!kˆMN® p±™Û„4ÕK—p!(9&[Ì¡ jÞ\Ê`®R*F2Ú¬œÊÓÔ À½¤P`Aqçu(´K¥ÐF.Yc•ÝF¨ó ÀU Ë`±…A\D4쩊ǩüEêí¼ëþa½$MŒ ¬~Hšá:‡V‰mˆ¯à‡ ¼öµÌtnëeLÆ0€·êiZçúL@V]"ZUÝÔǪK˜âðîA²¡Yõ+NŸr’À"’áŒ{à}š•óuzÈIay ºr”}#ÃH—Š`~ ÜÓIfuTJ+V›á[˜,jmYŸ5À5¨ž"Ÿéž„mU{aV7щm™‚åkå¢`jLÞ°âòŽ]ŠýŸ„|Ô] 'Û™æT!è²~¶"_˜¾wá!®êêëH§é~¦/+ÜÌiªJyÍt‰f6þfô²Ý-dB¥ä€F>ÎSÂÜ¡\Å0øOIq(fB‹º»˜™„ÃâÀ´Ÿ†×Y®\I´”¶t} J³ž¬–º†r„|â¸êµ3 ©%mmdûƒ˜ñÀ7–££…¯ºñÒïí˜ዺ•¨…É.­žçXßAƒyôˆVAù#×k|a¸)jê4‚:ɹ/_lŒ‘Ï·ntv(<¥µmí2@/Òv»“,N„ÂËC³tEŽ–ŸP¸U¬éñ:MÔ:½Z¿p«á³­œAw8C©ÍUoËQü:Â.â”{~à˜Qæ³—jWwp2Ÿ2ÅÌkæ&ˆ%‹5äi8Šñ\Ó7v>9l1<ß3§µóhÕ«ø€/ÖÝ«Œ ‚]6ÈÒÍÌ(4J¬MØ:2{¦…1ðá-ÒÒm?¸í/ÌÇiTáe”Õþ!i‹k=¸¤$)<µP@ÒòKDÙÞ` cJõ¶‚¯¹HhµÃÔ¦*ùزJ³ž#\°F#t›”×a1©«°þåz0 íl^ÎóâázÎqk¨¸8bîX(„õˆ°îz']Ã1ºÇ¢Ãp×ÍB:!êY)wcq— 5©uäUÏPì3-9:¶æ[áL®…º&G˺s5+ŠË÷¢p¸9k9‚ìŽG59>.4Ý<@° ¨Ü6OVY5D2‚˜–ÖKWŸZtL„ñá¥éz–7"tšÌ)|@ÕÀ Ì¡v J7×pÀz>ÁŠê7fæ‚ÀýS9°.]ר…zaV%…ŒQåÁ¨Â_1liB˜éËr‹èB«åžSŒ§%À™¯ÌTir!Ú?ÈNÅÅËBbÓ‰ã‰SBò–ÕO¡±¯-’†‚+E¢ÅeÎ?S¢åîʦlk†¶&¹W(qbGD¿·0" º¿rïÒÆâp4±ê¨¥Ïš¨ñPuàCêˆ[}óœš9/ú†ûøüƒ”¬:¨"-'˜Â«Å¨o…AâS6€Rç‚r%z¡Ì:ᬌZ’€ÈÒwa ¡ ׊"!xøý@ó4ë›ÙoˆÝN)þ¯ ¥&´¹~Éô•%y¦n=,Óü¤v|*¨ò-ti;}¡ŒD­ÝÙ@G‘Ãàßd.é’‹B Çê )/¨„²Ù\Q M»CŒkÓÌάå0hމìVêUƼÃÌv>#…p&Éiy˜ó¶¸Uÿ˜íjx™vüËäùQ–ê¨ú±äËíò5[')·tÓíˆ.IFÝAåƒõ@<[¸·nÁË&3aVl¬Üþ¢b‚ŽÈ¡ÇÉmgº$‹qSE²yŒs5̉š*Ÿ1«'b4-¹¶¥Úú E¸ðøK 7Ääý)ô–¡]U\6®V ¸dERÔßµt"â€ÈnïL«»TóÁî ¢˜%w1¨­JüÖîöË…6K[!²ëîQ {R´mX^°*8XÚ—Ü[£%zÍ^›€gAÁ 8ÔFî] ¤ÄhŒnW‚›‚â)m¸Ñã`¶ç¨X¼£IÄLŸÄN £Z²×awp÷8÷ ÿÂTźFLCQæ|A±H÷Q–Â4UGNn„â]нbmn$£ °å̈AœÄÀ\ IˆÈ;… ÷À?°o™¿*ùXÈkÜGK ÷ho»¨Ô1%{Ù9Na¶ÅØ WæTZ±ê:å¾X R•7:ž²úƒ‰Ùj”x„„k×.¢šËgâ%c^U…a ´úˆ¡Ìb0òJ\TljaçtäK7Å\Zë)¼Ë?˜‚‘.Ëe@ÖAx¶"ݯ$\lõ¼D8?P]…u9'í*·O,2‚½G)i#@<–× ’©Å/Ä\L«:˜4b(e`„x§ÏQ¶ . 6W¼K]. B¼ó«æž`ó5À·PòQæåàƒ–µ'pMçTJ¶ÖaÕËZ§ø™xÀ4åìAWŽ#°ìá1–;¡wZÁdÒåz·µlG~ x˜-·•vÈ-…›Ä¯ o tn_;ì8øˆó³8 •ÄtVÞWó‚þÎa¦–I*êÁàèbý‚.BJ„ñ Îê8Ò a–_¨wä¸Ä“ÍBEËÎ"—²½«a°Z*àk±éŒm@M]Àͽû˜ é.]¼E($\ú¸|L°eq ³ÔÊ ÷<ÍOBª±`y„uöq1`òu¸¨÷*v®e"„Ü YˆB¦­é•æçœ>a1¶KsQƒÏ¸ûÜVjûn+Ú¾"Ååžñ äøØVš¡uSBy)PE6:Ê#ë}k …Ù 7+–‘Püg™Q&Žâ[Šê [†é’Ê1Ûò¯D[Ô HÏ" >.6Ù‚Œ7€·]ÅK¨—3 WXލÛßu/‚•ê.4žSw 1ööJ휅TtÀj™ñ,LL’ê_‰ùeNåËTžfPïÌ š-W¨[ÌøeÌu±År°ÝˆhÛò-ÇvïH¿SA]¿XpfJZA3Œ'¿rÓ8Ii°öB¶”z‡4Ðó/U²¢wêmB”®`J7™P*€ðÕØ'c}7 Ì…ÞëæQ ªîâÌðÄHÂZ'dñ°\s4Ä“ ›e±st|šˆ¶ŸùADø†rš\ßr ù@\‡'ÓM”ìEHÊ\L a2Y-úD8Kü‚µ<*Ä&ªBwµ”mØr \?Ø!˜FQ 0Áá*·j ¢ÃìÅÕÁB -|F ê6¿œMÕ§ UH)¤Ä°ŠE zЧ’qá± ÷ãÛ÷+ãZ~å_pRÇŽå`ùž¯Ì™qZ¹…R¦q£èáÞ tµ¥x/0EäTi&_ÙÐÍ⚉«©x,ÓÒ,y“ª<œ¶ÏLâ Y`Éå0Ô Å@ѹV  Úº™1”7lG±TbÀÒœKâztŒ3e]‚¢ˆåK/‰x"¨ßqô±â #¨¸+¸ÈdàN”éç˜|þÈ¿´U¹Nì¢ÛÅ‚ä³Ù©ÂÙe˜!«”µp’qH,ø@‡  ˆ`ØiSrÜ «€c¡â>ð8¸ ;æ9Š«êcì…Ø€Ž¼¡T,HÙv–Y™£¨naÎF§“N¡U:%…q--»Fg]9—ˆ¥p–z_¨Lïÿ„F”â!Iµ'5ÔÀÇt»üE  ‰rñ’þÑ¥€¶ X,2yµóµˆ`q– H°tËŬŠA@Å:Üé:Jê ” %Ú6j 7vN3ÇàÄV¥Ô.)6Ém»/^!hw»rT³7LÂ,­U •å¿à¡‡üM‹·¸ÄIsÁµ0¥Ì2Â&ëˆÞ¿ð"–Vcöøçöe #æmC’âQZ¢__,m8ÕX·¸Fª«E]ð ñ©I‰¥+q驜—­x•Ågr‚ÜÚ–@è´­VÆ– ½N2Ûÿ6sPKš%Ž.†1ÈKþ¥À%bÀµ?ùeD8Qr¦BŒ„¬¸t…Õ¸>ȃ²ÜXEæê3ñ a¬yo‰n}åþ(•î˜ Ak§P†˜¹Êô‰«A¹‘Õ dDŠÆ()ƒèEôWr˜¢ÇÔW¨tEÛé¹ÈñEc¶‘·‰N§šÌFªt´}¦)¦>b Lmx•eD¡Í…›Àíâ>ES?1Á,¦éqœù­ˆs!¬{C©+©g%ÍÖ¢ ±¨¡ Š4óU˜ –f–Œn‚¤ Q u·,¯¾¦"ǘ»-­ÿÃÞ‘0<ÆW •)äð—Û^àÀÄ%Á,q®¥Ä£é˜®’°†îÑJæ Ô§2¸ðZ’\& £K) »bŒr+o‰Y<’âuJBö\©R-ê*”Tsr¶ÓÜÛNº·W®µú†²a òÜ Ê Rç1•€ ÏlG ËœÇð—%ø† ñþcNk ÃBâå[dp™J:Kžw;(Û?¹u¶.˜ê@?4Ôf¼ã±;•0^£‹Ž’‘ ÈÛÙEþ`sü©¸uÔ˜SÄEà ÒÑÔ QJP[§†£ÊdÁ4Cí%Ù#=K¨ñ¸a+‰é»àŸÝq-Pžò¤KßežàÂ7 v…ƒ¤l`u‚aKV1GØ¡J%–Qr,™w Ñî+ãe !íGtâ.' M#(¸šC©Â'ˆ) Éèq.)Ô )8%ÍRØ"+ê{B\É‚¯Äðv[u¤7ªŠ&8m;ñP¨—£:Š+z€B-eº¸J¯) P²úæ6àŸ1ˆh!Io>¢Q¯‰®åÂÃ3… x9œŠO™©wñ2†¬HeÙ§!Zï[»Ÿ-õâV=&P^Þ:–… W˜’ã[¸ó:ŸÄAg®âÒsZê*NÄhhö7ýFåçáa ´áZdŸ0À7ß‚M‘½ù„¨Z©nDÃQ]¼1ƒwÙÄR1éÂ0+]¬¸ðKî.lœ¹xÂSè{âK€VB8EF¿1K‹õ½È†Òäâd⋯YIæ"X¾ z•&‘Ü¥[íQ@ªµñ"¬hTõ,:(”–µzÈ›>â:ê¥@/ O6=@é^bëâ5U)çÔ*”uJdð% ¾£PŠæXåP¬ª \`§•8‚Jš«óUF‘¦ç¹Q 2¥1äôrAt= p 3#¢‡r ‰Íñ–Šk¢ª]» Ôʃ$9«‚\Øfë\õÚÞÏÄ9+‚]«†¾lCL®!TAÇHÊz—èÒŽSÕD¨µÓj7æ¨*¯%ŸUÄÔ‰ÛUÙ&„Ы"àEðq¶ ?ý—”ϘTÝiwÔOKk¨ÒWFG©ÏPZË€mÉ%»X½8®#6åâP(9®bƒ¨/.@Ü ‘–•hxŒëÓc„œòñ*ÿ’iQ8áP qq> 2ä1ëñ1G¨ÕUlOšO‚òár°ˆL¤§ƒ(’él ÂÄÖ8P2Ô&×IJ‘nLj M.—#hÚ0¨†R'n1ÅÙ„Oè—$è\çQRxuE+º…á„ò‡ åTÅi£ ‡‡†h³W tkaˆ+Ì:ÊÆª…í†"ë·ÄdJ½e PíDõ]^ÁG a—Óº= ;*ÆüÌ¡â¯3Ç)ºˆmN™¾öŒ å¹PÛ±)ÓŠî*æ„ÂÛ¨i8¹ännè@N9g@=K/µ·Íö`‰æ˜–›õ4ÀWb òÛ›Ö«¢[î—&déÌ@½ã«¬W]®]~äJ»pYmT¡„êŽÆ|¬ ­q*ºÔDÔoaµ#_0a'E †@Ü…ÏÐþ§wÈ¿¨ —å\m˜áý Ø–!mÖT÷iK'êÿ‚•iMAeÝGhµ³®˜ÏF¶ M0^°ŒA—Xö„X'l’² …÷ßjŠží²pI”[bÛÀ<Äée–­ —î!Jr‘ŹT1–Ê>}@­„[õ Ú»‰ÝF#pÌ»`Ö_õ¬B§ÜªØ?„fQ²Æ Ä ƒú†êÛù4¬ÈìäÂ1è·à™}¥žx–͵õ€.!O˜-Z Ñë ‚4¦¿[·®?P8:[þP©-rs=Çôç¾=5J¡:R¤ÔƒÔ/è(‰°K ®ÿrT„À4k«"]ÁSm¢ç0õ‹Èˆ§Ž³ã&ì4䋲ú4Š…IAåxŠaµÇ2…*O®˜FW@UöÏ;-ø#êÈQ~ÈÉ)†L„~®^{«þƒã³O©¨•,ÿ~¶ 9âàÎBÆ\†áçeBÄ;¬ ÿät´Gø‘?ݦ¸ÊÜPVãÛâYÌ4^ ÅÜÞCÜUµuâ—87|C\€]/ÌrÎè›>«ÕO˜ÅCÐ#÷ ȪÜj(®÷u¹wQzyºZn )h­`sT‡3d8{cFÄ$GOSŒ¸¸’Äõ-®/gB4PµÄ £@G=\;Ø#~‡gd81œë7·¨ô`óƒODQœ¿Ú<ƒòG»€ñqFл9~ýN`åÂù•Ô¡èaÌÌ㈹Ü@6ú‰­#+¸bÕtránøÁñ)µ@6¦¸ú Ï(|Jüä Ûù•*•pÁ®BÙC¨ô$»8ˆ®­;é•´ÊóÔdʪöLêwr®/¾!cUkHŽ…@ žÛ¨Þ‹Mo0"´[²-AœYݧ¯2É[wšêkU½<Âצ×j>Ik0k>å0·ˆÏ¾·°üC.2ƒ½‚3 Óô¼üÿ¶TêÂåE‚Áy‡ñ9ÿšs¤B¼—G;,ËóH’¿®‘ÃϸʣW]ÃŨù/7ù!Ry%#WPãñih¿‡1—áË~ᡦSâ–˜?ñ ÍÅ®¿ \÷ •0·ÂF¡¹N¯™vßiQý AÕæ!ñ]¨#åêáÏþæÐ¼—UºMZŽ·8WCÔ¢Fì&jí߈šÊ”÷°4"™ÆU%#— ª¦ãâ:cz,UÚçqÍBÜ?“™á÷ §o÷ €[…±ÌØm]Iš­Q½¨Nx×PŽ×S fPÓŠ"ªþ³u3È6$ñˆ¤x‚Æòña}ËEñj7žcR¡ ‹Á¶]„µ~2 Ä o¸ß ÎÔ4e¨m²Œï(ñ±÷/˜Ç郭lkâbä¥þ®V©ú³.ô‰5+gÜ8Årô‚Ã-"§ƒb|S£Äl PnÇpzFÚÿb:ÅwElåïm³shP !°OˆþA«-0ÃòÔDW†¶!  2CdñæŠâ{ÂZ@9g˜l&í×_ÔaXÈ5a2 E Yêxy…‹;_-r „t÷yÄ÷,*Óü˘ùpÊ…c²)BCßê'oÕÅøWøƒ'’$¢'ÃW’´®é̼çBVþf¨.95ÀØGܱƘå!gËeM&"îD ¼¶t#^æ #èN]ÙCZ?ZÆ7)Á¦<ä„«÷D=#½Äd.³Ô¥Ñ>¡ˢ‘„rœRmt!äѰ¶ÿ¨(Ö¥´¿ˆ5,Ñà†“e–U–)5ê+©C× êB©£¹°ŠAÙZÀµ¼…Lq[X¿Dò]ùŸáœ-®‡0ÿí1Èè!’ÙC—Q*+âV VÜ©á¨úmæR¬ñ0EùE‡@hY¾KL»ë…œ™ùŠ;A¿Ìýÿòjþá_æ# ûC(ùâ xÊVòÙLCS⠵݄C°¯÷9T¯2³XæJÑè•ÔËr|ÀZ¡‚[vž’¦tø«ºïÔMºqCqSæ:®œMšá¦ѨN‹šjã¥/½¸aìWÿì³sª>f*KWÓ7"‚}¬ª’_†8vòˆÉàꨥ‰<Œ½?ý‰Mл² 4Þ× k~HmGn¸þe+)ÁÅå Žêÿ†JǺ~b ×”f¾ïWÙì4|2š¸eìŠ_©Œ _‰®÷-xÖÌ Ò:í± rÂP„˜ž’ÿ`øtO ZAQ«°€9Àå•𺼹…ÐÜ~P¿ù!屨›h5€.ÆâüCºqü*^M´=E±AÞüÆ,eϘ’¿©ç‰r¬‹Ïáó©DA©Ø1y[Ñ꘠K=lSóBbdi_rp Aòˆ~ÝXà µ¨ÅcK“wâ8žù!ŒD~÷0’~Qu¾Ò˜ø×‚¹Ô1àðZÖ¾]Eȱ¼•Bì Ž¨Þâ¬Bög*ޝØÝ’ä(T2² ­D º˜Özˆr›opA@n®ãÑÃ}¨¢¾"œ®¸‡¬:~k´h:­ˆ¢´[íŸ:‚Ym/´¥¯Ÿ‰—r‹âžŽîl:ÆKlL3å„…€£ˆAJ2AB€t`Ú¦Üê&È'@Å0­yPÒž™b€p6ô¸ Yj…zü ·¤Eœ ™PÉP«ÄQ3(¯ˆÜÒ…Gn­âêÉB©Î‡J%ª·Qê—U-H®ÃHµ ø[lÏ’ªŒuY e_›D€) â þ\˜ftÿKRæ¾ ni¡™÷Î6ãV÷ëdØàÈv6ÎµËæ |mB¡÷(2­mtF¾Óùµšzá|†@n†ÔU÷!jà( ä[@÷ é„ÙràlkØÏ!Ë<º€€?Q”Cz6ˆ¿S£à”èN Yâ¸â¹² #µ1¹Òu¨¿Ì+(X\8H«í¨'He;‰ÌXâÆNþ‡z‡ØŠÌ¼ðçˆÍ@M¨cbŠ/âÀØx„Ì¡T{Ø@,Ÿp¥Z—_˜h ·ßS’¾eYƒÃ°²W5DW€‚¥ÃŸ!÷/[¨¾ ^¼ÅËP Qå!¶9–`}GÉj´p¾a 7û€<žJ²º˜RÙ[‰e ¹¾¡x+ä[G CkméØq¬É­LÆ!xbÓüG¡kæ ]4%(ZÎ"*K—Q bl9´ÌS(l(îXAKå€DZ!ÞU,ŽÖò\.û‰ÍX¿¸àÚõd *ûœƒÀ6Üø…Œ¢û¯6 ÂGWvi…9Õ\-F.Îyó ç3x–³–£rXœ,©dˆBù·Á¨ûx™BR s7øF4h[ãeÀ­Õõþ ©Ë…wd}©¾¡UWi¼@p]ÞLm`E—¨X`‚ëv”,-®² =ñ¤²3i ¨B( :ûˆsܽzZ¿áŽÚ+…æ%dQzeû‡zjªØƒ%ù‚ HއkWÄ`ÝŠj]ò¢ƒÖJw ³–åN R…ØXlŒ8z`ÓÙ„¾ÓÊ–¸ zæ à¿,Õ¦ˆ­aE«¨©pÔ]öéoû…‚Î~â hÑ{BÆ„.#4#îp¢`;qÝ2‡˜•¡<Ëêì¸Ö³$‰—†‘j¥|ËËqÃ-leÚì¿PÝ—¡.ë[k†*•<ËŠyK‹§9üGQÚoîXai­¹‰…³HV ¨æ¨.¥·Ÿ˜<ŽÑÉp¼D"¼‹È¸qÜF§MÔ©ÿPÔ[ŸDoÜ ;¸è 'WœlN  î%1L¤§„†åÄà- 6«ý˯\Aë|„Ò÷6-S·2†„ª– nËj"Á4þ!øpÃs-£8ŽAýAÑÅŽ£šKÁxÐæé «1Ë™âÆÍÔ`ñÁ1å¢[rìoöSc¹”:K*XÄo\,Cœƒg‰xT!¿¤‰ˆt9󸶺qîþâ#d’X`ô™°E¬<;Äd$1⢄ØÐÈ[IðqÍ0H±DJ Çoõ9ëžF~£2¨¨ìصä¡lj £{¾|@”“×Q²ƒ8¢¥:9ýqþ"d´˘´s/2ù¨UÌcëŒðŽ ª…†©{}dO%–dˆŠÆl Á¨A*Æÿ¨Œ¼&¿æ)qS²ÄDW¬Ø8T®o²QÌ ç"ª*ˆzW”׬B%Ëp+‘È»2™LSô=¾n´›Ò*¬}0nvÊãÄñeþp ¼Çøð‚÷`“¡ayÔÅQ²pÈÑ.dKV·ñ5´jŽ0qõ¹_Ä|Q³B‡Üzl”˜-æDCAÊ(((…°½†Š¨žjس£ÆÇ§ø‡lÓw ¥ØžCb¾ú° Ñ1köšh®üŒŒ…¨" ì§î_0Û¹‚ÓÌcÌeE†Øìá"©¦q+‡Rôߘ&’ vU¤òÝ?¸E¼^ÈÁñA†õ ÿpoÈ„þe0¦Ûø^˜xE-_¿0ï#TøSF=ž”1QÄvjd[V–ÿÕуΘ ‚ –í'¥O{íAa=Xy—Ÿ¨E*ø%ؾFó2ˆíÍÔ´=C-lT¹cX‚‘ùÙÆ0•î0–AšU\m¾!Æ/VŸrÍ¢Rcá)—þfrùI—–Z.6Tq(²õM•¶„YÕijõ,'!UoÜ[4½8€¨ò7ø–+ÛUßY*•ºxkˆ+ÙzTX)â Äm–® +…LèÆP±†ÉQŠêg0z~ ˆþ¡+yy"5`,|ó•Y£{ׄÕ5ža©2!¡Ù9QSqw+°¿PÕÞ²æv ò/9NÝÊÒ‡-»Î’º¥zŽŠó  8â]V â ‚UN¡eHxâÔ mjc•Ä2¡ƒöJ¯' 6ƒåâUr0î w ­JÄ)µc5ˆ•ßE)°¤r8xƒ¨Š^ÆØ÷²,|GÂSªû`h» ³4¶¥ûßüU÷æPC|tÂ]‚fª4Hô¨AÁ~¼ž&8S•=F¬N–J´•Éd­$ZV½Ø©Ú‡ÈIn+õ¨S¡N’ v*5+™H°¶S€†=F1ã/ñ¤™váÊñ[eœB…¯Ö@ï"-à®e‡˜º¨›p' ¨Z­;T|TØ*%Œ‚wêR¬T»êð=B5äŽõ_$,¡ìJƒU«‚TÉ>ü@þE*Aì„8¹?'(ž§¨ªÐ¥B MH`€y‚ðNFŃ÷¥¹Þú—'ð}M‹5æ^š3)¢±ÜS"8jv+ ¯ýG„‚5FUx2ÜþãHD¸QIw|TÇHµ¥ËA~Z˜Àb¢ø²<•esí,iX(1 ¢Ê P$æ4KÂQrs´¹…’kZƒe± èÛX 7ö–ú"pD”ÙFåNS¢IZÜaVn•q¬.‰Ö‚Hn˜éÍ ±i)mð™²ò¢¬¤E€òK#â8©çÌ3y9ã<)vÀÏØD]sA1ÊNT*¾Mƒ¡®e<­x‹aÃ0.ïZy€”ÒßÌL8¸²åª±„å²…œÇéÝNlzD«8QqÑÀ…P!2Œ:RàiRËÅæ]W0nCw-02˼J^%6®Á*üFJ1+d9°•ªâk‚Äõ'Ìè ÷ÀêÄ(Ÿ'r¸ªöÀQ»/Pd°éQE\Ô1@ƒ§Y©“Ia\A¡(Ä1ú‡Q°Íwê;¼fC먣F9»[ K¯ÌxDik…¦põk0N rŸ"0»âŒ®¢d/®»ˆ:UNq6УâP9 cH7^àÅgh(ѶKè_¸vÌGq-ap€Ñì›ÀJPä•zD-î:¡¼F^DjQ]¢sH!ÌUŠÉ€ †˜ÆV-÷+WL±åq‡ Þ‹¢PU’øó Hù©» û€† „ Ô—JøŒ¨Eê¡^‘gÒ„uî[GÛˆ+eÊìŠ,Z{— òˆ`¹ˆëˆˆ&D¨ÂÂßPÁT8»ˆ¤V‹:¸¥é^ €0õ±¯äCFå´DQ1à¬é9À2le·—˜åTç: z/ e&à éPÜ § ·,m.A”—Œ·=BÓÈ€Û> ´ (†)TɳkÁ5” Âþ§g£^ø–l@¯/e$)'t;”D–¨Wþ a-˜/“ÌF톱‚*b+èÅ\ˆwð"äÚAä„<<C” ⽊`uwÇ©±(ýÂXX{–‘òz„6|–R‚ àw.Ǩ`¼Š¨ x€ƒÁWÖ¼%€brÎ=£ °a±æ%ìq-y B°¹gÉßeÍW`8 û‰hW›Âk@Å`w1˜ºW:Q³að yšPòð¬ôœµcñ¦†RˆÅ²À¬"E¸®eŒêV‡‰v^v8sC.+ʯò‚ÑüBÁ°/@ôæx…Ê‚E碑\0ùp"7˜£@…Ì>`ÄΡ €èšZÿƒœ0ÔVK,zȼÀrŒÙÅõ°a$¢ó1ÝSÄÃN£Øy– òƒºq”0áÌp–Ô]8ÄbâÒ²–Ø¡9À‹Y¡|pË`j‚à– âR[ט·°†ÂG¦#avnØ—Ã6ãƒ_Ý››KÂ2å&¬ÜY–]EnHôN,YY+de \BĆ¡xG^Hi”÷$TÎ¥`F#ÊsOê[$¬Þ‚ì|Áë\q Ã6U¸Q•lGK±•ëÿ8,\%ÄÁà>ˆ\Z<š}T¶Ö»8~à†é¯×S”Cao0Pc¶:vâ"¬Ö¯ÄæÅŠó¼é(ò" ŽÐæPÐ<²ìÞeM“¼L>48–"¿q¨íæu\Ê„üÃ1ªõSÜ v‡‰pœË¶Ð¹Ê¸Z'Þh¸§àŠéµ8ÝBŒªñ­9eeÁ·EâETy€–Ù%¬-‹€šÆ<ªžÈ‡jš©,„˜K`¿ß´Ä›Yub…6[õnÕ“.h Œµû Bê/rÀBk'wa4|Ëm.¥Šì&ðëcêªî3¦"ËEÁZ _¡(Ä™@£áŽEx=Õy) _Q4 ¯Â+¡µ *±jáyl2ÿ™Á&¸3Ä®l|O–V¦»bW‰aäP/¡ö#QB­PÈ=‚Gº §H;‰¥¦SkãPòsºŠµÊ4Ã%à[URá)⣠¢x…aMÎwu×nKx`uÀæ|ÄÌ1D^¤)*©¡íaõs%`%*6‡•5(l?áâ¸'>cYñÛâTÔ<ÃÜT°vð^Î%EähÈÞ#L%ÜÖ»›@—0²ÌN},•ç9JÔu©Ä@|Kþ¶à¨âq!’TD¨ˆ!QTC¨‹Nö°Š¡Á(G,YI…±ç‰K†¿" àö²¿0shèǧ‰·Â"³Leì9D(¶"Á2\ˆâ†£7Ö]é^;ˆäTô\\žÑð"9ÁÄôà2ÀˆQªw(‘nR–X,ÑùÆ^Œã9€{e@€º°FÎS³ŒGãf>‚¾IJjêÍ…hØ·Cܪ:e‘Ãæ`'$n”/„M4‚s`³fÅ£VH‹”2Y9€fégQ3j(÷*ª’Üjæ`6Â;Õ»ˆ·Íù#b§.Ç_3…R;‰·â­„&ú@®¢: ÷(BÚlmRÄänVœÍˆj?qÀíÆǸ¡Mª4^kZ%óÜKWiÑè¹âZµ\ÊÂ×Q¯,%×ñž9^üD6>£rñ©/ñ*G|„õ/€hLWiø#« ·…²ÎÉÀ3¼ÂZF{®¼þ ~üÎàkñ`Õñ5zW)Q`a®ÏÒ4ÔCLvIú!Ãñ ™–Tà"eÉ)»Ú‰wÍEúÈ?Ê pE¥Àb؆íˆjóî&}5yŠKxO2¤Â·e±‡4Ÿærß63QqU>ù—ÆU}:1oÊYp±“ÏüüÁE¦\½toS^×cañSƒæ |õ»]<6#?U;ø—^îé¤ù‹»>Žaµ?¿L,`_åZ ÄW"[w-¯1*iª÷¨ªZ½MZ¦æ\âù+D8GxÄQ«ì–z—œ\±m¨iH—¿ü!â¼3é—zzÈôiDöæ#°¿ûOoÐñ2£¬ò×réð!Î=ÆØAýEµJ˜P6ºù”Ü ŸÄ°4Zß$t0¥;ª ¯ÄØÃYžÚpP¾”ejþ e!á÷8ü[öcBcÏ÷,d}Ûiâç)±÷É,WyÝ,ÕÂŒ(²qÕéƒÎL".¾ß2â„Jß9?qè#Yâ_ !õ¿3E² þb` .üK‚ö¦^pü%JQë™rrõ*A×½ˆ’¦^É º¿¿pÕž æýËÒ¾ ¾dˆžŽÓI­J'än"ƒ%[6¡bƒ±˜øÃc Ð’Ï(ƒÔx!§±ë­ØþØ&™«ÓÇÜäùyæ; Îö%QXºÑØžœêlñ‘(¿™v1D«:"³I‘"ÔAccÍEQuÈÅÌ¥æàm“&-(ªëç:Û–ª o1…Ÿ²RÀ«¨ÏRÚõWó› YA÷„¸¶’îRÙ]PQko˜í(Ñ´5Ç>¥»¿OtCΞoñ¡äV¸;q' %+þb{Ç4Ô+©ÒåÛÏ6ñ3ìÓÊP™ì-2 +hù„——ua…±Ë"¢öã'âX_»õ3¬-X8s$ã•ÀÈ¥W›—GzH_|ŽåþA"È}À0ÚýÆ&Ц³– ]·QdFž†‹mOc¨³‘û•5©Jæ³_É*WüGÖp‹0-,ö.4·žª\öÛQjºê¥Á[uÛýN]À:¿PÍ¢þ n*‡ùŒ’À¨B¥=³/ZAAM…ÞKHhus«ìì-%7L¨ß5ZëYoíJS œ'žÞ,Œ©?r¼Íbµ±áaár¹ ”á@]_Üa «“-ñÕ`ªç¹Lk¡ ”(5»?! 6yf[Ê‘„«½çâFõ,¾üB+µÅãó8ˆs—Ò¦š’´Ìž¶‰œ!aZ4™-BX|hJ; vpÿpëëB ˜›âE~%üFÒUv’šûØ(¹p(ˆ—B[ƒW;‘±Š6pc­Å爭–*&u<å”Àú9æ{'\˜¡!@+oŸÜ³2K¾_â.PuÎpFe)6ýË47½E>å¶Ûïæ&Ž¥;œKh"Æâ… êDàlF¼üŠwú—¢;®G?8T¢ ÆÈ S¶Tî[4—³Q¹ªô§õOÚhìпE銚BªQQw]k #íÀ—-6ÄŒ6ú0ìéº×˜º´)pŒ,# ²h`½åTBßfUÍy¸¤\Æ”×øÂÄ1ÉÚbXaqet ¯ãÝÞÜYLq³$#‚è†É±G6•6,œcn~ÉY94ý±èMOYºÓ Rû§´ˆƒt`Ãh^{—)‰z—~un›5xpµÖe6…?¢àá6£*R¥!y8J@Ûº…Éì<ùФ*GPdêœÛ­]©¥M¶·<ÖÿP8uDK\8|4œE¤))NÊ ]¨ú °µÈ8¢CS/ÆE³(õ2Æ‘ÙV<]Û?L!ˆX®á ¦–ßÜfy†¹/bEÛ‹>¬!1£yó»Ã;N*­øÖÛç‚{1UœNáLt¯æ4M˜áT¥|Š©`ì·B±)_ŠV¢# ªˆJAºµ—à–ÂzK{•A*A?¨XÛéÈoYbžÈŠOÁKIöÈB¶[†&b‡¯˜Mú©ä­„!™W;-å‚£ž.ÂL8váÀ0PR\®ˆåÑþåã[ñRàY 﨔Y©ÿ\tgXÕ (gÔf‹õi Gƒ³ŒeM*ßæ¢nÜj•×õµ…~˜GÊó„e½8âjå5xniƒ-ŽH°…çíFÐ#”j¼r•ĉ†;Ð.:ê_òÍq27% ~—²Û|s«)àà•J¶ÜÔ_"¸tžÔü!*¯9eÝÿ4*Oˆ×ZªAB¡¬Œóš V‰Iø¸\òKµ¥¶æ‡jQ†5Àø@ÎcމóPmO7ɲâ]~edµ S¢ÿ9â~ÁÙKy?P(…KŠà™þ `à˜aþ>¢ÈQÀß™Eäðl¡çñÄð(˜Ò].¾"¯–/Ú[4¹„M4Àk°…p:PõoÄhÐ\¦aT”ªøÉΘ¿š%ÂX/êr‚ú„?pC1#›¾Qx?„Þ ¡ýCÂ^úå8 ³ƒ¶!+’ýÄ”Eÿ\X›½¹*P\©ˆ›ýU‡æÿÖâ¤B4t÷°QTÐàȉj—_@Añ‘9-\BÕ[ E/l@ûG3ÜKi{Æ~ãÓ˜ÝmÓÅ@2Ž3hPnÇïî*ÞV‰\¦Éù—Ö>!›ŠS°.ak•(/†Üœƒˆ^ h¬Îg2{1jž‡‹Ø §gÂ3:`…M¹eNPGÕìB…_«F…Ÿ˜ê¨Àþb5³úcAKûfòª üóŒwm«ØN|?s‘®Z…ržÿd{÷D ÀU «uU™`‰*®þ%ýÍ-—±UA µÏ¨jí tÌ"SÎÊT Ä.(¾¾H,Åù¶#•Y2(Ú}’·ƒùœJé0ØQP÷¤c£ñ¡¢—á.ý—3a„ ƒ»³î —•†c(â¼*ïõJÉ •(š °2­,žÒè—ÅåÇa }FEu‰—$_¼¹}ºW£ï8yl¯¨*Uû€®%^¾H­ƒˆErŠ%«a °xTB¾‚,²TUXðnõehÁm€?ˆT5Cû†£d"ž5¿ vlãýq*P¡ü!ª‘ìd5˜9Áuþ!䨧…ãhÉÁs̶8Ù +âG‚X†( sï " iq&’·•†ß3Q–¬SÊñôB¾£sÞS|qÁëʰÊÈq¸¹©iȉ^Å+ ÞºQγ—ÐGûH†Ì÷ ÂêlçÔu[B£ÁjÁè—Ê5Øæ•¡É‰n g–ê¿sª©p!¤Ø@ºàùc¨½"¨<ò*æQ®ü¡Ú#¡Û±Yqi•P=ãaœ”ݼµ-;! Op(Ë0¦ð–QP/E9¿!P¥­ºÇ¨æì¼v·TpSTÂÆ F €Y¦¥†yZnkA6¥MyDÖFeO ¿$k3¤‹0ò‹D*ÁÔv*ÎŽåñ6ê:ªrKש^Ýr>¬!„Sû€í ªËˆìV«»"Q"ž!Û ò×Pö *€¯ûÄ+›ˆÀ©G œ"3†XQTïˆ?)×¾âU4µ)øù‰Î„°«`T¦ZÀ¦¦šæãˆÕíâIBMÏþAhQ éG<ÎcF¡¨RãÑ?˜"…GoS§Ê â å[s)Õ~å€yc‰I ([ñ%-^² ʉ£œû˜]‰Ø3ú€šÀ¹¹‡tíµã=F0RB„еK¬­øï6­­—28žŠþ¥ÖºŠqE5‹¦)…Ñ|â QiŸQwÚ S²h¨µWéŒÖ¡ª¯îš'~æå¼dSU”hqñ CÞ4‹ <5\ZÕ¶Óúˆù/Dº=Æ‹‘BÜq5 ]~`“u/æ<±¹…WùeÚí–Pu¢€Ë|§Ú¯ùpHÈ|ÃÔxÞ jX¹Fø‹Å¦ uñ¨Ý—ae{„MsvyýDúê+¹ ùJê;¾»™²Šù4.êc`´\ÂíÅ©«(ÿ\¦ˆš#]è?ÔGÐN®4÷/kJN âöYŒpB6ÅÔJ[ÁB(ЧP4…c¾¡JØkBǔ؇ŸÜÖÄ0S.Y _0 ­®%"õ#±…^÷,÷ó(‰;˜àŒªÍVe'©J«\n(ƒ‰Ûþf1m%2²ÿ1U+BÊ<ÿcõxmDŽRÔ©lM32wqaTæa·3[úL"¬Uˆ¦CbH‡*æ;«à/ÌíÛì‰ô ±Éù!¸Û¡l¸ÊøԴ ÷rü5Kñ*i° þ`Qp1mó‘™­(Ù JÒ4ëÍb¼s5çÁ»JGlWÔv¾à/ðÄ ž¡ùeÕ+„âe xŽ@墾¢¹÷ýS 0¨yžŠ. ÕÍ Oë%ÅA[1+;†Ëô\6Ñ% …iľӋ—°ÕƳ1)"t_+É”VF’²9(p;˜át0Z¾Ò¡î@ZÕœ€XâÊ‘‡5ÙŽ×"S°wqÃE¸Có, ží ¸}$LÊÕJ#Éê¸wÔAO³¨=Êt%Ú“ƒ3)§æv—j’¢æ”‘N*_æ[G¾#øˆlµ·—ðƒPŽ˜ª b#” ‰ê+¡î­ŠÁILŠð¾d*Šª n4âmÙˆ@N¨€}N~Ķ勴â;êSÔ¬%Ñ^„kNÖR"P æ"³Ðk…`\`eˆ=‹Òð5… PÃĆ(*(ZÇ2…hüX$º•rËŽWè#ù"þ`(ÝŒ#û @¡\©®< bƹcL7©(Â'‰˜Ÿpìc—NåxŽ´\ÏiE`vU‘˜Kr@V”ÆŽràÖÄ á¡ÉÄz{ Ø[%¥« Üyxáœ>-43d¹—+¿i ¹JØ| 4ù¨‚9È"k °`¹¶d@ôªŠu{µÌj_K€° H‡„Ó¢O®ºAwÊí@'¡ÍÆ‚+äˆ#¿ˆ1…´¢M ¤„>Ž˜Õ¾ È–«J–m[¾h‚] «.ËŒvºDZ°<àŸá-í±ØiíŠ%/a ¢g9M®¹¢ £*ñ˜C Ý‘«ISë4”ì€#š‹«»–ýÜDê /˜„K,œÓN0ˆ´•mÎâ6½‰ÏLÀD²%VM,X»¤¢x á‡~ÕÔAU£CÈŠwTq¨ 4mä`=ŒÔ¾ŽHêÕ Qp<§b5ð§€…ŽR2 í Ôpø‰HzW2Ä÷}ÍŠŠâ Ší°*­ˆgPÑl›0Wâ7qJ‡Ì«I`eÊŸrÖ¸[Öƒ¾¿P,§Kbê±æ)䦄$(nÛÔ9ÔØAnÜ›¼î7!JÐÑœª£48„$¶¿ñŠV)ªfØù‚[ŽrË[ÙCcEÌÛ@SqÄß».œFYÑ8Û¤@CÅÌ„ã†ÑH)¹ne„•qPjá Ý5³uĸ8sv;Š­(lÈ\‡dnÌYž% ·„4pýÍc.r¨_(ES •0¼¢:ÊÏkñŽG¸©®|TíFc-ÌK™l”®¥˜kÜ%1K‰ÅRðâá•Ü‘qh) ÿ¹KRÜÂ^Ìá'ظ7Ä o¸=âW”/Z;…Š—¡Ç‚#»*ù¶la>IÇQ °ªïŽ!MLö˪¾zˆÁ²ûT5>AoÌJ•§¢žç%GT‡XðãYª#mŒê % rú€+ Ó¼AJ‹7[3©"͇hƒ*®bÙ¤¤Î}°t¾a¸¼¼5…“÷2nÀû‚©Ñ@³Äj1âbñJ æ3À¨Øž&0Pùh„B@òð–BÛˆÐ'D ªû€ ¨'W¶µBò¹Bá*o ˜ßuпc¿2¡X)Ùj+·×j#^%‰ˆejà×P"õ9UaÈV1#x™”@¦¨oÄÄìDùù•åo†¥Úp¨Ú„žâ;’ÊØšóજc7AW…ÎÓeÈUò %¢`X¬óGÁQâ„öÀi g 0F×™©ÛÜöÈ|E‘7( A‹îmN»¾%X Þe´Jð)íaB 29¥± Qîps-KužU|F}öV˜šÆTïQ—àÎ2 ãÌe­ä¾`»Â ©Gi >eÒA8ÊÂ$F³â&¯Å…ìîÂZ¹Š›>'ìsÔÍ®ÒÏ?øpê¾ «ù¦gÄFžÕ;ˆ€šík%`¬e¢åÌy–mN Ÿw‰[¨A)»À•HXî:Æ’ ,«•öñ’¡¦Ù퓳E£STóæ- ¶tw>[ S µÄ&ãÜCPï%‘ò0a¥T$¿(¤'CæddeD.¶Pñ,¾Bë1ŽeT)Í„sÓpÂõó2¯s@¥Ç”@§0ôáí*†'0ø(fUpybõ9’å¤D¼ˆÖ È"o˜–ôâ®ò9-·üJPh_å‰FüC(¶6vº¿2ÅcŸDÞ•Ž  éá}ì€]ùˆZ”²V‚œ’ÓYÙ–Þ. ž!‹Jˆ5hrê=¡…e?í$"‡Ÿ e%²š³+æ•7ú¹$_GĘÒKxZ£—©…yxˆÚÁXO¥íªQñÈ® Ú  ¯$(`ߘTAû =ø…© >Åÿ¸r…Û@NP.µ•±å™Í&ÚÊgŸÆÌÓr"bÚ.¡ÍEA8€±qV¯s¯MV§l úœ‚È%‘ÇèÏq%×\¦Ä'IDÆhÄáËúFt¡¯î:Œðp5›x”]i~Q(ýË™‡ôIv}ÃQÿVQ³½`I«bŽîéEyŒh(׈œ8%~åxÚ±p§06þ ×Ä*W¹¬b)Ò\@¥mó¢ëD©ÜÓ¹’ã¡ÊÿÄ6•@®û wxèõd$º¨>Vã`'j¹É›´ñdX»VžýAeV:² Ðÿ ²ÀÆ0¹…K¼ØNS‘”Œíbr ¶Æ´ZËÞQÃQÒØÔ$C˜Ì9%¼ÇF@ƒêY.bP¥8“XUØ9jêhNlH€{*!%ˆ‡yÜ2⇠Cf½B¸ K ¡ÔA)ÀÔ+¢^Yðx”ãÌ6•ˆtÔc{øÎ Þ÷Pc/Œr–{z•A¼ÇÄŽ¹´­%ù +Æ1¥œHi-=Îû¸YnQ…,Tè\ÜB0®üAbG?ñ+–¢^ι.½%OOÐ¥å7þâ+_ò*X®åDxÉC蛑iêX¦ïñVÊpÝq/îK éнÅíWî- Üή¨éõo£cã^’àÎV¥èÜ;ÿ÷©B 4&nÐÅU6̧Ǹ± Ø|C„<¿õ#}.h)ñ±Ä@ÐBñ@7ƒÏên SA 8*îP”¼›”×jEÚqnÜ;]ü~b®]ØóP²²ŠùGæJùG+VsTv¥ìv¯„Éã­ºi©ðguØøe£§˜¬5­ó°œ¨,+› .ÊÄÇÆs:a´ð†#Ó¥hÀêVTÚÈ:ÀQóQ‚õ÷þ`]Z ´F~Àq£¯¤!-Çæ"ëxê¿r³’ÑÌ¥D™¹X૊¯¯Kþå^ˆ«"è) geÞ%“¹ BÃÚÇH1¤ë¹¢ìã %•)5YqQÆÞšø`–5O†ÿÔVÞ­-ëÔnQ¢W•pêùÂ|¨¤5IXj¿æQ vW%ÉD4q`æâCë{†¶‹ú‹:°I¾æ*€¾ÖqLãíÛº–œ 5.à ­ß1žÔ°4W¦²zî;Ÿ];Þq*_K-1ÌÙWrFU¤«Žò³Žã_Ìg.Ö8øqSöT{ËcÎ#Gb¯÷.Háh)H…5EfÃ/î+ÒÎÐBón_îG¸íDލس§ÌR«ùŠ zÎÑ•ðî>å@f¡kX’é¨~ª= ÉÉüžÒ·²®6"1#v&\’°ìZļÁñùLB'žbË#Ùç&Ц®]è]:‡ˆ²RË2µ’lKñ“ç…Ìcv6„HB·µLm+~› $R#›IŽ +ûf¹÷£«hžŸRÔðð^—ä@3ý?©`1µDu[så<èù—ê5æ86XiºjY¿p¥€Pê[–uk`S¨š… º'A\­æ"d´á¦J3@ŠCÞqšòuÖðÅ£v¼FîdÁ «òt\°Kžµ\Âzž¥RŒ?0ñ0v ³ÏaîQ¯ÄÎ¥¨”Kn„4S“K¨L„EÞL4òŒŽÝ&eH[ ÜÒ/e9WB2 {Dëkg0·P)”ÐF…¸b¡¸%Üo$4Oû˜ÇY º5±yE¡2t!YˆêÄ+z…CÚ2nT#UÈñÿT¡[VÙËT_‚–§q^RvÜ78 "ípöËhËU ù¯š1Pµa*ð†gJŸi¬Õúvm¨-H§‘…x¸cÄÊ¥•€4$,ÑçQ°;æ5FšòB§!n˽–½Vòãsw… Í\0IK¬Mì ô@ç˜âRh¢Šî¢Y`ù]A¨ü?õ@][×ÉÊÙ ºÈœHä.:•Q:ýË@trÏâ#”†7ñ uˆsÅÿˆ«ïVÌa0êö½ù†â½¢®¬K.‰U ‘qÄ4Ëk ñp,¯L©Uň´ÛwÄ»j{×q¼Žƒãø”›hQz½#;e)u‘D@Vp v(ÀZ?Ly˜ª¿D\ƒ•œcT€àƒX•‰fg¢Õ…d¯´áPZ +¨Þ †.6E—ï„à¾È‹xvÓSÄÐÝ©žbòCEÂPn©éK—v‡ˆ™ÝƒÔèƒ;–[D<ày€'n;áXô"ÒZœ”ÁgÊTnè¡–Sqßj“Ü ´qyê]U%Ópʸ Ûj_Âl(Ù:k Õi´»,•¸Å@m|C?*¿â”V%-Z´ÂÖÀîÓàTÈd‘ý¦—8}¸[›Šr­–O!g¿âoÈ4áBTÓÆ©Ü|\Z[ª½j%ÇFŠŒº&‰ggðÿ0˜„TÊi• %Œ•üµv-MÅbÁRð=–síi4ÝçK¡ ?î"[ºz7R›áúæ¢jˆ¯†åÒÕ/ÅG1ç¾# GEXÂZµÔ“Žå—V¸ÒÄtw)YSÔWJQ¤ºþ¥›†Ê[[ ¼]ÁfÑË(¨Žg]žº8ŸÌµõÛ¬*Pç~à ¶øâÅÞ—hsúP:l ¾Ûµõz·Æ4mn nñÓl;¬n›Zñ"êNB÷÷––©Ö0€§-x:…6õUØDÔ'¾¸b➪Lø^ ,e¨¸»ž>e»µNjir¬sPHø¥fMhͨ h…sÌ8£×Är( Šì[¢¼ÁD¨5[WÍ R¨©?P²×oÀFÓx€Hjxs=P|§l~wê, " âëâ TSå]¯ÜkÁ^Õ‡Máî´pî6çKŽ'º•XŽ•Z>%•«\G½=˜n:]sh¬j¿57&¨-‹âó–ßQÈ›Ež!zKðÿo¹@+ºø„æ‡GVÁFŒœˆÎ#ÊU|ÆáFÁÔ*íe·Ô¹kÅUüʘ¶Î=~¢jD§î[[R–Ê¢ÊÐ×ÖÊX¯RW¸Ys1FëâW‰•Á×üJ‹²7‡ˆ q"x%´Ô”Ê‘P´ ò˶“[Ë¢.„lê¶Z) >²[Ááû–+¤šÕ …8Dí”Ë¿L¨•°Y"Àà ¶HP}MyèÜ`p]äâ²lz”„ð YP7B è»Èä½Ä¬ËçüΣ^gRÁZ‰„ÕnŒóª¡Çû‡CŒ€ß@ß-%0’ƒ<ù‹¹¡gSX=Š-ŸQ$hºnl2Ÿû@ÞŒ^ÐØr"V”ʈT´D*j¼'"q«¿_Ú¸0î5pn¤W6Bæ_¸¯„•ã±´Jå- ÛUSêæ ù²{Âŧ_Ô;á]k•¿QÒš‚j;¦ÀW\oÄÇDYcQd¬åR¦Õçæ&û`vÇ”ò+¨( 65ßî!3,h–̃\SCÆëÕ¾Ä ‰­±¸Ä_žfSúB®x:dåqp}Qj§´›]J•Sñ‚qI#ÄVµq•[7Ép yƒS„*®« ’ÕGX]¼Âø;-l`àfèfùˆ¹Éx…‘ô"è‡ÂB¶ji1r¢«K†ø„P*#b¼0ŽåÛÚ¡¸®‡0]¶µÂ7;UQ³íäeÁ—Á¬î~Äþb…L,p1]"çã—ˆ£-ø–dw-—£|‡Üe7¸MÓs¸ñARuûã²N:‰ÜÑ~¥×^å pVþR¹|˜É§ª!`ÆüÃpž˜ý ÿÜ@VçY©Jd ĺ‡÷­€!ó•©ôzÝáQi'@ °âV#Æ&׊ÝaSJ÷¤? )ü‚ ®8”iù©x|uÃp®âîFÉOJ²¥ˆó !g/™@®VÙ˜¾ SJˆ[&ÑW ²ê‹„~öpÕ%&é¾Ü…µÆ(Ú|õ+±wÀ[¿˜ÑIüÝÏ—±qË×"Z TÊ„¾’ÑúB¼ü3Aù'gi^O0”€¡šƒ|^ Ì µÄGhØqnP˨æ×¼R¦Î¥Ê}** `¯S)ØÕdÍ膿ˆ"AE@7W ûÝ¢Än›Zx”¨·ÜãšYš•ñ3y–4k–UÊœ…R^°.h,ñuÂÒš\s˜©™Ëá)¯Î¬IuO^'11ŽF^~ž  “:ƒªX:w“5ºþ*bVú‚šÔ}ò1Ì/%w]ÊÈkL0ˆV¦Ä*4ŠíläåëgYpßÚÖüE¨÷*ˆ •Aʼn;˜)£ ïÁÊ;½ˆ%ZW0—쯫Œ%ñ’Ü|‰p\ž¦ÇÌUÌRRlrj R&ÜÌ\xav˜Tîò='U£]£Võæ!ö}ÂA¿vËæ¦PÃ™ßæWÉŠ T>H)ÉNâ EáS*ÍW¸¡=©Ï|VE%ÇA²2wPVñL–P™×¼"KyœCBwõŒQ¯3CXý¶QÊlFˆ…jà˜UÔ\Š¢êRÂ\BçZäÅ"ó,ʾ!Fá";6‡X“Äιmd¤X^à+ÓIwÝÂ×µ"¦ž¢=ÒVæaYPBá²Á)Ó7’¡|D"3ìê3¤ðr® IÛŠ†‚£(©Rï&«“Ešˆ”ñ,Û `Ø’æÖEz%›r{B'/™”U±U¼y‹Ÿ cV?<ʵ¬jÜ-!œ!üÓ€ŽÕQÑùÞb:á@BJž(Š8/˜”z%@gˆel\0ƒ;үܸ¶é·ôÊ| @Є¸ù1h˜éâT$Cjd\¨®#@¨>[êM‹ v6Û‚¡ÀD•âPƒÜØv(ÔB,|( Ûoþ-ט!-ÄvFذ¾gLM ¼’…‹é¦!#‘P›T£|T\p¾¢P@ó µCÌ¥–0 ™P·ÔÅøB«GÂ\'ó.‚uW ,0C½€ áŠ-•#hQÌͶ‘!!ê(,É\´Ý u0êyPsR‘Ò\rÒáÆT–$Ý.¢ò޶®¢ ›ÒRC©[Le@½KÖ̈́죖w9iE•÷¥±\«Fv 2ÈÕæî K¨ S=Ê(}Ep¯h‹Þ@R?L­ŠcdyH€ÚÃZ¢réh¶˜ÊšŽ„@­©p ŒÃ 4–Ѝk—”¸nyTÈkÄÙ{‚‘@E†,ÁjÈE§pç‰oY88±d©U\1x”ô¼#´á•÷”NxUÅð%ü';Øid\6Ú< dÁBpd `QYUw7˜{,VËØ’ùã"YªjýÅ&ámâhfÍ\­¢Þbû+ÅGj㤌k\+U-j„ç3Íd½`¾q€"`tô a2J„êæ<ò`ÍHtž BUÁ'šÉkÁrã9ˆYÔ¾"—bPþh2ê°Üª(®àµ+ZÙ¿|A/q9[‡‘¾¥z8šÄðÊ/*ôúƒ,Ô¶â´á?I||ÅÚà"slf•<Š…··D¡§¬ä‚("üy•B?Ùc$+*8 mâ8cOÔÆŠ]/” nâèä‹“.m¡qòÁAIÎK bØ Tc"õ¨†Ò$Õ ‰mKU¯ÄÕš„ ŠÎð”§Ñ‘ Ú8{!#¤:« …+Ô¦ñL(¢K0’øÎy€P!±@Û´¥7Mâ8 ²"ƒ(>àF $TÀ%Ü.&GhžMdÜ1ñ ÈWHÖFˆ­ï” ½ÞbÐ4L‰P%ŽôkÛP™º±€¢xVúNUå±`ð‡ºÕ%Á_1ÙvN_3F¹¨’'0Ap–Ÿ‚…Ow W™vçÿÙtherion/thbook/pic/euclid.pdf0000664000175000017500000001274411026001634015250 0ustar useruser%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 201 /Filter /FlateDecode >> stream xÚ]QM ½ó+zÓ†-PØN&&jâÍ„›ó¤ñ#уÿÿ"leÎ…å½öµ¥˜åmtË—·úêîŠF®þ‘›¨V»diž!Þ€I³ à´k,Ä+œ–"vÖØtÓ«ª £@ÖV5e›:´fÀ|NÞ–sI„·ÿl0¢Ð{ŠÏÞ®O\äG9Z ;Ñ¢¢]ªÚçã9 D©–qäÓŽ|©Zêt(¸Ÿu<ÏKëÿÆr:qD Õ9Ô6Ž30ÞijZùä4‡£ú«ka¦ endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 264.189 13.948] /Parent 5 0 R >> endobj 1 0 obj << /Font << /F51 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 6 0 obj [ 15 [245] 211 [885] 218 [538 375] 221 [263] 224 [700] 236 [470] 242 [504 538 496 499 554 438] 249 [497 526] 282 [263] 295 [538 375] 319 [263] 327 [601] 360 [262 469] 364 [500]] endobj 7 0 obj << /Subtype /CIDFontType0C /Length 2935 /Filter /FlateDecode >> stream xÚÕW}pç™—‹—à*¹›j0Úd×G›4uÒ¦™¦´Ü0Í×@ !&Œ1FH²°eK–VÒj-­dYëÕ«¯µ$ëÛ’,˲0ò¸Æ„4¡4—¦éM.S®4׆4MèÜ5é.ÝüQ™tÚé7÷Oçfnf?žyw÷ùýæÙçýýæ‹6l‰Åâ­{[÷´îßõÐî§ÛZu£®ÿ+TÝ&í ÃÚÃïð÷ò÷ùQþnŠylß¼žoÚ ¼Û¸þ|ã†naèÞ ™Û³ ÷‰D¢ßß]¿Š[þ7n«GŸ{»ñ‹k ÛïIê(è œúŸ žTêªï*Uýø)ܺK§·NukðæO~¹y·A¥êm~Z×7·éNžRáÖ‡›ݱã_m~R«m¾óž±Ù 2ª f•ò«õÌÍŸ¥nþsê¿®Ô9ŠîýTô3Ñ ÑÏEïˆ>ý·è÷¢EŸˆþ âD·EËÅ_?(~\¼[¬Ÿk׋Äkß4‰šÖÕ£ ¢{EañvqZ|sÝäzñzû†Ž ï7ôIZ$> ¿Ñ Ùô…MoÝÕz·ù…ͯ4’ªTà¹ýdÝ:F­Ÿš­M­: *åæn¿{û²g%z»­bŸ^ÙØŸ°O¢×û„ Ó?””É2Æ/l¬ŸÞj°H-«áÓùº„½Œ^ƒPÛ ø%pú:l˜LŒ•0þ§)#ºG«ÜæMnåö}ZàŽñ…UÖÏüö‘äŠDºw(kõvw¨‘.Sqb&ƒ…$\À‰ë<=H;T&û¦@OupyU‡cp ü ¸²8æ–³—D’¡ØÇdçÈÎ"·µé†ä+« ýL/#åüøÙ4†aB ‡È#Eo~hÁRÔFôxünD«wql@Gžpµ>b&ä;¦O¬ÒèÒÈÌxq)73v9ü fŒpšÜ4`œF¿iïÊÔÔ˜ºf=wIÎúG!‹²WK–æÀåkï¤o!žîã°ÓÕIlí°œì »×*qÀ5«Mਢ°`y™?Í&'± °©:È{\ˆk” «©>z\Oi£%š±aD~¸X .ÿvû˜(ù™I z,J'f;äèpŽ#žn³\;f›8Sš¼”F¥·n{NƼ8Ø©UšNóAD­‹$,˜.c®Ú΃š#½Û‘oµýèƒ|uüòÂÊÜò…Ó¯æ"0 /è¹h†¦½>ea€"{Ž/xŸƒ÷Nõ¾R,D³ãh!—,EªÌ%8̃ÕÑBe™ËÛ}ØéÒ“Ý.‹Ë2D„ŒkÔLé²syynå79,4˜š‘x,¡^ÖúÃÑLSÜ­Ç×Wžf«Wb ¯â1Ùà³ Â?Kh§³•ÜF÷xîv·yÈîtÚëbˆŽ¯„°@f´¨D‹±B¬˜¨e¯äß; ãÃÔ.­Ž6ƒ>I¤<6™+‚ji:]C¤-<Ê=.;´³ë€FŽ;Û͇Ðýø€V˜‡ÆJS‰ùÉ—°âRát><=|ÙúÓ¡%Û<1cž%²ÓO›,”P†õGXù›s/…ÐÕðÊ5áQ~jô¸MþÖÍ ¿Îýjt64ƒ ÇŽE3HqlȬìݽïa¬Þì)þð¸G#þHD¾@Urh’ÀYÒ«#Ô8fÕÙ5®ÎN°å˜Ð_:zA¹HWé©Èd¢–›¨&—› ò«¯¶N .Ââ%žÁ±"ÄÆa*VA&ón*ƒ-§NÆË™‰øLè,nãÕ£2§ÍàéFÔ†h–Â4+Ú¼=äésµ; B#Õ:Ð2F¿WášjÜ7ç™I& }6ûs†m 4šÄBÓ‰©t)—ËfsÅB9™ ‡A*GŠ ®Õ‘½®¡@ЉQv»²[­6åSL¼XÛ”…IKaY`1éý¼%(£†IÞªéšöþ÷uÿeÕS–ajูkPAiÈcx+ÐRƒƒ„¦ýÆláXN Äà 49W~iáÚâõ•ëW^sÏQ‹æsļeÚR$³Ö¤9’~–™Ÿ7+æÑ+¿=Õ’>˜nK·ŸÊMRø¸³ ´ƒŸå6Ë|=T®:|À®G4Dé´æ§ÓköõÑ «w4cƈ”³èñÚGHÆÂP~âÐIÆù”nêê! Е©ÉKñÕüh™ÛT¯â ÷epC um'0óלÏ3Fp”™Ö_Ef`9‘/'³Ñ\(¿2þ~…ÛR‚%™©K±&/:ŽÕ¥c蘷Ç"7³TÊ‹Ž°,AJùüR“òÛ¸‚ÌÜ¡¾˜^Í%.f® À&¯ÕÑF<ì=å>1Ôî6 Ùž5‡q z"_ b8›Žç3ÕX!> endobj 9 0 obj << /Length 465 /Filter /FlateDecode >> stream xÚ…“M›0†ïü ÷){`ùJòŠÚ¬Ô,Z¢ªWbOR¤`#‡üûÚ3•ªFEëaÞù൙})Jw-Ô ÜèÙgЩAsp³UëÌf[Ňd ¦h÷Ê ­x =›gûí^Öý“ï%¿&Õ¿E¸ÔòSbû°ù~¹oÅ÷â¹ßò²PºSÒý€Ëp­´ëÛ´cÝ_ü?JfÂìQ˜a¡Ÿ »ZÉW<û¾o^ì¤ÈTc?²s¼qPæM£Ÿk)ô8-;ÙÙ d¢æýHøäqË&—·®‡f/ÏÊY­˜g:×]¯o8÷“ã½kº–64¤•CÛ^ÁÄ|'M™€³©m|:T 0Ï:°&Z÷·‡V|&o-°9 ‘¹е]É 8+cƒŸ²Un®Ô)þŠY§ó]ž/ŒÜ,±]¢Í³¦xLzþ»ÒX=Gy¸K-m#ÌJ2¢5Õˆ6D_‰¶D ÒÎGÊFʈHyHʈˆ:lB¢„”Ô!§~*ƒÀRGK¤0F2f ½ DQŽÇH úòŒbKRÆTe™½eD‹Ñ#ôÄzlÌ}Où µÙP> endobj 10 0 obj << /Type /Font /Subtype /CIDFontType0 /BaseFont /JPHPNC+GFSPorson-Regular /FontDescriptor 8 0 R /W 6 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [2 0 R] >> endobj 11 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 12 0 obj << /Producer (luaTeX-0.25.1) /Creator (TeX) /CreationDate (D:20080617153404+02'00') /ModDate (D:20080617153404+02'00') /Trapped /False /PTEX.Fullbanner (This is luaTeX, Version 3.141592-snapshot-0.25.1-ETEX-VERSION (Web2C 7.5.6) kpathsea version 3.5.5) >> endobj xref 0 13 0000000000 65535 f 0000000406 00000 n 0000000295 00000 n 0000000015 00000 n 0000004461 00000 n 0000004809 00000 n 0000000474 00000 n 0000000667 00000 n 0000003705 00000 n 0000003917 00000 n 0000004611 00000 n 0000004866 00000 n 0000004916 00000 n trailer << /Size 13 /Root 11 0 R /Info 12 0 R /ID [<27C40D835568C4241250960DE97CFA75> <27C40D835568C4241250960DE97CFA75>] >> startxref 5188 %%EOF therion/thbook/pic/thom.jpg0000664000175000017500000012003010777232130014756 0ustar useruserÿØÿàJFIFHHÿáExifMM*ÿÛC  !"$"$ÿÛCÿÀÊ"ÿÄÿÄC!1AQ"aq2‘¡#±ðBÁÑáRñ3br$%‚’4CDS¢ÿÄÿÄ&!1A"Qa2q#¡ðÿÚ ?ú¶” ¤X sÏíôÐ”Ô ÛÏXd#6Nòq‚?Lk­R”ѪL™œªlçž>Üq®1Á"Ã_„· À䯉³ÐIÖ@*i¥˜(qŒMInŠDlÆB§±?×(²NÛ#j°`{óï ç©‚žfŠW!†}þ¾Ú ôtÒ Ia‚öí¤ÉO–ѯÊðÒã¸Þ¥˜0÷ÓBHݤ\0Ú0NAÈüµ/ð•I7ÁS, ßåR1£b¥BÅ4)SÌ{þšLÒü<PŒåG·'ORKçÓ$ÛXnçvÒØÄß äp2tù d ÙÇ‚xÓÊêØ`}}ûèK2ŒHˆøô#:ÒÓ&ð”ÑŒó üÜã'é¦æÜ ÃvÚÊ»²  2=õ-²Ÿâ <$†ï†ÆŒYã/å¬ê_„q§$8BìÀ(ç@3<À%<1 áT -Õ\a£ ÷Æ’“y²æ7!OþѯI6éZ8æ”|Ø]PuPDvÇUÇeƃH%7ƒR"ÂíÚX‘í£ Â9£GbY†Hª(^`>Ýôæ§ ƃÉϧ:n(]0ËP î4;°¹Q¼M£8lpt,Ô´4ªËYRȧŸM*ñÈ °¹9'M"ii<ã¾—TôÔñ¡“y€1“v úVCGpTêl xÙ‘·¨oaߌëæj~»êÛTµÆít[œ-*¬ñ%R¼r xãÛÇZý/ˆ'‰/Uyá˜b 9sÎФd1ÉÒX\B•š$÷ê%ŽHZO1Çó`îÇnsÿ:£õóÄûEî¹-¶{UmÒѰ˜ À²F;ŽÜqª-óÄ[å”Ï]s³ÃGJyvêROš«‘—|q§${j^¾êJšu»Ñueºt ÖÙcÚª»™vî –8õÈïßZŽ&¶,½UõÏYK6÷ðýÝö•Þµ ÙÆpG¦3é÷ÒßÄn Ž(©æè›¼5 d©\.Ñí©ãTÞ»ëº×{L6âHÄq›€E}Ãùy*1ë÷ÈöÑu×5–ë¥-³§­rËs’Ò âóYsÏÊ=OŸo¾µãºÑ,Ðmž#ß…ã£oÒ´“/–?Ê£§¿¿}\ì=AÔWRßÄ:eít»qºZ•wÏ$aWòõãXßMuGZXnvغšŠªão»Çób¥Ä´¬Ë´z܃èsß#S¾-ø‘qé[5¦Ëk2KUHj<Ù²ê[vÕÉù3ß×\åŽÝ$[6´’VƒkÃ&rTçåõÆsß×öÎ…éøè-ÔENªÎx?ˆîîIîr¨–é/žŽ¡Q™lÕ±<¤Ú0K2{à±ÕWÂOnýOy¼PV¥5e9€KONÊ`L° e~oÅÎH×?©þÍC©úîËÓ— *;¥lt‚¬$¶Náß=¸“©keú‚­ÚH«é¥ŠC”Û ùG~§:Á:CÅš¨êY¬½mo¡ø9å+C#Gµ#ñ1çi÷8çòc¬zbÏEâ­MÓÙíñPUÂ*ì$¬ÅAѶœÛòÖü5§¦9IÊr…ÒUqœ¼ßýµÈÚI¡ÞBC|ží¯œi,>&xuÑ—ü3Ù’üêŠ3ºI'n~'×¶u`éëÿ‹×ž”K•ºNœÛ4 È€°•p08í»è?¦^iŽFÙãÊ:ylCcqÁ8'Žyì3§e‘ CàߎOô:ùFƒÆn·4•Õt”Õ4tü,¯ø]™—Œàðxî5¤x™âýL‹lt4Írš¾†:¸™¦òÑQÇðI9ÇßUà’t9þ§ Æ;ç=»éߺþÿWÖÔÚK÷ðËÂõ´ìXñ½·(ÎW cì}t_Ç•ŽGÒ5õ4´bJºÈ`ŒL«¾¢@£%†Iïí¨®¦ë+'MÏJ—©¤¥ŽªC2ì&3À$–ôǶ¾zÿ]UE{´Û)­AKp†9˲G&çÎÜã°ïßøÖÇEÓ4=oáÅ%5Ƨâ)ªh¢dØŠ}€‡É‹‘ûŽF£Æ¢“¿£B†Hæ‰&‰Õãu Œ§!ä§F³‚´õ·BÖÃ`©Û~éÁMSÄô™n)唸Î;Ž8Öœ5ÎQ§¢¡Zö½¯k%¯J:¥ 1E 0(Tó>ŸßmðñTÓS 0Æ@<éºdA5Ah¶®àÅÁàœ õQ稜%§RUAç8÷úh kE ´;„DÀíï¯'ð÷‚i#DùñÉõï¯KñóD°+Ó&å7-‘ëÆ¡ã°WÀd–š°#–UÈ_®uWè$mû"ذSÉd7íýñ¡íìßÄ.0ÓÆ‰0ÛÎÝëþº“†" ”“üì§Œã¾4 ¾5[Å}AŽHÉ$œ©Æ1ïÓ@ ×$¼f5c¾ŸqF¦&\dc(ê*/Õ­[SɘdèkQ¶ÉqÇž¦¢²nBFA>Úz¶xRàÕq¸2Ë·sÆFN­lÝ'¨Zº5¨mxaŸøÑ½C*‹\ò“»OoLGTW[«äŽ9XÉ1T.yÆ8ýôäfš¢–jz™·Eæ*g8î;sÜj9•mpÜ­§ÌeQ¾59Ï=´-rUÖ¯ª‡È ê©w œ©­¢}-$‘BaÆT©==t=mr¥AŽ®x‚2)ÀCŽs‚sÛ‘¢Î*Éç¸8TRcž4E<ðŠX¥P§rdxí¨I.vÙ¢jjŠ”’Tõ gœ`ûq¦ë+é A)ê1*¡yǾ” Š:˜?L­2ù¯í<ãô«žùn OŠ…£ÈbGq“ÛPrÖQø¦tUÁXå(F<÷AùêZ*ªi&Iw©‘—‰ÁíœSúê4"]êa0UQ$¸-ì?çI†z”²Í‘üÄ ¤nÏ~?]>•FÂÕÜŒpÄœçéï¯W•„´¢$ÿ1nøÎ€ßÔÔÆ)槨Že2O®Ÿ·ÑFË.PÇ Ød† ú驪"Gà1lìϯ<ý´\²0pÒ2‚Gb;p?Mš‰+^™åRñä…΂®¦'ª¨gu2¡Aü9>šhššòõþdÍ$«€›G<ŽßmDËQYünYÕeo2?~Î8üõ¤œõ§Oݨ¼n°\ü™Þ’H ùê>U 8%8:êÝ~¢–ãiX£ø2ÆëóÈpêTýxäý=G¾Žº\ìð¤v‹…ÆꥩY6NÛ^0T/è§ú2–ñm¹9††±‘äJ1Ü œíþaìy×^MÕ¥ø}ÐwVð²ïcºÒ¤-Y4›6¶vˆ1û—‘ôüµH¢ðû¨¬ŸŽé +ÜnåÑ•€•G;|ñǦ¾ƒ†ÎÑÃ4Ռİ$¤LpÍŽ8ŽyýtíUe")Iù‘ó¸žA=ˆíÛU™¦ÉGÍ7K¬+µ]¿ÿ§ÔN¡BŒÉåˆàG úê&K?NGKWSKÞ'óZnF[9Žúëê}5M›©ñ#¨guùIÆx>ƒ¹<û "íH]"H(Ì{JøÀzê{ç[Y¿ ´Ã{ñJÛ%’®ß,sшŠáä²ÄØÊì+éÞžÚ鮎ëjxÚ‘ºw¦fò‘Ugž>v‚q•ˆñœwÖÕ34²2EN«Œ;á0¬FàHý¸ûŽ4M¶—àÅS9×Ë]ŒnØ!¢rR\ä ’;€;ê,Í$Z(~º^®tÔôM†&@Õ3Ö¸PÝAbOšŒëo‡:^ßðOµ¶xÓ– õku\sRÕ´$¢F$•›'n67ûwúˆA9•ãS#'–Ì{íçß\–=Þ\,$‡,?ÊO8>þºÒÏ$N%[ÅÇŽ? újDhZÝ2ªÃŒ T|¢«‹Âú©¦òæpï b˜¥Éä|§Æb®µ*¨Yhå$ˆÇÿ§*3Ï|ŽG<éÕŠ/5†®0{ŸïõÖTê]ð§¡iú“®z¢ÕtlÛ(+wKFŒTJw:¡È9Âûw9Ö™âÇ„týcÖ¡In® …!@T˜ä…sµ?,wö'V~›èqfñõÕIT‚’ðÊ¡BAÜ~¼×W¢*áÙc ÎJ÷9ÇüësÌùZdQ1Ή辥¶ÔÁêÇÑ4Ô´ò†š®8˜Tœ${ð íÆ´úž—éê»zPËj£zErë”6~½õ.È®¬²¢'±Û:ä V_”£;x\kœ¦äì´d~6ô š›Ã[¼?`¡‚e8ZjQæ1 ãøÎ¬Þ R]-þXm÷X&Š R7˜’& ç`çÿfÞ1«¤›ŒÛFåá¶ä vüô¢Òy%•UŸn@Ïÿ¶#qâÅlXíß:PÐvtž;d R16ßœo/ÏÔžIуX(¡Û^×» "MU\•õ°¬”ñEjFíÙŸ_øÖòãá*"v?doA\nв•%ÛOÌéqœÐ=TTêß.@Þì…Æ}=µóEêë×]e]Vý)Wð}=HXgiV5Ü£i8^yüX ã9Ð2õGˆ]OQÔ7Iþ±^1-8YU[ƒœr>SÏ$kkøÿ£‘õ+½]}ªZy"zws· Œ€yþó¬Õ¼Q«·ÕUÑWtPºE„GMæ!Æ~r@õ ŸßYç_ÜúÓÃÊZ½¿¯j¯T¶ÑÈ À°%rxÀÀãŽt¾‰ñ#¨ºŽ­©ÕÖ»EvåÝ EÑ ù¾@ùÁ<ö<ñ«:¾Ñ,Ôé¼f金ã¨þ'BþfÒ³ÐI•Ôà~ß][¿êÚ&µIp—ÿ¶Š:s;š€cÂgÔ‘Ÿb3¬g«ŸQz‚Á[ÔÆ½¢§Ý,²Â]VPv‡Q¸Œa¹í#­×¬ª¼@©èÚÚûMö:Ê‹0ÉÃ,k»í9ä€q“ΧâÑl·C×}WÔŒíÓ–ø¨hY7G_^Žp?Í÷ÛÇs÷ÔmӨ᭩†ëu «©.¿Bt`$œäïγ^‡êž¡—¨ªlW:Ømém†’UùB«*ùjÀg9ûvö×<7Šoþ±u$µ1„;ç}­¹d"E#óƒ»>ãò×OVK5zŽ¡¸=!j˜© PJ ’å<ûy¶¸õF{‚ ‰wœ; éÂ62ǧçé¬G©ì¯Uã,¶ÊʶjZ—2¯—7dOPTê[ÄÞ“ŽÅh–éÓ·›¬’ÂCH¯RÙXÁÃ} ¾8ë}’ÍZžåS4¨)6%ŒhÊ8b¯ƒ¸rA8>úŒ¼uM 'ÅTEŸh?)ùïûë-°u=ÚÑá{UÅ1!Õf’}ÌÌfm½øÝŽú„°O5ØUÜ:’Áq¼Š€|º˜ÔŸ+#ŒróƪÅö,Þêk/SEOp‚¹<Ç T‘µpGÉëÏl~z©õoH_«dk½ î¶ œ3#D楶T që“‘õïéE§éªeé†òâê+ÕÇSU †-Ã%QP1çïÇ?]Hx?ÒÔ½OÓuwJû‘hj%Uªe(`íõÏåõÓŠŠ»š=–²²Ýµ]Or§Šxã-<¾q­’§¦©ëZ*нCSFÔ¨«S)+ÃíÛ‚3ܬ­¬VúN½£³ÓM:ÑÏ$a䨨,!‰8ùqõÕ¯Ç;E-Ÿ¥¬”Æÿñð˵€lŒí'=ñœïÏ®ž8¶¿E–Êþ»²I|‚†¦ážF‰6Æíå d`ýŽ=ΦnÝ_Óý=±îõ.©Q# ‡irÇ<àŽÀdzý5‘xÉa¡§¶ÐuR9¬eÚ©¨ØÊÅNG$ñëžýôW‰4‘Uø[Ó7²òüX ¤¸$¹dçîr™ÓÇBÍò¶ñÓ´Ý9 Âå8£¤Fï)\eräç ‘õÓ–zÚJ»-Ί¥'¤$,o ü99Ï~0s¬ÓÆZ;¥„1Ϧ‚§ªF§ÚňJŸû€÷:«ô»Ä.ŽèèzŽÅ<5vÚÈVw¦13˜É_Å·p3œ{sÛ\Ö4ãv[6_÷UQ?L½Ò9¢J˜e òúÜÎ㾜 Ö‰lÔ:‚‡£zî»u=d?Äéä °çÎB6®î{¯ ë¤ÓuÍ–Ýt´t„µµ·:õ Ó*ä+¹f>ürAãó£‡Jj‰h:†² ††v+|Œ¦Cß¿>ŸA ¼&¼Ú,YíÕdR] C¬•u¨‰°Q·'?æ'kºkß-‘^ï¶u’­Þ†—âj¤AD*@*«|Ù>ùã¤|S°õBIKIDUÆÍåLp]và¶îsØd}F³z’.™ñ?©ãª’†éÕʉUÓÊùÛw-È ~Ý´†â:Ï&šÚ‰O ›ùgä\¡Î=—'_¡f×ÒkgºRÜ«(Œ±-½ŠÍ;žòKàçåä÷‡é -þ(ôÍÖâ´TõÆfòö…Ù°IÁ‚}I'õ:£x/CO-ë­-Y‘#'É1“ɹÁS§o¶«ô$Sn½ˆª&¥¯¡¨_…ea°~/Ä}GO-ضn]wGië{WNÉG"UÜcBfÎ|°ä¢*óò{N¬]YÔ6«:¨­¸GFŸ \ ¤*„®ÑúŽÝ³Æ¾]¾õô\­Bòøµ’tA;7ÌÊ­Û±ç9õÖ‰þ%(.u–›-\B¦®:hžJ‡m¥”9Àäöäòç¨ð«I–ËÛÆ:hê©ë“§®IeªF+™¶÷üL«ê1žýõ£Ò\(mvÊZ£uO„¥ƒ$É ÁB¤†$ý0}ûk ékO‡Õ½'A[rë*Ø.JIjÎcà`lÈ<þPAãòÄ^ƒ·Aá½GRXj.õ!‚6jòÉØ±R{mÉûÖ8A´ºÍ~ÏâLõ¬¯¤¯•)­ïžf%cÁÁ>Ÿ66Ÿ××#\Å>“—§ öz㹪Í(v¾fÆxP3Û?¡ÖyÒ]GÓ5ÿ…¢­µ©ªi!}Ÿ‹Ž7d‚>Ÿ]Pz.¢ÓYà—QØkêãJ¸j ]09ùX"•Áí’U”dúž5±gÕ”µÔ[⨥$G\Á,x`ÑàAõÊž?×TË/Š–+×UÔôÔ0LΕ/N&gB’2‚IQßoÈyÇ~ú¯xc~ŠÕàm%uÚååCDd‰g óHUþƒŽp>šÉ|0êk_Ox®z†¬E¾½Ÿißæ50‘‰ÀïÆ9ùµ#†ù~Ï¥îÓ–ëõ/NÜn)Mv©PR&FÚ3øw60¹úóûj'Äeé—ŽñGkJìKLŽþ^ÀÀòq’9P1]cž:QRÝZ**8‹ÎËŒçiü#äã jü4è«Ýj^j,8B¨Ëå©ÚHÎÐ@Çß¿é¬VÙOErñwªj.UWÓµÑ×H)¥VU/YHÞH PtŒ!.½Ù»t‰v.¬¹ÏhHê­×XrM\{$ wÇq‘ê;ÿ]1â?Š5ÑUËm¬wPÍOy*§±$àsíRz[ÃιßÅ}'_Þn•ñ.ר¦¨‘92.qôç&÷à·QÒul}QÓI ed{J­á ¬Nиf!íÆGå§|¶Å²ýâOˆtBSõ/ðù* Q‰b…óÔ°ÝÆFäcY¥Ö®ùâ ¦›«úg¨n4µñÄ Ûafò –?ÆàG<äÊǹ¼F^†¦¡ê«Et VñTrnV,˜s'œÃßZ×ø{éÉ:wÃj!T¤UVæ­òs€àÛå#ß:´±Ã—²v螺=EJl÷¨^‡¨hUcª†eel²þ„‘ùŽ5}S‘ØŽ}u[Óô2ÜÅÞš(éna5I—FÖ$r0Hô=¹ôÔÀ× 4Ý£Hö»s^ÖJE3Ýž)"y©ÌùŽT®íÀŒ_¾8Ûõ¨uåL–Ux¬–Ñ]w¬s-$( !ØØ‘¹ùTwÝïÇs«´Åjå%&`Œ N<äý;q΢ì3ImêKë{ÍU\w?ÿÚDü(¿AœýN·‘žéú;¬¼>»Óõ­ƒÿÌÅË\ óçxeR}Û·lMZï}moñ;¦kºo¦^J Åm1ݬA²1Lç ‘ž?MlVx#¥3+$qíªî”8bHÈ>¹ü½µCšáá…›ªÅE²ÓMÎ@b’[u ’ŽF; +ëÉ:íääí­£5E#¢úÖÛÒý/ÿAuE¶¦ÝYJ$Ïq…tw$9öïê9ôx«ˆ=/OgéjË¥H­Gø¨©ÊÓG¶2¹g`áÉãÜëg¯µRÖ¦úȨ¦‘Èð* ž> g¶‹ŠšžŸË†`•‘ŒvÖ<©>Il´c>+ôMl¾-%¾–¦ãQLi )ovE]§ ã ¼èŠ_ ¬}YÑÔ v´ÔZkÒ˜*JHIb*Ø*ü þcßÙiãXâTP»U@Lö×™x Ée#¹'¿õÔòÉ*E£ ðƒÂ>©é®©©½^kiн1€G¬îàãoLmú¿u|½3Ñ·šž±¹™…eeQîU'ÌT]á=ƒ¾½øüî»wÀÊÀ°ù[œööÓ5¾TÒGE&Ö.¥¾eσŽ1žN£Èä튣åë}Ï«úê~ éÚJŠŠj<„(ʶX“œÄžØô=´wHtåþÓâ­]Öçj”QÔS)(7«mÁú~Oóô -=%'ÃÓÀ´ñ„p›xŽ={cT:ëkÖ\)|ú•Z¹üÅvPrQIà qÎïÿ9ã]–[Ñš3¼F†éK`­’ XdʾY`Ar[çÆAǶ¤úÞÏ%Á©ã–ÝYMd¾Z¢Ô+†ÁÞç+Ä)ô#ŒúΚ;ŒrWRÍXIL…@@ÙÚI'žçÓ#飥¦‰©)£ˆëŸÊrIÜxíÜqïŽN¯.…íAÉOÑÙ'ŽIf]™b$…‹ œHùúˆµôgYY*%¶ÐÖÆhܲ¤›3€}ú}õ¯n¬ž8¦ø¸À»G˜6©ÎsëœwÓÔWjJ¦y©«¨øuW ‚¼1úÀúêù$(ªÔX®éh„Ô’òÓÊ LáI•L|ö=òmCøKb½t÷M\¨ë¨–9¤©EC±H=Ž0vcWʆ­©!JÙ„í*îpryçiã뢪](í³#Ï*Iä‚Í¿vÇPç·éùý¸Ï7T(¥õ߇ëÔÕô’I#,Tàî0  +;0Þ Áãh8çUÊÿ o5qE@:†¥èäù„5 ¨Œs߃­‚’ó #*U¦UʀOpsÏ~;`þAYI5T©U™ÙÖ" ݹÉü½tY$…# ¾x}}žñGÒp^$¯òI}®›R–!Œ3N8ÈZ­ß‘éê{DrÃEN"| SÊÆWåòs«3ÕXR–õW ÛÒiaey”íÜÀÃ`öóéŽ=õ!üfÐþ|4×ZYHhH˜ B©ßñ‚;ä‘爐ÉÕ @Žž¤©é8ú6ãLÒQyKHùq¿„ãœqŽÿ¦53g²RQYè:zŠ?þÚ‡ÌþQQÀÜó»J¶IgZ‰–(ªfùÊa{çS¢‡I<È‚¬Ù%_Žüä“Üÿ®¸ÊLÑU±tÕ¯¦g¨{¦ž™¦ÚÂw²óß¹ý¿¦£o>ô÷QÜb¯­²µ5L³´ôòßÌ\c'?—>ƒWHéâÏTrÛ vo—b0#óäúsùj¹yñ§m}C–¾âÐÖTª‚\ªdànaÀ=¿}TäÞ»&ˆxú—§e¤7åØà¨’DQÁ .xôèN°ð’Ãr¼Gx¶V×ÚnÕN<æ§›fxb\¨—œ}}uiºÕÒÓPÖÕ=ÈÅ A¦v'ÛÁ9ã’ßë£âžyí0])«RE|(pÅ”‚JƒŸÏïί9-ؤfñt- ¦JkÕMæåW𑼢ªº¨º#òäzgž³t­M5îÏÆ–ª)Q&#Œ°ùN0}÷};hJ¢´õWZ¨îTTP8YáÁÚnx Ù†}õbµGÒe²Ûæ5(fyL›·±'œwÖWt yød¨bS—‘Kò½¿÷q¨þºE=öÊ)VÖÐÔíuU¾pAÈÏ®a¬©J¨´Uº7ÃøúJéUsZÊŠˆë‘ž¦V »AÁ?³“©î™ðþÛ`¨•í2š©D²n9 ;p9ÿ}8÷Xi«éiniþ,˜! 8@UO$îõûisu=4EÿO|b©—tP¡Ýå®Kn, åÝÁúhܘÐëÚºÞ)ï5°«Ôx$À$3Éù}x÷ÔÚßV´0Õš&–ª•cE%Ñ×?.à}öŒ×MÚ:šåÝi­W*y $ñ-JÅ9%T÷õÁÏ9ÇRÝIÔt½?jþ+s¬‚)ž)Š®ö˜ª|䯣rÒ`ÓÐ;jÜ ’Ž–mÛäs Ÿ\c?–N§'¶¬¹¤›l™‚•#pc´·#ÐcûÁÔLuŠÿGO5 È̈0ÌAÈc’Àû/'“é£)/vkí5U%¾ñMW7Ÿ—ò\gÛŸ§b8Ö_/cD5…}-JUÒô½ î¤æ6á[¾2;vç·söÕ#Å_m [IAbéúh®·gòãXÜ”r¥¤aøT0H÷úë`¬ê{MR[zyêÙëëÙk¹T(c’}3´Èð5,C+¹i$!K©np=Tvíª²N.ؤÊuŸÃ>ƒ¦hm*%¸= APÊXEæmœ 8å²yï¢ï ÒõV l­c¡Š–@ Hc¸9 ž}¦5!|ê«]ª¥­å¤ª¸·à£§MÒ·Èô¾cÈçU^¦¸ø‘ñ::K(¥¶ÕHòJ¨'s(aAížú'6û#ì¾Ùmw‹mÈ\.5?!’(¤ §ØÎäþúe]¾š¶)«©£ªŒ%gPêHûúýt/Jõ ¯©-¦ãl¨3D²X²À pAüÆ¥D±—dY²¬¡†A<Œþ\ë2”›ÙRG!aŒ¤hª¹$*ýN®³~é{ÕMÔu´ƒà+i‚ÓÔnòŸ(ÈáNr=>º½Ýïv›D”±Ü®R½T¢FÁ‘Éÿä>ÙÑsTÓÁ O4ñE ‚YÝ€®O¦¢m'ú%Îôdž5wéÛޫͺY(jäå¥Vb0;’;vý5Oâ§CÏyKZ^‘ð#™áu…ÉôF>™íž5o¨«¦¦O2¢xá¾F ¿©ûiRˆìE¶††ÛF”–úHi)Ó…ŽÂ(ôì?®‰ÈÝ·œý´ÏÅÓ ¥¥yáYß;"2 ìr}zzºhgŽ jaŽY2cGp ÉÀÎN²S5ÿTu—#¢ Šiê&¸B‹ H]¤Îî0?_ËWŽŒ¤žÙÒ6«e\‚Jš(`˜¨ÿ2Æ êB²¾Š‰ë*é镜F¦Y‚Äà“ßé¢u§/Љ+c4ÕPT4‹ Ìl±èHýtøÕ'§z‚«¨ú†ì-t†ŽšÝPÔ“½L[Lò¦AÚAÿ/¯ÐY‡ñ•» -Döæ ¿Ë*|¼î äý£ $5í{^Ô)n¥·ÇIEF•*2FåÈÁÆ=AäëÉEn¦¸M_ÊTm-$3`)s“Œ|£í»ŒŒÛ²˜ v œÿ§é¬›üHÝk"´Úúf–àiþµ)\€>Xò{ó½8ö[‚r•èfŸ­:{®ºœÙ–ô(­Õ27uÍÅ·ª íËœÈ#''Ñ­ÑX¨èè`¶ùqAF6A`ç+·Üò>ç]c}]áHÿ –Í[I*¢ÍàÎp'ŸÂ}sõÐþ uµÖ“¨ê:#©ëâ›á'a [“™¶‚7HmÀ‚yÆ»J JãèÊfá-þÓÐRÍ]MO=FæŽ3"îŘz?S[wµQеuEÆ–sIæ—ª©bG¾“ù|¡ãDëw‹Öêš4ŒSJÉ&rœ¹Ý“ë‘­;üFÛ%¨èÊk–3ÐD¡æ§”ƒ 9Œ©PùNñŸ Ôð¯Žû/#W±Üí #«µÝ)ª)ê!T†8˜Ž;ƒ‚x>ÃLRõ…‚£¬j:Q.×hï#c†?7bpsÿƒ¯“zvßq´Øèo•VÚ«å‚tóÚ*y^6‚E!K¼ŽFì~ú’ðòš‚÷âý tQ]"¡«G*ëRé2b&?ŒdçåääŸËZÇ[vNGÓ=qÕÖ®•†*iëfuRB7I.æØ9<¹‡'ì5B½ø‡Ô–»}[Wco…1RF±•(U¤t®ÀäíW!F0çÚüGt±¡²ZzŠÙ5âg¤e†i­¤ò¢VܹcÈ!½}ŒŸþ€¸ôM wZ]ªmï?×DÜ_$í)·q9LêFâŸa²ól¸·Xt ÑíÒÜ ‘ƒîÿÒ>Y”3’8çaW‡¹Òx§n²×õU}}t1&Ê|++áÏ€çsÇê5u²ABY⪮ê ÄÊwž8 i‰Ï“¿|‚0£þúÉúáê/Q'QÒ-BÜêjch-匳ùj£ Åyà `q®˜£M×DlÔúÒ^ªé‹}Eæij¨éª6U™ã,Ø)Óžp¸ }1ÉÑ×þ´¢¯éH.½?YÅ#ó"ñ²²nBC9レ΋ª¬µ='[m¯{•5LºHy[Ì;p¦9öújÝOUwê³d£aðTîõaa àc•ÁÂçœkKß¡fùÒ•¢Oaê¤XbJ™f“Ñ|˜~p ŽÌr¹ÿöÇ}bö:«ÅUMÖëE¾–Ñ‘âÃÈ•Wžÿ9=ñ’5gñ_äð®žÑ²w£¥db›ÈS!l‚Ü`óÁ=ƹÑ=[`›¥¨©jg§ ŽPH¬ªNÖ#à‚W>ùÔŠ¤ÚzŸªºÔôôWØš¤iñ4Æ.c`p çú vÖãbº[zš:¶¢»SM9I¢$Æ?™±Ø1òçp÷ ?/ŸzFÿGlé›ÏO×ùMrôŽð³,¹;N¦G ãßV¡¾RËs§’™ †]»–h2r³€~ùüµrCM„Âz›¢ï"¶ãQu?ðÚXѾ)êãÍQî¹îsÛ¾¦¼0è¾£u¨þ?W ÎÄ‹¾šF™·8uÜ  I_ÖüFC-=öÅ]WO$´9"DØT1ܬsÉ‘Ûí­7¤:šÃ5š™íUVñGO&GUxN gƒ®±)K‚h¾ÊJÛO]u•uFU‹m¦Ìu’›t‹‚”r?0烞{Vzƒ¦jz+®í” xšZêˆOÅ»£>bÉaÁŸP>ø¸Ûú[ª:­%ê>´­ò×vWi¨áÆøÕÉa€=‡cÛŸÏGu%¯¨zþûaŽN›«E,‰QPÓ¼É;ÀÏvúœê©SïD¡Î–ðIMÝ®—©¨­¦vwF¤HÙÜ-»†\ƒœ‘ªÝ—¥o—~¾êN–³u½Æ’žÜìñ$‘óÊü¸Ï×’;ã_@[jjj¬åäÿ ¶@Ï>þç8íßX¯F[¢›Çލަ‘Àv.Ü1díŽ=OÔkœ2Iݲ´‰Þ‰ðçª,=Kñ·>¾©ž‡dÚ$fó€0C2õ$ d>1Z©âëùªåºÔ]-ÞlpUVÅ+ãæŒv³3úMlž+Z:Þã_IoéëuTFVZÉŒ1ÚpXç·9©çPÐx5?ÂÓ-Ò¶ž*S(y©)SbBŒnbI9Èî3“ÛZ„Ò|¤Ã^ˆŽ·é›qðΦ¦Ï|ŽãP™Õv¬yÑ ~còžãÓ×QµÏ[Ká Šãd¡’‘#'"ÙÙä rÍ&óÆpWŽÚ¹]¼ §¶[*èí7Êšjj“ÊI)òÃ|Àd(Î3ÜjRÙᤩÐV›-Æ¥gx&¬eÔÎXçÜ®ãÉöôÓÉ»ö(ù÷¤:ŽãeêÓpš¯1ÎŽûlüÄväw]k¾-ÜúÞÍb«¯S¬žTOQ ³c1òä€2sßWû@Z-×j»ÄæžkŒîY¥•C*c*00IçÜÔ})ÖÓUh¬žf¡©‰U€n,¬c=¿þûIe‹’t)ÑóŸ…õ}K Õ­e­†®¢tÝ;ONò2¹ùWsHõ<s«ºô?ˆ0Þ+ïPAm ©¬‰$§Œ«0 ü@à‘ÁŽ9ϳÛ<ª²ÕO7OõMe hö¶#VÞrÖ;àiin’ 8iÖªYvª«¼œ³»ÓÓþ4žew‘ò¿KTÖÑõ=Ö®èM ÄÐÉ™[)d›P1%£9݆þn›ð¢›¨&‚áUg«xš£þHÉ•`r¸õã_LõNRÕÒ´ß Õs:¸àsßÙ@ÇÛY'øq隦±]«ê(0Õ!!fY±ø†=‡ž´²§ÅlÏ:/×ïi«®n•µö⪠«©òX² (Æ àž3žýõq¦†çañΊ[·“5eLniâ/ò•`Ê¡™†vž=ûc[º¯Áûmߨië骪(gw>mE:íÿ1ç‡üi»—‚Ö5®Ž¢¶õuª™XU-PG#æ9Çcéîs£Ë)™Õ™z¦Ûâ½TIAw©}ÅÑýL¸Çʹή8Ïw¨£·tô ֮ĵtÔÿ;€²ϦÕÈ#$ŽÀj; :+Z]/6óQ%®P‚wwVcò9Óžô÷ZÑÇ7Pt¬0ÕUÐJiê)^Q¹À]Äc³g$r ñ­Îáá·FTCþ K‰Ö(želÉ;O'ny?ÓNôwAEѦîöúÙdŽ®E–8³·C`g=ùÆ~µhÓ¡ÄÉO[Òݹ÷Òúäå4ZhÍcéßJSO×BñS BS%Es:¼òH ÈT¾ ¨ÛžIù:Ó-½CÑ”uëW ié‹,b6Œ8+¼g ÷çTÊÿþ¡_ü/~“§ž;¼ðšJšŠŠ„ík?~IÛävÕߤúr;7DQôÔSOÃC³ÍWù·d’ß©Î>¼{é7­½„TÿÃí=^ÔEÁjÙžxdÁX… ¸~URO~O¶¨ÝCÿRtwŒ—KŸO/ñ(¤—Í« IUä02#r›²9$8Ûìu¬xcÒtGJ›Sܤ¹LÕ9rŒ¶>QÜãŒò{“¨ë/IÞé|k¾ud’§ðªªTŠ2e™¶ <”„~zªk”˜­ßUuçJõµ˜ÑucWt…ÒŠ¥g¥? ò:œHÀìHÞºŽë>£ê.µºØíÕ[+£,Vžª@Ãñ»™r£Øç¾¶ž³è+Wqx¦f’Ÿs%D{QÎìddzqë z‹Ã»?PYé¬UóÒRP04RÀá#Ï#¾};ûg¾µTJenñÒÝG·ÃnºÙ:9iá$Ó´rÊžX Æ”œ¡ÕÆ×êˇUQPÞ* ©¤¦Y$z{c9TÚ 9%IWdàd=iôþÞ‡Ïl«ëûÕE ˜YDÊ9 då±ß€G}h \pã©MåÁWhó´w#ŒÿÏÓYY]­–™iz–ïwñS¤êìvásSÓ-W3°Æ\b@b“÷^ú¸ˆûMò£ªzz»§£–[„:¢ÂøbÑÀoÆNsÎ8Ô_E,ÿâ;¤!9ò£¥ó”$yäÿAúëU¨ ¤«®‚¦ª‚9g§ äË RS'>ÚÔ²SŒ«Ñ(Àz‹«ª¯ÖÈ:w«[øgPY®r]6ÅT©žqõäöÇôÖáÔUd°YZï]p§€íY›ƒ·ý£h9?a¤uOtýþÞ°ÞmQÖŒ™Tä…=Š{qßÛPiá½WÝ覻VK²ˆ.†˜lRì9ûcõÖ¡*½š* WÓ«×·¯›¨EÖG1ÙàrèÑ…Á’@!‰Rþ˜÷çZ½žùf»±[]ÖŠ±‚+ Êä/lg§ºnÇ`¦4Ö‹e5$Mø¶'ÌÞùcË~gD[,–{mD•û],Òç{à «6N{ï¬NJL©Q!{ï9úkÚÁFO™ç®òÊÇ×9ÿ_ÛY¯øƒ³WÖtÕ5òÄ Þl²ü\{s¼ÂóÿÔþZÒAÌÀåÆAOn}4òF+PêíÄxî=ó§¾µqvG³.ðã«:W­:f¾¾÷m·SÔ«rÔÆ ‚we†6÷#×¾}ÍK¤z"ËyñŽïK2?L@î«#cÈ’]¨¸Ugæ,~¼cZÝm¯¢owªÚ(í5D‰d˜„S"–ÁÎ5c©‘#ŸÎ‚8¢MϸdŽ3Ï]<•uì”fYà÷N_úŠÜÔÔp[è(âe¨H«ËœÃvÆwd÷Õž§¡,«ÒW^´Óü \hü“#n|6 sê2>øÕŽ úZ¡<´U”u |Ͷžã¿ï¥¬îÑGåÍLîxÎÐërêËHèN‘¥é.š ³Âþx‚'YdlæFfÜx팒å¨ÞŽðîÓÒ}MYt·UW¹ªfd¥y‘sÎ88é«”“B]VIa±ó?Ú¼jŸ×4Õ•Säëǰږ$À#Ëä3o>€4Rm½ö EòJAo‘+©Vx˜|Ñ2ï »”=G ãQ1tßJYà’zš¡÷œyTÉ»vOlúdú}¾š¤ÒôUáRyzúýrfYL.d9µažÝÒÖ*JZŠÚ׆uI‘d®®rÉ#K1fÎÑ€}¸îuª­&@/:ßÖhJúºÚ*8%‘š%¼ÏÏù@ {Ü~š):jÑÒÔÔðÛ顆1P[Êù‰ÇwaÎÉ$úéê±°ÊÛ©ï¶©ãwÔ:®[Ówa€uY¿uŸÀÚ$®¹ ¦†ª’ùÄä{qŒãžªäô4*ššÉA%EUrÐGS6Ò«ä’ÀãÑ‹NçÎªÖ®Ž»Z¼I­êI«©i¨ªÃùQo;¥  @ìÇͯõ–Xgš¢Ù»HØÞ‹O9(Æs‚>P3ê}ÕªÙj¾uONS\º_©ïuï¬o’T|.FG óêqõôqqW}™³l‰tü³Ï4aÅK`=ÁÁ1Ÿæ/+päqœcTžëúú®„¬¼ÒÚe–¦š­Lñ£ÞÅ㌠sÜk”a.ÑlÖêl¶JÈ¥ƒEž:e1J¬Ñã$(8ã¶3Ÿ]5Ò–V¢¸IW=ST,ûܲDzžyúqÛéW|?ëz©±TTÒÈ ©ŠŽªž_l7b1‘ÜgééèÇIuòuMò¾ÙnŽz (c2,“D>`¬ªÛˆåx#ƒ©Æ[E´\¯Ô–‹»SÔ^më;ylÂ6ˆ‰_òx'zéËG‡õB¾˜†9àˆ…op;Ϊ4~%[*z¢“§m†¶²ªxü©&XÂqÉî¿(çï¢ßÄ{”^/?C¬+*JÊ"™¸ ùaóŒr0¸÷ÉÔã>´i» ¦ª¥xÕÁe…S‘´gò÷õÏÓD±T>A"Ùì§ŒþšÃÆ›Å\-–óc†žš ÃL[z™-µ\“‚2r01ëïrëÏJÛiëe(ë2â(ÂÏÉ ò}äöýF²ñI4…¢óJa’œ©§ àß:œdÏn{g?m ÖúYªd¦¶ªI$ŒîþX )“ù±›_TõÏXT×Íj¾PtúE1iX+ÌÎ[' aIaÎ=ûèž³ñ÷Ò9B· „u×ùC¤±ÇÄ>Ÿ61õSÆ2sÛZñ;¡f¾—˜âtXŠòö¶— Io°à~}ûéªê˜î18‰2Ë*ul¨ÜPyärxö¹Öpñ?Ä;/LÓ×^íPÄÒÖ!¥‹m$dŠÝXòŠGv‘Ö9v–Âä)#Óéôüõ‰õEï­:gÂú†¸õLµw ÊõQ4r–hÑ—ðçS”:ïŠõ]C`éž¼Ñ_gßK GT#—1J̹óîwp9ÏqØêǵ±fÛCn†Ïc‚†Õ§‰>Hˆó»×>œi7+±µˆ¤«¢Z™"WŽ"X`Œ’úz}>ÚĬÞ#u¥âÁU]i²ÑIAN79¨—ç,Š­!Qœ~Ÿž£¬>&u×SÜ”6j "GØËŸ-wr™½µ|2öNFë%Ò(jšgÊ•]$™o¾¥ê«Ú(ž¥’3"Åœ¢± d2;‚Go¾¾f“ľ«êÃe¥¤¤£¯F!¢u8ˆeIÉ'è1ǯ×V |JëKò(ºÊ: -µÊ±¼”£1ÇÜÉ ûèð1ÈßéîK*HV=›?.àxÔ‚H®FÏ™qø‡¿¶¾\ë;çU?Š k‚û-ª–¦WGå¹TÂÆÌ›ûJàãï£z ª¼Uê[Gm¨¶ÃKÆ9k*ãæGÆ@=É c5Weä}&¬Â2QBŸÂ9$wûdÿ®¡ênT¤#­DjvFÄy䟨íù~˜e»©|N¬ëÚîV_¤‡ÍiG‹ÈÇ®~z¬õ°êŽŸ¸ÑÐÖÓÙ+kîRÈø†#Ën9²$ž- ÕŽGÔu7J6¡gi  Œ€Ò.Ÿ¿c¥¤ÑU"ÈÒdíS xçŽÇž{ñûà^Ccê™nV›ÇM[¨ëíÛÔ²eà…#¸ÁÇ:s¡zÚ½¼Bÿ§¬½9ICg¥¨>iPT¡Á‰i'Æ£ÃW^…ŸAƒÔ%Q, +(^yÇ¿sï +jnoP"ªE•””Ëž óοMe};â½ÈøÁQÒ5¡Z6.)~e;ÎÁç¾â;N}×Õž.IÓ>"ÓÙ«©bzIÙ<Ú1‘î+>‡v}ñÛYñJèY¯§ÄEBÍ$‚iU SnN;`iŠy§–µå$4ÂÄ©v•åœýÚ¬^úšIº åzéóÅ`§yaa)Ç9ÁÏþÚç„}WQÕý æxŒum¹fU¦åv.~ƒß×è5ž¬¶\U"iÚW΄…rT`dªOZRx†·†¸ô·PP ai*àc CI$“úé¬öÛÕ—ë—ø…[GýRc¶G+'“0‹&2Á`F =°u½Î¥£eL‡*B·lqªâñµc³*^7F¢‡¥j"l4aKþ=F1Ü}4íãÆ:T§Y:o§+"1Ža¨t,v‚0I#ßÐöôõÎz¯ª¼P¨ë¤·%ÿøbØÒZˆÑ"UY#L<’Sž=ižuåìú]'¸S§ÄRÌi¥’4#x>¸¯e£tŒ¦YºníÖU5ÞU륩( ìf†à$ ÿñÛϧ¯®­1– îP§=Ïàï¥ yÛ³guí{\Ú¿öÓP I Ba¹ÎvÉÆqûbž<õ·XÛ&¢é»M½hj.ác‚¥'BN*žœ²ŒçýÆÒÑ8•d5¸ùH\Omdž/ø]x¿GCw´uó]m[~ * çp |Û°rG=µ×/‘G<ðú.‘¹Iw–êkë«èÙdÞJìÉV*9ärIôýi> É?V_úîž¶{Œ¿G„˸„,Ë€8äöçMÑ\|W¶[ÿý=d³Ai{m§á ¨Q,ˆ«‚›;|£“N~úžºøSÓT(¯C_C+ ’6øa´wÈ#ûÏ®¯><ô£õUŠ–‚ßA#ÖülEfü1 ;ƒ;Ÿ`3ÛÔXèèhÉCnZš ë ‚*xÜT¶.p $ã¿®ºy_L•³æ =’ŠËâæÒÏZiÒ‹ù e¦›!@;‚sÿ¾øMÒÕ]=d&ªZšy«³+ùLvÁ‘…^8fîO¶@Ò:Ö‰-?âÇ!¥¦©QF±KnĆ) Ëü§í­¥,qµ:EO=/òþfYïÃŒûÿ›úky2i~„ŒKÆK…°tON M]mEByMR¸XÐ81œöîF;üÚ­ø/z·%½úzá2[j¢eóÔ¨—¿¹ôÇb1õÖÓkðº‚9j«c[¥Ä4Œ“TÈ[xfÉGËíŽ=½†˜êoúnÿ|’ésyËÅÄ"‹€qŽÇòúg×Qe…qÌcÅ®š~’¬§ê^Ÿ¨òië·G.Æà3)'n=$ãÐÓAèî•z?b‚ÙðWV[q3‚d‘r ìOéújÉâ7‡Ç:bÅg°KoŽ+|ÛOÄ1edòÊò3Ës­ÏiZ+M¨%h"Häp2B»?§¶³,¿ÙòÇ‚·ú”»ÔÛº†šz*©¤P³Ê Üa‡}=>ÚŸë ‹5_Sø‘A|†X©Þœˆ ÃÏÈÊpxùryïÎßï=+g»Ð-=}¾žgà•A#ë  èk´Íh’Ù·J»M9U¿~=s“ú h·c‰óï^š^¶¿ôýºÉQmÁ¦),Ñ>âˆì Œ«†$cÏVñÒ—›½¦Í- j©èÌ«$hù-Ïùsß{wƶ Jôå–)ÑA *Ç#;59Q¸ŒðqíœcR“ˆçpÂ7ó)#ŒqëÎ}p5<ÔÕzOš:2‡£®dÿèÛÝ5ÍÀc a†â3œáF0;sé«Õ_‚1v¤š’–'¦—+‰’bí89ÜpO=¾šÖmv¸àžS$(CFg-Àû‚4ÜvêJHè“Ê_1¤u d÷Àóé¨ó;ÑxŸ9ø¡Ñ—Û_‡à×õ=Uuº†dò`xT`îØíÄäÇ·m]RÀ÷¿ðûAjZ™ÍC±À¨Ã#îüÿ-\:ó¢‡StÅeµ®‘$²H„¹ì»[qŸé©~‘éJSYR¦KƒÓDcYœ€Iž=-^ÃÛZy~+îÉ[>´Ü:ã¥lT¶›§JU\)a ÂÇ3ÙxÎF}ñÆ©·>•¸'O\.U6ûž”Iæ¤/c ¼(ÞKg8$·Ûß:ûªÕDˆ n7îÈÇÎIö?MRøðuôöø‘’-¾›€’ÏŽ:jx#`¿!\>âqëœ{sôÿGî•YxŸ9Z<¼Ù¼A ž¥ä–ÑK:Ë@˜)QŸÁŽùÝŽG¦{Öo¼;»Ýo´KÓUÛy¥;WÌbCœ†Ï88?=kòÐQ$ÆfÙ‰ ;Ë㎿øÓ©ðŸ/gÓ_UÒù^{ÂЪ†8 ·‹‚?#ùcY÷Œ]'zë í–†…NŸŽež²@~rÃ<žr ïùkxónšÑðקŻëmE-PлTG+ó–/Æ3œààþzϼÐWõOTÀ«RµjÑ£àìÚ[žÃ÷k}žšÛOG4’Â^Ê–uÉzò>nß¾ŠÅo‰èîT–ê:R"U AiX›Á ç¾²²i߲ќu¯†7‡SÔu7OV ulˆ¥âŸ7 ©‚; ˆîãAÍá§Ru/QÄzªçHÔí©hiG.~Ýþ¾™ÖíY$“9dÚ`ÈÈà)Ûíûj.*ŠC\’ Ë50ŒðªÁlcÜŽç°ÔYeBŒGÆ~›†áâŸHÒÔCäSVS$ URUd`@ç¾Ö¯Û¬½7b´tõ=ª†…i©cPÁãwlžäúçV:˦¦¾õ%–ùC ?—l…ròÈÛ¢+*°Ø»ycµ$Ž5¢Ã#:„”'šóN@ԜۊA-˜44‹Iþ*'D_. š$'Œ€<¤Çå•Çé§?ÄU¾*+m›¨)Þ:zÚ+ƒ´n1ÊýG~úÒd¥¦žûS[Kn§Š¡ ÚÕ ÷IñÎ>Ú­x¿a¨ên‘šÑEQÌj™'”ã‚NžÞþúÜgòL•¢_Ã^ˆ³ôð«­W5••¿Í¨«•²ònž½¹Õc©<·T] ÞÁv¯´UË iÄGr’NKwóhý´½3AGV¨j(ᆒ6Ü$a.ïNùõÑõk U˜G6Ö*›¸ažG8È9×?$”­2Ñò·‡]:±xç%¾zªšç¥,ÞdÑ•‘Ømû㿦¬)ôoñzjÏCnžVšf5x]¿ÊüÇv{¿ŸMlÝ)ÐvÛ/X]:œ¦kk€ À ?ˆ=I “žuh¦¥ <*)c)xÜ÷#öýõÒYþV¾ˆ¢|ãÕÞu_HÐÕÕô]E]U®}ñOEÌ’m'oáÇ'°Ìèžé,þµ®ÏlJYªÃ´³MR«,([…Eƒòç=þn5ô{q’OÆ;i(ë” \àòF1Áúò5Ÿ<š¦‹ÄùÖåàæ–ÑÊ‹¨£7Š}†){e¾a’[=›é«÷†ýCâdôö©ég§T‘îblÀ8%FrN=sé­4"©!†q’5ÌÇP~Rí´d÷8ÿfY\•KbœúÂÝo©ÿÐ[n°I5%Ê ³Æ¥¿›˜ˆ¾qò¨?Pu¾tí†Õ` Ž†ÑE\``“Œ“ê{k<¿ôÖóã·¬–ªZ +t’ˆãÍ••ßåï€ žFu õ ÚÓÓÔÄïËIH‘y®ø\’JoSú}5rK’I}‰2äJkò¹Ó£UëWXôÕÖB”š±Ûlëóp<ðu;M,RÀ²E"ºÃÏï®M5Ù¡Ý{^×µ’}4=s„¥f#pàm÷綈ç÷ÒOáÈ#4QÁkFªˆÅ”c$sœúzê±××»ïOÐSÿÓ]-Qu ÄÈ"‘#HÔqŽrNI«q÷ÐqÑDÒÔ‰afm˜Œ8zØÇÓU:{!˜xetñï…z‡£1OYTÓ Ù'ŒD+†qü `óé­iÑ\mt ##:j:tÃÆw9f¸ç=ÇÜŸìií£qoR1«)rwA‘Ö4.ä…œ ê½â5ŠŸ©zB¶ÓW,‰K2“ÊüGc+ŒUö:±w£Q—ê©éiTÓеB³*¶#/€N1´sùö‘ÓÑY ÑÊ›– e²–•(¢^ Žë#É“¸œ 8ÿbÖÌÂ2B‚ás·>¿øÔ%ž¢hé⤭¬2Õy!ò6í8<€}>ÿ¶j™ ‡ǺbÄ!Û€rÙÎqôÕ–Ù™+éš™Í<{þa*‡'œ{ú ýG¾š©€ü n‚ž]Åv¸à( .þ?'«Ë×}8n µª ‘Ë(Ž­µØö'‘ŒßmJ-Òªj=ºêÀFPl¥ØBœ‚ì½€ïë«Å¡ej‡¥¢®êD»Üë«?‰G&VBÊWù Æy8wçè;êõ ¬”G5(@²(+$ò–}¥G;@ÚqÆudJ‰¡'…#©‰¾QS†$8ã;X÷ÏÐæÍþ’‚U†Õ ªà?¿ÛI;AY¾ Ê»Ô)p=Çš•€¤öœdï–¹i¨d­®+GMBY$‘†Õ½{j‘hñnÁpŽï:SÔŠzE…j­Ä•qÁö>š?ÅeâãÐ׋E˜:TÏ<~Jãzî Sßqù‡O}g¾õ͆ŠÉGi¾K ¾éo+ ©S FÒmo•·2Ôk¬ œ[#{µøÇu¸Ç~þÓ%e¥ˆ‚Œ‘©bæLg8;žøÔ•'Ž6)ºYê~ÇPÝü7 ·ŸüñŽ{ê¯Ò½MlèÞ¿êª+£y6ÓÉUKVÊn9$˜|ØöÈ‹ðK§©ïCy¹„3ÛéOó ‘îWrò”žØ@ ýõÕÂÛD¶7oñG­úϪàK]-2C"¨§™œ`'=» jGźû¥¯”•öËm,ŒC¯”ï.9÷ +}ñ‘ï©O顃®ü@¢¤’4§ŠqTmâIÚ}°}½´?ø²¦2[luQÅ+j\3¸)eRÇn@àûj®>E&èWVø¡Õ?Ðý#uÓµ]Ô¼Õ[Ô3ÕÁU×¶~º›êol?ôÕ]EžZÉ. O™Hë0q»æÆ÷ýõCñ­h®=h¬[uL2ãe_›æBX};>ÚѯÝY'†·*zB—*Š$.½•äwvõàþºA$Ú.Ⱦ–ñªOÛª/Ou©™%Œ »¿™´7 þµ^¶øÇy·ÃAYµE'O\Jyá.$d…~~pXc$`Æ5i莖k/…S[oI'Äü%@‘gi3¾ýuRðkÃÚ^±é*;¥âé4´t’¬qðÕ˜¾FIbGät\6ßV6YzçÅœ·Ñ»RÎ×J¹Wl4‰)Ø3’Ï`{máýoTA×ÖŠ‹ä‘ùV–‰ÌYÙÝò3†;sò/lT¼^ðⲇ¨£ê ]$·|ÄŠXc ®1žàgÜLhË-¥/)né›é2„JˆæŒK3‚ÏoqÆu®1ã¢nÍÚžHÌÕq«NëLÊv¶K=s•¦²Ï¢¹QõsÝ-uu %9f9@r~F<ÛP]yÔW.¤ñ2 ŸNËz«¥§Š±Bž5d‡ËŸ˜†#õš¶_î6.«ð¶åsò‰VŽvX¤„ƒÊ G±cÏ®yõÔOøk¶¬Ö´éR‰;U*»”;‚íàŒwÈúd~{T“•l…óª¼e°ôíGKo¬ž»ÍjhjQá–‚Ná‚p=9úëÖÏúF³©êi%=’%D‘ŒÈËóÔA#=ÏpÞ­Ò÷+_Jõ·TÚzÕYªîU*®|º¼`œ.â8xöî=5_µÖt¿KxÝq«‚¢”Xj)ÊSÊ3$y;€ `ƒßXXâíQmšçEøÁÒ÷ê*Ùe4ME• &óD¿æù{zßQIãuž»¦.}ACo¨Ûm©Ž1 ªJ²d) 2ü­‘Î25—ôEž^¯ëþ ®µÐKI`¸E=”ÂÒvÙÇ<àãÓßÜ´é±èÞŒ­±M=¾®Ìò¬ˆêq)Ë/Í´sß×¾¯‹*Íê‡Ä›'ÿOÏ]T¥¦¨ÀòžPÒ³+²•ñ$vã“¢¼:ñÛÖ¦¹SF"  IüHàr¦=Ž{~zÆoVƒCþã†uþrÇHÞ¿2ïŸ#ß+ŸÔúk Ð}[eéÚ¶èŠÈÞZº!ñ5*˜Æ¡L{ë/)ÿ¢Ù°t߈­sñ6åÑ•6ä§° ¢©çÌÎÒ£õ;CDZž)õÓsõ'ÂË[S桇Í!K¸Ç×hÆ;}u†xi¨¹ø»_z­§Z …¦®ÜÛcŽ‘]¥sÃ=ûq©Þ¼¿×ø£pk]¶Éu’ÁNÂD4ôê$ªp§ Îä*($`ryçR_^ÅèÔ<êkUô(¾^)!¦ 4É!$I¶7rI!†3þ]f]OãæãÖ½%IÓ¶¿&ž¡ãµ˜3yy÷ qÀǯç¨ÿ z®÷á•zôg\ÒÔÐPÎ ”ó0b NyÔ±9#±Ï¡ÔGYÑCEãí° ©ïq¨y¡`X ÑSï‚ß[Ž4¦í‚ôi~]:{­¨ê¤¨é5%]¸GJaÇÊÀ‘Çáa¦µê :JT¦£¦†ž,q UÕ/£`¨¡µÑùOS–‘ˆi%ÁbO Ãï«ÚñƼÙr×F‘àÊI+Áö×uí{X(‡$c ['Ÿ]{]=´ÙÞb`>WÁ“úî"ˆe‰ÚÉ<ŸùÓqNy!ÚC žÇíôÿd׋¦k»ÉÖ{_QG& =-UA…‹ਠG´ô?Kô½§âæéúç¬z¸XëK•PG ó¼žã±ÖÜR]’˰ ö×uPé;E¶Ë^"{•tÕ³eHç«’@W€[‘éëõõÕ» 8\òF@ûçYjŠ%˜í~vð3ž;€?¾4 T‰W5<’ù•rüDŒpNp#€8ûèʉ¢‚–i#d³°Ur{išZê*ˆÁYM2¹h¤sÛ±ìtØ)*dŽZ‰g’hX²>ümb0x *édŽéCIK]<¬iœJ²ÄíÀ 2²‘ƒÉ÷î}õ#,¢*f–$yð„ª¡ÉlÙ÷×YÚŸÌ4ûd a úŸrùÒØ(–ïº"ßSG==©KÒíuy™žEƲpGÇ:¿ÂÁ“ 0Á#Ÿ¡Æ¡+ú†ÑO|‚ß-î’–©á%`™€dŒ`äF÷ÑKí²Ü^–¦ãKXˆÈ‘Í:¡#ÐóØgŒŸo]Vå.É¢@¹3HªÝ‘Hã#9aØ}´¨Ü˜ä F0O§ë¡)jUã§™¤G2À[z‘µ»yï¥ÒÔ Šd*„ìÚ2Aàð1Ͼ¥,IÓƒ¦+ ¥«áj¢YUÁ;X{cœút³$hî`q¸žùíÛöգĉ(n®×~•¾Ð[rR©"“!q”ÎAÎ,{êÆ-ôK,+Ò'©1ÃQ NësžTØûiÊn–¦¤¨iè®WX ¨YTÕLÉËŒŒpN…¶u¥Å%h-w¨<´ÞZª…âLgþãÇn~Ú°ÁUÓIþº©ò‘s+*Æ[Œûj9.¶é*c¦Y°íÛä ¹¶Ú¢ ¬·Û*™å¬§§Ÿ!re@@Á$r~çP·nˆéJͱTtí¸Óò:ˆT9Ú7qAßé«KX¢yÔF£$ú¨Ù+¨«ª…$M!“‘ŒD/Û'¿m~Mm¤µMKEh¶SSÓĤį•#qíÇ|}ΆëþŽOÓU–Ȫ~z§šFPÅT0ÊéÀûd}u=fšÜj,±«Q™—ÌU݃Î2>‡·¶•y¸[m5jjš_2u ’?=k“O@€¸ôuŠ«¥¤«®zCqìífØA>Ÿƒ?–§)©hèí«AONÑÓS2DˆF20Ï׿ç£&P<ÄŒã»àžlŸ®š”ÓÓ<Í-RG¼…]Í݉Ï®¥¶šN˜é«}ƦéOg‚:º‰6O2Ç—}ØàŸlàþš†¢R‘Ä‘¦F€í¤4𬦚j˜Ä¤†‘œgÛÛ;U+#„…bfã!¿oßQ¶Êv²ZnÈ‘×ÐÓÔ,g!^0ppß: õŸ†OÔ(Y:ƒÌŠ+U¾VHÔâBèìÊéÊŸÿSï­*¾²–‚z£œüªKg\·TÓ]©ż!aÛŸ¿û{êÆrŽÑ(í<ùcwWóŸêtÿ9éÓ îNô\‘@í¬YDëÚöƒt¹om“ÓÏÊ g8ýu@Q IÀúC†òØ!ù±Á>úY8ûk‡@|¹þ"ú~ãiëë-âã}¨©¦¹LB¨b†œ+ dR;|¬0qèu'á}5ÚÃãI[.5SÛþž­g—$f0Üg»oOLèÏña }7AUMM*Ôƒ,#8)•?„£·ÓWO :JËb—¸æ¸Õ\nÃ2TÔHwÉÁî001×ôö9ÿĬÅlwÆ™ú’Ïá•}ÊÍ0†®<ù<µgò‹€Û¦rûs¬FžíÖXúW©¨ú’ªå5âc¶’\àH®LgKŽ=?/¤ºÞ•n}7x´8|E±3$!(Jœ “’Aùkÿ v;eæk­ÞZšŠÛ-kCI ü¨sµÃãæ,ÄçžÚÎ)%Ú±^'UÔõÏt=mÆku¶‘–8Ï2¿—¼;ƒŸb}u§AáŸI-†¦ÍôËM4ñÌVVe ¸¾GnO‰ñgÃúƒ¨)º¦ÈÑ¥æ]ñÚµ;{dúcõ–¥ëO('þYáÜõ«yqMOX¬œ(Æâ@÷ž8:ËwÁ{+Þ u}þ—¬î^uïZÔFO"®F;ÕWГÎAävöÒú·Ä[­ˆÓô5ºØ×i&Ú‘¥|ËnÌŠàŒ¯aSÎOšðÏ¢ëm·ûÏTõ%LFõ_[‰Rœ)ÜF§Œƒ¹}=>çR~*xqoë‰)k)êš×w¦Úa®ìs€yÇ$v#ßG(sßþeÝkïUuãRSÛ¯¾Q]"’"²P¹¶áˆåï÷çIþ'\Ûâ¦ê…–Ë5ª[womGøIá%û¦-×ÊËtkVKlˆ•“åb¸ÞãÓZjtU=³Ãéz*ÕXªÓÑKOEC–åÁÉ8í‚0;jsËKtu²ÇWWO;R«#:DFrä_ca娵±F Õ)ACâ­³¥®÷Ùí÷ÊÄd©,Ñθ÷'¨îtoSøIi±tíuâ Ír$4²¹p»OqÎÓÛZ—TtWn»²õׄ§ÉKy>RînÝŒçdûv:+Å*a'Aݨ)f¥3UÆiéâ œ¶ß—$ã°b~Þš«+Õ1FCÑZzƒ¢a½M[^òUÇ •Ù›&N~n==}W|¶Üæ{‰ƒ¨nèé§@ÑR8äå v#Ðoýl©³øuj²ÖŠ*I"€yÑ4¿0ÞI#=³–#徭½wèú;Á¸%ÓÔH'_.`ÀmÜ#Ü·o¶u¯%©lQD¡ÙgñÍ`»ÝîB^Z—Ÿ–1g;€ÏÐqžÚEâ–ŽƒÅªZN¥¹×Èjáó¤så¡VdfÈ!—ßOMjô°¯ñ"‹©«Å9’ vH–&ù’0Ão$oî8ãéÍOƺZtñ/£dGQK#$ ˆÀH0x#ëï­Fvëð”{¦®½hÞß.Æï1Z Ê”Ómóù9ÌÌ ðWœãñ}ôwð#à³´iSU/Ç ¤Y7yþaR¡HÜp½núÞí>L¶ªzi)"‚"vª6Õ »JþÈvÖOþ zNËe蛥Π%uË %Dqt%‰nÂuˆM9WéZ4O å5m¨–ó=|⑼“*b°¥†NNúúêÇekª¡jk&‡ËbÀ£ö矾ª—§¬•QÑLˆ”1B ò÷û}½õw²ÝKr`¤*`gœdÿã^yÿfi ªŠ²‚žj™/H± b Kž4]b=™*¤y$^âÅpO>ÚMé[j%¼–ÀÆGöÐ-ç›PÔÓùxV\°ÆW¥®Ô¾Ï#9äÜiþ³ˆ…¡SQJüÙÆ@í£®&žITSÎ_ñ£»·8Ò嶸L5“Ë6Ò@Ǧ­ì~ ƒüã`Çœ…@elÓ>¾š?¦§ª­¢¦™¦RžpÙO§ï¨[ÕŽ­¡††™æ-!r®AXÔ Zi­©Ml4ô²E‹bHG#U­@¸Í¢d‘Ã` ãƒõ$hþ¬¡øèRp&ˆÉŸÄ}Húi»WLQE‰*êeaó“•R~ßï¢ë:r×+Äé Ó œ]'§«BÈ ±yS’;zéW ìs×Ó¢cÃe£e+È> )‚Eüö¬eè3DƒØúqÇ?¨[»FaÅ!ÌUòãòÈã÷ÑMÕåYôÑÆG)³'õÓKt¨Þ))×o 6w8ÔÎéV02ùGr6î[åý½¿-C]`âô³Áo§•Òeiä†ùÀÏpM¹(‹^!lÊÛV%@ÞÄ’×NQ[,ì«$0£DØuù‰çóÕZ Yi ’ÓÃRîT¿ó3’@ñŽúòE4sδ4Ãr¶˜w==ûcGQPÙ*üÉ)a†C¸‚;ùkÓÑ[i!šy¨¡!{áãRÁhjº»L5”4ÑÊx1ðqcíÀöÕ~íáͺõ~¥ê[ŒM]LUiàŽ£C´åXcœú÷>žÚ¶¼W[r,9Ž%|â<)S¦â†™+…»ãë Ì»Ž_¿Ó·¶´¤×BŽÒÛ¥£¦ MM$Œ #Íózj™âÇOÕõGÁ[kÞ¶žÔ¿ÍªH%EYXÝÈü¾Ÿ•îC¡i뜌ü«# vôãQö6 »VÍU3Å,€æ8òAÇ#ë¤dÓ° ÒôÔÔA(­©)§‚%F’aPÆ1ëÛ¾­1¶ÒIF\1ÎM qª§ ¨€ãó§;…ÁÆy9ǦuËÅi¶R‰„&¢F(Ðóûk/`-œåNß“œŸé¥I$ÞX)ð}7q®†¡¬Ž¾•Z0¢UdÇ*~ÞÝôªãSWOUJ©’96.ÕÇö:”PÁZwãúè«Éߥéä ÓÕI•EsÉ9õú `“JHånd‘‚T±'Ÿ×DùGY AÆ8cAÆÕtР¢ª^Áj§Ó>ß]q»U[ª ´éðó><ÈÛ🮦ÙI¯¹K–8p3‘®í Äp{3Æ…ê ©éi#žò–ù›äz 5=ò”E3Âíç,e‚²2GÒ˜ X–2Ñçqv>žþÜé6ø‡ÃS•¶¬*¹úØóýãAôõʺª€=E&e‚êyþš.´™÷ANÅ‘ˆuÇ~üi°ÝMt{$ÀÃ(A9^ù㶪ä ñÃñ8Éü´ÔjyVD–1 Üè竤Š,É"¢žtdŠ`‰xY\HK1'Ÿ·}-žmòcbîáHÉÇ=ôÅUê‘Pšqñ X +~ú¨ï1[¨â¨c’I\!RÜò=¿-)”zÛK5=OŸ4™g‘ÎIãéØhã$æ^v`àÎqí¨;ÝuzÑÁUo¤g£>ÕÉ"PŠâL„ ú¨úk² bÔWÈ"pIl£cží¯O¡ŽŒÇœìB„*}þ£í¥2„SÖRÅ †ØÈ^[d{cEšªIi‹|kc,±×­“C*nòDnÛJµV%KÔųi†B ãQƒÑü6Ù*¢Å†Iß;4Ùš¤œ¤Q•=ŽãÈý4S;–8.>R;é'@.'FN̸üÇ¿õý5êªhç„Ç&Y_‚8õ×P ÙÇ=‰ÓpVþJÆY²ÛÓpm@ö[}%ŒÒ‚¿„±ÜséÇ®øùiî0Ãz‚@ÿ¢ÛK >çº1í7G©YÚêŒéÂÿ'žüiú‹m}U3ASY ©ÁCεd$ÕÏ™·o#×U˜-±^zž¾¦¼JVÃc|~_¾Ž¶[n”s(zØZOá*I#Û¿~áj‚¦«â)ꤤ©–ŒŽ~ãQh¡ZªµÉL¸‹ ” ~;j†¢Jî…—â2År„óÃöÿMI5²å4m MܼL0Å"磨©h¨bôèvþÄä}´º@Ä-µ6x‚y2DÑåÐß×?\ééd§Zxi„^{®çÀçhÇ:cøµ4ðK <¥@Ñ6Û] ¦Xƒ íÜÌIØihWæQß).{ DËíÎ>ÃRQ\èÞ¦ zp*«ËGóyVƒR’yRÆÑÈ¡•†# éÃM•†8ã¸UÆ— Uí¤­¢’v ñNÞSí¡¬mtH±×SFHM¼Œþ/m\cU@ ªòªãJUPŸÉ9ί"QUÉ‹­JFл1`È¿.Aàóëúè¾®·­]4/OùDÀªw?lê](éã®ø¸á‰de"GÇÌݱΈ—s'ÊûO¾§-”VÀ@ƒß¾ zFWøZÅw’B•x$‘ÀÔãüØÁ<éSRÆc¦#î zŸs©zk®üÓnƒcȇvKœ®>ú ÿËXÜɦ²‘À$°ü'Ôjå=<!ELi(S• 8fZbŸ4Nwe•ÆG?ÓZRÕŠßCÏ%UÞâìÃËæ(SÛ,ßV;Üq›UNì…òÉïŽÚí,qSË&Èi¡ fN7¶‡¹Át.'‘¶¡eÚ­ŒŽ;èÝ»)ZéêÇ·­ÒÛPÁÉ`ñIŒ6“Qsjާ·§x'‚È„w9ó«%øš*:€7€@sŸCÛJÕkQ˜Œªy‹ß@=õlƒkC¨fU3(ÊŸ_} Ô”QÒŠK# r’w wöüõ1s¡‚¾›á%œ(8+Žƒßû÷ÐÑY#h"‚ªµê ‰XØ8÷ÔN€/VHŸo¬Ãƒæ+/¯qœjG©$1Zä˜I³ ¸$vçEÔÒRÔ,k*«Ø2sØ9:G2äUeö##:–R²Ýðñ-Öþ|Q‘°ÒU Qqž #"N»¶žÊxÿZ&dHYäpˆ£–=€Ó*±É É +.2ý´½s¦§¶õUMˆËI;ƒ¥'HYèz~¶¤IGAædd¹R ç×íí«Ðù©¶B®Ö;”`ûh…„FÃfÕì¶«‘(ëzxS¦eP"¦Í¸8æï£,LÿÀhAc ¯'Ô tl#øù"XÉÈYÁa÷ÓB²ß[E]8Ã ËÆ§ª)XŠYì}UWSWOPôµgP»ÀŸO¹Õ›ÌKÅLQHÙLbFB2Hî3ΈŠj9ÙéŒmùqŽ?=7ÓÁC$U&cËŽ1íôÕ’¡G1Ì¢qŒcë륩ÄB*31³g¼¾Àâ*4`£n\psœêÝJµÕ“ËZ¡ÂE9{ê^1íR$€{t2Ô,ÑÈð¶ÿ,ãwßYL¾8Š×+fÆ0¿q¥Ò¢MEhÆæŒg#·´êưÃå¨$}y'LÍ'“˜ÌWƒ´ûñ é0ñRMNáƒE)OìiVY#{¥Ê44r œ}ÿçFyÒ­@RÎ@Î9õÐô”P[$ª¨ ò5LŸŽrIÇõÕžLoR¬ñ'ÈÙçßAY:©¤(PÄrßïÛRRI²¢% Ї$‚9ƒ šÔú×c&ì®N?ãD^Äû]ERSDÈŠE^{CÞmpÜz\T¥8Iö ÷*3Èý5a¬‚:šsDK4N½ÀÈüô›\”ß ä ;J¨ü<㾪tôó?ð:‹À…WôÀÔ}*ÇV=ä:عÔê“7Ôc?O×DZ«^eŽe1TùJÏŒŒqÜdsΊ\Œn<òÒýö$ÜK6G§÷×5Ù ldã4É!bDÄ öÚ8УêÇ=µêª˜©a2Ïò®p=ÏÛ\\&¶‚ ñŸvþx?}@.–¦˜D°ê}±ûébPFJ0îGÚ‚­¶Mh‘«í¬í ¯ó)ûägÓßNÒ^^ç¶;Rª¹ÉËÚ/~?ÌsZú™®¤GO’NË»?µwþ¸Ûû:‹¥éêHnbá$²Ï6|ÃO¾=5#q«ŽŠêd è=O¶£ü€¡ìËù%£˜V q¾š¯ÓÖ òíY ñFcÆyÏ®G~4Å ÊJ ‹Æ$ª©¦pÖ§rTöà^$²Ï°øy']Qr¡—#¸Ï:«Þo3Ë^´ôÉ*Œ1^Cóÿ·í3qž—tf––ãª~isï“ï«ÄYp(€·•À?"÷ìǶuÕ;®R"FÃbG¡ÿms«‘Û£Í$Nò,`¡ .IçRŠSWkЍ%C§˜ÀsßäŸALYä#;·qGÒôõÚYä$ ±«dç^5+A)z8^¡r )ÁÒঈ@¿Ë@Hà Æ¢)a5WZ˜'Dd„Œ~¼jvRpã ƒƒë i–X›{«'%€Mv·ÇÚ´•”+>r6éêŠJÌ*Ó\Üq¹AÆ€O™x°Ä®œ ï_›Ô{ê¯ÓÕ—s­3<• åe 0Än¡ãë¯%îJ‹¬2Ï ¢‘Fä(¤Œý}ûéÄYf–"ü+m``iưü¡TdäóÆ ¹Rl}•(Ý…ŒFr¿MT®×K½}]ERT”c·hH¹úr5T[%—(ntÖt¨‚I”`€yú-‚Š­¢,^W装%¥š+%\oO‘ÙW'¶O<óHÓWÖ½iZ›|Ñ#œ+V¶ ÇoßJú‹ñÉÓ~l÷ir’€“Ûp>úá%ŸùÉ·lŸ0à>ú… ŒdóßU]u-+5\Ë3m {gMä2e‡œ{zéRd U°r.tÛªh¬PSWS¢• ,æO ÆIý†•]G@”×ZeÚcaòÅ–ß÷Ç®‰kKE,Ò[ࣃ̌òcÉg>ÿOÏRf©bE‘«’8çVÒ耴÷˜V—}\0:œ009ê8ÑuÔër¶I ÈщWä}¼©ô8:$y„wæ$ÿ»×Y)_´Ô×ÙSà.PKQÿéÏ nÏ®¥©«Úªuò)&Ç,‹°°< ™ÆF¹!)Ç<{}4nÁv†jkÌ7J9ÙvÊ|ïöÑðW¼äè*‡¹u æO:\P²ÆÊªcÉ.ùcóÓ+un¡­\öþV¯`E–yo”sFÉE>aŽGï¥ß-PÝ©–)$tÚÛ”ŽÙúéØn0JÛvTF{üаÿMŒ¾^å'çu-€:X«`…)‹G(T»±Ï×OÕS‰é&§,G˜¤÷Óì;ýuÂOÓKU¾y-Ô¿Y  !º&àGå§ëã7+yŽ é—qÛètx Œÿ]$º:1W ‚Aí¥ƒÑ ‘¢’ª騛t5~|F%3’˜<}F¥É‚?m1ÿ4yƒÜ(: d§’IŠDebIÇ·×J¬§ªëS ñå€êéŸSÛR|AÈ#¿}q‹Ò9^ØÏï¥ã“Ëc€T†—úè*(¦†ã<³:˜È!p;ó¥U»S˜‰ÜHÛY•¿ ôãE•ÜÊK8÷ í@‚XÞ&=ø8\`Ì8ŽxÀ;X¤®1#’¤’gNÂS¼)#Ô5Ôi)§Û<Š]½‡AÅo«§fZJý‘“Ž›±¢§«dXHË1À8È϶Ÿ*X 4T‘J¨ Lë3Œ 5+½Öž°˜Ö8—hÃwÏá¤')0{6Ýrš'‚Z¹¢tÉ<®4AÔ“‚=µW$uôf1$j»È}ËÛ69UCƒ‘¥G"ˆUOé¸fQ)ŽI VmÁ±Õ’A¬Gw˜.?Ê5SMׇz¨š@«òí'äöüõ1Q‘ ¤•-ØvÔD3£Êj)䉜7Î~ú  `žRåÚ>PWñ}**†ë5ÃÌlÈ6l €êx× *T‚Ê¡öäŽ=4ìu&l…\7$p}ôªeŽJ}†7tq‚e³ …¶Ýb±OpYˆSùiW&®§½+©Ž7ãÆIùÎŒœ/çÈë^_ÌIÇï ;M*:•†2‰áTŒ?ñ¨~”’V–¹ä…T5G9'>üqõÔµ¹¡hÛáêÉ“ÎàNtš©)­ÔÎÃçv îtü.vº[‹)˜0d^ú ¾*…©—̨’5ù ‡ }µ'¿åFËŒã:b"—5 ª=[·~¿mK`ñhõ0UE"ÅQ‡sÛúiTP])®ª‰—o)x'óÑôõ º¶Àªi#D"‘ÁÁà}?}GZҮƮ±^(Œ–SÇ<ñùi-õÚH^º@È"§¾t=5KÐNô×Zç—r.Ö‘v¯ØΔõ õÕŒ[éL®'Üm_|~zœ $–aÆq¦"žžMæ9b`@ìÀ;±ÌG–ÊûÚ{q¨Ák¶MGx­©/§¨ËòNyýô)´VÒÜZ{UÆ:zwÁh%xÏÐçX8Áíô:b®X©<­µKÉÒØE Éš¹£šGlü©´(ö»ÙÚi…URÓT)'8á¸õÔ±Uõþº` Ï–jíÞàDÀ% Íœ|u];Ä ácB ãÔçEJo¹Yp9ïé¤n.eÉßÛv24òD±‡ /ÎN~cœjÖíŒúhd§p€‚0¯Àûq®TÆÓü<À´{IÈÆˆ 0”Ÿþó¨bbÙÊ2áˆçýtôj— s¦Ð†Î888ÓÑðFŒ]¯6ÁЉ>r 9?Ÿ¶ƒª‚û-©£¸F’íÞ±ƒ)õÆu Ô)F:»áîE¼Š¨þWÎ6ð>½¿}LÓ”òD¨•÷(‘—P@Ö©"Ø.•öy*g¥òj¢Ü®„ éŸM9Ó— ‹•MQG"¾Ò«œ~ÿ}7Ž’³ãk È1óÎI:÷NI5Tñ‰3˜mÞý¿ÓQ×¢\î´ôLÑ’$›hÂý}´4ÕwšTø¹à§z|e’<îQ÷õÔPGOOÖk5Ę©j# ’»·íþºŸ‚ ЕºÔJª?ÿ~üêÒD¼]EL”Ï9—?ßECUÔ¾t §#‘ì}ˆÔ_Q…6hZc‘H8ÜHÿ]Ya­¡®{®¨âAüÊv ¢J/Ò÷oâôNñìt”¡^ý»i›ÍLÐB²+Èj™ñ)Çõ a‘)«§‘J¤Õ  ¿M?pARCY´0¡©ç¼mÓAtìP‹kÈeg9Ι¦ž¦ë:ÆôíM\͹s¹½úkÕÔÛ&jŠf¨‰ÿ*pFtüÖŠIê’ØrK;þÚ|4Ò^'E‚B˜Rwlé=5,_WšV†6ç•ÆÓ—ú:–®¢¬£]ÍŸ:çÞu}}©êàŽWzã"q´.4Ü”µUTˆªB—__÷×.L†Vòà°#ÛvÔÒ-®Œd¹\`ó¨QQR==¼ƒ(y ÈíÆ£¡ºD¨«X Ü>r?Ås®h€Ú <ó§ÆÙÒ"ù=¾ØÐóß,ôï²jèä]P9p·Ñ\c YN%±=×ì}4=Ž‚Â#Õ2¨ÆÓ;û·‹K u®€©ìwi±{²ø³rH?®›T´”tÌ 0ÆŽF7woÔó¥RRAM$òDX´Ï½òsÏÓõÐ~³nPµÐLIÀ¶ãžÞšR^蜰T=DDÔjS•”Ô•‘yUpG4yÎ×PF}ô4V«l2–Z8ÈÀÛ¸nÇÛ=´ÜwËk±FYãã?Ì€?¶¢¨‰f@vÆr8ûi´Ž€R£p1ôÒ²Xr4-]e#{…BÛ~þÚ*šXj!Yb`ÈtîÃ:Rn9£õÒ*j©©@ó¥D$dy?a¨ê›Ý=,±šˆ'Š9X*Èé…ÿ)‚Wnà¼ãkÙlð1¨ËÅuUºuÄOFFr;[]Q”â–gIXääÈ(.áž=s®30ˆ?Óõ-OØ„mPüDŒÄM1SWWKeøŠ‘ TóÊg:PˆHc²@Þp1ÜdãöÐÕPT¼îËQµs ã¾‘w­®£·ÃWÆÃÊ×DA1›l¡“Ê‘r£ãÔê¸ š™IŒˆÜ&NvçúèÄ_5±ÚTúCÙL³ÕU™™œñßî{i;³PÕG3ÐvŽä](1ŒĹ#ÜÜàsöÐ7†ËY©£ÂÌp®;O©úöÓog˜ÑÅR’ŸŒÈbÆC†>ÙÕ¢´±ù³3€ ¿ü¼íõÓ´ó,õÊ®ÌàóÛûÆ„­šH)÷Mä–}§ °ñ¨ÛÞXª?û€í͈äcÀçÒ´ ?Ä£±Ž7Ôý´%ŸÏŽ"g˜±É%ó¦J@q#bTägÓ·§ï®Ü…tW8L)Œ® ŸÓRŠI$…•‹ú9hb=~P9È+ßûçAÝl¶ÖGDBXÁóØý´‘j«òQ©®ªŒ¯ó}¹Ò€|©?ÁH)ŒAÿ˽x…ïÀ–š 6 4Žî°;Kp²>ͨÓOI5}=JÓÇR³`Ïsï«DŒÞ·˜´±}2uÉ(뤩µT Âùy[ÖSÔPJcyB‘¦íSGUbCæJ’¾ú… §­Ši¥¨­ÿ „À\g]ެ½CDŒg¾Úޤø«el±NÅè¦9GÜNÍ/(aBÊÇ‘æ;~N9Ò€ZÈ]ˆ ¹^u}Á–?›ÿ–‚ÌZG–yåäa’ç’ÓBOpŠª™„•­Hçð€qnt IîœFKF7cßJ û G?í  Îm²º)ê?FIÏ}5Mñ‰u-<ŽePTŒc'Ðo®” 6I“k`lä}täQ±l€`Ž#:c}d‘D[3~-£?¦‡†ã$1A92—F‘ô:ʺµ¤UÌRºã´q–Çé¦ÒëK·,³'ÐÄÛCÝo±PÕˆZ<tõ}xKx«¦*ÊXsŒä(Sµ)˜B~[ ‚~úë¦d"¤5 ÝA-\µnZ¦y¢ˆ‘òƤçôÔJÁc9ÇJïÉÎ5Q–ö¶zØÓÌžZy[ð:œãéöÕ¶°‰eg‘ %Ø ²¢ó’3ÉçKnç@Ûaîr$'±ŒÁÏ9þýµ>AôѪMöÒu×:Nt¾¸M+ä8öäœàãßH™äŽ"ñBfqÙŸÌñ§•P!Tü\wûè~« ¶TtåN!¥Wr2¨È9ˆ÷Ѷ:*E´Qÿ"e‰~mƒ9Ç}&ãl¢keRÃFÙIÄkóß®ž±R­=¦ž9#!ö Áù#ý¾Ú· v®ßmdfzjuµÂ€ÀãÐè•’ß"Hè̲WòÑsZ©$–IÕXÊɰc€Gm7`·IBgyã… `(Aú“§ =Ô‚Î軘(eryjÝR§<ø¤RDD¡‡E×ÒÅ]LÐHÌ»‡ §i«}T6ÿƒ/ç)ÎâWΚ DÙ {Áñù覊Y 8ÙõäjB.ÑTHh|¹³\S¡*:jäó)*ª(ÎsˆßûêV‚Ž:@ÇΖfle¤lž5[D+•TÆN¢™ªê—iänTé©*‹}Ú¨€×:i)ð8j`Ü^ýõ-Q4ë²x’@;nƹMOKJ›`Œ"û NE£§ªUe¬¬J¥oO$(¹Ð5NÑ%D)pd*ŠÊ öýõ%¹w“Æ›¦Ž euˆ½Ëž}N #ú†ž¼É}×z|æ"2XøÓ5ut×»3À¯åT-Æaé©¥“æäñ¥¯—»#=έ‚ ME§á*Ô¤62·ã7*\===-2¬xܸ{ ^ÑÍX”70G r£8és³J I(€`dŽt°DÔÒWÒTŠÚHÔ| I|¨O}z¤TÏ{£&•¼²„¹Ç ß×R”‘¼ $“4ª(-ÉúçC!¯ø—L,N캶@)ìõÔIðmšY?DãôԔ沞†( ¥2>6àëΞª:bvòÓr̪¹ôä1ü^ÞìvV@NxÄËÏ·®¦ÙAbzúˆ˜V[¥óЀês£m¿ÔþUT £8Î{ŒkÑU<†äçe`F{`c¾…·\å–ɹŽO-¹ÎqÆr4~DôИâ%Œrv&ÜŒõ2ÖOÍÀRÞ˜í£!Ü ñˆÎ? l{Ív®Í `ƒï©`Zе«(^4fuaÃ9$—…‹$‘/oÛF<ŒvöÓ53²"b‘°þ§Øi` d+o’†wÝæå‹z"’ší ÉðóFŸ*?bŸ ºGS/‘*¦™Î~Úf#.yÆ­° SNÆá9•ÊŸ}GS5¦:vB$çÕNOûêw™Ô°BÚ¨+¡¯YjJ2"m ­Üzq#¨ âëmG+)”yŒdw?lêqŽàDÕ^i’s ´u˜FåÌhúTÛ`>ª:žH· ÄqŸM%\ÇG!ùÔ`•hHïö—ÿT©é‡.tWž$…d§Q"1á—F¥0@Yi*ã¸×Í$, ’PÉ»Ôúð};k±bÒ*6ÆM­òð5hƒ(ÀÇÓjRÝÕFAç#¸ÕäÚë\N¯-"¤S“Ë ‹Mœ‰Â¹'%cSØñ©穌T´¡J«ÿ,(9#ï§ü×øvwDÈ9<ãK`‚{ÝãȬó)P0èAoöТýXŠ…¾>a¹IeôÕj"šs‘Ž#t!ä(@G¢€5m}f1ÝhÞ'¦x¸Êy¨88ï¦)„±C-U¿Í ¡Â‚îu%çÂbó „;çJ’TA–Éǰγ`(iLrÃä$~g}ª8Ó”µ´l´þlRS“¸Ã颖¶g\:”€–’Â)ˆ,Š 9ä6N©‡Ø K·†Çé¨ -TT¯"ÜcŠi0nIíΧ~6šHˤ¶ãM|lbØ “ªUu]D¡”“È`Aÿ}7Sf®†9à¡pðÈUÛ•:•z²5Q àò ÚjJÊ(k6=IW Ǿº¶ÀòRÏ=if—l¾PRàqŸ¶£h¿P¡ŽH!® ÀÚá ôöÔ´rG"y‘:•ÆƼ†匡>bXîÇ#Pf†¢ï[K5m0†šœ—\3ü½51s‚JŠcRà 3{¦‡‚íkfe޶Çp8Ó­s à”ägŒé° ”[DpO<“’Yo¯a¢h£¯‚cò¥DʹáÇÐûéȪ©$ÝåÌ­³ãÓ^–²TíÀîžß–¦ÀåFC’søÏí§Ô¬Ð¬ƒ8a‘¸C¦öm?ÿÙtherion/thbook/pic/database.pdf0000664000175000017500000002267510453750572015572 0ustar useruser%PDF-1.4 4 0 obj << /Length 35 /Filter /FlateDecode >> stream xÚ+ä2Ð36²43T0A$vr.—¾g®¡‚K>W ™¡êendstream endobj 3 0 obj << /Type /Page /Contents 4 0 R /Resources 2 0 R /MediaBox [0 0 425.1968 240.2857] /Parent 5 0 R >> endobj 1 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./database.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6 0 R /Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] /BBox [0.00000000 0.00000000 1290.00000000 729.00000000] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 7 0 R >>/Font << /R9 8 0 R /R11 9 0 R >> >> /Length 10 0 R /Filter /FlateDecode >> stream xœ­XMo7½ï¯à­É…%9üôM±×Ž Er¤uõÝV¸Aó÷;Ü’+®äõªðAÆèqö-çqæQß £œ0ÿ×~ÞíŠ_׆<þSKAjò³àä[QCÈúªNSÁÑÖuœ’‚%€q+%y¾/6-úù±ø^ðæÿöãnGÞUøG¸C¸¤z(šsÄ(Êð‰ÚYj„#Õ®x³¹Y*¿¼­þ*ʪøˆPÿ‡‰; œKipéi9Oãa hW·ÈPÜI´Ö”¯É’ùÅùö÷ûÇûgO¹ÙAünß]ÏÖå²Ú¦_0¼œ}(ÏÈ¿·ÏwÞ6‘Ë›Åb›‡«yµè…ú’K*l¬‹Rœr™Öåa hjñ$Ã}Ø+Þ9¾ðº\Ì—e^ÀŽŠTÒQ%•¦F¦Ï÷hz¥¢Úޝ_£Ä¬~YY0´º^m/f†ÿ¸ýq_ÇÊÏ׋,¸(—WÕû3|Û§:€Ï¸œ—Ûì‹‹›ëÅüW·_uåŠ*Žò³ÚªhÃP™@v0n¨Œ‘§‘‚ùíÈ0‚*•D6…0Žáná:#©ÁDBãîã&ÆD¢AP§ëe¨DøZùçg¹D:NÔË‚ ÃC*tÔ¦ÁÂÏž€COžªdË5 zJ®Ë—‹8°ŠQ„v,´ª94œG€&‹ØàùàfOÅ×åz³Zn‰9žÌ=A¿Ÿ’J#×ᚌM.*Ç0là˜Ù¹¦þt®„´^‘/TâèäJ(ìL’ýï•àÌXl…QïÌáqïâeÌäÉÌ%¯nr$šwË+ѱP5‰Ý¢eᘡÌì1=Œ™\άxU_Ï'-váýà^³EÞŠJ‘4[­PRÞ„"¡ýi§ UÐk¶†y2.vÍ I×| Å0ÂR1 H‡h‘ˆ ¢˜×UÛ¶ã–º„ÖT*›Â9i)ƒ8Jö—=EH2J8Ó<—:µÂžœ¬jMÚ”V{ö~vy ‘4M{b8+À}À·Þe¹#i…î’jÝdëOÚÊ!‡œ ²èé~Z`  m‡Â©ýt5«æCǶãÁ«‹¼²Ámªo¨€N6Ô 0¥PîEûœ©/Éÿ¿‡ÿ÷½ ß1ééâ‚â+ÚT:m¼6¬ò$.±‚1‚¢À¤xT-£O£xÄz™ZLT³À(A„“8 ¬'%ï0À¬£†÷5Øç * ùÐàôT ‚EºÖ ip{¹˜]¾÷ ™zH3׿z1èé°£|LþuΈã×7ðõía‹Êb73‰Eî"©ýíí$þ;¢Fá68Þóß]l({À´¹ xPÁ(~=ÝõáœÓ¼¯™÷«ê°ë«½† úmú®ïèd×7ºi´{¨ŸõêC~½\e¡ìrø®œ­çË«$rµž]ÌñIIhvñ[~­ôÁ|µd(×ë<ƒæ|4˰w4‚ú FXœÛøÉ #›­»ò… .C9‡F¥—¨ƒ$.£³5 €ûáµH0€Ö‡Ûæ qtV¤ÇM+å"=h]$´ë;™]öØæsT`´ù×0x•õë#ƒIh-©Jí_DŒe8ýU¿it*´{Iü!ñEðô Š7"yË80c‘n|4Dz#æeÌÉw”þˆñtOš/¨z$ÌYtŽ7ʳġЛ8èoQéÄqŽáqq½u-&™8¸C’Øn {À¤§õ2Ý'±WáÒ"tó¼Ü‚…Ÿ¢÷Þ¹¢pŸÚX4Né}êcñ|vÝ> endobj 7 0 obj << /Type /ExtGState /OPM 1 >> endobj 8 0 obj << /BaseFont /RMUPAW#2BHelvetica /FontDescriptor 11 0 R /Type /Font /FirstChar 65 /LastChar 95 /Widths [ 667 0 722 0 667 611 778 722 278 0 0 556 0 722 778 667 0 722 667 611 722 667 0 667 667 0 0 0 0 0 556] /Encoding /WinAnsiEncoding /Subtype /Type1 >> endobj 9 0 obj << /BaseFont /EMGTUG#2BCourier /FontDescriptor 12 0 R /Type /Font /FirstChar 32 /LastChar 118 /Widths [ 600 0 0 0 0 0 0 0 600 600 0 0 0 0 0 0 0 0 0 600 0 0 0 0 0 0 600 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 0 600 600 600 600 600 0 600 600 600 0 0 0 0 600 0 600 0 600 600 600 0 600 600 600 0 0 600 0 600 0 0 0 600 0 600 0 600] /Encoding /WinAnsiEncoding /Subtype /Type1 >> endobj 10 0 obj 1360 endobj 11 0 obj << /Type /FontDescriptor /FontName /RMUPAW#2BHelvetica /FontBBox [ -22 -176 742 741] /Flags 4 /Ascent 741 /CapHeight 741 /Descent -176 /ItalicAngle 0 /StemV 111 /MissingWidth 1000 /CharSet (/L/A/X/Y/N/C/O/P/E/F/R/G/S/H/T/I/U/V/underscore) /FontFile3 13 0 R >> endobj 12 0 obj << /Type /FontDescriptor /FontName /EMGTUG#2BCourier /FontBBox [ -12 -186 612 627] /Flags 5 /Ascent 627 /CapHeight 627 /Descent -186 /ItalicAngle 0 /StemV 91 /AvgWidth 600 /MaxWidth 600 /MissingWidth 600 /CharSet (/L/A/n/c/X/M/B/d/Y/N/C/e/Z/O/D/three/P/E/r/g/F/h/R/G/t/i/S/H/T/I/v/U/J/l/a/V/underscore/colon/parenleft/parenright/space) /FontFile3 14 0 R >> endobj 13 0 obj << /Subtype /Type1C /Filter /FlateDecode /Length 15 0 R >> stream xœUT}PTU¿·ïí†+%´¢"Ë*†‹È7æ,ЂŠ` a‹»€| Žô1:Mqý¨‘1b×Ð0ÍB !M§S³ÉçÑŽ+öPT­s_÷1Óe™rüç{Ï=¿ß½ïüÎ9Òx!Žã¼Ó¬özk­­¨p|7Ÿpd¦ äëhвAiÑ‹M'c=õšö™B¯/›[Ÿ††gÏq [Û’+««m¥eµ&sNÖk¡aaó{¢-‹iMã'¦k­´ÂÂõV{e•ÃZQ›`JfÑv»­ÈTjo¬*«1[‹Ça¹…vëZÓb›ÝVUUYo2'‡šb¢¢¢ÃÙ'.ÃæXSWcÊ.¬¨1¥›²¬¥uöÂê'œ!¿ô¤×ó2’3W,Zœ•š¶rINnBáh6² x‰æ (BÐ\‹Ì(…¢hz-D/£gYzÑJ´ õ"™Ëàös÷¼¦zÅ{íãýøÝü÷ü-^Õ$j 4ëþÙèCÎ`IÑ:¹ë2IŠÃ1æ yUE%ï†7úI”“#Pi¸J+…‡"mQÕ‹´uÌ!ܯA¥;ú t£zp ”’ ÄÛÍåEº‚vÑLè¨ ÂûèNÕ[¶^}OûЊÿ#¡[æ‰?t ƒdzÐÅ Q>ΤáÊ|]²ÖG)™ÿÝMŒn^™ÁÞ«Ê¢:…ÈBȘÃMÜ"™¬º…GŒ¹¤V"#wJæ•y* .²ŸÆáPœhÏÉ\’\Œ©7¦úÎ9—SνúkÕm ‹ñý;ŸCŽ.LÜ”÷žmc…#s¹í¬£ÏE‚–B¦´0ëüÙÆÊýAÕmö9:e×Ä-_ˤýÁt¥Ñ@­t6  ´˜…÷@Gïù ‹Ý `˜¤ƒwh„Ór£E1¨ž¦Ó”ÙÌDÐÈ`–Í4H{ÈLDЄÇ$h‘¸[2Üá!~0@£Ø‡O~ÖuøÄÑ]Ýø¢ã¯Ñ9FúݘCI€Z W{óL~BBn~Œ‡D‚m4IÜ{¸ d–¤Î‚&%©[™îNI}Eô!À.ûé‰8•è(‹3IjÓ8¹'ùðÛ%_Y:?âïG .`³8ØYÔ¼¯ÞQÐê˜B»X¶góŽ4ƒ¾áHâ!ß#éèÁog€oâel¤7=ï5i`;ÔiOãý›Ú×ï­o-ǺÅf£'±ðwB&oK¼’G Úgêõ"N§'¥ut¿eÌ?]qé õxCð×³ÂÆÛâ:0S‹&àœ\›µjá¢|*`ꯣµH£ ïÞ@çÀcû<áüx2Gû}‘á®;Uö÷%2ùÄÐ Á¡ƒ4‘@œÙB§Åtgß©‚%ù‚ŸügÍñ’¬¸¸¾È^W±þÍwWàDœ³«ìxÕWïÞrR+nIk-ø²¨7õRàñ |ÅÙ}¤§ëÀü#ÊþÙÜA—õL‹Ý³v>§ûíBÏ]£ß(èð…Ü-óYE•€K‚SNnp˜x³’:Ť .YqDÐKê$¸Äzu\ZbŠ(qð)Óëo%À›$õ²60­àÀD£Üæ!—uI8CMô„btr.ÙCÝÃÔmhJ&}*§ uo™±t߆N|VGZ"˜ŸšÿŠ„$x ¼†!ÄHZ´û|æTø˜³HW«c´œŒ sEhcÚÒË‘«Ô× Žä‘ѧ¶ìvÂrgz»ØïíšÔÿ‘^ïjÑOFè_ö¢à8endstream endobj 14 0 obj << /Subtype /Type1C /Filter /FlateDecode /Length 16 0 R >> stream xœ}WkTSW¾äÜñ1\Π¹±VQ|`[AQ‘‚EŠâ hD £@Œ.ñÑ;1 4 2h)U‹ÈEt*ã´–aZ‡ú@j­:­‹jk­Sm§îÛu˜µæ$AÌ,X+¹7ç±Ï·¿ýíïH(©%‘Hä±íö\õvç÷éb°Dë#Žó-Å+EñWZ6ŽZP˜9üþÞß—÷—?ýêGÂŽQ”¯DR¸ß«)(Þž›³y‡*$5%-4,lªçÍ̹s窲‹Ÿý¢Z¬.ÌÍÙ¦šD¾ìTçi òÕÛvDªbÉè¼¼Ü ªœ¼â‚Í…ª¬ÕÓVgå©·ªâsór 4;U!±¡ªY3fÌ\™›Ÿ­-T%j¶iT+T)êm^Ööç^Rº"fÛ†7mL_«^“´øµ¸í9ñ›S–ìÈ]µôõ„©Ëò²V‡„ª"2çQÔ4êE*‰ZLͥ© T5šN½DÅS‘Ô j"5“šD­¢–R“©*‚ ¡R©eÔl*”z™šB¥Q¯PaT"µˆz•zò£$Ôh*𠦦p))•L]’¼&éöÉ÷ùÎ7Ë÷ºt…´E6]vPv½Œ,ègº¾'ß*¿ýš>÷Ëó»4,tØ—þYþ‚ÿ†§ÿ`Ĩ‰#®œ6R?²gä•Q¹£JF!þÀ ¢V@´Ç[}!Wt(¾@v«¹ö“ŽÅ«Q1gÜ]jæêØÚ(Ï“ëPÝ>‹^o,/VâÙø8íZ B8+HÌ óa“¯ ÉŠ‹8Dæ5f :÷ÅlÂkD‡ ¯÷úyÂË´²|¤+%¯j9; S=!E¢!DÞƒ€‚³2rïÜß® °þt&ˆù¢ÅWQh—‘Ó—š¸zö$îÏDZ÷& ,¢:3Y‘#1d‚ Ì5ö9s¶±©ÉÒܯ׋Žik·óùrÌo¥wÈD+Y(O([ÀŒ¾ˆïšž”S´b•’¡à„(úH§Äõ¢¿"«%Í‘ÄËñذ©x f†Ã˜K=Ž– ì1‡ÝÁ×Èk fÎÀà ÊôµË cÉHŸè¾ƒôó>ðùêjöê*–¹R\eâlÁV³ÕÁ2§îÓÌ•Ã\AÉœÒqe%ì³´ÁJ¼æBùŒ‡¹AÌuøÄÙÙkHÐeΔJ=PŸC8gàpÈu »…Œ(á>nkG÷à×0/+FÌw:÷{’‘1ž.G0¶À¼E–è™IF UŒ†ˆvUGžö%‘ÍW@8<•Y´1^“B½–L*%“6‹ÚwP‰<É&“¡>Ƴà±,Ô3¾q@›ûÜlWPœi»HÔZÌÂOenrÔ¨ ÍÇp®­Rð%_iÈ“Õѷׯ|õÙúó¯6³Ýï5¶ðäwb? Ub‹gÐ$`µÔ0—.yebæ«,žŒ*@¡t7ßÂ5—´jrøyâªô87!¶ ðD »´ ð« Øób¡øXŽvqz’²0.Ck¯%Ÿˆ"Ù÷ Á£ðÈG“ÀïF÷ûWαÌîˆ4SRˆ¬‚ŒÙ½a kûâ|á:˜°d'QáÀÛeæbûyNÕŠpÞ‰§ÂNY+ª¯&»ì%»`¬'háÍè]næÀª½D‚ò¤¤\|Es è8A•ž‚†¦ÞÈFøo"/ïÙâCg=‹Oq³ÀI®h1A×/s¡)Ò©i¸$ˆÃÚ‚˜³â±Z±¶#éh¿„O.ÈÌÈÌÐ,æ“äsh EøÝ¥OÿÜ©<ÖX{˜·Z³¸}û9£rÕ²µÛµ&ŸôüÙ^ü¿yÒ{·R“ª”̻ͫÝTcW‚Œ>l´êK9C‰;›ÙO *ê>  þì‡þDÎW‘adµÀÐp<+~™c¿ÿ?¿Ï25‹aŸqÿ>#)×­bµ‰Á؇¼¬*¤õ÷¯v=âñ½Éu3ä.³ ¹zˆ†ù1nÓ AŒ aÍì¨Ûkѹ”–ðxüY5ÍÁm1SÖ…p]d.·Õ²8”àÇ÷ÓøËLYíFìP»¤óŒA(ÿW±O•XJth.ž RJòç A0¢±±ŠÍ’‚ß=ŒðKx\¦É`4¨@uŸ|ÈYO¢G p·Í—|(¼+°ÁèA ãÙi?™l2Z‰ ¼¹$ h¢ÆÓù}KN[vc¿Z¾ˆ~ñå07!E ò.±Ü!aÇN‘Ð7}ß=xåÚ¿ãU“Zï2.AõnVC “ÂAXNßêIY›Á‚œôµS à%& OÛŠO1D …Š„ñšSË;¾}ïìyþ’üëy×Hßyër|¡gÛ(UR(©tïåÕ‰Ë#ßeÝ.d…@Ü×D¢”‚8¼Í™íjP+l¨Þl²×p$U.cÇ•éÌFrE« r¸4„—fýÆEä»ß½Ô!´¶vØ»ø~¾7ÛôÉwIGØo=¬¼O;Œfbýˆ.êiæv˺TGBpŸ\¸.+=ck +¡ñ¬_&ÂbvNt z£ŸÛá7õXL’‘OX~´£bpìC<çNMn@Q]ï‚´µ©†«áŒûÞÚË)7Æ•¬âåqÙ':Y8Ú ¡Í@úÙ3ÿ÷/ð‘À ²|Ÿ³¨"œe¤wçÊ÷ãÙ^fÀÓaȸ ñŸŠR#W̦ÐE&®Vy ÕZÌ"auåæÒÁ>‘P3¤ß Eð·Ž ¦F|M´)²„L§Á¿ ~vVýÆ“…lÓ®–=W÷ô–ÖïmÔ5•Ôå;—:MÉ,›ÉG]xëþ¸×ªçåÎc³XæÜÐf;dv(›i¦fÍéî«Áà÷Ê£NmdžF6ß¡1/°%Z ÍoÚß<¬oæ›å=Ÿœ¿s³;3‘tªI»+ÍÖ`»‰ûÄÙªt.0Ÿ+7¢Ó¤!/%µ†ui^FVåîàNeˆÚ£Bz»ƒ XAý‘W·†\à±í:¯|Ñ3êuÐ š‚€#7I¯‘í0‡dæsÁ©þsbi•”uµéi²k8˜9›• ®ì…Èí¯:;è ÍÓ~ÜYv(`!õ`áâkžÐˆXh±Êëùš§À‡¢¿]ÒL.*£!Û¾ „y¢¿¬ ±ÊeZ8·Eëqº¤~âñè—õx šê,$½ËN·#˜?à?èTŒ‚„èÏå6_q/ ³Å6YvÈ€÷áûhf\|DDü•{J¸ý9Ç4{ …¥w#H_•Þí©rh¢çäF‘¾÷Jày¯ÛÔlü+Z˜°"2}Mùt%:k®TÏqEJJ÷%|PØÃËþúο±u aûØ]AÏ*hÀñ*è™×],üx=[è ëÌzÄìg>DŒvèþÁì\ õèZü…i9 {ŠR•¥ûöUðeò23g­¬â+ «ßo¼Ñdj îíܲ†]L'Û·V¯#ÂðjrDÔ'i®vý¸›='MX‘ê¼.Å­¿óÓk¿tt ']g8"pß?Áz_8xÁ&rÅlöÂÇ+7~\6÷!¼RÔÊnzñ|ªçþÙì<Ÿx›h×¶¿û†㹠ݛ±ØGýøIüÄã.cY£Ú\nååµVKMõþ€‰ƒQÛ~âŸò¿¼ûóU^Y]y?èt¡.Mq­wíS_¨ ë• eûùý•{Ù^<êX)^•?a yÀÈóü^O¹Õj6³“òœ?þGþ§¼/iá)ƒ•ã}žüëOÃé3P(ˆË„"b‹~pKQUYù‡J¾ëèé üÇò» /ONK×å«•ÚÝú"Þ /'uhª:ø¶UÙt¢³þ"/¿Ñ½fùzÍÆ¬V[¦ã×òr§ŠîqùšïÞY>á‚„™«R´¤³Æª}•F^nàÊ ¥µ»O–°šÎ²x9 ïo=a™ÇüåŒîÈ÷\$à/QŒVüGúƯR'˜z„ð[ œ¹bC¾FÓ¬ic­¨µùS­ùMjÖ‘÷ù›65os¿÷Ô©üf5;bW½ør=Ô××£3~°3þþ‚ÿpŠú/ZˆûYendstream endobj 15 0 obj 1330 endobj 16 0 obj 3557 endobj 2 0 obj << /XObject << /Im1 1 0 R >> /ProcSet [ /PDF ] >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [3 0 R] >> endobj 17 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 18 0 obj << /Producer (pdfeTeX-1.21a) /Creator (TeX) /CreationDate (D:20060708123833+02'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 19 0000000000 65535 f 0000000236 00000 n 0000008750 00000 n 0000000122 00000 n 0000000009 00000 n 0000008815 00000 n 0000002018 00000 n 0000002233 00000 n 0000002278 00000 n 0000002545 00000 n 0000002967 00000 n 0000002988 00000 n 0000003264 00000 n 0000003637 00000 n 0000005059 00000 n 0000008708 00000 n 0000008729 00000 n 0000008872 00000 n 0000008922 00000 n trailer << /Size 19 /Root 17 0 R /Info 18 0 R /ID [ ] >> startxref 9125 %%EOF therion/thbook/pic/herakl.pdf0000664000175000017500000001131411026001732015240 0ustar useruser%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 205 /Filter /FlateDecode >> stream xÚ}‘=‚0†÷þŠ@½ëÇ«‰n&ݬ“F]üÿ‹Å¶pb)¹ç½ãI%ÄÇW«Á¡¼¾Ä[‚êåCàÄÚî¼Øâ'¢" 'ý=r«lo¤¿És Û¥ÓPÝb®9›k:D‹ nr0´ƒe}#lÞ³CŦb³ò»?}ÀÁ¯ ™9™fИYDZ¾È±›3\žuNˆß>9JÆMÉMhÕ¶L)wÈmWL³GqÊ™h__üQìý´tMVa?äÕÆÅŸÄ Êy¸ endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 264.189 13.948] /Parent 5 0 R >> endobj 1 0 obj << /Font << /F51 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 6 0 obj [ 15 [245] 218 [538 375] 222 [469] 231 [750] 236 [470] 238 [416] 243 [538 496] 246 [554 438] 271 [375] 273 [263] 292 [263] 296 [375] 300 [438] 360 [262]] endobj 7 0 obj << /Subtype /CIDFontType0C /Length 2182 /Filter /FlateDecode >> stream xÚ½VklÛÖ–b[¹i'Í¢Å!SÒ²6ÉÒî…µËP`ë²µX›¦Î£ÎËqYG–MY¦$Z–(‰Öƒ¢([¢e‰’%Y’eY–ÇŽ×uV'K·´i·®öch€aØ€¶[Ól@¶‘·ar¬¿öoèË{pyp>~ç|<÷Èeµµ2¹\¾ýØÁ#GŽþê ÏmÂ̽X÷“G´z‹ñœyíåÄâc!%"n’‰ˆ\D׉5bC­ôeÍëÊZ½äÙQ›¾±î1™LvoSõ)Gþ¥ÜYµ”»Ö¾¬üŠLQEAWãäÿ‚zNƒ©µ?Öh»ñóxßÌÔg>¯ïÀw·ïi|Á¬Õv6>uãG±öóZ¼o_ã7öïÿöSÏüzÍÚ^­ÙªÕÉÐýY¶•j%¶·ØÚ[è6 4)¼'¥#lŽ3ò8¢Î_²½ ÏOsÉ t ;É*Hƒø‚pNEÂO¨Õmg_µ:9Ôžéª.ô¿¾~7{mî2X^¸ž¿ 5ï}_ÚìEŸñ©ªYáyè¢oÊ]D*Kª neõ6Ó¹^y–9Aïšj~‡ž§§3Ź\%yyø*¨öÜ?TIW&o*J<_B…'× ëáVèªÔ PHÂÑb ¨ôúziu=Æ;KÈMLZyàŸœDYñf]ÉÉ›ƒS÷÷u½¬0‘NúÏ·?s|GQ/mµ"ªê¹Nú®‚v»›ì;iƒ_í=åµzœn/ ýã‚1b¬<„†ÓÃy¾+ŒäG ülæZî×àY5ÃPeÄh+èRDK‰‰lTŠS£³p½ô²ðo¡¬ò{‚°ËåI”â=<Ń9 ‹uÂfÂç&Q«Ýc1A,ö >­t–‰)¢L€œ5nî†(† RÕrZ÷ }–Ñ 3±RCÙ1ãgÎçü‹LÊ•ÂGñ¤%‰'Á‹‹Ëo¬©/œ@â¯gr•Ô 7Ç,3 ®9 ‡ì^I­É9%¾©bOmèЩí­p.õOw%u®åUˆ m~+â8aÔ·X@¿A3Г.–¥Ð6®}\·Ô&·ìeX@ÛCa$8²”û#R¸“¹Í¿ý¸¹¡$l½ñ‹Âsì…iû¦‰Vö ø^UÑP4 ]"Ë=Y$Iàwb„Gû0guÎÝŠIÛÎHÝÅÓW4 t…žŒNð³ÙñJr p¹Á|ú•î­¦q„"l~6ô' ,:ƦFÊðDÎK¦ÑåÔt~¬”Ï -‚ú¢nXåv˜}zXgŽeH´cÅx³ç·_uÊm–”dS0ldzC}lá/e¡aVxfž™`’lÀá|ż‡3Ñ‘¡)~r´˜M%2™l!_J¦"Í Á…´ 7böNÊt£¤Óé$}}éK¨ÇÏšü„­ sæÐúñ¢°Q0]¸ `xÓwÅU5{¬=n·ßè¢A[çpÚŠ)wÁ?ãwíŒ!Cvgͬ¡@s@ã5#”ÁÞof¥Ò³P1~#÷g¤$l¨˜ö€Û ÆÓö4Z¿î>Ìô‚ÓÌ”é-x†-ñ¹R2Ëåâׯ>. ÛŠl1Tbª}…иQÇqתxÎø 6ÈÊ‘)?ä8& s¹¥,Z/îò*k‹æô±Síg Í«ËⲸ¡˜7×RDJuÂ.ÅIéC>ºX~uûòÅòBr ÆÃ#qˆcbL òÕmˆžå3”Xžì†Ì”Ñ®E¾n5R(¯›rK¤Æƒb$=:[¸V¸ššN‚7ÊñÕzVE TæzéCaHPªtdn"p¯-–v Dn ^\ûä’ð/†˜ ”õÙÖrØìj©æÐuÒ§·BÆ„cüBqbuù“xYEW‘=Ÿ!w*bét9ÿyø¿ÈÌÿù–¸UeT¸Wô…&æXPÛÏ®µ§Bl,ž ¥¹±ø;o+j@ çlô…Ô!{¿FÅúª—Ôm7ïE\v‹Ïûý,@GØX8†TØ|‚/€A.ÌqPŒŽøÂÉsÌ÷Fr MŽàåKgãU]î *é0þoJJØŒsI+Úu–æ "7ǯ"ÉUîbÊ{ä Âú¡lu¸­nÔÂÔý43]ZW‹æ“ã ºQ¿É£&J0; õ”i±\ÉŽ#©Dr,^ç–è+L"ñ½E:ÃÄÁOá iS³“é£-èKÂ=US³æ%ß$ÆŽ|Neˆ GרD½aÄõŠo4Z¥IU©\e—u‡ªÙÿèAáM üj¯mPÏ ®î‚¿+Ó0þ!]m³¡ÃRgàò-ÿ•®Eø½…w™DˆTتVØØ{9õG¼ƒš¬N7 y⎈WØ(ínÍ„¤~mðÛ,ÂÊÇׯº³ÜS[¨˜¸›Vy…D„Ö#{ŸnùšrCå‘[+œR)¾¸UüTõÏÆ½ endstream endobj 8 0 obj << /Type /FontDescriptor /FontName /TLRRTQ+GFSPorson-Regular /Flags 4 /FontBBox [-36 -238 1180 861] /Ascent 743 /CapHeight 0 /Descent -257 /ItalicAngle 0 /StemV 82 /XHeight 400 /FontFile3 7 0 R >> endobj 9 0 obj << /Length 446 /Filter /FlateDecode >> stream xÚ…“]o›0†ïý+¼‹Hí“&ª‰@˜¶6 hÚ-±O2KÁF.òïgC*U‹†èá¼çïÍâ˾ R¡,Ÿ"z€^†Cýh:²Xäš-¨á @€˜£ý+ÝÍ+èCV楒ã—Š_F³êߢ-œ¥ú¸>ô¡†ßAýýp¨ߊj¯M¯Up€óxiL¹´Z+ÿ’Ú0½¦Xè˜^jõJÙSEöÃN‰L·n‘= §Ai8~’J˜iZzt³S!ù0>ykÝrÉÕµ -ÕI“͆†¶³ìsŹIøn©Î–ï iEÕØupш$ p²µ­OoM 4t”ÂFåp½kÅGR}í€ÆÈÌ̵€¾k8˜Fl¬ QB7…½J|ŠOYÇÓM^¬­Ü¾^Ük¹Í0k޳լçƒÕ ”Ç»ÄQžú,æiëiåiç©@Úùúiä)CÊž=ye#KŸ7ѳ§ÔóÝ—iŽÄ˜'ìÀb§dE¾öô‰Ež2¤•§µ½¬§µâÚœWnão{ÃGcìÆàé@óíRÁíuºsYxãÉ›Gïù øÇô endstream endobj 4 0 obj << /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /TLRRTQ+GFSPorson-Regular /DescendantFonts [10 0 R] /ToUnicode 9 0 R >> endobj 10 0 obj << /Type /Font /Subtype /CIDFontType0 /BaseFont /TLRRTQ+GFSPorson-Regular /FontDescriptor 8 0 R /W 6 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >> endobj 5 0 obj << /Type /Pages /Count 1 /Kids [2 0 R] >> endobj 11 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 12 0 obj << /Producer (luaTeX-0.25.1) /Creator (TeX) /CreationDate (D:20080617153506+02'00') /ModDate (D:20080617153506+02'00') /Trapped /False /PTEX.Fullbanner (This is luaTeX, Version 3.141592-snapshot-0.25.1-ETEX-VERSION (Web2C 7.5.6) kpathsea version 3.5.5) >> endobj xref 0 13 0000000000 65535 f 0000000410 00000 n 0000000299 00000 n 0000000015 00000 n 0000003669 00000 n 0000004017 00000 n 0000000478 00000 n 0000000647 00000 n 0000002932 00000 n 0000003144 00000 n 0000003819 00000 n 0000004074 00000 n 0000004124 00000 n trailer << /Size 13 /Root 11 0 R /Info 12 0 R /ID [<1726A2C378D2166746BF2F592A5AD2E0> <1726A2C378D2166746BF2F592A5AD2E0>] >> startxref 4396 %%EOF therion/thbook/ch00.tex0000664000175000017500000000637712446517542014037 0ustar useruser\vbox to 0pt{\kern-1in\kern-10pt\hbox to 0pt{\kern-1in \pic{thbook.jpg}\hss}\vss} {\footline={} \hbox{} \vskip0pt \font\tit=cmssdc10 at 36pt \font\subtit=cmssdc10 at 24pt \rightline{\tit The Therion Book\hskip0pt} \vskip365pt \rightline{\subtit Stacho Mudr\'ak\hskip0pt} \vskip20pt \rightline{\subtit Martin Budaj\hskip0pt} \vfill \eject Therion is copyrighted software. Distributed under the GNU General Public License. Copyright \copyright\ 1999--2014 Stacho Mudr\'ak, Martin Budaj This book describes Therion \input version \vskip1.2cm Code contributions by {\it Marco Corvi}, {\it Georg Pacher} and {\it Dimitrios Zachariadis}. \bigskip \leftline{We owe thanks to} %\leftline{{\it Martin Sluka\/}} % for his support concerning not only Therion,} %\leftline{{\it Martin Heller\/}} % for criticism on first implementation of scrap distortion,} %\leftline{{\it Olly Betts\/}} % for idea of importing processed centreline instead of raw survey data,} %\leftline{{\it Wookey\/}} % for improving the documentation.} \leftline{{\it Martin Sluka}, {\it Ladislav Bla\v zek}, {\it Martin Heller}, {\it Wookey}, {\it Olly Betts}} \leftline{and all users for their feedback, support and suggestions.} \vskip1.2cm \leftline{Translations (\%):} \medskip \leavevmode\kern1em\vbox{\halign{#\hfil\quad&\hfil#\hfil\quad&\hfil#\hfil\quad&\hfil#\hfil\quad&#\hfil\cr {\it Language}&{\it XTherion}&{\it Map header}&{\it Loch}&{\it Translated by}\cr\noalign{\smallskip\hrule\smallskip} bg & 100 & 94 & 100 & Alexander Yanev, Ivo Tachev\cr cz & 94 &100 & -- & Ladislav Bla\v zek\cr de & 95 &100 & -- & Roger Schuster, Georg Pacher\cr el & 98 &100 & -- & Stelios Zacharias\cr en[\_UK$\mid$\_US] & 87 & 95 &100 & \cr es & 87 & 96 & -- & Roman Mu\~noz\cr fr & -- &100 & -- & Eric Madelaine, Gilbert Fernandes\cr it & 99 &100 & -- & Marco Corvi\cr mi & -- & 98 & -- & Kyle Davis, Bruce Mutton\cr pl & -- &100 & -- & Krzysztof Dudzi\'nski\cr pt[\_BR$\mid$\_PT] & -- & 96 & -- & Toni Cavalheiro\cr ru & 94 & 99 & -- & Vasily V. Suhachev\cr sk & 99 &100 & 96 & Stacho Mudr\'ak\cr sq & 99 &100 & -- & Fatos Katallozi\cr }} \vfill The cover picture shows survey sketch of {\it Hrozn\'y kame\v nolom} Chamber in the Cave of Dead Bats in Slovakia and the map of it produced by Therion. \eject \def\write#1#2{} %\vbox to0pt{\line{\hss\pdfximage width 93.2mm {pic/agrippa.jpg}\pdfrefximage\pdflastximage\hskip-2mm}\vss}\kern-2pt %{\let\eject=\relax \eightit\baselineskip16.3pt\leftskip7cm\parindent4.05cm %Only for you, children of doctrine and learning, have we written this work. %Examine this book, ponder the meaning we have dispersed in various places %and gathered again; %what we have concealed in one place we have disclosed in another, %that it may be understood by your wisdom. % %\leftskip0cm %\rightline{\eightrm ---Henricus C. Agrippa ab Nettesheym, \eightmit 1533} %\vskip.5cm \chapter Table of Contents. %} \bgroup \font\bf=cmbx10 \font\rm=cmr10\rm \baselineskip=12.5pt \def\Line#1{\line{\hskip2cm#1\hskip2cm}} \input etc/contents \egroup \vfil\eject \ifodd\pageno\else\hbox{}\eject\fi } \immediate\openout1=etc/contents \endinput therion/thbook/ch02.tex0000664000175000017500000023027212446627526014036 0ustar useruser\eject \vbox{\rightline{\pic[100mm]{agrippa.jpg}} \kern-20mm \eightit\baselineskip10pt\rightskip105mm\leftskip0mm\parindent1.05cm Only for you, children of doctrine and learning, have we written this work. Examine this book, ponder the meaning we have dispersed in various places and gathered again; what we have concealed in one place we have disclosed in another, that it may be understood by your wisdom.\par \kern-10pt \rightline{\hfil\eightrm ---Henricus C. Agrippa ab Nettesheym, \eightmit 1533} } \chapter Creating data files. \subchapter Basics. The input files for Therion are in text format. There are a few rules about how such a file should look: \list * There are two kinds of commands. One-line commands and multi-line commands. * A one-line command is terminated by an end of line character. The syntax of these is |command arg1 ... argN [-option1 value1 -option2 value2 ...]| where {\it arg1 ... argN} are obligatory arguments, and pairs {\it -option value} are options, which you may freely omit. Which arguments and options are available depends on the particular command. An example may be |point 643.5 505.0 gradient -orientation 144.7| with three obligatory arguments and one optional option/value pair. Sometimes options have no or multiple values. * Multi-line commands begin similarly to one line commands, but continue on subsequent lines until explicit command termination. These lines may contain either data or options, which are applied to subsequent data. If a data line starts with a word reserved for an option, you have to insert `|!|' in front of it. The syntax is |command arg1 ... argN [-option1 value1 -option2 value2 ...] ... optionX valueX data ... endcommand| Again, for better illustration, a real example follows: |line wall -id walltobereferenced 1174.0 744.5 1194.0 756.5 1192.5 757.5 1176.0 791.0 smooth off 1205.5 788.0 1195.5 832.5 1173.5 879.0 endline| This command |line| has one obligatory argument, a line type (passage wall in this case), followed by one option. The next two lines contain data (coordinates of B\'ezier curves to be drawn). The next line (``|smooth off|'') specifies an option which applies to subsequent data (i.e. not for the whole line, unlike the option |-id| in the first line) and the last line contains some more data. * if the value of an option or argument contains spaces, you should enclose this value in \hbox{|" "|} or \hbox{|[ ]|}. If you want to put a double-quote |"| into text in \hbox{|" "|} you need to insert it twice. Quotes are used for strings; brackets for numerical values and keywords. * each line ending with a backslash (|\|) is considered to continue on the next line, as if there was neither line-break nor backlash. * everything that follows |#|, until the end of line---even inside a command---is considered to be a comment, and is ignored. * \NEW{5.4}multiline comments inside |comment| ... |endcomment| block are allowed in data and configuration files \endlist \subchapter Data types. Therion uses following data types: \list * {\it keyword} = a sequence of |A-Z|, |a-z|, |0-9| and |_-/| characters (not starting with `|-|'). * {\it ext\_keyword} = keyword that can also contain |+*.,'| characters, but not on the first position. * {\it date} = a date (or a time interval) specification in a format\hfil\break |YYYY.MM.DD@HH:MM:SS.SS - YYYY.MM.DD@HH:MM:SS.SS| or `|-|' to leave a date unspecified. * {\it person} = a person's first name and surname separated by whitespace characters. Use `|/|' to separate first name and surname if there are more names. * {\it string} = a sequence of any characters. \NEW{5.3}Strings may contain special tag || to separate translations. In multilingual strings only the text between || (where |XX| is the language selected in initialization or configuration file) and the next || tag is displayed on the output. If no match is found, everything before any occurence of || tag is displayed. * {\it units} = length units supported: meter[s], centimeter[s], inch[es], feet[s], yard[s] (also m, cm, in, ft, yd). Angle units supported: degree[s], minute[s] (also deg, min), grad[s], mil[s], percent[age] (clino only). A degree value may be entered in decimal notation ($x.y$) or in a special notation for degrees, minutes and seconds ($deg[{:}min[{:}sec]]$). \endlist \subchapter Coordinate systems. Therion supports coordinate transformations in geodetic coordinate systems. You can specify |cs| option in |centreline|, |surface|, |import| and |layout| objects and then enter XY data in given system. You can also specify output |cs| in configuration file. If you do not specify any |cs| in your dataset, it is assumed you are working in |local| coordinate system, and no conversions are done. If you specify |cs| anywhere in the data, you have to specify it for all location data (|fix|, |origin| in |layout| etc.). |cs| applies to all subsequent location data until other |cs| is specified or until the end of the current object, whichever comes first. Following coordinate systems are supported: \list * |UTM1| -- |UTM60| = Universal Transverse Mercator in northern hemisphere and given zone, WGS84 datum. * |UTM1N| -- |UTM60N| = same as |UTM1| -- |UTM60| * |UTM1S| -- |UTM60S| = UTM in southern hemisphere, WGS84 datum. * |lat-long|, |long-lat| = latitude (N positive, S negative) and longitude (E positive, W negative) in given order in degrees ($deg[{:}min[{:}sec]]$ allowed), WGS84 datum. By default, not supported on output. * |EPSG:| = Most of EPSG coordinate systems. Almost every coordinate system used worldwide has its own EPSG number. To find number of your system, see |extern/proj4/nad/epsg| file in the therion source distribution. * |ESRI:| = Similar to EPSG, but ESRI standard. %* |EUR79Z30| = UTM zone 30, EUR79 datum. % ad-hoc addition not worth mentioning?? * |JTSK|, |iJTSK| = Czechoslovak S-JTSK system used since 1920s with south and west axis (JTSK) and its modified version with axis pointing east and north and negative numbers (iJTSK). JTSK is not supported on output (iJTSK is). * |JTSK03|, |iJTSK03| = new S-JTSK realisation introduced in Slovakia in 2011. * |OSGB:| = British Ordnance Survey National Grid.\NEW{5.4} * |S-MERC| = the spherical Mercator projection, as used by various online mapping sites. \endlist \subchapter Magnetic declination. Therion contains built-in IGRF\[See \www{http://www.ngdc.noaa.gov/IAGA/vmod/}] Earth geomagnetic field model valid for period 1900--2020\NEW{5.4}. It is automatically used if the cave is located in space using any of supported geodetic coordinate systems and no declination is specified by user. The computed declination is listed in the LOG file for information. \subchapter Data format. The syntax of input files is explained in the description of individual commands. Studying the example files distributed with Therion will help you understand. See also an example in the {\it Appendix}. Each of the following sections describes one Therion command using the following structure: {\it Description:} notes concerning this command. {\it Syntax:} schematic syntax description. {\it Context:} specifies the context in which is this command allowed. The {\it survey} context means that the command must be enclosed by |survey ... endsurvey| pair. The {\it scrap} context means that the command must be enclosed within |scrap ... endscrap| pair. Context {\it all} means that the command may be used anywhere. {\it Arguments:} a list of the obligatory arguments with explanations. {\it Options:} a list of the available options. {\it Command-like options:} options for multi-line commands, which can be specified among the data lines. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubchapter `encoding'. \description sets the encoding of input file. This allows the use of non-ASCII characters in input files. \enddescription \syntax |encoding | \endsyntax \context It should be the very first command in the file. \endcontext \arguments * || = to see a list of all the supported encoding names, run Therion with |--print-encodings| option. `UTF-8' (Unicode) and `ASCII' (7\,bit) encodings are always supported. \endarguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubchapter `input'. \description inserts the contents of a file in place of the command. Default extension is `.th' and may be omitted. For greatest portability use relative paths and Unix slashes `|/|', not Windows backslashes `|\|', as directory separators. \enddescription \syntax |input | \endsyntax \context all \endcontext \arguments * || \endarguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubchapter `survey'. \description Survey is the main data structure. % Each data object must belong to a survey. Surveys may be nested---this allows a hierarchical structure to be built. Usually some level of this hierarchical structure survey represents caves, higher levels karst areas and lower levels e.g.~passages. Each survey has its own namespace specified by its || argument. Objects (like survey stations or scraps; see below) which belong to a subsurvey of the current survey are referenced as |@|, or, if there are more nesting levels |@.|.\[Note: it's not possible to reference any object from the higher-level surveys.] This means, that object identifiers must be unique only in the scope of one survey. For instance, survey stations names can be the same if they are in different surveys. This allows stations to be numbered from 0 in each survey or the joining of two caves into one cave system without renaming survey stations. \enddescription \syntax |survey [OPTIONS] ... other therion objects ... endsurvey []| \endsyntax \context none, survey \endcontext \arguments *|| = survey identifier \endarguments \options * |namespace | = specify whether survey creates namespace (|on| by default) * |declination | = set the default declination for all data objects in this survey (which can be overridden by declination definitions in subsurveys). The || has three forms: 1. |[]| an empty string. This will reset the declination definition. 2. |[ ]| will set a single value (also for undated surveys). 3. |[ [ ... ] ]| will set declination for several dates. Then the declination of each shot will be set according to the date specification of the data object. If you want to explicitly set the declination for undated survey data, use `|-|' instead of date. If no declination is specified and some geodetic coordinate system is defined, the declination is automatically computed using built-in geomagnetic model. N.B.: The declination is positive when the magnetic north is east of true north. * |person-rename | = rename a person whose name has been changed * |title | = description of the object * |entrance | = specifies the main entrance to the cave represented by this survey. If not specified and there is exactly one station marked entrance in this survey, it is considered to represent a cave also. This information is used for |cave-list| export. \endoptions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsubchapter `centreline'. \description Survey data (centreline) specification. The syntax is borrowed from Survex with minor modifications; the Survex manual may be useful as an additional reference for the user. A synonym term `centerline' may be used. \enddescription \syntax |centreline [OPTIONS] date team [] explo-date explo-team instrument calibrate [] units [] sd grade declination grid-angle infer mark flags station [] cs fix [ [ ]] equate data